@agung_dhewe/webapps 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +2 -0
  3. package/jsconfig.json +10 -0
  4. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.css +2 -0
  5. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js +11 -0
  6. package/libs/fgta5js-dist/fgta5js-v1.8.3.min.js.map +1 -0
  7. package/libs/fgta5js-dist/fonts/karla-italic-latin-ext.woff2 +0 -0
  8. package/libs/fgta5js-dist/fonts/karla-italic-latin.woff2 +0 -0
  9. package/libs/fgta5js-dist/fonts/karla-normal-latin-ext.woff2 +0 -0
  10. package/libs/fgta5js-dist/fonts/karla-normal-latin.woff2 +0 -0
  11. package/libs/fgta5js-dist/fonts/karla.css +142 -0
  12. package/libs/webmodule/module-edit.css +163 -0
  13. package/libs/webmodule/module-footer.css +22 -0
  14. package/libs/webmodule/module-list.css +25 -0
  15. package/libs/webmodule/module.css +52 -0
  16. package/libs/webmodule/module.js +195 -0
  17. package/libs/webmodule/pagehelper.mjs +45 -0
  18. package/modules/generator/appgen-components.mjs +142 -0
  19. package/modules/generator/appgen-icons.mjs +6 -0
  20. package/modules/generator/appgen-io.mjs +784 -0
  21. package/modules/generator/appgen-ui-search.mjs +173 -0
  22. package/modules/generator/appgen-ui-unique.mjs +153 -0
  23. package/modules/generator/appgen-ui.mjs +1181 -0
  24. package/modules/generator/generator-context.mjs +18 -0
  25. package/modules/generator/generator-designtemplate.html +1508 -0
  26. package/modules/generator/generator-ext.html +0 -0
  27. package/modules/generator/generator-ext.mjs +3 -0
  28. package/modules/generator/generator.css +642 -0
  29. package/modules/generator/generator.mjs +195 -0
  30. package/modules/generator/generator.png +0 -0
  31. package/modules/generator/generatorEdit.html +185 -0
  32. package/modules/generator/generatorEdit.mjs +238 -0
  33. package/modules/generator/generatorList.html +32 -0
  34. package/modules/generator/generatorList.mjs +243 -0
  35. package/modules/login/login.css +11 -0
  36. package/modules/login/login.html +12 -0
  37. package/modules/login/login.mjs +111 -0
  38. package/package.json +46 -0
  39. package/percobaan/simmpan-ke-minio.js +24 -0
  40. package/src/api.js +80 -0
  41. package/src/apis/generator.api.js +226 -0
  42. package/src/apis/login.api.js +109 -0
  43. package/src/bucket.js +24 -0
  44. package/src/context.js +26 -0
  45. package/src/datalog.sql +22 -0
  46. package/src/datarecords.js +0 -0
  47. package/src/db.js +61 -0
  48. package/src/generator/createApiExtenderModule.js +54 -0
  49. package/src/generator/createApiModule.js +218 -0
  50. package/src/generator/createIcon.js +62 -0
  51. package/src/generator/createInfoAboutExtender.js +42 -0
  52. package/src/generator/createInfoLogs.js +41 -0
  53. package/src/generator/createInfoRecordExtender.js +41 -0
  54. package/src/generator/createModuleContext.js +48 -0
  55. package/src/generator/createModuleDetilEditHtml.js +110 -0
  56. package/src/generator/createModuleDetilEditMjs.js +172 -0
  57. package/src/generator/createModuleDetilListHtml.js +146 -0
  58. package/src/generator/createModuleDetilListMjs.js +73 -0
  59. package/src/generator/createModuleEjs.js +51 -0
  60. package/src/generator/createModuleExtenderHtml.js +43 -0
  61. package/src/generator/createModuleExtenderMjs.js +43 -0
  62. package/src/generator/createModuleHeaderEditHtml.js +148 -0
  63. package/src/generator/createModuleHeaderEditMjs.js +197 -0
  64. package/src/generator/createModuleHeaderListHtml.js +144 -0
  65. package/src/generator/createModuleHeaderListMjs.js +67 -0
  66. package/src/generator/createModuleMjs.js +67 -0
  67. package/src/generator/createModuleRollup.js +42 -0
  68. package/src/generator/createProgramData.js +96 -0
  69. package/src/generator/createTable.js +156 -0
  70. package/src/generator/ddl.js +475 -0
  71. package/src/generator/helper.js +149 -0
  72. package/src/generator/templates/__rollup-module.ejs +90 -0
  73. package/src/generator/templates/api-extender-module.js.ejs +0 -0
  74. package/src/generator/templates/api-module.js.ejs +818 -0
  75. package/src/generator/templates/module-context.ejs +16 -0
  76. package/src/generator/templates/module-ext-about.ejs +1 -0
  77. package/src/generator/templates/module-ext-record.ejs +1 -0
  78. package/src/generator/templates/module-ext.html.ejs +3 -0
  79. package/src/generator/templates/module-ext.mjs.ejs +21 -0
  80. package/src/generator/templates/module-logs.ejs +14 -0
  81. package/src/generator/templates/module.ejs.ejs +48 -0
  82. package/src/generator/templates/module.mjs.ejs +256 -0
  83. package/src/generator/templates/moduleDetilEdit.html.ejs +34 -0
  84. package/src/generator/templates/moduleDetilEdit.mjs.ejs +792 -0
  85. package/src/generator/templates/moduleDetilList.html.ejs +26 -0
  86. package/src/generator/templates/moduleDetilList.mjs.ejs +319 -0
  87. package/src/generator/templates/moduleHeaderEdit.html.ejs +53 -0
  88. package/src/generator/templates/moduleHeaderEdit.mjs.ejs +807 -0
  89. package/src/generator/templates/moduleHeaderList.html.ejs +24 -0
  90. package/src/generator/templates/moduleHeaderList.mjs.ejs +308 -0
  91. package/src/generator/templates/sqlAddField.ejs +3 -0
  92. package/src/generator/templates/sqlAddForeignKey.ejs +12 -0
  93. package/src/generator/templates/sqlAddUniqueIndex.ejs +4 -0
  94. package/src/generator/templates/sqlCreateTable.ejs +9 -0
  95. package/src/generator/templates/sqlDropForeignKey.ejs +3 -0
  96. package/src/generator/templates/sqlDropUniqueIndex.ejs +4 -0
  97. package/src/generator/templates/sqlModifyField.ejs +6 -0
  98. package/src/generator/trygenerate.js +83 -0
  99. package/src/generator/worker.js +389 -0
  100. package/src/helper.js +82 -0
  101. package/src/logger.js +39 -0
  102. package/src/router.js +84 -0
  103. package/src/routers/defaultLoginApi.js +29 -0
  104. package/src/routers/defaultLoginAsset.js +18 -0
  105. package/src/routers/defaultLoginPage.js +36 -0
  106. package/src/routers/defaultRootIndex.js +16 -0
  107. package/src/routers/downloadHandler.js +51 -0
  108. package/src/routers/fileUploadApi.js +15 -0
  109. package/src/routers/generatorApi.js +30 -0
  110. package/src/routers/generatorAsset.js +18 -0
  111. package/src/routers/generatorPage.js +37 -0
  112. package/src/routers/handleError.js +43 -0
  113. package/src/routers/handleModuleNotfound.js +12 -0
  114. package/src/routers/moduleApi.js +34 -0
  115. package/src/routers/modulePage.js +102 -0
  116. package/src/sequencerdoc.js +311 -0
  117. package/src/sequencerline.js +214 -0
  118. package/src/session.js +57 -0
  119. package/src/startup.js +59 -0
  120. package/src/webapps.js +239 -0
  121. package/src/workermanager.js +83 -0
  122. package/templates/_lib_debug.ejs +11 -0
  123. package/templates/_lib_production.ejs +5 -0
  124. package/templates/application.page.ejs +143 -0
  125. package/templates/generator.page.ejs +131 -0
  126. package/templates/index.page.ejs +24 -0
  127. package/templates/login.page.ejs +102 -0
  128. package/templates/moduleError.ejs +16 -0
  129. package/templates/moduleNotfound.ejs +14 -0
  130. package/webapps.code-workspace +11 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fgta5js-v1.8.3.min.js","sources":["../src/components/Component.mjs","../src/components/Input.mjs","../src/components/Textbox.mjs","../src/components/Numberbox.mjs","../src/components/Checkbox.mjs","../src/components/Datepicker.mjs","../src/components/Timepicker.mjs","../src/components/Combobox.mjs","../src/components/Filebox.mjs","../src/components/Form.mjs","../src/components/MessageBox.mjs","../src/components/Modal.mjs","../src/components/Icons.mjs","../src/components/Gridview.mjs","../src/components/ModuleData.mjs","../src/components/AppManager.mjs","../src/components/Section.mjs","../src/components/Application.mjs","../src/components/SectionCarousell.mjs","../src/components/Dialog.mjs","../src/components/Validators.mjs","../src/main.mjs","../src/components/Button.mjs","../src/components/Dataloader.mjs","../src/components/ActionButton.mjs","../src/components/ApiEndPoint.mjs"],"sourcesContent":["let counter = 0;\n\n\nexport default class Component {\n\tId;\n\tElement;\n\n\tstatic get ACTION_SHOWMENU() { return 'showmenu' }\n\tstatic get ACTION_SHOWHOME() { return 'showhome' }\n\tstatic get ACTION_APPLICATIONLOADED() { return 'applicationloaded' }\n\n\tconstructor(id) {\n\t\tif (id==undefined) {\n\t\t\tconsole.error('id component belum didefinisikan')\n\t\t}\n\n\t\tconst el = document.getElementById(id)\n\t\tif (el==null) {\n\t\t\tconsole.error(`element dengan id: '$id' tidak ditemukan di halaman`)\n\t\t}\n\n\t\tthis.Id = id\n\t\tthis.Element = el\n\t}\n\n\tstatic createSvgButton(svg, classname, fn_click) {\n\t\treturn comp_createSvgButton(svg, classname, fn_click)\n\t}\n\n\tstatic generateId() {\n\t\treturn `comp-${++counter}`;\n\t}\n\n\tstatic sleep(ms) {\n \t\treturn new Promise(resolve => setTimeout(resolve, ms))\n\t}\n\n\n\tstatic isMobileDevice() {\n\t\treturn /Mobi|Android|iPhone|iPad|iPod|BlackBerry|Opera Mini|IEMobile/i.test(navigator.userAgent);\n\t}\n\n\tstatic \tisInContainer() {\n\t\treturn window.self !== window.top;\n\t}\n\n}\n\n\nfunction comp_createSvgButton(svg, classname, fn_click) {\n\tconst btn = document.createElement('a')\n\tbtn.innerHTML = svg\n\n\tif (classname!='' && classname !=null) {\n\t\tbtn.classList.add(classname)\n\t}\n\t\n\tbtn.setAttribute('tabindex', '-1')\n\tbtn.setAttribute('href', 'javascript:void(0)')\n\n\tif (typeof fn_click === 'function') {\n\t\tbtn.addEventListener('click', (evt)=>{\n\t\t\tfn_click(evt)\n\t\t})\n\t}\n\t\n\n\treturn btn\n}\n","import Component from \"./Component.mjs\"\n\nexport default class Input extends Component {\n\t/* Construct Input */\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tinput_construct(this, id)\n\t\tthis._readValidators()\n\t}\n\t\n\t/* mengembalikan nama class contructor, misalnya 'Textbox' */\n\tget type() { return this.constructor.name }\n\n\n\tget value() { return this.Element.value }\n\tset value(v) { this.Element.value = v }\n\n\tget disabled() { return this.Element.disabled }\n\tset disabled(v) { this.Element.disabled = v }\n\n\tget placeholder() { return this.Element.getAttribute('placeholder') }\n\tset placeholder(v) { this.Element.setAttribute('placeholder', v) }\n\n\t#_form\n\tget Form() { return this.#_form }\n\tbindForm(form) { this.#_form = form }\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) { \n\t\tthis.#_ineditmode = ineditmode \n\t}\n\t\n\t#invalidMessages = {}\n\tget InvalidMessages() { return this.#invalidMessages }\n\t_readValidators() {\n\t\tlet input = this.Element\n\t\tvar prefix = 'invalid-message'\n\t\tArray.from(input.attributes).forEach(attr => {\n\t\t\tif (attr.name.startsWith(prefix)) {\n\t\t\t\tvar key = attr.name === prefix ? \"default\" : attr.name.replace(`${prefix}-`, \"\");\n\t\t\t\tthis.#invalidMessages[key] = attr.value;\n\t\t\t}\n\t\t});\n\t\tinput_readValidators(this)\n\t}\n\n\n\tnewData(initialvalue) {\n\t\tinput_newData(this, initialvalue)\n\t}\n\n\tacceptChanges() {\n\t\tinput_acceptChanges(this)\n\t}\n\t\n\treset() {\n\t\tinput_reset(this)\n\t}\n\t\n\tisChanged() { \n\t\treturn input_isChanged(this)\n\t}\n\n\t#lasterror\n\t_setLastError(msg) {\n\t\tthis.#lasterror = msg\n\t}\t\n\n\tgetLastError() {\n\t\treturn this.#lasterror\n\t}\n\n\tsetError(msg) {\n\t\tinput_setError(this, msg)\n\t}\n\n\t_setLastValue(v) {\n\t\tinput_setLastValue(this, v)\n\t}\n\n\t#lastvalue\n\tgetLastValue() {\n\t\treturn input_getLastValue(this)\n\t} \n\n\n\tgetBindingData() {\n\t\tvar binding = this.Element.getAttribute('binding')\n\t\tif (binding === null) {\n\t\t\treturn null\n\t\t} else {\n\t\t\treturn binding\n\t\t}\n\t}\n\n\tvalidate() { \n\t\t// console.log(`Validating input '${this.Id}'`)\n\t\treturn input_validate(this) \n\t}\n\n\t#_validators = {}\n\tget Validators() { return this.#_validators }\n\taddValidator(fnName, fnParams, message) {\n\t\tthis.#_validators[fnName] = {\n\t\t\tparam: fnParams,\n\t\t\tmessage: message\n\t\t}\n\t}\n\tremoveValidator(str) {\n\t\tif (this.#_validators[str] !== undefined) {\n\t\t\tdelete this.#_validators[str]\n\t\t}\t\t\t\n\t}\n\tclearValidators() {\n\t\tthis.#_validators = {}\n\t}\n\treadValidators() {\n\t\tinput_readValidators(this)\n\t}\n\n\n\t_setupDescription() {\n\t\tvar description = this.Element.getAttribute('description')\n\t\tif (description !== null && description.trim() !== '') {\n\t\t\tdescription = description.trim()\n\t\t\tconst decrdiv = document.createElement('div')\n\t\t\tdecrdiv.classList.add('fgta5-entry-description')\n\t\t\tdecrdiv.innerHTML = description\n\t\t\tthis.Nodes.Container.appendChild(decrdiv)\n\t\t}\t\t\n\t}\n\n\t#isrequired = false\n\tisRequired() { return this.#isrequired}\n\tmarkAsRequired(r) {\n\t\tthis.#isrequired = r\n\t\tinput_markAsRequired(this, r)\n\t}\n\n\n\taddEventListener(evt, callback) {\n\t\tthis.Listener.addEventListener(evt, callback)\n\t}\n\n\n\t#handlers = {}\n\tget Handlers() { return this.#handlers }\n\thandle(name, fn) {\n\t\tthis.#handlers[name] = fn\n\t}\n\n\n\tgetErrorValidation(fnName) {\n\t\treturn input_getErrorValidation(this, fnName)\n\t}\n\n\n}\n\nfunction input_construct(self, id) {\n\tconst container = document.createElement('div')\n\tconst lastvalue = document.createElement('input')\n\n\tlastvalue.setAttribute('type', 'hidden') \n\tlastvalue.classList.add('fgta5-entry-lastvalue')\n\n\tcontainer.classList.add('fgta5-entry-container')\n\n\tself.InitialValue = '';\n\n\tself.Element.getInputCaption = () => {\n\t\treturn self.Id;\n\t}\n\n\tself.Listener = new EventTarget()\n\tself.Nodes = {\n\t\tInput: self.Element,\n\t\tContainer: container,\n\t\tLastValue: lastvalue,\n\t}\n\n\n}\n\n\nfunction input_setError(self, msg) {\n\tvar errdiv = self.Nodes.Container.querySelector('.fgta5-entry-error')\n\tif (msg!== null && msg !== '') {\n\t\tself.Nodes.Input.setAttribute('invalid', 'true')\n\t\tif (!errdiv) {\n\t\t\t errdiv = document.createElement('div')\n\t\t\t errdiv.classList.add('fgta5-entry-error')\n\t\t\t self.Nodes.Container.insertBefore(errdiv, self.Nodes.InputWrapper.nextSibling)\n\t\t}\n\t\terrdiv.innerHTML = msg\n\t\tself._setLastError(msg)\n\t} else {\n\t\tself.Nodes.Input.removeAttribute('invalid')\n\t\tif (errdiv) {\n\t\t\terrdiv.remove()\n\t\t}\n\t\tself._setLastError(null)\n\t}\n}\n\n\nfunction input_setLastValue(self, v) {\n\tself.Nodes.LastValue.value = v\n}\n\nfunction input_getLastValue(self) {\n\treturn self.Nodes.LastValue.value\n}\n\nfunction input_newData(self, initialvalue) {\n\tself.value = initialvalue\n\tself.acceptChanges()\n}\n\nfunction input_acceptChanges(self) {\n\tself._setLastValue(self.Nodes.Input.value)\n\tself.Nodes.Input.removeAttribute('changed')\n\tself.setError(null)\n}\n\nfunction input_reset(self) {\n\tself.Nodes.Input.value = self.Nodes.LastValue.value\n\tself.acceptChanges()\n}\n\nfunction input_isChanged(self) {\n\t// bandingkan nilai last value dan input value\n\t// bandingkan langsung dari nilai yang ada di element, jangan gunakan self.getLastValue dan self.value\n\t// karena nilai dari properti self.value dan method getLastValue bisa di modif sesuai tipe component\n\tif (self.Nodes.LastValue.value != self.Nodes.Input.value) {\n\t\tconsole.log(`Input '${self.Id}' is changed from '${self.Nodes.LastValue.value}' to '${self.Nodes.Input.value}'`)\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\n\nfunction input_getErrorValidation(self, fnName) {\n\tconst validatorData = self.Validators[fnName]\n\tconst fnValidate = $validators[fnName];\n\tconst fnParams = validatorData.param;\n\tconst fnMessage = validatorData.message;\n\tconst input = self.Nodes.Input\n\n\ttry {\n\t\tif (typeof fnValidate !== 'function') {\n\t\t\tvar err = new Error(`Validator function '${fnName}' is not defined or not a function`)\n\t\t\tconsole.error(err);\n\t\t\tthrow err\n\t\t}\n\n\t\tvar valid = fnValidate(input.value, fnParams)\n\t\tif (!valid) {\n\t\t\tvar defmsg = self.InvalidMessages['default']\n\t\t\tif (fnMessage!=null) {\n\t\t\t\tthrow new Error(fnMessage)\n\t\t\t} else if (defmsg != null) {\n\t\t\t\tthrow new Error(defmsg)\n\t\t\t} else {\n\t\t\t\tthrow new Error( `Invalid value '${input.value}' for '${input.getInputCaption()}' using validator '${fnName}(${fnParams??''})'` )\n\t\t\t}\n\t\t}\n\t\treturn null\n\t} catch(err) {\n\t\treturn err\n\t}\n}\n\n\nfunction input_validate(self) {\n\t// prioritas untama untuk proses validasi adalah required\n\t// jalankan validasi required dulu,\n\t// baru kemudian loop validasi yang lain, tapi kemudian skip required karena telah dieksekusi\n\n\tconst vnamereq = 'required'\n\tif (self.Validators[vnamereq]!=null) {\n\t\tvar err = input_getErrorValidation(self, vnamereq) // prioritas utama untuk validasi\n\t\tif (err!=null) {\n\t\t\tself.setError(err.message)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t// lanjutkan untuk validasi berikutnya\n\tfor (const fnName in self.Validators) {\n\t\tif (fnName==vnamereq) {\n\t\t\tcontinue\n\t\t}\n\t\tvar err = input_getErrorValidation(self, fnName) \n\t\tif (err!=null) {\n\t\t\tself.setError(err.message)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tself.setError(null)\n\treturn true\n}\n\n\nfunction clearTime(dt) {\n\tdt.setHours(0)\n\tdt.setMinutes(0)\n\tdt.setSeconds(0)\n}\n\nfunction input_readValidators(self) {\n\tconst cname = self.Nodes.Input.getAttribute('fgta5-component')\n\tvar attrname = ''\n\n\tattrname = 'minlength'\n\tvar minlength = self.Nodes.Input.getAttribute(attrname)\n\tif (minlength != null) {\n\t\tminlength = parseInt(minlength)\n\t\tif (!isNaN(minlength)) {\n\t\t\tself.addValidator(attrname, minlength, self.InvalidMessages[attrname])\n\t\t}\n\t}\n\n\tattrname = 'maxlength'\n\tvar maxlength = self.Nodes.Input.getAttribute(attrname)\n\tif (maxlength != null) {\n\t\tmaxlength = parseInt(maxlength)\n\t\tif (!isNaN(maxlength)) {\n\t\t\tself.addValidator(attrname, maxlength, self.InvalidMessages[attrname])\n\t\t}\n\t}\n\n\tattrname = 'pattern'\n\tvar pattern = self.Nodes.Input.getAttribute(attrname)\n\tif (pattern != null) {\n\t\tif (pattern.trim() !== '') {\n\t\t\tself.addValidator('pattern', pattern, self.InvalidMessages[attrname])\n\t\t}\n\t}\n\n\n\tattrname = 'min'\n\tvar min = self.Nodes.Input.getAttribute(attrname)\n\tif (min != null) {\n\t\tvar msg = self.InvalidMessages[attrname]\n\t\tif (cname==\"Datepicker\") {\n\t\t\tvar mindate = new Date(min)\n\t\t\tclearTime(mindate)\n\t\t\tself.addValidator('mindate', mindate, msg)\n\t\t} else if (cname==\"Timepicker\") {\n\t\t\tvar mintime = min\n\t\t\tself.addValidator('mintime', mintime, msg)\n\t\t} else {\n\t\t\tmin = parseInt(min)\n\t\t\tif (!isNaN(min)) {\n\t\t\t\tself.addValidator(attrname, min, msg)\n\t\t\t}\n\t\t}\n\t}\n\n\tattrname = 'max'\n\tvar max = self.Nodes.Input.getAttribute(attrname)\n\tif (max != null) {\n\t\tvar msg = self.InvalidMessages[attrname]\n\t\tif (cname==\"Datepicker\") {\n\t\t\tvar maxdate = new Date(max)\n\t\t\tclearTime(maxdate)\n\t\t\tself.addValidator('maxdate', maxdate, msg)\n\t\t} else if (cname==\"Timepicker\") {\n\t\t\tvar maxtime = max\n\t\t\tself.addValidator('maxtime', maxtime, msg)\n\t\t} else {\n\t\t\tmax = parseInt(max)\n\t\t\tif (!isNaN(max)) {\n\t\t\t\tself.addValidator(attrname, max, msg)\n\t\t\t}\n\t\t}\n\t}\n\n\n\tvar validator = self.Nodes.Input.getAttribute('validator')\n\tif (validator != null && validator.trim() !== '') {\n\t\tvalidator = validator.split(',')\n\t\tfor (var i=0; i<validator.length; i++) {\n\t\t\tvar str = validator[i].trim()\n\t\t\tvar { fnName, fnParams } = $fgta5.Validators.parseFunctionParam(str)\n\t\t\tself.addValidator(fnName, fnParams, self.InvalidMessages[fnName])\n\t\t}\n\t}\n}\n\nfunction input_markAsRequired(self, required) {\n\tvar attrname = 'required'\n\tvar label = self.Nodes.Label;\n\tif (label!=null && label !=undefined) {\n\t\tif (required) {\n\t\t\tself.Nodes.Label.setAttribute(attrname, '')\n\t\t\tself.Nodes.Input.setAttribute(attrname, '')\n\t\t\tself.addValidator(attrname, null, self.InvalidMessages[attrname])\n\t\t} else {\n\t\t\tself.Nodes.Label.removeAttribute(attrname)\n\t\t\tself.Nodes.Input.removeAttribute(attrname)\n\t\t\tself.removeValidator(attrname)\n\t\t}\n\t}\n}","import Input from \"./Input.mjs\"\n\nconst InputEvent = (data)=>{ return new CustomEvent('input', data) }\nconst BlurEvent = (data)=>{ return new CustomEvent('blur', data) }\nconst KeydownEvent = (data)=> { return new KeyboardEvent('keydown', data) }\n\n\n\n\nexport default class Textbox extends Input {\n\n\tconstructor(id) {\n\t\tsuper(id)\n\t\ttxt_construct(this, id)\n\t}\n\n\tget value() { return txt_GetValue(this) }\n\tset value(v) { txt_SetValue(this, v) }\n\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) {\n\t\tthis.#_ineditmode = ineditmode\n\t\ttxt_setEditingMode(this, ineditmode)\n\t}\n\n\tnewData(initialvalue) {\n\t\tsuper.newData(initialvalue)\n\t}\n\n\tgetLastValue() {\n\t\treturn txt_getLastValue(this)\n\t} \n\n\tisChanged() { \n\t\treturn txt_isChanged(this)\n\t}\n\n\tfocus() {\n\t\tthis.Nodes.Input.focus()\n\t}\n\n}\n\n\n\nfunction txt_construct(self, id) {\n\tconst container = self.Nodes.Container\n\tconst lastvalue = self.Nodes.LastValue\n\tconst input = self.Nodes.Input\n\tconst wrapinput = document.createElement('div')\n\tconst label = document.querySelector(`label[for=\"${id}\"]`)\n\t\n\n\t// setup container, (harus di awal seblum yang lain-lain)\n\t// diperlukan untuk menampung semua element yang akan ditampilkan\n\tinput.parentNode.insertBefore(container, input)\n\n\n\t// tambahkan elemen-element ke container\n\t// penambahakn container ke body document pada saat Input_construct di parent class Input\n\twrapinput.appendChild(input)\n\tcontainer.appendChild(wrapinput)\n\tcontainer.appendChild(lastvalue)\n\n\n\t// tambahkan referensi elemen ke Nodes\n\tself.Nodes.InputWrapper = wrapinput\n\tself.Nodes.Label = label \n\n\n\t// setup container\n\tcontainer.setAttribute('fgta5-component', 'Textbox')\n\tcontainer.setAttribute('input-id', id)\n\tif (input.style.width!='') {\n\t\tcontainer.style.width = input.style.width\n\t}\n\tif (input.style.marginTop!='') {\n\t\tcontainer.style.marginTop = input.style.marginTop\n\t\tinput.style.marginTop = ''\n\t}\n\tif (input.style.marginBottom!='') {\n\t\tcontainer.style.marginBottom = input.style.marginBottom\n\t\tinput.style.marginBottom=''\n\t}\n\tif (input.style.marginLeft!='') {\n\t\tcontainer.style.marginLeft = input.style.marginLeft\n\t\tinput.style.marginLeft=''\n\t}\n\tif (input.style.marginRight!='') {\n\t\tcontainer.style.marginRight = input.style.marginRight\n\t\tinput.style.marginRight=''\n\t}\n\n\n\n\t// setup wrapper\n\twrapinput.classList.add('fgta5-entry-input-wrapper')\n\n\n\t// setup input\n\tinput.classList.add('fgta5-entry-input')\n\tinput.getInputCaption = () => {\n\t\tif (label!=null) {\n\t\t\treturn label.innerHTML\n\t\t} else {\n\t\t\treturn input.getAttribute('placeholder')\n\t\t}\n\t}\n\tconst nonFgtaClasses = Array.from(input.classList).filter(className =>\n\t\t!className.startsWith('fgta5-')\n\t);\n\tfor (var classname of nonFgtaClasses) {\n\t\tinput.classList.remove(classname)\n\t\tcontainer.classList.add(classname)\n\t}\n\n\tconst tabIndex = input.getAttribute('data-tabindex')\n\tif (tabIndex!=null) {\n\t\tinput.setAttribute('tabindex', tabIndex)\n\t}\n\n\n\t// label\n\tif (label!=null) {\n\t\tlabel.classList.add('fgta5-entry-label')\n\t}\n\t\n\n\n\t// set input value\n\tself._setLastValue(self.value)\n\n\t// set input description\n\tself._setupDescription()\n\n\t\n\t// aditional property setup\n\t// background\n\tif (input.style.backgroundColor !== '') {\n\t\twrapinput.style.backgroundColor = input.style.backgroundColor\n\t\tinput.style.backgroundColor = 'transparent'\n\t}\n\n\t// character casing\n\tvar charCase = input.getAttribute('character-case') \n\tif (charCase !== null && charCase.trim() !== '') {\n\t\tinput.charCase = charCase.trim().toLowerCase()\n\t}\n\n\t// required field\n\tvar required = input.getAttribute('required')\n\tif (required != null) {\n\t\tself.markAsRequired(true)\n\t}\n\n\n\t// internal event listener\n\tinput.addEventListener(\"input\", (evt)=>{\n\t\tself.Listener.dispatchEvent(InputEvent({}))\n\t\t\n\t\t// jika tidak ada form, tidak ada perubahan change notifications\n\t\tif (self.Form==null) {\n\t\t\treturn\n\t\t}\n\n\t\tif (self.getLastValue() != self.value) {\n\t\t\tinput.setAttribute('changed', 'true')\n\t\t} else {\n\t\t\tinput.removeAttribute('changed')\n\t\t}\n\t})\n\n\tinput.addEventListener('blur', (evt)=> {\n\t\ttxt_blur(self, evt)\n\t\tself.Listener.dispatchEvent(BlurEvent({}))\n\t})\t\n\n\tinput.addEventListener('keydown', (evt)=>{\n\t\tconst e = KeydownEvent({\n\t\t\tcancelable: true,\n\t\t\tkey: evt.key,\n\t\t\tcode: evt.code,\n\t\t\tctrlKey: evt.ctrlKey,\n\t\t\taltKey: evt.altKey,\n\t\t\tshiftKey: evt.shiftKey,\n\t\t\tsrcElement: evt.srcElement,\n\t\t\ttarget: evt.target\n\t\t})\n\t\tself.Listener.dispatchEvent(e)\n\n\t\tif (e.defaultPrevented) {\n\t\t\tevt.preventDefault()\n\t\t}\n\t})\n\t\n}\n\nfunction txt_getValueCased(self, v) {\n\tvar value = v\n\tvar input = self.Nodes.Input\n\tif (input.charCase === 'uppercase') {\n\t\tvalue = v.toUpperCase()\n\t} else if (input.charCase === 'lowercase') {\n\t\tvalue = v.toLowerCase()\n\t}\n\treturn value\n}\n\n\nfunction txt_GetValue(self) {\n\tvar input = self.Nodes.Input\n\tvar value = txt_getValueCased(self, input.value)\n\treturn value\n}\n\nfunction txt_SetValue(self, v) {\n\tif (v===null || v===undefined) {\n\t\tv=''\n\t}\n\tself.Element.value = txt_getValueCased(self, v)\n}\n\n\n\nfunction txt_isChanged(self) {\n\tvar lastvalue = self.getLastValue()\n\tvar currentvalue = self.value\n\tif (currentvalue!=lastvalue) {\n\t\tconsole.log(`Textbox '${self.Id}' is changed from '${lastvalue}' to '${currentvalue}'`)\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunction txt_getLastValue(self) {\n\tvar lastvalue = self.Nodes.LastValue.value\n\treturn txt_getValueCased(self, lastvalue)\n}\n\nfunction txt_setEditingMode(self, ineditmode) {\n\tvar attrval = ineditmode ? 'true' : 'false'\n\tself.Nodes.Input.setAttribute('editmode', attrval)\n\tself.Nodes.InputWrapper.setAttribute('editmode', attrval)\n\n\tif (ineditmode) {\n\t\tself.Nodes.Input.removeAttribute('readonly')\n\t} else {\n\t\tself.Nodes.Input.setAttribute('readonly', 'true')\n\t\tself.setError(null)\n\t}\n}\n\n\nfunction txt_blur(self, e) {\n\tif (self.InEditMode) {\n\t\tself.setError(null)\n\t\tself.validate()\n\t}\n}\n\n","import Input from \"./Input.mjs\"\n\n\nconst ChangeEvent = (data)=>{ return new CustomEvent('change', data) }\n\n\nexport default class Numberbox extends Input {\n\n\tconstructor(id) {\n\t\tsuper(id)\n\n\n\t\t// default formatter angka\n\t\t// apabila akan diubah, lakukan di fungsi: nmb_formatValue(self, value)\n\t\tthis.formatterFixed = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t\tuseGrouping: true // apakah akan di group per ribuan\n\t\t});\n\n\t\tnmb_construct(this, id)\n\t}\n\n\tget value() { return nmb_getValue(this) }\n\tset value(v) { nmb_setValue(this, v) }\n\t\t\n\t\t\n\n\n\tget disabled() { return this.Element.disabled }\n\tset disabled(v) { \n\t\tthis.Element.disabled = v \n\t\tnmb_setDisabled(this, v)\n\t}\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) {\n\t\tthis.#_ineditmode = ineditmode\n\t\tnmb_setEditingMode(this, ineditmode)\n\t}\n\n\n\tnewData(initialvalue) {\n\t\tif (initialvalue===undefined || initialvalue===null) {\n\t\t\tinitialvalue = 0\n\t\t}\n\t\tsuper.newData(initialvalue)\n\t}\n\n\n\tacceptChanges() {\n\t\tsuper.acceptChanges()\n\t\tnmb_acceptChanges(this)\n\t\t\n\t}\n\n\treset() {\n\t\tsuper.reset()\n\t\tnmb_Reset(this)\n\t}\n\n\tsetError(msg) {\n\t\tsuper.setError(msg)\n\t\tnmb_setError(this, msg)\n\t}\n\n\n\tgetLastValue() {\n\t\treturn nmb_getLastValue(this)\n\t} \n\n\n\tfocus() {\n\t\tthis.Nodes.Display.focus()\n\t}\n}\n\n\n\nfunction nmb_construct(self, id) {\n\tconst container = self.Nodes.Container\n\tconst lastvalue = self.Nodes.LastValue\n\tconst input = self.Nodes.Input\n\tconst wrapinput = document.createElement('div')\n\tconst display = document.createElement('input')\n\tconst label = document.querySelector(`label[for=\"${id}\"]`)\n\n\n\t// setup container, (harus di awal seblum yang lain-lain)\n\t// diperlukan untuk menampung semua element yang akan ditampilkan\n\tinput.parentNode.insertBefore(container, input)\n\n\n\t// tambahkan elemen-element ke container\n\t// penambahakn container ke body document pada saat Input_construct di parent class Input\n\twrapinput.appendChild(display)\n\twrapinput.appendChild(input)\n\tcontainer.appendChild(wrapinput)\n\tcontainer.appendChild(lastvalue)\n\n\n\t// tambahkan referensi elemen ke Nodes\n\tself.Nodes.InputWrapper = wrapinput\n\tself.Nodes.Label = label \n\tself.Nodes.Display = display\n\n\n\t// setup container\n\tcontainer.setAttribute('fgta5-component', 'Numberbox')\n\n\n\t// setup wrapper\n\twrapinput.classList.add('fgta5-entry-input-wrapper')\n\t\n\t\n\t// precission and step\n\tconst {precision, step} = getPrecission(self.Element.getAttribute('precision'))\n\tself.formatterFixed.minimumFractionDigits = precision\n\tself.formatterFixed.maximumFractionDigits = precision // minimum dan maksimum jumlah angka di belakang koma di set sama\n\n\n\n\n\t// setup input\n\tinput.classList.add('fgta5-entry-input')\n\tinput.maxlength = input.getAttribute('maxlength') \n\tinput.precision = precision\n\tinput.setAttribute('type', 'hidden')\n\tinput.setAttribute('step', step)\n\tinput.getInputCaption = () => { return label.innerHTML }\n\t\n\n\t// setup display\n\tdisplay.id = self.Id + '-display'\n\tdisplay.min = input.min\n\tdisplay.max = input.max\n\tdisplay.maxlength = input.maxlength\n\tdisplay.required = input.required\n\tdisplay.value = self.formatterFixed.format(input.value)\n\tdisplay.classList.add('fgta5-entry-display')\n\tdisplay.setAttribute('precision', precision)\n\tdisplay.setAttribute('step', step)\n\tdisplay.setAttribute('style', input.getAttribute('style') || '')\n\tdisplay.setAttribute('type', 'text')\n\tdisplay.setAttribute('fgta5-component', 'Numberbox')\n\tdisplay.setAttribute('autocomplete', 'off')\n\t\n\n\tconst tabIndex = input.getAttribute('data-tabindex')\n\tif (tabIndex!=null) {\n\t\tdisplay.setAttribute('tabindex', tabIndex)\n\t}\n\n\tconst dis = input.getAttribute('disabled')\n\tif (dis!=null) {\n\t\tnmb_setDisabled(self, true)\n\t}\n\n\tconst digitgrouping = input.getAttribute('digitgrouping') \n\tif (digitgrouping!=null) {\n\t\tif (digitgrouping.toLowerCase()==='false') {\n\t\t\tself.formatterFixed.useGrouping=false\n\t\t} else {\n\t\t\tself.formatterFixed.useGrouping=true\n\t\t}\n\t}\n\n\n\t// label\n\tlabel.setAttribute('for', display.id)\n\tlabel.classList.add('fgta5-entry-label')\n\n\n\t// additional property setup\n\tvar required = input.getAttribute('required')\n\tif (required != null) {\n\t\tself.markAsRequired(true)\n\t}\n\n\n\tif (input.value === null || input.value === '') {\n\t\tinput.value = 0\n\t}\n\n\tself._setLastValue(input.value)\n\tself._setupDescription()\n\n\n\t// internal event listener\n\tdisplay.addEventListener('focus', (e)=>{\n\t\tnmb_displayFocus(self, e)\n\t})\n\n\tdisplay.addEventListener('blur', (e)=>{\n\t\tnmb_displayBlur(self, e)\n\t})\n\n\tdisplay.addEventListener(\"input\", (e)=>{\n\t\tif (display.value !== lastvalue.value) {\n\t\t\tdisplay.setAttribute('changed', 'true')\n\t\t} else {\n\t\t\tdisplay.removeAttribute('changed')\n\t\t}\n\t})\n\n\tdisplay.addEventListener(\"keydown\", (e)=>{\n\t\tif (display.type === \"number\" && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n \te.preventDefault();\n \t}\n\t})\n\n\n\t// batasi panjang entri data sesuai maxlength yang di set\n\tvar maxlegth = display.maxlength\n\tif (maxlegth !== null && maxlegth.trim() !== '') {\n\t\tmaxlegth = parseInt(maxlegth.trim())\n\t\tif (!isNaN(maxlegth) && maxlegth > 0) {\n\t\t\tdisplay.addEventListener('beforeinput', (e)=>{\n\t\t\t\tif (e.target.value.length >= maxlegth && e.inputType !== \"deleteContentBackward\" && e.inputType !== \"deleteContentForward\") {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n}\n\n\nfunction getPrecission(precision) {\n\t// var precision = self.Element.getAttribute('precision')\n\tif (precision !== null && precision.trim() !== '') {\n\t\tprecision = parseInt(precision.trim())\n\t\tif (isNaN(precision) || precision < 0) {\n\t\t\tprecision = 0\n\t\t}\n\t} else {\n\t\tprecision = 0\n\t}\n\tvar step = Math.pow(10, -precision);\n\n\treturn {\n\t\tprecision: precision,\n\t\tstep: step\n\t}\n}\n\n\nfunction nmb_getValue(self) {\n\tvar num = Number(self.Nodes.Input.value)\n\treturn num\n}\n\n\nfunction nmb_setValue(self, v) {\n\tself.Nodes.Input.value = v\n\n\tif (isNaN(v)) {\n\t\tv = Number(v) // v buka Angka, ubah dulu ke angka\n\t}\n\tvar formattedValue = nmb_formatValue(self, v)\n\tif (self.Nodes.Display.type === 'text') {\n\t\tself.Nodes.Display.value = formattedValue\n\t} else {\n\t\tself.Nodes.Display.value = v\n\t}\n\n\tnmb_markChanged(self)\n}\n\n\nfunction nmb_setDisabled(self, v) {\n\tif (v) {\n\t\tself.Nodes.Display.disabled = true\n\t} else {\n\t\tself.Nodes.Display.disabled = false\n\t}\n}\n\nfunction nmb_setEditingMode(self, ineditmode) {\n\tvar attrval = ineditmode ? 'true' : 'false'\n\n\tself.Nodes.Display.setAttribute('editmode', attrval)\n\tself.Nodes.Input.setAttribute('editmode', attrval)\n\tself.Nodes.InputWrapper.setAttribute('editmode', attrval)\n\n\tif (ineditmode) {\n\t\tself.Nodes.Input.removeAttribute('readonly')\n\t\tself.Nodes.Display.removeAttribute('readonly')\n\t} else {\n\t\tself.Nodes.Input.setAttribute('readonly', 'true')\n\t\tself.Nodes.Display.setAttribute('readonly', 'true')\n\t\tself.setError(null)\n\t}\n}\n\nfunction nmb_displayFocus(self, e) {\n\tvar display = self.Nodes.Display\n\tvar input = self.Nodes.Input\n\t\n\tif (self.InEditMode) {\n\t\tdisplay.setAttribute('type', 'number')\n\t\n\t\tvar num = Number(input.value)\n\t\tdisplay.value = num\n\t}\n}\n\nfunction nmb_displayBlur(self, e) {\n\tvar display = self.Nodes.Display\n\tvar input = self.Nodes.Input\n\t\n\tif (self.InEditMode) {\n\t\tvar num = Number(display.value)\n\t\tif (isNaN(num)) {\n\t\t\tself.Listener.dispatchEvent(ChangeEvent({detail: {invalid:true}}))\n\t\t\tself.setError('Invalid number')\n\t\t} else {\n\t\t\tself.setError(null)\n\t\t\t\n\t\t\tinput.value = num\n\t\t\tvar invalid = !self.validate()\n\t\t\tvar formattedValue = nmb_formatValue(self, num)\n\t\t\tdisplay.setAttribute('type', 'text')\n\t\t\tdisplay.value = formattedValue\n\n\t\t\tself.Listener.dispatchEvent(ChangeEvent({detail: {invalid:invalid, value:num, formatted:formattedValue}}))\n\t\t}\n\n\t}\n}\n\n\nfunction nmb_formatValue(self, value) {\n\tconst formatter = new Intl.NumberFormat('en-US', {\n\t\t\tminimumFractionDigits: self.formatterFixed.minimumFractionDigits,\n\t\t\tmaximumFractionDigits: self.formatterFixed.minimumFractionDigits,\n\t\t\tuseGrouping: self.formatterFixed.useGrouping\n\t});\n\n\tconst formattedValue = formatter.format(value)\n\treturn formattedValue\n}\n\nfunction nmb_acceptChanges(self) {\n\tself.Nodes.Display.removeAttribute('changed')\n}\n\nfunction nmb_Reset(self) {\n\tself.value = self.getLastValue()\n}\n\nfunction nmb_setError(self, msg) {\n\tvar display = self.Nodes.Display\n\tif (msg!== null && msg !== '') {\n\t\tdisplay.setAttribute('invalid', 'true')\n\t} else {\n\t\tdisplay.removeAttribute('invalid')\n\t}\n}\n\n\nfunction nmb_markChanged(self) {\n\tvar input = self.Nodes.Input\n\tvar display = self.Nodes.Display\n\t\n\tif (self.value!=self.getLastValue()) {\n\t\tinput.setAttribute('changed', 'true')\n\t\tdisplay.setAttribute('changed', 'true')\n\t} else {\n\t\tinput.removeAttribute('changed')\n\t\tdisplay.removeAttribute('changed')\n\t}\n}\n\nfunction nmb_getLastValue(self) {\n\tvar lastvalue = Number(self.Nodes.LastValue.value)\n\treturn lastvalue\n}\n","import Input from \"./Input.mjs\"\n\n\nconst CheckedEvent = (data)=>{ return new CustomEvent('checked', data) }\nconst UnCheckedEvent = (data)=>{ return new CustomEvent('unchecked', data) }\n\n/*\n* reference:\n* https://moderncss.dev/pure-css-custom-checkbox-style/\n*/\n\n\nexport default class Checkbox extends Input {\n\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tchk_construct(this, id)\n\t}\n\n\tget value() { return chk_getValue(this) }\n\tset value(v) {\n\t\tchk_setValue(this, v)\n\t}\n\n\n\tget disabled() { return chk_getDisabled(this) }\n\tset disabled(v) { \n\t\tthis.Element.disabled = v \n\t\tchk_setDisabled(this, v)\n\t}\n\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) {\n\t\tthis.#_ineditmode = ineditmode\n\t\tchk_setEditingMode(this, ineditmode)\n\t}\n\n\tnewData(initialvalue) {\n\t\tsuper.newData(initialvalue)\n\t\tchk_NewData(this, initialvalue)\n\t}\n\n\tgetLastValue() {\n\t\treturn chk_getLastValue(this)\n\t} \n\n\tisChanged() { \n\t\treturn chk_isChanged(this)\n\t}\n\n\treset() {\n\t\tchk_Reset(this)\n\t}\n\n\t_setLastValue(v) {\n\t\tchk_setLastValue(this, v)\n\t}\n}\n\n\n\nfunction chk_construct(self, id) {\n\tconst container = self.Nodes.Container\n\tconst lastvalue = self.Nodes.LastValue\n\tconst input = self.Nodes.Input\n\tconst label = document.querySelector(`label[for=\"${id}\"]`)\n\tconst checkboxlabel = document.createElement(\"label\")\n\n\n\t// setup container, (harus di awal seblum yang lain-lain)\n\t// diperlukan untuk menampung semua element yang akan ditampilkan\n\tinput.parentNode.insertBefore(container, input)\n\n\n\n\n\t// tambahkan elemen-element ke container\n\t// penambahakn container ke body document pada saat Input_construct di parent class Input\n\tcheckboxlabel.appendChild(input)\n\tcheckboxlabel.appendChild(document.createTextNode(label.innerHTML))\n\tcontainer.appendChild(checkboxlabel)\n\tcontainer.appendChild(lastvalue)\n\n\n\t// tambahkan referensi elemen ke Nodes\n\tself.Nodes.Label = label \n\t\n\t\n\t// setup container\n\tcontainer.setAttribute('fgta5-component', 'Checkbox')\n\n\t// setup input\n\tinput.classList.add('fgta5-checkbox-input')\n\n\tconst tabIndex = input.getAttribute('data-tabindex')\n\tif (tabIndex!=null) {\n\t\tinput.setAttribute('tabindex', tabIndex)\n\t}\n\n\t\n\t// setup checkbox label untuk menampung checkbox\n\tcheckboxlabel.classList.add('fgta5-checkbox')\n\t\n\t\n\t// ganti original label tag menjadi div \n\t// karena label di form harus mereferensi ke input\n\t// sedangkan label di checkbox kita fungsikan sebagai text pada checkbox untuk di klik\n\tvar replLabel = document.createElement('div')\n\treplLabel.innerHTML = \"&nbsp\";\n\treplLabel.style.display = \"inline-block\"\n\treplLabel.setAttribute('label', '')\n\tlabel.parentNode.replaceChild(replLabel, label);\n\n\n\t// inisialisasi last value\n\tself._setLastValue(self.Element.checked)\n\n\n\n\n\tconst dis = input.getAttribute('disabled')\n\tif (dis!=null) {\n\t\tchk_setDisabled(self, true)\n\t}\n\n\t// tambahkan event listener internal\n\tinput.addEventListener('change', (event) => {\n\t\tchk_checkedChanged(self)\t\t\n\t});\n\n}\n\nfunction chk_getDisabled(self) {\n\tvar disabled = self.Nodes.Input.getAttribute('permanent-disabled')\n\tif (disabled === null) {\n\t\treturn false\n\t}\n\tif (disabled === 'true') {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunction chk_setDisabled(self, v) {\n\tvar input = self.Nodes.Input\n\n\tvar editmode = input.getAttribute('editmode')\n\tvar ineditmode = ((editmode==null || editmode=='' || editmode=='false')) ? false : true\n\n\tif (v) {\n\t\tinput.setAttribute('permanent-disabled', 'true')\n\t\tinput.parentNode.setAttribute('permanent-disabled', 'true')\n\t} else {\n\t\tinput.removeAttribute('permanent-disabled')\n\t\tinput.parentNode.removeAttribute('permanent-disabled')\n\t\tif (!ineditmode) {\n\t\t\tinput.disabled = true\t\n\t\t}\n\t}\n}\n\n\nfunction chk_setEditingMode(self, ineditmode) {\n\tvar input = self.Nodes.Input\n\tvar attrval = ineditmode ? 'true' : 'false'\n\tvar permdisattr = input.getAttribute('permanent-disabled')\n\tvar permanentDisabled = ((permdisattr==null || permdisattr=='' || permdisattr=='false')) ? false : true\n\n\tinput.setAttribute('editmode', attrval)\n\tif (ineditmode) {\n\t\tif (permanentDisabled) {\n\t\t\tinput.setAttribute('disabled', 'true')\n\t\t} else {\n\t\t\tinput.removeAttribute('disabled')\n\t\t}\n\t} else {\n\t\tinput.setAttribute('disabled', 'true')\n\t}\n}\n\nfunction chk_setLastValue(self, v) {\n\tvar lastvalue = 1\n\tif (v==='off' || v==='0' || v===0 || v===false) {\n\t\tlastvalue = 0\n\t}\n\tself.Nodes.LastValue.value = lastvalue\n}\n\n\nfunction chk_checkedChanged(self) {\n\tvar input = self.Nodes.Input\n\tinput.value = input.checked ? 1 : 0\n\tif (self.getLastValue() != self.value) {\n\t\tinput.setAttribute('changed', 'true')\n\t} else {\n\t\tinput.removeAttribute('changed')\n\t}\n\n\tif (input.checked) {\n\t\tself.Listener.dispatchEvent(CheckedEvent({}))\n\t} else {\n\t\tself.Listener.dispatchEvent(UnCheckedEvent({}))\n\t}\n}\n\n\nfunction chk_isChanged(self) {\n\tvar lastvalue = self.getLastValue()\n\tvar currentvalue = self.value\n\tif (currentvalue!=lastvalue) {\n\t\t// console.log(`Checkbox '${self.Id}' is changed from '${lastvalue}' to '${currentvalue}'`)\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\n\n\nfunction chk_getBoolValue(v) {\n\tif (v===0||v==='0'||v===false||v===undefined) {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}\n}\n\n\n\nfunction chk_getValue(self) {\n\treturn self.Element.checked\n}\n\nfunction chk_setValue(self, v) {\n\tvar input = self.Nodes.Input\n\tvar checked = chk_getBoolValue(v)\n\tinput.checked = checked\n\tif (checked) {\n\t\tinput.value = 1\n\t} else {\n\t\tinput.value = 0\n\t}\n\n\tchk_markChanged(self)\n}\n\nfunction chk_getLastValue(self) {\n\tvar lastvalue = self.Nodes.LastValue.value\n\treturn chk_getBoolValue(lastvalue)\n}\n\nfunction chk_Reset(self) {\n\tvar checked = self.getLastValue()\n\tself.value = checked\n\tself._setLastValue(checked)\n}\n\n\nfunction chk_NewData(self, initialvalue) {\n\tvar checked = chk_getBoolValue(initialvalue)\n\tself.value = checked\n\tself._setLastValue(checked)\n}\n\nfunction chk_markChanged(self) {\n\tvar input = self.Nodes.Input\n\tif (self.value!=self.getLastValue()) {\n\t\tinput.setAttribute('changed', 'true')\n\t} else {\n\t\tinput.removeAttribute('changed')\n\t}\n}","import Input from \"./Input.mjs\"\n\n\nconst button_icon = `<svg transform=\"translate(0 3)\" width=\"12\" height=\"12\" stroke=\"currentColor\" stroke-linecap=\"round\" version=\"1.1\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<rect x=\"1.3095\" y=\"6.6682\" width=\"21.393\" height=\"1.8579\" fill=\"none\" stroke-width=\"2\"/>\n\t\t<rect x=\".81949\" y=\"10\" width=\"22.341\" height=\"13.251\" fill=\"none\" stroke-width=\"1.02\"/>\n\t\t<rect x=\"3.8664\" y=\"1.1531\" width=\"2.5776\" height=\"1.4923\" fill=\"none\" stroke-width=\"2\"/>\n\t\t<rect x=\"17.223\" y=\"1.1203\" width=\"2.5776\" height=\"1.6958\" fill=\"none\" stroke-width=\"2\"/>\n\t\t<path d=\"m1.2888 16.278 21.367-0.13566\" fill=\"none\" stroke-width=\"1.02\"/>\n\t\t<path d=\"m8.2775 10.07-0.13566 12.888\" fill=\"none\" stroke-width=\"1.02\"/>\n\t\t<path d=\"m15.799 9.9671-0.13566 12.888\" fill=\"none\" stroke-width=\"1.02\"/>\n\t\t</svg>`\n\n\n/*\n * https://weblog.west-wind.com/posts/2023/Feb/06/A-Button-Only-Date-Picker-and-JavaScript-Date-Control-Binding\n */\n\nconst ChangeEvent = (data) => { return new CustomEvent('change', data) }\n\n\nexport default class Datepicker extends Input {\n\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tdtp_construct(this, id)\n\t}\n\n\tget value() { return dtp_getValue(this) }\n\tset value(v) { dtp_setValue(this, v) }\n\n\n\tget min() { \n\t\tif (this.Element.min!=\"\") {\n\t\t\tvar dt = new Date(this.Element.min );\n\t\t\treturn dt\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t}\n\tset min(v) {\n\t\tif (v instanceof Date) {\n\t\t\tthis.Element.min = v.toISOString().split(\"T\")[0]\n\t\t} else if (typeof v === \"string\") {\n\t\t\tthis.Element.min = v\n\t\t}\n\t}\n\n\tget max() { \n\t\tif (this.Element.max!=\"\") {\n\t\t\tvar dt = new Date(this.Element.max);\n\t\t\treturn dt\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t}\n\tset max(v) {\n\t\tif (v instanceof Date) {\n\t\t\tthis.Element.max = v.toISOString().split(\"T\")[0]\n\t\t} else if (typeof v === \"string\") {\n\t\t\tthis.Element.max = v\n\t\t}\n\t}\n\n\n\tget disabled() { return this.Element.disabled }\n\tset disabled(v) { \n\t\tthis.Element.disabled = v \n\t\tdtp_setDisabled(this, v)\n\t}\n\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) {\n\t\tthis.#_ineditmode = ineditmode\n\t\tdtp_setEditingMode(this, ineditmode)\n\t}\n\n\n\n\n\tnewData(initialvalue) {\n\t\tif (initialvalue===undefined || initialvalue===null) {\n\t\t\tinitialvalue = ''\n\t\t}\n\t\t// super.newData(initialvalue)\n\t\tdtp_Newdata(this, initialvalue)\n\t}\n\n\tacceptChanges() {\n\t\tsuper.acceptChanges()\n\t\tdtp_acceptChanges(this)\n\t\t\n\t}\n\n\treset() {\n\t\tsuper.reset()\n\t\tdtp_reset(this)\n\t}\n\n\tsetError(msg) {\n\t\tsuper.setError(msg)\n\t\tdtp_setError(this, msg)\n\t}\n\n\tgetLastValue() {\n\t\treturn dtp_getLastValue(this)\n\t} \n\n\n\tfocus() {\n\t\tthis.Nodes.Display.focus()\n\t}\t\n}\n\nfunction dtp_construct(self, id) {\n\tconst container = self.Nodes.Container\n\tconst lastvalue = self.Nodes.LastValue\n\tconst input = self.Nodes.Input\n\tconst wrapinput = document.createElement('div')\n\tconst display = document.createElement('input')\n\tconst button = document.createElement('button')\n\tconst label = document.querySelector(`label[for=\"${id}\"]`)\n\n\n\n\t// setup container, (harus di awal seblum yang lain-lain)\n\t// diperlukan untuk menampung semua element yang akan ditampilkan\n\tinput.parentNode.insertBefore(container, input)\n\n\n\t// tambahkan elemen-element ke container\n\t// penambahakn container ke body document pada saat Input_construct di parent class Input\n\twrapinput.appendChild(display)\n\twrapinput.appendChild(button)\n\tbutton.appendChild(input)\n\tcontainer.appendChild(wrapinput)\n\tcontainer.appendChild(lastvalue)\n\n\n\t// tambahkan referensi elemen ke Nodes\n\tself.Nodes.InputWrapper = wrapinput\n\tself.Nodes.Label = label \n\tself.Nodes.Display = display\n\tself.Nodes.Button = button\n\n\t\n\n\n\t// setup container\n\tcontainer.setAttribute('fgta5-component', 'Datepicker')\n\tif (input.style.width!='') {\n\t\tcontainer.style.width = input.style.width\n\t}\n\tif (input.style.marginTop!='') {\n\t\tcontainer.style.marginTop = input.style.marginTop\n\t\tinput.style.marginTop = ''\n\t}\n\tif (input.style.marginBottom!='') {\n\t\tcontainer.style.marginBottom = input.style.marginBottom\n\t\tinput.style.marginBottom=''\n\t}\n\tif (input.style.marginLeft!='') {\n\t\tcontainer.style.marginLeft = input.style.marginLeft\n\t\tinput.style.marginLeft=''\n\t}\n\tif (input.style.marginRight!='') {\n\t\tcontainer.style.marginRight = input.style.marginRight\n\t\tinput.style.marginRight=''\n\t}\n\t\t\n\n\n\n\t// setup wrapper\n\twrapinput.classList.add('fgta5-entry-input-wrapper')\n\n\n\n\t// display\n\tdisplay.setAttribute('id', `${id}-display`)\n\tdisplay.setAttribute('type', 'text')\n\tdisplay.setAttribute('fgta5-component', 'Datepicker')\n\tdisplay.setAttribute('readonly', 'true')\n\tdisplay.classList.add('fgta5-entry-display')\n\tdisplay.classList.add('fgta5-entry-display-datepicker')\n\tvar placeholder = input.getAttribute('placeholder')\n\tif (placeholder!=null && placeholder !='') {\n\t\tdisplay.setAttribute('placeholder', placeholder)\n\t}\n\t// var cssclass = input.getAttribute('class')\n\t// if (cssclass!=null && cssclass !='') {\n\t// \tdisplay.setAttribute('class', cssclass)\n\t// }\n\t// var cssstyle = input.getAttribute('style')\n\t// if (cssstyle!=null && cssstyle !='') {\n\t// \tdisplay.setAttribute('style', cssstyle)\n\t// }\n\n\tconst tabIndex = input.getAttribute('data-tabindex')\n\tif (tabIndex!=null) {\n\t\tdisplay.setAttribute('tabindex', tabIndex)\n\t}\n\n\t// main input\n\tconst nonFgtaClasses = Array.from(input.classList).filter(className =>\n\t\t!className.startsWith('fgta5-')\n\t);\n\n\tinput.setAttribute('type', 'date')\n\tinput.removeAttribute('class')\n\tinput.removeAttribute('style')\n\tinput.classList.add('fgta5-entry-input')\n\tinput.classList.add('fgta5-entry-input-datepicker')\n\tinput.getInputCaption = () => {\n\t\tif (label!=null) {\n\t\t\treturn label.innerHTML\n\t\t} else {\n\t\t\treturn input.getAttribute('placeholder')\n\t\t}\n\t}\n\t\n\tfor (var classname of nonFgtaClasses) {\n\t\t// console.log(classname)\n\t\tinput.classList.remove(classname)\n\t\tdisplay.classList.remove(classname)\n\t\tcontainer.classList.add(classname)\n\t}\n\n\n\n\t// picker button\n\tbutton.id = self.Id + '-button'\n\tbutton.insertAdjacentHTML(\"beforeend\", button_icon)\n\tbutton.classList.add('fgta5-entry-button-datepicker')\t\n\n\n\t// label\n\tif (label!=null) {\n\t\tlabel.setAttribute('for', button.id)\n\t\tlabel.classList.add('fgta5-entry-label')\n\t}\n\n\n\tconst dis = input.getAttribute('disabled')\n\tif (dis!=null) {\n\t\tdtp_setDisabled(self, true)\n\t}\n\n\n\t// additional property setup\n\n\t// required\n\tconst required = input.getAttribute('required')\n\tif (required != null) {\n\t\tself.markAsRequired(true)\n\t}\n\n\tif (input.value != null && input.value != '') {\n\t\tself.value = input.value\n\t\tself._setLastValue(input.value)\n\t\tself.acceptChanges()\n\t}\n\n\t\n\t// set input description\n\tself._setupDescription()\n\n\n\n\t// internal event\n\tinput.addEventListener('change', (e)=>{\n\t\tdtp_changed(self)\n\t})\n\n\n}\n\n\n\nfunction dtp_setDisabled(self, v) {\n\tvar display = self.Nodes.Display\n\tvar inputwrap = self.Nodes.InputWrapper\n\tvar button = self.Nodes.Button\n\t\n\tif (v) {\n\t\tdisplay.disabled = true\n\t\tinputwrap.setAttribute('disabled', 'true')\n\t\tbutton.setAttribute('disabled', 'true')\n\t} else {\n\t\tdisplay.disabled = false\n\t\tinputwrap.removeAttribute('disabled')\n\t\tbutton.removeAttribute('disabled')\n\t}\n}\n\n\nfunction dtp_setEditingMode(self, ineditmode) {\n\tvar attrval = ineditmode ? 'true' : 'false'\n\tvar input = self.Nodes.Input\n\tvar display = self.Nodes.Display\n\tvar inputwrap = self.Nodes.InputWrapper\n\n\tdisplay.setAttribute('editmode', attrval)\n\tinput.setAttribute('editmode', attrval)\n\tinputwrap.setAttribute('editmode', attrval)\n\n\tif (ineditmode) {\n\t\tinput.removeAttribute('readonly')\n\t} else {\n\t\tinput.setAttribute('readonly', 'true')\n\t\tself.setError(null)\n\t}\n}\n\n\nfunction dtp_getValue(self) {\n\tif (self.Nodes.Input.value=='') {\n\t\treturn null\n\t} else {\n\t\treturn dtp_getIsoDateValue(self.Nodes.Input.value) \n\t}\n}\n\n\nfunction dtp_setValue(self, dt) {\n\ttry {\n\n\t\tif (dt!=null) {\n\t\t\tif (dt instanceof Date) {\n\t\t\t\tconst isoformat = dt.toISOString()\n\t\t\t\tconst isodate = isoformat.slice(0, 10)\n\t\t\t\tself.Nodes.Input.value = isodate\n\t\t\t} else {\n\t\t\t\tconst isodate = dt.slice(0, 10)\n\t\t\t\tself.Nodes.Input.value = isodate\n\t\t\t}\n\t\t} else {\n\t\t\tself.Nodes.Input.value = null\n\t\t}\n\t\t\n\n\t\tdtp_setDisplay(self, dt)\n\t\tdtp_markChanged(self)\n\t} catch (err) {\n\t\tthrow err\n\t}\n\n}\n\n\nfunction dtp_Newdata(self, initialvalue) {\n\tself.value = initialvalue\n\tself.acceptChanges()\n}\n\n\nfunction dtp_acceptChanges(self) {\n\tself.Nodes.Display.removeAttribute('changed')\n}\n\nfunction dtp_reset(self) {\n\tvar lastvalue = self.getLastValue()\n\tif (lastvalue==null) {\n\t\tself.value = ''\n\t} else {\n\t\tself.value = lastvalue\n\t}\n}\n\nfunction dtp_changed(self) {\n\tvar input = self.Nodes.Input\n\tdtp_setDisplay(self, input.value)\n\n\t// trigger object change\n\ttry {\n\t\tself.Listener.dispatchEvent(ChangeEvent({\n\t\t\tsender: self,\n\t\t\tdetail: {value: input.value, sender: self}\n\t\t}))\n\t} catch (err) {\n\t\tconsole.error(err.message)\n\t}\n\t\n\t\n\tdtp_markChanged(self)\n\tif (self.InEditMode) {\n\t\tself.setError(null)\n\t\tself.validate()\n\t}\n}\n\n\nfunction dtp_getIsoDateValue(v) {\n\tvar dt\n\tif (typeof v==='string') {\n\t\tdt = new Date(v)\n\t} else if (v instanceof Date) {\n\t\tdt = v\n\t} \n\treturn dt.toISOString().split(\"T\")[0]\n}\n\n// function dtp_getFormattedValue(isodate) {\n// \tvar date = new Date(isodate);\n// var options = { day: '2-digit', month: 'short', year: 'numeric' };\n// \tvar formattedDate = date.toLocaleDateString('en-ID', options).replace('.', ''); \n// \treturn formattedDate\n// }\n\n\nfunction dtp_markChanged(self) {\n\tif (self.Form==null) {\n\t\treturn\n\t}\n\n\tvar display = self.Nodes.Display\n\tif (self.value!=self.getLastValue()) {\n\t\tdisplay.setAttribute('changed', 'true')\n\t} else {\n\t\tdisplay.removeAttribute('changed')\n\t}\n}\n\nfunction dtp_setDisplay(self, dtiso) {\n\tvar display = self.Nodes.Display\n\tif (dtiso=='') {\n\t\tdisplay.value = ''\n\t} else {\n\t\tconst date = new Date(dtiso);\n\t\tconst options = { day: '2-digit', month: 'short', year: 'numeric' };\n\t\tconst formattedDate = date.toLocaleDateString('en-ID', options).replace('.', ''); \n\t\tdisplay.value = formattedDate\n\t}\n}\n\n\nfunction dtp_setError(self, msg) {\n\tvar display = self.Nodes.Display\n\tif (msg!== null && msg !== '') {\n\t\tdisplay.setAttribute('invalid', 'true')\n\t} else {\n\t\tdisplay.removeAttribute('invalid')\n\t}\n}\n\nfunction dtp_getLastValue(self) {\n\tvar lastvalue = self.Nodes.LastValue.value\n\tif (lastvalue=='') {\n\t\treturn null\n\t} else {\n\t\treturn lastvalue\n\t}\n}\n\n","import Input from \"./Input.mjs\"\n\nconst timeRegex = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n\nconst button_icon = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg transform=\"translate(0 3)\" width=\"12\" height=\"12\" stroke=\"currentColor\" stroke-linecap=\"round\" version=\"1.1\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m12.339 12.142 0.01403-6.5322\" fill=\"none\" stroke-width=\"2\"/>\n<path d=\"m8.4232 14.469 3.7103-1.9861\" fill=\"none\" stroke-width=\"2.4\"/>\n<ellipse cx=\"12.004\" cy=\"11.983\" rx=\"10.102\" ry=\"9.9964\" fill=\"none\" stroke-width=\"2.4\"/>\n</svg>\n\n`\n\n\n/*\n * https://weblog.west-wind.com/posts/2023/Feb/06/A-Button-Only-Date-Picker-and-JavaScript-Date-Control-Binding\n */\nexport default class Timepicker extends Input {\n\tconstructor(id) {\n\t\tsuper(id)\n\t\ttpck_construct(this, id)\n\t}\n\n\tget min() { return this.Element.min }\n\tset min(v) { this.Element.min = v }\n\n\tget max() { return this.Element.max }\n\tset max(v) { this.Element.max = v }\n\n\n\tget value() { return tpck_getValue(this) }\n\tset value(v) { tpck_setValue(this, v) }\n\n\tget disabled() { return this.Element.disabled }\n\tset disabled(v) { \n\t\tthis.Element.disabled = v \n\t\ttpck_setDisabled(this, v)\n\t}\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) {\n\t\tthis.#_ineditmode = ineditmode\n\t\ttpck_setEditingMode(this, ineditmode)\n\t}\n\n\t\n\tnewData(initialvalue) {\n\t\tif (initialvalue=='' || initialvalue==null) {\n\t\t\tinitialvalue = '00:00'\n\t\t}\n\t\tsuper.newData(initialvalue)\n\t\t// tpck_Newdata(this, initialvalue)\n\t}\n\n\tacceptChanges() {\n\t\tsuper.acceptChanges()\n\t\ttpck_acceptChanges(this)\n\t\t\n\t}\n\n\treset() {\n\t\tsuper.reset()\n\t\ttpck_reset(this)\n\t}\n\t\n\n\tsetError(msg) {\n\t\tsuper.setError(msg)\n\t\ttpck_setError(this, msg)\n\t}\n\n\tgetLastValue() {\n\t\treturn tpck_getLastValue(this)\n\t} \n\n\tfocus() {\n\t\tthis.Nodes.Display.focus()\n\t}\t\n}\n\n\n\n\nfunction tpck_construct(self, id) {\n\tconst container = self.Nodes.Container\n\tconst lastvalue = self.Nodes.LastValue\n\tconst input = self.Nodes.Input\n\tconst wrapinput = document.createElement('div')\n\tconst display = document.createElement('input')\n\tconst button = document.createElement('button')\n\tconst label = document.querySelector(`label[for=\"${id}\"]`)\n\n\t// setup container, (harus di awal seblum yang lain-lain)\n\t// diperlukan untuk menampung semua element yang akan ditampilkan\n\tinput.parentNode.insertBefore(container, input)\n\t\n\n\n\t// tambahkan elemen-element ke container\n\t// penambahakn container ke body document pada saat Input_construct di parent class Input\n\twrapinput.appendChild(display)\n\twrapinput.appendChild(button)\n\tbutton.appendChild(input)\n\tcontainer.appendChild(wrapinput)\n\tcontainer.appendChild(lastvalue)\n\n\n\t// tambahkan referensi elemen ke Nodes\n\tself.Nodes.InputWrapper = wrapinput\n\tself.Nodes.Label = label \n\tself.Nodes.Display = display\n\tself.Nodes.Button = button\n\n\n\t// setup container\n\tcontainer.setAttribute('fgta5-component', 'Timepicker')\n\n\n\t// setup wrapper\n\twrapinput.classList.add('fgta5-entry-input-wrapper')\n\n\n\t// display\n\tdisplay.setAttribute('id', `${id}-display`)\n\tdisplay.setAttribute('type', 'text')\n\tdisplay.setAttribute('picker', 'time')\n\tdisplay.setAttribute('fgta5-component', 'Timepicker')\n\tdisplay.setAttribute('readonly', 'true')\n\tdisplay.classList.add('fgta5-entry-display')\n\tdisplay.classList.add('fgta5-entry-display-datepicker')\n\tvar placeholder = input.getAttribute('placeholder')\n\tif (placeholder!=null && placeholder !='') {\n\t\tdisplay.setAttribute('placeholder', placeholder)\n\t}\n\tvar cssclass = input.getAttribute('class')\n\tif (cssclass!=null && cssclass !='') {\n\t\tdisplay.setAttribute('class', cssclass)\n\t}\n\tvar cssstyle = input.getAttribute('style')\n\tif (cssstyle!=null && cssstyle !='') {\n\t\tdisplay.setAttribute('style', cssstyle)\n\t}\n\n\tconst tabIndex = input.getAttribute('data-tabindex')\n\tif (tabIndex!=null) {\n\t\tdisplay.setAttribute('tabindex', tabIndex)\n\t}\n\n\t// main input\n\tinput.setAttribute('type', 'time')\n\tinput.setAttribute('picker', 'time')\n\tinput.removeAttribute('class')\n\tinput.removeAttribute('style')\n\tinput.classList.add('fgta5-entry-input')\n\tinput.classList.add('fgta5-entry-input-datepicker')\n\tinput.getInputCaption = () => {\n\t\treturn label.innerHTML\n\t}\n\n\t\n\t// picker button\n\tbutton.id = self.Id + '-button'\n\tbutton.insertAdjacentHTML(\"beforeend\", button_icon)\n\tbutton.classList.add('fgta5-entry-button-datepicker')\t\n\n\n\t// label\n\tlabel.setAttribute('for', button.id)\n\tlabel.classList.add('fgta5-entry-label')\n\n\n\n\n\t// additional property setup\n\n\t// required field\n\tvar required = input.getAttribute('required')\n\tif (required != null) {\n\t\tself.markAsRequired(true)\n\t}\n\n\tif (input.value == null || input.value == '') {\n\t\tinput.value = '00:00'\n\t}\n\tself.value = input.value\n\tself._setLastValue(input.value)\n\tself.acceptChanges()\n\n\n\t// set input description\n\tself._setupDescription()\n\n\n\tinput.addEventListener('change', (e)=>{\n\t\ttpck_changed(self)\n\t})\n}\n\n\nfunction tpck_setDisabled(self, v) {\n\tvar display = self.Nodes.Display\n\tvar inputwrap = self.Nodes.InputWrapper\n\tvar button = self.Nodes.Button\n\n\tif (v) {\n\t\tdisplay.disabled = true\n\t\tinputwrap.setAttribute('disabled', 'true')\n\t\tbutton.setAttribute('disabled', 'true')\n\t} else {\n\t\tdisplay.disabled = false\n\t\tinputwrap.removeAttribute('disabled')\n\t\tbutton.removeAttribute('disabled')\n\t}\n}\n\n\nfunction tpck_setEditingMode(self, ineditmode) {\n\tvar attrval = ineditmode ? 'true' : 'false'\n\tvar input = self.Nodes.Input\n\tvar display = self.Nodes.Display\n\tvar inputwrap = self.Nodes.InputWrapper\n\n\tdisplay.setAttribute('editmode', attrval)\n\tinput.setAttribute('editmode', attrval)\n\tinputwrap.setAttribute('editmode', attrval)\n\n\tif (ineditmode) {\n\t\tinput.removeAttribute('readonly')\n\t} else {\n\t\tinput.setAttribute('readonly', 'true')\n\t\tself.setError(null)\n\t}\n}\n\n\nfunction tpck_acceptChanges(self) {\n\tself.Nodes.Display.removeAttribute('changed')\n}\n\nfunction tpck_reset(self) {\n\tvar lastvalue = self.getLastValue()\n\tif (lastvalue==null) {\n\t\tself.value = ''\n\t} else {\n\t\tself.value = lastvalue\n\t}\n}\n\n\nfunction tpck_changed(self) {\n\tvar input = self.Nodes.Input\n\ttpck_setDisplay(self, input.value)\n\t\n\ttpck_markChanged(self)\n\tif (self.InEditMode) {\n\t\tself.setError(null)\n\t\tself.validate()\n\t}\n}\n\n\nfunction tpck_markChanged(self) {\n\tvar display = self.Nodes.Display\n\tif (self.value!=self.getLastValue()) {\n\t\tdisplay.setAttribute('changed', 'true')\n\t} else {\n\t\tdisplay.removeAttribute('changed')\n\t}\n}\n\n\n\nfunction tpck_getValue(self) {\n\tvar input = self.Nodes.Input\n\tif (input.value=='') {\n\t\treturn null\n\t} else {\n\t\treturn input.value\n\t}\n}\n\n\n\nfunction tpck_setValue(self, dt) {\n if (!timeRegex.test(dt)) {\n\t\tthrow new Error(`invalid HH:ss format for '${dt}'`)\n\t}\n\n\tself.Nodes.Input.value = dt\n\ttpck_setDisplay(self, dt)\n\ttpck_markChanged(self)\n}\n\n\nfunction tpck_setDisplay(self, tm) {\n\tself.Nodes.Display.value = tm\n}\n\nfunction tpck_setError(self, msg) {\n\tvar display = self.Nodes.Display\n\tif (msg!== null && msg !== '') {\n\t\tdisplay.setAttribute('invalid', 'true')\n\t} else {\n\t\tdisplay.removeAttribute('invalid')\n\t}\n}\n\n\nfunction tpck_getLastValue(self) {\n\tvar lastvalue = self.Nodes.LastValue.value\n\tif (lastvalue=='') {\n\t\treturn null\n\t} else {\n\t\treturn lastvalue\n\t}\n}\n","'use strict';\n\nimport Input from \"./Input.mjs\"\n\nconst SelectedEvent = (data) => { return new CustomEvent('selected', data) }\nconst PopulatingEvent = (data) => { return new CustomEvent('populating', data) }\nconst SelectingEvent = (data) => { return new CustomEvent('selecting', data) }\n\n\nconst icon_cbo_button = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg transform=\"translate(0 3)\" width=\"12\" height=\"12\" stroke-linecap=\"round\" version=\"1.1\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n<path transform=\"matrix(.8169 0 0 -.64538 10.987 14.119)\" d=\"m11.299 11.275h-10.157l-10.157-1e-6 10.157-17.593 5.0786 8.7965z\"/>\n</svg>\n`\n\nconst icon_cbo_close = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg transform=\"translate(0 3)\" width=\"12\" height=\"12\" stroke=\"currentColor\" stroke-linecap=\"round\" version=\"1.1\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m3.5642 20.295 16.853-16.833\" fill=\"none\" stroke-width=\"4\"/>\n<path d=\"m3.5741 3.4523 16.833 16.853\" fill=\"none\" stroke-width=\"4\"/>\n</svg>`\n\n\n\nconst ATTR_EDITMODE = 'editmode'\nconst ATTR_SHOWED = 'showed'\nconst ATTR_REMOVING = 'removing'\nconst ATTR_SELECTED = 'selected'\nconst ATTR_INDEX = 'data-index'\n\nconst DEF_LIMIT = 30\n\nexport default class Combobox extends Input {\n\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tcbo_construct(this, id)\n\t}\n\n\tget value() { return cbo_getValue(this) }\n\tset value(v) { throw Error('Value is readonly') }\n\n\tget text() { return cbo_getText(this) }\n\tset text(v) { throw Error('Text is readonly') }\n\n\tget disabled() { return this.Element.disabled }\n\tset disabled(v) { \n\t\tthis.Element.disabled = v \n\t\tcbo_setDisabled(this, v)\n\t}\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) {\n\t\tthis.#_ineditmode = ineditmode\n\t\tcbo_SetEditingMode(this, ineditmode)\n\t}\n\n\tnewData(initialdata) {\n\t\tcbo_newData(this, initialdata)\n\t}\n\n\tacceptChanges() {\n\t\tsuper.acceptChanges()\n\t\tcbo_acceptChanges(this)\n\t}\n\t\n\treset() {\n\t\tcbo_reset(this)\n\t}\n\n\tclear() {\n\t\tcbo_clear(this)\n\t}\n\n\t_setLastValue(v, t) {\n\t\tsuper._setLastValue(v)\n\t\tcbo_setLastValue(this, v, t)\n\t}\n\n\tgetLastValue() {\n\t\treturn cbo_getLastValue(this)\n\t} \n\n\tgetLastText() {\n\t\treturn cbo_getLastText(this)\n\t} \n\n\tsetSelected(value, text) {\n\t\tif (text===undefined || text===null) {\n\t\t\ttext = value\n\t\t}\n\t\tcbo_setSelected(this, value, text)\n\t}\n\n\tgetDisplayBinding() {\n\t\treturn this.Nodes.Input.getAttribute('data-display')\n\t}\n\n\taddOptions(data) {\n\t\tcbo_addOptions(this, data)\n\t}\n\n\tsetOptions(data) {\n\t\tcbo_setOptions(this, data)\n\t}\n\n\t\n\n\t#iswaiting = false\n\tisWaiting() { return this.#iswaiting }\n\twait(iswaiting) {\n\t\tthis.#iswaiting = iswaiting===undefined ? true : iswaiting\n\t\tcbo_wait(this, iswaiting)\n\t}\n\t\n\t// untuk keperluan abort fetch data yang dibatalkan\n\t// apabila belum selesai tapi dialog sudah ditutup\n\tAbortHandler = null\n\n\n\tHasStaticOption = null\n\n\n\n\tfocus() {\n\t\tthis.Nodes.Display.focus()\n\t}\n}\n\n\nfunction cbo_setSelected(self, value, text) {\n\tself.Nodes.Input.value = value\n\tself.Nodes.Display.value = text\n\tcbo_markChanged(self)\n}\n\nfunction cbo_construct(self, id) {\n\tconst container = self.Nodes.Container\n\tconst lastvalue = self.Nodes.LastValue\n\tconst input = self.Nodes.Input\n\tconst wrapinput = document.createElement('div')\n\tconst display = document.createElement('input')\n\tconst button = document.createElement('button')\n\tconst label = document.querySelector(`label[for=\"${id}\"]`)\n\tconst datalist = input.parentNode.querySelector(`datalist[for=\"${id}\"]`)\n\tconst dialog = document.createElement('dialog')\n\tconst lasttext = document.createElement('input')\n\n\n\t// setup container, (harus di awal seblum yang lain-lain)\n\t// diperlukan untuk menampung semua element yang akan ditampilkan\n\tinput.parentNode.insertBefore(container, input)\n\n\n\t// tambahkan elemen-element ke container\n\t// penambahakn container ke body document pada saat Input_construct di parent class Input\n\twrapinput.appendChild(input)\n\twrapinput.appendChild(display)\n\twrapinput.appendChild(button)\n\tcontainer.appendChild(wrapinput)\n\tcontainer.appendChild(lastvalue)\n\tcontainer.appendChild(lasttext)\n\tcontainer.appendChild(dialog) \n\n\n\t// tambahkan referensi elemen ke Nodes\n\tself.Nodes.InputWrapper = wrapinput\n\tself.Nodes.Label = label \n\tself.Nodes.Display = display\n\tself.Nodes.Button = button\n\tself.Nodes.Dialog = dialog\n\tself.Nodes.LastText = lasttext\n\n\n\t// setup container\n\tcontainer.setAttribute('fgta5-component', 'Combobox')\n\tif (input.style.width!='') {\n\t\tcontainer.style.width = input.style.width\n\t}\n\tif (input.style.marginTop!='') {\n\t\tcontainer.style.marginTop = input.style.marginTop\n\t\tinput.style.marginTop = ''\n\t}\n\tif (input.style.marginBottom!='') {\n\t\tcontainer.style.marginBottom = input.style.marginBottom\n\t\tinput.style.marginBottom=''\n\t}\n\tif (input.style.marginLeft!='') {\n\t\tcontainer.style.marginLeft = input.style.marginLeft\n\t\tinput.style.marginLeft=''\n\t}\n\tif (input.style.marginRight!='') {\n\t\tcontainer.style.marginRight = input.style.marginRight\n\t\tinput.style.marginRight=''\n\t}\n\n\n\t// setup wrapper\n\twrapinput.classList.add('fgta5-entry-input-wrapper')\n\n\t// setup input\n\tinput.classList.add('fgta5-entry-input')\n\tinput.setAttribute('type', 'hidden')\n\tinput.getInputCaption = () => {\n\t\tif (label!=null) {\n\t\t\treturn label.innerHTML\n\t\t} else {\n\t\t\treturn input.getAttribute('placeholder')\n\t\t}\n\t}\n\tconst nonFgtaClasses = Array.from(input.classList).filter(className =>\n\t\t!className.startsWith('fgta5-')\n\t);\n\tfor (var classname of nonFgtaClasses) {\n\t\tinput.classList.remove(classname)\n\t\tcontainer.classList.add(classname)\n\t}\n\n\n\t// setup display\n\tdisplay.id = self.Id + '-display'\n\tdisplay.classList.add('fgta5-entry-display')\n\tdisplay.setAttribute('style', input.getAttribute('style') || '')\n\tdisplay.setAttribute('type', 'text')\n\tdisplay.setAttribute('readonly', 'true')\n\tdisplay.setAttribute('fgta5-component', 'Combobox')\n\tdisplay.setAttribute('placeholder', input.getAttribute('placeholder'))\n\tdisplay.setAttribute('tabindex', '-1')\n\t\n\tdisplay.required = input.required\n\n\tconst dis = input.getAttribute('disabled')\n\tif (dis!=null) {\n\t\tcbo_setDisabled(self, true)\n\t}\n\n\tconst tabIndex = input.getAttribute('data-tabindex')\n\tif (tabIndex!=null) {\n\t\tbutton.setAttribute('tabindex', tabIndex)\n\t}\n\n\t// setup button\n\tbutton.setAttribute('type', 'button')\n\tbutton.classList.add('fgta5-entry-button-combobox')\t\n\tbutton.innerHTML = icon_cbo_button\n\tbutton.addEventListener('click', (e)=>{\n\t\tcbo_buttonClick(self, e)\n\t})\n\n\n\t// setup lasttext\n\tlasttext.setAttribute('type', 'hidden')\n\n\t// setup label\n\tif (label!=null) {\n\t\tlabel.setAttribute('for', display.id)\n\t\tlabel.classList.add('fgta5-entry-label')\n\t}\n\n\n\t// required field\n\tvar required = input.getAttribute('required')\n\tif (required != null) {\n\t\tself.markAsRequired(true)\n\t}\n\n\t// dialog\n\tif (datalist!=null) {\n\t\tself.HasStaticOption = true\n\t}\n\tcbo_createDialog(self, dialog)\n\tdialog.addEventListener(\"cancel\", (e)=>{\n\t\tdialog.setAttribute(ATTR_REMOVING, 'true')\n\t\te.preventDefault()\n\t\tsetTimeout(() => {\n\t\t\tdialog.close()\n\t\t\tdialog.removeAttribute(ATTR_REMOVING)\n\t\t\tdialog.removeAttribute(ATTR_SHOWED)\n\t\t\tcbo_closed(self)\n\t\t}, 200);\n });\n\n\tdialog.addEventListener('close', (evt)=>{\n\t\tcbo_dialogClose(self)\n\t})\n\n\t\n\n\t// datalist\n\tif (datalist!=null) {\n\t\tdatalist.remove()\n\t\tvar opt = cbo_createStaticOptions(self, dialog, datalist)\n\t\tif (opt.default!=null) {\n\t\t\tinput.value = opt.default.value\n\t\t\tdisplay.value = opt.default.text\n\t\t}\n\n\t\tif (opt.count>0) {\n\t\t\tself.HasStaticOption = true\n\t\t}\n\t} else {\n\t\tinput.value = ''\n\t\tdisplay.value = ''\n\t}\n\n\n\t// baca attribut kelengkapan combobox\n\tself._read\n\n\t// set input description\n\tself._setupDescription()\n\tself._setLastValue(input.value, display.value)\n\t\n}\n\n\nfunction cbo_getValue(self) {\n\tvar input = self.Nodes.Input\n\tif (input.value=='') {\n\t\treturn null\n\t} else {\n\t\treturn input.value\n\t}\n}\n\nfunction cbo_getText(self) {\n\treturn self.Nodes.Display.value\n}\n\n\nfunction cbo_newData(self, initialdata) {\n\tvar input = self.Nodes.Input\n\tvar display = self.Nodes.Display\n\n\n\tif (initialdata===undefined) {\n\t\tinput.value = ''\n\t\tdisplay.value = ''\n\t} else if (typeof initialdata==='string') {\n\t\tinput.value = initialdata\n\t\tdisplay.value = initialdata\n\t} else if (initialdata!=null) {\n\t\tinput.value = initialdata.value\n\t\tdisplay.value = initialdata.text\n\t} else {\n\t\tinput.value = ''\n\t\tinput.value = ''\n\t}\n\tself.Nodes.Display.removeAttribute('changed')\n\n\tself.setError(null)\n\tself.acceptChanges()\n\n\tcbo_resetSelected(self)\n}\n\nfunction cbo_acceptChanges(self) {\n\tself.Nodes.Display.removeAttribute('changed')\n\tself._setLastValue(self.value, self.text)\n}\n\nfunction cbo_reset(self) {\n\tvar lastValue = self.getLastValue()\n\tvar lastText = self.getLastText()\n\n\tconsole.log('reset:', lastValue, lastText)\n\tself.Nodes.Input.value = lastValue\n\tself.Nodes.Display.value = lastText\n\tself.Nodes.Display.removeAttribute('changed')\n\n\tself.acceptChanges()\n}\n\nfunction cbo_setLastValue(self, v, t) {\n\tself.Nodes.LastValue.value = v\n\tself.Nodes.LastText.value = t\n}\n\nfunction cbo_setDisabled(self, v) {\n\tif (v) {\n\t\tself.Nodes.Display.disabled = true\n\t\tself.Nodes.Button.disabled = true\n\t} else {\n\t\tself.Nodes.Display.disabled = false\n\t\tself.Nodes.Button.disabled = false\n\t}\n}\n\nfunction cbo_markSelected(self, tr) {\n\ttr.setAttribute(ATTR_SELECTED, '')\n\t\n\tsetTimeout(()=>{\n\t\tlet d = tr.getAttribute('data-none')\n \t\tif (d=='') {\n\t\t\t// taruh paling atas\n\t\t\t// TODO: geser TR di awal tbody\n\t\t} else {\n\t\t\t// geser tr ke atas atau setelah none \n\t\t\tconst dialog = self.Nodes.Dialog\n\t\t\tconst tbody = dialog.getElementsByTagName('tbody')[0]\n\t\t\tconst none = tbody.querySelector('tr[data-none]')\n\t\t\tif (none!=null) {\n\t\t\t\tnone.after(tr)\t\n\t\t\t}\n\t\t}\n\t}, 100)\n\t\n}\n\n\nfunction cbo_SetEditingMode(self, ineditmode) {\n\tvar attrval = ineditmode ? 'true' : 'false'\n\n\tself.Nodes.Display.setAttribute(ATTR_EDITMODE, attrval)\n\tself.Nodes.Input.setAttribute(ATTR_EDITMODE, attrval)\n\tself.Nodes.InputWrapper.setAttribute(ATTR_EDITMODE, attrval)\n\tself.Nodes.Button.setAttribute(ATTR_EDITMODE, attrval)\n\n\tif (ineditmode) {\n\t\tself.Nodes.Input.removeAttribute('readonly')\n\t} else {\n\t\tself.Nodes.Input.setAttribute('readonly', 'true')\n\t\tself.setError(null)\n\t}\n}\n\nfunction isMobileDevice() {\n\treturn /Mobi|Android|iPhone|iPad|iPod|BlackBerry|Opera Mini|IEMobile/i.test(navigator.userAgent);\n}\n\n\nfunction cbo_selectRow(self, tr, td, value, text, data) {\n\t\t// reset dulu jika ada option yang terpilih sebelumnya\n\t\tcbo_resetSelected(self)\n\n\t\t// tandai baris yang sekarang dilih\n\t\tcbo_markSelected(self, tr)\n\n\t\tself.Nodes.Input.value = value\n\t\tif (value=='' && text=='none') {\n\t\t\tconsole.log('none dipilih')\n\t\t\tself.Nodes.Display.value = ''\n\t\t} else {\n\t\t\tself.Nodes.Display.value = text\n\t\t}\n\n\n\t\t\n\t\tcbo_userSelectValue(self, value, text, data)\n}\n\nfunction cbo_createOptionRow(self, value, text, data) {\n\tlet tr = document.createElement('tr')\n\tvar td = document.createElement('td')\n\n\ttr.classList.add('fgta-combobox-option-row')\n\ttr.setAttribute('value', value)\n\n\ttd.setAttribute('option', '')\n\ttd.setAttribute('value', value)\n\ttd.innerHTML = text\n\n\n\n\n\ttd.addEventListener('dblclick', (e)=>{\n\t\tif (isMobileDevice()) {\n\t\t\treturn\n\t\t}\n\n\t\tcbo_selectRow(self, tr, td, value, text, data)\n\t})\n\n\ttd.addEventListener('click', (e)=>{\n\t\t// click hanya untuk mobile\n\t\tif (!isMobileDevice()) {\n\t\t\treturn\n\t\t}\n\n\t\tcbo_selectRow(self, tr, td, value, text, data)\n\t\t/*\n\t\t// untuk menghindari kesalah jika melakukan double click\n\t\t// karena efek animate\n\t\tif (self.pauseClickEvent===true) {\n\t\t\treturn\n\t\t}\n\t\tself.pauseClickEvent = true\n\t\tsetTimeout(()=>{\n\t\t\tself.pauseClickEvent = false\n\t\t}, 500)\n\t\t*/\n\t})\n\n\ttr.appendChild(td)\n\n\n\n\t// CATATAN:\n\t// dispatch event di sini tidak berlaku untuk static options\n\t// karena event handler pada main program baru akan diexekusi setelah pembuatan content option statis\n\tself.Listener.dispatchEvent(PopulatingEvent({\n\t\tdetail: {\n\t\t\tvalue: value,\n\t\t\ttext: text,\n\t\t\ttr: tr,\n\t\t\tdata: data\n\t\t}\n\t}))\n\n\n\t// tandai baris pilihan ini jika merupakan opsi yang dipilih user saat ini\n\tvar valueselected=self.value??''\n\tif (value==valueselected) {\n\t\tcbo_markSelected(self, tr)\n\t}\n\n\n\treturn tr\n} \n\nfunction cbo_createStaticOptions(self, dialog, datalist) {\n\tconst options = datalist.getElementsByTagName(\"option\");\n\t\n\tconst thead = dialog.getElementsByTagName('thead')[0]\n\tconst tbody = dialog.getElementsByTagName('tbody')[0]\n\tconst tfoot = dialog.getElementsByTagName('tfoot')[0]\n\tvar defaultOption = null\n\t\n\tthead.style.display='none'\n\ttfoot.style.display='none'\n\n\n\t// jika tidak harus diisi,\n\t// tambahkan opsi none\n\tif (!self.isRequired()) {\n\t\tvar tr = cbo_createOptionRow(self, '', 'none', {})\n\t\ttr.setAttribute('data-none', '')\n\t\ttr.setAttribute(ATTR_INDEX, 0)\n\t\ttbody.appendChild(tr)\n\t}\n\n\t// selanjutnya isi data berdasar options default\n\tvar i = 0\n\tfor (let option of options) {\n\t\ti++\n\t\tlet text = option.textContent || option.innerText\n\t\tlet value = (option.value==null || option.value=='') ? text : option.value\n\n\t\tvar def = option.getAttribute('default')\n\t\tif (def!=null) {\n\t\t\tdefaultOption = {\n\t\t\t\tvalue: value,\n\t\t\t\ttext: text\n\t\t\t}\n\t\t}\n\n\t\tvar idx = tbody.rows.length - 1\n\t\tvar tr = cbo_createOptionRow(self, value, text, { option: option })\n\t\t\n\t\ttr.setAttribute(ATTR_INDEX, idx)\n\t\ttbody.appendChild(tr)\n\t}\n\n\treturn {\n\t\tcount: i,\n\t\tdefault: defaultOption\n\t}\n\n}\n\nfunction cbo_createDialog(self, dialog) {\n\tdialog.classList.add('fgta5-combobox-dialog')\n\t\n\n\n\t// buat header dialog\n\tvar head = document.createElement('div')\n\thead.classList.add('fgta5-combobox-dialog-head')\n\thead.innerHTML = self.Nodes.Input.getInputCaption()\n\tdialog.appendChild(head)\n\n\t// tombol tutup dialog (tanpa memilih)\n\tvar btnClose = document.createElement('button')\n\tbtnClose.setAttribute('type', 'button')\n\tbtnClose.innerHTML = icon_cbo_close\n\thead.appendChild(btnClose)\n\n\n\n\t\n\t// filtering\n\tif (!self.HasStaticOption) {\n\t\tvar srccontainer = document.createElement('div')\n\t\tvar srcinput = document.createElement('input')\n\t\tvar srcbuton = document.createElement('button')\n\t\tvar btnnext = document.createElement('a')\n\n\t\t\n\t\tsrcinput.setAttribute('placeholder', 'Search')\n\t\tsrcinput.setAttribute('maxlength', 30)\n\t\tsrcinput.addEventListener('keypress', (evt)=>{\n\t\t\tif (evt.key===\"Enter\") {\n\t\t\t\tsrcbuton.click()\n\t\t\t}\n\t\t})\n\t\t\n\t\tsrcbuton.setAttribute('type', 'type')\n\t\tsrcbuton.innerHTML = 'Submit'\n\t\tsrcbuton.addEventListener('click', (evt)=>{\n\t\t\tvar searchtext = srcinput.value\n\t\t\tvar limit = DEF_LIMIT\n\t\t\tvar offset = 0\n\n\t\t\tbtnnext.searchtext = searchtext\n\t\t\tcbo_resetSelected(self)\n\t\t\tcbo_search(self, searchtext, limit, offset)\n\t\t})\n\n\t\tsrccontainer.classList.add('fgta5-combobox-dialog-filter')\n\t\tsrccontainer.appendChild(srcinput)\n\t\tsrccontainer.appendChild(srcbuton)\n\t\tdialog.appendChild(srccontainer)\n\n\t}\n\n\n\n\n\n\n\t// template tabel dialog\n\tvar table = document.createElement('table')\n\tvar thead = document.createElement('thead')\n\tvar tbody = document.createElement('tbody')\n\tvar tfoot = document.createElement('tfoot')\n\tdialog.appendChild(table)\n\t\n\t\n\ttable.appendChild(tbody)\n\ttable.appendChild(tfoot)\n\ttable.appendChild(thead)\n\n\n\tif (!self.HasStaticOption) {\n\t\t// siapkan tombol next,\n\t\t// jikalau nanti ada data yang panjang dan perlu paging\n\t\tbtnnext.classList.add('fgta5-combobox-dialog-nextbutton')\n\t\tbtnnext.innerHTML = 'next data'\n\t\tbtnnext.style.display = 'none'\n\t\tbtnnext.setAttribute('href', 'javascript:void(0)')\n\t\tbtnnext.addEventListener('click', (evt)=>{\n\t\t\t// ketiak, eh ketika tombol next di klik\n\t\t\tvar searchtext = btnnext.searchtext\n\t\t\tvar limit = btnnext.limit\n\t\t\tvar nextoffset = btnnext.nextoffset\n\t\t\tcbo_search(self, searchtext, limit, nextoffset)\n\t\t})\n\t\tdialog.appendChild(btnnext)\n\n\t\tdialog.setNext = (nextoffset, limit) => {\n\t\t\tbtnnext.nextoffset = nextoffset\n\t\t\tbtnnext.limit = limit\n\t\t\tif (nextoffset!=null && nextoffset!=0) {\n\t\t\t\tbtnnext.style.display = 'inline-block'\n\t\t\t} else {\n\t\t\t\tbtnnext.style.display = 'none'\n\t\t\t}\n\t\t}\n\t} else {\n\t\tdialog.setNext = (nextoffset, limit) => {\n\t\t\tconsole.log('not implemented')\n\t\t}\n\t}\t\n\t\n\t\n}\n\nfunction cbo_userSelectValue(self, value, text, data) {\n\t// trigger event\n\tconst changed = cbo_markChanged(self)\n\n\tself.Listener.dispatchEvent(SelectedEvent({\n\t\tsender: self,\n\t\tdetail: {value, text, data, changed, sender: self}\n\t}))\n\n\t// tutup\n\tself.Nodes.Dialog.removeAttribute(ATTR_SHOWED)\n\tsetTimeout(() => {\n\t\tself.Nodes.Dialog.close()\n\t\tcbo_closed(self)\n\t}, 200);\n}\n\nfunction cbo_markChanged(self) {\n\tif (self.Form==null) {\n\t\treturn\n\t}\n\n\tvar display = self.Nodes.Display\n\tif (self.value!=self.getLastValue()) {\n\t\tdisplay.setAttribute('changed', 'true')\n\t\treturn true\n\t} else {\n\t\tdisplay.removeAttribute('changed')\n\t\treturn false\n\t}\n}\n\n\nfunction cbo_getLastValue(self) {\n\tvar lastvalue = self.Nodes.LastValue.value\n\tif (lastvalue=='') {\n\t\treturn null\n\t} else {\n\t\treturn lastvalue\n\t}\n}\n\nfunction cbo_getLastText(self) {\n\treturn self.Nodes.LastText.value\n}\n\n\nfunction cbo_clearOptions(self, tbody) {\n\tconst dialog = self.Nodes.Dialog\n\tif (tbody==undefined || tbody==null) {\n\t\ttbody = dialog.getElementsByTagName('tbody')[0]\n\t}\n\n\ttbody.innerHTML = ''\n}\n\nfunction cbo_addOptions(self, data, tbody) {\n\tif (data==undefined || data==null) {\n\t\treturn\n\t}\n\n\tconst dialog = self.Nodes.Dialog\n\tif (tbody==undefined || tbody==null) {\n\t\ttbody = dialog.getElementsByTagName('tbody')[0]\n\t}\n\n\tfor (let row of data) {\n\t\ttbody.appendChild(cbo_createOptionRow(self, row.value, row.text, data))\n\t}\n}\n\nfunction cbo_setOptions(self, data) {\n\tconst dialog = self.Nodes.Dialog\n\tconst tbody = dialog.getElementsByTagName('tbody')[0]\n\n\t// hapus dulu datanya\n\tcbo_clearOptions(self, tbody)\n\t\n\t// cek apakah tidak required\n\t// jika tidak required, tambahkan none di paling atas\n\tif (!self.isRequired()) {\n\t\t// cbo_addOptionRow(self, tbody, '', '')\n\t}\n\n\n\t// tampilkan data pada pilihan\n\tcbo_addOptions(self, data, tbody)\n}\n\nfunction cbo_closed(self) {\n\tif (typeof self.abortHandler==='function') {\n\t\tself.abortHandler()\n\t}\n}\n\n\nfunction cbo_clear(self) {\n\tconst dialog = self.Nodes.Dialog\n\tvar selectedTr = dialog.querySelectorAll(`table tr[${ATTR_SELECTED}]`)\n\tselectedTr.forEach(tr=>{\n\t\ttr.removeAttribute(ATTR_SELECTED)\n\t})\n}\n\nfunction cbo_search(self, searchtext, limit, offset) {\n\tconst dialog = self.Nodes.Dialog\n\tconst tbody = dialog.getElementsByTagName('tbody')[0]\n\n\n\t// required atau nggak\n\tvar addNoneIfNotRequired = () => {\n\t\tvar none = tbody.querySelector('tr[data-none]')\n\t\tif (self.isRequired()) {\n\t\t\t// hilangkan none\n\t\t\tif (none!=null) {\n\t\t\t\tnone.remove()\n\t\t\t}\n\t\t\t\n\t\t} else {\n\t\t\t// tambahkan none jika belum ada\n\t\t\tif (none==null) {\n\t\t\t\tvar tr = cbo_createOptionRow(self, '', 'none', {})\n\t\t\t\ttr.setAttribute('data-none', '')\n\t\t\t\ttr.setAttribute(ATTR_INDEX, 0)\n\t\t\t\ttbody.prepend(tr)\n\t\t\t\tconsole.log('add none')\n\t\t\t}\n\t\t}\n\t}\n\n\tvar execute_selecting = true\n\tif (offset==0) {\n\t\tvar prevselected = dialog.querySelector(`table tr[${ATTR_SELECTED}]`)\n\t\tif (prevselected != null) {\n\t\t\t// kalau sudah ada yang dipilih sebelumnya\n\t\t\t// tidak perlu query selecting lagi \n\t\t\texecute_selecting = false\n\t\t} else {\n\t\t\texecute_selecting = true\n\t\t\tcbo_clearOptions(self, tbody)\n\t\t\tdialog.setNext(null)\n\t\t}\n\t}\n\t\n\n\n\tif (execute_selecting) {\n\n\t\t// selecting event\n\t\taddNoneIfNotRequired()\n\n\n\t\tself.Listener.dispatchEvent(SelectingEvent({\n\t\t\tdetail: {\n\t\t\t\tsender: self,\n\t\t\t\tdialog: dialog,\n\t\t\t\tsearchtext: searchtext,\n\t\t\t\tlimit: limit, \n\t\t\t\toffset: offset,\n\t\t\t\taddRow: (value, text, data) => {\n\t\t\t\t\tvar idx = tbody.rows.length - 1\n\t\t\t\t\tvar tr = cbo_createOptionRow(self, value, text, data)\n\t\t\t\t\ttr.setAttribute(ATTR_INDEX, idx)\n\t\t\t\t\ttbody.appendChild(tr)\n\t\t\t\t}\n\t\t\t}\n\t\t}))\n\t}\n\n\n}\n\n\nfunction cbo_buttonClick(self, e) {\n\tconst dialog = self.Nodes.Dialog\n\n\tif (self.Form!=null) {\n\t\tvar editmode = self.Nodes.Button.getAttribute(ATTR_EDITMODE)\n\t\tif (editmode!==\"true\") {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif (self.HasStaticOption) {\n\t\t// populasi data option statis melalui definisi datalist pada element\n\t\tself.Listener.dispatchEvent(SelectingEvent({\n\t\t\tdetail: {\n\t\t\t\tsender: self,\n\t\t\t\tdialog: dialog,\n\t\t\t\tsearchtext: '', limit: 0, offset: 0,\n\t\t\t\taddRow: (value, text, data) => {\n\t\t\t\t\tvar tr = cbo_createOptionRow(self, value, text, data)\n\t\t\t\t\ttbody.appendChild(tr)\n\t\t\t\t}\n\t\t\t}\n\t\t}))\n\n\t} else {\n\t\t// populasi data option dengan secara dinamis,\n\t\tvar searchtext = null // diisi null berarti saat klik pertama kali\n\t\tvar limit = DEF_LIMIT\n\t\tvar offset = 0\n\n\t\t// tambahkan data yang dipilih\n\t\tcbo_search(self, searchtext, limit, offset)\n\n\t\t// set focus pada input search\n\t\tsetTimeout(()=>{\n\t\t\tvar inputsearch = dialog.querySelector(\".fgta5-combobox-dialog-filter input\")\n\t\t\tif (inputsearch!=null) {\n\t\t\t\tinputsearch.value = ''\n\t\t\t\tinputsearch.focus()\n\t\t\t}\n\t\t}, 100)\n\n\n\t}\n\n\t// set jika dalam waktu 1 detik masih dalam posisi waiting, munculkan mask\n\tsetTimeout(()=>{\n\t\tif (self.isWaiting()) {\n\t\t\tdialog.mask = $fgta5.Modal.createMask()\n\t\t}\n\t}, 1000)\n\n\t// tampilkan modal dialog untuk options\n\tdialog.showModal()\n\tdialog.setAttribute(ATTR_SHOWED, 'true')\n\n\n\t// handler tombol untuk menutup dialog pilihan combobox\n\tvar btnClose = dialog.querySelector('.fgta5-combobox-dialog-head > button')\n\tif (btnClose.onclick==null) {\n\t\tbtnClose.onclick=(e) => {\n\t\t\tdialog.setAttribute(ATTR_REMOVING, 'true')\n\t\t\tsetTimeout(() => {\n\t\t\t\tdialog.close()\n\t\t\t\tdialog.removeAttribute(ATTR_REMOVING)\n\t\t\t\tdialog.removeAttribute(ATTR_SHOWED)\n\t\t\t\tcbo_closed(self)\n\t\t\t}, 200);\n\t\t}\n\t}\n\n}\n\n\nfunction cbo_wait(self, iswaiting) {\n\tconst dialog = self.Nodes.Dialog\n\tvar tbody = dialog.getElementsByTagName('tbody')[0]\n\n\tiswaiting = iswaiting===undefined ? true : iswaiting\n\tif (iswaiting) {\n\t\tvar tr = document.createElement('tr')\n\t\tvar td = document.createElement('td')\n\n\t\ttr.setAttribute('data-waiting', '')\n\t\ttd.innerHTML = 'fetching data from server ...'\n\t\ttr.appendChild(td)\n\t\ttbody.appendChild(tr)\n\n\t\t\n\t} else {\n\t\tvar el = tbody.querySelector('[data-waiting]')\n\t\tif (el!=null) {\n\t\t\tel.remove()\n\t\t}\n\n\t\tif (dialog.mask!=null) {\n\t\t\tdialog.mask.close()\n\t\t\tdelete dialog.mask\n\t\t}\n\t}\n\n}\n\n\nfunction cbo_resetSelected(self) {\n\t// ambil baris yang dipilih sebelumnya\n\tconst prevselected = self.Nodes.Dialog.querySelector(`table tr[${ATTR_SELECTED}]`)\n\tif (prevselected != null) {\n\n\t\t// kemablikan ke urutan sesuai index\n\t\tconst idx = prevselected.getAttribute(ATTR_INDEX)\t\n\t\tif (idx!='' && idx!=null) {\n\t\t\tconst index = Number(idx)\n\t\t\tconst tbody = prevselected.closest('tbody')\n\t\t\tconst trs = tbody.querySelectorAll('tr')\n\t\t\tfor (var tr of trs) {\n\t\t\t\tvar rowidx = tr.getAttribute(ATTR_INDEX) ?? 0\n\t\t\t\tvar rowindex = Number(rowidx)\n\t\t\t\tif (rowindex==0) continue\n\t\t\t\tif (rowindex==index) continue\n\n\t\t\t\tif (index<rowindex) {\n\t\t\t\t\ttr.insertAdjacentElement(\"beforebegin\", prevselected);\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\n\n\t\t// remove status selected\n\t\tprevselected.removeAttribute(ATTR_SELECTED)\n\t}\n}\n\n\nfunction cbo_dialogClose(self) {\n\t// kembalikan yang saat ini di select ke baris semula\n\t// const dialog = self.Nodes.Dialog\n\t// const selected = dialog.querySelector(`table tr[${ATTR_SELECTED}]`)\n\t// const idx = selected.getAttribute(ATTR_INDEX)\n\t// if (idx!='' && idx!=null) {\n\t// \tconst tbody = dialog.getElementsByTagName('tbody')[0]\n\t// \tconst trs = tbody.querySelectorAll('tr')\n\t// \tfor (var tr of trs) {\n\t// \t\tvar rowidx = tr.getAttribute(ATTR_INDEX) ?? 0\n\t// \t\tif (rowidx==0) continue\n\n\t// \t\tif (idx>rowidx) {\n\t// \t\t\ttr.after(selected)\n\t// \t\t\tbreak\n\t// \t\t}\n\t// \t}\n\t// }\n}","import Input from \"./Input.mjs\"\n\n\nconst button_icon = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg transform=\"translate(0 3)\" width=\"12\" height=\"12\" stroke=\"currentColor\" version=\"1.1\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m3.0207 17.447v3.9708h18.328v-3.9708\" fill=\"none\" stroke-linecap=\"square\" stroke-width=\"4\"/>\n<path d=\"m18.595 8.3606-6.4542-4.0017-6.3622 4.0017m6.3622-1.8991v7.1708\" fill=\"none\" stroke-linecap=\"square\" stroke-width=\"4\"/>\n</svg>\n`\n\n\nexport default class Filebox extends Input {\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tflb_construct(this, id)\n\t}\n\n\t#value = ''\n\tset value(v) { this.#value = v }\n\tget value() { \n\t\tif (this.Element.files.length===0) {\n\t\t\treturn this.#value\n\t\t} else {\n\t\t\treturn this.Element.files[0].name\n\t\t}\n\t}\n\t\n\n\tget file() {\n\t\tif (this.Element.files.length===0) {\n\t\t\treturn 0\n\t\t} else {\n\t\t\treturn this.Element.files[0]\n\t\t}\n\t}\n\n\tget disabled() { return this.Element.disabled }\n\tset disabled(v) { \n\t\tthis.Element.disabled = v \n\t\tflb_setDisabled(this, v)\n\t}\n\n\t#_ineditmode = true\n\tget InEditMode() { return this.#_ineditmode }\n\tsetEditingMode(ineditmode) {\n\t\tthis.#_ineditmode = ineditmode\n\t\tflb_setEditingMode(this, ineditmode)\n\t}\n\n\tnewData() {\n\t\tflb_newData(this)\n\t}\n\n\tacceptChanges() {\n\t\tflb_acceptChanges(this)\n\t}\n\n\treset() {\n\t\tflb_Reset(this)\n\t}\n\n\tisChanged() { \n\t\treturn flb_isChanged(this)\n\t}\n\n\tsetError(msg) {\n\t\tsuper.setError(msg)\n\t\tflb_setError(this, msg)\n\t}\n\n\n\tsetDisplay(value) {\n\t\tflb_setDisplay(this, value)\n\t}\n\n\n\tsetDownloadLink(linktext, url) {\n\t\tflb_setDownloadLink(this, linktext, url)\n\t}\n\n\tvalidate() { \n\t\treturn flb_validate(this) \n\t}\n\n\tfocus() {\n\t\tthis.Nodes.Display.focus()\n\t}\t\n}\n\n\nfunction flb_validate(self) {\n\tif (self.isRequired()) {\n\t\tif (self.Nodes.Display.value=='') {\n\t\t\t// return false\n\t\t\tvar err = self.getErrorValidation('required') // prioritas utama untuk validasi\n\t\t\tif (err!=null) {\n\t\t\t\tself.setError(err.message)\n\t\t\t} else {\n\t\t\t\tself.setError('file harus diisi')\n\t\t\t}\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t} else {\n\t\treturn true\n\t}\n}\n\nfunction flb_setDownloadLink(self, linktext=null, url=null) {\n\tconst downloadLink = self.Nodes.DownloadLink\n\t\n\tif (linktext==null) {\n\t\t// sembunyikan link\n\t\tdownloadLink.classList.add('hidden')\n\t\tdownloadLink.innerHTML = 'download'\n\t\tdownloadLink.onclick = null\n\t\tdownloadLink.removeAttribute('href')\t\n\t} else {{\n\t\t// munculkan link\n\t\tdownloadLink.classList.remove('hidden')\n\t\tdownloadLink.innerHTML = linktext\n\t\tif (typeof url==='function') {\n\t\t\tdownloadLink.removeAttribute('target', '_blank')\n\t\t\tdownloadLink.setAttribute('href', 'javascript:void(0)')\n\t\t\tdownloadLink.onclick = () => {\n\t\t\t\turl()\n\t\t\t}\t\n\t\t} else {\n\t\t\tdownloadLink.setAttribute('target', '_blank')\n\t\t\tdownloadLink.setAttribute('href', url)\n\t\t\tdownloadLink.onclick = null\n\t\t}\n\t}}\t\n\n}\n\n\nfunction flb_construct(self, id) {\n\tconst container = self.Nodes.Container\n\tconst lastvalue = self.Nodes.LastValue\n\tconst input = self.Nodes.Input\n\tconst wrapinput = document.createElement('div')\n\tconst display = document.createElement('input')\n\tconst button = document.createElement('button')\n\tconst label = document.querySelector(`label[for=\"${id}\"]`)\n\tconst downloadLink = document.createElement('a')\n\n\t// setup container, (harus di awal seblum yang lain-lain)\n\t// diperlukan untuk menampung semua element yang akan ditampilkan\n\tinput.parentNode.insertBefore(container, input)\n\t\n\n\tdownloadLink.innerHTML = 'download'\n\tdownloadLink.classList.add('fgta5-entry-download-link')\n\tdownloadLink.classList.add('hidden')\n\t\n\n\n\n\t// tambahkan elemen-element ke container\n\t// penambahakn container ke body document pada saat Input_construct di parent class Input\n\twrapinput.appendChild(display)\n\twrapinput.appendChild(button)\n\tbutton.appendChild(input)\n\tcontainer.appendChild(wrapinput)\n\tcontainer.appendChild(downloadLink)\n\tcontainer.appendChild(lastvalue)\n\t\n\n\n\t// tambahkan referensi elemen ke Nodes\n\tself.Nodes.InputWrapper = wrapinput\n\tself.Nodes.Label = label \n\tself.Nodes.Display = display\n\tself.Nodes.Button = button\n\tself.Nodes.DownloadLink = downloadLink\n\n\n\t// setup container\n\tcontainer.setAttribute('fgta5-component', 'Filebox')\n\n\n\t// setup wrapper\n\twrapinput.classList.add('fgta5-entry-input-wrapper')\n\n\n\t// display\n\tdisplay.setAttribute('id', `${id}-display`)\n\tdisplay.setAttribute('type', 'text')\n\tdisplay.setAttribute('picker', 'file')\n\tdisplay.setAttribute('fgta5-component', 'Filebox')\n\tdisplay.setAttribute('readonly', 'true')\n\tdisplay.classList.add('fgta5-entry-display')\n\tdisplay.classList.add('fgta5-entry-display-filebox')\n\tvar placeholder = input.getAttribute('placeholder')\n\tif (placeholder!=null && placeholder !='') {\n\t\tdisplay.setAttribute('placeholder', placeholder)\n\t}\n\tvar cssclass = input.getAttribute('class')\n\tif (cssclass!=null && cssclass !='') {\n\t\tdisplay.setAttribute('class', cssclass)\n\t}\n\tvar cssstyle = input.getAttribute('style')\n\tif (cssstyle!=null && cssstyle !='') {\n\t\tdisplay.setAttribute('style', cssstyle)\n\t}\n\n\tconst tabIndex = input.getAttribute('data-tabindex')\n\tif (tabIndex!=null) {\n\t\tdisplay.setAttribute('tabindex', tabIndex)\n\t}\n\n\n\t// main input\n\tinput.setAttribute('type', 'file')\n\tinput.setAttribute('picker', 'file')\n\tinput.removeAttribute('class')\n\tinput.removeAttribute('style')\n\tinput.classList.add('fgta5-entry-input')\n\tinput.classList.add('fgta5-entry-input-filebox')\n\tinput.getInputCaption = () => {\n\t\tif (label!=null) {\n\t\t\treturn label.innerHTML\n\t\t} else {\n\t\t\treturn input.getAttribute('placeholder')\n\t\t}\n\t}\n\n\t\n\t// picker button\n\tbutton.id = self.Id + '-button'\n\tbutton.insertAdjacentHTML(\"beforeend\", button_icon)\n\tbutton.classList.add('fgta5-entry-button-filebox')\t\n\n\t// label\n\tlabel.setAttribute('for', button.id)\n\tlabel.classList.add('fgta5-entry-label')\n\n\n\n\n\t// additional property setup\n\n\t// required field\n\tvar required = input.getAttribute('required')\n\tif (required != null) {\n\t\tself.markAsRequired(true)\n\t}\n\n\tself._setLastValue(input.value)\n\tself.acceptChanges()\n\n\n\t// set input description\n\tself._setupDescription()\n\n\n\tinput.addEventListener('change', (e)=>{\n\t\tflb_changed(self)\n\t})\n\n\n}\n\nfunction flb_setDisplay(self, value) {\n\tvar display = self.Nodes.Display\n\tdisplay.value = value\n}\n\nfunction flb_setDisabled(self, v) {\n\tvar display = self.Nodes.Display\n\tvar button = self.Nodes.Button\n\tif (v) {\n\t\tdisplay.disabled = true\n\t\tbutton.disabled = true\n\t} else {\n\t\tdisplay.disabled = false\n\t\tbutton.disabled = false\n\t}\n}\n\n\nfunction flb_setEditingMode(self, ineditmode) {\n\tvar display = self.Nodes.Display\n\tvar input = self.Nodes.Input\n\tvar attrval = ineditmode ? 'true' : 'false'\n\n\tdisplay.setAttribute('editmode', attrval)\n\tinput.setAttribute('editmode', attrval)\n\tself.Nodes.InputWrapper.setAttribute('editmode', attrval)\n\n\tif (ineditmode) {\n\t\tinput.disabled = false\n\t} else {\n\t\tinput.disabled = true\n\t\tself.setError(null)\n\t}\n}\n\n\nfunction flb_changed(self) {\n\tvar input = self.Nodes.Input\n\n\tif (input.files.length === 0) {\n\t\treturn\n\t}\n\n\tself.Nodes.Display.value = input.files[0].name\n\tflb_markChanged(self)\n\tif (self.InEditMode) {\n\t\tself.setError(null)\n\t\tself.validate()\n\t}\n}\n\nfunction flb_markChanged(self) {\n\tvar display = self.Nodes.Display\n\tif (self.value!=self.getLastValue()) {\n\t\tdisplay.setAttribute('changed', 'true')\n\t} else {\n\t\tdisplay.removeAttribute('changed')\n\t}\n}\n\n\n\nfunction flb_setError(self, msg) {\n\tvar display = self.Nodes.Display\n\tif (msg!== null && msg !== '') {\n\t\tdisplay.setAttribute('invalid', 'true')\n\t} else {\n\t\tdisplay.removeAttribute('invalid')\n\t}\n}\n\nfunction flb_newData(self) {\n\tself.Nodes.Input.value = ''\n\tself.Nodes.Display.value = ''\n\tself.acceptChanges()\n}\n\n\nfunction flb_Reset(self) {\n\t// let newFileInput = self.Nodes.Input.cloneNode();\n\t// newFileInput.addEventListener('change', (e)=>{\n\t// \tflb_changed(self)\n\t// })\n\t\n\t// self.Nodes.Input.replaceWith(newFileInput)\n\t// self.Nodes.Input = newFileInput\n\tself.Nodes.Input.value = ''\n\t\n\tvar lastvalue = self.getLastValue()\n\tself.Nodes.Display.value = lastvalue\n\tself.acceptChanges()\n}\n\nfunction flb_acceptChanges(self) {\n\tvar display = self.Nodes.Display\n\tvar input = self.Nodes.Input\n\tvar currentvalue = ''\n\tif (input.files.length>0) {\n\t\tcurrentvalue = input.files[0].name\n\t}\n\t\n\tself._setLastValue(currentvalue)\n\tinput.removeAttribute('changed')\n\tdisplay.removeAttribute('changed')\n\tself.setError(null)\n}\n\n\nfunction flb_isChanged(self) {\n\tvar lastvalue = self.Nodes.LastValue.value\n\tvar currentvalue = self.value\n\tif (currentvalue!=lastvalue) {\n\t\tconsole.log(`Input '${self.Id}' is changed from '${lastvalue}' to '${currentvalue}'`)\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}","import Component from \"./Component.mjs\"\nimport Textbox from \"./Textbox.mjs\"\nimport Numberbox from \"./Numberbox.mjs\"\nimport Checkbox from \"./Checkbox.mjs\"\nimport Datepicker from \"./Datepicker.mjs\"\nimport Timepicker from \"./Timepicker.mjs\"\nimport Combobox from \"./Combobox.mjs\"\nimport Filebox from \"./Filebox.mjs\"\n\n\nconst formLockedEvent = new CustomEvent('locked')\nconst formUnLockedEvent = new CustomEvent('unlocked')\n\n\nexport default class Form extends Component {\n\t#_locked = false\n\t#_autoid = false\n\t#_primarykey\n\n\tInputs = {}\n\n\tconstructor(id) {\n\t\tsuper(id)\n\n\t\tthis.#readAttributes()\n\t\tfrm_construct(this, id)\n\t}\n\n\n\tget AutoID() { return this.#_autoid }\n\tget PrimaryKey() { return this.#_primarykey } \n\n\tlock(lock) { \n\t\tthis.#_locked = frm_lock(this, lock) \n\t}\n\n\tisLocked() { \n\t\treturn this.#_locked\n\t}\n\n\t#isnew\n\tisNew() {\n\t\treturn this.#isnew\n\t}\n\n\tsetAsNewData() {\n\t\tthis.#isnew = true\n\t}\n\n\treset() { \n\t\tthis.#isnew = false\n\t\tfrm_reset(this) \n\t}\n\n\tclear(text) {\n\t\tfrm_clear(this, text)\n\t}\n\n\tacceptChanges() { \n\t\tthis.#isnew = false\n\t\tfrm_acceptChanges(this) \n\t}\n\n\tisChanged() { return frm_isChanged(this) }\n\n\t\n\t#lastError\n\t_setLastError(msg) {\n\t\tthis.#lastError = msg\n\t}\n\n\tgetLastError() {\n\t\treturn this.#lastError\n\t}\n\n\tgetPrimaryInput() {\n\t\tconst pk = this.PrimaryKey\n\t\tconst obj = this.Inputs[pk]\n\t\treturn obj\n\t}\n\n\tnewData(data) { \n\t\tthis.#isnew = true\n\t\tthis.lock(false)\n\t\tfrm_newData(this, data) \n\t}\n\n\trender() { frm_render(this) }\n\n\tvalidate() { return frm_validate(this) }\n\n\n\tgetData() {\n\t\treturn frm_getData(this)\n\t}\n\n\tgetFiles() {\n\t\treturn frm_getFiles(this)\n\t}\n\t\n\tgetDataChanged() {\n\t\tvar changedOnly = true\n\t\treturn frm_getData(this, changedOnly)\n\t}\n\n\tsetData(data) {\n\t\tfrm_setData(this, data)\n\t}\n\n\taddEventListener(event, callback) {\n\t\tthis.Element.addEventListener(event, callback)\n\t}\n\n\n\tacceptInput() {\n\t\tconst prevFocusedElement = document.activeElement;\n\t\tprevFocusedElement.blur()\n\t\tsetTimeout(()=>{\n\t\t\t\tprevFocusedElement.focus()\n\t\t}, 100)\n\t}\n\n\t#readAttributes() {\n\t\tvar locked = this.Element.getAttribute('locked') \n\t\tif (locked == null) {\n\t\t\tlocked = 'false'\n\t\t}\n\t\tif (locked.toLowerCase() === 'true') {\n\t\t\tthis.#_locked = true\n\t\t} else {\n\t\t\tthis.#_locked = false\n\t\t}\n\n\t\tvar autoid = this.Element.getAttribute('autoid')\n\t\tif (autoid!=null) {\n\t\t\tif (autoid.toLowerCase() === 'true') {\n\t\t\t\tthis.#_autoid = true\n\t\t\t} else {\n\t\t\t\tthis.#_autoid = false\n\t\t\t}\n\t\t} \n\t\t\n\n\n\t\tvar primarykey = this.Element.getAttribute('primarykey')\n\t\tthis.#_primarykey = primarykey\n\n\t}\n\n}\n\n\nfunction frm_construct(self, id) {\n\tvar formEl = document.getElementById(id)\n\n\tself.Id = id\n \tself.Element = formEl\n\tself.Inputs = {}\n\n\tself.Element.setAttribute('novalidate', '')\n\tself.Element.addEventListener('submit', (event) => {\n\t\tevent.preventDefault();\n\t});\n\n\n\n\t// ambil semua input\n\tvar inputs = formEl.querySelectorAll('input')\n\tfor (var i = 0; i < inputs.length; i++) {\n\t\tvar input = inputs[i]\n\t\tvar fgtacomp = input.getAttribute('fgta5-component')\n\t\tif (fgtacomp==null || input.id==null || input.id=='') {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (fgtacomp=='Textbox') {\n\t\t\tself.Inputs[input.id] = new Textbox(input.id)\n\t\t} else if (fgtacomp=='Numberbox') {\n\t\t\tself.Inputs[input.id] = new Numberbox(input.id)\n\t\t} else if (fgtacomp=='Datepicker') {\n\t\t\tself.Inputs[input.id] = new Datepicker(input.id)\n\t\t} else if (fgtacomp=='Timepicker') {\n\t\t\tself.Inputs[input.id] = new Timepicker(input.id)\n\t\t} else if (fgtacomp=='Combobox') {\n\t\t\tself.Inputs[input.id] = new Combobox(input.id)\n\t\t} else if (fgtacomp=='Checkbox') {\n\t\t\tself.Inputs[input.id] = new Checkbox(input.id)\n\t\t} else if (fgtacomp=='Filebox') {\n\t\t\tself.Inputs[input.id] = new Filebox(input.id)\n\t\t}\n\t\n\t}\n\t\n}\n\n\nfunction frm_render(self) {\n\t// render semua input\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tobj.bindForm(self)\n\t}\n\n\tvar locked = self.isLocked() ? true : false\n\tif (locked) {\n\t\tfrm_lock(self, true)\n\t} else {\n\t\tfrm_lock(self, false)\n\t}\n\n}\n\nfunction frm_lock(self, lock=true) {\n\tvar formEl = self.Element\n\tvar editmode = lock ? false : true\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tobj.setEditingMode(editmode)\n\t}\n\n\tif (lock) {\n\t\tformEl.dispatchEvent(formLockedEvent)\n\t\tformEl.setAttribute('locked', lock)\n\t} else {\n\t\tformEl.dispatchEvent(formUnLockedEvent)\n\t\tformEl.removeAttribute('locked')\n\t}\n\treturn lock\n}\n\n\n\n\nfunction frm_acceptChanges(self) {\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tobj.acceptChanges()\n\t}\n}\n\nfunction frm_reset(self) {\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tobj.reset()\n\t}\n}\n\nfunction frm_clear(self, text='') {\n\tconst inputs = self.Element.querySelectorAll('input:not([type=\"file\"]')\n\tinputs.forEach(element => {\n\t\telement.value = text\n\t});\n}\n\n\nfunction frm_setData(self, data) {\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name];\n\t\tvar bindingdata = obj.getBindingData();\n\t\tvar value = data[bindingdata]\n\t\tif (obj instanceof Combobox) {\n\t\t\tvar displayname = obj.getDisplayBinding()\n\t\t\tif (displayname!=null) {\n\t\t\t\tobj.setSelected(value, data[displayname])\n\t\t\t} else {\n\t\t\t\tobj.setSelected(value, value)\n\t\t\t}\n\t\t} else if (obj instanceof Filebox) {\n\t\t\tobj.setDisplay(value)\n\t\t} else {\n\t\t\tobj.value = value\n\t\t}\n\t}\n\tfrm_acceptChanges(self)\n}\n\n\nfunction frm_newData(self, data) {\n\tdata = data!=null ? data : {} \n\n\tfor (var name in self.Inputs) {\n\t\t\n\t\tvar obj = self.Inputs[name]\n\t\tvar bindingdata = obj.getBindingData()\n\t\tvar initialvalue = data[bindingdata]\n\n\t\tif (obj instanceof Combobox) {\n\t\t\tvar initialdata = (initialvalue!=null) ? initialvalue : {value:'',text:''}\n\t\t\tobj.newData({\n\t\t\t\tvalue: initialdata.value,\n\t\t\t\ttext: initialdata.text\n\t\t\t})\n\t\t} else {\n\t\t\tobj.newData(initialvalue)\n\t\t}\n\t}\n}\n\nfunction frm_isChanged(self) {\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tif (obj.isChanged()) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n} \n\nfunction frm_validate(self) {\n\tvar isValid = true\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tisValid &&= obj.validate()\n\n\t\tif (!isValid) {\n\t\t\tvar lastError = obj.getLastError()\n\t\t\tself._setLastError(lastError)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tself._setLastError(null)\n\treturn true\n}\n\n\nfunction frm_getData(self, changedOnly=false) {\n\tvar primarykey = self.PrimaryKey\n\tvar obj_pk = self.Inputs[primarykey]\n\tvar pkBinding = obj_pk.getBindingData()\n\n\n\tvar data = {}\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tvar currBinding = obj.getBindingData()\n\n\t\tif (changedOnly) {\n\t\t\t// jika ambil data hanya yang berubah\n\t\t\t// data primary key harus selalu diambil\n\t\t\tif (currBinding!=pkBinding) {\n\t\t\t\t// jika bukan primary key, cek apakah berubah\n\t\t\t\tif (!obj.isChanged()) {\n\t\t\t\t\t// jika tidak ada perubahan, skip\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar bindingdata = obj.getBindingData()\n\t\tif (bindingdata) {\n\t\t\tdata[bindingdata] = obj.value\n\t\t}\n\t}\n\treturn data\n}\n\n\nfunction frm_getFiles(self) {\n\tconst files = {}\n\tfor (var name in self.Inputs) {\n\t\tvar obj = self.Inputs[name]\n\t\tif (!(obj instanceof Filebox)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!obj.isChanged()) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst bindingdata = obj.getBindingData()\n\n\t\tconst file = obj.file\n\t\tif (file!=null) {\n\t\t\tfiles[bindingdata] = obj.file\n\t\t}\n\t}\n\n\tconst isEmpty = Object.keys(files).length === 0;\n\tif (isEmpty) {\n\t\treturn null\n\t} else {\n\t\treturn files\n\t}\n}","const iconsCss = {\n\t'info': 'fgta5-icon-info',\n\t'warning': 'fgta5-icon-warning',\n\t'error': 'fgta5-icon-error',\n\t'question': 'fgta5-icon-question',\n}\n\n\nconst ICON_ERROR = `<svg width=\"32\" height=\"32\" version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m2.6952 0.48756-2.2081 2.1923-0.010649 3.1118 2.193 2.208 3.112 0.010647 2.2075-2.1929 6.415e-4 -0.066396 0.010022-3.0448-2.1924-2.208z\" color=\"#000000\" fill=\"#f00\" stroke-width=\".32071\" style=\"-inkscape-stroke:none\"/>\n<path transform=\"translate(5.0428e-6 -.019403)\" d=\"m2.582 1.8223a0.33639 0.33639 0 0 0-0.23828 0.097656l-0.43164 0.43164a0.33639 0.33639 0 0 0 0 0.47656l1.4492 1.4492-1.4492 1.4473a0.33639 0.33639 0 0 0 0 0.47656l0.43164 0.43164a0.33639 0.33639 0 0 0 0.47656 0l1.4473-1.4492 1.4492 1.4492a0.33639 0.33639 0 0 0 0.47656 0l0.43164-0.43164a0.33639 0.33639 0 0 0 0-0.47656l-1.4492-1.4473 1.4492-1.4492a0.33639 0.33639 0 0 0 0-0.47656l-0.43164-0.43164a0.33639 0.33639 0 0 0-0.47656 0l-1.4492 1.4492-1.4473-1.4492a0.33639 0.33639 0 0 0-0.23828-0.097656z\" fill=\"#fff\" stroke-width=\".52389\"/>\n</svg>`\n\nconst ICON_INFO = `<svg width=\"32\" height=\"32\" version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m1.6397 0.49839h5.2163c0.63356 0 1.1436 0.51005 1.1436 1.1436v3.83c0 0.63356-0.51005 1.1436-1.1436 1.1436l-2.0655 0.041342-1.8192 1.3427 0.54046-1.384h-1.872c-0.63356 0-1.1436-0.51005-1.1436-1.1436v-3.83c0-0.63356 0.51005-1.1436 1.1436-1.1436z\" fill=\"#ececec\" stroke-width=\".29427\"/>\n<path d=\"m4.103 1.9561c-0.3426 0-0.62096 0.24685-0.62096 0.55066 0 0.30381 0.27836 0.55066 0.61025 0.55066 0.3533 0 0.63167-0.24685 0.63167-0.55066 0-0.30381-0.27836-0.55066-0.62096-0.55066z\" fill=\"#000080\" stroke-width=\".25205\"/>\n<path d=\"m4.7552 3.6379-2.191 0.038907v0.15209h0.59436c0.44285 0.00353 0.50112 0.024758 0.50112 0.17685v1.0116c-0.01164 0.053055-0.02332 0.074277-0.06993 0.091962-0.08157 0.031833-0.303 0.045981-0.80413 0.049518h-0.08157v0.12733h3.0184v-0.12733h-0.08157c-0.78082-0.00707-0.88571-0.024759-0.88571-0.15209v-0.15563z\" fill=\"#000080\" stroke-width=\".16051\"/>\n</svg>`\n\nconst ICON_QUESTION = `<svg width=\"32\" height=\"32\" version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<ellipse cx=\"4.2374\" cy=\"4.2692\" rx=\"3.6992\" ry=\"3.7484\" fill=\"#000080\"/>\n<path d=\"m4.8395 5.9237q0 0.23059-0.17562 0.3913-0.17562 0.16071-0.42928 0.16071-0.25757 0-0.43709-0.16071-0.17952-0.16071-0.17952-0.3913 0-0.22709 0.17952-0.38431 0.17952-0.15722 0.43709-0.15722 0.25367 0 0.42928 0.15722 0.17562 0.15722 0.17562 0.38431z\" fill=\"#fff\" stroke-width=\".18906\"/>\n<path d=\"m5.5497 2.9486q0 0.20872-0.10927 0.379-0.10927 0.16753-0.27318 0.31308-0.16001 0.14556-0.32391 0.28013-0.16001 0.13457-0.26928 0.27463-0.10927 0.14006-0.10927 0.29935 0 0.030209 0.01561 0.085137 0.01561 0.054927 0.01561 0.054927l-0.48782-0.0054933q-0.070246-0.10161-0.11708-0.21147-0.042928-0.1126-0.042928-0.27738 0-0.16753 0.093662-0.32407 0.097564-0.15929 0.22245-0.30484 0.12488-0.14556 0.21854-0.26914 0.097564-0.12359 0.097564-0.21971 0-0.14556-0.13659-0.24168-0.13659-0.096122-0.38245-0.096122-0.23415 0-0.33952 0.074151-0.10537 0.074151-0.1483 0.15105h-0.28879q-0.085856-0.054926-0.14049-0.13732-0.050733-0.08239-0.050733-0.14556 0-0.10985 0.12098-0.23344 0.12488-0.12633 0.39416-0.21421 0.26928-0.090629 0.69856-0.090629 0.43319 0 0.73368 0.12633 0.3005 0.12359 0.4527 0.32132 0.1561 0.19499 0.1561 0.41195z\" fill=\"#fff\" stroke-width=\".16762\"/>\n</svg>`\n\nconst ICON_WARNING = `<svg width=\"32\" height=\"32\" version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<path transform=\"matrix(.20595 0 0 .1924 3.8511 -.31824)\" d=\"m1.875 9.1397 18.269 31.643-18.269-1e-6h-18.269l9.1345-15.821z\" fill=\"#ff7f2a\"/>\n<path d=\"m4.751 6.4121q0 0.20413-0.14691 0.34641-0.14691 0.14227-0.35911 0.14227-0.21547 0-0.36564-0.14227-0.15017-0.14227-0.15017-0.34641 0-0.20104 0.15017-0.34022 0.15017-0.13918 0.36564-0.13918 0.2122 0 0.35911 0.13918 0.14691 0.13918 0.14691 0.34022z\" fill=\"#fff\" stroke-width=\".16269\"/>\n<path d=\"m4.8197 3.7022q0 0.098082-0.022286 0.19403-0.022286 0.093818-0.057939 0.20683l-0.31198 1.0832h-0.43232l-0.2897-1q-0.040112-0.15139-0.075767-0.26013-0.035655-0.11088-0.035655-0.22815 0-0.25373 0.16045-0.37101 0.1649-0.11727 0.46351-0.11727 0.29415 0 0.44569 0.10661 0.15599 0.10661 0.15599 0.38593z\" fill=\"#fff\" stroke-width=\".15783\"/>\n</svg>\n`\n\nexport class MessageBoxButton {\n\tText = 'button'\n\t\n\tconstructor(text) {\n\t\tthis.Text = text\n\t}\n\n}\n\nexport class MessageBox {\n\tstatic ButtonOkCancel = Object.freeze({ok:new MessageBoxButton('Ok'), cancel:new MessageBoxButton('Cancel')})\n\tstatic ButtonYesNo = Object.freeze({yes:new MessageBoxButton('Yes'), no:new MessageBoxButton('No')})\n\tstatic ButtonYesNoCancel = Object.freeze({yes:new MessageBoxButton('Yes'), no:new MessageBoxButton('No'), cancel:new MessageBoxButton('Cancel')})\n\n\tstatic async show (message, config) { return await msgbox_show(message, config) }\n\tstatic async error(message) { return await msgbox_error(message) }\n\tstatic async info(message) { return await msgbox_info(message) }\n\tstatic async warning(message) { return await msgbox_warning(message) }\n\tstatic async confirm(message, buttons) { return await msgbox_confirm(message, buttons) }\n}\n\n\n\n\n\nfunction createMessageDialog(message, config) {\n\tconst dialog = document.createElement('dialog')\n dialog.classList.add('fgta5-messagebox-dialog')\n\n\tdialog.addEventListener('close', (evt) => {\n\t\tdialog.parentNode.removeChild(dialog)\n\t});\n\t\n\n if (config.title) {\n\t\tdialog.divTitle = document.createElement('div')\n\t\tdialog.divTitle.classList.add('fgta5-messagebox-title')\n\t\tdialog.divTitle.innerHTML = config.title\n\t\tdialog.appendChild(dialog.divTitle)\n }\n\n\t if (config.iconSvg!==undefined) {\n\t\tvar iconcss = iconsCss[config.iconcss] ? iconsCss[config.iconcss] : config.iconcss\n\t\tdialog.divIcon = document.createElement('div')\n\t\tdialog.divIcon.classList.add('fgta5-messagebox-icon')\n\t\t// dialog.divIcon.style.backgroundImage = `url:(\"data:image/svg+xml,${encodeURIComponent(config.iconSvg)}\")`\n\t\tdialog.divIcon.innerHTML = config.iconSvg\n\t\tdialog.appendChild(dialog.divIcon)\n\t} else if (config.iconcss!=undefined) {\n\t\tvar iconcss = iconsCss[config.iconcss] ? iconsCss[config.iconcss] : config.iconcss\n\t\tdialog.divIcon = document.createElement('div')\n\t\tdialog.divIcon.classList.add('fgta5-messagebox-icon')\n\t\tdialog.divIcon.classList.add(iconcss)\n\t\tdialog.appendChild(dialog.divIcon)\n\t}\n\n\tdialog.divContent = document.createElement('div')\n\tdialog.divContent.classList.add('fgta5-messagebox-content')\n\tdialog.divContent.innerHTML = message\n\tdialog.appendChild(dialog.divContent)\n\n\tdialog.divButtons = document.createElement('div')\n\tdialog.divButtons.classList.add('fgta5-messagebox-buttonsbar')\n\tdialog.appendChild(dialog.divButtons)\n\t\n\tdocument.body.appendChild(dialog)\n\treturn dialog\n}\n\n\nasync function msgbox_show(message, config) {\n\t\n\tif (config === undefined) config = {}\n\n\tvar dialog = createMessageDialog(message, config)\n\treturn new Promise((resolve)=>{\n\t\tif (config.buttons) {\n\t\t\tfor (const [key, btn] of Object.entries(config.buttons)) {\n\t\t\t\tconst btnEl = document.createElement('button')\n\t\t\t\tbtnEl.classList.add('fgta5-messagebox-button')\n\t\t\t\tbtnEl.innerHTML = btn.Text\n\t\t\t\tbtnEl.addEventListener('click', () => {\n\t\t\t\t\tdialog.close()\n\t\t\t\t\tresolve(key)\n\t\t\t\t\t\n\t\t\t\t})\n\t\t\t\tdialog.divButtons.appendChild(btnEl)\n\t\t\t}\n\t\t} else {\n\t\t\tconst btnOk = document.createElement('button')\n\t\t\tbtnOk.classList.add('fgta5-messagebox-button')\n\t\t\tbtnOk.innerHTML = 'Ok'\n\t\t\tbtnOk.addEventListener('click', () => {\n\t\t\t\tdialog.close()\n\t\t\t\tresolve('ok')\n\t\t\t})\n\t\t\tdialog.divButtons.appendChild(btnOk) \n\t\t}\n\t\n\t\tdialog.showModal()\n\t});\n}\n\n\nasync function msgbox_error(message) {\n\treturn await msgbox_show(message, {iconSvg: ICON_ERROR})\n}\n\nasync function msgbox_info(message) {\n\treturn await msgbox_show(message, {iconSvg: ICON_INFO})\n}\nasync function msgbox_warning(message) {\n\treturn await msgbox_show(message, {iconSvg: ICON_WARNING})\n}\nasync function msgbox_confirm(message, buttons) {\n\tbuttons = buttons===undefined ? MessageBox.ButtonOkCancel : buttons \n\n\treturn await msgbox_show(message, {\n\t\ticonSvg: ICON_QUESTION,\n\t\tbuttons: buttons\n\t})\n}","export default class Modal {\n\tstatic show (content) { return modal_show(content) }\n\tstatic createMask (message) { return modal_createMask(message) }\n\tstatic createProgress (config) { return modal_createProgress(config) }\n}\n\n\nfunction CreateModal() {\n\tconst modal = document.createElement('dialog')\n\tmodal.classList.add('fgta5-modal-message')\n\tmodal.addEventListener('close', (evt) => {\n\t\tmodal.parentNode.removeChild(modal)\n\t});\n\tdocument.body.appendChild(modal)\n\tmodal.showModal()\n\treturn modal\n}\n\n\nfunction modal_show(content) {\n\tconst modal = CreateModal()\n\treturn modal\n}\n\nfunction modal_createMask(message) {\n\tmessage = message===undefined ? 'Please wait ...' : message\n\t\n\tconst modal = CreateModal()\n\n\tvar infoContainer = document.createElement('div')\n\tinfoContainer.classList.add('fgta5-modal-loadermask-msg')\n\tmodal.appendChild(infoContainer)\n\n\tvar spinner = document.createElement('div')\n\tspinner.classList.add('fgta5-modal-loadermask-msg-icon')\n\tspinner.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 200\"><radialGradient id=\"a11\" cx=\".66\" fx=\".66\" cy=\".3125\" fy=\".3125\" gradientTransform=\"scale(1.5)\"><stop offset=\"0\" stop-color=\"#575757\"></stop><stop offset=\".3\" stop-color=\"#575757\" stop-opacity=\".9\"></stop><stop offset=\".6\" stop-color=\"#575757\" stop-opacity=\".6\"></stop><stop offset=\".8\" stop-color=\"#575757\" stop-opacity=\".3\"></stop><stop offset=\"1\" stop-color=\"#575757\" stop-opacity=\"0\"></stop></radialGradient><circle transform-origin=\"center\" fill=\"none\" stroke=\"url(#a11)\" stroke-width=\"30\" stroke-linecap=\"round\" stroke-dasharray=\"200 1000\" stroke-dashoffset=\"0\" cx=\"100\" cy=\"100\" r=\"70\"><animateTransform type=\"rotate\" attributeName=\"transform\" calcMode=\"spline\" dur=\"1.8\" values=\"360;0\" keyTimes=\"0;1\" keySplines=\"0 0 1 1\" repeatCount=\"indefinite\"></animateTransform></circle><circle transform-origin=\"center\" fill=\"none\" opacity=\".2\" stroke=\"#575757\" stroke-width=\"30\" stroke-linecap=\"round\" cx=\"100\" cy=\"100\" r=\"70\"></circle></svg>`\n\tinfoContainer.appendChild(spinner)\n\n\tvar infoText = document.createElement('div')\n\tinfoText.classList.add('fgta5-modal-loadermask-msg-text')\n\tinfoText.innerHTML = message\n\tinfoContainer.appendChild(infoText)\n\n\tmodal.setText = (message) => {\n\t\tinfoText.innerHTML = message\n\t}\n\n\treturn modal\n}\n\n\nfunction modal_createProgress(config) {\n\tif (config === undefined) config = {}\n\t\n\n\tconst modal = CreateModal()\n\n\tmodal.IsError = false\n\t\n\n\tvar prgBarErrIcon = document.createElement('div')\n\tmodal.appendChild(prgBarErrIcon)\n\n\tvar prgBarContainer = document.createElement('div')\n\tprgBarContainer.classList.add('fgta5-modal-progressbar-container')\n\tmodal.appendChild(prgBarContainer)\n\n\tvar prgBar = document.createElement('label')\n\tprgBar.classList.add('fgta5-modal-progressbar')\n\tprgBarContainer.appendChild(prgBar)\n\n\tvar prgMsg = document.createElement('div')\n\tprgMsg.classList.add('fgta5-modal-progressbar-text')\n\tmodal.appendChild(prgMsg)\n\n\tmodal.setProgress = function (progress, message) {\n\t\tif (progress > 100) progress = 100\n\t\tprgBar.innerHTML = `${progress}%`\n\t\tprgBar.style.width = `${progress}%`\n\t\tprgMsg.innerHTML = message\n\t}\n\n\n\tmodal.setError = function (message) {\n\t\tmodal.IsError = true\n\n\t\tprgBarErrIcon.classList.add('fgta5-icon-error')\n\t\tprgBarErrIcon.style.height = '32px'\n\t\tprgBarErrIcon.style.marginBottom = '10px'\n\n\t\tprgMsg.innerHTML = message\n\t\tprgMsg.setAttribute('error', 'true')\n\t\tprgBar.setAttribute('error', 'true')\n\t}\n\n\tmodal.finish = function (text, completed) {\n\t\tif (text===undefined) text = 'Done'\n\t\tif (completed===undefined) completed = true\n\n\t\tif (config.buttonClose===true || modal.IsError) {\n\t\t\tif (completed) {\n\t\t\t\tprgMsg.style.display = 'none'\n\t\t\t\tprgBar.style.width = '100%'\n\t\t\t\tprgBar.innerHTML = '100%'\n\t\t\t}\n\n\t\t\tvar div = document.createElement('div')\n\t\t\tdiv.style.textAlign = 'center'\n\t\t\tdiv.style.marginTop = '10px'\n\t\t\tdiv.style.marginBottom = '0'\n\t\t\tvar btn = document.createElement('button')\n\t\t\tbtn.classList.add('fgta5-modal-button')\n\t\t\tbtn.innerHTML = text\n\t\t\tbtn.addEventListener('click', () => {\n\t\t\t\tmodal.close()\n\t\t\t})\n\t\t\tdiv.appendChild(btn)\n\t\t\tmodal.appendChild(div)\n\t\t} else {\n\t\t\tmodal.close()\n\t\t}\n\t}\n\n\treturn modal\n}\n\n","\n\nconst MENU = `<svg version=\"1.1\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\">\n <g stroke-linecap=\"square\">\n\t<rect x=\"19.5\" y=\"19.5\" width=\"12\" height=\"12\" fill=\"currentColor\"/>\n\t<rect x=\"2\" y=\"20\" width=\"12\" height=\"12\" fill=\"currentColor\"/>\n\t<rect x=\"20\" y=\"2\" width=\"12\" height=\"12\" fill=\"currentColor\"/>\n\t<rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" fill=\"currentColor\"/>\n </g>\n</svg>`\n\nconst CLOSE = `<svg version=\"1.1\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\">\n <g stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"5\">\n\t<path d=\"M4 4 L28 28\"/>\n\t<path d=\"M4 28 L28 4\"/>\n </g>\n</svg>`\n\nconst BACK = `<svg version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m5.5873 1.1684-2.515 3.0773 2.515 3.0773\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.3229\"/>\n</svg>`\n\nconst ACTION = `<svg version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m3.4777 0.49839-1.3861 4.1094h1.945l-1.2743 3.3919 3.7782-4.663h-1.9226l1.252-2.8383z\"/>\n</svg>`\n\nconst USER = `<svg version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<g stroke=\"#fff\" fill=\"currentColor\" stroke-linecap=\"round\" stroke-width=\".223\">\n<path d=\"m4.2633 4.9935c-0.85356-0.0027456-2.0017 0.17383-2.3611 0.28348-0.35939 0.10964-0.71426 0.67396-0.71727 0.93517 0.62166 0.68677 2.0469 1.1278 3.0784 1.3222 1.0315-0.19439 2.4572-0.6354 3.0789-1.3222-0.0030132-0.26121-0.35788-0.82553-0.71727-0.93517-0.35939-0.10964-1.5081-0.28622-2.3616-0.28348z\"/>\n<path d=\"m3.9018 5.7326-0.37517 1.8759 0.69032 0.57026 0.73534-0.55525-0.36016-1.8909z\" stroke-linejoin=\"bevel\"/>\n<rect x=\"3.8568\" y=\"4.9072\" width=\".76535\" height=\".76535\" stroke-linejoin=\"bevel\"/>\n<circle cx=\"4.2238\" cy=\"2.7633\" r=\"2.0523\"/>\n</g>\n</svg>`\n\n\nconst LOGOUT = `<svg version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<g stroke=\"currentColor\" fill=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"bevel\">\n<path d=\"m5.0725 0.70989h-4.3649v7.0783h4.3649z\" fill=\"none\" stroke-width=\".423\"/>\n<path d=\"m5.0725 0.70989-3.1237 2.5006 0.021392 4.5776h-1.2627l-2.6e-7 -7.0783z\" stroke-width=\".423\"/>\n<path d=\"m3.1515 5.0723h3.4527v1.3606l1.3955-1.9759-1.3955-1.9759v1.3606h-3.4527z\" stroke-width=\".423\"/>\n</g>\n</svg>`\n\nconst SEARCH = `<svg version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"square\">\n<circle cx=\"4.9312\" cy=\"3.5669\" r=\"2.7378\" stroke-width=\".66146\"/>\n<path d=\"m1.1989 7.1728 0.88885-0.80617\" stroke-width=\"1.3229\"/>\n</g>\n</svg>`\n\nconst SETTING = `<svg version=\"1.1\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n<g transform=\"matrix(.82343 0 0 .82343 4.0086 7.2155)\" fill=\"currentColor\" stroke-width=\"1.2144\">\n<path d=\"m0 0h48v48h-48z\" fill=\"none\"/>\n<path d=\"m38.86 25.95c0.08-0.64 0.14-1.29 0.14-1.95s-0.06-1.31-0.14-1.95l4.23-3.31c0.38-0.3 0.49-0.84 0.24-1.28l-4-6.93c-0.25-0.43-0.77-0.61-1.22-0.43l-4.98 2.01c-1.03-0.79-2.16-1.46-3.38-1.97l-0.75-5.3c-0.09-0.47-0.5-0.84-1-0.84h-8c-0.5 0-0.91 0.37-0.99 0.84l-0.75 5.3c-1.22 0.51-2.35 1.17-3.38 1.97l-4.98-2.01c-0.45-0.17-0.97 0-1.22 0.43l-4 6.93c-0.25 0.43-0.14 0.97 0.24 1.28l4.22 3.31c-0.08 0.64-0.14 1.29-0.14 1.95s0.06 1.31 0.14 1.95l-4.22 3.31c-0.38 0.3-0.49 0.84-0.24 1.28l4 6.93c0.25 0.43 0.77 0.61 1.22 0.43l4.98-2.01c1.03 0.79 2.16 1.46 3.38 1.97l0.75 5.3c0.08 0.47 0.49 0.84 0.99 0.84h8c0.5 0 0.91-0.37 0.99-0.84l0.75-5.3c1.22-0.51 2.35-1.17 3.38-1.97l4.98 2.01c0.45 0.17 0.97 0 1.22-0.43l4-6.93c0.25-0.43 0.14-0.97-0.24-1.28zm-14.86 5.05c-3.87 0-7-3.13-7-7s3.13-7 7-7 7 3.13 7 7-3.13 7-7 7z\"/>\n</g>\n</svg>`\n\n\nconst HOME = `<svg version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<g fill=\"currentColor\">\n<rect x=\"4.2337\" y=\"3.9367\" width=\"3.0541\" height=\"4.063\"/>\n<rect x=\"1.2121\" y=\"3.9367\" width=\".9332\" height=\"4.0184\"/>\n<path d=\"m4.2479 1.0276 3.7518 3.4383-7.5035-1e-7z\"/>\n<rect x=\"1.6787\" y=\"3.9367\" width=\"3.2135\" height=\"1.4646\"/>\n</g>\n</svg>`\n\n\nconst TRASH = `<svg version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\">\n<g fill=\"currentColor\">\n<path d=\"m6.5113 2.4805h-4.775l0.85705 5.5191h3.0609z\" stroke-linecap=\"square\" stroke-width=\"1.3229\"/>\n<path d=\"m3.2115 0.40101v0.41341h-1.8266v0.86816h5.519v-0.86816h-1.8462v-0.41341z\"/>\n</g>\n</svg>`\n\nconst DIRDEF = '<svg width=\"32\" height=\"32\" version=\"1.1\" viewBox=\"0 0 8.4667 8.4667\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\".4961\" y=\"3.9307\" width=\"7.5035\" height=\"4.0689\"/><path d=\"m0.4961 3.2521h7.5035l1e-7 -0.71184h-4.2386l-0.87664-1.3525h-2.3883z\"/><rect x=\"5.8727\" y=\"5.303\" width=\"1.2058\" height=\"1.1077\" fill=\"#fff\"/></svg>'\n\n\n\nconst UNSORT = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg version=\"1.1\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m2.1656 5.2663 3.8057-4.6994 3.8057 4.6994z\" fill=\"currentColor\"/>\n<path d=\"m2.1656 6.6955 3.8057 4.6994 3.8057-4.6994z\" fill=\"currentColor\"/>\n</svg>`\n\nconst SORTASC = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg version=\"1.1\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m2.1943 9.1198 3.8057-6.5338 3.8057 6.5338z\" fill=\"currentColor\"/>\n</svg>`\n\nconst SORTDESC = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg version=\"1.1\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"m2.1943 2.586 3.8057 6.5338 3.8057-6.5338z\" fill=\"currentColor\"/>\n</svg>\n`\n\nconst YES = `<svg width=\"1rem\" height=\"1rem\" viewBox=\"0 0 30 30\" xmlns=\"http://www.w3.org/2000/svg\">\n<circle cx=\"15\" cy=\"15\" r=\"12\" stroke=\"currentColor\" stroke-width=\"1\" fill=\"none\" />\n<circle cx=\"15\" cy=\"15\" r=\"8\" fill=\"currentColor\" />\n</svg>`\n\nconst NO = `<svg width=\"1rem\" height=\"1rem\" viewBox=\"0 0 30 30\" xmlns=\"http://www.w3.org/2000/svg\">\n<circle cx=\"15\" cy=\"15\" r=\"12\" stroke=\"currentColor\" stroke-width=\"1\" fill=\"none\" />\n</svg>`\n\nconst NEWDOCUMENT = `<svg version=\"1.1\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n<g stroke-linecap=\"round\" stroke-linejoin=\"bevel\" stroke-width=\"2\">\n<path d=\"m40 34.75v-30.75h-30v41h20z\" fill=\"#e6e6e6\" stroke=\"#000\"/>\n<circle cx=\"25\" cy=\"21\" r=\"9\" fill=\"#59f\" stroke=\"#000\"/>\n<path d=\"m30 45v-10h10z\"/>\n<path d=\"m20 21h10\" stroke=\"#fff\"/>\n<path d=\"m25 16v10\" stroke=\"#fff\"/>\n</g>\n</svg>`\n\n\nconst PROGRAM = `<svg version=\"1.1\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n<g fill=\"currentColor\">\n<path d=\"m20.019 2c-2.9332 0-5.2348 2.3057-5.2348 5.2389v3.1417h-8.3806c-2.3047 0-4.1903 1.8856-4.1903 4.1903v7.9628h3.1417c3.1427 0 5.6567 2.514 5.6567 5.6567 0 3.1427-2.514 5.6567-5.6567 5.6567h-3.3547v7.9628c0 2.3047 1.8856 4.1903 4.1903 4.1903h7.9628v-3.1458c0-3.1427 2.514-5.6567 5.6567-5.6567 3.1427 0 5.6567 2.514 5.6567 5.6567v3.1458h7.9628c2.3047 0 4.1903-1.8856 4.1903-4.1903v-8.3806h3.1417c2.9332 0 5.2389-2.3057 5.2389-5.2389 0-2.9332-2.3057-5.2389-5.2389-5.2389h-3.1417v-8.3806c0-2.3047-1.8856-4.1903-4.1903-4.1903h-8.3806v-3.1417c0.20951-2.9332-2.0968-5.2389-5.03-5.2389z\"/>\n</g>\n</svg>`\n\n\nexport default class Icons {\n\tstatic get MENU() { return MENU }\n\tstatic get CLOSE() { return CLOSE }\n\tstatic get BACK() { return BACK }\n\tstatic get ACTION() { return ACTION }\n\tstatic get USER() { return USER }\n\tstatic get LOGOUT() { return LOGOUT }\n\tstatic get SEARCH() { return SEARCH }\n\tstatic get SETTING() { return SETTING }\n\tstatic get HOME() { return HOME }\n\tstatic get TRASH() { return TRASH }\n\tstatic get DIRDEF() { return DIRDEF }\n\tstatic get UNSORT() { return UNSORT }\n\tstatic get SORTASC() { return SORTASC }\n\tstatic get SORTDESC() { return SORTDESC }\n\tstatic get YES() { return YES }\n\tstatic get NO() { return NO }\n\tstatic get NEWDOCUMENT() { return NEWDOCUMENT }\n\tstatic get PROGRAM() { return PROGRAM }\n}","import ICONS from './Icons.mjs'\nimport Component from \"./Component.mjs\"\n\nconst ATTR_ROWSELECTOR = 'rowselector'\nconst ATTR_AUTONUMBER = 'autonumber'\nconst ATTR_BINDING = 'binding'\nconst ATTR_SORTING = 'sorting'\nconst ATTR_FORMATTER = 'formatter'\nconst ATTR_TEXTALIGN = 'text-align'\nconst ATTR_ROWSELECTED = 'data-selected'\nconst ATTR_COLNAME = 'data-name'\nconst ATTR_VALUE = 'data-value'\nconst ATTR_ROWKEY = 'key'\nconst ATTR_ROWKEYVALUE = 'keyvalue'\nconst ATTR_ROWPROCESSING = 'data-rowprocessing'\nconst ATTR_MAINHEADROW = 'data-mainrowhead' // menandai row utama header (berisi contol sorting)\nconst ATTR_LINENUMBER = \"linenumber\"\n\nconst TYPE_ROWSELECTOR = 'rowselector'\nconst TYPE_AUTONUMBER = 'autonumber'\nconst TYPE_STANDARD = 'standard'\n\nconst cellClickEvent = (data) => { return new CustomEvent('cellclick', data) }\nconst cellDblClickEvent = (data) => { return new CustomEvent('celldblclick', data) }\nconst rowRenderEvent = (data) => { return new CustomEvent('rowrender', data) }\nconst rowRemovingEvent = (data) => { return new CustomEvent('rowremoving', data) }\nconst sortingEvent = (data) => { return new CustomEvent('sorting', data) }\nconst nextDataEvent = (data) => { return new CustomEvent('nextdata', data) }\n\nexport default class Gridview extends Component {\n\tconstructor(id) {\n\t\tsuper(id)\n\t\t\n\t\tvar el = this.Element\n\t\tif (el!=undefined) {\n\t\t\tif (el.tagName.toLowerCase()!='table' ) {\n\t\t\t\tthrow new Error(`element '${id}' is not table`)\n\t\t\t}\n\t\t\tgrv_construct(this)\n\t\t} else {\n\t\t\tthrow new Error(`element id '${id}' for gridview is not defined`)\n\t\t}\n\t}\n\n\t/* menambahkan satu baris */\n\taddRow(row) {\n\t\treturn grv_addRow(this, row)\n\t}\n\n\t/* menambahkan multi baris */\n\taddRows(rows) {\n\t\tgrv_addRows(this, rows)\n\t}\n\n\n\tupdateRow(tr, data) {\n\t\tgrv_updateRow(this, tr, data)\n\t}\n\n\n\tsetNext(nextoffset, limit) {\n\t\t// grv_setNext(this, nextoffset, limit)\n\t}\n\n\tscrollToFooter() {\n\t\tscrollToFooter(this)\n\t}\n\n\t#columndata\n\tget Columns() { return this.#columndata }\n\tsetColumnData(columndata) {\n\t\tthis.#columndata = columndata\n\t}\n\n\t#key\n\tget Key() { return this.#key }\n\tsetKey(key) {\n\t\tthis.#key = key\n\t}\n\n\n\n\trowRender(tr) {\n\t\tgrv_rowRender(this, tr)\n\t}\n\n\tremoveSelected(onFinished) {\n\t\tgrv_removeSelected(this, onFinished)\n\t}\n\n\tremoveRow(tr) {\n\t\tgrv_removeRow(this, tr)\n\t}\n\n\tgetSelected() {\n\t\treturn grv_getSelected(this)\n\t}\n\n\n\thasRowPendingProcess() {\n\t\treturn grv_hasRowPendingProcess(this)\n\t}\n\n\taddEventListener(evt, callback) {\n\t\tthis.Listener.addEventListener(evt, callback)\n\t}\n\n\tclear() {\n\t\tthis.Nodes.Tbody.innerHTML = ''\n\t}\n\n\tsetNext(nextoffset, limit) {\n\t\tgrv_setNext(this, nextoffset, limit)\n\t}\n\n\tgetSort() {\n\t\treturn grv_getSort(this)\n\t}\n\n\t#criteria = {}\n\tget Criteria() { return this.#criteria } \n\tsetCriteria(criteria) {\n\t\tthis.#criteria = criteria\n\t}\n\n\n\t#currentRow\n\tget CurrentRow() { return this.#currentRow }\n\tset CurrentRow(tr) {\n\t\tthis.#currentRow = tr\n\t\tgrv_setCurentRow(this, tr)\n\t}\n\t\n\t\n\n\tpreviousRecord() {\n\t\tgrv_previousRecord(this)\n\t}\n\n\tnextRecord() {\n\t\tgrv_nextRecord(this)\n\t}\n}\n\n\nfunction grv_previousRecord(self) {\n\tconst currentRow = self.CurrentRow\n\tif (currentRow==null) {\n\t\t// set row pertama sebagai current row\n\t\tconsole.log('set current row to first row')\n\t\tconst tbody = self.Nodes.Tbody\n\t\tconst tr = tbody.querySelector('tr')\n\t\tself.CurrentRow = tr\n\t} else {\n\t\tconst tr = currentRow\n\t\tif (tr.previousElementSibling) {\n\t\t\tself.CurrentRow = tr.previousElementSibling\n\t\t}\n\t}\n}\n\n\nfunction grv_nextRecord(self) {\n\tconst currentRow = self.CurrentRow\n\tif (currentRow==null) {\n\t\t// set row pertama sebagai current row\n\t\tconsole.log('set current row to first row')\n\t\tconst tbody = self.Nodes.Tbody\n\t\tconst tr = tbody.querySelector('tr')\n\t\tself.CurrentRow = tr\n\t} else {\n\t\tconst tr = currentRow\n\t\tif (tr.nextElementSibling) {\n\t\t\tself.CurrentRow = tr.nextElementSibling\n\t\t}\n\t}\n}\n\n\nfunction grv_setCurentRow(self, tr) {\n\t// kosongkan atribute terpilih\t\n\tconst tbody = self.Nodes.Tbody\n\tconst rows = tbody.querySelectorAll('tr[data-currentrow]')\n\trows.forEach(tr=>{\n\t\ttr.removeAttribute('data-currentrow')\n\t})\n\n\tif (tr!=null) {\n\t\t// set atribut terpilih untuk tr\n\t\ttr.setAttribute('data-currentrow', '')\n\t\tif (!isElementInViewport(tr)) {\n\t\t\ttr.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\t\t}\n\t}\n}\n\nfunction grv_removeRow(self, tr) {\n\tconst tbody = self.Nodes.Tbody\n\ttr.remove()\n\tif (tbody.children.length==0) {\n\t\tself.CurrentRow = null\n\t}\n}\n\nfunction isElementInViewport(el) {\n\tconst rect = el.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nfunction grv_construct(self) {\n\tvar tbl = self.Element\n\tvar thead = tbl.querySelector('thead')\n\tvar tbody = document.createElement('tbody')\n\tvar tfoot = document.createElement('tfoot')\n\t\n\t\n\t// tambahkan tbody dan tfoot sebelum thead\n\ttbl.prepend(tfoot)\n\ttbl.prepend(tbody)\n\n\t// tambahkan referensi elemen \n\tself.Formatters = {}\n\tself.Listener = new EventTarget()\n\tself.Nodes = {\n\t\tTable: tbl,\n\t\tThead: thead,\n\t\tTbody: tbody,\n\t\tTfoot: tfoot\n\t}\n\n\n\t// setup table\n\ttbl.classList.add('fgta5-gridview')\n\ttbl.setAttribute('cellspacing', 0)\n\t\n\n\t// baca kolom\n\tconst {headrow, columns, key} =grv_getColumns(self)\n\tself.setColumnData(columns)\n\tself.setKey(key)\n\n\t// create header\n\theadrow.remove()\n\tgrv_setupHeader(self, columns)\n\n\t\n\n\n\t// const columns = grv_getColumns()\n\t// grv_createTableHaeder(self, tbl)\n\n\n}\n\nfunction scrollToFooter(self) {\n\tvar tfoot = self.Nodes.Tfoot\n\ttfoot.scrollIntoView({ behavior: 'smooth' });\n}\n\n\nfunction grv_getColumns(self) {\n\tvar columns = []\n\tvar thead = self.Nodes.Thead\n\tvar headrow = thead.querySelector(\"tr[data-header]\")\n\tvar ths = headrow.querySelectorAll(\"th\")\n\tfor (var th of ths) {\n\t\tlet column = {}\n\t\tvar rowselector = th.getAttribute(ATTR_ROWSELECTOR)\n\t\tvar autonumber = th.getAttribute(ATTR_AUTONUMBER)\n\t\tvar binding = th.getAttribute(ATTR_BINDING)\n\t\tvar name = th.getAttribute(ATTR_COLNAME)\n\t\tvar formatter = th.getAttribute(ATTR_FORMATTER)\n\t\tvar textalign = (th.getAttribute(ATTR_TEXTALIGN) ?? '').toLowerCase()\n\t\tvar sorting = (th.getAttribute(ATTR_SORTING) ?? '').toLowerCase() === \"true\" ? true : false\n\t\tvar cssclass = th.getAttribute('class')\n\t\tvar cssstyle = th.getAttribute('style')\n\t\tvar html = th.innerHTML\n\t\t\n\t\t\n\n\t\t// baca tipe column\n\t\tif (rowselector!=null) {\n\t\t\tcolumn.type = TYPE_ROWSELECTOR\n\t\t} else if (autonumber!=null) {\n\t\t\tcolumn.type = TYPE_AUTONUMBER\n\t\t} else {\n\t\t\tcolumn.type = TYPE_STANDARD\n\t\t}\n\n\t\t// ambil daftar class\n\t\tcolumn.cssclass = cssclass\n\t\tcolumn.cssstyle = cssstyle\n\t\tcolumn.binding = binding\n\t\tcolumn.name = name \n\t\tcolumn.formatter = formatter\n\t\tcolumn.textalign = textalign=='' ? 'left' : textalign\n\t\tcolumn.sorting = sorting\n\t\tcolumn.html = html\n\n\t\tcolumns.push(column)\n\t}\n\n\tvar key = headrow.getAttribute(ATTR_ROWKEY)\n\n\treturn {\n\t\theadrow: headrow,\n\t\tcolumns: columns,\n\t\tkey: key\n\t}\n}\n\n\nfunction grv_setupHeader(self, columns) {\n\tvar tr = document.createElement('tr')\n\ttr.setAttribute(ATTR_MAINHEADROW, '')\n\n\tfor (let column of columns) {\n\t\tvar th = document.createElement('th')\n\n\t\tsetAttributeIfNotNull(th, 'class', column.cssclass)\n\t\tsetAttributeIfNotNull(th, 'style', column.cssstyle)\n\t\tsetAttributeIfNotNull(th, ATTR_COLNAME, column.name)\n\n\t\tth.classList.add('fgta5-gridview-head')\n\t\tth.setAttribute(ATTR_TEXTALIGN, column.textalign)\n\n\t\tif (column.type==TYPE_ROWSELECTOR) {\n\t\t\tvar chk = createCheckbox()\n\t\t\tchk.addEventListener('change', (evt)=>{ grv_headerCheckboxChange(self, evt)})\n\t\t\t\n\t\t\tth.appendChild(chk)\n\t\t\tth.setAttribute(ATTR_ROWSELECTOR, '')\n\n\t\t} else if (column.type==TYPE_AUTONUMBER) {\n\t\t\tth.setAttribute(ATTR_AUTONUMBER, '')\n\t\t\tth.innerHTML = column.html\n\t\t} else {\n\n\t\t\tif (column.sorting) {\n\t\t\t\tvar container = document.createElement('span')\n\t\t\t\tcontainer.setAttribute('container', '')\n\t\t\t\tcontainer.setAttribute(ATTR_TEXTALIGN, column.textalign)\n\n\t\t\t\tlet sortbtn = document.createElement('button')\n\t\t\t\tsortbtn.innerHTML = ICONS.UNSORT\n\t\t\t\tsortbtn.setAttribute(ATTR_SORTING, '')\n\t\t\t\tsortbtn.setAttribute(ATTR_BINDING, column.binding)\n\t\t\t\tsortbtn.addEventListener('click', (evt)=>{ grv_sort(self, sortbtn) })\n\n\t\t\t\tvar text = document.createElement('div')\n\t\t\t\ttext.innerHTML = column.html\n\n\t\t\t\tcontainer.appendChild(sortbtn)\n\t\t\t\tcontainer.appendChild(text)\n\n\t\t\t\tth.classList.add('fgta5-gridview-colwithbutton')\n\t\t\t\tth.appendChild(container)\n\n\t\t\t} else {\n\n\t\t\t\tvar text = document.createTextNode(column.html)\n\t\t\t\tth.appendChild(text)\n\t\t\t}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t}\n\n\t\ttr.appendChild(th)\n\t}\n\tself.Nodes.Thead.appendChild(tr)\n}\n\n\n\n\nfunction setAttributeIfNotNull(el, attrname, attrvalue) {\n\tif (attrvalue!=null) {\n\t\tel.setAttribute(attrname, attrvalue)\n\t}\n}\n\nfunction createCheckbox() {\n\tvar chk = document.createElement('label')\n\tvar input = document.createElement('input')\n\tvar span = document.createElement('span')\n\n\tchk.classList.add('fgta5-gridview-checkbox')\n\tchk.appendChild(input)\n\tchk.appendChild(span)\n\tchk.checkbox = input\n\n\tinput.setAttribute('type', 'checkbox')\n\n\tspan.classList.add('fgta5-gridview-checkmark')\n\n\treturn chk\n}\n\n\nfunction grv_headerCheckboxChange(self, evt) {\n\tvar headchk = evt.target\n\tvar trs = self.Nodes.Tbody.querySelectorAll('tr');\n\tfor (var tr of trs) {\n\t\tvar chk = tr.querySelector(`td[${ATTR_ROWSELECTOR}] input[type=\"checkbox\"]`)\n\t\tchk.checked = headchk.checked\n\t\tif (headchk.checked) {\n\t\t\ttr.setAttribute(ATTR_ROWSELECTED, '')\n\t\t} else {\n\t\t\ttr.removeAttribute(ATTR_ROWSELECTED)\n\t\t}\n\t}\n}\n\nfunction grv_rowCheckboxChange(self, evt) {\n\tvar chk = evt.target\n\tvar tr = chk.closest('tr')\n\tif (chk.checked) {\n\t\ttr.setAttribute(ATTR_ROWSELECTED, '')\n\t} else {\n\t\ttr.removeAttribute(ATTR_ROWSELECTED)\n\n\t\t// uncheck header\n\t\tvar headchk = self.Nodes.Thead.querySelector(`tr th[${ATTR_ROWSELECTOR}] input[type=\"checkbox\"]`)\n\t\theadchk.checked = false\n\t}\n}\n\nfunction grv_addRows(self, rows) {\n\tvar tbody = self.Nodes.Tbody\n\tfor (var row of rows) {\n\t\tgrv_addRow(self, row, tbody)\n\t}\n}\n\n\nfunction grv_updateRow(self, tr, data) {\n\tconst tds = tr.querySelectorAll('td')\n\ttds.forEach(td => {\n\t\tconst name = td.getAttribute('data-name')\n\t\tif (name!=null && data[name]!==undefined) {\n\t\t\t// ambil formater column\t\n\t\t\tlet value = data[name]\n\t\t\tconst func = self.Formatters[name]\n\t\t\tif (typeof func==='function') {\n\t\t\t\tvalue = func(data[name])\n\t\t\t} \n\t\t\ttd.innerHTML = value\n\t\t}\t\n\t})\n\tgrv_rowRender(self, tr)\n}\n\n\n\nfunction grv_addRow(self, row, tbody) {\n\tif (tbody===undefined) {\n\t\ttbody = self.Nodes.Tbody\n\t}\n\n\tvar tr = document.createElement('tr')\n\ttr.classList.add('fgta5-gridview-row')\n\n\tvar key = self.Key\n\tif (key!=null) {\n\t\tvar keyvalue = row[key]\n\t\tif (keyvalue!=null) {\n\t\t\ttr.setAttribute(ATTR_ROWKEY, key)\n\t\t\ttr.setAttribute(ATTR_ROWKEYVALUE, keyvalue)\n\t\t}\n\t}\n\n\tfor (var column of self.Columns) {\n\t\tlet td = document.createElement('td')\n\n\t\tsetAttributeIfNotNull(td, 'class', column.cssclass)\n\t\tsetAttributeIfNotNull(td, 'style', column.cssstyle)\n\t\tsetAttributeIfNotNull(td, ATTR_COLNAME, column.name)\n\t\tsetAttributeIfNotNull(td, ATTR_BINDING, column.binding)\n\t\tsetAttributeIfNotNull(td, ATTR_FORMATTER, column.formatter)\n\t\tsetAttributeIfNotNull(td, ATTR_TEXTALIGN, column.textalign)\n\t\n\n\t\ttd.classList.add('fgta5-gridview-cell')\n\t\n\t\tif (column.type==TYPE_ROWSELECTOR) {\n\t\t\tvar chk = createCheckbox()\n\t\t\tchk.addEventListener('change', (evt)=>{ grv_rowCheckboxChange(self, evt) })\n\t\t\ttd.appendChild(chk)\n\t\t\ttd.setAttribute(ATTR_ROWSELECTOR, '')\n\t\t} else if (column.type==TYPE_AUTONUMBER) {\n\t\t\tvar linenumber = grv_getLastLineNumber(self)\n\n\t\t\tlinenumber++\n\t\t\ttd.setAttribute(ATTR_AUTONUMBER, '')\n\t\t\ttd.setAttribute(ATTR_LINENUMBER, linenumber)\n\t\t\ttd.innerHTML = linenumber\n\t\t\ttd.addEventListener('click', (evt)=>{ grv_cellClick(self, td, tr) })\n\t\t\ttd.addEventListener('dblclick', (evt)=>{ grv_cellDblClick(self, td, tr) })\n\t\t} else {\n\n\t\t\tlet value = row[column.binding]\n\t\t\ttd.setAttribute(ATTR_VALUE, value)\n\n\t\t\tif (column.formatter!=null) {\n\t\t\t\ttry {\n\t\t\t\t\t// \teval(`value=${column.formatter}`)\n\t\t\t\t\tlet func = self.Formatters[column.name]\n\t\t\t\t\tif (func===undefined) {\n\t\t\t\t\t\tfunc = grv_createFunction(column.formatter)\n\t\t\t\t\t\tif (typeof func === 'function') {\n\t\t\t\t\t\t\tself.Formatters[column.name] = func\n\t\t\t\t\t\t}\n\t\t\t\t\t} \n\t\t\t\t\t\n\t\t\t\t\tif (typeof func === 'function') {\n\t\t\t\t\t\tvalue = func(value)\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(err)\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tif (value!=null) {\n\t\t\t\ttd.innerHTML = value\n\t\t\t} else {\n\t\t\t\ttd.innerHTML = ''\n\t\t\t}\n\n\t\t\ttd.addEventListener('click', (evt)=>{ grv_cellClick(self, td, tr) })\n\t\t\ttd.addEventListener('dblclick', (evt)=>{ grv_cellDblClick(self, td, tr) })\n\t\t}\n\n\t\t\n\t\n\t\ttr.appendChild(td)\n\t}\n\n\tgrv_rowRender(self, tr)\n\n\tif (tbody.children.length==0) {\n\t\tself.CurrentRow = tr\n\t}\n\n\n\ttbody.appendChild(tr)\n\t\n\treturn tr\n}\n\n\nfunction grv_cellClick(self, td, tr) {\n\tself.CurrentRow = tr\n\tself.Listener.dispatchEvent(cellClickEvent({\n\t\tdetail: {tr: tr, td: td}\n\t}))\n}\n\nfunction grv_cellDblClick(self, td, tr) {\n\tself.CurrentRow = tr\n\tself.Listener.dispatchEvent(cellDblClickEvent({\n\t\tdetail: {tr: tr, td: td}\n\t}))\n}\n\nfunction grv_rowRender(self, tr) {\n\tself.Listener.dispatchEvent(rowRenderEvent({\n\t\tdetail: {tr: tr}\n\t}))\n}\n\nfunction grv_sort(self, btn) {\n\tvar sorting = btn.getAttribute(ATTR_SORTING)\n\tvar binding = btn.getAttribute(ATTR_BINDING)\n\tvar th = btn.closest('th')\n\t\n\tth.setAttribute(ATTR_BINDING, binding)\n\n\tif (sorting==null || sorting=='') {\n\t\t// ubah ke ascending\n\t\tth.setAttribute(ATTR_SORTING, 'asc')\n\t\tbtn.setAttribute(ATTR_SORTING, 'asc')\n\t\tbtn.innerHTML = ICONS.SORTASC\n\t} else if (sorting=='asc') {\n\t\t// ubah ke desc\n\t\tth.setAttribute(ATTR_SORTING, 'desc')\n\t\tbtn.setAttribute(ATTR_SORTING, 'desc')\n\t\tbtn.innerHTML = ICONS.SORTDESC\n\t} else {\n\t\t// ubah ke unsort\n\t\tth.removeAttribute(ATTR_SORTING)\n\t\tbtn.setAttribute(ATTR_SORTING, '')\n\t\tbtn.innerHTML = ICONS.UNSORT\n\t}\n\n\t// ambil semua kolom yang di sort\n\tconst tr = btn.closest('tr')\n\tconst sort = grv_getSort(self, tr)\n\tconst criteria = self.Criteria\n\n\tself.Listener.dispatchEvent(sortingEvent({\n\t\tdetail: {\n\t\t\tsort: sort,\n\t\t\tcriteria: criteria\n\t\t\n\t\t}\n\t}))\n\n}\n\n\nfunction grv_getSelected(self) {\n\tvar chks = self.Nodes.Tbody.querySelectorAll(`tr td[${ATTR_ROWSELECTOR}] input[type=\"checkbox\"]:checked`);\n\tif (chks.length==0) {\n\t\treturn []\n\t}\n\n\tconst selected = []\n\tfor (let chk of chks) {\n\t\tconst tr = chk.closest('tr')\n\t\tconst keyvalue = tr.getAttribute(ATTR_ROWKEYVALUE)\n\t\tselected.push(keyvalue)\n\t}\n\n\treturn selected\n}\n\nfunction grv_removeSelected(self, onFinished) {\n\tvar chks = self.Nodes.Tbody.querySelectorAll(`tr td[${ATTR_ROWSELECTOR}] input[type=\"checkbox\"]:checked`);\n\tif (chks.length==0) {\n\t\tif (typeof onFinished==='function') {\n\t\t\tonFinished()\n\t\t}\n\t\treturn\n\t}\n\n\n\tfor (var chk of chks) {\n\t\tlet tr = chk.closest('tr')\n\t\ttr.MarkProcessing = (p)=>{\n\t\t\tif (p===true || p===undefined) {\n\t\t\t\ttr.setAttribute(ATTR_ROWPROCESSING, '')\n\t\t\t} else {\n\t\t\t\ttr.removeAttribute(ATTR_ROWPROCESSING)\n\t\t\t}\n\t\t}\n\n\t\tlet evt = rowRemovingEvent({\n\t\t\tdetail: {\n\t\t\t\ttr: tr,\n\t\t\t\tonFinished: onFinished\n\t\t\t}\n\t\t})\n\n\t\ttr.MarkProcessing()\n\t\tself.Listener.dispatchEvent(evt)\n\t\tif (!evt.handled) {\n\t\t\ttr.MarkProcessing(false)\n\t\t\tself.removeRow(tr)\n\t\t}\n\t}\n}\n\n\nfunction grv_hasRowPendingProcess(self) {\n\tvar rows = self.Nodes.Tbody.querySelectorAll(`tr[${ATTR_ROWPROCESSING}]`)\n\n\tconsole.log(rows.length)\n\tif (rows.length > 0) {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\n\nfunction grv_setNext(self, nextoffset, limit) {\n\tvar nextoffsetcontainer = self.Nodes.Tfoot.querySelector('tr[data-nextoffset]')\n\tif (nextoffsetcontainer!=null) {\n\t\tnextoffsetcontainer.remove()\n\t}\n\t\n\t\n\n\tif (nextoffset!=null) {\n\t\tvar tr = document.createElement('tr')\n\t\tvar td = document.createElement('td')\n\t\tvar next = document.createElement('a')\n\n\t\tnext.innerHTML = 'load next data'\n\t\tnext.setAttribute('href', 'javascript:void(0)')\n\t\tnext.addEventListener('click', (evt)=>{\n\t\t\tself.Listener.dispatchEvent(nextDataEvent({\n\t\t\t\tdetail: {\n\t\t\t\t\tcriteria: self.Criteria,\n\t\t\t\t\tnextoffset: nextoffset,\n\t\t\t\t\tlimit: limit,\n\t\t\t\t\tsort: self.getSort()\n\t\t\t\t}\n\t\t\t}))\n\t\t})\n\t\n\t\tvar colspan = self.Nodes.Tbody.rows[0].cells.length\n\t\ttd.setAttribute('colspan', colspan)\n\t\ttd.setAttribute('align', 'center')\n\t\ttd.setAttribute('data-nextoffset', '')\n\t\ttd.appendChild(next)\n\t\t\n\t\ttr.setAttribute('data-nextoffset', '')\n\t\ttr.appendChild(td)\n\t\tself.Nodes.Tfoot.appendChild(tr)\n\t\n\t} \n}\n\nfunction grv_getSort(self, tr) {\n\tif (tr==null) {\n\t\ttr = self.Nodes.Thead.querySelector(`tr[${ATTR_MAINHEADROW}]`)\n\t}\n\n\tvar ths = tr.querySelectorAll(`th[${ATTR_SORTING}]`)\n\tvar sort = {}\n\tfor (var th of ths) {\n\t\tvar sorting = th.getAttribute(ATTR_SORTING)\n\t\tvar binding = th.getAttribute(ATTR_BINDING)\n\t\tsort[binding] = sorting\n\t}\n\n\treturn sort\n}\n\n\nfunction grv_getLastLineNumber(self) {\n\tvar lastrow = self.Nodes.Tbody.querySelector('tr:last-child td[autonumber]')\n\tif (lastrow==null) {\n\t\treturn 0\n\t}\n\n\tvar lastlinenumber = lastrow.getAttribute(ATTR_LINENUMBER)\n\tif (lastlinenumber==null) {\n\t\treturn 0\n\t}\n\n\treturn Number(lastlinenumber)\n}\n\n\nfunction grv_createFunction(expression) {\n const match = expression.match(/(\\w+)\\(([^)]+)\\)/);\n if (!match) return null;\n\n const [, funcName, args] = match;\n const parsedArgs = args.split(\",\").map(arg => parseFloat(arg.trim()));\n\n if (funcName === \"decimal\") {\n return (v) => grv_formatDecimal(v, parsedArgs[1]);\n } else if (funcName === 'int') {\n\t\treturn (v) => grv_formatInteger(v)\n\t} else if (funcName === 'checkmark') {\n\t\treturn (v) => grv_formatCheckmark(v)\n\t} else if (funcName === 'dateiso') {\n\t\treturn (v) => grv_formatDateIso(v)\n\t} else if (funcName === 'datelong') {\n\t\treturn (v) => grv_formatDateLong(v)\n\t} else if (funcName === 'dateshort' || funcName=== 'date') {\n\t\treturn (v) => grv_formatDateShort(v)\n\t}\n return null;\n}\n\n\nfunction grv_formatDecimal (value, precision) { \n\tconst formatterFixed = new Intl.NumberFormat('en-US', {\n\t\tminimumFractionDigits: precision,\n\t\tmaximumFractionDigits: precision\n\t});\n\treturn formatterFixed.format(value)\n}\n\nfunction grv_formatInteger (value) { \n\tconst formatterFixed = new Intl.NumberFormat('en-US', {\n\t\tminimumFractionDigits: 0,\n\t\tmaximumFractionDigits: 0,\n\t\tuseGrouping: false\n\t});\n\treturn formatterFixed.format(value)\n}\n\nfunction grv_formatCheckmark(value) {\n\tconst yes = ICONS.YES\n\tconst no = ICONS.NO\n\n\tif (value===undefined || value===null) {\n\t\treturn no\n\t}\n\n\tif (value===false) {\n\t\treturn no\n\t}\n\n\tif (value=='0' || value=='' ||value=='-' || value==0) {\n\t\treturn no\n\t}\n\n\treturn yes\n}\n\nfunction grv_formatDateIso(value) {\n\tconst dt = new Date(value)\n\tconst str = dt.toISOString().split(\"T\")[0]\n\treturn str\n}\n\nfunction grv_formatDateLong(value) {\n\tconst dt = new Date(value)\n\tconst options = { day: '2-digit', month: 'short', year: 'numeric' };\n\tconst formattedDate = dt.toLocaleDateString('en-ID', options).replace('.', ''); \n\treturn formattedDate\n}\n\nfunction grv_formatDateShort(value) {\n\tconst dt = new Date(value)\n\tconst options = { day: '2-digit', month: '2-digit', year: 'numeric' };\n\tconst formattedDate = dt.toLocaleDateString('en-ID', options).replace('.', ''); \n\treturn formattedDate\n}\n\n\n","const ICON_DEFAULT = `<svg version=\"1.1\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\">\n<g fill=\"currentColor\">\n<path d=\"m20.019 2c-2.9332 0-5.2348 2.3057-5.2348 5.2389v3.1417h-8.3806c-2.3047 0-4.1903 1.8856-4.1903 4.1903v7.9628h3.1417c3.1427 0 5.6567 2.514 5.6567 5.6567 0 3.1427-2.514 5.6567-5.6567 5.6567h-3.3547v7.9628c0 2.3047 1.8856 4.1903 4.1903 4.1903h7.9628v-3.1458c0-3.1427 2.514-5.6567 5.6567-5.6567 3.1427 0 5.6567 2.514 5.6567 5.6567v3.1458h7.9628c2.3047 0 4.1903-1.8856 4.1903-4.1903v-8.3806h3.1417c2.9332 0 5.2389-2.3057 5.2389-5.2389 0-2.9332-2.3057-5.2389-5.2389-5.2389h-3.1417v-8.3806c0-2.3047-1.8856-4.1903-4.1903-4.1903h-8.3806v-3.1417c0.20951-2.9332-2.0968-5.2389-5.03-5.2389z\"/>\n</g>\n</svg>`\n\n\n\nexport default class {\n\tconstructor(param) {\n\t\tthis.#name = param.name\n\t\tthis.#title = param.title\n\t\tthis.#disabled = param.disabled\n\t\tthis.#icon = param.icon\n\t\tthis.#url = param.url\n\t}\n\n\tstatic get ICON_DEFAULT() { return ICON_DEFAULT }\n\n\t#name\n\tget name() { return this.#name }\n\n\t#title\n\tget title() { return this.#title }\n\n\t#disabled\n\tget disabled() { return this.#disabled===true ? true : false}\n\n\t#icon\n\tget icon() { return this.#icon }\n\n\t#url \n\tget url() { return this.#url }\n}","import ICONS from \"./Icons.mjs\"\nimport Component from \"./Component.mjs\"\nimport ModuleData from \"./ModuleData.mjs\"\n\nconst ATTR_NAVSHOWED = 'showed'\nconst ATTR_MODULENAME = 'data-module'\nconst ATTR_FAVOURITE = \"data-favourite\"\nconst ATTR_OPENEDMODULE = 'data-openedmodule'\nconst ATTR_CURRENTUSER = 'data-currentuser'\nconst ATTR_MENUICONCONTAINER = 'data-iconcontainer'\nconst ATTR_MENUICONIMAGE = 'data-iconimage'\nconst ATTR_MENUICONTEXT = 'data-icontext'\nconst ATTR_GRIDAREA = 'data-gridarea'\nconst ATTR_SHORTCUT_ICON = 'data-icon'\nconst ATTR_SHORTCUT_TITLE = 'data-title'\nconst ATTR_SHORTCUT_INFO = 'data-info'\nconst ATTR_SHORTCUT_CLOSE = 'data-buttonclose'\nconst ATTR_DRAGOVER = 'data-dragover'\nconst ATTR_LABEL = 'data-label'\nconst ATTR_ICON = 'data-icon'\nconst ATTR_MAINBUTTON = 'data-mainbutton'\nconst ATTR_DRAGGABLE = 'draggable'\n\nconst CLS_BUTTONHEAD = 'fgta5-button-head'\nconst CLS_BUTTONMENU = 'fgta5-button-menu'\nconst CLS_SHORTCUTBUTTONCLOSE = 'fgta5-button-shorcutclose'\nconst CLS_HIDDEN = 'hidden'\n\nconst EVT_CLICK = 'click'\nconst EVT_DBLCLICK = 'dblclick'\nconst EVT_DRAGSTART = 'dragstart'\n\nconst TXT_FAVOURITE = 'Favourite Programs'\nconst TXT_OPENED = 'Opened Programs'\n\nconst C_SHORTCUT_PREFIX = 'fgta5-sch-mod-'\n\n\nconst openingModuleEvent = (data) => { return new CustomEvent('openingmodule', data) }\nconst actionEvent = (data) => { return new CustomEvent('action', data) }\nconst logoutEvent = (data) => { return new CustomEvent('logout', data) }\nconst openProfileEvent = (data) => { return new CustomEvent('openprofile', data) }\nconst openPreferenceEvent = (data) => { return new CustomEvent('openpreference', data) }\nconst addToFavouriteEvent = (data) => { return new CustomEvent('addtofavourite', data) }\nconst removeFromFavouriteEvent = (data) => { return new CustomEvent('removefavourite', data) }\n\n\nlet current_dragged_modulename\nlet current_drag_action\nlet drop_valid = false\n\nexport default class AppManager extends Component {\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tappmgr_construct(this)\n\t\tappmgr_listenMessage(this)\n\t}\n\n\n\tRootIcons\n\n\t#modules = {}\n\tget Modules() { return this.#modules }\n\n\n\t#title\n\tget Title() { return this.#title }\n\tsetTitle(title) {\n\t\tthis.#title = title\n\t\tappmgr_setTitle(this, title)\n\t}\n\n\tsetMenu(data) {\n\t\tappmgr_setMenu(this, data)\n\t}\n\n\tshowMenu() {\n\t\tappmgr_showMenu(this)\t\n\t}\n\n\t\n\n\tsetFavourite(data) {\n\t\tappmgr_setFavourite(this, data)\n\t}\n\n\tasync openModule(module) {\n\t\tawait appmgr_openModule(this, module)\n\t\tappmgr_closeMenu(this)\n\t}\n\n\t#userdata\n\tget User() { return this.#userdata }\n\tsetUser(data) {\n\t\tthis.#userdata = data\n\t\tappmgr_setUser(this, data)\n\t}\n\t\n\n\taddEventListener(evt, callback) {\n\t\tthis.Listener.addEventListener(evt, callback)\n\t}\n}\n\nfunction appmgr_construct(self) {\n\tconsole.log('constructiong application manager')\n\n\tconst title = document.createElement('span')\n\tconst main = self.Element \n\tconst head = document.createElement('header')\n\tconst iframes = document.createElement('div')\n\tconst nav = document.createElement('nav')\n\tconst favourite = main.querySelector(`div[${ATTR_FAVOURITE}]`)\n\tconst trahsbox = document.createElement('div')\n\tconst currentuser = main.querySelector(`div[${ATTR_CURRENTUSER}]`)\n\tconst btnmenu = appmgr_createHeadButton(self, ICONS.MENU, ()=>{\n\t\tappmgr_showMenu(self)\n\t})\n\t\n\tmain.after(head)\n\thead.after(iframes)\n\tiframes.after(nav)\n\n\ttitle.innerHTML = 'Application Manager' // default title, nanti diganti dengan SetTitle\n\n\n\thead.classList.add('fgta5-app-head')\n\thead.appendChild(title)\n\thead.appendChild(btnmenu)\n\n\tmain.classList.add('fgta5-app-main')\n\tnav.classList.add('fgta5-appmanager-nav')\n\n\tconst {Opened} = appmgr_createOpenedBoard(self, main)\n\tconst {MenuBoard, MenuFooter, ProfileButton, LogoutButton, MenuResetButton} = appmgr_createMenuBoard(self, nav)\n\n\n\tself.Listener = new EventTarget()\n\tself.Nodes = {\n\t\tHead: head,\n\t\tNav: nav,\n\t\tMain: main,\n\t\tIFrames: iframes,\n\t\tFavourite: favourite,\n\t\tOpened: Opened,\n\t\tCurrentuser: currentuser,\n\t\tMenuBoard: MenuBoard,\n\t\tMenuFooter: MenuFooter, \n\t\tProfileButton: ProfileButton,\n\t\tLogoutButton: LogoutButton,\n\t\tMenuResetButton: MenuResetButton,\n\t\tTrashBox: trahsbox,\n\t\tTitle: title\n\t}\n\n}\n\nfunction appmgr_listenMessage(self) {\n\twindow.addEventListener(\"message\", (evt) => {\n\t\tif (evt.data.action!=undefined) {\n\t\t\tvar action = evt.data.action\n\t\t\tif (action==Component.ACTION_SHOWMENU) {\n\t\t\t\tappmgr_showMenu(self)\n\t\t\t} else if (action==Component.ACTION_SHOWHOME) {\n\t\t\t\tappmgr_showHome(self)\n\t\t\t} else if (action==Component.ACTION_APPLICATIONLOADED) {\n\t\t\t\t// applikasi client di iframe terbuka\n\t\t\t} else if (action=='REDIRECT_TO_LOGIN') {\n\t\t\t\t// ke halaman login\n\t\t\t\tconst nexturl = window.location.href // login dari container akan diredirect kembali ke container\n\t\t\t\tconst nextmodule = evt.data.nexturl // next url yang dikirim dari client adalah url untuk module\n\t\t\t\tconst url = `${evt.data.href}?nexturl=${nexturl}&nextmodule=${nextmodule}`\n\t\t\t\tlocation.href = url\n\t\t\t}\n\t\t}\n\t})\n\n\n\twindow.history.pushState(null, \"\", window.location.href);\n\twindow.addEventListener(\"popstate\", function(evt) {\n\t\tevt.preventDefault()\n\t\twindow.history.pushState(null, \"\", window.location.href);\n\t});\n}\n\n\n\n\nfunction appmgr_createHeadButton(self, svg, fn_click) {\n\treturn Component.createSvgButton(svg, CLS_BUTTONHEAD, fn_click )\n}\n\nfunction appmgr_setTitle(self, title) {\n\tself.Nodes.Title.innerHTML = title\n}\n\n\nfunction appmgr_createMenuBoard(self, nav) {\n\tconst menuhead = document.createElement('div')\n\tconst btnmenureset = appmgr_createHeadButton(self, ICONS.MENU, ()=>{ appmgr_resetMenu(self) })\n\tconst divcenter = document.createElement('div')\n\tconst btnclose = appmgr_createHeadButton(self, ICONS.CLOSE, ()=>{ appmgr_closeMenu(self) })\n\tconst main = document.createElement('div')\n\tconst toppanel = document.createElement('div')\n\tconst toppanel_left = document.createElement('div')\n\tconst toppanel_center = document.createElement('div')\n\tconst toppanel_right = document.createElement('div')\n\tconst txtsearch = document.createElement('input')\n\tconst btnsearch = document.createElement('button')\n\tconst btnlogout = document.createElement('a')\n\t\n\t\n\tconst menuboard = document.createElement('div')\n\tconst footer = document.createElement('div')\n\tconst divleft = document.createElement('div')\n\n\t\n\t// divleft untuk button reset\n\tdivleft.appendChild(btnmenureset)\n\n\t// header\n\tmenuhead.setAttribute('header', '')\n\tmenuhead.appendChild(divleft)\n\tmenuhead.appendChild(divcenter)\n\tmenuhead.appendChild(btnclose)\n\tdivcenter.innerHTML = 'Menu'\n\n\n\t// footer\n\tfooter.classList.add(CLS_HIDDEN)\n\tfooter.classList.add('fgta5-menu-footer')\n\tfooter.appendChild(btnlogout)\n\n\n\n\t// main\n\tmain.setAttribute('main', '')\n\tmain.appendChild(toppanel)\n\tmain.appendChild(menuboard)\n\tmain.appendChild(footer)\n\tmain.addEventListener('scroll', ()=>{\n\t\t if (main.scrollTop > 10) {\n\t\t\tmenuhead.classList.add('fgta5-fixheader-scrolled')\n\t\t } else {\n\t\t\tmenuhead.classList.remove('fgta5-fixheader-scrolled')\n\t\t }\n\t})\n\n\n\t// top panel: home, search, logout, profile\n\ttoppanel.classList.add('fgta5-menu-toppanel')\n\ttoppanel.appendChild(toppanel_left)\n\ttoppanel.appendChild(toppanel_center)\n\ttoppanel.appendChild(toppanel_right)\n\n\n\t// home\n\tconst btnhome = Component.createSvgButton(ICONS.HOME, CLS_BUTTONMENU, ()=>{\n\t\tappmgr_showHome(self)\n\t})\n\n\t// preference\n\tconst btnpreference = Component.createSvgButton(ICONS.SETTING, CLS_BUTTONMENU, ()=>{\n\t\tappmgr_openPreference(self)\n\t})\n\t\n\t\n\t// search\n\tconst menusearch = document.createElement('div')\n\tmenusearch.classList.add('fgta5-menu-search')\n\tmenusearch.appendChild(txtsearch)\n\tmenusearch.appendChild(btnsearch)\n\n\ttxtsearch.classList.add('fgta5-menu-search')\n\ttxtsearch.setAttribute('name', 'menusearch')\n\ttxtsearch.setAttribute('placeholder', 'search module')\n\ttxtsearch.addEventListener('keydown', (evt)=>{\n\t\tif (evt.key=='Enter') {\n\t\t\tappmgr_searchModule(self, txtsearch.value)\n\t\t}\n\t})\n\n\tbtnsearch.classList.add('fgta5-menu-search')\n\tbtnsearch.innerHTML = ICONS.SEARCH\n\tbtnsearch.addEventListener(EVT_CLICK, (evt)=>{\n\t\ttxtsearch.focus()\n\t\tappmgr_searchModule(self, txtsearch.value)\n\t})\n\n\n\t// user\n\tconst btnprofile = Component.createSvgButton(ICONS.USER, CLS_BUTTONMENU)\n\tbtnprofile.classList.add(CLS_HIDDEN)\n\t\n\n\t// toppanel content\n\ttoppanel_left.setAttribute(ATTR_GRIDAREA, 'left')\n\ttoppanel_left.appendChild(btnhome)\n\ttoppanel_left.appendChild(btnpreference)\n\t\n\ttoppanel_center.setAttribute(ATTR_GRIDAREA, 'center')\n\ttoppanel_center.appendChild(menusearch)\n\n\n\ttoppanel_right.setAttribute(ATTR_GRIDAREA, 'right')\n\ttoppanel_right.appendChild(btnprofile)\n\n\n\t// main menuboard\n\tmenuboard.classList.add('fgta5-menu')\n\n\n\t// button logout\n\tbtnlogout.innerHTML = `<div icon>${ICONS.LOGOUT}</div><div>Sign Out</div>`\n\tbtnlogout.setAttribute('href', 'javascript:void(0)')\n\n\n\t// setup nav\n\tnav.appendChild(main)\n\tnav.appendChild(menuhead)\n\n\n\n\n\treturn {\n\t\tMenuBoard: menuboard,\n\t\tMenuFooter: footer,\n\t\tProfileButton: btnprofile,\n\t\tLogoutButton: btnlogout,\n\t\tMenuResetButton: btnmenureset\n\t}\n}\t\n\n\nfunction appmgr_showMenu(self) {\n\tconsole.log('show menu')\n\tconst nav = self.Nodes.Nav\n\n\tnav.setAttribute(ATTR_NAVSHOWED, '')\n}\n\nfunction appmgr_showHome(self) {\n\tappmgr_closeMenu(self)\n\tself.Nodes.IFrames.classList.add(CLS_HIDDEN)\n}\n\nfunction appmgr_closeMenu(self) {\n\tconst nav = self.Nodes.Nav\n\tnav.removeAttribute(ATTR_NAVSHOWED)\n}\n\n\nfunction appmgr_iframeLoaded(self, iframe, module) {\n\t// client iframe kirim message ke parent window\n\t// informasi bahwa client sudah selesai di load\n\tiframe.contentWindow.postMessage({\n\t\taction: Component.ACTION_APPLICATIONLOADED,\n\t\tmodule: {\n\t\t\ttitle: module.title,\n\t\t\tname: module.name\n\t\t}\n\t}, '*')\n\n\t// saat module pertama di load\n\tself.Listener.dispatchEvent(actionEvent({\n\t\tdetail: {\n\t\t\tname: 'moduleloaded',\n\t\t\tmodulename: module.name,\n\t\t\ttitle: module.title,\n\t\t\tiframe: iframe\n\t\t}\n\t}))\n\n\t// module terbuka\n\tself.Listener.dispatchEvent(actionEvent({\n\t\tdetail: {\n\t\t\tname: 'moduleopened',\n\t\t\tmodulename: module.name,\n\t\t\ttitle: module.title,\n\t\t\tiframe: iframe\n\t\t}\n\t}))\n\n\t// tambahkan di recent app\n\tappmgr_addOpenedModule(self, iframe, module)\n}\n\nfunction appmgr_iframeReOpen(self, iframe, module) {\n\t// tampilkan iframe\n\tiframe.classList.remove(CLS_HIDDEN)\n\n\t// module terbuka\n\tself.Listener.dispatchEvent(actionEvent({\n\t\tdetail: {\n\t\t\tname: 'moduleopened',\n\t\t\tmodulename: module.name,\n\t\t\ttitle: module.title,\n\t\t\tiframe: iframe\n\t\t}\n\t}))\n\n\t// untuk geser shortcut ke awal\n\tappmgr_addOpenedModule(self, iframe, module)\n}\n\n\n\nasync function appmgr_openModule(self, module) {\n\tconst iframes = self.Nodes.IFrames\n\tconst modulename = module.name\n\n\t\n\tconsole.log(module)\n\n\tconst qry = `iframe[${ATTR_MODULENAME}=\"${modulename}\"]`\n\tconst ifr = iframes.querySelector(qry)\n\tif (ifr==null) {\n\t\t// buka iframe baru\n\t\tconst mask = $fgta5.Modal.createMask('Please wait...')\n\n\t\tconst url = new URL(module.url);\n\t\turl.searchParams.append('prog', module.name);\n\n\t\tlet newframe = document.createElement('iframe')\n\t\tnewframe.classList.add('fgta5-iframe')\n\t\tnewframe.classList.add(CLS_HIDDEN)\n\t\tnewframe.setAttribute(ATTR_MODULENAME, modulename)\n\t\t\n\t\tnewframe.onload = (evt) => {\n\t\t\tappmgr_iframeLoaded(self, newframe, module)\n\t\t\tnewframe.classList.remove(CLS_HIDDEN)\n\t\t\tmask.close()\n\t\t}\n\n\t\tfetch(url)\n\t\t\t.then(response => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`HTTP Error: ${response.status}`);\n\t\t\t\t}\n\t\t\t\tnewframe.src = url\n\t\t\t\tiframes.appendChild(newframe)\n\t\t\t\tself.Nodes.IFrames.classList.remove(CLS_HIDDEN)\n\t\t\t}).catch(error => {\n\t\t\t\tconsole.error(error)\n\t\t\t\t$fgta5.MessageBox.error(error)\n\t\t\t\tmask.close()\n\t\t\t});\n\t} else {\t\n\t\t// tampilkan iframe\n\t\t// hide semua iframe kecuali iframe yang akan dibuka\n\t\tvar frames = iframes.querySelectorAll('iframe')\n\t\tfor (var f of frames) {\n\t\t\tvar fname = f.getAttribute(ATTR_MODULENAME)\n\t\t\tif (fname==modulename) {\n\t\t\t\tappmgr_iframeReOpen(self, f, module)\n\t\t\t} else {\n\t\t\t\tf.classList.add(CLS_HIDDEN)\n\t\t\t}\n\t\t} \n\t\tself.Nodes.IFrames.classList.remove(CLS_HIDDEN)\n\t}\n}\n\n\nfunction appmgr_setFavourite(self, data)\t {\n\t// apakah div untuk favourite sudah didefinisikan\n\tif (self.Nodes.Favourite==null) {\n\t\treturn\n\t}\n\t\n\tconst favourite = self.Nodes.Favourite\n\tconst title = document.createElement('div')\n\tconst trahscontainer = self.Nodes.TrashBox\n\tconst trashbox = document.createElement('div')\n\tconst trashicon = document.createElement('div')\n\tconst trashlabel = document.createElement('div')\n\t\n\t// <div class='fgta5-roundbox'>?</div>\n\ttitle.innerHTML = `${TXT_FAVOURITE}&nbsp;&nbsp;&nbsp;&nbsp;`\n\ttitle.classList.add('fgta5-appmanager-home-subtitle')\n\n\ttrashicon.setAttribute(ATTR_ICON, '')\n\ttrashicon.innerHTML = ICONS.TRASH\n\t\n\ttrashicon.setAttribute(ATTR_LABEL, '')\n\ttrashlabel.innerHTML = 'Delete'\n\n\ttrashbox.setAttribute(ATTR_MAINBUTTON,'')\n\ttrashbox.appendChild(trashicon)\n\ttrashbox.appendChild(trashlabel)\n\n\ttrahscontainer.classList.add('fgta5-favourite-trashcontainer')\n\ttrahscontainer.classList.add(CLS_HIDDEN)\n\ttrahscontainer.appendChild(trashbox)\n\tself.Nodes.Head.after(trahscontainer)\n\n\n\tfavourite.before(title)\n\tfavourite.classList.add('fgta5-menu')\n\tfavourite.classList.add('fgta5-favourite')\n\tfavourite.addEventListener('dragover', (evt)=>{ appmgr_FavouriteDragOver(self, evt, favourite) })\n\tfavourite.addEventListener('dragleave', (evt)=>{ appmgr_FavouriteDragLeave(self, evt, favourite) })\n\tfavourite.addEventListener('drop', (evt)=>{ appmgr_FavouriteDrop(self, evt, favourite) })\n\n\tfor (let modulename of data) {\n\t\tlet module = self.Modules[modulename]\n\t\tif (module!=null) {\n\t\t\tlet mi = appmgr_createModuleIcon(self, module.data)\n\t\t\tappmgr_setAsFavouriteIcon(self, mi, modulename, favourite)\n\t\t\tfavourite.appendChild(mi)\n\t\t}\n\t}\n}\n\n\n\nfunction appmgr_createModuleIcon(self, module) {\n\tconst container = document.createElement('div')\n\tconst icon = document.createElement('div')\n\tconst text = document.createElement('div')\n\t\n\tcontainer.setAttribute('name', module.name)\n\tcontainer.setAttribute(ATTR_MENUICONCONTAINER, '')\n\tif (module.disabled) {\n\t\tcontainer.setAttribute('disabled', '')\n\t}\n\n\ticon.setAttribute(ATTR_MENUICONIMAGE, '')\n\tif (module.icon!=null) {\n\t\ticon.setAttribute(ATTR_MENUICONIMAGE, '')\n\t\ticon.style.backgroundImage = `url('${module.icon}')`\n\t} else {\n\t\ticon.innerHTML = ModuleData.ICON_DEFAULT\n\t}\n\n\ttext.innerHTML = module.title\n\ttext.setAttribute(ATTR_MENUICONTEXT, '')\n\n\n\tcontainer.appendChild(icon)\n\tcontainer.appendChild(text)\n\n\n\tconst clickEventName = Component.isMobileDevice() ? EVT_CLICK : EVT_DBLCLICK;\n\ticon.addEventListener(clickEventName, ()=>{\n\t\tself.openModule(module)\n\t\ticon.style.animation = 'iconClicked 0.2s forwards'\n\t\tsetTimeout(()=>{\n\t\t\ticon.style.animation = 'unset'\n\t\t\tappmgr_closeMenu(self)\n\t\t}, 300)\n\t})\n\treturn container\n}\n\n\nfunction appmgr_createGroupIcon(self, group) {\n\tconst container = document.createElement('div')\n\tconst icon = document.createElement('div')\n\tconst text = document.createElement('div')\n\t\n\tcontainer.setAttribute(ATTR_MENUICONCONTAINER, '')\n\tif (group.disabled) {\n\t\tcontainer.setAttribute('disabled', '')\n\t}\n\n\n\ticon.setAttribute(ATTR_MENUICONIMAGE, '')\n\tif (group.icon!=null) {\n\t\t// tampilkan icon sesuai data\n\t\ticon.style.backgroundImage = `url('${group.icon}')`\n\t} else {\n\t\t// tampilkan icon standard\n\t\ticon.style.backgroundImage = `url('data:image/svg+xml,${encodeURIComponent(ICONS.DIRDEF)}')`\n\t}\n\n\ttext.innerHTML = group.title\n\ttext.setAttribute(ATTR_MENUICONTEXT, '')\n\n\n\tcontainer.appendChild(icon)\n\tcontainer.appendChild(text)\n\n\ticon.addEventListener(EVT_CLICK, ()=>{\n\t\ticon.style.animation = 'iconClicked 0.4s forwards'\n\t\t\n\t\tsetTimeout(()=>{\n\t\t\ticon.style.animation = 'unset'\n\t\t}, 400)\n\n\t\tsetTimeout(()=>{\n\t\t\tappmgr_populateMenuIcons(self, group.icons, group.parent)\n\t\t}, 200)\n\t})\n\n\n\n\treturn container\n}\n\n\nfunction appmgr_setMenu(self, data) {\n\tself.RootIcons = appmgr_readMenu(self, data)\n\tappmgr_populateMenuIcons(self, self.RootIcons)\n}\n\n\nfunction appmgr_resetMenu(self) {\n\tappmgr_populateMenuIcons(self, self.RootIcons)\n\n}\n\nfunction appmgr_readMenu(self, data) {\n\tlet icons = []\n\tfor (var node of data) {\n\t\tif (node instanceof $fgta5.ModuleData || node.type=='program') {\n\t\t\t// module\n\t\t\tlet module = (node instanceof $fgta5.ModuleData) ? node : new $fgta5.ModuleData(node)\n\t\t\tlet mi = appmgr_createModuleIcon(self, module)\n\t\t\ticons.push(mi)\n\n\t\t\t// set keyword\n\t\t\tvar keyword\n\t\t\tif (node.keyword!=null) {\n\t\t\t\tkeyword = `${node.name} : ${node.keyword}`\n\t\t\t} else {\n\t\t\t\tkeyword = node.name\n\t\t\t}\n\n\t\t\t// add moduledata to library\n\t\t\tself.Modules[node.name] = {\n\t\t\t\tkeyword: keyword,\n\t\t\t\tdata: node\n\t\t\t}\n\t\t} else {\n\t\t\t// direktory\n\t\t\tvar groupicons = appmgr_readMenu(self, node.items)\n\t\t\tvar di = appmgr_createGroupIcon(self, {\n\t\t\t\ttitle: node.title,\n\t\t\t\ticon: node.icon,\n\t\t\t\ticons: groupicons,\n\t\t\t\tparent: icons\n\t\t\t})\n\t\t\tif (node.border!==false) {\n\t\t\t\tdi.classList.add('fgta5-icongroup')\n\t\t\t}\n\t\t\ticons.push(di)\n\t\t}\n\t\t\n\t}\n\treturn icons\n}\n\nfunction appmgr_populateMenuIcons(self, icons, parent) {\n\tconst menuboard = self.Nodes.MenuBoard\n\tconst menureset = self.Nodes.MenuResetButton\n\n\t/* tambahkan back icon jika belum ada */\n\tif (parent!=null) {\n\t\tif (icons[0].isbackIcon!==true) {\n\t\t\tvar backicon = {\n\t\t\t\ttitle: '',\n\t\t\t\ticon: `data:image/svg+xml,${encodeURIComponent(ICONS.BACK)}`,\n\t\t\t\ticons: parent,\n\t\t\t\tparent: parent.parent\n\t\t\t}\n\t\t\tvar di = appmgr_createGroupIcon(self, backicon)\n\t\t\tdi.isbackIcon = true\n\t\t\ticons.unshift(di)\n\t\t}\n\n\t\t// munculkan tombol reset menu kiri atas\n\t\tmenureset.classList.remove(CLS_HIDDEN)\n\n\t} else {\n\t\t// sembunyikan tombol reset menu kiri atas\n\t\tmenureset.classList.add(CLS_HIDDEN)\n\n\t}\n\t\n\n\tmenuboard.style.animation = \"fadeOutLeft 0.05s forwards\";\n\tsetTimeout(()=>{\n\t\tmenuboard.innerHTML = ''\n\t\tmenuboard.style.animation = \"fadeInRight 0.3s forwards\";\n\t\tfor (var icon of icons) {\n\t\t\tmenuboard.appendChild(icon)\n\t\t}\n\t}, 50)\n} \n\nasync function appmgr_searchModule(self, searchtext) {\n\tif (searchtext.trim()=='') {\n\t\tif (self.previousSearch===undefined) {\n\t\t\tself.previousSearch=''\n\t\t\treturn\n\t\t}\n\n\t\tif (searchtext==self.previousSearch) {\n\t\t\treturn\n\t\t}\n\n\t\tself.previousSearch=''\n\t\tappmgr_resetMenu(self)\n\t\treturn\n\t}\n\n\tself.previousSearch=searchtext\n\n\tconst menuboard = self.Nodes.MenuBoard\n\tconst modules = self.Modules\n\n\tmenuboard.innerHTML = ''\n\tvar i = 0\n\tfor (var modulename in modules) {\n\t\tconst m = modules[modulename]\n\t\tconst moduleTitle = m.data.title\n\t\tif (moduleTitle.toLowerCase().includes(searchtext)) {\n\t\t\ti++\n\t\t\tvar module = modules[modulename]\n\t\t\tif (module!=null) {\n\t\t\t\tvar mi = appmgr_createModuleIcon(self, module.data)\n\t\t\t\tmi.style.animation = 'dropped 0.3s forwards'\n\t\t\t\tmenuboard.appendChild(mi)\n\t\t\t\tif (i<10) {\n\t\t\t\t\tawait Component.sleep(100)\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction appmgr_setUser(self, data) {\n\tconst btnprofile = self.Nodes.ProfileButton\n\tconst btnlogout = self.Nodes.LogoutButton\n\n\t// munculkan footer menu untuk logout\n\tself.Nodes.MenuFooter.classList.remove(CLS_HIDDEN)\n\n\t// munculkan profile icon\n\tbtnprofile.classList.remove(CLS_HIDDEN)\n\tbtnprofile.addEventListener(EVT_CLICK, (evt)=>{\n\t\tappmgr_profileClick(self)\n\t})\n\n\n\tbtnlogout.addEventListener(EVT_CLICK, (evt)=>{\n\t\tappmgr_logout(self)\n\t})\n\t// munculkan nama di home\n\tself.Nodes.Currentuser.innerHTML = data.displayname\n\n}\n\nfunction appmgr_profileClick(self) {\n\tself.Listener.dispatchEvent(openProfileEvent({\n\t\tdetail: {\n\t\t\tuser: self.User,\n\t\t}\n\t}))\n}\n\nasync function appmgr_logout(self) {\n\tvar ret = await $fgta5.MessageBox.confirm(\"are you sure to log out ?\")\n\tif (ret=='ok') {\n\t\tself.Listener.dispatchEvent(logoutEvent({\n\t\t\tdetail: {\n\t\t\t\tuser: self.User,\n\t\t\t}\n\t\t}))\n\t}\n}\n\nasync function appmgr_openPreference(self) {\n\tself.Listener.dispatchEvent(openPreferenceEvent({\n\t\tdetail: {\n\t\t\tuser: self.User,\n\t\t}\n\t}))\n}\n\nfunction appmgr_createOpenedBoard(self, main) {\n\tconst opened = main.querySelector(`div[${ATTR_OPENEDMODULE}]`)\n\tconst title = document.createElement('div')\n\t\n\n\topened.classList.add('fgta5-openedmodule')\n\n\ttitle.innerHTML = `${TXT_OPENED}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`\n\ttitle.classList.add('fgta5-appmanager-home-subtitle')\n\ttitle.classList.add(CLS_HIDDEN)\n\n\topened.classList.add(CLS_HIDDEN)\n\topened.before(title)\n\topened.hide = () => {\n\t\ttitle.classList.add(CLS_HIDDEN)\n\t\topened.classList.add(CLS_HIDDEN)\n\t}\n\n\topened.show = () => {\n\t\ttitle.classList.remove(CLS_HIDDEN)\n\t\topened.classList.remove(CLS_HIDDEN)\n\t}\n\n\treturn {\n\t\tOpened: opened\n\t}\n}\n\nfunction appmgr_addOpenedModule(self, iframe, module) {\n\tconst opened = self.Nodes.Opened\n\tconst id = `${C_SHORTCUT_PREFIX}-${module.name}`\n\tconst shortcut = document.getElementById(id)\n\tif (shortcut==null) {\n\t\t// tambahkan di awal\n\t\tconst newshortcut = appmgr_createOpenedShortcut(self, module, iframe, id)\n\t\topened.prepend(newshortcut)\n\t} else {\n\t\t// geser di awal\n\t\topened.prepend(shortcut);\n\t}\n\n\topened.show()\n}\n\n\nfunction appmgr_createOpenedShortcut(self, module, iframe, id) {\n\tconst opened = self.Nodes.Opened\n\tconst shortcut = document.createElement('div')\n\tconst icon = document.createElement('div') \n\tconst title = document.createElement('div')\n\tconst info = document.createElement('div')\n\tconst closebutton = document.createElement('a')\n\tconst clickEventName = Component.isMobileDevice() ? EVT_CLICK : EVT_DBLCLICK;\n\n\tshortcut.id = id\n\tshortcut.classList.add('fgta5-openedmodule-shortcut')\n\tshortcut.setAttribute(ATTR_DRAGGABLE, 'true')\n\tshortcut.appendChild(icon)\n\tshortcut.appendChild(title)\n\tshortcut.appendChild(info)\n\tshortcut.appendChild(closebutton)\n\n\tshortcut.addEventListener(clickEventName, async (evt)=>{ await appmgr_openModule(self, module) })\n\tshortcut.addEventListener(EVT_DRAGSTART, (evt)=>{ appmgr_DragModule(self, evt, module) })\n\n\n\ticon.setAttribute(ATTR_SHORTCUT_ICON, '')\n\tif (module.icon!=null) {\n\t\ticon.style.backgroundImage = `url('${module.icon}')`\n\t} else {\n\t\ticon.innerHTML = ModuleData.ICON_DEFAULT\n\t}\n\n\ttitle.setAttribute(ATTR_SHORTCUT_TITLE, '')\t\n\ttitle.innerHTML = module.title\n\n\tinfo.setAttribute(ATTR_SHORTCUT_INFO, '')\n\tinfo.innerHTML = 'idle'\n\n\n\tvar btn = Component.createSvgButton(ICONS.CLOSE, CLS_SHORTCUTBUTTONCLOSE, (evt)=>{\n\t\tevt.stopPropagation()\n\t\tiframe.remove()\n\t\tshortcut.remove()\n\n\t\tif (opened.childNodes.length==0) {\n\t\t\topened.hide()\n\t\t}\n\t})\n\n\tclosebutton.setAttribute(ATTR_SHORTCUT_CLOSE, '')\n\tclosebutton.appendChild(btn)\n\n\treturn shortcut\n}\n\nfunction appmgr_DragModule(self, evt, module) {\n\tcurrent_drag_action = 'addtofave'\n\tevt.dataTransfer.setData('modulename', module.name);\n\tcurrent_dragged_modulename = module.name\n}\n\nfunction appmgr_FavouriteDragOver(self, evt, favourite) {\n\tif (current_drag_action=='addtofave') {\n\t\tvar exist = favourite.querySelector(`[name=\"${current_dragged_modulename}\"]`)\n\t\tif (exist==null) {\n\t\t\tevt.preventDefault()\n\t\t\tfavourite.setAttribute(ATTR_DRAGOVER, '')\n\t\t}\n\t} \n\t// else if (current_drag_action=='removefromfave') {\n\t// \tfavourite.setAttribute(ATTR_DRAGOVER, '')\n\t// }\n\n}\n\nfunction appmgr_FavouriteDragLeave(self, evt, favourite) {\n\tfavourite.removeAttribute(ATTR_DRAGOVER)\n}\n\nfunction appmgr_FavouriteDrop(self, evt, favourite) {\n\tfavourite.removeAttribute(ATTR_DRAGOVER)\n\n\tconst modulename = evt.dataTransfer.getData('modulename');\n\tif (modulename=='') {\n\t\treturn\n\t}\n\n\n\tvar exist = favourite.querySelector(`[name=\"${modulename}\"]`)\n\tif (exist==null) {\n\t\tevt.preventDefault()\n\t\tconst module = self.Modules[modulename]\n\t\tif (module==null) {\n\t\t\treturn\n\t\t}\n\n\t\tlet mi = appmgr_createModuleIcon(self, module.data)\n\t\tappmgr_setAsFavouriteIcon(self, mi, modulename, favourite)\n\t\tfavourite.prepend(mi)\n\t\tself.Listener.dispatchEvent(addToFavouriteEvent({\n\t\t\tdetail: {\n\t\t\t\tmodulename: modulename,\n\t\t\t}\n\t\t}))\n\t}\n}\n\nfunction appmgr_setAsFavouriteIcon(self, mi, modulename, favourite) {\n\tconst trahsbox = self.Nodes.TrashBox\n\tconst trashbutton = trahsbox.querySelector(`[${ATTR_MAINBUTTON}]`)\n\n\tmi.setAttribute(ATTR_DRAGGABLE, 'true')\n\tmi.addEventListener(EVT_DRAGSTART, (evt)=>{\n\t\tdrop_valid = false\n\t\tcurrent_drag_action = 'removefromfave'\n\t\tevt.dataTransfer.setData('modulename', modulename);\n\t\ttrahsbox.classList.remove(CLS_HIDDEN)\n\t})\n\n\tmi.addEventListener('dragend', (evt)=>{\n\t\tsetTimeout(()=>{\n\t\t\ttrahsbox.classList.add(CLS_HIDDEN)\n\t\t\ttrashbutton.removeAttribute(ATTR_DRAGOVER)\n\t\t}, 100)\n\t})\n\t\n\n\ttrashbutton.addEventListener('dragover', (evt)=>{\n\t\tif (current_drag_action=='removefromfave') {\n\t\t\tevt.preventDefault()\n\t\t\ttrashbutton.setAttribute(ATTR_DRAGOVER, '')\n\t\t}\n\t})\n\n\ttrashbutton.addEventListener('dragleave', (evt)=>{\n\t\ttrashbutton.removeAttribute(ATTR_DRAGOVER)\n\t})\n\n\ttrashbutton.addEventListener('drop', (evt)=>{\n\t\tif (current_drag_action=='removefromfave') {\n\t\t\tconst modulename = evt.dataTransfer.getData('modulename');\n\t\t\tif (modulename=='') {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar icon = favourite.querySelector(`[name=\"${modulename}\"]`)\n\t\t\tif (icon!=null) {\n\t\t\t\ticon.style.animation = 'removing 0.3s forwards'\n\t\t\t\tsetTimeout(()=>{\n\t\t\t\t\ticon.remove()\n\t\t\t\t}, 300)\n\t\t\t\t\n\t\t\t\tself.Listener.dispatchEvent(removeFromFavouriteEvent({\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tmodulename: modulename,\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t}\n\t\t\tevt.preventDefault()\n\t\t\tcurrent_drag_action = ''\n\t\t}\n\t})\t\n}\n\n","import ICONS from './Icons.mjs'\nimport Component from \"./Component.mjs\"\n\nconst CLS_HIDDEN = 'hidden'\nconst CLS_SECTION = 'fgta5-app-section'\n\n\nconst ATTR_ACTIVE = 'data-active'\nconst ATTR_TITLE = 'data-title'\nconst ATTR_TOPBAR = 'data-topbar'\nconst ATTR_BACKBUTTON = 'data-backbutton'\n\nconst DIR_LEFT = 0\nconst DIR_RIGHT = 1\n\nconst EVT_BACKBUTTONCLICK = 'backbuttonclick'\nconst EVT_SECTIONSHOWING = 'sectionshowing'\n\nconst BackButtonClickEvent = (data) => { return new CustomEvent(EVT_BACKBUTTONCLICK, data) }\nconst SectionShowingEvent = (data) => { return new CustomEvent(EVT_SECTIONSHOWING, data) }\n\n\nexport default class Section {\n\t#id\n\t#element\n\t#index\n\t#name\n\t#title\n\t#previoussection\n\t#carousell\n\t#fn_getActiveSection\n\t#listener = new EventTarget()\n\n\tstatic get ATTR_ACTIVE() { return ATTR_ACTIVE }\n\tstatic get DIR_LEFT() { return DIR_LEFT }\n\tstatic get DIR_RIGHT() { return DIR_RIGHT }\n\tstatic get EVT_BACKBUTTONCLICK() { return EVT_BACKBUTTONCLICK }\n\tstatic get EVT_SECTIONSHOWING() { return EVT_SECTIONSHOWING }\n\n\n\tget Id() { return this.#id } \n\tget Index() { return this.#index }\n\tget Name() { return this.#name }\n\tget Title() { return this.#title }\n\tget Element() { return this.#element }\n\tget PreviousSection() { return this.#previoussection}\n\tget getActiveSection() { return this.#fn_getActiveSection }\n\tget Listener() { return this.#listener }\n\tget Carousell() { return this.#carousell } \n\n\tset Title(v) {\n\t\tthis.#title = v\n\t\tsec_setTitle(this, v)\n\t}\n\n\n\tconstructor(el, args) {\n\t\tconst id = el.id\n\t\tconst name = id\n\t\tconst title = el.getAttribute(ATTR_TITLE)\n\n\t\tthis.#element = el\n\t\tthis.#id = id\n\t\tthis.#name = name\n\t\tthis.#title = title ?? 'section'\n\t\t\n\t\tif (args!=null) {\n\t\t\tif (args.index!=null) {\n\t\t\t\tthis.#index = args.index\n\t\t\t}\n\n\t\t\tthis.#carousell = args.carousell\n\n\t\t\tif (typeof args.fn_getActiveSection === 'function') {\n\t\t\t\tthis.#fn_getActiveSection = args.fn_getActiveSection\n\t\t\t} else {\n\t\t\t\tthis.#fn_getActiveSection = ()=>{return null}\n\t\t\t}\n\t\t}\n\t\tsec_construct(this, args) \n\t}\n\n\n\n\n\tasync show(args, fn_callback) {\n\t\tconst currSection = this.getActiveSection()\n\t\tthis.#previoussection = currSection // set current session ke previous untuk keperluan back\n\t\tawait sec_show(this, args, fn_callback)\n\t}\n\n\n\tsectionReturn\n\tsetSectionReturn(section) {\n\t\tthis.sectionReturn = section\n\t}\n\n\tsetIconUrl(iconUrl) {\n\t\tsec_setIconUrl(this, iconUrl)\n\t}\n\n\taddEventListener(eventname, callback) {\n\t\tthis.Listener.addEventListener(eventname, callback)\n\t}\t\n\n\tback() {\n\t\tif (this.sectionReturn!=null) {\n\t\t\tthis.sectionReturn.show({direction:1})\n\t\t}\n\t}\n}\n\n\nfunction sec_setIconUrl(self, iconUrl) {\n\tconst iconDiv = self.Nodes.iconDiv\n\ticonDiv.style.display = 'unset'\n\tif (iconUrl==null || iconUrl=='') {\n\t\ticonDiv.innerHTML = ICONS.PROGRAM\n\t} else {\n\t\ticonDiv.style.backgroundImage = `url('${iconUrl}')`;\n\t\ticonDiv.style.backgroundSize = \"cover\";\n\t\ticonDiv.style.backgroundRepeat = \"no-repeat\";\n\t\ticonDiv.style.backgroundPosition = \"center\";\n\n\t}\n}\n\nfunction sec_construct(self, args) {\n\tconst el = self.Element\n\t\n\tel.setAttribute('name', self.Name)\n\tel.classList.add(CLS_SECTION)\n\tif (self.Index==0) {\n\t\t// jadikan index section pertama yang active\n\t\tel.setAttribute(ATTR_ACTIVE, '')\n\t} else {\n\t\t// sembunyikan semua section berikutnya\n\t\tel.classList.add(CLS_HIDDEN)\n\t}\n\n\n\t// set title\n\tconst topbar = document.createElement('div')\n\tconst title = document.createElement('div')\n\tconst backbutton = Component.createSvgButton(ICONS.BACK, '', ()=>{\n\t\t// back ke previous section\n\t\tsec_backButtonClick(self)\n\t})\n\tconst iconDiv = document.createElement('div')\n\t\n\n\n\ttopbar.setAttribute(ATTR_TOPBAR, '')\n\ttopbar.appendChild(backbutton)\n\ttopbar.appendChild(iconDiv)\n\ttopbar.appendChild(title)\n\t\n\n\tbackbutton.setAttribute(ATTR_BACKBUTTON, '')\n\tif (self.Index==0) {\n\t\tbackbutton.classList.add('hidden')\n\t}\n\n\n\ticonDiv.classList.add('fgta5-app-section-icondiv')\n\ticonDiv.style.display = 'none'\n\n\n\n\ttitle.setAttribute(ATTR_TITLE, self.Title)\n\ttitle.innerHTML = self.Title\n\n\n\t\n\tel.prepend(topbar)\n\n\tself.Nodes = {\n\t\tBackButton: backbutton,\n\t\tTitle: title,\n\t\ticonDiv: iconDiv\n\t}\n\n}\n\n\nasync function sec_show(self, args, fn_callback) {\n\tif (typeof fn_callback==='function') {\n\t\tawait fn_callback()\n\t}\n\n\tlet direction = DIR_LEFT // Geser ke kiri\n\tif (args!=undefined) {\n\t\tdirection = args.direction ?? DIR_LEFT\n\t}\n\n\tlet moving = [\n\t\t{curr:'fadeOutLeft 0.1s forwards', comming:'fadeInRight 0.3s forwards'}, // geser kiri\n\t\t{curr:'fadeOutRight 0.1s forwards', comming:'fadeInLeft 0.3s forwards'} // geser kanan\n\t]\n\t\n\n\tconst commingSection = self\n\tconst comming = commingSection.Element\n\tconst currSection = self.PreviousSection\n\tif (currSection!=null) {\n\t\tif (commingSection.Name==currSection.Name) {\n\t\t\treturn\n\t\t}\n\n\t\t// CATATAN:\n\t\t// untuk showing section, selalu arah akan ke kiri (arah kanan digunakan saat back)\n\t\t// curr: fadeOutLeft // yang saat ini muncul, buang ke kiri\n\t\t// comming: fadeInRight // yang baru akan muncul dari kanan\n\n\t\tconst curr = currSection.Element\n\n\n\t\t// trigger event showing\n\t\tself.Carousell.setCurrentSection(commingSection)\n\t\tself.Carousell.dispatchSectionShowing(currSection, commingSection)\n\t\tself.Listener.dispatchEvent(SectionShowingEvent({\n\t\t\tdata: {\n\t\t\t\t// currSection: currSection,\n\t\t\t\t// commingSection: commingSection,\n\t\t\t\tdetail: {\n\t\t\t\t\tcurrSection: currSection,\n\t\t\t\t\tcommingSection: commingSection,\n\t\t\t\t}\n\t\t\t}\n\t\t}))\n\t\t\n\n\t\t// taruh dulu yang akan data ke kanan, posisi hiden\n\t\tcomming.style.animation = 'unset'\n\n\t\t// lalu keluarkan curr, buang ke kiri (fadeOutLeft)\n\t\tcurr.style.animation = moving[direction].curr // `fadeOutLeft 0.3s forwards` \n\t\tsetTimeout(()=>{\n\t\t\tcurr.classList.add(CLS_HIDDEN) // sembunyikan current\n\t\t\tcurr.style.animation = 'unset'\n\t\t\tcurr.removeAttribute(ATTR_ACTIVE)\n\n\t\t\t// tarik comming masuk dari kanan\n\t\t\tcomming.classList.remove(CLS_HIDDEN)\n\t\t\tcomming.style.animation = moving[direction].comming // 'fadeInRight 0.3s forwards' \n\t\t\tsetTimeout(()=>{\n\t\t\t\tcomming.style.animation = 'unset'\n\t\t\t\tcomming.setAttribute(ATTR_ACTIVE, '')\n\t\t\t}, 300)\n\t\t}, 100)\t\t\n\n\n\t} else {\n\t\t// langsung munculkan tanpa animasi\n\t\tcomming.classList.remove(CLS_HIDDEN)\n\t\tcomming.setAttribute(ATTR_ACTIVE, '')\n\t}\n\t\n}\n\n\nfunction sec_backButtonClick(self) {\n\t// back to self.PreviousSection\n\tself.Listener.dispatchEvent(BackButtonClickEvent({\n\t\tcancelable: true,\n\t\tdetail: {\n\t\t\tfn_ShowNextSection: ()=>{\n\t\t\t\tif (self.sectionReturn!=null) {\n\t\t\t\t\tself.sectionReturn.show({direction:DIR_RIGHT})\n\t\t\t\t} else {\n\t\t\t\t\tself.PreviousSection.show({direction:DIR_RIGHT})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}))\n}\n\n\nfunction sec_setTitle(self, v) {\n\tself.Nodes.Title.innerHTML = v\n}","import ICONS from './Icons.mjs'\nimport Component from \"./Component.mjs\"\nimport Section from './Section.mjs'\n\nconst CLS_BUTTONHEAD = 'fgta5-button-head'\n\n\nconst ID_TITLE = 'application-title'\nconst ATTR_WITHFOOTER = 'data-withfooter'\n\n\nexport default class App extends Component {\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tapp_construct(this)\n\t}\n\n\t// #sections = {}\n\t// get Sections() { return this.#sections}\n\t// RenderSection() {\n\t\t// App_RenderSection(this)\n\t// }\n\tsetTitle(title) {\n\t\tapp_setTitle(this, title)\n\t}\n\n\n\tshowFooter(show) {\n\t\tapp_showFooter(this, show)\n\t}\n}\n\nfunction app_construct(self) {\n\tconsole.log('constructiong application')\n\n\tconst main = self.Element \n\tconst head = document.createElement('header')\n\tconst footer = document.createElement('footer')\n\n\tmain.after(head)\n\thead.after(footer)\n\n\thead.classList.add('fgta5-app-head')\n\n\tmain.classList.add('fgta5-app-main')\n\n\tfooter.classList.add('fgta5-app-footer')\n\tfooter.classList.add('hidden')\n\n\tapp_createHeader(self, head)\n\tapp_createFooter(self, footer)\n\n\tself.Nodes = {\n\t\tHead: head,\n\t\tMain: main,\n\t\tFooter: footer\n\t}\n\n\twindow.addEventListener(\"load\", (event) => {\n\t\tconsole.log('application loaded.')\n\t\twindow.parent.postMessage({\n\t\t\taction: Component.ACTION_APPLICATIONLOADED\n\t\t}, '*')\n\n\t})\n\n\twindow.addEventListener(\"message\", (evt) => {\n\t\tconst args = evt.data\n\t\tif (args.action!=undefined) {\n\t\t\tvar action = args.action\n\t\t\tif (action==Component.ACTION_APPLICATIONLOADED) {\n\t\t\t\tif (args.module!=null) {\n\t\t\t\t\tif (args.module.title!=null) {\n\t\t\t\t\t\tapp_setTitle(self, args.module.title)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (action=='REDIRECT_TO_LOGIN') {\n\t\t\t\tconsole.log('BUAT PROGRAM UNTUK REDIRECT KE LOGIN')\n\t\t\t}\n\t\t}\n\t})\n}\n\nfunction app_setTitle(self, title) {\n\tdocument.title = title\n\tdocument.getElementById(ID_TITLE).innerHTML = title\n}\n\nfunction app_createHeader(self, head) {\n\tconst divleft = document.createElement('div')\n\tconst title = document.createElement('span')\n\tconst divright = document.createElement('div')\n\n\n\tconst btnhome = Component.createSvgButton(ICONS.HOME, CLS_BUTTONHEAD, ()=>{\n\t\tapp_showHome(self)\n\t})\n\n\n\tconst btnmenu = Component.createSvgButton(ICONS.MENU, CLS_BUTTONHEAD, ()=>{\n\t\tapp_showMenu(self)\n\t})\n\n\n\n\tdivleft.appendChild(btnhome)\n\tdivright.appendChild(btnmenu)\n\n\n\tif (!Component.isInContainer()) {\n\t\t// jika tidak di dalam container, \n\t\t// sembunyikan tombol home dan menu\n\t\tbtnhome.classList.add('hidden')\n\t\tbtnmenu.classList.add('hidden')\n\t} \n\n\n\ttitle.id = ID_TITLE\n\ttitle.innerHTML = 'loading ...'\n\n\thead.appendChild(divleft)\n\thead.appendChild(title)\n\thead.appendChild(divright)\n}\n\nfunction app_createFooter(self, footer) {\n\tfooter.innerHTML = 'empty footer content'\n}\n\n\nfunction app_showFooter(self, show) {\n\tconst main = self.Nodes.Main\n\tconst footer = self.Nodes.Footer\n\tif (show) {\n\t\tmain.setAttribute(ATTR_WITHFOOTER, '')\n\t\tfooter.classList.remove('hidden')\n\t} else {\n\t\tmain.removeAttribute(ATTR_WITHFOOTER)\n\t\tfooter.classList.add('hidden')\n\t}\n}\n\nfunction app_showMenu(self) {\n\twindow.parent.postMessage({\n\t\taction: Component.ACTION_SHOWMENU\n\t}, '*')\n}\n\nfunction app_showHome(self) {\n\twindow.parent.postMessage({\n\t\taction: Component.ACTION_SHOWHOME\n\t}, '*')\t\n}\n\n","import Section from './Section.mjs'\n\nconst EVT_SECTIONSHOWING = 'sectionshowing'\n\nconst SectionShowingEvent = (data) => { return new CustomEvent(EVT_SECTIONSHOWING, data) }\n\n\nexport default class SectionCarousell {\n\t#items = {}\n\t#listener = new EventTarget()\n\t#currentsection \n\t#iconUrl\n\t#firstSection\n\n\tstatic get EVT_SECTIONSHOWING() { return EVT_SECTIONSHOWING }\n\n\tconstructor(el) {\n\t\tscar_Construct(this, el)\n\t}\n\n\tget Items() { return this.#items}\n\tget Listener() { return this.#listener }\n\tget CurrentSection() { return this.#currentsection }\n\tget IconUrl() { return this.#iconUrl }\n\n\taddEventListener(eventname, callback) {\n\t\tthis.Listener.addEventListener(eventname, callback)\n\t}\t\n\n\tsetCurrentSection(section) {\n\t\tthis.#currentsection = section\n\t}\n\n\n\tsetFirstSection(section) {\n\t\tthis.#firstSection = section\n\t}\n\n\tsetIconUrl(iconUrl) {\n\t\tthis.#iconUrl = iconUrl\n\t\tthis.#firstSection.setIconUrl(iconUrl)\n\t}\n\n\tdispatchSectionShowing(currSection, commingSection) {\n\t\tthis.Listener.dispatchEvent(SectionShowingEvent({\n\t\t\t// currSection: currSection,\n\t\t\t// commingSection: commingSection,\n\t\t\tdetail: {\n\t\t\t\tcurrSection: currSection,\n\t\t\t\tcommingSection: commingSection,\n\t\t\t}\n\t\t}))\n\t}\n}\n\nfunction scar_Construct(self, el) {\n\n\tel.classList.add('fgta5-carousellcontainer')\n\n\t// ambil semua section yang terdapat di element\n\tconst nodes = el.querySelectorAll('section[class=\"fgta5-carousell\"]') \n\tlet i = 0;\n\tfor (let node of nodes) {\n\t\tconst section = new Section(node, {\n\t\t\tindex: i,\n\t\t\tcarousell: self,\n\t\t\tfn_getActiveSection: ()=>{\n\t\t\t\treturn scar_getActiveSection(self, el)\n\t\t\t}\n\t\t})\n\t\tconst name = section.Name\n\t\t\n\t\tif (i==0) {\n\t\t\t// set first section\n\t\t\tself.setFirstSection(section)\n\t\t}\n\n\t\tif (self.CurrentSection==null) {\n\t\t\tself.setCurrentSection(section)\n\t\t}\n\n\t\t// masukkan panel ini ke items\n\t\tself.Items[name] = section\n\t\t++i\n\t}\n}\n\n\nfunction scar_getActiveSection(self, el) {\n\t// ambil section yang sedang aktif yang ada di el\n\tconst cs = el.querySelector(`section[${Section.ATTR_ACTIVE}]`)\n\n\t// name dari section yang aktif\n\tconst name = cs.getAttribute('name')\n\n\t// kembalikan object section yang saat ini aktif\n\treturn self.Items[name]\n}","export default class Dialog extends EventTarget{\n\t\n\t#element\n\tconstructor(id, args={}) {\n\t\tsuper()\n\t\tconst el = document.getElementById(id)\n\t\tif (el==null) {\n\t\t\tconsole.error(`element dengan id: '$id' tidak ditemukan di halaman`)\n\t\t}\n\n\t\tthis.#element = el\n\t\tdlg_constructor(this, args)\n\n\t}\n\tget element() { return this.#element }\n\n\n\tasync dispatchCancelableEvent(event) {\n\t\tconst listeners = this._getListeners(event.type);\n\t\tfor (const listener of listeners) {\n\t\tawait listener(event);\n\t\tif (event.defaultPrevented) break;\n\t\t}\n\t\treturn event.defaultPrevented;\n\t}\n\n\t_getListeners(type) {\n\t\t// Hack: we need to track listeners manually\n\t\treturn this._listeners?.[type] || [];\n\t}\n\n\taddAsyncEventListener(type, callback) {\n\t\tif (!this._listeners) this._listeners = {};\n\t\tif (!this._listeners[type]) this._listeners[type] = [];\n\t\tthis._listeners[type].push(callback);\n\t}\n\n\n\n\tasync show() {\n\t\tconsole.log('showing modal dialog')\n\t\tconst self = this \n\t\tconst element = this.#element\n\n\t\tvar showingEvent = new Event('showing', {});\n\t\tawait self.dispatchCancelableEvent(showingEvent);\n\n\t\telement.showModal();\n\t\telement.setAttribute('showed', true)\n\n\t\treturn new Promise((resolve)=>{\n\t\t\tself.btnOk.onclick = async (evt) => {\n\t\t\t\tconsole.log('btnOk click')\n\n\t\t\t\tvar btnOkEvent = new Event('ok', { cancelable: true });\n\t\t\t\tbtnOkEvent.result = {}\n\t\t\t\tvar canceled = await self.dispatchCancelableEvent(btnOkEvent);\n\t\t\t\tif (canceled) {\n\t\t\t\t\tconsole.log('dialog invalid, and was canceled');\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tself.close()\n\t\t\t\tresolve(btnOkEvent.result)\n\t\t\t}\n\n\t\t\tself.btnCancel.onclick = (evt) => {\n\t\t\t\tconsole.log('btnCancel click')\n\t\t\t\tself.close()\n\t\t\t\tresolve(null)\n\t\t\t}\n\t\t})\n\t}\n\n\tclose() {\n\t\tconst self = this \n\t\tconst element = this.#element\n\t\telement.close();\n\n\t\t// hapus semua listener button\n\t\tself.btnOk.onclick = null\n\t\tself.btnCancel.onclick = null\n\t}\n\n}\n\nfunction dlg_constructor(self, args) {\n\tconst element = self.element\n\t\n\t// buat container untuk content dari dialog\n\tconst container = document.createElement('div');\n\tcontainer.classList.add('fgta5-dialogbox-container');\n\n\t// pindahkan semua element di dialog ke dalam container\n\twhile (element.firstChild) {\n\t\tcontainer.appendChild(element.firstChild);\n\t}\n\telement.appendChild(container);\n\n\t// tambahkan title apabila diperlukan\n\tif (args.title!=null) {\n\t\tconst header = document.createElement('div')\n\t\theader.innerHTML = args.title\n\t\telement.prepend(header)\n\t}\n\n\t// tambahkan footer untuk tombol tutup dan cancel\n\tconst footer = document.createElement('div')\n\tself.btnOk = document.createElement('button')\n\tself.btnCancel = document.createElement('button')\n\n\tself.btnOk.innerHTML = 'Ok'\n\tself.btnCancel.innerHTML = 'Cancel'\n\n\tfooter.appendChild(self.btnOk)\n\tfooter.appendChild(self.btnCancel)\n\n\telement.appendChild(footer)\n\t\n}\n\n","export function getInvalidMessage(name, input, defaultMessage) {\n\tvar msg = input.getAttribute(`invalid-message-${name}`);\n\tif (msg == null || msg === '') {\n\t\tmsg = defaultMessage;\n\t}\n\treturn msg;\n}\n\n\nexport function parseFunctionParam(paramString) {\n\tconst [fnName, ...fnParams] = paramString.split(\":\");\n\tconst fnParamsString = fnParams.length > 0 ? fnParams.join(\":\") : null;\n\t\n\treturn {\n\t\tfnName,\n\t\tfnParams: fnParamsString !== null \n\t\t\t? (!isNaN(fnParamsString) ? Number(fnParamsString) : fnParamsString) \n\t\t\t: null\n\t};\n}\n\n\nexport function required(value) {\n\tif (value === null || value === undefined || value === '') {\n\t\treturn false;\t\t\n\t}\n\treturn true;\n}\n\nexport function minlength(value, minLength) {\n\tif (minLength == null || minLength === 0) {\n\t\treturn true; // no minimum length specified, so always valid\n\t}\n\tif (value == null || value.length < minLength) {\n\t\treturn false; // value is too short\n\t}\n\treturn true; // value meets the minimum length requirement\n}\n\nexport function maxlength(value, maxLength) {\n\tif (maxLength == null || maxLength === 0) {\n\t\treturn true; // no maximum length specified, so always valid\n\t}\n\tif (value == null || value.length > maxLength) {\n\t\treturn false; // value is too long\n\t}\n\treturn true; // value meets the maximum length requirement\n}\n\nexport function pattern(value, strpattern) {\n\treturn true; // TODO: implement pattern validation\n}\n\nexport function email(value, minLength) {\n\treturn /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(value);\n}\n\nexport function min(value, minValue) {\n\tif (minValue == null || minValue === 0) {\n\t\treturn true; // no minimum value specified, so always valid\n\t}\n\tif (value == null || value < minValue) {\n\t\treturn false; // value is less than minimum\n\t}\n\treturn true; // value meets the minimum requirement\n}\n\nexport function max(value, maxValue) {\n\tif (maxValue == null || maxValue === 0) {\n\t\treturn true; // no maximum value specified, so always valid\n\t}\n\tif (value == null || value > maxValue) {\n\t\treturn false; // value is greater than maximum\n\t}\n\treturn true; // value meets the maximum requirement\n}\n\n\nfunction parseDate(value, boundaryDate) {\n\tvar dtparsed = new Date(value)\n\tvar dt = new Date(dtparsed.getFullYear(), dtparsed.getMonth(), dtparsed.getDate())\n\tvar boundary = new Date(boundaryDate.getFullYear(), boundaryDate.getMonth(), boundaryDate.getDate())\n\treturn {\n\t\tdt: dt,\n\t\tboundary: boundary\n\t}\n}\n\nexport function mindate(value, minDate) {\n\tvar {dt, boundary} = parseDate(value, minDate)\n\tif (dt<boundary) {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}\n}\n\nexport function maxdate(value, maxDate) {\n\tvar {dt, boundary} = parseDate(value, maxDate)\n\tif (dt>boundary) {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}\n\t\n}\n\n\nexport function mintime(value, minTime) {\n\tif (value<minTime) {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}\n}\n\nexport function maxtime(value, maxTime) {\n\tif (value>maxTime) {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}\n}","import Component from './components/Component.mjs'\nimport Form from './components/Form.mjs'\nimport Button from './components/Button.mjs'\nimport {MessageBox, MessageBoxButton} from './components/MessageBox.mjs'\nimport Modal from './components/Modal.mjs'\nimport Textbox from './components/Textbox.mjs'\nimport Numberbox from './components/Numberbox.mjs'\nimport Checkbox from './components/Checkbox.mjs'\nimport Datepicker from './components/Datepicker.mjs'\nimport Timepicker from './components/Timepicker.mjs'\nimport Combobox from './components/Combobox.mjs'\nimport Filebox from './components/Filebox.mjs'\nimport Dataloader from './components/Dataloader.mjs'\nimport Gridview from './components/Gridview.mjs'\nimport AppManager from './components/AppManager.mjs'\nimport Application from './components/Application.mjs'\nimport ModuleData from './components/ModuleData.mjs'\nimport Section from './components/Section.mjs'\nimport SectionCarousell from './components/SectionCarousell.mjs'\nimport Icons from './components/Icons.mjs'\nimport ActionButton from './components/ActionButton.mjs'\nimport Dialog from './components/Dialog.mjs'\nimport ApiEndpoint from './components/ApiEndPoint.mjs'\n\nimport * as Validators from './components/Validators.mjs';\n\n\n\n\nconst fgta5 = {\n\tComponent: Component,\n\tForm: Form,\n\tButton: Button,\n\tTextbox: Textbox,\n\tNumberbox: Numberbox,\n\tCheckbox: Checkbox,\n\tDatepicker: Datepicker,\n\tTimepicker: Timepicker,\n\tCombobox: Combobox,\n\tFilebox: Filebox,\n\tMessageBox: MessageBox,\n\tMessageBoxButton: MessageBoxButton,\n\tModal: Modal,\n\tDataloader: Dataloader,\n\tGridview: Gridview,\n\tAppManager: AppManager,\n\tApplication: Application,\n\tModuleData: ModuleData,\n\tSection: Section,\n\tSectionCarousell: SectionCarousell,\n\tIcons: Icons,\n\tActionButton: ActionButton,\n\tDialog: Dialog,\n\tApiEndpoint: ApiEndpoint\n}\n\n\n// install to window.$validators\nif (window.$validators === undefined) {\n\twindow.$validators = Validators;\n} else {\n\tObject.assign(window.$validators, Validators);\n}\n\n// install to window.$fgta5\nif (window.$fgta5===undefined || window.$fgta5===null) {\n\twindow.$fgta5 = fgta5\n} else {\n\tObject.assign(window.$fgta5, fgta5)\n}\n\n\nexport default fgta5;\n\n\n\n\n\n\n\n\n\n","import Component from \"./Component.mjs\"\n\nexport default class Button extends Component {\n\tconstructor(id) {\n\t\tsuper(id)\n\t\tbtn_construct(this, id)\n\t}\n\n\t#_disabled = false\n\tget disabled() { return this.#_disabled }\n\tset disabled(v) {\n\t\tthis.#_disabled = v\n\t\tbtn_setDisabled(this, v)\n\t}\n\n\taddEventListener(event, callback) {\n\t\tthis.Element.addEventListener(event, callback)\n\t}\n\n\tclick() {\n\t\tthis.Element.click()\n\t}\n\n}\n\nfunction btn_construct(self, id) {\n\t// console.log(`construct button ${id}`)\n\tself.Element.classList.add('fgta5-button')\n\tself.Element.setAttribute('type', 'button') // tambahkan attribut type=button untuk menghindari trigger button click saat tombol enter ditekan \n}\n\nfunction btn_setDisabled(self, disabled) {\n\tself.Element.disabled = disabled\n}","export default class Dataloader {\n\n#controller;\n\n\tconstructor() {\n\t\tthis.#controller = new AbortController();\n\t}\n\n\tabort() {\n\t\tthis.#controller.abort();\n\t}\n\n\tdispose() {\n\t\t\n\t}\n\n\tasync load(url, options, loadedCallback) {\n\t\tconst signal = this.#controller.signal;\n\n\t\tif (options==null) {\n\t\t\toptions={};\n\t\t}\n\n\t\tconst opt = Object.assign({ signal }, options);\n\t\ttry {\n\t\t\tconst response = await fetch(url, opt);\n\t\t\tif (!response.ok) {\n\t\t\t\tconst status = response.status\n\t\t\t\tconst statustext = response.statusText\n\t\t\t\tthrow new Error(`${status} ${statustext}: ${options.method} ${url}`)\n\t\t\t}\n\n\t\t\tconst data = await response.json();\n\t\t\tif (typeof loadedCallback == 'function') {\n\t\t\t\ttry {\n\t\t\t\t\tloadedCallback(null, data);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data\n\n\t\t} catch (err) {\n\t\t\tif (err.name === \"AbortError\") {\n\t\t\t\tconsole.log(\"Request dibatalkan!\");\n\t\t\t} else {\n\t\t\t\tif (typeof loadedCallback == 'function') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tloadedCallback(err, null);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","\nexport default class ActionButton {\n\t\n\t#elements = []\n\tconstructor(id, actionname=null) {\n\t\tthis.Listener = new EventTarget()\n\n\n\t\t// pertama ambil element dengan id. \n\t\t// Jika ada element pertama akan berisi element dengan id tersebut\n\t\t// berukutnya akan dicari element dengan data-action\n\t\tif (id!=null) {\n\t\t\tconst el = document.getElementById(id)\n\t\t\tif (el!=null) {\n\t\t\t\tthis.#elements.push(el)\n\t\t\t} \n\t\t}\n\t\n\t\tif (actionname!=null) {\n\t\t\tconst selector = (id==null) ? `[data-action=\"${actionname}\"]` : `[data-action=\"${actionname}\"]:not(#${id})`\n\t\t\tconst elements = document.querySelectorAll(selector)\n\t\t\tthis.#elements = [...this.#elements, ...Array.from(elements)]\n\t\t}\n\n\n\t\t// setup button yang diasosiasikan untuk action ini\t\t\n\t\tthis.#elements.forEach(element => {\n\n\t\t\t// disable tab\n\t\t\telement.setAttribute('tabindex', '-1')\n\n\t\t\t// handle default event click, yang berfungsi untuk mengamabkan tombol saat disable / hidden\n\t\t\telement.addEventListener('click', (evt)=>{\n\t\t\t\tif (this.#disabled || this.#hidden) {\n\t\t\t\t\tconsole.warn('action is not allowed!')\n\t\t\t\t\tevt.stopImmediatePropagation()\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\t#disabled = false\n\tget disabled() { return this.#disabled }\n\tset disabled(disable) {\n\t\tthis.#disabled = disable\n\t\tthis.#elements.forEach(element => {\n\t\t\tif (disable) {\n\t\t\t\telement.setAttribute('disabled', true)\n\t\t\t} else {\n\t\t\t\telement.removeAttribute('disabled')\n\t\t\t}\n\t\t})\n\t}\n\n\t#hidden = false\n\tisHidden() { return this.#hidden }\n\thide(hidden=true) {\n\t\tthis.#elements.forEach(element => {\n\t\t\tif (hidden) {\n\t\t\t\telement.classList.add('hidden')\n\t\t\t} else {\n\t\t\t\telement.classList.remove('hidden')\n\t\t\t}\n\t\t})\n\t}\n\n\tsetText(text) {\n\t\tthis.#elements.forEach(element => {\n\t\t\telement.innerHTML = text\n\t\t})\n\t}\n\t\n\taddEventListener(event, callback) {\n\t\tthis.#elements.forEach(element => {\n\t\t\telement.addEventListener(event, callback)\n\t\t})\t\t\n\t}\n\n\n\tclick() {\n\t\tif (this.#disabled) {\n\t\t\treturn\n\t\t}\n\t\tthis.#elements[0].click()\n\t}\n}\n","export default class ApiEndpoint {\n\n\t#method = 'POST'\n\t#headers = {\n\t\t'Content-Type': 'application/json'\n\t}\t\n\n\t#controller;\n\t#path\n\tconstructor(path) {\n\t\tthis.#controller = new AbortController();\n\t\tthis.#path = path\n\t}\n\n\tget headers() { return this.#headers }\n\n\tget method() {return this.#method }\n\tset method(v) {\n\t\tthis.#method = v\n\t} \n\n\tabort() {\n\t\tthis.#controller.abort();\n\t}\n\n\tdispose() {\n\t\tthis.#controller = null\n\t}\n\n\tsetHeader(name, value) {\n\t\tthis.#headers[name] = value\n\t}\n\n\tasync execute(args, formData) {\n\t\tconst signal = this.#controller.signal;\n\t\tconst url = this.#path\n\t\tconst method = this.#method\n\t\tconst headers = this.#headers\n\n\t\tif (args==null) {\n\t\t\targs={}\n\t\t}\n\n\t\tlet body\n\t\tif (formData==null) {\n\t\t\tbody = JSON.stringify(args)\n\t\t} else {\n\t\t\tdelete headers['Content-Type'] // fetch akan otomatis set, jika diisi akan error boundary\n\t\t\tformData.append('form-body-jsondata', new Blob(\n\t\t\t\t[JSON.stringify(args)],\n\t\t\t\t{ type: 'application/json' }\n\t\t\t));\n\t\t\tbody = formData\n\t\t}\n\n\t\tconst options = {\n\t\t\tmethod,\n\t\t\theaders,\n\t\t\tbody\n\t\t}\n\n\t\tconst opt = Object.assign({ signal }, options)\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, opt);\n\t\t\tif (!response.ok) {\n\t\t\t\tconst status = response.status\n\t\t\t\tconst statustext = response.statusText\n\t\t\t\tconst text = await response.text();\n\t\t\t\tlet errorMessage = `${status} ${statustext}: ${text}`\n\t\t\t\tif (status==401) {\n\t\t\t\t\t// belum login, hapus session login\n\t\t\t\t\tsessionStorage.removeItem('login');\n\t\t\t\t\tsessionStorage.removeItem('login_nexturl');\n\t\t\t\t\terrorMessage = 'authentication is needed to access resource'\n\t\t\t\t} \n\t\t\t\tconst err = new Error(errorMessage)\n\t\t\t\terr.status = status\n\t\t\t\terr.code = response.code || 1\n\t\t\t\tthrow err\n\t\t\t}\n\n\t\t\tconst res = await response.json();\n\t\t\tif (res.code!=0) {\n\t\t\t\tconst err = new Error(res.message)\n\t\t\t\terr.code = res.code\n\t\t\t\tthrow err\n\t\t\t}\n\n\t\t\treturn res.result \n\t\t} catch (err) {\n\t\t\tif (err.name === \"AbortError\") {\n\t\t\t\tconsole.warn(\"Request dibatalkan!\");\n\t\t\t} else {\n\t\t\t\tthrow err\n\t\t\t}\n\t\t}\n\t}\n}"],"names":["counter","Component","Id","Element","ACTION_SHOWMENU","ACTION_SHOWHOME","ACTION_APPLICATIONLOADED","constructor","id","undefined","console","error","el","document","getElementById","this","createSvgButton","svg","classname","fn_click","btn","createElement","innerHTML","classList","add","setAttribute","addEventListener","evt","comp_createSvgButton","generateId","sleep","ms","Promise","resolve","setTimeout","isMobileDevice","test","navigator","userAgent","isInContainer","window","self","top","Input","super","container","lastvalue","InitialValue","getInputCaption","Listener","EventTarget","Nodes","Container","LastValue","input_construct","_readValidators","type","name","value","v","disabled","placeholder","getAttribute","_form","Form","bindForm","form","_ineditmode","InEditMode","setEditingMode","ineditmode","invalidMessages","InvalidMessages","input","prefix","Array","from","attributes","forEach","attr","startsWith","key","replace","input_readValidators","newData","initialvalue","acceptChanges","input_newData","_setLastValue","removeAttribute","setError","reset","isChanged","log","lasterror","_setLastError","msg","getLastError","errdiv","querySelector","insertBefore","InputWrapper","nextSibling","remove","input_setError","input_setLastValue","getLastValue","getBindingData","binding","validate","vnamereq","Validators","err","input_getErrorValidation","message","fnName","input_validate","_validators","addValidator","fnParams","param","removeValidator","str","clearValidators","readValidators","_setupDescription","description","trim","decrdiv","appendChild","isrequired","isRequired","markAsRequired","r","required","attrname","label","Label","input_markAsRequired","callback","handlers","Handlers","handle","fn","getErrorValidation","validatorData","fnValidate","$validators","fnMessage","Error","defmsg","clearTime","dt","setHours","setMinutes","setSeconds","cname","minlength","parseInt","isNaN","maxlength","pattern","min","mindate","Date","mintime","max","maxdate","maxtime","validator","split","i","length","$fgta5","parseFunctionParam","Textbox","wrapinput","parentNode","style","width","marginTop","marginBottom","marginLeft","marginRight","nonFgtaClasses","filter","className","tabIndex","backgroundColor","charCase","toLowerCase","dispatchEvent","CustomEvent","txt_blur","e","data","cancelable","code","ctrlKey","altKey","shiftKey","srcElement","target","KeyboardEvent","defaultPrevented","preventDefault","txt_construct","txt_getValueCased","txt_SetValue","attrval","txt_setEditingMode","currentvalue","focus","toUpperCase","ChangeEvent","Numberbox","formatterFixed","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","useGrouping","display","Display","precision","step","Math","pow","getPrecission","format","nmb_setDisabled","digitgrouping","num","Number","nmb_displayFocus","detail","invalid","formattedValue","nmb_formatValue","formatted","nmb_displayBlur","maxlegth","inputType","nmb_construct","nmb_markChanged","nmb_setValue","nmb_setEditingMode","nmb_setError","Checkbox","checkboxlabel","createTextNode","replLabel","replaceChild","checked","chk_setDisabled","event","UnCheckedEvent","chk_checkedChanged","chk_construct","chk_getBoolValue","chk_markChanged","chk_setValue","chk_getDisabled","permdisattr","permanentDisabled","chk_setEditingMode","chk_NewData","chk_setLastValue","editmode","button_icon","Datepicker","button","Button","insertAdjacentHTML","dtp_setDisabled","dtp_setDisplay","sender","dtp_markChanged","dtp_changed","dtp_construct","toISOString","isodate","slice","dtp_setValue","inputwrap","dtp_setEditingMode","dtp_Newdata","dtp_setError","dtiso","options","day","month","year","formattedDate","toLocaleDateString","timeRegex","Timepicker","cssclass","cssstyle","tpck_setDisplay","tpck_markChanged","tpck_changed","tpck_construct","tpck_setValue","tpck_setDisabled","tpck_setEditingMode","tpck_setError","tm","SelectingEvent","icon_cbo_button","icon_cbo_close","ATTR_EDITMODE","ATTR_SHOWED","ATTR_REMOVING","ATTR_SELECTED","ATTR_INDEX","Combobox","datalist","dialog","lasttext","Dialog","LastText","cbo_setDisabled","HasStaticOption","searchtext","limit","offset","addRow","text","tr","cbo_createOptionRow","tbody","cbo_search","inputsearch","isWaiting","mask","Modal","createMask","showModal","btnClose","onclick","close","cbo_closed","cbo_buttonClick","head","srccontainer","srcinput","srcbuton","btnnext","click","cbo_resetSelected","table","thead","tfoot","setNext","nextoffset","cbo_createDialog","opt","getElementsByTagName","defaultOption","option","textContent","innerText","idx","rows","count","default","cbo_createStaticOptions","_read","cbo_construct","cbo_SetEditingMode","initialdata","cbo_newData","lastValue","lastText","getLastText","clear","querySelectorAll","t","cbo_setLastValue","setSelected","cbo_markChanged","cbo_setSelected","getDisplayBinding","addOptions","cbo_addOptions","setOptions","cbo_clearOptions","cbo_setOptions","iswaiting","wait","td","cbo_wait","AbortHandler","cbo_markSelected","none","after","cbo_selectRow","changed","SelectedEvent","cbo_userSelectValue","PopulatingEvent","valueselected","row","abortHandler","execute_selecting","prepend","addNoneIfNotRequired","prevselected","index","trs","closest","rowidx","rowindex","insertAdjacentElement","Filebox","downloadLink","DownloadLink","files","flb_markChanged","flb_changed","flb_construct","file","flb_setDisabled","flb_setEditingMode","flb_acceptChanges","flb_Reset","flb_setError","setDisplay","flb_setDisplay","setDownloadLink","linktext","url","flb_setDownloadLink","flb_validate","formLockedEvent","formUnLockedEvent","frm_lock","lock","formEl","Inputs","frm_acceptChanges","frm_getData","changedOnly","primarykey","PrimaryKey","pkBinding","obj","currBinding","bindingdata","iconsCss","info","warning","question","ICON_ERROR","ICON_INFO","ICON_QUESTION","ICON_WARNING","MessageBoxButton","Text","MessageBox","static","Object","freeze","ok","cancel","yes","no","show","config","msgbox_show","async","iconSvg","msgbox_error","msgbox_info","msgbox_warning","confirm","buttons","ButtonOkCancel","msgbox_confirm","removeChild","title","divTitle","iconcss","divIcon","divContent","divButtons","body","createMessageDialog","entries","btnEl","btnOk","CreateModal","modal","Icons","MENU","CLOSE","BACK","ACTION","USER","LOGOUT","SEARCH","SETTING","HOME","TRASH","DIRDEF","UNSORT","SORTASC","SORTDESC","YES","NO","NEWDOCUMENT","PROGRAM","ATTR_ROWSELECTOR","ATTR_AUTONUMBER","ATTR_BINDING","ATTR_SORTING","ATTR_FORMATTER","ATTR_TEXTALIGN","ATTR_ROWSELECTED","ATTR_COLNAME","ATTR_ROWKEY","ATTR_ROWKEYVALUE","ATTR_ROWPROCESSING","ATTR_MAINHEADROW","ATTR_LINENUMBER","TYPE_ROWSELECTOR","TYPE_AUTONUMBER","TYPE_STANDARD","rowRemovingEvent","setAttributeIfNotNull","attrvalue","createCheckbox","chk","span","checkbox","grv_headerCheckboxChange","headchk","Tbody","grv_rowCheckboxChange","Thead","grv_addRow","Key","keyvalue","column","Columns","formatter","textalign","linenumber","grv_getLastLineNumber","grv_cellClick","grv_cellDblClick","func","Formatters","grv_createFunction","grv_rowRender","children","CurrentRow","grv_sort","sorting","th","ICONS","sort","grv_getSort","criteria","Criteria","ths","lastrow","lastlinenumber","expression","match","funcName","args","parsedArgs","map","arg","parseFloat","grv_formatDecimal","grv_formatInteger","grv_formatCheckmark","grv_formatDateIso","grv_formatDateLong","grv_formatDateShort","ModuleData","icon","ICON_DEFAULT","ATTR_NAVSHOWED","ATTR_MODULENAME","ATTR_FAVOURITE","ATTR_OPENEDMODULE","ATTR_CURRENTUSER","ATTR_MENUICONCONTAINER","ATTR_MENUICONIMAGE","ATTR_MENUICONTEXT","ATTR_GRIDAREA","ATTR_SHORTCUT_ICON","ATTR_SHORTCUT_TITLE","ATTR_SHORTCUT_INFO","ATTR_SHORTCUT_CLOSE","ATTR_DRAGOVER","ATTR_LABEL","ATTR_ICON","ATTR_MAINBUTTON","ATTR_DRAGGABLE","CLS_BUTTONMENU","CLS_SHORTCUTBUTTONCLOSE","CLS_HIDDEN","EVT_CLICK","EVT_DBLCLICK","EVT_DRAGSTART","TXT_FAVOURITE","TXT_OPENED","actionEvent","current_dragged_modulename","current_drag_action","appmgr_createHeadButton","appmgr_showMenu","Nav","appmgr_showHome","appmgr_closeMenu","IFrames","appmgr_iframeReOpen","iframe","module","modulename","appmgr_addOpenedModule","appmgr_openModule","iframes","qry","URL","searchParams","append","newframe","onload","contentWindow","postMessage","action","appmgr_iframeLoaded","fetch","then","response","status","src","catch","frames","f","appmgr_createModuleIcon","backgroundImage","clickEventName","openModule","animation","appmgr_createGroupIcon","group","encodeURIComponent","appmgr_populateMenuIcons","icons","parent","appmgr_resetMenu","RootIcons","appmgr_readMenu","node","mi","keyword","push","Modules","groupicons","items","di","border","menuboard","MenuBoard","menureset","MenuResetButton","isbackIcon","unshift","appmgr_searchModule","previousSearch","modules","includes","opened","Opened","shortcut","newshortcut","closebutton","dataTransfer","setData","appmgr_DragModule","stopPropagation","childNodes","hide","appmgr_createOpenedShortcut","appmgr_setAsFavouriteIcon","favourite","trahsbox","TrashBox","trashbutton","getData","CLS_SECTION","ATTR_ACTIVE","ATTR_TITLE","ATTR_TOPBAR","ATTR_BACKBUTTON","EVT_BACKBUTTONCLICK","EVT_SECTIONSHOWING","Section","element","previoussection","carousell","fn_getActiveSection","listener","DIR_LEFT","DIR_RIGHT","Index","Name","Title","PreviousSection","getActiveSection","Carousell","sec_setTitle","topbar","backbutton","fn_ShowNextSection","sectionReturn","direction","sec_backButtonClick","iconDiv","BackButton","sec_construct","fn_callback","currSection","moving","curr","comming","commingSection","setCurrentSection","dispatchSectionShowing","sec_show","setSectionReturn","section","setIconUrl","iconUrl","backgroundSize","backgroundRepeat","backgroundPosition","sec_setIconUrl","eventname","back","CLS_BUTTONHEAD","ID_TITLE","ATTR_WITHFOOTER","app_setTitle","scar_getActiveSection","Items","firstChild","header","footer","btnCancel","dlg_constructor","dispatchCancelableEvent","listeners","_getListeners","_listeners","addAsyncEventListener","showingEvent","Event","btnOkEvent","result","parseDate","boundaryDate","dtparsed","getFullYear","getMonth","getDate","boundary","minLength","defaultMessage","maxValue","maxDate","maxLength","maxTime","minValue","minDate","minTime","paramString","fnParamsString","join","strpattern","fgta5","_locked","_autoid","_primarykey","readAttributes","inputs","fgtacomp","frm_construct","AutoID","isLocked","isnew","isNew","setAsNewData","frm_reset","frm_clear","frm_isChanged","lastError","getPrimaryInput","pk","frm_newData","render","frm_render","isValid","frm_validate","getFiles","keys","frm_getFiles","getDataChanged","displayname","frm_setData","acceptInput","prevFocusedElement","activeElement","blur","locked","autoid","_disabled","content","infoContainer","spinner","infoText","setText","modal_createMask","createProgress","IsError","prgBarErrIcon","prgBarContainer","prgBar","prgMsg","setProgress","progress","height","finish","completed","buttonClose","div","textAlign","modal_createProgress","Dataloader","controller","AbortController","abort","dispose","load","loadedCallback","signal","assign","statustext","statusText","method","json","Gridview","tagName","tbl","Table","Tfoot","headrow","columns","rowselector","autonumber","html","grv_getColumns","setColumnData","setKey","sortbtn","grv_setupHeader","grv_construct","addRows","grv_addRows","updateRow","tds","grv_updateRow","scrollToFooter","scrollIntoView","behavior","columndata","rowRender","removeSelected","onFinished","chks","MarkProcessing","p","handled","removeRow","grv_removeSelected","grv_removeRow","getSelected","selected","grv_getSelected","hasRowPendingProcess","nextoffsetcontainer","next","getSort","colspan","cells","grv_setNext","setCriteria","currentRow","rect","getBoundingClientRect","left","bottom","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isElementInViewport","block","grv_setCurentRow","previousRecord","previousElementSibling","grv_previousRecord","nextRecord","nextElementSibling","grv_nextRecord","AppManager","main","nav","currentuser","btnmenu","before","appmgr_createOpenedBoard","MenuFooter","ProfileButton","LogoutButton","menuhead","btnmenureset","divcenter","btnclose","toppanel","toppanel_left","toppanel_center","toppanel_right","txtsearch","btnsearch","btnlogout","divleft","scrollTop","btnhome","btnpreference","user","User","appmgr_openPreference","menusearch","btnprofile","appmgr_createMenuBoard","Head","Main","Favourite","Currentuser","appmgr_construct","nexturl","location","href","nextmodule","history","pushState","setTitle","appmgr_setTitle","setMenu","appmgr_setMenu","showMenu","setFavourite","trahscontainer","trashbox","trashicon","trashlabel","appmgr_FavouriteDragOver","appmgr_FavouriteDragLeave","exist","addToFavouriteEvent","appmgr_FavouriteDrop","appmgr_setFavourite","userdata","setUser","openProfileEvent","appmgr_profileClick","logoutEvent","appmgr_logout","appmgr_setUser","Application","divright","app_createHeader","app_createFooter","Footer","app_construct","showFooter","app_showFooter","SectionCarousell","currentsection","firstSection","nodes","setFirstSection","CurrentSection","scar_Construct","IconUrl","ActionButton","elements","actionname","selector","hidden","warn","stopImmediatePropagation","disable","isHidden","ApiEndpoint","headers","path","setHeader","execute","formData","JSON","stringify","Blob","errorMessage","sessionStorage","removeItem","res"],"mappings":"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"}