@rancher/shell 3.0.0-rc.8 → 3.0.0
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/translations/en-us.yaml +12 -11
- package/assets/translations/zh-hans.yaml +1 -4
- package/components/EmberPage.vue +0 -8
- package/components/ResourceTable.vue +26 -1
- package/components/SortableTable/actions.js +1 -1
- package/components/SortableTable/index.vue +17 -1
- package/components/SortableTable/selection.js +1 -1
- package/components/SortableTable/sorting.js +11 -3
- package/components/fleet/FleetClusters.vue +0 -3
- package/components/form/ColorInput.vue +13 -2
- package/components/form/HookOption.vue +31 -29
- package/components/form/LabeledSelect.vue +0 -1
- package/components/form/LifecycleHooks.vue +2 -2
- package/components/form/__tests__/ColorInput.test.ts +27 -0
- package/components/formatter/SecretData.vue +1 -1
- package/components/nav/Header.vue +10 -13
- package/components/nav/TopLevelMenu.vue +0 -40
- package/components/nav/WorkspaceSwitcher.vue +0 -1
- package/config/private-label.js +2 -1
- package/config/router/routes.js +2 -26
- package/config/settings.ts +5 -0
- package/config/version.js +2 -0
- package/detail/catalog.cattle.io.app.vue +17 -4
- package/detail/fleet.cattle.io.cluster.vue +11 -9
- package/detail/fleet.cattle.io.gitrepo.vue +1 -1
- package/edit/cis.cattle.io.clusterscan.vue +4 -3
- package/edit/cis.cattle.io.clusterscanbenchmark.vue +2 -0
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +2 -0
- package/edit/fleet.cattle.io.cluster.vue +4 -0
- package/edit/fleet.cattle.io.gitrepo.vue +11 -8
- package/edit/helm.cattle.io.projecthelmchart.vue +2 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -0
- package/edit/kontainerDriver.vue +2 -0
- package/edit/logging-flow/index.vue +2 -0
- package/edit/management.cattle.io.project.vue +2 -1
- package/edit/management.cattle.io.projectroletemplatebinding.vue +2 -1
- package/edit/management.cattle.io.user.vue +3 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +2 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -0
- package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +5 -5
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +3 -1
- package/edit/monitoring.coreos.com.receiver/index.vue +2 -0
- package/edit/monitoring.coreos.com.route.vue +2 -0
- package/edit/networking.istio.io.destinationrule/index.vue +2 -0
- package/edit/nodeDriver.vue +2 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +26 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +63 -149
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +4 -1
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -0
- package/edit/provisioning.cattle.io.cluster/rke2.vue +5 -3
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +7 -2
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +108 -35
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +1 -1
- package/edit/ui.cattle.io.navlink.vue +4 -3
- package/edit/workload/mixins/workload.js +1 -1
- package/mixins/browser-tab-visibility.js +1 -1
- package/mixins/chart.js +6 -2
- package/mixins/metric-poller.js +1 -1
- package/mixins/resource-fetch.js +1 -1
- package/models/catalog.cattle.io.app.js +108 -21
- package/models/cloudcredential.js +4 -4
- package/models/fleet.cattle.io.gitrepo.js +8 -13
- package/models/management.cattle.io.cluster.js +13 -2
- package/models/management.cattle.io.project.js +4 -0
- package/models/provisioning.cattle.io.cluster.js +1 -2
- package/models/workload.js +1 -1
- package/package.json +11 -4
- package/pages/auth/logout.vue +7 -9
- package/pages/auth/setup.vue +3 -0
- package/pages/c/_cluster/apps/charts/install.vue +11 -3
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +7 -4
- package/pages/c/_cluster/explorer/index.vue +45 -24
- package/pages/c/_cluster/fleet/index.vue +11 -5
- package/pages/c/_cluster/uiplugins/index.vue +4 -2
- package/pages/diagnostic.vue +1 -0
- package/plugins/steve/mutations.js +4 -1
- package/plugins/steve/subscribe.js +3 -4
- package/types/shell/index.d.ts +13 -0
- package/utils/__tests__/object.test.ts +152 -1
- package/utils/object.js +37 -0
- package/utils/string.js +9 -0
- package/utils/validators/formRules/index.ts +1 -1
- package/config/product/multi-cluster-apps.js +0 -61
|
@@ -230,7 +230,6 @@ product:
|
|
|
230
230
|
settings: Global Settings
|
|
231
231
|
clusterManagement: Cluster Management
|
|
232
232
|
monitoring: Monitoring
|
|
233
|
-
mcapps: Global Configuration
|
|
234
233
|
neuvector: NeuVector
|
|
235
234
|
harvesterManager: Virtualization Management
|
|
236
235
|
rancher: Rancher
|
|
@@ -1474,10 +1473,13 @@ cluster:
|
|
|
1474
1473
|
placeholder: A unique name for the cluster
|
|
1475
1474
|
directoryConfig:
|
|
1476
1475
|
title: Data directory configuration
|
|
1477
|
-
|
|
1476
|
+
radioInput:
|
|
1477
|
+
defaultLabel: Use default data directory configuration
|
|
1478
|
+
commonLabel: Use a common base directory for data directory configuration (sub-directories will be used for the system-agent, provisioning and distro paths)
|
|
1479
|
+
customLabel: Use custom data directories
|
|
1478
1480
|
common:
|
|
1479
|
-
label: Data directory
|
|
1480
|
-
tooltip: Data directory
|
|
1481
|
+
label: Data directory base path
|
|
1482
|
+
tooltip: Data directory base path. We will append the sub-directories appropriate for each directory (/agent, /provisioning and either /rke2 or /k3s)
|
|
1481
1483
|
systemAgent:
|
|
1482
1484
|
label: System-agent directory path
|
|
1483
1485
|
tooltip: Data directory for the system-agent connection info and plans
|
|
@@ -1832,8 +1834,8 @@ cluster:
|
|
|
1832
1834
|
|
|
1833
1835
|
architecture:
|
|
1834
1836
|
label:
|
|
1835
|
-
unknown:
|
|
1836
|
-
mixed:
|
|
1837
|
+
unknown: unknown
|
|
1838
|
+
mixed: mixed
|
|
1837
1839
|
|
|
1838
1840
|
availabilityWarnings:
|
|
1839
1841
|
node: Node {name} is inactive
|
|
@@ -2995,8 +2997,8 @@ landing:
|
|
|
2995
2997
|
other {cores}}
|
|
2996
2998
|
cpuUsed: CPU Used
|
|
2997
2999
|
memoryUsed: Memory Used
|
|
2998
|
-
seeWhatsNew: Learn more about the improvements and new capabilities in this version.
|
|
2999
|
-
whatsNewLink: "What's new in 2.
|
|
3000
|
+
seeWhatsNew: Learn more about the improvements and new capabilities in this version and read about the UI framework migration in 2.10
|
|
3001
|
+
whatsNewLink: "What's new in 2.10"
|
|
3000
3002
|
learnMore: Learn More
|
|
3001
3003
|
support: Support
|
|
3002
3004
|
community:
|
|
@@ -5277,7 +5279,7 @@ setup:
|
|
|
5277
5279
|
dockerSuffix: ""
|
|
5278
5280
|
helmPrefix: 'For a Helm installation, run:'
|
|
5279
5281
|
helmSuffix: ""
|
|
5280
|
-
eula: By checking the box, you accept the <a href="https://
|
|
5282
|
+
eula: By checking the box, you accept the <a href="https://www.suse.com/licensing/eula/download/suse_end_user_license_agreement_june_2024.pdf" target="_blank" rel="noopener noreferrer nofollow">End User License Agreement & Terms & Conditions</a>
|
|
5281
5283
|
newPassword: New Password
|
|
5282
5284
|
newUserSetPassword: The first order of business is to set a strong password. We suggest using this random one generated just for you, but enter your own if you like.
|
|
5283
5285
|
serverUrl:
|
|
@@ -7413,6 +7415,7 @@ advancedSettings:
|
|
|
7413
7415
|
'brand': Folder name for an alternative theme defined in '/assets/brand'
|
|
7414
7416
|
'hide-local-cluster': Hide the local cluster
|
|
7415
7417
|
'agent-tls-mode': "Rancher Certificate Verification. In `strict` mode the agents (system, cluster, fleet, etc) will only trust Rancher installations which are using a certificate signed by the CABundle in the `cacerts` setting. When the mode is system-store, the agents will trust any certificate signed by a CABundle in the operating system’s trust store."
|
|
7418
|
+
'k3s-based-upgrader-uninstall-concurrency': Defines the maximum number of clusters in which Rancher can concurrently uninstall the legacy `rancher-k3s-upgrader` or `rancher-rke2-upgrader` app from imported K3s or RKE2 clusters.
|
|
7416
7419
|
warnings:
|
|
7417
7420
|
'agent-tls-mode': 'Changing this setting will cause all agents to be redeployed.'
|
|
7418
7421
|
editHelp:
|
|
@@ -7737,8 +7740,6 @@ legacy:
|
|
|
7737
7740
|
catalogs: Catalogs
|
|
7738
7741
|
configMaps: Config Maps
|
|
7739
7742
|
configuration: Configuration
|
|
7740
|
-
globalDnsEntries: Global DNS Entries
|
|
7741
|
-
globalDnsProviders: Global DNS Providers
|
|
7742
7743
|
notifiers: Notifiers
|
|
7743
7744
|
monitoring: Monitoring
|
|
7744
7745
|
secrets: Secrets
|
|
@@ -222,7 +222,6 @@ product:
|
|
|
222
222
|
settings: 全局设置
|
|
223
223
|
clusterManagement: 集群管理
|
|
224
224
|
monitoring: 监控
|
|
225
|
-
mcapps: 全局配置
|
|
226
225
|
neuvector: NeuVector
|
|
227
226
|
harvesterManager: 虚拟化管理
|
|
228
227
|
rancher: Rancher
|
|
@@ -4960,7 +4959,7 @@ setup:
|
|
|
4960
4959
|
dockerSuffix: ""
|
|
4961
4960
|
helmPrefix: 'Helm 安装,运行:'
|
|
4962
4961
|
helmSuffix: ""
|
|
4963
|
-
eula: 选中此框,即表示你接受<a href="https://
|
|
4962
|
+
eula: 选中此框,即表示你接受<a href="https://www.suse.com/licensing/eula/download/suse_end_user_license_agreement_june_2024.pdf" target="_blank" rel="noopener noreferrer nofollow">最终用户许可协议及条款和条件</a>
|
|
4964
4963
|
newPassword: 新密码
|
|
4965
4964
|
newUserSetPassword: 请设置强密码。建议使用生成的随机密码。你也可以自行设置。
|
|
4966
4965
|
serverUrl:
|
|
@@ -7335,8 +7334,6 @@ legacy:
|
|
|
7335
7334
|
catalogs: 应用商店
|
|
7336
7335
|
configMaps: ConfigMaps
|
|
7337
7336
|
configuration: 配置
|
|
7338
|
-
globalDnsEntries: 全局 DNS 条目
|
|
7339
|
-
globalDnsProviders: 全局 DNS 提供商
|
|
7340
7337
|
notifiers: Notifiers
|
|
7341
7338
|
monitoring: 监控
|
|
7342
7339
|
secrets: 密文
|
package/components/EmberPage.vue
CHANGED
|
@@ -31,14 +31,6 @@ const INTERCEPTS = {
|
|
|
31
31
|
resource: CAPI.RANCHER_CLUSTER,
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
|
-
'global-admin.catalog': {
|
|
35
|
-
name: 'c-cluster-mcapps-pages-page',
|
|
36
|
-
params: {
|
|
37
|
-
cluster: 'local',
|
|
38
|
-
product: 'mcapps',
|
|
39
|
-
page: 'catalogs'
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
34
|
'authenticated.cluster.istio.cluster-setting': { name: 'c-cluster-explorer-tools' },
|
|
43
35
|
};
|
|
44
36
|
|
|
@@ -204,7 +204,31 @@ export default {
|
|
|
204
204
|
// Confirm which store we're in, if schema isn't available we're probably showing a list with different types
|
|
205
205
|
const inStore = this.schema?.id ? this.$store.getters['currentStore'](this.schema.id) : undefined;
|
|
206
206
|
|
|
207
|
-
return {
|
|
207
|
+
return {
|
|
208
|
+
inStore,
|
|
209
|
+
/**
|
|
210
|
+
* Override the sortGenerationFn given changes in the rows we pass through to sortable table
|
|
211
|
+
*
|
|
212
|
+
* Primary purpose is to directly connect an iteration of `rows` with a sortGeneration string. This avoids
|
|
213
|
+
* reactivity issues where `rows` hasn't yet changed but something like workspaces has (stale values stored against fresh key)
|
|
214
|
+
*/
|
|
215
|
+
sortGeneration: undefined
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
watch: {
|
|
220
|
+
filteredRows: {
|
|
221
|
+
handler() {
|
|
222
|
+
// This is only prevalent in fleet world and the workspace switcher
|
|
223
|
+
// - it's singular (a --> b --> c) instead of namespace switchers additive (a --> a+b --> a)
|
|
224
|
+
// - this means it's much more likely to switch between resource sets containing the same mount of rows
|
|
225
|
+
//
|
|
226
|
+
if (this.currentProduct.showWorkspaceSwitcher) {
|
|
227
|
+
this.sortGeneration = this.safeSortGenerationFn(this.schema, this.$store);
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
immediate: true
|
|
231
|
+
}
|
|
208
232
|
},
|
|
209
233
|
|
|
210
234
|
computed: {
|
|
@@ -556,6 +580,7 @@ export default {
|
|
|
556
580
|
:adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
|
|
557
581
|
:adv-filter-prevent-filtering-labels="advFilterPreventFilteringLabels"
|
|
558
582
|
:key-field="keyField"
|
|
583
|
+
:sortGeneration="sortGeneration"
|
|
559
584
|
:sort-generation-fn="safeSortGenerationFn"
|
|
560
585
|
:use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
|
|
561
586
|
:force-update-live-and-delayed="forceUpdateLiveAndDelayed"
|
|
@@ -37,7 +37,7 @@ import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
|
|
|
37
37
|
// --> filtering.js filteredRows
|
|
38
38
|
// --> paging.js pageRows
|
|
39
39
|
// --> grouping.js groupedRows
|
|
40
|
-
// --> index.vue
|
|
40
|
+
// --> index.vue displayRows
|
|
41
41
|
|
|
42
42
|
export default {
|
|
43
43
|
name: 'SortableTable',
|
|
@@ -77,11 +77,13 @@ export default {
|
|
|
77
77
|
type: Array,
|
|
78
78
|
required: true
|
|
79
79
|
},
|
|
80
|
+
|
|
80
81
|
rows: {
|
|
81
82
|
// The array of objects to show
|
|
82
83
|
type: Array,
|
|
83
84
|
required: true
|
|
84
85
|
},
|
|
86
|
+
|
|
85
87
|
keyField: {
|
|
86
88
|
// Field that is unique for each row.
|
|
87
89
|
type: String,
|
|
@@ -285,11 +287,25 @@ export default {
|
|
|
285
287
|
default: true
|
|
286
288
|
},
|
|
287
289
|
|
|
290
|
+
/**
|
|
291
|
+
* Provide a unique key that will provide a new value given changes to the environment that
|
|
292
|
+
* should kick off an update to table rows (for instance resource list generation or change of namespace)
|
|
293
|
+
*
|
|
294
|
+
* This does not have to update given internal facets like sort order or direction
|
|
295
|
+
*/
|
|
288
296
|
sortGenerationFn: {
|
|
289
297
|
type: Function,
|
|
290
298
|
default: null,
|
|
291
299
|
},
|
|
292
300
|
|
|
301
|
+
/**
|
|
302
|
+
* Can be used in place of sortGenerationFn
|
|
303
|
+
*/
|
|
304
|
+
sortGeneration: {
|
|
305
|
+
type: String,
|
|
306
|
+
default: null
|
|
307
|
+
},
|
|
308
|
+
|
|
293
309
|
/**
|
|
294
310
|
* The list will always be sorted by these regardless of what the user has selected
|
|
295
311
|
*/
|
|
@@ -39,9 +39,17 @@ export default {
|
|
|
39
39
|
|
|
40
40
|
let key;
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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(',') }`;
|
|
45
53
|
if ( this.cacheKey === key ) {
|
|
46
54
|
return this.cachedRows;
|
|
47
55
|
}
|
|
@@ -42,7 +42,6 @@ export default {
|
|
|
42
42
|
value: 'status.display.readyBundles',
|
|
43
43
|
sort: 'status.summary.ready',
|
|
44
44
|
search: false,
|
|
45
|
-
align: 'center',
|
|
46
45
|
},
|
|
47
46
|
{
|
|
48
47
|
name: 'reposReady',
|
|
@@ -50,7 +49,6 @@ export default {
|
|
|
50
49
|
value: 'status.readyGitRepos',
|
|
51
50
|
sort: 'status.summary.ready',
|
|
52
51
|
search: false,
|
|
53
|
-
align: 'center',
|
|
54
52
|
},
|
|
55
53
|
FLEET_SUMMARY,
|
|
56
54
|
{
|
|
@@ -62,7 +60,6 @@ export default {
|
|
|
62
60
|
formatter: 'LiveDate',
|
|
63
61
|
formatterOpts: { addSuffix: true },
|
|
64
62
|
width: 120,
|
|
65
|
-
align: 'right'
|
|
66
63
|
},
|
|
67
64
|
AGE,
|
|
68
65
|
];
|
|
@@ -40,6 +40,11 @@ export default {
|
|
|
40
40
|
componentTestid: {
|
|
41
41
|
type: String,
|
|
42
42
|
default: 'color-input'
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
disabled: {
|
|
46
|
+
type: Boolean,
|
|
47
|
+
default: false,
|
|
43
48
|
}
|
|
44
49
|
},
|
|
45
50
|
|
|
@@ -56,6 +61,12 @@ export default {
|
|
|
56
61
|
*/
|
|
57
62
|
inputValue() {
|
|
58
63
|
return this.value ? this.value : this.defaultValue;
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
isDisabled() {
|
|
67
|
+
const disabled = this.disabled;
|
|
68
|
+
|
|
69
|
+
return this.mode !== this.editMode || disabled;
|
|
59
70
|
}
|
|
60
71
|
},
|
|
61
72
|
|
|
@@ -69,7 +80,7 @@ export default {
|
|
|
69
80
|
<template>
|
|
70
81
|
<div
|
|
71
82
|
class="color-input"
|
|
72
|
-
:class="{[mode]:mode, disabled:
|
|
83
|
+
:class="{[mode]:mode, disabled: isDisabled}"
|
|
73
84
|
:data-testid="componentTestid + '-color-input'"
|
|
74
85
|
>
|
|
75
86
|
<label class="text-label"><t
|
|
@@ -89,7 +100,7 @@ export default {
|
|
|
89
100
|
<input
|
|
90
101
|
ref="input"
|
|
91
102
|
type="color"
|
|
92
|
-
:disabled="
|
|
103
|
+
:disabled="isDisabled"
|
|
93
104
|
:value="inputValue"
|
|
94
105
|
@input="$emit('update:value', $event.target.value)"
|
|
95
106
|
>
|
|
@@ -150,35 +150,37 @@ export default {
|
|
|
150
150
|
<template v-if="selectHook === 'httpGet'">
|
|
151
151
|
<h4>{{ t('workload.container.lifecycleHook.httpGet.title') }}</h4>
|
|
152
152
|
<div class="var-row">
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
153
|
+
<LabeledInput
|
|
154
|
+
v-model:value="value.httpGet.host"
|
|
155
|
+
:label="t('workload.container.lifecycleHook.httpGet.host.label')"
|
|
156
|
+
:placeholder="t('workload.container.lifecycleHook.httpGet.host.placeholder')"
|
|
157
|
+
:mode="mode"
|
|
158
|
+
@update:value="update"
|
|
159
|
+
/>
|
|
160
|
+
<LabeledInput
|
|
161
|
+
v-model:value="value.httpGet.path"
|
|
162
|
+
:label="t('workload.container.lifecycleHook.httpGet.path.label')"
|
|
163
|
+
:placeholder="t('workload.container.lifecycleHook.httpGet.path.placeholder')"
|
|
164
|
+
:mode="mode"
|
|
165
|
+
@update:value="update"
|
|
166
|
+
/>
|
|
167
|
+
<LabeledInput
|
|
168
|
+
v-model:value.number="value.httpGet.port"
|
|
169
|
+
type="number"
|
|
170
|
+
:label="t('workload.container.lifecycleHook.httpGet.port.label')"
|
|
171
|
+
:placeholder="t('workload.container.lifecycleHook.httpGet.port.placeholder')"
|
|
172
|
+
:mode="mode"
|
|
173
|
+
required
|
|
174
|
+
@update:value="update"
|
|
175
|
+
/>
|
|
176
|
+
<LabeledSelect
|
|
177
|
+
v-model:value="value.httpGet.scheme"
|
|
178
|
+
:label="t('workload.container.lifecycleHook.httpGet.scheme.label')"
|
|
179
|
+
:placeholder="t('workload.container.lifecycleHook.httpGet.scheme.placeholder')"
|
|
180
|
+
:options="schemeOptions"
|
|
181
|
+
:mode="mode"
|
|
182
|
+
@update:value="update"
|
|
183
|
+
/>
|
|
182
184
|
</div>
|
|
183
185
|
|
|
184
186
|
<h4>{{ t('workload.container.lifecycleHook.httpHeaders.title') }}</h4>
|
|
@@ -69,7 +69,7 @@ export default {
|
|
|
69
69
|
<HookOption
|
|
70
70
|
v-model:value="postStart"
|
|
71
71
|
:mode="mode"
|
|
72
|
-
@
|
|
72
|
+
@update:value="update"
|
|
73
73
|
/>
|
|
74
74
|
</div>
|
|
75
75
|
|
|
@@ -80,7 +80,7 @@ export default {
|
|
|
80
80
|
<HookOption
|
|
81
81
|
v-model:value="preStop"
|
|
82
82
|
:mode="mode"
|
|
83
|
-
@
|
|
83
|
+
@update:value="update"
|
|
84
84
|
/>
|
|
85
85
|
</div>
|
|
86
86
|
</div>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { shallowMount } from '@vue/test-utils';
|
|
2
|
+
import ColorInput from '@shell/components/form/ColorInput.vue';
|
|
3
|
+
|
|
4
|
+
describe('colorInput.vue', () => {
|
|
5
|
+
it('disables the input when disabled prop is true', () => {
|
|
6
|
+
const wrapper = shallowMount(
|
|
7
|
+
ColorInput,
|
|
8
|
+
{ props: { disabled: true } }
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
const colorWrapper = wrapper.find('.color-input');
|
|
12
|
+
const colorInput = wrapper.find('input');
|
|
13
|
+
|
|
14
|
+
expect(colorWrapper.classes()).toContain('disabled');
|
|
15
|
+
expect(Object.keys(colorInput.attributes())).toContain('disabled');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('defaults to enabled when no disabled prop is passed', () => {
|
|
19
|
+
const wrapper = shallowMount(ColorInput);
|
|
20
|
+
|
|
21
|
+
const colorWrapper = wrapper.find('.color-input');
|
|
22
|
+
const colorInput = wrapper.find('input');
|
|
23
|
+
|
|
24
|
+
expect(colorWrapper.classes()).not.toContain('disabled');
|
|
25
|
+
expect(Object.keys(colorInput.attributes())).not.toContain('disabled');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -43,7 +43,7 @@ export default {
|
|
|
43
43
|
|
|
44
44
|
<template>
|
|
45
45
|
<div v-if="isTLS">
|
|
46
|
-
<t k="secret.certificate.cn" /> {{ cn }} <span v-if="row.unrepeatedSans.length">{{ t('secret.certificate.plusMore', {n:row.unrepeatedSans.length}) }}</span><br>
|
|
46
|
+
<t k="secret.certificate.cn" /> {{ cn }} <span v-if="row.unrepeatedSans && row.unrepeatedSans.length">{{ t('secret.certificate.plusMore', {n:row.unrepeatedSans.length}) }}</span><br>
|
|
47
47
|
<t k="secret.certificate.expires" />: <DateComponent
|
|
48
48
|
:class="dateClass"
|
|
49
49
|
:value="expiration"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { mapGetters } from 'vuex';
|
|
3
3
|
import debounce from 'lodash/debounce';
|
|
4
|
-
import { NORMAN, STEVE
|
|
4
|
+
import { NORMAN, STEVE } from '@shell/config/types';
|
|
5
5
|
import { ucFirst } from '@shell/utils/string';
|
|
6
6
|
import { isAlternate, isMac } from '@shell/utils/platform';
|
|
7
7
|
import Import from '@shell/components/Import';
|
|
@@ -20,7 +20,7 @@ import { ActionLocation, ExtensionPoint } from '@shell/core/types';
|
|
|
20
20
|
import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
|
|
21
21
|
import IconOrSvg from '@shell/components/IconOrSvg';
|
|
22
22
|
import { wait } from '@shell/utils/async';
|
|
23
|
-
import {
|
|
23
|
+
import { configType } from '@shell/models/management.cattle.io.authconfig';
|
|
24
24
|
import HeaderPageActionMenu from './HeaderPageActionMenu.vue';
|
|
25
25
|
|
|
26
26
|
export default {
|
|
@@ -48,7 +48,7 @@ export default {
|
|
|
48
48
|
|
|
49
49
|
fetch() {
|
|
50
50
|
// fetch needed data to check if any auth provider is enabled
|
|
51
|
-
|
|
51
|
+
this.$store.dispatch('auth/getAuthProviders');
|
|
52
52
|
},
|
|
53
53
|
|
|
54
54
|
data() {
|
|
@@ -89,11 +89,10 @@ export default {
|
|
|
89
89
|
'showTopLevelMenu'
|
|
90
90
|
]),
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
const authInfo = parseAuthProvidersInfo(authProviders);
|
|
92
|
+
samlAuthProviderEnabled() {
|
|
93
|
+
const publicAuthProviders = this.$store.getters['rancher/all']('authProvider');
|
|
95
94
|
|
|
96
|
-
return
|
|
95
|
+
return publicAuthProviders.find((authProvider) => configType[authProvider.id] === 'saml') || {};
|
|
97
96
|
},
|
|
98
97
|
|
|
99
98
|
shouldShowSloLogoutModal() {
|
|
@@ -102,11 +101,9 @@ export default {
|
|
|
102
101
|
return false;
|
|
103
102
|
}
|
|
104
103
|
|
|
105
|
-
const {
|
|
106
|
-
logoutAllSupported, logoutAllEnabled, logoutAllForced, configType
|
|
107
|
-
} = this.authProviderEnabled;
|
|
104
|
+
const { logoutAllSupported, logoutAllEnabled, logoutAllForced } = this.samlAuthProviderEnabled;
|
|
108
105
|
|
|
109
|
-
return
|
|
106
|
+
return logoutAllSupported && logoutAllEnabled && !logoutAllForced;
|
|
110
107
|
},
|
|
111
108
|
|
|
112
109
|
appName() {
|
|
@@ -260,7 +257,7 @@ export default {
|
|
|
260
257
|
showSloModal() {
|
|
261
258
|
this.$store.dispatch('management/promptModal', {
|
|
262
259
|
component: 'SloDialog',
|
|
263
|
-
componentProps: { authProvider: this.
|
|
260
|
+
componentProps: { authProvider: this.samlAuthProviderEnabled },
|
|
264
261
|
modalWidth: '500px'
|
|
265
262
|
});
|
|
266
263
|
},
|
|
@@ -1118,7 +1115,7 @@ export default {
|
|
|
1118
1115
|
display: flex;
|
|
1119
1116
|
justify-content: space-between;
|
|
1120
1117
|
padding: 10px;
|
|
1121
|
-
color: var(--
|
|
1118
|
+
color: var(--popover-text);
|
|
1122
1119
|
}
|
|
1123
1120
|
|
|
1124
1121
|
div.menu-separator {
|
|
@@ -10,7 +10,6 @@ import { sortBy } from '@shell/utils/sort';
|
|
|
10
10
|
import { ucFirst } from '@shell/utils/string';
|
|
11
11
|
import { KEY } from '@shell/utils/platform';
|
|
12
12
|
import { getVersionInfo } from '@shell/utils/version';
|
|
13
|
-
import { LEGACY } from '@shell/store/features';
|
|
14
13
|
import { SETTING } from '@shell/config/settings';
|
|
15
14
|
import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/utils/cluster';
|
|
16
15
|
import { getProductFromRoute } from '@shell/utils/router';
|
|
@@ -68,10 +67,6 @@ export default {
|
|
|
68
67
|
};
|
|
69
68
|
},
|
|
70
69
|
|
|
71
|
-
legacyEnabled() {
|
|
72
|
-
return this.features(LEGACY);
|
|
73
|
-
},
|
|
74
|
-
|
|
75
70
|
showClusterSearch() {
|
|
76
71
|
return this.clusters.length > this.maxClustersToShow;
|
|
77
72
|
},
|
|
@@ -255,12 +250,6 @@ export default {
|
|
|
255
250
|
});
|
|
256
251
|
},
|
|
257
252
|
|
|
258
|
-
legacyApps() {
|
|
259
|
-
const options = this.options;
|
|
260
|
-
|
|
261
|
-
return options.filter((opt) => opt.inStore === 'management' && opt.category === 'legacy');
|
|
262
|
-
},
|
|
263
|
-
|
|
264
253
|
configurationApps() {
|
|
265
254
|
const options = this.options;
|
|
266
255
|
|
|
@@ -347,7 +336,6 @@ export default {
|
|
|
347
336
|
const appBar = {
|
|
348
337
|
hciApps: this.hciApps,
|
|
349
338
|
multiClusterApps: this.multiClusterApps,
|
|
350
|
-
legacyApps: this.legacyApps,
|
|
351
339
|
configurationApps: this.configurationApps,
|
|
352
340
|
pinFiltered: this.pinFiltered,
|
|
353
341
|
clustersFiltered: this.clustersFiltered,
|
|
@@ -856,34 +844,6 @@ export default {
|
|
|
856
844
|
</router-link>
|
|
857
845
|
</div>
|
|
858
846
|
</template>
|
|
859
|
-
<template v-if="legacyEnabled">
|
|
860
|
-
<div
|
|
861
|
-
class="category-title"
|
|
862
|
-
>
|
|
863
|
-
<hr>
|
|
864
|
-
<span>
|
|
865
|
-
{{ t('nav.categories.legacy') }}
|
|
866
|
-
</span>
|
|
867
|
-
</div>
|
|
868
|
-
<div
|
|
869
|
-
v-for="(a, i) in appBar.legacyApps"
|
|
870
|
-
:key="i"
|
|
871
|
-
@click="hide()"
|
|
872
|
-
>
|
|
873
|
-
<router-link
|
|
874
|
-
class="option"
|
|
875
|
-
:class="{'active-menu-link': a.isMenuActive }"
|
|
876
|
-
:to="a.to"
|
|
877
|
-
>
|
|
878
|
-
<IconOrSvg
|
|
879
|
-
v-tooltip="getTooltipConfig(a.label)"
|
|
880
|
-
:icon="a.icon"
|
|
881
|
-
:src="a.svg"
|
|
882
|
-
/>
|
|
883
|
-
<div>{{ a.label }}</div>
|
|
884
|
-
</router-link>
|
|
885
|
-
</div>
|
|
886
|
-
</template>
|
|
887
847
|
|
|
888
848
|
<!-- App menu -->
|
|
889
849
|
<template v-if="configurationApps.length">
|
package/config/private-label.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { SETTING } from './settings';
|
|
2
|
+
import { CURRENT_RANCHER_VERSION } from './version';
|
|
2
3
|
|
|
3
4
|
export const ANY = 0;
|
|
4
5
|
export const STANDARD = 1;
|
|
5
6
|
export const CUSTOM = 2;
|
|
6
|
-
export const DOCS_BASE =
|
|
7
|
+
export const DOCS_BASE = `https://ranchermanager.docs.rancher.com/v${ CURRENT_RANCHER_VERSION }`;
|
|
7
8
|
|
|
8
9
|
const STANDARD_VENDOR = 'Rancher';
|
|
9
10
|
const STANDARD_PRODUCT = 'Explorer';
|