@daracl/form 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/193.daracl.form.min.js +7 -0
  2. package/dist/193.daracl.form.min.js.LICENSE.txt +5 -0
  3. package/dist/193.daracl.form.min.js.map +1 -0
  4. package/dist/dara.datetimepicker.js +304 -0
  5. package/dist/dara.datetimepicker.js.LICENSE.txt +5 -0
  6. package/dist/dara.datetimepicker.js.map +1 -0
  7. package/dist/daracl.form.js +3214 -5940
  8. package/dist/daracl.form.js.map +1 -1
  9. package/dist/daracl.form.min.css +2 -2
  10. package/dist/daracl.form.min.css.map +1 -1
  11. package/dist/daracl.form.min.js +2 -2
  12. package/dist/daracl.form.min.js.LICENSE.txt +1 -1
  13. package/dist/daracl.form.min.js.map +1 -1
  14. package/dist/daracl.vender.js +2822 -0
  15. package/dist/daracl.vender.js.LICENSE.txt +5 -0
  16. package/dist/daracl.vender.js.map +1 -0
  17. package/dist/index.cjs +5 -1
  18. package/dist/index.cjs.map +2 -2
  19. package/dist/index.css.map +2 -2
  20. package/dist/index.html +1 -1
  21. package/dist/index.js +5 -1
  22. package/dist/index.js.map +2 -2
  23. package/dist/util/utils.d.ts +1 -1
  24. package/dist/vendors-node_modules_daracl_datetimepicker_dist_index_js.daracl.form.js +1477 -0
  25. package/dist/vendors-node_modules_daracl_datetimepicker_dist_index_js.daracl.form.js.map +1 -0
  26. package/package.json +11 -7
  27. package/src/DaraForm.ts +431 -0
  28. package/src/FieldInfoMap.ts +356 -0
  29. package/src/FormTemplate.ts +207 -0
  30. package/src/constants.ts +100 -0
  31. package/src/event/renderEvents.ts +41 -0
  32. package/src/index copy.html +591 -0
  33. package/src/index-grid.html +655 -0
  34. package/src/index-tab.html +639 -0
  35. package/src/index.html +483 -0
  36. package/src/renderer/ButtonRender.ts +51 -0
  37. package/src/renderer/CheckboxRender.ts +214 -0
  38. package/src/renderer/CustomRender.ts +100 -0
  39. package/src/renderer/DateRender.ts +104 -0
  40. package/src/renderer/DropdownRender.ts +149 -0
  41. package/src/renderer/FileRender.ts +239 -0
  42. package/src/renderer/GridRender.ts +289 -0
  43. package/src/renderer/GroupRender.ts +47 -0
  44. package/src/renderer/HiddenRender.ts +36 -0
  45. package/src/renderer/NumberRender.ts +68 -0
  46. package/src/renderer/PasswordRender.ts +69 -0
  47. package/src/renderer/RadioRender.ts +191 -0
  48. package/src/renderer/RangeRender.ts +79 -0
  49. package/src/renderer/Render.ts +194 -0
  50. package/src/renderer/TabRender.ts +229 -0
  51. package/src/renderer/TextAreaRender.ts +72 -0
  52. package/src/renderer/TextRender.ts +68 -0
  53. package/src/rule/fileValidator.ts +26 -0
  54. package/src/rule/numberValidator.ts +96 -0
  55. package/src/rule/regexpValidator.ts +45 -0
  56. package/src/rule/stringValidator.ts +64 -0
  57. package/src/rule/validator.ts +49 -0
  58. package/src/types/DataMap.d.ts +17 -0
  59. package/src/types/FormField.d.ts +129 -0
  60. package/src/types/FormOptions.d.ts +91 -0
  61. package/src/types/Message.d.ts +40 -0
  62. package/src/types/ValidResult.d.ts +9 -0
  63. package/src/util/Lanauage.ts +127 -0
  64. package/src/util/renderFactory.ts +26 -0
  65. package/src/util/styleUtils.ts +85 -0
  66. package/src/util/utils.ts +283 -0
  67. package/src/util/validUtils.ts +53 -0
  68. package/style/daracl.form.scss +2 -1
package/src/index.html ADDED
@@ -0,0 +1,483 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <title>Dara Form</title>
7
+ </head>
8
+
9
+ <body>
10
+ <div class="header">
11
+ <div class="form-button">
12
+ <button type="button" onclick="formObj.addItem()">Add</button>
13
+ <button type="button" onclick="formObj.getValue()">getValue</button>
14
+ <button type="button" onclick="formObj.getValuePromise()">getValue(true)</button>
15
+ <button type="button" onclick="formObj.setValue()">setValue()</button>
16
+ <button type="button" onclick="formBuilder.isValidForm()">valid check</button>
17
+ <button type="button" onclick="formBuilder.resetForm()">Reset</button>
18
+ <button type="button" onclick="formBuilder.setFieldItems()">setFieldItems</button>
19
+ </div>
20
+
21
+ <div>
22
+ Theme : <label>Light<input type="radio" name="theme-toggle" value="light" checked="true"></label>
23
+ <label>Dark<input type="radio" name="theme-toggle" value="dark"></label>
24
+ </div>
25
+ </div>
26
+
27
+ <div style="padding: 0px 20px">
28
+ <form id="loginForm" class="login-form"></form>
29
+
30
+ <form id="formArea" class="test-form aaa-test"></form>
31
+
32
+ </div>
33
+ </body>
34
+
35
+ </html>
36
+ <style>
37
+ .form-button {
38
+ text-align: center;
39
+ }
40
+
41
+ :root {
42
+ --bg: #ffffff;
43
+ --bg-color: #070d19;
44
+
45
+ }
46
+
47
+ body.dark {
48
+ --bg: #070d19;
49
+ --bg-color: #ffffff;
50
+
51
+ }
52
+
53
+ body {
54
+ background-color: var(--bg);
55
+ }
56
+
57
+ .header {
58
+ color: var(--bg-color);
59
+ }
60
+ </style>
61
+ <script>
62
+
63
+ const THEME_KEY = "form-theme";
64
+ const theme = localStorage.getItem(THEME_KEY);
65
+
66
+ if (theme) setMainTheme(theme);
67
+
68
+ function setMainTheme(theme, persist = false) {
69
+ const classList = document.body.classList;
70
+
71
+ classList.remove("light", "dark");
72
+
73
+ classList.add(theme);
74
+
75
+ if (persist) {
76
+ localStorage.setItem(THEME_KEY, theme);
77
+ }
78
+ }
79
+
80
+ function load() {
81
+ // theme
82
+ const toggler = document.querySelectorAll('[name="theme-toggle"]');
83
+ const theme = localStorage.getItem(THEME_KEY);
84
+
85
+ if (toggler) {
86
+ if (theme === "dark") {
87
+ document.querySelector('[name="theme-toggle"][value="dark"]').checked = true;
88
+ }
89
+
90
+ toggler.forEach((el) => {
91
+ el.addEventListener("click", (e) => {
92
+ setMainTheme(el.value, true);
93
+ });
94
+ })
95
+ }
96
+ }
97
+ load();
98
+
99
+ var formInfo = {
100
+ message: "This value is not valid",
101
+ //mode: 'vertical',
102
+ //autoFocus: false,
103
+ //useTypeValue: false,
104
+ style: {
105
+ //width: '600px',
106
+ position: 'left-left',
107
+ labelWidth: '3'
108
+
109
+ },
110
+ // form load 이후 호출.
111
+ onMounted: function () {
112
+ console.log(this)
113
+ },
114
+ message: {
115
+ empty: "{name} 필수 입력사항입니다.",
116
+ string: {
117
+ minLength: "{size} 글자 이상 입력해야합니다.",
118
+ maxLength: "{size} 글자 이상 입력할 수 없습니다.",
119
+ },
120
+ number: {
121
+ minimum: "{size} 보다 커야 합니다",
122
+ miximum: "{size} 보다 커야 합니다",
123
+ },
124
+ regexp: {
125
+ email: "이메일이 유효하지 않습니다.",
126
+ url: "URL이 유효하지 않습니다.",
127
+ },
128
+ },
129
+ fields: [
130
+ {
131
+ name: "hiddenMode",
132
+ renderType: "hidden",
133
+ defaultValue: "asdf",
134
+ },
135
+ {
136
+ name: "uname",
137
+ label: "Text",
138
+ renderType: 'text',
139
+ template: '<div id="customElementID">111</div>',
140
+ required: true,
141
+ rule: {
142
+ minLength: 2,
143
+ maxLength: 100,
144
+ },
145
+ onChange: (arg) => {
146
+ console.log(arg);
147
+ },
148
+ renderer: {
149
+ mounted: () => {
150
+ console.log(document.getElementById('customElementID'))
151
+ }
152
+ , getValue() {
153
+ return '21';
154
+ }
155
+ , valid1(field, rowElement) {
156
+ const val = this.getValue();
157
+ return { name: field.name, message: 'custom type not valid' };
158
+ }
159
+ }
160
+ },
161
+ , {
162
+ name: "cmpCredId111",
163
+ label: "Dropdown",
164
+ renderType: "dropdown",
165
+ tooltip: "credentials 넣어주세요.",
166
+ defaultValue: '222',
167
+ required: true,
168
+ listItem: {
169
+ labelField: "credName",
170
+ valueField: "credId",
171
+ list: [{ credId: "11", credName: "credNam11" }, { credId: "22", credName: "credName" }, { credId: "33", credName: "credName33" }],
172
+ },
173
+ description: "drop down 설명",
174
+ onChange: (aaa) => {
175
+ console.log(aaa)
176
+
177
+ if (aaa.newValue == '22') return false;
178
+
179
+ return true;
180
+ }
181
+ },
182
+
183
+
184
+ {
185
+ label: 'Password'
186
+ , orientation: 'vertical'
187
+ , conditional: {
188
+ show: true,
189
+ custom: function () {
190
+
191
+ return true;
192
+ }
193
+ }
194
+ , children: [{
195
+ name: 'upw'
196
+ , label: '비밀번호'
197
+ , style: {
198
+ labelHide: true
199
+ }
200
+ , renderType: 'password'
201
+ , regexpType: 'number-char'
202
+ , rule: {
203
+ minLength: 3
204
+ }
205
+ , different: {
206
+ field: 'uid',
207
+ message: '아이디와 달라야 합니다.'
208
+ }
209
+ }
210
+ , {
211
+ name: 'confirmUpw'
212
+ , label: '확인 비밀번호'
213
+ , style: {
214
+ labelHide: true
215
+ }
216
+ , renderType: 'password'
217
+ , identical: {
218
+ field: 'upw',
219
+ message: '비밀번호가 같아야합니다.'
220
+ }
221
+ }]
222
+ }
223
+
224
+ , {
225
+ name: "birth",
226
+ label: "Date",
227
+ required: true,
228
+ renderType: "date",
229
+ customOptions: {
230
+ mode: 'date'
231
+ }
232
+ },
233
+ {
234
+ name: "sex",
235
+ label: "Radio",
236
+ required: true,
237
+ renderType: "radio",
238
+ listItem: {
239
+ list: [
240
+ { label: "남", value: "Y", selected: true },
241
+ { label: "여", value: "X" },
242
+ ],
243
+ },
244
+ },
245
+ {
246
+ name: "picture",
247
+ label: "File",
248
+ required: true,
249
+ renderType: "file",
250
+ listItem: {
251
+ list: [
252
+ ],
253
+ },
254
+ },
255
+
256
+
257
+ {
258
+ label: "Checkbox",
259
+
260
+ name: "checkbox11",
261
+ required: true,
262
+ renderType: "checkbox",
263
+ defaultValue: '',
264
+ listItem: {
265
+ orientation: "horizontal", // 'vertical , horizontal'
266
+ list: [
267
+ { label: "checkbox value", value: "Y", selected: true }
268
+ , { label: "checkbox value111", value: "Y1" }
269
+ , { label: "checkbox value222", value: "Y2", disabled: true }
270
+ , { label: "checkbox value333", value: "Y3" }
271
+ ],
272
+ },
273
+ onChange: (arg) => {
274
+ console.log(arg);
275
+ },
276
+ }
277
+ , {
278
+ label: "라벨주소",
279
+ name: 'newAddress',
280
+ renderType: 'radio',
281
+ //defaultValue: 'N',
282
+ listItem: {
283
+ orientation: "horizontal", // 'vertical , horizontal'
284
+ list: [
285
+ { label: "추가1", value: "Y", selected: true },
286
+ { label: "추가", value: "N" }
287
+ ],
288
+ }
289
+ , description: `<div><a href="asdf">111111111111111</a></div>`
290
+ , orientation: "horizontal" // 'vertical , horizontal'
291
+ , conditional: {
292
+ show: true,
293
+ custom: function () {
294
+ return true;
295
+ },
296
+ },
297
+ children: [
298
+
299
+ {
300
+ name: "address32",
301
+ label: "주소",
302
+ orientation: 'vertical',
303
+ style: {
304
+ labelHide: false,
305
+ position: 'left',
306
+ labelWidth: '120px',
307
+ },
308
+ required: true,
309
+ rule: {
310
+ minLength: 2,
311
+ maxLength: 100,
312
+ },
313
+ conditional: {
314
+ show: false,
315
+ field: "newAddress",
316
+ eq: "N",
317
+ //custom?: OptionCallback
318
+ }
319
+ },
320
+ {
321
+ name: "address",
322
+ label: "주소2",
323
+ hideLabel: true,
324
+ required: true,
325
+ style: {
326
+ labelHide: false,
327
+ },
328
+ rule: {
329
+ minLength: 2,
330
+ maxLength: 100,
331
+ },
332
+ conditional: {
333
+ show: true,
334
+ custom: function () {
335
+ return true;
336
+ },
337
+ },
338
+ },
339
+ {
340
+ name: "address2",
341
+ label: "주소3",
342
+ style: {
343
+ //width: '200px',
344
+ labelHide: false,
345
+ position: 'left'
346
+ },
347
+ required: true,
348
+ rule: {
349
+ minLength: 2,
350
+ maxLength: 100,
351
+ },
352
+ conditional: {
353
+ show: true,
354
+ field: "newAddress",
355
+ eq: "Y",
356
+ //custom?: OptionCallback
357
+ },
358
+ },
359
+ {
360
+ renderType: "text",
361
+ label: "주소 하위1",
362
+ //childLabelWidth: "",
363
+ orientation: "horizontal", // 'vertical , horizontal, horizontal-row'
364
+ style: {
365
+ labelWidth: "200px",
366
+ labelHide: false
367
+ },
368
+ conditional: {
369
+ show: true,
370
+ custom: function () {
371
+ return true;
372
+ },
373
+ },
374
+ children: [
375
+ {
376
+ name: "address22222",
377
+ label: "주소1",
378
+ labelWidth: "150px",
379
+ },
380
+ {
381
+ name: "address222333322",
382
+ label: "주소2",
383
+ renderType: "text",
384
+ },
385
+ ],
386
+ },
387
+ {
388
+ label: "버튼",
389
+ hideLabel: true,
390
+ renderType: "button",
391
+ onClick: (arg) => {
392
+ console.log(arg);
393
+ },
394
+ },
395
+ ],
396
+ },
397
+
398
+ ],
399
+ };
400
+
401
+
402
+ var rowIdx = 0;
403
+ var formBuilder;
404
+ var formObj = {
405
+ load: () => {
406
+ // formBuilder = loginForm;
407
+ formBuilder = Daracl.form.create(document.getElementById("formArea"), formInfo);
408
+ },
409
+ addItem: () => {
410
+ rowIdx += 1;
411
+ formBuilder.addField({
412
+ name: `addItem${rowIdx}`,
413
+ label: `추가컬럼${rowIdx}`,
414
+ maxLength: 100,
415
+ required: true,
416
+ });
417
+ },
418
+ getValue: () => {
419
+ let formValue = formBuilder.getValue();
420
+ console.log('getValue : ', formValue, JSON.stringify(formValue))
421
+ alert('파일은 콘솔 확인\n' + JSON.stringify(formValue));
422
+ },
423
+ getValuePromise: () => {
424
+ formBuilder
425
+ .getValue(true)
426
+ .then((aa) => {
427
+ console.log(aa);
428
+
429
+ for (let [name, value] of aa.entries()) {
430
+ console.log(`${name} : ${value}`);
431
+ }
432
+
433
+ alert("form data console 확인");
434
+ })
435
+ .catch((e) => {
436
+ alert(e.message);
437
+ });
438
+ },
439
+ setFieldItems: () => {
440
+ formBuilder.setFieldItems("picture", [
441
+ { fileId: "test1", fileName: "aaa.zip" },
442
+ { fileId: "test2", fileName: "bbb.zip" },
443
+ ]);
444
+ formBuilder.setValue({ sex: "X" }, false);
445
+ },
446
+
447
+ setValue: () => {
448
+ formBuilder.setValue(
449
+ {
450
+ "hiddenMode": "asdf",
451
+ "이름222222": "이름222222",
452
+ "tab": {
453
+ "tab1": {
454
+ "tabPicture": [{ fileId: "test1", fileName: "aaa.zip" }],
455
+ "tabPictureRemoveIds": [],
456
+ "grid": [
457
+ { key: 'aaa', value: 'bbb', cre: 'credId' },
458
+ { key: 'key임', value: 'value임', cre: 'credId' }
459
+ ],
460
+ "uname222": "uname222vvvv",
461
+ "uname222333": "uname222333vvvv",
462
+ "child tab": {
463
+ "child-tab1": {
464
+ "child-uname222": "child-uname222 uname222"
465
+ },
466
+ "child-uname2-tab2": {
467
+ "child-uname333": "child-uname2-tab2 uname333"
468
+ }
469
+ }
470
+ },
471
+ "tab2": {
472
+ "uname333": "tab2 uname333 value"
473
+ }
474
+ }
475
+ }, false);
476
+ },
477
+ };
478
+
479
+ formObj.load();
480
+
481
+ window.formBuilder = formBuilder;
482
+ window.formObj = formObj;
483
+ </script>
@@ -0,0 +1,51 @@
1
+ import { FormField } from "@t/FormField";
2
+ import Render from "./Render";
3
+ import DaraForm from "src/DaraForm";
4
+
5
+ export default class ButtonRender extends Render {
6
+ constructor(field: FormField, rowElement: HTMLElement, daraForm: DaraForm) {
7
+ super(daraForm, field, rowElement);
8
+ this.mounted();
9
+ this.setDefaultOption();
10
+ }
11
+
12
+ mounted() {
13
+ this.rowElement.querySelector(`#${this.field.$key}`)?.addEventListener("click", (evt) => {
14
+ if (this.field.onClick) {
15
+ this.field.onClick.call(null, this.field);
16
+ }
17
+ });
18
+ }
19
+
20
+ static isDataRender(): boolean {
21
+ return false;
22
+ }
23
+
24
+ createField() {
25
+ const field = this.field;
26
+
27
+ const fieldContainerElement = this.rowElement.querySelector(".df-field-container") as HTMLElement;
28
+
29
+ fieldContainerElement.innerHTML = `
30
+ <button type="button" id="${field.$key}" class="df-btn">${field.label}</button> ${Render.getDescriptionTemplate(field)}
31
+ `;
32
+ }
33
+
34
+ getValue() {
35
+ return "";
36
+ }
37
+
38
+ setValue(value: any): void {}
39
+
40
+ reset() {
41
+ this.setDisabled(false);
42
+ }
43
+
44
+ getElement() {
45
+ return null;
46
+ }
47
+
48
+ valid(): any {
49
+ return true;
50
+ }
51
+ }