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.
- package/assets/styles/base/_functions.scss +0 -0
- package/assets/styles/base/_mixins.scss +1 -1
- package/assets/styles/global/_button.scss +10 -17
- package/assets/styles/global/_form.scss +2 -2
- package/assets/styles/global/_labeled-input.scss +2 -6
- package/assets/styles/global/_select.scss +7 -6
- package/assets/styles/global/_table.scss +2 -3
- package/assets/styles/global/_tooltip.scss +1 -8
- package/assets/styles/themes/_dark.scss +0 -2
- package/assets/styles/themes/_light.scss +2 -5
- package/assets/styles/vendor/vue-select.scss +1 -2
- package/assets/translations/en-us.yaml +3 -1
- package/assets/translations/zh-hans.yaml +28 -51
- package/components/ActionDropdown.vue +0 -1
- package/components/ActionMenuShell.vue +3 -6
- package/components/BrandImage.vue +0 -22
- package/components/ClusterIconMenu.vue +1 -1
- package/components/CodeMirror.vue +0 -1
- package/components/CruResource.vue +1 -1
- package/components/CruResourceFooter.vue +1 -1
- package/components/ExplorerProjectsNamespaces.vue +24 -4
- package/components/GlobalRoleBindings.vue +48 -112
- package/components/IndentedPanel.vue +10 -4
- package/components/PromptRemove.vue +3 -3
- package/components/ResourceDetail/Masthead.vue +242 -190
- package/components/ResourceDetail/index.vue +5 -20
- package/components/ResourceList/Masthead.vue +84 -146
- package/components/ResourceList/ResourceLoadingIndicator.vue +2 -5
- package/components/ResourceTable.vue +1 -76
- package/components/SideNav.vue +29 -66
- package/components/SortableTable/THead.vue +0 -6
- package/components/SortableTable/index.vue +388 -481
- package/components/Tabbed/index.vue +5 -4
- package/components/auth/Principal.vue +2 -3
- package/components/auth/RoleDetailEdit.vue +5 -58
- package/components/auth/SelectPrincipal.vue +0 -1
- package/components/form/BannerSettings.vue +16 -18
- package/components/form/ChangePassword.vue +4 -4
- package/components/form/ColorInput.vue +8 -32
- package/components/form/Footer.vue +1 -1
- package/components/form/InputWithSelect.vue +0 -2
- package/components/form/KeyValue.vue +7 -31
- package/components/form/LabeledSelect.vue +178 -178
- package/components/form/Members/ClusterPermissionsEditor.vue +2 -1
- package/components/form/Members/MembershipEditor.vue +1 -1
- package/components/form/NameNsDescription.vue +11 -24
- package/components/form/Password.vue +2 -6
- package/components/form/ResourceQuota/Namespace.vue +1 -1
- package/components/form/ResourceQuota/NamespaceRow.vue +10 -13
- package/components/form/ResourceQuota/ProjectRow.vue +1 -0
- package/components/form/Select.vue +2 -2
- package/components/nav/Favorite.vue +1 -5
- package/components/nav/Group.vue +23 -69
- package/components/nav/Header.vue +17 -82
- package/components/nav/HeaderPageActionMenu.vue +0 -1
- package/components/nav/NamespaceFilter.vue +3 -0
- package/components/nav/TopLevelMenu.vue +119 -182
- package/components/nav/Type.vue +11 -48
- package/components/rancherResourceDetail/Masthead.vue +769 -0
- package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
- package/components/rancherResourceDetail/index.vue +591 -0
- package/components/rancherResourceList/Masthead.vue +375 -0
- package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
- package/components/rancherResourceList/index.vue +307 -0
- package/components/rancherResourceList/resource-list.config.js +7 -0
- package/components/rancherResourceTable.vue +783 -0
- package/components/rancherSortableTable/THead.vue +561 -0
- package/components/rancherSortableTable/actions.js +153 -0
- package/components/rancherSortableTable/advanced-filtering.js +272 -0
- package/components/rancherSortableTable/debug.js +117 -0
- package/components/rancherSortableTable/filtering.js +290 -0
- package/components/rancherSortableTable/grouping.js +48 -0
- package/components/rancherSortableTable/index.vue +2712 -0
- package/components/rancherSortableTable/paging.js +155 -0
- package/components/rancherSortableTable/selection.js +629 -0
- package/components/rancherSortableTable/sortable-config.ts +4 -0
- package/components/rancherSortableTable/sorting.js +129 -0
- package/composables/useClickOutside.ts +1 -1
- package/config/product/auth.js +7 -16
- package/config/product/explorer.js +1 -1
- package/config/product/settings.js +8 -17
- package/config/settings.ts +0 -28
- package/edit/management.cattle.io.user.vue +4 -17
- package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
- package/edit/token.vue +1 -1
- package/list/harvesterhci.io.management.cluster.vue +0 -17
- package/list/management.cattle.io.setting.vue +13 -22
- package/list/management.cattle.io.user.vue +14 -25
- package/list/provisioning.cattle.io.cluster.vue +7 -6
- package/mixins/brand.js +0 -17
- package/package.json +1 -1
- package/pages/auth/login.vue +29 -84
- package/pages/c/_cluster/auth/roles/index.vue +14 -61
- package/pages/c/_cluster/settings/banners.vue +101 -174
- package/pages/c/_cluster/settings/brand.vue +301 -348
- package/pages/c/_cluster/settings/performance.vue +38 -61
- package/pages/home.vue +21 -70
- package/pages/prefs.vue +23 -25
- package/pkg/tsconfig.json +9 -9
- package/pkg/vue.config.js +1 -1
- package/promptRemove/mixin/roleDeletionCheck.js +2 -2
- package/scripts/clean +0 -0
- package/scripts/extension/bundle +0 -0
- package/scripts/extension/helm/scripts/package +0 -0
- package/scripts/extension/helm/scripts/patch +0 -0
- package/scripts/extension/helm/scripts/version +0 -0
- package/scripts/extension/helmpatch +0 -0
- package/scripts/extension/parse-tag-name +0 -0
- package/scripts/extension/publish +0 -0
- package/scripts/publish-shell.sh +60 -86
- package/scripts/serve-pkgs +0 -0
- package/scripts/sync-shell-deps +0 -0
- package/scripts/typegen.sh +28 -44
- package/store/i18n.js +5 -5
- package/store/prefs.js +5 -17
- package/store/type-map.js +1 -2
- package/types/cloud-shell/index.d.ts +11014 -0
- package/types/shell/index.d.ts +1 -1
- package/utils/error.js +0 -4
- package/utils/router.js +3 -3
- package/vue.config.js +6 -1
- package/assets/images/action.svg +0 -6
- package/assets/images/pl/logo.png +0 -0
- /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('
|
|
79
|
+
window.removeEventListener('pointerDown', setShouldListen);
|
|
80
80
|
});
|
|
81
81
|
};
|
package/config/product/auth.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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,
|
|
@@ -102,23 +102,14 @@ export function init(store) {
|
|
|
102
102
|
route: { name: 'c-cluster-settings-links' }
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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,
|
package/config/settings.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
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"
|
package/edit/token.vue
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
-
<
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
139
|
-
|
|
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:
|
|
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
|
-
|
|
313
|
-
{{ t('cluster.explore') }}
|
|
314
|
-
</a>
|
|
313
|
+
{{ t('cluster.explore') }}
|
|
315
314
|
</router-link>
|
|
316
|
-
<
|
|
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
|
-
</
|
|
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
|
|