@daracl/form 0.0.3 → 0.0.5

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 (64) 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 +67 -33
  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/index.cjs +20 -8
  15. package/dist/index.cjs.map +2 -2
  16. package/dist/index.css.map +2 -2
  17. package/dist/index.js +20 -8
  18. package/dist/index.js.map +2 -2
  19. package/dist/util/utils.d.ts +1 -1
  20. package/dist/vendors-node_modules_daracl_datetimepicker_dist_index_js.daracl.form.js +1477 -0
  21. package/dist/vendors-node_modules_daracl_datetimepicker_dist_index_js.daracl.form.js.map +1 -0
  22. package/package.json +11 -8
  23. package/src/DaraForm.ts +431 -0
  24. package/src/FieldInfoMap.ts +356 -0
  25. package/src/FormTemplate.ts +207 -0
  26. package/src/constants.ts +100 -0
  27. package/src/event/renderEvents.ts +41 -0
  28. package/src/index copy.html +591 -0
  29. package/src/index-grid.html +655 -0
  30. package/src/index-tab.html +639 -0
  31. package/src/index.html +483 -0
  32. package/src/renderer/ButtonRender.ts +51 -0
  33. package/src/renderer/CheckboxRender.ts +214 -0
  34. package/src/renderer/CustomRender.ts +100 -0
  35. package/src/renderer/DateRender.ts +103 -0
  36. package/src/renderer/DropdownRender.ts +149 -0
  37. package/src/renderer/FileRender.ts +239 -0
  38. package/src/renderer/GridRender.ts +289 -0
  39. package/src/renderer/GroupRender.ts +47 -0
  40. package/src/renderer/HiddenRender.ts +36 -0
  41. package/src/renderer/NumberRender.ts +68 -0
  42. package/src/renderer/PasswordRender.ts +69 -0
  43. package/src/renderer/RadioRender.ts +191 -0
  44. package/src/renderer/RangeRender.ts +79 -0
  45. package/src/renderer/Render.ts +194 -0
  46. package/src/renderer/TabRender.ts +229 -0
  47. package/src/renderer/TextAreaRender.ts +72 -0
  48. package/src/renderer/TextRender.ts +68 -0
  49. package/src/rule/fileValidator.ts +26 -0
  50. package/src/rule/numberValidator.ts +96 -0
  51. package/src/rule/regexpValidator.ts +45 -0
  52. package/src/rule/stringValidator.ts +64 -0
  53. package/src/rule/validator.ts +49 -0
  54. package/src/types/DataMap.d.ts +17 -0
  55. package/src/types/FormField.d.ts +129 -0
  56. package/src/types/FormOptions.d.ts +91 -0
  57. package/src/types/Message.d.ts +40 -0
  58. package/src/types/ValidResult.d.ts +9 -0
  59. package/src/util/Lanauage.ts +127 -0
  60. package/src/util/renderFactory.ts +26 -0
  61. package/src/util/styleUtils.ts +85 -0
  62. package/src/util/utils.ts +283 -0
  63. package/src/util/validUtils.ts +53 -0
  64. package/style/daracl.form.scss +2 -1
@@ -0,0 +1,655 @@
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="formObj.isValidForm()">valid check</button>
17
+ <button type="button" onclick="formObj.resetForm()">Reset</button>
18
+ <button type="button" onclick="formObj.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 type="module">
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
+ const loginForm = Daracl.form.create(document.getElementById("loginForm"), {
100
+ message: "This value is not valid",
101
+ //mode: 'vertical',
102
+ //autoFocus: false,
103
+ style: {
104
+ //width: '600px',
105
+ position: 'left',
106
+ labelWidth: '3'
107
+
108
+ },
109
+ mode: 'write',
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: "\"uid<div>",
132
+ required: true,
133
+ label: "아이디",
134
+ tooltip: "아이디를 넣어주세요.",
135
+ placeholder: "아이디를 넣어주세요.",
136
+ renderType: "text",
137
+ }
138
+ , {
139
+ name: "password",
140
+ label: "패스워드",
141
+ description: "비밀번호는 대문자 소문자 포함입니다.",
142
+ placeholder: "패스워드를 입력하세요",
143
+ renderType: "password",
144
+ }
145
+ , {
146
+ name: "sex",
147
+ label: "남성/여성",
148
+ renderType: "checkbox",
149
+ listItem: {
150
+ list: [
151
+ { label: "", value: "Y", selected: true },
152
+ ],
153
+ }
154
+ }
155
+ , {
156
+ name: "grid",
157
+ label: "grid",
158
+ renderType: "grid",
159
+ gridOptions: {
160
+ disableAddButton: false,
161
+ disableRemoveButton: false,
162
+ height: '200px',
163
+ }
164
+ , children: [
165
+ {
166
+ name: "key",
167
+ label: "key",
168
+ renderType: "text",
169
+ required: true,
170
+ style: {
171
+ width: '200px'
172
+ },
173
+ rule: {
174
+ minLength: 2,
175
+ maxLength: 100,
176
+ },
177
+ }
178
+ , {
179
+ name: "value",
180
+ label: "value",
181
+ renderType: "text",
182
+ }
183
+ , {
184
+ name: "cre",
185
+ label: "성별",
186
+ required: true,
187
+ renderType: "dropdown",
188
+ listItem: {
189
+ labelField: "credName",
190
+ valueField: "credId",
191
+ list: [{ label: "선택하세요." }, { credId: "credId", credName: "credName" }],
192
+ }
193
+ },
194
+ ],
195
+
196
+ }
197
+ ]
198
+ });
199
+
200
+ var formInfo = {
201
+ message: "This value is not valid",
202
+ //mode: 'vertical',
203
+ //autoFocus: false,
204
+ style: {
205
+ //width: '600px',
206
+ position: 'left-left',
207
+ labelWidth: '3'
208
+
209
+ },
210
+ // form load 이후 호출.
211
+ onMounted: function () {
212
+ console.log(this)
213
+ },
214
+ message: {
215
+ empty: "{name} 필수 입력사항입니다.",
216
+ string: {
217
+ minLength: "{size} 글자 이상 입력해야합니다.",
218
+ maxLength: "{size} 글자 이상 입력할 수 없습니다.",
219
+ },
220
+ number: {
221
+ minimum: "{size} 보다 커야 합니다",
222
+ miximum: "{size} 보다 커야 합니다",
223
+ },
224
+ regexp: {
225
+ email: "이메일이 유효하지 않습니다.",
226
+ url: "URL이 유효하지 않습니다.",
227
+ },
228
+ },
229
+ fields: [
230
+ {
231
+ name: "hiddenMode",
232
+ renderType: "hidden",
233
+ defaultValue: "asdf",
234
+ },
235
+ {
236
+ name: "uid",
237
+ label: "아이디",
238
+ tooltip: "아이디를 넣어주세요.",
239
+ description: "설명설명설명",
240
+ placeholder: "아이디를 넣어주세요.",
241
+ renderType: "tab",
242
+ style: {
243
+ labelHide: false,
244
+ position: 'top-left'
245
+ },
246
+ children: [
247
+ {
248
+ label: 'tab1'
249
+ , description: 'tabl 설명'
250
+ , children: [
251
+ {
252
+ name: "uname222",
253
+ label: "tab-이름",
254
+ style: {
255
+ customClass: 'custom-class',
256
+ position: 'left',
257
+ labelWidth: '120px',
258
+ labelHide: false,
259
+ }
260
+ , rule: {
261
+ minLength: 2,
262
+ maxLength: 100,
263
+ },
264
+ onChange: (arg) => {
265
+ console.log(arg);
266
+ },
267
+ }
268
+ , {
269
+ name: "uname222333",
270
+ label: "tab11-이름",
271
+ tooltip: "아이디를 넣어주세요.",
272
+ rule: {
273
+ minLength: 2,
274
+ maxLength: 100,
275
+ },
276
+ onChange: (arg) => {
277
+ console.log(arg);
278
+ },
279
+ }
280
+
281
+ , {
282
+ label: "child tab",
283
+ renderType: "tab",
284
+ style: {
285
+ //labelHide: true
286
+ position: 'top-center'
287
+ }
288
+ , children: [
289
+ {
290
+ label: 'child-tab1'
291
+ , description: 'tabl 설명'
292
+ , children: [
293
+ {
294
+ name: "child-uname222",
295
+ label: "tab-이름",
296
+ style: {
297
+ customClass: 'custom-class',
298
+ position: 'left',
299
+ labelWidth: '120px',
300
+ labelHide: false,
301
+ }
302
+ }
303
+ ]
304
+ }
305
+ , {
306
+ label: 'child-uname2-tab2'
307
+ , children: [
308
+ {
309
+ name: "child-uname333",
310
+ label: "tab",
311
+
312
+ rule: {
313
+ minLength: 2,
314
+ maxLength: 100,
315
+ },
316
+ onChange: (arg) => {
317
+ console.log(arg);
318
+ },
319
+ }
320
+ ]
321
+ }
322
+ ]
323
+ }
324
+ ]
325
+ }
326
+ , {
327
+ label: 'tab2'
328
+ , children: [
329
+ {
330
+ name: "uname333",
331
+ label: "tab-22222222222222222222222222222222",
332
+ rule: {
333
+ minLength: 2,
334
+ maxLength: 100,
335
+ },
336
+ onChange: (arg) => {
337
+ console.log(arg);
338
+ },
339
+ }
340
+ ]
341
+ }
342
+ ]
343
+ },
344
+ {
345
+ name: "uname",
346
+ label: "이름222222",
347
+ renderType: 'custom',
348
+ template: '<div id="customElementID">111</div>',
349
+ required: true,
350
+ rule: {
351
+ minLength: 2,
352
+ maxLength: 100,
353
+ },
354
+ onChange: (arg) => {
355
+ console.log(arg);
356
+ },
357
+ renderer: {
358
+ mounted: () => {
359
+ console.log(document.getElementById('customElementID'))
360
+ }
361
+ , getValue() {
362
+ return '21';
363
+ }
364
+ , valid(field, rowElement) {
365
+ const val = this.getValue();
366
+ return { name: field.name, message: 'custom type not valid' };
367
+ }
368
+ }
369
+ },
370
+ {
371
+ label: '비밀번호'
372
+ , orientation: 'vertical'
373
+ , conditional: {
374
+ show: true,
375
+ custom: function () {
376
+
377
+ return true;
378
+ }
379
+ }
380
+ , children: [{
381
+ name: 'upw'
382
+ , label: '비밀번호'
383
+ , style: {
384
+ labelHide: true
385
+ }
386
+ , renderType: 'password'
387
+ , regexpType: 'number-char'
388
+ , rule: {
389
+ minLength: 3
390
+ }
391
+ , different: {
392
+ field: 'uid',
393
+ message: '아이디와 달라야 합니다.'
394
+ }
395
+ }
396
+ , {
397
+ name: 'confirmUpw'
398
+ , label: '확인 비밀번호'
399
+ , style: {
400
+ labelHide: true
401
+ }
402
+ , renderType: 'password'
403
+ , identical: {
404
+ field: 'upw',
405
+ message: '비밀번호가 같아야합니다.'
406
+ }
407
+ }]
408
+ }
409
+ , {
410
+ name: "age",
411
+ label: "생년월일",
412
+ required: true,
413
+ renderType: "date",
414
+ customOptions: {
415
+ mode: 'datetime'
416
+ }
417
+ },
418
+ {
419
+ name: "sex",
420
+ label: "성별",
421
+ required: true,
422
+ renderType: "radio",
423
+ listItem: {
424
+ list: [
425
+ { label: "남", value: "Y", selected: true },
426
+ { label: "여", value: "X" },
427
+ ],
428
+ },
429
+ },
430
+ {
431
+ name: "picture",
432
+ label: "사진",
433
+ required: true,
434
+ renderType: "file",
435
+ listItem: {
436
+ list: [
437
+ ],
438
+ },
439
+ },
440
+
441
+ {
442
+ name: "cmpCredId",
443
+ label: "credentials",
444
+ renderType: "dropdown",
445
+ tooltip: "credentials 넣어주세요.",
446
+ required: true,
447
+ listItem: {
448
+ labelField: "credName",
449
+ valueField: "credId",
450
+ list: [{ label: "선택하세요." }, { credId: "credId", credName: "credName" }],
451
+ },
452
+ description: "awefawfeawefawef",
453
+ },
454
+ {
455
+ label: "checkbox",
456
+
457
+ name: "checkbox11",
458
+ required: true,
459
+ renderType: "checkbox",
460
+ defaultValue: '',
461
+ listItem: {
462
+ orientation: "horizontal", // 'vertical , horizontal'
463
+ list: [
464
+ { label: "checkbox value", value: "Y", selected: true }
465
+ , { label: "checkbox value111", value: "Y1" }
466
+ , { label: "checkbox value222", value: "Y2", disabled: true }
467
+ , { label: "checkbox value333", value: "Y3" }
468
+ ],
469
+ },
470
+ onChange: (arg) => {
471
+ console.log(arg);
472
+ },
473
+ }
474
+ , {
475
+ label: "라벨주소",
476
+ name: 'newAddress',
477
+ renderType: 'radio',
478
+ //defaultValue: 'N',
479
+ listItem: {
480
+ orientation: "horizontal", // 'vertical , horizontal'
481
+ list: [
482
+ { label: "추가1", value: "Y", selected: true },
483
+ { label: "추가", value: "N" }
484
+ ],
485
+ }
486
+ , description: `<div><a href="asdf">111111111111111</a></div>`
487
+ , orientation: "horizontal" // 'vertical , horizontal'
488
+ , conditional: {
489
+ show: true,
490
+ custom: function () {
491
+ return true;
492
+ },
493
+ },
494
+ children: [
495
+
496
+ {
497
+ name: "address32",
498
+ label: "주소",
499
+ orientation: 'vertical',
500
+ style: {
501
+ labelHide: false,
502
+ position: 'left',
503
+ labelWidth: '120px',
504
+ },
505
+ required: true,
506
+ rule: {
507
+ minLength: 2,
508
+ maxLength: 100,
509
+ },
510
+ conditional: {
511
+ show: false,
512
+ field: "newAddress",
513
+ eq: "N",
514
+ //custom?: OptionCallback
515
+ }
516
+ },
517
+ {
518
+ name: "address",
519
+ label: "주소2",
520
+ hideLabel: true,
521
+ required: true,
522
+ style: {
523
+ labelHide: false,
524
+ },
525
+ rule: {
526
+ minLength: 2,
527
+ maxLength: 100,
528
+ },
529
+ conditional: {
530
+ show: true,
531
+ custom: function () {
532
+ return true;
533
+ },
534
+ },
535
+ },
536
+ {
537
+ name: "address2",
538
+ label: "주소3",
539
+ style: {
540
+ //width: '200px',
541
+ labelHide: false,
542
+ position: 'left'
543
+ },
544
+ required: true,
545
+ rule: {
546
+ minLength: 2,
547
+ maxLength: 100,
548
+ },
549
+ conditional: {
550
+ show: true,
551
+ field: "newAddress",
552
+ eq: "Y",
553
+ //custom?: OptionCallback
554
+ },
555
+ },
556
+ {
557
+ renderType: "text",
558
+ label: "주소 하위1",
559
+ //childLabelWidth: "",
560
+ orientation: "horizontal", // 'vertical , horizontal, horizontal-row'
561
+ style: {
562
+ labelWidth: "200px",
563
+ labelHide: false
564
+ },
565
+ conditional: {
566
+ show: true,
567
+ custom: function () {
568
+ return true;
569
+ },
570
+ },
571
+ children: [
572
+ {
573
+ name: "address22222",
574
+ label: "주소1",
575
+ labelWidth: "150px",
576
+ },
577
+ {
578
+ name: "address222333322",
579
+ label: "주소2",
580
+ renderType: "text",
581
+ },
582
+ ],
583
+ },
584
+ {
585
+ label: "버튼",
586
+ hideLabel: true,
587
+ renderType: "button",
588
+ onClick: (arg) => {
589
+ console.log(arg);
590
+ },
591
+ },
592
+ ],
593
+ },
594
+ ],
595
+ };
596
+
597
+ var rowIdx = 0;
598
+ var formBuilder;
599
+ var formObj = {
600
+ load: () => {
601
+ formBuilder = loginForm;
602
+ //formBuilder = Daracl.form.create("#formArea", formInfo);
603
+ },
604
+ addItem: () => {
605
+ rowIdx += 1;
606
+ formBuilder.addField({
607
+ name: `addItem${rowIdx}`,
608
+ label: `추가컬럼${rowIdx}`,
609
+ maxLength: 100,
610
+ required: true,
611
+ });
612
+ },
613
+ getValue: () => {
614
+ alert(JSON.stringify(loginForm.getValue()));
615
+ },
616
+ getValuePromise: () => {
617
+ formBuilder
618
+ .getFormDataValue(true)
619
+ .then((aa) => {
620
+ console.log(aa);
621
+
622
+ for (let [name, value] of aa.entries()) {
623
+ console.log(`${name} : ${value}`);
624
+ }
625
+
626
+ alert("form data console 확인");
627
+ })
628
+ .catch((e) => {
629
+ alert(e.message);
630
+ });
631
+ },
632
+ setFieldItems: () => {
633
+ formBuilder.setFieldItems("picture", [
634
+ { fileId: "test1", fileName: "aaa.zip" },
635
+ { fileId: "test2", fileName: "bbb.zip" },
636
+ ]);
637
+ formBuilder.setValue({ sex: "X" }, false);
638
+ },
639
+
640
+ setValue: () => {
641
+ formBuilder.setValue({
642
+ grid: [
643
+ { key: 'aaa', value: 'bbb', cre: 'credId' },
644
+ { key: 'key임', value: 'value임', cre: 'credId' }
645
+ ]
646
+ }, false);
647
+ },
648
+ };
649
+
650
+ formObj.load();
651
+
652
+ window.formBuilder = formBuilder;
653
+ window.formObj = formObj;
654
+ window.loginForm = loginForm;
655
+ </script>