summaryrefslogtreecommitdiff
path: root/addons/web/static
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-04-01 16:20:00 +0200
committerChristophe Simonis <chs@odoo.com>2019-04-01 16:20:00 +0200
commit7ac5ec628cb9fe8ff3f6b54a1466f246a24ff01c (patch)
treee9297c876e0f9886c1b0abbb7e5cd389a7ab708c /addons/web/static
parent8de362fac65867687a3eb0557012db75faeab850 (diff)
parent18c735361a6861a294a9dc254395a084eb42f505 (diff)
[MERGE] forward port branch saas-12.2 up to 18c735361a6
Diffstat (limited to 'addons/web/static')
-rw-r--r--addons/web/static/src/js/chrome/abstract_action.js10
-rw-r--r--addons/web/static/src/js/core/dialog.js10
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_model.js6
-rw-r--r--addons/web/static/src/scss/form_view.scss5
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js62
-rw-r--r--addons/web/static/tests/views/calendar_tests.js55
6 files changed, 136 insertions, 12 deletions
diff --git a/addons/web/static/src/js/chrome/abstract_action.js b/addons/web/static/src/js/chrome/abstract_action.js
index 1b258ccc6f6..cf85a278884 100644
--- a/addons/web/static/src/js/chrome/abstract_action.js
+++ b/addons/web/static/src/js/chrome/abstract_action.js
@@ -91,20 +91,20 @@ var AbstractAction = Widget.extend(ActionMixin, {
*/
willStart: function () {
var self = this;
+ var defs = [this._super.apply(this, arguments)];
if (this.hasControlPanel) {
var params = this.controlPanelParams;
- var def;
if (this.loadControlPanel) {
- def = this
+ defs.push(this
.loadFieldView(params.modelName, params.context || {}, params.viewId, 'search')
.then(function (fieldsView) {
params.viewInfo = {
arch: fieldsView.arch,
fields: fieldsView.fields,
};
- });
+ }));
}
- return Promise.resolve(def).then(function () {
+ return Promise.all(defs).then(function () {
var controlPanelView = new self.config.ControlPanelView(params);
return controlPanelView.getController(self).then(function (controlPanel) {
self._controlPanel = controlPanel;
@@ -112,7 +112,7 @@ var AbstractAction = Widget.extend(ActionMixin, {
});
});
}
- return Promise.resolve();
+ return Promise.all(defs);
},
/**
* @override
diff --git a/addons/web/static/src/js/core/dialog.js b/addons/web/static/src/js/core/dialog.js
index 8630b6b9364..807411144e9 100644
--- a/addons/web/static/src/js/core/dialog.js
+++ b/addons/web/static/src/js/core/dialog.js
@@ -231,13 +231,13 @@ var Dialog = Widget.extend({
this.$modal.remove();
}
- if (!isFocusSet) {
- var modals = $('body > .modal').filter(':visible');
- if (modals.length) {
+ var modals = $('body > .modal').filter(':visible');
+ if (modals.length) {
+ if (!isFocusSet) {
modals.last().focus();
- // Keep class modal-open (deleted by bootstrap hide fnct) on body to allow scrolling inside the modal
- $('body').addClass('modal-open');
}
+ // Keep class modal-open (deleted by bootstrap hide fnct) on body to allow scrolling inside the modal
+ $('body').addClass('modal-open');
}
},
/**
diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js
index 9d8cf04f30f..1bcf4fbb298 100644
--- a/addons/web/static/src/js/views/calendar/calendar_model.js
+++ b/addons/web/static/src/js/views/calendar/calendar_model.js
@@ -75,9 +75,11 @@ return AbstractModel.extend({
.utc();
} else {
// default hours in the user's timezone
- start.hours(7).add(-this.getSession().getTZOffset(start), 'minutes');
- end.hours(19).add(-this.getSession().getTZOffset(end), 'minutes');
+ start.hours(7);
+ end.hours(19);
}
+ start.add(-this.getSession().getTZOffset(start), 'minutes');
+ end.add(-this.getSession().getTZOffset(end), 'minutes');
}
} else {
start.add(-this.getSession().getTZOffset(start), 'minutes');
diff --git a/addons/web/static/src/scss/form_view.scss b/addons/web/static/src/scss/form_view.scss
index cb9567a323b..51082e3357f 100644
--- a/addons/web/static/src/scss/form_view.scss
+++ b/addons/web/static/src/scss/form_view.scss
@@ -685,6 +685,11 @@
.o_field_widget {
margin-bottom: $o-form-spacing-unit * 2;
+
+ > .o_field_widget {
+ margin-bottom: 0;
+ }
+
&.o_field_boolean {
margin-right: 0;
}
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index 1641dfa0730..96bd4a4d633 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -285,6 +285,68 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('focus when closing many2one modal in many2one modal', async function (assert) {
+ assert.expect(12);
+
+ var form = await createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<field name="trululu"/>' +
+ '</form>',
+ res_id: 2,
+ archs: {
+ 'partner,false,form': '<form><field name="trululu"/></form>'
+ },
+ mockRPC: function (route, args) {
+ if (args.method === 'get_formview_id') {
+ return Promise.resolve(false);
+ }
+ return this._super(route, args);
+ },
+ });
+
+ // Open many2one modal
+ await testUtils.form.clickEdit(form);
+ await testUtils.dom.click(form.$('.o_external_button'));
+
+ var $originalModal = $('.modal-dialog');
+ var $focusedModal = $(document.activeElement).closest('.modal-dialog');
+
+ assert.equal($originalModal.length, 1, 'There should be one modal');
+ assert.equal($originalModal[0], $focusedModal[0], 'Modal is focused');
+ assert.ok($('body').hasClass('modal-open'), 'Modal is said opened');
+
+ // Open many2one modal of field in many2one modal
+ await testUtils.dom.click($originalModal.find('.o_external_button'));
+ var $modals = $('.modal-dialog');
+ $focusedModal = $(document.activeElement).closest('.modal-dialog');
+
+ assert.equal($modals.length, 2, 'There should be two modals');
+ assert.equal($modals[1], $focusedModal[0], 'Last modal is focused');
+ assert.ok($('body').hasClass('modal-open'), 'Modal is said opened');
+
+ // Close second modal
+ await testUtils.dom.click($modals.last().find('button[class="close"]'));
+ var $modal = $('.modal-dialog');
+ $focusedModal = $(document.activeElement).closest('.modal-dialog');
+
+ assert.equal($modal.length, 1, 'There should be one modal');
+ assert.equal($modal[0], $originalModal[0], 'First modal is still opened');
+ assert.equal($modal[0], $focusedModal[0], 'Modal is focused');
+ assert.ok($('body').hasClass('modal-open'), 'Modal is said opened');
+
+ // Close first modal
+ await testUtils.dom.click($modal.find('button[class="close"]'));
+ $modal = $('.modal-dialog.modal-lg');
+
+ assert.equal($modal.length, 0, 'There should be no modal');
+ assert.notOk($('body').hasClass('modal-open'), 'Modal is not said opened');
+
+ form.destroy();
+ });
+
QUnit.test('one2many from a model that has been sorted', async function (assert) {
assert.expect(1);
diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js
index 8061df08af4..9f637c4fdc5 100644
--- a/addons/web/static/tests/views/calendar_tests.js
+++ b/addons/web/static/tests/views/calendar_tests.js
@@ -2267,6 +2267,61 @@ QUnit.module('Views', {
calendar.destroy();
});
+ QUnit.test('timezone does not affect drag and drop', async function (assert) {
+ assert.expect(6);
+
+ var calendar = await createCalendarView({
+ View: CalendarView,
+ model: 'event',
+ data: this.data,
+ arch:
+ '<calendar date_start="start" mode="month">'+
+ '<field name="name"/>'+
+ '<field name="start"/>'+
+ '</calendar>',
+ archs: archs,
+ viewOptions: {
+ initialDate: initialDate,
+ },
+ mockRPC: function (route, args) {
+ if (args.method === "write") {
+ assert.deepEqual(args.args[0], [6], "event 6 is moved")
+ assert.deepEqual(args.args[1].start, "2016-11-29 08:00:00",
+ "event moved to 27th nov 16h00 +40 hours timezone")
+ }
+ return this._super(route, args);
+ },
+ session: {
+ getTZOffset: function () {
+ return -2400; // 40 hours timezone
+ },
+ },
+ });
+
+ var events = calendar.$('.fc-event').map(function () {
+ return $(this).text().trim().replace(/\s+/g, '|');
+ });
+
+ assert.strictEqual(events[0], "event|1|12/09/2016|08:00:00");
+ assert.strictEqual(events[5], "event|6|12/16/2016|16:00:00");
+
+ // Move event 6 as on first day of month view (27th november 2016)
+ await testUtils.dragAndDrop(
+ calendar.$('.fc-event').eq(5),
+ calendar.$('.fc-day-top').first()
+ );
+ await testUtils.nextTick();
+
+ events = calendar.$('.fc-event').map(function () {
+ return $(this).text().trim().replace(/\s+/g, '|');
+ });
+
+ assert.strictEqual(events[0], "event|6|11/27/2016|16:00:00");
+ assert.strictEqual(events[1], "event|1|12/09/2016|08:00:00");
+
+ calendar.destroy();
+ });
+
QUnit.test('form_view_id attribute works (for creating events)', async function (assert) {
assert.expect(1);