@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.
Files changed (84) hide show
  1. package/assets/translations/en-us.yaml +12 -11
  2. package/assets/translations/zh-hans.yaml +1 -4
  3. package/components/EmberPage.vue +0 -8
  4. package/components/ResourceTable.vue +26 -1
  5. package/components/SortableTable/actions.js +1 -1
  6. package/components/SortableTable/index.vue +17 -1
  7. package/components/SortableTable/selection.js +1 -1
  8. package/components/SortableTable/sorting.js +11 -3
  9. package/components/fleet/FleetClusters.vue +0 -3
  10. package/components/form/ColorInput.vue +13 -2
  11. package/components/form/HookOption.vue +31 -29
  12. package/components/form/LabeledSelect.vue +0 -1
  13. package/components/form/LifecycleHooks.vue +2 -2
  14. package/components/form/__tests__/ColorInput.test.ts +27 -0
  15. package/components/formatter/SecretData.vue +1 -1
  16. package/components/nav/Header.vue +10 -13
  17. package/components/nav/TopLevelMenu.vue +0 -40
  18. package/components/nav/WorkspaceSwitcher.vue +0 -1
  19. package/config/private-label.js +2 -1
  20. package/config/router/routes.js +2 -26
  21. package/config/settings.ts +5 -0
  22. package/config/version.js +2 -0
  23. package/detail/catalog.cattle.io.app.vue +17 -4
  24. package/detail/fleet.cattle.io.cluster.vue +11 -9
  25. package/detail/fleet.cattle.io.gitrepo.vue +1 -1
  26. package/edit/cis.cattle.io.clusterscan.vue +4 -3
  27. package/edit/cis.cattle.io.clusterscanbenchmark.vue +2 -0
  28. package/edit/constraints.gatekeeper.sh.constraint/index.vue +2 -0
  29. package/edit/fleet.cattle.io.cluster.vue +4 -0
  30. package/edit/fleet.cattle.io.gitrepo.vue +11 -8
  31. package/edit/helm.cattle.io.projecthelmchart.vue +2 -0
  32. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +2 -0
  33. package/edit/kontainerDriver.vue +2 -0
  34. package/edit/logging-flow/index.vue +2 -0
  35. package/edit/management.cattle.io.project.vue +2 -1
  36. package/edit/management.cattle.io.projectroletemplatebinding.vue +2 -1
  37. package/edit/management.cattle.io.user.vue +3 -0
  38. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +2 -0
  39. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -0
  40. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +5 -5
  41. package/edit/monitoring.coreos.com.prometheusrule/index.vue +3 -1
  42. package/edit/monitoring.coreos.com.receiver/index.vue +2 -0
  43. package/edit/monitoring.coreos.com.route.vue +2 -0
  44. package/edit/networking.istio.io.destinationrule/index.vue +2 -0
  45. package/edit/nodeDriver.vue +2 -0
  46. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +26 -0
  47. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +63 -149
  48. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +4 -1
  49. package/edit/provisioning.cattle.io.cluster/import.vue +2 -0
  50. package/edit/provisioning.cattle.io.cluster/rke2.vue +5 -3
  51. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +7 -2
  52. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +108 -35
  53. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +1 -1
  54. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +1 -1
  55. package/edit/ui.cattle.io.navlink.vue +4 -3
  56. package/edit/workload/mixins/workload.js +1 -1
  57. package/mixins/browser-tab-visibility.js +1 -1
  58. package/mixins/chart.js +6 -2
  59. package/mixins/metric-poller.js +1 -1
  60. package/mixins/resource-fetch.js +1 -1
  61. package/models/catalog.cattle.io.app.js +108 -21
  62. package/models/cloudcredential.js +4 -4
  63. package/models/fleet.cattle.io.gitrepo.js +8 -13
  64. package/models/management.cattle.io.cluster.js +13 -2
  65. package/models/management.cattle.io.project.js +4 -0
  66. package/models/provisioning.cattle.io.cluster.js +1 -2
  67. package/models/workload.js +1 -1
  68. package/package.json +11 -4
  69. package/pages/auth/logout.vue +7 -9
  70. package/pages/auth/setup.vue +3 -0
  71. package/pages/c/_cluster/apps/charts/install.vue +11 -3
  72. package/pages/c/_cluster/explorer/__tests__/index.test.ts +7 -4
  73. package/pages/c/_cluster/explorer/index.vue +45 -24
  74. package/pages/c/_cluster/fleet/index.vue +11 -5
  75. package/pages/c/_cluster/uiplugins/index.vue +4 -2
  76. package/pages/diagnostic.vue +1 -0
  77. package/plugins/steve/mutations.js +4 -1
  78. package/plugins/steve/subscribe.js +3 -4
  79. package/types/shell/index.d.ts +13 -0
  80. package/utils/__tests__/object.test.ts +152 -1
  81. package/utils/object.js +37 -0
  82. package/utils/string.js +9 -0
  83. package/utils/validators/formRules/index.ts +1 -1
  84. 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
- checkboxText: Use the same path for System-agent, Provisioning and K8s Distro data directories configuration
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 configuration path
1480
- tooltip: Data directory configuration for System-agent, Provisioning and K8s Distro
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: Unknown
1836
- mixed: 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.9"
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://rancher.com/eula" target="_blank" rel="noopener noreferrer nofollow">End User License Agreement & Terms & Conditions</a>
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://rancher.com/eula" target="_blank" rel="noopener noreferrer nofollow">最终用户许可协议及条款和条件</a>
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: 密文
@@ -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 { inStore };
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"
@@ -18,7 +18,7 @@ export default {
18
18
  };
19
19
  },
20
20
 
21
- beforeDestroy() {
21
+ beforeUnmount() {
22
22
  window.removeEventListener('resize', this.onWindowResize);
23
23
  },
24
24
 
@@ -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 displayedRows
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
  */
@@ -20,7 +20,7 @@ export default {
20
20
  table.addEventListener('contextmenu', this._onRowContextBound);
21
21
  },
22
22
 
23
- beforeDestroy() {
23
+ beforeUnmount() {
24
24
  const table = this.$el.querySelector('TABLE');
25
25
 
26
26
  table.removeEventListener('click', this._onRowClickBound);
@@ -39,9 +39,17 @@ export default {
39
39
 
40
40
  let key;
41
41
 
42
- if ( this.sortGenerationFn ) {
43
- key = `${ this.sortGenerationFn.apply(this) }/${ this.rows.length }/${ this.descending }/${ this.sortFields.join(',') }`;
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: mode !== editMode}"
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="mode !== editMode"
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
- <template @update:value="update">
154
- <LabeledInput
155
- v-model:value="value.httpGet.host"
156
- :label="t('workload.container.lifecycleHook.httpGet.host.label')"
157
- :placeholder="t('workload.container.lifecycleHook.httpGet.host.placeholder')"
158
- :mode="mode"
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
- />
166
- <LabeledInput
167
- v-model:value.number="value.httpGet.port"
168
- type="number"
169
- :label="t('workload.container.lifecycleHook.httpGet.port.label')"
170
- :placeholder="t('workload.container.lifecycleHook.httpGet.port.placeholder')"
171
- :mode="mode"
172
- required
173
- />
174
- <LabeledSelect
175
- v-model:value="value.httpGet.scheme"
176
- :label="t('workload.container.lifecycleHook.httpGet.scheme.label')"
177
- :placeholder="t('workload.container.lifecycleHook.httpGet.scheme.placeholder')"
178
- :options="schemeOptions"
179
- :mode="mode"
180
- />
181
- </template>
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>
@@ -139,7 +139,6 @@ export default {
139
139
  filteredAttrs() {
140
140
  const {
141
141
  class: _class,
142
- taggable,
143
142
  ...rest
144
143
  } = this.$attrs;
145
144
 
@@ -69,7 +69,7 @@ export default {
69
69
  <HookOption
70
70
  v-model:value="postStart"
71
71
  :mode="mode"
72
- @input="update"
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
- @input="update"
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, MANAGEMENT } from '@shell/config/types';
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 { authProvidersInfo, parseAuthProvidersInfo } from '@shell/utils/auth';
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
- authProvidersInfo(this.$store);
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
- authProviderEnabled() {
93
- const authProviders = this.$store.getters['management/all'](MANAGEMENT.AUTH_CONFIG);
94
- const authInfo = parseAuthProvidersInfo(authProviders);
92
+ samlAuthProviderEnabled() {
93
+ const publicAuthProviders = this.$store.getters['rancher/all']('authProvider');
95
94
 
96
- return authInfo.enabled?.[0] || {};
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 configType === 'saml' && logoutAllSupported && logoutAllEnabled && !logoutAllForced;
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.authProviderEnabled },
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(--link);
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">
@@ -92,7 +92,6 @@ export default {
92
92
  ref="select"
93
93
  v-model:value="value"
94
94
  label="label"
95
- :append-to-body="false"
96
95
  :options="options"
97
96
  :clearable="false"
98
97
  :reduce="(opt) => opt.value"
@@ -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 = 'https://ranchermanager.docs.rancher.com/v2.9';
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';