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