/** * @copyright (C) 2019 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */(y=>{const m={SPACE:32,ESC:27,ENTER:13};function v(A){return A.ctrlKey||A.metaKey||A.shiftKey}class C extends HTMLElement{get buttonAdd(){return this.getAttribute("button-add")}get buttonRemove(){return this.getAttribute("button-remove")}get buttonMove(){return this.getAttribute("button-move")}get rowsContainer(){return this.getAttribute("rows-container")}get repeatableElement(){return this.getAttribute("repeatable-element")}get minimum(){return this.getAttribute("minimum")}get maximum(){return this.getAttribute("maximum")}get name(){return this.getAttribute("name")}set name(e){this.template=this.template.replace(new RegExp(` name="${this.name.replace(/[[\]]/g,"\\$&")}`,"g"),` name="${e}`),this.setAttribute("name",e)}constructor(){super();const e=this;if(this.containerWithRows=this,this.rowsContainer){const t=this.querySelectorAll(this.rowsContainer);Array.from(t).forEach(i=>{i.closest("joomla-field-subform")===this&&(this.containerWithRows=i)})}this.lastRowIndex=this.getRows().length-1,this.template="",this.prepareTemplate(),(this.buttonAdd||this.buttonRemove)&&(this.addEventListener("click",t=>{let i=null,o=null;if(e.buttonAdd&&(i=t.target.matches(e.buttonAdd)?t.target:t.target.closest(e.buttonAdd)),e.buttonRemove&&(o=t.target.matches(e.buttonRemove)?t.target:t.target.closest(e.buttonRemove)),i&&i.closest("joomla-field-subform")===e){let l=i.closest(e.repeatableElement);l=l&&l.closest("joomla-field-subform")===e?l:null,e.addRow(l),t.preventDefault()}else if(o&&o.closest("joomla-field-subform")===e){const l=o.closest(e.repeatableElement);e.removeRow(l),t.preventDefault()}}),this.addEventListener("keydown",t=>{if(t.keyCode!==m.SPACE)return;const i=e.buttonAdd&&t.target.matches(e.buttonAdd),o=e.buttonRemove&&t.target.matches(e.buttonRemove);if((i||o)&&t.target.closest("joomla-field-subform")===e){let l=t.target.closest(e.repeatableElement);l=l&&l.closest("joomla-field-subform")===e?l:null,o&&l?e.removeRow(l):i&&e.addRow(l),t.preventDefault()}})),this.buttonMove&&this.setUpDragSort()}getRows(){const e=Array.from(this.containerWithRows.children),t=[];return e.forEach(i=>{i.matches(this.repeatableElement)&&t.push(i)}),t}prepareTemplate(){const e=[].slice.call(this.children).filter(t=>t.classList.contains("subform-repeatable-template-section"));if(e[0]&&(this.template=e[0].innerHTML),!this.template)throw new Error("The row template is required for the subform element to work")}addRow(e){const t=this.getRows().length;if(t>=this.maximum)return null;let i;this.containerWithRows.nodeName==="TBODY"||this.containerWithRows.nodeName==="TABLE"?i=document.createElement("tbody"):i=document.createElement("div"),i.innerHTML=this.template;const o=i.children[0];return e?e.parentNode.insertBefore(o,e.nextSibling):this.containerWithRows.append(o),this.buttonMove&&(o.setAttribute("draggable","false"),o.setAttribute("aria-grabbed","false"),o.setAttribute("tabindex","0")),o.setAttribute("data-new","1"),this.fixUniqueAttributes(o,t),this.dispatchEvent(new CustomEvent("subform-row-add",{detail:{row:o},bubbles:!0})),o.dispatchEvent(new CustomEvent("joomla:updated",{bubbles:!0,cancelable:!0})),o}removeRow(e){this.getRows().length<=this.minimum||(this.dispatchEvent(new CustomEvent("subform-row-remove",{detail:{row:e},bubbles:!0})),e.dispatchEvent(new CustomEvent("joomla:removed",{bubbles:!0,cancelable:!0})),e.parentNode.removeChild(e))}fixUniqueAttributes(e,t){const i=t||0,o=e.getAttribute("data-group"),l=e.getAttribute("data-base-name"),h=Math.max(this.lastRowIndex,i),r=l+h;this.lastRowIndex=h+1,e.setAttribute("data-group",r);let s=e.querySelectorAll("[name]");const a={};s=[].slice.call(s).filter(b=>b.nodeName==="JOOMLA-FIELD-SUBFORM"?b.parentElement.closest("joomla-field-subform")===this:b.closest("joomla-field-subform")===this),s.forEach(b=>{const d=b,p=d.getAttribute("name"),L=d.getAttribute("aria-describedby"),n=p.replace(/(\[\]$)/g,"").replace(/(\]\[)/g,"__").replace(/\[/g,"_").replace(/\]/g,""),R=p.replace(`[${o}][`,`[${r}][`);let u=n.replace(o,r).replace(/\W/g,"_"),f=0,E=n;if(d.type==="checkbox"&&p.match(/\[\]$/)){if(f=a[n]?a[n].length:0,!f){const g=d.closest("fieldset.checkboxes"),c=e.querySelector(`label[for="${n}"]`);g&&g.setAttribute("id",u),c&&(c.setAttribute("for",u),c.setAttribute("id",`${u}-lbl`))}E+=f,u+=f}else if(d.type==="radio"){if(f=a[n]?a[n].length:0,!f){const g=d.closest("fieldset.radio"),c=e.querySelector(`label[for="${n}"]`);g&&g.setAttribute("id",u),c&&(c.setAttribute("for",u),c.setAttribute("id",`${u}-lbl`))}E+=f,u+=f}a[n]?a[n].push(!0):a[n]=[!0],d.name=R,d.id&&(d.id=u),L&&d.setAttribute("aria-describedby",`${R}-desc`);const w=e.querySelector(`label[for="${E}"]`);w&&(w.setAttribute("for",u),w.setAttribute("id",`${u}-lbl`))})}setUpDragSort(){const e=this;let t=null,i=!1;Array.from(this.getRows()).forEach(r=>{r.setAttribute("draggable","false"),r.setAttribute("aria-grabbed","false"),r.setAttribute("tabindex","0")});function l(r){return!r.form&&r.matches(e.buttonMove)?r:r.closest(e.buttonMove)}function h(r,s){let a=!1;if(r.parentNode===s.parentNode){for(let b=r;b;b=b.previousSibling)if(b===s){a=!0;break}}a?s.parentNode.insertBefore(r,s):s.parentNode.insertBefore(r,s.nextSibling)}this.addEventListener("touchstart",r=>{i=!0;const s=l(r.target),a=s?s.closest(e.repeatableElement):null;!a||a.closest("joomla-field-subform")!==e||(t?(a!==t&&h(t,a),t.setAttribute("draggable","false"),t.setAttribute("aria-grabbed","false"),t=null):(a.setAttribute("draggable","true"),a.setAttribute("aria-grabbed","true"),t=a),r.preventDefault())}),this.addEventListener("mousedown",({target:r})=>{if(i)return;const s=l(r),a=s?s.closest(e.repeatableElement):null;!a||a.closest("joomla-field-subform")!==e||(a.setAttribute("draggable","true"),a.setAttribute("aria-grabbed","true"),t=a)}),this.addEventListener("mouseup",()=>{t&&!i&&(t.setAttribute("draggable","false"),t.setAttribute("aria-grabbed","false"),t=null)}),this.addEventListener("keydown",r=>{if(r.keyCode!==m.ESC&&r.keyCode!==m.SPACE&&r.keyCode!==m.ENTER||r.target.form||!r.target.matches(e.repeatableElement))return;const s=r.target;if(!(!s||s.closest("joomla-field-subform")!==e)&&(r.keyCode===m.SPACE&&v(r)&&(s.getAttribute("aria-grabbed")==="true"?(s.setAttribute("draggable","false"),s.setAttribute("aria-grabbed","false"),t=null):(t&&(t.setAttribute("draggable","false"),t.setAttribute("aria-grabbed","false"),t=null),s.setAttribute("draggable","true"),s.setAttribute("aria-grabbed","true"),t=s),r.preventDefault()),r.keyCode===m.ESC&&t&&(t.setAttribute("draggable","false"),t.setAttribute("aria-grabbed","false"),t=null),r.keyCode===m.ENTER&&t)){if(t.setAttribute("draggable","false"),t.setAttribute("aria-grabbed","false"),s===t){t=null;return}h(t,s),r.preventDefault(),t=null}}),this.addEventListener("dragstart",({dataTransfer:r})=>{t&&(r.effectAllowed="move",r.setData("text",""))}),this.addEventListener("dragover",r=>{t&&r.preventDefault()}),this.addEventListener("dragenter",({target:r})=>{if(!t||r.parentElement.closest("joomla-field-subform")!==e)return;const s=r.closest(e.repeatableElement);!s||s.closest("joomla-field-subform")!==e||h(t,s)}),this.addEventListener("dragend",()=>{t&&(t.setAttribute("draggable","false"),t.setAttribute("aria-grabbed","false"),t=null)})}}y.define("joomla-field-subform",C)})(customElements);