@visns-studio/visns-components 4.7.1 → 4.7.3

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 (96) hide show
  1. package/package.json +13 -9
  2. package/src/components/cms/DataGrid.jsx +1461 -0
  3. package/src/components/cms/DropZone.jsx +349 -0
  4. package/src/components/cms/Field.jsx +802 -0
  5. package/src/components/cms/Form.jsx +476 -0
  6. package/src/components/cms/generic/CmsDetail.jsx +36 -0
  7. package/src/components/cms/generic/CmsIndex.jsx +73 -0
  8. package/src/components/cms/generic/CmsSort.jsx +125 -0
  9. package/src/components/cms/sorting/Item.jsx +115 -0
  10. package/src/components/cms/sorting/List.jsx +30 -0
  11. package/src/components/crm/AsyncSelect.jsx +125 -0
  12. package/src/components/crm/Autocomplete.jsx +174 -0
  13. package/src/components/crm/Breadcrumb.jsx +52 -0
  14. package/src/components/crm/Call.jsx +220 -0
  15. package/src/components/crm/DataGrid.jsx +2701 -0
  16. package/src/components/crm/Download.jsx +101 -0
  17. package/src/components/crm/Fetch.jsx +119 -0
  18. package/src/components/crm/Field.jsx +1557 -0
  19. package/src/components/crm/Form.jsx +1409 -0
  20. package/src/components/crm/Loader.jsx +29 -0
  21. package/src/components/crm/MultiSelect.jsx +78 -0
  22. package/src/components/crm/Navigation.jsx +619 -0
  23. package/src/components/crm/Notification.jsx +197 -0
  24. package/src/components/crm/QrCode.jsx +83 -0
  25. package/src/components/crm/Select.jsx +58 -0
  26. package/src/components/crm/SelectList.jsx +21 -0
  27. package/src/components/crm/TableFilter.jsx +198 -0
  28. package/src/components/crm/auth/Login.jsx +223 -0
  29. package/src/components/crm/auth/Profile.jsx +280 -0
  30. package/src/components/crm/auth/Reset.jsx +111 -0
  31. package/src/components/crm/auth/Verify.jsx +174 -0
  32. package/src/components/crm/auth/styles/Login.module.scss +243 -0
  33. package/src/components/crm/auth/styles/Profile.module.scss +222 -0
  34. package/src/components/crm/auth/styles/Reset.module.scss +216 -0
  35. package/src/components/crm/auth/styles/Verify.module.scss +216 -0
  36. package/src/components/crm/generic/AuditLog.jsx +108 -0
  37. package/src/components/crm/generic/AuditLogs.jsx +115 -0
  38. package/src/components/crm/generic/GenericAuth.jsx +166 -0
  39. package/src/components/crm/generic/GenericDashboard.jsx +42 -0
  40. package/src/components/crm/generic/GenericDetail.jsx +1499 -0
  41. package/src/components/crm/generic/GenericDynamic.jsx +915 -0
  42. package/src/components/crm/generic/GenericFormBuilder.jsx +1765 -0
  43. package/src/components/crm/generic/GenericIndex.jsx +376 -0
  44. package/src/components/crm/generic/GenericMain.jsx +129 -0
  45. package/src/components/crm/generic/GenericSort.jsx +188 -0
  46. package/src/components/crm/generic/NotificationList.jsx +64 -0
  47. package/src/components/crm/generic/styles/AuditLog.module.scss +147 -0
  48. package/src/components/crm/generic/styles/AuditLogs.module.scss +92 -0
  49. package/src/components/crm/generic/styles/GenericDetail.module.scss +634 -0
  50. package/src/components/crm/generic/styles/GenericDynamic.module.scss +932 -0
  51. package/src/components/crm/generic/styles/GenericFormBuilder.module.scss +944 -0
  52. package/src/components/crm/generic/styles/GenericIndex.module.scss +247 -0
  53. package/src/components/crm/generic/styles/GenericMain.module.scss +91 -0
  54. package/src/components/crm/generic/styles/GenericSort.module.scss +123 -0
  55. package/src/components/crm/generic/styles/NotificationList.module.scss +67 -0
  56. package/src/components/crm/sorting/Item.jsx +117 -0
  57. package/src/components/crm/sorting/List.jsx +32 -0
  58. package/src/components/crm/sorting/styles/Item.module.scss +68 -0
  59. package/src/components/crm/sorting/styles/List.module.scss +68 -0
  60. package/src/components/crm/styles/AsyncSelect.module.scss +8 -0
  61. package/src/components/crm/styles/Autocomplete.module.scss +44 -0
  62. package/src/components/crm/styles/DataGrid.module.scss +210 -0
  63. package/src/components/crm/styles/Field.module.scss +311 -0
  64. package/src/components/crm/styles/Form.module.scss +499 -0
  65. package/src/components/crm/styles/Loader.module.scss +94 -0
  66. package/src/components/crm/styles/MultiSelect.module.scss +8 -0
  67. package/src/components/crm/styles/Navigation.module.scss +978 -0
  68. package/src/components/crm/styles/Notification.module.scss +147 -0
  69. package/src/components/crm/styles/QrCode.module.scss +87 -0
  70. package/src/components/crm/styles/TableFilter.module.scss +52 -0
  71. package/src/components/styles/global.css +73 -0
  72. package/src/index.js +86 -0
  73. package/dist/104e5636d8ddb791614c.woff2 +0 -0
  74. package/dist/11fe6a83d647de5daf95.woff +0 -0
  75. package/dist/141e2a8c7836495afe2a.woff +0 -0
  76. package/dist/2ba5877f7079830b5383.woff +0 -0
  77. package/dist/2d6836f45b2037be41f3.woff +0 -0
  78. package/dist/399.0a0f3e0d21be1057d599.css +0 -8
  79. package/dist/399.b8f57fa3f8c0c10119e4.js +0 -1
  80. package/dist/47d566c3b1293dfd9d77.woff +0 -0
  81. package/dist/6282a13cbba671a71913.woff2 +0 -0
  82. package/dist/78266f551031aa9db127.woff +0 -0
  83. package/dist/7b7da89f1e3fdcbfe36c.woff2 +0 -0
  84. package/dist/7e78e8338af7efeda712.woff2 +0 -0
  85. package/dist/7fa387951673abf164b1.woff2 +0 -0
  86. package/dist/819d59862c2d0640aad8.woff +0 -0
  87. package/dist/b615e1a6c838ea059a56.woff +0 -0
  88. package/dist/b9b1aa739c660c4ce67c.woff2 +0 -0
  89. package/dist/c5f3640b11df9414facb.woff +0 -0
  90. package/dist/da26d162ff5af71d6590.woff2 +0 -0
  91. package/dist/dd5b2912dbf896310865.woff2 +0 -0
  92. package/dist/f282b331272463c1aa6c.woff2 +0 -0
  93. package/dist/main.83b033670d64419bb497.css +0 -1
  94. package/dist/main.b1723d17cd2d3513ab62.js +0 -1
  95. package/dist/report.html +0 -39
  96. package/dist/runtime.33c276593b23f8035b8d.js +0 -1
@@ -0,0 +1,476 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import CustomFetch from '../crm/Fetch';
3
+ import Field from './Field';
4
+ import slugify from 'react-slugify';
5
+ import moment from 'moment';
6
+ import Reveal from 'react-reveal/Reveal';
7
+ import parse from 'html-react-parser';
8
+ import { confirmAlert } from 'react-confirm-alert';
9
+ import { toast } from 'react-toastify';
10
+ import { Copy, TrashBin } from 'akar-icons';
11
+
12
+ import 'react-confirm-alert/src/react-confirm-alert.css';
13
+
14
+ function Form(props) {
15
+ const { dataId, navigate, form } = props;
16
+ const [data, setData] = useState({});
17
+ const [dataClass, setDataClass] = useState({});
18
+ const [audit, setAudit] = useState({
19
+ createdBy: {},
20
+ created: '',
21
+ updatedBy: {},
22
+ updated: '',
23
+ });
24
+ const [uploadProgress, setUploadProgress] = useState({});
25
+
26
+ const handleChange = (e) => {
27
+ if (e) {
28
+ const { name, value } = e.target;
29
+
30
+ switch (e.target.name) {
31
+ case 'title':
32
+ setData((prevState) => ({
33
+ ...prevState,
34
+ [name]: value,
35
+ }));
36
+
37
+ setData((prevState) => ({
38
+ ...prevState,
39
+ slug: slugify(value),
40
+ }));
41
+ break;
42
+ case 'name':
43
+ setData((prevState) => ({
44
+ ...prevState,
45
+ [name]: value,
46
+ }));
47
+
48
+ setData((prevState) => ({
49
+ ...prevState,
50
+ slug: slugify(value),
51
+ }));
52
+ break;
53
+ default:
54
+ if (name) {
55
+ setData((prevState) => ({
56
+ ...prevState,
57
+ [name]: value,
58
+ }));
59
+ } else {
60
+ setData((prevState) => ({
61
+ ...prevState,
62
+ [e.target.dataset.name]: value,
63
+ }));
64
+ }
65
+ break;
66
+ }
67
+ }
68
+ };
69
+
70
+ const handleChangeDate = (date, id) => {
71
+ setData((prevState) => ({
72
+ ...prevState,
73
+ [id]: date,
74
+ }));
75
+ };
76
+
77
+ const handleChangeSelect = (value, action, id) => {
78
+ if (value && action && id) {
79
+ setData((prevState) => ({
80
+ ...prevState,
81
+ [id]: value,
82
+ }));
83
+ }
84
+ };
85
+
86
+ const handleChangeRicheditor = (e, value, name) => {
87
+ setData((prevState) => ({
88
+ ...prevState,
89
+ [name]: value,
90
+ }));
91
+ };
92
+
93
+ const handleChangeToggle = (e) => {
94
+ if (!e) {
95
+ return;
96
+ }
97
+
98
+ const { name, checked } = e.target;
99
+
100
+ setData((prevState) => ({
101
+ ...prevState,
102
+ [name]: checked,
103
+ }));
104
+ };
105
+
106
+ const handleChangeFile = (e) => {
107
+ if (e) {
108
+ setData((prevState) => ({
109
+ ...prevState,
110
+ [e.target.name]: e.target.files[0],
111
+ }));
112
+
113
+ Vapor.store(e.target.files[0], {
114
+ progress: (progress) => {
115
+ setUploadProgress((prevState) => ({
116
+ ...prevState,
117
+ [e.target.name]: progress * 100,
118
+ }));
119
+ },
120
+ }).then((response) => {
121
+ if (data.hasOwnProperty('files')) {
122
+ let _files = data.files;
123
+ let _new = true;
124
+
125
+ data.files.forEach((a, b) => {
126
+ if (e.target.name === a.field) {
127
+ _files[b] = {
128
+ field: e.target.name,
129
+ uuid: response.uuid,
130
+ key: response.key,
131
+ bucket: response.bucket,
132
+ filename: e.target.files[0].name,
133
+ filesize: e.target.files[0].size,
134
+ extension: response.extension,
135
+ };
136
+
137
+ _new = false;
138
+ }
139
+ });
140
+
141
+ if (_new === true) {
142
+ setData((prevState) => ({
143
+ ...prevState,
144
+ files: [
145
+ ...prevState.files,
146
+ {
147
+ field: e.target.name,
148
+ uuid: response.uuid,
149
+ key: response.key,
150
+ bucket: response.bucket,
151
+ filename: e.target.files[0].name,
152
+ filesize: e.target.files[0].size,
153
+ extension: response.extension,
154
+ },
155
+ ],
156
+ }));
157
+ } else {
158
+ setData((prevState) => ({
159
+ ...prevState,
160
+ files: _files,
161
+ }));
162
+ }
163
+ } else {
164
+ setData((prevState) => ({
165
+ ...prevState,
166
+ files: [
167
+ {
168
+ field: e.target.name,
169
+ uuid: response.uuid,
170
+ key: response.key,
171
+ bucket: response.bucket,
172
+ filename: e.target.files[0].name,
173
+ filesize: e.target.files[0].size,
174
+ extension: response.extension,
175
+ },
176
+ ],
177
+ }));
178
+ }
179
+ });
180
+ }
181
+ };
182
+
183
+ const handleSubmit = (e) => {
184
+ if (e) {
185
+ e.preventDefault();
186
+
187
+ let error = '';
188
+ let url = '';
189
+ let method = '';
190
+ let message = '';
191
+
192
+ if (data.title === '') {
193
+ error += 'Please enter a title.<br />';
194
+ }
195
+
196
+ if (data.summary === '') {
197
+ error += 'Please enter a summary.<br />';
198
+ }
199
+
200
+ if (error === '') {
201
+ if (dataId === 'create') {
202
+ url = form.url;
203
+ method = 'POST';
204
+ message = 'You have successfully created a new entry.';
205
+ } else {
206
+ url = form.url + '/' + dataId;
207
+ method = 'PUT';
208
+ message = 'You have successfully updated this entry.';
209
+ }
210
+
211
+ CustomFetch(url, method, data, function (result) {
212
+ if (result.error === '') {
213
+ let _uploadProgress = uploadProgress;
214
+
215
+ Object.keys(_uploadProgress).forEach((a, b) => {
216
+ setUploadProgress((prevState) => ({
217
+ ...prevState,
218
+ [b]: 0,
219
+ }));
220
+ });
221
+
222
+ toast.success(message);
223
+
224
+ if (dataId === 'create') {
225
+ navigate(
226
+ form.url.replace('/ajax', '') +
227
+ '/' +
228
+ result.data.id,
229
+ {
230
+ state: {
231
+ form: form,
232
+ },
233
+ }
234
+ );
235
+ }
236
+ } else {
237
+ toast.error(result.error);
238
+ }
239
+ });
240
+ } else {
241
+ toast.error(<div>{parse(error)}</div>);
242
+ }
243
+ }
244
+ };
245
+
246
+ const handleDelete = (e) => {
247
+ if (e) {
248
+ confirmAlert({
249
+ title: 'Delete this entry',
250
+ message: 'Are you sure you want to delete it?',
251
+ buttons: [
252
+ {
253
+ label: 'Yes',
254
+ onClick: () =>
255
+ CustomFetch(
256
+ `${form.url}/${dataId}`,
257
+ 'DELETE',
258
+ {},
259
+ function (result) {
260
+ if (result.error === '') {
261
+ navigate(form.url.replace('/ajax', ''));
262
+ toast.success(
263
+ 'You have successfully deleted this entry.'
264
+ );
265
+ } else {
266
+ toast.error(result.error);
267
+ }
268
+ }
269
+ ),
270
+ },
271
+ {
272
+ label: 'No',
273
+ onClick: () => close(),
274
+ },
275
+ ],
276
+ });
277
+ }
278
+ };
279
+
280
+ const fetchData = () => {
281
+ form.fields.forEach((a) => {
282
+ setData((prevState) => ({
283
+ ...prevState,
284
+ [a.id]: '',
285
+ }));
286
+ });
287
+
288
+ if (dataId !== 'create') {
289
+ CustomFetch(
290
+ `${form.url}/${dataId}`,
291
+ 'GET',
292
+ {},
293
+ function (result) {
294
+ let now = moment();
295
+ let created = moment.duration(
296
+ now.diff(result.data.created_at)
297
+ );
298
+ let updated = moment.duration(
299
+ now.diff(result.data.updated_at)
300
+ );
301
+
302
+ setData(result.data);
303
+ setAudit((prevState) => ({
304
+ ...prevState,
305
+ createdBy: result.audit_first,
306
+ created:
307
+ created.hours() > 24
308
+ ? created.days() +
309
+ ' Days ' +
310
+ created.hours() +
311
+ ' Hour(s) ' +
312
+ created.minutes() +
313
+ ' Minutes'
314
+ : created.hours() +
315
+ ' Hour(s) ' +
316
+ created.minutes() +
317
+ ' Minutes',
318
+ updatedBy: result.audit_latest,
319
+ updated:
320
+ updated.hours() > 24
321
+ ? updated.days() +
322
+ ' Days ' +
323
+ updated.hours() +
324
+ ' Hour(s) ' +
325
+ updated.minutes() +
326
+ ' Minutes'
327
+ : updated.hours() +
328
+ ' Hour(s) ' +
329
+ updated.minutes() +
330
+ ' Minutes',
331
+ }));
332
+ },
333
+ function (error) {
334
+ navigate('/');
335
+
336
+ toast.error(String(error));
337
+ }
338
+ );
339
+ }
340
+ };
341
+
342
+ useEffect(() => {
343
+ form.fields.forEach((a) => {
344
+ if (a.type === 'image') {
345
+ setUploadProgress((prevState) => ({
346
+ ...prevState,
347
+ [a.id]: 0,
348
+ }));
349
+ }
350
+
351
+ setData((prevState) => ({
352
+ ...prevState,
353
+ [a.id]: '',
354
+ }));
355
+
356
+ setDataClass((prevState) => ({
357
+ ...prevState,
358
+ [a.id]: '',
359
+ }));
360
+ });
361
+
362
+ fetchData();
363
+ }, [dataId]);
364
+
365
+ return (
366
+ <Reveal effect="fadeInUp">
367
+ <div className="grid">
368
+ <div className="grid__row">
369
+ <div className="grid__full cmstitle">
370
+ <h1>
371
+ {data.title
372
+ ? data.title
373
+ : dataId !== 'create'
374
+ ? form.update.title
375
+ : form.create.title}
376
+ </h1>
377
+ <div className="cmstitle__actions">
378
+ <button
379
+ className="btn actionbtn"
380
+ onClick={handleSubmit}
381
+ >
382
+ <Copy size={18} strokeWidth={2} />{' '}
383
+ {dataId !== 'create' ? 'Save' : 'Create'}
384
+ </button>
385
+ </div>
386
+ </div>
387
+ </div>
388
+ </div>
389
+ <div className="dynamic">
390
+ <div className="dynamic__left">
391
+ <div className="formcontainer">
392
+ <div className="dynamicform">
393
+ {form.fields.map((a, b) => (
394
+ <Field
395
+ key={
396
+ b +
397
+ '-fields-' +
398
+ (a.hasOwnProperty('key')
399
+ ? a.id + '-' + a.key
400
+ : a.id)
401
+ }
402
+ baseData={data}
403
+ fetchData={fetchData}
404
+ inputClass={dataClass}
405
+ inputValue={
406
+ a.hasOwnProperty('key')
407
+ ? data[a.key]
408
+ : Array.isArray(data[a.id]) &&
409
+ a.type === 'image'
410
+ ? data[a.id].length > 0
411
+ ? data[a.id][0]
412
+ : ''
413
+ : data[a.id]
414
+ }
415
+ onChange={handleChange}
416
+ onChangeDate={handleChangeDate}
417
+ onChangeFile={handleChangeFile}
418
+ onChangeRicheditor={handleChangeRicheditor}
419
+ onChangeSelect={handleChangeSelect}
420
+ onChangeToggle={handleChangeToggle}
421
+ setFormData={setData}
422
+ settings={a}
423
+ uploadProgress={uploadProgress}
424
+ />
425
+ ))}
426
+ </div>
427
+ </div>
428
+ </div>
429
+ <div className="dynamic__right">
430
+ <h1>Information</h1>
431
+ <ul>
432
+ <li>
433
+ Created: <span>{audit.created} Ago</span>
434
+ </li>
435
+ <li>
436
+ By:{' '}
437
+ <span>
438
+ {audit &&
439
+ audit.createdBy &&
440
+ audit.createdBy.user
441
+ ? audit.createdBy.user.name
442
+ : null}
443
+ </span>
444
+ </li>
445
+ <li>
446
+ Last Update: <span>{audit.updated} Ago</span>
447
+ </li>
448
+ <li>
449
+ by:{' '}
450
+ <span>
451
+ {audit &&
452
+ audit.updatedBy &&
453
+ audit.updatedBy.user
454
+ ? audit.updatedBy.user.name
455
+ : null}
456
+ </span>
457
+ </li>
458
+ {dataId !== 'create' ? (
459
+ <li>
460
+ <button
461
+ className="btn actionbtn deletebtn"
462
+ onClick={handleDelete}
463
+ >
464
+ <TrashBin size={14} strokeWidth={2} />{' '}
465
+ Delete Entry
466
+ </button>
467
+ </li>
468
+ ) : null}
469
+ </ul>
470
+ </div>
471
+ </div>
472
+ </Reveal>
473
+ );
474
+ }
475
+
476
+ export default Form;
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import { useParams, useNavigate, useLocation } from 'react-router-dom';
3
+ import Reveal from 'react-reveal/Reveal';
4
+ import { ToastContainer } from 'react-toastify';
5
+ import CmsForm from '../Form';
6
+
7
+ import 'react-confirm-alert/src/react-confirm-alert.css';
8
+
9
+ function CmsDetail({ setting }) {
10
+ const { dataId } = useParams();
11
+ const navigate = useNavigate();
12
+ const { form } = setting;
13
+
14
+ return (
15
+ <Reveal effect="fadeInUp">
16
+ <div className="grid">
17
+ <div className="grid__row">
18
+ <div className="grid__full">
19
+ <CmsForm
20
+ dataId={dataId}
21
+ navigate={navigate}
22
+ form={form}
23
+ />
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <ToastContainer
28
+ theme="light"
29
+ position="bottom-center"
30
+ style={{ width: '600px' }}
31
+ />
32
+ </Reveal>
33
+ );
34
+ }
35
+
36
+ export default CmsDetail;
@@ -0,0 +1,73 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Outlet } from 'react-router-dom';
3
+ import Reveal from 'react-reveal/Reveal';
4
+ import DataGrid from '../DataGrid';
5
+
6
+ function CmsIndex({ setting, userProfile }) {
7
+ const { ajaxSetting, columns, form, filters, page, settings } = setting;
8
+
9
+ const [config, setConfig] = useState({});
10
+ const [windowHeight, setWindowHeight] = useState(window.innerHeight);
11
+ const pageTitle = page?.title;
12
+
13
+ useEffect(() => {
14
+ setConfig(() => ({
15
+ ajaxSetting,
16
+ form,
17
+ columns,
18
+ settings,
19
+ }));
20
+ }, [setting]);
21
+
22
+ useEffect(() => {
23
+ const handleResize = () => {
24
+ setWindowHeight(window.innerHeight);
25
+ };
26
+
27
+ window.addEventListener('resize', handleResize);
28
+
29
+ // Clean up the event listener
30
+ return () => {
31
+ window.removeEventListener('resize', handleResize);
32
+ };
33
+ }, []);
34
+
35
+ return (
36
+ <>
37
+ <Reveal effect="fadeInUp">
38
+ <>
39
+ <div className="grid">
40
+ <div className="grid__row">
41
+ <div className="grid__full cmstitle">
42
+ <h1>{pageTitle}</h1>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ {config.ajaxSetting &&
47
+ config.form &&
48
+ config.columns &&
49
+ config.settings && (
50
+ <div className="grid">
51
+ <div className="grid__row">
52
+ <div className="grid__full">
53
+ <DataGrid
54
+ {...config}
55
+ gridHeight={windowHeight * 0.65}
56
+ setConfig={setConfig}
57
+ style={
58
+ userProfile?.settings?.style ||
59
+ {}
60
+ }
61
+ />
62
+ </div>
63
+ </div>
64
+ </div>
65
+ )}
66
+ <Outlet />
67
+ </>
68
+ </Reveal>
69
+ </>
70
+ );
71
+ }
72
+
73
+ export default CmsIndex;