@visns-studio/visns-components 5.13.9 → 5.13.10

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.
package/package.json CHANGED
@@ -88,7 +88,7 @@
88
88
  "react-dom": "^17.0.0 || ^18.0.0"
89
89
  },
90
90
  "name": "@visns-studio/visns-components",
91
- "version": "5.13.9",
91
+ "version": "5.13.10",
92
92
  "description": "Various packages to assist in the development of our Custom Applications.",
93
93
  "main": "src/index.js",
94
94
  "files": [
@@ -638,11 +638,46 @@ function GenericDetail({
638
638
  }
639
639
  };
640
640
 
641
- const handleExport = ({ url, key }) => {
641
+ const handleExport = ({ url, key, method = 'GET' }) => {
642
642
  if (!url) return toast.error('Export URL not found');
643
643
 
644
- const exportUrl = key ? `${url}/${data[key]}` : url;
645
- window.open(exportUrl);
644
+ let exportUrl = url;
645
+
646
+ // Replace {id} placeholder with actual ID value
647
+ if (key && data[key]) {
648
+ exportUrl = url.replace('{id}', data[key]);
649
+ } else if (url.includes('{id}') && data.id) {
650
+ exportUrl = url.replace('{id}', data.id);
651
+ }
652
+
653
+ // Legacy support: append key value to URL if no placeholder found
654
+ if (!url.includes('{id}') && key && data[key]) {
655
+ exportUrl = `${url}/${data[key]}`;
656
+ }
657
+
658
+ if (method === 'POST') {
659
+ // Create a form to submit POST request
660
+ const form = document.createElement('form');
661
+ form.method = 'POST';
662
+ form.action = exportUrl;
663
+ form.target = '_blank';
664
+
665
+ // Add CSRF token if available
666
+ const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
667
+ if (csrfToken) {
668
+ const csrfInput = document.createElement('input');
669
+ csrfInput.type = 'hidden';
670
+ csrfInput.name = '_token';
671
+ csrfInput.value = csrfToken;
672
+ form.appendChild(csrfInput);
673
+ }
674
+
675
+ document.body.appendChild(form);
676
+ form.submit();
677
+ document.body.removeChild(form);
678
+ } else {
679
+ window.open(exportUrl);
680
+ }
646
681
  };
647
682
 
648
683
  const handleCustomAction = async (action) => {
@@ -1398,6 +1433,115 @@ function GenericDetail({
1398
1433
  case 'total':
1399
1434
  return renderTotal();
1400
1435
  default:
1436
+ if (id === 'proposalDynamic') {
1437
+ return size === 'full' && truncatedValue
1438
+ ? <div className={styles.proposalDynamicContainer}>
1439
+ <iframe
1440
+ srcDoc={`
1441
+ <!DOCTYPE html>
1442
+ <html>
1443
+ <head>
1444
+ <style>
1445
+ body {
1446
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
1447
+ font-size: 14px;
1448
+ line-height: 1.5;
1449
+ color: #333;
1450
+ margin: 0;
1451
+ padding: 16px;
1452
+ overflow-wrap: break-word;
1453
+ word-wrap: break-word;
1454
+ }
1455
+ h1, h2, h3, h4, h5, h6 {
1456
+ font-size: 1.2em;
1457
+ font-weight: bold;
1458
+ margin: 0.5em 0;
1459
+ padding: 0;
1460
+ line-height: 1.3;
1461
+ }
1462
+ p, div, span {
1463
+ margin: 0 0 0.5em 0;
1464
+ padding: 0;
1465
+ font-size: 14px;
1466
+ line-height: 1.5;
1467
+ }
1468
+ table {
1469
+ max-width: 100%;
1470
+ border-collapse: collapse;
1471
+ font-size: 14px;
1472
+ margin: 0.5em 0;
1473
+ }
1474
+ td, th {
1475
+ padding: 0.25em 0.5em;
1476
+ font-size: 14px;
1477
+ line-height: 1.3;
1478
+ }
1479
+ img {
1480
+ max-width: 100%;
1481
+ height: auto;
1482
+ display: block;
1483
+ margin: 0.5em 0;
1484
+ }
1485
+ </style>
1486
+ </head>
1487
+ <body>
1488
+ <br /><p>${truncatedValue}</p>
1489
+ </body>
1490
+ </html>
1491
+ `}
1492
+ style={{
1493
+ width: '100%',
1494
+ minHeight: '400px',
1495
+ border: 'none',
1496
+ backgroundColor: 'transparent'
1497
+ }}
1498
+ onLoad={(e) => {
1499
+ const iframe = e.target;
1500
+ const doc = iframe.contentDocument || iframe.contentWindow.document;
1501
+ const height = doc.body.scrollHeight;
1502
+ iframe.style.height = height + 'px';
1503
+ }}
1504
+ />
1505
+ </div>
1506
+ : <div className={styles.proposalDynamicContainer}>
1507
+ <iframe
1508
+ srcDoc={`
1509
+ <!DOCTYPE html>
1510
+ <html>
1511
+ <head>
1512
+ <style>
1513
+ body {
1514
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
1515
+ font-size: 14px;
1516
+ line-height: 1.5;
1517
+ color: #333;
1518
+ margin: 0;
1519
+ padding: 16px;
1520
+ overflow-wrap: break-word;
1521
+ word-wrap: break-word;
1522
+ }
1523
+ </style>
1524
+ </head>
1525
+ <body>
1526
+ ${truncatedValue}
1527
+ </body>
1528
+ </html>
1529
+ `}
1530
+ style={{
1531
+ width: '100%',
1532
+ minHeight: '200px',
1533
+ border: 'none',
1534
+ backgroundColor: 'transparent'
1535
+ }}
1536
+ onLoad={(e) => {
1537
+ const iframe = e.target;
1538
+ const doc = iframe.contentDocument || iframe.contentWindow.document;
1539
+ const height = doc.body.scrollHeight;
1540
+ iframe.style.height = height + 'px';
1541
+ }}
1542
+ />
1543
+ </div>;
1544
+ }
1401
1545
  return size === 'full' && truncatedValue
1402
1546
  ? parse(`<br /><p>${truncatedValue}</p>`)
1403
1547
  : truncatedValue;
@@ -2528,7 +2672,7 @@ function GenericDetail({
2528
2672
  )
2529
2673
  }
2530
2674
  >
2531
- Export
2675
+ {activeTabConfig.export.label || 'Export'}
2532
2676
  </button>
2533
2677
  )}
2534
2678
 
@@ -0,0 +1,491 @@
1
+ /* Agreement Signature Editor Styles */
2
+ .signature-editor-container {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 1.5rem;
6
+ max-width: 1000px;
7
+ margin: 0 auto;
8
+ }
9
+
10
+ .signature-editor-header {
11
+ text-align: center;
12
+ padding: 1rem;
13
+ background: var(--bg-color, #f8fafc);
14
+ border-radius: 8px;
15
+ border: 1px solid var(--paragraph-color, #e2e8f0);
16
+ }
17
+
18
+ .signature-editor-header h3 {
19
+ font-size: 1.25rem;
20
+ font-weight: 600;
21
+ color: var(--header-color, #1e293b);
22
+ margin: 0 0 0.5rem 0;
23
+ }
24
+
25
+ .signature-editor-header p {
26
+ color: var(--paragraph-color, #64748b);
27
+ margin: 0;
28
+ font-size: 0.875rem;
29
+ }
30
+
31
+ .signature-editor-content {
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: 1.5rem;
35
+ }
36
+
37
+ .signature-editor-section {
38
+ background: var(--tertiary-color, white);
39
+ padding: 1.5rem;
40
+ border-radius: 8px;
41
+ border: 1px solid var(--paragraph-color, #e2e8f0);
42
+ }
43
+
44
+ .signature-editor-label {
45
+ display: block;
46
+ font-size: 0.875rem;
47
+ font-weight: 600;
48
+ color: var(--header-color, #374151);
49
+ margin-bottom: 0.5rem;
50
+ }
51
+
52
+ .signature-editor-input,
53
+ .signature-editor-textarea {
54
+ width: 100%;
55
+ padding: 0.75rem;
56
+ border: 1px solid var(--paragraph-color, #d1d5db);
57
+ border-radius: 6px;
58
+ font-size: 0.875rem;
59
+ background: var(--tertiary-color, white);
60
+ color: var(--paragraph-color, #374151);
61
+ transition: border-color 0.2s;
62
+ }
63
+
64
+ .signature-editor-input:focus,
65
+ .signature-editor-textarea:focus {
66
+ outline: none;
67
+ border-color: var(--primary-color, #3cbf7d);
68
+ box-shadow: 0 0 0 3px rgba(var(--primary-rgb, 60, 191, 125), 0.1);
69
+ }
70
+
71
+ .signature-editor-textarea {
72
+ resize: vertical;
73
+ min-height: 80px;
74
+ }
75
+
76
+ .signature-editor-help {
77
+ display: block;
78
+ font-size: 0.75rem;
79
+ color: var(--paragraph-color, #9ca3af);
80
+ margin-top: 0.25rem;
81
+ }
82
+
83
+ .signature-editor-fields-header {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ margin-bottom: 1rem;
88
+ }
89
+
90
+ .signature-btn {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ gap: 0.5rem;
94
+ padding: 0.5rem 1rem;
95
+ font-size: 0.875rem;
96
+ font-weight: 600;
97
+ border-radius: 6px;
98
+ cursor: pointer;
99
+ transition: all 0.2s;
100
+ border: none;
101
+ text-decoration: none;
102
+ user-select: none;
103
+ }
104
+
105
+ .signature-btn.small {
106
+ padding: 0.375rem 0.75rem;
107
+ font-size: 0.8rem;
108
+ }
109
+
110
+ .signature-btn.primary {
111
+ background: var(--primary-color, #3cbf7d);
112
+ color: var(--tertiary-color, white);
113
+ border: 1px solid var(--primary-color, #3cbf7d);
114
+ }
115
+
116
+ .signature-btn.primary:hover:not(:disabled) {
117
+ background: var(--header-color, #2da967);
118
+ border-color: var(--header-color, #2da967);
119
+ transform: translateY(-1px);
120
+ }
121
+
122
+ .signature-btn.secondary {
123
+ background: var(--tertiary-color, white);
124
+ color: var(--paragraph-color, #6b7280);
125
+ border: 1px solid var(--paragraph-color, #d1d5db);
126
+ }
127
+
128
+ .signature-btn.secondary:hover:not(:disabled) {
129
+ background: var(--bg-color, #f9fafb);
130
+ border-color: var(--paragraph-color, #9ca3af);
131
+ }
132
+
133
+ .signature-btn:disabled {
134
+ opacity: 0.5;
135
+ cursor: not-allowed;
136
+ transform: none;
137
+ }
138
+
139
+ /* Fields List */
140
+ .signature-fields-list {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: 0.5rem;
144
+ }
145
+
146
+ .signature-field-item {
147
+ background: var(--bg-color, #f8fafc);
148
+ border: 1px solid var(--paragraph-color, #e2e8f0);
149
+ border-radius: 6px;
150
+ padding: 1rem;
151
+ transition: all 0.2s;
152
+ }
153
+
154
+ .signature-field-item:hover {
155
+ border-color: var(--primary-color, #3cbf7d);
156
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
157
+ }
158
+
159
+ .signature-field-header {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 0.75rem;
163
+ }
164
+
165
+ .signature-drag-handle {
166
+ cursor: grab;
167
+ color: var(--paragraph-color, #9ca3af);
168
+ padding: 0.25rem;
169
+ border-radius: 4px;
170
+ transition: all 0.2s;
171
+ }
172
+
173
+ .signature-drag-handle:hover {
174
+ color: var(--primary-color, #3cbf7d);
175
+ background: rgba(var(--primary-rgb, 60, 191, 125), 0.1);
176
+ }
177
+
178
+ .signature-drag-handle:active {
179
+ cursor: grabbing;
180
+ }
181
+
182
+ .signature-field-info {
183
+ flex: 1;
184
+ display: flex;
185
+ flex-direction: column;
186
+ gap: 0.25rem;
187
+ }
188
+
189
+ .signature-field-label {
190
+ font-weight: 600;
191
+ color: var(--header-color, #1e293b);
192
+ font-size: 0.875rem;
193
+ }
194
+
195
+ .signature-field-type {
196
+ font-size: 0.75rem;
197
+ color: var(--paragraph-color, #64748b);
198
+ text-transform: capitalize;
199
+ }
200
+
201
+ .signature-field-actions {
202
+ display: flex;
203
+ align-items: center;
204
+ gap: 0.5rem;
205
+ }
206
+
207
+ .signature-field-btn {
208
+ padding: 0.375rem;
209
+ border: none;
210
+ border-radius: 4px;
211
+ cursor: pointer;
212
+ transition: all 0.2s;
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ }
217
+
218
+ .signature-field-btn.edit {
219
+ background: var(--bg-color, #eff6ff);
220
+ color: var(--primary-color, #2563eb);
221
+ }
222
+
223
+ .signature-field-btn.edit:hover {
224
+ background: var(--primary-color, #dbeafe);
225
+ color: var(--primary-color, #1d4ed8);
226
+ }
227
+
228
+ .signature-field-btn.delete {
229
+ background: var(--bg-color, #fef2f2);
230
+ color: var(--paragraph-color, #dc2626);
231
+ }
232
+
233
+ .signature-field-btn.delete:hover {
234
+ background: var(--bg-color, #fee2e2);
235
+ color: var(--paragraph-color, #b91c1c);
236
+ }
237
+
238
+ .signature-field-placeholder {
239
+ margin-top: 0.5rem;
240
+ font-size: 0.75rem;
241
+ color: var(--paragraph-color, #9ca3af);
242
+ padding-left: 2.5rem;
243
+ }
244
+
245
+ .signature-field-helper {
246
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15) !important;
247
+ border-color: var(--primary-color, #3cbf7d) !important;
248
+ transform: rotate(2deg) !important;
249
+ z-index: 9999 !important;
250
+ }
251
+
252
+ /* Empty State */
253
+ .signature-editor-empty {
254
+ text-align: center;
255
+ padding: 3rem;
256
+ color: var(--paragraph-color, #9ca3af);
257
+ background: var(--bg-color, #f8fafc);
258
+ border: 2px dashed var(--paragraph-color, #cbd5e1);
259
+ border-radius: 8px;
260
+ }
261
+
262
+ .signature-editor-empty svg {
263
+ margin-bottom: 1rem;
264
+ }
265
+
266
+ .signature-editor-empty p {
267
+ margin-bottom: 1rem;
268
+ color: var(--paragraph-color, #64748b);
269
+ }
270
+
271
+ /* Preview */
272
+ .signature-editor-preview {
273
+ background: var(--tertiary-color, white);
274
+ padding: 1.5rem;
275
+ border-radius: 8px;
276
+ border: 1px solid var(--paragraph-color, #e2e8f0);
277
+ }
278
+
279
+ .signature-editor-preview h4 {
280
+ font-size: 1rem;
281
+ font-weight: 600;
282
+ color: var(--header-color, #1e293b);
283
+ margin: 0 0 1rem 0;
284
+ }
285
+
286
+ .signature-editor-preview-content {
287
+ border: 1px solid var(--paragraph-color, #e2e8f0);
288
+ border-radius: 6px;
289
+ overflow: hidden;
290
+ }
291
+
292
+ /* Actions */
293
+ .signature-editor-actions {
294
+ display: flex;
295
+ justify-content: flex-end;
296
+ gap: 0.75rem;
297
+ padding: 1rem;
298
+ background: var(--bg-color, #f8fafc);
299
+ border-radius: 8px;
300
+ border: 1px solid var(--paragraph-color, #e2e8f0);
301
+ }
302
+
303
+ /* Loading */
304
+ .signature-editor-loading {
305
+ display: flex;
306
+ flex-direction: column;
307
+ align-items: center;
308
+ justify-content: center;
309
+ padding: 3rem;
310
+ text-align: center;
311
+ }
312
+
313
+ .signature-editor-spinner {
314
+ width: 2rem;
315
+ height: 2rem;
316
+ border: 2px solid var(--paragraph-color, #e2e8f0);
317
+ border-top: 2px solid var(--primary-color, #3cbf7d);
318
+ border-radius: 50%;
319
+ animation: spin 1s linear infinite;
320
+ margin-bottom: 1rem;
321
+ }
322
+
323
+ @keyframes spin {
324
+ 0% { transform: rotate(0deg); }
325
+ 100% { transform: rotate(360deg); }
326
+ }
327
+
328
+ /* Field Editor Modal */
329
+ .signature-editor-overlay {
330
+ position: fixed;
331
+ inset: 0;
332
+ background: rgba(0, 0, 0, 0.5);
333
+ backdrop-filter: blur(4px);
334
+ display: flex;
335
+ align-items: center;
336
+ justify-content: center;
337
+ z-index: 1000;
338
+ }
339
+
340
+ .signature-editor-modal {
341
+ background: var(--tertiary-color, white);
342
+ border-radius: 8px;
343
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
344
+ max-width: 600px;
345
+ width: 90%;
346
+ max-height: 90vh;
347
+ overflow-y: auto;
348
+ }
349
+
350
+ .signature-field-editor {
351
+ padding: 1.5rem;
352
+ }
353
+
354
+ .signature-field-editor-header {
355
+ display: flex;
356
+ align-items: center;
357
+ justify-content: space-between;
358
+ margin-bottom: 1.5rem;
359
+ padding-bottom: 1rem;
360
+ border-bottom: 1px solid var(--paragraph-color, #e2e8f0);
361
+ }
362
+
363
+ .signature-field-editor-header h4 {
364
+ font-size: 1.125rem;
365
+ font-weight: 600;
366
+ color: var(--header-color, #1e293b);
367
+ margin: 0;
368
+ }
369
+
370
+ .signature-field-editor-close {
371
+ padding: 0.5rem;
372
+ border: none;
373
+ background: none;
374
+ color: var(--paragraph-color, #9ca3af);
375
+ cursor: pointer;
376
+ border-radius: 4px;
377
+ transition: all 0.2s;
378
+ }
379
+
380
+ .signature-field-editor-close:hover {
381
+ background: var(--bg-color, #f3f4f6);
382
+ color: var(--paragraph-color, #6b7280);
383
+ }
384
+
385
+ .signature-field-editor-form {
386
+ display: flex;
387
+ flex-direction: column;
388
+ gap: 1rem;
389
+ }
390
+
391
+ .signature-field-editor-grid {
392
+ display: grid;
393
+ grid-template-columns: 1fr 1fr;
394
+ gap: 1rem;
395
+ }
396
+
397
+ .signature-field-editor-group {
398
+ display: flex;
399
+ flex-direction: column;
400
+ }
401
+
402
+ .signature-field-editor-group label {
403
+ font-size: 0.875rem;
404
+ font-weight: 600;
405
+ color: var(--header-color, #374151);
406
+ margin-bottom: 0.5rem;
407
+ }
408
+
409
+ .signature-field-editor-group input,
410
+ .signature-field-editor-group select {
411
+ padding: 0.5rem;
412
+ border: 1px solid var(--paragraph-color, #d1d5db);
413
+ border-radius: 4px;
414
+ font-size: 0.875rem;
415
+ background: var(--tertiary-color, white);
416
+ color: var(--paragraph-color, #374151);
417
+ }
418
+
419
+ .signature-field-editor-group input:focus,
420
+ .signature-field-editor-group select:focus {
421
+ outline: none;
422
+ border-color: var(--primary-color, #3cbf7d);
423
+ box-shadow: 0 0 0 3px rgba(var(--primary-rgb, 60, 191, 125), 0.1);
424
+ }
425
+
426
+ .signature-field-editor-checkbox {
427
+ display: flex;
428
+ align-items: center;
429
+ gap: 0.5rem;
430
+ padding: 0.5rem;
431
+ background: var(--bg-color, #f8fafc);
432
+ border-radius: 4px;
433
+ }
434
+
435
+ .signature-field-editor-checkbox label {
436
+ display: flex;
437
+ align-items: center;
438
+ gap: 0.5rem;
439
+ font-size: 0.875rem;
440
+ color: var(--paragraph-color, #374151);
441
+ cursor: pointer;
442
+ }
443
+
444
+ .signature-field-editor-checkbox input[type="checkbox"] {
445
+ accent-color: var(--primary-color, #3cbf7d);
446
+ }
447
+
448
+ .signature-field-editor-actions {
449
+ display: flex;
450
+ justify-content: flex-end;
451
+ gap: 0.75rem;
452
+ padding-top: 1rem;
453
+ border-top: 1px solid var(--paragraph-color, #e2e8f0);
454
+ }
455
+
456
+ /* Responsive Design */
457
+ @media (max-width: 768px) {
458
+ .signature-editor-container {
459
+ padding: 1rem;
460
+ }
461
+
462
+ .signature-editor-fields-header {
463
+ flex-direction: column;
464
+ align-items: flex-start;
465
+ gap: 1rem;
466
+ }
467
+
468
+ .signature-field-header {
469
+ flex-direction: column;
470
+ align-items: flex-start;
471
+ gap: 0.5rem;
472
+ }
473
+
474
+ .signature-field-actions {
475
+ width: 100%;
476
+ justify-content: flex-end;
477
+ }
478
+
479
+ .signature-editor-actions {
480
+ flex-direction: column;
481
+ }
482
+
483
+ .signature-field-editor-grid {
484
+ grid-template-columns: 1fr;
485
+ }
486
+
487
+ .signature-editor-modal {
488
+ width: 95%;
489
+ margin: 1rem;
490
+ }
491
+ }