diff --git a/themes/grav/js/forms/fields/array.js b/themes/grav/js/forms/fields/array.js index f513ef9f..ded453e8 100644 --- a/themes/grav/js/forms/fields/array.js +++ b/themes/grav/js/forms/fields/array.js @@ -9,7 +9,11 @@ this.el.on('click', '[data-grav-array-action="add"]', this.add.bind(this)); this.el.on('click', '[data-grav-array-action="rem"]', this.remove.bind(this)); + this.el.on('click', '[data-grav-array-action="addArrayItem"]', this.addArray.bind(this)); + this.el.on('click', '[data-grav-array-action="remArrayItem"]', this.removeArray.bind(this)); this.el.on('keyup', '[data-grav-array-type="key"]', this.update.bind(this)); + this.el.on('keyup', '[data-grav-array-type="keyArray"]', this.updateArray.bind(this)); + this.el.on('keyup', '[data-grav-array-type="keyArraySubelement"]', this.updateArraySubelement.bind(this)); }; ArrayField.getName = function () { @@ -103,6 +107,18 @@ } }; + ArrayField.prototype.addArray = function(event) { + $(this._getNewArrayField()).insertAfter($(event.target).closest('[data-grav-array-type="subrow"]')); + }; + + ArrayField.prototype.removeArray = function(event) { + if ($(event.target).closest('[data-grav-array-type="subrow"]').siblings().length == 0) { + //disable for the last item + return; + } + $(event.target).closest('[data-grav-array-type="subrow"]').remove(); + }; + ArrayField.prototype.update = function(event) { var keyField = $(event.target), valueField = keyField.closest('[data-grav-array-type="row"]').find('[data-grav-array-type="value"]'); @@ -110,6 +126,32 @@ valueField.attr('name', this.getFieldName() + '[' + keyField.val() + ']'); }; + ArrayField.prototype.updateArray = function(event) { + var keyField = $(event.target), + row = keyField.closest('[data-grav-array-type="row"]'), + valueFields = row.find('[data-grav-array-type="value"]'), + keyArrayField = row.find('[data-grav-array-type="keyArray"]'), + fieldName = this.getFieldName(); + + valueFields.each(function() { + $(this).attr('name', fieldName + '[' + keyArrayField.val() + ']' + '[' + $(this).attr('subkey') + ']'); + }); + }; + + ArrayField.prototype.updateArraySubelement = function(event) { + var keyField = $(event.target), + row = keyField.closest('[data-grav-array-type="row"]'), + subrow = keyField.closest('[data-grav-array-type="subrow"]'), + valueFields = subrow.find('[data-grav-array-type="value"]'), + keyArrayField = row.find('[data-grav-array-type="keyArray"]'), + fieldName = this.getFieldName(); + + valueFields.each(function() { + $(this).attr('name', fieldName + '[' + keyArrayField.val() + ']' + '[' + keyField.val() + ']'); + }); + }; + + ArrayField.prototype.refreshAll = function() { var that = this; this.el.find('[data-grav-array-type="value"]').each(function(index, element){ @@ -150,5 +192,17 @@ return output; }; + ArrayField.prototype._getNewArrayField = function(key, value) { + var output = '