@daracl/form 0.0.17 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +1 -1
  2. package/dist/DaraForm.d.ts +51 -2
  3. package/dist/FieldInfoMap.d.ts +8 -1
  4. package/dist/FormTemplate.d.ts +2 -2
  5. package/dist/constants.d.ts +5 -1
  6. package/dist/daracl.form.css +788 -0
  7. package/dist/daracl.form.min.css +10 -0
  8. package/dist/daracl.form.min.umd.js +171 -0
  9. package/dist/daracl.form.min.umd.js.map +1 -0
  10. package/dist/daracl.form.umd.js +4497 -0
  11. package/dist/daracl.form.umd.js.map +1 -0
  12. package/dist/defaultOption.d.ts +8 -0
  13. package/dist/event/renderEvents.d.ts +1 -1
  14. package/dist/global.d.ts +6 -0
  15. package/dist/index.cjs +1827 -520
  16. package/dist/index.cjs.map +1 -7
  17. package/dist/index.d.ts +7 -2
  18. package/dist/index.html +193 -348
  19. package/dist/index.js +4106 -3097
  20. package/dist/index.js.map +1 -7
  21. package/dist/index.min.cjs +171 -0
  22. package/dist/index.min.cjs.map +1 -0
  23. package/dist/index.min.js +2915 -0
  24. package/dist/index.min.js.map +1 -0
  25. package/dist/index.umd.d.ts +7 -0
  26. package/dist/renderer/ButtonRender.d.ts +2 -2
  27. package/dist/renderer/CheckboxRender.d.ts +2 -2
  28. package/dist/renderer/CustomRender.d.ts +2 -2
  29. package/dist/renderer/DateRender.d.ts +2 -2
  30. package/dist/renderer/DropdownRender.d.ts +2 -2
  31. package/dist/renderer/FileRender.d.ts +2 -2
  32. package/dist/renderer/GridRender.d.ts +2 -2
  33. package/dist/renderer/GroupRender.d.ts +2 -2
  34. package/dist/renderer/HiddenRender.d.ts +2 -2
  35. package/dist/renderer/NumberRender.d.ts +2 -2
  36. package/dist/renderer/PasswordRender.d.ts +2 -2
  37. package/dist/renderer/RadioRender.d.ts +2 -2
  38. package/dist/renderer/RangeRender.d.ts +2 -2
  39. package/dist/renderer/Render.d.ts +2 -2
  40. package/dist/renderer/TabRender.d.ts +2 -2
  41. package/dist/renderer/TextAreaRender.d.ts +2 -2
  42. package/dist/renderer/TextRender.d.ts +2 -2
  43. package/dist/types/FormField.d.ts +18 -13
  44. package/dist/types/FormOptions.d.ts +1 -1
  45. package/dist/types/style.d.ts +3 -0
  46. package/dist/util/renderFactory.d.ts +1 -1
  47. package/dist/util/styleUtils.d.ts +10 -12
  48. package/dist/util/utils.d.ts +1 -1
  49. package/package.json +129 -140
  50. package/style/abstracts/_index.scss +2 -0
  51. package/style/abstracts/_mixins.scss +22 -0
  52. package/style/abstracts/_variables.scss +1 -0
  53. package/style/base/_base.scss +68 -0
  54. package/style/base/_index.scss +1 -0
  55. package/style/components/_button.scss +16 -0
  56. package/style/components/_field-container.scss +42 -0
  57. package/style/components/_field-group.scss +16 -0
  58. package/style/components/_file-list.scss +59 -0
  59. package/style/components/_form-field.scss +48 -0
  60. package/style/components/_form-group.scss +94 -0
  61. package/style/components/_grid-field.scss +120 -0
  62. package/style/components/_icon.scss +26 -0
  63. package/style/components/_index.scss +11 -0
  64. package/style/components/_label.scss +65 -0
  65. package/style/components/_row.scss +88 -0
  66. package/style/components/_tab.scss +69 -0
  67. package/{dist/index.css → style/daracl.form.css} +213 -184
  68. package/style/daracl.form.css.map +1 -0
  69. package/style/daracl.form.min.css +2 -0
  70. package/style/daracl.form.min.css.map +1 -0
  71. package/style/daracl.form.scss +53 -691
  72. package/style/themes/_common.scss +18 -0
  73. package/style/themes/_dark.scss +32 -0
  74. package/style/themes/_index.scss +14 -0
  75. package/style/themes/_light.scss +26 -0
  76. package/style/themes/_mixin.scss +6 -0
  77. package/dist/commonVender.d.ts +0 -1
  78. package/dist/daracl.form.js +0 -5720
  79. package/dist/daracl.form.js.map +0 -1
  80. package/dist/daracl.form.min.js +0 -7
  81. package/dist/daracl.form.min.js.LICENSE.txt +0 -5
  82. package/dist/daracl.form.min.js.map +0 -1
  83. package/dist/daracl.vender.min.css +0 -5
  84. package/dist/daracl.vender.min.js +0 -2
  85. package/dist/daracl.vender.min.js.LICENSE.txt +0 -3
  86. package/dist/index.css.map +0 -7
  87. package/dist/indexVender.d.ts +0 -6
  88. package/dist/main.css +0 -6
  89. package/dist/main.css.map +0 -1
  90. package/src/index.ts +0 -5
  91. /package/dist/util/{Lanauage.d.ts → Language.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.min.js","sources":["../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"],"sourcesContent":["import { FormField } from \"@t/FormField\";\r\nimport { isArray as coreIsArray} from \"@daracl/core\";\r\n\r\nconst xssFilter = {\r\n \"&\": \"&amp;\",\r\n \"<\": \"&lt;\",\r\n \">\": \"&gt;\",\r\n '\"': \"&quot;\",\r\n \"'\": \"&#39;\",\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 df-empty-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\n console.log(\"rowIdx : \", rowIdx);\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 `<span class=\"df-label-text\">${field.label ?? \"\"}</span> ${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 const fields = this.formElement.querySelectorAll<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\".df-field input, \" + \".df-field textarea, \" + \".df-field select\");\n\n if (mode == \"view\") {\n fields.forEach((field) => {\n if (field instanceof HTMLInputElement) {\n field.readOnly = true;\n }\n\n if (field instanceof HTMLTextAreaElement) {\n field.readOnly = true;\n }\n });\n } else {\n fields.forEach((field) => {\n if (field instanceof HTMLInputElement) {\n field.readOnly = false;\n }\n\n if (field instanceof HTMLTextAreaElement) {\n field.readOnly = false;\n }\n });\n }\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"],"names":["xssFilter","replaceXss","inputText","returnText","key","hasOwnProp","obj","isBlank","value","isUndefined","isFunction","isString","isNumber","isArray","coreIsArray","isEmpty","isTabType","field","isGridType","replaceXssField","getXssFieldName","ignoreValueField","getHashCode","str","hash","i","tmpChar","isHiddenField","templateToElement","htmlTemplate","template","isPlainObject","proto","isObject","isDate","merge","reval","argLen","cloneDeep","dst","src","cloneObjectDeep","cloneArrayDeep","val","isObj","newVal","Render","form","rowElement","_a","utils.isUndefined","ele","element","classNames","utils.replaceXss","style","e","rederInfo","fieldValue","changeInfo","valuesItem","valueKey","changeVal","utils.isString","utils.isArray","desc","descEle","fieldEle","parser","id","flag","label","replaceFlag","resultValue","match","regexp","regexpValidator","result","regexpType","validator","diffFieldName","diffField","utils.isEmpty","numberValidator","numValue","utils.isBlank","RULES","utils.isNumber","rule","isMinimum","isMaximum","minRule","minExclusive","maxRule","maxExclusive","invalidMessage","validResult","helpMessageElement","message","Language","msgHtml","item","resetRowElementStyleClass","inputEvent","renderInfo","customChangeEventCall","numberInputEvent","dropdownChangeEvent","NumberRender","daraForm","fieldContainerElement","changeCheckFlag","stringValidator","valueLength","isMinNumber","isMaxNumber","TextAreaRender","rows","DropdownRender","initDefaultValue","initDefaultValueFlag","_b","itemValue","_c","_e","_d","items","currentValue","labelKey","attr","TextRender","resolveFieldStyle","formOptions","beforeField","isLabelHide","fieldStyle","orientationClassName","defaultLabelWidth","defaultValueWidth","position","width","positionArr","FIELD_POSITION_STYLE","_f","_g","labelWidth","_h","labelWidthValue","valueWidth","_i","spaceReplace","orientation","CheckboxRender","templates","fieldName","checkVal","OrientationMap","checkboxes","checkValue","checkEle","checkElement","valueArr","elements","RadioRender","radioVal","radioEle","PasswordRender","fileValidator","fileList","FileRender","files","file","addFlag","newFiles","fileItem","newFileInfo","initFlag","fileListElement","fileTemplateHtml","evt","fileItemElement","attrSeq","seq","idx","v","removeIdx","removeItem","CustomRender","fieldTemplate","GroupRender","addContainer","HiddenRender","ButtonRender","RangeRender","localeMessage","Language$2","lang","messageKey","mode","Lanauage","EXPRESSIONS_FORMAT","MAX_CHAR_LENGTH","DEFAULT_FORMAT","DAY_STYLE_CLASS","DateViewMode","DateViewMode2","format","date","format2","len","j","expressionsFunction$1","leftPad","getH","getMeridiem","hour","isUpper","isShort","m","dateStr","dateInfo","startIdx","expInfo","expressionsFunction","matchFind","digitsCheck","word","closestElement","el","currentEl","DaraDate","dt","num","format$1","DEFAULT_OPTIONS","hiddenElement","daraDatetimeIdx","_DateTimePicker","selector","options","selectorElement","viewDate","datetimeElement","weekStartDay","day","dateFormat","minDate","maxDate","isRTL","_a2","targetEle","mmDD","initDate","isNumeric","hh","hourInputEle","hourRangeEle","targetElement","addVal","leftPadClamp","mm","minuteInputEle","minuteRangeEle","moveMode","docSize","getDocSize","rect","scrollTop","scrollLeft","elementHeight","targetElementHeight","left","top","formatValue","showMonthAfterYear","datetimeTemplate","beforeChangeDatepickerCheck","currentYear","startYear","beforeDrawDateFlag","beforeDrawDateFn","calHTML","year","addStylceClass","tooltip","yearEle","numYear","monthElements","monthEle","month","monthFirstDate","currentMonth","dateItem","dateItemFormat","disabled","dateItemMonth","yearMonth","DateTimePicker","DateRender","dateOnSelectEvent","TabRender","tabItem","tabId","tabPanel","formTemplate","firstFlag","childField","tabTemplate","tabBodyTemplate","tabElement","utils.templateToElement","tabBodyElement","tabFormOptions","DaraForm","allTabValue","useTypeValue","childFieldValue","tabChildValue","firstItem","$$idx","GridRender","gridFormOptions","theadTemplate","colgroupTemplate","addBtnTemplate","valueItem","rowTemplate","parentName","addColumns","columnField","utils.merge","utils.getXssFieldName","addRowElement","rowIdx","removeFieldArrs","rowIdxNum","children","childrenLength","rowColumns","rowInfo","childIdx","utils.isPlainObject","FIELD_PREFIX","RENDER_TEMPLATE","messageFormat","messageFormats","constraint","reMessage","msgParam","msgFormat","Language$1","getRenderer","render","FieldInfoMap","utils.getHashCode","utils.replaceXssField","fieldKey","fieldInfo","formValue","validationCheck","addFormValue","resolve","reject","fieldValid","addFieldFormData","parent","condFlag","condField","focusFlag","formData","utils.ignoreValueField","uploadFiles","utils.isTabType","uploadFile","FormTemplate","daraform","formElement","fieldInfoMap","labelHideFlag","parentFieldStyle","isEmptyLabel","childFieldStyle","labelTemplate","groupElement","requiredTemplate","tooltipTemplate","utils.isHiddenField","initFormOptions","setDefaultOptions","allInstance","SEQ_ATTR_KEY","DARA_FORM_SEQ","_DaraForm","fields","fieldMap","isValid","values","dataClear","removeFields","removeField","autoFocusFlag","utils.isGridType","listener","l","utils.hasOwnProp","parentField","activeFlag","firstTabItem","rowSelector","containerElement","keys","event"],"mappings":"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","x_google_ignoreList":[23]}