@daracl/form 0.0.20 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -18
- package/dist/daracl.form.css +308 -159
- package/dist/daracl.form.min.css +1 -10
- package/dist/daracl.form.min.umd.js +36 -41
- package/dist/daracl.form.min.umd.js.map +1 -1
- package/dist/daracl.form.umd.js +221 -226
- package/dist/daracl.form.umd.js.map +1 -1
- package/dist/defaultOption.d.ts +3 -0
- package/dist/index.cjs +104 -1537
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +58 -1491
- package/dist/index.js.map +1 -1
- package/dist/index.min.cjs +33 -98
- package/dist/index.min.cjs.map +1 -1
- package/dist/index.min.js +471 -1384
- package/dist/index.min.js.map +1 -1
- package/dist/index.umd.d.ts +1 -0
- package/dist/util/utils.d.ts +8 -30
- package/package.json +37 -49
- package/style/base/_base.scss +7 -6
- package/style/components/_button.scss +5 -4
- package/style/components/_field-container.scss +4 -3
- package/style/components/_field-group.scss +1 -1
- package/style/components/_file-list.scss +3 -2
- package/style/components/_form-field.scss +10 -4
- package/style/components/_form-group.scss +8 -7
- package/style/components/_grid-field.scss +12 -11
- package/style/components/_icon.scss +2 -1
- package/style/components/_label.scss +9 -8
- package/style/components/_tab.scss +8 -7
- package/style/daracl.form.scss +17 -31
- package/style/themes/_common.scss +0 -18
- package/style/themes/_dark.scss +0 -32
- package/style/themes/_index.scss +0 -14
- package/style/themes/_light.scss +0 -26
- package/style/themes/_mixin.scss +0 -6
package/dist/index.min.js.map
CHANGED
|
@@ -1 +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 \"&\": \"&\",\r\n \"<\": \"<\",\r\n \">\": \">\",\r\n '\"': \""\",\r\n \"'\": \"'\",\r\n} as any;\r\n\r\nexport const replaceXss = (inputText: string): string => {\r\n let returnText = inputText;\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(key, xssFilter[key]);\r\n });\r\n }\r\n return returnText;\r\n};\r\n\r\nexport const hasOwnProp = (obj: any, key: string): boolean => {\r\n return obj.hasOwnProperty(key);\r\n};\r\n\r\nexport const unReplace = (inputText: string): string => {\r\n let returnText = inputText;\r\n\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(xssFilter[key], key);\r\n });\r\n }\r\n return returnText;\r\n};\r\n\r\nexport const unFieldName = (fieldName: string): string => {\r\n if (fieldName) {\r\n return unReplace(fieldName).replaceAll('\"', '\\\\\"');\r\n }\r\n return \"\";\r\n};\r\nexport const isBlank = (value: any): boolean => {\r\n if (value === null) return true;\r\n if (value === \"\") return true;\r\n if (typeof value === \"undefined\") return true;\r\n if (typeof value === \"string\" && (value === \"\" || value.replace(/\\s/g, \"\") === \"\")) return true;\r\n\r\n return false;\r\n};\r\n\r\nexport const isUndefined = (value: any): value is undefined => {\r\n return typeof value === \"undefined\";\r\n};\r\n\r\nexport const isFunction = (value: any): boolean => {\r\n return typeof value === \"function\";\r\n};\r\n\r\nexport const isString = (value: any): value is string => {\r\n return typeof value === \"string\";\r\n};\r\nexport const isNumber = (value: any): value is number => {\r\n if (isBlank(value)) {\r\n return false;\r\n }\r\n value = +value;\r\n return !isNaN(value);\r\n};\r\n\r\nexport const isArray = (value: any): value is Array<any> => {\r\n return coreIsArray(value);\r\n};\r\n\r\n/**\r\n * 값있는지 여부 체크.\r\n *\r\n * @param {*} value\r\n * @returns {boolean}\r\n */\r\nexport const isEmpty = (value: any): boolean => isUndefined(value) || value == null; //_isEmpty(value);\r\n\r\n/**\r\n * tab render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} tab type 인지 여부\r\n */\r\nexport const isTabType = (field: FormField): boolean => {\r\n return field && field.renderType === \"tab\";\r\n};\r\n/**\r\n * grid render type check\r\n *\r\n * @param {FormField} field\r\n * @returns {boolean} grid type 인지 여부\r\n */\r\nexport const isGridType = (field: FormField): boolean => {\r\n return field && field.renderType === \"grid\";\r\n};\r\nexport const replaceXssField = (field: FormField): FormField => {\r\n field.$xssName = getXssFieldName(field);\r\n\r\n field.label = replaceXss(field.label);\r\n return field;\r\n};\r\n\r\n/**\r\n * 값을 무시하는 필드\r\n *\r\n * @param field formField\r\n * @returns\r\n */\r\nexport const ignoreValueField = (field: FormField): boolean => {\r\n return isGridType(field.$parent) || isTabType(field.$parent);\r\n};\r\n\r\n/**\r\n * grid field name xss repalce\r\n *\r\n * @param {FormField} field\r\n * @returns {string} replace 된 field name\r\n */\r\nexport const getXssFieldName = (field: FormField): string => {\r\n if (isUndefined(field.$xssName)) {\r\n let returnText = field.name;\r\n if (returnText) {\r\n Object.keys(xssFilter).forEach((key) => {\r\n returnText = returnText.replaceAll(key, \"_\");\r\n });\r\n }\r\n\r\n return \"df_\" + returnText;\r\n }\r\n\r\n return field.$xssName;\r\n};\r\n\r\nexport const getHashCode = (str: string) => {\r\n let hash = 0;\r\n if (str.length == 0) return hash;\r\n for (let i = 0; i < str.length; i++) {\r\n let tmpChar = str.charCodeAt(i);\r\n hash = (hash << 5) - hash + tmpChar;\r\n hash = hash & hash;\r\n }\r\n return String(hash).replaceAll(/-/g, \"_\");\r\n};\r\n\r\nexport const isHiddenField = (field: FormField): boolean => {\r\n if (field.renderType === \"hidden\") {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const templateToElement = (htmlTemplate: string): Element | null => {\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = htmlTemplate;\r\n return template.content.firstElementChild;\r\n};\r\n\r\nexport function isPlainObject(obj: any) {\r\n // 객체가 아닌 경우 또는 null인 경우 false 반환\r\n if (typeof obj !== \"object\" || obj === null) {\r\n return false;\r\n }\r\n\r\n // 프로토타입 체인을 따라 Object 생성자를 찾음\r\n let proto = obj;\r\n while (Object.getPrototypeOf(proto) !== null) {\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n\r\n // Object 생성자의 prototype과 같으면 Plain Object로 판단\r\n return Object.getPrototypeOf(obj) === proto;\r\n}\r\n\r\nfunction isObject(value: any) {\r\n return typeof value === \"object\" && value !== null && !isArray(value);\r\n}\r\n\r\nfunction isDate(value: any) {\r\n return value instanceof Date && !isNaN(value.valueOf());\r\n}\r\n\r\n/**\r\n * object merge\r\n * \r\n * @example\r\n ```\r\n merge({},{aaa:'bbb',ccc:'ddd'},{bbb:'bbb','aaa':'aaa'})) -> {\"aaa\": \"aaa\", \"bbb\": \"bbb\", \"ccc\": \"ddd\"}\r\n ```\r\n * @param {...any[]} value\r\n * @returns {object}\r\n */\r\nexport const merge = (...value: any[]): any => {\r\n let reval = value[0];\r\n\r\n if (!isPlainObject(reval) || isEmpty(reval)) {\r\n return reval;\r\n }\r\n\r\n let i = 1;\r\n if (Object.keys(reval).length > 0) {\r\n i = 0;\r\n reval = isArray(reval) ? [] : {};\r\n }\r\n const argLen = value.length;\r\n for (; i < argLen; i += 1) {\r\n cloneDeep(reval, value[i]);\r\n }\r\n\r\n return reval;\r\n};\r\n\r\nfunction trim(s: string): string {\r\n return s.replace(/^\\s+|\\s+$/g, \"\");\r\n}\r\n\r\nfunction cloneDeep(dst: any, src: any): any {\r\n if (isObject(src)) {\r\n return cloneObjectDeep(dst, src);\r\n }\r\n\r\n if (isArray(src)) {\r\n return cloneArrayDeep(dst, src);\r\n }\r\n\r\n if (isDate(src)) {\r\n return new src.constructor(src);\r\n }\r\n return src;\r\n}\r\n\r\n/*eslint no-param-reassign: \"error\"*/\r\nfunction cloneObjectDeep(dst: any, src: any): object {\r\n if (isFunction(src)) {\r\n return src;\r\n }\r\n\r\n for (const key of Object.keys(src)) {\r\n const val = (src as any)[key];\r\n\r\n if (isUndefined(val)) {\r\n continue;\r\n }\r\n\r\n if (val === null) {\r\n dst[key] = val;\r\n } else if (isFunction(val)) {\r\n dst[key] = val;\r\n } else if (isEmpty(dst[key])) {\r\n dst[key] = cloneDeep(isArray(val) ? [] : {}, val);\r\n } else if (!isObject(val)) {\r\n dst[key] = val;\r\n } else {\r\n cloneDeep(dst[key], val);\r\n }\r\n }\r\n return dst;\r\n}\r\n\r\nfunction cloneArrayDeep(dst: any, src: any[]) {\r\n const isObj = isPlainObject(dst);\r\n\r\n for (let i = 0; i < src.length; i += 1) {\r\n const val = src[i];\r\n let newVal;\r\n\r\n if (val == null) {\r\n newVal = val;\r\n } else {\r\n newVal = cloneDeep(isArray(val) ? [] : {}, val);\r\n }\r\n\r\n if (isObj) {\r\n (dst as any)[i] = newVal;\r\n } else {\r\n dst.push(newVal);\r\n }\r\n }\r\n return dst;\r\n}\r\n","import { FormField } from \"@t/FormField\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\n\nexport abstract class Render {\n protected daraForm;\n protected rowElement;\n protected field;\n\n private enableView: boolean = true;\n\n constructor(form: DaraForm, field: FormField, rowElement: HTMLElement) {\n this.daraForm = form;\n this.field = field;\n this.rowElement = rowElement;\n this.createField();\n\n if (field.tooltip) rowElement.querySelector(\".df-tooltip\")?.setAttribute(\"tooltip\", field.tooltip);\n }\n\n public setDefaultInfo() {\n if (utils.isUndefined(this.field.defaultValue)) {\n this.setValue(\"\", false);\n } else {\n this.setValue(this.field.defaultValue, false);\n }\n\n if (!utils.isUndefined(this.field.placeholder)) {\n const ele = this.getElement();\n if (ele instanceof Element) {\n ele.setAttribute(\"placeholder\", this.field.placeholder);\n }\n }\n }\n\n public setDefaultOption() {\n this.setDisabled(this.field.disabled ?? false);\n }\n\n public addChildField(element: Element) {\n this.rowElement.querySelector(\".df-field-container\")?.append(element);\n }\n\n static isDataRender(): boolean {\n return true;\n }\n\n static isChildrenCreate(): boolean {\n return true;\n }\n\n public getForm(): DaraForm {\n return this.daraForm;\n }\n\n public abstract mounted(): void;\n public abstract getValue(): any;\n public abstract setValue(value: any, changeCheckFlag?: boolean): void;\n public abstract reset(): void;\n public abstract getElement(): any;\n public abstract valid(): ValidResult | boolean;\n public abstract createField(): void;\n\n public setValueItems(value: any): void {}\n\n public static getDescriptionTemplate(field: FormField): string {\n const classNames = field.descriptionClass ? utils.replaceXss(field.descriptionClass) : \"\";\n const style = field.descriptionStyle ? 'style=\"' + utils.replaceXss(field.descriptionStyle) + '\"' : \"\";\n\n return field.description ? `<div class=\"df-description ${classNames}\" ${style}>${field.description}</div>` : \"\";\n }\n\n public changeEventCall(field: FormField, e: Event | null, rederInfo: Render, fieldValue: any): boolean | undefined {\n if (field.onChange) {\n let changeInfo: any = {\n field: field,\n evt: e,\n oldValue: field.$value,\n value: fieldValue,\n };\n\n if (field.listItem?.list) {\n let valuesItem = [];\n const valueKey = Render.valuesValueKey(field);\n\n for (let val of field.listItem.list) {\n let changeVal = val[valueKey];\n if (utils.isString(fieldValue)) {\n if (changeVal == fieldValue) {\n valuesItem.push(val);\n break;\n }\n } else if (utils.isArray(fieldValue)) {\n if (fieldValue.includes(changeVal)) {\n valuesItem.push(val);\n }\n }\n }\n\n changeInfo.valueItems = valuesItem;\n }\n\n if (changeInfo.oldValue != changeInfo.value && field.onChange.call(null, changeInfo) === false) {\n rederInfo.setValue(field.$value, false);\n return false;\n }\n\n field.$value = changeInfo.value;\n }\n\n this.daraForm.conditionCheck();\n }\n\n public focus() {\n this.getElement().focus();\n }\n\n public isEnableView() {\n return this.enableView;\n }\n\n public show() {\n this.enableView = true;\n this.rowElement.classList.remove(\"df-hidden\");\n }\n\n public hide() {\n this.enableView = false;\n if (!this.rowElement.classList.contains(\"df-hidden\")) {\n this.rowElement.classList.add(\"df-hidden\");\n }\n }\n\n /**\n * 설명 추가\n *\n * @public\n * @param {string} desc\n */\n public setDescription(desc: string) {\n const descEle = this.rowElement.querySelector(\".df-description\");\n if (descEle) {\n descEle.textContent = desc;\n } else {\n const fieldEle = this.rowElement.querySelector(\".df-field\");\n if (fieldEle) {\n const parser = new DOMParser();\n this.field.description = desc;\n const descEle = parser.parseFromString(Render.getDescriptionTemplate(this.field), \"text/html\").querySelector(\".df-description\");\n\n if (descEle) fieldEle.parentNode?.insertBefore(descEle, fieldEle.nextSibling);\n }\n }\n }\n\n public setActive(id: string): void {\n //console.log(\"parent\");\n }\n\n public setDisabled(flag: boolean) {\n const ele = this.getElement();\n if (ele instanceof HTMLElement) {\n if (flag === false) {\n this.getElement().removeAttribute(\"disabled\");\n } else {\n this.getElement().setAttribute(\"disabled\", true);\n }\n }\n }\n\n public commonValidator() {\n //this.field.diff\n }\n\n public static valuesValueKey(field: FormField): string {\n return field.listItem?.valueField ? field.listItem.valueField : \"value\";\n }\n\n public static valuesLabelKey(field: FormField): string {\n return field.listItem?.labelField ? field.listItem.labelField : \"label\";\n }\n\n public static valuesLabelValue(label: string, val: any) {\n let replaceFlag = false;\n const resultValue = label.replace(/\\{\\{([A-Za-z0-9_.]*)\\}\\}/g, (match, key) => {\n replaceFlag = true;\n return val[key] || \"\";\n });\n\n if (replaceFlag) {\n return resultValue;\n }\n\n return val[label] || \"\";\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\n\r\nconst regexp = {\r\n mobile: /^\\d{3}-\\d{3,4}-\\d{4}$/,\r\n email: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/,\r\n url: /^(?:(?:https?|HTTPS?|ftp|FTP):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-zA-Z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/,\r\n number: /\\d$/,\r\n alpha: /^[a-zA-Z]+$/,\r\n \"alpha-num\": /^[a-zA-Z0-9]+$/,\r\n variable: /^[a-zA-Z0-9_$][a-zA-Z0-9_$]*$/,\r\n \"number-char\": /^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]/,\r\n \"upper-char\": /^(?=.*?[A-Z])(?=.*?[a-z])/,\r\n \"upper-char-special\": /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#?!@$%^&*-])/,\r\n \"upper-char-special-number\": /^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]/,\r\n};\r\n\r\n/**\r\n * 정규식 유효성 체크.\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @param {(ValidResult | undefined)} result\r\n * @returns {ValidResult}\r\n */\r\nexport const regexpValidator = (value: string, field: FormField, result: ValidResult): ValidResult => {\r\n if (!field.$instance.isEnableView()) {\r\n return { name: field.name, constraint: [] };\r\n }\r\n\r\n if (typeof result === \"undefined\") {\r\n result = { name: field.name, constraint: [] };\r\n }\r\n\r\n const regexpType = field.regexpType;\r\n\r\n if (regexpType) {\r\n if (!regexp[regexpType].test(value)) {\r\n result.regexp = regexpType;\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { regexpValidator } from \"./regexpValidator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * validator , regexp 체크 .\r\n *\r\n * @param {string} value field value\r\n * @param {FormField} field field 정보\r\n * @param {ValidResult} result\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const validator = (value: string, field: FormField, result: ValidResult): ValidResult | boolean => {\r\n if (field.validator) {\r\n result.validator = field.validator(field, value);\r\n if (typeof result.validator === \"object\") {\r\n return result;\r\n }\r\n }\r\n\r\n result = regexpValidator(value, field, result);\r\n\r\n if (result.regexp) {\r\n return result;\r\n }\r\n\r\n if (field.different) {\r\n const diffFieldName = field.different.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() == diffField.$instance.getValue()) {\r\n result.message = field.different.message;\r\n return result;\r\n }\r\n }\r\n\r\n if (field.identical) {\r\n const diffFieldName = field.identical.field;\r\n const diffField = field.$instance.getForm().getField(diffFieldName);\r\n\r\n if (!utils.isEmpty(diffField) && field.$instance.getValue() != diffField.$instance.getValue()) {\r\n result.message = field.identical.message;\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport { validator } from \"./validator\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\n/**\r\n * 숫자 유효성 체크\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const numberValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n const numValue = Number(value);\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (!utils.isNumber(value)) {\r\n result.constraint.push(RULES.NAN);\r\n return result;\r\n }\r\n\r\n if (validator(value, field, result) !== true) {\r\n return result;\r\n }\r\n\r\n const rule = field.rule;\r\n if (rule) {\r\n const isMinimum = utils.isNumber(rule.minimum),\r\n isMaximum = utils.isNumber(rule.maximum);\r\n\r\n let minRule = false,\r\n minExclusive = false,\r\n maxRule = false,\r\n maxExclusive = false;\r\n\r\n if (isMinimum) {\r\n if (rule.exclusiveMinimum && numValue <= rule.minimum) {\r\n minExclusive = true;\r\n } else if (numValue < rule.minimum) {\r\n minRule = true;\r\n }\r\n }\r\n\r\n if (isMaximum) {\r\n if (rule.exclusiveMaximum && numValue >= rule.maximum) {\r\n maxExclusive = true;\r\n } else if (numValue > rule.maximum) {\r\n maxRule = true;\r\n }\r\n }\r\n\r\n if (isMinimum && isMaximum && (minRule || minExclusive || maxRule || maxExclusive)) {\r\n if (rule.exclusiveMinimum && rule.exclusiveMaximum && (minExclusive || maxExclusive)) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MINMAX);\r\n } else if (minExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MIN);\r\n } else if (maxExclusive) {\r\n result.constraint.push(RULES.BETWEEN_EXCLUSIVE_MAX);\r\n } else {\r\n result.constraint.push(RULES.BETWEEN);\r\n }\r\n } else {\r\n if (minExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MIN);\r\n }\r\n\r\n if (maxExclusive) {\r\n result.constraint.push(RULES.EXCLUSIVE_MAX);\r\n }\r\n\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX);\r\n }\r\n }\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport Language from \"./Language\";\r\n\r\nexport const invalidMessage = (field: FormField, rowElement: Element, validResult: ValidResult | boolean) => {\r\n if (validResult === true) {\r\n rowElement.classList.remove(\"invalid\");\r\n\r\n if (!rowElement.classList.contains(\"valid\")) {\r\n rowElement.classList.add(\"valid\");\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement) {\r\n helpMessageElement.innerHTML = \"\";\r\n }\r\n\r\n return;\r\n }\r\n\r\n rowElement.classList.remove(\"valid\");\r\n\r\n if (!rowElement.classList.contains(\"invalid\")) {\r\n rowElement.classList.add(\"invalid\");\r\n }\r\n\r\n if (validResult !== false) {\r\n const message: string[] = Language.validMessage(field, validResult);\r\n\r\n if (validResult.message) {\r\n message.push(validResult.message);\r\n }\r\n\r\n const helpMessageElement = rowElement.querySelector(\".df-help-message\");\r\n if (helpMessageElement && message.length > 0) {\r\n const msgHtml: string[] = [];\r\n message.forEach((item) => {\r\n msgHtml.push(`<div>${item}</div>`);\r\n });\r\n helpMessageElement.innerHTML = msgHtml.join(\"\");\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * remove row element style class\r\n *\r\n * @param {Element} rowElement\r\n */\r\nexport const resetRowElementStyleClass = (rowElement: Element) => {\r\n rowElement.classList.remove(\"invalid\");\r\n rowElement.classList.remove(\"valid\");\r\n};\r\n","import { FormField } from \"@t/FormField\";\r\nimport { Render } from \"@/renderer/Render\";\r\nimport * as utils from \"@/util/utils\";\r\n\r\nexport const inputEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"input\", (e: Event) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const numberInputEvent = (field: FormField, element: HTMLInputElement, renderInfo: Render) => {\r\n element.addEventListener(\"keyup\", (e: any) => {\r\n const val = e.target.value;\r\n\r\n if (!utils.isNumber(val)) {\r\n element.value = val.replace(/[^0-9\\.\\-\\+]/g, \"\");\r\n e.preventDefault();\r\n }\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n\r\n /*\r\n element.addEventListener('input', (e: any) => {\r\n customChangeEventCall(field, e, renderInfo);\r\n renderInfo.valid();\r\n })\r\n */\r\n};\r\n\r\nexport const dropdownChangeEvent = (field: FormField, element: Element, renderInfo: Render) => {\r\n element.addEventListener(\"change\", (e: any) => {\r\n customChangeEventCall(field, e, renderInfo, renderInfo.getValue());\r\n renderInfo.valid();\r\n });\r\n};\r\n\r\nexport const customChangeEventCall = (field: FormField, e: Event, renderInfo: Render, value: any) => {\r\n renderInfo.changeEventCall(field, e, renderInfo, value);\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { numberValidator } from \"@/rule/numberValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { numberInputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class NumberRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n numberInputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-number df-help-icon\" />\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = numberValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\nimport * as utils from \"@/util/utils\";\r\nimport { validator } from \"./validator\";\r\n\r\n/**\r\n * string validator\r\n *\r\n * @param {string} value\r\n * @param {FormField} field\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const stringValidator = (value: string, field: FormField): ValidResult | boolean => {\r\n if (!field.$instance.isEnableView()) {\r\n return true;\r\n }\r\n\r\n let result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && utils.isBlank(value)) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n const validResult = validator(value, field, result);\r\n if (validResult !== true) {\r\n return validResult;\r\n }\r\n\r\n const rule = field.rule;\r\n\r\n if (rule) {\r\n const valueLength = value.length;\r\n\r\n const isMinNumber = utils.isNumber(rule.minLength),\r\n isMaxNumber = utils.isNumber(rule.maxLength);\r\n\r\n let minRule = false,\r\n maxRule = false;\r\n if (isMinNumber && valueLength < rule.minLength) {\r\n minRule = true;\r\n }\r\n if (isMaxNumber && valueLength > rule.maxLength) {\r\n maxRule = true;\r\n }\r\n\r\n if (isMinNumber && isMaxNumber && (minRule || maxRule)) {\r\n result.constraint.push(RULES.BETWEEN);\r\n } else {\r\n if (minRule) {\r\n result.constraint.push(RULES.MIN_LENGTH);\r\n }\r\n\r\n if (maxRule) {\r\n result.constraint.push(RULES.MAX_LENGTH);\r\n }\r\n }\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextAreaRender extends Render {\n private element: HTMLTextAreaElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let rows = field.rendererOptions?.rows;\n rows = +rows > 0 ? rows : 3;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <textarea name=\"${field.$xssName}\" rows=\"${rows}\" class=\"df-form-field df-textarea df-help-icon\"></textarea>\n </div> \n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLTextAreaElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { dropdownChangeEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport Language from \"@/util/Language\";\n\nexport default class DropdownRender extends Render {\n private element: HTMLSelectElement;\n private defaultSelected;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n let initDefaultValue = \"\";\n\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = DropdownRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultSelected = itemValue;\n }\n if (itemValue == initDefaultValue) {\n initDefaultValueFlag = true;\n }\n });\n\n if (initDefaultValueFlag) {\n this.defaultSelected = initDefaultValue;\n } else if (!this.defaultSelected) {\n if (field.rendererOptions?.disableDefaultOption === true) {\n this.defaultSelected = this.field.listItem?.list?.length > 0 ? this.field.listItem.list[0][valueKey] || \"\" : \"\";\n }\n }\n\n if (utils.isUndefined(this.defaultSelected)) {\n this.defaultSelected = \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultSelected, false);\n }\n\n mounted() {\n dropdownChangeEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n let template = ` <div class=\"df-field\"><select name=\"${field.$xssName}\" class=\"df-form-field df-dropdown\">\n ${this.dropdownValuesTemplate(field)}\n </select> <i class=\"df-help-icon\"></i></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n fieldContainerElement.innerHTML = template;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLSelectElement;\n }\n\n public setValueItems(items: any): void {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n this.element.innerHTML = this.dropdownValuesTemplate(this.field);\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setValue(this.defaultSelected, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (value.length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n\n public dropdownValuesTemplate(field: FormField) {\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n let template = \"\";\n\n if (field.rendererOptions?.disableDefaultOption !== true) {\n template += `<option value=\"\">${Language.getMessage(\"selection\")}</option>`;\n }\n field.listItem?.list?.forEach((val) => {\n const attr = `${val.selected ? \"selected\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}`;\n if (utils.isUndefined(val[valueKey]) && val.label) {\n template += `<option value=\"${val.value || \"\"}\" ${attr}>${val.label}</option>`;\n } else {\n template += `<option value=\"${val[valueKey]}\" ${attr}>${Render.valuesLabelValue(labelKey, val)}</option>`;\n }\n });\n\n return template;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class TextRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"text\" name=\"${field.$xssName}\" class=\"df-form-field df-text df-help-icon\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLInputElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FieldStyle, FormField } from \"@t/FormField\";\nimport * as utils from \"./utils\";\nimport { FIELD_POSITION_STYLE, ALIGN } from \"@/constants\";\nimport { FormOptions } from \"@t/FormOptions\";\n\n/**\n * field style 처리\n *\n * @param formOptions FormOptions\n * @param field FormField\n * @param beforeField FormField\n * @returns FieldStyle\n */\n\nexport function resolveFieldStyle(formOptions: FormOptions, field: FormField, beforeField?: FormField | null, isLabelHide?: boolean): FieldStyle {\n const fieldStyle = {\n rowStyleClass: orientationClassName(field.orientation),\n fieldClass: \"\",\n fieldStyle: \"\",\n labelClass: \"\",\n labelStyle: \"\",\n labelAlignClass: \"\",\n valueClass: \"\",\n valueStyle: \"\",\n tabAlignClass: \"\",\n };\n\n const defaultLabelWidth = beforeField?.style?.labelWidth ?? formOptions.style.labelWidth ?? \"3\";\n let defaultValueWidth = beforeField?.style?.valueWidth ?? formOptions.style.valueWidth ?? \"9\";\n const position = beforeField?.style?.position ?? formOptions.style.position;\n\n const width = field.style?.width;\n const positionArr = FIELD_POSITION_STYLE[field.style?.position] ?? FIELD_POSITION_STYLE[position] ?? FIELD_POSITION_STYLE.top;\n\n fieldStyle.fieldClass = `${positionArr[0] ? \"df-\" + positionArr[0] : \"\"} ${field.style?.customClass || \"\"}`;\n if (width) {\n if (utils.isNumber(width)) {\n fieldStyle.fieldClass += utils.isNumber(width) ? ` df-col-xs-${width}` : \"\";\n } else {\n fieldStyle.fieldStyle = utils.isNumber(width) ? \"\" : `width:${width};`;\n }\n }\n\n fieldStyle.tabAlignClass = \"df-tab-al-\" + ([\"right\", \"center\"].includes(field.style?.tabAlign) ? field.style.tabAlign : \"left\");\n\n const labelWidth = field.style?.labelWidth || defaultLabelWidth;\n fieldStyle.labelAlignClass = positionArr[1];\n\n if (!isLabelHide && labelWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (utils.isNumber(labelWidth)) {\n const labelWidthValue = +labelWidth;\n defaultValueWidth = 12 - labelWidthValue;\n fieldStyle.labelClass = `df-col-xs-${labelWidthValue}`;\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${defaultValueWidth}`;\n } else {\n fieldStyle.labelStyle = `width:${labelWidth};`;\n }\n }\n\n const valueWidth = field.style?.valueWidth || defaultValueWidth;\n if (isLabelHide && ![\"left\", \"right\"].includes(positionArr[0])) {\n fieldStyle.valueClass = \"df-col-full\";\n } else {\n if (valueWidth && ![\"top\", \"bottom\"].includes(positionArr[0])) {\n if (utils.isNumber(valueWidth)) {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : `df-col-xs-${valueWidth}`;\n } else {\n fieldStyle.valueStyle = `width:${valueWidth};`;\n }\n } else {\n fieldStyle.valueClass = fieldStyle.labelStyle ? \"df-col-full\" : \"\";\n }\n }\n\n fieldStyle.fieldClass = spaceReplace(fieldStyle.fieldClass);\n fieldStyle.labelClass = spaceReplace(fieldStyle.labelClass);\n fieldStyle.valueClass = spaceReplace(fieldStyle.valueClass);\n\n return fieldStyle;\n}\n\nexport function orientationClassName(orientation: string): string {\n return orientation === \"horizontal\" ? \"df-horizontal\" : \"df-vertical\";\n}\n\nfunction spaceReplace(str: string): string {\n return str.replace(/\\s+/g, \" \").trim();\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport * as utils from \"@/util/utils\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class CheckboxRender extends Render {\n private defaultCheckValue: any[] = [];\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = [];\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n if (utils.isArray(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n } else {\n initDefaultValue = [field.defaultValue];\n }\n }\n\n const valueKey = CheckboxRender.valuesValueKey(field);\n\n if (utils.isUndefined(this.field.listItem)) {\n this.setValueItems([{ label: \"\", value: \"Y\" }]);\n }\n\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue.push(itemValue ? itemValue : true);\n }\n if (initDefaultValue.includes(itemValue)) {\n initDefaultValueFlag = true;\n }\n });\n\n this.defaultCheckValue = initDefaultValueFlag ? initDefaultValue : this.defaultCheckValue;\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"checkbox\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(` <div class=\"df-field\"><div class=\"df-field-group\">`);\n field.listItem?.list?.forEach((val) => {\n const checkVal = val[valueKey];\n templates.push(`\n <span class=\"df-field-item ${orientationClassName(field.listItem.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"checkbox\" name=\"${fieldName}\" value=\"${checkVal ? utils.replaceXss(checkVal) : \"\"}\" class=\"df-form-field df-checkbox\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"} />\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `);\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div> ${Render.getDescriptionTemplate(field)}<div class=\"df-help-message\"></div>`);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n if (checkboxes.length > 1) {\n const checkValue: any[] = [];\n checkboxes.forEach((ele) => {\n const checkEle = ele as HTMLInputElement;\n if (checkEle.checked) {\n checkValue.push(checkEle.value);\n }\n });\n return checkValue;\n } else {\n const checkElement = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement;\n\n if (checkElement?.checked) {\n return checkElement.value ? checkElement.value : true;\n }\n\n return checkElement.value ? \"\" : false;\n }\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n let valueArr: any[] = [];\n if (utils.isArray(value)) {\n valueArr = value;\n } else {\n valueArr.push(value);\n }\n\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n (ele as HTMLInputElement).checked = false;\n });\n\n valueArr.forEach((val) => {\n const ele = this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"][value=\"${val}\"]`) as HTMLInputElement;\n if (ele) ele.checked = true;\n });\n }\n\n reset() {\n if (this.field.listItem?.list?.length == 1 && this.defaultCheckValue.length == 1) {\n this.setValue(true, false);\n } else {\n this.setValue(this.defaultCheckValue, false);\n }\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(`[name=\"${this.field.$xssName}\"]`);\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required && utils.isArray(value)) {\n if ((value as any[]).length < 1) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField, ValuesInfo } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { ValidResult } from \"@t/ValidResult\";\nimport { OrientationMap, RULES } from \"@/constants\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport * as utils from \"@/util/utils\";\nimport { orientationClassName } from \"@/util/styleUtils\";\n\nexport default class RadioRender extends Render {\n private defaultCheckValue;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.defaultCheckValue = \"\";\n let initDefaultValue = [] as any;\n if (!utils.isUndefined(field.defaultValue)) {\n initDefaultValue = field.defaultValue;\n }\n\n const valueKey = RadioRender.valuesValueKey(field);\n let initDefaultValueFlag = false;\n this.field.listItem?.list?.forEach((item) => {\n let itemValue = item[valueKey];\n if (item.selected) {\n this.defaultCheckValue = itemValue;\n }\n\n if (initDefaultValue == itemValue) {\n initDefaultValueFlag = true;\n }\n });\n\n // 처리 할것.\n\n if (initDefaultValueFlag) {\n this.defaultCheckValue = initDefaultValue;\n } else if (!this.defaultCheckValue) {\n this.defaultCheckValue = this.field.listItem?.list?.length > 0 ? this.field.listItem?.list[0][valueKey] : \"\";\n }\n\n this.mounted();\n this.setDefaultOption();\n this.setValue(this.defaultCheckValue, false);\n }\n\n public mounted() {\n this.initEvent();\n }\n\n public initEvent() {\n const checkboxes = this.rowElement.querySelectorAll(this.getSelector());\n\n checkboxes.forEach((ele) => {\n ele.addEventListener(\"change\", (e: Event) => {\n customChangeEventCall(this.field, e, this, this.getValue());\n\n this.valid();\n });\n });\n }\n\n public getSelector() {\n return `input[type=\"radio\"][name=\"${this.field.$xssName}\"]`;\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n const templates: string[] = [];\n const fieldName = field.$xssName;\n\n const labelKey = Render.valuesLabelKey(field);\n const valueKey = Render.valuesValueKey(field);\n\n templates.push(`<div class=\"df-field\"><div class=\"df-field-group\">`);\n\n field.listItem?.list?.forEach((val) => {\n const radioVal = val[valueKey];\n\n templates.push(\n `<span class=\"df-field-item ${orientationClassName(field.orientation ?? OrientationMap.horizontal)}\">\n <label>\n <input type=\"radio\" name=\"${fieldName}\" value=\"${radioVal}\" class=\"df-form-field df-radio\" ${val.selected ? \"checked\" : \"\"} ${val.disabled ? \"disabled\" : \"\"}/>\n ${Render.valuesLabelValue(labelKey, val)}\n </label>\n </span>\n `\n );\n });\n templates.push(`<i class=\"df-form-icon df-help-icon\"></i></div></div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `);\n\n fieldContainerElement.innerHTML = templates.join(\"\");\n\n this.initEvent();\n }\n\n public setValueItems(items: any): void {\n const containerEle = this.rowElement.querySelector(\".df-field-container\");\n if (containerEle) {\n if (this.field.listItem) {\n this.field.listItem.list = items;\n } else {\n this.field.listItem = {\n list: items,\n } as ValuesInfo;\n }\n\n this.createField();\n\n if (!utils.isBlank(this.field.$value)) {\n const currentValue = this.field.$value;\n this.field.$value = \"\";\n this.setValue(currentValue);\n }\n }\n }\n\n getValue() {\n return (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]:checked`) as HTMLInputElement)?.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n value = this.field.$value;\n }\n\n this.field.$value = value;\n if (value === true) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = true;\n return;\n }\n\n if (value === false) {\n (this.rowElement.querySelector(`[name=\"${this.field.$xssName}\"]`) as HTMLInputElement).checked = false;\n return;\n }\n\n const elements = this.rowElement.querySelectorAll(this.getSelector());\n\n elements.forEach((ele) => {\n let radioEle = ele as HTMLInputElement;\n if (radioEle.value == value) {\n radioEle.checked = true;\n } else {\n radioEle.checked = false;\n }\n });\n }\n\n reset() {\n this.setValue(this.defaultCheckValue, false);\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): any {\n return this.rowElement.querySelectorAll(this.getSelector());\n }\n\n public focus() {\n const elements = this.getElement();\n\n if (elements && elements.length > 0) {\n this.getElement()[0].focus();\n }\n }\n\n valid(): any {\n const value = this.getValue();\n\n let validResult: ValidResult | boolean = true;\n\n if (this.field.required) {\n if (utils.isBlank(value)) {\n validResult = { name: this.field.name, constraint: [] };\n validResult.constraint.push(RULES.REQUIRED);\n }\n }\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { stringValidator } from \"@/rule/stringValidator\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { inputEvent } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\n\nexport default class PasswordRender extends Render {\n private element: HTMLInputElement;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.mounted();\n this.setDefaultOption();\n this.setDefaultInfo();\n }\n\n mounted() {\n inputEvent(this.field, this.element, this);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <input type=\"password\" name=\"${field.$xssName}\" class=\"df-form-field df-password df-help-icon\" autocomplete=\"off\" />\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n getValue() {\n return this.element.value;\n }\n\n setValue(value: any, changeCheckFlag?: boolean): void {\n if (changeCheckFlag !== false && this.changeEventCall(this.field, null, this, value) === false) {\n this.element.value = this.field.$value;\n return;\n }\n this.field.$value = value;\n this.element.value = value;\n }\n\n reset() {\n this.setDefaultInfo();\n this.setDisabled(false);\n resetRowElementStyleClass(this.rowElement);\n }\n\n getElement(): HTMLElement {\n return this.element;\n }\n\n valid(): any {\n const validResult = stringValidator(this.getValue(), this.field);\n\n invalidMessage(this.field, this.rowElement, validResult);\n\n return validResult;\n }\n}\n","import { FileInfo, FormField } from \"@t/FormField\";\r\nimport { ValidResult } from \"@t/ValidResult\";\r\nimport { RULES } from \"@/constants\";\r\n\r\n/**\r\n * file validator\r\n *\r\n * @param {HTMLInputElement} element\r\n * @param {FormField} field\r\n * @param {FileInfo[]} fileList\r\n * @returns {(ValidResult | boolean)}\r\n */\r\nexport const fileValidator = (element: HTMLInputElement, field: FormField, fileList: FileInfo[]): ValidResult | boolean => {\r\n const result: ValidResult = { name: field.name, constraint: [] };\r\n\r\n if (field.required && fileList.length < 1) {\r\n result.constraint.push(RULES.REQUIRED);\r\n return result;\r\n }\r\n\r\n if (result.constraint.length > 0) {\r\n return result;\r\n }\r\n\r\n return true;\r\n};\r\n","import { FileInfo, FormField } from \"@t/FormField\";\nimport { Render } from \"./Render\";\nimport { resetRowElementStyleClass, invalidMessage } from \"@/util/validUtils\";\nimport { fileValidator } from \"@/rule/fileValidator\";\nimport Language from \"@/util/Language\";\nimport { customChangeEventCall } from \"@/event/renderEvents\";\nimport { DaraForm } from \"@/DaraForm\";\nimport { isArray } from \"@daracl/core\";\n\nexport default class FileRender extends Render {\n private element: HTMLInputElement;\n private removeIds: any[] = [];\n private uploadFiles: any = {};\n private fileList: any[] = [];\n private fileSeq = 0;\n\n constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {\n super(daraForm, field, rowElement);\n\n this.element = rowElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n this.fileList = field.listItem?.list || [];\n this.mounted();\n this.setDefaultOption();\n }\n\n mounted() {\n this.element.addEventListener(\"change\", (e: Event) => {\n const files = (e.target as HTMLInputElement)?.files;\n\n if (files) {\n let fileList = [];\n for (let item of files) {\n fileList.push(item);\n }\n this.addFiles(fileList);\n }\n customChangeEventCall(this.field, e, this, this.fileList);\n this.valid();\n });\n\n this.fileList.forEach((file) => {\n file.$seq = this.fileSeq += 1;\n });\n\n this.setFileList(this.fileList);\n }\n\n createField() {\n const field = this.field;\n\n const fieldContainerElement = this.rowElement.querySelector(\".df-field-container\") as HTMLElement;\n\n fieldContainerElement.innerHTML = `\n <div class=\"df-field\">\n <span class=\"df-file-wrapper\">\n <label class=\"df-file-label\">\n <input type=\"file\" name=\"${field.$xssName}\" class=\"df-form-field df-file\" multiple />\n ${Language.getMessage(\"fileButton\")}\n </label>\n <i class=\"df-form-icon df-help-icon\"></i>\n </span>\n </div>\n ${Render.getDescriptionTemplate(field)}\n <div class=\"df-file-list\"></div>\n <div class=\"df-help-message\"></div>\n `;\n\n this.element = fieldContainerElement.querySelector(`[name=\"${field.$xssName}\"]`) as HTMLInputElement;\n }\n\n addFiles(files: any[]) {\n let addFlag = false;\n\n const newFiles: FileInfo[] = [];\n\n for (let item of files) {\n const fileCheckList = this.fileList.filter((fileItem) => fileItem.fileName == item.name && fileItem.fileSize == item.size && fileItem.lastModified == item.lastModified);\n\n if (fileCheckList.length > 0) continue;\n this.fileSeq += 1;\n this.uploadFiles[this.fileSeq] = item;\n\n let newFileInfo = {\n fileName: item.name,\n $seq: this.fileSeq,\n fileSize: item.size,\n lastModified: item.lastModified,\n } as FileInfo;\n\n newFiles.push(newFileInfo);\n addFlag = true;\n }\n if (addFlag) {\n this.setFileList(newFiles);\n this.fileList.push(...newFiles);\n }\n }\n\n private setFileList(fileList: FileInfo[], initFlag?: boolean | undefined) {\n const fileListElement = this.rowElement.querySelector(\".df-file-list\");\n\n if (fileListElement) {\n if (initFlag === true) {\n fileListElement.innerHTML = \"\";\n }\n\n const fileTemplateHtml: string[] = [];\n\n fileList.forEach((file) => {\n fileTemplateHtml.push(`\n <div class=\"df-file-item\" data-seq=\"${file.$seq}\">\n ${file.fileId ? '<span class=\"df-file-icon df-file-download\"></span>' : '<span class=\"df-file-icon 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]}
|
|
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","../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 type { FormField } from \"@t/FormField\";\r\nimport { isBlank, isNumeric, isPlainObject, isUndefined, objectDeepMerge, xss as replaceXss, unXss as unReplace } from \"@daracl/core/utils\";\r\nexport { isArray, isBlank, isFunction, isString, isUndefined, isPlainObject, isNil as isEmpty, hasProperty as hasOwnProp, getHashCode, templateToElement } from \"@daracl/core/utils\";\r\nexport { replaceXss, unReplace };\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\n// Preserve form numeric coercion (including numeric strings) for existing callers.\r\nexport const isNumber = (value: any): value is number => {\r\n return !isBlank(value) && isNumeric(+value, true);\r\n};\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?.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?.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 returnText = returnText.replace(/[&<>\"']/g, \"_\");\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 isHiddenField = (field: FormField | null | undefined): boolean => field?.renderType === \"hidden\";\r\n\r\n/** Merge form options using the shared core implementation.\r\n * Keep the legacy non-object first argument behavior.\r\n */\r\nexport const merge = (...values: any[]): any => {\r\n if (!isPlainObject(values[0])) return values[0];\r\n // An extra source prevents a form's _excludeKeys field becoming core options.\r\n return objectDeepMerge(...values, {});\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 { FIELD_POSITION_STYLE } from \"@/constants\";\nimport { FieldStyle, FormField } from \"@t/FormField\";\nimport { FormOptions } from \"@t/FormOptions\";\nimport { isNumber } from \"./utils\";\nimport { resolveClassName } from \"@daracl/core/utils\";\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 (isNumber(width)) {\n fieldStyle.fieldClass += isNumber(width) ? ` df-col-xs-${width}` : \"\";\n } else {\n fieldStyle.fieldStyle = 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 (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 (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 = resolveClassName(fieldStyle.fieldClass).join(\" \");\n fieldStyle.labelClass = resolveClassName(fieldStyle.labelClass).join(\" \");\n fieldStyle.valueClass = resolveClassName(fieldStyle.valueClass).join(\" \");\n\n return fieldStyle;\n}\n\nexport function orientationClassName(orientation: string): string {\n return orientation === \"horizontal\" ? \"df-horizontal\" : \"df-vertical\";\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 = String(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/utils\";\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 { 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 = 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 (utils.isFunction(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 for (const childField of this.field.children ?? []) {\n childField.$tabForm?.resetForm();\n }\n }\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 (utils.hasOwnProp(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 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 type { FormField } from \"./types/FormField\";\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 opts.fields = normalizeFields(opts.fields);\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 DEFAULT_OPTIONS.fields = normalizeFields(DEFAULT_OPTIONS.fields);\r\n}\r\n\r\n/** Core merge materializes sparse array holes; empty field slots are not renderers. */\r\nexport function normalizeFields(fields: readonly (FormField | null | undefined)[] | null | undefined): FormField[] {\r\n return (fields ?? []).filter((field): field is FormField => field != null).map((field) => {\r\n if (Array.isArray(field.children)) field.children = normalizeFields(field.children);\r\n return field;\r\n });\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, normalizeFields, 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 if (!normalizeFields([field]).length) return;\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 delete allInstance[this.selector];\n\n for (const key in this) {\n if (utils.hasOwnProp(this, key)) {\n delete this[key];\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 const element = utils.isString(ele) ? document.querySelector(ele) : ele as Element;\n if (!element) return undefined;\n let selector = element.getAttribute(SEQ_ATTR_KEY);\n if (utils.isBlank(selector)) {\n const keys = Object.keys(allInstance);\n if (keys.length > 1) throw new Error(`selector empty : [${selector}]`);\n selector = keys[0];\n }\n return selector ? allInstance[selector] : undefined;\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 = normalizeFields(fields);\n this.formElement.replaceChildren();\n this.formValue = {};\n this.createForm(this.options.fields);\n };\n\n public getFieldInfoMap() {\n return this.fieldInfoMap;\n }\n}\n"],"names":["isNumber","value","isBlank","isNumeric","isTabType","field","isGridType","replaceXssField","getXssFieldName","replaceXss","ignoreValueField","isUndefined","returnText","isHiddenField","merge","values","isPlainObject","objectDeepMerge","Render","form","rowElement","_a","utils.isUndefined","ele","element","classNames","utils.replaceXss","style","e","rederInfo","fieldValue","changeInfo","valuesItem","valueKey","val","changeVal","utils.isString","utils.isArray","desc","descEle","fieldEle","parser","id","flag","label","replaceFlag","resultValue","match","key","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","template","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","resolveClassName","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","isArray","CustomRender","fieldTemplate","GroupRender","addContainer","HiddenRender","ButtonRender","RangeRender","DateRender","dateOnSelectEvent","dt","utils.isFunction","DateTimePicker","TabRender","tabItem","tabId","tabPanel","formTemplate","options","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","utils.hasOwnProp","rowIdx","removeFieldArrs","rowIdxNum","children","childrenLength","rowColumns","rowInfo","childIdx","utils.isPlainObject","FIELD_PREFIX","RENDER_TEMPLATE","localeMessage","lang","messageKey","messageFormat","messageFormats","constraint","reMessage","msgParam","msgFormat","Language$1","getRenderer","render","FieldInfoMap","selector","utils.getHashCode","utils.replaceXssField","fieldKey","fieldInfo","formValue","validationCheck","addFormValue","resolve","reject","fieldValid","reval","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","opts","DEFAULT_OPTIONS","normalizeFields","setDefaultOptions","fields","allInstance","SEQ_ATTR_KEY","DARA_FORM_SEQ","_DaraForm","mode","fieldMap","isValid","dataClear","removeFields","removeField","autoFocusFlag","utils.isGridType","listener","parentField","activeFlag","firstTabItem","rowSelector","containerElement","keys","event"],"mappings":"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"}
|