(function (global, $, Backbone, _) { 'use strict'; var PageView, SidebarView, FieldsView, prepareField = function (field) { var attrs = {}; _.each(field, function (value, key) { attrs[key.replace(/field\[(.*)\]/gi, '$1')] = value; }); return attrs; }; SidebarView = Backbone.View.extend({ selectors: { item: '.amoforms__fields__expander__item', item_head: '.amoforms__fields__expander__item__head', fields: '.amoforms__fields__expander__item__content__fields' }, events: { 'click .amoforms__fields__expander__item:not(.expanded)': 'itemToggle', 'click .amoforms__fields__expander__item__content__fields__field': 'addNewFieldClick', 'focus .js-amoforms-shortcode': 'selectOnFocus', 'mouseup .js-amoforms-shortcode': 'selectOnMouseUp' }, initialize: function () { this.itemToggle({ currentTarget: this.$(this.selectors['item'] + ':first') }); this.css = new AMOFORMS.views.cssstorage; var _this = this; this.$(this.selectors['fields']).each(function($i) { _this.items_new = new Sortable(_this.$(_this.selectors['fields'])[$i], { group: { name: 'fields', put: false, pull: 'clone' }, scroll: _this.$('.amoforms__fields__expander__item__head:first')[0], scrollSensitivity: 100, scrollSpeed: 20, sort: false, onMove: _.bind(function (e) { var $dragEl = $(e.dragged); if ($dragEl.find('[data-type="captcha"]').length > 0 && $dragEl.find('[data-type="captcha"]').attr('data-active') == 'false') { return; } $dragEl.find('.amoforms__fields__container').remove(); $dragEl.append(_this.generateField({ type: $dragEl.find('.amoforms__fields__expander__item__content__fields__field').attr('data-type'), class_name: 'sortable-ghost' })); }, _this), onEnd: _.bind(function (e) { var $dragEl = $(e.item), type = $dragEl.find('.amoforms__fields__expander__item__content__fields__field').attr('data-type'), pos = 0; if (!$dragEl.closest(_this.selectors['fields']).length) { for (var i = 0; i < $dragEl.index(); i++) { pos += $($dragEl.siblings()[i]).find(".amoforms__fields__row").length; } AMOFORMS.app.createField({ type: type, position: pos, success: _.bind(function (res) { var $new_field = _this.generateField({ field: res.field, style: res.style, type: type }); $dragEl.before($new_field); $dragEl.remove(); AMOFORMS.app.addField($new_field); if (type == 'captcha') { $('[data-type="captcha"]').attr('data-active', 'false'); } }, _this) }); } else { $dragEl.find('.amoforms__fields__container').remove(); } }, _this) }); }); }, /* DOM-events */ addNewFieldClick: function (e) { var type = $(e.currentTarget).attr('data-type'); if (type == 'captcha' && $(e.currentTarget).attr('data-active') == 'false') { return; } AMOFORMS.app.createField({ type: type, position: AMOFORMS.app.fields.$('.js-fields-sortable .amoforms__fields__row').length, success: _.bind(function (res) { var $new_field = this.generateField({ field: res.field, style: res.style, type: type }); AMOFORMS.app.fields.$('.js-fields-sortable').append($new_field); AMOFORMS.app.addField($new_field); if (type == 'captcha') { $('[data-type="captcha"]').attr('data-active', 'false'); } }, this) }); }, itemToggle: function (e) { var $this = $(e.currentTarget); this .$(this.selectors['item'] + '.expanded') .removeClass('expanded') .find('.amoforms__fields__expander__item__content') .css('min-height', ''); $this .addClass('expanded') .find($this.find('.amoforms__fields__expander__item__content')) .css('min-height', $this.find('.amoforms__fields__expander__item__content__inner')[0].offsetHeight); }, selectOnMouseUp: function (e) { setTimeout(function () { $(e.currentTarget).select(); }, 30); }, /* end of DOM-events */ generateField: function (options) { var render_params, css, $style = $("#amoforms__custom_style"); options = options || {}; if(options.style){ css = AMOFORMS.core.fn.generateCSS(options.style); $style.append(css); this.css.setStyle($style.text()); } render_params = { class_name: options.class_name, edit_mode: true, field_id: (options.field && options.field.id) ? options.field.id : 999, field: options.field || { name: options.type.charAt(0).toUpperCase() + options.type.slice(1) }, is_pos_after: options.field ? options.field.description_position == AMOFORMS.consts.pos_after : '', is_layout_inline: options.field ? options.field.layout == AMOFORMS.consts.layout_inline : '', use_mask: options.field ? options.field.options.use_mask : false, system_masks: options.field ? options.field.options.system_masks : [], default_mask: options.field ? options.field.options.default_mask : '', field_style: options.style, grid: { left: options.field ? options.field.grid == 1 : false, right: options.field ? options.field.grid == 2 : false, full: options.field ? options.field.grid == 0 : true }, consts: AMOFORMS.consts }; render_params['name_position_' + AMOFORMS.app.$('.amoforms__fields__settings__btn[data-type="name-position"]').attr('data-value')] = true; render_params['is_' + options.type] = true; return $(Mustache.render(AMOFORMS.templates.field_in_edit, render_params, AMOFORMS.templates.partials)); }, }); FieldsView = Backbone.View.extend({ selectors: { field: '.amoforms__fields__row', fields_container: '.amoforms__fields__container', fields_container_list: '.amoforms__fields__container__list', submit: '.amoforms__fields__row-submit', edit_form: '.amoforms__fields__edit', settings: '.amoforms__fields__settings', style_el: '#amoforms__custom_style' }, events: { 'mouseenter .amoforms__fields__container': 'setContainerHover', 'mouseleave .amoforms__fields__container': 'removeContainerHover', 'click .amoforms__fields__editor__row__actions__action-edit': 'editorLock', 'click .js-amoforms-field-cancel': 'editorUnlock', 'click .js-amoforms-style-save': 'editorUnlock', 'click .js-amoforms-style-reset': 'editorUnlock', 'click .js-amoforms-field-save': 'editorUnlock' }, initialize: function () { var _this = this; this.css = new AMOFORMS.views.cssstorage; this.form_id = this.$el.attr('data-form-id'); this.initSubmit(); this.settings = new AMOFORMS.views.settings({ el: this.$(this.selectors['settings']), form_id: this.form_id, $fields: this.$el, submit: this.submit }); this.sortables = []; this.$('.js-fields-sortable ' + this.selectors['field']).each(function() { _this.addField($(this)); }); Sortable.create(this.$el.find('.js-fields-sortable')[0], { group: {name: 'fields', pull: true, put: true}, delay: 0, animation: 250, sort: true, disabled: false, draggable: this.selectors['fields_container'], filter: '.amoforms__fields__row-submit', scroll: this.$(this.selectors['settings'])[0], scrollSensitivity: 100, scrollSpeed: 20, onEnd: _.bind(function (e) { var $dragEl = $(e.item).removeClass('drag-started'), view, fields = []; if ($dragEl.hasClass('drag-hidden')) { $dragEl .removeClass('drag-hidden') .find(this.selectors['edit_form']) .show(); } this.$('.js-fields-sortable .amoforms__fields__container .amoforms__fields__row').each(function () { view = $(this).data('view'); fields.push(prepareField(view.form.model.toJSON())); }); $.ajax({ url: ajaxurl, data: { action: AMOFORMS.ajax_action_prefix + 'update_fields', form: { id: this.form_id, fields: fields } }, dataType: 'json', type: 'POST' }); this.$el.removeClass('drag-sorting'); }, this) }); _.each(this.$el.find(this.selectors['fields_container_list']), function(el) { var put = $(el).find(this.selectors['field']).length != 2; this.sortables.push(this.createSortableField(el, put)); }, this); }, createSortableField: function(el, put) { put = (typeof put === 'boolean') ? put : true; return Sortable.create(el, { group: {name: 'field', pull: true, put: put}, draggable: this.selectors['field'], animation: 150, sort: true, onMove: _.bind(function (e) { if ($(e.to).find(this.selectors['field']).length > 1 && e.from != e.to) { return false; } if($(e.related).hasClass('full')){ $(e.related).removeClass('full').addClass('half'); $(e.dragged).removeClass('full').addClass('half'); } else if($(e.related).hasClass('half')){ $(e.dragged).removeClass('full').addClass('half'); } else if (e.from != e.to) { $(e.dragged).removeClass('half').addClass('full'); } }, this), onStart: _.bind(function (e) { if($(e.item).hasClass('half')){ this.createFieldContainer(e); } }, this), onRemove: _.bind(function (e){ this.removeContainerHover($(e.target).parent()); var $source = $(e.target), count = $source.find(this.selectors['field']).length; if(count == 0){ $source.parent().remove(); } else if(count == 1){ $source.find(this.selectors['field']).removeClass('half').addClass('full'); this.toggleBlockList(e.target, true); } }, this), onAdd: _.bind(function (e) { var $siblings = $(e.item).siblings('.amoforms__fields__row'); if($siblings.length == 1){ $siblings.removeClass('full').addClass('half'); $(e.item).removeClass('full').addClass('half'); this.toggleBlockList(e.target, false); } else if ($siblings.length == 0){ $siblings.removeClass('half').addClass('full'); $(e.item).removeClass('half').addClass('full'); this.toggleBlockList(e.target, true); } }, this), onEnd: _.bind(function (e) { var $container = $(e.item).closest(this.selectors['fields_container']), view, fields = []; if($container.attr('id') == 'empty-container'){ $container.removeAttr('id'); } else { _.each($('.js-fields-sortable ' + this.selectors['fields_container']), function(el) { if($(el).attr('id') == 'empty-container'){ $(el).remove(); } }); } this.checkEmptySpace(); this.$('.js-fields-sortable .amoforms__fields__container .amoforms__fields__row').each(function () { var before = $(this).prev('.amoforms__fields__row')[0] != undefined, after = $(this).next('.amoforms__fields__row')[0] != undefined, pos = (before) ? 2 : (after) ? 1 : 0; view = $(this).data('view'); if($(this).hasClass('half')){ view.form.model.attributes["field[grid]"] = pos; } else if(view.form.model.attributes["field[grid]"] != 0){ view.form.model.attributes["field[grid]"] = 0; } fields.push(prepareField(view.form.model.toJSON())); }); $.ajax({ url: ajaxurl, data: { action: AMOFORMS.ajax_action_prefix + 'update_fields', form: { id: this.form_id, fields: fields } }, dataType: 'json', type: 'POST' }); $(document).trigger('amoforms:field:render'); }, this) }, this); }, createFieldContainer: function(e) { var $this = $(e.target).parent(), $container = '