diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py index ec2c536364..d38fd87b05 100644 --- a/fs_base_multi_image/models/fs_image_relation_mixin.py +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -83,12 +83,14 @@ def _inverse_image(self): @api.model def _cleanup_vals(self, vals): - if ( - "link_existing" in vals - and vals["link_existing"] - and "specific_image" in vals - ): - vals["specific_image"] = False + link_existing = vals.get("link_existing") + if link_existing: + if "specific_image" in vals: + vals.pop("specific_image") + if "image" in vals: + # image is set when using the kanban renderer so it + # prevents the name field to be computed well + vals.pop("image") return vals @api.model_create_multi diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js index 3d455c65af..e62788d268 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js @@ -6,11 +6,20 @@ import {onWillRender, useRef, useState} from "@odoo/owl"; import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; import {registry} from "@web/core/registry"; +import {useX2ManyCrud} from "@web/views/fields/relational_utils"; + export class FsImageRelationDndUploadField extends X2ManyField { + /** + * When using this widget, displayed image relation views must contains + * following fields: + * - sequence + * - image_id + * - specific_image + * - link_existing + */ setup() { super.setup(); this.options = this.activeField.options; - this.relationField = this.field.relation_field; this.defaultTarget = this.options.target || "specific"; this.state = useState({ dragging: false, @@ -19,6 +28,8 @@ export class FsImageRelationDndUploadField extends X2ManyField { this.fileInput = useRef("fileInput"); this.defaultSequence = 0; + this.operations = useX2ManyCrud(() => this.list, this.isMany2Many); + onWillRender(() => { this.initDefaultSequence(); }); @@ -28,6 +39,10 @@ export class FsImageRelationDndUploadField extends X2ManyField { return this.state.target; } + get relationRecordId() { + return this.props.record.data.id; + } + get displayDndZone() { const activeActions = this.activeActions; return ( @@ -92,18 +107,15 @@ export class FsImageRelationDndUploadField extends X2ManyField { async uploadFsImage(imagesDesc) { const self = this; - const createValues = []; self.env.model.orm .call("fs.image", "create", [imagesDesc]) .then((fsImageIds) => { let values = {}; _.each(fsImageIds, (fsImageId) => { values = self.getFsImageRelationValues(fsImageId); - createValues.push(values); + self.createFieldRelationRecords(values); }); - }) - .then(() => { - self.createFieldRelationRecords(createValues); + unblockUI(); }) .catch(() => { self.displayUploadError(); @@ -123,8 +135,8 @@ export class FsImageRelationDndUploadField extends X2ManyField { getFsImageRelationValues(fsImageId) { let values = { - image_id: fsImageId, - link_existing: true, + default_image_id: fsImageId, + default_link_existing: true, }; values = {...values, ...this.getRelationCommonValues()}; return values; @@ -132,40 +144,34 @@ export class FsImageRelationDndUploadField extends X2ManyField { async uploadSpecificImage(imagesDesc) { const self = this; - const createValues = []; _.each(imagesDesc, (imageDesc) => { - createValues.push(self.getSpecificImageRelationValues(imageDesc)); + self.createFieldRelationRecords( + self.getSpecificImageRelationValues(imageDesc) + ); }); - self.createFieldRelationRecords(createValues); + unblockUI(); } getSpecificImageRelationValues(imageDesc) { - return {...imageDesc, ...this.getRelationCommonValues()}; + return { + ...this.getRelationCommonValues(), + default_specific_image: imageDesc.image, + }; } getRelationCommonValues() { - const values = { - sequence: this.getNewSequence(), + return { + default_sequence: this.getNewSequence(), }; - values[this.relationField] = this.props.record.data.id; - return values; } async createFieldRelationRecords(createValues) { - const self = this; - const model = self.env.model; - model.orm - .call(self.activeField.relation, "create", [createValues]) - .then(() => { - model.root.load(); - model.root.save(); - }) - .then(() => { - unblockUI(); - }) - .catch(() => { - self.displayUploadError(); - }); + await this.list.addNew({ + position: "bottom", + context: createValues, + mode: "readonly", + allowWarning: true, + }); } async uploadImages(files) { diff --git a/fs_base_multi_image/views/fs_image_relation_mixin.xml b/fs_base_multi_image/views/fs_image_relation_mixin.xml index 802d82ab0c..b42ecdb881 100644 --- a/fs_base_multi_image/views/fs_image_relation_mixin.xml +++ b/fs_base_multi_image/views/fs_image_relation_mixin.xml @@ -45,8 +45,10 @@ - + + +
diff --git a/fs_product_multi_image/views/fs_product_image.xml b/fs_product_multi_image/views/fs_product_image.xml index 002e85635f..7acd5c47d0 100644 --- a/fs_product_multi_image/views/fs_product_image.xml +++ b/fs_product_multi_image/views/fs_product_image.xml @@ -38,7 +38,7 @@ /> primary - + diff --git a/fs_product_multi_image/views/product_template.xml b/fs_product_multi_image/views/product_template.xml index b2af520227..eebe4cdf0d 100644 --- a/fs_product_multi_image/views/product_template.xml +++ b/fs_product_multi_image/views/product_template.xml @@ -20,17 +20,20 @@ - + + + + + -