@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.
- package/assets/styles/global/_button.scss +1 -0
- package/assets/translations/en-us.yaml +48 -6
- package/assets/translations/zh-hans.yaml +18 -0
- package/components/HarvesterServiceAddOnConfig.vue +10 -10
- package/components/ResourceList/index.vue +34 -14
- package/components/ResourceTable.vue +19 -0
- package/components/SortableTable/THead.vue +311 -70
- package/components/SortableTable/advanced-filtering.js +272 -0
- package/components/SortableTable/filtering.js +90 -29
- package/components/SortableTable/index.vue +474 -271
- package/components/form/WorkloadPorts.vue +2 -2
- package/config/product/settings.js +1 -0
- package/config/product/uiplugins.js +1 -0
- package/config/uiplugins.js +13 -0
- package/creators/app/init +2 -2
- package/creators/app/package.json +1 -1
- package/creators/pkg/package.json +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -1
- package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +0 -1
- package/edit/provisioning.cattle.io.cluster/rke2.vue +25 -24
- package/edit/service.vue +1 -1
- package/models/management.cattle.io.cluster.js +9 -1
- package/package.json +1 -1
- package/pages/c/_cluster/apps/charts/install.vue +119 -31
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +5 -2
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +1 -1
- package/pages/c/_cluster/uiplugins/index.vue +48 -11
- package/promptRemove/mixin/roleDeletionCheck.js +15 -1
- package/scripts/record-deps.js +3 -3
- 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:
|
|
303
|
-
expanded:
|
|
304
|
-
searchQuery:
|
|
305
|
-
eventualSearchQuery:
|
|
306
|
-
actionOfInterest:
|
|
307
|
-
loadingDelay:
|
|
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
|
|
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="
|
|
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)">✕</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
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
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="
|
|
972
|
-
<slot v-if="groupBy" name="group-row" :group="
|
|
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="
|
|
1057
|
+
<slot name="group-by" :group="groupedRows.grp">
|
|
976
1058
|
<div v-trim-whitespace class="group-tab">
|
|
977
|
-
{{
|
|
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
|
|
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
|
-
|
|
988
|
-
|
|
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
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
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
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1423
|
+
$group-row-height: 40px;
|
|
1424
|
+
$group-separation: 40px;
|
|
1425
|
+
$divider-height: 1px;
|
|
1258
1426
|
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1427
|
+
$separator: 20;
|
|
1428
|
+
$remove: 100;
|
|
1429
|
+
$spacing: 10px;
|
|
1262
1430
|
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
}
|
|
1431
|
+
.filter-select .vs__selected-options .vs__selected {
|
|
1432
|
+
text-align: left;
|
|
1266
1433
|
}
|
|
1267
1434
|
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
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
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1451
|
+
td {
|
|
1452
|
+
padding: 8px 5px;
|
|
1453
|
+
border: 0;
|
|
1276
1454
|
|
|
1277
|
-
|
|
1278
|
-
|
|
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
|
-
&:
|
|
1287
|
-
|
|
1459
|
+
&:last-child {
|
|
1460
|
+
padding-right: 10px;
|
|
1288
1461
|
}
|
|
1289
1462
|
|
|
1290
|
-
&.
|
|
1291
|
-
|
|
1292
|
-
padding-top: 0;
|
|
1293
|
-
overflow-wrap: anywhere;
|
|
1463
|
+
&.row-check {
|
|
1464
|
+
padding-top: 12px;
|
|
1294
1465
|
}
|
|
1295
1466
|
}
|
|
1296
1467
|
|
|
1297
|
-
|
|
1298
|
-
|
|
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
|
-
|
|
1302
|
-
|
|
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
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
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
|
-
|
|
1313
|
-
|
|
1314
|
-
background-color: var(--body-bg);
|
|
1497
|
+
tr.active-row {
|
|
1498
|
+
color: var(--sortable-table-header-bg);
|
|
1315
1499
|
}
|
|
1316
|
-
}
|
|
1317
1500
|
|
|
1318
|
-
|
|
1319
|
-
|
|
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
|
-
|
|
1328
|
-
|
|
1505
|
+
.no-rows {
|
|
1506
|
+
td {
|
|
1507
|
+
padding: 30px 0;
|
|
1508
|
+
text-align: center;
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1329
1511
|
|
|
1330
|
-
|
|
1331
|
-
|
|
1512
|
+
.no-rows, .no-results {
|
|
1513
|
+
&:hover {
|
|
1514
|
+
background-color: var(--body-bg);
|
|
1515
|
+
}
|
|
1332
1516
|
}
|
|
1333
1517
|
|
|
1334
|
-
|
|
1335
|
-
|
|
1518
|
+
&.group {
|
|
1519
|
+
&:before {
|
|
1520
|
+
content: "";
|
|
1521
|
+
display: block;
|
|
1522
|
+
height: 20px;
|
|
1523
|
+
background-color: transparent;
|
|
1524
|
+
}
|
|
1336
1525
|
}
|
|
1337
1526
|
|
|
1338
|
-
|
|
1339
|
-
|
|
1527
|
+
tr.group-row {
|
|
1528
|
+
background-color: initial;
|
|
1340
1529
|
|
|
1341
|
-
&:first-
|
|
1342
|
-
border-
|
|
1530
|
+
&:first-child {
|
|
1531
|
+
border-bottom: 2px solid var(--sortable-table-row-bg);
|
|
1343
1532
|
}
|
|
1344
|
-
}
|
|
1345
1533
|
|
|
1346
|
-
|
|
1347
|
-
|
|
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
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
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
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1580
|
+
.for-inputs{
|
|
1581
|
+
& TABLE.sortable-table {
|
|
1582
|
+
width: 100%;
|
|
1583
|
+
border-collapse: collapse;
|
|
1584
|
+
margin-bottom: $spacing;
|
|
1385
1585
|
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1586
|
+
>TBODY>TR>TD, >THEAD>TR>TH {
|
|
1587
|
+
padding-right: $spacing;
|
|
1588
|
+
padding-bottom: $spacing;
|
|
1389
1589
|
|
|
1390
|
-
|
|
1391
|
-
|
|
1590
|
+
&:last-of-type {
|
|
1591
|
+
padding-right: 0;
|
|
1592
|
+
}
|
|
1392
1593
|
}
|
|
1393
|
-
}
|
|
1394
1594
|
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1595
|
+
>TBODY>TR:first-of-type>TD {
|
|
1596
|
+
padding-top: $spacing;
|
|
1597
|
+
}
|
|
1398
1598
|
|
|
1399
|
-
|
|
1400
|
-
|
|
1599
|
+
>TBODY>TR:last-of-type>TD {
|
|
1600
|
+
padding-bottom: 0;
|
|
1601
|
+
}
|
|
1401
1602
|
}
|
|
1402
|
-
}
|
|
1403
1603
|
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
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
|
-
|
|
1413
|
-
|
|
1611
|
+
.sortable-table-header {
|
|
1612
|
+
position: relative;
|
|
1613
|
+
z-index: z-index('fixedTableHeader');
|
|
1414
1614
|
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
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
|
-
|
|
1444
|
-
|
|
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
|
-
.
|
|
1448
|
-
|
|
1449
|
-
margin-left: $gap;
|
|
1450
|
-
vertical-align: middle;
|
|
1451
|
-
margin-top: 2px;
|
|
1452
|
-
}
|
|
1637
|
+
.bulk {
|
|
1638
|
+
grid-area: bulk;
|
|
1453
1639
|
|
|
1454
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
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
|
-
.
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
animation-iteration-count: infinite;
|
|
1484
|
-
animation-timing-function: linear;
|
|
1485
|
-
}
|
|
1679
|
+
.middle {
|
|
1680
|
+
grid-area: middle;
|
|
1681
|
+
white-space: nowrap;
|
|
1486
1682
|
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
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
|
-
|
|
1492
|
-
|
|
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
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1700
|
+
.search {
|
|
1701
|
+
grid-area: search;
|
|
1702
|
+
text-align: right;
|
|
1703
|
+
justify-content: flex-end;
|
|
1704
|
+
}
|
|
1502
1705
|
|
|
1503
|
-
|
|
1504
|
-
|
|
1706
|
+
.bulk-actions-dropdown {
|
|
1707
|
+
display: none; // Handled dynamically
|
|
1505
1708
|
|
|
1506
|
-
|
|
1507
|
-
|
|
1709
|
+
.dropdown-button {
|
|
1710
|
+
background-color: var(--primary);
|
|
1508
1711
|
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1712
|
+
&:hover {
|
|
1713
|
+
background-color: var(--primary-hover-bg);
|
|
1714
|
+
color: var(--primary-hover-text);
|
|
1715
|
+
}
|
|
1513
1716
|
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1717
|
+
> *, .icon-chevron-down {
|
|
1718
|
+
color: var(--primary-text);
|
|
1719
|
+
}
|
|
1517
1720
|
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1721
|
+
.button-divider {
|
|
1722
|
+
border-color: var(--primary-text);
|
|
1723
|
+
}
|
|
1521
1724
|
|
|
1522
|
-
|
|
1523
|
-
|
|
1725
|
+
&.disabled {
|
|
1726
|
+
border-color: var(--disabled-bg);
|
|
1524
1727
|
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1728
|
+
.icon-chevron-down {
|
|
1729
|
+
color: var(--disabled-text) !important;
|
|
1730
|
+
}
|
|
1528
1731
|
|
|
1529
|
-
|
|
1530
|
-
|
|
1732
|
+
.button-divider {
|
|
1733
|
+
border-color: var(--disabled-text);
|
|
1734
|
+
}
|
|
1531
1735
|
}
|
|
1532
1736
|
}
|
|
1533
1737
|
}
|
|
1534
1738
|
}
|
|
1535
|
-
}
|
|
1536
1739
|
|
|
1537
|
-
.paging {
|
|
1538
|
-
|
|
1539
|
-
|
|
1740
|
+
.paging {
|
|
1741
|
+
margin-top: 10px;
|
|
1742
|
+
text-align: center;
|
|
1540
1743
|
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1744
|
+
SPAN {
|
|
1745
|
+
display: inline-block;
|
|
1746
|
+
min-width: 200px;
|
|
1747
|
+
}
|
|
1544
1748
|
}
|
|
1545
|
-
|
|
1546
|
-
</style>
|
|
1749
|
+
</style>
|