@rancher/shell 0.4.0 → 0.5.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 (274) 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/AsyncButton.vue +17 -5
  14. package/components/Certificates.vue +164 -0
  15. package/components/CodeMirror.vue +19 -21
  16. package/components/CruResource.vue +1 -0
  17. package/components/DraggableZone.vue +2 -2
  18. package/components/EtcdInfoBanner.vue +1 -1
  19. package/components/ExplorerProjectsNamespaces.vue +25 -1
  20. package/components/IconOrSvg.vue +1 -1
  21. package/components/LandingPagePreference.vue +1 -4
  22. package/components/PodSecurityAdmission.vue +2 -2
  23. package/components/Questions/index.vue +1 -1
  24. package/components/ResourceDetail/Masthead.vue +16 -3
  25. package/components/ResourceTable.vue +14 -2
  26. package/components/ResourceYaml.vue +5 -0
  27. package/components/SideNav.vue +1 -1
  28. package/components/SingleClusterInfo.vue +1 -4
  29. package/components/Tabbed/index.vue +12 -0
  30. package/components/fleet/FleetRepos.vue +62 -27
  31. package/components/fleet/FleetResources.vue +6 -1
  32. package/components/form/ArrayListSelect.vue +10 -0
  33. package/components/form/Error.vue +3 -3
  34. package/components/form/Footer.vue +2 -2
  35. package/components/form/GitPicker.vue +83 -38
  36. package/components/form/KeyValue.vue +4 -0
  37. package/components/form/LabeledSelect.vue +4 -0
  38. package/components/formatter/Checked.vue +11 -3
  39. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  40. package/components/formatter/FleetSummaryGraph.vue +23 -11
  41. package/components/formatter/LiveDuration.vue +1 -1
  42. package/components/formatter/PercentageBar.vue +1 -1
  43. package/components/formatter/__tests__/Checked.test.ts +19 -0
  44. package/components/nav/Group.vue +2 -2
  45. package/components/nav/Header.vue +0 -1
  46. package/components/nav/TopLevelMenu.vue +36 -6
  47. package/components/nav/Type.vue +1 -3
  48. package/components/nav/WindowManager/ContainerLogs.vue +101 -3
  49. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  50. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  51. package/components/nav/WindowManager/index.vue +11 -10
  52. package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
  53. package/components/nav/__tests__/Type.test.ts +1 -1
  54. package/components/nuxt/nuxt-child.js +14 -78
  55. package/components/nuxt/nuxt.js +1 -1
  56. package/{layouts → components/templates}/blank.vue +1 -1
  57. package/{layouts → components/templates}/default.vue +8 -98
  58. package/{layouts → components/templates}/error.vue +10 -19
  59. package/{layouts → components/templates}/home.vue +4 -1
  60. package/{layouts → components/templates}/plain.vue +4 -1
  61. package/{layouts → components/templates}/standalone.vue +1 -1
  62. package/{layouts → components/templates}/unauthenticated.vue +1 -1
  63. package/composables/useCompactInput.test.ts +36 -0
  64. package/composables/useCompactInput.ts +20 -0
  65. package/composables/useLabeledFormElement.test.ts +135 -0
  66. package/composables/useLabeledFormElement.ts +138 -0
  67. package/config/harvester-manager-types.js +2 -0
  68. package/config/private-label.js +22 -0
  69. package/config/product/explorer.js +3 -0
  70. package/config/product/fleet.js +6 -1
  71. package/config/product/manager.js +8 -2
  72. package/config/query-params.js +1 -0
  73. package/config/router.js +385 -364
  74. package/config/settings.ts +1 -0
  75. package/config/store.js +1 -1
  76. package/config/system-namespaces.js +3 -0
  77. package/config/table-headers.js +47 -0
  78. package/core/plugin-routes.ts +56 -114
  79. package/core/plugin.ts +16 -10
  80. package/core/plugins-loader.js +7 -9
  81. package/core/plugins.js +0 -3
  82. package/creators/app/files/.gitlab-ci.yml +1 -1
  83. package/detail/fleet.cattle.io.cluster.vue +11 -1
  84. package/detail/provisioning.cattle.io.cluster.vue +4 -3
  85. package/dialog/ScaleMachineDownDialog.vue +34 -17
  86. package/edit/__tests__/service.test.ts +89 -0
  87. package/edit/auth/googleoauth.vue +1 -5
  88. package/edit/cloudcredential.vue +2 -0
  89. package/edit/configmap.vue +2 -1
  90. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +2 -2
  91. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  92. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
  93. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
  94. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  95. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +4 -0
  96. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  97. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  98. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
  99. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
  100. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  101. package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
  102. package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
  103. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  104. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
  105. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
  106. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  107. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  108. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
  109. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
  110. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  111. package/edit/service.vue +12 -0
  112. package/edit/workload/mixins/workload.js +1 -1
  113. package/initialize/App.js +25 -71
  114. package/initialize/client.js +21 -162
  115. package/initialize/index.js +27 -123
  116. package/list/management.cattle.io.feature.vue +1 -7
  117. package/list/node.vue +1 -0
  118. package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
  119. package/machine-config/vmwarevsphere.vue +73 -51
  120. package/middleware/authenticated.js +10 -17
  121. package/mixins/auth-config.js +2 -7
  122. package/mixins/brand.js +29 -41
  123. package/mixins/create-edit-view/index.js +2 -2
  124. package/mixins/labeled-form-element.ts +6 -1
  125. package/models/__tests__/management.cattle.io.node.ts +85 -0
  126. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  127. package/models/__tests__/namespace.test.ts +49 -9
  128. package/models/__tests__/workload.test.ts +91 -0
  129. package/models/cluster/node.js +4 -4
  130. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  131. package/models/fleet.cattle.io.cluster.js +4 -0
  132. package/models/fleet.cattle.io.gitrepo.js +56 -13
  133. package/models/management.cattle.io.kontainerdriver.js +1 -1
  134. package/models/management.cattle.io.node.js +18 -14
  135. package/models/management.cattle.io.nodepool.js +17 -0
  136. package/models/namespace.js +1 -1
  137. package/models/pod.js +20 -0
  138. package/models/provisioning.cattle.io.cluster.js +20 -3
  139. package/models/secret.js +117 -18
  140. package/models/workload.js +16 -0
  141. package/models/workload.service.js +18 -0
  142. package/package.json +10 -9
  143. package/pages/about.vue +0 -1
  144. package/pages/account/create-key.vue +0 -1
  145. package/pages/account/index.vue +0 -1
  146. package/pages/auth/login.vue +0 -1
  147. package/pages/auth/logout.vue +0 -2
  148. package/pages/auth/setup.vue +0 -4
  149. package/pages/auth/verify.vue +14 -8
  150. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  151. package/pages/c/_cluster/apps/index.vue +0 -2
  152. package/pages/c/_cluster/auth/index.vue +0 -2
  153. package/pages/c/_cluster/ecm/index.vue +0 -2
  154. package/pages/c/_cluster/explorer/index.vue +28 -2
  155. package/pages/c/_cluster/fleet/index.vue +1 -1
  156. package/pages/c/_cluster/index.vue +0 -2
  157. package/pages/c/_cluster/settings/banners.vue +0 -2
  158. package/pages/c/_cluster/settings/brand.vue +0 -2
  159. package/pages/c/_cluster/settings/index.vue +0 -2
  160. package/pages/c/_cluster/settings/links.vue +0 -1
  161. package/pages/c/_cluster/settings/performance.vue +0 -1
  162. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
  163. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  164. package/pages/c/_cluster/uiplugins/index.vue +0 -2
  165. package/pages/diagnostic.vue +1 -2
  166. package/pages/fail-whale.vue +0 -1
  167. package/pages/prefs.vue +0 -1
  168. package/pages/support/index.vue +2 -8
  169. package/pkg/auto-import.js +1 -1
  170. package/plugins/axios.js +0 -36
  171. package/plugins/back-button.js +3 -5
  172. package/plugins/codemirror-loader.js +1 -1
  173. package/plugins/codemirror.js +41 -0
  174. package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
  175. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  176. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  177. package/plugins/dashboard-store/actions.js +30 -4
  178. package/plugins/dashboard-store/classify.js +1 -18
  179. package/plugins/dashboard-store/getters.js +10 -5
  180. package/plugins/dashboard-store/index.js +0 -12
  181. package/plugins/dashboard-store/mutations.js +0 -4
  182. package/plugins/dashboard-store/resource-class.js +59 -18
  183. package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
  184. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  185. package/plugins/steve/getters.js +4 -1
  186. package/plugins/steve/norman-class.js +19 -0
  187. package/plugins/steve/steve-class.js +22 -0
  188. package/plugins/steve/subscribe.js +4 -10
  189. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  190. package/rancher-components/Accordion/Accordion.vue +86 -0
  191. package/rancher-components/Accordion/index.ts +1 -0
  192. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  193. package/rancher-components/Banner/Banner.vue +2 -2
  194. package/rancher-components/Card/Card.vue +3 -3
  195. package/rancher-components/Form/Checkbox/Checkbox.vue +3 -3
  196. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  197. package/rancher-components/Form/LabeledInput/LabeledInput.vue +65 -24
  198. package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
  199. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  200. package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
  201. package/rancher-components/Form/Radio/RadioGroup.vue +8 -3
  202. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  203. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  204. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  205. package/rancher-components/StringList/StringList.test.ts +270 -0
  206. package/rancher-components/StringList/StringList.vue +65 -26
  207. package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
  208. package/rancher-components/components/Accordion/Accordion.vue +86 -0
  209. package/rancher-components/components/Accordion/index.ts +1 -0
  210. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  211. package/rancher-components/components/Banner/Banner.vue +2 -2
  212. package/rancher-components/components/Card/Card.vue +3 -3
  213. package/rancher-components/components/Form/Checkbox/Checkbox.vue +3 -3
  214. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  215. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  216. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  217. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  218. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  219. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  220. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  221. package/rancher-components/components/StringList/StringList.vue +8 -8
  222. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
  223. package/scripts/extension/parse-tag-name +2 -2
  224. package/scripts/publish-shell.sh +10 -0
  225. package/scripts/test-plugins-build.sh +85 -9
  226. package/server/har-file.js +183 -0
  227. package/store/catalog.js +1 -1
  228. package/store/features.js +1 -0
  229. package/store/i18n.js +11 -0
  230. package/store/index.js +10 -11
  231. package/store/prefs.js +33 -35
  232. package/store/type-map.js +8 -7
  233. package/tsconfig.json +35 -9
  234. package/tsconfig.paths.json +21 -0
  235. package/types/shell/index.d.ts +427 -234
  236. package/types/vue-shim.d.ts +42 -0
  237. package/utils/__tests__/create-yaml.test.ts +60 -0
  238. package/utils/axios.js +0 -19
  239. package/utils/azure.js +24 -0
  240. package/utils/create-yaml.js +17 -10
  241. package/utils/git.ts +1 -1
  242. package/utils/monitoring.js +1 -1
  243. package/utils/nuxt.js +18 -39
  244. package/utils/object.js +14 -0
  245. package/utils/router.scrollBehavior.js +12 -14
  246. package/utils/time.js +1 -1
  247. package/utils/url.ts +1 -1
  248. package/vue.config.js +23 -2
  249. package/.DS_Store +0 -0
  250. package/assets/images/providers/aks-black.svg +0 -28
  251. package/assets/images/providers/aks.svg +0 -31
  252. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
  253. package/initialize/layouts.ts +0 -26
  254. package/mixins/fetch.server.js +0 -73
  255. package/pages/c/index.vue +0 -9
  256. package/pages/rio/mesh.vue +0 -508
  257. package/plugins/transitions.js +0 -4
  258. package/scripts/.DS_Store +0 -0
  259. package/scripts/verdaccio.log +0 -205
  260. package/tsconfig.default.json +0 -46
  261. package/yarn-error.log +0 -200
  262. /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
  263. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
  264. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  265. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  266. /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
  267. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  268. /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
  269. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  270. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  271. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  272. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  273. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  274. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
@@ -1,8 +1,6 @@
1
1
  <script>
2
2
 
3
3
  export default {
4
- layout: 'plain',
5
-
6
4
  mounted() {
7
5
  const link = this.$store.getters['backToRancherLink'];
8
6
 
@@ -15,6 +15,7 @@ import {
15
15
  WORKLOAD_TYPES,
16
16
  COUNT,
17
17
  CATALOG,
18
+ SECRET
18
19
  } from '@shell/config/types';
19
20
  import { setPromiseResult } from '@shell/utils/promise';
20
21
  import AlertTable from '@shell/components/AlertTable';
@@ -42,6 +43,8 @@ import { fetchClusterResources } from './explorer-utils';
42
43
  import SimpleBox from '@shell/components/SimpleBox';
43
44
  import { ExtensionPoint, CardLocation } from '@shell/core/types';
44
45
  import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
46
+ import Certificates from '@shell/components/Certificates';
47
+ import { NAME as EXPLORER } from '@shell/config/product/explorer';
45
48
 
46
49
  export const RESOURCES = [NAMESPACE, INGRESS, PV, WORKLOAD_TYPES.DEPLOYMENT, WORKLOAD_TYPES.STATEFUL_SET, WORKLOAD_TYPES.JOB, WORKLOAD_TYPES.DAEMON_SET, SERVICE];
47
50
 
@@ -74,6 +77,7 @@ export default {
74
77
  ConfigBadge,
75
78
  EventsTable,
76
79
  SimpleBox,
80
+ Certificates
77
81
  },
78
82
 
79
83
  mixins: [metricPoller],
@@ -348,8 +352,18 @@ export default {
348
352
  return {
349
353
  name: 'c-cluster-product-resource',
350
354
  params: {
351
- product: 'explorer',
352
- resource: 'event',
355
+ product: EXPLORER,
356
+ resource: EVENT,
357
+ }
358
+ };
359
+ },
360
+
361
+ allSecretsLink() {
362
+ return {
363
+ name: 'c-cluster-product-resource',
364
+ params: {
365
+ product: EXPLORER,
366
+ resource: SECRET,
353
367
  }
354
368
  };
355
369
  }
@@ -581,6 +595,18 @@ export default {
581
595
  >
582
596
  <AlertTable v-if="selectedTab === 'cluster-alerts'" />
583
597
  </Tab>
598
+ <Tab
599
+ name="cluster-certs"
600
+ :label="t('clusterIndexPage.sections.certs.label')"
601
+ :weight="1"
602
+ >
603
+ <span class="events-table-link">
604
+ <n-link :to="allSecretsLink">
605
+ <span>{{ t('glance.secretsTable') }}</span>
606
+ </n-link>
607
+ </span>
608
+ <Certificates v-if="selectedTab === 'cluster-certs'" />
609
+ </Tab>
584
610
  </Tabbed>
585
611
  </div>
586
612
  <Tabbed
@@ -14,7 +14,7 @@ import FleetNoWorkspaces from '@shell/components/fleet/FleetNoWorkspaces.vue';
14
14
  import { NAME } from '@shell/config/product/fleet';
15
15
 
16
16
  export default {
17
- name: 'ListGitRepo',
17
+ name: 'FleetDashboard',
18
18
  components: {
19
19
  Loading,
20
20
  ResourceTable,
@@ -2,8 +2,6 @@
2
2
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
3
3
 
4
4
  export default {
5
- layout: 'plain',
6
-
7
5
  middleware({ redirect, route } ) {
8
6
  return redirect({
9
7
  name: 'c-cluster-product',
@@ -53,8 +53,6 @@ const DEFAULT_BANNER_SETTING = {
53
53
  };
54
54
 
55
55
  export default {
56
- layout: 'authenticated',
57
-
58
56
  components: {
59
57
  Checkbox,
60
58
  Loading,
@@ -20,8 +20,6 @@ import { setFavIcon } from '@shell/utils/favicon';
20
20
  const Color = require('color');
21
21
 
22
22
  export default {
23
- layout: 'authenticated',
24
-
25
23
  components: {
26
24
  LabeledInput, Checkbox, FileImageSelector, Loading, SimpleBox, AsyncButton, Banner, ColorInput, TypeDescription
27
25
  },
@@ -3,8 +3,6 @@ import { NAME as SETTINGS } from '@shell/config/product/settings';
3
3
  import { MANAGEMENT } from '@shell/config/types';
4
4
 
5
5
  export default {
6
- layout: 'plain',
7
-
8
6
  middleware({ redirect, route, store } ) {
9
7
  const hasSettings = !!store.getters[`management/schemaFor`](MANAGEMENT.SETTING);
10
8
 
@@ -13,7 +13,6 @@ import DefaultLinksEditor from './DefaultLinksEditor';
13
13
  import { CUSTOM_LINKS_VERSION, fetchLinks } from '@shell/config/home-links';
14
14
 
15
15
  export default {
16
- layout: 'authenticated',
17
16
  components: {
18
17
  KeyValue,
19
18
  Loading,
@@ -22,7 +22,6 @@ const l10n = {
22
22
  };
23
23
 
24
24
  export default {
25
- layout: 'authenticated',
26
25
  components: {
27
26
  Checkbox,
28
27
  Loading,
@@ -469,7 +469,8 @@ export default {
469
469
  <div class="fields">
470
470
  <LabeledSelect
471
471
  v-model="imagePullSecrets"
472
- :label="t('workload.container.imagePullSecrets')"
472
+ :label="t('plugins.manageCatalog.imageLoad.fields.imagePullSecrets.label')"
473
+ :tooltip="t('plugins.manageCatalog.imageLoad.fields.imagePullSecrets.tooltip')"
473
474
  :multiple="true"
474
475
  :taggable="true"
475
476
  :options="imagePullNamespacedSecrets"
@@ -7,13 +7,12 @@ import { SERVICE, WORKLOAD_TYPES } from '@shell/config/types';
7
7
  import { UI_PLUGIN_LABELS, UI_PLUGIN_NAMESPACE } from '@shell/config/uiplugins';
8
8
  import { UI_PLUGIN_CATALOG } from '@shell/config/table-headers';
9
9
 
10
- import ActionMenu from '@shell/components/ActionMenu';
11
10
  import ResourceTable from '@shell/components/ResourceTable';
12
11
 
13
12
  export default {
14
13
  name: 'CatalogList',
15
14
 
16
- components: { ActionMenu, ResourceTable },
15
+ components: { ResourceTable },
17
16
 
18
17
  mixins: [ResourceManager],
19
18
 
@@ -29,10 +28,7 @@ export default {
29
28
 
30
29
  return {
31
30
  actions,
32
- catalogHeaders: UI_PLUGIN_CATALOG,
33
- menuTargetElement: null,
34
- menuTargetEvent: null,
35
- menuOpen: false,
31
+ catalogHeaders: UI_PLUGIN_CATALOG,
36
32
  };
37
33
  },
38
34
 
@@ -49,6 +45,7 @@ export default {
49
45
 
50
46
  catalogRows() {
51
47
  const rows = [];
48
+ const actions = this.actions;
52
49
 
53
50
  if ( !isEmpty(this.namespacedDeployments) ) {
54
51
  this.namespacedDeployments.forEach((deploy) => {
@@ -57,11 +54,13 @@ export default {
57
54
 
58
55
  if ( deployName ) {
59
56
  const out = {
60
- name: deployName,
61
- state: deploy.metadata?.state?.name,
62
- image: deploy.spec?.template?.spec?.containers[0]?.image,
63
- service: null,
64
- repo: null
57
+ name: deployName,
58
+ state: deploy.metadata?.state?.name,
59
+ image: deploy.spec?.template?.spec?.containers[0]?.image,
60
+ service: null,
61
+ repo: null,
62
+ availableActions: actions,
63
+ showCatalogUninstallDialog: () => this.$emit('showCatalogUninstallDialog', out)
65
64
  };
66
65
  const keys = ['service', 'repo'];
67
66
 
@@ -77,20 +76,6 @@ export default {
77
76
  return rows;
78
77
  }
79
78
  },
80
-
81
- methods: {
82
- setMenu(event) {
83
- this.menuOpen = !!event;
84
-
85
- if (event) {
86
- this.menuTargetElement = this.$refs.catalogActions;
87
- this.menuTargetEvent = event;
88
- } else {
89
- this.menuTargetElement = undefined;
90
- this.menuTargetEvent = undefined;
91
- }
92
- }
93
- }
94
79
  };
95
80
  </script>
96
81
 
@@ -118,27 +103,6 @@ export default {
118
103
  </button>
119
104
  </div>
120
105
  </template>
121
- <template #row-actions="{row}">
122
- <button
123
- ref="catalogActions"
124
- aria-haspopup="true"
125
- type="button"
126
- class="btn btn-sm role-multi-action actions"
127
- data-testid="extensions-page-catalog-row-menu"
128
- @click="setMenu"
129
- >
130
- <i class="icon icon-actions" />
131
- </button>
132
- <ActionMenu
133
- :custom-actions="actions"
134
- :open="menuOpen"
135
- :use-custom-target-element="true"
136
- :custom-target-element="menuTargetElement"
137
- :custom-target-event="menuTargetEvent"
138
- @close="setMenu(false)"
139
- @showCatalogUninstallDialog="e => $emit('showCatalogUninstallDialog', row, e.event)"
140
- />
141
- </template>
142
106
  </ResourceTable>
143
107
  </div>
144
108
  </div>
@@ -93,8 +93,6 @@ export default {
93
93
  };
94
94
  },
95
95
 
96
- layout: 'plain',
97
-
98
96
  async fetch() {
99
97
  const hash = {};
100
98
 
@@ -7,8 +7,7 @@ import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/u
7
7
  import { sortBy } from '@shell/utils/sort';
8
8
 
9
9
  export default {
10
- name: 'Diagnostic',
11
- layout: 'plain',
10
+ name: 'Diagnostic',
12
11
 
13
12
  components: { AsyncButton, PromptModal },
14
13
 
@@ -4,7 +4,6 @@ import { mapGetters, mapState } from 'vuex';
4
4
  import { stringify } from '@shell/utils/error';
5
5
 
6
6
  export default {
7
- layout: 'home',
8
7
 
9
8
  components: { BrandImage },
10
9
 
package/pages/prefs.vue CHANGED
@@ -18,7 +18,6 @@ import { addObject } from '@shell/utils/array';
18
18
  import LocaleSelector from '@shell/components/LocaleSelector';
19
19
 
20
20
  export default {
21
- layout: 'plain',
22
21
  components: {
23
22
  BackLink, ButtonGroup, LabeledSelect, Checkbox, LandingPagePreference, LocaleSelector
24
23
  },
@@ -10,7 +10,6 @@ import { isRancherPrime } from '@shell/config/version';
10
10
  import { hasCspAdapter } from 'mixins/brand';
11
11
 
12
12
  export default {
13
- layout: 'home',
14
13
 
15
14
  components: {
16
15
  BannerGraphic,
@@ -82,13 +81,8 @@ export default {
82
81
  },
83
82
 
84
83
  serverUrl() {
85
- if (process.client) {
86
- // Client-side rendered: use the current window location
87
- return window.location.origin;
88
- }
89
-
90
- // Server-side rendered
91
- return this.serverSetting?.value || '';
84
+ // Client-side rendered: use the current window location
85
+ return window.location.origin;
92
86
  },
93
87
 
94
88
  supportConfigLink() {
@@ -1,6 +1,6 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
- const contextFolders = ['chart', 'cloud-credential', 'content', 'detail', 'edit', 'layouts', 'list', 'machine-config', 'models', 'promptRemove', 'l10n', 'windowComponents', 'dialog', 'formatters', 'login'];
3
+ const contextFolders = ['chart', 'cloud-credential', 'content', 'detail', 'edit', 'list', 'machine-config', 'models', 'promptRemove', 'l10n', 'windowComponents', 'dialog', 'formatters', 'login'];
4
4
  const contextMap = contextFolders.reduce((map, obj) => {
5
5
  map[obj] = true;
6
6
 
package/plugins/axios.js CHANGED
@@ -1,7 +1,5 @@
1
1
  import https from 'https';
2
2
  import { CSRF } from '@shell/config/cookies';
3
- import { parse as setCookieParser } from 'set-cookie-parser';
4
- import pkg from '../package.json';
5
3
 
6
4
  export default function({
7
5
  $axios, $cookies, isDev, req
@@ -15,42 +13,8 @@ export default function({
15
13
  if ( csrf ) {
16
14
  config.headers['x-api-csrf'] = csrf;
17
15
  }
18
-
19
- if ( process.server ) {
20
- config.headers.common['access-control-expose-headers'] = `set-cookie`;
21
- config.headers.common['user-agent'] = `Dashboard (Mozilla) v${ pkg.version }`;
22
-
23
- if ( req.headers.cookie ) {
24
- config.headers.common['cookies'] = req.headers.cookie;
25
- }
26
-
27
- if ( config.url.startsWith('/') ) {
28
- config.baseURL = `${ req.protocol || 'https' }://${ req.headers.host }`;
29
- }
30
- }
31
16
  });
32
17
 
33
- if ( process.server ) {
34
- $axios.onResponse((res) => {
35
- const parsed = setCookieParser(res.headers['set-cookie'] || []);
36
-
37
- for ( const opt of parsed ) {
38
- const key = opt.name;
39
- const value = opt.value;
40
-
41
- delete opt.name;
42
- delete opt.value;
43
-
44
- opt.encode = (x) => x;
45
- opt.sameSite = true;
46
- opt.path = '/';
47
- opt.secure = true;
48
-
49
- $cookies.set(key, value, opt);
50
- }
51
- });
52
- }
53
-
54
18
  if ( isDev ) {
55
19
  // https://github.com/nuxt-community/axios-module/blob/dev/lib/module.js#L78
56
20
  // forces localhost to http, for no obvious reason.
@@ -1,5 +1,3 @@
1
- if ( process.client ) {
2
- window.addEventListener('popstate', () => {
3
- window._popStateDetected = true;
4
- });
5
- }
1
+ window.addEventListener('popstate', () => {
2
+ window._popStateDetected = true;
3
+ });
@@ -1,5 +1,5 @@
1
1
  // Share codemirror with plugins
2
2
 
3
- if ( process.client && !window.__codeMirrorLoader ) {
3
+ if ( !window.__codeMirrorLoader ) {
4
4
  window.__codeMirrorLoader = () => import(/* webpackChunkName: "codemirror" */ '@shell/plugins/codemirror');
5
5
  }
@@ -125,6 +125,47 @@ CodeMirror.defineExtension('foldLinesMatching', function(regex) {
125
125
  });
126
126
  });
127
127
 
128
+ function countSpaces(line) {
129
+ for (let i = 0; i < line.length; i++) {
130
+ if (line[i] !== ' ') {
131
+ return i;
132
+ }
133
+ }
134
+
135
+ return line.length;
136
+ }
137
+
138
+ CodeMirror.defineExtension('foldYaml', function(path) {
139
+ this.operation(() => {
140
+ let elements = [];
141
+
142
+ for (let i = this.firstLine(), e = this.lastLine(); i <= e; i++) {
143
+ const line = this.getLine(i);
144
+ const index = countSpaces(line);
145
+ const trimmed = line.trim();
146
+
147
+ if (trimmed.endsWith(':') || trimmed.endsWith(': >-')) {
148
+ const name = trimmed.split(':')[0].substr(0, trimmed.length - 1);
149
+
150
+ // Remove all elements of the same are greater index
151
+ elements = elements.filter((e) => e.index < index);
152
+
153
+ // Add on this one
154
+ elements.push({
155
+ index,
156
+ name
157
+ });
158
+
159
+ const currentPath = elements.map((e) => e.name).join('.');
160
+
161
+ if (currentPath === path) {
162
+ this.foldCode(CodeMirror.Pos(i, 0), null, 'fold');
163
+ }
164
+ }
165
+ }
166
+ });
167
+ });
168
+
128
169
  CodeMirror.registerHelper('fold', 'yamlcomments', (cm, start) => {
129
170
  if ( !isLineComment(cm, start.line) ) {
130
171
  return;
@@ -1,4 +1,4 @@
1
- import { batchChanges } from '@shell/plugins/dashboard-store/mutations';
1
+ import { batchChanges } from '@shell/plugins/dashboard-store/mutations.js';
2
2
  import { POD, WORKLOAD_TYPES } from '@shell/config/types';
3
3
  import Resource from '@shell/plugins/dashboard-store/resource-class';
4
4
 
@@ -0,0 +1,49 @@
1
+ import Resource from '@shell/plugins/dashboard-store/resource-class.js';
2
+ import { resourceClassJunkObject } from '@shell/plugins/dashboard-store/__tests__/utils/store-mocks';
3
+
4
+ describe('class: Resource', () => {
5
+ describe('given custom resource keys', () => {
6
+ const customResource = resourceClassJunkObject;
7
+
8
+ it('should keep internal keys', () => {
9
+ const resource = new Resource(customResource, {
10
+ getters: { schemaFor: () => ({ linkFor: jest.fn() }) },
11
+ dispatch: jest.fn(),
12
+ rootGetters: { 'i18n/t': jest.fn() },
13
+ });
14
+
15
+ expect({ ...resource }).toStrictEqual(customResource);
16
+ });
17
+
18
+ describe('method: save', () => {
19
+ it('should remove all the internal keys', async() => {
20
+ const dispatch = jest.fn();
21
+ const resource = new Resource(customResource, {
22
+ getters: { schemaFor: () => ({ linkFor: jest.fn() }) },
23
+ dispatch,
24
+ rootGetters: { 'i18n/t': jest.fn() },
25
+ });
26
+
27
+ const expectation = { type: customResource.type };
28
+
29
+ await resource.save();
30
+
31
+ const opt = {
32
+ data: expectation,
33
+ headers: {
34
+ accept: 'application/json',
35
+ 'content-type': 'application/json',
36
+ },
37
+ method: 'post',
38
+ url: undefined,
39
+ };
40
+
41
+ // Data sent should have been cleaned
42
+ expect(dispatch).toHaveBeenCalledWith('request', { opt, type: customResource.type });
43
+
44
+ // Original workload model should remain unchanged
45
+ expect({ ...resource }).toStrictEqual(customResource);
46
+ });
47
+ });
48
+ });
49
+ });
@@ -0,0 +1,7 @@
1
+ const customType = 'dsaf';
2
+
3
+ export const resourceClassJunkObject = {
4
+ type: customType,
5
+ __rehydrate: 'whatever',
6
+ __clone: 'whatever',
7
+ };
@@ -15,7 +15,8 @@ export const _ALL_IF_AUTHED = 'allIfAuthed';
15
15
  export const _NONE = 'none';
16
16
 
17
17
  const SCHEMA_CHECK_RETRIES = 15;
18
- const SCHEMA_CHECK_RETRY_LOG = 10;
18
+ const HAVE_ALL_CHECK_RETRIES = 15;
19
+ const RETRY_LOG = 10;
19
20
 
20
21
  export async function handleSpoofedRequest(rootGetters, schemaStore, opt, product) {
21
22
  // Handle spoofed types instead of making an actual request
@@ -70,6 +71,10 @@ export async function loadSchemas(ctx, watch = true) {
70
71
  return all;
71
72
  }
72
73
 
74
+ const findAllGetter = (getters, type, opt) => {
75
+ return opt.namespaced ? getters.matching(type, null, opt.namespaced, { skipSelector: true }) : getters.all(type);
76
+ };
77
+
73
78
  export default {
74
79
  request() {
75
80
  throw new Error('Not Implemented');
@@ -163,7 +168,7 @@ export default {
163
168
  dispatch('watch', args);
164
169
  }
165
170
 
166
- return getters.all(type);
171
+ return findAllGetter(getters, type, opt);
167
172
  }
168
173
 
169
174
  let load = (opt.load === undefined ? _ALL : opt.load);
@@ -328,7 +333,7 @@ export default {
328
333
  dispatch('watch', args);
329
334
  }
330
335
 
331
- const all = getters.all(type);
336
+ const all = findAllGetter(getters, type, opt);
332
337
 
333
338
  if (!opt.incremental && opt.hasManualRefresh) {
334
339
  dispatch('resource-fetch/updateManualRefreshIsLoading', false, { root: true });
@@ -613,7 +618,7 @@ export default {
613
618
  schema = getters['schemaFor'](type);
614
619
 
615
620
  if (!schema) {
616
- if (tries === SCHEMA_CHECK_RETRY_LOG) {
621
+ if (tries === RETRY_LOG) {
617
622
  console.warn(`Schema for ${ type } not available... retrying...`); // eslint-disable-line no-console
618
623
  }
619
624
  await new Promise((resolve) => setTimeout(resolve, 1000));
@@ -628,6 +633,27 @@ export default {
628
633
  }
629
634
  },
630
635
 
636
+ async waitForHaveAll({ getters }, { type, throwError = false, attempts = HAVE_ALL_CHECK_RETRIES }) {
637
+ let tries = attempts;
638
+ let haveAll = null;
639
+
640
+ while (!haveAll && tries > 0) {
641
+ haveAll = getters['haveAll'](type);
642
+
643
+ if (!haveAll) {
644
+ if (tries === RETRY_LOG) {
645
+ console.warn(`wait for all of ${ type } continuing...`); // eslint-disable-line no-console
646
+ }
647
+ await new Promise((resolve) => setTimeout(resolve, 1000));
648
+ tries--;
649
+ }
650
+ }
651
+
652
+ if (tries === 0 && throwError) {
653
+ throw new Error(`Failed to wait for all of ${ type }`);
654
+ }
655
+ },
656
+
631
657
  incrementLoadCounter({ commit }, resource) {
632
658
  commit('incrementLoadCounter', resource);
633
659
  },
@@ -12,24 +12,7 @@ export function classify(ctx, obj, isClone = false) {
12
12
 
13
13
  const customModel = ctx.getters['classify'](obj);
14
14
 
15
- const out = new customModel(obj, ctx, (process.server ? ctx.state.config.namespace : null), isClone);
16
-
17
- if ( process.server ) {
18
- Object.defineProperty(obj, '__rehydrate', {
19
- value: ctx.state.config.namespace,
20
- enumerable: true,
21
- configurable: true
22
- });
23
-
24
- if ( isClone ) {
25
- Object.defineProperty(obj, '__clone', {
26
- value: true,
27
- enumerable: true,
28
- configurable: true,
29
- writable: true
30
- });
31
- }
32
- }
15
+ const out = new customModel(obj, ctx, null, isClone);
33
16
 
34
17
  return out;
35
18
  }
@@ -64,19 +64,24 @@ export default {
64
64
  return state.types[type].list;
65
65
  },
66
66
 
67
- matching: (state, getters, rootState) => (type, selector, namespace) => {
68
- let all = getters['all'](type);
67
+ matching: (state, getters, rootState) => (type, selector, namespace, config = { skipSelector: false }) => {
68
+ let matching = getters['all'](type);
69
69
 
70
70
  // Filter first by namespace if one is provided, since this is efficient
71
- if (namespace) {
72
- all = all.filter((obj) => obj.namespace === namespace);
71
+ if (namespace && typeof namespace === 'string') {
72
+ matching = matching.filter((obj) => obj.namespace === namespace);
73
73
  }
74
74
 
75
75
  garbageCollect.gcUpdateLastAccessed({
76
76
  state, getters, rootState
77
77
  }, type);
78
78
 
79
- return all.filter((obj) => {
79
+ // Looks like a falsy selector is a thing, so if we're not interested in filtering by the selector... explicitly avoid it
80
+ if (config.skipSelector) {
81
+ return matching;
82
+ }
83
+
84
+ return matching.filter((obj) => {
80
85
  return matches(obj, selector);
81
86
  });
82
87
  },
@@ -33,21 +33,9 @@ export default (vuexModule, config, init) => {
33
33
  const namespace = config.namespace || '';
34
34
 
35
35
  return function(store) {
36
- // const inst = SteveFactory(namespace, config.baseUrl);
37
-
38
36
  store.registerModule(namespace, vuexModule);
39
37
  store.commit(`${ namespace }/applyConfig`, config);
40
38
 
41
- if ( !process.client ) {
42
- return;
43
- }
44
-
45
- // store.subscribe(({ type }, state) => {
46
- // if ( type === 'auth/loggedOut' ) {
47
- // store.dispatch(`${ namespace }/unsubscribe`);
48
- // }
49
- // });
50
-
51
39
  const module = store._modules.root._children[namespace];
52
40
  const fromServer = window.__NUXT__;
53
41