X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/afed379c5c2b0ef1fb2e95b1b807b65cd7ece1ef..refs/pull/4301/head:/resources/js/components/add-remove-rows.js diff --git a/resources/js/components/add-remove-rows.js b/resources/js/components/add-remove-rows.js index 81eeb43c4..3213c4835 100644 --- a/resources/js/components/add-remove-rows.js +++ b/resources/js/components/add-remove-rows.js @@ -1,31 +1,54 @@ -import {onChildEvent} from "../services/dom"; +import {onChildEvent} from '../services/dom'; +import {uniqueId} from '../services/util'; +import {Component} from './component'; /** * AddRemoveRows * Allows easy row add/remove controls onto a table. * Needs a model row to use when adding a new row. - * @extends {Component} */ -class AddRemoveRows { +export class AddRemoveRows extends Component { + setup() { this.modelRow = this.$refs.model; this.addButton = this.$refs.add; this.removeSelector = this.$opts.removeSelector; + this.rowSelector = this.$opts.rowSelector; this.setupListeners(); } setupListeners() { - this.addButton.addEventListener('click', e => { - const clone = this.modelRow.cloneNode(true); - clone.classList.remove('hidden'); - this.modelRow.parentNode.insertBefore(clone, this.modelRow); - }); + this.addButton.addEventListener('click', this.add.bind(this)); - onChildEvent(this.$el, this.removeSelector, 'click', (e) => { - const row = e.target.closest('tr'); + onChildEvent(this.$el, this.removeSelector, 'click', e => { + const row = e.target.closest(this.rowSelector); row.remove(); }); } -} -export default AddRemoveRows; \ No newline at end of file + // For external use + add() { + const clone = this.modelRow.cloneNode(true); + clone.classList.remove('hidden'); + this.setClonedInputNames(clone); + this.modelRow.parentNode.insertBefore(clone, this.modelRow); + window.$components.init(clone); + } + + /** + * Update the HTML names of a clone to be unique if required. + * Names can use placeholder values. For exmaple, a model row + * may have name="tags[randrowid][name]". + * These are the available placeholder values: + * - randrowid - An random string ID, applied the same across the row. + * @param {HTMLElement} clone + */ + setClonedInputNames(clone) { + const rowId = uniqueId(); + const randRowIdElems = clone.querySelectorAll('[name*="randrowid"]'); + for (const elem of randRowIdElems) { + elem.name = elem.name.split('randrowid').join(rowId); + } + } + +}