@visns-studio/visns-components 5.10.11 → 5.11.1

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,367 @@
1
+ /* Contact Selector Modal Styles */
2
+
3
+ .contact-selector-dialog {
4
+ max-width: 90vw !important;
5
+ width: 600px !important;
6
+ min-width: 400px !important;
7
+ }
8
+
9
+ .contact-selector-content {
10
+ max-width: 100% !important;
11
+ overflow: hidden !important;
12
+ }
13
+
14
+ .contact-selector-modal {
15
+ text-align: left;
16
+ font-family: inherit;
17
+ }
18
+
19
+ .contact-modal-header {
20
+ margin-bottom: 15px;
21
+ padding-bottom: 10px;
22
+ border-bottom: 1px solid #e5e7eb;
23
+ }
24
+
25
+ .contact-modal-message {
26
+ margin: 0 0 8px 0;
27
+ color: #374151;
28
+ font-size: 14px;
29
+ }
30
+
31
+ .field-info {
32
+ color: #6b7280;
33
+ font-size: 12px;
34
+ }
35
+
36
+ /* Existing contacts section */
37
+ .existing-contacts {
38
+ margin-bottom: 18px;
39
+ }
40
+
41
+ .existing-contacts h4 {
42
+ margin: 0 0 8px 0;
43
+ font-size: 13px;
44
+ font-weight: 600;
45
+ color: #374151;
46
+ }
47
+
48
+ .contacts-list {
49
+ max-height: 180px;
50
+ overflow-y: auto;
51
+ border: 1px solid #e5e7eb;
52
+ border-radius: 4px;
53
+ padding: 6px;
54
+ background-color: #f9fafb;
55
+ }
56
+
57
+ .contact-item {
58
+ display: flex;
59
+ justify-content: space-between;
60
+ align-items: flex-start;
61
+ padding: 8px;
62
+ margin-bottom: 6px;
63
+ background-color: #ffffff;
64
+ border: 1px solid #e5e7eb;
65
+ border-radius: 4px;
66
+ position: relative;
67
+ }
68
+
69
+ .contact-item:last-child {
70
+ margin-bottom: 0;
71
+ }
72
+
73
+ .contact-info {
74
+ flex: 1;
75
+ min-width: 0;
76
+ }
77
+
78
+ .contact-info strong {
79
+ color: #111827;
80
+ font-weight: 500;
81
+ display: block;
82
+ margin-bottom: 2px;
83
+ }
84
+
85
+ .contact-info small {
86
+ color: #6b7280;
87
+ font-size: 12px;
88
+ }
89
+
90
+ .contact-type {
91
+ display: inline-block;
92
+ background-color: #dbeafe;
93
+ color: #1e40af;
94
+ padding: 2px 6px;
95
+ border-radius: 10px;
96
+ font-size: 10px;
97
+ font-weight: 500;
98
+ margin-top: 4px;
99
+ }
100
+
101
+ .contact-item .contact-type {
102
+ position: absolute;
103
+ top: 8px;
104
+ right: 35px;
105
+ }
106
+
107
+ .remove-contact-btn {
108
+ background-color: #dc2626;
109
+ color: white;
110
+ border: none;
111
+ border-radius: 50%;
112
+ width: 24px;
113
+ height: 24px;
114
+ font-size: 14px;
115
+ font-weight: bold;
116
+ cursor: pointer;
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ flex-shrink: 0;
121
+ transition: background-color 0.2s ease;
122
+ }
123
+
124
+ .remove-contact-btn:hover {
125
+ background-color: #b91c1c;
126
+ }
127
+
128
+ .no-contacts {
129
+ text-align: center;
130
+ color: #6b7280;
131
+ font-style: italic;
132
+ margin: 0;
133
+ padding: 20px;
134
+ }
135
+
136
+ /* Add contact section */
137
+ .add-contact-section {
138
+ border-top: 1px solid #e5e7eb;
139
+ padding-top: 15px;
140
+ }
141
+
142
+ .add-contact-section h4 {
143
+ margin: 0 0 10px 0;
144
+ font-size: 13px;
145
+ font-weight: 600;
146
+ color: #374151;
147
+ }
148
+
149
+ .existing-contact-selector {
150
+ margin-bottom: 15px;
151
+ padding: 12px;
152
+ background-color: #f9fafb;
153
+ border-radius: 6px;
154
+ border: 1px solid #e5e7eb;
155
+ }
156
+
157
+ .existing-contact-selector label {
158
+ display: block;
159
+ margin-bottom: 6px;
160
+ font-weight: 500;
161
+ color: #374151;
162
+ font-size: 12px;
163
+ }
164
+
165
+ .contact-select-row {
166
+ display: flex;
167
+ gap: 8px;
168
+ align-items: flex-end;
169
+ }
170
+
171
+ .existing-contact-selector select {
172
+ flex: 1;
173
+ margin: 0 !important;
174
+ padding: 6px 10px !important;
175
+ border: 1px solid #d1d5db !important;
176
+ border-radius: 4px !important;
177
+ font-size: 13px !important;
178
+ background-color: white !important;
179
+ height: 32px !important;
180
+ min-width: 0;
181
+ }
182
+
183
+ .add-contact-btn {
184
+ background-color: #4f46e5;
185
+ color: white;
186
+ border: none;
187
+ padding: 6px 12px;
188
+ border-radius: 4px;
189
+ font-size: 12px;
190
+ font-weight: 500;
191
+ cursor: pointer;
192
+ transition: background-color 0.2s ease;
193
+ height: 32px;
194
+ white-space: nowrap;
195
+ flex-shrink: 0;
196
+ }
197
+
198
+ .add-contact-btn:hover {
199
+ background-color: #4338ca;
200
+ }
201
+
202
+ .add-contact-btn:disabled {
203
+ background-color: #9ca3af;
204
+ cursor: not-allowed;
205
+ }
206
+
207
+ /* Manual contact section */
208
+ .manual-contact-section {
209
+ border-top: 1px solid #e5e7eb;
210
+ padding-top: 12px;
211
+ }
212
+
213
+ .manual-contact-toggle {
214
+ margin-bottom: 10px;
215
+ }
216
+
217
+ .toggle-manual-btn {
218
+ background-color: #6b7280;
219
+ color: white;
220
+ border: none;
221
+ padding: 8px 16px;
222
+ border-radius: 4px;
223
+ font-size: 12px;
224
+ cursor: pointer;
225
+ transition: background-color 0.2s ease;
226
+ }
227
+
228
+ .toggle-manual-btn:hover {
229
+ background-color: #4b5563;
230
+ }
231
+
232
+ .manual-contact-form {
233
+ padding: 12px;
234
+ background-color: #f9fafb;
235
+ border-radius: 6px;
236
+ border: 1px solid #e5e7eb;
237
+ }
238
+
239
+ .form-group {
240
+ margin-bottom: 10px;
241
+ }
242
+
243
+ .form-group:last-child {
244
+ margin-bottom: 0;
245
+ }
246
+
247
+ .form-field-row {
248
+ display: flex;
249
+ gap: 8px;
250
+ align-items: center;
251
+ }
252
+
253
+ .form-group label {
254
+ font-weight: 500;
255
+ color: #374151;
256
+ font-size: 12px;
257
+ white-space: nowrap;
258
+ min-width: 60px;
259
+ flex-shrink: 0;
260
+ }
261
+
262
+ .form-group input {
263
+ flex: 1;
264
+ margin: 0 !important;
265
+ padding: 6px 10px !important;
266
+ border: 1px solid #d1d5db !important;
267
+ border-radius: 4px !important;
268
+ font-size: 13px !important;
269
+ box-sizing: border-box !important;
270
+ height: 32px !important;
271
+ min-width: 0;
272
+ }
273
+
274
+ .form-group input:focus {
275
+ border-color: #4f46e5 !important;
276
+ outline: none !important;
277
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1) !important;
278
+ }
279
+
280
+ .form-group input[style*="border-color: rgb(220, 38, 38)"] {
281
+ border-color: #dc2626 !important;
282
+ }
283
+
284
+ /* Contact limits */
285
+ .contact-limits {
286
+ margin-top: 15px;
287
+ text-align: center;
288
+ }
289
+
290
+ .contact-limits small {
291
+ color: #6b7280;
292
+ font-size: 11px;
293
+ }
294
+
295
+ /* Responsive design */
296
+ @media (max-width: 640px) {
297
+ .contact-selector-dialog {
298
+ width: 95vw !important;
299
+ max-width: 95vw !important;
300
+ min-width: 300px !important;
301
+ }
302
+
303
+ .contact-select-row {
304
+ flex-direction: column;
305
+ gap: 6px;
306
+ align-items: stretch;
307
+ }
308
+
309
+ .existing-contact-selector select {
310
+ margin-bottom: 6px !important;
311
+ }
312
+
313
+ .add-contact-btn {
314
+ width: 100%;
315
+ height: 36px;
316
+ }
317
+
318
+ .form-field-row {
319
+ flex-direction: column;
320
+ gap: 4px;
321
+ align-items: stretch;
322
+ }
323
+
324
+ .form-group label {
325
+ min-width: auto;
326
+ margin-bottom: 4px;
327
+ }
328
+
329
+ .form-group input {
330
+ height: 36px !important;
331
+ }
332
+
333
+ .contact-item {
334
+ flex-direction: column;
335
+ align-items: flex-start;
336
+ }
337
+
338
+ .contact-type {
339
+ position: static !important;
340
+ margin-top: 8px;
341
+ }
342
+
343
+ .remove-contact-btn {
344
+ position: absolute;
345
+ top: 8px;
346
+ right: 8px;
347
+ }
348
+ }
349
+
350
+ /* Integration with SweetAlert2 */
351
+ .contact-selector-dialog .swal2-html-container {
352
+ margin: 0 !important;
353
+ padding: 0 !important;
354
+ overflow: visible !important;
355
+ }
356
+
357
+ .contact-selector-dialog .swal2-actions {
358
+ margin-top: 20px !important;
359
+ }
360
+
361
+ .contact-selector-dialog .swal2-confirm {
362
+ background-color: var(--primary-color, #4f46e5) !important;
363
+ }
364
+
365
+ .contact-selector-dialog .swal2-cancel {
366
+ background-color: #6b7280 !important;
367
+ }
@@ -0,0 +1,84 @@
1
+ /* Compact Date Picker Dialog Styles */
2
+ .date-picker-dialog {
3
+ max-width: 90vw !important;
4
+ width: auto !important;
5
+ min-width: 300px !important;
6
+ box-sizing: border-box !important;
7
+ }
8
+
9
+ .date-picker-content {
10
+ overflow: hidden !important;
11
+ word-wrap: break-word !important;
12
+ max-width: 100% !important;
13
+ padding: 0 !important;
14
+ }
15
+
16
+ .date-picker-dialog .swal2-html-container {
17
+ max-width: 100% !important;
18
+ overflow: hidden !important;
19
+ margin: 0 !important;
20
+ padding: 0.5rem 0 !important;
21
+ }
22
+
23
+ .date-picker-dialog .swal2-title {
24
+ font-size: 1.1rem !important;
25
+ margin-bottom: 0.5rem !important;
26
+ padding: 0 !important;
27
+ }
28
+
29
+ .date-picker-dialog #swal-date-input {
30
+ width: 100% !important;
31
+ max-width: 100% !important;
32
+ box-sizing: border-box !important;
33
+ padding: 8px 10px !important;
34
+ border: 1px solid #d1d5db !important;
35
+ border-radius: 4px !important;
36
+ font-size: 13px !important;
37
+ font-family: inherit !important;
38
+ background-color: #ffffff !important;
39
+ outline: none !important;
40
+ transition: border-color 0.2s ease !important;
41
+ margin: 0 !important;
42
+ display: block !important;
43
+ overflow: hidden !important;
44
+ height: 34px !important;
45
+ }
46
+
47
+ .date-picker-dialog #swal-date-input:focus {
48
+ border-color: #4f46e5 !important;
49
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1) !important;
50
+ }
51
+
52
+ .date-picker-dialog #swal-date-input:hover {
53
+ border-color: #9ca3af !important;
54
+ }
55
+
56
+ /* Compact responsive adjustments */
57
+ @media (max-width: 480px) {
58
+ .date-picker-dialog {
59
+ width: 95vw !important;
60
+ max-width: 95vw !important;
61
+ min-width: 280px !important;
62
+ margin: 10px !important;
63
+ }
64
+
65
+ .date-picker-dialog #swal-date-input {
66
+ padding: 8px 10px !important;
67
+ font-size: 16px !important; /* Prevents zoom on iOS */
68
+ height: 36px !important;
69
+ }
70
+
71
+ .date-picker-dialog .swal2-title {
72
+ font-size: 1rem !important;
73
+ }
74
+ }
75
+
76
+ /* Fix for SweetAlert2 default input styles that might conflict */
77
+ .date-picker-dialog .swal2-input.swal2-inputerror {
78
+ border-color: #dc2626 !important;
79
+ }
80
+
81
+ .date-picker-dialog .swal2-input.swal2-inputerror:focus {
82
+ border-color: #dc2626 !important;
83
+ box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1) !important;
84
+ }
@@ -405,6 +405,51 @@
405
405
  }
406
406
  }
407
407
 
408
+ .multiselectContainer {
409
+ min-width: 200px;
410
+ }
411
+
412
+ // Override MultiSelect component styles to match our filter theme
413
+ :global(.react-select__control) {
414
+ border: 1px solid rgba(var(--primary-rgb, 0, 123, 255), 0.2) !important;
415
+ border-radius: 4px !important;
416
+ font-size: 0.85rem !important;
417
+ min-height: 34px !important;
418
+
419
+ &:hover {
420
+ border-color: rgba(var(--primary-rgb, 0, 123, 255), 0.4) !important;
421
+ }
422
+ }
423
+
424
+ :global(.react-select__control--is-focused) {
425
+ border-color: var(--primary-color, #007bff) !important;
426
+ box-shadow: 0 0 0 2px rgba(var(--primary-rgb, 0, 123, 255), 0.15) !important;
427
+ }
428
+
429
+ :global(.react-select__placeholder) {
430
+ font-size: 0.85rem !important;
431
+ color: rgba(var(--paragraph-rgb, 33, 37, 41), 0.6) !important;
432
+ }
433
+
434
+ :global(.react-select__multi-value) {
435
+ background-color: rgba(var(--primary-rgb, 0, 123, 255), 0.1) !important;
436
+ border-radius: 3px !important;
437
+ }
438
+
439
+ :global(.react-select__multi-value__label) {
440
+ color: var(--primary-color, #007bff) !important;
441
+ font-size: 0.8rem !important;
442
+ }
443
+
444
+ :global(.react-select__multi-value__remove) {
445
+ color: var(--primary-color, #007bff) !important;
446
+
447
+ &:hover {
448
+ background-color: var(--primary-color, #007bff) !important;
449
+ color: white !important;
450
+ }
451
+ }
452
+
408
453
  .clearFiltersButton {
409
454
  padding: 6px 12px;
410
455
  border-radius: 4px;
@@ -527,6 +572,37 @@
527
572
  max-width: 120px;
528
573
  display: inline-block;
529
574
  }
575
+ }
576
+
577
+ /* Date with contacts display */
578
+ .dateWithContacts {
579
+ display: flex;
580
+ flex-direction: column;
581
+ gap: 4px;
582
+ min-width: 140px;
583
+ }
584
+
585
+ .dateValue {
586
+ font-weight: 500;
587
+ color: var(--paragraph-color, #212529);
588
+ font-size: 0.9rem;
589
+ }
590
+
591
+ .contactsSummary {
592
+ font-size: 0.75rem;
593
+ color: var(--primary-color, #007bff);
594
+ background-color: rgba(var(--primary-rgb, 0, 123, 255), 0.1);
595
+ padding: 2px 6px;
596
+ border-radius: 12px;
597
+ display: flex;
598
+ align-items: center;
599
+ gap: 4px;
600
+ width: fit-content;
601
+ cursor: help;
602
+
603
+ &:hover {
604
+ background-color: rgba(var(--primary-rgb, 0, 123, 255), 0.2);
605
+ }
530
606
 
531
607
  &[data-type='datetime'] {
532
608
  min-width: 160px;
@@ -645,3 +721,103 @@
645
721
  color: rgba(var(--paragraph-color-rgb), 0.65);
646
722
  }
647
723
  }
724
+
725
+ // Enhanced Contact Tooltip Styles
726
+ .contactTooltip {
727
+ background: white;
728
+ border: 1px solid rgba(0, 0, 0, 0.1);
729
+ border-radius: 8px;
730
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
731
+ padding: 0;
732
+ min-width: 250px;
733
+ max-width: 350px;
734
+ font-size: 0.875rem;
735
+ line-height: 1.4;
736
+ position: relative;
737
+ animation: tooltipFadeIn 0.2s ease-out;
738
+ }
739
+
740
+ @keyframes tooltipFadeIn {
741
+ from {
742
+ opacity: 0;
743
+ transform: translateX(-50%) translateY(-100%) scale(0.95);
744
+ }
745
+ to {
746
+ opacity: 1;
747
+ transform: translateX(-50%) translateY(-100%) scale(1);
748
+ }
749
+ }
750
+
751
+ .contactTooltipHeader {
752
+ background: var(--primary-color, #007bff);
753
+ color: white;
754
+ padding: 8px 12px;
755
+ border-radius: 7px 7px 0 0;
756
+ font-size: 0.8rem;
757
+ font-weight: 600;
758
+ text-align: center;
759
+ }
760
+
761
+ .contactTooltipBody {
762
+ padding: 0;
763
+ max-height: 200px;
764
+ overflow-y: auto;
765
+ }
766
+
767
+ .contactTooltipItem {
768
+ padding: 10px 12px;
769
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
770
+
771
+ &:last-child {
772
+ border-bottom: none;
773
+ }
774
+
775
+ &:hover {
776
+ background-color: rgba(var(--primary-rgb, 0, 123, 255), 0.03);
777
+ }
778
+ }
779
+
780
+ .contactName {
781
+ font-weight: 600;
782
+ color: var(--paragraph-color, #212529);
783
+ margin-bottom: 2px;
784
+ }
785
+
786
+ .contactEmail {
787
+ color: var(--primary-color, #007bff);
788
+ font-size: 0.8rem;
789
+ margin-bottom: 4px;
790
+ word-break: break-all;
791
+ }
792
+
793
+ .contactType {
794
+ font-size: 0.75rem;
795
+ color: var(--secondary-color, #6c757d);
796
+ text-transform: uppercase;
797
+ letter-spacing: 0.5px;
798
+ font-weight: 500;
799
+ }
800
+
801
+ .contactTooltipArrow {
802
+ position: absolute;
803
+ bottom: -6px;
804
+ left: 50%;
805
+ transform: translateX(-50%);
806
+ width: 0;
807
+ height: 0;
808
+ border-left: 6px solid transparent;
809
+ border-right: 6px solid transparent;
810
+ border-top: 6px solid white;
811
+
812
+ &::before {
813
+ content: '';
814
+ position: absolute;
815
+ bottom: 1px;
816
+ left: -7px;
817
+ width: 0;
818
+ height: 0;
819
+ border-left: 7px solid transparent;
820
+ border-right: 7px solid transparent;
821
+ border-top: 7px solid rgba(0, 0, 0, 0.1);
822
+ }
823
+ }
package/src/index.js CHANGED
@@ -54,6 +54,8 @@ import GenericDetail from './components/crm/generic/GenericDetail';
54
54
  import GenericDynamic from './components/crm/generic/GenericDynamic';
55
55
  import GenericFormBuilder from './components/crm/generic/GenericFormBuilder';
56
56
  import GenericIndex from './components/crm/generic/GenericIndex';
57
+ import GenericGrid from './components/crm/generic/GenericGrid';
58
+ import GenericReportForm from './components/crm/generic/GenericReportForm';
57
59
  import GenericMain from './components/crm/generic/GenericMain';
58
60
  import GenericQuote from './components/crm/generic/GenericQuote';
59
61
  import GenericReport from './components/crm/generic/GenericReport';
@@ -94,6 +96,8 @@ export {
94
96
  GenericDynamic,
95
97
  GenericFormBuilder,
96
98
  GenericIndex,
99
+ GenericGrid,
100
+ GenericReportForm,
97
101
  GenericMain,
98
102
  GenericQuote,
99
103
  GenericReport,