@visns-studio/visns-components 5.7.17 → 5.7.19

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
@@ -82,7 +82,7 @@
82
82
  "react-dom": "^17.0.0 || ^18.0.0"
83
83
  },
84
84
  "name": "@visns-studio/visns-components",
85
- "version": "5.7.17",
85
+ "version": "5.7.19",
86
86
  "description": "Various packages to assist in the development of our Custom Applications.",
87
87
  "main": "src/index.js",
88
88
  "files": [
@@ -32,6 +32,7 @@ import {
32
32
  ArrowCounterClockwise,
33
33
  ArrowCycle,
34
34
  Backspace,
35
+ BookOpen,
35
36
  Check,
36
37
  CircleCheck,
37
38
  CircleX,
@@ -463,11 +464,26 @@ const DataGrid = forwardRef(
463
464
  const handleDownload = async (d) => {
464
465
  const toastId = toast.loading('Starting download please wait...');
465
466
 
467
+ let requestConfig = {
468
+ url: '',
469
+ method: '',
470
+ param: {},
471
+ };
472
+
473
+ if (d.id) {
474
+ requestConfig.url = `/ajax/files/download/${d.id}/null`;
475
+ requestConfig.method = 'GET';
476
+ } else {
477
+ requestConfig.url = `/ajax/files/downloadByPath`;
478
+ requestConfig.method = 'POST';
479
+ requestConfig.param = d;
480
+ }
481
+
466
482
  try {
467
483
  const res = await Download(
468
- `/ajax/files/download/${d.id}/null`,
469
- 'GET',
470
- {}
484
+ requestConfig.url,
485
+ requestConfig.method,
486
+ requestConfig.param
471
487
  );
472
488
 
473
489
  if (res.data.error) {
@@ -1427,19 +1443,42 @@ const DataGrid = forwardRef(
1427
1443
  const addIcon = (src, icon, alt, tooltipContent, key) => {
1428
1444
  if (src && src !== '') {
1429
1445
  icons.push(
1430
- <img
1431
- src={`${assetPath}${src}`}
1432
- alt={alt}
1433
- data-tooltip-id="system-tooltip"
1434
- data-tooltip-content={tooltipContent}
1446
+ <div
1435
1447
  key={key}
1436
- />
1448
+ style={{
1449
+ display: 'inline-flex',
1450
+ alignItems: 'center',
1451
+ justifyContent: 'center',
1452
+ backgroundColor:
1453
+ 'var(--light-bg-color, #f5f5f5)',
1454
+ borderRadius: '4px',
1455
+ padding: '4px',
1456
+ width: '22px',
1457
+ height: '22px',
1458
+ boxShadow: '0 1px 2px rgba(0,0,0,0.05)',
1459
+ margin: '0 1px',
1460
+ }}
1461
+ >
1462
+ <img
1463
+ src={`${assetPath}${src}`}
1464
+ alt={alt}
1465
+ data-tooltip-id="system-tooltip"
1466
+ data-tooltip-content={tooltipContent}
1467
+ style={{
1468
+ maxHeight: '16px',
1469
+ maxWidth: '16px',
1470
+ objectFit: 'contain',
1471
+ }}
1472
+ />
1473
+ </div>
1437
1474
  );
1438
1475
  } else {
1439
1476
  let IconComponent = null;
1440
1477
 
1441
1478
  if (icon === 'archive') {
1442
1479
  IconComponent = ShippingBoxV1;
1480
+ } else if (icon === 'bookOpen') {
1481
+ IconComponent = BookOpen;
1443
1482
  } else if (icon === 'folder') {
1444
1483
  IconComponent = Folder;
1445
1484
  } else if (icon === 'inbox') {
@@ -1452,14 +1491,33 @@ const DataGrid = forwardRef(
1452
1491
 
1453
1492
  if (IconComponent) {
1454
1493
  icons.push(
1455
- <IconComponent
1456
- data-tooltip-id="system-tooltip"
1457
- data-tooltip-content={tooltipContent}
1458
- strokeWidth={2}
1459
- size={18}
1460
- className={styles.tdaction}
1494
+ <div
1461
1495
  key={key}
1462
- />
1496
+ style={{
1497
+ display: 'inline-flex',
1498
+ alignItems: 'center',
1499
+ justifyContent: 'center',
1500
+ backgroundColor:
1501
+ 'var(--light-bg-color, #f5f5f5)',
1502
+ borderRadius: '4px',
1503
+ padding: '4px',
1504
+ width: '22px',
1505
+ height: '22px',
1506
+ boxShadow: '0 1px 2px rgba(0,0,0,0.05)',
1507
+ margin: '0 1px',
1508
+ }}
1509
+ >
1510
+ <IconComponent
1511
+ data-tooltip-id="system-tooltip"
1512
+ data-tooltip-content={tooltipContent}
1513
+ strokeWidth={2}
1514
+ size={18}
1515
+ className={styles.tdaction}
1516
+ style={{
1517
+ color: 'var(--primary-color, #4a90e2)',
1518
+ }}
1519
+ />
1520
+ </div>
1463
1521
  );
1464
1522
  }
1465
1523
  }
@@ -1494,7 +1552,30 @@ const DataGrid = forwardRef(
1494
1552
  }
1495
1553
  });
1496
1554
 
1497
- return icons;
1555
+ // Return icons wrapped in a flex container for better layout
1556
+ return (
1557
+ <div
1558
+ style={{
1559
+ display: 'inline-flex', // Changed to inline-flex to keep icons in a single row
1560
+ flexWrap: 'nowrap', // Prevent wrapping
1561
+ alignItems: 'center',
1562
+ justifyContent: 'flex-start',
1563
+ gap: '1px', // Reduced gap since we have margins on the icons
1564
+ padding: '2px 0',
1565
+ minHeight: '24px',
1566
+ maxWidth: '100%',
1567
+ overflow: 'hidden', // Hide overflow if too many icons
1568
+ }}
1569
+ >
1570
+ {icons.length > 0 ? (
1571
+ icons
1572
+ ) : (
1573
+ <span style={{ color: '#999', fontSize: '12px' }}>
1574
+ -
1575
+ </span>
1576
+ )}
1577
+ </div>
1578
+ );
1498
1579
  };
1499
1580
 
1500
1581
  /** Table Hooks */
@@ -3007,6 +3088,287 @@ const DataGrid = forwardRef(
3007
3088
  }
3008
3089
  },
3009
3090
  };
3091
+ case 'stageCounter':
3092
+ return {
3093
+ ...commonProps,
3094
+ name: column.id,
3095
+ sortable: false,
3096
+ render: ({ data }) => {
3097
+ if (
3098
+ data &&
3099
+ column.stageConfig &&
3100
+ column.stageConfig.key
3101
+ ) {
3102
+ // Check if the data has the specified key and it's an array
3103
+ const stageData =
3104
+ data[column.stageConfig.key];
3105
+
3106
+ if (
3107
+ stageData &&
3108
+ Array.isArray(stageData)
3109
+ ) {
3110
+ const stageCount =
3111
+ stageData.length;
3112
+
3113
+ // Create a clickable element if link is provided
3114
+ const handleClick = (e) => {
3115
+ e.stopPropagation();
3116
+ e.preventDefault();
3117
+
3118
+ if (
3119
+ column.link &&
3120
+ column.link.url &&
3121
+ column.link.key
3122
+ ) {
3123
+ navigate(
3124
+ `${
3125
+ column.link.url
3126
+ }${
3127
+ data[
3128
+ column.link
3129
+ .key
3130
+ ]
3131
+ }`
3132
+ );
3133
+ }
3134
+ };
3135
+
3136
+ // Create an array of squares based on the stage data
3137
+ const squares = [];
3138
+ for (
3139
+ let i = 0;
3140
+ i < stageCount;
3141
+ i++
3142
+ ) {
3143
+ // Get the stage item
3144
+ const stageItem =
3145
+ stageData[i];
3146
+
3147
+ // Get the label value from the stage item using stageLabelKey if provided
3148
+ let labelValue = '';
3149
+ if (
3150
+ column.stageConfig
3151
+ .stageLabelKey &&
3152
+ stageItem &&
3153
+ stageItem[
3154
+ column.stageConfig
3155
+ .stageLabelKey
3156
+ ] !== undefined
3157
+ ) {
3158
+ // Get the value from the stage item
3159
+ const rawValue =
3160
+ stageItem[
3161
+ column
3162
+ .stageConfig
3163
+ .stageLabelKey
3164
+ ];
3165
+
3166
+ // If it's an object with a name property, use that
3167
+ if (
3168
+ rawValue &&
3169
+ typeof rawValue ===
3170
+ 'object' &&
3171
+ rawValue.name
3172
+ ) {
3173
+ labelValue =
3174
+ rawValue.name.charAt(
3175
+ 0
3176
+ );
3177
+ }
3178
+ // If it's a string, use the first character
3179
+ else if (
3180
+ typeof rawValue ===
3181
+ 'string' &&
3182
+ rawValue.length > 0
3183
+ ) {
3184
+ labelValue =
3185
+ rawValue.charAt(
3186
+ 0
3187
+ );
3188
+ }
3189
+ // Otherwise use the raw value if it can be converted to string
3190
+ else if (
3191
+ rawValue !== null &&
3192
+ rawValue !==
3193
+ undefined
3194
+ ) {
3195
+ labelValue =
3196
+ String(
3197
+ rawValue
3198
+ ).charAt(0);
3199
+ }
3200
+ }
3201
+ // If no stageLabelKey is provided or no value is found, leave it blank
3202
+
3203
+ // Create tooltip content from the full value if available
3204
+ let tooltipContent = `Stage ${
3205
+ i + 1
3206
+ }`;
3207
+ if (
3208
+ column.stageConfig
3209
+ .stageLabelKey &&
3210
+ stageItem &&
3211
+ stageItem[
3212
+ column.stageConfig
3213
+ .stageLabelKey
3214
+ ]
3215
+ ) {
3216
+ const rawValue =
3217
+ stageItem[
3218
+ column
3219
+ .stageConfig
3220
+ .stageLabelKey
3221
+ ];
3222
+ if (
3223
+ rawValue &&
3224
+ typeof rawValue ===
3225
+ 'object' &&
3226
+ rawValue.name
3227
+ ) {
3228
+ tooltipContent = `${
3229
+ rawValue.name
3230
+ } (Stage ${i + 1})`;
3231
+ } else if (
3232
+ rawValue !== null &&
3233
+ rawValue !==
3234
+ undefined
3235
+ ) {
3236
+ tooltipContent = `Stage ${
3237
+ i + 1
3238
+ })`;
3239
+ }
3240
+ }
3241
+
3242
+ // Determine the background color based on stageColour configuration
3243
+ let backgroundColor =
3244
+ 'var(--primary-color, #4a90e2)';
3245
+
3246
+ if (
3247
+ column.stageConfig
3248
+ .stageColour &&
3249
+ column.stageConfig
3250
+ .stageColour.key &&
3251
+ column.stageConfig
3252
+ .stageColour
3253
+ .options &&
3254
+ stageItem
3255
+ ) {
3256
+ const colourKey =
3257
+ column.stageConfig
3258
+ .stageColour
3259
+ .key;
3260
+ const colourOptions =
3261
+ column.stageConfig
3262
+ .stageColour
3263
+ .options;
3264
+
3265
+ // Get the value for the color key
3266
+ if (
3267
+ stageItem[
3268
+ colourKey
3269
+ ] !== undefined
3270
+ ) {
3271
+ const keyValue =
3272
+ stageItem[
3273
+ colourKey
3274
+ ];
3275
+
3276
+ // Find matching option
3277
+ const matchingOption =
3278
+ colourOptions.find(
3279
+ (
3280
+ option
3281
+ ) => {
3282
+ // Handle both direct value and object with id
3283
+ if (
3284
+ typeof keyValue ===
3285
+ 'object' &&
3286
+ keyValue !==
3287
+ null
3288
+ ) {
3289
+ // Use loose equality (==) to handle type coercion between string and number
3290
+ return (
3291
+ keyValue.id ==
3292
+ option.id
3293
+ );
3294
+ }
3295
+ // Use loose equality (==) to handle type coercion between string and number
3296
+ return (
3297
+ keyValue ==
3298
+ option.id
3299
+ );
3300
+ }
3301
+ );
3302
+
3303
+ // Use the color from the matching option if found
3304
+ if (
3305
+ matchingOption &&
3306
+ matchingOption.colour
3307
+ ) {
3308
+ backgroundColor =
3309
+ matchingOption.colour;
3310
+ }
3311
+ }
3312
+ }
3313
+
3314
+ squares.push(
3315
+ <div
3316
+ key={i}
3317
+ style={{
3318
+ width: '20px',
3319
+ height: '20px',
3320
+ backgroundColor:
3321
+ backgroundColor,
3322
+ borderRadius:
3323
+ '3px',
3324
+ margin: '0 2px',
3325
+ display: 'flex',
3326
+ justifyContent:
3327
+ 'center',
3328
+ alignItems:
3329
+ 'center',
3330
+ color: 'white',
3331
+ fontSize:
3332
+ '11px',
3333
+ fontWeight:
3334
+ 'bold',
3335
+ }}
3336
+ data-tooltip-id="system-tooltip"
3337
+ data-tooltip-content={
3338
+ tooltipContent
3339
+ }
3340
+ >
3341
+ {labelValue}
3342
+ </div>
3343
+ );
3344
+ }
3345
+
3346
+ return (
3347
+ <div
3348
+ onClick={handleClick}
3349
+ style={{
3350
+ display: 'flex',
3351
+ flexWrap: 'wrap',
3352
+ justifyContent:
3353
+ 'center',
3354
+ alignItems:
3355
+ 'center',
3356
+ cursor: column.link
3357
+ ? 'pointer'
3358
+ : 'default',
3359
+ gap: '4px',
3360
+ padding: '2px 0',
3361
+ maxWidth: '100%',
3362
+ }}
3363
+ >
3364
+ {squares}
3365
+ </div>
3366
+ );
3367
+ }
3368
+ }
3369
+ return null;
3370
+ },
3371
+ };
3010
3372
  case 'url':
3011
3373
  return {
3012
3374
  ...commonProps,