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 = '
' + "\n" + + '' + "\n" + + ''; + + output += '' + "\n" + + '' + "\n" + + '
'; + + return output; + }; + root.Array = ArrayField; })(); diff --git a/themes/grav/templates/forms/fields/array/array.html.twig b/themes/grav/templates/forms/fields/array/array.html.twig index f6a45f49..7e778310 100644 --- a/themes/grav/templates/forms/fields/array/array.html.twig +++ b/themes/grav/templates/forms/fields/array/array.html.twig @@ -11,30 +11,42 @@
{% if value|length %} {% for key, text in value -%} -
+
- {% if text is iterable %} - + {% if text is iterable %} +
+
+ +
- {% for subkey, subtext in text -%} +
+ {% for subkey, subtext in text -%} +
+ + + + + +
+ {% endfor %} + +
+ + +
+
+
+ {% else %} {% if field.value_only != true %} - + {% endif %} - - {% endfor %} + - {% else %} - {% if field.value_only != true %} - + + {% endif %} - - - {% endif %} - - - -
+
{% endfor %} {%- else -%}