summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic/basic_model.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/views/basic/basic_model.js')
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js79
1 files changed, 53 insertions, 26 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js
index 84e900021e8..695e8147c7f 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -1328,17 +1328,17 @@ var BasicModel = AbstractModel.extend({
* @param {Object} [options]
* @param {string} [options.position=top] if the new record should be added
* on top or on bottom of the list
- * @param {Object} [options.context] additional context to be merged before
- * calling the default_get (eg. to set default values)
- * @returns {Deferred<string>} resolves to the new record id
+ * @param {Object} [options.[context]] additional context to be merged before
+ * calling the default_get (eg. to set default values).
+ * If several contexts are found, multiple records are added
+ * @param {boolean} [params.allowWarning=false] if true, the default record
+ * operation can complete, even if a warning is raised
+ * @returns {Deferred<[string]>} resolves to the new records ids
*/
_addX2ManyDefaultRecord: function (list, options) {
var self = this;
var position = options && options.position || 'top';
- var additionalContext = options && options.context;
- var context = this._getContext(list, {additionalContext: additionalContext});
var params = {
- context: context,
fields: list.fields,
fieldsInfo: list.fieldsInfo,
parentID: list.id,
@@ -1346,17 +1346,36 @@ var BasicModel = AbstractModel.extend({
viewType: list.viewType,
allowWarning: options && options.allowWarning
};
- return this._makeDefaultRecord(list.model, params).then(function (id) {
- list._changes.push({operation: 'ADD', id: id, position: position, isNew: true});
- var record = self.localData[id];
- list._cache[record.res_id] = id;
- if (list.orderedResIDs) {
- var index = list.offset + (position !== 'top' ? list.limit : 0);
- list.orderedResIDs.splice(index, 0, record.res_id);
- // list could be a copy of the original one
- self.localData[list.id].orderedResIDs = list.orderedResIDs;
- }
- return id;
+
+ var additionalContexts = options && options.context;
+ var makeDefaultRecords = [];
+ if(additionalContexts){
+ _.each(additionalContexts, function (context) {
+ params.context = self._getContext(list, {additionalContext: context});
+ makeDefaultRecords.push(self._makeDefaultRecord(list.model, params));
+ });
+ } else {
+ params.context = self._getContext(list);
+ makeDefaultRecords.push(self._makeDefaultRecord(list.model, params));
+ }
+
+ return $.when.apply($, makeDefaultRecords).then(function(){
+ var ids = [];
+ _.each(arguments, function(id){
+ ids.push(id);
+
+ list._changes.push({operation: 'ADD', id: id, position: position, isNew: true});
+ var record = self.localData[id];
+ list._cache[record.res_id] = id;
+ if (list.orderedResIDs) {
+ var index = list.offset + (position !== 'top' ? list.limit : 0);
+ list.orderedResIDs.splice(index, 0, record.res_id);
+ // list could be a copy of the original one
+ self.localData[list.id].orderedResIDs = list.orderedResIDs;
+ }
+ });
+
+ return ids;
});
},
/**
@@ -1375,6 +1394,9 @@ var BasicModel = AbstractModel.extend({
* it was changed.
* @param {string} [options.viewType] current viewType. If not set, we will assume
* main viewType from the record
+ * @param {boolean} [params.allowWarning=false] if true, change
+ * operation can complete, even if a warning is raised
+ * (only supported by X2ManyChange)
* @returns {Deferred} list of changed fields
*/
_applyChange: function (recordID, changes, options) {
@@ -1723,6 +1745,9 @@ var BasicModel = AbstractModel.extend({
* key. For example, it looks like {operation: ADD, id: 'partner_1'}
* @param {string} [viewType] current viewType. If not set, we will assume
* main viewType from the record
+ * @param {boolean} [params.allowWarning=false] if true, change
+ * operation can complete, even if a warning is raised
+ * (only supported by the 'CREATE' command.operation)
* @returns {Deferred}
*/
_applyX2ManyChange: function (record, fieldName, command, viewType, allowWarning) {
@@ -1822,15 +1847,17 @@ var BasicModel = AbstractModel.extend({
position: command.position,
allowWarning: allowWarning
};
- def = this._addX2ManyDefaultRecord(list, options).then(function (id) {
- if (command.position === 'bottom' && list.orderedResIDs && list.orderedResIDs.length >= list.limit) {
- list.tempLimitIncrement = (list.tempLimitIncrement || 0) + 1;
- list.limit += 1;
- }
- // FIXME: hack for lunch widget, which does useless default_get and onchange
- if (command.data) {
- return self._applyChange(id, command.data);
- }
+ def = this._addX2ManyDefaultRecord(list, options).then(function (ids) {
+ _.each(ids, function(id){
+ if (command.position === 'bottom' && list.orderedResIDs && list.orderedResIDs.length >= list.limit) {
+ list.tempLimitIncrement = (list.tempLimitIncrement || 0) + 1;
+ list.limit += 1;
+ }
+ // FIXME: hack for lunch widget, which does useless default_get and onchange
+ if (command.data) {
+ return self._applyChange(id, command.data);
+ }
+ });
});
defs.push(def);
break;