diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml index 78e19887608..0c8a38d1aff 100644 --- a/addons/website/data/website_data.xml +++ b/addons/website/data/website_data.xml @@ -63,7 +63,7 @@ *
- +
@@ -73,7 +73,7 @@ Phone Number
- +
@@ -84,7 +84,7 @@ *
- +
@@ -94,7 +94,7 @@ Your Company
- +
diff --git a/addons/website/static/src/js/form_editor_registry.js b/addons/website/static/src/js/form_editor_registry.js index 634c2d6dc04..ed708e99a34 100644 --- a/addons/website/static/src/js/form_editor_registry.js +++ b/addons/website/static/src/js/form_editor_registry.js @@ -20,19 +20,23 @@ FormEditorRegistry.add('send_mail', { type: 'char', custom: true, required: true, + fillWith: 'name', name: 'Your Name', }, { type: 'tel', custom: true, + fillWith: 'phone', name: 'Phone Number', }, { type: 'email', modelRequired: true, + fillWith: 'email', name: 'email_from', string: 'Your Email', }, { type: 'char', custom: true, + fillWith: 'commercial_company_name', name: 'Your Company', }, { type: 'char', diff --git a/addons/website/static/src/snippets/s_website_form/000.js b/addons/website/static/src/snippets/s_website_form/000.js index 872c59d13f2..0ff6dd518f5 100644 --- a/addons/website/static/src/snippets/s_website_form/000.js +++ b/addons/website/static/src/snippets/s_website_form/000.js @@ -4,6 +4,7 @@ odoo.define('website.s_website_form', function (require) { var core = require('web.core'); var time = require('web.time'); const {ReCaptcha} = require('google_recaptcha.ReCaptchaV3'); + const session = require('web.session'); var ajax = require('web.ajax'); var publicWidget = require('web.public.widget'); const dom = require('web.dom'); @@ -49,12 +50,22 @@ odoo.define('website.s_website_form', function (require) { this._recaptcha = new ReCaptcha(); this.__started = new Promise(resolve => this.__startResolve = resolve); }, - willStart: function () { + willStart: async function () { const res = this._super(...arguments); if (!this.$target[0].classList.contains('s_website_form_no_recaptcha')) { this._recaptchaLoaded = true; this._recaptcha.loadLibs(); } + // fetch user data (required by fill-with behavior) + this.preFillValues = {}; + if (session.user_id) { + this.preFillValues = (await this._rpc({ + model: 'res.users', + method: 'read', + args: [session.user_id, this._getUserPreFillFields()], + }))[0] || {}; + } + return res; }, start: function () { @@ -91,18 +102,20 @@ odoo.define('website.s_website_form', function (require) { // Display form values from tag having data-for attribute // It's necessary to handle field values generated on server-side // Because, using t-att- inside form make it non-editable - var $values = $('[data-for=' + this.$target.attr('id') + ']'); - if ($values.length) { - var values = JSON.parse($values.data('values').replace('False', '""').replace('None', '""').replace(/'/g, '"')); + // Data-fill-with attribute is given during registry and is used by + // to know which user data should be used to prfill fields. + var $dataFor = $('[data-for=' + this.$target.attr('id') + ']'); + if ($dataFor.length || !_.isEmpty(this.preFillValues)) { + var dataForValues = $dataFor.length ? JSON.parse($dataFor.data('values').replace('False', '""').replace('None', '""').replace(/'/g, '"')) : []; var fields = _.pluck(this.$target.serializeArray(), 'name'); _.each(fields, function (field) { - if (_.has(values, field)) { - var $field = self.$target.find('input[name="' + field + '"], textarea[name="' + field + '"]'); - if (!$field.val()) { - $field.val(values[field]); - $field.data('website_form_original_default_value', $field.val()); - } + var $field = self.$target.find('input[name="' + field + '"], textarea[name="' + field + '"]'); + if (!$field.val() && _.has(dataForValues, field) && dataForValues[field]) { + $field.val(dataForValues[field]); + } else if (!$field.val() && $field.data('fill-with')) { + $field.val(self.preFillValues[$field.data('fill-with')]); } + $field.data('website_form_original_default_value', $field.val()); }); } @@ -382,5 +395,13 @@ odoo.define('website.s_website_form', function (require) { message: message, }))); }, + /** + * Gets the user's field needed to be fetched to pre-fill the form. + * + * @returns {string[]} List of user's field that have to be fetched. + */ + _getUserPreFillFields() { + return ['name', 'phone', 'email', 'commercial_company_name']; + }, }); }); diff --git a/addons/website/static/src/xml/website_form_editor.xml b/addons/website/static/src/xml/website_form_editor.xml index decfce3959f..7abc9bac6d6 100644 --- a/addons/website/static/src/xml/website_form_editor.xml +++ b/addons/website/static/src/xml/website_form_editor.xml @@ -107,6 +107,7 @@ t-att-name="field.name" t-att-required="field.required || field.modelRequired || None" t-att-value="field.value" + t-att-data-fill-with="field.fillWith" t-att-placeholder="field.placeholder" t-att-id="field.id" /> diff --git a/addons/website_crm/static/src/js/website_crm_editor.js b/addons/website_crm/static/src/js/website_crm_editor.js index ebfd3bd1339..6e352d63d9c 100644 --- a/addons/website_crm/static/src/js/website_crm_editor.js +++ b/addons/website_crm/static/src/js/website_crm_editor.js @@ -11,19 +11,23 @@ FormEditorRegistry.add('create_lead', { type: 'char', required: true, name: 'contact_name', + fillWith: 'name', string: 'Your Name', }, { type: 'tel', name: 'phone', + fillWith: 'phone', string: 'Phone Number', }, { type: 'email', required: true, + fillWith: 'email', name: 'email_from', string: 'Your Email', }, { type: 'char', required: true, + fillWith: 'commercial_company_name', name: 'partner_name', string: 'Your Company', }, { diff --git a/addons/website_crm/views/website_crm_templates.xml b/addons/website_crm/views/website_crm_templates.xml index b95abaa432e..0c1ebd17fc8 100644 --- a/addons/website_crm/views/website_crm_templates.xml +++ b/addons/website_crm/views/website_crm_templates.xml @@ -27,7 +27,7 @@ *
- +
@@ -37,7 +37,7 @@ Phone Number
- +
@@ -48,7 +48,7 @@ *
- +
@@ -58,7 +58,7 @@ Your Company
- +
diff --git a/addons/website_form_project/static/src/js/website_form_project_editor.js b/addons/website_form_project/static/src/js/website_form_project_editor.js index 98c816d131f..39414171f0c 100644 --- a/addons/website_form_project/static/src/js/website_form_project_editor.js +++ b/addons/website_form_project/static/src/js/website_form_project_editor.js @@ -15,6 +15,7 @@ FormEditorRegistry.add('create_task', { }, { type: 'email', modelRequired: true, + fillWith: 'email', name: 'email_from', string: 'Your Email', }, { diff --git a/addons/website_hr_recruitment/static/src/js/website_hr_recruitment_editor.js b/addons/website_hr_recruitment/static/src/js/website_hr_recruitment_editor.js index 75b83a57d78..c840d16cae4 100644 --- a/addons/website_hr_recruitment/static/src/js/website_hr_recruitment_editor.js +++ b/addons/website_hr_recruitment/static/src/js/website_hr_recruitment_editor.js @@ -11,15 +11,18 @@ FormEditorRegistry.add('apply_job', { type: 'char', modelRequired: true, name: 'partner_name', + fillWith: 'name', string: 'Your Name', }, { type: 'email', required: true, + fillWith: 'email', name: 'email_from', string: 'Your Email', }, { type: 'char', required: true, + fillWith: 'phone', name: 'partner_phone', string: 'Phone Number', }, { diff --git a/addons/website_sale/static/src/js/website_sale_form_editor.js b/addons/website_sale/static/src/js/website_sale_form_editor.js index 4b0c8132730..eb9ecff9543 100644 --- a/addons/website_sale/static/src/js/website_sale_form_editor.js +++ b/addons/website_sale/static/src/js/website_sale_form_editor.js @@ -8,19 +8,23 @@ FormEditorRegistry.add('create_customer', { type: 'char', modelRequired: true, name: 'name', + fillWith: 'name', string: 'Your Name', }, { type: 'email', required: true, + fillWith: 'email', name: 'email', string: 'Your Email', }, { type: 'tel', + fillWith: 'phone', name: 'phone', string: 'Phone Number', }, { type: 'char', name: 'company_name', + fillWith: 'commercial_company_name', string: 'Company Name', }], });