@rancher/shell 0.5.3 → 1.2.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 (356) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/images/providers/aks-black.svg +28 -0
  3. package/assets/images/providers/aks.svg +31 -0
  4. package/assets/styles/global/_labeled-input.scss +1 -0
  5. package/assets/styles/global/_layout.scss +0 -99
  6. package/assets/translations/en-us.yaml +76 -74
  7. package/assets/translations/zh-hans.yaml +25 -23
  8. package/babel.config.js +1 -7
  9. package/chart/gatekeeper.vue +11 -2
  10. package/chart/istio.vue +10 -1
  11. package/chart/logging/index.vue +11 -2
  12. package/chart/monitoring/alerting/index.vue +21 -7
  13. package/chart/monitoring/grafana/index.vue +2 -57
  14. package/chart/monitoring/index.vue +26 -52
  15. package/chart/monitoring/prometheus/index.vue +43 -37
  16. package/chart/rancher-backup/index.vue +10 -3
  17. package/cloud-credential/azure.vue +17 -4
  18. package/components/AsyncButton.vue +0 -9
  19. package/components/Carousel.vue +0 -1
  20. package/components/ChartPsp.vue +76 -0
  21. package/components/ClusterIconMenu.vue +9 -24
  22. package/components/CodeMirror.vue +16 -75
  23. package/components/CopyCode.vue +2 -6
  24. package/components/CopyToClipboard.vue +1 -2
  25. package/components/CopyToClipboardText.vue +9 -14
  26. package/components/CruResource.vue +0 -1
  27. package/components/EtcdInfoBanner.vue +5 -5
  28. package/components/ExplorerProjectsNamespaces.vue +1 -25
  29. package/components/FixedBanner.vue +0 -1
  30. package/components/IconOrSvg.vue +1 -1
  31. package/components/Markdown.vue +12 -16
  32. package/components/Questions/index.vue +1 -1
  33. package/components/ResourceDetail/Masthead.vue +9 -25
  34. package/components/ResourceDetail/index.vue +4 -1
  35. package/components/ResourceList/Masthead.vue +18 -1
  36. package/components/ResourceTable.vue +2 -14
  37. package/components/ResourceYaml.vue +5 -34
  38. package/components/SideNav.vue +65 -43
  39. package/components/SortableTable/THead.vue +9 -7
  40. package/components/SortableTable/index.vue +2 -1
  41. package/components/StatusTable.vue +1 -5
  42. package/components/TabTitle.vue +84 -0
  43. package/components/Tabbed/index.vue +0 -12
  44. package/components/YamlEditor.vue +0 -1
  45. package/components/__tests__/ChartPsp.test.ts +75 -0
  46. package/components/__tests__/CopyCode.test.ts +4 -5
  47. package/components/fleet/FleetBundles.vue +11 -5
  48. package/components/fleet/FleetRepos.vue +27 -62
  49. package/components/fleet/FleetResources.vue +1 -6
  50. package/components/fleet/FleetStatus.vue +3 -3
  51. package/components/fleet/FleetSummary.vue +30 -35
  52. package/components/form/ArrayList.vue +8 -1
  53. package/components/form/ArrayListSelect.vue +9 -9
  54. package/components/form/BannerSettings.vue +0 -3
  55. package/components/form/FileSelector.vue +0 -1
  56. package/components/form/KeyValue.vue +0 -2
  57. package/components/form/LabeledSelect.vue +0 -4
  58. package/components/form/Password.vue +1 -3
  59. package/components/form/Select.vue +1 -1
  60. package/components/form/SelectOrCreateAuthSecret.vue +4 -4
  61. package/components/form/__tests__/KeyValue.test.ts +1 -1
  62. package/components/formatter/Checked.vue +3 -11
  63. package/components/formatter/ClusterProvider.vue +18 -1
  64. package/components/formatter/FleetSummaryGraph.vue +11 -23
  65. package/components/formatter/LiveDate.vue +16 -0
  66. package/components/formatter/LiveDuration.vue +1 -1
  67. package/components/formatter/PercentageBar.vue +1 -1
  68. package/components/formatter/WorkloadDetailEndpoints.vue +22 -12
  69. package/components/formatter/__tests__/ClusterProvider.test.ts +28 -0
  70. package/components/nav/Group.vue +2 -2
  71. package/components/nav/Header.vue +2 -2
  72. package/components/nav/Jump.vue +9 -19
  73. package/components/nav/TopLevelMenu.vue +18 -66
  74. package/components/nav/Type.vue +7 -16
  75. package/components/nav/WindowManager/ContainerLogs.vue +19 -120
  76. package/components/nav/WindowManager/ContainerShell.vue +1 -6
  77. package/components/nav/WindowManager/index.vue +10 -11
  78. package/components/nav/__tests__/TopLevelMenu.test.ts +1 -34
  79. package/components/nav/__tests__/Type.test.ts +1 -31
  80. package/components/nuxt/nuxt-child.js +78 -14
  81. package/components/nuxt/nuxt.js +1 -1
  82. package/components/user.retention/user-retention-header.vue +34 -0
  83. package/composables/useI18n.ts +26 -0
  84. package/composables/useStore.ts +16 -0
  85. package/config/harvester-manager-types.js +0 -2
  86. package/config/home-links.js +32 -2
  87. package/config/private-label.js +0 -22
  88. package/config/product/explorer.js +4 -4
  89. package/config/product/fleet.js +1 -6
  90. package/config/product/legacy.js +1 -84
  91. package/config/product/manager.js +15 -8
  92. package/config/query-params.js +0 -1
  93. package/config/router.js +368 -385
  94. package/config/settings.ts +9 -2
  95. package/config/store.js +1 -1
  96. package/config/system-namespaces.js +0 -3
  97. package/config/table-headers.js +27 -47
  98. package/config/types.js +5 -0
  99. package/config/uiplugins.js +1 -1
  100. package/core/plugin-helpers.js +5 -3
  101. package/core/plugin-routes.ts +114 -56
  102. package/core/plugin.ts +10 -16
  103. package/core/plugins-loader.js +9 -7
  104. package/core/plugins.js +3 -0
  105. package/core/types-provisioning.ts +0 -7
  106. package/creators/app/init +0 -19
  107. package/detail/fleet.cattle.io.bundle.vue +1 -1
  108. package/detail/fleet.cattle.io.cluster.vue +1 -11
  109. package/detail/node.vue +0 -42
  110. package/detail/pod.vue +1 -68
  111. package/detail/provisioning.cattle.io.cluster.vue +8 -25
  112. package/detail/workload/index.vue +1 -15
  113. package/dialog/ScaleMachineDownDialog.vue +17 -34
  114. package/edit/auth/googleoauth.vue +5 -1
  115. package/edit/catalog.cattle.io.clusterrepo.vue +7 -20
  116. package/edit/cloudcredential.vue +0 -2
  117. package/edit/fleet.cattle.io.gitrepo.vue +4 -3
  118. package/edit/management.cattle.io.project.vue +52 -1
  119. package/edit/management.cattle.io.setting.vue +2 -32
  120. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  121. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -1
  122. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  123. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -12
  124. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +1 -2
  125. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  126. package/edit/provisioning.cattle.io.cluster/{tabs/Basics.vue → Basics.vue} +125 -106
  127. package/edit/provisioning.cattle.io.cluster/{tabs/MachinePool.vue → MachinePool.vue} +7 -1
  128. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +7 -15
  129. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +237 -0
  130. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.test.ts → CustomCommand.tests.ts} +0 -6
  131. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  132. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +1 -7
  133. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  134. package/edit/provisioning.cattle.io.cluster/index.vue +40 -109
  135. package/edit/provisioning.cattle.io.cluster/rke2.vue +689 -152
  136. package/edit/service.vue +0 -12
  137. package/edit/token.vue +0 -1
  138. package/edit/workload/Upgrading.vue +2 -3
  139. package/edit/workload/index.vue +1 -2
  140. package/edit/workload/mixins/workload.js +1 -1
  141. package/initialize/App.js +71 -25
  142. package/initialize/client.js +162 -21
  143. package/initialize/index.js +124 -47
  144. package/initialize/layouts.ts +26 -0
  145. package/{components/templates → layouts}/blank.vue +1 -1
  146. package/{components/templates → layouts}/default.vue +98 -8
  147. package/{components/templates → layouts}/error.vue +19 -10
  148. package/{components/templates → layouts}/home.vue +1 -4
  149. package/{components/templates → layouts}/plain.vue +1 -4
  150. package/{components/templates → layouts}/standalone.vue +1 -1
  151. package/{components/templates → layouts}/unauthenticated.vue +1 -1
  152. package/list/catalog.cattle.io.app.vue +0 -1
  153. package/list/management.cattle.io.feature.vue +7 -1
  154. package/list/management.cattle.io.setting.vue +0 -1
  155. package/list/management.cattle.io.user.vue +25 -1
  156. package/list/node.vue +0 -1
  157. package/machine-config/__tests__/vmwarevsphere.test.ts +161 -56
  158. package/machine-config/azure.vue +37 -21
  159. package/machine-config/vmwarevsphere.vue +47 -42
  160. package/middleware/authenticated.js +19 -14
  161. package/mixins/auth-config.js +7 -2
  162. package/mixins/brand.js +41 -29
  163. package/mixins/fetch.server.js +73 -0
  164. package/mixins/labeled-form-element.ts +1 -6
  165. package/models/__tests__/management.cattle.io.node.ts +0 -85
  166. package/models/__tests__/namespace.test.ts +9 -49
  167. package/models/cluster/node.js +4 -4
  168. package/models/cluster.x-k8s.io.machine.js +1 -1
  169. package/models/cluster.x-k8s.io.machinedeployment.js +0 -14
  170. package/models/fleet.cattle.io.cluster.js +0 -4
  171. package/models/fleet.cattle.io.gitrepo.js +13 -56
  172. package/models/management.cattle.io.cluster.js +3 -11
  173. package/models/management.cattle.io.kontainerdriver.js +0 -1
  174. package/models/management.cattle.io.node.js +14 -18
  175. package/models/management.cattle.io.nodepool.js +0 -17
  176. package/models/management.cattle.io.project.js +36 -0
  177. package/models/management.cattle.io.setting.js +7 -11
  178. package/models/management.cattle.io.user.js +65 -0
  179. package/models/namespace.js +1 -1
  180. package/models/pod.js +0 -20
  181. package/models/provisioning.cattle.io.cluster.js +9 -91
  182. package/models/secret.js +18 -126
  183. package/models/storage.k8s.io.storageclass.js +1 -1
  184. package/models/workload.js +0 -16
  185. package/models/workload.service.js +0 -18
  186. package/package.json +10 -12
  187. package/pages/about.vue +1 -0
  188. package/pages/account/create-key.vue +1 -0
  189. package/pages/account/index.vue +1 -0
  190. package/pages/auth/login.vue +1 -0
  191. package/pages/auth/logout.vue +2 -0
  192. package/pages/auth/setup.vue +4 -37
  193. package/pages/auth/verify.vue +8 -14
  194. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +17 -2
  195. package/pages/c/_cluster/apps/charts/index.vue +58 -64
  196. package/pages/c/_cluster/apps/charts/install.helpers.js +13 -2
  197. package/pages/c/_cluster/apps/charts/install.vue +5 -5
  198. package/pages/c/_cluster/apps/index.vue +2 -0
  199. package/pages/c/_cluster/auth/index.vue +2 -0
  200. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  201. package/pages/c/_cluster/ecm/index.vue +2 -0
  202. package/pages/c/_cluster/explorer/index.vue +53 -56
  203. package/pages/c/_cluster/explorer/tools/index.vue +3 -171
  204. package/pages/c/_cluster/fleet/index.vue +1 -1
  205. package/pages/c/_cluster/index.vue +2 -0
  206. package/pages/c/_cluster/manager/pages/_page.vue +5 -4
  207. package/pages/c/_cluster/monitoring/index.vue +1 -17
  208. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -1
  209. package/pages/c/_cluster/settings/banners.vue +2 -0
  210. package/pages/c/_cluster/settings/brand.vue +2 -3
  211. package/pages/c/_cluster/settings/index.vue +2 -0
  212. package/pages/c/_cluster/settings/links.vue +3 -2
  213. package/pages/c/_cluster/settings/performance.vue +1 -0
  214. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +1 -2
  215. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +46 -10
  216. package/pages/c/_cluster/uiplugins/index.vue +2 -0
  217. package/pages/c/index.vue +9 -0
  218. package/pages/diagnostic.vue +2 -1
  219. package/pages/fail-whale.vue +1 -0
  220. package/pages/prefs.vue +1 -0
  221. package/pages/rio/mesh.vue +508 -0
  222. package/pages/support/index.vue +8 -2
  223. package/pkg/auto-import.js +1 -1
  224. package/plugins/axios.js +36 -0
  225. package/plugins/back-button.js +5 -3
  226. package/plugins/clean-html-directive.js +19 -1
  227. package/plugins/clean-tooltip-directive.js +1 -1
  228. package/plugins/codemirror-loader.js +1 -1
  229. package/plugins/codemirror.js +0 -41
  230. package/plugins/dashboard-store/__tests__/{mutations.test.ts → mutations.spec.ts} +1 -1
  231. package/plugins/dashboard-store/actions.js +17 -16
  232. package/plugins/dashboard-store/classify.js +18 -1
  233. package/plugins/dashboard-store/getters.js +7 -70
  234. package/plugins/dashboard-store/index.js +12 -0
  235. package/plugins/dashboard-store/mutations.js +4 -0
  236. package/plugins/dashboard-store/resource-class.js +20 -65
  237. package/plugins/i18n.js +1 -1
  238. package/plugins/steve/__tests__/getters.spec.ts +48 -26
  239. package/plugins/steve/__tests__/subscribe.spec.ts +106 -0
  240. package/plugins/steve/actions.js +37 -3
  241. package/plugins/steve/getters.js +24 -7
  242. package/plugins/steve/mutations.js +5 -2
  243. package/plugins/steve/norman-class.js +0 -19
  244. package/plugins/steve/steve-class.js +0 -22
  245. package/plugins/steve/subscribe.js +34 -13
  246. package/plugins/transitions.js +4 -0
  247. package/plugins/vue-clipboard2.js +4 -0
  248. package/rancher-components/Accordion/Accordion.vue +3 -2
  249. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  250. package/rancher-components/Banner/Banner.test.ts +1 -5
  251. package/rancher-components/Banner/Banner.vue +2 -2
  252. package/rancher-components/Card/Card.vue +4 -4
  253. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  254. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  255. package/rancher-components/Form/LabeledInput/LabeledInput.vue +55 -24
  256. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  257. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  258. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  259. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  260. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  261. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  262. package/rancher-components/StringList/StringList.vue +8 -8
  263. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  264. package/rancher-components/components/BadgeState/BadgeState.test.ts +12 -0
  265. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +2 -19
  266. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +14 -11
  267. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +1 -1
  268. package/rancher-components/components/StringList/StringList.test.ts +0 -270
  269. package/rancher-components/components/StringList/StringList.vue +18 -57
  270. package/scripts/extension/bundle +7 -19
  271. package/scripts/extension/helm/scripts/package +3 -11
  272. package/scripts/extension/parse-tag-name +4 -4
  273. package/scripts/extension/publish +9 -20
  274. package/scripts/publish-shell.sh +1 -11
  275. package/scripts/test-plugins-build.sh +9 -85
  276. package/store/catalog.js +1 -1
  277. package/store/features.js +0 -1
  278. package/store/i18n.js +0 -11
  279. package/store/index.js +13 -11
  280. package/store/prefs.js +38 -33
  281. package/store/type-map.js +82 -157
  282. package/tsconfig.default.json +46 -0
  283. package/tsconfig.json +9 -35
  284. package/types/shell/index.d.ts +404 -465
  285. package/utils/axios.js +19 -0
  286. package/utils/create-yaml.js +1 -5
  287. package/utils/custom-validators.js +2 -0
  288. package/utils/error.js +1 -16
  289. package/utils/monitoring.js +2 -37
  290. package/utils/nuxt.js +39 -18
  291. package/utils/object.js +0 -24
  292. package/utils/router.scrollBehavior.js +14 -12
  293. package/utils/socket.js +1 -0
  294. package/utils/time.js +1 -1
  295. package/utils/title.ts +3 -0
  296. package/utils/url.ts +1 -1
  297. package/utils/validators/formRules/__tests__/index.test.ts +4 -49
  298. package/utils/validators/formRules/index.ts +9 -12
  299. package/utils/validators/setting.js +10 -6
  300. package/vue.config.js +3 -24
  301. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  302. package/components/Certificates.vue +0 -164
  303. package/components/__tests__/CodeMirror.spec.ts +0 -99
  304. package/components/fleet/__tests__/FleetSummary.test.ts +0 -316
  305. package/components/formatter/FleetClusterSummaryGraph.vue +0 -27
  306. package/components/formatter/__tests__/Checked.test.ts +0 -19
  307. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +0 -81
  308. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +0 -186
  309. package/composables/useCompactInput.ts +0 -20
  310. package/composables/useLabeledFormElement.ts +0 -138
  311. package/creators/app/files/.gitlab-ci.yml +0 -14
  312. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +0 -77
  313. package/edit/__tests__/service.test.ts +0 -89
  314. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +0 -112
  315. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +0 -473
  316. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +0 -73
  317. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +0 -386
  318. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +0 -137
  319. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +0 -157
  320. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +0 -135
  321. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +0 -189
  322. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +0 -147
  323. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +0 -76
  324. package/mixins/v1-workload-metrics.js +0 -43
  325. package/models/__tests__/management.cattle.io.cluster.test.ts +0 -23
  326. package/models/__tests__/management.cattle.io.nodepool.ts +0 -83
  327. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +0 -241
  328. package/models/__tests__/secret.test.ts +0 -37
  329. package/models/__tests__/storage.k8s.io.storageclass.test.ts +0 -22
  330. package/models/__tests__/workload.test.ts +0 -91
  331. package/plugins/clean-html.js +0 -53
  332. package/plugins/dashboard-store/__tests__/resource-class.test.ts +0 -49
  333. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +0 -7
  334. package/plugins/index.js +0 -11
  335. package/plugins/steve/__tests__/resource-utils.test.ts +0 -159
  336. package/plugins/steve/__tests__/steve-class.spec.ts +0 -59
  337. package/plugins/steve/__tests__/utils/steve-mocks.ts +0 -31
  338. package/plugins/steve/resource-utils.ts +0 -38
  339. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +0 -50
  340. package/server/har-file.js +0 -183
  341. package/store/__tests__/type-map.test.ts +0 -1122
  342. package/tsconfig.paths.json +0 -18
  343. package/utils/azure.js +0 -24
  344. package/utils/clipboard.js +0 -5
  345. /package/components/form/__tests__/{NameNsDescription.test.ts → NameNsDescription.ts} +0 -0
  346. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.test.ts → selectors.ts} +0 -0
  347. /package/edit/provisioning.cattle.io.cluster/{tabs/networking/ACE.vue → ACE.vue} +0 -0
  348. /package/edit/provisioning.cattle.io.cluster/{tabs/AgentConfiguration.vue → AgentConfiguration.vue} +0 -0
  349. /package/edit/provisioning.cattle.io.cluster/{tabs/upgrade/DrainOptions.vue → DrainOptions.vue} +0 -0
  350. /package/edit/provisioning.cattle.io.cluster/{tabs/MemberRoles.vue → MemberRoles.vue} +0 -0
  351. /package/edit/provisioning.cattle.io.cluster/{tabs/registries/RegistryConfigs.vue → RegistryConfigs.vue} +0 -0
  352. /package/edit/provisioning.cattle.io.cluster/{tabs/registries/RegistryMirrors.vue → RegistryMirrors.vue} +0 -0
  353. /package/edit/provisioning.cattle.io.cluster/{tabs/etcd/S3Config.vue → S3Config.vue} +0 -0
  354. /package/plugins/dashboard-store/__tests__/{actions.test.ts → actions.spec.ts} +0 -0
  355. /package/plugins/dashboard-store/__tests__/{getters.test.ts → getters.spec.ts} +0 -0
  356. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
@@ -0,0 +1,384 @@
1
+ <script lang="ts" setup>
2
+ import { ref, reactive, watch, onMounted } from 'vue';
3
+ import { useRouter, onBeforeRouteUpdate } from 'vue-router/composables';
4
+
5
+ import UserRetentionHeader from '@shell/components/user.retention/user-retention-header.vue';
6
+ import Footer from '@shell/components/form/Footer.vue';
7
+ import { useStore } from '@shell/composables/useStore';
8
+ import { useI18n } from '@shell/composables/useI18n';
9
+ import { MANAGEMENT } from '@shell/config/types';
10
+ import { SETTING } from '@shell/config/settings';
11
+ import { isAdminUser } from '@shell/store/type-map';
12
+
13
+ import Banner from '@components/Banner/Banner.vue';
14
+ import Checkbox from '@components/Form/Checkbox/Checkbox.vue';
15
+ import LabeledInput from '@components/Form/LabeledInput/LabeledInput.vue';
16
+ import { ToggleSwitch } from '@components/Form/ToggleSwitch';
17
+
18
+ import { isValidCron } from 'cron-validator';
19
+ import dayjs from 'dayjs';
20
+
21
+ type Links = {
22
+ remove: string;
23
+ self: string;
24
+ update: string;
25
+ view: string;
26
+ };
27
+
28
+ type FieldsV1 = {
29
+ 'f:customized': {};
30
+ 'f:default': {};
31
+ 'f:source': {};
32
+ 'f:value': {};
33
+ };
34
+
35
+ type ManagedFields = {
36
+ apiVersion: string;
37
+ fieldsType: string;
38
+ fieldsV1: FieldsV1;
39
+ manager: string;
40
+ operation: string;
41
+ time: string;
42
+ };
43
+
44
+ type Metadata = {
45
+ creationTimestamp: string;
46
+ fields: string[];
47
+ generation: number;
48
+ managedFields: ManagedFields[];
49
+ name: string;
50
+ relationships: null;
51
+ resourceVersion: string;
52
+ state: {
53
+ error: boolean;
54
+ message: string;
55
+ name: string;
56
+ transitioning: boolean;
57
+ };
58
+ uid: string;
59
+ };
60
+
61
+ type Setting = {
62
+ id: string;
63
+ type: string;
64
+ links: Links;
65
+ apiVersion: string;
66
+ customized: boolean;
67
+ default: string;
68
+ kind: string;
69
+ metadata: Metadata;
70
+ source: string;
71
+ value: string | null;
72
+ save: () => void;
73
+ };
74
+
75
+ const store = useStore();
76
+ const userRetentionSettings = reactive<{[id: string]: string | null }>({
77
+ [SETTING.DISABLE_INACTIVE_USER_AFTER]: null,
78
+ [SETTING.DELETE_INACTIVE_USER_AFTER]: null,
79
+ [SETTING.USER_RETENTION_CRON]: null,
80
+ [SETTING.USER_RETENTION_DRY_RUN]: null,
81
+ [SETTING.USER_LAST_LOGIN_DEFAULT]: null,
82
+ });
83
+ const disableAfterPeriod = ref(false);
84
+ const deleteAfterPeriod = ref(false);
85
+ const loading = ref(true);
86
+ let settings: { [id: string]: Setting } = {};
87
+
88
+ /**
89
+ * Watches the disable after period and removes the value if the checkbox is
90
+ * not selected. Lookup the value when the checkbox is selected.
91
+ */
92
+ watch(disableAfterPeriod, (newVal) => {
93
+ if (!newVal) {
94
+ userRetentionSettings[SETTING.DISABLE_INACTIVE_USER_AFTER] = null;
95
+
96
+ return;
97
+ }
98
+
99
+ userRetentionSettings[SETTING.DISABLE_INACTIVE_USER_AFTER] = settings[SETTING.DISABLE_INACTIVE_USER_AFTER].value;
100
+ });
101
+
102
+ /**
103
+ * Watches the delete after period and removes the value if the checkbox is
104
+ * not selected. Lookup the value when the checkbox is selected.
105
+ */
106
+ watch(deleteAfterPeriod, (newVal) => {
107
+ if (!newVal) {
108
+ userRetentionSettings[SETTING.DELETE_INACTIVE_USER_AFTER] = null;
109
+
110
+ return;
111
+ }
112
+
113
+ userRetentionSettings[SETTING.DELETE_INACTIVE_USER_AFTER] = settings[SETTING.DELETE_INACTIVE_USER_AFTER].value;
114
+ });
115
+
116
+ /**
117
+ * Watches both the disable and delete after periods. Clear all values in
118
+ * the form if both checkboxes are not selected. If one of the checkboxes
119
+ * are selected, lookup each of the values in the form.
120
+ */
121
+ watch([disableAfterPeriod, deleteAfterPeriod], ([newDisableAfterPeriod, newDeleteAfterPeriod]) => {
122
+ if (!newDisableAfterPeriod && !newDeleteAfterPeriod) {
123
+ ids.forEach((key) => {
124
+ userRetentionSettings[key] = null;
125
+ });
126
+
127
+ validateUserRetentionCron();
128
+
129
+ return;
130
+ }
131
+
132
+ ids.filter((id) => ![SETTING.DISABLE_INACTIVE_USER_AFTER, SETTING.DELETE_INACTIVE_USER_AFTER].includes(id))
133
+ .forEach(assignSettings);
134
+
135
+ validateUserRetentionCron();
136
+ });
137
+
138
+ const assignSettings = (key: string) => {
139
+ if (settings[key].id === SETTING.USER_LAST_LOGIN_DEFAULT && settings[key].value && typeof settings[key].value === 'string') {
140
+ const value = settings[key].value as string;
141
+
142
+ userRetentionSettings[key] = dayjs(value).valueOf().toString();
143
+
144
+ return;
145
+ }
146
+
147
+ userRetentionSettings[key] = settings[key].value;
148
+ };
149
+
150
+ const fetchSetting = async(id: string) => {
151
+ return await store.dispatch('management/find', { type: MANAGEMENT.SETTING, id });
152
+ };
153
+
154
+ const ids = Object.keys(userRetentionSettings);
155
+ const settingPromises = ids.map((id) => fetchSetting(id));
156
+
157
+ onMounted(async() => {
158
+ settings = await Promise
159
+ .all(settingPromises)
160
+ .then((results) => results.reduce((acc, result) => {
161
+ return {
162
+ [result.id]: result,
163
+ ...acc,
164
+ };
165
+ }, { }));
166
+
167
+ ids.forEach(assignSettings);
168
+
169
+ disableAfterPeriod.value = !!userRetentionSettings[SETTING.DISABLE_INACTIVE_USER_AFTER];
170
+ deleteAfterPeriod.value = !!userRetentionSettings[SETTING.DELETE_INACTIVE_USER_AFTER];
171
+ loading.value = false;
172
+
173
+ validateUserRetentionCron();
174
+ });
175
+
176
+ const isFormValid = ref(false);
177
+ const { t } = useI18n(store);
178
+ const validateUserRetentionCron = () => {
179
+ const { [SETTING.USER_RETENTION_CRON]: cronSetting } = userRetentionSettings;
180
+
181
+ // Only require user retention cron when disable or delete after are active
182
+ if (!disableAfterPeriod.value && !deleteAfterPeriod.value) {
183
+ isFormValid.value = true;
184
+
185
+ return;
186
+ }
187
+
188
+ if (!cronSetting) {
189
+ isFormValid.value = false;
190
+
191
+ return;
192
+ }
193
+
194
+ if (typeof cronSetting === 'string' && !isValidCron(cronSetting)) {
195
+ isFormValid.value = false;
196
+
197
+ return t('user.retention.edit.form.cron.errorMessage');
198
+ }
199
+
200
+ isFormValid.value = true;
201
+ };
202
+
203
+ const error = ref<string | null>(null);
204
+ const save = async(btnCB: (arg: boolean) => void) => {
205
+ try {
206
+ error.value = null;
207
+ ids.forEach((key) => {
208
+ settings[key].value = userRetentionSettings[key];
209
+
210
+ if (key === SETTING.USER_LAST_LOGIN_DEFAULT && userRetentionSettings[key]) {
211
+ settings[key].value = dayjs(Number(userRetentionSettings[key])).format();
212
+ }
213
+ });
214
+
215
+ await Promise.all(ids.map((setting) => settings[setting].save()));
216
+
217
+ btnCB(true);
218
+ store.dispatch(
219
+ 'growl/success',
220
+ {
221
+ title: t('user.retention.growl.title'),
222
+ message: t('user.retention.growl.message'),
223
+ },
224
+ { root: true }
225
+ );
226
+ routeBack();
227
+ } catch (err) {
228
+ error.value = (err as Error).message;
229
+ btnCB(false);
230
+ }
231
+ };
232
+
233
+ const router = useRouter();
234
+ const routeBack = () => {
235
+ router.back();
236
+ };
237
+
238
+ onBeforeRouteUpdate((_to: unknown, _from: unknown) => {
239
+ if (!isAdminUser(store.getters)) {
240
+ router.replace({ name: 'home' });
241
+ }
242
+ });
243
+ </script>
244
+
245
+ <template>
246
+ <div>
247
+ <user-retention-header />
248
+ <div
249
+ v-if="!loading"
250
+ class="form-user-retention"
251
+ >
252
+ <banner
253
+ v-if="error"
254
+ color="error"
255
+ >
256
+ {{ error }}
257
+ </banner>
258
+ <div class="input-fieldset">
259
+ <checkbox
260
+ v-model="disableAfterPeriod"
261
+ data-testid="disableAfterPeriod"
262
+ :label="t('user.retention.edit.form.disableAfter.checkbox')"
263
+ />
264
+ <labeled-input
265
+ v-model="userRetentionSettings[SETTING.DISABLE_INACTIVE_USER_AFTER]"
266
+ data-testid="disableAfterPeriodInput"
267
+ :tooltip="t('user.retention.edit.form.disableAfter.input.tooltip')"
268
+ class="input-field"
269
+ :label="t('user.retention.edit.form.disableAfter.input.label')"
270
+ :disabled="!disableAfterPeriod"
271
+ />
272
+ </div>
273
+ <div class="input-fieldset">
274
+ <checkbox
275
+ v-model="deleteAfterPeriod"
276
+ data-testid="deleteAfterPeriod"
277
+ :label="t('user.retention.edit.form.deleteAfter.checkbox')"
278
+ />
279
+ <labeled-input
280
+ v-model="userRetentionSettings[SETTING.DELETE_INACTIVE_USER_AFTER]"
281
+ data-testid="deleteAfterPeriodInput"
282
+ :tooltip="t('user.retention.edit.form.deleteAfter.input.tooltip')"
283
+ class="input-field"
284
+ :label="t('user.retention.edit.form.deleteAfter.input.label')"
285
+ :sub-label="t('user.retention.edit.form.deleteAfter.input.subLabel')"
286
+ :disabled="!deleteAfterPeriod"
287
+ />
288
+ </div>
289
+ <template
290
+ v-if="disableAfterPeriod || deleteAfterPeriod"
291
+ >
292
+ <div class="input-fieldset pt-12">
293
+ <labeled-input
294
+ v-model="userRetentionSettings[SETTING.USER_RETENTION_CRON]"
295
+ data-testid="userRetentionCron"
296
+ class="input-field"
297
+ required
298
+ type="cron"
299
+ :tooltip="t('user.retention.edit.form.cron.subLabel')"
300
+ :rules="[validateUserRetentionCron]"
301
+ :label="t('user.retention.edit.form.cron.label')"
302
+ @input="validateUserRetentionCron"
303
+ />
304
+ </div>
305
+ <div class="input-fieldset condensed pt-12">
306
+ <toggle-switch
307
+ v-model="userRetentionSettings[SETTING.USER_RETENTION_DRY_RUN]"
308
+ data-testid="userRetentionDryRun"
309
+ :onValue="'true'"
310
+ :offValue="'false'"
311
+ :on-label="t('user.retention.edit.form.dryRun.label')"
312
+ />
313
+ <span class="input-detail">{{ t('user.retention.edit.form.dryRun.subLabel') }}</span>
314
+ </div>
315
+ <div class="input-fieldset condensed">
316
+ <labeled-input
317
+ v-model="userRetentionSettings[SETTING.USER_LAST_LOGIN_DEFAULT]"
318
+ data-testid="userLastLoginDefault"
319
+ class="input-field"
320
+ :label="t('user.retention.edit.form.defaultLastLogin.label')"
321
+ :sub-label="t('user.retention.edit.form.defaultLastLogin.subLabel')"
322
+ :placeholder="t('user.retention.edit.form.defaultLastLogin.placeholder')"
323
+ />
324
+ </div>
325
+ </template>
326
+ </div>
327
+ <Footer
328
+ class="footer-user-retention"
329
+ mode="edit"
330
+ :disable-save="!isFormValid"
331
+ @save="save"
332
+ @done="routeBack"
333
+ />
334
+ </div>
335
+ </template>
336
+
337
+ <style lang="scss" scoped>
338
+ .form-user-retention {
339
+ display: flex;
340
+ flex: 1;
341
+ flex-direction: column;
342
+ gap: 1.5rem;
343
+ }
344
+
345
+ .footer-user-retention {
346
+ border-top: var(--header-border-size) solid var(--header-border);
347
+ right: 0;
348
+ position: sticky;
349
+ bottom: 0;
350
+ background-color: var(--header-bg);
351
+ margin-left: -20px;
352
+ margin-right: -20px;
353
+ margin-bottom: -20px;
354
+ margin-top: 20px;
355
+ padding: 10px 20px;
356
+
357
+ ::v-deep .spacer-small {
358
+ padding: 0;
359
+ }
360
+ }
361
+
362
+ .input-fieldset {
363
+ display: flex;
364
+ flex-direction: column;
365
+ gap: 0.75rem;
366
+
367
+ &.condensed {
368
+ gap: 0.25rem;
369
+ }
370
+
371
+ &.pt-12 {
372
+ padding-top: 3rem;
373
+ }
374
+ }
375
+
376
+ .input-field {
377
+ max-width: 24rem
378
+ }
379
+
380
+ .input-detail {
381
+ color: var(--input-label);
382
+ padding-left: 61px;
383
+ }
384
+ </style>
@@ -1,6 +1,8 @@
1
1
  <script>
2
2
 
3
3
  export default {
4
+ layout: 'plain',
5
+
4
6
  mounted() {
5
7
  const link = this.$store.getters['backToRancherLink'];
6
8
 
@@ -15,7 +15,7 @@ import {
15
15
  WORKLOAD_TYPES,
16
16
  COUNT,
17
17
  CATALOG,
18
- SECRET
18
+ PSP,
19
19
  } from '@shell/config/types';
20
20
  import { setPromiseResult } from '@shell/utils/promise';
21
21
  import AlertTable from '@shell/components/AlertTable';
@@ -27,13 +27,13 @@ import {
27
27
  STATE,
28
28
  } from '@shell/config/table-headers';
29
29
 
30
- import { haveV1Monitoring, monitoringStatus, canViewGrafanaLink } from '@shell/utils/monitoring';
30
+ import { mapPref, PSP_DEPRECATION_BANNER } from '@shell/store/prefs';
31
+ import { monitoringStatus, canViewGrafanaLink } from '@shell/utils/monitoring';
31
32
  import Tabbed from '@shell/components/Tabbed';
32
33
  import Tab from '@shell/components/Tabbed/Tab';
33
34
  import { allDashboardsExist } from '@shell/utils/grafana';
34
35
  import EtcdInfoBanner from '@shell/components/EtcdInfoBanner';
35
36
  import metricPoller from '@shell/mixins/metric-poller';
36
- import EmberPage from '@shell/components/EmberPage';
37
37
  import ResourceSummary, { resourceCounts } from '@shell/components/ResourceSummary';
38
38
  import HardwareResourceGauge from '@shell/components/HardwareResourceGauge';
39
39
  import { isEmpty } from '@shell/utils/object';
@@ -43,8 +43,6 @@ import { fetchClusterResources } from './explorer-utils';
43
43
  import SimpleBox from '@shell/components/SimpleBox';
44
44
  import { ExtensionPoint, CardLocation } from '@shell/core/types';
45
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';
48
46
 
49
47
  export const RESOURCES = [NAMESPACE, INGRESS, PV, WORKLOAD_TYPES.DEPLOYMENT, WORKLOAD_TYPES.STATEFUL_SET, WORKLOAD_TYPES.JOB, WORKLOAD_TYPES.DAEMON_SET, SERVICE];
50
48
 
@@ -73,11 +71,9 @@ export default {
73
71
  Tabbed,
74
72
  AlertTable,
75
73
  Banner,
76
- EmberPage,
77
74
  ConfigBadge,
78
75
  EventsTable,
79
76
  SimpleBox,
80
- Certificates
81
77
  },
82
78
 
83
79
  mixins: [metricPoller],
@@ -158,6 +154,20 @@ export default {
158
154
  ...mapGetters(['currentCluster']),
159
155
  ...monitoringStatus(),
160
156
 
157
+ displayPspDeprecationBanner() {
158
+ const cluster = this.currentCluster;
159
+ const major = cluster.status?.version?.major ? parseInt(cluster.status?.version?.major) : 0;
160
+ const minor = cluster.status?.version?.minor ? parseInt(cluster.status?.version?.minor) : 0;
161
+
162
+ if (major === 1 && minor >= 21 && minor < 25) {
163
+ const clusterCounts = this.$store.getters[`cluster/all`](COUNT)?.[0]?.counts;
164
+
165
+ return !!clusterCounts?.[PSP]?.summary?.count;
166
+ }
167
+
168
+ return false;
169
+ },
170
+
161
171
  nodes() {
162
172
  return this.$store.getters['cluster/all'](NODE);
163
173
  },
@@ -166,13 +176,7 @@ export default {
166
176
  return this.$store.getters['management/all'](MANAGEMENT.CLUSTER);
167
177
  },
168
178
 
169
- hasV1Monitoring() {
170
- return haveV1Monitoring(this.$store.getters);
171
- },
172
-
173
- v1MonitoringURL() {
174
- return `/k/${ this.currentCluster.id }/monitoring`;
175
- },
179
+ hidePspDeprecationBanner: mapPref(PSP_DEPRECATION_BANNER),
176
180
 
177
181
  displayProvider() {
178
182
  const other = 'other';
@@ -352,18 +356,8 @@ export default {
352
356
  return {
353
357
  name: 'c-cluster-product-resource',
354
358
  params: {
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,
359
+ product: 'explorer',
360
+ resource: 'event',
367
361
  }
368
362
  };
369
363
  }
@@ -430,6 +424,17 @@ export default {
430
424
  </div>
431
425
  </div>
432
426
  </header>
427
+ <Banner
428
+ v-if="displayPspDeprecationBanner && !hidePspDeprecationBanner"
429
+ :closable="true"
430
+ color="warning"
431
+ @close="hidePspDeprecationBanner = true"
432
+ >
433
+ <t
434
+ k="landing.deprecatedPsp"
435
+ :raw="true"
436
+ />
437
+ </Banner>
433
438
  <div
434
439
  class="cluster-dashboard-glance"
435
440
  >
@@ -463,8 +468,16 @@ export default {
463
468
  :show-tooltip="true"
464
469
  /></span>
465
470
  </div>
471
+ <p
472
+ v-if="displayPspDeprecationBanner && hidePspDeprecationBanner"
473
+ v-clean-tooltip="t('landing.deprecatedPsp')"
474
+ class="alt-psp-deprecation-info"
475
+ >
476
+ <span>{{ t('landing.psps') }}</span>
477
+ <i class="icon icon-warning" />
478
+ </p>
466
479
  <div :style="{'flex':1}" />
467
- <div v-if="!monitoringStatus.v2 && !monitoringStatus.v1">
480
+ <div v-if="!monitoringStatus.v2">
468
481
  <n-link
469
482
  :to="{name: 'c-cluster-explorer-tools'}"
470
483
  class="monitoring-install"
@@ -473,9 +486,6 @@ export default {
473
486
  <span>{{ t('glance.installMonitoring') }}</span>
474
487
  </n-link>
475
488
  </div>
476
- <div v-if="monitoringStatus.v1">
477
- <span>{{ t('glance.v1MonitoringInstalled') }}</span>
478
- </div>
479
489
  <ConfigBadge
480
490
  v-if="currentCluster.canUpdate"
481
491
  :cluster="currentCluster"
@@ -516,13 +526,13 @@ export default {
516
526
  </div>
517
527
 
518
528
  <h3
519
- v-if="!hasV1Monitoring && hasStats"
529
+ v-if="hasStats"
520
530
  class="mt-40"
521
531
  >
522
532
  {{ t('clusterIndexPage.sections.capacity.label') }}
523
533
  </h3>
524
534
  <div
525
- v-if="!hasV1Monitoring && hasStats"
535
+ v-if="hasStats"
526
536
  class="hardware-resource-gauges"
527
537
  >
528
538
  <HardwareResourceGauge
@@ -543,7 +553,7 @@ export default {
543
553
  />
544
554
  </div>
545
555
 
546
- <div v-if="!hasV1Monitoring && componentServices">
556
+ <div v-if="componentServices">
547
557
  <div
548
558
  v-for="status in componentServices"
549
559
  :key="status.name"
@@ -562,17 +572,6 @@ export default {
562
572
  </div>
563
573
  </div>
564
574
 
565
- <div
566
- v-if="hasV1Monitoring"
567
- id="ember-anchor"
568
- class="mt-20"
569
- >
570
- <EmberPage
571
- inline="ember-anchor"
572
- :src="v1MonitoringURL"
573
- />
574
- </div>
575
-
576
575
  <div class="mt-30">
577
576
  <Tabbed @changed="tabChange">
578
577
  <Tab
@@ -595,18 +594,6 @@ export default {
595
594
  >
596
595
  <AlertTable v-if="selectedTab === 'cluster-alerts'" />
597
596
  </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>
610
597
  </Tabbed>
611
598
  </div>
612
599
  <Tabbed
@@ -723,6 +710,16 @@ export default {
723
710
  margin-top: 0;
724
711
  }
725
712
 
713
+ .alt-psp-deprecation-info {
714
+ display: flex;
715
+ align-items: center;
716
+ color: var(--warning);
717
+
718
+ span {
719
+ margin-right: 4px;
720
+ }
721
+ }
722
+
726
723
  .monitoring-install {
727
724
  display: flex;
728
725
  margin-left: 10px;