@daracl/form 0.0.17 → 0.0.18
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.
- package/README.md +1 -1
- package/dist/DaraForm.d.ts +51 -2
- package/dist/FieldInfoMap.d.ts +8 -1
- package/dist/FormTemplate.d.ts +2 -2
- package/dist/constants.d.ts +5 -1
- package/dist/daracl.form.css +688 -0
- package/dist/daracl.form.min.css +10 -0
- package/dist/daracl.form.min.umd.js +171 -0
- package/dist/daracl.form.min.umd.js.map +1 -0
- package/dist/daracl.form.umd.js +4477 -0
- package/dist/daracl.form.umd.js.map +1 -0
- package/dist/defaultOption.d.ts +8 -0
- package/dist/event/renderEvents.d.ts +1 -1
- package/dist/global.d.ts +6 -0
- package/dist/index.cjs +1806 -519
- package/dist/index.cjs.map +1 -7
- package/dist/index.d.ts +7 -2
- package/dist/index.html +193 -348
- package/dist/index.js +4090 -3101
- package/dist/index.js.map +1 -7
- package/dist/index.min.cjs +171 -0
- package/dist/index.min.cjs.map +1 -0
- package/dist/index.min.js +2910 -0
- package/dist/index.min.js.map +1 -0
- package/dist/index.umd.d.ts +7 -0
- package/dist/renderer/ButtonRender.d.ts +2 -2
- package/dist/renderer/CheckboxRender.d.ts +2 -2
- package/dist/renderer/CustomRender.d.ts +2 -2
- package/dist/renderer/DateRender.d.ts +2 -2
- package/dist/renderer/DropdownRender.d.ts +2 -2
- package/dist/renderer/FileRender.d.ts +2 -2
- package/dist/renderer/GridRender.d.ts +2 -2
- package/dist/renderer/GroupRender.d.ts +2 -2
- package/dist/renderer/HiddenRender.d.ts +2 -2
- package/dist/renderer/NumberRender.d.ts +2 -2
- package/dist/renderer/PasswordRender.d.ts +2 -2
- package/dist/renderer/RadioRender.d.ts +2 -2
- package/dist/renderer/RangeRender.d.ts +2 -2
- package/dist/renderer/Render.d.ts +2 -2
- package/dist/renderer/TabRender.d.ts +2 -2
- package/dist/renderer/TextAreaRender.d.ts +2 -2
- package/dist/renderer/TextRender.d.ts +2 -2
- package/dist/types/FormField.d.ts +18 -13
- package/dist/types/FormOptions.d.ts +1 -1
- package/dist/types/style.d.ts +3 -0
- package/dist/util/renderFactory.d.ts +1 -1
- package/dist/util/styleUtils.d.ts +10 -12
- package/dist/util/utils.d.ts +1 -1
- package/package.json +129 -140
- package/style/abstracts/_index.scss +2 -0
- package/style/abstracts/_mixins.scss +22 -0
- package/style/abstracts/_variables.scss +1 -0
- package/style/base/_base.scss +59 -0
- package/style/base/_index.scss +1 -0
- package/style/components/_button.scss +16 -0
- package/style/components/_field-container.scss +41 -0
- package/style/components/_field-group.scss +16 -0
- package/style/components/_file-list.scss +33 -0
- package/style/components/_form-field.scss +47 -0
- package/style/components/_form-group.scss +90 -0
- package/style/components/_grid-field.scss +121 -0
- package/style/components/_icon.scss +16 -0
- package/style/components/_index.scss +11 -0
- package/style/components/_label.scss +59 -0
- package/style/components/_row.scss +88 -0
- package/style/components/_tab.scss +70 -0
- package/{dist/index.css → style/daracl.form.css} +19 -66
- package/style/daracl.form.css.map +1 -0
- package/style/daracl.form.min.css +2 -0
- package/style/daracl.form.min.css.map +1 -0
- package/style/daracl.form.scss +44 -691
- package/style/themes/_common.scss +13 -0
- package/style/themes/_dark.scss +20 -0
- package/style/themes/_index.scss +14 -0
- package/style/themes/_light.scss +20 -0
- package/style/themes/_mixin.scss +6 -0
- package/dist/commonVender.d.ts +0 -1
- package/dist/daracl.form.js +0 -5720
- package/dist/daracl.form.js.map +0 -1
- package/dist/daracl.form.min.js +0 -7
- package/dist/daracl.form.min.js.LICENSE.txt +0 -5
- package/dist/daracl.form.min.js.map +0 -1
- package/dist/daracl.vender.min.css +0 -5
- package/dist/daracl.vender.min.js +0 -2
- package/dist/daracl.vender.min.js.LICENSE.txt +0 -3
- package/dist/index.css.map +0 -7
- package/dist/indexVender.d.ts +0 -6
- package/dist/main.css +0 -6
- package/dist/main.css.map +0 -1
- package/src/index.ts +0 -5
- /package/dist/util/{Lanauage.d.ts → Language.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daracl.form.umd.js","sources":["../../node_modules/@daracl/core/dist/index.js","../../src/util/utils.ts","../../src/renderer/Render.ts","../../src/rule/regexpValidator.ts","../../src/rule/validator.ts","../../src/rule/numberValidator.ts","../../src/util/validUtils.ts","../../src/event/renderEvents.ts","../../src/renderer/NumberRender.ts","../../src/rule/stringValidator.ts","../../src/renderer/TextAreaRender.ts","../../src/renderer/DropdownRender.ts","../../src/renderer/TextRender.ts","../../src/util/styleUtils.ts","../../src/renderer/CheckboxRender.ts","../../src/renderer/RadioRender.ts","../../src/renderer/PasswordRender.ts","../../src/rule/fileValidator.ts","../../src/renderer/FileRender.ts","../../src/renderer/CustomRender.ts","../../src/renderer/GroupRender.ts","../../src/renderer/HiddenRender.ts","../../src/renderer/ButtonRender.ts","../../src/renderer/RangeRender.ts","../../node_modules/@daracl/datetimepicker/dist/index.js","../../src/renderer/DateRender.ts","../../src/renderer/TabRender.ts","../../src/renderer/GridRender.ts","../../src/constants.ts","../../src/util/Language.ts","../../src/util/renderFactory.ts","../../src/FieldInfoMap.ts","../../src/FormTemplate.ts","../../src/defaultOption.ts","../../src/DaraForm.ts","../../src/index.umd.ts"],"sourcesContent":["function isArray(value) {\n return Array.isArray(value);\n}\nfunction isDate(value) {\n return value instanceof Date && !isNaN(value.getTime());\n}\nfunction isNil(value) {\n return value === null || value === void 0;\n}\nfunction isString(value) {\n return typeof value === \"string\" || value instanceof String;\n}\nfunction isEmpty(value) {\n if (isNil(value)) {\n return true;\n }\n if (isString(value)) {\n return value.trim() === \"\";\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value).length === 0;\n }\n return false;\n}\nfunction isFunction(value) {\n return typeof value === \"function\" || value instanceof Function;\n}\nfunction isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nfunction isPlainObject(value) {\n return value !== null && typeof value === \"object\" && Object.getPrototypeOf(value) === Object.prototype;\n}\nfunction isUndefined(value) {\n return typeof value === \"undefined\";\n}\nfunction cloneDeep(dst, src, excludeKeys) {\n if (isArray(src)) {\n return cloneArrayDeep(dst, src, excludeKeys);\n }\n if (isDate(src)) {\n return new Date(src.getTime());\n }\n if (isObject(src)) {\n return cloneObjectDeep(dst, src, excludeKeys);\n }\n return src;\n}\nfunction cloneObjectDeep(dst, src, excludeKeys) {\n if (isFunction(src)) {\n return src;\n }\n for (const key of Object.keys(src)) {\n if (excludeKeys.has(key)) continue;\n const val = src[key];\n if (isUndefined(val)) {\n continue;\n }\n if (val === null) {\n dst[key] = val;\n } else if (isFunction(val)) {\n dst[key] = val;\n } else if (isEmpty(dst[key])) {\n dst[key] = cloneDeep(isArray(val) ? [] : {}, val, excludeKeys);\n } else if (!isObject(val)) {\n dst[key] = val;\n } else {\n if (!isObject(dst[key])) {\n dst[key] = {};\n }\n cloneDeep(dst[key], val, excludeKeys);\n }\n }\n return dst;\n}\nfunction cloneArrayDeep(dst, src, excludeKeys) {\n const isObj = isPlainObject(dst);\n const isArr = isArray(dst);\n for (let i = 0; i < src.length; i += 1) {\n const val = src[i];\n let newVal;\n if (val == null) {\n newVal = val;\n } else {\n newVal = cloneDeep(isArray(val) ? [] : {}, val, excludeKeys);\n }\n if (isObj) {\n dst[i] = newVal;\n } else {\n if (isArr && dst.indexOf(newVal) < 0) {\n dst.push(newVal);\n }\n }\n }\n return dst;\n}\nfunction objectDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let excludeKeys = /* @__PURE__ */ new Set();\n let sources = values;\n const last = values[values.length - 1];\n if (last && isObject(last) && isArray(last._excludeKeys)) {\n excludeKeys = new Set(last._excludeKeys.map(String));\n sources = values.slice(0, -1);\n }\n let result = {};\n let firstflag = true;\n for (let value of sources) {\n if (isEmpty(value)) {\n firstflag = false;\n continue;\n }\n if (firstflag) {\n cloneDeep(result, value, /* @__PURE__ */ new Set());\n firstflag = false;\n } else {\n cloneDeep(result, value, excludeKeys);\n }\n }\n return result;\n}\nfunction arrayDeepMerge(...values) {\n if (values.length < 1) {\n return values;\n }\n let source = [];\n let excludeKeys = /* @__PURE__ */ new Set();\n for (let value of values) {\n if (isEmpty(value)) continue;\n cloneArrayDeep(source, value, excludeKeys);\n }\n return source;\n}\nconst deepCopy = (copyValue) => {\n if (isArray(copyValue)) {\n let reval = [];\n for (let value of copyValue) {\n if (isPlainObject(value)) {\n reval.push(objectDeepMerge({}, value));\n } else {\n reval.push(value);\n }\n }\n return reval;\n } else {\n return objectDeepMerge({}, copyValue);\n }\n};\nfunction hasProperty(obj, prop) {\n return obj != null && obj != void 0 && Object.prototype.hasOwnProperty.call(obj, prop);\n}\nfunction isBlank(value) {\n return value === null || value === void 0 || isString(value) && value.trim() === \"\";\n}\nfunction isNumeric(value, typeIgnore = false) {\n if (typeIgnore === true) return !Number.isNaN(value);\n return (typeof value === \"number\" || isString(value) && value.trim() !== \"\" && !isNaN(parseFloat(value))) && isFinite(Number(value));\n}\nfunction objectToQueryString(param) {\n return Object.keys(param).map((key) => {\n if (param.hasOwnProperty(key) && param[key] !== void 0) {\n const val = param[key];\n return `${key}=${isObject(val) ? JSON.stringify(val) : val}`;\n }\n }).filter(Boolean).join(\"&\");\n}\nconst SPEICAL_CHAR_REGEX = {\n \"|\": \"[|]\",\n \"+\": \"[+]\",\n $: \"[$]\",\n \"*\": \"[*]\",\n \"(\": \"\\\\(\",\n \")\": \"\\\\)\",\n \"{\": \"\\\\{\",\n \"}\": \"\\\\}\",\n \"[\": \"\\\\[\",\n \"]\": \"\\\\]\",\n \"\\\\\": \"\\\\\\\\\\\\\\\\\"\n};\nfunction replaceParameter(template, param) {\n const matchObj = template.match(/#.*?#/g);\n if (matchObj == null) return template;\n let returnTemplate = template;\n const tmpKey = {};\n let matchKey;\n let orginKey;\n const paramObjFlag = isPlainObject(param);\n for (let j = 0, matchLen = matchObj.length; j < matchLen; j += 1) {\n orginKey = matchObj[j];\n matchKey = orginKey;\n const keyMatch = matchKey.match(/[*+$|^(){}[\\]]/gi);\n if (keyMatch != null) {\n const tmpReplaceKey = {};\n for (let z = 0, matchKeyLen = keyMatch.length; z < matchKeyLen; z += 1) {\n const specCh = keyMatch[z];\n if (!tmpReplaceKey[specCh]) {\n matchKey = matchKey.replace(new RegExp(SPEICAL_CHAR_REGEX[specCh], \"g\"), SPEICAL_CHAR_REGEX[specCh]);\n tmpReplaceKey[specCh] = specCh;\n }\n }\n }\n if (paramObjFlag) {\n if (!tmpKey[orginKey]) {\n const paramKey = orginKey.replace(/#/g, \"\");\n let replaceValue = param[paramKey] || \"\";\n if (isObject(replaceValue)) {\n replaceValue = JSON.stringify(replaceValue);\n }\n returnTemplate = returnTemplate.replace(new RegExp(matchKey, \"g\"), replaceValue);\n tmpKey[orginKey] = orginKey;\n }\n } else {\n returnTemplate = returnTemplate.replace(new RegExp(matchKey, \"g\"), param);\n }\n }\n return returnTemplate;\n}\nconst xssFilter = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n};\nconst charsToReplace = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\"\n};\nfunction trim(s) {\n return s.replace(/^\\s+|\\s+$/g, \"\");\n}\nfunction leftTrim(s) {\n return s.replace(/^\\s+/g, \"\");\n}\nfunction rightTrim(s) {\n return s.replace(/\\s+$/g, \"\");\n}\nfunction allTrim(s) {\n return s.replace(/\\s+/g, \"\");\n}\nfunction matchCount(str, matchString) {\n if (isBlank(str)) return 0;\n const re = new RegExp(matchString, \"ig\");\n const resultArray = str.match(re);\n return resultArray == null ? 0 : resultArray.length;\n}\nfunction leftPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\");\n}\nfunction leftPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"l\", true);\n}\nfunction rightPad(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\");\n}\nfunction rightPadClamp(str, len, ch = \"0\") {\n return pad(str, len, ch, \"r\", true);\n}\nfunction escapeHTML(html) {\n const fn = (tag) => {\n return charsToReplace[tag] || tag;\n };\n return html.replace(/[&<>\"]/g, fn);\n}\nfunction xss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(key, xssFilter[key]);\n });\n }\n return returnText;\n}\nfunction unXss(inputText) {\n let returnText = inputText;\n if (returnText) {\n Object.keys(xssFilter).forEach((key) => {\n returnText = returnText.replaceAll(xssFilter[key], key);\n });\n }\n return returnText;\n}\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nfunction upperCase(str) {\n return (str || \"\").toUpperCase();\n}\nfunction lowerCase(str) {\n return (str || \"\").toLowerCase();\n}\nfunction pad(orginStr, size, ch, type = \"l\", clamp = false) {\n let str = \"\";\n if (isEmpty(orginStr)) {\n str = \"\";\n } else {\n str = isString(orginStr) ? orginStr : `${orginStr}`;\n }\n const strLength = str.length;\n if (strLength > size) {\n return clamp ? str.slice(0, size) : str;\n }\n const len = size - strLength;\n if (len < 1) return str;\n const padStr = ch.repeat(len);\n return type === \"l\" ? padStr + str : str + padStr;\n}\nfunction uuid(dashRemoveFlag = true) {\n let d = (/* @__PURE__ */ new Date()).getTime();\n const reval = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === \"x\" ? r : r & 7 | 8).toString(16);\n });\n return dashRemoveFlag ? reval.replace(/-/g, \"\") : reval;\n}\nfunction isFormData(data) {\n if (!data) return false;\n return typeof FormData !== \"undefined\" && data instanceof FormData;\n}\nfunction getURLParams(checkUrl) {\n const url = new URL(checkUrl);\n const params = {};\n for (const key of url.searchParams.keys()) {\n params[key] = url.searchParams.getAll(key);\n }\n return params;\n}\nfunction getURLParam(checkUrl, paramKey) {\n const url = new URL(checkUrl);\n return url.searchParams.get(paramKey);\n}\nconst instanceMap = {};\nconst centerLoadingIntervalObject = {};\nlet G_LOADING_IDX = 0;\nlet defaultOptions = {\n // 사라지는 시간\n timeout: -1,\n // 시간 표시 여부\n enableTime: false,\n // 표시 내용\n content: \"\",\n // background color\n bgColor: \"#ffffff\",\n // z-index\n zIndex: 9999,\n // opacity\n opacity: \"0.3\",\n // 이미지 경로 및 base64 코드\n loadingImg: \"data:image/gif;base64,R0lGODlhIAAgALMLADaJuwRsqx57s8bc65rD3FacxoS21bzX6Njo8eTu9bbT5v///wAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkFBQTEyNEY3MTZBMTFFNTlEMTU4OEI0NTk3MzIxQkYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QkFBQTEyNTA3MTZBMTFFNTlEMTU4OEI0NTk3MzIxQkYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCQUFBMTI0RDcxNkExMUU1OUQxNTg4QjQ1OTczMjFCRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCQUFBMTI0RTcxNkExMUU1OUQxNTg4QjQ1OTczMjFCRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn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\",\n // css cursor\n cursor: \"wait\",\n // 취소 버튼 활성화 여부\n enableCancelButton: false,\n // 취소 벼튼 활성화시 callback 메소드\n callback: (param) => {\n return true;\n }\n};\nclass Loading {\n constructor(selector, options = {}) {\n this.orginStylePosition = \"\";\n if (isBlank(selector)) {\n selector = \"body\";\n }\n if (selector instanceof HTMLElement) {\n this.containerNode = selector;\n this.selector = \"\";\n } else {\n selector = selector || \"body\";\n this.containerNode = document.querySelector(selector);\n this.selector = selector;\n }\n if (!this.containerNode) return;\n this.options = objectDeepMerge(defaultOptions, options);\n instanceMap[this.selector] = this;\n this.show();\n }\n static create(selector, options) {\n return new Loading(selector, options);\n }\n static instance(selector) {\n return instanceMap[selector];\n }\n static setOptions(options) {\n defaultOptions = Object.assign({}, defaultOptions, options);\n }\n cancelHandler() {\n const callback = this.options.callback;\n if (callback) {\n if (callback(this.options) !== false) {\n this.hide();\n }\n } else {\n this.hide();\n }\n }\n /**\n * show loading module\n * @public\n */\n show() {\n var _a, _b, _c;\n const containerNode = this.containerNode;\n if (!containerNode) return;\n if (containerNode.querySelector(\":scope >.daracl-cl\")) return;\n this.orginStylePosition = containerNode.style.position;\n const computedStyle = getComputedStyle(containerNode);\n if (![\"absolute\", \"relative\", \"fixed\", \"sticky\"].includes(computedStyle.position)) {\n containerNode.style.position = \"relative\";\n }\n const opts = this.options;\n let zIndex = opts.zIndex;\n if (defaultOptions.zIndex == opts.zIndex) {\n zIndex += ++G_LOADING_IDX;\n }\n let template = `\n <div class=\"daracl-cl\" style=\"cursor: ${opts.cursor}; top: 0px; left: 0px; z-index: ${zIndex}; position: absolute; width: 100%; height: 100%;\">\n <div style=\"position: absolute; background: ${opts.bgColor}; opacity: ${opts.opacity}; width: 100%; height: 100%; z-index: 1\"></div>\n <div style=\"z-index: 10; text-align: center; margin: 0; position: absolute; top: 40%; left: 50%; transform: translate(-50%, -50%)\">\n ${opts.enableTime ? `<div class=\"daracl-cl-time\" style=\"position: absolute; z-index: ${opts.zIndex + 1}; width: 100%; margin-top: 8px;\">0</div>` : \"\"}\n <img class=\"daracl-cl-image\" src=\"${opts.loadingImg}\" />\n `;\n if (opts.content) {\n template += `<div class=\"daracl-cl-content\">${opts.content}</div>`;\n }\n if (opts.enableCancelButton) {\n template += `<div style=\"height: 35px; line-height: 35px;\"><button type=\"button\" class=\"daracl-cl-btn\">Cancel</button></div>`;\n }\n template += `</div></div>`;\n containerNode.insertAdjacentHTML(\"afterbegin\", template);\n this.loadingElement = containerNode.querySelector(\":scope >.daracl-cl\");\n if (opts.enableCancelButton) {\n (_b = (_a = this.loadingElement) == null ? void 0 : _a.querySelector(\".daracl-cl-btn\")) == null ? void 0 : _b.addEventListener(\"click\", () => this.cancelHandler());\n }\n if (opts.enableTime) {\n const loadingTimeElement = (_c = this.loadingElement) == null ? void 0 : _c.querySelector(\".daracl-cl-time\");\n let sec = 0;\n centerLoadingIntervalObject[this.selector] = window.setInterval(() => {\n loadingTimeElement.innerText = `${++sec}`;\n }, 1e3);\n }\n if (opts.timeout > 0) {\n setTimeout(() => this.hide(), opts.timeout);\n }\n }\n /**\n * set display content\n *\n * @public\n * @param {string} content \n */\n setContent(content) {\n var _a, _b, _c;\n if (!this.containerNode) return;\n const existing = (_a = this.loadingElement) == null ? void 0 : _a.querySelector(\".daracl-cl-content\");\n if (!existing) {\n (_c = (_b = this.loadingElement) == null ? void 0 : _b.querySelector(\".daracl-cl-image\")) == null ? void 0 : _c.insertAdjacentHTML(\"afterend\", `<div class=\"daracl-cl-content\">${content}</div>`);\n } else {\n existing.innerHTML = content;\n }\n }\n /**\n * hide loading module\n *\n * @public\n * @param {?boolean} [flag] \n */\n hide(flag) {\n if (this.containerNode) {\n this.containerNode.style.position = this.orginStylePosition || \"\";\n const loadingEle = this.containerNode.querySelector(\":scope >.daracl-cl\");\n if (loadingEle) {\n this.containerNode.removeChild(loadingEle);\n }\n if (this.options.enableTime) {\n clearInterval(centerLoadingIntervalObject[this.selector]);\n delete centerLoadingIntervalObject[this.selector];\n }\n }\n if (flag !== false) {\n delete instanceMap[this.selector];\n }\n }\n /**\n * destroy loading instance\n *\n * @public\n * @static\n * @param {string} selector \n */\n static destroy(selector) {\n if (instanceMap[selector]) {\n instanceMap[selector].hide(false);\n delete instanceMap[selector];\n }\n }\n}\nclass AjaxAbstract {\n constructor(options) {\n this.options = options;\n }\n // 객체 내부에 File/Blob/FileList가 있는지 재귀 검사\n containsFile(data) {\n if (!data) return false;\n if (typeof File !== \"undefined\" && (data instanceof File || data instanceof Blob)) return true;\n if (typeof FileList !== \"undefined\" && data instanceof FileList) return true;\n if (isArray(data)) {\n for (const item of data) {\n if (this.containsFile(item)) return true;\n }\n return false;\n }\n if (isObject(data)) {\n for (const key of Object.keys(data)) {\n if (this.containsFile(data[key])) return true;\n }\n }\n return false;\n }\n // GET용: URL에 데이터를 쿼리 스트링으로 추가합니다.\n getUrlWithData(url, method, data) {\n if (method !== \"GET\") return url;\n if (!data) return url;\n if (isFormData(data)) return url;\n const qs = objectToQueryString(data);\n return url + (url.includes(\"?\") ? \"&\" : \"?\") + qs;\n }\n // 단순 객체(파일 포함 가능)를 FormData로 변환\n buildFormDataFromObject(obj) {\n const form = new FormData();\n const appendValue = (key, value) => {\n if (value === null || value === void 0) {\n return;\n }\n if (typeof File !== \"undefined\" && (value instanceof File || value instanceof Blob)) {\n form.append(key, value);\n return;\n }\n if (typeof FileList !== \"undefined\" && value instanceof FileList) {\n for (let i = 0; i < value.length; i++) {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), value[i]);\n }\n return;\n }\n if (Array.isArray(value)) {\n for (const v of value) {\n if (typeof File !== \"undefined\" && (v instanceof File || v instanceof Blob)) {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), v);\n } else {\n form.append(key + (key.endsWith(\"[]\") ? \"\" : \"[]\"), typeof v === \"object\" ? JSON.stringify(v) : String(v));\n }\n }\n return;\n }\n if (isObject(value)) {\n form.append(key, JSON.stringify(value));\n return;\n }\n form.append(key, String(value));\n };\n if (isObject(obj)) {\n for (const k of Object.keys(obj)) {\n appendValue(k, obj[k]);\n }\n } else {\n appendValue(\"file\", obj);\n }\n return form;\n }\n}\nclass FetchAjax extends AjaxAbstract {\n constructor(options) {\n super(options);\n }\n // Fetch 요청을 처리합니다.\n async request(url, method, opts) {\n const hasFormData = isFormData(opts.data);\n const containsFile = !hasFormData && this.containsFile(opts.data);\n let preparedData = opts.data;\n if (containsFile && !hasFormData) {\n preparedData = this.buildFormDataFromObject(opts.data);\n }\n const finalUrl = this.getUrlWithData(url, method, preparedData);\n const { loadingInstance, abortController } = this.prepareRequest(opts);\n let timeoutId = null;\n let isTimeout = false;\n if (opts.timeout && opts.timeout > 0 && abortController) {\n timeoutId = setTimeout(() => {\n isTimeout = true;\n abortController.abort();\n }, opts.timeout);\n }\n const fetchHeaders = opts.headers ? { ...opts.headers } : void 0;\n let body = void 0;\n if (method !== \"GET\") {\n if (isFormData(preparedData)) {\n body = preparedData;\n if (fetchHeaders) {\n Object.keys(fetchHeaders).forEach((k) => {\n if (k.toLowerCase() === \"content-type\") delete fetchHeaders[k];\n });\n }\n } else if (containsFile) {\n body = preparedData;\n if (fetchHeaders) {\n Object.keys(fetchHeaders).forEach((k) => {\n if (k.toLowerCase() === \"content-type\") delete fetchHeaders[k];\n });\n }\n } else if (isObject(preparedData)) {\n const contentType = fetchHeaders && (fetchHeaders[\"Content-Type\"] || fetchHeaders[\"content-type\"]) || \"\";\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n body = objectToQueryString(preparedData);\n } else {\n if (fetchHeaders && !(\"Content-Type\" in fetchHeaders) && !(\"content-type\" in fetchHeaders)) {\n fetchHeaders[\"Content-Type\"] = \"application/json\";\n }\n body = JSON.stringify(preparedData);\n }\n } else if (preparedData != null) {\n body = preparedData;\n }\n }\n const fetchOptions = {\n method,\n headers: fetchHeaders,\n body,\n signal: abortController == null ? void 0 : abortController.signal\n };\n try {\n const response = await fetch(finalUrl, fetchOptions);\n if (timeoutId) clearTimeout(timeoutId);\n const text = await response.text();\n let data = text;\n if (opts.responseType === \"json\") {\n try {\n data = JSON.parse(text);\n } catch (e) {\n data = { error: e.message };\n }\n }\n if (!response.ok) {\n return Promise.reject(\n this.createError({\n type: \"http\",\n status: response.status,\n statusText: response.statusText,\n responseText: text,\n xhr: response,\n loadingInstance\n })\n );\n }\n return {\n data,\n status: response.status,\n responseText: text,\n config: opts,\n headers: this.parseFetchHeaders(response),\n loadingInstance\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n let errorType = \"network\";\n if (err.name === \"AbortError\") {\n errorType = isTimeout ? \"timeout\" : \"abort\";\n }\n return Promise.reject(\n this.createError({\n type: errorType,\n error: err,\n loadingInstance\n })\n );\n }\n }\n // 요청 준비를 처리합니다.\n prepareRequest(opts) {\n var _a;\n let loadingInstance = null;\n let abortController = null;\n const loaderSelector = opts.loaderContainer;\n if (loaderSelector) {\n if (((_a = opts.loaderOption) == null ? void 0 : _a.enableCancelButton) && typeof AbortController !== \"undefined\") {\n abortController = new AbortController();\n const originalCallback = opts.loaderOption.callback;\n opts.loaderOption.callback = () => {\n abortController.abort();\n if (originalCallback) originalCallback(opts);\n };\n }\n loadingInstance = new Loading(loaderSelector, opts.loaderOption);\n }\n if (opts.beforeRequest) opts.beforeRequest.call(null, opts, null, loadingInstance);\n return { loadingInstance, abortController };\n }\n // 응답 headers를 파싱합니다.\n parseFetchHeaders(response) {\n const headersObj = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n return headersObj;\n }\n // 오류 객체를 생성합니다.\n createError(params) {\n const { type, xhr, status, statusText, responseText, error, loadingInstance } = params;\n const reqXhr = xhr || {};\n return {\n type,\n status: status ?? reqXhr.status ?? 0,\n statusText: statusText ?? reqXhr.statusText ?? \"\",\n responseText: responseText ?? \"\",\n error: error ?? null,\n xhr,\n loadingInstance\n };\n }\n}\nclass XHRAjax extends AjaxAbstract {\n constructor(options) {\n super(options);\n }\n async request(url, method, opts) {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const hasFormData = isFormData(opts.data);\n const containsFile = !hasFormData && this.containsFile(opts.data);\n let preparedData = opts.data;\n if (containsFile) {\n preparedData = this.buildFormDataFromObject(opts.data);\n }\n const finalUrl = this.getUrlWithData(url, method, preparedData);\n xhr.open(method, finalUrl, opts.async !== false);\n if (opts.timeout && opts.timeout > 0) xhr.timeout = opts.timeout;\n this.setHeaders(xhr, opts, hasFormData || containsFile);\n xhr.open(method, finalUrl, opts.async !== false);\n if (opts.timeout && opts.timeout > 0) xhr.timeout = opts.timeout;\n this.setHeaders(xhr, opts, hasFormData || containsFile);\n const onUploadProgress = opts.onUploadProgress;\n const onDownloadProgress = opts.onDownloadProgress;\n if (isFunction(onUploadProgress) && xhr.upload) {\n xhr.upload.onprogress = (ev) => {\n try {\n onUploadProgress({ xhr, ev });\n } catch (e) {\n onDownloadProgress({ xhr, ev, error: e });\n }\n };\n }\n if (isFunction(onDownloadProgress)) {\n xhr.onprogress = (ev) => {\n try {\n onDownloadProgress({ xhr, ev });\n } catch (e) {\n onDownloadProgress({ xhr, ev, error: e });\n }\n };\n }\n const { loadingInstance } = this.prepareRequest(opts, xhr);\n let errorHandled = false;\n xhr.onreadystatechange = () => {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n if (xhr.status >= 200 && xhr.status < 300) {\n if (!errorHandled) {\n const response = this.parseResponse(xhr, opts);\n resolve({ ...response, loadingInstance });\n }\n } else if (xhr.status > 0) {\n reject(this.createError({ type: \"http\", xhr, loadingInstance }));\n }\n }\n };\n xhr.onerror = () => {\n if (errorHandled) return;\n errorHandled = true;\n reject(this.createError({ type: \"network\", xhr, loadingInstance }));\n };\n xhr.ontimeout = () => {\n if (errorHandled) return;\n errorHandled = true;\n reject(this.createError({ type: \"timeout\", xhr, loadingInstance }));\n };\n xhr.onabort = () => {\n if (errorHandled) return;\n errorHandled = true;\n reject(this.createError({ type: \"abort\", xhr, loadingInstance }));\n };\n if (method === \"GET\" || !preparedData) {\n xhr.send();\n } else if (isFormData(preparedData)) {\n xhr.send(preparedData);\n } else if (isObject(preparedData)) {\n const contentType = opts.headers && opts.headers[\"Content-Type\"] || \"\";\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n xhr.send(objectToQueryString(preparedData));\n } else {\n xhr.send(JSON.stringify(preparedData));\n }\n } else {\n xhr.send(preparedData);\n }\n });\n }\n // 응답을 파싱합니다.\n parseResponse(xhr, opts) {\n let responseText = xhr.responseText;\n let data = responseText;\n if (opts.responseType === \"json\") {\n try {\n data = JSON.parse(xhr.responseText);\n } catch (e) {\n data = { error: e.message };\n }\n }\n return {\n data,\n status: xhr.status,\n readyState: xhr.readyState,\n responseText,\n headers: this.getResponseHeaders(xhr)\n };\n }\n // 응답 headers를 파싱합니다.\n getResponseHeaders(xhr) {\n const headersObj = {};\n const allHeaders = xhr.getAllResponseHeaders();\n const lines = allHeaders.trim().split(/[\\r\\n]+/);\n for (const line of lines) {\n const parts = line.split(\": \");\n const key = parts.shift();\n const value = parts.join(\": \");\n if (key) headersObj[key] = value;\n }\n return headersObj;\n }\n // 요청 headers를 설정합니다.\n // isFormData가 true이면 Content-Type을 설정하지 않아 브라우저가 boundary 포함한 적절한 헤더를 생성하도록 함\n setHeaders(xhr, opts, isFormData2 = false) {\n const headers = opts.headers || {};\n if (!isFormData2) {\n if (!hasProperty(headers, \"Content-Type\")) {\n headers[\"Content-Type\"] = isObject(opts.data) ? \"application/json\" : \"application/x-www-form-urlencoded\";\n }\n for (const key of Object.keys(headers)) {\n if (headers[key]) xhr.setRequestHeader(key, headers[key]);\n }\n } else {\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() === \"content-type\") continue;\n if (headers[key]) xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n // 요청 준비를 처리합니다.\n prepareRequest(opts, xhr) {\n var _a;\n let loadingInstance = null;\n const loaderSelector = opts.loaderContainer;\n if (loaderSelector) {\n if ((_a = opts.loaderOption) == null ? void 0 : _a.enableCancelButton) {\n const originalCallback = opts.loaderOption.callback;\n opts.loaderOption.callback = () => {\n xhr.abort();\n if (originalCallback) originalCallback(opts);\n };\n }\n loadingInstance = new Loading(loaderSelector, opts.loaderOption);\n }\n if (opts.beforeRequest) opts.beforeRequest.call(null, opts, null, loadingInstance);\n return { loadingInstance };\n }\n // 오류 객체를 생성합니다. \n createError(params) {\n const { type, xhr, status, statusText, responseText, error, loadingInstance } = params;\n return {\n type,\n status: status ?? (xhr ? xhr.status : 0),\n statusText: statusText ?? (xhr ? xhr.statusText : \"\"),\n responseText: responseText ?? (xhr ? xhr.responseText : \"\"),\n error: error ?? null,\n xhr,\n loadingInstance\n };\n }\n}\nclass Ajax {\n constructor(options) {\n this.options = objectDeepMerge(this.createGlobalAjaxOptions(), options || {});\n this.fetchAjax = new FetchAjax(this.options);\n this.xhrAjax = new XHRAjax(this.options);\n this.isFetchSupported = typeof window !== \"undefined\" && \"fetch\" in window;\n }\n createGlobalAjaxOptions() {\n return {\n baseUrl: \"\",\n method: \"POST\",\n timeout: -1,\n responseType: \"json\",\n headers: { \"X-Requested-With\": \"XMLHttpRequest\" },\n loaderContainer: \"\",\n enableDefaultLoader: false,\n loaderOption: {},\n validMethods: [\"GET\", \"POST\", \"PUT\", \"DELETE\"],\n errorAlertView: false,\n ignoreResultCheck: false,\n fetchMode: \"xhr\"\n };\n }\n createDefaultOptions() {\n const opts = this.options;\n return {\n url: \"\",\n method: opts.method,\n timeout: opts.timeout,\n responseType: opts.responseType,\n headers: opts.headers,\n loaderContainer: \"\",\n loaderOption: {},\n errorAlertView: opts.errorAlertView,\n ignoreResultCheck: opts.ignoreResultCheck\n };\n }\n /**\n * Ajax 인스턴스를 생성합니다.\n * @param {?AjaxOptions} [options] ajax 옵션\n * @returns {Ajax} Ajax 인스턴스\n */\n static create(options) {\n return new Ajax(options);\n }\n _request(url, method, options, useFetch = true) {\n var _a;\n url = this.options.baseUrl ? this.options.baseUrl + url : url;\n const data = options == null ? void 0 : options.data;\n const opts = objectDeepMerge(this.createDefaultOptions(), options || {}, { _excludeKeys: [\"data\"] });\n opts.data = data;\n const ajaxMethod = (method || opts.method || \"GET\").toUpperCase();\n if (!((_a = this.options.validMethods) == null ? void 0 : _a.includes(ajaxMethod))) {\n return Promise.reject(\n {\n type: \"http\",\n status: 405,\n readyState: 0,\n statusText: \"Invalid Method\",\n responseText: `Invalid HTTP method: ${ajaxMethod}`,\n xhr: null,\n loadingInstance: null\n }\n );\n }\n opts.loaderContainer = opts.loaderContainer || (this.options.enableDefaultLoader ? this.options.loaderContainer || \"body\" : null);\n const returnPromise = this.isFetchSupported && this.options.fetchMode == \"fetch\" ? this.fetchAjax.request(url, ajaxMethod, opts) : this.xhrAjax.request(url, ajaxMethod, opts);\n return returnPromise.then((response) => {\n if (response.loadingInstance) response.loadingInstance.hide();\n return Promise.resolve(response);\n }).catch((error) => {\n if (error.loadingInstance) error.loadingInstance.hide();\n return Promise.reject(error);\n });\n }\n /**\n * 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n request(options, useFetch = true) {\n const url = (options == null ? void 0 : options.url) || \"\";\n return this._request(url, options == null ? void 0 : options.method, options, useFetch);\n }\n /**\n * get 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n get(url, options, useFetch = true) {\n return this._request(url, \"GET\", options, useFetch);\n }\n /**\n * post 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n post(url, options, useFetch = true) {\n return this._request(url, \"POST\", options, useFetch);\n }\n /**\n * put 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n put(url, options, useFetch = true) {\n return this._request(url, \"PUT\", options, useFetch);\n }\n /**\n * DELETE 요청을 보냅니다.\n *\n * @param {string} url api URL\n * @param {?AjaxOptions} [options] ajax 옵션\n * @param {boolean} [useFetch=true] Fetch API 사용 여부\n * @returns {*} \n */\n delete(url, options, useFetch = true) {\n return this._request(url, \"DELETE\", options, useFetch);\n }\n}\nfunction $querySelectorList(el) {\n if (isBlank(el)) {\n return [];\n }\n if (isString(el)) {\n return Array.from(document.querySelectorAll(el));\n }\n if (isArray(el)) {\n return el;\n }\n if (el instanceof Document) {\n return [document];\n }\n if (el instanceof Element) {\n return [el];\n }\n if (el instanceof NodeList) {\n return Array.from(el);\n }\n return [];\n}\nfunction $querySelector(el) {\n if (isBlank(el)) {\n return null;\n }\n if (el instanceof Document) {\n return document;\n }\n if (el instanceof Element) {\n return el;\n }\n if (isString(el)) {\n return document.querySelector(el);\n }\n if (isArray(el)) {\n return el[0];\n }\n if (el instanceof NodeList) {\n return el.item(0);\n }\n return null;\n}\nfunction getElementRect(el, includeScroll = false) {\n if (!el) {\n throw new Error(\"유효하지 않은 요소입니다.\");\n }\n const rect = el.getBoundingClientRect();\n const scrollX = includeScroll ? window.scrollX : 0;\n const scrollY = includeScroll ? window.scrollY : 0;\n return {\n top: rect.top + scrollY,\n left: rect.left + scrollX,\n bottom: rect.bottom + scrollY,\n right: rect.right + scrollX,\n width: rect.width,\n height: rect.height\n };\n}\nfunction before(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"beforebegin\", renderElements);\n}\nfunction after(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"afterend\", renderElements);\n}\nfunction prepend(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"afterbegin\", renderElements);\n}\nfunction append(el, renderElements) {\n insertAdjacentHTML($querySelectorList(el), \"beforeend\", renderElements);\n}\nfunction insertAdjacentHTML(elements, insertPosition, renderElements) {\n if (isString(renderElements)) {\n elements.forEach((el) => {\n el.insertAdjacentHTML(insertPosition, renderElements);\n });\n } else {\n elements.forEach((el) => {\n el.insertAdjacentElement(insertPosition, renderElements);\n });\n }\n}\nfunction eqAttributeValue(element, attr, value) {\n return element.getAttribute(attr) == value;\n}\nfunction addAttr(el, attrs) {\n for (let key in attrs) {\n el.setAttribute(key, attrs[key]);\n }\n}\nfunction removeAttr(element, ...attrKey) {\n let elements;\n if (element instanceof HTMLElement) {\n elements = [element];\n } else {\n elements = element;\n }\n elements.forEach((ele) => {\n for (let attr of attrKey) {\n ele.removeAttribute(attr);\n }\n });\n}\nconst styleClassSplit = (styleClass) => {\n return styleClass.trim().split(/\\s+/);\n};\nfunction addClass(element, styleClass) {\n if (!element) return;\n const elements = $querySelectorList(element);\n const addStyles = styleClassSplit(styleClass);\n elements.forEach((el) => {\n el.classList.add(...addStyles);\n });\n}\nfunction removeClass(element, classNames) {\n if (!element || typeof classNames !== \"string\") return;\n const elements = $querySelectorList(element);\n const styleClasses = styleClassSplit(classNames);\n for (const el of elements) {\n el.classList.remove(...styleClasses);\n }\n}\nfunction toggleClass(element, classNames) {\n if (!element || typeof classNames !== \"string\") return;\n const elements = $querySelectorList(element);\n const styleClasses = styleClassSplit(classNames);\n for (const el of elements) {\n styleClasses.forEach((cls) => {\n el.classList.toggle(cls);\n });\n }\n}\nfunction addStyleCss(element, styles) {\n for (const key in styles) {\n if (Object.prototype.hasOwnProperty.call(styles, key)) {\n element.style.setProperty(key, styles[key]);\n }\n }\n}\nfunction keyboardEventKey(e) {\n return (e.key || \"\").toLowerCase();\n}\nfunction eventKeyCode(e) {\n const evt = e;\n if (typeof evt.keyCode === \"number\" && evt.keyCode > 0) {\n return evt.keyCode;\n }\n if (typeof evt.which === \"number\" && evt.which > 0) {\n return evt.which;\n }\n return void 0;\n}\nfunction isShiftKey(evt) {\n return evt.shiftKey;\n}\nfunction isCtrlKey(evt) {\n return evt.ctrlKey;\n}\nfunction isSpacebar(evt) {\n const event = evt;\n if (event.key === \" \" || event.code === \"Space\") {\n return true;\n }\n return false;\n}\nfunction isEnter(evt) {\n const event = evt;\n if (event.key === \"Enter\" || event.code === \"Enter\") {\n return true;\n }\n return false;\n}\nfunction stopPreventCancel(e) {\n e.preventDefault();\n e.stopPropagation();\n}\nfunction eventPosition(e) {\n let evt;\n if (typeof TouchEvent !== \"undefined\" && e instanceof TouchEvent && e.touches.length > 0) {\n evt = e.touches[0];\n } else if (e instanceof MouseEvent) {\n evt = e;\n } else {\n evt = { pageX: 0, pageY: 0 };\n }\n return {\n x: evt.pageX,\n y: evt.pageY\n };\n}\nfunction isClickEvent(e) {\n if (e.type === \"touchstart\") {\n return true;\n }\n if (e instanceof MouseEvent) {\n return e.button === 0;\n }\n return false;\n}\nfunction formatMessage(msgFormat, msgParam) {\n return msgFormat.replace(new RegExp(\"(?<![\\\\$\\\\\\\\])\\\\{([A-Za-z0-9_.]+)\\\\}\", \"g\"), (match, key) => {\n return key in msgParam ? String(msgParam[key]) : match;\n });\n}\nconst VERSION = `${\"0.0.5\"}`;\nexport {\n $querySelector,\n $querySelectorList,\n Ajax,\n Loading,\n VERSION,\n addAttr,\n addClass,\n addStyleCss,\n after,\n allTrim,\n append,\n arrayDeepMerge,\n before,\n capitalize,\n deepCopy,\n eqAttributeValue,\n escapeHTML,\n eventKeyCode,\n eventPosition,\n formatMessage,\n getElementRect,\n getURLParam,\n getURLParams,\n hasProperty,\n isArray,\n isBlank,\n isClickEvent,\n isCtrlKey,\n isDate,\n isEmpty,\n isEnter,\n isFormData,\n isFunction,\n isNil,\n isNumeric,\n isObject,\n isPlainObject,\n isShiftKey,\n isSpacebar,\n isString,\n isUndefined,\n keyboardEventKey,\n leftPad,\n leftPadClamp,\n leftTrim,\n lowerCase,\n matchCount,\n objectDeepMerge,\n objectToQueryString,\n prepend,\n removeAttr,\n removeClass,\n replaceParameter,\n rightPad,\n rightPadClamp,\n rightTrim,\n stopPreventCancel,\n styleClassSplit,\n toggleClass,\n trim,\n unXss,\n upperCase,\n uuid,\n xss\n};\n//# sourceMappingURL=index.js.map\n","import { FormField } from \"@t/FormField\";\r\nimport { isArray as coreIsArray} from \"@daracl/core\";\r\n\r\nconst xssFilter = {\r\n \"&\": \"&\",\r\n \"<\": \"<\",\r\n \">\": \">\",\r\n '\"': \""\",\r\n \"'\": \"'\",\r\n} as any;\r\n\r\nexport const replaceXss = (inputText: string): string => {\r\n let returnText = inputText;\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(key, xssFilter[key]);\r\n });\r\n }\r\n return returnText;\r\n};\r\n\r\nexport const hasOwnProp = (obj: any, key: string): boolean => {\r\n return obj.hasOwnProperty(key);\r\n};\r\n\r\nexport const unReplace = (inputText: string): string => {\r\n let returnText = inputText;\r\n\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(xssFilter[key], key);\r\n });\r\n }\r\n return returnText;\r\n};\r\n\r\nexport const unFieldName = (fieldName: string): string => {\r\n if (fieldName) {\r\n return unReplace(fieldName).replaceAll('\"', '\\\\\"');\r\n }\r\n return \"\";\r\n};\r\nexport const isBlank = (value: any): boolean => {\r\n if (value === null) return true;\r\n if (value === \"\") return true;\r\n if (typeof value === \"undefined\") return true;\r\n if (typeof value === \"string\" && (value === \"\" || value.replace(/\\s/g, \"\") === \"\")) return true;\r\n\r\n return false;\r\n};\r\n\r\nexport const isUndefined = (value: any): value is undefined => {\r\n return typeof value === \"undefined\";\r\n};\r\n\r\nexport const isFunction = (value: any): boolean => {\r\n return typeof value === \"function\";\r\n};\r\n\r\nexport const isString = (value: any): value is string => {\r\n return typeof value === \"string\";\r\n};\r\nexport const isNumber = (value: any): value is number => {\r\n if (isBlank(value)) {\r\n return false;\r\n }\r\n value = +value;\r\n return !isNaN(value);\r\n};\r\n\r\nexport const isArray = (value: any): value is Array<any> => {\r\n return coreIsArray(value);\r\n};\r\n\r\n/**\r\n * 값있는지 여부 체크.\r\n *\r\n * @param {*} value\r\n * @returns {boolean}\r\n */\r\nexport const isEmpty = (value: any): boolean => isUndefined(value) || value == null; //_isEmpty(value);\r\n\r\n/**\r\n * tab render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} tab type 인지 여부\r\n */\r\nexport const isTabType = (field: FormField): boolean => {\r\n return field && field.renderType === \"tab\";\r\n};\r\n/**\r\n * grid render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} grid type 인지 여부\r\n */\r\nexport const isGridType = (field: FormField): boolean => {\r\n return field && field.renderType === \"grid\";\r\n};\r\nexport const replaceXssField = (field: FormField): FormField => {\r\n field.$xssName = getXssFieldName(field);\r\n\r\n field.label = replaceXss(field.label);\r\n return field;\r\n};\r\n\r\n/**\r\n * 값을 무시하는 필드\r\n *\r\n * @param field formField\r\n * @returns\r\n */\r\nexport const ignoreValueField = (field: FormField): boolean => {\r\n return isGridType(field.$parent) || isTabType(field.$parent);\r\n};\r\n\r\n/**\r\n * grid field name xss repalce\r\n *\r\n * @param {FormField} field\r\n * @returns {string} replace 된 field name\r\n */\r\nexport const getXssFieldName = (field: FormField): string => {\r\n if (isUndefined(field.$xssName)) {\r\n let returnText = field.name;\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(key, \"_\");\r\n });\r\n }\r\n\r\n return \"df_\" + returnText;\r\n }\r\n\r\n return field.$xssName;\r\n};\r\n\r\nexport const getHashCode = (str: string) => {\r\n let hash = 0;\r\n if (str.length == 0) return hash;\r\n for (let i = 0; i < str.length; i++) {\r\n let tmpChar = str.charCodeAt(i);\r\n hash = (hash << 5) - hash + tmpChar;\r\n hash = hash & hash;\r\n }\r\n return String(hash).replaceAll(/-/g, \"_\");\r\n};\r\n\r\nexport const isHiddenField = (field: FormField): boolean => {\r\n if (field.renderType === \"hidden\") {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const templateToElement = (htmlTemplate: string): Element | null => {\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = htmlTemplate;\r\n return template.content.firstElementChild;\r\n};\r\n\r\nexport function isPlainObject(obj: any) {\r\n // 객체가 아닌 경우 또는 null인 경우 false 반환\r\n if (typeof obj !== \"object\" || obj === null) {\r\n return false;\r\n }\r\n\r\n // 프로토타입 체인을 따라 Object 생성자를 찾음\r\n let proto = obj;\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n\r\n // Object 생성자의 prototype과 같으면 Plain Object로 판단\r\n return Object.getPrototypeOf(obj) === proto;\r\n}\r\n\r\nfunction isObject(value: any) {\r\n return typeof value === \"object\" && value !== null && !isArray(value);\r\n}\r\n\r\nfunction isDate(value: any) {\r\n return value instanceof Date && !isNaN(value.valueOf());\r\n}\r\n\r\n/**\r\n * object merge\r\n * \r\n * @example\r\n ```\r\n merge({},{aaa:'bbb',ccc:'ddd'},{bbb:'bbb','aaa':'aaa'})) -> {\"aaa\": \"aaa\", \"bbb\": \"bbb\", \"ccc\": \"ddd\"}\r\n ```\r\n * @param {...any[]} value\r\n * @returns {object}\r\n */\r\nexport const merge = (...value: any[]): any => {\r\n let reval = value[0];\r\n\r\n if (!isPlainObject(reval) || isEmpty(reval)) {\r\n return reval;\r\n }\r\n\r\n let i = 1;\r\n if (Object.keys(reval).length > 0) {\r\n i = 0;\r\n reval = isArray(reval) ? [] : {};\r\n }\r\n const argLen = value.length;\r\n for (; i < argLen; i += 1) {\r\n cloneDeep(reval, value[i]);\r\n }\r\n\r\n return reval;\r\n};\r\n\r\nfunction trim(s: string): string {\r\n return s.replace(/^\\s+|\\s+$/g, \"\");\r\n}\r\n\r\nfunction cloneDeep(dst: any, src: any): any {\r\n if (isObject(src)) {\r\n return cloneObjectDeep(dst, src);\r\n }\r\n\r\n if (isArray(src)) {\r\n return cloneArrayDeep(dst, src);\r\n }\r\n\r\n if (isDate(src)) {\r\n return new src.constructor(src);\r\n }\r\n return src;\r\n}\r\n\r\n/*eslint no-param-reassign: \"error\"*/\r\nfunction cloneObjectDeep(dst: any, src: any): object {\r\n if (isFunction(src)) {\r\n return src;\r\n }\r\n\r\n for (const key of Object.keys(src)) {\r\n const val = (src as any)[key];\r\n\r\n if (isUndefined(val)) {\r\n continue;\r\n }\r\n\r\n if (val === null) {\r\n dst[key] = val;\r\n } else if (isFunction(val)) {\r\n dst[key] = val;\r\n } else if (isEmpty(dst[key])) {\r\n dst[key] = cloneDeep(isArray(val) ? [] : {}, val);\r\n } else if (!isObject(val)) {\r\n dst[key] = val;\r\n } else {\r\n cloneDeep(dst[key], val);\r\n }\r\n }\r\n return dst;\r\n}\r\n\r\nfunction cloneArrayDeep(dst: any, src: any[]) {\r\n const isObj = isPlainObject(dst);\r\n\r\n for (let i = 0; i < src.length; i += 1) {\r\n const val = src[i];\r\n let newVal;\r\n\r\n if (val == null) {\r\n newVal = val;\r\n } else {\r\n newVal = cloneDeep(isArray(val) ? [] : {}, val);\r\n }\r\n\r\n if (isObj) {\r\n (dst as any)[i] = newVal;\r\n } else {\r\n dst.push(newVal);\r\n }\r\n }\r\n return dst;\r\n}\r\n","import { FormField } from \"@t/FormField\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\n\nexport abstract class Render {\n protected daraForm;\n protected rowElement;\n protected field;\n\n private enableView: boolean = true;\n\n constructor(form: DaraForm, field: FormField, rowElement: HTMLElement) {\n this.daraForm = form;\n this.field = field;\n this.rowElement = rowElement;\n this.createField();\n\n if (field.tooltip) rowElement.querySelector(\".df-tooltip\")?.setAttribute(\"tooltip\", field.tooltip);\n }\n\n public setDefaultInfo() {\n if (utils.isUndefined(this.field.defaultValue)) {\n this.setValue(\"\", false);\n } else {\n this.setValue(this.field.defaultValue, false);\n }\n\n if (!utils.isUndefined(this.field.placeholder)) {\n const ele = this.getElement();\n if (ele instanceof Element) {\n ele.setAttribute(\"placeholder\", this.field.placeholder);\n }\n }\n }\n\n public setDefaultOption() {\n this.setDisabled(this.field.disabled ?? false);\n }\n\n public addChildField(element: Element) {\n this.rowElement.querySelector(\".df-field-container\")?.append(element);\n }\n\n static isDataRender(): boolean {\n return true;\n }\n\n static isChildrenCreate(): boolean {\n return true;\n }\n\n public getForm(): DaraForm {\n return this.daraForm;\n }\n\n public abstract mounted(): void;\n public abstract getValue(): any;\n public abstract setValue(value: any, changeCheckFlag?: boolean): void;\n public abstract reset(): void;\n public abstract getElement(): any;\n public abstract valid(): ValidResult | boolean;\n public abstract createField(): void;\n\n public setValueItems(value: any): void {}\n\n public static getDescriptionTemplate(field: FormField): string {\n const classNames = field.descriptionClass ? utils.replaceXss(field.descriptionClass) : \"\";\n const style = field.descriptionStyle ? 'style=\"' + utils.replaceXss(field.descriptionStyle) + '\"' : \"\";\n\n return field.description ? `<div class=\"df-description ${classNames}\" ${style}>${field.description}</div>` : \"\";\n }\n\n public changeEventCall(field: FormField, e: Event | null, rederInfo: Render, fieldValue: any): boolean | undefined {\n if (field.onChange) {\n let changeInfo: any = {\n field: field,\n evt: e,\n oldValue: field.$value,\n value: fieldValue,\n };\n\n if (field.listItem?.list) {\n let valuesItem = [];\n const valueKey = Render.valuesValueKey(field);\n\n for (let val of field.listItem.list) {\n let changeVal = val[valueKey];\n if (utils.isString(fieldValue)) {\n if (changeVal == fieldValue) {\n valuesItem.push(val);\n break;\n }\n } else if (utils.isArray(fieldValue)) {\n if (fieldValue.includes(changeVal)) {\n valuesItem.push(val);\n }\n }\n }\n\n changeInfo.valueItems = valuesItem;\n }\n\n if (changeInfo.oldValue != changeInfo.value && field.onChange.call(null, changeInfo) === false) {\n rederInfo.setValue(field.$value, false);\n return false;\n }\n\n field.$value = changeInfo.value;\n }\n\n this.daraForm.conditionCheck();\n }\n\n public focus() {\n this.getElement().focus();\n }\n\n public isEnableView() {\n return this.enableView;\n }\n\n public show() {\n this.enableView = true;\n this.rowElement.classList.remove(\"df-hidden\");\n }\n\n public hide() {\n this.enableView = false;\n if (!this.rowElement.classList.contains(\"df-hidden\")) {\n this.rowElement.classList.add(\"df-hidden\");\n }\n }\n\n /**\n * 설명 추가\n *\n * @public\n * @param {string} desc\n */\n public setDescription(desc: string) {\n const descEle = this.rowElement.querySelector(\".df-description\");\n if (descEle) {\n descEle.textContent = desc;\n } else {\n const fieldEle = this.rowElement.querySelector(\".df-field\");\n if (fieldEle) {\n const parser = new DOMParser();\n this.field.description = desc;\n const descEle = parser.parseFromString(Render.getDescriptionTemplate(this.field), \"text/html\").querySelector(\".df-description\");\n\n if (descEle) fieldEle.parentNode?.insertBefore(descEle, fieldEle.nextSibling);\n }\n }\n }\n\n public setActive(id: string): void {\n //console.log(\"parent\");\n }\n\n public setDisabled(flag: boolean) {\n const ele = this.getElement();\n if (ele instanceof HTMLElement) {\n if (flag === false) {\n this.getElement().removeAttribute(\"disabled\");\n } else {\n this.getElement().setAttribute(\"disabled\", true);\n }\n }\n }\n\n public commonValidator() {\n //this.field.diff\n }\n\n public static valuesValueKey(field: FormField): string {\n return field.listItem?.valueField ? field.listItem.valueField : \"value\";\n }\n\n public static valuesLabelKey(field: FormField): string {\n return field.listItem?.labelField ? field.listItem.labelField : \"label\";\n }\n\n public static valuesLabelValue(label: string, val: any) {\n let replaceFlag = false;\n const resultValue = label.replace(/\\{\\{([A-Za-z0-9_.]*)\\}\\}/g, (match, key) => {\n replaceFlag = true;\n return val[key] || \"\";\n });\n\n if (replaceFlag) {\n return resultValue;\n }\n\n return val[label] || \"\";\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\n\r\nconst regexp = {\r\n mobile: /^\\d{3}-\\d{3,4}-\\d{4}$/,\r\n email: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/,\r\n url: /^(?:(?:https?|HTTPS?|ftp|FTP):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-zA-Z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/,\r\n number: /\\d$/,\r\n alpha: /^[a-zA-Z]+$/,\r\n \"alpha-num\": /^[a-zA-Z0-9]+$/,\r\n variable: /^[a-zA-Z0-9_$][a-zA-Z0-9_$]*$/,\r\n \"number-char\": /^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]/,\r\n \"upper-char\": /^(?=.*?[A-Z])(?=.*?[a-z])/,\r\n \"upper-char-special\": /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-])/,\r\n \"upper-char-special-number\": /^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]/,\r\n};\r\n\r\n/**\r\n * 정규식 유효성 체크.\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @param {(ValidResult | undefined)} result\r\n * @returns {ValidResult}\r\n */\r\nexport const regexpValidator = (value: string, field: FormField, result: ValidResult): ValidResult => {\r\n if (!field.$instance.isEnableView()) {\r\n return { name: field.name, constraint: [] };\r\n }\r\n\r\n if (typeof result === \"undefined\") {\r\n result = { name: field.name, constraint: [] };\r\n }\r\n\r\n const regexpType = field.regexpType;\r\n\r\n if (regexpType) {\r\n if (!regexp[regexpType].test(value)) {\r\n result.regexp = regexpType;\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { regexpValidator } from \"./regexpValidator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * validator , regexp 체크 .\r\n *\r\n * @param {string} value field value\r\n * @param {FormField} field field 정보\r\n * @param {ValidResult} result\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const validator = (value: string, field: FormField, result: ValidResult): ValidResult | boolean => {\r\n if (field.validator) {\r\n result.validator = field.validator(field, value);\r\n if (typeof result.validator === \"object\") {\r\n return result;\r\n }\r\n }\r\n\r\n result = regexpValidator(value, field, result);\r\n\r\n if (result.regexp) {\r\n return result;\r\n }\r\n\r\n if (field.different) {\r\n const diffFieldName = field.different.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() == diffField.$instance.getValue()) {\r\n result.message = field.different.message;\r\n return result;\r\n }\r\n }\r\n\r\n if (field.identical) {\r\n const diffFieldName = field.identical.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() != diffField.$instance.getValue()) {\r\n result.message = field.identical.message;\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport { validator } from \"./validator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * 숫자 유효성 체크\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const numberValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n const numValue = Number(value);\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (!utils.isNumber(value)) {\r\n result.constraint.push(RULES.NAN);\r\n return result;\r\n }\r\n\r\n if (validator(value, field, result) !== true) {\r\n return result;\r\n }\r\n\r\n const rule = field.rule;\r\n if (rule) {\r\n const isMinimum = utils.isNumber(rule.minimum),\r\n isMaximum = utils.isNumber(rule.maximum);\r\n\r\n let minRule = false,\r\n minExclusive = false,\r\n maxRule = false,\r\n maxExclusive = false;\r\n\r\n if (isMinimum) {\r\n if (rule.exclusiveMinimum && numValue <= rule.minimum) {\r\n minExclusive = true;\r\n } else if (numValue < rule.minimum) {\r\n minRule = true;\r\n }\r\n }\r\n\r\n if (isMaximum) {\r\n if (rule.exclusiveMaximum && numValue >= rule.maximum) {\r\n maxExclusive = true;\r\n } else if (numValue > rule.maximum) {\r\n maxRule = true;\r\n }\r\n }\r\n\r\n if (isMinimum && isMaximum && (minRule || minExclusive || maxRule || maxExclusive)) {\r\n if (rule.exclusiveMinimum && rule.exclusiveMaximum && (minExclusive || maxExclusive)) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MINMAX);\r\n } else if (minExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MIN);\r\n } else if (maxExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MAX);\r\n } else {\r\n result.constraint.push(RULES.BETWEEN);\r\n }\r\n } else {\r\n if (minExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MIN);\r\n }\r\n\r\n if (maxExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MAX);\r\n }\r\n\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX);\r\n }\r\n }\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport Language from \"./Language\";\r\n\r\nexport const invalidMessage = (field: FormField, rowElement: Element, validResult: ValidResult | boolean) => {\r\n if (validResult === true) {\r\n rowElement.classList.remove(\"invalid\");\r\n\r\n if (!rowElement.classList.contains(\"valid\")) {\r\n rowElement.classList.add(\"valid\");\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement) {\r\n helpMessageElement.innerHTML = \"\";\r\n }\r\n\r\n return;\r\n }\r\n\r\n rowElement.classList.remove(\"valid\");\r\n\r\n if (!rowElement.classList.contains(\"invalid\")) {\r\n rowElement.classList.add(\"invalid\");\r\n }\r\n\r\n if (validResult !== false) {\r\n const message: string[] = Language.validMessage(field, validResult);\r\n\r\n if (validResult.message) {\r\n message.push(validResult.message);\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement && message.length > 0) {\r\n const msgHtml: string[] = [];\r\n message.forEach((item) => {\r\n msgHtml.push(`<div>${item}</div>`);\r\n });\r\n helpMessageElement.innerHTML = msgHtml.join(\"\");\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * remove row element style class\r\n *\r\n * @param {Element} rowElement\r\n */\r\nexport const resetRowElementStyleClass = (rowElement: Element) => {\r\n rowElement.classList.remove(\"invalid\");\r\n rowElement.classList.remove(\"valid\");\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { Render } from \"@/renderer/Render\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\nexport const inputEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"input\", (e: Event) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const numberInputEvent = (field: FormField, element: HTMLInputElement, renderInfo: Render) => {\r\n element.addEventListener(\"keyup\", (e: any) => {\r\n const val = e.target.value;\r\n\r\n if (!utils.isNumber(val)) {\r\n element.value = val.replace(/[^0-9\\.\\-\\+]/g, \"\");\r\n e.preventDefault();\r\n }\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n\r\n /*\r\n element.addEventListener('input', (e: any) => {\r\n customChangeEventCall(field, e, renderInfo);\r\n renderInfo.valid();\r\n })\r\n */\r\n};\r\n\r\nexport const dropdownChangeEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"change\", (e: any) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const customChangeEventCall = (field: FormField, e: Event, renderInfo: Render, value: any) => {\r\n renderInfo.changeEventCall(field, e, renderInfo, value);\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { numberValidator } from \"@/rule/numberValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { numberInputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class NumberRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n numberInputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-number df-help-icon\" />\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = numberValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport * as utils from \"@/util/utils\";\r\nimport { validator } from \"./validator\";\r\n\r\n/**\r\n * string validator\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const stringValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n let result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n const validResult = validator(value, field, result);\r\n if (validResult !== true) {\r\n return validResult;\r\n }\r\n\r\n const rule = field.rule;\r\n\r\n if (rule) {\r\n const valueLength = value.length;\r\n\r\n const isMinNumber = utils.isNumber(rule.minLength),\r\n isMaxNumber = utils.isNumber(rule.maxLength);\r\n\r\n let minRule = false,\r\n maxRule = false;\r\n if (isMinNumber && valueLength < rule.minLength) {\r\n minRule = true;\r\n }\r\n if (isMaxNumber && valueLength > rule.maxLength) {\r\n maxRule = true;\r\n }\r\n\r\n if (isMinNumber && isMaxNumber && (minRule || maxRule)) {\r\n result.constraint.push(RULES.BETWEEN);\r\n } else {\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN_LENGTH);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX_LENGTH);\r\n }\r\n }\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextAreaRender extends Render {\n private element: HTMLTextAreaElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let rows = field.rendererOptions?.rows;\n rows = +rows > 0 ? rows : 3;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <textarea name=\"${field.$xssName}\" rows=\"${rows}\" class=\"df-form-field df-textarea df-help-icon\"></textarea>\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLTextAreaElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { dropdownChangeEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport Language from \"@/util/Language\";\n\nexport default class DropdownRender extends Render {\n private element: HTMLSelectElement;\n private defaultSelected;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n let initDefaultValue = \"\";\n\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = DropdownRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultSelected = itemValue;\n }\n if (itemValue == initDefaultValue) {\n initDefaultValueFlag = true;\n }\n });\n\n if (initDefaultValueFlag) {\n this.defaultSelected = initDefaultValue;\n } else if (!this.defaultSelected) {\n if (field.rendererOptions?.disableDefaultOption === true) {\n this.defaultSelected = this.field.listItem?.list?.length > 0 ? this.field.listItem.list[0][valueKey] || \"\" : \"\";\n }\n }\n\n if (utils.isUndefined(this.defaultSelected)) {\n this.defaultSelected = \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultSelected, false);\n }\n\n mounted() {\n dropdownChangeEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let template = ` <div class=\"df-field\"><select name=\"${field.$xssName}\" class=\"df-form-field df-dropdown\">\n ${this.dropdownValuesTemplate(field)}\n </select> <i class=\"df-help-icon\"></i></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n fieldContainerElement.innerHTML = template;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLSelectElement;\n }\n\n public setValueItems(items: any): void {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n this.element.innerHTML = this.dropdownValuesTemplate(this.field);\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setValue(this.defaultSelected, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (value.length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n\n public dropdownValuesTemplate(field: FormField) {\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n let template = \"\";\n\n if (field.rendererOptions?.disableDefaultOption !== true) {\n template += `<option value=\"\">${Language.getMessage(\"selection\")}</option>`;\n }\n field.listItem?.list?.forEach((val) => {\n const attr = `${val.selected ? \"selected\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}`;\n if (utils.isUndefined(val[valueKey]) && val.label) {\n template += `<option value=\"${val.value || \"\"}\" ${attr}>${val.label}</option>`;\n } else {\n template += `<option value=\"${val[valueKey]}\" ${attr}>${Render.valuesLabelValue(labelKey, val)}</option>`;\n }\n });\n\n return template;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-text df-help-icon\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport * as utils from \"./utils\";\nimport { FIELD_POSITION_STYLE, ALIGN } from \"@/constants\";\nimport { FormOptions } from \"@t/FormOptions\";\n\n/**\n * field style 처리\n *\n * @param formOptions FormOptions\n * @param field FormField\n * @param beforeField FormField\n * @returns FieldStyle\n */\n\nexport function resolveFieldStyle(formOptions: FormOptions, field: FormField, beforeField?: FormField | null, isLabelHide?: boolean): FieldStyle {\n const fieldStyle = {\n rowStyleClass: orientationClassName(field.orientation),\n fieldClass: \"\",\n fieldStyle: \"\",\n labelClass: \"\",\n labelStyle: \"\",\n labelAlignClass: \"\",\n valueClass: \"\",\n valueStyle: \"\",\n tabAlignClass: \"\",\n };\n\n const defaultLabelWidth = beforeField?.style?.labelWidth ?? formOptions.style.labelWidth ?? \"3\";\n let defaultValueWidth = beforeField?.style?.valueWidth ?? formOptions.style.valueWidth ?? \"9\";\n const position = beforeField?.style?.position ?? formOptions.style.position;\n\n const width = field.style?.width;\n const positionArr = FIELD_POSITION_STYLE[field.style?.position] ?? FIELD_POSITION_STYLE[position] ?? FIELD_POSITION_STYLE.top;\n\n fieldStyle.fieldClass = `${positionArr[0] ? \"df-\" + positionArr[0] : \"\"} ${field.style?.customClass || \"\"}`;\n if (width) {\n if (utils.isNumber(width)) {\n fieldStyle.fieldClass += utils.isNumber(width) ? ` df-col-xs-${width}` : \"\";\n } else {\n fieldStyle.fieldStyle = utils.isNumber(width) ? \"\" : `width:${width};`;\n }\n }\n\n fieldStyle.tabAlignClass = \"df-tab-al-\" + ([\"right\", \"center\"].includes(field.style?.tabAlign) ? field.style.tabAlign : \"left\");\n\n const labelWidth = field.style?.labelWidth || defaultLabelWidth;\n fieldStyle.labelAlignClass = positionArr[1];\n\n if (!isLabelHide && labelWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (utils.isNumber(labelWidth)) {\n const labelWidthValue = +labelWidth;\n defaultValueWidth = 12 - labelWidthValue;\n fieldStyle.labelClass = `df-col-xs-${labelWidthValue}`;\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${defaultValueWidth}`;\n } else {\n fieldStyle.labelStyle = `width:${labelWidth};`;\n }\n }\n\n const valueWidth = field.style?.valueWidth || defaultValueWidth;\n if (isLabelHide && ![\"left\", \"right\"].includes(positionArr[0])) {\n fieldStyle.valueClass = \"df-col-full\";\n } else {\n if (valueWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (utils.isNumber(valueWidth)) {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${valueWidth}`;\n } else {\n fieldStyle.valueStyle = `width:${valueWidth};`;\n }\n } else {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : \"\";\n }\n }\n\n fieldStyle.fieldClass = spaceReplace(fieldStyle.fieldClass);\n fieldStyle.labelClass = spaceReplace(fieldStyle.labelClass);\n fieldStyle.valueClass = spaceReplace(fieldStyle.valueClass);\n\n return fieldStyle;\n}\n\nexport function orientationClassName(orientation: string): string {\n return orientation === \"horizontal\" ? \"df-horizontal\" : \"df-vertical\";\n}\n\nfunction spaceReplace(str: string): string {\n return str.replace(/\\s+/g, \" \").trim();\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport * as utils from \"@/util/utils\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class CheckboxRender extends Render {\n private defaultCheckValue: any[] = [];\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = [];\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n if (utils.isArray(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n } else {\n initDefaultValue = [field.defaultValue];\n }\n }\n\n const valueKey = CheckboxRender.valuesValueKey(field);\n\n if (utils.isUndefined(this.field.listItem)) {\n this.setValueItems([{ label: \"\", value: \"Y\" }]);\n }\n\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue.push(itemValue ? itemValue : true);\n }\n if (initDefaultValue.includes(itemValue)) {\n initDefaultValueFlag = true;\n }\n });\n\n this.defaultCheckValue = initDefaultValueFlag ? initDefaultValue : this.defaultCheckValue;\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"checkbox\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(` <div class=\"df-field\"><div class=\"df-field-group\">`);\n field.listItem?.list?.forEach((val) => {\n const checkVal = val[valueKey];\n templates.push(`\n <span class=\"df-field-item ${orientationClassName(field.listItem.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"checkbox\" name=\"${fieldName}\" value=\"${checkVal ? utils.replaceXss(checkVal) : \"\"}\" class=\"df-form-field df-checkbox\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"} />\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `);\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div> ${Render.getDescriptionTemplate(field)}<div class=\"df-help-message\"></div>`);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n if (checkboxes.length > 1) {\n const checkValue: any[] = [];\n checkboxes.forEach((ele) => {\n const checkEle = ele as HTMLInputElement;\n if (checkEle.checked) {\n checkValue.push(checkEle.value);\n }\n });\n return checkValue;\n } else {\n const checkElement = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement;\n\n if (checkElement?.checked) {\n return checkElement.value ? checkElement.value : true;\n }\n\n return checkElement.value ? \"\" : false;\n }\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n let valueArr: any[] = [];\n if (utils.isArray(value)) {\n valueArr = value;\n } else {\n valueArr.push(value);\n }\n\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n (ele as HTMLInputElement).checked = false;\n });\n\n valueArr.forEach((val) => {\n const ele = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"][value=\"${val}\"]`) as HTMLInputElement;\n if (ele) ele.checked = true;\n });\n }\n\n reset() {\n if (this.field.listItem?.list?.length == 1 && this.defaultCheckValue.length == 1) {\n this.setValue(true, false);\n } else {\n this.setValue(this.defaultCheckValue, false);\n }\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(`[name=\"${this.field.$xssName}\"]`);\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required && utils.isArray(value)) {\n if ((value as any[]).length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class RadioRender extends Render {\n private defaultCheckValue;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = \"\";\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = RadioRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue = itemValue;\n }\n\n if (initDefaultValue == itemValue) {\n initDefaultValueFlag = true;\n }\n });\n\n // 처리 할것.\n\n if (initDefaultValueFlag) {\n this.defaultCheckValue = initDefaultValue;\n } else if (!this.defaultCheckValue) {\n this.defaultCheckValue = this.field.listItem?.list?.length > 0 ? this.field.listItem?.list[0][valueKey] : \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"radio\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(`<div class=\"df-field\"><div class=\"df-field-group\">`);\n\n field.listItem?.list?.forEach((val) => {\n const radioVal = val[valueKey];\n\n templates.push(\n `<span class=\"df-field-item ${orientationClassName(field.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"radio\" name=\"${fieldName}\" value=\"${radioVal}\" class=\"df-form-field df-radio\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}/>\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `\n );\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n\n this.initEvent();\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n return (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]:checked`) as HTMLInputElement)?.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n const elements = this.rowElement.querySelectorAll(this.getSelector());\n\n elements.forEach((ele) => {\n let radioEle = ele as HTMLInputElement;\n if (radioEle.value == value) {\n radioEle.checked = true;\n } else {\n radioEle.checked = false;\n }\n });\n }\n\n reset() {\n this.setValue(this.defaultCheckValue, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(this.getSelector());\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (utils.isBlank(value)) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class PasswordRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"password\" name=\"${field.$xssName}\" class=\"df-form-field df-password df-help-icon\" autocomplete=\"off\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FileInfo, FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\n\r\n/**\r\n * file validator\r\n *\r\n * @param {HTMLInputElement} element\r\n * @param {FormField} field\r\n * @param {FileInfo[]} fileList\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const fileValidator = (element: HTMLInputElement, field: FormField, fileList: FileInfo[]): ValidResult | boolean => {\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && fileList.length < 1) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FileInfo, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { fileValidator } from \"@/rule/fileValidator\";\nimport Language from \"@/util/Language\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { isArray } from \"@daracl/core\";\n\nexport default class FileRender extends Render {\n private element: HTMLInputElement;\n private removeIds: any[] = [];\n private uploadFiles: any = {};\n private fileList: any[] = [];\n private fileSeq = 0;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.element = rowElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n this.fileList = field.listItem?.list || [];\n this.mounted();\n this.setDefaultOption();\n }\n\n mounted() {\n this.element.addEventListener(\"change\", (e: Event) => {\n const files = (e.target as HTMLInputElement)?.files;\n\n if (files) {\n let fileList = [];\n for (let item of files) {\n fileList.push(item);\n }\n this.addFiles(fileList);\n }\n customChangeEventCall(this.field, e, this, this.fileList);\n this.valid();\n });\n\n this.fileList.forEach((file) => {\n file.$seq = this.fileSeq += 1;\n });\n\n this.setFileList(this.fileList);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <span class=\"df-file-wrapper\">\n <label class=\"df-file-label\">\n <input type=\"file\" name=\"${field.$xssName}\" class=\"df-form-field df-file\" multiple />\n ${Language.getMessage(\"fileButton\")}\n </label>\n <i class=\"df-form-icon df-help-icon\"></i>\n </span>\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-file-list\"></div>\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n addFiles(files: any[]) {\n let addFlag = false;\n\n const newFiles: FileInfo[] = [];\n\n for (let item of files) {\n const fileCheckList = this.fileList.filter((fileItem) => fileItem.fileName == item.name && fileItem.fileSize == item.size && fileItem.lastModified == item.lastModified);\n\n if (fileCheckList.length > 0) continue;\n this.fileSeq += 1;\n this.uploadFiles[this.fileSeq] = item;\n\n let newFileInfo = {\n fileName: item.name,\n $seq: this.fileSeq,\n fileSize: item.size,\n lastModified: item.lastModified,\n } as FileInfo;\n\n newFiles.push(newFileInfo);\n addFlag = true;\n }\n if (addFlag) {\n this.setFileList(newFiles);\n this.fileList.push(...newFiles);\n }\n }\n\n private setFileList(fileList: FileInfo[], initFlag?: boolean | undefined) {\n const fileListElement = this.rowElement.querySelector(\".df-file-list\");\n\n if (fileListElement) {\n if (initFlag === true) {\n fileListElement.innerHTML = \"\";\n }\n\n const fileTemplateHtml: string[] = [];\n\n fileList.forEach((file) => {\n fileTemplateHtml.push(`\n <div class=\"df-file-item\" data-seq=\"${file.$seq}\">\n ${file.fileId ? '<span class=\"df-file-icon df-file-download\"></span>' : '<span class=\"df-file-icon\"></span>'} <span class=\"df-file-icon df-file-remove\"></span>\n <span class=\"df-file-name\">${file.fileName}</span > \n </div>`);\n });\n\n fileListElement.insertAdjacentHTML(\"beforeend\", fileTemplateHtml.join(\"\"));\n\n fileList.forEach((item) => {\n this.removeFileEvent(item, fileListElement);\n this.downloadFileEvent(item, fileListElement);\n });\n }\n }\n\n /**\n * 파일 다운로드 이벤트 처리.\n *\n * @param item\n * @param fileListElement\n */\n private downloadFileEvent(item: FileInfo, fileListElement: Element) {\n const ele = fileListElement.querySelector(`[data-seq=\"${item.$seq}\"] .df-file-download`);\n if (ele) {\n ele.addEventListener(\"click\", (evt: Event) => {\n const fileItemElement = (evt.target as Element).closest(\".df-file-item\");\n\n if (fileItemElement) {\n const attrSeq = fileItemElement.getAttribute(\"data-seq\");\n if (attrSeq) {\n const seq = parseInt(attrSeq, 10);\n const idx = this.fileList.findIndex((v) => v.$seq === seq);\n\n const item = this.fileList[idx];\n\n if (item[\"url\"]) {\n location.href = item[\"url\"];\n return;\n }\n\n if (this.field.fileDownload) {\n this.field.fileDownload.call(null, { file: item, field: this.field });\n return;\n }\n }\n }\n });\n }\n }\n\n /**\n * 파일 삭제 처리.\n *\n * @param item\n * @param fileListElement\n */\n private removeFileEvent(item: FileInfo, fileListElement: Element) {\n const ele = fileListElement.querySelector(`[data-seq=\"${item.$seq}\"] .df-file-remove`);\n if (ele) {\n ele.addEventListener(\"click\", (evt: Event) => {\n const fileItemElement = (evt.target as Element).closest(\".df-file-item\");\n\n if (fileItemElement) {\n const attrSeq = fileItemElement.getAttribute(\"data-seq\");\n if (attrSeq) {\n const seq = parseInt(attrSeq, 10);\n const removeIdx = this.fileList.findIndex((v) => v.$seq === seq);\n\n const removeItem = this.fileList[removeIdx];\n\n this.fileList.splice(removeIdx, 1);\n delete this.uploadFiles[seq];\n fileItemElement.remove();\n\n if (removeItem.fileId) {\n this.removeIds.push(removeItem.fileId);\n }\n }\n }\n this.valid();\n });\n }\n }\n\n getValue() {\n return {\n uploadFile: Object.values(this.uploadFiles),\n removeIds: this.removeIds,\n };\n }\n\n public setValueItems(value: any): void {\n this.fileList = [];\n this.uploadFiles = [];\n this.removeIds = [];\n for (let file of value) {\n file.$seq = this.fileSeq += 1;\n\n this.fileList.push(file);\n }\n\n this.setFileList(this.fileList, true);\n }\n\n setValue(value: any): void {\n if (isArray(value)) {\n this.setValueItems(value);\n }\n this.element.value = \"\";\n }\n\n reset() {\n this.setValue(\"\");\n this.setValueItems([]);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = fileValidator(this.element, this.field, this.fileList);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage, resetRowElementStyleClass } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\n\nexport default class CustomRender extends Render {\n private customFunction;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n if (field.renderer) {\n this.customFunction = field.renderer;\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n } else {\n this.customFunction = {} as any;\n }\n }\n\n mounted() {\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldTemplate = utils.isEmpty(field.template) ? \"\" : utils.isString(field.template) ? field.template : field.template();\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = ` <div class=\"df-field\">\n ${fieldTemplate}\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>`;\n }\n\n getValue() {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n return \"\";\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (this.customFunction.setValue) {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n (this.customFunction.setValue as any).call(this, value, this.field, this.rowElement);\n }\n\n this.field.$value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement() {\n if (this.customFunction.getElement) {\n return (this.customFunction.getElement as any).call(this, this.field, this.rowElement);\n }\n return null;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n\n /**\n * focus\n */\n focus(): void {\n if (this.customFunction.focus) {\n (this.customFunction.focus as any).call(this, this.field, this.rowElement);\n }\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class GroupRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n }\n\n public mounted() {}\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n return \"\";\n }\n\n getValue() {\n return null;\n }\n\n setValue(value: any): void {}\n\n reset() {}\n\n getElement(): HTMLElement {\n return this.rowElement;\n }\n\n valid(): any {\n return true;\n }\n\n public addChildField(element: Element) {\n let addContainer = this.rowElement.querySelector(\".df-field-container\");\n\n if (addContainer) {\n addContainer.append(element);\n } else {\n this.rowElement.append(element);\n }\n }\n\n focus(): void {}\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class HiddenRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.field.$value = field.defaultValue;\n }\n\n mounted() {}\n\n createField() {\n return ``;\n }\n\n getValue() {\n return this.field.$value;\n }\n\n setValue(value: any): void {\n this.field.$value = value;\n }\n\n reset() {\n this.setValue(this.field.defaultValue);\n }\n\n getElement() {\n return;\n }\n\n valid(): any {\n return true;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class ButtonRender extends Render {\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.mounted();\n this.setDefaultOption();\n }\n\n mounted() {\n this.rowElement.querySelector(`#${this.field.$key}`)?.addEventListener(\"click\", (evt) => {\n if (this.field.onClick) {\n this.field.onClick.call(null, this.field);\n }\n });\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <button type=\"button\" id=\"${field.$key}\" class=\"df-btn\">${field.label}</button> ${Render.getDescriptionTemplate(field)}\n `;\n }\n\n getValue() {\n return \"\";\n }\n\n setValue(value: any): void {}\n\n reset() {\n this.setDisabled(false);\n }\n\n getElement() {\n return null;\n }\n\n valid(): any {\n return true;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { numberValidator } from \"@/rule/numberValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall, numberInputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class RangeRender extends Render {\n private element: HTMLInputElement;\n private rangeNumElement: Element;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.rangeNumElement = rowElement.querySelector(\".df-range-num\") as Element;\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n this.element.addEventListener(\"input\", (e: any) => {\n this.rangeNumElement.innerHTML = e.target.value;\n\n this.element.setAttribute(\"title\", e.target.value);\n customChangeEventCall(this.field, e, this, this.getValue());\n this.valid();\n });\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <span class=\"df-range-num\">${field.defaultValue ? field.defaultValue : 0}</span>\n <input type=\"range\" name=\"${field.$xssName}\" class=\"df-form-field df-range df-help-icon\" min=\"${field.rule.minimum}\" max=\"${field.rule.maximum}\"/>\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = numberValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { leftPad, isNumeric, leftPadClamp, isFunction } from \"@daracl/core\";\nlet localeMessage = {\n year: \"Year\",\n month: \"Month\",\n day: \"Day\",\n am: \"AM\",\n pm: \"PM\",\n today: \"Today\",\n ok: \"Ok\",\n months: {\n full: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n abbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n },\n weeks: {\n full: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n abbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"]\n }\n};\nclass Language {\n constructor() {\n this.lang = localeMessage;\n }\n setDefaultMessage(lang) {\n localeMessage = Object.assign(localeMessage, lang);\n }\n /**\n * 다국어 메시지 등록\n *\n * @public\n * @param {?Message} [lang] 둥록할 메시지\n */\n set(lang) {\n this.lang = Object.assign({}, localeMessage, lang);\n }\n /**\n * 메시지 얻기\n *\n * @public\n * @param {string} messageKey 메시지 키\n * @returns {*}\n */\n getMessage(messageKey) {\n return this.lang[messageKey];\n }\n getMonthsMessage(idx, mode = \"abbr\") {\n return this.lang.months[mode][idx] || \"\";\n }\n getWeeksMessage(idx, mode = \"abbr\") {\n return this.lang.weeks[mode][idx] || \"\";\n }\n getMonthsIdx(val, mode = \"abbr\") {\n return mode == \"full\" ? this.lang.months.full.indexOf(val) : this.lang.months.abbr.indexOf(val);\n }\n getWeeksIdx(val, mode = \"abbr\") {\n return mode == \"full\" ? this.lang.weeks.full.indexOf(val) : this.lang.weeks.abbr.indexOf(val);\n }\n}\nconst Lanauage = new Language();\nconst EXPRESSIONS_FORMAT = [\"YY\", \"YYYY\", \"MMMM\", \"MMM\", \"MM\", \"M\", \"dddd\", \"ddd\", \"dd\", \"d\", \"DD\", \"D\", \"S\", \"HH\", \"H\", \"hh\", \"h\", \"mm\", \"m\", \"ss\", \"s\", \"SSS\", \"zzzz\", \"zzz\", \"zz\", \"z\", \"a\", \"A\"];\nlet MAX_CHAR_LENGTH = 0;\nlet DEFAULT_FORMAT = {\n year: \"YYYY\",\n month: \"YYYY-MM\",\n date: \"YYYY-MM-DD\",\n time: \"HH:mm\",\n datetime: \"YYYY-MM-DD HH:mm\"\n};\nconst DAY_STYLE_CLASS = [\"ddtp-sun\", \"ddtp-mon\", \"ddtp-tue\", \"ddtp-wed\", \"ddtp-thu\", \"ddtp-fri\", \"ddtp-sat\"];\nvar DateViewMode = /* @__PURE__ */ ((DateViewMode2) => {\n DateViewMode2[\"year\"] = \"year\";\n DateViewMode2[\"month\"] = \"month\";\n DateViewMode2[\"date\"] = \"date\";\n DateViewMode2[\"datetime\"] = \"datetime\";\n DateViewMode2[\"time\"] = \"time\";\n return DateViewMode2;\n})(DateViewMode || {});\nEXPRESSIONS_FORMAT.forEach((item) => {\n MAX_CHAR_LENGTH = Math.max(item.length, MAX_CHAR_LENGTH);\n});\nconst format = (date, format2) => {\n format2 = format2 || \"YYYY-MM-DD\";\n const len = format2.length;\n let result = [];\n for (let i = 0; i < len; ) {\n let minLen = Math.min(MAX_CHAR_LENGTH, len - i);\n let j = minLen;\n for (; j > 0; j--) {\n const v = format2.substring(i, i + j);\n if (EXPRESSIONS_FORMAT.includes(v)) {\n try {\n result.push(expressionsFunction$1[v](date));\n } catch (e) {\n console.log(EXPRESSIONS_FORMAT.includes(v), v, e);\n }\n break;\n }\n }\n if (j < 1) {\n result.push(format2.substring(i, i + 1));\n i += 1;\n } else {\n i += j;\n }\n }\n return result.join(\"\");\n};\nconst expressionsFunction$1 = {\n YY: (date) => {\n return String(date.getFullYear()).slice(-2);\n },\n YYYY: (date) => {\n return String(date.getFullYear());\n },\n M: (date) => {\n return String(date.getMonth() + 1);\n },\n MM: (date) => {\n return leftPad(date.getMonth() + 1, 2);\n },\n MMM: (date) => {\n return Lanauage.getMonthsMessage(date.getMonth());\n },\n MMMM: (date) => {\n return Lanauage.getMonthsMessage(date.getMonth(), \"full\");\n },\n D: (date) => {\n return String(date.getDate());\n },\n DD: (date) => {\n return leftPad(date.getDate(), 2);\n },\n d: (date) => {\n return String(date.getDate());\n },\n dd: (date) => {\n return leftPad(date.getDate(), 2);\n },\n ddd: (date) => {\n return Lanauage.getWeeksMessage(date.getDay());\n },\n dddd: (date) => {\n return Lanauage.getWeeksMessage(date.getDay(), \"full\");\n },\n H: (date) => {\n return String(date.getHours());\n },\n HH: (date) => {\n return leftPad(date.getHours(), 2);\n },\n h: (date) => {\n return getH(date);\n },\n hh: (date) => {\n return leftPad(getH(date), 2);\n },\n a: (date) => {\n return String(date.getFullYear()).slice(-2);\n },\n A: (date) => {\n return getMeridiem(date);\n },\n m: (date) => {\n return String(date.getMinutes());\n },\n mm: (date) => {\n return leftPad(date.getMinutes(), 2);\n },\n s: (date) => {\n return String(date.getSeconds());\n },\n ss: (date) => {\n return leftPad(date.getSeconds(), 2);\n },\n SSS: (date) => {\n return leftPad(date.getMilliseconds(), 3);\n }\n};\nfunction getH(date) {\n let hour = date.getHours();\n if (hour > 12) {\n hour -= 12;\n } else if (hour < 1) {\n hour = 12;\n }\n return hour;\n}\nfunction getMeridiem(date, isUpper, isShort) {\n const hour = date.getHours();\n let m = hour < 12 ? \"am\" : \"pm\";\n m = Lanauage.getMessage(m);\n m = m.toUpperCase();\n return m;\n}\nconst parser = (dateStr, format2) => {\n if (dateStr.length > 1e3) {\n return null;\n }\n format2 = format2 || DEFAULT_FORMAT.date;\n const dateInfo = {\n year: (/* @__PURE__ */ new Date()).getFullYear(),\n month: 0,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n isPm: false,\n isH: false,\n charIdx: 0\n };\n const len = format2.length;\n let startIdx = 0;\n for (let i = 0; i < len; ) {\n let minLen = Math.min(MAX_CHAR_LENGTH, len - i);\n let j = minLen;\n for (; j > 0; j--) {\n const v = format2.substring(i, i + j);\n if (EXPRESSIONS_FORMAT.includes(v)) {\n const expInfo = expressionsFunction[v];\n const val = matchFind(dateStr.substring(startIdx), expInfo[0]);\n expInfo[1](dateInfo, val);\n startIdx += val.length;\n break;\n }\n }\n if (j < 1) {\n i += 1;\n startIdx += 1;\n } else {\n i += j;\n }\n }\n if (dateInfo.hour != null && !dateInfo.isH) {\n if (dateInfo.isPm && +dateInfo.hour !== 12) {\n dateInfo.hour = +dateInfo.hour + 12;\n } else if (!dateInfo.isPm && +dateInfo.hour === 12) {\n dateInfo.hour = 0;\n }\n }\n let date;\n date = new Date(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute, dateInfo.second, dateInfo.millisecond);\n return date;\n};\nconst matchFind = (val, regexp) => {\n const match = regexp.exec(val);\n return match == null ? \"\" : match[0];\n};\nconst digitsCheck = {\n twoOptional: /\\d\\d?/,\n two: /\\d\\d/,\n three: /\\d{3}/,\n four: /\\d{4}/\n};\nconst word = /[^\\s]+/;\nconst expressionsFunction = {\n YY: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.year = +((\"\" + (/* @__PURE__ */ new Date()).getFullYear()).substring(0, 2) + val);\n return dateInfo;\n }\n ],\n YYYY: [\n digitsCheck[\"four\"],\n (dateInfo, val) => {\n dateInfo.year = +val;\n return dateInfo;\n }\n ],\n M: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.month = +val - 1;\n return dateInfo;\n }\n ],\n MM: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.month = +val - 1;\n return dateInfo;\n }\n ],\n MMM: [\n word,\n (dateInfo, val) => {\n dateInfo.month = Lanauage.getMonthsIdx(val, \"abbr\");\n return dateInfo;\n }\n ],\n MMMM: [\n word,\n (dateInfo, val) => {\n dateInfo.month = Lanauage.getMonthsIdx(val, \"full\");\n return dateInfo;\n }\n ],\n D: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n DD: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n d: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n dd: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.day = +val;\n return dateInfo;\n }\n ],\n ddd: [\n word,\n (dateInfo, val) => {\n return dateInfo;\n }\n ],\n dddd: [\n word,\n (dateInfo, val) => {\n return dateInfo;\n }\n ],\n H: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n dateInfo.isH = true;\n return dateInfo;\n }\n ],\n HH: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n dateInfo.isH = true;\n return dateInfo;\n }\n ],\n h: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n return dateInfo;\n }\n ],\n hh: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.hour = +val;\n return dateInfo;\n }\n ],\n a: [\n word,\n (dateInfo, val) => {\n if (Lanauage.getMessage(\"am\") != val.toLowerCase()) {\n dateInfo.isPm = true;\n }\n return dateInfo;\n }\n ],\n A: [\n word,\n (dateInfo, val) => {\n if (Lanauage.getMessage(\"am\") != val.toLowerCase()) {\n dateInfo.isPm = true;\n }\n return dateInfo;\n }\n ],\n m: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.minute = +val;\n return dateInfo;\n }\n ],\n mm: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.minute = +val;\n return dateInfo;\n }\n ],\n s: [\n digitsCheck[\"twoOptional\"],\n (dateInfo, val) => {\n dateInfo.second = +val;\n return dateInfo;\n }\n ],\n ss: [\n digitsCheck[\"two\"],\n (dateInfo, val) => {\n dateInfo.second = +val;\n return dateInfo;\n }\n ],\n SSS: [\n digitsCheck[\"three\"],\n (dateInfo, val) => {\n dateInfo.millisecond = +val;\n return dateInfo;\n }\n ]\n};\nfunction closestElement(el, checkElement) {\n let currentEl = el;\n while (currentEl) {\n if (currentEl == checkElement) {\n return true;\n }\n currentEl = currentEl.parentElement;\n }\n return false;\n}\nclass DaraDate {\n constructor(dt) {\n this.date = dt;\n }\n setYear(num) {\n this.date.setFullYear(num);\n return this;\n }\n addYear(num) {\n this.date.setFullYear(this.date.getFullYear() + num);\n return this;\n }\n addMonth(num) {\n this.date.setMonth(this.date.getMonth() + num);\n return this;\n }\n setMonth(num) {\n this.date.setMonth(num);\n return this;\n }\n setDate(num) {\n this.date.setDate(num);\n return this;\n }\n addDate(num) {\n this.date.setDate(this.date.getDate() + num);\n return this;\n }\n addWeek(num) {\n this.date.setDate(this.date.getDate() + num * 7);\n return this;\n }\n addHours(num) {\n this.date.setHours(this.date.getHours() + num);\n return this;\n }\n setHour(num) {\n this.date.setHours(num);\n return this;\n }\n addMinutes(num) {\n this.date.setMinutes(this.date.getMinutes() + num);\n return this;\n }\n setMinutes(num) {\n this.date.setMinutes(num);\n return this;\n }\n addSeconds(num) {\n this.date.setSeconds(this.date.getSeconds() + num);\n return this;\n }\n addMilliseconds(num) {\n this.date.setMilliseconds(this.date.getMilliseconds() + num);\n return this;\n }\n compare(date) {\n if (this.date.valueOf() < date.valueOf()) {\n return -1;\n } else if (this.date.valueOf() > date.valueOf()) {\n return 1;\n }\n return 0;\n }\n getYear() {\n return this.date.getFullYear();\n }\n getMonth() {\n return this.date.getMonth() + 1;\n }\n getDate() {\n return this.date.getDate();\n }\n getDay() {\n return this.date.getDay();\n }\n getTime() {\n return this.date.getTime();\n }\n format(format$1) {\n return format(this.date, format$1);\n }\n clone() {\n return new DaraDate(new Date(this.date.valueOf()));\n }\n}\nlet DEFAULT_OPTIONS = {\n inline: false,\n // layer or innerhtml\n weekStartDay: 0,\n initialDate: \"\",\n autoClose: true,\n isRTL: false,\n mode: DateViewMode.date,\n enableTodayBtn: false,\n showMonthAfterYear: false,\n isPositionFixed: false,\n format: \"\",\n zIndex: 1e3,\n minDate: \"\",\n maxDate: \"\",\n beforeDrawDate: (dt) => {\n return {\n check: false,\n style: \"\",\n tooltip: \"\"\n };\n }\n};\nfunction hiddenElement() {\n var _a;\n if (document.getElementById(\"hiddenDaraDatetimeElement\") == null) {\n (_a = document.querySelector(\"body\")) == null ? void 0 : _a.insertAdjacentHTML(\"beforeend\", `<div id=\"hiddenDaraDatetimeElement\" class=\"daracl-datetime-hidden\"></div>`);\n }\n return document.getElementById(\"hiddenDaraDatetimeElement\");\n}\nlet daraDatetimeIdx = 0;\nconst _DateTimePicker = class _DateTimePicker {\n constructor(selector, options, message) {\n var _a;\n this.isInput = false;\n this.isVisible = false;\n this.minYear = -1;\n this.maxYear = -1;\n this.minMonth = -1;\n this.maxMonth = -1;\n this.dayOrder = [0, 1, 2, 3, 4, 5, 6];\n this._documentClickEvent = (e) => {\n if (this.isVisible && e.target != this.targetElement && !closestElement(e.target, this.datetimeElement)) {\n this.hide();\n }\n };\n this.options = Object.assign({}, DEFAULT_OPTIONS, options);\n daraDatetimeIdx += 1;\n let selectorElement;\n if (typeof selector === \"string\") {\n selectorElement = document.querySelector(selector);\n } else {\n selectorElement = selector;\n }\n if (!selectorElement) {\n throw new Error(`${selector} datetimepicker element not found`);\n }\n this._viewMode = Object.keys(DateViewMode).includes(this.options.mode) ? this.options.mode : DateViewMode.date;\n this.initMode = this._viewMode;\n Lanauage.set(message);\n if (this.initMode == DateViewMode.year) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.year;\n } else if (this.initMode == DateViewMode.month) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.month;\n } else if (this.initMode == DateViewMode.time) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.time;\n } else if (this.initMode == DateViewMode.datetime) {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.datetime;\n } else {\n this.dateFormat = this.options.format || DEFAULT_FORMAT.date;\n }\n let viewDate;\n if (this.options.initialDate) {\n if (typeof this.options.initialDate === \"string\") {\n viewDate = new DaraDate(parser(this.options.initialDate, this.dateFormat) || /* @__PURE__ */ new Date());\n } else {\n viewDate = new DaraDate(this.options.initialDate);\n }\n } else {\n viewDate = new DaraDate(/* @__PURE__ */ new Date());\n this.options.initialDate = viewDate.format(this.dateFormat);\n }\n this.setWeekDays();\n this.todayDate = viewDate.format(DEFAULT_FORMAT.date);\n this.currentDate = viewDate;\n this.targetElement = selectorElement;\n this.minDate = this._minDate();\n this.maxDate = this._maxDate();\n if (this.options.inline) {\n this.datetimeElement = selectorElement;\n this.datetimeElement.className = `daracl-datetime-wrapper ddtp-${daraDatetimeIdx} embed`;\n } else {\n this.isInput = true;\n this.targetElement.setAttribute(\"value\", viewDate.format(this.dateFormat));\n const datetimeElement = document.createElement(\"div\");\n datetimeElement.className = `daracl-datetime-wrapper ddtp-${daraDatetimeIdx} layer`;\n datetimeElement.setAttribute(\"style\", `z-index:${this.options.zIndex};`);\n (_a = hiddenElement()) == null ? void 0 : _a.appendChild(datetimeElement);\n this.datetimeElement = datetimeElement;\n this.initTargetEvent();\n }\n this.createDatetimeTemplate();\n if (this.isTimeMode()) {\n this.hourInputEle = this.datetimeElement.querySelector(\".ddtp-hour\");\n this.minuteInputEle = this.datetimeElement.querySelector(\".ddtp-minute\");\n } else {\n this.hourInputEle = {};\n this.minuteInputEle = {};\n }\n this.changeViewMode(this._viewMode);\n this.initHeaderEvent();\n this.initDateEvent();\n this.initTimeEvent();\n }\n setWeekDays() {\n let weekStartDay = this.options.weekStartDay;\n if (weekStartDay == 0) return;\n if (weekStartDay < 0 || weekStartDay > 6) {\n weekStartDay = 0;\n }\n for (let i = 0; i < 7; i++) {\n let day = weekStartDay + i;\n this.dayOrder[i] = day < 7 ? day : day - 7;\n }\n }\n static create(selector, options, message) {\n return new _DateTimePicker(selector, options, message);\n }\n /**\n * default date format setting\n * @example\n ```\n setDefaultFormat({\n year: \"YYYY\",\n month: \"YYYY-MM\",\n date: \"YYYY-MM-DD\",\n time: \"HH:mm\",\n datetime: \"YYYY-MM-DD HH:mm\",\n });\n ```\n * @public\n * @static\n * @param {*} dateFormat\n */\n static setDefaultFormat(dateFormat) {\n Object.assign(DEFAULT_FORMAT, dateFormat);\n }\n _minDate() {\n let minDate = this.options.minDate;\n if (minDate != \"\") {\n if (typeof minDate === \"string\") {\n const dt = parser(minDate, this.dateFormat);\n if (!dt) {\n return -1;\n }\n minDate = dt;\n }\n this.minYear = minDate.getFullYear();\n this.minMonth = +(this.minYear + leftPad(minDate.getMonth(), 2));\n return new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0).getTime();\n }\n return -1;\n }\n _maxDate() {\n let maxDate = this.options.maxDate;\n if (maxDate != \"\") {\n if (typeof maxDate === \"string\") {\n const dt = parser(maxDate, this.dateFormat);\n if (!dt) {\n return -1;\n }\n maxDate = dt;\n }\n this.maxYear = maxDate.getFullYear();\n this.maxMonth = +(this.maxYear + leftPad(maxDate.getMonth(), 2));\n return new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59).getTime();\n }\n return -1;\n }\n set viewMode(mode) {\n if (this._viewMode === mode) {\n return;\n }\n this._viewMode = mode;\n this.changeViewMode(mode);\n }\n get viewMode() {\n return this._viewMode;\n }\n /**\n * 모드 change\n * @param mode\n */\n changeViewMode(mode) {\n var _a;\n (_a = this.datetimeElement.querySelector(\".ddtp-datetime\")) == null ? void 0 : _a.setAttribute(\"view-mode\", mode);\n if (mode === \"year\") {\n this.yearDraw();\n } else if (mode === \"month\") {\n this.monthDraw();\n } else {\n this.dayDraw();\n }\n }\n /**\n * init header event\n *\n * @public\n */\n initHeaderEvent() {\n var _a, _b, _c, _d;\n const isRTL = this.options.isRTL;\n (_a = this.datetimeElement.querySelector(\".ddtp-move-btn.prev\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n this.moveDate(isRTL ? \"next\" : \"prev\", e);\n });\n (_b = this.datetimeElement.querySelector(\".ddtp-move-btn.next\")) == null ? void 0 : _b.addEventListener(\"click\", (e) => {\n this.moveDate(isRTL ? \"prev\" : \"next\", e);\n });\n (_c = this.datetimeElement.querySelector(\".ddtp-header-year\")) == null ? void 0 : _c.addEventListener(\"click\", (e) => {\n this.viewMode = DateViewMode.year;\n });\n (_d = this.datetimeElement.querySelector(\".ddtp-header-month\")) == null ? void 0 : _d.addEventListener(\"click\", (e) => {\n this.viewMode = DateViewMode.month;\n });\n }\n /**\n * 날짜 달력 이벤트처리.\n */\n initDateEvent() {\n var _a, _b;\n (_a = this.datetimeElement.querySelector(\".ddtp-day-body\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n var _a2;\n const targetEle = e.target;\n if (targetEle.classList.contains(\"ddtp-day\") || targetEle.closest(\".ddtp-day\")) {\n const selectDate = targetEle.getAttribute(\"data-day\") || \"1\";\n const mmDD = selectDate.split(\",\");\n this.currentDate.setMonth(+mmDD[0] - 1);\n this.currentDate.setDate(+mmDD[1]);\n if (this.isDayDisabled(this.currentDate)) {\n return;\n }\n (_a2 = this.datetimeElement.querySelector(\".select\")) == null ? void 0 : _a2.classList.remove(\"select\");\n targetEle.classList.add(\"select\");\n if (this.isTimeMode()) {\n this.currentDate.setHour(+this.hourInputEle.value);\n this.currentDate.setMinutes(+this.minuteInputEle.value);\n }\n this.dateChangeEvent(e);\n }\n });\n (_b = this.datetimeElement.querySelector(\".ddtp-today\")) == null ? void 0 : _b.addEventListener(\"click\", (e) => {\n const initDate = new DaraDate(parser(this.todayDate, DEFAULT_FORMAT.date) || /* @__PURE__ */ new Date());\n this.currentDate.setYear(initDate.getYear());\n this.currentDate.setMonth(initDate.getMonth() - 1);\n this.currentDate.setDate(initDate.getDate());\n this.changeViewMode(this.initMode);\n });\n }\n isTimeMode() {\n return this._viewMode === DateViewMode.time || this._viewMode === DateViewMode.datetime;\n }\n getTimeNumberValue(val) {\n if (!isNumeric(val)) {\n return 0;\n }\n return parseInt(val, 10);\n }\n /**\n * 시간 분 설정 이벤트 처리.\n *\n * @public\n */\n initTimeEvent() {\n var _a;\n if (!this.isTimeMode()) return;\n let hh = this.currentDate.format(\"HH\");\n const datetimeElement = this.datetimeElement;\n const hourInputEle = datetimeElement.querySelector(\".ddtp-hour\");\n const hourRangeEle = datetimeElement.querySelector(\".ddtp-hour-range\");\n hourInputEle.value = hh;\n hourRangeEle.value = hh;\n hourInputEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n let val = this.getTimeNumberValue(targetElement.value);\n let addVal = leftPadClamp(val, 2, \"0\");\n if (parseInt(addVal, 10) > 23) {\n addVal = \"23\";\n }\n hourInputEle.value = addVal;\n hourRangeEle.value = addVal;\n });\n hourRangeEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n hourInputEle.value = leftPadClamp(targetElement.value, 2, \"0\");\n });\n let mm = this.currentDate.format(\"mm\");\n const minuteInputEle = datetimeElement.querySelector(\".ddtp-minute\");\n const minuteRangeEle = datetimeElement.querySelector(\".ddtp-minute-range\");\n minuteInputEle.value = mm;\n minuteRangeEle.value = mm;\n minuteInputEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n let val = this.getTimeNumberValue(targetElement.value);\n let addVal = leftPadClamp(val, 2, \"0\");\n if (parseInt(addVal, 10) > 59) {\n addVal = \"59\";\n }\n minuteInputEle.value = addVal;\n minuteRangeEle.value = addVal;\n });\n minuteRangeEle.addEventListener(\"input\", (e) => {\n const targetElement = e.target;\n minuteInputEle.value = leftPadClamp(targetElement.value, 2, \"0\");\n });\n (_a = datetimeElement.querySelector(\".time-select\")) == null ? void 0 : _a.addEventListener(\"click\", (e) => {\n this.currentDate.setHour(+hourInputEle.value);\n this.currentDate.setMinutes(+minuteInputEle.value);\n this.dateChangeEvent(e);\n });\n }\n /**\n * 날짜 이동\n * @param moveMode // 앞뒤 이동 prev, next\n * @returns\n */\n moveDate(moveMode, e) {\n if (this._viewMode === DateViewMode.date || this._viewMode === DateViewMode.datetime) {\n this.currentDate.setDate(1);\n this.currentDate.addMonth(\"prev\" === moveMode ? -1 : 1);\n this.dayDraw();\n return;\n }\n if (this._viewMode === DateViewMode.month) {\n this.currentDate.setDate(1);\n this.currentDate.addYear(\"prev\" === moveMode ? -1 : 1);\n this.monthDraw();\n return;\n }\n if (this._viewMode === DateViewMode.year) {\n this.currentDate.setDate(1);\n this.currentDate.addYear(\"prev\" === moveMode ? -16 : 16);\n this.yearDraw();\n }\n }\n /**\n * get date value\n *\n * @returns\n */\n getDateValue() {\n return this.currentDate.format(this.dateFormat);\n }\n /**\n * 옵션 셋팅\n * @static\n * @param {DateTimePickerOptions} options\n */\n static setOptions(options) {\n DEFAULT_OPTIONS = Object.assign({}, DEFAULT_OPTIONS, options);\n }\n /**\n * 달력 보이기 처리.\n *\n * @returns\n */\n show() {\n if (this.isVisible) {\n return;\n }\n this.isVisible = true;\n const docSize = getDocSize();\n this.datetimeElement.classList.remove(\"hide\");\n this.datetimeElement.classList.add(\"show\");\n const rect = this.targetElement.getBoundingClientRect();\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const elementHeight = this.datetimeElement.offsetHeight;\n const targetElementHeight = this.targetElement.offsetHeight + 2;\n let left = rect.left + scrollLeft;\n let top = 0;\n if (this.options.isPositionFixed) {\n top = rect.top + targetElementHeight;\n left = rect.left;\n } else {\n if (rect.top + targetElementHeight + elementHeight > docSize.clientHeight && rect.top >= elementHeight) {\n top = scrollTop + rect.top - elementHeight - 2;\n } else {\n top = scrollTop + rect.top + targetElementHeight;\n }\n }\n this.datetimeElement.setAttribute(\"style\", `${this.options.isPositionFixed ? \"position:fixed;\" : \"\"}top:${top}px;left:${left}px;z-index:${this.options.zIndex}`);\n document.addEventListener(\"click\", this._documentClickEvent);\n }\n /**\n * 달력 숨기기\n */\n hide() {\n this.isVisible = false;\n if (this.options.onClose) {\n if (this.options.onClose() === false) {\n return;\n }\n }\n this.datetimeElement.classList.remove(\"show\");\n this.datetimeElement.classList.add(\"hide\");\n document.removeEventListener(\"click\", this._documentClickEvent);\n }\n /**\n * 타켓 이벤트 처리.\n */\n initTargetEvent() {\n if (this.targetElement) {\n this.targetElement.addEventListener(\"click\", (e) => {\n this.show();\n });\n }\n }\n /**\n * 날짜 변경후 이벤트\n */\n afterChangeDatepicker() {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.afterChangeDatepicker && isFunction(this.options.afterChangeDatepicker)) {\n this.options.afterChangeDatepicker(formatValue, this.viewMode);\n }\n }\n /**\n * 날짜 변경 전 이벤트.\n * @returns void\n */\n beforeChangeDatepicker() {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.beforeChangeDatepicker && isFunction(this.options.beforeChangeDatepicker)) {\n const reval = this.options.beforeChangeDatepicker(formatValue, (result) => {\n if (result === false) {\n return;\n }\n this.refresh(false);\n });\n if (reval === false) {\n return;\n }\n this.refresh(false);\n return;\n }\n this.refresh(false);\n }\n dateChangeEvent(e) {\n const formatValue = this.currentDate.format(this.dateFormat);\n if (this.options.onSelect) {\n if (this.options.onSelect(formatValue, this.viewMode, e) === false) {\n return;\n }\n }\n if (this.isInput) {\n this.targetElement.setAttribute(\"value\", formatValue);\n }\n if (!this.options.inline && this.options.autoClose) {\n this.hide();\n }\n }\n /**\n * datepicker template 그리기\n */\n createDatetimeTemplate() {\n const showMonthAfterYear = this.options.showMonthAfterYear;\n let datetimeTemplate = `<div class=\"ddtp-datetime ${this.options.isRTL ? \"rtl\" : \"\"}\" view-mode=\"${this._viewMode}\">\n\t\t\t<div class=\"ddtp-header\">\n <span class=\"${showMonthAfterYear ? \"ddtp-header-year\" : \"ddtp-header-month\"}\"></span>\n <span class=\"${showMonthAfterYear ? \"ddtp-header-month\" : \"ddtp-header-year\"}\"></span>\n\n <span class=\"ddtp-date-move\"> \n <a href=\"javascript:;\" class=\"ddtp-move-btn prev\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/></svg>\n </a>\n <a href=\"javascript:;\" class=\"ddtp-move-btn next\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#000000\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/></svg>\n </a> \n </span>\n\t\t\t</div>\n <div class=\"ddtp-body\">\n <table class=\"ddtp-days\">\n <thead class=\"ddtp-day-header\">\n <tr>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[0]]}\">${Lanauage.getWeeksMessage(this.dayOrder[0])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[1]]}\">${Lanauage.getWeeksMessage(this.dayOrder[1])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[2]]}\">${Lanauage.getWeeksMessage(this.dayOrder[2])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[3]]}\">${Lanauage.getWeeksMessage(this.dayOrder[3])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[4]]}\">${Lanauage.getWeeksMessage(this.dayOrder[4])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[5]]}\">${Lanauage.getWeeksMessage(this.dayOrder[5])}</td>\t\t\n <td class=\"ddtp-day-label ${DAY_STYLE_CLASS[this.dayOrder[6]]}\">${Lanauage.getWeeksMessage(this.dayOrder[6])}</td>\t\t\n </tr>\n </thead>\n <tbody class=\"ddtp-day-body\">\n </tbody>\n \n <tfoot class=\"ddtp-day-footer\">\n <td colspan=\"7\">\n <div style=\"width:99%;text-align:center;margin-top: 5px;${this.options.enableTodayBtn ? \"\" : \"display:none;\"}\"><button type=\"button\" class=\"ddtp-today\">${Lanauage.getMessage(\"today\")}</button></div>\n <div class=\"footer-tooltip\"></div>\n </td>\n </tfoot>\n </table>\n\n <div class=\"ddtp-times\">\n <div class=\"time-container\">\n <div class=\"ddtp-time\">\n <span>H: </span><input type=\"number\" class=\"ddtp-hour\" min=\"0\" max=\"23\" maxlength=\"2\">\n <input type=\"range\" min=\"0\" max=\"23\" class=\"ddtp-hour-range\">\n </div>\n <div class=\"ddtp-time\">\n <span>M: </span><input type=\"number\" class=\"ddtp-minute\" min=\"0\" max=\"59\" size=\"2\" maxlength=\"2\">\n <input type=\"range\" min=\"0\" max=\"59\" class=\"ddtp-minute-range\">\n </div>\n </div>\n <div class=\"ddtp-btn\">\n <button type=\"button\" class=\"time-select\">${Lanauage.getMessage(\"ok\")}</button>\n </div>\n </div>\n\n <div class=\"ddtp-months\">\n </div>\n\n <div class=\"ddtp-years\">\n </div>\n </div>\n </div>`;\n this.datetimeElement.innerHTML = datetimeTemplate;\n }\n refresh(beforeChangeDatepickerCheck) {\n if (this._viewMode === DateViewMode.date || this._viewMode === DateViewMode.datetime) {\n this.dayDraw(beforeChangeDatepickerCheck);\n return;\n }\n if (this._viewMode === DateViewMode.month) {\n this.monthDraw(beforeChangeDatepickerCheck);\n return;\n }\n if (this._viewMode === DateViewMode.year) {\n this.yearDraw(beforeChangeDatepickerCheck);\n }\n }\n /**\n * 년 달력 그리기\n */\n yearDraw(beforeChangeDatepickerCheck) {\n var _a;\n const currentYear = this.currentDate.format(\"YYYY\");\n if (beforeChangeDatepickerCheck !== false && this.initMode == DateViewMode.year) {\n this.beforeChangeDatepicker();\n return;\n }\n const startYear = +currentYear - 8;\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = `${startYear} ~ ${startYear + 15}`;\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 16; i++) {\n const year = startYear + i;\n const disabled = this.isYearDisabled(year);\n let addStylceClass = disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, date: year });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<div class=\"ddtp-year ${addStylceClass}\" data-year=\"${year}\" ${tooltip}>${year}</div>`);\n }\n this.datetimeElement.querySelector(\".ddtp-years\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.year) {\n this.afterChangeDatepicker();\n }\n (_a = this.datetimeElement.querySelectorAll(\".ddtp-year\")) == null ? void 0 : _a.forEach((yearEle) => {\n yearEle.addEventListener(\"click\", (e) => {\n const targetEle = e.target;\n if (targetEle) {\n const year = targetEle.getAttribute(\"data-year\");\n if (year) {\n const numYear = +year;\n if (this.isYearDisabled(numYear)) {\n return;\n }\n if (this.initMode == DateViewMode.year) {\n if (this.isYearDisabled(numYear)) {\n return;\n }\n this.currentDate.setYear(numYear);\n this.dateChangeEvent(e);\n return;\n }\n this.currentDate.setYear(numYear);\n this.viewMode = this.initMode;\n }\n }\n });\n });\n }\n /**\n * 월 달력 그리기\n */\n monthDraw(beforeChangeDatepickerCheck) {\n var _a;\n if (beforeChangeDatepickerCheck !== false && this.initMode == DateViewMode.month) {\n this.beforeChangeDatepicker();\n return;\n }\n const year = this.currentDate.format(\"YYYY\");\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = `${year}`;\n const monthElements = this.datetimeElement.querySelectorAll(\".ddtp-months > .ddtp-month\");\n if (monthElements.length > 0) {\n if (this.isYearDisabled(+year)) {\n monthElements.forEach((monthEle) => {\n if (!monthEle.classList.contains(\"disabled\")) {\n monthEle.classList.add(\"disabled\");\n }\n });\n return;\n }\n monthElements.forEach((monthEle, idx) => {\n if (this.isMonthDisabled(+year, idx)) {\n if (!monthEle.classList.contains(\"disabled\")) {\n monthEle.classList.add(\"disabled\");\n }\n } else {\n monthEle.classList.remove(\"disabled\");\n }\n });\n if (this.initMode == DateViewMode.month) {\n this.afterChangeDatepicker();\n }\n return;\n }\n this.datetimeElement.querySelector(\".ddtp-header-month\").textContent = this.currentDate.format(\"MMMM\");\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 12; i++) {\n const disabled = this.isMonthDisabled(+year, i);\n let addStylceClass = disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, date: year + \"/\" + (i + 1) });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<div class=\"ddtp-month ${addStylceClass}\" data-month=\"${i}\" ${tooltip}>${Lanauage.getMonthsMessage(i, \"abbr\")}</div>`);\n }\n this.datetimeElement.querySelector(\".ddtp-months\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.month) {\n this.afterChangeDatepicker();\n }\n (_a = this.datetimeElement.querySelectorAll(\".ddtp-month\")) == null ? void 0 : _a.forEach((monthEle) => {\n monthEle.addEventListener(\"click\", (e) => {\n const targetEle = e.target;\n if (targetEle) {\n const month = targetEle.getAttribute(\"data-month\");\n if (month) {\n if (this.isMonthDisabled(this.currentDate.getYear(), +month)) {\n return false;\n }\n if (this.initMode == DateViewMode.month) {\n this.currentDate.setMonth(+month);\n this.dateChangeEvent(e);\n return;\n }\n this.currentDate.setMonth(+month);\n this.viewMode = this.initMode;\n this.dayDraw();\n }\n }\n });\n });\n }\n /**\n * 날짜 그리기\n */\n dayDraw(beforeChangeDatepickerCheck) {\n if (beforeChangeDatepickerCheck !== false && (this.initMode == DateViewMode.date || this.initMode == DateViewMode.datetime)) {\n this.beforeChangeDatepicker();\n return;\n }\n let monthFirstDate = this.currentDate.clone();\n const currentMonth = monthFirstDate.getMonth();\n monthFirstDate.setDate(1);\n this.datetimeElement.querySelector(\".ddtp-header-year\").textContent = monthFirstDate.format(\"YYYY\");\n this.datetimeElement.querySelector(\".ddtp-header-month\").textContent = monthFirstDate.format(\"MMMM\");\n let day = monthFirstDate.getDay();\n day = day - this.dayOrder[0];\n if (day >= 0) {\n monthFirstDate.addDate(-day);\n } else {\n monthFirstDate.addDate(-(7 + day));\n }\n const beforeDrawDateFlag = isFunction(this.options.beforeDrawDate);\n const beforeDrawDateFn = beforeDrawDateFlag ? this.options.beforeDrawDate : false;\n const calHTML = [];\n for (let i = 0; i < 42; i++) {\n let dateItem;\n if (i == 0) {\n dateItem = monthFirstDate;\n } else {\n dateItem = monthFirstDate.clone().addDate(i);\n }\n const dateItemFormat = dateItem.format(DEFAULT_FORMAT.date);\n if (i % 7 == 0) {\n calHTML.push((i == 0 ? \"\" : \"</tr>\") + \"<tr>\");\n }\n let disabled = this.isDayDisabled(dateItem);\n let addStylceClass = DAY_STYLE_CLASS[this.dayOrder[i % 7]];\n const dateItemMonth = dateItem.getMonth();\n if (dateItemMonth != currentMonth) {\n if (dateItemMonth < currentMonth) {\n addStylceClass += dateItemMonth == 1 ? \" new\" : \" old\";\n } else {\n addStylceClass += currentMonth == 1 && dateItemMonth == 12 ? \" old\" : \" new\";\n }\n }\n addStylceClass += this.todayDate == dateItemFormat ? \" ddtp-today\" : \"\";\n addStylceClass += disabled ? \" disabled\" : \"\";\n let tooltip = \"\";\n if (beforeDrawDateFlag && beforeDrawDateFn) {\n const reval = beforeDrawDateFn({ mode: this._viewMode, item: dateItem, date: dateItem.format(this.dateFormat) });\n addStylceClass += reval.style ? \" \" + reval.style : \"\";\n addStylceClass += reval.check ? \" ddtp-event\" : \"\";\n tooltip = reval.tooltip;\n tooltip = tooltip ? `title=\"${tooltip}\"` : \"\";\n }\n calHTML.push(`<td class=\"ddtp-day ${addStylceClass}\" data-day=\"${dateItem.format(\"M,D\")}\" ${tooltip}>`);\n calHTML.push(`<span>${dateItem.format(\"d\")}</span>`);\n calHTML.push(\"</td>\");\n }\n calHTML.push(\"</tr>\");\n this.datetimeElement.querySelector(\".ddtp-day-body\").innerHTML = calHTML.join(\"\");\n if (this.initMode == DateViewMode.date || this.initMode == DateViewMode.datetime) {\n this.afterChangeDatepicker();\n }\n }\n isDayDisabled(dateItem) {\n if (this.minDate != -1 && this.minDate > dateItem.getTime() || this.maxDate != -1 && this.maxDate < dateItem.getTime()) {\n return true;\n }\n return false;\n }\n isYearDisabled(year) {\n if (this.minYear != -1 && this.minYear > year || this.maxYear != -1 && this.maxYear < year) {\n return true;\n }\n return false;\n }\n isMonthDisabled(year, month) {\n if (this.isYearDisabled(year)) {\n return true;\n }\n let yearMonth = +(year + leftPad(month, 2));\n if (this.minMonth != -1 && this.minMonth > yearMonth || this.maxMonth != -1 && this.maxMonth < yearMonth) {\n return true;\n }\n return false;\n }\n static setMessage(message) {\n Lanauage.setDefaultMessage(message);\n }\n};\n_DateTimePicker.VERSION = `${\"0.0.13\"}`;\n_DateTimePicker.format = format;\n_DateTimePicker.parser = parser;\nlet DateTimePicker = _DateTimePicker;\nfunction getDocSize() {\n return {\n clientHeight: Math.max(document.documentElement.clientHeight, window.innerHeight || 0),\n clientWidth: Math.max(document.documentElement.clientWidth, window.innerWidth || 0)\n };\n}\nexport {\n DateTimePicker\n};\n//# sourceMappingURL=index.js.map\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\n\nimport { DateTimePicker } from \"@daracl/datetimepicker\";\n\nimport * as utils from \"@/util/utils\";\n\nexport default class DateRender extends Render {\n private element: HTMLInputElement;\n private dateObj: any;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n let dateOnSelectEvent: any;\n this.field.rendererOptions = Object.assign({}, this.field.rendererOptions);\n if (typeof this.field.rendererOptions.onSelect !== \"undefined\") {\n dateOnSelectEvent = typeof this.field.rendererOptions.onSelect;\n }\n\n if (utils.isUndefined(this.field.rendererOptions.mode)) {\n if (this.field.renderType == \"datemonth\" || this.field.renderType == \"datehour\") {\n this.field.rendererOptions.mode = this.field.renderType.replace(\"date\", \"\");\n } else {\n this.field.rendererOptions.mode = this.field.renderType;\n }\n }\n\n this.field.rendererOptions.onSelect = (dt: any, e: Event) => {\n if (dateOnSelectEvent) {\n dateOnSelectEvent(dt, e);\n }\n\n this.setValue(dt);\n\n this.valid();\n };\n\n this.dateObj = new DateTimePicker(this.element, this.field.rendererOptions, {} as any);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-text df-help-icon\" autocomplete=\"off\" readonly/>\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage } from \"@/util/validUtils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { DaraForm } from \"@/DaraForm\";\nimport FormTemplate from \"@/FormTemplate\";\nimport { resolveFieldStyle } from \"@/util/styleUtils\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport * as utils from \"@/util/utils\";\n\nexport default class TabRender extends Render {\n private customFunction;\n private tabContainerElement: HTMLElement;\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n if (field.renderer) {\n this.customFunction = field.renderer;\n } else {\n this.customFunction = {} as any;\n }\n\n this.mounted();\n }\n\n mounted() {\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n\n this.tabContainerElement.querySelectorAll(\".df-tab-item\").forEach((tabItem) => {\n tabItem.addEventListener(\"click\", (e: any) => {\n this.clickEventHandler(tabItem, e);\n });\n });\n }\n\n /**\n * tab item click\n *\n * @param {Element} tabItem\n * @param {*} evt\n */\n private clickEventHandler(tabItem: Element, evt: any) {\n this.setActive(tabItem.getAttribute(\"data-tab-id\") ?? \"\");\n }\n\n public setActive(tabId: string): void {\n const tabItem = this.tabContainerElement.querySelector(`[data-tab-id=\"${tabId}\"]`);\n\n if (!tabItem) return;\n\n if (!tabItem.classList.contains(\"active\")) {\n for (let item of tabItem?.parentElement?.children ?? []) {\n item.classList.remove(\"active\");\n }\n tabItem.classList.add(\"active\");\n }\n\n const tabPanel = this.rowElement.querySelector(`[tab-panel-id=\"${tabId}\"]`);\n\n if (!tabPanel?.classList.contains(\"active\")) {\n for (let item of tabPanel?.parentElement?.children ?? []) {\n item.classList.remove(\"active\");\n }\n\n tabPanel?.classList.add(\"active\");\n }\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n static isChildrenCreate(): boolean {\n return false;\n }\n\n /**\n * tab template\n *\n * @param {FormField} field\n * @param {FormTemplate} formTemplate\n * @param {FormOptions} options\n * @returns {string} template string\n */\n\n createField() {\n const field = this.field;\n\n const formTemplate = this.daraForm.formTemplate;\n const options = this.daraForm.getOptions();\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n //tab 이벤트 처리 할것.\n let fieldStyle = resolveFieldStyle(options, field);\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field \">\n <div class=\"df-tab-header ${fieldStyle.tabAlignClass}\"></div>\n </div>\n <div class=\"df-tab-body\"></div>\n `;\n\n if (field.children) {\n let firstFlag = true;\n\n const formOptions = this.getForm().getOptions();\n\n let fieldStyle: FieldStyle = resolveFieldStyle(formOptions, field, null, formTemplate.isLabelHide(field));\n\n for (const childField of field.children) {\n childField.$parent = field;\n formTemplate.addRowFieldInfo(childField);\n let id = childField.$key;\n\n let tabTemplate = `<span class=\"df-tab-item ${firstFlag ? \"active\" : \"\"}\" data-tab-id=\"${id}\"><a href=\"javascript:;\">${childField.label}</a></span>`;\n\n let tabBodyTemplate = `<div class=\"df-tab-panel ${firstFlag ? \"active\" : \"\"}\" tab-panel-id=\"${id}\">${Render.getDescriptionTemplate(childField)}\n <div class=\"df-tab-group\"></div>\n </div>`;\n\n const tabElement = utils.templateToElement(tabTemplate);\n const tabBodyElement = utils.templateToElement(tabBodyTemplate);\n\n firstFlag = false;\n if (tabElement) {\n fieldContainerElement.querySelector(\".df-tab-header\")?.appendChild(tabElement);\n }\n\n if (tabBodyElement) {\n fieldContainerElement.querySelector(\".df-tab-body\")?.appendChild(tabBodyElement);\n\n if (childField.children) {\n let tabFormOptions = {\n style: {\n width: formOptions.style.width ?? \"100%\",\n labelWidth: formOptions.style.labelWidth ?? 3,\n valueWidth: formOptions.style.valueWidth ?? 9,\n position: formOptions.style.position ?? \"left-right\",\n },\n useTypeValue: formOptions.useTypeValue,\n autoCreate: false,\n notValidMessage: \"This form is not valid.\",\n fields: [],\n } as FormOptions;\n\n childField.$tabForm = new DaraForm(document.createElement(\"div\"), tabFormOptions);\n\n childField.$instance = new (childField.$renderType as any)(childField, tabBodyElement?.querySelector(\".df-tab-group\"), childField.$tabForm);\n\n childField.$tabForm.formTemplate.childTemplate(childField, fieldStyle);\n }\n }\n }\n\n this.tabContainerElement = fieldContainerElement;\n }\n }\n\n getValue(): any {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n\n let allTabValue = {} as any;\n\n let useTypeValue = this.getForm().getOptions().useTypeValue;\n\n for (const childField of this.field.children) {\n const childFieldValue = childField.$tabForm?.getValue(false);\n if (useTypeValue) {\n allTabValue[childField.$validName] = childFieldValue;\n } else {\n for (let [key, value] of Object.entries(childFieldValue)) {\n allTabValue[key] = value;\n }\n }\n }\n return allTabValue;\n }\n\n setValue(value: any): void {\n for (const childField of this.field.children) {\n let tabChildValue = value[childField.$validName];\n\n if (tabChildValue) {\n childField.$tabForm?.setValue(tabChildValue);\n }\n }\n }\n\n reset() {}\n\n getElement(): Element {\n return this.rowElement;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n\n const field = this.field;\n\n for (const childField of field.children) {\n const validResult = childField.$tabForm?.validForm();\n\n if (validResult && validResult.length > 0) {\n const firstItem = validResult[0];\n\n if (firstItem.message) {\n firstItem.message = \"[\" + this.field.label + \"] \" + firstItem.message;\n\n return firstItem;\n }\n }\n }\n\n return true;\n }\n\n focus(): void {}\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { invalidMessage, resetRowElementStyleClass } from \"@/util/validUtils\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resolveFieldStyle } from \"@/util/styleUtils\";\nimport FormTemplate from \"@/FormTemplate\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport { NumberKeyMap } from \"@t/DataMap\";\n\nlet $$idx = 0;\n\nexport default class GridRender extends Render {\n private customFunction;\n private gridForm;\n private allAddRowInfo = {} as NumberKeyMap;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n if (field.renderer) {\n this.customFunction = field.renderer;\n } else {\n this.customFunction = {} as any;\n }\n\n const gridFormOptions = {\n style: {\n width: \"100%\",\n labelWidth: 3,\n valueWidth: 9,\n position: \"left-right\",\n },\n autoCreate: false,\n notValidMessage: \"This form is not valid.\",\n fields: [],\n } as FormOptions;\n\n this.gridForm = new DaraForm(document.createElement(\"div\"), gridFormOptions);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n this.addRow();\n\n if (this.customFunction.mounted) {\n (this.customFunction.mounted as any).call(this, this.field, this.rowElement);\n }\n\n this.rowElement.querySelector(\".df-grid-add-row-btn\")?.addEventListener(\"click\", (evt) => {\n this.addRow();\n });\n }\n\n static isDataRender(): boolean {\n return false;\n }\n\n static isChildrenCreate(): boolean {\n return false;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let theadTemplate = [];\n let colgroupTemplate = [];\n let addBtnTemplate = [];\n addBtnTemplate.push(\"\");\n\n if (field.children) {\n colgroupTemplate.push(\"<colgroup>\");\n\n theadTemplate.push(\"<tr>\");\n\n colgroupTemplate.push(`<col style=\"width:38px\">`);\n theadTemplate.push(\"<th>\");\n if (field.rendererOptions?.disableAddButton !== true) {\n theadTemplate.push(`<button type=\"button\" class=\"df-btn df-grid-add-row-btn\" title=\"Add\"><i class=\"df-icon df-add-icon\"></i></button>`);\n }\n theadTemplate.push(\"</th>\");\n\n for (const childField of field.children) {\n colgroupTemplate.push(`<col style=\"width:${childField.style?.width ?? \"*\"}\">`);\n theadTemplate.push(`<th class=\"df-grid-header\">${childField.label}</th>`);\n }\n colgroupTemplate.push(\"</colgroup>\");\n theadTemplate.push(\"</tr>\");\n }\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-grid-field\">\n ${addBtnTemplate.join(\"\")}\n <div class=\"df-grid-container ${field.style?.position ?? \"\"}\" style=\"height:${field.rendererOptions?.height ?? \"auto\"};\">\n <table class=\"df-grid\">${colgroupTemplate.join(\"\")}<thead>${theadTemplate.join(\"\")}</thead><tbody></tbody></table>\n </div>\n </div>\n `;\n }\n\n /**\n * add row\n */\n addRow(valueItem?: any): void {\n let rowTemplate = [];\n\n const options = this.daraForm.getOptions();\n const formTemplate = this.gridForm.formTemplate;\n const parentName = this.field.$xssName;\n\n ++$$idx;\n let addColumns = [];\n rowTemplate.push(`<tr class=\"df-grid-row\">`);\n\n rowTemplate.push(\"<td>\");\n if (this.field.rendererOptions?.disableRemoveButton !== true) {\n rowTemplate.push(`<button type=\"button\" data-row-idx=\"${$$idx}\" class=\"df-btn df-grid-row-remove\"><i class=\"df-icon df-remove-icon\"></i></button>`);\n }\n rowTemplate.push(\"</td>\");\n\n for (const childField of this.field.children) {\n let fieldStyle: FieldStyle = resolveFieldStyle(options, childField, null, true);\n\n let columnField = utils.merge({}, childField) as FormField;\n\n addColumns.push(columnField);\n columnField.$orgin = childField;\n columnField.name = columnField.name + \"_\" + $$idx;\n columnField.$xssName = parentName + \"_\" + utils.getXssFieldName(columnField);\n\n formTemplate.addRowFieldInfo(columnField);\n\n rowTemplate.push(`<td id=\"${columnField.$xssName}\"><div class=\"df-field-container ${columnField.required ? \"required\" : \"\"} \" style=\"${fieldStyle.valueStyle}\"></div></td>`);\n }\n rowTemplate.push(\"</tr>\");\n\n this.allAddRowInfo[$$idx] = addColumns;\n\n const addRowElement = utils.templateToElement(rowTemplate.join(\"\"));\n\n if (addRowElement) {\n this.rowElement.querySelector(\"tbody\")?.append(addRowElement);\n\n addRowElement.querySelector(\".df-grid-row-remove\")?.addEventListener(\"click\", (evt) => {\n this.removeRow(evt);\n });\n }\n\n valueItem = valueItem ?? {};\n for (let columnField of addColumns) {\n columnField.$instance = new (columnField.$renderType as any)(columnField, addRowElement?.querySelector(`#${columnField.$xssName}`), this.gridForm);\n\n if (valueItem[columnField.$orgin.name]) {\n columnField.$instance.setValue(valueItem[columnField.$orgin.name]);\n }\n }\n }\n\n /**\n * remove row\n *\n * @param evt event\n */\n removeRow(evt: Event): void {\n const target = evt.target as Element;\n\n const rowElement = target.closest(\"tr\");\n\n if (rowElement) {\n if (rowElement.parentElement?.childElementCount == 1) return;\n\n let rowIdx = (evt.currentTarget as Element)?.getAttribute(\"data-row-idx\") || \"-1\";\n\n this.removeFieldInfo(rowIdx);\n rowElement.remove();\n }\n }\n\n /**\n *\n * @param rowIdx row index\n */\n removeFieldInfo(rowIdx?: string) {\n let removeFieldArrs = [] as any;\n if (utils.isEmpty(rowIdx)) {\n for (let key in this.allAddRowInfo) {\n removeFieldArrs = removeFieldArrs.concat(this.allAddRowInfo[key]);\n }\n this.allAddRowInfo = {} as NumberKeyMap;\n } else if (rowIdx) {\n const rowIdxNum = parseInt(rowIdx, 10);\n removeFieldArrs = removeFieldArrs.concat(this.allAddRowInfo[rowIdxNum]);\n delete this.allAddRowInfo[rowIdxNum];\n }\n\n for (let columnField of removeFieldArrs) {\n this.gridForm.getFieldInfoMap().removeFieldInfo(columnField.name);\n }\n }\n\n allRemoveRow(): void {\n this.rowElement.querySelector(\"tbody\")?.replaceChildren();\n this.removeFieldInfo();\n }\n\n getValue() {\n if (this.customFunction.getValue) {\n return (this.customFunction.getValue as any).call(this, this.field, this.rowElement);\n }\n let result = [];\n const children = this.field.children;\n const childrenLength = children.length;\n for (let idx in this.allAddRowInfo) {\n const rowColumns = this.allAddRowInfo[idx];\n\n let rowInfo = {} as any;\n for (let childIdx = 0; childIdx < childrenLength; childIdx++) {\n let childField = children[childIdx];\n rowInfo[childField.name] = this.gridForm.getFieldValue(rowColumns[childIdx].name); // rowColumns[childIdx].$instance.getValue();\n }\n\n result.push(rowInfo);\n }\n return result;\n }\n\n setValue(value: any): void {\n this.field.$value = value;\n\n let valueArr: any[] = [];\n if (utils.isArray(value)) {\n valueArr = value;\n } else {\n if (utils.isPlainObject(value)) {\n valueArr.push(value);\n }\n }\n\n this.allRemoveRow();\n\n for (let valueItem of valueArr) {\n this.addRow(valueItem);\n }\n }\n\n reset() {\n this.setDefaultInfo();\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement() {\n if (this.customFunction.getElement) {\n return (this.customFunction.getElement as any).call(this, this.field, this.rowElement);\n }\n return null;\n }\n\n valid(): any {\n if (this.customFunction.valid) {\n const validResult = (this.customFunction.valid as any).call(this, this.field, this.rowElement);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return;\n }\n\n const validResult = this.gridForm.validForm();\n\n if (validResult.length > 0) {\n const firstItem = validResult[0];\n\n if (firstItem.message) {\n firstItem.message = \"[\" + this.field.label + \"] \" + firstItem.message;\n\n return firstItem;\n }\n }\n\n return true;\n }\n\n focus(): void {}\n}\n","import NumberRender from \"@/renderer/NumberRender\";\r\nimport TextAreaRender from \"@/renderer/TextAreaRender\";\r\nimport DropdownRender from \"@/renderer/DropdownRender\";\r\nimport TextRender from \"@/renderer/TextRender\";\r\nimport CheckboxRender from \"@/renderer/CheckboxRender\";\r\nimport RadioRender from \"@/renderer/RadioRender\";\r\nimport PasswordRender from \"@/renderer/PasswordRender\";\r\nimport FileRender from \"@/renderer/FileRender\";\r\nimport CustomRender from \"./renderer/CustomRender\";\r\nimport GroupRender from \"./renderer/GroupRender\";\r\nimport HiddenRender from \"./renderer/HiddenRender\";\r\nimport ButtonRender from \"./renderer/ButtonRender\";\r\nimport RangeRender from \"./renderer/RangeRender\";\r\nimport DateRender from \"./renderer/DateRender\";\r\nimport TabRender from \"./renderer/TabRender\";\r\nimport GridRender from \"./renderer/GridRender\";\r\n\r\nexport type FORM_MODE = \"new\" | \"modify\" | \"view\";\r\n\r\nexport const RULES = {\r\n NAN: \"nan\",\r\n MIN: \"minimum\",\r\n EXCLUSIVE_MIN: \"exclusiveMinimum\",\r\n MAX: \"maximum\",\r\n EXCLUSIVE_MAX: \"exclusiveMaximum\",\r\n MIN_LENGTH: \"minLength\",\r\n MAX_LENGTH: \"maxLength\",\r\n BETWEEN: \"between\",\r\n BETWEEN_EXCLUSIVE_MIN: \"betweenExclusiveMin\",\r\n BETWEEN_EXCLUSIVE_MAX: \"betweenExclusiveMax\",\r\n BETWEEN_EXCLUSIVE_MINMAX: \"betweenExclusiveMinMax\",\r\n REGEXP: \"regexp\",\r\n REQUIRED: \"required\",\r\n VALIDATOR: \"validator\",\r\n} as const;\r\n\r\nexport const FIELD_PREFIX = \"dff\"; // daracl form field\r\n\r\nexport const RENDER_TEMPLATE: any = {\r\n number: NumberRender,\r\n textarea: TextAreaRender,\r\n dropdown: DropdownRender,\r\n checkbox: CheckboxRender,\r\n radio: RadioRender,\r\n text: TextRender,\r\n password: PasswordRender,\r\n file: FileRender,\r\n custom: CustomRender,\r\n group: GroupRender,\r\n hidden: HiddenRender,\r\n button: ButtonRender,\r\n range: RangeRender,\r\n datehour: DateRender,\r\n datemonth: DateRender,\r\n date: DateRender,\r\n datetime: DateRender,\r\n tab: TabRender,\r\n grid: GridRender,\r\n};\r\n\r\nexport const ALIGN = {\r\n left: \"left\",\r\n center: \"center\",\r\n right: \"right\",\r\n} as const;\r\n\r\nexport type TEXT_ALIGN_TYPE = (typeof ALIGN)[keyof typeof ALIGN];\r\n\r\nexport type RENDER_TYPE = \"number\" | \"text\" | \"file\" | \"textarea\" | \"dropdown\" | \"radio\" | \"checkbox\" | \"date\" | \"datetime\" | \"dateyear\" | \"datemonth\" | \"datehour\" | \"group\" | \"custom\";\r\n\r\nexport type REGEXP_TYPE = \"email\" | \"url\" | \"alpha\" | \"alpha-num\";\r\n\r\nexport type PASSWORD_TYPE = \"number\" | \"upper\" | \"upper-special\" | \"upper-special-number\"; // 숫자 | 대문자 포함, 대문자 특수문자 포함, 대문자 특수문자 숫자\r\n\r\nexport type FIELD_POSITION = \"top\" | \"left\" | \"left-left\" | \"left-right\" | \"right\" | \"right-left\" | \"right-right\" | \"bottom\";\r\n\r\nexport const OrientationMap = {\r\n horizontal: \"horizontal\",\r\n vertical: \"vertical\",\r\n} as const;\r\n\r\nexport type OrientationType = (typeof OrientationMap)[keyof typeof OrientationMap];\r\n\r\ninterface StringArrayMap {\r\n [key: string]: string[];\r\n}\r\n\r\nexport const FIELD_POSITION_STYLE: StringArrayMap = {\r\n \"top-left\": [\"top\", \"df-txt-left\"],\r\n \"top-center\": [\"top\", \"df-txt-center\"],\r\n \"top-right\": [\"top\", \"df-txt-right\"],\r\n \"left-left\": [\"\", \"df-txt-left\"],\r\n \"left-center\": [\"\", \"df-txt-center\"],\r\n \"left-right\": [\"\", \"df-txt-right\"],\r\n \"right-right\": [\"right\", \"df-txt-right\"],\r\n \"right-center\": [\"right\", \"df-txt-center\"],\r\n \"right-left\": [\"right\", \"df-txt-left\"],\r\n \"bottom-left\": [\"bottom\", \"df-txt-left\"],\r\n \"bottom-center\": [\"bottom\", \"df-txt-center\"],\r\n \"bottom-right\": [\"bottom\", \"df-txt-right\"],\r\n};\r\nFIELD_POSITION_STYLE[\"top\"] = FIELD_POSITION_STYLE[\"top-left\"];\r\nFIELD_POSITION_STYLE[\"right\"] = FIELD_POSITION_STYLE[\"right-right\"];\r\nFIELD_POSITION_STYLE[\"left\"] = FIELD_POSITION_STYLE[\"left-left\"];\r\nFIELD_POSITION_STYLE[\"bottom\"] = FIELD_POSITION_STYLE[\"bottom-left\"];\r\n","import { Message } from \"@t/Message\";\r\nimport { FormField } from \"../types/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\n\r\nlet localeMessage: Message = {\r\n required: \"{label} 필수 입력사항입니다.\",\r\n fileButton: \"파일찾기\",\r\n selection: \"선택\",\r\n string: {\r\n minLength: \"{minLength} 글자 이상으로 입력하세요.\",\r\n maxLength: \"{maxLength} 글자 이하로 입력하세요.\",\r\n between: \"{minLength} ~ {maxLength} 사이의 글자를 입력하세요.\",\r\n },\r\n number: {\r\n nan: \"숫자만 입력 가능 합니다.\",\r\n minimum: \"{minimum} 값과 같거나 커야 합니다\",\r\n exclusiveMinimum: \"{minimum} 보다 커야 합니다\",\r\n maximum: \"{maximum} 값과 같거나 작아야 합니다\",\r\n exclusiveMaximum: \"{maximum} 보다 작아야 합니다.\",\r\n between: \"{minimum}~{maximum} 사이의 값을 입력하세요.\",\r\n betweenExclusiveMin: \"{minimum} 보다 크고 {maximum} 보다 같거나 작아야 합니다\",\r\n betweenExclusiveMax: \"{minimum} 보다 같거나 크고 {maximum} 보다 작아야 합니다\",\r\n betweenExclusiveMinMax: \"{minimum} 보다 크고 {maximum} 보다 작아야 합니다\",\r\n },\r\n regexp: {\r\n mobile: \"핸드폰 번호가 유효하지 않습니다.\",\r\n email: \"이메일이 유효하지 않습니다.\",\r\n url: \"URL이 유효하지 않습니다.\",\r\n alpha: \"영문만 입력 가능 합니다.\",\r\n \"alpha-num\": \"영문과 숫자만 입력 가능 합니다.\",\r\n number: \"숫자만 입력 가능 합니다.\",\r\n variable: \"값이 유효하지 않습니다.\",\r\n \"number-char\": \"숫자, 문자 각각 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char\": \"대문자가 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char-special\": \"대문자,소문자,특수문자 각각 하나 이상 포함 되어야 합니다.\",\r\n \"upper-char-special-number\": \"대문자,소문자,특수문자,숫자 각각 하나 이상 포함 되어야합니다.\",\r\n },\r\n};\r\n\r\n/**\r\n * validation 메시지 처리.\r\n *\r\n * @class Language\r\n * @typedef {Language}\r\n */\r\nclass Language {\r\n private lang: Message = localeMessage;\r\n\r\n /**\r\n * 다국어 메시지 등록\r\n *\r\n * @public\r\n * @param {?Message} [lang] 둥록할 메시지\r\n */\r\n public set(lang?: Message) {\r\n this.lang = Object.assign({}, localeMessage, lang);\r\n }\r\n\r\n /**\r\n * 메시지 얻기\r\n *\r\n * @public\r\n * @param {string} messageKey 메시지 키\r\n * @returns {*}\r\n */\r\n public getMessage(messageKey: string): any {\r\n return (this.lang as any)[messageKey];\r\n }\r\n\r\n /**\r\n * ValidResult 값을 메시지로 변경.\r\n *\r\n * @public\r\n * @param {FormField} field\r\n * @param {ValidResult} validResult\r\n * @returns {string[]}\r\n */\r\n public validMessage(field: FormField, validResult: ValidResult): string[] {\r\n let messageFormat = \"\";\r\n\r\n let messageFormats: string[] = [];\r\n\r\n if (validResult.regexp) {\r\n messageFormat = (this.lang.regexp as any)[validResult.regexp];\r\n messageFormats.push(messageFormat);\r\n }\r\n\r\n (validResult.constraint ?? []).forEach((constraint) => {\r\n if (constraint === RULES.REQUIRED) {\r\n messageFormat = message(this.lang.required, field);\r\n messageFormats.push(messageFormat);\r\n }\r\n\r\n if (field.renderType == \"number\" || field.renderType == \"range\") {\r\n messageFormat = (this.lang.number as any)[constraint];\r\n messageFormats.push(messageFormat);\r\n } else {\r\n messageFormat = (this.lang.string as any)[constraint];\r\n messageFormats.push(messageFormat);\r\n }\r\n });\r\n\r\n const reMessage: string[] = [];\r\n\r\n const msgParam = Object.assign({}, { name: field.name, label: field.label }, field.rule);\r\n messageFormats.forEach((msgFormat) => {\r\n if (msgFormat) {\r\n reMessage.push(message(msgFormat, msgParam));\r\n }\r\n });\r\n\r\n if (validResult.validator) {\r\n reMessage.push(validResult.validator.message);\r\n }\r\n\r\n return reMessage;\r\n }\r\n}\r\n\r\nfunction message(msgFormat: string, msgParam: any): string {\r\n return msgFormat.replace(/\\{{1,1}([A-Za-z0-9_.]*)\\}{1,1}/g, (match, key) => {\r\n return typeof msgParam[key] !== \"undefined\" ? msgParam[key] : match;\r\n });\r\n}\r\n\r\nexport default new Language();\r\n","import { FormField } from \"@t/FormField\";\r\n\r\nimport { Render } from \"../renderer/Render\";\r\nimport { RENDER_TEMPLATE } from \"../constants\";\r\nimport * as utils from \"./utils\";\r\n\r\nexport const getRenderer = (field: FormField): Render => {\r\n let render;\r\n if (field.renderType) {\r\n render = RENDER_TEMPLATE[field.renderType];\r\n }\r\n\r\n if (render && (render.isDataRender() === false || !utils.isUndefined(field.name))) {\r\n return render;\r\n }\r\n\r\n if (utils.isUndefined(field.name)) {\r\n if (field.children) {\r\n return RENDER_TEMPLATE[\"group\"];\r\n } else {\r\n return RENDER_TEMPLATE[\"hidden\"];\r\n }\r\n }\r\n\r\n return RENDER_TEMPLATE[\"text\"];\r\n};\r\n","import { FIELD_PREFIX } from \"@/constants\";\r\nimport { FormField } from \"./types/FormField\";\r\nimport { ValidResult } from \"./types/ValidResult\";\r\nimport { getRenderer } from \"./util/renderFactory\";\r\nimport Language from \"./util/Language\";\r\nimport * as utils from \"./util/utils\";\r\nimport { DaraForm } from \"./DaraForm\";\r\n\r\ninterface NumberFieldMap {\r\n [key: string]: FormField;\r\n}\r\n\r\ninterface StringNumberMap {\r\n [key: string]: string;\r\n}\r\n\r\nexport default class FieldInfoMap {\r\n private fieldIdx = 0;\r\n\r\n private allFieldInfo: NumberFieldMap = {};\r\n\r\n private keyNameMap: StringNumberMap = {};\r\n\r\n private conditionFields: string[] = [];\r\n\r\n private fieldPrefix;\r\n\r\n private form;\r\n\r\n constructor(selector: string, form: DaraForm) {\r\n this.fieldPrefix = `${FIELD_PREFIX}_${utils.getHashCode(selector)}`;\r\n this.form = form;\r\n }\r\n\r\n /**\r\n * add Field 정보\r\n *\r\n * @public\r\n * @param {FormField} field 폼필드 정보\r\n */\r\n public addField(field: FormField) {\r\n utils.replaceXssField(field);\r\n this.fieldIdx += 1;\r\n field.$key = `${this.fieldPrefix}_${this.fieldIdx}`;\r\n field.$validName = field.name ?? field.label;\r\n this.keyNameMap[field.$validName] = field.$key;\r\n this.allFieldInfo[field.$key] = field;\r\n field.$renderType = getRenderer(field);\r\n\r\n if (field.conditional) {\r\n this.conditionFields.push(field.$key);\r\n }\r\n }\r\n\r\n /**\r\n * 필드명으로 필드 정부 구하기\r\n *\r\n * @public\r\n * @param {string} fieldName 필드명\r\n * @returns {FormField}\r\n */\r\n public getFieldName(fieldName: string): FormField {\r\n return this.allFieldInfo[this.keyNameMap[fieldName]];\r\n }\r\n\r\n /**\r\n * 필드 키로 정보 구하기\r\n *\r\n * @public\r\n * @param {string} fieldKey\r\n * @returns {FormField}\r\n */\r\n public get(fieldKey: string): FormField {\r\n return this.allFieldInfo[fieldKey];\r\n }\r\n\r\n /**\r\n * 필드명 있는지 여부 체크.\r\n *\r\n * @public\r\n * @param {string} fieldName 필드명\r\n * @returns {boolean}\r\n */\r\n public hasFieldName(fieldName: string): boolean {\r\n if (this.keyNameMap[fieldName] && this.allFieldInfo[this.keyNameMap[fieldName]]) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * 모든 필드 정보\r\n *\r\n * @public\r\n * @returns {NumberFieldMap}\r\n */\r\n public getAllFieldInfo(): NumberFieldMap {\r\n return this.allFieldInfo;\r\n }\r\n\r\n /**\r\n * 필드 정보 맵에서 지우기\r\n *\r\n * @public\r\n * @param {string} fieldName\r\n */\r\n public removeFieldInfo(fieldName: string) {\r\n const fieldKey = this.keyNameMap[fieldName];\r\n\r\n if (utils.isUndefined(fieldKey)) return;\r\n\r\n this.removeFieldInfoByKey(fieldKey);\r\n delete this.keyNameMap[fieldName];\r\n }\r\n\r\n /**\r\n * 필드 키로 필드 정보 맵에서 지우기\r\n *\r\n * @public\r\n * @param {string} fieldKey\r\n */\r\n public removeFieldInfoByKey(fieldKey: string) {\r\n const fieldInfo = this.allFieldInfo[fieldKey];\r\n\r\n if (fieldInfo && this.keyNameMap[fieldInfo.$validName] === fieldKey) {\r\n delete this.keyNameMap[fieldInfo.$validName];\r\n }\r\n\r\n delete this.allFieldInfo[fieldKey];\r\n\r\n this.conditionFields = this.conditionFields.filter((key) => key !== fieldKey);\r\n }\r\n\r\n /**\r\n * 모든 필드값 구하기\r\n *\r\n * @public\r\n * @param {boolean} validationCheck\r\n * @returns {*}\r\n */\r\n public getAllFieldValue(formValue: any, validationCheck: boolean) {\r\n const useTypeValue = this.form.getOptions().useTypeValue;\r\n\r\n if (validationCheck !== true) {\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n formValue = addFormValue(formValue, fieldInfo, useTypeValue);\r\n }\r\n return formValue;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n if (!fieldInfo.$instance.isEnableView()) {\r\n continue;\r\n }\r\n\r\n let fieldValid = this.getFieldValidation(fieldInfo, true);\r\n\r\n if (fieldValid !== true) {\r\n reject(new Error(fieldValid.message, { cause: fieldValid }));\r\n return;\r\n }\r\n\r\n formValue = addFormValue(formValue, fieldInfo, useTypeValue);\r\n }\r\n\r\n resolve(formValue);\r\n });\r\n }\r\n\r\n public getFormDataValue(formValue: any, validationCheck: boolean) {\r\n if (validationCheck !== true) {\r\n let reval = new FormData();\r\n\r\n for (let [key, value] of Object.entries(formValue)) {\r\n reval.set(key, value as any);\r\n }\r\n\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n addFieldFormData(reval, fieldInfo, fieldInfo.$instance.getValue());\r\n }\r\n\r\n return reval;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let reval = new FormData();\r\n\r\n for (let [key, value] of Object.entries(formValue)) {\r\n reval.set(key, value as any);\r\n }\r\n\r\n for (let [key, fieldInfo] of Object.entries(this.allFieldInfo)) {\r\n if (!fieldInfo.$instance.isEnableView()) {\r\n continue;\r\n }\r\n\r\n let fieldValid = this.getFieldValidation(fieldInfo, true);\r\n\r\n if (fieldValid !== true) {\r\n reject(new Error(fieldValid.message, { cause: fieldValid }));\r\n return;\r\n }\r\n\r\n addFieldFormData(reval, fieldInfo, fieldInfo.$instance.getValue());\r\n }\r\n\r\n resolve(reval);\r\n });\r\n }\r\n\r\n /**\r\n *\r\n *\r\n * @param field\r\n * @returns\r\n */\r\n public isConditionFieldCheck(field: FormField) {\r\n let parent = field;\r\n\r\n while (typeof parent !== \"undefined\") {\r\n if (!this.isConditionField(parent)) {\r\n return false;\r\n }\r\n\r\n parent = parent.$parent;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * field 활성 비활성화 여부.\r\n *\r\n * @param field form field\r\n * @returns\r\n */\r\n public isConditionField(field: FormField) {\r\n if (!this.conditionFields.includes(field.$key)) {\r\n return true;\r\n }\r\n\r\n let condFlag = false;\r\n\r\n if (field.conditional.custom) {\r\n condFlag = field.conditional.custom.call(null, field);\r\n } else {\r\n if (field.conditional.field) {\r\n const condField = this.getFieldName(field.conditional.field);\r\n\r\n if (condField) {\r\n if (field.conditional.eq == condField.$instance.getValue()) {\r\n condFlag = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return condFlag;\r\n }\r\n\r\n /**\r\n * 컬럼 로우 보이고 안보이기 체크.\r\n *\r\n * @public\r\n */\r\n public conditionCheck() {\r\n this.conditionFields.forEach((fieldKey) => {\r\n const fieldInfo = this.allFieldInfo[fieldKey];\r\n\r\n let condFlag = this.isConditionField(fieldInfo);\r\n\r\n if (condFlag) {\r\n fieldInfo.$instance.show();\r\n } else {\r\n fieldInfo.$instance.hide();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * field validation check\r\n *\r\n * @param fieldInfo FormField\r\n * @returns boolean true or ValidResult\r\n */\r\n public getFieldValidation(fieldInfo: FormField, focusFlag: boolean | undefined) {\r\n if (!this.isConditionFieldCheck(fieldInfo)) {\r\n return true;\r\n }\r\n\r\n const renderInfo = fieldInfo.$instance;\r\n let fieldValid = renderInfo.valid();\r\n\r\n if (fieldValid === true) return true;\r\n\r\n if (focusFlag) {\r\n renderInfo.focus();\r\n }\r\n fieldValid = fieldValid as ValidResult;\r\n if (utils.isUndefined(fieldValid.message)) {\r\n fieldValid.message = Language.validMessage(fieldInfo, fieldValid)[0];\r\n }\r\n\r\n return fieldValid;\r\n }\r\n}\r\n\r\n/**\r\n * add form value\r\n * @param formData {Object} return Object value\r\n * @param fieldInfo {FormField} field info\r\n * @param fieldValue {any} form value\r\n */\r\nfunction addFormValue(formData: any, fieldInfo: FormField, useTypeValue?: boolean) {\r\n if (utils.ignoreValueField(fieldInfo)) {\r\n return formData;\r\n }\r\n\r\n const fieldValue = fieldInfo.$instance.getValue();\r\n\r\n if (fieldInfo.renderType === \"file\") {\r\n const uploadFiles = fieldValue[\"uploadFile\"];\r\n\r\n formData[fieldInfo.$validName] = uploadFiles;\r\n formData[fieldInfo.$validName + \"RemoveIds\"] = fieldValue[\"removeIds\"];\r\n } else {\r\n if (useTypeValue !== true) {\r\n if (utils.isTabType(fieldInfo)) {\r\n for (let [key, value] of Object.entries(fieldValue)) {\r\n formData[key] = value;\r\n }\r\n } else {\r\n if (!utils.isEmpty(fieldInfo.name)) {\r\n formData[fieldInfo.name] = fieldValue;\r\n }\r\n }\r\n } else {\r\n formData[fieldInfo.$validName] = fieldValue;\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n\r\nfunction addFieldFormData(formData: FormData, fieldInfo: FormField, useTypeValue?: boolean) {\r\n if (utils.ignoreValueField(fieldInfo)) {\r\n return formData;\r\n }\r\n\r\n const fieldValue = fieldInfo.$instance.getValue();\r\n\r\n if (fieldInfo.renderType === \"file\") {\r\n const uploadFiles = fieldValue[\"uploadFile\"];\r\n formData.delete(fieldInfo.$validName);\r\n for (let uploadFile of uploadFiles) {\r\n formData.append(fieldInfo.$validName, uploadFile);\r\n }\r\n\r\n formData.set(fieldInfo.$validName + \"RemoveIds\", fieldValue[\"removeIds\"]);\r\n } else {\r\n if (useTypeValue !== true) {\r\n if (utils.isTabType(fieldInfo)) {\r\n for (let [key, value] of Object.entries(fieldValue)) {\r\n formData.set(key, value as any);\r\n }\r\n } else {\r\n if (!utils.isEmpty(fieldInfo.name)) {\r\n formData.set(fieldInfo.$validName, fieldValue);\r\n }\r\n }\r\n } else {\r\n formData.set(fieldInfo.$validName, fieldValue);\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n","import { FormOptions } from \"@t/FormOptions\";\nimport { FieldStyle, FormField } from \"@t/FormField\";\nimport * as utils from \"./util/utils\";\nimport FieldInfoMap from \"@/FieldInfoMap\";\n\nimport { resolveFieldStyle } from \"./util/styleUtils\";\nimport { DaraForm } from \"./DaraForm\";\nimport TabRender from \"./renderer/TabRender\";\nimport GridRender from \"./renderer/GridRender\";\n\n/**\n * form template\n *\n * @class FormTemplate\n * @typedef {FormTemplate}\n */\nexport default class FormTemplate {\n private readonly options: FormOptions;\n private readonly formElement;\n\n private fieldInfoMap;\n\n private daraform: DaraForm;\n\n private addRowFields: string[] = [];\n\n constructor(daraform: DaraForm, formElement: Element, fieldInfoMap: FieldInfoMap) {\n this.daraform = daraform;\n this.options = daraform.getOptions();\n this.formElement = formElement;\n\n this.fieldInfoMap = fieldInfoMap;\n }\n\n /**\n * field row 추가.\n *\n * @param field\n */\n public addRow(field: FormField) {\n if (this.checkHiddenField(field)) {\n return;\n }\n\n this.addRowFields = [];\n\n this.addRowTemplate(field);\n }\n\n /**\n * 그룹 템플릿\n *\n * @param {FormField} field\n * @returns {string} row template\n */\n public addRowTemplate(field: FormField): void {\n let labelHideFlag = this.isLabelHide(field);\n\n let fieldStyle: FieldStyle = resolveFieldStyle(this.options, field, null, labelHideFlag);\n\n this.addRowFieldInfo(field);\n\n const rowElement = utils.templateToElement(`\n <div class=\"df-row df-form-group ${fieldStyle.fieldClass}\" id=\"${field.$key}\">\n ${labelHideFlag ? \"\" : `<div class=\"df-label ${fieldStyle.labelClass} ${fieldStyle.labelAlignClass}\" title=\"${field.label ?? \"\"}\" style=\"${fieldStyle.labelStyle}\">${this.getLabelTemplate(field)}</div>`}\n\n <div class=\"df-field-container ${fieldStyle.valueClass} ${field.required ? \"required\" : \"\"}\" style=\"${fieldStyle.valueStyle}\"></div>\n </div>\n `);\n\n if (rowElement) {\n this.createField(field, rowElement);\n this.formElement.append(rowElement);\n\n if (field.children) {\n this.childTemplate(field, fieldStyle);\n }\n }\n }\n\n public createField(field: FormField, element: Element): void {\n field.$instance = new (field.$renderType as any)(field, element, this.daraform);\n }\n\n /**\n * child template\n *\n * @param {FormField} field\n * @param {FieldStyle} parentFieldStyle\n * @returns {*}\n */\n public childTemplate(field: FormField, parentFieldStyle: FieldStyle): void {\n let beforeField: FormField = null as any;\n let firstFlag = true;\n let isEmptyLabel = false;\n\n if (!(field.$renderType as any).isChildrenCreate()) {\n return;\n }\n\n const rowElement = document.createElement(\"div\");\n rowElement.classList.add(\"df-row\", parentFieldStyle.rowStyleClass ?? \"\");\n\n let idx = 0;\n\n for (const childField of field.children) {\n if (utils.isEmpty(childField)) {\n throw new Error(`parent field :[${field.$validName}], children index ${idx}, empty [${childField}]`);\n }\n\n childField.$parent = field;\n ++idx;\n\n if (this.checkHiddenField(childField)) {\n continue;\n }\n\n this.addRowFieldInfo(childField);\n\n if (firstFlag) {\n beforeField = childField;\n }\n\n let labelHideFlag = this.isLabelHide(childField);\n\n let childFieldStyle;\n\n let labelTemplate = \"\";\n if (labelHideFlag) {\n childFieldStyle = resolveFieldStyle(this.options, childField, beforeField, !isEmptyLabel);\n labelTemplate = isEmptyLabel ? `<span class=\"df-label df-empty ${childFieldStyle.labelClass}\" style=\"${childFieldStyle.labelStyle}\"></span>` : \"\";\n } else {\n childFieldStyle = resolveFieldStyle(this.options, childField, beforeField, false);\n labelTemplate = `<span class=\"df-label ${childFieldStyle.labelClass} ${childFieldStyle.labelAlignClass}\" title=\"${childField.label ?? \"\"}\" style=\"${childFieldStyle.labelStyle}\">${this.getLabelTemplate(childField)}</span>`;\n }\n\n const groupElement = utils.templateToElement(`<div class=\"df-form-group ${childFieldStyle.fieldClass}\" style=\"${childFieldStyle.fieldStyle}\" id=\"${childField.$key}\">\n ${labelTemplate}\n <span class=\"df-field-container ${childFieldStyle.valueClass} ${childField.required ? \"required\" : \"\"}\" style=\"${childFieldStyle.valueStyle}\"></span>\n </div>`);\n\n if (groupElement) {\n this.createField(childField, groupElement);\n rowElement.append(groupElement);\n\n if (childField.children) {\n this.childTemplate(childField, childField.children ? childFieldStyle : parentFieldStyle);\n }\n }\n if (!labelHideFlag) {\n isEmptyLabel = true;\n }\n\n firstFlag = false;\n }\n\n field.$instance.addChildField(rowElement);\n }\n\n /**\n * label template\n *\n * @param {FormField} field form field\n * @returns {string} template string\n */\n public getLabelTemplate(field: FormField) {\n const requiredTemplate = field.required ? `<span class=\"required\"></span>` : \"\";\n const tooltipTemplate = utils.isBlank(field.tooltip) ? \"\" : `<span class=\"df-tooltip\">?<span class=\"df-tooltip-text\">${field.tooltip}</span></span>`;\n\n return `${field.label ?? \"\"} ${tooltipTemplate} ${requiredTemplate}`;\n }\n\n /**\n * label 숨김 여부\n *\n * @param field formfield\n * @returns\n */\n public isLabelHide(field: FormField): boolean {\n return field.style?.labelHide || utils.isUndefined(field.label);\n }\n\n public checkHiddenField(field: FormField) {\n if (utils.isHiddenField(field)) {\n this.fieldInfoMap.addField(field);\n field.$instance = new (field.$renderType as any)(field, null, this.daraform);\n\n return true;\n }\n\n return false;\n }\n\n /**\n * add row file map\n *\n * @param {FormField} field\n */\n public addRowFieldInfo(field: FormField) {\n if (!utils.isBlank(field.name) && this.fieldInfoMap.hasFieldName(field.name)) {\n throw new Error(`Duplicate field name \"${field.name}\"`);\n }\n\n this.fieldInfoMap.addField(field);\n this.addRowFields.push(field.$key);\n }\n}\n","import { FormOptions } from \"./types/FormOptions\";\r\nimport { merge } from \"./util/utils\";\r\n\r\nexport function initFormOptions(options: FormOptions): FormOptions {\r\n const opts = merge({}, DEFAULT_OPTIONS, options) as FormOptions;\r\n\r\n return opts;\r\n}\r\n\r\n/**\r\n * 전역으로 옵션 설정.\r\n *\r\n * @param options 옵션\r\n */\r\nexport function setDefaultOptions(options: Partial<FormOptions>): void {\r\n DEFAULT_OPTIONS = merge({}, DEFAULT_OPTIONS, options);\r\n}\r\n\r\nlet DEFAULT_OPTIONS = {\r\n style: {\r\n width: \"100%\",\r\n labelWidth: 3,\r\n valueWidth: 9,\r\n position: \"left-right\",\r\n },\r\n mode: \"new\",\r\n useTypeValue: true,\r\n autoCreate: true,\r\n notValidMessage: \"This form is not valid.\",\r\n fields: [],\r\n} as FormOptions;\r\n","import { FormOptions } from \"@t/FormOptions\";\nimport { FormField } from \"@t/FormField\";\nimport * as utils from \"./util/utils\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { Message } from \"@t/Message\";\nimport Language from \"./util/Language\";\nimport { stringValidator } from \"./rule/stringValidator\";\nimport { numberValidator } from \"./rule/numberValidator\";\nimport { regexpValidator } from \"./rule/regexpValidator\";\nimport FieldInfoMap from \"@/FieldInfoMap\";\nimport FormTemplate from \"./FormTemplate\";\nimport { FORM_MODE } from \"./constants\";\nimport { initFormOptions, setDefaultOptions } from \"./defaultOption\";\n\ndeclare const APP_VERSION: string;\n\ninterface FieldMap {\n [key: string]: FormField;\n}\n\ninterface DaraFormMap {\n [key: string]: DaraForm;\n}\n\nexport interface FormChangeEvent {\n form: DaraForm;\n}\n\nexport interface FormChangeListener {\n (event: FormChangeEvent): void;\n}\n\nexport interface Unsubscribe {\n (): void;\n}\n\n// all instance\nconst allInstance: DaraFormMap = {};\n\nconst SEQ_ATTR_KEY = \"data-form-uid\";\n\nlet DARA_FORM_SEQ = 0;\n/**\n * DaraForm class\n *\n * @class DaraForm\n * @typedef {DaraForm}\n */\nexport class DaraForm {\n public static VERSION = `${APP_VERSION}`;\n\n private readonly options;\n\n private orginFormStyleClass;\n\n private selector: string;\n private formElement: Element;\n\n private fieldInfoMap: FieldInfoMap;\n\n private formValue: any = {};\n\n public formTemplate: FormTemplate;\n\n private changeListeners: FormChangeListener[] = [];\n\n constructor(formElement: Element, options: FormOptions, message?: Message) {\n this.options = initFormOptions(options);\n\n Language.set(message);\n\n if (formElement) {\n this.orginFormStyleClass = formElement.className;\n formElement.classList.add(\"daracl-form\");\n\n this.selector = `df_${++DARA_FORM_SEQ}`;\n formElement.setAttribute(\"name\", this.selector);\n formElement.setAttribute(SEQ_ATTR_KEY, this.selector);\n\n if (this.options.style.width) {\n formElement.setAttribute(\"style\", `width:${this.options.style.width};`);\n }\n\n this.formElement = formElement;\n this.changeMode(this.options.mode ?? \"new\");\n this.createForm(this.options.fields);\n\n if (this.options.autoCreate !== false) {\n allInstance[this.selector] = this;\n }\n } else {\n throw new Error(`${formElement} form selector not found`);\n }\n }\n\n public static create(formElement: Element, options: FormOptions, message?: Message): DaraForm {\n return new DaraForm(formElement, options, message);\n }\n\n public static setMessage(message: Message): void {\n Language.set(message);\n }\n\n public static setDefaultOptions(options: FormOptions, message?: Message): void {\n setDefaultOptions(options);\n\n if (message) {\n Language.set(message);\n }\n }\n\n private createForm(fields: FormField[]) {\n this.fieldInfoMap = new FieldInfoMap(this.selector, this);\n //this.formElement.innerHTML = \"\";\n this.formTemplate = new FormTemplate(this, this.formElement, this.fieldInfoMap);\n\n if (this.options.autoCreate === false) {\n return;\n }\n\n fields.forEach((field) => {\n this.formTemplate.addRow(field);\n });\n this.conditionCheck();\n\n if (this.options.onMounted) {\n this.options.onMounted.call(this);\n }\n }\n\n /**\n * change mode\n *\n * @param mode form_mode default new\n */\n public changeMode = (mode: FORM_MODE): void => {\n this.options.mode = mode;\n this.formElement.setAttribute(\"data-df-mode\", mode);\n };\n\n /**\n * 폼 데이터 reset\n */\n public resetForm = () => {\n const fieldMap = this.fieldInfoMap.getAllFieldInfo();\n for (const seq in fieldMap) {\n const fieldInfo = fieldMap[seq];\n const renderInfo = fieldInfo.$instance;\n\n if (renderInfo && typeof renderInfo.reset === \"function\") {\n renderInfo.reset();\n }\n }\n this.formValue = {};\n this.conditionCheck();\n };\n\n /**\n * field 값 reset\n * @param fieldName 필드명\n */\n public resetField = (fieldName: string) => {\n this.fieldInfoMap.getFieldName(fieldName).$instance.reset();\n this.formValue[fieldName] = \"\";\n this.conditionCheck();\n };\n\n /**\n * 필드 element 얻기\n *\n * @param {string} fieldName\n * @returns {*}\n */\n public getFieldElement(fieldName: string) {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field?.$instance) {\n return field.$instance.getElement();\n }\n\n return null;\n }\n\n public getField(fieldName: string): FormField {\n return this.fieldInfoMap.getFieldName(fieldName);\n }\n\n /**\n * field 값 얻기\n *\n * @param fieldName 필드명\n * @returns\n */\n public getFieldValue = (fieldName: string) => {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field) {\n return field.$instance.getValue();\n }\n return null;\n };\n\n /**\n * 폼 필드 값 얻기\n * @param isValid 폼 유효성 검사 여부 default:false|undefined true일경우 검사.\n * @returns\n */\n public getValue = (isValid: boolean): any => {\n return this.fieldInfoMap.getAllFieldValue(this.formValue, isValid);\n };\n\n public getFormDataValue = (isValid: boolean): any => {\n return this.fieldInfoMap.getFormDataValue(this.formValue, isValid);\n };\n\n /**\n * 폼 필드 value 셋팅\n * @param values\n */\n public setValue = (values: any, dataClear?: boolean | undefined) => {\n if (dataClear !== false) {\n this.resetForm();\n }\n\n Object.keys(values).forEach((fieldName) => {\n this._setFieldValue(fieldName, values[fieldName]);\n });\n this.conditionCheck();\n };\n\n public setFieldValue = (fieldName: string, value: any) => {\n this._setFieldValue(fieldName, value);\n this.conditionCheck();\n };\n\n private _setFieldValue(fieldName: string, value: any) {\n this.formValue[fieldName] = value;\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (fieldInfo) {\n fieldInfo.$instance.setValue(value);\n }\n }\n\n public setFieldItems = (fieldName: string, values: any) => {\n const field = this.fieldInfoMap.getFieldName(fieldName);\n\n if (field) {\n return field.$instance.setValueItems(values);\n }\n };\n\n /**\n * field 추가\n *\n * @param {FormField} field\n */\n public addField = (field: FormField) => {\n this.options.fields.push(field);\n this.formTemplate.addRow(field);\n this.conditionCheck();\n };\n\n /**\n * field 제거\n *\n * @param {string} fieldName\n */\n public removeField = (fieldName: string) => {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (!fieldInfo) return;\n\n const removeFields = this.getRemoveFields(fieldInfo);\n\n removeFields.forEach((removeField) => {\n this.removeFormValue(removeField);\n });\n\n this.removeFieldElement(fieldInfo);\n this.removeParentChildField(fieldInfo);\n\n removeFields.forEach((removeField) => {\n this.fieldInfoMap.removeFieldInfoByKey(removeField.$key);\n });\n\n this.conditionCheck();\n };\n\n /**\n * 제거할 필드와 같은 fieldInfoMap에 등록된 하위 필드(group 하위 필드, tab 패널) 목록\n * grid 컬럼, tab 패널 내부 필드는 별도 form에 등록되므로 제외됨.\n *\n * @param {FormField} fieldInfo\n * @param {FormField[]} result\n * @returns {FormField[]}\n */\n private getRemoveFields(fieldInfo: FormField, result: FormField[] = []): FormField[] {\n result.push(fieldInfo);\n\n fieldInfo.children?.forEach((childField) => {\n if (childField && this.fieldInfoMap.get(childField.$key) === childField) {\n this.getRemoveFields(childField, result);\n }\n });\n\n return result;\n }\n\n /**\n * field element 제거\n *\n * @param {FormField} fieldInfo\n */\n private removeFieldElement(fieldInfo: FormField) {\n const parentField = fieldInfo.$parent;\n\n // tab 패널은 tab header item, tab panel 로 구성됨.\n if (parentField && utils.isTabType(parentField)) {\n const tabElement = parentField.$instance.getElement() as Element;\n const tabItem = tabElement.querySelector(`[data-tab-id=\"${fieldInfo.$key}\"]`);\n const activeFlag = tabItem?.classList.contains(\"active\");\n\n tabItem?.remove();\n tabElement.querySelector(`[tab-panel-id=\"${fieldInfo.$key}\"]`)?.remove();\n\n const firstTabItem = tabElement.querySelector(\".df-tab-header .df-tab-item\");\n if (activeFlag && firstTabItem) {\n parentField.$instance.setActive(firstTabItem.getAttribute(\"data-tab-id\") ?? \"\");\n }\n return;\n }\n\n // 최상위 필드는 .df-row, group 하위 필드는 .df-form-group 에 id=$key 가 지정됨.\n const rowSelector = `[id=\"${fieldInfo.$key}\"]`;\n let element = fieldInfo.$instance?.getElement();\n\n // checkbox, radio 는 getElement()가 NodeList를 반환함.\n if (element instanceof NodeList || element instanceof HTMLCollection) {\n element = element[0] ?? null;\n }\n\n const rowElement = (element instanceof Element ? element.closest(rowSelector) : null) ?? this.formElement.querySelector(rowSelector);\n const containerElement = rowElement?.parentElement;\n\n rowElement?.remove();\n\n // group 하위 필드를 모두 제거한 경우 빈 row 제거\n if (parentField && containerElement?.classList.contains(\"df-row\") && containerElement.childElementCount < 1) {\n containerElement.remove();\n }\n }\n\n /**\n * 부모 children(최상위는 options.fields)에서 필드 제거\n * tab 은 children 기준으로 값/유효성 체크를 하므로 제거해야 함.\n *\n * @param {FormField} fieldInfo\n */\n private removeParentChildField(fieldInfo: FormField) {\n const fields: FormField[] | undefined = fieldInfo.$parent ? fieldInfo.$parent.children : this.options.fields;\n const idx = fields ? fields.indexOf(fieldInfo) : -1;\n\n if (idx > -1) {\n fields?.splice(idx, 1);\n }\n }\n\n /**\n * getValue() 시 formValue에 누적된 field 값 제거\n *\n * @param {FormField} fieldInfo\n */\n private removeFormValue(fieldInfo: FormField) {\n const keys = [fieldInfo.name, fieldInfo.$validName];\n\n if (fieldInfo.renderType === \"file\") {\n keys.push(fieldInfo.$validName + \"RemoveIds\");\n } else if (utils.isTabType(fieldInfo)) {\n keys.push(...Object.keys(fieldInfo.$instance.getValue() ?? {}));\n }\n\n // tab 패널 (useTypeValue false 일 경우 패널 내부 필드 값이 펼쳐져 저장됨)\n if (fieldInfo.$tabForm) {\n keys.push(...Object.keys(fieldInfo.$tabForm.getValue(false) ?? {}));\n }\n\n keys.forEach((key) => {\n if (!utils.isBlank(key)) delete this.formValue[key];\n });\n }\n\n /**\n * 폼 유효성 검증 여부\n *\n * @returns {boolean}\n */\n public isValidForm = (): boolean => {\n const result = this.validForm();\n\n return result.length < 1;\n };\n\n /**\n * 유효성 검증 폼 검증여부 리턴\n *\n * @returns {any[]}\n */\n public validForm = (): any[] => {\n let validResult = [] as any;\n let autoFocusFlag = this.options.autoFocus !== false;\n let firstFlag = true;\n\n const fieldMap = this.fieldInfoMap.getAllFieldInfo();\n for (const fieldKey in fieldMap) {\n const fieldInfo = fieldMap[fieldKey];\n\n let fieldValid = this.fieldInfoMap.getFieldValidation(fieldInfo, autoFocusFlag);\n\n if (fieldValid !== true) {\n autoFocusFlag = false;\n\n if (utils.isGridType(fieldInfo)) {\n validResult = validResult.concat(fieldValid);\n } else {\n if (firstFlag) {\n this.validTabCheck(fieldInfo);\n firstFlag = false;\n }\n validResult.push(fieldValid);\n }\n }\n }\n\n return validResult;\n };\n\n private validTabCheck(fieldInfo: FormField) {\n if (fieldInfo.$parent) {\n if (fieldInfo.$parent.renderType == \"tab\") {\n fieldInfo.$parent.$instance.setActive(fieldInfo.$key);\n }\n this.validTabCheck(fieldInfo.$parent);\n }\n }\n\n public isValidField = (fieldName: string): boolean => {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n\n if (utils.isUndefined(fieldInfo)) {\n throw new Error(`Field name [${fieldName}] not found`);\n }\n\n const renderInfo = fieldInfo.$instance;\n if (renderInfo) {\n return renderInfo.valid() === true;\n }\n\n return true;\n };\n\n /**\n * 설정 옵션 얻기\n */\n public getOptions = () => {\n return this.options;\n };\n\n public conditionCheck() {\n this.fieldInfoMap.conditionCheck();\n this.notifyChange();\n }\n\n /**\n * 폼 상태(값/보이기 여부 등) 변경을 감지하는 리스너 등록.\n *\n * value/setValue/resetForm/conditional 변경 체크\n *\n * @param listener 상태 변경시 호출되는 콜백\n * @returns 등록 해제 함수\n */\n public subscribe = (listener: FormChangeListener): Unsubscribe => {\n this.changeListeners.push(listener);\n\n return () => {\n this.changeListeners = this.changeListeners.filter((l) => l !== listener);\n };\n };\n\n private notifyChange() {\n if (this.changeListeners.length < 1) return;\n\n const event: FormChangeEvent = { form: this };\n this.changeListeners.forEach((listener) => listener(event));\n }\n\n public setFieldDisabled(fieldName: string, flag: boolean) {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n fieldInfo.$instance.setDisabled(flag);\n }\n\n /**\n * 설명 추가\n *\n * @public\n * @param {string} fieldName\n * @param {string} desc\n */\n public setFieldDescription(fieldName: string, desc: string) {\n const fieldInfo = this.fieldInfoMap.getFieldName(fieldName);\n fieldInfo.$instance.setDescription(desc);\n }\n\n public destroy = () => {\n this.formElement.className = this.orginFormStyleClass;\n this.formElement.replaceChildren();\n\n for (const key in this) {\n if (utils.hasOwnProp(this, key)) {\n delete this[key];\n delete allInstance[this.selector];\n }\n }\n };\n\n public static validator = {\n string: (value: string, field: FormField) => {\n return stringValidator(value, field);\n },\n number: (value: string, field: FormField) => {\n return numberValidator(value, field);\n },\n regexp: (value: string, field: FormField) => {\n let result: ValidResult = { name: field.name, constraint: [] };\n return regexpValidator(value, field, result);\n },\n };\n\n public static instance(ele: Element | String) {\n let element;\n if (utils.isString(ele)) {\n element = document.querySelector(ele);\n } else {\n element = ele;\n }\n element = element as Element;\n let selector = element.getAttribute(SEQ_ATTR_KEY);\n\n if (utils.isUndefined(selector) || utils.isBlank(selector)) {\n const keys = Object.keys(allInstance);\n if (keys.length > 1) {\n throw new Error(`selector empty : [${selector}]`);\n }\n selector = keys[0];\n\n return allInstance[selector];\n }\n }\n /**\n * 모든 field 얻기\n */\n public getFields = (): any[] => {\n return this.options.fields;\n };\n\n /**\n * field setting\n * @param fields\n */\n public setFields = (fields: any[]) => {\n this.options.fields = fields;\n this.createForm(fields);\n };\n\n public getFieldInfoMap() {\n return this.fieldInfoMap;\n }\n}\n","import { DaraForm } from \"./DaraForm\";\r\n\r\nimport \"../style/daracl.form.scss\";\r\n\r\nimport \"@daracl/datetimepicker/dist/daracl.datetimepicker.min.css\";\r\n\r\n// 2) 브라우저 전역에 등록 (데모 실행용)\r\ndeclare global {\r\n interface Window {\r\n Daracl?: any;\r\n }\r\n}\r\n\r\nif (typeof window !== \"undefined\") {\r\n window.Daracl = window.Daracl || {};\r\n window.Daracl.form = DaraForm;\r\n}"],"names":["isArray","isString","isEmpty","isFunction","coreIsArray","utils.isUndefined","utils.replaceXss","utils.isString","utils.isArray","parser","descEle","utils.isEmpty","utils.isBlank","utils.isNumber","message","Language","item","validResult","localeMessage","regexp","DEFAULT_OPTIONS","_DateTimePicker","fieldStyle","utils.templateToElement","utils.merge","utils.getXssFieldName","utils.isPlainObject","utils.getHashCode","utils.replaceXssField","utils.ignoreValueField","utils.isTabType","utils.isHiddenField","utils.isGridType","utils.hasOwnProp"],"mappings":"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","x_google_ignoreList":[0,24]}
|