dashboard-shell-shell 1.0.1000000117 → 1.0.1000000118

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 (124) hide show
  1. package/assets/styles/base/_functions.scss +0 -0
  2. package/assets/styles/base/_mixins.scss +1 -1
  3. package/assets/styles/global/_button.scss +10 -17
  4. package/assets/styles/global/_form.scss +2 -2
  5. package/assets/styles/global/_labeled-input.scss +2 -6
  6. package/assets/styles/global/_select.scss +7 -6
  7. package/assets/styles/global/_table.scss +2 -3
  8. package/assets/styles/global/_tooltip.scss +1 -8
  9. package/assets/styles/themes/_dark.scss +0 -2
  10. package/assets/styles/themes/_light.scss +2 -5
  11. package/assets/styles/vendor/vue-select.scss +1 -2
  12. package/assets/translations/en-us.yaml +3 -1
  13. package/assets/translations/zh-hans.yaml +28 -51
  14. package/components/ActionDropdown.vue +0 -1
  15. package/components/ActionMenuShell.vue +3 -6
  16. package/components/BrandImage.vue +0 -22
  17. package/components/ClusterIconMenu.vue +1 -1
  18. package/components/CodeMirror.vue +0 -1
  19. package/components/CruResource.vue +1 -1
  20. package/components/CruResourceFooter.vue +1 -1
  21. package/components/ExplorerProjectsNamespaces.vue +24 -4
  22. package/components/GlobalRoleBindings.vue +48 -112
  23. package/components/IndentedPanel.vue +10 -4
  24. package/components/PromptRemove.vue +3 -3
  25. package/components/ResourceDetail/Masthead.vue +242 -190
  26. package/components/ResourceDetail/index.vue +5 -20
  27. package/components/ResourceList/Masthead.vue +84 -146
  28. package/components/ResourceList/ResourceLoadingIndicator.vue +2 -5
  29. package/components/ResourceTable.vue +1 -76
  30. package/components/SideNav.vue +29 -66
  31. package/components/SortableTable/THead.vue +0 -6
  32. package/components/SortableTable/index.vue +388 -481
  33. package/components/Tabbed/index.vue +5 -4
  34. package/components/auth/Principal.vue +2 -3
  35. package/components/auth/RoleDetailEdit.vue +5 -58
  36. package/components/auth/SelectPrincipal.vue +0 -1
  37. package/components/form/BannerSettings.vue +16 -18
  38. package/components/form/ChangePassword.vue +4 -4
  39. package/components/form/ColorInput.vue +8 -32
  40. package/components/form/Footer.vue +1 -1
  41. package/components/form/InputWithSelect.vue +0 -2
  42. package/components/form/KeyValue.vue +7 -31
  43. package/components/form/LabeledSelect.vue +178 -178
  44. package/components/form/Members/ClusterPermissionsEditor.vue +2 -1
  45. package/components/form/Members/MembershipEditor.vue +1 -1
  46. package/components/form/NameNsDescription.vue +11 -24
  47. package/components/form/Password.vue +2 -6
  48. package/components/form/ResourceQuota/Namespace.vue +1 -1
  49. package/components/form/ResourceQuota/NamespaceRow.vue +10 -13
  50. package/components/form/ResourceQuota/ProjectRow.vue +1 -0
  51. package/components/form/Select.vue +2 -2
  52. package/components/nav/Favorite.vue +1 -5
  53. package/components/nav/Group.vue +23 -69
  54. package/components/nav/Header.vue +17 -82
  55. package/components/nav/HeaderPageActionMenu.vue +0 -1
  56. package/components/nav/NamespaceFilter.vue +3 -0
  57. package/components/nav/TopLevelMenu.vue +119 -182
  58. package/components/nav/Type.vue +11 -48
  59. package/components/rancherResourceDetail/Masthead.vue +769 -0
  60. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  61. package/components/rancherResourceDetail/index.vue +591 -0
  62. package/components/rancherResourceList/Masthead.vue +375 -0
  63. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  64. package/components/rancherResourceList/index.vue +307 -0
  65. package/components/rancherResourceList/resource-list.config.js +7 -0
  66. package/components/rancherResourceTable.vue +783 -0
  67. package/components/rancherSortableTable/THead.vue +561 -0
  68. package/components/rancherSortableTable/actions.js +153 -0
  69. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  70. package/components/rancherSortableTable/debug.js +117 -0
  71. package/components/rancherSortableTable/filtering.js +290 -0
  72. package/components/rancherSortableTable/grouping.js +48 -0
  73. package/components/rancherSortableTable/index.vue +2712 -0
  74. package/components/rancherSortableTable/paging.js +155 -0
  75. package/components/rancherSortableTable/selection.js +629 -0
  76. package/components/rancherSortableTable/sortable-config.ts +4 -0
  77. package/components/rancherSortableTable/sorting.js +129 -0
  78. package/composables/useClickOutside.ts +1 -1
  79. package/config/product/auth.js +7 -16
  80. package/config/product/explorer.js +1 -1
  81. package/config/product/settings.js +8 -17
  82. package/config/settings.ts +0 -28
  83. package/edit/management.cattle.io.user.vue +4 -17
  84. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  85. package/edit/token.vue +1 -1
  86. package/list/harvesterhci.io.management.cluster.vue +0 -17
  87. package/list/management.cattle.io.setting.vue +13 -22
  88. package/list/management.cattle.io.user.vue +14 -25
  89. package/list/provisioning.cattle.io.cluster.vue +7 -6
  90. package/mixins/brand.js +0 -17
  91. package/package.json +1 -1
  92. package/pages/auth/login.vue +29 -84
  93. package/pages/c/_cluster/auth/roles/index.vue +14 -61
  94. package/pages/c/_cluster/settings/banners.vue +101 -174
  95. package/pages/c/_cluster/settings/brand.vue +301 -348
  96. package/pages/c/_cluster/settings/performance.vue +38 -61
  97. package/pages/home.vue +21 -70
  98. package/pages/prefs.vue +23 -25
  99. package/pkg/tsconfig.json +9 -9
  100. package/pkg/vue.config.js +1 -1
  101. package/promptRemove/mixin/roleDeletionCheck.js +2 -2
  102. package/scripts/clean +0 -0
  103. package/scripts/extension/bundle +0 -0
  104. package/scripts/extension/helm/scripts/package +0 -0
  105. package/scripts/extension/helm/scripts/patch +0 -0
  106. package/scripts/extension/helm/scripts/version +0 -0
  107. package/scripts/extension/helmpatch +0 -0
  108. package/scripts/extension/parse-tag-name +0 -0
  109. package/scripts/extension/publish +0 -0
  110. package/scripts/publish-shell.sh +60 -86
  111. package/scripts/serve-pkgs +0 -0
  112. package/scripts/sync-shell-deps +0 -0
  113. package/scripts/typegen.sh +28 -44
  114. package/store/i18n.js +5 -5
  115. package/store/prefs.js +5 -17
  116. package/store/type-map.js +1 -2
  117. package/types/cloud-shell/index.d.ts +11014 -0
  118. package/types/shell/index.d.ts +1 -1
  119. package/utils/error.js +0 -4
  120. package/utils/router.js +3 -3
  121. package/vue.config.js +6 -1
  122. package/assets/images/action.svg +0 -6
  123. package/assets/images/pl/logo.png +0 -0
  124. /package/components/{ResourceList → rancherResourceList}/Masthead-btn.vue +0 -0
@@ -0,0 +1,129 @@
1
+ import { sortBy } from '@shell/utils/sort';
2
+ import { uniq } from '@shell/utils/array';
3
+
4
+ /**
5
+ * Always sort by something, this is the best guess on properties
6
+ *
7
+ * Can be overriden
8
+ */
9
+ const DEFAULT_MANDATORY_SORT = ['nameSort', 'id'];
10
+
11
+ export default {
12
+ computed: {
13
+ sortFields() {
14
+ let fromGroup = ( this.groupBy ? this.groupSort || this.groupBy : null) || [];
15
+ let fromColumn = [];
16
+
17
+ const column = (this.columns || this.headers).find((x) => x && x.name && x.name.toLowerCase() === this.sortBy.toLowerCase());
18
+
19
+ if ( this.sortBy && column && column.sort ) {
20
+ fromColumn = column.sort;
21
+ }
22
+
23
+ if ( !Array.isArray(fromGroup) ) {
24
+ fromGroup = [fromGroup];
25
+ }
26
+
27
+ if ( !Array.isArray(fromColumn) ) {
28
+ fromColumn = [fromColumn];
29
+ }
30
+
31
+ // return the sorting based on grouping, user selection and fallback
32
+ return uniq([...fromGroup, ...fromColumn].concat(...(this.mandatorySort || DEFAULT_MANDATORY_SORT)));
33
+ },
34
+
35
+ arrangedRows() {
36
+ if (this.externalPaginationEnabled) {
37
+ return;
38
+ }
39
+
40
+ let key;
41
+
42
+ // Why is sortGeneration needed when we have sortGenerationFn?
43
+ // 1. sortGenerationFn is called when this fn is kicked off and returns latest and greatest string (given things like namespace)
44
+ // 2. it can be kicked off with stale rows... which is then stored against latest string
45
+ // 3. when updates rows comes through... sortGenerationFn returns same string
46
+ // 4. we therefor think nothing has changed and return old, stale rows
47
+ // This is avoided by outside storage of sortGeneration against rows
48
+ // (it would be nice to have that hash on the rows object itself, but it gets messy)
49
+ const sortGenerationKey = this.sortGeneration || this.sortGenerationFn?.apply(this);
50
+
51
+ if ( sortGenerationKey) {
52
+ key = `${ sortGenerationKey }/${ this.rows.length }/${ this.descending }/${ this.sortFields.join(',') }`;
53
+ if ( this.cacheKey === key ) {
54
+ return this.cachedRows;
55
+ }
56
+ }
57
+
58
+ const out = sortBy(this.rows, this.sortFields, this.descending);
59
+
60
+ if ( key ) {
61
+ this.cacheKey = key;
62
+ this.cachedRows = out;
63
+ }
64
+
65
+ return out;
66
+ },
67
+ },
68
+
69
+ data() {
70
+ let sortBy = null;
71
+
72
+ this._defaultSortBy = this.defaultSortBy;
73
+
74
+ // Try to find a reasonable default sort
75
+ if ( !this._defaultSortBy ) {
76
+ const markedColumn = this.headers.find((x) => !!x.defaultSort);
77
+ const nameColumn = this.headers.find( (x) => x.name === 'name');
78
+
79
+ if ( markedColumn ) {
80
+ this._defaultSortBy = markedColumn.name;
81
+ } else if ( nameColumn ) {
82
+ // Use the name column if there is one
83
+ this._defaultSortBy = nameColumn.name;
84
+ } else {
85
+ // The first column that isn't state
86
+ const first = this.headers.filter( (x) => x.name !== 'state' )[0];
87
+
88
+ if ( first ) {
89
+ this._defaultSortBy = first.name;
90
+ } else {
91
+ // I give up
92
+ this._defaultSortBy = 'id';
93
+ }
94
+ }
95
+ }
96
+
97
+ // If the sort column doesn't exist or isn't specified, use default
98
+ if ( !sortBy || !this.headers.find((x) => x.name === sortBy ) ) {
99
+ sortBy = this._defaultSortBy;
100
+ }
101
+
102
+ return {
103
+ sortBy,
104
+ descending: false,
105
+ cachedRows: null,
106
+ cacheKey: null,
107
+ };
108
+ },
109
+
110
+ methods: {
111
+ changeSort(sort, desc) {
112
+ this.sortBy = sort;
113
+ this.descending = desc;
114
+
115
+ // Always go back to the first page when the sort is changed
116
+ this.setPage(1);
117
+ },
118
+ },
119
+
120
+ watch: {
121
+ sortFields() {
122
+ this.debouncedPaginationChanged();
123
+ },
124
+
125
+ descending() {
126
+ this.debouncedPaginationChanged();
127
+ }
128
+ }
129
+ };
@@ -76,6 +76,6 @@ export const useClickOutside = <T extends OnClickOutsideOptions>(
76
76
 
77
77
  onBeforeUnmount(() => {
78
78
  window.removeEventListener('click', listener as any);
79
- window.removeEventListener('pointerdown', setShouldListen);
79
+ window.removeEventListener('pointerDown', setShouldListen);
80
80
  });
81
81
  };
@@ -28,7 +28,7 @@ export function init(store) {
28
28
  product({
29
29
  ifHaveType: new RegExp(`${ MANAGEMENT.USER }|${ MANAGEMENT.AUTH_CONFIG }`, 'i'),
30
30
  ifHaveVerb: 'GET',
31
- // ifFeature: MULTI_CLUSTER,
31
+ ifFeature: MULTI_CLUSTER,
32
32
  inStore: 'management',
33
33
  icon: 'user',
34
34
  removable: false,
@@ -176,21 +176,12 @@ export function init(store) {
176
176
  componentForType(`${ MANAGEMENT.AUTH_CONFIG }/keycloakoidc`, 'auth/oidc');
177
177
  componentForType(`${ MANAGEMENT.AUTH_CONFIG }/genericoidc`, 'auth/oidc');
178
178
 
179
- const topLevelPermissions = sessionStorage.getItem('TOPLEVELPERMISSIONS')
180
-
181
- if (topLevelPermissions && topLevelPermissions === 'superadmin') {
182
- basicType([
183
- 'config',
184
- USERS_VIRTUAL_TYPE,
185
- NORMAN.SPOOFED.GROUP_PRINCIPAL,
186
- ROLES_VIRTUAL_TYPE
187
- ]);
188
- } else {
189
- basicType([
190
- USERS_VIRTUAL_TYPE,
191
- ROLES_VIRTUAL_TYPE
192
- ]);
193
- }
179
+ basicType([
180
+ 'config',
181
+ USERS_VIRTUAL_TYPE,
182
+ NORMAN.SPOOFED.GROUP_PRINCIPAL,
183
+ ROLES_VIRTUAL_TYPE
184
+ ]);
194
185
 
195
186
  headers(NORMAN.SPOOFED.GROUP_PRINCIPAL, [
196
187
  GROUP_NAME,
@@ -64,7 +64,7 @@ export function init(store) {
64
64
  [NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING]: 'rancher',
65
65
  [NORMAN.PROJECT_ROLE_TEMPLATE_BINDING]: 'rancher',
66
66
  [CAPI.RANCHER_CLUSTER]: 'management',
67
- },
67
+ }
68
68
  });
69
69
 
70
70
  basicType(['cluster-dashboard', 'cluster-tools']);
@@ -102,23 +102,14 @@ export function init(store) {
102
102
  route: { name: 'c-cluster-settings-links' }
103
103
  });
104
104
 
105
- const topLevelPermissions = sessionStorage.getItem('TOPLEVELPERMISSIONS')
106
-
107
- if (topLevelPermissions && topLevelPermissions === 'superadmin') {
108
- basicType([
109
- 'settings',
110
- 'features',
111
- 'brand',
112
- 'banners',
113
- 'performance',
114
- 'links'
115
- ]);
116
- } else {
117
- basicType([
118
- 'settings',
119
- 'brand',
120
- ]);
121
- }
105
+ basicType([
106
+ 'settings',
107
+ 'features',
108
+ 'brand',
109
+ 'banners',
110
+ 'performance',
111
+ 'links'
112
+ ]);
122
113
 
123
114
  configureType(MANAGEMENT.SETTING, {
124
115
  isCreatable: false,
@@ -113,34 +113,6 @@ export const SETTING = {
113
113
  CLUSTER_AGENT_DEFAULT_POD_DISTRIBUTION_BUDGET: 'cluster-agent-default-pod-disruption-budget'
114
114
  } as const;
115
115
 
116
- export const ALLOWED_SETTINGS_NEW: GlobalSetting = {
117
- [SETTING.CA_CERTS]: { kind: 'multiline', readOnly: true },
118
- [SETTING.PASSWORD_MIN_LENGTH]: {
119
- kind: 'integer',
120
- ruleSet: [
121
- {
122
- name: 'betweenValues',
123
- key: 'Password',
124
- factoryArg: [2, 256]
125
- },
126
- {
127
- name: 'isInteger',
128
- key: 'Password',
129
- },
130
- {
131
- name: 'isPositive',
132
- key: 'Password',
133
- },
134
- {
135
- name: 'isOctal',
136
- key: 'Password',
137
- }
138
- ],
139
- },
140
- [SETTING.AUTH_USER_SESSION_TTL_MINUTES]: {},
141
- [SETTING.AUTH_TOKEN_MAX_TTL_MINUTES]: {},
142
- }
143
-
144
116
  // These are the settings that are allowed to be edited via the UI
145
117
  export const ALLOWED_SETTINGS: GlobalSetting = {
146
118
  [SETTING.CA_CERTS]: { kind: 'multiline', readOnly: true },
@@ -214,11 +214,7 @@ export default {
214
214
  </script>
215
215
 
216
216
  <template>
217
-
218
- <!-- 如果没有获取到 value 数据,则显示加载组件 -->
219
217
  <Loading v-if="!value" />
220
-
221
- <!-- 如果有数据,则进入资源编辑/创建的表单界面 -->
222
218
  <CruResource
223
219
  v-else
224
220
  :done-route="doneRoute"
@@ -230,14 +226,10 @@ export default {
230
226
  class="create-edit"
231
227
  @finish="save"
232
228
  >
233
-
234
- <!-- 账户凭据区域 -->
235
229
  <div class="credentials">
236
230
  <h2> {{ t("user.edit.credentials.label") }}</h2>
237
-
238
- <!-- 用户名 & 显示名 -->
239
231
  <div class="row">
240
- <div class="col span-6">
232
+ <div class="col span-4">
241
233
  <LabeledInput
242
234
  ref="name"
243
235
  v-model:value="form.username"
@@ -249,7 +241,7 @@ export default {
249
241
  :ignore-password-managers="!isCreate"
250
242
  />
251
243
  </div>
252
- <div class="col span-6">
244
+ <div class="col span-4">
253
245
  <LabeledInput
254
246
  v-model:value="form.displayName"
255
247
  label-key="user.edit.credentials.displayName.label"
@@ -258,10 +250,8 @@ export default {
258
250
  />
259
251
  </div>
260
252
  </div>
261
-
262
- <!-- 用户描述 -->
263
- <div class="row">
264
- <div class="col span-6">
253
+ <div class="row mt-20 mb-10">
254
+ <div class="col span-8">
265
255
  <LabeledInput
266
256
  v-model:value="form.description"
267
257
  label-key="user.edit.credentials.userDescription.label"
@@ -271,7 +261,6 @@ export default {
271
261
  </div>
272
262
  </div>
273
263
 
274
- <!-- 修改密码(仅非查看模式显示) -->
275
264
  <ChangePassword
276
265
  v-if="!isView"
277
266
  ref="changePassword"
@@ -281,8 +270,6 @@ export default {
281
270
  @valid="validation.password = $event"
282
271
  />
283
272
  </div>
284
-
285
- <!-- 全局角色绑定区域(仅当 showGlobalRoles 为 true 时显示) -->
286
273
  <div
287
274
  v-if="showGlobalRoles"
288
275
  class="global-permissions"
@@ -189,7 +189,7 @@ $row-height: 40px;
189
189
  height: 100%;
190
190
 
191
191
  input.no-label {
192
- height: calc($row-height - 2px);
192
+ height: 32px;
193
193
  padding: 10px;
194
194
  }
195
195
  }
package/edit/token.vue CHANGED
@@ -184,7 +184,7 @@ export default {
184
184
  :label="err"
185
185
  />
186
186
  </div>
187
- <div class="pr-10">
187
+ <div class="pl-10 pr-10">
188
188
  <LabeledInput
189
189
  key="description"
190
190
  v-model:value="value.description"
@@ -119,7 +119,6 @@ export default {
119
119
  :resource="resource"
120
120
  :is-creatable="false"
121
121
  :type-display="typeDisplay"
122
- :main-button-visible="!rows || !rows.length"
123
122
  >
124
123
  <template #typeDescription>
125
124
  <TypeDescription :resource="hResource" />
@@ -145,23 +144,7 @@ export default {
145
144
  :is-creatable="true"
146
145
  :namespaced="false"
147
146
  :use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
148
-
149
- :resource="resource"
150
- :main-button-visible="true"
151
147
  >
152
-
153
- <template
154
- v-if="canCreateCluster"
155
- slot="extraActions"
156
- >
157
- <n-link
158
- :to="importLocation"
159
- class="btn role-primary"
160
- >
161
- {{ t('cluster.importAction') }}1451414651
162
- </n-link>
163
- </template>
164
-
165
148
  <template #col:name="{row}">
166
149
  <td>
167
150
  <span class="cluster-link">
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import { MANAGEMENT } from '@shell/config/types';
3
- import { ALLOWED_SETTINGS_NEW, ALLOWED_SETTINGS, PROVISIONING_SETTINGS } from '@shell/config/settings';
3
+ import { ALLOWED_SETTINGS, PROVISIONING_SETTINGS } from '@shell/config/settings';
4
4
  import { Banner } from '@components/Banner';
5
5
  import Loading from '@shell/components/Loading';
6
6
  import { VIEW_IN_API } from '@shell/store/prefs';
@@ -26,12 +26,8 @@ export default {
26
26
  const settings = [];
27
27
  const provisioningSettings = [];
28
28
 
29
- const topLevelPermissions = sessionStorage.getItem('TOPLEVELPERMISSIONS') || ''
30
-
31
- const allowedSettings = topLevelPermissions && topLevelPermissions === 'superadmin' ? ALLOWED_SETTINGS : ALLOWED_SETTINGS_NEW
32
-
33
29
  // Combine the allowed settings with the data from the API
34
- for ( const id in allowedSettings ) {
30
+ for ( const id in ALLOWED_SETTINGS ) {
35
31
  const setting = settingsMap[id];
36
32
 
37
33
  if ( !setting ) {
@@ -73,10 +69,7 @@ export default {
73
69
  },
74
70
 
75
71
  data() {
76
-
77
- const topLevelPermissions = sessionStorage.getItem('TOPLEVELPERMISSIONS') || ''
78
-
79
- return { topLevelPermissions, settings: null, provisioningSettings: null };
72
+ return { settings: null, provisioningSettings: null };
80
73
  },
81
74
  computed: { ...mapGetters({ t: 'i18n/t' }) }
82
75
  };
@@ -103,18 +96,16 @@ export default {
103
96
  />
104
97
  </div>
105
98
 
106
- <div v-if="topLevelPermissions && topLevelPermissions === 'superadmin'">
107
- <h2>
108
- {{ t('advancedSettings.provisioning.header') }}
109
- </h2>
110
- <div
111
- v-for="(setting) in provisioningSettings"
112
- :key="setting.id"
113
- >
114
- <Setting
115
- :value="setting"
116
- />
117
- </div>
99
+ <h2>
100
+ {{ t('advancedSettings.provisioning.header') }}
101
+ </h2>
102
+ <div
103
+ v-for="(setting) in provisioningSettings"
104
+ :key="setting.id"
105
+ >
106
+ <Setting
107
+ :value="setting"
108
+ />
118
109
  </div>
119
110
  </div>
120
111
  </template>
@@ -122,9 +122,18 @@ export default {
122
122
  :show-incremental-loading-indicator="incrementalLoadingIndicator"
123
123
  :load-resources="loadResources"
124
124
  :load-indeterminate="loadIndeterminate"
125
- :main-button-visible="false"
126
125
  >
127
-
126
+ <template #extraActions>
127
+ <AsyncButton
128
+ v-if="canRefreshAccess"
129
+ mode="refresh"
130
+ :action-label="t('authGroups.actions.refresh')"
131
+ :waiting-label="t('authGroups.actions.refresh')"
132
+ :success-label="t('authGroups.actions.refresh')"
133
+ :error-label="t('authGroups.actions.refresh')"
134
+ @click="refreshGroupMemberships"
135
+ />
136
+ </template>
128
137
  <template
129
138
  v-if="isAdmin"
130
139
  #subHeader
@@ -133,10 +142,9 @@ export default {
133
142
  :to="{ name: 'c-cluster-auth-user.retention'}"
134
143
  class="btn role-link btn-sm btn-user-retention"
135
144
  data-testid="router-link-user-retention"
136
- style="text-align: left;min-width: auto !important;width: auto;"
137
145
  >
138
- <!-- <i class="icon icon-gear"/> -->
139
- <!-- {{ t('user.retention.button.label') }} -->
146
+ <i class="icon icon-gear" />
147
+ {{ t('user.retention.button.label') }}
140
148
  </router-link>
141
149
  </template>
142
150
  </Masthead>
@@ -148,23 +156,7 @@ export default {
148
156
  :loading="loading"
149
157
  :use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
150
158
  :force-update-live-and-delayed="forceUpdateLiveAndDelayed"
151
-
152
- :resource="resource"
153
- :main-button-visible="true"
154
159
  >
155
- <template #extraActions>
156
- <AsyncButton
157
- v-if="canRefreshAccess"
158
- style="margin-right: 6px;"
159
- mode="refresh"
160
- :action-label="t('authGroups.actions.refresh')"
161
- :waiting-label="t('authGroups.actions.refresh')"
162
- :success-label="t('authGroups.actions.refresh')"
163
- :error-label="t('authGroups.actions.refresh')"
164
- @click="refreshGroupMemberships"
165
- />
166
- </template>
167
-
168
160
  <template #col:user-state="{row}">
169
161
  <td>
170
162
  <TableDataUserIcon
@@ -179,11 +171,8 @@ export default {
179
171
 
180
172
  <style lang="scss">
181
173
  .btn-user-retention {
182
- display: block;
174
+ display: flex;
183
175
  gap: 0.25rem;
184
176
  padding: 0;
185
177
  }
186
- .btn-user-retention:hover {
187
- color: #333 !important;
188
- }
189
178
  </style>
@@ -307,18 +307,19 @@ export default {
307
307
  <router-link
308
308
  v-if="row.mgmt && row.mgmt.isReady && !row.hasError"
309
309
  data-testid="cluster-manager-list-explore-management"
310
+ class="btn btn-sm role-secondary"
310
311
  :to="{name: 'c-cluster', params: {cluster: row.mgmt.id}}"
311
312
  >
312
- <a href="javascript:;">
313
- {{ t('cluster.explore') }}
314
- </a>
313
+ {{ t('cluster.explore') }}
315
314
  </router-link>
316
- <span
317
- data-testid="cluster-manager-list-explore"
315
+ <button
318
316
  v-else
317
+ data-testid="cluster-manager-list-explore"
318
+ :disabled="true"
319
+ class="btn btn-sm role-secondary"
319
320
  >
320
321
  {{ t('cluster.explore') }}
321
- </span>
322
+ </button>
322
323
  </template>
323
324
  </ResourceTable>
324
325
  </div>
package/mixins/brand.js CHANGED
@@ -176,24 +176,7 @@ export default {
176
176
  const vars = createCssVars(color, this.theme, name);
177
177
 
178
178
  for (const prop in vars) {
179
-
180
179
  document.body.style.setProperty(prop, vars[prop]);
181
-
182
- // 主色调hover值动态
183
- if (prop === '--primary-hover-bg') {
184
- // 如果是你要设置透明度的变量,比如 hover
185
- let value = '#E8F4FF';
186
- if (vars[prop]) {
187
- const match = vars[prop].match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
188
- if (match) {
189
- const [_, r, g, b] = match;
190
- value = `rgba(${r}, ${g}, ${b}, 0.15)`;
191
- }
192
- }
193
-
194
- document.body.style.setProperty('--nav-hover-color', vars[prop]);
195
- document.body.style.setProperty('--nav-active', value);
196
- }
197
180
  }
198
181
  },
199
182
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dashboard-shell-shell",
3
- "version": "1.0.1000000117",
3
+ "version": "1.0.1000000118",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",