@visns-studio/visns-components 5.11.1 → 5.11.2

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 (48) 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/Autocomplete.jsx +3 -3
  8. package/src/components/crm/Breadcrumb.jsx +4 -4
  9. package/src/components/crm/BusinessCardOcr.jsx +681 -95
  10. package/src/components/crm/DataGrid.jsx +34 -32
  11. package/src/components/crm/Field.jsx +12 -12
  12. package/src/components/crm/Form.jsx +2 -2
  13. package/src/components/crm/Navigation.jsx +11 -11
  14. package/src/components/crm/Notification.jsx +2 -2
  15. package/src/components/crm/QuickAction.jsx +3 -3
  16. package/src/components/crm/SectionHeader.jsx +1 -1
  17. package/src/components/crm/SwitchAccount.jsx +4 -4
  18. package/src/components/crm/auth/ClientLogin.jsx +2 -2
  19. package/src/components/crm/auth/ClientOTPVerify.jsx +2 -2
  20. package/src/components/crm/auth/Login.jsx +3 -3
  21. package/src/components/crm/auth/Reset.jsx +2 -2
  22. package/src/components/crm/auth/TwoFactorAuth.jsx +2 -2
  23. package/src/components/crm/columns/ColumnRenderers.jsx +320 -259
  24. package/src/components/crm/controls/DataGridSearch.jsx +5 -5
  25. package/src/components/crm/generic/AlternativeActionModal.jsx +100 -0
  26. package/src/components/crm/generic/ContactSelectorModal.jsx +59 -16
  27. package/src/components/crm/generic/DateRangeSelectorModal.jsx +181 -0
  28. package/src/components/crm/generic/GenericClientPortal.jsx +1 -1
  29. package/src/components/crm/generic/GenericDashboard.jsx +4 -4
  30. package/src/components/crm/generic/GenericDetail.jsx +6 -6
  31. package/src/components/crm/generic/GenericDynamic.jsx +3 -3
  32. package/src/components/crm/generic/GenericEditableTable.jsx +4 -4
  33. package/src/components/crm/generic/GenericFormBuilder.jsx +6 -6
  34. package/src/components/crm/generic/GenericGrid.jsx +1622 -268
  35. package/src/components/crm/generic/GenericReport.jsx +966 -646
  36. package/src/components/crm/generic/GenericReportForm.jsx +1 -1
  37. package/src/components/crm/generic/NotificationList.jsx +1 -1
  38. package/src/components/crm/generic/ReasonCollectorModal.jsx +194 -0
  39. package/src/components/crm/generic/SortableQuoteItems.jsx +3 -3
  40. package/src/components/crm/generic/shared/formatters.js +107 -1
  41. package/src/components/crm/generic/styles/AlternativeActionModal.css +127 -0
  42. package/src/components/crm/generic/styles/DateRangeSelectorModal.css +115 -0
  43. package/src/components/crm/generic/styles/GenericIndex.module.scss +206 -0
  44. package/src/components/crm/generic/styles/GenericReport.module.scss +96 -0
  45. package/src/components/crm/generic/styles/ReasonCollectorModal.css +217 -0
  46. package/src/components/crm/modals/GalleryModal.jsx +2 -2
  47. package/src/components/crm/sorting/Item.jsx +3 -3
  48. package/src/components/crm/styles/BusinessCardOcr.module.scss +197 -4
@@ -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}