@visns-studio/visns-components 1.0.0

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.
@@ -0,0 +1,662 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import DatePicker from "react-datepicker";
3
+ import _ from "lodash";
4
+ import ReactQuill from "react-quill";
5
+ import Toggle from "react-toggle";
6
+ import NumberFormat from "react-number-format";
7
+
8
+ import CustomFetch from "./visns-fetch";
9
+ import Select from "./visns-select";
10
+ import VisnsAsyncSelect from "./visns-async-select";
11
+ import MultiSelect from "./visns-multi-select";
12
+ import VisnsAutocomplete from "./visns-autocomplete";
13
+
14
+ import "react-toggle/style.css";
15
+ import "react-quill/dist/quill.snow.css";
16
+ import "react-datepicker/dist/react-datepicker.css";
17
+
18
+ function Field(props) {
19
+ const [options, setOptions] = useState([]);
20
+ const [dataOptions, setDataOptions] = useState([]);
21
+ const [formItemStyle, setFormItemStyle] = useState({});
22
+ const [formItemClass, setFormItemClass] = useState("formItem");
23
+ const {
24
+ settings,
25
+ inputValue,
26
+ inputClass,
27
+ childDropdownCallback,
28
+ onChange,
29
+ onChangeDate,
30
+ onChangeSelect,
31
+ onChangeRicheditor,
32
+ onChangeToggle,
33
+ onChangeNumberFormat,
34
+ autocompleteCallback,
35
+ setFormData,
36
+ } = props;
37
+
38
+ useEffect(() => {
39
+ switch (settings.type) {
40
+ case "hidden":
41
+ setFormItemStyle({
42
+ display: "none",
43
+ });
44
+ break;
45
+ case "dropdown-ajax":
46
+ let filter = {};
47
+
48
+ if (
49
+ settings.hasOwnProperty("where") &&
50
+ settings.where.length > 0
51
+ ) {
52
+ filter = {
53
+ where: settings.where,
54
+ };
55
+ }
56
+
57
+ CustomFetch(settings.url, "POST", filter, function (result) {
58
+ setOptions(result.data);
59
+
60
+ let dataArray = [];
61
+
62
+ result.data.forEach((a) => {
63
+ let _tempObject = a;
64
+
65
+ if (!_.isEmpty(_tempObject)) {
66
+ let modifiedObject = {};
67
+
68
+ Object.keys(_tempObject).forEach(function (c) {
69
+ if (c !== "id" && c !== "label") {
70
+ modifiedObject["data-" + c] =
71
+ _tempObject[c];
72
+ }
73
+ });
74
+
75
+ dataArray.push(modifiedObject);
76
+ }
77
+ });
78
+
79
+ if (dataArray.length > 0) {
80
+ setDataOptions(dataArray);
81
+ }
82
+ });
83
+ break;
84
+ case "multi-dropdown-ajax":
85
+ let multiFilter = {};
86
+
87
+ if (
88
+ settings.hasOwnProperty("where") &&
89
+ settings.where.length > 0
90
+ ) {
91
+ multiFilter = {
92
+ where: settings.where,
93
+ };
94
+ }
95
+
96
+ CustomFetch(
97
+ settings.url,
98
+ "POST",
99
+ multiFilter,
100
+ function (result) {
101
+ setOptions(result.data);
102
+
103
+ let dataArray = [];
104
+
105
+ result.data.forEach((a) => {
106
+ let _tempObject = a;
107
+
108
+ if (!_.isEmpty(_tempObject)) {
109
+ let modifiedObject = {};
110
+
111
+ Object.keys(_tempObject).forEach(function (c) {
112
+ if (c !== "id" && c !== "label") {
113
+ modifiedObject["data-" + c] =
114
+ _tempObject[c];
115
+ }
116
+ });
117
+
118
+ dataArray.push(modifiedObject);
119
+ }
120
+ });
121
+
122
+ if (dataArray.length > 0) {
123
+ setDataOptions(dataArray);
124
+ }
125
+ }
126
+ );
127
+ break;
128
+ default:
129
+ break;
130
+ }
131
+
132
+ // if (settings.hasOwnProperty('hide')) {
133
+ // if (settings.hide === true) {
134
+ // setFormItemStyle({
135
+ // display: 'none',
136
+ // });
137
+ // } else {
138
+ // setFormItemStyle({
139
+ // display: 'block',
140
+ // });
141
+ // }
142
+ // }
143
+
144
+ if (settings.size === "full") {
145
+ setFormItemClass("formItem fwItem");
146
+ }
147
+ }, [settings]);
148
+
149
+ useEffect(() => {
150
+ let filter = {};
151
+
152
+ if (settings.hasOwnProperty("child") && inputValue) {
153
+ let _inputValue = inputValue.hasOwnProperty("value")
154
+ ? inputValue.value
155
+ : inputValue;
156
+
157
+ if (_inputValue > 0) {
158
+ if (Array.isArray(settings.child)) {
159
+ settings.child.forEach((a) => {
160
+ filter = {
161
+ where: [
162
+ {
163
+ id: settings.id,
164
+ value: _inputValue,
165
+ },
166
+ ],
167
+ };
168
+
169
+ CustomFetch(a.url, "POST", filter, function (result) {
170
+ childDropdownCallback({
171
+ id: a.id,
172
+ data: result.data,
173
+ });
174
+ });
175
+ });
176
+ } else {
177
+ filter = {
178
+ where: [
179
+ {
180
+ id: settings.id,
181
+ value: _inputValue,
182
+ },
183
+ ],
184
+ };
185
+
186
+ CustomFetch(
187
+ settings.child.url,
188
+ "POST",
189
+ filter,
190
+ function (result) {
191
+ childDropdownCallback({
192
+ id: settings.child.id,
193
+ data: result.data,
194
+ });
195
+ }
196
+ );
197
+ }
198
+ }
199
+ }
200
+ }, [inputValue, settings]);
201
+
202
+ useEffect(() => {
203
+ if (settings.hasOwnProperty("options")) {
204
+ if (settings.options.length > 0) {
205
+ let dataArray = [];
206
+
207
+ settings.options.forEach((a) => {
208
+ let _tempObject = a;
209
+
210
+ if (!_.isEmpty(_tempObject)) {
211
+ let modifiedObject = {};
212
+
213
+ Object.keys(_tempObject).forEach(function (c) {
214
+ if (c !== "id" && c !== "label") {
215
+ modifiedObject["data-" + c] = _tempObject[c];
216
+ }
217
+ });
218
+
219
+ dataArray.push(modifiedObject);
220
+ }
221
+ });
222
+
223
+ if (dataArray.length > 0) {
224
+ setDataOptions(dataArray);
225
+ }
226
+ }
227
+ }
228
+ }, [settings.options, settings]);
229
+
230
+ return (
231
+ <div className={formItemClass} style={formItemStyle}>
232
+ <label className="fi__label">
233
+ {(() => {
234
+ if (
235
+ settings.type === "address" ||
236
+ settings.type === "date" ||
237
+ settings.type === "datetime" ||
238
+ settings.type === "checkbox" ||
239
+ settings.type === "multi-dropdown" ||
240
+ settings.type === "multi-dropdown-ajax" ||
241
+ settings.type === "async-dropdown-ajax" ||
242
+ settings.type === "richeditor"
243
+ ) {
244
+ return (
245
+ <span className="fi__span prefocus">
246
+ {settings.label}{" "}
247
+ {settings.required === true ? "*" : ""}
248
+ </span>
249
+ );
250
+ }
251
+ })()}
252
+
253
+ {(() => {
254
+ let htmlContainer;
255
+ switch (settings.type) {
256
+ case "text":
257
+ htmlContainer = (
258
+ <input
259
+ type="text"
260
+ data-name={settings.id}
261
+ className={inputClass[settings.id]}
262
+ placeholder=" "
263
+ onChange={onChange}
264
+ value={
265
+ inputValue && inputValue !== "null"
266
+ ? inputValue
267
+ : ""
268
+ }
269
+ />
270
+ );
271
+ break;
272
+ case "json":
273
+ htmlContainer = (
274
+ <input
275
+ type="text"
276
+ data-name={settings.id}
277
+ data-jsonkey={settings.key}
278
+ className={inputClass[settings.id]}
279
+ placeholder=" "
280
+ onChange={onChange}
281
+ value={
282
+ inputValue && inputValue !== "null"
283
+ ? inputValue
284
+ : ""
285
+ }
286
+ />
287
+ );
288
+ break;
289
+ case "password":
290
+ htmlContainer = (
291
+ <input
292
+ type="password"
293
+ data-name={settings.id}
294
+ className={inputClass[settings.id]}
295
+ placeholder=" "
296
+ onChange={onChange}
297
+ value={
298
+ inputValue && inputValue !== "null"
299
+ ? inputValue
300
+ : ""
301
+ }
302
+ />
303
+ );
304
+ break;
305
+ case "phone":
306
+ htmlContainer = (
307
+ <NumberFormat
308
+ data-name={settings.id}
309
+ className={inputClass[settings.id]}
310
+ onValueChange={(values) => {
311
+ onChangeNumberFormat(
312
+ values,
313
+ settings.id
314
+ );
315
+ }}
316
+ format="## #### ####"
317
+ value={
318
+ inputValue && inputValue !== "null"
319
+ ? inputValue
320
+ : ""
321
+ }
322
+ />
323
+ );
324
+ break;
325
+ case "mobile":
326
+ htmlContainer = (
327
+ <NumberFormat
328
+ className={inputClass[settings.id]}
329
+ onValueChange={(values) => {
330
+ onChangeNumberFormat(
331
+ values,
332
+ settings.id
333
+ );
334
+ }}
335
+ format="#### ### ###"
336
+ value={
337
+ inputValue && inputValue !== "null"
338
+ ? inputValue
339
+ : ""
340
+ }
341
+ />
342
+ );
343
+ break;
344
+ case "currency":
345
+ htmlContainer = (
346
+ <NumberFormat
347
+ data-name={settings.id}
348
+ className={inputClass[settings.id]}
349
+ onValueChange={(values) => {
350
+ onChangeNumberFormat(
351
+ values,
352
+ settings.id
353
+ );
354
+ }}
355
+ thousandSeparator={true}
356
+ prefix={"$"}
357
+ value={
358
+ inputValue && inputValue !== "null"
359
+ ? inputValue
360
+ : ""
361
+ }
362
+ />
363
+ );
364
+ break;
365
+ case "textarea":
366
+ htmlContainer = (
367
+ <textarea
368
+ data-name={settings.id}
369
+ className={inputClass[settings.id]}
370
+ onChange={onChange}
371
+ value={
372
+ inputValue && inputValue !== "null"
373
+ ? inputValue
374
+ : ""
375
+ }
376
+ style={{ height: "200px" }}
377
+ ></textarea>
378
+ );
379
+ break;
380
+ case "address":
381
+ htmlContainer = (
382
+ <VisnsAutocomplete
383
+ onSelect={(place) =>
384
+ autocompleteCallback(place)
385
+ }
386
+ field={settings.id}
387
+ setFormData={setFormData}
388
+ api="pk.eyJ1IjoidmlzbnMtc3R1ZGlvIiwiYSI6ImNrbGlraW5vZDBhMDYycHBsdmk5b3ljbGQifQ.ZGUBk0PWac5GahUeVHdTpg"
389
+ inputValue={inputValue}
390
+ country="AU"
391
+ />
392
+ );
393
+ break;
394
+ case "dropdown":
395
+ htmlContainer = (
396
+ <Select
397
+ settings={settings}
398
+ className={inputClass[settings.id]}
399
+ onChange={onChange}
400
+ inputValue={
401
+ inputValue === null ? "" : inputValue
402
+ }
403
+ options={settings.options}
404
+ dataOptions={dataOptions}
405
+ />
406
+ );
407
+ break;
408
+ case "dropdown-ajax":
409
+ htmlContainer = (
410
+ <Select
411
+ settings={settings}
412
+ className={inputClass[settings.id]}
413
+ onChange={onChange}
414
+ inputValue={
415
+ inputValue === null ? "" : inputValue
416
+ }
417
+ options={options}
418
+ dataOptions={dataOptions}
419
+ />
420
+ );
421
+ break;
422
+ case "multi-dropdown":
423
+ htmlContainer = (
424
+ <MultiSelect
425
+ settings={settings}
426
+ className={inputClass[settings.id]}
427
+ multi={
428
+ settings.hasOwnProperty("multi")
429
+ ? settings.multi
430
+ : false
431
+ }
432
+ onChange={onChangeSelect}
433
+ inputValue={
434
+ inputValue === null ? "" : inputValue
435
+ }
436
+ options={settings.options}
437
+ dataOptions={dataOptions}
438
+ />
439
+ );
440
+ break;
441
+ case "multi-dropdown-ajax":
442
+ htmlContainer = (
443
+ <MultiSelect
444
+ settings={settings}
445
+ className={inputClass[settings.id]}
446
+ multi={
447
+ settings.hasOwnProperty("multi")
448
+ ? settings.multi
449
+ : false
450
+ }
451
+ onChange={onChangeSelect}
452
+ inputValue={
453
+ inputValue === null ? "" : inputValue
454
+ }
455
+ options={options}
456
+ dataOptions={dataOptions}
457
+ />
458
+ );
459
+ break;
460
+ case "async-dropdown-ajax":
461
+ htmlContainer = (
462
+ <VisnsAsyncSelect
463
+ settings={settings}
464
+ className={inputClass[settings.id]}
465
+ multi={
466
+ settings.hasOwnProperty("multi")
467
+ ? settings.multi
468
+ : false
469
+ }
470
+ onChange={onChangeSelect}
471
+ inputValue={
472
+ inputValue === null ? "" : inputValue
473
+ }
474
+ options={options}
475
+ dataOptions={dataOptions}
476
+ />
477
+ );
478
+ break;
479
+ case "file":
480
+ htmlContainer = (
481
+ <input
482
+ type="file"
483
+ data-name={settings.id}
484
+ className={inputClass[settings.id]}
485
+ onChange={onChange}
486
+ />
487
+ );
488
+ break;
489
+ case "line-break":
490
+ htmlContainer = (
491
+ <div className="formbreak">
492
+ <span>
493
+ {settings.label}{" "}
494
+ {settings.required === true ? "*" : ""}
495
+ </span>
496
+ </div>
497
+ );
498
+ break;
499
+ case "checkbox":
500
+ htmlContainer = (
501
+ <input
502
+ type="checkbox"
503
+ data-name={settings.id}
504
+ className={inputClass[settings.id]}
505
+ placeholder=" "
506
+ onChange={onChange}
507
+ value={inputValue || ""}
508
+ />
509
+ );
510
+ break;
511
+ case "richeditor":
512
+ htmlContainer = (
513
+ <ReactQuill
514
+ theme="snow"
515
+ data-name={settings.id}
516
+ onChange={(value, event) => {
517
+ onChangeRicheditor(
518
+ event,
519
+ value,
520
+ settings.id
521
+ );
522
+ }}
523
+ value={inputValue || ""}
524
+ />
525
+ );
526
+ break;
527
+ default:
528
+ htmlContainer = "";
529
+ break;
530
+ }
531
+
532
+ return htmlContainer;
533
+ })()}
534
+
535
+ {(() => {
536
+ if (
537
+ settings.type !== "address" &&
538
+ settings.type !== "date" &&
539
+ settings.type !== "datetime" &&
540
+ settings.type !== "line-break" &&
541
+ settings.type !== "checkbox" &&
542
+ settings.type !== "multi-dropdown" &&
543
+ settings.type !== "multi-dropdown-ajax" &&
544
+ settings.type !== "async-dropdown-ajax" &&
545
+ settings.type !== "toggle" &&
546
+ settings.type !== "richeditor"
547
+ ) {
548
+ return (
549
+ <span className="fi__span">
550
+ {settings.label}{" "}
551
+ {settings.required === true ? "*" : ""}
552
+ </span>
553
+ );
554
+ }
555
+ })()}
556
+ </label>
557
+
558
+ {(() => {
559
+ let htmlContainer;
560
+ switch (settings.type) {
561
+ case "date":
562
+ htmlContainer = (
563
+ <DatePicker
564
+ dateFormat={
565
+ settings.format
566
+ ? settings.format
567
+ : "dd-MM-yyyy"
568
+ }
569
+ className={inputClass[settings.id]}
570
+ selected={inputValue || ""}
571
+ showMonthDropdown
572
+ showYearDropdown
573
+ scrollableYearDropdown
574
+ onChange={(date) =>
575
+ onChangeDate(date, settings.id)
576
+ }
577
+ />
578
+ );
579
+ break;
580
+ case "datetime":
581
+ htmlContainer = (
582
+ <DatePicker
583
+ dateFormat={
584
+ settings.format
585
+ ? settings.format
586
+ : "dd-MM-yyyy hh:mm aa"
587
+ }
588
+ showTimeSelect
589
+ className={inputClass[settings.id]}
590
+ selected={inputValue || null}
591
+ showMonthDropdown
592
+ showYearDropdown
593
+ scrollableYearDropdown
594
+ onChange={(date) =>
595
+ onChangeDate(date, settings.id)
596
+ }
597
+ shouldCloseOnSelect={true}
598
+ />
599
+ );
600
+ break;
601
+ case "time":
602
+ htmlContainer = (
603
+ <DatePicker
604
+ dateFormat={
605
+ settings.format
606
+ ? settings.format
607
+ : "hh:mm aa"
608
+ }
609
+ showTimeSelect
610
+ showTimeSelectOnly
611
+ timeIntervals={15}
612
+ timeCaption="Time"
613
+ className={inputClass[settings.id]}
614
+ selected={inputValue || ""}
615
+ onChange={(date) =>
616
+ onChangeDate(date, settings.id)
617
+ }
618
+ shouldCloseOnSelect={true}
619
+ />
620
+ );
621
+ break;
622
+ case "toggle":
623
+ htmlContainer = (
624
+ <div>
625
+ <Toggle
626
+ name={settings.id}
627
+ data-name={settings.id}
628
+ data-show={
629
+ settings.show
630
+ ? JSON.stringify(settings.show)
631
+ : ""
632
+ }
633
+ checked={
634
+ inputValue !== undefined
635
+ ? inputValue === ""
636
+ ? false
637
+ : inputValue === "on"
638
+ ? false
639
+ : inputValue
640
+ : false
641
+ }
642
+ onChange={onChangeToggle}
643
+ />
644
+ <span className="fi__toggletxt">
645
+ {settings.label}{" "}
646
+ {settings.required === true ? "*" : ""}
647
+ </span>
648
+ </div>
649
+ );
650
+ break;
651
+ default:
652
+ htmlContainer = "";
653
+ break;
654
+ }
655
+
656
+ return htmlContainer;
657
+ })()}
658
+ </div>
659
+ );
660
+ }
661
+
662
+ export default Field;