summaryrefslogtreecommitdiff
path: root/addons/hr_holidays/static/src/bugfix
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/hr_holidays/static/src/bugfix
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/hr_holidays/static/src/bugfix')
-rw-r--r--addons/hr_holidays/static/src/bugfix/bugfix.js88
-rw-r--r--addons/hr_holidays/static/src/bugfix/bugfix.scss6
-rw-r--r--addons/hr_holidays/static/src/bugfix/bugfix.xml11
-rw-r--r--addons/hr_holidays/static/src/bugfix/bugfix_tests.js110
4 files changed, 215 insertions, 0 deletions
diff --git a/addons/hr_holidays/static/src/bugfix/bugfix.js b/addons/hr_holidays/static/src/bugfix/bugfix.js
new file mode 100644
index 00000000..41d3e558
--- /dev/null
+++ b/addons/hr_holidays/static/src/bugfix/bugfix.js
@@ -0,0 +1,88 @@
+/**
+ * This file allows introducing new JS modules without contaminating other files.
+ * This is useful when bug fixing requires adding such JS modules in stable
+ * versions of Odoo. Any module that is defined in this file should be isolated
+ * in its own file in master.
+ */
+odoo.define('hr_holidays/static/src/bugfix/bugfix.js', function (require) {
+'use strict';
+
+});
+
+// FIXME move me in hr_holidays/static/src/models/partner/partner.js
+odoo.define('hr_holidays/static/src/models/partner/partner.js', function (require) {
+'use strict';
+
+const {
+ registerClassPatchModel,
+ registerFieldPatchModel,
+ registerInstancePatchModel,
+} = require('mail/static/src/model/model_core.js');
+const { attr, one2one } = require('mail/static/src/model/model_field.js');
+const { clear } = require('mail/static/src/model/model_field_command.js');
+
+const { str_to_datetime } = require('web.time');
+
+registerClassPatchModel('mail.partner', 'hr_holidays/static/src/models/partner/partner.js', {
+ /**
+ * @override
+ */
+ convertData(data) {
+ const data2 = this._super(data);
+ if ('out_of_office_date_end' in data) {
+ data2.outOfOfficeDateEnd = data.out_of_office_date_end ? data.out_of_office_date_end : clear();
+ }
+ return data2;
+ },
+});
+
+registerInstancePatchModel('mail.partner', 'hr_holidays/static/src/models/partner/partner.js', {
+ /**
+ * @private
+ */
+ _computeOutOfOfficeText() {
+ if (!this.outOfOfficeDateEnd) {
+ return clear();
+ }
+ if (!this.env.messaging.locale.language) {
+ return clear();
+ }
+ const currentDate = new Date();
+ const date = str_to_datetime(this.outOfOfficeDateEnd);
+ const options = { day: 'numeric', month: 'short' };
+ if (currentDate.getFullYear() !== date.getFullYear()) {
+ options.year = 'numeric';
+ }
+ const localeCode = this.env.messaging.locale.language.replace(/_/g,'-');
+ const formattedDate = date.toLocaleDateString(localeCode, options);
+ return _.str.sprintf(this.env._t("Out of office until %s"), formattedDate);
+ },
+
+});
+
+registerFieldPatchModel('mail.partner', 'hr/static/src/models/partner/partner.js', {
+ /**
+ * Serves as compute dependency.
+ */
+ locale: one2one('mail.locale', {
+ related: 'messaging.locale',
+ }),
+ /**
+ * Date of end of the out of office period of the partner as string.
+ * String is expected to use Odoo's datetime string format
+ * (examples: '2011-12-01 15:12:35.832' or '2011-12-01 15:12:35').
+ */
+ outOfOfficeDateEnd: attr(),
+ /**
+ * Text shown when partner is out of office.
+ */
+ outOfOfficeText: attr({
+ compute: '_computeOutOfOfficeText',
+ dependencies: [
+ 'locale',
+ 'outOfOfficeDateEnd',
+ ],
+ }),
+});
+
+});
diff --git a/addons/hr_holidays/static/src/bugfix/bugfix.scss b/addons/hr_holidays/static/src/bugfix/bugfix.scss
new file mode 100644
index 00000000..c4272e52
--- /dev/null
+++ b/addons/hr_holidays/static/src/bugfix/bugfix.scss
@@ -0,0 +1,6 @@
+/**
+* This file allows introducing new styles without contaminating other files.
+* This is useful when bug fixing requires adding new components for instance in
+* stable versions of Odoo. Any style that is defined in this file should be isolated
+* in its own file in master.
+*/
diff --git a/addons/hr_holidays/static/src/bugfix/bugfix.xml b/addons/hr_holidays/static/src/bugfix/bugfix.xml
new file mode 100644
index 00000000..c17906f7
--- /dev/null
+++ b/addons/hr_holidays/static/src/bugfix/bugfix.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+
+<!--
+ This file allows introducing new static templates without contaminating other files.
+ This is useful when bug fixing requires adding new components for instance in stable
+ versions of Odoo. Any template that is defined in this file should be isolated
+ in its own file in master.
+-->
+
+</templates>
diff --git a/addons/hr_holidays/static/src/bugfix/bugfix_tests.js b/addons/hr_holidays/static/src/bugfix/bugfix_tests.js
new file mode 100644
index 00000000..6f655603
--- /dev/null
+++ b/addons/hr_holidays/static/src/bugfix/bugfix_tests.js
@@ -0,0 +1,110 @@
+odoo.define('hr_holidays/static/src/bugfix/bugfix_tests.js', function (require) {
+'use strict';
+
+/**
+ * This file allows introducing new QUnit test modules without contaminating
+ * other test files. This is useful when bug fixing requires adding new
+ * components for instance in stable versions of Odoo. Any test that is defined
+ * in this file should be isolated in its own file in master.
+ */
+QUnit.module('hr_holidays', {}, function () {
+QUnit.module('bugfix', {}, function () {
+QUnit.module('bugfix_tests.js', {
+
+});
+});
+});
+
+});
+
+// FIXME move me in hr_holidays/static/src/components/thread_view/thread_view_tests.js
+odoo.define('hr_holidays/static/src/components/thread_view/thread_view_tests.js', function (require) {
+'use strict';
+
+const components = {
+ ThreadView: require('mail/static/src/components/thread_view/thread_view.js'),
+};
+const {
+ afterEach,
+ beforeEach,
+ createRootComponent,
+ start,
+} = require('mail/static/src/utils/test_utils.js');
+
+QUnit.module('hr_holidays', {}, function () {
+QUnit.module('components', {}, function () {
+QUnit.module('thread_view', {}, function () {
+QUnit.module('thread_view_tests.js', {
+ beforeEach() {
+ beforeEach(this);
+
+ /**
+ * @param {mail.thread_view} threadView
+ * @param {Object} [otherProps={}]
+ */
+ this.createThreadViewComponent = async (threadView, otherProps = {}) => {
+ const target = this.widget.el;
+ const props = Object.assign({ threadViewLocalId: threadView.localId }, otherProps);
+ await createRootComponent(this, components.ThreadView, { props, target });
+ };
+
+ this.start = async params => {
+ const { afterEvent, env, widget } = await start(Object.assign({}, params, {
+ data: this.data,
+ }));
+ this.afterEvent = afterEvent;
+ this.env = env;
+ this.widget = widget;
+ };
+ },
+ afterEach() {
+ afterEach(this);
+ },
+});
+
+QUnit.test('out of office message on direct chat with out of office partner', async function (assert) {
+ assert.expect(2);
+
+ // Returning date of the out of office partner, simulates he'll be back in a month
+ const returningDate = moment.utc().add(1, 'month');
+ // Needed partner & user to allow simulation of message reception
+ this.data['res.partner'].records.push({
+ id: 11,
+ name: "Foreigner partner",
+ out_of_office_date_end: returningDate.format("YYYY-MM-DD HH:mm:ss"),
+ });
+ this.data['mail.channel'].records = [{
+ channel_type: 'chat',
+ id: 20,
+ members: [this.data.currentPartnerId, 11],
+ }];
+ await this.start();
+ const thread = this.env.models['mail.thread'].findFromIdentifyingData({
+ id: 20,
+ model: 'mail.channel'
+ });
+ const threadViewer = this.env.models['mail.thread_viewer'].create({
+ hasThreadView: true,
+ thread: [['link', thread]],
+ });
+ await this.createThreadViewComponent(threadViewer.threadView, { hasComposer: true });
+ assert.containsOnce(
+ document.body,
+ '.o_ThreadView_outOfOffice',
+ "should have an out of office alert on thread view"
+ );
+ const formattedDate = returningDate.toDate().toLocaleDateString(
+ this.env.messaging.locale.language.replace(/_/g,'-'),
+ { day: 'numeric', month: 'short' }
+ );
+ assert.ok(
+ document.querySelector('.o_ThreadView_outOfOffice').textContent.includes(formattedDate),
+ "out of office message should mention the returning date"
+ );
+});
+
+});
+});
+});
+
+});