@visns-studio/visns-components 5.11.1 → 5.11.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 (60) hide show
  1. package/package.json +2 -2
  2. package/src/components/cms/DataGrid.jsx +8 -8
  3. package/src/components/cms/DropZone.jsx +1 -1
  4. package/src/components/cms/Form.jsx +1 -1
  5. package/src/components/cms/Gallery.jsx +1 -1
  6. package/src/components/cms/sorting/Item.jsx +1 -1
  7. package/src/components/crm/AssociationManager.jsx +431 -0
  8. package/src/components/crm/Autocomplete.jsx +3 -3
  9. package/src/components/crm/Breadcrumb.jsx +4 -4
  10. package/src/components/crm/BusinessCardOcr.jsx +681 -95
  11. package/src/components/crm/ClientAssociationManager.jsx +362 -0
  12. package/src/components/crm/DataGrid.jsx +34 -32
  13. package/src/components/crm/Field.jsx +12 -12
  14. package/src/components/crm/Form.jsx +2 -2
  15. package/src/components/crm/MergeEntity.jsx +1049 -0
  16. package/src/components/crm/MultiSelect.jsx +14 -3
  17. package/src/components/crm/Navigation.jsx +14 -15
  18. package/src/components/crm/Notification.jsx +2 -2
  19. package/src/components/crm/QuickAction.jsx +3 -3
  20. package/src/components/crm/SectionHeader.jsx +1 -1
  21. package/src/components/crm/SwitchAccount.jsx +4 -4
  22. package/src/components/crm/auth/ClientLogin.jsx +2 -2
  23. package/src/components/crm/auth/ClientOTPVerify.jsx +2 -2
  24. package/src/components/crm/auth/Login.jsx +3 -3
  25. package/src/components/crm/auth/Reset.jsx +2 -2
  26. package/src/components/crm/auth/TwoFactorAuth.jsx +2 -2
  27. package/src/components/crm/cells/CellWithTooltip.jsx +35 -28
  28. package/src/components/crm/columns/ColumnRenderers.jsx +320 -259
  29. package/src/components/crm/controls/DataGridSearch.jsx +5 -5
  30. package/src/components/crm/generic/AlternativeActionModal.jsx +100 -0
  31. package/src/components/crm/generic/ContactSelectorModal.jsx +59 -16
  32. package/src/components/crm/generic/DateRangeSelectorModal.jsx +181 -0
  33. package/src/components/crm/generic/GenericClientPortal.jsx +1 -1
  34. package/src/components/crm/generic/GenericDashboard.jsx +4 -4
  35. package/src/components/crm/generic/GenericDetail.jsx +31 -6
  36. package/src/components/crm/generic/GenericDynamic.jsx +3 -3
  37. package/src/components/crm/generic/GenericEditableTable.jsx +4 -4
  38. package/src/components/crm/generic/GenericFormBuilder.jsx +6 -6
  39. package/src/components/crm/generic/GenericGrid.jsx +1622 -268
  40. package/src/components/crm/generic/GenericReport.jsx +966 -646
  41. package/src/components/crm/generic/GenericReportForm.jsx +1 -1
  42. package/src/components/crm/generic/NotificationList.jsx +1 -1
  43. package/src/components/crm/generic/ReasonCollectorModal.jsx +194 -0
  44. package/src/components/crm/generic/SortableQuoteItems.jsx +3 -3
  45. package/src/components/crm/generic/shared/formatters.js +107 -1
  46. package/src/components/crm/generic/styles/AlternativeActionModal.css +127 -0
  47. package/src/components/crm/generic/styles/DateRangeSelectorModal.css +115 -0
  48. package/src/components/crm/generic/styles/GenericIndex.module.scss +206 -0
  49. package/src/components/crm/generic/styles/GenericReport.module.scss +96 -0
  50. package/src/components/crm/generic/styles/ReasonCollectorModal.css +217 -0
  51. package/src/components/crm/modals/GalleryModal.jsx +2 -2
  52. package/src/components/crm/sorting/Item.jsx +3 -3
  53. package/src/components/crm/styles/AssociationManager.module.scss +364 -0
  54. package/src/components/crm/styles/BusinessCardOcr.module.scss +197 -4
  55. package/src/components/crm/styles/ClientAssociationManager.module.scss +290 -0
  56. package/src/components/crm/styles/MergeEntity.module.scss +690 -0
  57. package/src/components/crm/styles/MultiSelect.module.scss +18 -0
  58. package/src/components/crm/styles/Navigation.module.scss +68 -8
  59. package/src/components/crm/styles/global-datagrid.css +9 -0
  60. package/src/index.js +6 -0
@@ -821,3 +821,209 @@
821
821
  border-top: 7px solid rgba(0, 0, 0, 0.1);
822
822
  }
823
823
  }
824
+
825
+ /* Status with Reason Styles */
826
+ .statusWithReason {
827
+ display: flex;
828
+ flex-direction: column;
829
+ align-items: flex-start;
830
+ gap: 4px;
831
+ }
832
+
833
+ .statusValue {
834
+ font-weight: 600;
835
+ font-size: 14px;
836
+ display: flex;
837
+ align-items: center;
838
+ gap: 6px;
839
+ }
840
+
841
+ .statusReason {
842
+ font-size: 12px;
843
+ color: #6b7280;
844
+ font-style: italic;
845
+ padding: 2px 6px;
846
+ background-color: #f3f4f6;
847
+ border-radius: 4px;
848
+ max-width: 200px;
849
+ word-wrap: break-word;
850
+ line-height: 1.3;
851
+ }
852
+
853
+ /* Date Range Styles */
854
+ .dateRange {
855
+ display: flex;
856
+ flex-direction: column;
857
+ align-items: flex-start;
858
+ gap: 2px;
859
+ }
860
+
861
+ .dateRangeDisplay {
862
+ font-size: 14px;
863
+ color: #374151;
864
+ font-weight: 500;
865
+ }
866
+
867
+ /* Enhanced Date with Contacts (reusing existing) */
868
+ .dateWithContacts {
869
+ display: flex;
870
+ flex-direction: column;
871
+ align-items: flex-start;
872
+ gap: 4px;
873
+ }
874
+
875
+ .dateValue {
876
+ font-size: 14px;
877
+ font-weight: 500;
878
+ color: #374151;
879
+ }
880
+
881
+ .contactsSummary {
882
+ font-size: 12px;
883
+ color: #6b7280;
884
+ padding: 2px 6px;
885
+ background-color: #f0f9ff;
886
+ border: 1px solid #bae6fd;
887
+ border-radius: 12px;
888
+ cursor: pointer;
889
+ transition: all 0.2s ease;
890
+
891
+ &:hover {
892
+ background-color: #e0f2fe;
893
+ border-color: #7dd3fc;
894
+ transform: scale(1.02);
895
+ }
896
+ }
897
+
898
+ /* Responsive adjustments for new components */
899
+ @media (max-width: 768px) {
900
+ .statusWithReason {
901
+ gap: 2px;
902
+ }
903
+
904
+ .statusValue {
905
+ font-size: 13px;
906
+ }
907
+
908
+ .statusReason {
909
+ font-size: 11px;
910
+ max-width: 150px;
911
+ }
912
+
913
+ .dateRangeDisplay {
914
+ font-size: 13px;
915
+ }
916
+
917
+ .contactsSummary {
918
+ font-size: 11px;
919
+ padding: 1px 4px;
920
+ }
921
+
922
+ .quarterStatusContainer {
923
+ gap: 2px;
924
+ }
925
+
926
+ .quarterDate,
927
+ .quarterNotSent {
928
+ font-size: 13px;
929
+ }
930
+
931
+ .quarterContactsBadge,
932
+ .quarterReasonBadge {
933
+ font-size: 11px;
934
+ padding: 1px 4px;
935
+ }
936
+ }
937
+
938
+ /* Quarter Status Styles */
939
+ .quarterStatusContainer {
940
+ display: flex;
941
+ flex-direction: column;
942
+ align-items: flex-start;
943
+ gap: 4px;
944
+ min-height: 40px;
945
+ }
946
+
947
+ .quarterDate {
948
+ font-size: 14px;
949
+ font-weight: 500;
950
+ color: #059669;
951
+ display: flex;
952
+ align-items: center;
953
+ gap: 4px;
954
+ }
955
+
956
+ .quarterNotSent {
957
+ font-size: 14px;
958
+ font-weight: 500;
959
+ color: #dc2626;
960
+ display: flex;
961
+ align-items: center;
962
+ gap: 4px;
963
+ }
964
+
965
+ .quarterContactsBadge {
966
+ font-size: 12px;
967
+ color: #1d4ed8;
968
+ background-color: #dbeafe;
969
+ border: 1px solid #93c5fd;
970
+ border-radius: 12px;
971
+ padding: 2px 8px;
972
+ cursor: pointer;
973
+ transition: all 0.2s ease;
974
+ white-space: nowrap;
975
+
976
+ &:hover {
977
+ background-color: #bfdbfe;
978
+ border-color: #60a5fa;
979
+ transform: scale(1.02);
980
+ }
981
+ }
982
+
983
+ .quarterReasonBadge {
984
+ font-size: 12px;
985
+ color: #b45309;
986
+ background-color: #fef3c7;
987
+ border: 1px solid #fbbf24;
988
+ border-radius: 12px;
989
+ padding: 2px 8px;
990
+ cursor: pointer;
991
+ transition: all 0.2s ease;
992
+ white-space: nowrap;
993
+ max-width: 200px;
994
+ word-wrap: break-word;
995
+
996
+ &:hover {
997
+ background-color: #fde68a;
998
+ border-color: #f59e0b;
999
+ transform: scale(1.02);
1000
+ }
1001
+ }
1002
+
1003
+ /* Quarter Cell Tooltip Styles */
1004
+ .quarterCellWithTooltip {
1005
+ cursor: help;
1006
+ display: inline-flex;
1007
+ align-items: center;
1008
+ gap: 4px;
1009
+ transition: all 0.2s ease;
1010
+
1011
+ &:hover {
1012
+ transform: scale(1.02);
1013
+ filter: brightness(1.1);
1014
+ }
1015
+ }
1016
+
1017
+ /* Global tooltip styles for quarter cells */
1018
+ :global(.quarter-cell-with-tooltip) {
1019
+ cursor: help;
1020
+ display: inline-flex;
1021
+ align-items: center;
1022
+ gap: 2px;
1023
+ transition: all 0.2s ease;
1024
+
1025
+ &:hover {
1026
+ transform: scale(1.02);
1027
+ filter: brightness(1.1);
1028
+ }
1029
+ }
@@ -2629,3 +2629,99 @@
2629
2629
  }
2630
2630
  }
2631
2631
  }
2632
+
2633
+ // Enhanced Help Modal CSS
2634
+ :global(.comprehensive-help-modal) {
2635
+ border-radius: 12px !important;
2636
+
2637
+ .swal2-title {
2638
+ font-size: 1.5rem !important;
2639
+ font-weight: 600 !important;
2640
+ margin-bottom: 1rem !important;
2641
+ }
2642
+
2643
+ // Custom scrollable content for help modal
2644
+ .swal2-html-container.help-content-scrollable {
2645
+ max-height: 70vh !important;
2646
+ overflow-y: auto !important;
2647
+ padding: 0 1rem !important;
2648
+ margin: 0 !important;
2649
+
2650
+ // Custom scrollbar styling
2651
+ &::-webkit-scrollbar {
2652
+ width: 6px;
2653
+ }
2654
+
2655
+ &::-webkit-scrollbar-track {
2656
+ background: #f1f5f9;
2657
+ border-radius: 3px;
2658
+ }
2659
+
2660
+ &::-webkit-scrollbar-thumb {
2661
+ background: #cbd5e1;
2662
+ border-radius: 3px;
2663
+
2664
+ &:hover {
2665
+ background: #94a3b8;
2666
+ }
2667
+ }
2668
+ }
2669
+
2670
+ // Action buttons styling
2671
+ .swal2-actions {
2672
+ gap: 0.75rem !important;
2673
+
2674
+ .swal2-confirm {
2675
+ font-weight: 600 !important;
2676
+ border-radius: 8px !important;
2677
+ padding: 0.75rem 1.5rem !important;
2678
+ font-size: 0.9rem !important;
2679
+ }
2680
+
2681
+ .swal2-cancel {
2682
+ font-weight: 500 !important;
2683
+ border-radius: 8px !important;
2684
+ padding: 0.75rem 1.5rem !important;
2685
+ font-size: 0.9rem !important;
2686
+ }
2687
+
2688
+ .swal2-deny {
2689
+ font-weight: 400 !important;
2690
+ border-radius: 8px !important;
2691
+ padding: 0.75rem 1rem !important;
2692
+ font-size: 0.85rem !important;
2693
+ opacity: 0.8;
2694
+
2695
+ &:hover {
2696
+ opacity: 1;
2697
+ }
2698
+ }
2699
+ }
2700
+
2701
+ // Responsive design for smaller screens
2702
+ @media (max-width: 768px) {
2703
+ width: 95% !important;
2704
+
2705
+ .swal2-html-container.help-content-scrollable {
2706
+ font-size: 12px !important;
2707
+ line-height: 1.4 !important;
2708
+ padding: 0 0.5rem !important;
2709
+ }
2710
+
2711
+ .swal2-title {
2712
+ font-size: 1.25rem !important;
2713
+ }
2714
+
2715
+ .swal2-actions {
2716
+ flex-direction: column !important;
2717
+ gap: 0.5rem !important;
2718
+
2719
+ .swal2-confirm,
2720
+ .swal2-cancel,
2721
+ .swal2-deny {
2722
+ width: 100% !important;
2723
+ margin: 0 !important;
2724
+ }
2725
+ }
2726
+ }
2727
+ }
@@ -0,0 +1,217 @@
1
+ /* Reason Collector Modal Styles */
2
+ .reason-collector-modal {
3
+ text-align: left;
4
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
5
+ }
6
+
7
+ .reason-collector-modal.compact {
8
+ max-width: 350px;
9
+ }
10
+
11
+ .reason-message {
12
+ margin-bottom: 16px;
13
+ color: #4a5568;
14
+ font-size: 15px;
15
+ line-height: 1.4;
16
+ text-align: center;
17
+ }
18
+
19
+ .reason-options-container {
20
+ margin: 16px 0;
21
+ }
22
+
23
+ .reason-options-container.compact {
24
+ margin: 12px 0;
25
+ }
26
+
27
+ .reason-option {
28
+ display: flex;
29
+ align-items: flex-start;
30
+ margin-bottom: 8px;
31
+ cursor: pointer;
32
+ }
33
+
34
+ .reason-option.reason-option-other {
35
+ flex-direction: column;
36
+ align-items: flex-start;
37
+ }
38
+
39
+ .reason-radio-container {
40
+ display: flex;
41
+ align-items: flex-start;
42
+ margin-bottom: 0;
43
+ }
44
+
45
+ .reason-radio {
46
+ margin-right: 12px;
47
+ margin-top: 2px;
48
+ cursor: pointer;
49
+ }
50
+
51
+ .reason-label {
52
+ font-size: 14px;
53
+ color: #2d3748;
54
+ cursor: pointer;
55
+ line-height: 1.4;
56
+ flex: 1;
57
+ }
58
+
59
+ .reason-label:hover {
60
+ color: #4299e1;
61
+ }
62
+
63
+ .custom-reason-input-container {
64
+ margin-top: 8px;
65
+ margin-left: 24px;
66
+ width: calc(100% - 24px);
67
+ }
68
+
69
+ .custom-reason-input {
70
+ width: 100%;
71
+ padding: 8px 12px;
72
+ border: 2px solid #e2e8f0;
73
+ border-radius: 6px;
74
+ font-size: 14px;
75
+ font-family: inherit;
76
+ transition: all 0.2s ease;
77
+ background-color: #ffffff;
78
+ color: #2d3748;
79
+ box-sizing: border-box;
80
+ }
81
+
82
+ .custom-reason-input.compact {
83
+ padding: 6px 10px;
84
+ font-size: 13px;
85
+ min-height: 32px;
86
+ }
87
+
88
+ .custom-reason-input:focus {
89
+ outline: none;
90
+ border-color: #4299e1;
91
+ box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.1);
92
+ }
93
+
94
+ .custom-reason-input:hover {
95
+ border-color: #cbd5e0;
96
+ }
97
+
98
+ .custom-reason-input::placeholder {
99
+ color: #a0aec0;
100
+ }
101
+
102
+ /* SweetAlert2 custom classes */
103
+ .reason-swal-container {
104
+ z-index: 10000;
105
+ }
106
+
107
+ .reason-swal-popup {
108
+ border-radius: 12px;
109
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
110
+ max-width: 400px;
111
+ min-width: 320px;
112
+ }
113
+
114
+ .reason-swal-content {
115
+ padding: 16px;
116
+ }
117
+
118
+ .reason-swal-confirm {
119
+ background-color: #4299e1 !important;
120
+ border: none !important;
121
+ border-radius: 8px !important;
122
+ font-weight: 600 !important;
123
+ padding: 12px 24px !important;
124
+ font-size: 14px !important;
125
+ }
126
+
127
+ .reason-swal-confirm:hover {
128
+ background-color: #3182ce !important;
129
+ }
130
+
131
+ .reason-swal-cancel {
132
+ background-color: #e2e8f0 !important;
133
+ color: #4a5568 !important;
134
+ border: none !important;
135
+ border-radius: 8px !important;
136
+ font-weight: 600 !important;
137
+ padding: 12px 24px !important;
138
+ font-size: 14px !important;
139
+ }
140
+
141
+ .reason-swal-cancel:hover {
142
+ background-color: #cbd5e0 !important;
143
+ }
144
+
145
+ /* Radio button styling */
146
+ .reason-radio {
147
+ appearance: none;
148
+ width: 18px;
149
+ height: 18px;
150
+ border: 2px solid #cbd5e0;
151
+ border-radius: 50%;
152
+ position: relative;
153
+ background-color: #ffffff;
154
+ transition: all 0.2s ease;
155
+ }
156
+
157
+ .reason-radio:checked {
158
+ border-color: #4299e1;
159
+ background-color: #4299e1;
160
+ }
161
+
162
+ .reason-radio:checked::after {
163
+ content: '';
164
+ position: absolute;
165
+ top: 50%;
166
+ left: 50%;
167
+ transform: translate(-50%, -50%);
168
+ width: 6px;
169
+ height: 6px;
170
+ background-color: #ffffff;
171
+ border-radius: 50%;
172
+ }
173
+
174
+ .reason-radio:hover {
175
+ border-color: #4299e1;
176
+ }
177
+
178
+ .reason-radio:focus {
179
+ outline: none;
180
+ box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.1);
181
+ }
182
+
183
+ /* Responsive design */
184
+ @media (max-width: 640px) {
185
+ .reason-swal-popup {
186
+ max-width: 90vw;
187
+ min-width: 280px;
188
+ }
189
+
190
+ .custom-reason-input {
191
+ padding: 8px 10px;
192
+ font-size: 16px; /* Prevent zoom on iOS */
193
+ }
194
+
195
+ .custom-reason-input.compact {
196
+ padding: 6px 8px;
197
+ font-size: 15px;
198
+ min-height: 28px;
199
+ }
200
+
201
+ .reason-label {
202
+ font-size: 13px;
203
+ }
204
+
205
+ .custom-reason-input-container {
206
+ margin-left: 20px;
207
+ width: calc(100% - 20px);
208
+ }
209
+
210
+ .reason-option {
211
+ margin-bottom: 6px;
212
+ }
213
+
214
+ .reason-options-container.compact {
215
+ margin: 8px 0;
216
+ }
217
+ }
@@ -4,7 +4,7 @@ import { toast } from 'react-toastify';
4
4
  import imageCompression from 'browser-image-compression';
5
5
  import Vapor from 'laravel-vapor';
6
6
  import Lightbox from 'yet-another-react-lightbox';
7
- import { CircleX, Image as ImageIcon, CloudUpload } from 'akar-icons';
7
+ import { X, Image as ImageIcon, CloudUpload } from 'lucide-react';
8
8
  import styles from '../styles/DataGrid.module.scss';
9
9
  import CustomFetch from '../Fetch';
10
10
 
@@ -194,7 +194,7 @@ const GalleryModal = ({
194
194
  className={styles.modal__close}
195
195
  onClick={modalGalleryClose}
196
196
  >
197
- <CircleX strokeWidth={1} size={24} />
197
+ <X strokeWidth={1} size={24} />
198
198
  </button>
199
199
  </div>
200
200
  <div
@@ -1,11 +1,11 @@
1
1
  import React from 'react';
2
2
  import { SortableElement, sortableHandle } from 'react-sortable-hoc';
3
- import { ChevronVertical, Pencil, TrashCan } from 'akar-icons';
3
+ import { GripVertical, Pencil, Trash2 } from 'lucide-react';
4
4
 
5
5
  import styles from './styles/Item.module.scss';
6
6
 
7
7
  const DragHandle = sortableHandle(() => (
8
- <ChevronVertical className="drag-handle" strokeWidth={1} size={22} />
8
+ <GripVertical className="drag-handle" strokeWidth={1} size={22} />
9
9
  ));
10
10
 
11
11
  // Utility function to truncate text
@@ -98,7 +98,7 @@ const SortableItem = ({
98
98
  {renderEditButton()}
99
99
 
100
100
  {handleDelete && (
101
- <TrashCan
101
+ <Trash2
102
102
  className={styles.delete}
103
103
  strokeWidth={2}
104
104
  size={24}