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',
}],
});