summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfja-odoo <fja@odoo.com>2019-09-27 16:59:42 +0000
committerqsm-odoo <qsm@odoo.com>2019-10-01 17:35:39 +0000
commit75014ffba4f716cf423bc3712b950c6cd3876153 (patch)
tree077051597604858a6223cadb84b9a70582532851
parent15e3646b4f91165966aa92be919fb492a5fd4c24 (diff)
[FIX] website_form: fix website form snippet
The modal of the website_form snippet was broken. Now it uses Dialog. Hidden inputs were not aligned with there labels. task-2078138 closes odoo/odoo#37545 Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com> Co-authored-by: qsm-odoo <qsm@odoo.com>
-rw-r--r--addons/website_form/static/src/js/website_form_editor.js204
-rw-r--r--addons/website_form/static/src/scss/website_form.scss2
-rw-r--r--addons/website_form/static/src/xml/website_form_editor.xml25
-rw-r--r--addons/website_form/static/tests/tours/website_form_editor.js12
4 files changed, 115 insertions, 128 deletions
diff --git a/addons/website_form/static/src/js/website_form_editor.js b/addons/website_form/static/src/js/website_form_editor.js
index 74e62e0b7a7..355b2688b2a 100644
--- a/addons/website_form/static/src/js/website_form_editor.js
+++ b/addons/website_form/static/src/js/website_form_editor.js
@@ -7,12 +7,54 @@ odoo.define('website_form_editor', function (require) {
var ajax = require('web.ajax');
var core = require('web.core');
+ var Dialog = require('web.Dialog');
var FormEditorRegistry = require('website_form.form_editor_registry');
var options = require('web_editor.snippets.options');
var wUtils = require('website.utils');
var Wysiwyg = require('web_editor.wysiwyg');
var qweb = core.qweb;
+ var _t = core._t;
+
+ var FormEditorDialog = Dialog.extend({
+ /**
+ * @constructor
+ */
+ init: function (parent, options) {
+ this._super(parent, _.extend({
+ buttons: [{
+ text: _t('Save'),
+ classes: 'btn-primary',
+ close: true,
+ click: this._onSaveModal.bind(this),
+ }, {
+ text: _t('Cancel'),
+ close: true
+ }],
+ }, options));
+ },
+
+ //----------------------------------------------------------------------
+ // Handlers
+ //----------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ _onSaveModal: function () {
+ if (this.$el[0].checkValidity()) {
+ this.trigger_up('save');
+ } else {
+ _.each(this.$el.find('.o_website_form_input'), function (input) {
+ var $field = $(input).closest('.form-field');
+ $field.removeClass('o_has_error').find('.form-control, .custom-select').removeClass('is-invalid');
+ if (!input.checkValidity()) {
+ $field.addClass('o_has_error').find('.form-control, .custom-select').addClass('is-invalid');
+ }
+ });
+ }
+ },
+ });
options.registry['website_form_editor'] = options.Class.extend({
xmlDependencies: ['/website_form/static/src/xml/website_form_editor.xml'],
@@ -22,45 +64,6 @@ odoo.define('website_form_editor', function (require) {
this.$target.find('label:not(:has(span)), label span').addClass('o_fake_editable').attr('contentEditable', true);
},
- // Generic modal code
- build_modal: function (modal_title, modal_body, on_save) {
- var self = this;
-
- // Build the form parameters modal
- var modal = qweb.render("website_form.modal", {
- modal_title: modal_title,
- modal_body: modal_body
- });
-
- self.$modal = $(modal);
- self.$modal.appendTo('body');
-
- // Process the modal on_save then hide it
- self.$modal.find("#modal-save").on('click', function (e){
- if (self.$modal.find("form")[0].checkValidity()) {
- on_save();
- self.$modal.modal('hide');
- } else {
- _.each(self.$modal.find('.o_website_form_input'), function (input) {
- var $field = $(input).closest('.form-field');
- $field.removeClass('o_has_error').find('.form-control, .custom-select').removeClass('is-invalid');
- if (!input.checkValidity()) {
- $field.addClass('o_has_error').find('.form-control, .custom-select').addClass('is-invalid');
- }
- });
- }
- });
-
- // Destroy the modal when it is closed, as we will use many of them
- self.$modal.on('hidden.bs.modal', function (e) {
- self.$modal.remove();
- });
-
- self.$modal.modal();
-
- return self.$modal;
- },
-
// Return the fields promise if we already issued a model
// fields fetch request, or issue said request.
fields: function () {
@@ -95,7 +98,7 @@ odoo.define('website_form_editor', function (require) {
}).then(function (models) {
self.models = models;
// Models selection input
- var model_selection = qweb.render("website_form.field_many2one", {
+ var modelSelection = qweb.render("website_form.field_many2one", {
field: {
name: 'model_selection',
string: 'Action',
@@ -111,7 +114,7 @@ odoo.define('website_form_editor', function (require) {
});
// Success page input
- var success_page = qweb.render("website_form.field_char", {
+ var successPage = qweb.render("website_form.field_char", {
field: {
name: 'success_page',
string: 'Thank You Page',
@@ -119,49 +122,53 @@ odoo.define('website_form_editor', function (require) {
}
});
- // Form parameters modal
- self.build_modal(
- "Form Parameters",
- model_selection + success_page,
- function () {
- var success_page = self.$modal.find("[name='success_page']").val();
- self.init_form();
- self.$target.attr('data-success_page', success_page);
-
- self.$modal.find('.o_form_parameter_custom').each(function () {
- var $field = $(this).find('.o_website_form_input');
- var value = $field.val();
- var fieldName = $field.attr('name');
- self.$target.find('.form-group:has("[name=' + fieldName + ']")').remove();
- if (value) {
- var $hiddenField = $(qweb.render('website_form.field_char', {
- field: {
- name: fieldName,
- value: value,
- }
- })).addClass('d-none');
- self.$target.find('.form-group:has(".o_website_form_send")').before($hiddenField);
- }
- });
- }
- );
+ var save = function () {
+ var successPage = this.$el.find("[name='success_page']").val();
+ self.init_form();
+ self.$target.attr('data-success_page', successPage);
+
+ this.$el.find('.o_form_parameter_custom').each(function () {
+ var $field = $(this).find('.o_website_form_input');
+ var value = $field.val();
+ var fieldName = $field.attr('name');
+ self.$target.find('.form-group:has("[name=' + fieldName + ']")').remove();
+ if (value) {
+ var $hiddenField = $(qweb.render('website_form.field_char', {
+ field: {
+ name: fieldName,
+ value: value,
+ }
+ })).addClass('d-none');
+ self.$target.find('.form-group:has(".o_website_form_send")').before($hiddenField);
+ }
+ });
+ };
- wUtils.autocompleteWithPages(self, self.$modal.find("input[name='success_page']"));
- self.originSuccessPage = self.$modal.find("input[name='success_page']").val();
- self.originFormID = self.$modal.find("[name='model_selection']").val();
- self._renderParameterFields();
+ var cancel = function () {
+ if (!self.$target.attr('data-model_name')) {
+ self.$target.remove();
+ }
+ };
- self.$modal.find("[name='model_selection']").on('change', function () {
- self._renderParameterFields();
+ var $content = $('<form role="form">' + modelSelection + successPage + '</form>');
+ var dialog = new FormEditorDialog(self, {
+ title: 'Form Parameters',
+ size: 'medium',
+ $content: $content,
+ }).open();
+ dialog.on('closed', this, cancel);
+ dialog.on('save', this, ev => {
+ ev.stopPropagation();
+ save.call(dialog);
});
- // On modal close, if there is no data-model, it means
- // that the user refused to configure the form on the
- // first modal, so we remove the snippet.
- self.$modal.on('hidden.bs.modal', function (e) {
- if (!self.$target.attr('data-model_name')){
- self.$target.remove();
- }
+ wUtils.autocompleteWithPages(self, $content.find("input[name='success_page']"));
+ self.originSuccessPage = $content.find("input[name='success_page']").val();
+ self.originFormID = $content.find("[name='model_selection']").val();
+ self._renderParameterFields($content);
+
+ $content.find("[name='model_selection']").on('change', function () {
+ self._renderParameterFields($content);
});
});
},
@@ -174,11 +181,11 @@ odoo.define('website_form_editor', function (require) {
* @private
* @returns {Promise}
*/
- _renderParameterFields: function () {
+ _renderParameterFields: function ($modal) {
var self = this;
- var $successPage = this.$modal.find("[name='success_page']");
- this.$modal.find('.o_form_parameter_custom').remove();
- var id = this.$modal.find("[name='model_selection']").val();
+ var $successPage = $modal.find("[name='success_page']");
+ $modal.find('.o_form_parameter_custom').remove();
+ var id = $modal.find("[name='model_selection']").val();
this.activeForm = _.findWhere(this.models, {id: parseInt(id)});
var formKey = this.activeForm.website_form_key;
if (!formKey) {
@@ -204,7 +211,7 @@ odoo.define('website_form_editor', function (require) {
$field.find('label').attr('title', field.title);
// Set value
$field.find('.o_website_form_input').val(value);
- self.$modal.find('form').append($field);
+ $modal.append($field);
}));
});
}
@@ -222,7 +229,7 @@ odoo.define('website_form_editor', function (require) {
var fields_in_form = _.map(self.$target.find('.col-form-label'), function (label) { return label.getAttribute('for'); });
var available_fields = _.filter(fields_array, function (field) { return !_.contains(fields_in_form, field.name); });
// Render the select input
- var field_selection = qweb.render("website_form.field_many2one", {
+ var fieldSelection = qweb.render("website_form.field_many2one", {
field: {
name: 'field_selection',
string: 'Field',
@@ -230,16 +237,21 @@ odoo.define('website_form_editor', function (require) {
}
});
- // Form parameters modal
- self.build_modal(
- "Field Parameters",
- field_selection,
- function () {
- var selected_field_name = self.$modal.find("[name='field_selection']").val();
- var selected_field = fields[selected_field_name];
- self.append_field(selected_field);
- }
- );
+ var save = function () {
+ var selectedFieldName = this.$el.find("[name='field_selection']").val();
+ var selectedField = fields[selectedFieldName];
+ self.append_field(selectedField);
+ };
+
+ var dialog = new FormEditorDialog(self, {
+ title: 'Field Parameters',
+ size: 'medium',
+ $content: '<form role="form">' + fieldSelection + '</form>',
+ }).open();
+ dialog.on('save', this, ev => {
+ ev.stopPropagation();
+ save.call(dialog);
+ });
});
},
diff --git a/addons/website_form/static/src/scss/website_form.scss b/addons/website_form/static/src/scss/website_form.scss
index 1250e827f79..b423adcaa74 100644
--- a/addons/website_form/static/src/scss/website_form.scss
+++ b/addons/website_form/static/src/scss/website_form.scss
@@ -25,7 +25,7 @@
}
.editor_enable .o_website_form_field_hidden {
- display: block;
+ display: flex;
opacity: 0.5;
}
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 121201ea437..5de949e3bea 100644
--- a/addons/website_form/static/src/xml/website_form_editor.xml
+++ b/addons/website_form/static/src/xml/website_form_editor.xml
@@ -1,31 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
- <!-- Generic Modal Layout -->
- <t t-name="website_form.modal">
- <div role="dialog" class="modal fade">
- <div class="modal-dialog">
- <div class="modal-content">
- <header class="modal-header">
- <h4 class="modal-title"><t t-esc="modal_title"/></h4>
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
- <span>&amp;times;</span>
- </button>
- </header>
- <main class="modal-body">
- <form role="form">
- <t t-raw="modal_body"/>
- </form>
- </main>
- <footer class="modal-footer">
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
- <button type="button" class="btn btn-primary" id="modal-save">Save</button>
- </footer>
- </div>
- </div>
- </div>
- </t>
-
<!-- Generic Field Layout -->
<t t-name="website_form.field">
<div t-att-class="'row form-group form-field' + (field.custom ? ' o_website_form_custom' : '') + (field.required ? ' o_website_form_required' : '')">
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 a25266a4cdd..735016c34b3 100644
--- a/addons/website_form/static/tests/tours/website_form_editor.js
+++ b/addons/website_form/static/tests/tours/website_form_editor.js
@@ -49,7 +49,7 @@ odoo.define('website_form_editor.tour', function(require) {
},
{
content: "Click on Save",
- trigger: ".modal-footer #modal-save"
+ trigger: ".modal-footer button:first"
},
// Add the date field
{
@@ -67,7 +67,7 @@ odoo.define('website_form_editor.tour', function(require) {
},
{
content: "Click on Save",
- trigger: ".modal-footer #modal-save"
+ trigger: ".modal-footer button:first"
},
// Customize date field
@@ -104,7 +104,7 @@ odoo.define('website_form_editor.tour', function(require) {
},
{
content: "Click on Save",
- trigger: ".modal-footer #modal-save"
+ trigger: ".modal-footer button:first"
},
// Customize record_name field
@@ -142,7 +142,7 @@ odoo.define('website_form_editor.tour', function(require) {
},
{
content: "Click on Save",
- trigger: ".modal-footer #modal-save"
+ trigger: ".modal-footer button:first"
},
// Customize subject field
@@ -179,7 +179,7 @@ odoo.define('website_form_editor.tour', function(require) {
},
{
content: "Click on Save",
- trigger: ".modal-footer #modal-save"
+ trigger: ".modal-footer button:first"
},
{
content: "Check the resulting field",
@@ -409,7 +409,7 @@ odoo.define('website_form_editor.tour', function(require) {
},
{
content: "Click on Save",
- trigger: ".modal-footer #modal-save"
+ trigger: ".modal-footer button:first"
},
// Customize attachment_ids field