@rancher/shell 0.1.4 → 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 (170) hide show
  1. package/assets/brand/suse/favicon.png +0 -0
  2. package/assets/images/generic-plugin.svg +1 -7
  3. package/assets/styles/global/_button.scss +1 -0
  4. package/assets/translations/en-us.yaml +129 -53
  5. package/assets/translations/zh-hans.yaml +18 -0
  6. package/components/CommunityLinks.vue +40 -49
  7. package/components/ExplorerProjectsNamespaces.vue +20 -3
  8. package/components/HarvesterServiceAddOnConfig.vue +10 -10
  9. package/components/LazyImage.vue +21 -8
  10. package/components/PromptRemove.vue +2 -2
  11. package/components/ResourceList/Masthead.vue +21 -1
  12. package/components/ResourceList/ResourceLoadingIndicator.vue +0 -8
  13. package/components/ResourceList/index.vue +42 -36
  14. package/components/ResourceTable.vue +19 -0
  15. package/components/SortableTable/THead.vue +311 -70
  16. package/components/SortableTable/advanced-filtering.js +272 -0
  17. package/components/SortableTable/filtering.js +90 -29
  18. package/components/SortableTable/index.vue +486 -280
  19. package/components/Tabbed/index.vue +25 -7
  20. package/components/TypeDescription.vue +10 -1
  21. package/components/fleet/FleetClusters.vue +6 -0
  22. package/components/fleet/FleetRepos.vue +7 -1
  23. package/components/form/Command.vue +5 -0
  24. package/components/form/EnvVars.vue +5 -0
  25. package/components/form/NameNsDescription.vue +3 -1
  26. package/components/form/NodeScheduling.vue +6 -1
  27. package/components/form/PodAffinity.vue +5 -0
  28. package/components/form/ServiceNameSelect.vue +5 -0
  29. package/components/form/ValueFromResource.vue +7 -1
  30. package/components/form/WorkloadPorts.vue +2 -2
  31. package/components/nav/TopLevelMenu.vue +2 -1
  32. package/config/home-links.js +155 -0
  33. package/config/private-label.js +1 -1
  34. package/config/product/manager.js +0 -2
  35. package/config/product/settings.js +1 -0
  36. package/config/product/uiplugins.js +2 -1
  37. package/config/settings.js +3 -1
  38. package/config/uiplugins.js +76 -6
  39. package/config/version.js +17 -0
  40. package/core/plugin.ts +12 -0
  41. package/core/plugins.js +29 -5
  42. package/core/types.ts +6 -0
  43. package/creators/app/{.eslintignore → files/.eslintignore} +0 -0
  44. package/creators/app/{.eslintrc.js → files/.eslintrc.js} +0 -0
  45. package/creators/app/{.vscode → files/.vscode}/settings.json +0 -0
  46. package/creators/app/{babel.config.js → files/babel.config.js} +0 -0
  47. package/creators/app/{nuxt.config.js → files/nuxt.config.js} +0 -0
  48. package/creators/app/{tsconfig.json → files/tsconfig.json} +2 -1
  49. package/creators/app/init +16 -17
  50. package/creators/app/package.json +7 -1
  51. package/creators/pkg/{babel.config.js → files/babel.config.js} +0 -0
  52. package/creators/pkg/{index.ts → files/index.ts} +0 -0
  53. package/creators/pkg/{tsconfig.json → files/tsconfig.json} +13 -12
  54. package/creators/pkg/{vue.config.js → files/vue.config.js} +0 -0
  55. package/creators/pkg/init +1 -1
  56. package/creators/pkg/package.json +1 -1
  57. package/creators/update/init +54 -0
  58. package/creators/update/package.json +20 -0
  59. package/creators/update/upgrade +56 -0
  60. package/creators/update/yarn-error.log +54 -0
  61. package/detail/provisioning.cattle.io.cluster.vue +1 -1
  62. package/detail/workload/index.vue +1 -0
  63. package/edit/persistentvolume/index.vue +48 -13
  64. package/edit/persistentvolumeclaim.vue +31 -13
  65. package/edit/provisioning.cattle.io.cluster/ACE.vue +2 -1
  66. package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +0 -1
  67. package/edit/provisioning.cattle.io.cluster/rke2.vue +52 -43
  68. package/edit/service.vue +1 -1
  69. package/edit/workload/index.vue +19 -9
  70. package/edit/workload/mixins/workload.js +109 -114
  71. package/edit/workload/storage/index.vue +11 -17
  72. package/edit/workload/storage/persistentVolumeClaim/index.vue +5 -0
  73. package/edit/workload/storage/secret.vue +6 -1
  74. package/list/catalog.cattle.io.app.vue +10 -9
  75. package/list/catalog.cattle.io.clusterrepo.vue +6 -61
  76. package/list/cis.cattle.io.clusterscan.vue +12 -12
  77. package/list/fleet.cattle.io.bundle.vue +33 -28
  78. package/list/fleet.cattle.io.cluster.vue +26 -22
  79. package/list/fleet.cattle.io.clustergroup.vue +6 -0
  80. package/list/fleet.cattle.io.clusterregistrationtoken.vue +28 -24
  81. package/list/fleet.cattle.io.gitrepo.vue +25 -14
  82. package/list/helm.cattle.io.projecthelmchart.vue +52 -33
  83. package/list/logging.banzaicloud.io.clusterflow.vue +7 -12
  84. package/list/logging.banzaicloud.io.flow.vue +7 -14
  85. package/list/management.cattle.io.cluster.vue +26 -15
  86. package/list/management.cattle.io.feature.vue +13 -8
  87. package/list/management.cattle.io.user.vue +38 -19
  88. package/list/monitoring.coreos.com.alertmanagerconfig.vue +8 -15
  89. package/list/namespace.vue +14 -1
  90. package/list/node.vue +13 -16
  91. package/list/persistentvolume.vue +16 -9
  92. package/list/persistentvolumeclaim.vue +5 -8
  93. package/list/provisioning.cattle.io.cluster.vue +34 -8
  94. package/list/service.vue +24 -12
  95. package/list/ui.cattle.io.navlink.vue +6 -0
  96. package/list/workload.vue +2 -2
  97. package/middleware/authenticated.js +6 -0
  98. package/mixins/resource-fetch.js +12 -18
  99. package/mixins/resource-manager.js +126 -0
  100. package/models/catalog.cattle.io.uiplugin.js +4 -0
  101. package/models/management.cattle.io.cluster.js +9 -1
  102. package/models/pod.js +15 -5
  103. package/models/provisioning.cattle.io.cluster.js +4 -0
  104. package/models/workload.service.js +10 -0
  105. package/nuxt.config.js +2 -1
  106. package/package.json +1 -1
  107. package/pages/auth/login.vue +10 -0
  108. package/pages/auth/verify.vue +9 -0
  109. package/pages/c/_cluster/apps/charts/install.vue +119 -31
  110. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +108 -0
  111. package/pages/c/_cluster/settings/links.vue +53 -101
  112. package/pages/c/_cluster/settings/performance.vue +90 -7
  113. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +3 -3
  114. package/pages/c/_cluster/uiplugins/InstallDialog.vue +72 -21
  115. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +26 -7
  116. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -7
  117. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +23 -15
  118. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +12 -5
  119. package/pages/c/_cluster/uiplugins/index.vue +223 -72
  120. package/pages/support/index.vue +31 -142
  121. package/plugins/dashboard-store/actions.js +19 -0
  122. package/plugins/dashboard-store/getters.js +20 -3
  123. package/plugins/dashboard-store/mutations.js +13 -7
  124. package/plugins/plugin.js +18 -15
  125. package/plugins/steve/getters.js +12 -0
  126. package/plugins/version.js +21 -0
  127. package/promptRemove/mixin/roleDeletionCheck.js +15 -1
  128. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -7
  129. package/rancher-components/components/BadgeState/BadgeState.spec.ts +12 -0
  130. package/rancher-components/components/BadgeState/BadgeState.vue +107 -0
  131. package/rancher-components/components/BadgeState/index.ts +1 -0
  132. package/rancher-components/components/Banner/Banner.test.ts +13 -0
  133. package/rancher-components/components/Banner/Banner.vue +163 -0
  134. package/rancher-components/components/Banner/index.ts +1 -0
  135. package/rancher-components/components/Card/Card.vue +150 -0
  136. package/rancher-components/components/Card/index.ts +1 -0
  137. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +77 -0
  138. package/rancher-components/components/Form/Checkbox/Checkbox.vue +395 -0
  139. package/rancher-components/components/Form/Checkbox/index.ts +1 -0
  140. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +29 -0
  141. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +343 -0
  142. package/rancher-components/components/Form/LabeledInput/index.ts +1 -0
  143. package/rancher-components/components/Form/Radio/RadioButton.vue +270 -0
  144. package/rancher-components/components/Form/Radio/RadioGroup.vue +235 -0
  145. package/rancher-components/components/Form/Radio/index.ts +2 -0
  146. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +168 -0
  147. package/rancher-components/components/Form/TextArea/index.ts +1 -0
  148. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +107 -0
  149. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +137 -0
  150. package/rancher-components/components/Form/ToggleSwitch/index.ts +1 -0
  151. package/rancher-components/components/Form/index.ts +5 -0
  152. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +137 -0
  153. package/rancher-components/components/LabeledTooltip/index.ts +1 -0
  154. package/scripts/publish-shell.sh +39 -6
  155. package/scripts/record-deps.js +37 -0
  156. package/scripts/test-plugins-build.sh +8 -5
  157. package/scripts/typegen.sh +84 -0
  158. package/store/auth.js +3 -0
  159. package/store/index.js +12 -3
  160. package/store/type-map.js +2 -0
  161. package/types/shell/index.d.ts +3046 -0
  162. package/utils/favicon.js +8 -2
  163. package/utils/gc/gc-interval.ts +40 -0
  164. package/utils/gc/gc-root-store.js +76 -0
  165. package/utils/gc/gc-route-changed.ts +44 -0
  166. package/utils/gc/gc-types.ts +21 -0
  167. package/utils/gc/gc.ts +282 -0
  168. package/config/footer.js +0 -18
  169. package/creators/pkg/nuxt.config.js +0 -6
  170. package/yarn-error.log +0 -195
@@ -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
 
@@ -368,16 +371,19 @@ export default {
368
371
  immediate: true
369
372
  },
370
373
 
371
- isManualRefreshLoading(neu, old) {
372
- this.currentPhase = neu ? ASYNC_BUTTON_STATES.WAITING : ASYNC_BUTTON_STATES.ACTION;
374
+ isManualRefreshLoading: {
375
+ handler(neu, old) {
376
+ this.currentPhase = neu ? ASYNC_BUTTON_STATES.WAITING : ASYNC_BUTTON_STATES.ACTION;
373
377
 
374
- // setTimeout is needed so that this is pushed further back on the JS computing queue
375
- // because nextTick isn't enough to capture the DOM update for the manual refresh only scenario
376
- if (old && !neu) {
377
- this.manualRefreshTimer = setTimeout(() => {
378
- this.watcherUpdateLiveAndDelayed(neu, old);
379
- }, 1000);
380
- }
378
+ // setTimeout is needed so that this is pushed further back on the JS computing queue
379
+ // because nextTick isn't enough to capture the DOM update for the manual refresh only scenario
380
+ if (old && !neu) {
381
+ this.manualRefreshTimer = setTimeout(() => {
382
+ this.watcherUpdateLiveAndDelayed(neu, old);
383
+ }, 1000);
384
+ }
385
+ },
386
+ immediate: true
381
387
  }
382
388
  },
383
389
 
@@ -463,6 +469,13 @@ export default {
463
469
  }
464
470
  }
465
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
+
466
479
  return out;
467
480
  },
468
481
 
@@ -542,7 +555,7 @@ export default {
542
555
  group.rows.push(rowData);
543
556
 
544
557
  this.columns.forEach((c) => {
545
- const value = c.delayLoading ? undefined : this.valueFor(row, c);
558
+ const value = c.delayLoading ? undefined : this.valueFor(row, c, c.isLabel);
546
559
  let component;
547
560
  let formatted = value;
548
561
  let needRef = false;
@@ -697,11 +710,15 @@ export default {
697
710
  return ucFirst(col.name);
698
711
  },
699
712
 
700
- valueFor(row, col) {
713
+ valueFor(row, col, isLabel) {
701
714
  if (typeof col.value === 'function') {
702
715
  return col.value(row);
703
716
  }
704
717
 
718
+ if (isLabel) {
719
+ return row.metadata.labels[col.label];
720
+ }
721
+
705
722
  // Use to debug table columns using expensive value getters
706
723
  // console.warn(`Performance: Table valueFor: ${ col.name } ${ col.value }`); // eslint-disable-line no-console
707
724
 
@@ -831,7 +848,11 @@ export default {
831
848
  <div ref="container">
832
849
  <div :class="{'titled': $slots.title && $slots.title.length}" class="sortable-table-header">
833
850
  <slot name="title" />
834
- <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
+ >
835
856
  <div :class="bulkActionsClass" class="bulk">
836
857
  <slot name="header-left">
837
858
  <template v-if="tableActions">
@@ -887,21 +908,77 @@ export default {
887
908
  </template>
888
909
  </slot>
889
910
  </div>
890
- <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">
891
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" />
892
927
  <AsyncButton
893
928
  v-if="isTooManyItemsToAutoUpdate"
894
929
  v-tooltip="t('performance.manualRefresh.buttonTooltip')"
930
+ class="manual-refresh"
895
931
  mode="refresh"
896
932
  :current-phase="currentPhase"
897
933
  @click="debouncedRefreshTableData"
898
934
  />
899
- </div>
900
-
901
- <div v-if="search || ($slots['header-right'] && $slots['header-right'].length)" class="search row">
902
- <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>
903
980
  <input
904
- v-if="search"
981
+ v-else-if="search"
905
982
  ref="searchQuery"
906
983
  v-model="eventualSearchQuery"
907
984
  type="search"
@@ -917,7 +994,12 @@ export default {
917
994
  v-if="showHeaders"
918
995
  :label-for="labelFor"
919
996
  :columns="columns"
997
+ :group="group"
998
+ :group-options="advGroupOptions"
999
+ :has-advanced-filtering="hasAdvancedFiltering"
1000
+ :adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
920
1001
  :table-actions="tableActions"
1002
+ :table-cols-options="columnOptions"
921
1003
  :row-actions="rowActions"
922
1004
  :sub-expand-column="subExpandColumn"
923
1005
  :row-actions-width="rowActionsWidth"
@@ -930,6 +1012,9 @@ export default {
930
1012
  :no-results="noResults"
931
1013
  @on-toggle-all="onToggleAll"
932
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"
933
1018
  />
934
1019
 
935
1020
  <!-- Don't display anything if we're loading and the delay has yet to pass -->
@@ -965,24 +1050,24 @@ export default {
965
1050
  </tr>
966
1051
  </slot>
967
1052
  </tbody>
968
- <tbody v-for="group in displayRows" v-else :key="group.key" :class="{ group: groupBy }">
969
- <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">
970
1055
  <tr class="group-row">
971
1056
  <td :colspan="fullColspan">
972
- <slot name="group-by" :group="group.grp">
1057
+ <slot name="group-by" :group="groupedRows.grp">
973
1058
  <div v-trim-whitespace class="group-tab">
974
- {{ group.ref }}
1059
+ {{ groupedRows.ref }}
975
1060
  </div>
976
1061
  </slot>
977
1062
  </td>
978
1063
  </tr>
979
1064
  </slot>
980
- <template v-for="(row, i) in group.rows">
1065
+ <template v-for="(row, i) in groupedRows.rows">
981
1066
  <slot name="main-row" :row="row.row">
982
1067
  <slot :name="'main-row:' + (row.row.mainRowKey || i)" :full-colspan="fullColspan">
983
1068
  <!-- The data-cant-run-bulk-action-of-interest attribute is being used instead of :class because
984
- because our selection.js invokes toggleClass and :class clobbers what was added by toggleClass if
985
- 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. -->
986
1071
  <tr
987
1072
  :key="row.key"
988
1073
  class="main-row"
@@ -1020,6 +1105,7 @@ export default {
1020
1105
  :rowKey="row.key"
1021
1106
  >
1022
1107
  <td
1108
+ v-show="!hasAdvancedFiltering || (hasAdvancedFiltering && col.col.isColVisible)"
1023
1109
  :key="col.col.name"
1024
1110
  :data-title="col.col.label"
1025
1111
  :data-testid="`sortable-cell-${ i }-${ j }`"
@@ -1162,7 +1248,118 @@ export default {
1162
1248
  </div>
1163
1249
  </template>
1164
1250
 
1165
- <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
+
1166
1363
  // Remove colors from multi-action buttons in the table
1167
1364
  td {
1168
1365
  .actions.role-multi-action {
@@ -1212,332 +1409,341 @@ export default {
1212
1409
 
1213
1410
  .search-box {
1214
1411
  height: 40px;
1412
+ margin-left: 10px;
1413
+ min-width: 180px;
1215
1414
  }
1216
- </style>
1217
-
1218
- <style lang="scss">
1219
- //
1220
- // Important: Almost all selectors in here need to be ">"-ed together so they
1221
- // apply only to the current table, not one nested inside another table.
1222
- //
1223
-
1224
- $group-row-height: 40px;
1225
- $group-separation: 40px;
1226
- $divider-height: 1px;
1227
-
1228
- $separator: 20;
1229
- $remove: 100;
1230
- $spacing: 10px;
1231
-
1232
- .sortable-table {
1233
- border-collapse: collapse;
1234
- min-width: 400px;
1235
- border-radius: 5px 5px 0 0;
1236
- outline: 1px solid var(--border);
1237
- overflow: hidden;
1238
- background: var(--sortable-table-bg);
1239
- border-radius: 4px;
1240
-
1241
- &.overflow-x {
1242
- overflow-x: visible;
1243
- }
1244
- &.overflow-y {
1245
- overflow-y: visible;
1246
- }
1415
+ </style>
1247
1416
 
1248
- td {
1249
- padding: 8px 5px;
1250
- 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
+ //
1251
1422
 
1252
- &:first-child {
1253
- padding-left: 10px;
1254
- }
1423
+ $group-row-height: 40px;
1424
+ $group-separation: 40px;
1425
+ $divider-height: 1px;
1255
1426
 
1256
- &:last-child {
1257
- padding-right: 10px;
1258
- }
1427
+ $separator: 20;
1428
+ $remove: 100;
1429
+ $spacing: 10px;
1259
1430
 
1260
- &.row-check {
1261
- padding-top: 12px;
1262
- }
1431
+ .filter-select .vs__selected-options .vs__selected {
1432
+ text-align: left;
1263
1433
  }
1264
1434
 
1265
- tbody {
1266
- tr {
1267
- border-bottom: 1px solid var(--sortable-table-top-divider);
1268
- background-color: var(--sortable-table-row-bg);
1269
-
1270
- &.main-row.has-sub-row {
1271
- border-bottom: 0;
1272
- }
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
+ }
1273
1450
 
1274
- // if a main-row is hovered also hover it's sibling sub row. note - the reverse is handled in selection.js
1275
- &.main-row:not(.row-selected):hover + .sub-row {
1276
- background-color: var(--sortable-table-hover-bg);
1277
- }
1451
+ td {
1452
+ padding: 8px 5px;
1453
+ border: 0;
1278
1454
 
1279
- &:last-of-type {
1280
- border-bottom: 0;
1455
+ &:first-child {
1456
+ padding-left: 10px;
1281
1457
  }
1282
1458
 
1283
- &:hover, &.sub-row-hovered {
1284
- background-color: var(--sortable-table-hover-bg);
1459
+ &:last-child {
1460
+ padding-right: 10px;
1285
1461
  }
1286
1462
 
1287
- &.state-description > td {
1288
- font-size: 13px;
1289
- padding-top: 0;
1290
- overflow-wrap: anywhere;
1463
+ &.row-check {
1464
+ padding-top: 12px;
1291
1465
  }
1292
1466
  }
1293
1467
 
1294
- tr.active-row {
1295
- color: var(--sortable-table-header-bg);
1296
- }
1468
+ tbody {
1469
+ tr {
1470
+ border-bottom: 1px solid var(--sortable-table-top-divider);
1471
+ background-color: var(--sortable-table-row-bg);
1297
1472
 
1298
- tr.row-selected {
1299
- background: var(--sortable-table-selected-bg);
1300
- }
1473
+ &.main-row.has-sub-row {
1474
+ border-bottom: 0;
1475
+ }
1301
1476
 
1302
- .no-rows {
1303
- td {
1304
- padding: 30px 0;
1305
- text-align: center;
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
+ }
1481
+
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
+ }
1306
1495
  }
1307
- }
1308
1496
 
1309
- .no-rows, .no-results {
1310
- &:hover {
1311
- background-color: var(--body-bg);
1497
+ tr.active-row {
1498
+ color: var(--sortable-table-header-bg);
1312
1499
  }
1313
- }
1314
1500
 
1315
- &.group {
1316
- &:before {
1317
- content: "";
1318
- display: block;
1319
- height: 20px;
1320
- background-color: transparent;
1501
+ tr.row-selected {
1502
+ background: var(--sortable-table-selected-bg);
1321
1503
  }
1322
- }
1323
1504
 
1324
- tr.group-row {
1325
- background-color: initial;
1505
+ .no-rows {
1506
+ td {
1507
+ padding: 30px 0;
1508
+ text-align: center;
1509
+ }
1510
+ }
1326
1511
 
1327
- &:first-child {
1328
- border-bottom: 2px solid var(--sortable-table-row-bg);
1512
+ .no-rows, .no-results {
1513
+ &:hover {
1514
+ background-color: var(--body-bg);
1515
+ }
1329
1516
  }
1330
1517
 
1331
- &:not(:first-child) {
1332
- margin-top: 20px;
1518
+ &.group {
1519
+ &:before {
1520
+ content: "";
1521
+ display: block;
1522
+ height: 20px;
1523
+ background-color: transparent;
1524
+ }
1333
1525
  }
1334
1526
 
1335
- td {
1336
- padding: 0;
1527
+ tr.group-row {
1528
+ background-color: initial;
1337
1529
 
1338
- &:first-of-type {
1339
- border-left: 1px solid var(--sortable-table-accent-bg);
1530
+ &:first-child {
1531
+ border-bottom: 2px solid var(--sortable-table-row-bg);
1340
1532
  }
1341
- }
1342
1533
 
1343
- .group-tab {
1344
- @include clearfix;
1345
- height: $group-row-height;
1346
- line-height: $group-row-height;
1347
- padding: 0 10px;
1348
- border-radius: 4px 4px 0px 0px;
1349
- background-color: var(--sortable-table-row-bg);
1350
- position: relative;
1351
- top: 1px;
1352
- display: inline-block;
1353
- z-index: z-index('tableGroup');
1354
- min-width: $group-row-height * 1.8;
1355
-
1356
- > SPAN {
1357
- color: var(--sortable-table-group-label);
1534
+ &:not(:first-child) {
1535
+ margin-top: 20px;
1358
1536
  }
1359
- }
1360
1537
 
1361
- .group-tab:after {
1362
- height: $group-row-height;
1363
- width: 70px;
1364
- border-radius: 5px 5px 0px 0px;
1365
- background-color: var(--sortable-table-row-bg);
1366
- content: "";
1367
- position: absolute;
1368
- right: -15px;
1369
- top: 0px;
1370
- transform: skewX(40deg);
1371
- 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
+ }
1372
1576
  }
1373
1577
  }
1374
1578
  }
1375
- }
1376
1579
 
1377
- .for-inputs{
1378
- & TABLE.sortable-table {
1379
- width: 100%;
1380
- border-collapse: collapse;
1381
- margin-bottom: $spacing;
1580
+ .for-inputs{
1581
+ & TABLE.sortable-table {
1582
+ width: 100%;
1583
+ border-collapse: collapse;
1584
+ margin-bottom: $spacing;
1382
1585
 
1383
- >TBODY>TR>TD, >THEAD>TR>TH {
1384
- padding-right: $spacing;
1385
- padding-bottom: $spacing;
1586
+ >TBODY>TR>TD, >THEAD>TR>TH {
1587
+ padding-right: $spacing;
1588
+ padding-bottom: $spacing;
1386
1589
 
1387
- &:last-of-type {
1388
- padding-right: 0;
1590
+ &:last-of-type {
1591
+ padding-right: 0;
1592
+ }
1389
1593
  }
1390
- }
1391
1594
 
1392
- >TBODY>TR:first-of-type>TD {
1393
- padding-top: $spacing;
1394
- }
1595
+ >TBODY>TR:first-of-type>TD {
1596
+ padding-top: $spacing;
1597
+ }
1395
1598
 
1396
- >TBODY>TR:last-of-type>TD {
1397
- padding-bottom: 0;
1599
+ >TBODY>TR:last-of-type>TD {
1600
+ padding-bottom: 0;
1601
+ }
1398
1602
  }
1399
- }
1400
1603
 
1401
- &.edit, &.create, &.clone {
1402
- TABLE.sortable-table>THEAD>TR>TH {
1403
- border-color: transparent;
1604
+ &.edit, &.create, &.clone {
1605
+ TABLE.sortable-table>THEAD>TR>TH {
1606
+ border-color: transparent;
1607
+ }
1404
1608
  }
1405
1609
  }
1406
- }
1407
1610
 
1408
- .sortable-table-header {
1409
- position: relative;
1410
- z-index: z-index('fixedTableHeader');
1611
+ .sortable-table-header {
1612
+ position: relative;
1613
+ z-index: z-index('fixedTableHeader');
1411
1614
 
1412
- &.titled {
1413
- display: flex;
1414
- align-items: center;
1415
- }
1416
- }
1417
- .fixed-header-actions.button{
1418
- grid-template-columns: [bulk] auto [middle] min-content [search] minmax(min-content, 350px);
1419
- }
1420
-
1421
- .fixed-header-actions {
1422
- padding: 0 0 20px 0;
1423
- width: 100%;
1424
- z-index: z-index('fixedTableHeader');
1425
- background: transparent;
1426
- display: grid;
1427
- grid-template-columns: [bulk] auto [middle] min-content [search] minmax(min-content, 200px);
1428
- grid-column-gap: 10px;
1429
-
1430
- .bulk {
1431
- grid-area: bulk;
1432
- margin-top: 1px;
1433
-
1434
- $gap: 10px;
1435
-
1436
- & > BUTTON {
1437
- display: none; // Handled dynamically
1615
+ &.titled {
1616
+ display: flex;
1617
+ align-items: center;
1438
1618
  }
1619
+ }
1620
+ .fixed-header-actions.button{
1621
+ grid-template-columns: [bulk] auto [middle] min-content [search] minmax(min-content, 350px);
1622
+ }
1439
1623
 
1440
- & > BUTTON:not(:last-of-type) {
1441
- 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);
1442
1635
  }
1443
1636
 
1444
- .action-availability {
1445
- display: none; // Handled dynamically
1446
- margin-left: $gap;
1447
- vertical-align: middle;
1448
- margin-top: 2px;
1449
- }
1637
+ .bulk {
1638
+ grid-area: bulk;
1450
1639
 
1451
- .dropdown-button {
1452
- $disabled-color: var(--disabled-text);
1453
- $disabled-cursor: not-allowed;
1454
- li.disabled {
1455
- color: $disabled-color;
1456
- cursor: $disabled-cursor;
1640
+ $gap: 10px;
1457
1641
 
1458
- &: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 {
1459
1661
  color: $disabled-color;
1460
- background-color: unset;
1461
1662
  cursor: $disabled-cursor;
1663
+
1664
+ &:hover {
1665
+ color: $disabled-color;
1666
+ background-color: unset;
1667
+ cursor: $disabled-cursor;
1668
+ }
1462
1669
  }
1463
1670
  }
1464
- }
1465
1671
 
1466
- .bulk-action {
1467
- .icon {
1468
- vertical-align: -10%;
1672
+ .bulk-action {
1673
+ .icon {
1674
+ vertical-align: -10%;
1675
+ }
1469
1676
  }
1470
1677
  }
1471
- }
1472
1678
 
1473
- .middle {
1474
- grid-area: middle;
1475
- white-space: nowrap;
1679
+ .middle {
1680
+ grid-area: middle;
1681
+ white-space: nowrap;
1476
1682
 
1477
- .icon.icon-backup.animate {
1478
- animation-name: spin;
1479
- animation-duration: 1000ms;
1480
- animation-iteration-count: infinite;
1481
- animation-timing-function: linear;
1482
- }
1483
-
1484
- @keyframes spin {
1485
- from {
1486
- 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;
1487
1688
  }
1488
- to {
1489
- transform:rotate(360deg);
1689
+
1690
+ @keyframes spin {
1691
+ from {
1692
+ transform:rotate(0deg);
1693
+ }
1694
+ to {
1695
+ transform:rotate(360deg);
1696
+ }
1490
1697
  }
1491
1698
  }
1492
- }
1493
1699
 
1494
- .search {
1495
- grid-area: search;
1496
- text-align: right;
1497
- justify-content: flex-end;
1498
- }
1700
+ .search {
1701
+ grid-area: search;
1702
+ text-align: right;
1703
+ justify-content: flex-end;
1704
+ }
1499
1705
 
1500
- .bulk-actions-dropdown {
1501
- display: none; // Handled dynamically
1706
+ .bulk-actions-dropdown {
1707
+ display: none; // Handled dynamically
1502
1708
 
1503
- .dropdown-button {
1504
- background-color: var(--primary);
1709
+ .dropdown-button {
1710
+ background-color: var(--primary);
1505
1711
 
1506
- &:hover {
1507
- background-color: var(--primary-hover-bg);
1508
- color: var(--primary-hover-text);
1509
- }
1712
+ &:hover {
1713
+ background-color: var(--primary-hover-bg);
1714
+ color: var(--primary-hover-text);
1715
+ }
1510
1716
 
1511
- > *, .icon-chevron-down {
1512
- color: var(--primary-text);
1513
- }
1717
+ > *, .icon-chevron-down {
1718
+ color: var(--primary-text);
1719
+ }
1514
1720
 
1515
- .button-divider {
1516
- border-color: var(--primary-text);
1517
- }
1721
+ .button-divider {
1722
+ border-color: var(--primary-text);
1723
+ }
1518
1724
 
1519
- &.disabled {
1520
- border-color: var(--disabled-bg);
1725
+ &.disabled {
1726
+ border-color: var(--disabled-bg);
1521
1727
 
1522
- .icon-chevron-down {
1523
- color: var(--disabled-text) !important;
1524
- }
1728
+ .icon-chevron-down {
1729
+ color: var(--disabled-text) !important;
1730
+ }
1525
1731
 
1526
- .button-divider {
1527
- border-color: var(--disabled-text);
1732
+ .button-divider {
1733
+ border-color: var(--disabled-text);
1734
+ }
1528
1735
  }
1529
1736
  }
1530
1737
  }
1531
1738
  }
1532
- }
1533
1739
 
1534
- .paging {
1535
- margin-top: 10px;
1536
- text-align: center;
1740
+ .paging {
1741
+ margin-top: 10px;
1742
+ text-align: center;
1537
1743
 
1538
- SPAN {
1539
- display: inline-block;
1540
- min-width: 200px;
1744
+ SPAN {
1745
+ display: inline-block;
1746
+ min-width: 200px;
1747
+ }
1541
1748
  }
1542
- }
1543
- </style>
1749
+ </style>