(function($){ String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); }; var GROUP = -1; var DynFields2 = { init: function () { var container = $('[data-grav-array]'), blockParent, options; DynFields2.container = container; container.parent().on('click', '[data-grav-addfield]', DynFields2.addField.bind(DynFields2)); container.on('click', '[data-grav-remfield]', DynFields2.remField.bind(DynFields2)); $.each(DynFields2.container, function(index, block){ block = $(block); blockParent = $(block.parents('.grav-array')); options = DynFields2.getOptions(block); if (options && options.sortable_root){ blockParent.nestable({ rootClass: 'grav-array', handleClass: 'dd-root-handle', maxDepth: 1, expandBtnHTML: false, collapseBtnHTML: false, group: ++GROUP }); blockParent.on('change', function(){ DynFields2.updateNames(block); }); } else { block.find('.dd-root-handle').remove(); } if (options && options.sortable_children){ $.each(block.find('.dd3-content'), function(index, content){ DynFields2.makeSortable(content); }); } else { block.find('.dd3-content .dd-grav-handle').remove(); } }); }, getOptions: function(container){ var data = container.data('grav-array'), options; $.each(data, function(name, values){ options = values.options; }); return options; }, getSchema: function(container){ var data = container.data('grav-array'), schema; $.each(data, function(name, values){ schema = values.schema; }); return schema; }, addField: function(event){ var element = $(event.target), location = 'insertAfter', container = element.parents('[data-grav-array]'), parents = element.parents('li'); if (!container.length) { container = element.next('[data-grav-array]'); location = 'appendTo'; } if (!parents.length) parents = container.last(); var schema = DynFields2.buildSchema(container), li = $('
  • ').html(schema)[location](parents); DynFields2.updateNames(container); DynFields2.makeSortable(li.find('.dd3-content')); }, remField: function(event){ var element = $(event.target), container = element.parents('[data-grav-array]'); element.parents('li').remove(); DynFields2.updateNames(container); }, updateNames: function(container){ var items, name; $.each(container.children(), function(index, item){ items = $(item).find('[name]'); $.each(items, function(key, input){ input = $(input); input.attr('name', input.attr('name').replace(/\[\w\]/, '[' + index + ']')); }); }); }, makeSortable: function(context){ context = $(context); context.nestable({ maxDepth: 1, expandBtnHTML: false, collapseBtnHTML: false, listClass: 'dd-grav-list', itemClass: 'dd-grav-item', rootClass: 'dd3-content', handleClass: 'dd-grav-handle', group: ++GROUP }); context.on('change', function(){ DynFields2.updateNames(context.parents('[data-grav-array]')); }); }, buildSchema: function(container){ var data = container.data('grav-array'), options = DynFields2.getOptions(container), html = [], input = '', inputName = '', index; if (options && options.sortable_root) html.push('
    '); html.push('
    '); html.push(' '); html.push(' '); html.push('
    '); html.push('
      '); $.each(DynFields2.getSchema(container), function(key, value){ html.push('
    1. '); if (options && options.sortable_children) html.push('
      '); html.push(' ' + (value.label || key.capitalize()) + ''); inputName = name + '[X]' + '[' + key + ']'; switch(value.type || 'input'){ case 'text': case 'hidden': input = ''; break; case 'textarea': input = ''; break; case 'select': input = ''; break; case 'radio': input = ''; index = 0; $.each(value.options || [], function(sValue, sLabel){ input += ' '; index++; }); break; } html.push(input); html.push('
    2. '); }); html.push('
    '); return html.join("\n"); } }; $(DynFields2.init); })(jQuery);