@rancher/shell 0.1.21 → 0.2.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.
Files changed (32) hide show
  1. package/assets/styles/global/_button.scss +1 -0
  2. package/assets/translations/en-us.yaml +48 -6
  3. package/assets/translations/zh-hans.yaml +18 -0
  4. package/components/HarvesterServiceAddOnConfig.vue +10 -10
  5. package/components/ResourceList/index.vue +34 -14
  6. package/components/ResourceTable.vue +19 -0
  7. package/components/SortableTable/THead.vue +311 -70
  8. package/components/SortableTable/advanced-filtering.js +272 -0
  9. package/components/SortableTable/filtering.js +90 -29
  10. package/components/SortableTable/index.vue +474 -271
  11. package/components/form/WorkloadPorts.vue +2 -2
  12. package/config/product/settings.js +1 -0
  13. package/config/product/uiplugins.js +1 -0
  14. package/config/uiplugins.js +13 -0
  15. package/creators/app/init +2 -2
  16. package/creators/app/package.json +1 -1
  17. package/creators/pkg/package.json +1 -1
  18. package/detail/provisioning.cattle.io.cluster.vue +1 -1
  19. package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -1
  20. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +0 -1
  21. package/edit/provisioning.cattle.io.cluster/rke2.vue +25 -24
  22. package/edit/service.vue +1 -1
  23. package/models/management.cattle.io.cluster.js +9 -1
  24. package/package.json +1 -1
  25. package/pages/c/_cluster/apps/charts/install.vue +119 -31
  26. package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
  27. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +5 -2
  28. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +1 -1
  29. package/pages/c/_cluster/uiplugins/index.vue +48 -11
  30. package/promptRemove/mixin/roleDeletionCheck.js +15 -1
  31. package/scripts/record-deps.js +3 -3
  32. package/store/type-map.js +2 -0
@@ -17,6 +17,8 @@ import sorting from './sorting';
17
17
  import paging from './paging';
18
18
  import grouping from './grouping';
19
19
  import actions from './actions';
20
+ import AdvancedFiltering from './advanced-filtering';
21
+ import LabeledSelect from '@shell/components/form/LabeledSelect';
20
22
  // Uncomment for table performance debugging
21
23
  // import tableDebug from './debug';
22
24
 
@@ -53,7 +55,7 @@ export const COLUMN_BREAKPOINTS = {
53
55
  export default {
54
56
  name: 'SortableTable',
55
57
  components: {
56
- THead, Checkbox, AsyncButton, ActionDropdown
58
+ THead, Checkbox, AsyncButton, ActionDropdown, LabeledSelect
57
59
  },
58
60
  mixins: [
59
61
  filtering,
@@ -62,6 +64,7 @@ export default {
62
64
  grouping,
63
65
  selection,
64
66
  actions,
67
+ AdvancedFiltering,
65
68
  // For table performance debugging - uncomment and uncomment the corresponding import
66
69
  // tableDebug,
67
70
  ],
@@ -294,17 +297,17 @@ export default {
294
297
  componentTestid: {
295
298
  type: String,
296
299
  default: 'sortable-table'
297
- }
300
+ },
298
301
  },
299
302
 
300
303
  data() {
301
304
  return {
302
- currentPhase: ASYNC_BUTTON_STATES.WAITING,
303
- expanded: {},
304
- searchQuery: '',
305
- eventualSearchQuery: '',
306
- actionOfInterest: null,
307
- loadingDelay: false,
305
+ currentPhase: ASYNC_BUTTON_STATES.WAITING,
306
+ expanded: {},
307
+ searchQuery: '',
308
+ eventualSearchQuery: '',
309
+ actionOfInterest: null,
310
+ loadingDelay: false,
308
311
  };
309
312
  },
310
313
 
@@ -466,6 +469,13 @@ export default {
466
469
  }
467
470
  }
468
471
 
472
+ // handle cols visibility and filtering if there is advanced filtering
473
+ if (this.hasAdvancedFiltering) {
474
+ const cols = this.handleColsVisibilyAndFiltering(out);
475
+
476
+ return cols;
477
+ }
478
+
469
479
  return out;
470
480
  },
471
481
 
@@ -545,7 +555,7 @@ export default {
545
555
  group.rows.push(rowData);
546
556
 
547
557
  this.columns.forEach((c) => {
548
- const value = c.delayLoading ? undefined : this.valueFor(row, c);
558
+ const value = c.delayLoading ? undefined : this.valueFor(row, c, c.isLabel);
549
559
  let component;
550
560
  let formatted = value;
551
561
  let needRef = false;
@@ -700,11 +710,15 @@ export default {
700
710
  return ucFirst(col.name);
701
711
  },
702
712
 
703
- valueFor(row, col) {
713
+ valueFor(row, col, isLabel) {
704
714
  if (typeof col.value === 'function') {
705
715
  return col.value(row);
706
716
  }
707
717
 
718
+ if (isLabel) {
719
+ return row.metadata.labels[col.label];
720
+ }
721
+
708
722
  // Use to debug table columns using expensive value getters
709
723
  // console.warn(`Performance: Table valueFor: ${ col.name } ${ col.value }`); // eslint-disable-line no-console
710
724
 
@@ -834,7 +848,11 @@ export default {
834
848
  <div ref="container">
835
849
  <div :class="{'titled': $slots.title && $slots.title.length}" class="sortable-table-header">
836
850
  <slot name="title" />
837
- <div v-if="showHeaderRow" class="fixed-header-actions" :class="{button: !!$slots['header-button']}">
851
+ <div
852
+ v-if="showHeaderRow"
853
+ class="fixed-header-actions"
854
+ :class="{button: !!$slots['header-button'], 'advanced-filtering': hasAdvancedFiltering}"
855
+ >
838
856
  <div :class="bulkActionsClass" class="bulk">
839
857
  <slot name="header-left">
840
858
  <template v-if="tableActions">
@@ -890,21 +908,77 @@ export default {
890
908
  </template>
891
909
  </slot>
892
910
  </div>
893
- <div v-if="isTooManyItemsToAutoUpdate || $slots['header-middle'] && $slots['header-middle'].length" class="middle">
911
+ <div v-if="!hasAdvancedFiltering && ($slots['header-middle'] && $slots['header-middle'].length)" class="middle">
894
912
  <slot name="header-middle" />
913
+ </div>
914
+
915
+ <div v-if="search || hasAdvancedFiltering || isTooManyItemsToAutoUpdate || ($slots['header-right'] && $slots['header-right'].length)" class="search row">
916
+ <ul v-if="hasAdvancedFiltering" class="advanced-filters-applied">
917
+ <li
918
+ v-for="(filter, i) in advancedFilteringValues"
919
+ :key="i"
920
+ >
921
+ <span class="label">{{ `"${filter.value}" ${ t('sortableTable.in') } ${filter.label}` }}</span>
922
+ <span class="cross" @click="clearAdvancedFilter(i)">&#10005;</span>
923
+ <div class="bg"></div>
924
+ </li>
925
+ </ul>
926
+ <slot name="header-right" />
895
927
  <AsyncButton
896
928
  v-if="isTooManyItemsToAutoUpdate"
897
929
  v-tooltip="t('performance.manualRefresh.buttonTooltip')"
930
+ class="manual-refresh"
898
931
  mode="refresh"
899
932
  :current-phase="currentPhase"
900
933
  @click="debouncedRefreshTableData"
901
934
  />
902
- </div>
903
-
904
- <div v-if="search || ($slots['header-right'] && $slots['header-right'].length)" class="search row">
905
- <slot name="header-right" />
935
+ <div v-if="hasAdvancedFiltering" ref="advanced-filter-group" class="advanced-filter-group">
936
+ <button class="btn role-primary" @click="advancedFilteringVisibility = !advancedFilteringVisibility;">
937
+ {{ t('sortableTable.addFilter') }}
938
+ </button>
939
+ <div v-show="advancedFilteringVisibility" class="advanced-filter-container">
940
+ <input
941
+ ref="advancedSearchQuery"
942
+ v-model="advFilterSearchTerm"
943
+ type="search"
944
+ class="advanced-search-box"
945
+ :placeholder="t('sortableTable.filterFor')"
946
+ >
947
+ <div class="middle-block">
948
+ <span>{{ t('sortableTable.in') }}</span>
949
+ <LabeledSelect
950
+ v-model="advFilterSelectedProp"
951
+ class="filter-select"
952
+ :clearable="true"
953
+ :options="advFilterSelectOptions"
954
+ :disabled="false"
955
+ :searchable="false"
956
+ mode="edit"
957
+ :multiple="false"
958
+ :taggable="false"
959
+ :placeholder="t('sortableTable.selectCol')"
960
+ @selecting="(col) => advFilterSelectedLabel = col.label"
961
+ />
962
+ </div>
963
+ <div class="bottom-block">
964
+ <button
965
+ class="btn role-secondary"
966
+ :disabled="!advancedFilteringValues.length"
967
+ @click="clearAllAdvancedFilters"
968
+ >
969
+ {{ t('sortableTable.resetFilters') }}
970
+ </button>
971
+ <button
972
+ class="btn role-primary"
973
+ @click="addAdvancedFilter"
974
+ >
975
+ {{ t('sortableTable.add') }}
976
+ </button>
977
+ </div>
978
+ </div>
979
+ </div>
906
980
  <input
907
- v-if="search"
981
+ v-else-if="search"
908
982
  ref="searchQuery"
909
983
  v-model="eventualSearchQuery"
910
984
  type="search"
@@ -920,7 +994,12 @@ export default {
920
994
  v-if="showHeaders"
921
995
  :label-for="labelFor"
922
996
  :columns="columns"
997
+ :group="group"
998
+ :group-options="advGroupOptions"
999
+ :has-advanced-filtering="hasAdvancedFiltering"
1000
+ :adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
923
1001
  :table-actions="tableActions"
1002
+ :table-cols-options="columnOptions"
924
1003
  :row-actions="rowActions"
925
1004
  :sub-expand-column="subExpandColumn"
926
1005
  :row-actions-width="rowActionsWidth"
@@ -933,6 +1012,9 @@ export default {
933
1012
  :no-results="noResults"
934
1013
  @on-toggle-all="onToggleAll"
935
1014
  @on-sort-change="changeSort"
1015
+ @col-visibility-change="changeColVisibility"
1016
+ @group-value-change="(val) => $emit('group-value-change', val)"
1017
+ @update-cols-options="updateColsOptions"
936
1018
  />
937
1019
 
938
1020
  <!-- Don't display anything if we're loading and the delay has yet to pass -->
@@ -968,24 +1050,24 @@ export default {
968
1050
  </tr>
969
1051
  </slot>
970
1052
  </tbody>
971
- <tbody v-for="group in displayRows" v-else :key="group.key" :class="{ group: groupBy }">
972
- <slot v-if="groupBy" name="group-row" :group="group" :fullColspan="fullColspan">
1053
+ <tbody v-for="groupedRows in displayRows" v-else :key="groupedRows.key" :class="{ group: groupBy }">
1054
+ <slot v-if="groupBy" name="group-row" :group="groupedRows" :fullColspan="fullColspan">
973
1055
  <tr class="group-row">
974
1056
  <td :colspan="fullColspan">
975
- <slot name="group-by" :group="group.grp">
1057
+ <slot name="group-by" :group="groupedRows.grp">
976
1058
  <div v-trim-whitespace class="group-tab">
977
- {{ group.ref }}
1059
+ {{ groupedRows.ref }}
978
1060
  </div>
979
1061
  </slot>
980
1062
  </td>
981
1063
  </tr>
982
1064
  </slot>
983
- <template v-for="(row, i) in group.rows">
1065
+ <template v-for="(row, i) in groupedRows.rows">
984
1066
  <slot name="main-row" :row="row.row">
985
1067
  <slot :name="'main-row:' + (row.row.mainRowKey || i)" :full-colspan="fullColspan">
986
1068
  <!-- The data-cant-run-bulk-action-of-interest attribute is being used instead of :class because
987
- because our selection.js invokes toggleClass and :class clobbers what was added by toggleClass if
988
- the value of :class changes. -->
1069
+ because our selection.js invokes toggleClass and :class clobbers what was added by toggleClass if
1070
+ the value of :class changes. -->
989
1071
  <tr
990
1072
  :key="row.key"
991
1073
  class="main-row"
@@ -1023,6 +1105,7 @@ export default {
1023
1105
  :rowKey="row.key"
1024
1106
  >
1025
1107
  <td
1108
+ v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.col.isColVisible)"
1026
1109
  :key="col.col.name"
1027
1110
  :data-title="col.col.label"
1028
1111
  :data-testid="`sortable-cell-${ i }-${ j }`"
@@ -1165,7 +1248,118 @@ export default {
1165
1248
  </div>
1166
1249
  </template>
1167
1250
 
1168
- <style lang="scss" scoped>
1251
+ <style lang="scss" scoped>
1252
+
1253
+ .manual-refresh {
1254
+ height: 40px;
1255
+ }
1256
+ .advanced-filter-group {
1257
+ position: relative;
1258
+ margin-left: 10px;
1259
+ .advanced-filter-container {
1260
+ position: absolute;
1261
+ top: 38px;
1262
+ right: 0;
1263
+ width: 300px;
1264
+ border: 1px solid var(--primary);
1265
+ background-color: var(--body-bg);
1266
+ padding: 20px;
1267
+ z-index: 2;
1268
+
1269
+ .middle-block {
1270
+ display: flex;
1271
+ align-items: center;
1272
+ margin-top: 20px;
1273
+
1274
+ span {
1275
+ margin-right: 20px;
1276
+ }
1277
+
1278
+ button {
1279
+ margin-left: 20px;
1280
+ }
1281
+ }
1282
+
1283
+ .bottom-block {
1284
+ display: flex;
1285
+ align-items: center;
1286
+ margin-top: 40px;
1287
+ justify-content: space-between;
1288
+ }
1289
+ }
1290
+ }
1291
+
1292
+ .advanced-filters-applied {
1293
+ display: inline-flex;
1294
+ margin: 0;
1295
+ padding: 0;
1296
+ list-style: none;
1297
+ max-width: 100%;
1298
+ flex-wrap: wrap;
1299
+ justify-content: flex-end;
1300
+
1301
+ li {
1302
+ margin: 0 20px 10px 0;
1303
+ padding: 2px 5px;
1304
+ border: 1px solid;
1305
+ display: flex;
1306
+ align-items: center;
1307
+ position: relative;
1308
+
1309
+ &:nth-child(4n+1) {
1310
+ border-color: var(--success);
1311
+
1312
+ .bg {
1313
+ background-color: var(--success);
1314
+ }
1315
+ }
1316
+
1317
+ &:nth-child(4n+2) {
1318
+ border-color: var(--warning);
1319
+
1320
+ .bg {
1321
+ background-color: var(--warning);
1322
+ }
1323
+ }
1324
+
1325
+ &:nth-child(4n+3) {
1326
+ border-color: var(--info);
1327
+
1328
+ .bg {
1329
+ background-color: var(--info);
1330
+ }
1331
+ }
1332
+
1333
+ &:nth-child(4n+4) {
1334
+ border-color: var(--error);
1335
+
1336
+ .bg {
1337
+ background-color: var(--error);
1338
+ }
1339
+ }
1340
+
1341
+ .bg {
1342
+ position: absolute;
1343
+ top: 0;
1344
+ left: 0;
1345
+ width: 100%;
1346
+ height: 100%;
1347
+ opacity: 0.2;
1348
+ z-index: -1;
1349
+ }
1350
+
1351
+ .label {
1352
+ margin-right: 10px;
1353
+ font-size: 11px;
1354
+ }
1355
+ .cross {
1356
+ font-size: 12px;
1357
+ font-weight: bold;
1358
+ cursor: pointer;
1359
+ }
1360
+ }
1361
+ }
1362
+
1169
1363
  // Remove colors from multi-action buttons in the table
1170
1364
  td {
1171
1365
  .actions.role-multi-action {
@@ -1215,332 +1409,341 @@ export default {
1215
1409
 
1216
1410
  .search-box {
1217
1411
  height: 40px;
1412
+ margin-left: 10px;
1413
+ min-width: 180px;
1218
1414
  }
1219
- </style>
1220
-
1221
- <style lang="scss">
1222
- //
1223
- // Important: Almost all selectors in here need to be ">"-ed together so they
1224
- // apply only to the current table, not one nested inside another table.
1225
- //
1226
-
1227
- $group-row-height: 40px;
1228
- $group-separation: 40px;
1229
- $divider-height: 1px;
1230
-
1231
- $separator: 20;
1232
- $remove: 100;
1233
- $spacing: 10px;
1234
-
1235
- .sortable-table {
1236
- border-collapse: collapse;
1237
- min-width: 400px;
1238
- border-radius: 5px 5px 0 0;
1239
- outline: 1px solid var(--border);
1240
- overflow: hidden;
1241
- background: var(--sortable-table-bg);
1242
- border-radius: 4px;
1243
-
1244
- &.overflow-x {
1245
- overflow-x: visible;
1246
- }
1247
- &.overflow-y {
1248
- overflow-y: visible;
1249
- }
1415
+ </style>
1250
1416
 
1251
- td {
1252
- padding: 8px 5px;
1253
- border: 0;
1417
+ <style lang="scss">
1418
+ //
1419
+ // Important: Almost all selectors in here need to be ">"-ed together so they
1420
+ // apply only to the current table, not one nested inside another table.
1421
+ //
1254
1422
 
1255
- &:first-child {
1256
- padding-left: 10px;
1257
- }
1423
+ $group-row-height: 40px;
1424
+ $group-separation: 40px;
1425
+ $divider-height: 1px;
1258
1426
 
1259
- &:last-child {
1260
- padding-right: 10px;
1261
- }
1427
+ $separator: 20;
1428
+ $remove: 100;
1429
+ $spacing: 10px;
1262
1430
 
1263
- &.row-check {
1264
- padding-top: 12px;
1265
- }
1431
+ .filter-select .vs__selected-options .vs__selected {
1432
+ text-align: left;
1266
1433
  }
1267
1434
 
1268
- tbody {
1269
- tr {
1270
- border-bottom: 1px solid var(--sortable-table-top-divider);
1271
- background-color: var(--sortable-table-row-bg);
1435
+ .sortable-table {
1436
+ border-collapse: collapse;
1437
+ min-width: 400px;
1438
+ border-radius: 5px 5px 0 0;
1439
+ outline: 1px solid var(--border);
1440
+ overflow: hidden;
1441
+ background: var(--sortable-table-bg);
1442
+ border-radius: 4px;
1443
+
1444
+ &.overflow-x {
1445
+ overflow-x: visible;
1446
+ }
1447
+ &.overflow-y {
1448
+ overflow-y: visible;
1449
+ }
1272
1450
 
1273
- &.main-row.has-sub-row {
1274
- border-bottom: 0;
1275
- }
1451
+ td {
1452
+ padding: 8px 5px;
1453
+ border: 0;
1276
1454
 
1277
- // if a main-row is hovered also hover it's sibling sub row. note - the reverse is handled in selection.js
1278
- &.main-row:not(.row-selected):hover + .sub-row {
1279
- background-color: var(--sortable-table-hover-bg);
1280
- }
1281
-
1282
- &:last-of-type {
1283
- border-bottom: 0;
1455
+ &:first-child {
1456
+ padding-left: 10px;
1284
1457
  }
1285
1458
 
1286
- &:hover, &.sub-row-hovered {
1287
- background-color: var(--sortable-table-hover-bg);
1459
+ &:last-child {
1460
+ padding-right: 10px;
1288
1461
  }
1289
1462
 
1290
- &.state-description > td {
1291
- font-size: 13px;
1292
- padding-top: 0;
1293
- overflow-wrap: anywhere;
1463
+ &.row-check {
1464
+ padding-top: 12px;
1294
1465
  }
1295
1466
  }
1296
1467
 
1297
- tr.active-row {
1298
- color: var(--sortable-table-header-bg);
1299
- }
1468
+ tbody {
1469
+ tr {
1470
+ border-bottom: 1px solid var(--sortable-table-top-divider);
1471
+ background-color: var(--sortable-table-row-bg);
1300
1472
 
1301
- tr.row-selected {
1302
- background: var(--sortable-table-selected-bg);
1303
- }
1473
+ &.main-row.has-sub-row {
1474
+ border-bottom: 0;
1475
+ }
1476
+
1477
+ // if a main-row is hovered also hover it's sibling sub row. note - the reverse is handled in selection.js
1478
+ &.main-row:not(.row-selected):hover + .sub-row {
1479
+ background-color: var(--sortable-table-hover-bg);
1480
+ }
1304
1481
 
1305
- .no-rows {
1306
- td {
1307
- padding: 30px 0;
1308
- text-align: center;
1482
+ &:last-of-type {
1483
+ border-bottom: 0;
1484
+ }
1485
+
1486
+ &:hover, &.sub-row-hovered {
1487
+ background-color: var(--sortable-table-hover-bg);
1488
+ }
1489
+
1490
+ &.state-description > td {
1491
+ font-size: 13px;
1492
+ padding-top: 0;
1493
+ overflow-wrap: anywhere;
1494
+ }
1309
1495
  }
1310
- }
1311
1496
 
1312
- .no-rows, .no-results {
1313
- &:hover {
1314
- background-color: var(--body-bg);
1497
+ tr.active-row {
1498
+ color: var(--sortable-table-header-bg);
1315
1499
  }
1316
- }
1317
1500
 
1318
- &.group {
1319
- &:before {
1320
- content: "";
1321
- display: block;
1322
- height: 20px;
1323
- background-color: transparent;
1501
+ tr.row-selected {
1502
+ background: var(--sortable-table-selected-bg);
1324
1503
  }
1325
- }
1326
1504
 
1327
- tr.group-row {
1328
- background-color: initial;
1505
+ .no-rows {
1506
+ td {
1507
+ padding: 30px 0;
1508
+ text-align: center;
1509
+ }
1510
+ }
1329
1511
 
1330
- &:first-child {
1331
- border-bottom: 2px solid var(--sortable-table-row-bg);
1512
+ .no-rows, .no-results {
1513
+ &:hover {
1514
+ background-color: var(--body-bg);
1515
+ }
1332
1516
  }
1333
1517
 
1334
- &:not(:first-child) {
1335
- margin-top: 20px;
1518
+ &.group {
1519
+ &:before {
1520
+ content: "";
1521
+ display: block;
1522
+ height: 20px;
1523
+ background-color: transparent;
1524
+ }
1336
1525
  }
1337
1526
 
1338
- td {
1339
- padding: 0;
1527
+ tr.group-row {
1528
+ background-color: initial;
1340
1529
 
1341
- &:first-of-type {
1342
- border-left: 1px solid var(--sortable-table-accent-bg);
1530
+ &:first-child {
1531
+ border-bottom: 2px solid var(--sortable-table-row-bg);
1343
1532
  }
1344
- }
1345
1533
 
1346
- .group-tab {
1347
- @include clearfix;
1348
- height: $group-row-height;
1349
- line-height: $group-row-height;
1350
- padding: 0 10px;
1351
- border-radius: 4px 4px 0px 0px;
1352
- background-color: var(--sortable-table-row-bg);
1353
- position: relative;
1354
- top: 1px;
1355
- display: inline-block;
1356
- z-index: z-index('tableGroup');
1357
- min-width: $group-row-height * 1.8;
1358
-
1359
- > SPAN {
1360
- color: var(--sortable-table-group-label);
1534
+ &:not(:first-child) {
1535
+ margin-top: 20px;
1361
1536
  }
1362
- }
1363
1537
 
1364
- .group-tab:after {
1365
- height: $group-row-height;
1366
- width: 70px;
1367
- border-radius: 5px 5px 0px 0px;
1368
- background-color: var(--sortable-table-row-bg);
1369
- content: "";
1370
- position: absolute;
1371
- right: -15px;
1372
- top: 0px;
1373
- transform: skewX(40deg);
1374
- z-index: -1;
1538
+ td {
1539
+ padding: 0;
1540
+
1541
+ &:first-of-type {
1542
+ border-left: 1px solid var(--sortable-table-accent-bg);
1543
+ }
1544
+ }
1545
+
1546
+ .group-tab {
1547
+ @include clearfix;
1548
+ height: $group-row-height;
1549
+ line-height: $group-row-height;
1550
+ padding: 0 10px;
1551
+ border-radius: 4px 4px 0px 0px;
1552
+ background-color: var(--sortable-table-row-bg);
1553
+ position: relative;
1554
+ top: 1px;
1555
+ display: inline-block;
1556
+ z-index: z-index('tableGroup');
1557
+ min-width: $group-row-height * 1.8;
1558
+
1559
+ > SPAN {
1560
+ color: var(--sortable-table-group-label);
1561
+ }
1562
+ }
1563
+
1564
+ .group-tab:after {
1565
+ height: $group-row-height;
1566
+ width: 70px;
1567
+ border-radius: 5px 5px 0px 0px;
1568
+ background-color: var(--sortable-table-row-bg);
1569
+ content: "";
1570
+ position: absolute;
1571
+ right: -15px;
1572
+ top: 0px;
1573
+ transform: skewX(40deg);
1574
+ z-index: -1;
1575
+ }
1375
1576
  }
1376
1577
  }
1377
1578
  }
1378
- }
1379
1579
 
1380
- .for-inputs{
1381
- & TABLE.sortable-table {
1382
- width: 100%;
1383
- border-collapse: collapse;
1384
- margin-bottom: $spacing;
1580
+ .for-inputs{
1581
+ & TABLE.sortable-table {
1582
+ width: 100%;
1583
+ border-collapse: collapse;
1584
+ margin-bottom: $spacing;
1385
1585
 
1386
- >TBODY>TR>TD, >THEAD>TR>TH {
1387
- padding-right: $spacing;
1388
- padding-bottom: $spacing;
1586
+ >TBODY>TR>TD, >THEAD>TR>TH {
1587
+ padding-right: $spacing;
1588
+ padding-bottom: $spacing;
1389
1589
 
1390
- &:last-of-type {
1391
- padding-right: 0;
1590
+ &:last-of-type {
1591
+ padding-right: 0;
1592
+ }
1392
1593
  }
1393
- }
1394
1594
 
1395
- >TBODY>TR:first-of-type>TD {
1396
- padding-top: $spacing;
1397
- }
1595
+ >TBODY>TR:first-of-type>TD {
1596
+ padding-top: $spacing;
1597
+ }
1398
1598
 
1399
- >TBODY>TR:last-of-type>TD {
1400
- padding-bottom: 0;
1599
+ >TBODY>TR:last-of-type>TD {
1600
+ padding-bottom: 0;
1601
+ }
1401
1602
  }
1402
- }
1403
1603
 
1404
- &.edit, &.create, &.clone {
1405
- TABLE.sortable-table>THEAD>TR>TH {
1406
- border-color: transparent;
1604
+ &.edit, &.create, &.clone {
1605
+ TABLE.sortable-table>THEAD>TR>TH {
1606
+ border-color: transparent;
1607
+ }
1407
1608
  }
1408
1609
  }
1409
- }
1410
1610
 
1411
- .sortable-table-header {
1412
- position: relative;
1413
- z-index: z-index('fixedTableHeader');
1611
+ .sortable-table-header {
1612
+ position: relative;
1613
+ z-index: z-index('fixedTableHeader');
1414
1614
 
1415
- &.titled {
1416
- display: flex;
1417
- align-items: center;
1418
- }
1419
- }
1420
- .fixed-header-actions.button{
1421
- grid-template-columns: [bulk] auto [middle] min-content [search] minmax(min-content, 350px);
1422
- }
1423
-
1424
- .fixed-header-actions {
1425
- padding: 0 0 20px 0;
1426
- width: 100%;
1427
- z-index: z-index('fixedTableHeader');
1428
- background: transparent;
1429
- display: grid;
1430
- grid-template-columns: [bulk] auto [middle] min-content [search] minmax(min-content, 200px);
1431
- grid-column-gap: 10px;
1432
-
1433
- .bulk {
1434
- grid-area: bulk;
1435
- margin-top: 1px;
1436
-
1437
- $gap: 10px;
1438
-
1439
- & > BUTTON {
1440
- display: none; // Handled dynamically
1615
+ &.titled {
1616
+ display: flex;
1617
+ align-items: center;
1441
1618
  }
1619
+ }
1620
+ .fixed-header-actions.button{
1621
+ grid-template-columns: [bulk] auto [middle] min-content [search] minmax(min-content, 350px);
1622
+ }
1442
1623
 
1443
- & > BUTTON:not(:last-of-type) {
1444
- margin-right: $gap;
1624
+ .fixed-header-actions {
1625
+ padding: 0 0 20px 0;
1626
+ width: 100%;
1627
+ z-index: z-index('fixedTableHeader');
1628
+ background: transparent;
1629
+ display: grid;
1630
+ grid-template-columns: [bulk] auto [middle] min-content [search] minmax(min-content, 200px);
1631
+ grid-column-gap: 10px;
1632
+
1633
+ &.advanced-filtering {
1634
+ grid-template-columns: [bulk] auto [middle] minmax(min-content, auto) [search] minmax(min-content, auto);
1445
1635
  }
1446
1636
 
1447
- .action-availability {
1448
- display: none; // Handled dynamically
1449
- margin-left: $gap;
1450
- vertical-align: middle;
1451
- margin-top: 2px;
1452
- }
1637
+ .bulk {
1638
+ grid-area: bulk;
1453
1639
 
1454
- .dropdown-button {
1455
- $disabled-color: var(--disabled-text);
1456
- $disabled-cursor: not-allowed;
1457
- li.disabled {
1458
- color: $disabled-color;
1459
- cursor: $disabled-cursor;
1640
+ $gap: 10px;
1460
1641
 
1461
- &:hover {
1642
+ & > BUTTON {
1643
+ display: none; // Handled dynamically
1644
+ }
1645
+
1646
+ & > BUTTON:not(:last-of-type) {
1647
+ margin-right: $gap;
1648
+ }
1649
+
1650
+ .action-availability {
1651
+ display: none; // Handled dynamically
1652
+ margin-left: $gap;
1653
+ vertical-align: middle;
1654
+ margin-top: 2px;
1655
+ }
1656
+
1657
+ .dropdown-button {
1658
+ $disabled-color: var(--disabled-text);
1659
+ $disabled-cursor: not-allowed;
1660
+ li.disabled {
1462
1661
  color: $disabled-color;
1463
- background-color: unset;
1464
1662
  cursor: $disabled-cursor;
1663
+
1664
+ &:hover {
1665
+ color: $disabled-color;
1666
+ background-color: unset;
1667
+ cursor: $disabled-cursor;
1668
+ }
1465
1669
  }
1466
1670
  }
1467
- }
1468
1671
 
1469
- .bulk-action {
1470
- .icon {
1471
- vertical-align: -10%;
1672
+ .bulk-action {
1673
+ .icon {
1674
+ vertical-align: -10%;
1675
+ }
1472
1676
  }
1473
1677
  }
1474
- }
1475
-
1476
- .middle {
1477
- grid-area: middle;
1478
- white-space: nowrap;
1479
1678
 
1480
- .icon.icon-backup.animate {
1481
- animation-name: spin;
1482
- animation-duration: 1000ms;
1483
- animation-iteration-count: infinite;
1484
- animation-timing-function: linear;
1485
- }
1679
+ .middle {
1680
+ grid-area: middle;
1681
+ white-space: nowrap;
1486
1682
 
1487
- @keyframes spin {
1488
- from {
1489
- transform:rotate(0deg);
1683
+ .icon.icon-backup.animate {
1684
+ animation-name: spin;
1685
+ animation-duration: 1000ms;
1686
+ animation-iteration-count: infinite;
1687
+ animation-timing-function: linear;
1490
1688
  }
1491
- to {
1492
- transform:rotate(360deg);
1689
+
1690
+ @keyframes spin {
1691
+ from {
1692
+ transform:rotate(0deg);
1693
+ }
1694
+ to {
1695
+ transform:rotate(360deg);
1696
+ }
1493
1697
  }
1494
1698
  }
1495
- }
1496
1699
 
1497
- .search {
1498
- grid-area: search;
1499
- text-align: right;
1500
- justify-content: flex-end;
1501
- }
1700
+ .search {
1701
+ grid-area: search;
1702
+ text-align: right;
1703
+ justify-content: flex-end;
1704
+ }
1502
1705
 
1503
- .bulk-actions-dropdown {
1504
- display: none; // Handled dynamically
1706
+ .bulk-actions-dropdown {
1707
+ display: none; // Handled dynamically
1505
1708
 
1506
- .dropdown-button {
1507
- background-color: var(--primary);
1709
+ .dropdown-button {
1710
+ background-color: var(--primary);
1508
1711
 
1509
- &:hover {
1510
- background-color: var(--primary-hover-bg);
1511
- color: var(--primary-hover-text);
1512
- }
1712
+ &:hover {
1713
+ background-color: var(--primary-hover-bg);
1714
+ color: var(--primary-hover-text);
1715
+ }
1513
1716
 
1514
- > *, .icon-chevron-down {
1515
- color: var(--primary-text);
1516
- }
1717
+ > *, .icon-chevron-down {
1718
+ color: var(--primary-text);
1719
+ }
1517
1720
 
1518
- .button-divider {
1519
- border-color: var(--primary-text);
1520
- }
1721
+ .button-divider {
1722
+ border-color: var(--primary-text);
1723
+ }
1521
1724
 
1522
- &.disabled {
1523
- border-color: var(--disabled-bg);
1725
+ &.disabled {
1726
+ border-color: var(--disabled-bg);
1524
1727
 
1525
- .icon-chevron-down {
1526
- color: var(--disabled-text) !important;
1527
- }
1728
+ .icon-chevron-down {
1729
+ color: var(--disabled-text) !important;
1730
+ }
1528
1731
 
1529
- .button-divider {
1530
- border-color: var(--disabled-text);
1732
+ .button-divider {
1733
+ border-color: var(--disabled-text);
1734
+ }
1531
1735
  }
1532
1736
  }
1533
1737
  }
1534
1738
  }
1535
- }
1536
1739
 
1537
- .paging {
1538
- margin-top: 10px;
1539
- text-align: center;
1740
+ .paging {
1741
+ margin-top: 10px;
1742
+ text-align: center;
1540
1743
 
1541
- SPAN {
1542
- display: inline-block;
1543
- min-width: 200px;
1744
+ SPAN {
1745
+ display: inline-block;
1746
+ min-width: 200px;
1747
+ }
1544
1748
  }
1545
- }
1546
- </style>
1749
+ </style>