@visns-studio/visns-components 5.11.19 → 5.11.21
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
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
"validator": "^13.15.15",
|
|
66
66
|
"vite": "^6.3.5",
|
|
67
67
|
"yarn": "^1.22.22",
|
|
68
|
-
"yet-another-react-lightbox": "^3.23.
|
|
68
|
+
"yet-another-react-lightbox": "^3.23.4"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
|
-
"@babel/core": "^7.27.
|
|
71
|
+
"@babel/core": "^7.27.7",
|
|
72
72
|
"@babel/plugin-transform-runtime": "^7.27.4",
|
|
73
73
|
"@babel/preset-env": "^7.27.2",
|
|
74
74
|
"@babel/preset-react": "^7.27.1",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"react-dom": "^17.0.0 || ^18.0.0"
|
|
88
88
|
},
|
|
89
89
|
"name": "@visns-studio/visns-components",
|
|
90
|
-
"version": "5.11.
|
|
90
|
+
"version": "5.11.21",
|
|
91
91
|
"description": "Various packages to assist in the development of our Custom Applications.",
|
|
92
92
|
"main": "src/index.js",
|
|
93
93
|
"files": [
|
|
@@ -110,6 +110,7 @@ import {
|
|
|
110
110
|
renderCreatedByColumn,
|
|
111
111
|
renderDateRangeColumn,
|
|
112
112
|
renderStageCounterColumn,
|
|
113
|
+
renderGalleryColumn,
|
|
113
114
|
} from './columns/ColumnRenderers.jsx';
|
|
114
115
|
import _ from 'lodash';
|
|
115
116
|
|
|
@@ -2549,6 +2550,14 @@ const DataGrid = forwardRef(
|
|
|
2549
2550
|
column,
|
|
2550
2551
|
commonProps,
|
|
2551
2552
|
});
|
|
2553
|
+
case 'gallery':
|
|
2554
|
+
return renderGalleryColumn({
|
|
2555
|
+
column,
|
|
2556
|
+
commonProps,
|
|
2557
|
+
modalGalleryOpen,
|
|
2558
|
+
setGalleryData,
|
|
2559
|
+
setCurrentItem,
|
|
2560
|
+
});
|
|
2552
2561
|
case 'image':
|
|
2553
2562
|
return renderImageColumn({
|
|
2554
2563
|
column,
|
|
@@ -134,7 +134,20 @@ export const renderDateTimeColumn = ({
|
|
|
134
134
|
moment(data[column.id]).isValid() &&
|
|
135
135
|
moment(data[column.id]).format('YYYY-MM-DD') !== '1970-01-01'
|
|
136
136
|
) {
|
|
137
|
-
|
|
137
|
+
let dateValue = moment(data[column.id]);
|
|
138
|
+
|
|
139
|
+
// Apply modifier if present
|
|
140
|
+
if (column.modifier) {
|
|
141
|
+
const { operator, value, unit } = column.modifier;
|
|
142
|
+
|
|
143
|
+
if (operator === '+') {
|
|
144
|
+
dateValue = dateValue.add(value, unit);
|
|
145
|
+
} else if (operator === '-') {
|
|
146
|
+
dateValue = dateValue.subtract(value, unit);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const formattedValue = dateValue.format(
|
|
138
151
|
column.format ? column.format : 'DD-MM-YYYY hh:mm A'
|
|
139
152
|
);
|
|
140
153
|
|
|
@@ -1411,6 +1424,163 @@ export const renderDateRangeColumn = ({
|
|
|
1411
1424
|
};
|
|
1412
1425
|
|
|
1413
1426
|
// Stage Counter Column Renderer
|
|
1427
|
+
// Gallery Column Renderer
|
|
1428
|
+
export const renderGalleryColumn = ({
|
|
1429
|
+
column,
|
|
1430
|
+
commonProps,
|
|
1431
|
+
modalGalleryOpen,
|
|
1432
|
+
setGalleryData,
|
|
1433
|
+
setCurrentItem,
|
|
1434
|
+
}) => {
|
|
1435
|
+
return {
|
|
1436
|
+
...commonProps,
|
|
1437
|
+
name: column.id,
|
|
1438
|
+
sortable: false,
|
|
1439
|
+
render: ({ data }) => {
|
|
1440
|
+
// Function to access nested property using a series of keys
|
|
1441
|
+
const getNestedValue = (data, keys) =>
|
|
1442
|
+
keys.reduce(
|
|
1443
|
+
(currentValue, key) =>
|
|
1444
|
+
currentValue && currentValue[key] !== undefined
|
|
1445
|
+
? currentValue[key]
|
|
1446
|
+
: undefined,
|
|
1447
|
+
data
|
|
1448
|
+
);
|
|
1449
|
+
|
|
1450
|
+
// Get the images array from the nested structure
|
|
1451
|
+
const imagesArray = column.relation
|
|
1452
|
+
? getNestedValue(data, column.relation)
|
|
1453
|
+
: data[column.id];
|
|
1454
|
+
|
|
1455
|
+
// Check if we have valid image data
|
|
1456
|
+
if (!imagesArray || !Array.isArray(imagesArray) || imagesArray.length === 0) {
|
|
1457
|
+
return (
|
|
1458
|
+
<div style={{
|
|
1459
|
+
display: 'flex',
|
|
1460
|
+
alignItems: 'center',
|
|
1461
|
+
justifyContent: 'center',
|
|
1462
|
+
height: '40px',
|
|
1463
|
+
color: '#999',
|
|
1464
|
+
fontSize: '12px'
|
|
1465
|
+
}}>
|
|
1466
|
+
No images
|
|
1467
|
+
</div>
|
|
1468
|
+
);
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
const maxThumbnails = column.maxThumbnails || 3;
|
|
1472
|
+
const displayImages = imagesArray.slice(0, maxThumbnails);
|
|
1473
|
+
const remainingCount = imagesArray.length - maxThumbnails;
|
|
1474
|
+
|
|
1475
|
+
const handleGalleryClick = (e) => {
|
|
1476
|
+
e.stopPropagation();
|
|
1477
|
+
e.preventDefault();
|
|
1478
|
+
|
|
1479
|
+
// Prepare gallery data in the format expected by the modal
|
|
1480
|
+
const galleryData = imagesArray.map((item) => ({
|
|
1481
|
+
src: item[column.key],
|
|
1482
|
+
caption: item[column.captionKey || 'file_name'],
|
|
1483
|
+
width: 320,
|
|
1484
|
+
height: 240,
|
|
1485
|
+
}));
|
|
1486
|
+
|
|
1487
|
+
// Set gallery data and current item
|
|
1488
|
+
setGalleryData(galleryData);
|
|
1489
|
+
setCurrentItem({
|
|
1490
|
+
data: data,
|
|
1491
|
+
settings: {
|
|
1492
|
+
relation: column.relation,
|
|
1493
|
+
key: column.key,
|
|
1494
|
+
captionKey: column.captionKey || 'file_name'
|
|
1495
|
+
}
|
|
1496
|
+
});
|
|
1497
|
+
|
|
1498
|
+
// Open the gallery modal
|
|
1499
|
+
modalGalleryOpen();
|
|
1500
|
+
};
|
|
1501
|
+
|
|
1502
|
+
return (
|
|
1503
|
+
<div
|
|
1504
|
+
onClick={handleGalleryClick}
|
|
1505
|
+
style={{
|
|
1506
|
+
display: 'flex',
|
|
1507
|
+
flexDirection: 'column',
|
|
1508
|
+
alignItems: 'flex-start',
|
|
1509
|
+
gap: '6px',
|
|
1510
|
+
cursor: 'pointer',
|
|
1511
|
+
padding: '6px',
|
|
1512
|
+
borderRadius: '4px',
|
|
1513
|
+
transition: 'background-color 0.2s',
|
|
1514
|
+
width: '100%',
|
|
1515
|
+
height: '100%',
|
|
1516
|
+
minHeight: '60px',
|
|
1517
|
+
}}
|
|
1518
|
+
onMouseEnter={(e) => {
|
|
1519
|
+
e.target.style.backgroundColor = '#f0f0f0';
|
|
1520
|
+
}}
|
|
1521
|
+
onMouseLeave={(e) => {
|
|
1522
|
+
e.target.style.backgroundColor = 'transparent';
|
|
1523
|
+
}}
|
|
1524
|
+
>
|
|
1525
|
+
{/* Thumbnail images */}
|
|
1526
|
+
<div
|
|
1527
|
+
style={{
|
|
1528
|
+
display: 'flex',
|
|
1529
|
+
gap: '4px',
|
|
1530
|
+
flexWrap: 'wrap',
|
|
1531
|
+
}}
|
|
1532
|
+
>
|
|
1533
|
+
{displayImages.map((image, index) => {
|
|
1534
|
+
const imageUrl = image[column.key];
|
|
1535
|
+
if (!imageUrl) return null;
|
|
1536
|
+
|
|
1537
|
+
return (
|
|
1538
|
+
<div
|
|
1539
|
+
key={index}
|
|
1540
|
+
style={{
|
|
1541
|
+
width: '28px',
|
|
1542
|
+
height: '28px',
|
|
1543
|
+
borderRadius: '3px',
|
|
1544
|
+
overflow: 'hidden',
|
|
1545
|
+
border: '1px solid #ddd',
|
|
1546
|
+
flexShrink: 0,
|
|
1547
|
+
}}
|
|
1548
|
+
>
|
|
1549
|
+
<img
|
|
1550
|
+
src={imageUrl}
|
|
1551
|
+
alt={image[column.captionKey || 'file_name'] || `Image ${index + 1}`}
|
|
1552
|
+
style={{
|
|
1553
|
+
width: '100%',
|
|
1554
|
+
height: '100%',
|
|
1555
|
+
objectFit: 'cover',
|
|
1556
|
+
}}
|
|
1557
|
+
onError={(e) => {
|
|
1558
|
+
e.target.style.display = 'none';
|
|
1559
|
+
}}
|
|
1560
|
+
/>
|
|
1561
|
+
</div>
|
|
1562
|
+
);
|
|
1563
|
+
})}
|
|
1564
|
+
</div>
|
|
1565
|
+
|
|
1566
|
+
{/* Count badge */}
|
|
1567
|
+
<div
|
|
1568
|
+
style={{
|
|
1569
|
+
fontSize: '11px',
|
|
1570
|
+
color: '#666',
|
|
1571
|
+
fontWeight: '500',
|
|
1572
|
+
lineHeight: '1.2',
|
|
1573
|
+
}}
|
|
1574
|
+
>
|
|
1575
|
+
{imagesArray.length} {imagesArray.length === 1 ? 'image' : 'images'}
|
|
1576
|
+
{remainingCount > 0 && ` (+${remainingCount})`}
|
|
1577
|
+
</div>
|
|
1578
|
+
</div>
|
|
1579
|
+
);
|
|
1580
|
+
},
|
|
1581
|
+
};
|
|
1582
|
+
};
|
|
1583
|
+
|
|
1414
1584
|
export const renderStageCounterColumn = ({ column, commonProps, navigate }) => {
|
|
1415
1585
|
return {
|
|
1416
1586
|
...commonProps,
|