summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/website_crm/views/website_crm_templates.xml104
-rw-r--r--addons/website_form/static/src/js/website_form_editor_registry.js1
-rw-r--r--addons/website_form/static/src/snippets/s_website_form/options.js163
-rw-r--r--addons/website_form/static/src/xml/website_form_editor.xml60
-rw-r--r--addons/website_form/static/tests/tours/website_form_editor.js24
-rw-r--r--addons/website_form/views/snippets/s_website_form.xml4
-rw-r--r--addons/website_form/views/website_form_templates.xml16
-rw-r--r--addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml114
-rw-r--r--addons/website_sale/views/templates.xml6
9 files changed, 264 insertions, 228 deletions
diff --git a/addons/website_crm/views/website_crm_templates.xml b/addons/website_crm/views/website_crm_templates.xml
index 2366a67a114..b32f87af001 100644
--- a/addons/website_crm/views/website_crm_templates.xml
+++ b/addons/website_crm/views/website_crm_templates.xml
@@ -11,72 +11,74 @@
'description': request.params.get('description', ''),
}</attribute>
</xpath>
- <xpath expr="//section[@id='contactus_section']" position="replace">
- <section class="s_website_form" data-vcss="001">
- <div class="container">
- <form id="contactus_form" action="/website_form/" method="post" enctype="multipart/form-data" data-model_name="crm.lead" data-success-mode="redirect" data-success-page="/contactus-thank-you" class="o_mark_required" data-mark="*" data-editable-form="false">
- <div class="s_website_form_rows row s_col_no_bgcolor">
- <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity1">Your Name<span class="s_website_form_mark"> *</span></label>
- <div class="col-sm">
- <input id="opportunity1" type="text" class="form-control s_website_form_input" name="contact_name" required=""/>
+ <xpath expr="//div[@id='contactus_section']" position="replace">
+ <div id="contactus_section">
+ <section class="s_website_form" data-vcss="001">
+ <div class="container">
+ <form id="contactus_form" action="/website_form/" method="post" enctype="multipart/form-data" data-model_name="crm.lead" data-success-mode="redirect" data-success-page="/contactus-thank-you" class="o_mark_required" data-mark="*" data-editable-form="false">
+ <div class="s_website_form_rows row s_col_no_bgcolor">
+ <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity1">Your Name<span class="s_website_form_mark"> *</span></label>
+ <div class="col-sm">
+ <input id="opportunity1" type="text" class="form-control s_website_form_input" name="contact_name" required=""/>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field" data-type="char">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity2">Phone Number</label>
- <div class="col-sm">
- <input id="opportunity2" type="text" class="form-control s_website_form_input" name="phone" />
+ <div class="form-group col-12 s_website_form_field" data-type="char" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity2">Phone Number</label>
+ <div class="col-sm">
+ <input id="opportunity2" type="text" class="form-control s_website_form_input" name="phone" />
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity3">Email<span class="s_website_form_mark"> *</span></label>
- <div class="col-sm">
- <input id="opportunity3" type="text" class="form-control s_website_form_input" name="email_from" required="" />
+ <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity3">Email<span class="s_website_form_mark"> *</span></label>
+ <div class="col-sm">
+ <input id="opportunity3" type="text" class="form-control s_website_form_input" name="email_from" required="" />
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field" data-type="char">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity4">Your Company</label>
- <div class="col-sm">
- <input id="opportunity4" type="text" class="form-control s_website_form_input" name="partner_name" />
+ <div class="form-group col-12 s_website_form_field" data-type="char" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity4">Your Company</label>
+ <div class="col-sm">
+ <input id="opportunity4" type="text" class="form-control s_website_form_input" name="partner_name" />
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field s_website_form_model_required" data-type="char">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity5">Subject</label>
- <div class="col-sm">
- <input id="opportunity5" type="text" class="form-control s_website_form_input" name="name" required="" />
+ <div class="form-group col-12 s_website_form_field s_website_form_model_required" data-type="char" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity5">Subject</label>
+ <div class="col-sm">
+ <input id="opportunity5" type="text" class="form-control s_website_form_input" name="name" required="" />
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="text">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity6">Your Question<span class="s_website_form_mark"> *</span></label>
- <div class="col-sm">
- <textarea id="opportunity6" class="form-control s_website_form_input" name="description" required=""></textarea>
+ <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="text" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="opportunity6">Your Question<span class="s_website_form_mark"> *</span></label>
+ <div class="col-sm">
+ <textarea id="opportunity6" class="form-control s_website_form_input" name="description" required=""></textarea>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_submit">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <div style="width: 200px" class="col-sm-auto s_website_form_label"/>
- <div class="col-sm">
- <a href="#" role="button" class="btn btn-primary btn-lg s_website_form_send">Submit</a>
- <span id="s_website_form_result"></span>
+ <div class="form-group col-12 s_website_form_submit">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <div style="width: 200px" class="col-sm-auto s_website_form_label"/>
+ <div class="col-sm">
+ <a href="#" role="button" class="btn btn-primary btn-lg s_website_form_send">Submit</a>
+ <span id="s_website_form_result"></span>
+ </div>
</div>
</div>
</div>
- </div>
- </form>
- </div>
- </section>
+ </form>
+ </div>
+ </section>
+ </div>
</xpath>
</template>
diff --git a/addons/website_form/static/src/js/website_form_editor_registry.js b/addons/website_form/static/src/js/website_form_editor_registry.js
index 93b183a9be8..82c5f500fab 100644
--- a/addons/website_form/static/src/js/website_form_editor_registry.js
+++ b/addons/website_form/static/src/js/website_form_editor_registry.js
@@ -50,6 +50,7 @@ FormEditorRegistry.add('send_mail', {
type: 'char',
required: true,
string: _t('Recipient Email'),
+ defaultValue: 'info@yourcompany.example.com',
}],
});
diff --git a/addons/website_form/static/src/snippets/s_website_form/options.js b/addons/website_form/static/src/snippets/s_website_form/options.js
index 2e9e48930d2..4bd19093345 100644
--- a/addons/website_form/static/src/snippets/s_website_form/options.js
+++ b/addons/website_form/static/src/snippets/s_website_form/options.js
@@ -28,8 +28,19 @@ const FormEditor = options.Class.extend({
// in qweb js to avoid duplicating this in the templates
field.required = field.required ? 1 : null;
- // Fetch possible values for relation fields
- if (!field.records && field.relation && field.relation !== 'ir.attachment') {
+ if (field.records) {
+ return field.records;
+ }
+ // Set selection as records to avoid added conplexity
+ if (field.type === 'selection') {
+ field.records = [];
+ field.selection.forEach(el => {
+ field.records.push({
+ id: el[0],
+ display_name: el[1],
+ });
+ });
+ } else if (field.relation && field.relation !== 'ir.attachment') {
field.records = await this._rpc({
model: field.relation,
method: 'search_read',
@@ -55,7 +66,7 @@ const FormEditor = options.Class.extend({
string: name,
custom: true,
type: type,
- // Default values for x2many fields
+ // Default values for x2many fields and selection
records: [{
id: _t('Option 1'),
display_name: _t('Option 1'),
@@ -66,17 +77,6 @@ const FormEditor = options.Class.extend({
id: _t('Option 3'),
display_name: _t('Option 3'),
}],
- // Default values for selection fields
- selection: [[
- _t('Option 1'),
- _t('Option 1'),
- ], [
- _t('Option 2'),
- _t('Option 2'),
- ], [
- _t('Option 3'),
- _t('Option 3'),
- ]],
};
},
/**
@@ -116,7 +116,6 @@ const FormEditor = options.Class.extend({
*/
_isRequiredMark: function () {
return this.$target[0].classList.contains('o_mark_required');
-
},
/**
* @private
@@ -152,12 +151,14 @@ const FieldEditor = FormEditor.extend({
*/
_getActiveField: function () {
let field;
+ const labelText = this.$target.find('.s_website_form_label_content').text();
if (this._isFieldCustom()) {
- const name = this.$target[0].querySelector('.s_website_form_label').firstChild.textContent.trim();
- field = this._getCustomField(this.$target[0].dataset.type, name);
+ field = this._getCustomField(this.$target[0].dataset.type, labelText);
} else {
field = this.fields[this._getFieldName()];
+ field.string = labelText;
}
+ field.records = this._getListItems();
this._setActiveProperties(field);
return field;
},
@@ -170,7 +171,7 @@ const FieldEditor = FormEditor.extend({
*/
_getFieldFormat: function () {
let requiredMark, optionalMark;
- const mark = this.$target[0].querySelector('span.s_website_form_mark');
+ const mark = this.$target[0].querySelector('.s_website_form_mark');
if (mark) {
requiredMark = this._isFieldRequired();
optionalMark = !requiredMark;
@@ -270,7 +271,8 @@ const FieldEditor = FormEditor.extend({
*/
_setActiveProperties(field) {
field.placeholder = this._getPlaceholder();
- field.required = this._isFieldRequired();
+ field.required = this.$target[0].classList.contains('s_website_form_required');
+ field.modelRequired = this.$target[0].classList.contains('s_website_form_model_required');
field.hidden = this.$target[0].classList.contains('s_website_form_field_hidden');
field.formatInfo = this._getFieldFormat();
},
@@ -361,7 +363,7 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
if (model) {
// we may be re-whitelisting already whitelisted fields. Doesn't
// really matter.
- const fields = [...this.$target[0].querySelectorAll('.s_website_form_field:not(.s_website_form_custom) input')].map(el => el.name);
+ const fields = [...this.$target[0].querySelectorAll('.s_website_form_field:not(.s_website_form_custom) .s_website_form_input')].map(el => el.name);
if (fields.length) {
// ideally we'd only do this if saving the form
// succeeds... but no idea how to do that
@@ -399,6 +401,7 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
updateUIEndMessage: function () {
this.$target.toggleClass("d-none", this.showEndMessage);
this.$message.toggleClass("d-none", !this.showEndMessage);
+ this.$el.find(".toggle-edit-message").toggleClass('text-primary', this.showEndMessage);
},
/**
* @override
@@ -430,20 +433,11 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
* ie: The Job you apply for if the form is on that job's page.
*/
addActionField: function (previewMode, value, params) {
- let fieldName = params.fieldName;
+ const fieldName = params.fieldName;
if (params.isSelect === 'true') {
value = parseInt(value);
}
- this.$target.find(`.s_website_form_field.d-none:has(input[name="${params.fieldName}"])`).remove();
- if (value) {
- const hiddenField = qweb.render('website_form.field_hidden', {
- field: {
- name: fieldName,
- value: value,
- },
- });
- this.$target.find('.s_website_form_submit').before(hiddenField);
- }
+ this.addHiddenField(value, fieldName);
},
/**
* Changes the onSuccess event.
@@ -456,6 +450,7 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
}
this.$target.after(this.$message);
} else {
+ this.showEndMessage = false;
this.$message.remove();
}
},
@@ -541,11 +536,33 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
option = this._buildInput(field);
break;
}
+ if (field.required) {
+ // Get default value or for many2one fields the first option.
+ const defaultValue = field.defaultValue || field.records[0].id;
+ this.addHiddenField(defaultValue, field.name);
+ }
uiFragment.insertBefore(option, firstOption);
});
});
},
-
+ /**
+ * Add a hidden field to the form
+ *
+ * @param {string} value
+ * @param {string} fieldName
+ */
+ addHiddenField: function (value, fieldName) {
+ this.$target.find(`.s_website_form_field.d-none:has(input[name="${fieldName}"])`).remove();
+ if (value) {
+ const hiddenField = qweb.render('website_form.field_hidden', {
+ field: {
+ name: fieldName,
+ value: value,
+ },
+ });
+ this.$target.find('.s_website_form_submit').before(hiddenField);
+ }
+ },
/**
* Returns a we-input element from the field
*
@@ -574,10 +591,12 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
selectEl.dataset.fieldName = field.name;
selectEl.dataset.isSelect = 'true';
selectEl.setAttribute('string', field.string);
- const noneButton = document.createElement('we-button');
- noneButton.textContent = 'None';
- noneButton.dataset.addActionField = 0;
- selectEl.append(noneButton);
+ if (!field.required) {
+ const noneButton = document.createElement('we-button');
+ noneButton.textContent = 'None';
+ noneButton.dataset.addActionField = 0;
+ selectEl.append(noneButton);
+ }
field.records.forEach(el => {
const button = document.createElement('we-button');
button.textContent = el.display_name;
@@ -634,7 +653,7 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
* @private
*/
_setLabelsMark: function () {
- this.$target[0].querySelectorAll('span.s_website_form_mark').forEach(el => el.remove());
+ this.$target[0].querySelectorAll('.s_website_form_mark').forEach(el => el.remove());
const mark = this._getMark();
if (!mark) {
return;
@@ -664,8 +683,10 @@ options.registry.WebsiteFormEditor = FormEditor.extend({
*/
_onToggleEndMessageClick: function () {
this.showEndMessage = !this.showEndMessage;
- this.$el.find(".toggle-edit-message").toggleClass('text-primary', this.showEndMessage);
this.updateUIEndMessage();
+ this.trigger_up('activate_snippet', {
+ $snippet: this.showEndMessage ? this.$message : this.$target,
+ });
},
});
@@ -794,7 +815,7 @@ options.registry.WebsiteFieldEditor = FieldEditor.extend({
* Set the name of the field on the label
*/
setLabelText: function (previewMode, value, params) {
- this.$target[0].querySelector('.s_website_form_label').firstChild.textContent = value;
+ this.$target.find('.s_website_form_label_content').text(value);
if (this._isFieldCustom()) {
const multiple = this.$target[0].querySelector('.s_website_form_multiple');
if (multiple) {
@@ -816,7 +837,7 @@ options.registry.WebsiteFieldEditor = FieldEditor.extend({
const field = this._getActiveField();
field.formatInfo.labelPosition = value;
await this._replaceField(field);
- this._renderListItems();
+ this.rerender = true;
},
/**
* Select the display of the multicheckbox field (vertical & horizontal)
@@ -859,7 +880,7 @@ options.registry.WebsiteFieldEditor = FieldEditor.extend({
case 'existingField':
return this._isFieldCustom() ? '' : this._getFieldName();
case 'setLabelText':
- return this.$target[0].querySelector('.s_website_form_label').firstChild.textContent.trim();
+ return this.$target.find('.s_website_form_label_content').text();
case 'setPlaceholder':
return this._getPlaceholder();
case 'selectLabelPosition':
@@ -943,7 +964,7 @@ options.registry.WebsiteFieldEditor = FieldEditor.extend({
listTitle = multipleInputs.querySelector('.radio') ? 'Radio List' : 'Checkbox List';
addItemTitle = 'Add new Checkbox';
multipleInputs.querySelectorAll('.checkbox, .radio').forEach(opt => {
- this._addItemToTable(opt.querySelector('input').value, opt.querySelector('span').textContent.trim());
+ this._addItemToTable(opt.querySelector('input').value, opt.querySelector('.s_website_form_check_label').textContent.trim());
});
} else {
return;
@@ -988,18 +1009,11 @@ options.registry.WebsiteFieldEditor = FieldEditor.extend({
selectMenu.innerHTML = '';
const field = this.fields[this._getFieldName()];
this._fetchFieldRecords(field).then(() => {
- let buttonItems, availableRecords;
- if (field.selection) {
- availableRecords = field.selection.map(el => {
- return {id: el[0], display_name: el[1]};
- });
- } else if (field.records) {
- availableRecords = field.records;
- }
+ let buttonItems;
const optionIds = Array.from(this.listTable.querySelectorAll('input')).map(opt => {
return field.type === 'selection' ? opt.name : parseInt(opt.name);
});
- availableRecords = (availableRecords || []).filter(el => !optionIds.includes(el.id));
+ const availableRecords = (field.records || []).filter(el => !optionIds.includes(el.id));
if (availableRecords.length) {
buttonItems = availableRecords.map(el => {
const option = document.createElement('we-button');
@@ -1079,31 +1093,22 @@ options.registry.WebsiteFieldEditor = FieldEditor.extend({
_renderListItems: function () {
const multiInputsWrap = this._getMultipleInputs();
const selectWrap = this.$target[0].querySelector('#editable_select');
- const isCustomField = this._isFieldCustom();
const isRequiredField = this._isFieldRequired();
const name = this._getFieldName();
if (multiInputsWrap) {
const type = multiInputsWrap.querySelector('.radio') ? 'radio' : 'checkbox';
multiInputsWrap.innerHTML = '';
- this.listTable.querySelectorAll('input').forEach(el => {
- const params = {
- field: {
- name: name,
- required: isRequiredField,
- formatInfo: {
- multiPosition: multiInputsWrap.dataset.display,
- }
+ const params = {
+ field: {
+ name: name,
+ required: isRequiredField,
+ formatInfo: {
+ multiPosition: multiInputsWrap.dataset.display,
}
- };
- const id = isCustomField ? el.value : el.name;
- if (type === 'radio') {
- params.record = [id, el.value];
- } else {
- params.record = {
- id: id,
- display_name: el.value,
- };
}
+ };
+ this._getListItems().forEach(record => {
+ params.record = record;
const template = document.createElement('template');
template.innerHTML = qweb.render(`website_form.${type}`, params);
multiInputsWrap.appendChild(template.content.firstElementChild);
@@ -1120,6 +1125,26 @@ options.registry.WebsiteFieldEditor = FieldEditor.extend({
}
},
/**
+ * Returns an array based on the we-list containing the field's records
+ *
+ * @returns {Array}
+ */
+ _getListItems: function () {
+ if (!this.listTable) {
+ return null;
+ }
+ const isCustomField = this._isFieldCustom();
+ const records = [];
+ this.listTable.querySelectorAll('input').forEach(el => {
+ const id = isCustomField ? el.value : el.name;
+ records.push({
+ id: id,
+ display_name: el.value,
+ });
+ });
+ return records;
+ },
+ /**
* Returns the select element if it exist else null
*
* @private
diff --git a/addons/website_form/static/src/xml/website_form_editor.xml b/addons/website_form/static/src/xml/website_form_editor.xml
index 70c90f55593..f191edc8f39 100644
--- a/addons/website_form/static/src/xml/website_form_editor.xml
+++ b/addons/website_form/static/src/xml/website_form_editor.xml
@@ -26,9 +26,9 @@
<t t-name="website_form.field">
<div t-attf-class="form-group s_website_form_field #{field.formatInfo.col or 'col-12'} #{field.custom and 's_website_form_custom' or ''} #{(field.required and 's_website_form_required' or '') or (field.modelRequired and 's_website_form_model_required' or '')} #{field.hidden and 's_website_form_field_hidden' or ''} #{field.dnone and 'd-none' or ''}"
t-att-data-type="field.type"
- t-att-data-name="Field">
+ data-name="Field">
<div t-if="field.formatInfo.labelPosition != 'none' and field.formatInfo.labelPosition != 'top'" class="row s_col_no_resize s_col_no_bgcolor">
- <label t-attf-class="col-form-label col-sm-auto s_website_form_label #{field.formatInfo.labelPosition == 'right' and 'text-right' or ''}" t-attf-style="width: #{field.formatInfo.labelWidth or '200px'}" t-att-for="field.id">
+ <label t-attf-class="#{!field.isCheck and 'col-form-label' or ''} col-sm-auto s_website_form_label #{field.formatInfo.labelPosition == 'right' and 'text-right' or ''}" t-attf-style="width: #{field.formatInfo.labelWidth or '200px'}" t-att-for="field.id">
<t t-call="website_form.label_content"/>
</label>
<div class="col-sm">
@@ -46,7 +46,7 @@
<t t-name="website_form.label_content">
<t t-if="field.custom" t-set="field.string" t-value="field.name"/>
- <t t-esc="field.string"/>
+ <span class="s_website_form_label_content" t-esc="field.string"/>
<t t-if="field.required or field.modelRequired">
<span class="s_website_form_mark" t-if="field.formatInfo.requiredMark" t-esc="' ' + field.formatInfo.mark"/>
</t>
@@ -198,25 +198,25 @@
<!-- Boolean Field -->
<t t-name="website_form.field_boolean">
+ <t t-set="field.isCheck" t-value="true"/>
<t t-call="website_form.field">
- <div class="col-form-label">
- <input
- type="checkbox"
- value="Yes"
- class="s_website_form_input"
- t-att-name="field.name"
- t-att-required="field.required || field.modelRequired || None"
- t-att-id="field.id"
- />
- </div>
+ <input
+ type="checkbox"
+ value="Yes"
+ class="s_website_form_input"
+ t-att-name="field.name"
+ t-att-required="field.required || field.modelRequired || None"
+ t-att-id="field.id"
+ />
</t>
</t>
<!-- Selection Field -->
<t t-name="website_form.field_selection">
+ <t t-set="field.isCheck" t-value="true"/>
<t t-call="website_form.field">
<div class="row s_col_no_resize s_col_no_bgcolor s_website_form_multiple" t-att-data-name="field.name" t-att-data-display="field.formatInfo.multiPosition">
- <t t-if="!field.selection">
+ <t t-if="!field.records">
<input
class="s_website_form_input"
t-att-name="field.name"
@@ -225,7 +225,7 @@
placeholder="No matching record !"
/>
</t>
- <t t-foreach="field.selection" t-as="record">
+ <t t-foreach="field.records" t-as="record">
<t t-call="website_form.radio"/>
</t>
</div>
@@ -234,19 +234,21 @@
<!-- Radio -->
<t t-name="website_form.radio">
+ <t t-set="recordId" t-value="field.id + record_index"/>
<div t-attf-class="radio col-12 #{field.formatInfo.multiPosition === 'horizontal' and 'col-lg-4 col-md-6' or ''}">
- <label class="col-form-label">
+ <div class="form-check">
<input
type="radio"
- class="s_website_form_input"
+ class="s_website_form_input form-check-input"
+ t-att-id="recordId"
t-att-name="field.name"
- t-att-value="record[0]"
+ t-att-value="record.id"
t-att-required="field.required || field.modelRequired || None"
/>
- <span>
- <t t-esc="record[1]"/>
- </span>
- </label>
+ <label class="form-check-label s_website_form_check_label" t-att-for="recordId">
+ <t t-esc="record.display_name"/>
+ </label>
+ </div>
</div>
</t>
@@ -280,6 +282,7 @@
</t>
<!-- Generic one2many -->
<t t-if="field.relation != 'ir.attachment'">
+ <t t-set="field.isCheck" t-value="true"/>
<t t-call="website_form.field">
<div class="row s_col_no_resize s_col_no_bgcolor s_website_form_multiple" t-att-data-name="field.name" t-att-data-display="field.formatInfo.multiPosition">
<t t-if="!field.records">
@@ -301,19 +304,21 @@
<!-- Checkbox -->
<t t-name="website_form.checkbox">
+ <t t-set="recordId" t-value="field.id + record_index"/>
<div t-attf-class="checkbox col-12 #{field.formatInfo.multiPosition === 'horizontal' and 'col-lg-4 col-md-6' or ''}">
- <label class="col-form-label">
+ <div class="form-check">
<input
type="checkbox"
- class="s_website_form_input"
+ class="s_website_form_input form-check-input"
+ t-att-id="recordId"
t-att-name="field.name"
t-att-value="record.id"
t-att-required="field.required || field.modelRequired || None"
/>
- <span>
+ <label class="form-check-label s_website_form_check_label" t-att-for="recordId">
<t t-esc="record.display_name"/>
- </span>
- </label>
+ </label>
+ </div>
</div>
</t>
@@ -324,6 +329,7 @@
<!-- Binary Field -->
<t t-name="website_form.field_binary">
+ <t t-set="field.isCheck" t-value="true"/>
<t t-call="website_form.field">
<input
type="file"
diff --git a/addons/website_form/static/tests/tours/website_form_editor.js b/addons/website_form/static/tests/tours/website_form_editor.js
index 60723cb4118..10ad3b996de 100644
--- a/addons/website_form/static/tests/tours/website_form_editor.js
+++ b/addons/website_form/static/tests/tours/website_form_editor.js
@@ -136,10 +136,10 @@ odoo.define('website_form_editor.tour', function (require) {
content: "Check the resulting field",
trigger: ".s_website_form_field.s_website_form_custom.s_website_form_required" +
":has(.s_website_form_multiple[data-display='horizontal'])" +
- ":has(.checkbox label:contains('Iphone'):has(input[type='checkbox'][required]))" +
- ":has(.checkbox label:contains('Galaxy S'):has(input[type='checkbox'][required]))" +
- ":has(.checkbox label:contains('Xperia'):has(input[type='checkbox'][required]))" +
- ":has(.checkbox label:contains('Wiko Stairway'):has(input[type='checkbox'][required]))",
+ ":has(.checkbox:has(label:contains('Iphone')):has(input[type='checkbox'][required]))" +
+ ":has(.checkbox:has(label:contains('Galaxy S')):has(input[type='checkbox'][required]))" +
+ ":has(.checkbox:has(label:contains('Xperia')):has(input[type='checkbox'][required]))" +
+ ":has(.checkbox:has(label:contains('Wiko Stairway')):has(input[type='checkbox'][required]))",
run: function () {},
},
...selectButtonByData('data-multi-checkbox-display="vertical"'),
@@ -147,10 +147,10 @@ odoo.define('website_form_editor.tour', function (require) {
content: "Check the resulting field",
trigger: ".s_website_form_field.s_website_form_custom.s_website_form_required" +
":has(.s_website_form_multiple[data-display='vertical'])" +
- ":has(.checkbox label:contains('Iphone'):has(input[type='checkbox'][required]))" +
- ":has(.checkbox label:contains('Galaxy S'):has(input[type='checkbox'][required]))" +
- ":has(.checkbox label:contains('Xperia'):has(input[type='checkbox'][required]))" +
- ":has(.checkbox label:contains('Wiko Stairway'):has(input[type='checkbox'][required]))",
+ ":has(.checkbox:has(label:contains('Iphone')):has(input[type='checkbox'][required]))" +
+ ":has(.checkbox:has(label:contains('Galaxy S')):has(input[type='checkbox'][required]))" +
+ ":has(.checkbox:has(label:contains('Xperia')):has(input[type='checkbox'][required]))" +
+ ":has(.checkbox:has(label:contains('Wiko Stairway')):has(input[type='checkbox'][required]))",
run: function () {},
},
@@ -180,10 +180,10 @@ odoo.define('website_form_editor.tour', function (require) {
}, {
content: "Check the resulting field",
trigger: ".s_website_form_field.s_website_form_custom:not(.s_website_form_required)" +
- ":has(.radio label:contains('After-sales Service'):has(input[type='radio']:not([required])))" +
- ":has(.radio label:contains('Invoicing Service'):has(input[type='radio']:not([required])))" +
- ":has(.radio label:contains('Development Service'):has(input[type='radio']:not([required])))" +
- ":has(.radio label:contains('Management Service'):has(input[type='radio']:not([required])))",
+ ":has(.radio:has(label:contains('After-sales Service')):has(input[type='radio']:not([required])))" +
+ ":has(.radio:has(label:contains('Invoicing Service')):has(input[type='radio']:not([required])))" +
+ ":has(.radio:has(label:contains('Development Service')):has(input[type='radio']:not([required])))" +
+ ":has(.radio:has(label:contains('Management Service')):has(input[type='radio']:not([required])))",
run: function () {},
},
diff --git a/addons/website_form/views/snippets/s_website_form.xml b/addons/website_form/views/snippets/s_website_form.xml
index 9a4a28fe6db..5f0544f8e1a 100644
--- a/addons/website_form/views/snippets/s_website_form.xml
+++ b/addons/website_form/views/snippets/s_website_form.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
-<template id="s_website_form" name="Form">
+<template id="s_website_form" name="Form Builder">
<section class="s_website_form" data-vcss="001">
<div class="container">
<form action="/website_form/" method="post" enctype="multipart/form-data" class="o_mark_required" data-mark="*">
@@ -40,7 +40,7 @@
<we-button data-on-success="redirect" data-name="show_redirect_opt">Redirect</we-button>
<we-button data-on-success="message" data-name="show_message_opt">Show Message</we-button>
</we-select>
- <we-button class="fa fa-fw fa-edit align-self-end toggle-edit-message" title="Edit Message" data-name="message_opt" data-dependencies="show_message_opt"/>
+ <we-button class="fa fa-fw fa-eye align-self-end toggle-edit-message" title="Edit Message" data-name="message_opt" data-dependencies="show_message_opt"/>
</we-row>
<we-urlpicker string="URL" data-select-data-attribute="/contactus-thank-you" data-attribute-name="successPage" data-name="url_opt" data-dependencies="show_redirect_opt"/>
</div>
diff --git a/addons/website_form/views/website_form_templates.xml b/addons/website_form/views/website_form_templates.xml
index 256a9ad81f7..d991956ea29 100644
--- a/addons/website_form/views/website_form_templates.xml
+++ b/addons/website_form/views/website_form_templates.xml
@@ -4,12 +4,12 @@
<template id="contactus_form" name="Contact Form" inherit_id="website.contactus" customize_show="True">
<xpath expr="//div[@name='mail_button']" position="replace">
<span class="hidden" data-for="contactus_form" t-att-data-values="{'email_to': res_company.email}" />
- <div>
- <section id="contactus_section" class="s_website_form" data-vcss="001">
+ <div id="contactus_section">
+ <section class="s_website_form" data-vcss="001">
<div class="container">
<form id="contactus_form" action="/website_form/" method="post" enctype="multipart/form-data" class="o_mark_required" data-mark="*" data-model_name="mail.mail" data-success-mode="redirect" data-success-page="/contactus-thank-you">
<div class="s_website_form_rows row s_col_no_bgcolor">
- <div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required" data-type="char">
+ <div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="contact1">Your Name<span class="s_website_form_mark"> *</span></label>
<div class="col-sm">
@@ -17,7 +17,7 @@
</div>
</div>
</div>
- <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="char">
+ <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="contact2">Phone Number</label>
<div class="col-sm">
@@ -25,7 +25,7 @@
</div>
</div>
</div>
- <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="email">
+ <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="email" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="contact3">Email<span class="s_website_form_mark"> *</span></label>
<div class="col-sm">
@@ -33,7 +33,7 @@
</div>
</div>
</div>
- <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="char">
+ <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="contact4">Your Company</label>
<div class="col-sm">
@@ -41,7 +41,7 @@
</div>
</div>
</div>
- <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char">
+ <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="contact5">Subject<span class="s_website_form_mark"> *</span></label>
<div class="col-sm">
@@ -49,7 +49,7 @@
</div>
</div>
</div>
- <div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required" data-type="text">
+ <div class="form-group col-12 s_website_form_field s_website_form_custom s_website_form_required" data-type="text" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="contact6">Your Question</label>
<div class="col-sm">
diff --git a/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml b/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml
index beba5e518e5..257d415cadc 100644
--- a/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml
+++ b/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml
@@ -135,79 +135,81 @@
<span t-field="job.name"/>
</h2>
<span class="hidden" data-for="hr_recruitment_form" t-att-data-values="{'department_id': job and job.department_id.id or '', 'job_id': job and job.id or ''}" />
- <section id="forms" class="s_website_form" data-vcss="001">
- <div class="container">
- <form id="hr_recruitment_form" action="/website_form/" method="post" enctype="multipart/form-data" class="o_mark_required" data-mark="*" data-model_name="hr.applicant" data-success-mode="redirect" data-success-page="/job-thank-you" hide-change-model="true">
- <div class="s_website_form_rows row s_col_no_bgcolor">
- <div class="form-group col-12 s_website_form_field s_website_form_required s_website_form_model_required" data-type="char">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment1">Your Name<span class="s_website_form_mark"> *</span></label>
- <div class="col-sm">
- <input id="recruitment1" type="text" class="form-control s_website_form_input" name="partner_name" required=""/>
+ <div id="jobs_section">
+ <section id="forms" class="s_website_form" data-vcss="001">
+ <div class="container">
+ <form id="hr_recruitment_form" action="/website_form/" method="post" enctype="multipart/form-data" class="o_mark_required" data-mark="*" data-model_name="hr.applicant" data-success-mode="redirect" data-success-page="/job-thank-you" hide-change-model="true">
+ <div class="s_website_form_rows row s_col_no_bgcolor">
+ <div class="form-group col-12 s_website_form_field s_website_form_required s_website_form_model_required" data-type="char" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment1">Your Name<span class="s_website_form_mark"> *</span></label>
+ <div class="col-sm">
+ <input id="recruitment1" type="text" class="form-control s_website_form_input" name="partner_name" required=""/>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="email">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment2">Your Email<span class="s_website_form_mark"> *</span></label>
- <div class="col-sm">
- <input id="recruitment2" type="email" class="form-control s_website_form_input" name="email_from" required=""/>
+ <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="email" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment2">Your Email<span class="s_website_form_mark"> *</span></label>
+ <div class="col-sm">
+ <input id="recruitment2" type="email" class="form-control s_website_form_input" name="email_from" required=""/>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment3">Your Phone Number<span class="s_website_form_mark"> *</span></label>
- <div class="col-sm">
- <input id="recruitment3" type="text" class="form-control s_website_form_input" name="partner_phone" required=""/>
+ <div class="form-group col-12 s_website_form_field s_website_form_required" data-type="char" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment3">Your Phone Number<span class="s_website_form_mark"> *</span></label>
+ <div class="col-sm">
+ <input id="recruitment3" type="text" class="form-control s_website_form_input" name="partner_phone" required=""/>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field" data-type="text">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment4">Short Introduction</label>
- <div class="col-sm">
- <textarea id="recruitment4" class="form-control s_website_form_input" name="description"></textarea>
+ <div class="form-group col-12 s_website_form_field" data-type="text" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment4">Short Introduction</label>
+ <div class="col-sm">
+ <textarea id="recruitment4" class="form-control s_website_form_input" name="description"></textarea>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="binary">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment5">Resume</label>
- <div class="col-sm">
- <input id="recruitment5" type="file" class="form-control s_website_form_input" name="Resume"/>
+ <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="binary" data-name="Field">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment5">Resume</label>
+ <div class="col-sm">
+ <input id="recruitment5" type="file" class="form-control s_website_form_input" name="Resume"/>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field d-none">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment6">Job</label>
- <div class="col-sm">
- <input id="recruitment6" type="hidden" class="form-control s_website_form_input" name="job_id"/>
+ <div class="form-group col-12 s_website_form_field d-none">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment6">Job</label>
+ <div class="col-sm">
+ <input id="recruitment6" type="hidden" class="form-control s_website_form_input" name="job_id"/>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_field d-none">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment7">Department</label>
- <div class="col-sm">
- <input id="recruitment7" type="hidden" class="form-control s_website_form_input" name="department_id"/>
+ <div class="form-group col-12 s_website_form_field d-none">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="recruitment7">Department</label>
+ <div class="col-sm">
+ <input id="recruitment7" type="hidden" class="form-control s_website_form_input" name="department_id"/>
+ </div>
</div>
</div>
- </div>
- <div class="form-group col-12 s_website_form_submit">
- <div class="row s_col_no_resize s_col_no_bgcolor">
- <div style="width: 200px" class="col-sm-auto s_website_form_label"/>
- <div class="col-sm">
- <a href="#" role="button" class="btn btn-primary btn-lg s_website_form_send">Submit</a>
- <span id="s_website_form_result"></span>
+ <div class="form-group col-12 s_website_form_submit">
+ <div class="row s_col_no_resize s_col_no_bgcolor">
+ <div style="width: 200px" class="col-sm-auto s_website_form_label"/>
+ <div class="col-sm">
+ <a href="#" role="button" class="btn btn-primary btn-lg s_website_form_send">Submit</a>
+ <span id="s_website_form_result"></span>
+ </div>
</div>
</div>
</div>
- </div>
- </form>
- </div>
- </section>
+ </form>
+ </div>
+ </section>
+ </div>
<div class="oe_structure mt-2"/>
</div>
</t>
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index f13469443d3..c39a0777f1e 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -750,7 +750,7 @@
<div class="container">
<form action="/website_form/" method="post" enctype="multipart/form-data" class="o_mark_required" data-mark="*" data-force_action="shop.sale.order" data-model_name="sale.order" data-success-mode="redirect" data-success-page="/shop/payment" hide-change-model="true">
<div class="s_website_form_rows row s_col_no_bgcolor">
- <div class="form-group col-12 s_website_form_field" data-type="char">
+ <div class="form-group col-12 s_website_form_field" data-type="char" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="sale1">Your Reference</label>
<div class="col-sm">
@@ -758,7 +758,7 @@
</div>
</div>
</div>
- <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="text">
+ <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="text" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="sale2">Give us your feedback</label>
<div class="col-sm">
@@ -766,7 +766,7 @@
</div>
</div>
</div>
- <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="binary">
+ <div class="form-group col-12 s_website_form_field s_website_form_custom" data-type="binary" data-name="Field">
<div class="row s_col_no_resize s_col_no_bgcolor">
<label class="col-form-label col-sm-auto s_website_form_label" style="width: 200px" for="sale3">A document to provide</label>
<div class="col-sm">