diff --git a/addons/web/static/src/views/fields/char/char_field.xml b/addons/web/static/src/views/fields/char/char_field.xml index 8496c353ff6..34e683d7cf9 100644 --- a/addons/web/static/src/views/fields/char/char_field.xml +++ b/addons/web/static/src/views/fields/char/char_field.xml @@ -20,7 +20,6 @@ diff --git a/addons/web/static/src/views/fields/text/text_field.xml b/addons/web/static/src/views/fields/text/text_field.xml index 6b19c1d0205..be000554325 100644 --- a/addons/web/static/src/views/fields/text/text_field.xml +++ b/addons/web/static/src/views/fields/text/text_field.xml @@ -20,7 +20,6 @@ diff --git a/addons/web/static/src/views/fields/translation_button.js b/addons/web/static/src/views/fields/translation_button.js index 68fc1c3c780..bfbb841d9c2 100644 --- a/addons/web/static/src/views/fields/translation_button.js +++ b/addons/web/static/src/views/fields/translation_button.js @@ -19,7 +19,7 @@ export function useTranslationDialog() { const addDialog = useOwnedDialogs(); const env = useEnv(); - async function openTranslationDialog({ record, fieldName, updateField }) { + async function openTranslationDialog({ record, fieldName }) { if (!record.resId) { let _continue = true; await new Promise((resolve) => { @@ -50,7 +50,10 @@ export function useTranslationDialog() { resModel: resModel, userLanguageValue: record.data[fieldName] || "", isComingFromTranslationAlert: false, - updateField, + onSave: async () => { + await record.load({}, { keepChanges: true }); + record.model.notify(); + }, }); } @@ -71,13 +74,12 @@ export class TranslationButton extends Component { } onClick() { - const { fieldName, record, updateField } = this.props; - this.translationDialog({ fieldName, record, updateField }); + const { fieldName, record } = this.props; + this.translationDialog({ fieldName, record }); } } TranslationButton.template = "web.TranslationButton"; TranslationButton.props = { fieldName: { type: String }, record: { type: Object }, - updateField: { type: Function }, }; diff --git a/addons/web/static/src/views/fields/translation_dialog.js b/addons/web/static/src/views/fields/translation_dialog.js index f648ab8ce07..9a9e0ea2d65 100644 --- a/addons/web/static/src/views/fields/translation_dialog.js +++ b/addons/web/static/src/views/fields/translation_dialog.js @@ -28,16 +28,23 @@ export class TranslationDialog extends Component { this.terms = translations.map((term) => { const relatedLanguage = languages.find((l) => l[0] === term.lang); - return { + const termInfo = { ...term, langName: relatedLanguage[1], - value: - term.lang === this.user.lang && - !this.props.showSource && - !this.props.isComingFromTranslationAlert - ? this.props.userLanguageValue - : term.value || "", + value: term.value || "", }; + // we set the translation value coming from the database, except for the language + // the user is currently utilizing. Then we set the translation value coming + // from the value of the field in the form + if ( + term.lang === this.user.lang && + !this.props.showSource && + !this.props.isComingFromTranslationAlert + ) { + this.updatedTerms[term.id] = this.props.userLanguageValue; + termInfo.value = this.props.userLanguageValue; + } + return termInfo; }); this.terms.sort((a, b) => a.langName.localeCompare(b.langName)); }); @@ -88,19 +95,7 @@ export class TranslationDialog extends Component { translations, ]); - // we might have to update the value of the field on the form - // view that opened the translation dialog - const currentTerm = this.terms.find( - (term) => term.lang === this.user.lang && !this.props.showSource - ); - if ( - currentTerm && - currentTerm.id in this.updatedTerms && - currentTerm.value !== this.updatedTerms[currentTerm.id] - ) { - this.props.updateField(this.updatedTerms[currentTerm.id]); - } - + await this.props.onSave(); this.props.close(); } } diff --git a/addons/web/static/tests/views/fields/char_field_tests.js b/addons/web/static/tests/views/fields/char_field_tests.js index 1bd5ac20875..e2399b2de67 100644 --- a/addons/web/static/tests/views/fields/char_field_tests.js +++ b/addons/web/static/tests/views/fields/char_field_tests.js @@ -310,7 +310,7 @@ QUnit.module("Fields", (hooks) => { return Promise.resolve([ [ { lang: "en_US", source: "yop", value: "yop" }, - { lang: "fr_BE", source: "yop", value: "valeur français" }, + { lang: "fr_BE", source: "yop", value: "yop français" }, { lang: "es_ES", source: "yop", value: "yop español" }, ], { translation_type: "char", translation_show_source: false }, @@ -319,9 +319,9 @@ QUnit.module("Fields", (hooks) => { if (call_get_field_translations === 1) { return Promise.resolve([ [ - { lang: "en_US", source: "english value", value: "english value" }, - { lang: "fr_BE", source: "english value", value: "valeur français" }, - { lang: "es_ES", source: "english value", value: "english value" }, + { lang: "en_US", source: "bar", value: "bar" }, + { lang: "fr_BE", source: "bar", value: "yop français" }, + { lang: "es_ES", source: "bar", value: "bar" }, ], { translation_type: "char", translation_show_source: false }, ]); @@ -330,9 +330,10 @@ QUnit.module("Fields", (hooks) => { if (route === "/web/dataset/call_kw/partner/update_field_translations") { assert.deepEqual( args[2], - { en_US: "english value", es_ES: false }, + { en_US: "bar", es_ES: false }, "the new translation value should be written and the value false voids the translation" ); + serverData.models.partner.records[0].foo = "bar"; return Promise.resolve(null); } }, @@ -366,7 +367,7 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual(translations[0].value, "yop", "English translation should be filled"); assert.strictEqual( translations[1].value, - "valeur français", + "yop français", "French translation should be filled" ); assert.strictEqual( @@ -375,33 +376,33 @@ QUnit.module("Fields", (hooks) => { "Spanish translation should be filled" ); - await editInput(translations[0], null, "english value"); - await editInput(translations[2], null, ""); + await editInput(translations[0], null, "bar"); // set the en_US(user language) translation to "foo" + await editInput(translations[2], null, ""); // void the es_ES translation await click(target, ".modal button.btn-primary"); // save assert.strictEqual( target.querySelector(`.o_field_char input[type="text"]`).value, - "english value", + "bar", "the new translation was not transfered to modified record" ); - await editInput(target, `.o_field_char input[type="text"]`, "new english value"); + await editInput(target, `.o_field_char input[type="text"]`, "baz"); await click(target, ".o_field_char .btn.o_field_translate"); translations = target.querySelectorAll(".modal .o_translation_dialog .translation input"); assert.strictEqual( translations[0].value, - "new english value", + "baz", "Modified value should be used instead of translation" ); assert.strictEqual( translations[1].value, - "valeur français", - "French translation should be filled" + "yop français", + "French translation shouldn't be changed" ); assert.strictEqual( translations[2].value, - "english value", + "bar", "Spanish translation should fallback to the English translation" ); }); diff --git a/addons/web_editor/static/src/js/backend/html_field.xml b/addons/web_editor/static/src/js/backend/html_field.xml index e734db25b66..30ee9c958bc 100644 --- a/addons/web_editor/static/src/js/backend/html_field.xml +++ b/addons/web_editor/static/src/js/backend/html_field.xml @@ -30,7 +30,6 @@