summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/fields
diff options
context:
space:
mode:
authorVandan Shah <vas@odoo.com>2018-10-25 06:53:00 +0000
committerAaron Bohy <aab@odoo.com>2019-04-23 13:45:15 +0000
commit9b90d8727da9df6eb7ce756c4f9ffb0973e6ea65 (patch)
tree0617989834e0d6915314b39d1c07d5b50690b1b2 /addons/web/static/src/js/fields
parent8c931ffc2e6f31caac4c15050403a84ca92b8c82 (diff)
[IMP] web: enable drag&drop in ungrouped kanban views
With this rev., the resequencing feature (with drag and drop) that was already available in list views is now available also in kanban views having a field with widget="handle". This works for main as well as x2many kanban views. Some code handling the resequencing has been moved from the list components (controller and renderer) to the basic ones, so that the logic is shared between list and kanban. Task 1902808 closes odoo/odoo#28581 Signed-off-by: VincentSchippefilt <VincentSchippefilt@users.noreply.github.com> Co-authored-by: Mohammed Shekha <msh@openerp.com> Co-authored-by: Aaron Bohy <aab@odoo.com>
Diffstat (limited to 'addons/web/static/src/js/fields')
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js53
1 files changed, 34 insertions, 19 deletions
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index 642fa55b33e..85342269617 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -812,7 +812,7 @@ var FieldX2Many = AbstractField.extend({
open_record: '_onOpenRecord',
kanban_record_delete: '_onRemoveRecord',
list_record_remove: '_onRemoveRecord',
- resequence: '_onResequence',
+ resequence_records: '_onResequenceRecords',
save_line: '_onSaveLine',
toggle_column_order: '_onToggleColumnOrder',
activate_next_widget: '_onActiveNextWidget',
@@ -1043,6 +1043,7 @@ var FieldX2Many = AbstractField.extend({
};
_.extend(rendererParams, {
record_options: record_options,
+ readOnlyMode: this.isReadonly,
});
}
@@ -1351,38 +1352,52 @@ var FieldX2Many = AbstractField.extend({
* Forces a resequencing of the records.
*
* @private
- * @param {OdooEvent} event
+ * @param {OdooEvent} ev
+ * @param {string[]} ev.data.recordIds
+ * @param {integer} ev.data.offset
+ * @param {string} ev.data.handleField
*/
- _onResequence: function (event) {
- event.stopPropagation();
+ _onResequenceRecords: function (ev) {
+ ev.stopPropagation();
var self = this;
- this.trigger_up('edited_list', { id: this.value.id });
- var rowIDs = event.data.rowIDs.slice();
- var rowID = rowIDs.pop();
- var defs = _.map(rowIDs, function (rowID, index) {
+ if (this.view.arch.tag === 'tree') {
+ this.trigger_up('edited_list', { id: this.value.id });
+ }
+ var handleField = ev.data.handleField;
+ var offset = ev.data.offset;
+ var recordIds = ev.data.recordIds.slice();
+ // trigger an update of all records but the last one with option
+ // 'notifyChanges' set to false, and once all those changes have been
+ // validated by the model, trigger the change on the last record
+ // (without the option, s.t. the potential onchange on parent record
+ // is triggered)
+ var recordId = recordIds.pop();
+ var proms = recordIds.map(function (recordId, index) {
var data = {};
- data[event.data.handleField] = event.data.offset + index;
+ data[handleField] = offset + index;
return self._setValue({
operation: 'UPDATE',
- id: rowID,
+ id: recordId,
data: data,
}, {
notifyChange: false,
});
});
- Promise.all(defs).then(function () {
+ Promise.all(proms).then(function () {
function always() {
- self.trigger_up('toggle_column_order', {
- id: self.value.id,
- name: event.data.handleField,
- });
+ if (self.view.arch.tag === 'tree') {
+ self.trigger_up('toggle_column_order', {
+ id: self.value.id,
+ name: handleField,
+ });
+ }
}
-
- // trigger only once the onchange for parent record
+ var data = {};
+ data[handleField] = offset + recordIds.length;
self._setValue({
operation: 'UPDATE',
- id: rowID,
- data: _.object([event.data.handleField], [event.data.offset + rowIDs.length]),
+ id: recordId,
+ data: data,
}).then(always).guardedCatch(always);
});
},