dashboard-shell-shell 1.0.10000011122 → 1.6.0-alpha.2

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 (756) hide show
  1. package/assets/brand/csp/favicon.png +0 -0
  2. package/assets/data/aws-regions.json +3 -0
  3. package/assets/icons/demo.css:Zone.Identifier +0 -0
  4. package/assets/icons/demo_index.html:Zone.Identifier +0 -0
  5. package/assets/icons/iconfont.css +4 -1
  6. package/assets/icons/iconfont.css:Zone.Identifier +0 -0
  7. package/assets/icons/iconfont.js:Zone.Identifier +0 -0
  8. package/assets/icons/iconfont.json:Zone.Identifier +0 -0
  9. package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
  10. package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
  11. package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
  12. package/assets/images/action.svg +6 -0
  13. package/assets/images/icons/document.svg +3 -0
  14. package/assets/images/key.svg +17 -0
  15. package/assets/images/pl/dark/logo.png +0 -0
  16. package/assets/images/pl/logo.png +0 -0
  17. package/assets/images/providers/sks.svg +1 -0
  18. package/assets/images/vendor/cognito.svg +1 -0
  19. package/assets/styles/all.scss +23 -3
  20. package/assets/styles/app.scss +3 -0
  21. package/assets/styles/base/_basic.scss +10 -0
  22. package/assets/styles/base/_functions.scss +0 -0
  23. package/assets/styles/base/_mixins.scss +1 -1
  24. package/assets/styles/base/_spacing.scss +29 -0
  25. package/assets/styles/base/_variables.scss +21 -15
  26. package/assets/styles/fonts/_icons.scss +3 -2
  27. package/assets/styles/global/_button.scss +23 -16
  28. package/assets/styles/global/_form.scss +3 -2
  29. package/assets/styles/global/_labeled-input.scss +7 -3
  30. package/assets/styles/global/_layout.scss +1 -1
  31. package/assets/styles/global/_select.scss +7 -8
  32. package/assets/styles/global/_table.scss +3 -2
  33. package/assets/styles/global/_tooltip.scss +15 -4
  34. package/assets/styles/themes/_dark.scss +32 -0
  35. package/assets/styles/themes/_light.scss +90 -7
  36. package/assets/styles/vendor/vue-select.scss +4 -2
  37. package/assets/translations/en-us.yaml +881 -107
  38. package/assets/translations/zh-hans.yaml +232 -46
  39. package/chart/__tests__/S3.test.ts +2 -1
  40. package/chart/monitoring/index.vue +1 -1
  41. package/cloud-credential/gcp.vue +9 -1
  42. package/components/ActionDropdown.vue +1 -0
  43. package/components/ActionMenuShell.vue +2 -3
  44. package/components/AppModal.vue +9 -28
  45. package/components/AsyncButton.vue +2 -0
  46. package/components/BrandImage.vue +1 -0
  47. package/components/ButtonDropdown.vue +3 -1
  48. package/components/Certificates.vue +5 -0
  49. package/components/ClusterIconMenu.vue +1 -1
  50. package/components/CodeMirror.vue +10 -7
  51. package/components/CommunityLinks.vue +3 -58
  52. package/components/ConfigMapSettings/Settings.vue +377 -0
  53. package/components/ConfigMapSettings/index.vue +354 -0
  54. package/components/ContainerResourceLimit.vue +2 -2
  55. package/components/CopyToClipboard.vue +15 -0
  56. package/components/CruResource.vue +104 -17
  57. package/components/CruResourceFooter.vue +1 -1
  58. package/components/DetailText.vue +61 -11
  59. package/components/Drawer/Chrome.vue +115 -0
  60. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +64 -0
  61. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  62. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  63. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  64. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  65. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  66. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  67. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  68. package/components/Drawer/ResourceDetailDrawer/index.vue +124 -0
  69. package/components/ExplorerMembers.vue +28 -4
  70. package/components/ExplorerProjectsNamespaces.vue +30 -33
  71. package/components/FilterPanel.vue +156 -0
  72. package/components/FixedBanner.vue +19 -5
  73. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  74. package/components/GlobalRoleBindings.vue +3 -0
  75. package/components/GrowlManager.vue +16 -15
  76. package/components/IconOrSvg.vue +19 -35
  77. package/components/IndentedPanel.vue +4 -10
  78. package/components/KeyValueView.vue +1 -1
  79. package/components/LandingPagePreference.vue +2 -0
  80. package/components/Loading.vue +1 -1
  81. package/components/LocaleSelector.vue +10 -2
  82. package/components/PaginatedResourceTable.vue +53 -1
  83. package/components/PodSecurityAdmission.vue +2 -2
  84. package/components/ProgressBarMulti.vue +1 -0
  85. package/components/PromptModal.vue +38 -7
  86. package/components/PromptRemove.vue +8 -4
  87. package/components/PromptRestore.vue +22 -44
  88. package/components/RelatedResources.vue +7 -12
  89. package/components/Resource/Detail/Additional.vue +46 -0
  90. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  91. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  92. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  93. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  94. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  95. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  96. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  97. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  98. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  99. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  100. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  101. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  102. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  103. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  104. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  105. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  106. package/components/Resource/Detail/Card/index.vue +56 -0
  107. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  108. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  109. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  110. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  111. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  112. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
  113. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  114. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +138 -0
  115. package/components/Resource/Detail/Metadata/KeyValue.vue +144 -0
  116. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  117. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  118. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  119. package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
  120. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  121. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  122. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  123. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  124. package/components/Resource/Detail/Metadata/composables.ts +81 -0
  125. package/components/Resource/Detail/Metadata/index.vue +90 -0
  126. package/components/Resource/Detail/Page.vue +37 -0
  127. package/components/Resource/Detail/PercentageBar.vue +40 -0
  128. package/components/Resource/Detail/ResourceRow.vue +138 -0
  129. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  130. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  131. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  132. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  133. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  134. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  135. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  136. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  137. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  138. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  139. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  140. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  141. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  142. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  143. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  144. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  145. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  146. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  147. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  148. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  149. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  150. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  151. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  152. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  153. package/components/Resource/Detail/SpacedRow.vue +14 -0
  154. package/components/Resource/Detail/StatusBar.vue +59 -0
  155. package/components/Resource/Detail/StatusRow.vue +61 -0
  156. package/components/Resource/Detail/TitleBar/Title.vue +15 -0
  157. package/components/Resource/Detail/TitleBar/Top.vue +16 -0
  158. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  159. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  160. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  161. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  162. package/components/Resource/Detail/TitleBar/composables.ts +61 -0
  163. package/components/Resource/Detail/TitleBar/index.vue +302 -0
  164. package/components/Resource/Detail/Top/index.vue +34 -0
  165. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  166. package/components/Resource/Detail/composables.ts +45 -0
  167. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  168. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  169. package/components/ResourceDetail/Masthead/index.vue +65 -0
  170. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  171. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +34 -15
  172. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  173. package/components/ResourceDetail/index.vue +75 -560
  174. package/components/{rancherResourceDetail/index.vue → ResourceDetail/legacy.vue} +31 -42
  175. package/components/ResourceList/Masthead.vue +189 -82
  176. package/components/ResourceList/ResourceLoadingIndicator.vue +5 -2
  177. package/components/ResourceList/index.vue +3 -2
  178. package/components/ResourceTable.vue +75 -16
  179. package/components/ResourceYaml.vue +15 -2
  180. package/components/RichTranslation.vue +106 -0
  181. package/components/SideNav.vue +66 -29
  182. package/components/SlideInPanelManager.vue +116 -14
  183. package/components/SortableTable/THead.vue +52 -1
  184. package/components/SortableTable/index.vue +515 -394
  185. package/components/SortableTable/paging.js +15 -16
  186. package/components/SortableTable/selection.js +22 -10
  187. package/components/StateDot/index.vue +28 -0
  188. package/components/StatusBadge.vue +6 -4
  189. package/components/SubtleLink.vue +25 -0
  190. package/components/Tabbed/index.vue +39 -19
  191. package/components/Wizard.vue +16 -3
  192. package/components/YamlEditor.vue +1 -2
  193. package/components/__tests__/AsyncButton.test.ts +39 -0
  194. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  195. package/components/__tests__/CruResource.test.ts +63 -0
  196. package/components/__tests__/FilterPanel.test.ts +81 -0
  197. package/components/__tests__/GrowlManager.test.ts +0 -25
  198. package/components/__tests__/PromptModal.test.ts +146 -0
  199. package/components/__tests__/PromptRestore.test.ts +1 -65
  200. package/components/__tests__/RichTranslation.test.ts +115 -0
  201. package/components/auth/AuthBanner.vue +15 -14
  202. package/components/auth/Principal.vue +44 -15
  203. package/components/auth/RoleDetailEdit.vue +112 -15
  204. package/components/auth/SelectPrincipal.vue +1 -0
  205. package/components/auth/login/ldap.vue +2 -2
  206. package/components/auth/login/oidc.vue +6 -1
  207. package/components/breadcrumb/index.vue +119 -0
  208. package/components/fleet/FleetApplications.vue +174 -0
  209. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  210. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  211. package/components/fleet/FleetClusters.vue +25 -6
  212. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  213. package/components/fleet/FleetHelmOps.vue +123 -0
  214. package/components/fleet/FleetIntro.vue +58 -28
  215. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  216. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  217. package/components/fleet/FleetRepos.vue +37 -80
  218. package/components/fleet/FleetResources.vue +69 -27
  219. package/components/fleet/FleetSummary.vue +26 -51
  220. package/components/fleet/FleetValuesFrom.vue +295 -0
  221. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  222. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  223. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  224. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  225. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  226. package/components/fleet/dashboard/Empty.vue +73 -0
  227. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  228. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  229. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  230. package/components/fleet/dashboard/ResourcePanel.vue +384 -0
  231. package/components/form/ArrayList.vue +187 -142
  232. package/components/form/ArrayListGrouped.vue +5 -3
  233. package/components/form/BannerSettings.vue +130 -61
  234. package/components/form/ChangePassword.vue +8 -6
  235. package/components/form/ColorInput.vue +67 -14
  236. package/components/form/Command.vue +4 -5
  237. package/components/form/Conditions.vue +15 -1
  238. package/components/form/FileImageSelector.vue +1 -1
  239. package/components/form/Footer.vue +12 -5
  240. package/components/form/HealthCheck.vue +0 -2
  241. package/components/form/HookOption.vue +87 -58
  242. package/components/form/InputWithSelect.vue +10 -7
  243. package/components/form/KeyValue.vue +138 -55
  244. package/components/form/LabeledSelect.vue +222 -201
  245. package/components/form/Labels.vue +92 -22
  246. package/components/form/MatchExpressions.vue +59 -12
  247. package/components/form/Members/ClusterMembershipEditor.vue +1 -1
  248. package/components/form/Members/ClusterPermissionsEditor.vue +32 -30
  249. package/components/form/Members/MembershipEditor.vue +2 -2
  250. package/components/form/NameNsDescription.vue +27 -10
  251. package/components/form/Networking.vue +30 -28
  252. package/components/form/NodeAffinity.vue +29 -28
  253. package/components/form/NotificationSettings.vue +15 -1
  254. package/components/form/Password.vue +6 -2
  255. package/components/form/PodAffinity.vue +23 -23
  256. package/components/form/Probe.vue +15 -11
  257. package/components/form/ProjectMemberEditor.vue +28 -25
  258. package/components/form/ResourceLabeledSelect.vue +22 -8
  259. package/components/form/ResourceQuota/Namespace.vue +4 -4
  260. package/components/form/ResourceQuota/NamespaceRow.vue +23 -18
  261. package/components/form/ResourceQuota/Project.vue +4 -4
  262. package/components/form/ResourceQuota/ProjectRow.vue +36 -31
  263. package/components/form/ResourceSelector.vue +28 -24
  264. package/components/form/ResourceTabs/index.vue +7 -1
  265. package/components/form/SSHKnownHosts/index.vue +14 -11
  266. package/components/form/SecretSelector.vue +18 -2
  267. package/components/form/Security.vue +1 -3
  268. package/components/form/Select.vue +66 -29
  269. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  270. package/components/form/ServiceNameSelect.vue +2 -5
  271. package/components/form/ServicePorts.vue +149 -75
  272. package/components/form/SimpleSecretSelector.vue +17 -4
  273. package/components/form/Taints.vue +23 -3
  274. package/components/form/Tolerations.vue +13 -9
  275. package/components/form/UnitInput.vue +21 -0
  276. package/components/form/ValueFromResource.vue +136 -110
  277. package/components/form/WorkloadPorts.vue +143 -123
  278. package/components/form/__tests__/ArrayList.test.ts +32 -0
  279. package/components/form/__tests__/ColorInput.test.ts +35 -0
  280. package/components/form/__tests__/KeyValue.test.ts +36 -0
  281. package/components/form/__tests__/LabeledSelect.test.ts +79 -2
  282. package/components/form/__tests__/Labels.test.ts +360 -0
  283. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  284. package/components/form/__tests__/Networking.test.ts +116 -0
  285. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  286. package/components/form/__tests__/Select.test.ts +37 -1
  287. package/components/form/__tests__/UnitInput.test.ts +23 -1
  288. package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
  289. package/components/formatter/ClusterLink.vue +5 -8
  290. package/components/formatter/Description.vue +30 -0
  291. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  292. package/components/formatter/FleetApplicationSource.vue +79 -0
  293. package/components/formatter/FleetSummaryGraph.vue +7 -0
  294. package/components/formatter/PodImages.vue +1 -1
  295. package/components/formatter/WorkloadHealthScale.vue +5 -4
  296. package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
  297. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  298. package/components/google/AccountAccess.vue +209 -0
  299. package/components/google/types/gcp.d.ts +136 -0
  300. package/components/google/types/index.d.ts +101 -0
  301. package/components/google/util/__mocks__/gcp.ts +465 -0
  302. package/components/google/util/formatter.ts +82 -0
  303. package/components/google/util/gcp.ts +134 -0
  304. package/components/google/util/index.d.ts +11 -0
  305. package/components/nav/Favorite.vue +6 -2
  306. package/components/nav/Group.vue +80 -23
  307. package/components/nav/Header.vue +108 -55
  308. package/components/nav/HeaderPageActionMenu.vue +1 -0
  309. package/components/nav/NamespaceFilter.vue +126 -78
  310. package/components/nav/NotificationCenter/Notification.vue +484 -0
  311. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  312. package/components/nav/NotificationCenter/index.vue +148 -0
  313. package/components/nav/TopLevelMenu.helper.ts +55 -34
  314. package/components/nav/TopLevelMenu.vue +73 -25
  315. package/components/nav/Type.vue +62 -14
  316. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  317. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  318. package/components/nav/WindowManager/index.vue +3 -2
  319. package/components/templates/default.vue +0 -3
  320. package/components/templates/plain.vue +0 -3
  321. package/composables/drawer.ts +26 -0
  322. package/composables/focusTrap.ts +3 -3
  323. package/composables/resources.test.ts +63 -0
  324. package/composables/resources.ts +38 -0
  325. package/composables/useClickOutside.ts +1 -1
  326. package/composables/useI18n.ts +12 -11
  327. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  328. package/config/labels-annotations.js +22 -11
  329. package/config/menuRouteMap.js +10 -0
  330. package/config/pagination-table-headers.js +8 -1
  331. package/config/private-label.js +0 -1
  332. package/config/product/auth.js +33 -7
  333. package/config/product/{cis.js → compliance.js} +23 -26
  334. package/config/product/explorer.js +79 -25
  335. package/config/product/fleet.js +77 -17
  336. package/config/product/manager.js +1 -29
  337. package/config/product/settings.js +39 -18
  338. package/config/query-params.js +16 -1
  339. package/config/roles.ts +2 -1
  340. package/config/router/navigation-guards/authentication.js +51 -2
  341. package/config/router/navigation-guards/index.js +16 -20
  342. package/config/router/routes.js +65 -31
  343. package/config/secret.ts +15 -0
  344. package/config/settings.ts +61 -16
  345. package/config/store.js +2 -0
  346. package/config/system-namespaces.js +1 -1
  347. package/config/table-headers.js +91 -30
  348. package/config/types.js +18 -7
  349. package/config/version.js +1 -1
  350. package/core/plugin-helpers.ts +3 -2
  351. package/core/plugin.ts +32 -7
  352. package/core/types.ts +25 -7
  353. package/detail/catalog.cattle.io.app.vue +5 -1
  354. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  355. package/detail/fleet.cattle.io.bundle.vue +70 -6
  356. package/detail/fleet.cattle.io.cluster.vue +28 -15
  357. package/detail/fleet.cattle.io.gitrepo.vue +11 -2
  358. package/detail/fleet.cattle.io.helmop.vue +157 -0
  359. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  360. package/detail/management.cattle.io.oidcclient.vue +369 -0
  361. package/detail/namespace.vue +0 -3
  362. package/detail/node.vue +48 -39
  363. package/detail/pod.vue +2 -2
  364. package/detail/provisioning.cattle.io.cluster.vue +16 -50
  365. package/detail/service.vue +10 -2
  366. package/detail/workload/index.vue +48 -39
  367. package/dialog/AddCustomBadgeDialog.vue +17 -10
  368. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  369. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  370. package/dialog/AssignToDialog.vue +176 -0
  371. package/dialog/ChangePasswordDialog.vue +106 -0
  372. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  373. package/dialog/DisableAuthProviderDialog.vue +101 -0
  374. package/dialog/DrainNode.vue +1 -1
  375. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  376. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
  377. package/dialog/FeatureFlagListDialog.vue +288 -0
  378. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  379. package/dialog/GenericPrompt.vue +1 -1
  380. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  381. package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
  382. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  383. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  384. package/dialog/MoveNamespaceDialog.vue +157 -0
  385. package/dialog/OidcClientSecretDialog.vue +117 -0
  386. package/dialog/RedeployWorkloadDialog.vue +164 -0
  387. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  388. package/dialog/ScalePoolDownDialog.vue +1 -1
  389. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  390. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  391. package/dialog/WechatDialog.vue +57 -0
  392. package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
  393. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  394. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  395. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  396. package/edit/__tests__/service.test.ts +2 -1
  397. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  398. package/edit/auth/ldap/config.vue +24 -0
  399. package/edit/auth/oidc.vue +159 -93
  400. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
  401. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +9 -6
  402. package/edit/autoscaling.horizontalpodautoscaler/index.vue +7 -2
  403. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
  404. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
  405. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
  406. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
  407. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  408. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
  409. package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
  410. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  411. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  412. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  413. package/edit/configmap.vue +12 -2
  414. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  415. package/edit/fleet.cattle.io.gitrepo.vue +70 -256
  416. package/edit/fleet.cattle.io.helmop.vue +786 -0
  417. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  418. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  419. package/edit/logging-flow/index.vue +1 -0
  420. package/edit/logging.banzaicloud.io.output/index.vue +2 -1
  421. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
  422. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  423. package/edit/management.cattle.io.oidcclient.vue +162 -0
  424. package/edit/management.cattle.io.project.vue +4 -1
  425. package/edit/management.cattle.io.user.vue +17 -4
  426. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  427. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  428. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  429. package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
  430. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  431. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  432. package/edit/monitoring.coreos.com.route.vue +1 -0
  433. package/edit/namespace.vue +2 -4
  434. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  435. package/edit/networking.k8s.io.ingress/Certificate.vue +25 -8
  436. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  437. package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
  438. package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
  439. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
  440. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  441. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +6 -17
  442. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
  443. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +69 -73
  444. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
  445. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
  446. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
  447. package/edit/networking.k8s.io.networkpolicy/index.vue +24 -32
  448. package/edit/node.vue +1 -0
  449. package/edit/persistentvolume/index.vue +7 -2
  450. package/edit/persistentvolumeclaim.vue +2 -0
  451. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  452. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
  453. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  454. package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
  455. package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
  456. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
  457. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  458. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  459. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  460. package/edit/resources.cattle.io.restore.vue +1 -1
  461. package/edit/secret/basic.vue +1 -0
  462. package/edit/secret/index.vue +129 -17
  463. package/edit/service.vue +21 -30
  464. package/edit/serviceaccount.vue +4 -1
  465. package/edit/storage.k8s.io.storageclass/index.vue +14 -9
  466. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
  467. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
  468. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
  469. package/edit/token.vue +1 -1
  470. package/edit/workload/Job.vue +31 -34
  471. package/edit/workload/Upgrading.vue +5 -5
  472. package/edit/workload/index.vue +32 -32
  473. package/edit/workload/mixins/workload.js +0 -2
  474. package/edit/workload/storage/Mount.vue +1 -0
  475. package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
  476. package/edit/workload/storage/azureDisk.vue +14 -10
  477. package/edit/workload/storage/azureFile.vue +9 -7
  478. package/edit/workload/storage/csi/index.vue +6 -9
  479. package/edit/workload/storage/emptyDir.vue +7 -5
  480. package/edit/workload/storage/gcePersistentDisk.vue +9 -7
  481. package/edit/workload/storage/hostPath.vue +7 -5
  482. package/edit/workload/storage/nfs.vue +8 -6
  483. package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
  484. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +20 -15
  485. package/edit/workload/storage/secret.vue +9 -6
  486. package/edit/workload/storage/vsphereVolume.vue +11 -7
  487. package/initialize/app-extended.js +7 -1
  488. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  489. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  490. package/list/fleet.cattle.io.helmop.vue +108 -0
  491. package/list/management.cattle.io.feature.vue +4 -288
  492. package/list/management.cattle.io.oidcclient.vue +108 -0
  493. package/list/management.cattle.io.setting.vue +22 -13
  494. package/list/management.cattle.io.user.vue +7 -3
  495. package/list/namespace.vue +6 -2
  496. package/list/node.vue +2 -0
  497. package/list/projectsecret.vue +345 -0
  498. package/list/provisioning.cattle.io.cluster.vue +6 -7
  499. package/list/secret.vue +109 -0
  500. package/list/workload.vue +6 -2
  501. package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
  502. package/machine-config/amazonec2.vue +3 -24
  503. package/machine-config/components/GCEImage.vue +374 -0
  504. package/machine-config/google.vue +617 -0
  505. package/machine-config/vmwarevsphere.vue +7 -17
  506. package/mixins/__tests__/brand.spec.ts +170 -0
  507. package/mixins/auth-config.js +8 -1
  508. package/mixins/brand.js +33 -17
  509. package/mixins/create-edit-view/impl.js +10 -1
  510. package/mixins/create-edit-view/index.js +5 -0
  511. package/mixins/preset.js +100 -0
  512. package/mixins/resource-fetch-api-pagination.js +73 -44
  513. package/mixins/resource-fetch.js +18 -8
  514. package/mixins/resource-table-watch.js +45 -0
  515. package/mixins/vue-select-overrides.js +1 -4
  516. package/models/__tests__/chart.test.ts +296 -0
  517. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  518. package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  519. package/models/__tests__/node.test.ts +7 -63
  520. package/models/__tests__/workload.test.ts +1 -0
  521. package/models/chart.js +157 -2
  522. package/models/cluster/node.js +2 -1
  523. package/models/cluster.js +32 -2
  524. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  525. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  526. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  527. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  528. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  529. package/models/fleet-application.js +297 -0
  530. package/models/fleet.cattle.io.bundle.js +9 -8
  531. package/models/fleet.cattle.io.cluster.js +21 -4
  532. package/models/fleet.cattle.io.gitrepo.js +46 -382
  533. package/models/fleet.cattle.io.helmop.js +202 -0
  534. package/models/management.cattle.io.authconfig.js +1 -0
  535. package/models/management.cattle.io.cluster.js +0 -20
  536. package/models/management.cattle.io.feature.js +7 -1
  537. package/models/management.cattle.io.fleetworkspace.js +14 -1
  538. package/models/management.cattle.io.node.js +7 -22
  539. package/models/management.cattle.io.nodepool.js +12 -0
  540. package/models/management.cattle.io.oidcclient.js +18 -0
  541. package/models/management.cattle.io.registration.js +3 -0
  542. package/models/management.cattle.io.setting.js +0 -1
  543. package/models/namespace.js +12 -1
  544. package/models/provisioning.cattle.io.cluster.js +79 -115
  545. package/models/secret.js +157 -2
  546. package/models/service.js +28 -9
  547. package/models/storage.k8s.io.storageclass.js +2 -2
  548. package/models/workload.js +91 -51
  549. package/package.json +6 -5
  550. package/pages/about.vue +17 -61
  551. package/pages/account/index.vue +104 -116
  552. package/pages/auth/login.vue +50 -30
  553. package/pages/auth/setup.vue +36 -17
  554. package/pages/auth/verify.vue +13 -1
  555. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  556. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  557. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
  558. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  559. package/pages/c/_cluster/apps/charts/index.vue +501 -468
  560. package/pages/c/_cluster/apps/charts/install.vue +0 -1
  561. package/pages/c/_cluster/auth/roles/index.vue +56 -5
  562. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  563. package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -1
  564. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  565. package/pages/c/_cluster/explorer/index.vue +14 -3
  566. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  567. package/pages/c/_cluster/explorer/tools/index.vue +6 -6
  568. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  569. package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
  570. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  571. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  572. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  573. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  574. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  575. package/pages/c/_cluster/fleet/index.vue +866 -328
  576. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  577. package/pages/c/_cluster/longhorn/index.vue +5 -2
  578. package/pages/c/_cluster/settings/banners.vue +230 -103
  579. package/pages/c/_cluster/settings/brand.vue +349 -301
  580. package/pages/c/_cluster/settings/performance.vue +68 -64
  581. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  582. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  583. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  584. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  585. package/pages/explorer/resource/detail/configmap.vue +42 -0
  586. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  587. package/pages/explorer/resource/detail/secret.vue +63 -0
  588. package/pages/home.vue +61 -109
  589. package/pages/prefs.vue +25 -24
  590. package/pages/support/index.vue +4 -6
  591. package/plugins/clean-html.js +2 -0
  592. package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
  593. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  594. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  595. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  596. package/plugins/dashboard-store/actions.js +212 -55
  597. package/plugins/dashboard-store/getters.js +112 -24
  598. package/plugins/dashboard-store/mutations.js +61 -12
  599. package/plugins/dashboard-store/normalize.js +29 -19
  600. package/plugins/dashboard-store/resource-class.js +105 -21
  601. package/plugins/steve/__tests__/getters.test.ts +19 -12
  602. package/plugins/steve/__tests__/steve-class.test.ts +1 -0
  603. package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
  604. package/plugins/steve/actions.js +37 -24
  605. package/plugins/steve/getters.js +47 -12
  606. package/plugins/steve/resourceWatcher.js +10 -3
  607. package/plugins/steve/steve-class.js +5 -0
  608. package/plugins/steve/steve-pagination-utils.ts +225 -43
  609. package/plugins/steve/subscribe.js +418 -53
  610. package/plugins/steve/worker/web-worker.advanced.js +5 -1
  611. package/promptRemove/mixin/roleDeletionCheck.js +2 -2
  612. package/rancher-components/BadgeState/BadgeState.vue +33 -52
  613. package/rancher-components/Banner/Banner.test.ts +51 -3
  614. package/rancher-components/Banner/Banner.vue +43 -9
  615. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  616. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
  617. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
  618. package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
  619. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  620. package/rancher-components/Form/Radio/RadioButton.vue +21 -5
  621. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  622. package/rancher-components/Form/Radio/RadioGroup.vue +90 -39
  623. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
  624. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
  625. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +32 -2
  626. package/rancher-components/RcButton/RcButton.vue +1 -1
  627. package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
  628. package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
  629. package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
  630. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
  631. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
  632. package/rancher-components/RcDropdown/index.ts +2 -0
  633. package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
  634. package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
  635. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  636. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  637. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  638. package/rancher-components/RcItemCard/index.ts +2 -0
  639. package/rancher-components/StringList/StringList.vue +1 -1
  640. package/scripts/clean +0 -0
  641. package/scripts/extension/bundle +0 -0
  642. package/scripts/extension/helm/scripts/package +0 -0
  643. package/scripts/extension/helm/scripts/patch +0 -0
  644. package/scripts/extension/helm/scripts/version +0 -0
  645. package/scripts/extension/helmpatch +0 -0
  646. package/scripts/extension/parse-tag-name +0 -0
  647. package/scripts/extension/publish +1 -1
  648. package/scripts/publish-shell.sh +86 -60
  649. package/scripts/serve-pkgs +0 -0
  650. package/scripts/sync-shell-deps +0 -0
  651. package/scripts/typegen.sh +44 -28
  652. package/static/loading-indicator.html +1 -1
  653. package/store/action-menu.js +26 -56
  654. package/store/auth.js +3 -0
  655. package/store/catalog.js +85 -25
  656. package/store/features.js +0 -1
  657. package/store/growl.js +97 -8
  658. package/store/i18n.js +9 -5
  659. package/store/index.js +44 -14
  660. package/store/notifications.ts +426 -0
  661. package/store/prefs.js +11 -5
  662. package/store/slideInPanel.ts +6 -0
  663. package/store/type-map.js +35 -18
  664. package/store/type-map.utils.ts +49 -6
  665. package/store/uiplugins.ts +15 -1
  666. package/types/fleet.d.ts +60 -1
  667. package/types/kube/kube-api.ts +34 -0
  668. package/types/notifications/index.ts +74 -0
  669. package/types/resources/fleet.d.ts +43 -0
  670. package/types/resources/pod-security-admission.ts +36 -0
  671. package/types/resources/settings.d.ts +107 -0
  672. package/types/resources/userPreferences.d.ts +13 -0
  673. package/types/shell/index.d.ts +944 -744
  674. package/types/store/dashboard-store.types.ts +57 -4
  675. package/types/store/pagination.types.ts +41 -9
  676. package/types/store/subscribe.types.ts +50 -0
  677. package/utils/__mocks__/tabbable.js +13 -0
  678. package/utils/__tests__/back-off.test.ts +354 -0
  679. package/utils/__tests__/create-yaml.test.ts +235 -0
  680. package/utils/__tests__/fleet.test.ts +148 -0
  681. package/utils/__tests__/kontainer.test.ts +19 -0
  682. package/utils/__tests__/object.test.ts +54 -1
  683. package/utils/__tests__/string.test.ts +273 -1
  684. package/utils/__tests__/time.test.ts +31 -0
  685. package/utils/auth.js +41 -6
  686. package/utils/back-off.ts +176 -0
  687. package/utils/cluster.js +24 -20
  688. package/utils/create-yaml.js +103 -9
  689. package/utils/crypto/encryption.ts +103 -0
  690. package/utils/cspAdaptor.ts +51 -0
  691. package/utils/error.js +7 -6
  692. package/utils/errorTranslate.json +366 -2
  693. package/utils/fleet-types.ts +0 -0
  694. package/utils/fleet.ts +204 -74
  695. package/utils/grafana.js +1 -0
  696. package/utils/kontainer.ts +3 -5
  697. package/utils/object.js +36 -12
  698. package/utils/pagination-utils.ts +50 -3
  699. package/utils/pagination-wrapper.ts +132 -50
  700. package/utils/perf-setting.utils.ts +28 -0
  701. package/utils/release-notes.ts +48 -0
  702. package/utils/selector-typed.ts +210 -0
  703. package/utils/selector.js +29 -6
  704. package/utils/settings.ts +4 -1
  705. package/utils/string.js +24 -0
  706. package/utils/style.ts +39 -0
  707. package/utils/{time.js → time.ts} +25 -6
  708. package/utils/uiplugins.ts +41 -8
  709. package/utils/v-sphere.ts +5 -1
  710. package/utils/validators/formRules/__tests__/index.test.ts +76 -6
  711. package/utils/validators/formRules/index.ts +99 -4
  712. package/utils/window.js +11 -7
  713. package/vue.config.js +0 -5
  714. package/.DS_Store +0 -0
  715. package/components/AssignTo.vue +0 -199
  716. package/components/DisableAuthProviderModal.vue +0 -115
  717. package/components/MoveModal.vue +0 -167
  718. package/components/PromptChangePassword.vue +0 -123
  719. package/components/__tests__/ApplicationCard.test.ts +0 -27
  720. package/components/cards/ApplicationCard.vue +0 -145
  721. package/components/fleet/FleetBundleResources.vue +0 -86
  722. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  723. package/components/formatter/RKETemplateName.vue +0 -37
  724. package/components/rancherResourceDetail/Masthead.vue +0 -769
  725. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +0 -65
  726. package/components/rancherResourceList/Masthead-btn.vue +0 -225
  727. package/components/rancherResourceList/Masthead.vue +0 -375
  728. package/components/rancherResourceList/ResourceLoadingIndicator.vue +0 -140
  729. package/components/rancherResourceList/index.vue +0 -307
  730. package/components/rancherResourceList/resource-list.config.js +0 -7
  731. package/components/rancherResourceTable.vue +0 -783
  732. package/components/rancherSortableTable/THead.vue +0 -561
  733. package/components/rancherSortableTable/actions.js +0 -153
  734. package/components/rancherSortableTable/advanced-filtering.js +0 -272
  735. package/components/rancherSortableTable/debug.js +0 -117
  736. package/components/rancherSortableTable/filtering.js +0 -290
  737. package/components/rancherSortableTable/grouping.js +0 -48
  738. package/components/rancherSortableTable/index.vue +0 -2712
  739. package/components/rancherSortableTable/paging.js +0 -155
  740. package/components/rancherSortableTable/selection.js +0 -629
  741. package/components/rancherSortableTable/sortable-config.ts +0 -4
  742. package/components/rancherSortableTable/sorting.js +0 -129
  743. package/config/product/legacy.js +0 -62
  744. package/config/secret.js +0 -14
  745. package/dialog/SaveAsRKETemplateDialog.vue +0 -139
  746. package/models/etcdbackup.js +0 -45
  747. package/pages/auth copy/login.vue +0 -595
  748. package/pages/auth copy/logout.vue +0 -47
  749. package/pages/auth copy/setup.vue +0 -523
  750. package/pages/auth copy/verify.vue +0 -203
  751. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  752. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  753. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  754. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  755. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
  756. package/types/cloud-shell/index.d.ts +0 -11014
package/store/index.js CHANGED
@@ -39,6 +39,7 @@ import { STORE, BLANK_CLUSTER } from '@shell/store/store-types';
39
39
  import { isDevBuild } from '@shell/utils/version';
40
40
  import { markRaw } from 'vue';
41
41
  import paginationUtils from '@shell/utils/pagination-utils';
42
+ import { addReleaseNotesNotification } from '@shell/utils/release-notes';
42
43
 
43
44
  // Disables strict mode for all store instances to prevent warning about changing state outside of mutations
44
45
  // because it's more efficient to do that sometimes.
@@ -263,6 +264,7 @@ export const state = () => {
263
264
  * Cache state of side nav clusters. This avoids flickering when the user changes pages and the side nav component re-renders
264
265
  */
265
266
  sideNavCache: undefined,
267
+ showWorkspaceSwitcher: true,
266
268
  };
267
269
  };
268
270
 
@@ -601,6 +603,16 @@ export const getters = {
601
603
  return getters['isRancherInHarvester'] || getters['isMultiCluster'] || !getters['isSingleProduct'];
602
604
  },
603
605
 
606
+ showWorkspaceSwitcher(state, getters) {
607
+ const product = getters['currentProduct'];
608
+
609
+ if (!product) {
610
+ return false;
611
+ }
612
+
613
+ return product.showWorkspaceSwitcher && state.showWorkspaceSwitcher;
614
+ },
615
+
604
616
  targetRoute(state) {
605
617
  return state.targetRoute;
606
618
  },
@@ -763,7 +775,11 @@ export const mutations = {
763
775
 
764
776
  setSideNavCache(state, sideNavCache) {
765
777
  state.sideNavCache = sideNavCache;
766
- }
778
+ },
779
+
780
+ showWorkspaceSwitcher(state, value) {
781
+ state.showWorkspaceSwitcher = value;
782
+ },
767
783
  };
768
784
 
769
785
  export const actions = {
@@ -801,7 +817,7 @@ export const actions = {
801
817
 
802
818
  const promises = {
803
819
  // Features checks on its own if they are available
804
- features: dispatch('features/loadServer'),
820
+ [MANAGEMENT.FEATURE]: dispatch('features/loadServer'),
805
821
  };
806
822
 
807
823
  const toWatch = [
@@ -816,33 +832,33 @@ export const actions = {
816
832
  }
817
833
 
818
834
  if ( getters['management/schemaFor'](COUNT) ) {
819
- promises['counts'] = dispatch('management/findAll', { type: COUNT, opt: { watch: false } });
835
+ promises[COUNT] = dispatch('management/findAll', { type: COUNT, opt: { watch: false } });
820
836
  toWatch.push(COUNT);
821
837
  }
822
838
 
823
839
  if ( getters['management/canList'](MANAGEMENT.SETTING) ) {
824
- promises['settings'] = dispatch('management/findAll', { type: MANAGEMENT.SETTING, opt: { watch: false } });
840
+ promises[MANAGEMENT.SETTING] = dispatch('management/findAll', { type: MANAGEMENT.SETTING, opt: { watch: false } });
825
841
  toWatch.push(MANAGEMENT.SETTING);
826
842
  }
827
843
 
828
844
  if ( getters['management/schemaFor'](NAMESPACE) ) {
829
- promises['namespaces'] = dispatch('management/findAll', { type: NAMESPACE, opt: { watch: false } });
845
+ promises[NAMESPACE] = dispatch('management/findAll', { type: NAMESPACE, opt: { watch: false } });
830
846
  toWatch.push(NAMESPACE);
831
847
  }
832
848
 
833
849
  const fleetSchema = getters['management/schemaFor'](FLEET.WORKSPACE);
834
850
 
835
851
  if (fleetSchema?.links?.collection) {
836
- promises['workspaces'] = dispatch('management/findAll', { type: FLEET.WORKSPACE, opt: { watch: false } });
852
+ promises[FLEET.WORKSPACE] = dispatch('management/findAll', { type: FLEET.WORKSPACE, opt: { watch: false } });
837
853
  toWatch.push(FLEET.WORKSPACE);
838
854
  }
839
855
 
840
856
  res = await allHash(promises);
841
857
 
842
- if (!res.settings || !paginateClusters(rootGetters)) {
858
+ if (!res[MANAGEMENT.SETTING] || !paginateClusters(rootGetters)) {
843
859
  // This introduces a synchronous request, however we need settings to determine if SSP is enabled
844
860
  // Eventually it will be removed when SSP is always on
845
- res.clusters = await dispatch('management/findAll', { type: MANAGEMENT.CLUSTER, opt: { watch: false } });
861
+ res[MANAGEMENT.CLUSTER] = await dispatch('management/findAll', { type: MANAGEMENT.CLUSTER, opt: { watch: false } });
846
862
  toWatch.push(MANAGEMENT.CLUSTER);
847
863
  }
848
864
 
@@ -854,7 +870,7 @@ export const actions = {
854
870
  const isMultiCluster = getters['isMultiCluster'];
855
871
 
856
872
  // If the local cluster is a Harvester cluster and 'rancher-manager-support' is true, it means that the embedded Rancher is being used.
857
- const localCluster = res.clusters?.find((c) => c.id === 'local');
873
+ const localCluster = res[MANAGEMENT.CLUSTER]?.find((c) => c.id === 'local');
858
874
 
859
875
  if (localCluster?.isHarvester) {
860
876
  const harvesterSetting = await dispatch('cluster/findAll', { type: HCI.SETTING, opt: { url: `/v1/harvester/${ HCI.SETTING }s` } });
@@ -862,11 +878,16 @@ export const actions = {
862
878
  const isRancherInHarvester = (rancherManagerSupport?.value || rancherManagerSupport?.default) === 'true';
863
879
 
864
880
  commit('isRancherInHarvester', isRancherInHarvester);
881
+
882
+ if (getters['isSingleProduct']) {
883
+ console.log('Detect standalone harvester, subscribe Rancher socket'); // eslint-disable-line no-console
884
+ await dispatch('rancher/subscribe');
885
+ }
865
886
  }
866
887
 
867
- const pl = res.settings?.find((x) => x.id === 'ui-pl')?.value;
868
- const brand = res.settings?.find((x) => x.id === SETTING.BRAND)?.value;
869
- const systemNamespaces = res.settings?.find((x) => x.id === SETTING.SYSTEM_NAMESPACES);
888
+ const pl = res[MANAGEMENT.SETTING]?.find((x) => x.id === 'ui-pl')?.value;
889
+ const brand = res[MANAGEMENT.SETTING]?.find((x) => x.id === SETTING.BRAND)?.value;
890
+ const systemNamespaces = res[MANAGEMENT.SETTING]?.find((x) => x.id === SETTING.SYSTEM_NAMESPACES);
870
891
 
871
892
  if ( pl ) {
872
893
  setVendor(pl);
@@ -876,6 +897,11 @@ export const actions = {
876
897
  setBrand(brand);
877
898
  }
878
899
 
900
+ // Add the notification for the release notes
901
+ if (isRancher) {
902
+ await addReleaseNotesNotification(dispatch, getters);
903
+ }
904
+
879
905
  if (systemNamespaces) {
880
906
  const namespace = (systemNamespaces.value || systemNamespaces.default)?.split(',');
881
907
 
@@ -887,10 +913,10 @@ export const actions = {
887
913
  isRancher,
888
914
  });
889
915
 
890
- if ( res.workspaces ) {
916
+ if ( res[FLEET.WORKSPACE] ) {
891
917
  commit('updateWorkspace', {
892
918
  value: getters['prefs/get'](WORKSPACE),
893
- all: res.workspaces,
919
+ all: res[FLEET.WORKSPACE],
894
920
  getters
895
921
  });
896
922
  }
@@ -1286,5 +1312,9 @@ export const actions = {
1286
1312
  commit('setSideNavCache', sideNavCache);
1287
1313
  },
1288
1314
 
1315
+ showWorkspaceSwitcher({ commit }, value) {
1316
+ commit('showWorkspaceSwitcher', value);
1317
+ },
1318
+
1289
1319
  ...gcActions
1290
1320
  };
@@ -0,0 +1,426 @@
1
+ import { md5 } from '@shell/utils/crypto';
2
+ import { randomStr } from '@shell/utils/string';
3
+ import { EncryptedNotification, Notification, StoredNotification } from '@shell/types/notifications';
4
+ import { encrypt, decrypt, deriveKey } from '@shell/utils/crypto/encryption';
5
+
6
+ /**
7
+ * Key used to store notifications in the browser's local storage
8
+ */
9
+ const LOCAL_STORAGE_KEY_PREFIX = 'rancher-notifications-';
10
+
11
+ /**
12
+ * Expire notifications in seconds (14 days)
13
+ */
14
+ const EXPIRY = 14 * 24 * 60 * 60;
15
+
16
+ /**
17
+ * Maximum number of notifications that will be kept
18
+ */
19
+ const MAX_NOTIFICATIONS = 50;
20
+
21
+ /**
22
+ * Broadcast channel name to send changes across tabs
23
+ */
24
+ const NOTIFICATION_CHANNEL_NAME = 'rancher-notification-sync';
25
+
26
+ /**
27
+ * Store for the UI Notification Centre
28
+ */
29
+ interface NotificationsStore {
30
+ localStorageKey: string,
31
+ userId: string;
32
+ notifications: StoredNotification[],
33
+ encryptionKey: CryptoKey | undefined,
34
+ }
35
+
36
+ export const state = function(): NotificationsStore {
37
+ const notifications: StoredNotification[] = [];
38
+
39
+ return {
40
+ localStorageKey: '',
41
+ userId: '',
42
+ encryptionKey: undefined,
43
+ notifications,
44
+ };
45
+ };
46
+
47
+ let bc: BroadcastChannel;
48
+
49
+ /**
50
+ * Sync notifications to other tabs using the broadcast channel. Send the user id, to cover corner case
51
+ * where a stale login exists for a different user in another tab.
52
+ */
53
+ function sync(userId: string, operation: string, param?: any) {
54
+ bc?.postMessage({
55
+ userId,
56
+ operation,
57
+ param
58
+ });
59
+ }
60
+
61
+ async function saveEncryptedNotification(getters: any, notification: Notification) {
62
+ const toEncrypt: EncryptedNotification = {
63
+ title: notification.title,
64
+ message: notification.message,
65
+ level: notification.level,
66
+ primaryAction: notification.primaryAction,
67
+ secondaryAction: notification.secondaryAction,
68
+ };
69
+
70
+ const localStorageKey = getters['localStorageKey'];
71
+ const encryptionKey = getters['encryptionKey'];
72
+
73
+ try {
74
+ const data = JSON.stringify(toEncrypt);
75
+ const enc = await encrypt(data, encryptionKey);
76
+
77
+ window.localStorage.setItem(`${ localStorageKey }-${ notification.id }`, JSON.stringify(enc));
78
+ } catch (e) {
79
+ console.error('Unable to save notification to local storage', e); // eslint-disable-line no-console
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Sync the notifications index to local storage.
85
+ *
86
+ * We only store the non-sensitive data about the notifications in the index - the other data is stored in individual entries which are encrypted.
87
+ */
88
+ function syncIndex(state: NotificationsStore) {
89
+ const localStorageKey = state.localStorageKey;
90
+
91
+ // We just want the id, created, read and progress properties for the index
92
+ const index = state.notifications.map((n) => ({
93
+ id: n.id,
94
+ created: n.created,
95
+ read: n.read,
96
+ progress: n.progress,
97
+ }));
98
+
99
+ try {
100
+ window.localStorage.setItem(localStorageKey, JSON.stringify(index));
101
+ } catch (e) {
102
+ console.error('Unable to save notifications index to local storage', e); // eslint-disable-line no-console
103
+ }
104
+ }
105
+
106
+ export const getters = {
107
+ all: (state: NotificationsStore) => {
108
+ return state.notifications;
109
+ },
110
+
111
+ item: (state: NotificationsStore) => {
112
+ return (id: string) => {
113
+ return state.notifications.find((i) => i.id === id);
114
+ };
115
+ },
116
+
117
+ // Count of unread notifications
118
+ unreadCount: (state: NotificationsStore) => {
119
+ return state.notifications.filter((n) => !n.read).length;
120
+ },
121
+
122
+ /**
123
+ * Local storage key includes the user key
124
+ */
125
+ localStorageKey: (state: NotificationsStore) => {
126
+ return state.localStorageKey;
127
+ },
128
+
129
+ userId: (state: NotificationsStore) => {
130
+ return state.userId;
131
+ },
132
+
133
+ encryptionKey: (state: NotificationsStore) => {
134
+ return state.encryptionKey;
135
+ },
136
+ };
137
+
138
+ export const mutations = {
139
+ add(state: NotificationsStore, notification: Notification) {
140
+ if (!notification.id) {
141
+ notification.id = randomStr();
142
+ } else {
143
+ // Check that there is not already a notification with this id
144
+ const index = state.notifications.findIndex((n) => n.id === notification.id);
145
+
146
+ if (index !== -1) {
147
+ console.error(`Can not add a notification with the same id as an existing notification (${ notification.id })`); // eslint-disable-line no-console
148
+
149
+ return;
150
+ }
151
+ }
152
+
153
+ const stored = {
154
+ ...notification,
155
+ read: false,
156
+ created: new Date()
157
+ };
158
+
159
+ // Add to top of list
160
+ state.notifications.unshift(stored);
161
+
162
+ // Check that we have not exceeded the maximum number of notifications
163
+ if (state.notifications.length > MAX_NOTIFICATIONS) {
164
+ const removed = state.notifications.pop();
165
+
166
+ if (removed) {
167
+ // Remove the encrypted data for the notification that we just removed
168
+ window.localStorage.removeItem(`${ state.localStorageKey }-${ removed.id }`);
169
+ }
170
+ }
171
+
172
+ syncIndex(state);
173
+ },
174
+
175
+ markRead(state: NotificationsStore, id: string) {
176
+ const notification = state.notifications.find((n) => n.id === id);
177
+
178
+ if (notification && !notification.read) {
179
+ notification.read = true;
180
+ }
181
+
182
+ syncIndex(state);
183
+ },
184
+
185
+ markUnread(state: NotificationsStore, id: string) {
186
+ const notification = state.notifications.find((n) => n.id === id);
187
+
188
+ if (notification && notification.read) {
189
+ notification.read = false;
190
+ }
191
+
192
+ syncIndex(state);
193
+ },
194
+
195
+ markAllRead(state: NotificationsStore) {
196
+ state.notifications.forEach((notification) => {
197
+ if (!notification.read) {
198
+ notification.read = true;
199
+ }
200
+ });
201
+
202
+ syncIndex(state);
203
+ },
204
+
205
+ update(state: NotificationsStore, notification: Partial<Notification>) {
206
+ if (notification?.id) {
207
+ const index = state.notifications.findIndex((n) => n.id === notification.id);
208
+
209
+ if (index >= 0) {
210
+ state.notifications[index] = {
211
+ ...state.notifications[index],
212
+ ...notification
213
+ };
214
+ }
215
+ }
216
+
217
+ syncIndex(state);
218
+ },
219
+
220
+ clearAll(state: NotificationsStore) {
221
+ // Remove the encrypted data for each notification
222
+ state.notifications.forEach((n) => {
223
+ window.localStorage.removeItem(`${ state.localStorageKey }-${ n.id }`);
224
+ });
225
+
226
+ state.notifications = [];
227
+ syncIndex(state);
228
+ },
229
+
230
+ remove(state: NotificationsStore, id: string) {
231
+ // Remove the encrypted data for the notification
232
+ window.localStorage.removeItem(`${ state.localStorageKey }-${ id }`);
233
+
234
+ state.notifications = state.notifications.filter((n) => n.id !== id);
235
+ syncIndex(state);
236
+ },
237
+
238
+ load(state: NotificationsStore, notifications: StoredNotification[]) {
239
+ state.notifications = notifications;
240
+ },
241
+
242
+ localStorageKey(state: NotificationsStore, userKey: string) {
243
+ state.localStorageKey = `${ LOCAL_STORAGE_KEY_PREFIX }${ userKey }`;
244
+ },
245
+
246
+ userId(state: NotificationsStore, userId: string) {
247
+ state.userId = userId;
248
+ },
249
+
250
+ encryptionKey(state: NotificationsStore, encryptionKey: CryptoKey) {
251
+ state.encryptionKey = encryptionKey;
252
+ },
253
+ };
254
+
255
+ export const actions = {
256
+ async add( { commit, dispatch, getters }: any, notification: Notification) {
257
+ // We encrypt the notification on add - this is the only time we will encrypt it
258
+ if (!notification.id) {
259
+ notification.id = randomStr();
260
+ }
261
+
262
+ // Need to save the encrypted notification to local storage
263
+ await saveEncryptedNotification(getters, notification);
264
+
265
+ commit('add', notification);
266
+ sync(getters['userId'], 'add', notification);
267
+
268
+ // Show a growl for the notification if necessary
269
+ dispatch('growl/notification', notification, { root: true });
270
+ },
271
+
272
+ async fromGrowl( { commit, getters }: any, notification: Notification) {
273
+ notification.id = randomStr();
274
+
275
+ // Need to save the encrypted notification to local storage
276
+ await saveEncryptedNotification(getters, notification);
277
+
278
+ commit('add', notification);
279
+ sync(getters['userId'], 'add', notification);
280
+
281
+ return notification.id;
282
+ },
283
+
284
+ update({ commit, getters }: any, notification: Notification) {
285
+ commit('update', notification);
286
+ sync(getters['userId'], 'update', notification);
287
+ },
288
+
289
+ async markRead({ commit, dispatch, getters }: any, id: string) {
290
+ commit('markRead', id);
291
+ sync(getters['userId'], 'markRead', id);
292
+
293
+ const notification = getters.item(id);
294
+
295
+ if (notification?.preference) {
296
+ await dispatch('prefs/set', notification.preference, { root: true });
297
+ }
298
+ },
299
+
300
+ async markUnread({ commit, dispatch, getters }: any, id: string) {
301
+ commit('markUnread', id);
302
+ sync(getters['userId'], 'markUnread', id);
303
+
304
+ const notification = getters.item(id) as Notification;
305
+
306
+ if (notification?.preference) {
307
+ await dispatch('prefs/set', {
308
+ key: notification.preference.key,
309
+ value: notification.preference.unsetValue || '',
310
+ }, { root: true });
311
+ }
312
+ },
313
+
314
+ async markAllRead({ commit, dispatch, getters }: any) {
315
+ commit('markAllRead');
316
+ sync(getters['userId'], 'markAllRead');
317
+
318
+ // For all notifications that have a preference, set the preference, since they are now read
319
+ const withPreference = getters.all.filter((n: Notification) => !!n.preference);
320
+
321
+ for (let i = 0; i < withPreference.length; i++) {
322
+ await dispatch('prefs/set', withPreference[i].preference, { root: true });
323
+ }
324
+ },
325
+
326
+ remove({ commit, getters }: any, id: string) {
327
+ commit('remove', id);
328
+ sync(getters['userId'], 'remove', id);
329
+ },
330
+
331
+ clearAll({ commit, getters }: any) {
332
+ commit('clearAll');
333
+ sync(getters['userId'], 'clearAll');
334
+ },
335
+
336
+ /**
337
+ * Initialize the notifications store and load the notifications from local storage
338
+ */
339
+ async init({ commit, getters } : any, userData: any) {
340
+ const userKey = userData.id;
341
+ const userId = userData.v3User?.uuid;
342
+
343
+ if (!userKey || !userId) {
344
+ console.error('Unable to initialize notifications - required user info not available'); // eslint-disable-line no-console
345
+
346
+ return;
347
+ }
348
+
349
+ // Notifications are stored under a key for the current user, so set the local storage key based on the user id
350
+ commit('localStorageKey', md5(userKey, 'hex'));
351
+ commit('userId', userId);
352
+
353
+ let index: StoredNotification[] = [];
354
+ let notifications: StoredNotification[] = [];
355
+ const localStorageKey = getters['localStorageKey'];
356
+
357
+ let encryptionKey;
358
+
359
+ try {
360
+ encryptionKey = await deriveKey(userId);
361
+ } catch (e) {
362
+ console.error('Unable to generate encryption key for notifications', e); // eslint-disable-line no-console
363
+
364
+ return;
365
+ }
366
+
367
+ // Store the encryption key
368
+ commit('encryptionKey', encryptionKey);
369
+
370
+ // Load the notifications from local storage
371
+ // We store the index of notifications in local storage, and the actual notification data is stored in individual entries which are encrypted
372
+ try {
373
+ const data = window.localStorage.getItem(localStorageKey) || '[]';
374
+
375
+ index = JSON.parse(data) as StoredNotification[];
376
+ } catch (e) {
377
+ console.error('Unable to read notifications from local storage', e); // eslint-disable-line no-console
378
+ }
379
+
380
+ for (let i = 0; i < index.length; i++) {
381
+ const n = index[i];
382
+
383
+ try {
384
+ const data = window.localStorage.getItem(`${ localStorageKey }-${ n.id }`);
385
+ const parsedData = data ? JSON.parse(data) : '{}';
386
+ const decryptedString = await decrypt(parsedData, encryptionKey);
387
+ const decrypted = JSON.parse(decryptedString) as EncryptedNotification;
388
+
389
+ // Overlay the decrypted data onto the notification
390
+ notifications.push({
391
+ ...n,
392
+ ...decrypted
393
+ });
394
+ } catch (e) {
395
+ console.error('Unable to decrypt notification data', e); // eslint-disable-line no-console
396
+ }
397
+ }
398
+
399
+ // Expire old notifications
400
+ const now = new Date();
401
+
402
+ notifications = notifications.filter((n: StoredNotification) => {
403
+ // Try ... catch in case the date parsing fails
404
+ try {
405
+ const created = new Date(n.created);
406
+ const diff = (now.getTime() - created.getTime()) / 1000; // Diff in seconds
407
+
408
+ return diff < EXPIRY;
409
+ } catch (e) {}
410
+
411
+ return true;
412
+ });
413
+
414
+ commit('load', notifications);
415
+
416
+ // Set up broadcast listener to listen for updates from other tabs
417
+ bc = new BroadcastChannel(NOTIFICATION_CHANNEL_NAME);
418
+
419
+ bc.onmessage = (msgEvent: any) => {
420
+ // Ignore events where the user id does not match (corner case of stale login in another tab)
421
+ if (msgEvent?.data?.operation && msgEvent?.data?.userId === userId) {
422
+ commit(msgEvent.data.operation, msgEvent.data.param);
423
+ }
424
+ };
425
+ }
426
+ };
package/store/prefs.js CHANGED
@@ -57,14 +57,14 @@ export const PINNED_CLUSTERS = create('pinned-clusters', [], { parseJSON });
57
57
  export const GROUP_RESOURCES = create('group-by', 'namespace');
58
58
  export const DIFF = create('diff', 'unified', { options: ['unified', 'split'] });
59
59
  export const THEME = create('theme', 'auto', {
60
- options: ['light', 'auto', 'dark'],
60
+ options: ['light'],
61
61
  asCookie,
62
62
  parseJSON,
63
63
  mangleRead: (x) => x.replace(/^ui-/, ''),
64
- mangleWrite: (x) => `ui-${ x }`,
64
+ mangleWrite: (x) => `ui-light`, // 接口同时修改为 白色
65
65
  });
66
66
  export const PREFERS_SCHEME = create('pcs', '', { asCookie, asUserPreference: false });
67
- export const LOCALE = create('locale', 'en-us', { asCookie });
67
+ export const LOCALE = create('locale', 'zh-hans', { asCookie });
68
68
  export const KEYMAP = create('keymap', 'sublime', { options: ['sublime', 'emacs', 'vim'] });
69
69
  export const ROWS_PER_PAGE = create('per-page', 100, { options: [10, 25, 50, 100], parseJSON });
70
70
  export const LOGS_WRAP = create('logs-wrap', true, { parseJSON });
@@ -74,7 +74,6 @@ export const HIDE_REPOS = create('hide-repos', [], { parseJSON });
74
74
  export const HIDE_DESC = create('hide-desc', [], { parseJSON });
75
75
  export const HIDE_SENSITIVE = create('hide-sensitive', true, { options: [true, false], parseJSON });
76
76
  export const SHOW_PRE_RELEASE = create('show-pre-release', false, { options: [false, true], parseJSON });
77
- export const SHOW_CHART_MODE = create('chart-mode', 'featured', { parseJSON });
78
77
 
79
78
  export const DATE_FORMAT = create('date-format', 'ddd, MMM D YYYY', {
80
79
  options: [
@@ -150,6 +149,11 @@ export const getters = {
150
149
 
151
150
  const def = clone(definition.def);
152
151
 
152
+ if (key === THEME) {
153
+ // 无论 state 里存的是什么,都强制返回 light
154
+ return 'light';
155
+ }
156
+
153
157
  return def;
154
158
  },
155
159
 
@@ -471,7 +475,9 @@ export const actions = {
471
475
  try {
472
476
  value = JSON.parse(value);
473
477
  } catch (err) {
474
- console.error('Error parsing server pref', key, value, err); // eslint-disable-line no-console
478
+ // 容错处理:如果后端返回 map[...] 这样的字符串,直接忽略或重置为空
479
+ console.warn(`Pref ${ key } has invalid JSON, resetting`, value);
480
+ value = definition.defaultValue || null;
475
481
  continue;
476
482
  }
477
483
  }
@@ -3,18 +3,21 @@ import { MutationTree, GetterTree, ActionTree } from 'vuex';
3
3
 
4
4
  export interface SlideInPanelState {
5
5
  isOpen: boolean;
6
+ isClosing: boolean;
6
7
  component: Component | null;
7
8
  componentProps: Record<string, any>;
8
9
  }
9
10
 
10
11
  const state = (): SlideInPanelState => ({
11
12
  isOpen: false,
13
+ isClosing: false,
12
14
  component: null,
13
15
  componentProps: {}
14
16
  });
15
17
 
16
18
  const getters: GetterTree<SlideInPanelState, any> = {
17
19
  isOpen: (state) => state.isOpen,
20
+ isClosing: (state) => state.isClosing,
18
21
  component: (state) => state.component,
19
22
  componentProps: (state) => state.componentProps
20
23
  };
@@ -26,12 +29,15 @@ const mutations: MutationTree<SlideInPanelState> = {
26
29
  state.componentProps = payload.componentProps || {};
27
30
  },
28
31
  close(state) {
32
+ state.isClosing = true;
29
33
  state.isOpen = false;
30
34
 
31
35
  // Delay clearing component/props for 500ms (same as transition duration)
32
36
  setTimeout(() => {
33
37
  state.component = null;
34
38
  state.componentProps = {};
39
+
40
+ state.isClosing = false;
35
41
  }, 500);
36
42
  }
37
43
  };