1 |
efrain |
1 |
{"version":3,"file":"add_dyn_formbuttons.min.js","sources":["../src/add_dyn_formbuttons.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n\n/**\n * @author Andreas Grabs <moodle@grabs-edv.de>\n * @copyright 2024 Andreas Grabs\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ContentLoader from 'mod_unilabel/contentloader';\nimport Templates from 'core/templates';\nimport notification from 'core/notification';\nimport log from 'core/log';\n\nlet _formid;\nlet _type;\nlet _elements;\n\n/**\n * Register the del button and get the html from mustache.\n *\n * @param {Element} headerelement The draggable header element\n * @param {Integer} index The index of the headerelement\n * @returns {Promise}\n */\nconst registerActionButtons = (headerelement, index) => {\n const context = {\n type: _type,\n repeatindex: index,\n repeatnr: (index + 1),\n };\n return Templates.renderForPromise('mod_unilabel/element_action_buttons', context)\n .then(({html, js}) => {\n headerelement.querySelector('div.d-flex').insertAdjacentHTML(\n 'beforeend', html\n );\n Templates.runTemplateJS(js);\n return;\n }).catch((error) => notification.exception(error));\n};\n\n/**\n * Delete an element and set dummy hidden elements with \"0\" value, what is needed by the mform.\n *\n * @param {Integer} index The index of the deleted element\n */\nconst delElement = (index) => {\n var headerelement = document.querySelector('#id_singleelementheader_' + index);\n if (headerelement) {\n headerelement.remove();\n }\n var thisform = document.querySelector('#' + _formid);\n var myparent = document.querySelector('#id_unilabelcontenthdr');\n if (myparent) {\n var newelement;\n _elements.forEach((element) => {\n let name = 'unilabeltype_' + _type + '_' + element + '[' + index + ']';\n log.debug('Set dummy element ' + name);\n newelement = document.createElement('input');\n newelement.type = 'hidden';\n newelement.name = name;\n newelement.value = '';\n myparent.insertAdjacentElement('afterbegin', newelement);\n });\n const myevent = new CustomEvent('itemremoved', {detail: index});\n thisform.dispatchEvent(myevent);\n }\n};\n\n/**\n * Export our init method.\n *\n * @param {string} type The type of unilabeltype e.g.: grid\n * @param {string} formid The id of the mform the draggable elements are related to\n * @param {Integer} contextid\n * @param {string} prefix\n * @param {array} elements The dummy fields we need if we want to delete an element\n * @param {boolean} useDragdrop The same as element but for editor which has subelements like \"text\", \"format\" and \"itemid\"\n */\nexport const init = async(type, formid, contextid, prefix, elements, useDragdrop) => {\n // Import the dragdrop module asynchron.\n const dragDrop = await import('mod_unilabel/dragdrop');\n dragDrop.init(type, formid, useDragdrop);\n\n _type = type;\n _formid = formid;\n _elements = elements;\n\n // Register a click for the whole form but only applying to the delButtons.\n var thisform = document.querySelector('#' + formid);\n thisform.addEventListener('click', (e) => {\n if (e.target.dataset.action == 'deleteelement') {\n var index = e.target.dataset.id;\n log.debug('Deleting element: ' + index);\n delElement(index);\n }\n });\n\n // Look for the header elements and add and register a delete button.\n var headerelements = document.querySelectorAll('fieldset[id^=\"id_singleelementheader\"]');\n for (var i = 0; i < headerelements.length; i++) {\n var headerelement = headerelements[i];\n log.debug('looking for: ' + headerelement.id);\n registerActionButtons(headerelement, i);\n }\n\n var button = document.querySelector('#button-' + formid);\n if (button) {\n var repeatbutton = document.querySelector('#fitem_id_' + prefix + 'add_more_elements_btn');\n if (repeatbutton) {\n repeatbutton.remove();\n }\n button.addEventListener('click', (e) => {\n var contentcontainerselector = '#addcontent-' + formid;\n var repeatindex = parseInt(e.target.form.multiple_chosen_elements_count.value);\n var fragmentcall = 'get_edit_element';\n\n var serviceparams = {\n 'contextid': contextid,\n 'formid': formid,\n 'repeatindex': repeatindex\n };\n log.debug(serviceparams);\n\n e.target.form.multiple_chosen_elements_count.value = repeatindex + 1;\n\n // To make the moodle form aware of the change, we set the data-initial-value to its original value.\n e.target.form.dataset.formDirty = true;\n\n var contentLoader = new ContentLoader(contentcontainerselector, fragmentcall, serviceparams, contextid);\n contentLoader.loadContent('beforebegin').then(() => {\n const myevent = new CustomEvent('itemadded', {detail: repeatindex});\n thisform.dispatchEvent(myevent);\n return true;\n }).catch((error) => notification.exception(error));\n });\n }\n};\n"],"names":["_formid","_type","_elements","registerActionButtons","headerelement","index","context","type","repeatindex","repeatnr","Templates","renderForPromise","then","_ref","html","js","querySelector","insertAdjacentHTML","runTemplateJS","catch","error","notification","exception","async","formid","contextid","prefix","elements","useDragdrop","init","thisform","document","addEventListener","e","target","dataset","action","id","debug","remove","myparent","newelement","forEach","element","name","createElement","value","insertAdjacentElement","myevent","CustomEvent","detail","dispatchEvent","delElement","headerelements","querySelectorAll","i","length","button","repeatbutton","contentcontainerselector","parseInt","form","multiple_chosen_elements_count","serviceparams","formDirty","ContentLoader","loadContent"],"mappings":"mrBA2BIA,QACAC,MACAC,gBASEC,sBAAwB,CAACC,cAAeC,eACpCC,QAAU,CACZC,KAAMN,MACNO,YAAaH,MACbI,SAAWJ,MAAQ,UAEhBK,mBAAUC,iBAAiB,sCAAuCL,SACxEM,MAAKC,WAACC,KAACA,KAADC,GAAOA,SACVX,cAAcY,cAAc,cAAcC,mBACtC,YAAaH,yBAEPI,cAAcH,OAEzBI,OAAOC,OAAUC,sBAAaC,UAAUF,wBAyC3BG,MAAMhB,KAAMiB,OAAQC,UAAWC,OAAQC,SAAUC,woBAGxDC,KAAKtB,KAAMiB,OAAQI,aAE5B3B,MAAQM,KACRP,QAAUwB,OACVtB,UAAYyB,aAGRG,SAAWC,SAASf,cAAc,IAAMQ,QAC5CM,SAASE,iBAAiB,SAAUC,OACD,iBAA3BA,EAAEC,OAAOC,QAAQC,OAA2B,KACxC/B,MAAQ4B,EAAEC,OAAOC,QAAQE,gBACzBC,MAAM,qBAAuBjC,OA/CzBA,CAAAA,YACZD,cAAgB2B,SAASf,cAAc,2BAA6BX,OACpED,eACAA,cAAcmC,aAEdT,SAAWC,SAASf,cAAc,IAAMhB,SACxCwC,SAAWT,SAASf,cAAc,6BAClCwB,SAAU,KACNC,WACJvC,UAAUwC,SAASC,cACXC,KAAO,gBAAkB3C,MAAQ,IAAM0C,QAAU,IAAMtC,MAAQ,iBAC/DiC,MAAM,qBAAuBM,OACjCH,WAAaV,SAASc,cAAc,UACzBtC,KAAO,SAClBkC,WAAWG,KAAOA,KAClBH,WAAWK,MAAQ,GACnBN,SAASO,sBAAsB,aAAcN,qBAE3CO,QAAU,IAAIC,YAAY,cAAe,CAACC,OAAQ7C,QACxDyB,SAASqB,cAAcH,WA6BnBI,CAAW/C,mBAKfgD,eAAiBtB,SAASuB,iBAAiB,0CACtCC,EAAI,EAAGA,EAAIF,eAAeG,OAAQD,IAAK,KACxCnD,cAAgBiD,eAAeE,gBAC/BjB,MAAM,gBAAkBlC,cAAciC,IAC1ClC,sBAAsBC,cAAemD,OAGrCE,OAAS1B,SAASf,cAAc,WAAaQ,WAC7CiC,OAAQ,KACJC,aAAe3B,SAASf,cAAc,aAAeU,OAAS,yBAC9DgC,cACAA,aAAanB,SAEjBkB,OAAOzB,iBAAiB,SAAUC,QAC1B0B,yBAA2B,eAAiBnC,OAC5ChB,YAAcoD,SAAS3B,EAAEC,OAAO2B,KAAKC,+BAA+BhB,OAGpEiB,cAAgB,WACHtC,iBACHD,mBACKhB,0BAEf8B,MAAMyB,eAEV9B,EAAEC,OAAO2B,KAAKC,+BAA+BhB,MAAQtC,YAAc,EAGnEyB,EAAEC,OAAO2B,KAAK1B,QAAQ6B,WAAY,EAEd,IAAIC,uBAAcN,yBAdnB,mBAc2DI,cAAetC,WAC/EyC,YAAY,eAAetD,MAAK,WACpCoC,QAAU,IAAIC,YAAY,YAAa,CAACC,OAAQ1C,qBACtDsB,SAASqB,cAAcH,UAChB,KACR7B,OAAOC,OAAUC,sBAAaC,UAAUF"}
|