diff options
Diffstat (limited to 'addons/web/static/src/js/views/view_dialogs.js')
| -rw-r--r-- | addons/web/static/src/js/views/view_dialogs.js | 169 |
1 files changed, 48 insertions, 121 deletions
diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js index ee11afbc3bd..fb9cd5afa0c 100644 --- a/addons/web/static/src/js/views/view_dialogs.js +++ b/addons/web/static/src/js/views/view_dialogs.js @@ -3,13 +3,10 @@ odoo.define('web.view_dialogs', function (require) { var config = require('web.config'); var core = require('web.core'); -var data = require('web.data'); var Dialog = require('web.Dialog'); var dom = require('web.dom'); var ListController = require('web.ListController'); var ListView = require('web.ListView'); -var pyUtils = require('web.py_utils'); -var SearchView = require('web.SearchView'); var view_registry = require('web.view_registry'); var _t = core._t; @@ -21,9 +18,6 @@ var _t = core._t; var ViewDialog = Dialog.extend({ custom_events: _.extend({}, Dialog.prototype.custom_events, { push_state: '_onPushState', - env_updated: function (event) { - event.stopPropagation(); - }, }), /** * @constructor @@ -45,10 +39,6 @@ var ViewDialog = Dialog.extend({ this.domain = options.domain || []; this.context = options.context || {}; this.options = _.extend(this.options || {}, options || {}); - - // FIXME: remove this once a dataset won't be necessary anymore to interact - // with data_manager and instantiate views - this.dataset = new data.DataSet(this, this.res_model, this.context); }, //-------------------------------------------------------------------------- @@ -182,7 +172,7 @@ var FormViewDialog = ViewDialog.extend({ if (this.options.fields_view) { fields_view_def = $.when(this.options.fields_view); } else { - fields_view_def = this.loadFieldView(this.dataset, this.options.view_id, 'form'); + fields_view_def = this.loadFieldView(this.res_model, this.context, this.options.view_id, 'form'); } fields_view_def.then(function (viewInfo) { @@ -271,17 +261,23 @@ var FormViewDialog = ViewDialog.extend({ }); var SelectCreateListController = ListController.extend({ - // Override the ListView to handle the custom events 'open_record' (triggered when clicking on a - // row of the list) such that it triggers up 'select_record' with its res_id. - custom_events: _.extend({}, ListController.prototype.custom_events, { - open_record: function (event) { - var selectedRecord = this.model.get(event.data.id); - this.trigger_up('select_record', { - id: selectedRecord.res_id, - display_name: selectedRecord.data.display_name, - }); - }, - }), + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * Override to select the clicked record instead of opening it + * + * @override + * @private + */ + _onOpenRecord: function (ev) { + var selectedRecord = this.model.get(ev.data.id); + this.trigger_up('select_record', { + id: selectedRecord.res_id, + display_name: selectedRecord.data.display_name, + }); + }, }); /** @@ -299,13 +295,6 @@ var SelectCreateDialog = ViewDialog.extend({ event.stopPropagation(); this.$footer.find(".o_select_button").prop('disabled', !event.data.selection.length); }, - search: function (event) { - event.stopPropagation(); // prevent this event from bubbling up to the action manager - var d = event.data; - var searchData = this._process_search_data(d.domains, d.contexts, d.groupbys); - this.list_controller.reload(searchData); - }, - get_controller_context: '_onGetControllerContext', }), /** @@ -320,7 +309,7 @@ var SelectCreateDialog = ViewDialog.extend({ this._super.apply(this, arguments); _.defaults(this.options, { initial_view: 'search' }); this.on_selected = this.options.on_selected || (function () {}); - this.initial_ids = this.options.initial_ids; + this.initialIDs = this.options.initial_ids; }, open: function () { @@ -328,26 +317,13 @@ var SelectCreateDialog = ViewDialog.extend({ return this.create_edit_record(); } var self = this; - var user_context = this.getSession().user_context; - var _super = this._super.bind(this); - var context = pyUtils.eval_domains_and_contexts({ - domains: [], - contexts: [user_context, this.context] - }).context; - var search_defaults = {}; - _.each(context, function (value_, key) { - var match = /^search_default_(.*)$/.exec(key); - if (match) { - search_defaults[match[1]] = value_; - } - }); - this.loadViews(this.dataset.model, this.dataset.get_context().eval(), [[false, 'list'], [false, 'search']], {}) - .then(this.setup.bind(this, search_defaults)) + this.loadViews(this.res_model, this.context, [[false, 'list'], [false, 'search']], {}) + .then(this.setup.bind(this)) .then(function (fragment) { self.opened().then(function () { dom.append(self.$el, fragment, { - callbacks: [{widget: self.list_controller}], + callbacks: [{widget: self.listController}], in_DOM: true, }); self.set_buttons(self.__buttons); @@ -357,65 +333,50 @@ var SelectCreateDialog = ViewDialog.extend({ return this; }, - setup: function (search_defaults, fields_views) { + setup: function (fieldsViews) { var self = this; var fragment = document.createDocumentFragment(); - var searchDef = $.Deferred(); - - // Set the dialog's header and its search view - var $header = $('<div/>').addClass('o_modal_header').appendTo(fragment); - var $pager = $('<div/>').addClass('o_pager').appendTo($header); - var options = { - $buttons: $('<div/>').addClass('o_search_options').appendTo($header), - search_defaults: search_defaults, - }; - var searchview = new SearchView(this, this.dataset, fields_views.search, options); - searchview.prependTo($header).done(function () { - var d = searchview.build_search_data(); - if (self.initial_ids) { - d.domains.push([["id", "in", self.initial_ids]]); - self.initial_ids = undefined; - } - var searchData = self._process_search_data(d.domains, d.contexts, d.groupbys); - searchDef.resolve(searchData); - }); - - return $.when(searchDef).then(function (searchResult) { - // Set the list view - var listView = new ListView(fields_views.list, _.extend({ - context: searchResult.context, - domain: searchResult.domain, - groupBy: searchResult.groupBy, - modelName: self.dataset.model, - hasSelectors: !self.options.disable_multiple_selection, - readonly: true, - }, self.options.list_view_options)); - listView.setController(SelectCreateListController); - return listView.getController(self); - }).then(function (controller) { - self.list_controller = controller; - // Set the dialog's buttons + var domain = this.domain; + if (this.initialIDs) { + domain = domain.concat([['id', 'in', this.initialIDs]]); + } + var listView = new ListView(fieldsViews.list, _.extend({ + action: { + controlPanelFieldsView: fieldsViews.search, + }, + action_buttons: false, + context: this.context, + domain: domain, + hasSelectors: !this.options.disable_multiple_selection, + modelName: this.res_model, + readonly: true, + withBreadcrumbs: false, + }, this.options.list_view_options)); + listView.setController(SelectCreateListController); + return listView.getController(this).then(function (controller) { + self.listController = controller; + // render the footer buttons self.__buttons = [{ text: _t("Cancel"), - classes: "btn-secondary o_form_button_cancel", + classes: 'btn-secondary o_form_button_cancel', close: true, }]; if (!self.options.no_create) { self.__buttons.unshift({ text: _t("Create"), - classes: "btn-primary", + classes: 'btn-primary', click: self.create_edit_record.bind(self) }); } if (!self.options.disable_multiple_selection) { self.__buttons.unshift({ text: _t("Select"), - classes: "btn-primary o_select_button", + classes: 'btn-primary o_select_button', disabled: true, close: true, click: function () { - var records = self.list_controller.getSelectedRecords(); + var records = self.listController.getSelectedRecords(); var values = _.map(records, function (record) { return { id: record.res_id, @@ -426,28 +387,11 @@ var SelectCreateDialog = ViewDialog.extend({ }, }); } - return self.list_controller.appendTo(fragment); + return self.listController.appendTo(fragment); }).then(function () { - searchview.toggle_visibility(true); - self.list_controller.do_show(); - self.list_controller.renderPager($pager); return fragment; }); }, - _process_search_data: function (domains, contexts, groupbys) { - var results = pyUtils.eval_domains_and_contexts({ - domains: [this.domain].concat(domains), - contexts: [this.context].concat(contexts), - group_by_seq: groupbys || [], - eval_context: this.getSession().user_context, - }); - var context = _.omit(results.context, function (value, key) { return key.indexOf('search_default_') === 0; }); - return { - context: context, - domain: results.domain, - groupBy: results.group_by, - }; - }, create_edit_record: function () { var self = this; var dialog = new FormViewDialog(this, _.extend({}, this.options, { @@ -469,23 +413,6 @@ var SelectCreateDialog = ViewDialog.extend({ this.trigger_up('form_dialog_discarded'); return true; }, - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- - - /** - * Handles a context request: provides to the caller the context of the - * list controller. - * - * @private - * @param {OdooEvent} ev - * @param {function} ev.data.callback used to send the requested context - */ - _onGetControllerContext: function (ev) { - ev.stopPropagation(); - var context = this.list_controller && this.list_controller.getContext(); - ev.data.callback(context || {}); - } }); return { |
