@indico-data/design-system 2.48.0 → 2.50.0

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 (41) hide show
  1. package/lib/components/table/Table.stories.d.ts +1 -0
  2. package/lib/components/table/components/HorizontalStickyHeader.d.ts +10 -0
  3. package/lib/components/table/components/__tests__/HorizontalStickyHeader.test.d.ts +1 -0
  4. package/lib/components/table/components/helpers.d.ts +6 -0
  5. package/lib/components/table/hooks/usePinnedColumnsManager.d.ts +8 -0
  6. package/lib/components/table/sampleData.d.ts +4 -0
  7. package/lib/components/table/types.d.ts +11 -1
  8. package/lib/components/table/utils/processColumns.d.ts +2 -0
  9. package/lib/index.css +188 -89
  10. package/lib/index.d.ts +12 -1
  11. package/lib/index.esm.css +188 -89
  12. package/lib/index.esm.js +238 -2
  13. package/lib/index.esm.js.map +1 -1
  14. package/lib/index.js +238 -2
  15. package/lib/index.js.map +1 -1
  16. package/lib/stylesAndAnimations/utilityClasses/UtilityClassesData.d.ts +7 -0
  17. package/lib/stylesAndAnimations/utilityClasses/UtilityClassesTable.d.ts +1 -0
  18. package/lib/stylesAndAnimations/utilityClasses/UtilityClassesTable.stories.d.ts +6 -0
  19. package/lib/utils/getPreviousHeadersWidth.d.ts +1 -0
  20. package/package.json +1 -1
  21. package/src/components/table/Table.mdx +134 -0
  22. package/src/components/table/Table.stories.tsx +71 -2
  23. package/src/components/table/Table.tsx +16 -1
  24. package/src/components/table/components/HorizontalStickyHeader.tsx +57 -0
  25. package/src/components/table/components/__tests__/HorizontalStickyHeader.test.tsx +104 -0
  26. package/src/components/table/components/helpers.ts +90 -0
  27. package/src/components/table/hooks/usePinnedColumnsManager.ts +146 -0
  28. package/src/components/table/{sampleData.ts → sampleData.tsx} +156 -1
  29. package/src/components/table/styles/Table.scss +32 -15
  30. package/src/components/table/styles/_variables.scss +2 -0
  31. package/src/components/table/types.ts +13 -1
  32. package/src/components/table/utils/processColumns.tsx +35 -0
  33. package/src/setup/setupTests.ts +8 -0
  34. package/src/storybookDocs/Permafrost.mdx +22 -11
  35. package/src/styles/_borders.scss +2 -1
  36. package/src/stylesAndAnimations/borders/BorderColor.tsx +14 -6
  37. package/src/stylesAndAnimations/utilityClasses/UtilityClasses.mdx +24 -0
  38. package/src/stylesAndAnimations/utilityClasses/UtilityClassesData.ts +230 -0
  39. package/src/stylesAndAnimations/utilityClasses/UtilityClassesTable.stories.tsx +13 -0
  40. package/src/stylesAndAnimations/utilityClasses/UtilityClassesTable.tsx +146 -0
  41. package/src/utils/getPreviousHeadersWidth.ts +12 -0
package/lib/index.esm.css CHANGED
@@ -804,6 +804,8 @@ a:hover,
804
804
  --pf-table-highlighted-box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4), 0 8px 16px rgba(0, 0, 0, 0.3);
805
805
  --pf-table-font-size: var(--pf-font-size-body2);
806
806
  --pf-table-pagination-background-color: var(--pf-primary-color-700);
807
+ --pf-table-pinned-column-border-color: var(--pf-primary-color-100);
808
+ --pf-table-pinned-column-background-color: var(--pf-table-background-color);
807
809
  }
808
810
 
809
811
  .table-loading {
@@ -856,6 +858,20 @@ a:hover,
856
858
  .table-body::-webkit-scrollbar-thumb:hover {
857
859
  background: var(--pf-primary-color);
858
860
  }
861
+ .table .table__column__pin-action {
862
+ padding: 0;
863
+ padding-right: var(--pf-padding-1);
864
+ }
865
+ .table .table__column--is-pinned {
866
+ opacity: 1;
867
+ }
868
+ .table .table__column--is-not-pinned {
869
+ opacity: 0.3;
870
+ }
871
+ .table .table__header-cell {
872
+ display: flex;
873
+ align-items: center;
874
+ }
859
875
  .table > *:nth-child(3) {
860
876
  margin-top: auto;
861
877
  background-color: transparent;
@@ -881,27 +897,26 @@ a:hover,
881
897
  .table button:disabled svg {
882
898
  fill: var(--pf-table-disabled-button-color);
883
899
  }
900
+ .table .rdt_TableHead {
901
+ z-index: 3;
902
+ }
884
903
  .table .rdt_TableHeader {
885
904
  border-radius: var(--pf-rounded) 0;
886
905
  border: var(--pf-border-sm) solid var(--pf-table-border-color);
887
906
  border-bottom: none;
888
907
  }
889
- .table .rdt_TableHeadRow > :first-child,
890
- .table .rdt_TableRow > :first-child {
891
- padding-left: var(--pf-padding-4);
892
- min-width: 60px;
893
- justify-content: left;
894
- }
895
908
  .table .rdt_TableRow {
896
909
  border-top: var(--pf-border-sm) solid var(--pf-table-border-color);
897
910
  border-bottom: var(--pf-border-sm) solid var(--pf-table-border-color);
898
911
  }
912
+ .table .rdt_TableRow:hover {
913
+ border-top: var(--pf-border-sm) solid var(--pf-table-border-color);
914
+ border-bottom: var(--pf-border-sm) solid var(--pf-table-border-color);
915
+ outline-color: var(--pf-table-border-color);
916
+ }
899
917
  .table .rdt_TableRow:hover .rdt_TableCell {
900
918
  background-color: var(--pf-table-hover-color) !important;
901
919
  }
902
- .table .rdt_TableRow:first-child .rdt_TableCell {
903
- border-top: var(--pf-border-sm) solid var(--pf-table-border-color);
904
- }
905
920
  .table .rdt_TableCell,
906
921
  .table .rdt_TableCol {
907
922
  font-size: var(--pf-table-font-size);
@@ -910,6 +925,10 @@ a:hover,
910
925
  .table .rdt_TableCol:not(:first-child) {
911
926
  border-left: var(--pf-border-sm) solid var(--pf-table-border-color);
912
927
  }
928
+ .table .rdt_TableCell:not(:last-of-type),
929
+ .table .rdt_TableCol:not(:last-of-type) {
930
+ border-bottom-width: 0;
931
+ }
913
932
  .table .table--striped .rdt_TableRow:nth-child(odd) .rdt_TableCell {
914
933
  background-color: var(--pf-table-stripe-color);
915
934
  }
@@ -4185,124 +4204,124 @@ p,
4185
4204
  border-color: var(--pf-secondary-color-900);
4186
4205
  }
4187
4206
 
4188
- .border-gray {
4189
- border-color: var(--pf-gray-color);
4207
+ .border-tertiary {
4208
+ border-color: var(--pf-tertiary-color);
4190
4209
  }
4191
4210
 
4192
- .border-gray-100 {
4193
- border-color: var(--pf-gray-color-100);
4211
+ .border-tertiary-100 {
4212
+ border-color: var(--pf-tertiary-color-100);
4194
4213
  }
4195
4214
 
4196
- .border-gray-200 {
4197
- border-color: var(--pf-gray-color-200);
4215
+ .border-tertiary-200 {
4216
+ border-color: var(--pf-tertiary-color-200);
4198
4217
  }
4199
4218
 
4200
- .border-gray-300 {
4201
- border-color: var(--pf-gray-color-300);
4219
+ .border-tertiary-300 {
4220
+ border-color: var(--pf-tertiary-color-300);
4202
4221
  }
4203
4222
 
4204
- .border-gray-400 {
4205
- border-color: var(--pf-gray-color-400);
4223
+ .border-tertiary-400 {
4224
+ border-color: var(--pf-tertiary-color-400);
4206
4225
  }
4207
4226
 
4208
- .border-gray-500 {
4209
- border-color: var(--pf-gray-color-500);
4227
+ .border-tertiary-500 {
4228
+ border-color: var(--pf-tertiary-color-500);
4210
4229
  }
4211
4230
 
4212
- .border-gray-600 {
4213
- border-color: var(--pf-gray-color-600);
4231
+ .border-tertiary-600 {
4232
+ border-color: var(--pf-tertiary-color-600);
4214
4233
  }
4215
4234
 
4216
- .border-gray-700 {
4217
- border-color: var(--pf-gray-color-700);
4235
+ .border-tertiary-700 {
4236
+ border-color: var(--pf-tertiary-color-700);
4218
4237
  }
4219
4238
 
4220
- .border-gray-800 {
4221
- border-color: var(--pf-gray-color-800);
4239
+ .border-tertiary-800 {
4240
+ border-color: var(--pf-tertiary-color-800);
4222
4241
  }
4223
4242
 
4224
- .border-gray-900 {
4225
- border-color: var(--pf-gray-color-900);
4243
+ .border-tertiary-900 {
4244
+ border-color: var(--pf-tertiary-color-900);
4226
4245
  }
4227
4246
 
4228
- .border-steel {
4229
- border-color: var(--pf-steel-color);
4247
+ .border-gray {
4248
+ border-color: var(--pf-gray-color);
4230
4249
  }
4231
4250
 
4232
- .border-steel-100 {
4233
- border-color: var(--pf-steel-color-100);
4251
+ .border-gray-100 {
4252
+ border-color: var(--pf-gray-color-100);
4234
4253
  }
4235
4254
 
4236
- .border-steel-200 {
4237
- border-color: var(--pf-steel-color-200);
4255
+ .border-gray-200 {
4256
+ border-color: var(--pf-gray-color-200);
4238
4257
  }
4239
4258
 
4240
- .border-steel-300 {
4241
- border-color: var(--pf-steel-color-300);
4259
+ .border-gray-300 {
4260
+ border-color: var(--pf-gray-color-300);
4242
4261
  }
4243
4262
 
4244
- .border-steel-400 {
4245
- border-color: var(--pf-steel-color-400);
4263
+ .border-gray-400 {
4264
+ border-color: var(--pf-gray-color-400);
4246
4265
  }
4247
4266
 
4248
- .border-steel-500 {
4249
- border-color: var(--pf-steel-color-500);
4267
+ .border-gray-500 {
4268
+ border-color: var(--pf-gray-color-500);
4250
4269
  }
4251
4270
 
4252
- .border-steel-600 {
4253
- border-color: var(--pf-steel-color-600);
4271
+ .border-gray-600 {
4272
+ border-color: var(--pf-gray-color-600);
4254
4273
  }
4255
4274
 
4256
- .border-steel-700 {
4257
- border-color: var(--pf-steel-color-700);
4275
+ .border-gray-700 {
4276
+ border-color: var(--pf-gray-color-700);
4258
4277
  }
4259
4278
 
4260
- .border-steel-800 {
4261
- border-color: var(--pf-steel-color-800);
4279
+ .border-gray-800 {
4280
+ border-color: var(--pf-gray-color-800);
4262
4281
  }
4263
4282
 
4264
- .border-steel-900 {
4265
- border-color: var(--pf-steel-color-900);
4283
+ .border-gray-900 {
4284
+ border-color: var(--pf-gray-color-900);
4266
4285
  }
4267
4286
 
4268
- .border-green {
4269
- border-color: var(--pf-green-color);
4287
+ .border-red {
4288
+ border-color: var(--pf-red-color);
4270
4289
  }
4271
4290
 
4272
- .border-green-100 {
4273
- border-color: var(--pf-green-color-100);
4291
+ .border-red-100 {
4292
+ border-color: var(--pf-red-color-100);
4274
4293
  }
4275
4294
 
4276
- .border-green-200 {
4277
- border-color: var(--pf-green-color-200);
4295
+ .border-red-200 {
4296
+ border-color: var(--pf-red-color-200);
4278
4297
  }
4279
4298
 
4280
- .border-green-300 {
4281
- border-color: var(--pf-green-color-300);
4299
+ .border-red-300 {
4300
+ border-color: var(--pf-red-color-300);
4282
4301
  }
4283
4302
 
4284
- .border-green-400 {
4285
- border-color: var(--pf-green-color-400);
4303
+ .border-red-400 {
4304
+ border-color: var(--pf-red-color-400);
4286
4305
  }
4287
4306
 
4288
- .border-green-500 {
4289
- border-color: var(--pf-green-color-500);
4307
+ .border-red-500 {
4308
+ border-color: var(--pf-red-color-500);
4290
4309
  }
4291
4310
 
4292
- .border-green-600 {
4293
- border-color: var(--pf-green-color-600);
4311
+ .border-red-600 {
4312
+ border-color: var(--pf-red-color-600);
4294
4313
  }
4295
4314
 
4296
- .border-green-700 {
4297
- border-color: var(--pf-green-color-700);
4315
+ .border-red-700 {
4316
+ border-color: var(--pf-red-color-700);
4298
4317
  }
4299
4318
 
4300
- .border-green-800 {
4301
- border-color: var(--pf-green-color-800);
4319
+ .border-red-800 {
4320
+ border-color: var(--pf-red-color-800);
4302
4321
  }
4303
4322
 
4304
- .border-green-900 {
4305
- border-color: var(--pf-green-color-900);
4323
+ .border-red-900 {
4324
+ border-color: var(--pf-red-color-900);
4306
4325
  }
4307
4326
 
4308
4327
  .border-orange {
@@ -4345,44 +4364,124 @@ p,
4345
4364
  border-color: var(--pf-orange-color-900);
4346
4365
  }
4347
4366
 
4348
- .border-red {
4349
- border-color: var(--pf-red-color);
4367
+ .border-yellow {
4368
+ border-color: var(--pf-yellow-color);
4350
4369
  }
4351
4370
 
4352
- .border-red-100 {
4353
- border-color: var(--pf-red-color-100);
4371
+ .border-yellow-100 {
4372
+ border-color: var(--pf-yellow-color-100);
4354
4373
  }
4355
4374
 
4356
- .border-red-200 {
4357
- border-color: var(--pf-red-color-200);
4375
+ .border-yellow-200 {
4376
+ border-color: var(--pf-yellow-color-200);
4358
4377
  }
4359
4378
 
4360
- .border-red-300 {
4361
- border-color: var(--pf-red-color-300);
4379
+ .border-yellow-300 {
4380
+ border-color: var(--pf-yellow-color-300);
4362
4381
  }
4363
4382
 
4364
- .border-red-400 {
4365
- border-color: var(--pf-red-color-400);
4383
+ .border-yellow-400 {
4384
+ border-color: var(--pf-yellow-color-400);
4366
4385
  }
4367
4386
 
4368
- .border-red-500 {
4369
- border-color: var(--pf-red-color-500);
4387
+ .border-yellow-500 {
4388
+ border-color: var(--pf-yellow-color-500);
4370
4389
  }
4371
4390
 
4372
- .border-red-600 {
4373
- border-color: var(--pf-red-color-600);
4391
+ .border-yellow-600 {
4392
+ border-color: var(--pf-yellow-color-600);
4374
4393
  }
4375
4394
 
4376
- .border-red-700 {
4377
- border-color: var(--pf-red-color-700);
4395
+ .border-yellow-700 {
4396
+ border-color: var(--pf-yellow-color-700);
4378
4397
  }
4379
4398
 
4380
- .border-red-800 {
4381
- border-color: var(--pf-red-color-800);
4399
+ .border-yellow-800 {
4400
+ border-color: var(--pf-yellow-color-800);
4382
4401
  }
4383
4402
 
4384
- .border-red-900 {
4385
- border-color: var(--pf-red-color-900);
4403
+ .border-yellow-900 {
4404
+ border-color: var(--pf-yellow-color-900);
4405
+ }
4406
+
4407
+ .border-green {
4408
+ border-color: var(--pf-green-color);
4409
+ }
4410
+
4411
+ .border-green-100 {
4412
+ border-color: var(--pf-green-color-100);
4413
+ }
4414
+
4415
+ .border-green-200 {
4416
+ border-color: var(--pf-green-color-200);
4417
+ }
4418
+
4419
+ .border-green-300 {
4420
+ border-color: var(--pf-green-color-300);
4421
+ }
4422
+
4423
+ .border-green-400 {
4424
+ border-color: var(--pf-green-color-400);
4425
+ }
4426
+
4427
+ .border-green-500 {
4428
+ border-color: var(--pf-green-color-500);
4429
+ }
4430
+
4431
+ .border-green-600 {
4432
+ border-color: var(--pf-green-color-600);
4433
+ }
4434
+
4435
+ .border-green-700 {
4436
+ border-color: var(--pf-green-color-700);
4437
+ }
4438
+
4439
+ .border-green-800 {
4440
+ border-color: var(--pf-green-color-800);
4441
+ }
4442
+
4443
+ .border-green-900 {
4444
+ border-color: var(--pf-green-color-900);
4445
+ }
4446
+
4447
+ .border-purple {
4448
+ border-color: var(--pf-purple-color);
4449
+ }
4450
+
4451
+ .border-purple-100 {
4452
+ border-color: var(--pf-purple-color-100);
4453
+ }
4454
+
4455
+ .border-purple-200 {
4456
+ border-color: var(--pf-purple-color-200);
4457
+ }
4458
+
4459
+ .border-purple-300 {
4460
+ border-color: var(--pf-purple-color-300);
4461
+ }
4462
+
4463
+ .border-purple-400 {
4464
+ border-color: var(--pf-purple-color-400);
4465
+ }
4466
+
4467
+ .border-purple-500 {
4468
+ border-color: var(--pf-purple-color-500);
4469
+ }
4470
+
4471
+ .border-purple-600 {
4472
+ border-color: var(--pf-purple-color-600);
4473
+ }
4474
+
4475
+ .border-purple-700 {
4476
+ border-color: var(--pf-purple-color-700);
4477
+ }
4478
+
4479
+ .border-purple-800 {
4480
+ border-color: var(--pf-purple-color-800);
4481
+ }
4482
+
4483
+ .border-purple-900 {
4484
+ border-color: var(--pf-purple-color-900);
4386
4485
  }
4387
4486
 
4388
4487
  .rounded {
package/lib/index.esm.js CHANGED
@@ -2603,6 +2603,16 @@ function __rest(s, e) {
2603
2603
  return t;
2604
2604
  }
2605
2605
 
2606
+ function __awaiter(thisArg, _arguments, P, generator) {
2607
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2608
+ return new (P || (P = Promise))(function (resolve, reject) {
2609
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2610
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
2611
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
2612
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
2613
+ });
2614
+ }
2615
+
2606
2616
  typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
2607
2617
  var e = new Error(message);
2608
2618
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
@@ -7256,8 +7266,234 @@ const TablePagination = ({ rowsPerPage, rowCount, onChangePage, currentPage, tot
7256
7266
  return (jsx("div", { className: "table__pagination", children: jsxs(Row, { align: "center", justify: "between", children: [jsx(Col, { xs: "content", children: totalEntriesText && (jsx("span", { "data-testid": "table-pagination-total-entries", className: "table__pagination-total-entries", children: totalEntriesText })) }), jsx(Col, { xs: "content", children: jsx(Pagination, { "data-testid": "table-pagination-component", totalPages: totalPages, currentPage: currentPage, onChange: (page) => onChangePage(page, rowsPerPage) }) })] }) }));
7257
7267
  };
7258
7268
 
7269
+ // Gets the width of the previous pinned columns
7270
+ const getPreviousHeadersWidth = (position, pinnedColumnIds) => {
7271
+ let totalWidth = 0;
7272
+ // Add checkbox column width if it's pinned
7273
+ if (pinnedColumnIds.includes('checkbox-column')) {
7274
+ const checkboxCell = document.querySelector('.rdt_TableCol:not([data-column-id])');
7275
+ if (checkboxCell) {
7276
+ totalWidth += checkboxCell.offsetWidth;
7277
+ }
7278
+ }
7279
+ // Add widths of other pinned columns before this position
7280
+ const previousHeaders = Array.from({ length: position }, (_, i) => {
7281
+ const header = document.querySelector(`[data-column-id="sticky-column-${i}"]`);
7282
+ if (header && pinnedColumnIds.includes(`sticky-column-${i}`)) {
7283
+ return header;
7284
+ }
7285
+ return null;
7286
+ }).filter((header) => header !== null);
7287
+ // Calculate base width from previous columns
7288
+ totalWidth = previousHeaders.reduce((acc, header) => {
7289
+ return acc + header.offsetWidth;
7290
+ }, totalWidth);
7291
+ // Leave this for if we ever try to fix the auto width columns
7292
+ // There is a bug where borders cause the offset to be wrong, this keeps it in sync.
7293
+ // Add offset that increases by 1 every two columns after index 1
7294
+ // if (position >= 2) {
7295
+ // const additionalOffset = Math.floor((position - 2) / 2) + 1;
7296
+ // totalWidth += additionalOffset;
7297
+ // }
7298
+ return totalWidth;
7299
+ };
7300
+ // Applies sticky styles to the column header
7301
+ const applyStickyStylesToTableHeader = (position, left) => __awaiter(void 0, void 0, void 0, function* () {
7302
+ const header = document.querySelector(`[data-column-id="sticky-column-${position}"]`);
7303
+ if (header) {
7304
+ header.style.position = 'sticky';
7305
+ header.style.left = `${left}px`;
7306
+ header.style.zIndex = '3';
7307
+ header.style.backgroundColor =
7308
+ 'var(--pf-table-pinned-column-background-color)';
7309
+ }
7310
+ });
7311
+ // Sorts the pinned columns so that any column that is pinned comes before any column that is not.
7312
+ const sortPinnedColumns = (columns, pinnedColumnIds) => {
7313
+ return [...columns].sort((a, b) => {
7314
+ const aIsPinned = pinnedColumnIds.includes(a.id);
7315
+ const bIsPinned = pinnedColumnIds.includes(b.id);
7316
+ if (aIsPinned && !bIsPinned)
7317
+ return -1; // a comes first
7318
+ if (!aIsPinned && bIsPinned)
7319
+ return 1; // b comes first
7320
+ return 0; // maintain relative order for columns with same pinned state
7321
+ });
7322
+ };
7323
+ // Gets the styles for the pinned columns
7324
+ const getPinnedColumnStyles = (isPinned, index, pinnedColumnIds) => {
7325
+ return isPinned
7326
+ ? {
7327
+ position: 'sticky',
7328
+ left: `${getPreviousHeadersWidth(index, pinnedColumnIds)}px`,
7329
+ zIndex: 3,
7330
+ backgroundColor: 'var(--pf-table-pinned-column-background-color)',
7331
+ }
7332
+ : {
7333
+ position: undefined,
7334
+ left: undefined,
7335
+ zIndex: undefined,
7336
+ backgroundColor: undefined,
7337
+ };
7338
+ };
7339
+ const clearStickyStyles = (header) => {
7340
+ header.style.position = '';
7341
+ header.style.left = '';
7342
+ header.style.zIndex = '';
7343
+ header.style.backgroundColor = '';
7344
+ };
7345
+
7346
+ const HorizontalStickyHeader = ({ children, position, onPinColumn, isPinned = false, pinnedColumnIds, }) => {
7347
+ useEffect(() => {
7348
+ const calculateWidth = () => __awaiter(void 0, void 0, void 0, function* () {
7349
+ yield new Promise((resolve) => setTimeout(resolve, 0));
7350
+ const header = document.querySelector(`[data-column-id="sticky-column-${position}"]`);
7351
+ if (header) {
7352
+ if (isPinned) {
7353
+ const width = getPreviousHeadersWidth(position, pinnedColumnIds);
7354
+ yield applyStickyStylesToTableHeader(position, width);
7355
+ }
7356
+ else {
7357
+ clearStickyStyles(header);
7358
+ }
7359
+ }
7360
+ });
7361
+ calculateWidth();
7362
+ }, [position, isPinned, pinnedColumnIds]);
7363
+ return (jsxs("div", { className: "table__header-cell", "data-testid": `sticky-column-${position}`, children: [jsx(Button$1, { "data-testid": `sticky-header-pin-button-${position}`, variant: "link", size: "sm", iconLeft: "pin", onClick: onPinColumn, ariaLabel: isPinned ? 'Unpin column' : 'Pin column', className: `table__column--${isPinned ? 'is-pinned' : 'is-not-pinned'} table__column__pin-action` }), jsx("div", { className: "table__header-content", children: children })] }));
7364
+ };
7365
+
7366
+ const processColumns = (columns, pinnedColumnIds, togglePinnedColumn) => {
7367
+ return columns.map((column, index) => {
7368
+ const dataColumnId = `sticky-column-${index}`;
7369
+ const isPinned = pinnedColumnIds.includes(dataColumnId);
7370
+ const headerContent = column.isPinned !== undefined ? (jsx(HorizontalStickyHeader, { position: index, isPinned: isPinned, onPinColumn: () => togglePinnedColumn(column.id), pinnedColumnIds: pinnedColumnIds, children: column.name })) : (jsx(Fragment, { children: column.name }));
7371
+ return Object.assign(Object.assign({}, column), { name: headerContent, id: dataColumnId, style: getPinnedColumnStyles(isPinned, index, pinnedColumnIds) });
7372
+ });
7373
+ };
7374
+
7375
+ /**
7376
+ * Hook to manage pinned columns in a table
7377
+ * Handles initialization, toggling, positioning and resizing of pinned columns
7378
+ */
7379
+ const usePinnedColumnsManager = (columns, canPinColumns, onPinnedColumnsChange) => {
7380
+ const pinnedColumnIds = columns.filter((column) => column.isPinned).map((column) => column.id);
7381
+ // `dataColumnIds` is the list of IDs used as `data-column-id` attributes on the table headers and cells
7382
+ const dataColumnIds = useMemo(() => {
7383
+ const ids = columns
7384
+ .map((column, index) => (column.isPinned ? `sticky-column-${index}` : null))
7385
+ .filter((id) => id !== null);
7386
+ return ids.length > 0 ? ['checkbox-column', ...ids] : ids;
7387
+ }, [columns]);
7388
+ // Toggle individual column pin state
7389
+ const togglePinnedColumn = useCallback((columnId) => {
7390
+ const prevPinnedColumns = pinnedColumnIds;
7391
+ // Handle unpinning
7392
+ if (prevPinnedColumns.some((id) => id === columnId)) {
7393
+ onPinnedColumnsChange === null || onPinnedColumnsChange === void 0 ? void 0 : onPinnedColumnsChange(prevPinnedColumns.filter((id) => id !== columnId));
7394
+ }
7395
+ else {
7396
+ onPinnedColumnsChange === null || onPinnedColumnsChange === void 0 ? void 0 : onPinnedColumnsChange(prevPinnedColumns.concat(columnId));
7397
+ }
7398
+ }, [pinnedColumnIds, onPinnedColumnsChange]);
7399
+ // Handle resize events and recalculate pinned column positions
7400
+ useEffect(() => {
7401
+ if (!canPinColumns)
7402
+ return;
7403
+ const recalculatePositions = () => {
7404
+ // Reset all column styles and remove last-pinned-column class
7405
+ const allCells = document.querySelectorAll('.rdt_TableCol, .rdt_TableCell');
7406
+ allCells.forEach((cell) => {
7407
+ cell.style.position = '';
7408
+ cell.style.left = '';
7409
+ cell.style.zIndex = '';
7410
+ cell.style.backgroundColor = '';
7411
+ cell.style.borderRight = '';
7412
+ });
7413
+ // Apply styles to pinned columns
7414
+ dataColumnIds.forEach((column, index) => {
7415
+ const isLastPinnedColumn = index === dataColumnIds.length - 1;
7416
+ if (column === 'checkbox-column') {
7417
+ // Handle header checkbox
7418
+ const headerCheckbox = document.querySelector('.rdt_TableCol:not([data-column-id])');
7419
+ if (headerCheckbox) {
7420
+ headerCheckbox.style.position = 'sticky';
7421
+ headerCheckbox.style.left = '0';
7422
+ headerCheckbox.style.zIndex = '4';
7423
+ headerCheckbox.style.backgroundColor =
7424
+ 'var(--pf-table-background-color)';
7425
+ }
7426
+ // Handle cell checkboxes
7427
+ const cellCheckboxes = document.querySelectorAll('.rdt_TableCell:first-child');
7428
+ cellCheckboxes.forEach((cell) => {
7429
+ cell.style.position = 'sticky';
7430
+ cell.style.left = '0';
7431
+ cell.style.zIndex = '2';
7432
+ cell.style.backgroundColor =
7433
+ 'var(--pf-table-pinned-column-background-color)';
7434
+ if (isLastPinnedColumn) {
7435
+ cell.style.borderRight =
7436
+ `2px solid var(--pf-table-pinned-column-border-color)`;
7437
+ }
7438
+ });
7439
+ }
7440
+ else {
7441
+ const columnIndex = parseInt(column.split('-')[2]);
7442
+ const left = getPreviousHeadersWidth(columnIndex, dataColumnIds);
7443
+ // Headers
7444
+ const headers = document.querySelectorAll(`.rdt_TableCol[data-column-id="sticky-column-${columnIndex}"]`);
7445
+ headers.forEach((header) => {
7446
+ header.style.position = 'sticky';
7447
+ header.style.left = `${left}px`;
7448
+ header.style.zIndex = '2';
7449
+ header.style.backgroundColor =
7450
+ 'var(--pf-table-pinned-column-background-color)';
7451
+ if (isLastPinnedColumn) {
7452
+ header.style.borderRight =
7453
+ `2px solid var(--pf-table-pinned-column-border-color)`;
7454
+ }
7455
+ });
7456
+ // Cells
7457
+ const cells = document.querySelectorAll(`.rdt_TableCell[data-column-id="sticky-column-${columnIndex}"]`);
7458
+ cells.forEach((cell) => {
7459
+ cell.style.position = 'sticky';
7460
+ cell.style.left = `${left}px`;
7461
+ cell.style.zIndex = '2';
7462
+ cell.style.backgroundColor =
7463
+ 'var(--pf-table-pinned-column-background-color)';
7464
+ if (isLastPinnedColumn) {
7465
+ cell.style.borderRight =
7466
+ `2px solid var(--pf-table-pinned-column-border-color)`;
7467
+ }
7468
+ });
7469
+ }
7470
+ });
7471
+ };
7472
+ // Set up resize observers
7473
+ const table = document.querySelector('.rdt_Table');
7474
+ const resizeObserver = new ResizeObserver(recalculatePositions);
7475
+ if (table) {
7476
+ resizeObserver.observe(table);
7477
+ }
7478
+ window.addEventListener('resize', recalculatePositions);
7479
+ return () => {
7480
+ resizeObserver.disconnect();
7481
+ window.removeEventListener('resize', recalculatePositions);
7482
+ };
7483
+ }, [canPinColumns, dataColumnIds]);
7484
+ // Process columns for rendering with pin state
7485
+ const columnsWithPinning = canPinColumns
7486
+ ? sortPinnedColumns(processColumns(columns, dataColumnIds, togglePinnedColumn), dataColumnIds)
7487
+ : columns;
7488
+ return {
7489
+ columnsWithPinning, // Columns with pin state and handlers applied
7490
+ };
7491
+ };
7492
+
7259
7493
  const Table = (props) => {
7260
- const { responsive = true, direction = 'auto', keyField = 'id', striped = false, noDataComponent = 'built-in', isDisabled, isLoading, isFullHeight = false, subHeaderAlign = 'left', className, paginationTotalRows, totalEntriesText } = props, rest = __rest(props, ["responsive", "direction", "keyField", "striped", "noDataComponent", "isDisabled", "isLoading", "isFullHeight", "subHeaderAlign", "className", "paginationTotalRows", "totalEntriesText"]);
7494
+ const { responsive = true, direction = 'auto', keyField = 'id', striped = false, noDataComponent = 'built-in', isDisabled, isLoading, isFullHeight = false, subHeaderAlign = 'left', className, paginationTotalRows, totalEntriesText, data, columns: initialColumns, canPinColumns = false, onPinnedColumnsChange } = props, rest = __rest(props, ["responsive", "direction", "keyField", "striped", "noDataComponent", "isDisabled", "isLoading", "isFullHeight", "subHeaderAlign", "className", "paginationTotalRows", "totalEntriesText", "data", "columns", "canPinColumns", "onPinnedColumnsChange"]);
7495
+ // Turns on/off column pinning.
7496
+ const { columnsWithPinning } = usePinnedColumnsManager(initialColumns, canPinColumns, onPinnedColumnsChange);
7261
7497
  const combinedClassName = classNames(className, {
7262
7498
  'table--striped': striped,
7263
7499
  'table-body': true,
@@ -7265,7 +7501,7 @@ const Table = (props) => {
7265
7501
  const tableWrapperClassName = classNames('table', {
7266
7502
  'table--full-height': isFullHeight,
7267
7503
  });
7268
- return (jsx("div", { className: tableWrapperClassName, "data-testid": "table", children: jsx(Xe, Object.assign({ responsive: responsive, direction: direction, subHeaderAlign: subHeaderAlign, keyField: keyField, striped: striped, className: combinedClassName, disabled: isDisabled, noDataComponent: noDataComponent, progressPending: isLoading, progressComponent: jsx(LoadingComponent, {}), pagination: true, paginationComponent: (props) => (jsx(TablePagination, Object.assign({}, props, { totalEntriesText: totalEntriesText }))), paginationTotalRows: paginationTotalRows }, rest)) }));
7504
+ return (jsx("div", { className: tableWrapperClassName, "data-testid": "table", children: jsx(Xe, Object.assign({ data: data, columns: columnsWithPinning, responsive: responsive, direction: direction, subHeaderAlign: subHeaderAlign, keyField: keyField, striped: striped, className: combinedClassName, disabled: isDisabled, noDataComponent: noDataComponent, progressPending: isLoading, progressComponent: jsx(LoadingComponent, {}), pagination: true, paginationComponent: (props) => (jsx(TablePagination, Object.assign({}, props, { totalEntriesText: totalEntriesText }))), paginationTotalRows: paginationTotalRows, highlightOnHover: true, pointerOnHover: true }, rest)) }));
7269
7505
  };
7270
7506
 
7271
7507
  const Radio = React__default.forwardRef((_a, ref) => {