@rancher/shell 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/assets/images/providers/ovhcloudmks.svg +122 -0
  2. package/assets/images/providers/ovhcloudpubliccloud.svg +122 -0
  3. package/assets/styles/global/_layout.scss +99 -0
  4. package/assets/translations/en-us.yaml +30 -5
  5. package/assets/translations/zh-hans.yaml +1 -1
  6. package/babel.config.js +7 -1
  7. package/chart/monitoring/alerting/index.vue +7 -21
  8. package/chart/monitoring/grafana/index.vue +55 -0
  9. package/chart/monitoring/index.vue +51 -17
  10. package/chart/monitoring/prometheus/index.vue +37 -43
  11. package/chart/rancher-backup/index.vue +2 -1
  12. package/cloud-credential/azure.vue +4 -17
  13. package/components/Certificates.vue +164 -0
  14. package/components/CodeMirror.vue +19 -21
  15. package/components/CruResource.vue +1 -0
  16. package/components/EtcdInfoBanner.vue +1 -1
  17. package/components/ExplorerProjectsNamespaces.vue +25 -1
  18. package/components/IconOrSvg.vue +1 -1
  19. package/components/LandingPagePreference.vue +1 -4
  20. package/components/Questions/index.vue +1 -1
  21. package/components/ResourceDetail/Masthead.vue +16 -3
  22. package/components/ResourceTable.vue +14 -2
  23. package/components/ResourceYaml.vue +5 -0
  24. package/components/SideNav.vue +1 -1
  25. package/components/SingleClusterInfo.vue +1 -4
  26. package/components/Tabbed/index.vue +12 -0
  27. package/components/fleet/FleetRepos.vue +62 -27
  28. package/components/fleet/FleetResources.vue +6 -1
  29. package/components/form/ArrayListSelect.vue +10 -0
  30. package/components/form/KeyValue.vue +4 -0
  31. package/components/form/LabeledSelect.vue +4 -0
  32. package/components/formatter/Checked.vue +11 -3
  33. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  34. package/components/formatter/FleetSummaryGraph.vue +23 -11
  35. package/components/formatter/LiveDuration.vue +1 -1
  36. package/components/formatter/PercentageBar.vue +1 -1
  37. package/components/formatter/__tests__/Checked.test.ts +19 -0
  38. package/components/nav/Group.vue +2 -2
  39. package/components/nav/Header.vue +0 -1
  40. package/components/nav/TopLevelMenu.vue +36 -6
  41. package/components/nav/Type.vue +1 -3
  42. package/components/nav/WindowManager/ContainerLogs.vue +101 -3
  43. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  44. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  45. package/components/nav/WindowManager/index.vue +11 -10
  46. package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
  47. package/components/nav/__tests__/Type.test.ts +1 -1
  48. package/components/nuxt/nuxt-child.js +14 -78
  49. package/components/nuxt/nuxt.js +1 -1
  50. package/{layouts → components/templates}/blank.vue +1 -1
  51. package/{layouts → components/templates}/default.vue +8 -98
  52. package/{layouts → components/templates}/error.vue +10 -19
  53. package/{layouts → components/templates}/home.vue +4 -1
  54. package/{layouts → components/templates}/plain.vue +4 -1
  55. package/{layouts → components/templates}/standalone.vue +1 -1
  56. package/{layouts → components/templates}/unauthenticated.vue +1 -1
  57. package/composables/useCompactInput.ts +20 -0
  58. package/composables/useLabeledFormElement.ts +138 -0
  59. package/config/harvester-manager-types.js +2 -0
  60. package/config/private-label.js +22 -0
  61. package/config/product/explorer.js +3 -0
  62. package/config/product/fleet.js +6 -1
  63. package/config/product/manager.js +8 -2
  64. package/config/query-params.js +1 -0
  65. package/config/router.js +385 -364
  66. package/config/settings.ts +1 -0
  67. package/config/store.js +1 -1
  68. package/config/system-namespaces.js +3 -0
  69. package/config/table-headers.js +47 -0
  70. package/core/plugin-routes.ts +56 -114
  71. package/core/plugin.ts +16 -10
  72. package/core/plugins-loader.js +7 -9
  73. package/core/plugins.js +0 -3
  74. package/creators/app/files/.gitlab-ci.yml +1 -1
  75. package/detail/fleet.cattle.io.cluster.vue +11 -1
  76. package/detail/provisioning.cattle.io.cluster.vue +4 -3
  77. package/dialog/ScaleMachineDownDialog.vue +34 -17
  78. package/edit/__tests__/service.test.ts +89 -0
  79. package/edit/auth/googleoauth.vue +1 -5
  80. package/edit/catalog.cattle.io.clusterrepo.vue +18 -0
  81. package/edit/cloudcredential.vue +2 -0
  82. package/edit/configmap.vue +2 -1
  83. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  84. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
  85. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
  86. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  87. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +4 -0
  88. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  89. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  90. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
  91. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
  92. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  93. package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
  94. package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
  95. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  96. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
  97. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
  98. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  99. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  100. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
  101. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
  102. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  103. package/edit/service.vue +12 -0
  104. package/edit/workload/mixins/workload.js +1 -1
  105. package/initialize/App.js +25 -71
  106. package/initialize/client.js +21 -162
  107. package/initialize/index.js +27 -123
  108. package/list/management.cattle.io.feature.vue +1 -7
  109. package/list/node.vue +1 -0
  110. package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
  111. package/machine-config/vmwarevsphere.vue +73 -51
  112. package/middleware/authenticated.js +10 -17
  113. package/mixins/auth-config.js +2 -7
  114. package/mixins/brand.js +29 -41
  115. package/mixins/labeled-form-element.ts +6 -1
  116. package/models/__tests__/management.cattle.io.node.ts +85 -0
  117. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  118. package/models/__tests__/namespace.test.ts +49 -9
  119. package/models/__tests__/workload.test.ts +91 -0
  120. package/models/cluster/node.js +4 -4
  121. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  122. package/models/fleet.cattle.io.cluster.js +4 -0
  123. package/models/fleet.cattle.io.gitrepo.js +56 -13
  124. package/models/management.cattle.io.kontainerdriver.js +1 -1
  125. package/models/management.cattle.io.node.js +18 -14
  126. package/models/management.cattle.io.nodepool.js +17 -0
  127. package/models/namespace.js +1 -1
  128. package/models/pod.js +20 -0
  129. package/models/provisioning.cattle.io.cluster.js +20 -3
  130. package/models/secret.js +117 -18
  131. package/models/workload.js +16 -0
  132. package/models/workload.service.js +18 -0
  133. package/package.json +10 -9
  134. package/pages/about.vue +0 -1
  135. package/pages/account/create-key.vue +0 -1
  136. package/pages/account/index.vue +0 -1
  137. package/pages/auth/login.vue +0 -1
  138. package/pages/auth/logout.vue +0 -2
  139. package/pages/auth/setup.vue +0 -4
  140. package/pages/auth/verify.vue +14 -8
  141. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  142. package/pages/c/_cluster/apps/index.vue +0 -2
  143. package/pages/c/_cluster/auth/index.vue +0 -2
  144. package/pages/c/_cluster/ecm/index.vue +0 -2
  145. package/pages/c/_cluster/explorer/index.vue +28 -2
  146. package/pages/c/_cluster/fleet/index.vue +1 -1
  147. package/pages/c/_cluster/index.vue +0 -2
  148. package/pages/c/_cluster/settings/banners.vue +0 -2
  149. package/pages/c/_cluster/settings/brand.vue +0 -2
  150. package/pages/c/_cluster/settings/index.vue +0 -2
  151. package/pages/c/_cluster/settings/links.vue +0 -1
  152. package/pages/c/_cluster/settings/performance.vue +0 -1
  153. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
  154. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  155. package/pages/c/_cluster/uiplugins/index.vue +0 -2
  156. package/pages/diagnostic.vue +1 -2
  157. package/pages/fail-whale.vue +0 -1
  158. package/pages/prefs.vue +0 -1
  159. package/pages/support/index.vue +2 -8
  160. package/pkg/auto-import.js +1 -1
  161. package/plugins/axios.js +0 -36
  162. package/plugins/back-button.js +3 -5
  163. package/plugins/codemirror-loader.js +1 -1
  164. package/plugins/codemirror.js +41 -0
  165. package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
  166. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  167. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  168. package/plugins/dashboard-store/actions.js +30 -4
  169. package/plugins/dashboard-store/classify.js +1 -18
  170. package/plugins/dashboard-store/getters.js +10 -5
  171. package/plugins/dashboard-store/index.js +0 -12
  172. package/plugins/dashboard-store/mutations.js +0 -4
  173. package/plugins/dashboard-store/resource-class.js +59 -18
  174. package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
  175. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  176. package/plugins/steve/getters.js +4 -1
  177. package/plugins/steve/norman-class.js +19 -0
  178. package/plugins/steve/steve-class.js +22 -0
  179. package/plugins/steve/subscribe.js +4 -10
  180. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  181. package/rancher-components/Accordion/Accordion.vue +85 -0
  182. package/rancher-components/Accordion/index.ts +1 -0
  183. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +19 -2
  184. package/rancher-components/Form/LabeledInput/LabeledInput.vue +12 -1
  185. package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
  186. package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
  187. package/rancher-components/Form/Radio/RadioGroup.vue +4 -0
  188. package/rancher-components/StringList/StringList.test.ts +270 -0
  189. package/rancher-components/StringList/StringList.vue +57 -18
  190. package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
  191. package/rancher-components/components/Accordion/Accordion.vue +85 -0
  192. package/rancher-components/components/Accordion/index.ts +1 -0
  193. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +19 -2
  194. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +4 -1
  195. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
  196. package/scripts/extension/parse-tag-name +2 -2
  197. package/scripts/publish-shell.sh +10 -0
  198. package/scripts/test-plugins-build.sh +85 -9
  199. package/server/har-file.js +183 -0
  200. package/store/catalog.js +1 -1
  201. package/store/features.js +1 -0
  202. package/store/i18n.js +11 -0
  203. package/store/index.js +10 -11
  204. package/store/prefs.js +33 -35
  205. package/store/type-map.js +8 -7
  206. package/tsconfig.json +35 -9
  207. package/tsconfig.paths.json +18 -0
  208. package/types/shell/index.d.ts +345 -214
  209. package/utils/__tests__/create-yaml.test.ts +60 -0
  210. package/utils/axios.js +0 -19
  211. package/utils/azure.js +24 -0
  212. package/utils/create-yaml.js +17 -10
  213. package/utils/monitoring.js +1 -1
  214. package/utils/nuxt.js +18 -39
  215. package/utils/object.js +14 -0
  216. package/utils/router.scrollBehavior.js +12 -14
  217. package/utils/time.js +1 -1
  218. package/utils/url.ts +1 -1
  219. package/vue.config.js +23 -2
  220. package/.DS_Store +0 -0
  221. package/assets/images/providers/aks-black.svg +0 -28
  222. package/assets/images/providers/aks.svg +0 -31
  223. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
  224. package/initialize/layouts.ts +0 -26
  225. package/mixins/fetch.server.js +0 -73
  226. package/pages/c/index.vue +0 -9
  227. package/pages/rio/mesh.vue +0 -508
  228. package/plugins/transitions.js +0 -4
  229. package/scripts/.DS_Store +0 -0
  230. package/scripts/verdaccio.log +0 -205
  231. package/tsconfig.default.json +0 -46
  232. package/yarn-error.log +0 -200
  233. /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
  234. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
  235. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  236. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  237. /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
  238. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  239. /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
  240. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  241. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  242. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  243. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
@@ -248,7 +248,10 @@ export default {
248
248
  v-if="clusterAndRouteReady"
249
249
  class="main-layout"
250
250
  >
251
- <nuxt class="outlet" />
251
+ <router-view
252
+ :key="$route.path"
253
+ class="outlet"
254
+ />
252
255
  <ActionMenu />
253
256
  <PromptRemove />
254
257
  <PromptRestore />
@@ -282,7 +285,10 @@ export default {
282
285
  v-else-if="unmatchedRoute"
283
286
  class="main-layout"
284
287
  >
285
- <nuxt class="outlet" />
288
+ <router-view
289
+ :key="$route.path"
290
+ class="outlet"
291
+ />
286
292
  </main>
287
293
  <div
288
294
  v-if="$refs.draggableZone"
@@ -304,99 +310,3 @@ export default {
304
310
  <DraggableZone ref="draggableZone" />
305
311
  </div>
306
312
  </template>
307
- <style lang="scss">
308
- .dashboard-root {
309
- display: flex;
310
- flex-direction: column;
311
- height: 100vh;
312
- }
313
-
314
- .dashboard-content {
315
- display: grid;
316
- position: relative;
317
- flex: 1 1 auto;
318
- overflow-y: auto;
319
- min-height: 0px;
320
-
321
- &.dashboard-padding-left {
322
- padding-left: $app-bar-collapsed-width;
323
-
324
- .overlay-content-mode {
325
- left: calc(var(--nav-width) + $app-bar-collapsed-width);
326
- }
327
- }
328
-
329
- &.pin-right {
330
- grid-template-areas:
331
- "header header header"
332
- "nav main wm";
333
- grid-template-rows: var(--header-height) auto;
334
- grid-template-columns: var(--nav-width) auto var(--wm-width, 0px);
335
- }
336
-
337
- &.pin-bottom {
338
- grid-template-areas:
339
- "header header"
340
- "nav main"
341
- "wm wm";
342
- grid-template-rows: var(--header-height) auto var(--wm-height, 0px);
343
- grid-template-columns: var(--nav-width) auto;
344
- }
345
-
346
- &.pin-left {
347
- grid-template-areas:
348
- "header header header"
349
- "wm nav main";
350
- grid-template-rows: var(--header-height) auto;
351
- grid-template-columns: var(--wm-width, 0px) var(--nav-width) auto;
352
- }
353
-
354
- > HEADER {
355
- grid-area: header;
356
- }
357
-
358
- .default-side-nav {
359
- grid-area: nav;
360
- }
361
- }
362
-
363
- .wm {
364
- grid-area: wm;
365
- overflow-y: hidden;
366
- z-index: 1;
367
- }
368
-
369
- .localeSelector {
370
- ::v-deep .popover-inner {
371
- padding: 50px 0;
372
- }
373
-
374
- ::v-deep .popover-arrow {
375
- display: none;
376
- }
377
-
378
- ::v-deep .popover:focus {
379
- outline: 0;
380
- }
381
-
382
- li {
383
- padding: 8px 20px;
384
-
385
- &:hover {
386
- background-color: var(--primary-hover-bg);
387
- color: var(--primary-hover-text);
388
- text-decoration: none;
389
- }
390
- }
391
- }
392
-
393
- .drag-start {
394
- z-index: 1000;
395
- opacity: 0.5;
396
- transition: opacity .3s ease;
397
- }
398
-
399
- .drag-end {
400
- opacity: 1;
401
- }
402
- </style>
@@ -5,18 +5,15 @@ export default {
5
5
  name: 'NuxtError',
6
6
  mixins: [Brand],
7
7
  middleware: ['unauthenticated'],
8
- props: {
9
- error: {
10
- type: Object,
11
- default: null
12
- }
13
- },
14
8
 
15
9
  data() {
16
10
  return { ready: false };
17
11
  },
18
12
 
19
13
  computed: {
14
+ error() {
15
+ return window.$nuxt.nuxt.err || {};
16
+ },
20
17
  statusCode() {
21
18
  return (this.error && this.error.statusCode) || 599;
22
19
  },
@@ -24,6 +21,11 @@ export default {
24
21
  return this.error.message || '';
25
22
  }
26
23
  },
24
+ watch: {
25
+ message(neu) {
26
+ document.title = neu;
27
+ }
28
+ },
27
29
 
28
30
  mounted() {
29
31
  // If the page isn't a sub-path of the base url, redirect to it instead of saying not found.
@@ -40,19 +42,8 @@ export default {
40
42
  setTimeout(() => {
41
43
  this.ready = true;
42
44
  }, 1000);
45
+ document.title = this.message;
43
46
  },
44
-
45
- head() {
46
- return {
47
- title: this.message,
48
- meta: [
49
- {
50
- name: 'viewport',
51
- content: 'width=device-width,initial-scale=1.0,minimum-scale=1.0'
52
- }
53
- ]
54
- };
55
- }
56
47
  };
57
48
  </script>
58
49
 
@@ -112,7 +103,7 @@ export default {
112
103
  -ms-text-size-adjust: 100%;
113
104
  -webkit-text-size-adjust: 100%;
114
105
  -webkit-font-smoothing: antialiased;
115
- position: absolute;
106
+ position: fixed;
116
107
  top: 0;
117
108
  left: 0;
118
109
  right: 0;
@@ -68,7 +68,10 @@ export default {
68
68
  />
69
69
 
70
70
  <main class="main-layout">
71
- <nuxt class="outlet" />
71
+ <router-view
72
+ :key="$route.path"
73
+ class="outlet"
74
+ />
72
75
  </main>
73
76
  </div>
74
77
  <FixedBanner :footer="true" />
@@ -70,7 +70,10 @@ export default {
70
70
  <Header :simple="true" />
71
71
  <main class="main-layout">
72
72
  <IndentedPanel class="pt-20">
73
- <nuxt class="outlet" />
73
+ <router-view
74
+ :key="$route.path"
75
+ class="outlet"
76
+ />
74
77
  </IndentedPanel>
75
78
  <ActionMenu />
76
79
  <PromptRemove />
@@ -3,7 +3,7 @@ export default { middleware: ['unauthenticated'] };
3
3
  </script>
4
4
 
5
5
  <template>
6
- <nuxt />
6
+ <router-view :key="$route.path" />
7
7
  </template>
8
8
 
9
9
  <style lang="scss">
@@ -14,7 +14,7 @@ export default {
14
14
  <div class="dashboard-root">
15
15
  <FixedBanner :header="true" />
16
16
  <FixedBanner :consent="true" />
17
- <nuxt />
17
+ <router-view :key="$route.path" />
18
18
  <FixedBanner :footer="true" />
19
19
  </div>
20
20
  </main>
@@ -0,0 +1,20 @@
1
+ import { computed, ComputedRef } from 'vue';
2
+
3
+ interface CompactInputProps {
4
+ compact?: boolean;
5
+ label?: string;
6
+ labelKey?: string;
7
+ }
8
+
9
+ interface UseCompactInput {
10
+ isCompact: ComputedRef<boolean>;
11
+ }
12
+
13
+ export const useCompactInput = (props: CompactInputProps): UseCompactInput => {
14
+ const isCompact = computed(() => {
15
+ // Compact if explicitly set - otherwise compact if there is no label
16
+ return props.compact !== null ? !!props.compact : !(props.label || props.labelKey);
17
+ });
18
+
19
+ return { isCompact };
20
+ };
@@ -0,0 +1,138 @@
1
+ import { ref, computed, ComputedRef, Ref } from 'vue';
2
+ import { _VIEW, _EDIT } from '@shell/config/query-params';
3
+
4
+ interface LabeledFormElementProps {
5
+ mode: string;
6
+ value: string | number | Record<string, any>
7
+ required: boolean;
8
+ disabled: boolean;
9
+ rules: Array<any>;
10
+ }
11
+
12
+ interface UseLabeledFormElement {
13
+ raised: Ref<boolean>;
14
+ focused: Ref<boolean>;
15
+ blurred: Ref<number | null>;
16
+ requiredField: ComputedRef<any>;
17
+ isDisabled: ComputedRef<any>;
18
+ validationMessage: ComputedRef<any>;
19
+ onFocusLabeled: () => void;
20
+ onBlurLabeled: () => void;
21
+ }
22
+
23
+ export const labeledFormElementProps = {
24
+ tooltipKey: {
25
+ type: String,
26
+ default: null
27
+ },
28
+ placeholder: {
29
+ type: [String, Number],
30
+ default: ''
31
+ },
32
+ placeholderKey: {
33
+ type: String,
34
+ default: null
35
+ },
36
+ label: {
37
+ type: String,
38
+ default: null
39
+ },
40
+ labelKey: {
41
+ type: String,
42
+ default: null
43
+ },
44
+ value: {
45
+ type: [String, Number, Object],
46
+ default: ''
47
+ },
48
+ mode: {
49
+ type: String,
50
+ default: _EDIT,
51
+ },
52
+ rules: {
53
+ default: (): Array<unknown> => [],
54
+ type: Array,
55
+ // we only want functions in the rules array
56
+ validator: (rules: Array<unknown>): boolean => rules.every((rule: unknown) => ['function'].includes(typeof rule))
57
+ },
58
+ required: {
59
+ type: Boolean,
60
+ default: false,
61
+ },
62
+ disabled: {
63
+ type: Boolean,
64
+ default: false,
65
+ },
66
+ };
67
+
68
+ export const useLabeledFormElement = (props: LabeledFormElementProps, emit: (event: string, ...args: any[]) => void): UseLabeledFormElement => {
69
+ const raised = ref(props.mode === _VIEW || !!`${ props.value }`);
70
+ const focused = ref(false);
71
+ const blurred = ref<number | null>(null);
72
+
73
+ const requiredField = computed(() => {
74
+ return props.required || props.rules?.some((rule: any) => rule?.name === 'required');
75
+ });
76
+
77
+ const isView = computed(() => {
78
+ return props.mode === _VIEW;
79
+ });
80
+
81
+ const isDisabled = computed(() => {
82
+ return props.disabled || isView.value;
83
+ });
84
+
85
+ const validationMessage = computed(() => {
86
+ const requiredRule = props.rules.find((rule: any) => rule?.name === 'required') as Function;
87
+ const ruleMessages = [];
88
+ const value = props.value;
89
+
90
+ if (requiredRule && blurred.value && !focused.value) {
91
+ const message = requiredRule(value);
92
+
93
+ if (!!message) {
94
+ return message;
95
+ }
96
+ }
97
+
98
+ for (const rule of props.rules) {
99
+ const message = rule(value);
100
+
101
+ if (!!message && rule.name !== 'required') {
102
+ ruleMessages.push(message);
103
+ }
104
+ }
105
+
106
+ if (ruleMessages.length > 0 && (blurred.value || focused.value)) {
107
+ return ruleMessages.join(', ');
108
+ } else {
109
+ return undefined;
110
+ }
111
+ });
112
+
113
+ const onFocusLabeled = () => {
114
+ raised.value = true;
115
+ focused.value = true;
116
+ };
117
+
118
+ const onBlurLabeled = () => {
119
+ focused.value = false;
120
+
121
+ if (!props.value) {
122
+ raised.value = false;
123
+ }
124
+
125
+ blurred.value = Date.now();
126
+ };
127
+
128
+ return {
129
+ raised,
130
+ focused,
131
+ blurred,
132
+ onFocusLabeled,
133
+ onBlurLabeled,
134
+ isDisabled,
135
+ validationMessage,
136
+ requiredField
137
+ };
138
+ };
@@ -1 +1,3 @@
1
1
  export const NAME = 'harvesterManager';
2
+
3
+ export const KIND = { MACHINE_TEMPLATE: 'HarvesterMachineTemplate' };
@@ -23,6 +23,7 @@ export function setMode(m) {
23
23
 
24
24
  export function setVendor(v) {
25
25
  vendor = v;
26
+ setTitle();
26
27
  }
27
28
 
28
29
  export function setProduct(p) {
@@ -71,3 +72,24 @@ export function getVendor() {
71
72
  export function getProduct() {
72
73
  return product;
73
74
  }
75
+
76
+ export function setTitle() {
77
+ const v = getVendor();
78
+
79
+ if (v === 'Harvester') {
80
+ const ico = require(`~shell/assets/images/pl/harvester.png`);
81
+
82
+ document.title = 'Harvester';
83
+ const link = document.createElement('link');
84
+
85
+ link.hid = 'icon';
86
+ link.rel = 'icon';
87
+ link.type = 'image/x-icon';
88
+ link.hrefv = ico;
89
+ const head = document.getElementsByTagName('head')[0];
90
+
91
+ head.appendChild(link);
92
+ } else {
93
+ document.title = v;
94
+ }
95
+ }
@@ -7,6 +7,7 @@ import {
7
7
  MANAGEMENT,
8
8
  NAMESPACE,
9
9
  NORMAN,
10
+ SNAPSHOT,
10
11
  VIRTUAL_TYPES,
11
12
  } from '@shell/config/types';
12
13
 
@@ -162,6 +163,8 @@ export function init(store) {
162
163
  configureType(MANAGEMENT.PROJECT_ROLE_TEMPLATE_BINDING, { isEditable: false, depaginate: true });
163
164
  configureType(MANAGEMENT.PROJECT, { displayName: store.getters['i18n/t']('namespace.project.label') });
164
165
  configureType(NORMAN.PROJECT_ROLE_TEMPLATE_BINDING, { depaginate: true });
166
+ configureType(SNAPSHOT, { depaginate: true });
167
+ configureType(NORMAN.ETCD_BACKUP, { depaginate: true });
165
168
 
166
169
  configureType(EVENT, { limit: 500 });
167
170
  weightType(EVENT, -1, true);
@@ -3,6 +3,7 @@ import { FLEET } from '@shell/config/types';
3
3
  import { STATE, NAME as NAME_COL, AGE } from '@shell/config/table-headers';
4
4
  import { FLEET as FLEET_FEATURE } from '@shell/store/features';
5
5
  import { gitRepoGraphConfig } from '@shell/pages/c/_cluster/fleet/GitRepoGraphConfig';
6
+ import { BLANK_CLUSTER } from '@shell/store/store-types.js';
6
7
 
7
8
  export const NAME = 'fleet';
8
9
  export const CHART_NAME = 'fleet';
@@ -26,6 +27,10 @@ export function init(store) {
26
27
  removable: false,
27
28
  showClusterSwitcher: false,
28
29
  showWorkspaceSwitcher: true,
30
+ to: {
31
+ name: 'c-cluster-fleet',
32
+ params: { resource: FLEET.DASHBOARD, cluster: BLANK_CLUSTER }
33
+ },
29
34
  });
30
35
 
31
36
  virtualType({
@@ -37,7 +42,7 @@ export function init(store) {
37
42
  weight: 110,
38
43
  route: {
39
44
  name: 'c-cluster-fleet',
40
- params: { resource: FLEET.DASHBOARD }
45
+ params: { resource: FLEET.DASHBOARD, cluster: BLANK_CLUSTER }
41
46
  },
42
47
  exact: true,
43
48
  });
@@ -4,9 +4,10 @@ import {
4
4
  CATALOG,
5
5
  NORMAN,
6
6
  HCI,
7
- MANAGEMENT
7
+ MANAGEMENT,
8
+ SNAPSHOT
8
9
  } from '@shell/config/types';
9
- import { MULTI_CLUSTER } from '@shell/store/features';
10
+ import { MULTI_CLUSTER, RKE1_UI } from '@shell/store/features';
10
11
  import { DSL } from '@shell/store/type-map';
11
12
  import { BLANK_CLUSTER } from '@shell/store/store-types.js';
12
13
 
@@ -60,6 +61,9 @@ export function init(store) {
60
61
  'drivers',
61
62
  ]);
62
63
 
64
+ configureType(SNAPSHOT, { depaginate: true });
65
+ configureType(NORMAN.ETCD_BACKUP, { depaginate: true });
66
+
63
67
  configureType(CAPI.RANCHER_CLUSTER, {
64
68
  showListMasthead: false, namespaced: false, alias: [HCI.CLUSTER]
65
69
  });
@@ -84,6 +88,7 @@ export function init(store) {
84
88
  });
85
89
 
86
90
  virtualType({
91
+ ifFeature: RKE1_UI,
87
92
  labelKey: 'manager.rkeTemplates.label',
88
93
  name: 'rke-templates',
89
94
  group: 'Root',
@@ -94,6 +99,7 @@ export function init(store) {
94
99
  });
95
100
 
96
101
  virtualType({
102
+ ifFeature: RKE1_UI,
97
103
  labelKey: 'manager.nodeTemplates.label',
98
104
  name: 'rke-node-templates',
99
105
  group: 'Root',
@@ -50,6 +50,7 @@ export const _SPLIT = 'split';
50
50
 
51
51
  // CruResource
52
52
  export const SUB_TYPE = 'type';
53
+ export const RKE_TYPE = 'rkeType';
53
54
 
54
55
  // App launch
55
56
  export const REPO_TYPE = 'repo-type';