@rancher/shell 3.0.5-rc.5 → 3.0.5-rc.6

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 (312) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/key.svg +17 -0
  3. package/assets/styles/base/_spacing.scss +2 -2
  4. package/assets/styles/global/_form.scss +1 -1
  5. package/assets/styles/global/_labeled-input.scss +1 -1
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/vendor/vue-select.scss +1 -1
  9. package/assets/translations/en-us.yaml +404 -64
  10. package/assets/translations/zh-hans.yaml +3 -4
  11. package/cloud-credential/gcp.vue +9 -1
  12. package/components/AppModal.vue +2 -0
  13. package/components/CodeMirror.vue +1 -1
  14. package/components/ConfigMapSettings/Settings.vue +377 -0
  15. package/components/ConfigMapSettings/index.vue +354 -0
  16. package/components/CruResource.vue +1 -2
  17. package/components/DetailText.vue +61 -11
  18. package/components/Drawer/Chrome.vue +116 -0
  19. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  20. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  21. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  22. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  23. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +82 -0
  24. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  25. package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
  26. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  27. package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
  28. package/components/GrowlManager.vue +16 -15
  29. package/components/IconOrSvg.vue +5 -0
  30. package/components/KeyValueView.vue +1 -1
  31. package/components/LocaleSelector.vue +9 -1
  32. package/components/ProgressBarMulti.vue +1 -0
  33. package/components/PromptModal.vue +6 -1
  34. package/components/RelatedResources.vue +4 -12
  35. package/components/Resource/Detail/Additional.vue +46 -0
  36. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
  37. package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
  38. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  39. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +37 -254
  40. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
  41. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +27 -5
  42. package/components/Resource/Detail/Metadata/KeyValue.vue +25 -17
  43. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
  44. package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
  45. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
  46. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
  47. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  48. package/components/Resource/Detail/Metadata/composables.ts +60 -11
  49. package/components/Resource/Detail/Metadata/index.vue +12 -5
  50. package/components/Resource/Detail/Page.vue +15 -0
  51. package/components/Resource/Detail/ResourceRow.vue +37 -18
  52. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  53. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  54. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  55. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  56. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  57. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  58. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  59. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  60. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  61. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  62. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  63. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  64. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  65. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  66. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  67. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  68. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  69. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  70. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  71. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  72. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  73. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  74. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  75. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  76. package/components/Resource/Detail/TitleBar/Title.vue +2 -1
  77. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
  78. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
  79. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  80. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
  81. package/components/Resource/Detail/TitleBar/composables.ts +44 -0
  82. package/components/Resource/Detail/TitleBar/index.vue +83 -11
  83. package/components/Resource/Detail/composables.ts +45 -0
  84. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  85. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  86. package/components/ResourceDetail/Masthead/index.vue +65 -0
  87. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  88. package/components/ResourceDetail/__tests__/index.test.ts +26 -5
  89. package/components/ResourceDetail/index.vue +30 -16
  90. package/components/ResourceDetail/legacy.vue +18 -1
  91. package/components/ResourceList/Masthead.vue +6 -0
  92. package/components/ResourceYaml.vue +14 -1
  93. package/components/SlideInPanelManager.vue +46 -7
  94. package/components/StateDot/index.vue +28 -0
  95. package/components/Tabbed/index.vue +11 -15
  96. package/components/Wizard.vue +4 -2
  97. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  98. package/components/__tests__/GrowlManager.test.ts +0 -25
  99. package/components/auth/login/ldap.vue +1 -1
  100. package/components/fleet/FleetApplications.vue +0 -7
  101. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  102. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  103. package/components/fleet/FleetClusters.vue +25 -6
  104. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  105. package/components/fleet/FleetHelmOps.vue +8 -0
  106. package/components/fleet/FleetRepos.vue +1 -6
  107. package/components/fleet/FleetResources.vue +4 -5
  108. package/components/fleet/FleetValuesFrom.vue +295 -0
  109. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  110. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  111. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +13 -13
  112. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  113. package/components/fleet/dashboard/ResourceCard.vue +1 -0
  114. package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
  115. package/components/fleet/dashboard/ResourceDetails.vue +8 -10
  116. package/components/fleet/dashboard/ResourcePanel.vue +15 -8
  117. package/components/form/ArrayList.vue +13 -2
  118. package/components/form/ChangePassword.vue +3 -1
  119. package/components/form/Footer.vue +10 -4
  120. package/components/form/KeyValue.vue +81 -43
  121. package/components/form/LabeledSelect.vue +56 -16
  122. package/components/form/Labels.vue +90 -17
  123. package/components/form/MatchExpressions.vue +46 -5
  124. package/components/form/NameNsDescription.vue +1 -1
  125. package/components/form/ResourceSelector.vue +1 -0
  126. package/components/form/ResourceTabs/index.vue +5 -0
  127. package/components/form/SecretSelector.vue +9 -2
  128. package/components/form/Select.vue +57 -19
  129. package/components/form/SimpleSecretSelector.vue +9 -2
  130. package/components/form/Taints.vue +21 -2
  131. package/components/form/UnitInput.vue +8 -0
  132. package/components/form/ValueFromResource.vue +1 -1
  133. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  134. package/components/form/__tests__/Labels.test.ts +360 -0
  135. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  136. package/components/form/__tests__/Select.test.ts +5 -2
  137. package/components/formatter/FleetApplicationSource.vue +1 -1
  138. package/components/formatter/WorkloadHealthScale.vue +1 -1
  139. package/components/google/AccountAccess.vue +211 -0
  140. package/components/google/types/gcp.d.ts +136 -0
  141. package/components/google/types/index.d.ts +101 -0
  142. package/components/google/util/__mocks__/gcp.ts +465 -0
  143. package/components/google/util/formatter.ts +82 -0
  144. package/components/google/util/gcp.ts +134 -0
  145. package/components/google/util/index.d.ts +11 -0
  146. package/components/nav/Favorite.vue +1 -1
  147. package/components/nav/Group.vue +70 -47
  148. package/components/nav/Header.vue +5 -1
  149. package/components/nav/NamespaceFilter.vue +13 -1
  150. package/components/nav/NotificationCenter/Notification.vue +510 -0
  151. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  152. package/components/nav/NotificationCenter/index.vue +148 -0
  153. package/composables/drawer.ts +26 -0
  154. package/composables/resources.test.ts +63 -0
  155. package/composables/resources.ts +38 -0
  156. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  157. package/config/labels-annotations.js +6 -0
  158. package/config/product/auth.js +16 -1
  159. package/config/product/{cis.js → compliance.js} +23 -26
  160. package/config/product/explorer.js +5 -1
  161. package/config/product/fleet.js +7 -0
  162. package/config/product/settings.js +22 -11
  163. package/config/query-params.js +3 -0
  164. package/config/roles.ts +1 -1
  165. package/config/router/navigation-guards/authentication.js +51 -2
  166. package/config/router/routes.js +27 -31
  167. package/config/settings.ts +21 -3
  168. package/config/store.js +2 -0
  169. package/config/system-namespaces.js +1 -1
  170. package/config/table-headers.js +2 -2
  171. package/config/types.js +15 -6
  172. package/core/plugin.ts +32 -7
  173. package/core/types.ts +18 -1
  174. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  175. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  176. package/detail/management.cattle.io.oidcclient.vue +369 -0
  177. package/detail/node.vue +2 -2
  178. package/detail/pod.vue +2 -2
  179. package/detail/service.vue +10 -1
  180. package/detail/workload/index.vue +8 -2
  181. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  182. package/dialog/GenericPrompt.vue +1 -1
  183. package/dialog/ImportDialog.vue +8 -8
  184. package/dialog/OidcClientSecretDialog.vue +117 -0
  185. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  186. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
  187. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  188. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  189. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  190. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  191. package/edit/configmap.vue +4 -1
  192. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  193. package/edit/fleet.cattle.io.gitrepo.vue +44 -222
  194. package/edit/fleet.cattle.io.helmop.vue +44 -269
  195. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  196. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  197. package/edit/logging-flow/index.vue +1 -0
  198. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  199. package/edit/management.cattle.io.fleetworkspace.vue +1 -0
  200. package/edit/management.cattle.io.oidcclient.vue +162 -0
  201. package/edit/management.cattle.io.project.vue +4 -1
  202. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  203. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  204. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  205. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  206. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  207. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  208. package/edit/monitoring.coreos.com.route.vue +1 -0
  209. package/edit/namespace.vue +1 -0
  210. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  211. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  212. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  213. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  214. package/edit/node.vue +1 -0
  215. package/edit/persistentvolume/index.vue +4 -1
  216. package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
  217. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
  218. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  219. package/edit/resources.cattle.io.restore.vue +1 -1
  220. package/edit/secret/index.vue +1 -0
  221. package/edit/service.vue +4 -1
  222. package/edit/serviceaccount.vue +4 -1
  223. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  224. package/edit/workload/index.vue +5 -0
  225. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  226. package/list/management.cattle.io.oidcclient.vue +108 -0
  227. package/list/node.vue +2 -0
  228. package/machine-config/amazonec2.vue +3 -24
  229. package/machine-config/components/GCEImage.vue +374 -0
  230. package/machine-config/google.vue +617 -0
  231. package/mixins/__tests__/brand.spec.ts +170 -0
  232. package/mixins/brand.js +16 -17
  233. package/mixins/create-edit-view/index.js +5 -0
  234. package/mixins/resource-fetch-api-pagination.js +16 -0
  235. package/mixins/vue-select-overrides.js +1 -0
  236. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  237. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  238. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  239. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  240. package/models/fleet-application.js +8 -79
  241. package/models/fleet.cattle.io.cluster.js +11 -0
  242. package/models/fleet.cattle.io.gitrepo.js +2 -2
  243. package/models/fleet.cattle.io.helmop.js +9 -39
  244. package/models/management.cattle.io.fleetworkspace.js +2 -1
  245. package/models/management.cattle.io.oidcclient.js +18 -0
  246. package/models/management.cattle.io.registration.js +3 -0
  247. package/models/provisioning.cattle.io.cluster.js +5 -5
  248. package/models/service.js +4 -0
  249. package/models/workload.js +5 -0
  250. package/package.json +1 -1
  251. package/pages/about.vue +4 -58
  252. package/pages/auth/login.vue +1 -1
  253. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
  254. package/pages/c/_cluster/apps/charts/index.vue +285 -81
  255. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  256. package/pages/c/_cluster/explorer/index.vue +3 -3
  257. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  258. package/pages/c/_cluster/fleet/application/create.vue +3 -2
  259. package/pages/c/_cluster/fleet/index.vue +94 -56
  260. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  261. package/pages/c/_cluster/longhorn/index.vue +5 -2
  262. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  263. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  264. package/pages/explorer/resource/detail/configmap.vue +30 -7
  265. package/pages/explorer/resource/detail/secret.vue +50 -0
  266. package/pages/home.vue +9 -55
  267. package/pages/support/index.vue +4 -6
  268. package/plugins/dashboard-store/actions.js +19 -5
  269. package/plugins/dashboard-store/getters.js +4 -0
  270. package/plugins/dashboard-store/resource-class.js +16 -2
  271. package/plugins/steve/steve-pagination-utils.ts +26 -18
  272. package/plugins/steve/subscribe.js +6 -1
  273. package/rancher-components/Banner/Banner.vue +13 -0
  274. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
  275. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  276. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  277. package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
  278. package/store/auth.js +2 -0
  279. package/store/catalog.js +23 -1
  280. package/store/growl.js +97 -8
  281. package/store/index.js +6 -0
  282. package/store/notifications.ts +426 -0
  283. package/store/prefs.js +0 -1
  284. package/store/type-map.js +19 -16
  285. package/store/uiplugins.ts +15 -1
  286. package/types/fleet.d.ts +24 -0
  287. package/types/notifications/index.ts +74 -0
  288. package/types/shell/index.d.ts +46 -32
  289. package/types/store/dashboard-store.types.ts +16 -0
  290. package/utils/__tests__/fleet.test.ts +148 -0
  291. package/utils/__tests__/object.test.ts +54 -1
  292. package/utils/__tests__/string.test.ts +273 -1
  293. package/utils/__tests__/time.test.ts +31 -0
  294. package/utils/auth.js +9 -2
  295. package/utils/crypto/encryption.ts +103 -0
  296. package/utils/cspAdaptor.ts +51 -0
  297. package/utils/fleet.ts +54 -65
  298. package/utils/object.js +36 -0
  299. package/utils/pagination-utils.ts +1 -1
  300. package/utils/release-notes.ts +48 -0
  301. package/utils/selector-typed.ts +7 -2
  302. package/utils/string.js +24 -0
  303. package/utils/{time.js → time.ts} +25 -6
  304. package/utils/uiplugins.ts +22 -0
  305. package/utils/validators/formRules/index.ts +3 -0
  306. package/components/Resource/Detail/TitleBar/composable.ts +0 -31
  307. package/config/product/legacy.js +0 -62
  308. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  309. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  310. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  311. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
  312. /package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
@@ -0,0 +1,170 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import { CATALOG, MANAGEMENT } from '@shell/config/types';
3
+ import Brand from '@shell/mixins/brand';
4
+
5
+ describe('brandMixin', () => {
6
+ const createWrapper = (vaiOn = false) => {
7
+ const Component = {
8
+ template: '<div></div>',
9
+ mixins: [Brand],
10
+ };
11
+
12
+ const data = {
13
+ apps: null, haveAppsAndSettings: null, canPaginate: false
14
+ };
15
+
16
+ const store = {
17
+ dispatch: (action, ...args) => {
18
+ switch (action) {
19
+ case 'management/findAll':
20
+ if (args[0] === MANAGEMENT.SETTING) {
21
+ return [];
22
+ }
23
+ if (args[0] === CATALOG.APP) {
24
+ return [];
25
+ }
26
+ break;
27
+ }
28
+ },
29
+ getters: {
30
+ 'auth/loggedIn': () => true,
31
+ 'auth/fromHeader': () => false,
32
+ 'management/byId': () => undefined,
33
+ 'management/canList': () => () => true,
34
+ 'management/schemaFor': (type: string) => {
35
+ switch (type) {
36
+ case MANAGEMENT.SETTING:
37
+ return { linkFor: () => undefined };
38
+ }
39
+ },
40
+ 'management/generation': () => undefined,
41
+ 'management/paginationEnabled': () => vaiOn,
42
+ 'management/all': (type: string) => {
43
+ switch (type) {
44
+ case MANAGEMENT.SETTING:
45
+ return [];
46
+ }
47
+ },
48
+ }
49
+ };
50
+
51
+ const wrapper = mount(
52
+ Component,
53
+ {
54
+ data: () => data,
55
+ global: { mocks: { $store: store } }
56
+ });
57
+ const spyManagementFindAll = jest.spyOn(store, 'dispatch');
58
+
59
+ return {
60
+ wrapper,
61
+ store,
62
+ spyManagementFindAll,
63
+ };
64
+ };
65
+
66
+ describe('should make correct requests', () => {
67
+ it('vai off', async() => {
68
+ const { wrapper, spyManagementFindAll } = createWrapper(false);
69
+
70
+ // NOTE - wrapper.vm.$options.fetch() doesn't work
71
+ await wrapper.vm.$options.fetch.apply(wrapper.vm);
72
+
73
+ // wrapper.vm.$nextTick();
74
+ expect(spyManagementFindAll).toHaveBeenNthCalledWith(1, 'management/findAll', {
75
+ type: MANAGEMENT.SETTING,
76
+ opt: {
77
+ load: 'multi', redirectUnauthorized: false, url: `/v1/${ MANAGEMENT.SETTING }s`
78
+ }
79
+ });
80
+ expect(spyManagementFindAll).toHaveBeenNthCalledWith(2, 'management/findAll', { type: CATALOG.APP });
81
+ });
82
+
83
+ it('vai on', async() => {
84
+ const { wrapper, spyManagementFindAll } = createWrapper(true);
85
+
86
+ // NOTE - wrapper.vm.$options.fetch() doesn't work
87
+ await wrapper.vm.$options.fetch.apply(wrapper.vm);
88
+
89
+ expect(spyManagementFindAll).toHaveBeenNthCalledWith(1, 'management/findAll', {
90
+ type: MANAGEMENT.SETTING,
91
+ opt: {
92
+ load: 'multi', url: `/v1/${ MANAGEMENT.SETTING }s`, redirectUnauthorized: false
93
+ }
94
+ });
95
+ expect(spyManagementFindAll).toHaveBeenNthCalledWith(2, 'management/findPage', {
96
+ type: CATALOG.APP,
97
+ opt: {
98
+ pagination: {
99
+ filters: [{
100
+ equals: true,
101
+ fields: [{
102
+ equals: true, exact: true, field: 'metadata.name', value: 'rancher-csp-adapter'
103
+ }, {
104
+ equals: true, exact: true, field: 'metadata.name', value: 'rancher-csp-billing-adapter'
105
+ }],
106
+ param: 'filter'
107
+ }],
108
+ labelSelector: undefined,
109
+ page: null,
110
+ pageSize: null,
111
+ projectsOrNamespaces: [],
112
+ sort: []
113
+ }
114
+ }
115
+ });
116
+ });
117
+ });
118
+
119
+ describe('cspAdapter', () => {
120
+ it('should have correct csp values (off)', async() => {
121
+ const { wrapper, store } = createWrapper();
122
+
123
+ const spyManagementFindAll = jest.spyOn(store, 'dispatch').mockImplementation((_, options) => {
124
+ const { type } = options as any;
125
+
126
+ if (type === MANAGEMENT.SETTING) {
127
+ return Promise.resolve([]);
128
+ }
129
+ if (type === CATALOG.APP) {
130
+ return Promise.resolve([]);
131
+ }
132
+
133
+ return Promise.reject(new Error('reason'));
134
+ });
135
+
136
+ // NOTE - wrapper.vm.$options.fetch() doesn't work
137
+ await wrapper.vm.$options.fetch.apply(wrapper.vm, []);
138
+
139
+ expect(spyManagementFindAll).toHaveBeenCalledTimes(2);
140
+
141
+ expect(wrapper.vm.canCalcCspAdapter).toBeTruthy();
142
+ expect(wrapper.vm.cspAdapter).toBeFalsy();
143
+ });
144
+
145
+ it.each(['rancher-csp-adapter', 'rancher-csp-billing-adapter'])('should have correct csp values (on - %p )', async(chartName) => {
146
+ const { wrapper, store } = createWrapper();
147
+
148
+ const spyManagementFindAll = jest.spyOn(store, 'dispatch').mockImplementation((_, options) => {
149
+ const { type } = options as any;
150
+
151
+ if (type === MANAGEMENT.SETTING) {
152
+ return Promise.resolve([]);
153
+ }
154
+ if (type === CATALOG.APP) {
155
+ return Promise.resolve([{ metadata: { name: chartName } }]);
156
+ }
157
+
158
+ return Promise.reject(new Error('reason'));
159
+ });
160
+
161
+ // NOTE - wrapper.vm.$options.fetch() doesn't work
162
+ await wrapper.vm.$options.fetch.apply(wrapper.vm, []);
163
+
164
+ expect(spyManagementFindAll).toHaveBeenCalledTimes(2);
165
+
166
+ expect(wrapper.vm.canCalcCspAdapter).toBeTruthy();
167
+ expect(wrapper.vm.cspAdapter).toBeTruthy();
168
+ });
169
+ });
170
+ });
package/mixins/brand.js CHANGED
@@ -1,39 +1,38 @@
1
1
  import { mapGetters } from 'vuex';
2
- import { CATALOG, MANAGEMENT } from '@shell/config/types';
2
+ import { MANAGEMENT } from '@shell/config/types';
3
3
  import { SETTING } from '@shell/config/settings';
4
4
  import { createCssVars } from '@shell/utils/color';
5
5
  import { setTitle } from '@shell/config/private-label';
6
6
  import { setFavIcon, haveSetFavIcon } from '@shell/utils/favicon';
7
-
8
- const cspAdaptorApp = ['rancher-csp-adapter', 'rancher-csp-billing-adapter'];
9
-
10
- export const hasCspAdapter = (apps) => {
11
- return apps?.find((a) => cspAdaptorApp.includes(a.metadata?.name));
12
- };
7
+ import { allHash } from '@shell/utils/promise';
8
+ import { fetchInitialSettings } from '@shell/utils/settings';
9
+ import CspAdapterUtils from '@shell/utils/cspAdaptor';
13
10
 
14
11
  export default {
15
12
  async fetch() {
16
- // For the login page, the schemas won't be loaded - we don't need the apps in this case
17
13
  try {
18
- if (this.$store.getters['management/canList'](CATALOG.APP)) {
19
- this.apps = await this.$store.dispatch('management/findAll', { type: CATALOG.APP });
20
- }
21
- } catch (e) {}
14
+ const res = await allHash({
15
+ // Ensure we read the settings even when we are not authenticated
16
+ globalSettings: fetchInitialSettings(this.$store),
17
+ apps: CspAdapterUtils.fetchCspAdaptorApp(this.$store),
18
+ });
22
19
 
23
- // Ensure we read the settings even when we are not authenticated
24
- try {
25
20
  // The favicon is implicitly dependent on the initial settings having already been fetched
26
21
  if (!haveSetFavIcon()) {
27
22
  setFavIcon(this.$store);
28
23
  }
29
- } catch (e) {}
24
+
25
+ this.apps = res.apps;
26
+ } catch (e) { }
30
27
 
31
28
  // Setting this up front will remove `computed` churn, and we only care that we've initialised them
32
29
  this.haveAppsAndSettings = !!this.apps && !!this.globalSettings;
33
30
  },
34
31
 
35
32
  data() {
36
- return { apps: null, haveAppsAndSettings: null };
33
+ return {
34
+ apps: null, haveAppsAndSettings: null, canPaginate: false
35
+ };
37
36
  },
38
37
 
39
38
  computed: {
@@ -87,7 +86,7 @@ export default {
87
86
  // Note! this used to be `findBy(this.app)` however for that case we lost reactivity on the collection
88
87
  // (computed fires before fetch, fetch happens and update apps, computed would not fire again - even with vue.set)
89
88
  // So use `.find` in method instead
90
- return hasCspAdapter(this.apps);
89
+ return CspAdapterUtils.hasCspAdapter({ $store: this.$store, apps: this.apps });
91
90
  },
92
91
 
93
92
  canCalcCspAdapter() {
@@ -44,5 +44,10 @@ export default defineComponent({
44
44
  type: Boolean,
45
45
  default: false,
46
46
  },
47
+
48
+ useTabbedHash: {
49
+ type: Boolean,
50
+ default: undefined
51
+ }
47
52
  },
48
53
  });
@@ -7,6 +7,7 @@ import paginationUtils from '@shell/utils/pagination-utils';
7
7
  import debounce from 'lodash/debounce';
8
8
  import { PaginationParamFilter, PaginationFilterField, PaginationArgs } from '@shell/types/store/pagination.types';
9
9
  import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
10
+ import { STEVE_WATCH_MODE } from '@shell/types/store/subscribe.types';
10
11
 
11
12
  /**
12
13
  * Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
@@ -350,4 +351,19 @@ export default {
350
351
  });
351
352
  }
352
353
  },
354
+
355
+ unmounted() {
356
+ if (this.havePaginated) {
357
+ // of type @STEVE_WATCH_PARAMS
358
+ const watchArgs = {
359
+ type: this.resource,
360
+ mode: STEVE_WATCH_MODE.RESOURCE_CHANGES,
361
+ };
362
+
363
+ this.$store.dispatch(`${ this.inStore }/forgetType`, this.resource, (watchParams) => {
364
+ return watchParams.type === watchArgs.type &&
365
+ watchParams.mode === watchArgs.type.mode;
366
+ });
367
+ }
368
+ }
353
369
  };
@@ -20,6 +20,7 @@ export default {
20
20
  e.preventDefault();
21
21
  e.stopPropagation();
22
22
 
23
+ this.isOpen = false;
23
24
  vm.open = false;
24
25
  vm.search = '';
25
26
 
@@ -1,5 +1,5 @@
1
- import { NAME as PRODUCT_NAME } from '@shell/config/product/cis';
2
- import { CIS } from '@shell/config/types';
1
+ import { NAME as PRODUCT_NAME } from '@shell/config/product/compliance';
2
+ import { COMPLIANCE } from '@shell/config/types';
3
3
  import { findBy } from '@shell/utils/array';
4
4
  import { downloadFile, generateZip } from '@shell/utils/download';
5
5
  import { get, isEmpty } from '@shell/utils/object';
@@ -53,7 +53,7 @@ export default class ClusterScan extends SteveModel {
53
53
  action: 'downloadLatestReport',
54
54
  enabled: this.hasReport,
55
55
  icon: 'icon icon-fw icon-download',
56
- label: t('cis.downloadReport'),
56
+ label: t('compliance.downloadReport'),
57
57
  total: 1,
58
58
  };
59
59
 
@@ -61,7 +61,7 @@ export default class ClusterScan extends SteveModel {
61
61
  action: 'downloadAllReports',
62
62
  enabled: this.hasReport,
63
63
  icon: 'icon icon-fw icon-download',
64
- label: t('cis.downloadAllReports'),
64
+ label: t('compliance.downloadAllReports'),
65
65
  total: 1,
66
66
  };
67
67
 
@@ -69,7 +69,7 @@ export default class ClusterScan extends SteveModel {
69
69
  out.unshift({ divider: true });
70
70
  if (this.spec?.scheduledScanConfig?.cronSchedule) {
71
71
  out.unshift(downloadAllReports);
72
- downloadReport.label = t('cis.downloadLatestReport');
72
+ downloadReport.label = t('compliance.downloadLatestReport');
73
73
  }
74
74
  out.unshift(downloadReport);
75
75
  }
@@ -92,7 +92,7 @@ export default class ClusterScan extends SteveModel {
92
92
  get hasReports() {
93
93
  const { relationships = [] } = this.metadata;
94
94
 
95
- const reportRel = findBy(relationships, 'toType', CIS.REPORT);
95
+ const reportRel = findBy(relationships, 'toType', COMPLIANCE.REPORT);
96
96
 
97
97
  return !!reportRel;
98
98
  }
@@ -100,7 +100,7 @@ export default class ClusterScan extends SteveModel {
100
100
  async getReports() {
101
101
  const owned = await this.findOwned();
102
102
 
103
- const reports = owned.filter((obj) => obj.type === CIS.REPORT) || [];
103
+ const reports = owned.filter((obj) => obj.type === COMPLIANCE.REPORT) || [];
104
104
 
105
105
  return sortBy(reports, 'metadata.creationTimestamp', true);
106
106
  }
@@ -158,7 +158,7 @@ export default class ClusterScan extends SteveModel {
158
158
  return {
159
159
  name: 'c-cluster-product-resource-id',
160
160
  params: {
161
- resource: CIS.CLUSTER_SCAN_PROFILE,
161
+ resource: COMPLIANCE.CLUSTER_SCAN_PROFILE,
162
162
  product: PRODUCT_NAME,
163
163
  id: this.status?.lastRunScanProfileName
164
164
  }
@@ -3,7 +3,7 @@ import SteveModel from '@shell/plugins/steve/steve-class';
3
3
 
4
4
  export default class ClusterScanBenchmark extends SteveModel {
5
5
  warnDeletionMessage(toRemove = []) {
6
- return this.$rootGetters['i18n/t']('cis.deleteBenchmarkWarning', { count: toRemove.length });
6
+ return this.$rootGetters['i18n/t']('compliance.deleteBenchmarkWarning', { count: toRemove.length });
7
7
  }
8
8
 
9
9
  get isDefault() {
@@ -1,11 +1,11 @@
1
1
 
2
2
  import SteveModel from '@shell/plugins/steve/steve-class';
3
- import { NAME as PRODUCT_NAME } from '@shell/config/product/cis';
4
- import { CIS } from '@shell/config/types';
3
+ import { NAME as PRODUCT_NAME } from '@shell/config/product/compliance';
4
+ import { COMPLIANCE } from '@shell/config/types';
5
5
 
6
- export default class CISProfile extends SteveModel {
6
+ export default class ComplianceProfile extends SteveModel {
7
7
  warnDeletionMessage(toRemove = []) {
8
- return this.$rootGetters['i18n/t']('cis.deleteProfileWarning', { count: toRemove.length });
8
+ return this.$rootGetters['i18n/t']('compliance.deleteProfileWarning', { count: toRemove.length });
9
9
  }
10
10
 
11
11
  get numberTestsSkipped() {
@@ -19,7 +19,7 @@ export default class CISProfile extends SteveModel {
19
19
  return {
20
20
  name: 'c-cluster-product-resource-id',
21
21
  params: {
22
- resource: CIS.BENCHMARK,
22
+ resource: COMPLIANCE.BENCHMARK,
23
23
  product: PRODUCT_NAME,
24
24
  id: this.spec?.benchmarkVersion
25
25
  }
@@ -1,7 +1,7 @@
1
1
  import { compare } from '@shell/utils/sort';
2
2
  import SteveModel from '@shell/plugins/steve/steve-class';
3
3
 
4
- export default class CISReport extends SteveModel {
4
+ export default class ComplianceReport extends SteveModel {
5
5
  get aggregatedTests() {
6
6
  const json = this.parsedReport;
7
7
  const results = json?.results;
@@ -1,5 +1,4 @@
1
- import { convert, matching, convertSelectorObj } from '@shell/utils/selector';
2
- import jsyaml from 'js-yaml';
1
+ import { matching, convertSelectorObj } from '@shell/utils/selector';
3
2
  import isEmpty from 'lodash/isEmpty';
4
3
  import { escapeHtml } from '@shell/utils/string';
5
4
  import { FLEET, MANAGEMENT } from '@shell/config/types';
@@ -139,85 +138,11 @@ export default class FleetApplication extends SteveModel {
139
138
  }
140
139
 
141
140
  get targetInfo() {
142
- let mode = null;
143
- let cluster = null;
144
- let clusterGroup = null;
145
- let advanced = null;
146
-
147
- const targets = this.spec.targets || [];
148
-
149
- advanced = jsyaml.dump(targets);
150
-
151
- if (advanced === '[]\n') {
152
- advanced = `# - name:
153
- # clusterSelector:
154
- # matchLabels:
155
- # foo: bar
156
- # matchExpressions:
157
- # - key: foo
158
- # op: In
159
- # values: [bar, baz]
160
- # clusterGroup: foo
161
- # clusterGroupSelector:
162
- # matchLabels:
163
- # foo: bar
164
- # matchExpressions:
165
- # - key: foo
166
- # op: In
167
- # values: [bar, baz]
168
- `;
169
- }
170
-
171
- if (this.metadata.namespace === 'fleet-local') {
172
- mode = 'local';
173
- } else if (!targets.length) {
174
- mode = 'none';
175
- } else if (targets.length === 1) {
176
- const target = targets[0];
177
-
178
- if (Object.keys(target).length > 1) {
179
- // There are multiple properties in a single target, so use the 'advanced' mode
180
- // (otherwise any existing content is nuked for what we provide)
181
- mode = 'advanced';
182
- } else if (target.clusterGroup) {
183
- clusterGroup = target.clusterGroup;
184
-
185
- if (!mode) {
186
- mode = 'clusterGroup';
187
- }
188
- } else if (target.clusterName) {
189
- mode = 'cluster';
190
- cluster = target.clusterName;
191
- } else if (target.clusterSelector) {
192
- if (Object.keys(target.clusterSelector).length === 0) {
193
- mode = 'all';
194
- } else {
195
- const expressions = convert(target.clusterSelector.matchLabels, target.clusterSelector.matchExpressions);
196
-
197
- if (expressions.length === 1 &&
198
- expressions[0].key === FLEET_ANNOTATIONS.CLUSTER_NAME &&
199
- expressions[0].operator === 'In' &&
200
- expressions[0].values.length === 1
201
- ) {
202
- cluster = expressions[0].values[0];
203
- if (!mode) {
204
- mode = 'cluster';
205
- }
206
- }
207
- }
208
- }
209
- }
210
-
211
- if (!mode) {
212
- mode = 'advanced';
213
- }
141
+ const mode = FleetUtils.Application.getTargetMode(this.spec.targets || [], this.metadata.namespace);
214
142
 
215
143
  return {
216
144
  mode,
217
145
  modeDisplay: this.t(`fleet.gitRepo.targetDisplay."${ mode }"`),
218
- cluster,
219
- clusterGroup,
220
- advanced
221
146
  };
222
147
  }
223
148
 
@@ -361,17 +286,21 @@ export default class FleetApplication extends SteveModel {
361
286
  return this.status?.readyClusters || 0;
362
287
  }
363
288
 
289
+ get meta() {
290
+ return this.currentRoute()?.meta || {};
291
+ }
292
+
364
293
  get _detailLocation() {
365
294
  return {
366
295
  ...super._detailLocation,
367
- name: 'c-cluster-fleet-application-resource-namespace-id'
296
+ name: this.meta.detailLocation || super._detailLocation.name
368
297
  };
369
298
  }
370
299
 
371
300
  get doneOverride() {
372
301
  return {
373
302
  ...super.listLocation,
374
- name: 'c-cluster-fleet-application'
303
+ name: this.meta.doneOverride || super.listLocation.name
375
304
  };
376
305
  }
377
306
 
@@ -136,6 +136,17 @@ export default class FleetCluster extends SteveModel {
136
136
  };
137
137
  }
138
138
 
139
+ get helmOpsInfo() {
140
+ const ready = this.status?.readyHelmOps || 0;
141
+ const total = this.status?.desiredReadyHelmOps || 0;
142
+
143
+ return {
144
+ ready,
145
+ unready: total - ready,
146
+ total,
147
+ };
148
+ }
149
+
139
150
  get bundleInfo() {
140
151
  const bundlesData = {
141
152
  ready: 0,
@@ -118,10 +118,10 @@ export default class GitRepo extends FleetApplication {
118
118
 
119
119
  get resourceIcon() {
120
120
  if (this.github) {
121
- return FleetUtils.resourceIcons[FLEET.GIT_REPO];
121
+ return 'icon icon-github';
122
122
  }
123
123
 
124
- return '';
124
+ return FleetUtils.resourceIcons[FLEET.GIT_REPO];
125
125
  }
126
126
 
127
127
  get repoDisplay() {
@@ -57,34 +57,11 @@ export default class HelmOp extends FleetApplication {
57
57
  enabled: !!this.links.update && !this.spec?.disablePolling
58
58
  });
59
59
 
60
- insertAt(out, 4, {
61
- action: 'forceUpdate',
62
- label: this.t('fleet.helmOp.actions.forceUpdate.label'),
63
- icon: 'icon icon-refresh',
64
- bulkable: true,
65
- bulkAction: 'forceUpdateBulk',
66
- enabled: !!this.links.update
67
- });
68
-
69
60
  insertAt(out, 5, { divider: true });
70
61
 
71
62
  return out;
72
63
  }
73
64
 
74
- forceUpdate(resources = [this]) {
75
- this.$dispatch('promptModal', {
76
- componentProps: { helmOps: resources },
77
- component: 'HelmOpForceUpdateDialog'
78
- });
79
- }
80
-
81
- forceUpdateBulk(resources) {
82
- this.$dispatch('promptModal', {
83
- componentProps: { helmOps: resources },
84
- component: 'HelmOpForceUpdateDialog'
85
- });
86
- }
87
-
88
65
  get dashboardIcon() {
89
66
  return FleetUtils.dashboardIcons[FLEET.HELM_OP];
90
67
  }
@@ -124,7 +101,6 @@ export default class HelmOp extends FleetApplication {
124
101
 
125
102
  repo = repo.replace(/.git$/, '');
126
103
  repo = repo.replace(/^https:\/\//, '');
127
- repo = repo.replace(/^oci:\/\//, '');
128
104
  repo = repo.replace(/\/+$/, '');
129
105
 
130
106
  return repo;
@@ -140,16 +116,16 @@ export default class HelmOp extends FleetApplication {
140
116
  * chart: fleet-agent
141
117
  * version: 0.12.1-beta.2
142
118
  * oci:
143
- * chart: oci://ghcr.io/rancher/fleet-test-configmap-chart
119
+ * repo: oci://ghcr.io/rancher/fleet-test-configmap-chart
144
120
  * version: the-tag
145
121
  */
146
122
  get sourceType() {
147
- if (this.spec.helm?.repo && this.spec.helm?.chart) {
148
- return SOURCE_TYPE.REPO;
123
+ if (this.spec.helm?.repo?.startsWith('oci://')) {
124
+ return SOURCE_TYPE.OCI;
149
125
  }
150
126
 
151
- if (this.spec.helm?.chart?.startsWith('oci://')) {
152
- return SOURCE_TYPE.OCI;
127
+ if (this.spec.helm?.repo && this.spec.helm?.chart) {
128
+ return SOURCE_TYPE.REPO;
153
129
  }
154
130
 
155
131
  if (this.spec.helm?.chart) {
@@ -164,20 +140,14 @@ export default class HelmOp extends FleetApplication {
164
140
 
165
141
  switch (this.sourceType) {
166
142
  case SOURCE_TYPE.REPO:
143
+ case SOURCE_TYPE.OCI:
167
144
  value = this.spec.helm?.repo || '';
168
145
  break;
169
- case SOURCE_TYPE.OCI: {
170
- const parsed = parse(this.spec.helm?.chart || '');
171
-
172
- value = parsed?.host ? `oci://${ parsed?.host }` : '';
173
- break;
174
- }
175
146
  case SOURCE_TYPE.TARBALL:
176
- value = this.spec.helm?.chart || ''; // TODO ellipsis and tooltip
147
+ value = this.spec.helm?.chart || '';
177
148
  }
178
149
 
179
150
  const matchHttps = value.match(FleetUtils.HTTP_REGEX);
180
- const matchOCI = value.match(FleetUtils.OCI_REGEX);
181
151
  const matchSSH = value.match(FleetUtils.GIT_SSH_REGEX);
182
152
 
183
153
  if (matchSSH) {
@@ -190,7 +160,7 @@ export default class HelmOp extends FleetApplication {
190
160
  value,
191
161
  display: this.repoDisplay(value),
192
162
  icon: 'icon icon-application',
193
- showLink: matchHttps || matchSSH || matchOCI
163
+ showLink: matchHttps || matchSSH
194
164
  };
195
165
  }
196
166
 
@@ -203,7 +173,7 @@ export default class HelmOp extends FleetApplication {
203
173
  chart = this.spec.helm.chart || '';
204
174
  break;
205
175
  case SOURCE_TYPE.OCI: {
206
- const parsed = parse(this.spec.helm.chart || '');
176
+ const parsed = parse(this.spec.helm.repo || '');
207
177
 
208
178
  chart = parsed?.path ? parsed?.path.substring(1) : '';
209
179
  break;
@@ -15,7 +15,8 @@ export default class Workspace extends HybridModel {
15
15
  const out = {
16
16
  clusterGroups: summary[FLEET.CLUSTER_GROUP]?.namespaces?.[name]?.count || 0,
17
17
  clusters: summary[FLEET.CLUSTER]?.namespaces?.[name]?.count || 0,
18
- gitRepos: summary[FLEET.GIT_REPO]?.namespaces?.[name]?.count || 0
18
+ gitRepos: summary[FLEET.GIT_REPO]?.namespaces?.[name]?.count || 0,
19
+ helmOps: summary[FLEET.HELM_OP]?.namespaces?.[name]?.count || 0
19
20
  };
20
21
 
21
22
  return out;
@@ -0,0 +1,18 @@
1
+ import SteveModel from '@shell/plugins/steve/steve-class';
2
+
3
+ export default class OIDCClient extends SteveModel {
4
+ get details() {
5
+ return [
6
+ ...this._details, {
7
+ label: this.t('oidcclient.redirectURIs.label'),
8
+ content: this.spec.redirectURIs?.join(', ')
9
+ }, {
10
+ label: this.t('oidcclient.refreshTokenExpirationSeconds.detailLabel'),
11
+ content: this.spec.refreshTokenExpirationSeconds
12
+ }, {
13
+ label: this.t('oidcclient.tokenExpirationSeconds.detailLabel'),
14
+ content: this.spec.tokenExpirationSeconds
15
+ }
16
+ ];
17
+ }
18
+ }
@@ -0,0 +1,3 @@
1
+ import SteveDescriptionModel from '@shell/plugins/steve/steve-description-class';
2
+
3
+ export default class RancherRegistration extends SteveDescriptionModel { }