diff options
| author | qsm-odoo <qsm@odoo.com> | 2020-01-09 12:41:35 +0000 |
|---|---|---|
| committer | qsm-odoo <qsm@odoo.com> | 2020-01-09 13:09:50 +0000 |
| commit | e590609ebb429c6254766aa1fd8cab3ce3fd4c74 (patch) | |
| tree | 34ca3a4b3154eb1d93fa6d53f225dafb6d3de3f6 /addons/web_editor/static/src | |
| parent | 03ee121d6a31290f1699fdf4791970e1abafa260 (diff) | |
[IMP] web_editor: allow to enable option widgets by enabling another
With this commit, we can now say "on preview/selection of a widget,
also preview/selection these other widgets". For this, add a
`data-trigger` with comma-separated widget names.
A `data-trigger-value` can also be used to indicate the values these
other widgets should have during preview/selection... but this currently
only works for colorpicker widgets thanks to a big big hack that should
be improved later.
Part of https://github.com/odoo/odoo/pull/42986
closes odoo/odoo#42986
Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
Diffstat (limited to 'addons/web_editor/static/src')
| -rw-r--r-- | addons/web_editor/static/src/js/editor/snippets.options.js | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/addons/web_editor/static/src/js/editor/snippets.options.js b/addons/web_editor/static/src/js/editor/snippets.options.js index 0408abddf72..478855e8e09 100644 --- a/addons/web_editor/static/src/js/editor/snippets.options.js +++ b/addons/web_editor/static/src/js/editor/snippets.options.js @@ -280,12 +280,18 @@ const UserValueWidget = Widget.extend({ this._methodsParams = _.extend({}, extraParams); this._methodsParams.optionsPossibleValues = {}; this._dependencies = []; + this._triggerWidgetsNames = []; + this._triggerWidgetsValues = []; for (const key in this.el.dataset) { const dataValue = this.el.dataset[key].trim(); if (key === 'dependencies') { this._dependencies.push(...dataValue.split(/\s*,\s*/g)); + } else if (key === 'trigger') { + this._triggerWidgetsNames.push(...dataValue.split(/\s*,\s*/g)); + } else if (key === 'triggerValue') { + this._triggerWidgetsValues.push(...dataValue.split(/\s*,\s*/g)); } else if (validMethodNames.includes(key)) { this._methodsNames.push(key); this._methodsParams.optionsPossibleValues[key] = dataValue.split(/\s*\|\s*/g); @@ -318,8 +324,9 @@ const UserValueWidget = Widget.extend({ }, /** * @param {boolean} [previewMode=false] + * @param {boolean} [isSimulatedEvent=false] */ - notifyValueChange: function (previewMode) { + notifyValueChange: function (previewMode, isSimulatedEvent) { // If the widget has no associated method, it should not notify user // value changes if (!this._methodsNames.length) { @@ -339,6 +346,7 @@ const UserValueWidget = Widget.extend({ const data = { previewMode: previewMode || false, + isSimulatedEvent: !!isSimulatedEvent, }; // TODO improve this. The preview state has to be updated only when the // actual option _select is gonna be called... but this is delayed by a @@ -465,6 +473,16 @@ const UserValueWidget = Widget.extend({ */ _onUserValueNotification: function (ev) { ev.data.widget = this; + + if (!ev.data.triggerWidgetsNames) { + ev.data.triggerWidgetsNames = []; + } + ev.data.triggerWidgetsNames.push(...this._triggerWidgetsNames); + + if (!ev.data.triggerWidgetsValues) { + ev.data.triggerWidgetsValues = []; + } + ev.data.triggerWidgetsValues.push(...this._triggerWidgetsValues); }, /** * Should be called when an user event on the widget indicates a value @@ -2001,15 +2019,17 @@ const SnippetOptionWidget = Widget.extend({ * @param {Event} ev */ _onUserValueUpdate: function (ev) { + ev.stopPropagation(); + const widget = ev.data.widget; const previewMode = ev.data.previewMode; - ev.stopPropagation(); + // Ask a mutexed snippet update according to the widget value change + const shouldRecordUndo = (!previewMode && !ev.data.isSimulatedEvent); this.trigger_up('snippet_edition_request', {exec: async () => { if (ev.data.prepare) { ev.data.prepare(); } - const widget = ev.data.widget; if (previewMode && (widget.$el.closest('[data-no-preview="true"]').length)) { // TODO the flag should be fetched through widget params somehow return; @@ -2017,7 +2037,7 @@ const SnippetOptionWidget = Widget.extend({ // If it is not preview mode, the user selected the option for good // (so record the action) - if (!previewMode) { + if (shouldRecordUndo) { this.trigger_up('request_history_undo_record', {$target: this.$target}); } @@ -2035,6 +2055,38 @@ const SnippetOptionWidget = Widget.extend({ }); }); }}); + + // Check linked widgets: force their value and simulate a notification + const triggerWidgetsNames = ev.data.triggerWidgetsNames; + const triggerWidgetsValues = ev.data.triggerWidgetsValues; + for (let i = 0, l = triggerWidgetsNames.length; i < l; i++) { + const widgetName = triggerWidgetsNames[i]; + const widgetValue = triggerWidgetsValues[i]; + + let linkedWidget = null; + this.trigger_up('user_value_widget_request', { + name: widgetName, + onSuccess: _widget => linkedWidget = _widget, + }); + if (linkedWidget) { + if (widgetValue !== undefined) { + // FIXME right now only make this work supposing it is a + // colorpicker widget with big big hacks, this should be + // improved a lot + const normValue = this._normalizeWidgetValue(widgetValue); + if (previewMode === true) { + linkedWidget._previewColor = normValue; + } else if (previewMode === false) { + linkedWidget._previewColor = false; + linkedWidget._value = normValue; + } else { + linkedWidget._previewColor = false; + } + } + + linkedWidget.notifyValueChange(previewMode, true); + } + } }, }); const registry = {}; |
