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