dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-logTest.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 (761) 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/iconsNew/demo.css +539 -0
  13. package/assets/iconsNew/demo.css:Zone.Identifier +0 -0
  14. package/assets/iconsNew/demo_index.html +303 -0
  15. package/assets/iconsNew/demo_index.html:Zone.Identifier +0 -0
  16. package/assets/iconsNew/iconfont.css +43 -0
  17. package/assets/iconsNew/iconfont.css:Zone.Identifier +0 -0
  18. package/assets/iconsNew/iconfont.js +1 -0
  19. package/assets/iconsNew/iconfont.js:Zone.Identifier +0 -0
  20. package/assets/iconsNew/iconfont.json +44 -0
  21. package/assets/iconsNew/iconfont.json:Zone.Identifier +0 -0
  22. package/assets/iconsNew/iconfont.ttf +0 -0
  23. package/assets/iconsNew/iconfont.ttf:Zone.Identifier +0 -0
  24. package/assets/iconsNew/iconfont.woff +0 -0
  25. package/assets/iconsNew/iconfont.woff2 +0 -0
  26. package/assets/iconsNew/iconfont.woff2:Zone.Identifier +0 -0
  27. package/assets/iconsNew/iconfont.woff:Zone.Identifier +0 -0
  28. package/assets/images/icons/document.svg +3 -0
  29. package/assets/images/key.svg +17 -0
  30. package/assets/images/pl/dark/logo.png +0 -0
  31. package/assets/images/providers/sks.svg +1 -0
  32. package/assets/images/vendor/cognito.svg +1 -0
  33. package/assets/styles/all.scss +23 -3
  34. package/assets/styles/app.scss +4 -0
  35. package/assets/styles/base/_basic.scss +10 -0
  36. package/assets/styles/base/_helpers.scss +1 -1
  37. package/assets/styles/base/_spacing.scss +29 -0
  38. package/assets/styles/base/_variables.scss +21 -15
  39. package/assets/styles/fonts/_icons.scss +3 -2
  40. package/assets/styles/global/_button.scss +8 -8
  41. package/assets/styles/global/_form.scss +1 -0
  42. package/assets/styles/global/_labeled-input.scss +1 -1
  43. package/assets/styles/global/_layout.scss +1 -1
  44. package/assets/styles/global/_select.scss +1 -1
  45. package/assets/styles/global/_tooltip.scss +9 -5
  46. package/assets/styles/themes/_dark.scss +30 -0
  47. package/assets/styles/themes/_light.scss +85 -5
  48. package/assets/styles/vendor/vue-select.scss +2 -1
  49. package/assets/translations/en-us.yaml +886 -105
  50. package/assets/translations/zh-hans.yaml +298 -25
  51. package/chart/__tests__/S3.test.ts +2 -1
  52. package/chart/monitoring/index.vue +1 -1
  53. package/cloud-credential/gcp.vue +9 -1
  54. package/components/ActionDropdown.vue +1 -1
  55. package/components/ActionMenuShell.vue +3 -7
  56. package/components/AppModal.vue +9 -28
  57. package/components/AsyncButton.vue +2 -0
  58. package/components/BrandImage.vue +0 -21
  59. package/components/ButtonDropdown.vue +3 -1
  60. package/components/Certificates.vue +5 -0
  61. package/components/ClusterIconMenu.vue +1 -1
  62. package/components/CodeMirror.vue +9 -7
  63. package/components/CommunityLinks.vue +3 -58
  64. package/components/ConfigMapSettings/Settings.vue +377 -0
  65. package/components/ConfigMapSettings/index.vue +354 -0
  66. package/components/ConsumptionGauge.vue +1 -1
  67. package/components/ContainerResourceLimit.vue +2 -2
  68. package/components/CopyToClipboard.vue +15 -0
  69. package/components/CruResource.vue +106 -18
  70. package/components/DetailText.vue +61 -11
  71. package/components/Drawer/Chrome.vue +115 -0
  72. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +64 -0
  73. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  74. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  75. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  76. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
  77. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  78. package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
  79. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  80. package/components/Drawer/ResourceDetailDrawer/index.vue +124 -0
  81. package/components/ExplorerMembers.vue +28 -4
  82. package/components/ExplorerProjectsNamespaces.vue +46 -29
  83. package/components/FilterPanel.vue +156 -0
  84. package/components/FixedBanner.vue +19 -5
  85. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  86. package/components/GlobalRoleBindings.vue +69 -114
  87. package/components/GrowlManager.vue +16 -15
  88. package/components/IconOrSvg.vue +19 -35
  89. package/components/KeyValueView.vue +1 -1
  90. package/components/LandingPagePreference.vue +2 -0
  91. package/components/Loading.vue +1 -1
  92. package/components/LocaleSelector.vue +10 -2
  93. package/components/PaginatedResourceTable.vue +53 -1
  94. package/components/PodSecurityAdmission.vue +2 -2
  95. package/components/ProgressBarMulti.vue +1 -0
  96. package/components/PromptModal.vue +38 -7
  97. package/components/PromptRemove.vue +28 -2
  98. package/components/PromptRestore.vue +22 -44
  99. package/components/RelatedResources.vue +7 -12
  100. package/components/Resource/Detail/Additional.vue +46 -0
  101. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  102. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  103. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  104. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  105. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  106. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  107. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  108. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  109. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  110. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  111. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  112. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  113. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  114. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  115. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  116. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  117. package/components/Resource/Detail/Card/index.vue +56 -0
  118. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  119. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  120. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  121. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  122. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  123. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
  124. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
  125. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +138 -0
  126. package/components/Resource/Detail/Metadata/KeyValue.vue +144 -0
  127. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  128. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  129. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  130. package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
  131. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  132. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  133. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  134. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  135. package/components/Resource/Detail/Metadata/composables.ts +81 -0
  136. package/components/Resource/Detail/Metadata/index.vue +90 -0
  137. package/components/Resource/Detail/Page.vue +37 -0
  138. package/components/Resource/Detail/PercentageBar.vue +40 -0
  139. package/components/Resource/Detail/ResourceRow.vue +138 -0
  140. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  141. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  142. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  143. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  144. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  145. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  146. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  147. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  148. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  149. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  150. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  151. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  152. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  153. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  154. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  155. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  156. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  157. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  158. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  159. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  160. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  161. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  162. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  163. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  164. package/components/Resource/Detail/SpacedRow.vue +14 -0
  165. package/components/Resource/Detail/StatusBar.vue +59 -0
  166. package/components/Resource/Detail/StatusRow.vue +61 -0
  167. package/components/Resource/Detail/TitleBar/Title.vue +15 -0
  168. package/components/Resource/Detail/TitleBar/Top.vue +16 -0
  169. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  170. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  171. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  172. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  173. package/components/Resource/Detail/TitleBar/composables.ts +61 -0
  174. package/components/Resource/Detail/TitleBar/index.vue +302 -0
  175. package/components/Resource/Detail/Top/index.vue +34 -0
  176. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  177. package/components/Resource/Detail/composables.ts +45 -0
  178. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  179. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  180. package/components/ResourceDetail/Masthead/index.vue +65 -0
  181. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  182. package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +240 -169
  183. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  184. package/components/ResourceDetail/index.vue +75 -575
  185. package/components/ResourceDetail/legacy.vue +580 -0
  186. package/components/ResourceList/Masthead.vue +74 -29
  187. package/components/ResourceList/index.vue +3 -2
  188. package/components/ResourceTable.vue +75 -85
  189. package/components/ResourceYaml.vue +15 -2
  190. package/components/RichTranslation.vue +106 -0
  191. package/components/SideNav.vue +21 -21
  192. package/components/SingleClusterInfo.vue +2 -1
  193. package/components/SlideInPanelManager.vue +116 -14
  194. package/components/SortableTable/THead.vue +46 -1
  195. package/components/SortableTable/index.vue +66 -22
  196. package/components/SortableTable/paging.js +15 -16
  197. package/components/SortableTable/selection.js +22 -10
  198. package/components/StateDot/index.vue +28 -0
  199. package/components/StatusBadge.vue +6 -4
  200. package/components/SubtleLink.vue +25 -0
  201. package/components/Tabbed/index.vue +43 -22
  202. package/components/Wizard.vue +16 -3
  203. package/components/YamlEditor.vue +1 -2
  204. package/components/__tests__/AsyncButton.test.ts +39 -0
  205. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  206. package/components/__tests__/CruResource.test.ts +63 -0
  207. package/components/__tests__/FilterPanel.test.ts +81 -0
  208. package/components/__tests__/GrowlManager.test.ts +0 -25
  209. package/components/__tests__/PromptModal.test.ts +146 -0
  210. package/components/__tests__/PromptRestore.test.ts +1 -65
  211. package/components/__tests__/RichTranslation.test.ts +115 -0
  212. package/components/auth/AuthBanner.vue +15 -14
  213. package/components/auth/Principal.vue +50 -19
  214. package/components/auth/RoleDetailEdit.vue +55 -11
  215. package/components/auth/login/ldap.vue +2 -2
  216. package/components/auth/login/oidc.vue +6 -1
  217. package/components/breadcrumb/index.vue +119 -0
  218. package/components/fleet/FleetApplications.vue +174 -0
  219. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  220. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  221. package/components/fleet/FleetClusters.vue +25 -6
  222. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  223. package/components/fleet/FleetHelmOps.vue +123 -0
  224. package/components/fleet/FleetIntro.vue +58 -28
  225. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  226. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  227. package/components/fleet/FleetRepos.vue +37 -80
  228. package/components/fleet/FleetResources.vue +69 -27
  229. package/components/fleet/FleetSummary.vue +26 -51
  230. package/components/fleet/FleetValuesFrom.vue +295 -0
  231. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  232. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  233. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  234. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  235. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  236. package/components/fleet/dashboard/Empty.vue +73 -0
  237. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  238. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  239. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  240. package/components/fleet/dashboard/ResourcePanel.vue +384 -0
  241. package/components/form/ArrayList.vue +187 -142
  242. package/components/form/ArrayListGrouped.vue +5 -3
  243. package/components/form/BannerSettings.vue +117 -50
  244. package/components/form/ChangePassword.vue +4 -2
  245. package/components/form/ClusterAppearance.vue +4 -3
  246. package/components/form/ColorInput.vue +35 -6
  247. package/components/form/Command.vue +4 -5
  248. package/components/form/Conditions.vue +15 -1
  249. package/components/form/FileImageSelector.vue +1 -1
  250. package/components/form/Footer.vue +11 -4
  251. package/components/form/HealthCheck.vue +0 -2
  252. package/components/form/HookOption.vue +87 -58
  253. package/components/form/InputWithSelect.vue +8 -7
  254. package/components/form/KeyValue.vue +112 -53
  255. package/components/form/LabeledSelect.vue +76 -55
  256. package/components/form/Labels.vue +92 -22
  257. package/components/form/MatchExpressions.vue +59 -12
  258. package/components/form/Members/ClusterMembershipEditor.vue +1 -1
  259. package/components/form/Members/ClusterPermissionsEditor.vue +60 -41
  260. package/components/form/Members/MembershipEditor.vue +4 -4
  261. package/components/form/Members/ProjectMembershipEditor.vue +1 -1
  262. package/components/form/NameNsDescription.vue +15 -10
  263. package/components/form/Networking.vue +30 -28
  264. package/components/form/NodeAffinity.vue +29 -28
  265. package/components/form/NotificationSettings.vue +15 -1
  266. package/components/form/PodAffinity.vue +23 -23
  267. package/components/form/Probe.vue +15 -11
  268. package/components/form/ProjectMemberEditor.vue +66 -48
  269. package/components/form/ResourceLabeledSelect.vue +22 -8
  270. package/components/form/ResourceQuota/Namespace.vue +4 -4
  271. package/components/form/ResourceQuota/NamespaceRow.vue +11 -9
  272. package/components/form/ResourceQuota/Project.vue +4 -4
  273. package/components/form/ResourceQuota/ProjectRow.vue +36 -30
  274. package/components/form/ResourceSelector.vue +28 -24
  275. package/components/form/ResourceTabs/index.vue +7 -1
  276. package/components/form/SSHKnownHosts/index.vue +14 -11
  277. package/components/form/SecretSelector.vue +40 -23
  278. package/components/form/Security.vue +1 -3
  279. package/components/form/Select.vue +64 -27
  280. package/components/form/SelectOrCreateAuthSecret.vue +6 -3
  281. package/components/form/ServiceNameSelect.vue +2 -5
  282. package/components/form/ServicePorts.vue +149 -75
  283. package/components/form/SimpleSecretSelector.vue +17 -4
  284. package/components/form/Taints.vue +23 -3
  285. package/components/form/Tolerations.vue +13 -9
  286. package/components/form/UnitInput.vue +21 -0
  287. package/components/form/ValueFromResource.vue +136 -110
  288. package/components/form/WorkloadPorts.vue +143 -123
  289. package/components/form/__tests__/ArrayList.test.ts +32 -0
  290. package/components/form/__tests__/ColorInput.test.ts +35 -0
  291. package/components/form/__tests__/KeyValue.test.ts +36 -0
  292. package/components/form/__tests__/LabeledSelect.test.ts +79 -2
  293. package/components/form/__tests__/Labels.test.ts +360 -0
  294. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  295. package/components/form/__tests__/Networking.test.ts +116 -0
  296. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  297. package/components/form/__tests__/Select.test.ts +37 -1
  298. package/components/form/__tests__/UnitInput.test.ts +23 -1
  299. package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
  300. package/components/formatter/ClusterLink.vue +5 -8
  301. package/components/formatter/Description.vue +30 -0
  302. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  303. package/components/formatter/FleetApplicationSource.vue +79 -0
  304. package/components/formatter/FleetSummaryGraph.vue +7 -0
  305. package/components/formatter/PodImages.vue +1 -1
  306. package/components/formatter/WorkloadHealthScale.vue +5 -4
  307. package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
  308. package/components/formatter/__tests__/LiveDate.test.ts +10 -2
  309. package/components/google/AccountAccess.vue +209 -0
  310. package/components/google/types/gcp.d.ts +136 -0
  311. package/components/google/types/index.d.ts +101 -0
  312. package/components/google/util/__mocks__/gcp.ts +465 -0
  313. package/components/google/util/formatter.ts +82 -0
  314. package/components/google/util/gcp.ts +134 -0
  315. package/components/google/util/index.d.ts +11 -0
  316. package/components/nav/Favorite.vue +1 -1
  317. package/components/nav/Group.vue +13 -1
  318. package/components/nav/Header.vue +44 -179
  319. package/components/nav/NamespaceFilter.vue +126 -75
  320. package/components/nav/NotificationCenter/Notification.vue +484 -0
  321. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  322. package/components/nav/NotificationCenter/index.vue +148 -0
  323. package/components/nav/TopLevelMenu.helper.ts +55 -34
  324. package/components/nav/TopLevelMenu.vue +110 -125
  325. package/components/nav/Type.vue +15 -4
  326. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  327. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  328. package/components/nav/WindowManager/index.vue +3 -2
  329. package/components/templates/default.vue +0 -3
  330. package/components/templates/plain.vue +0 -3
  331. package/composables/drawer.ts +26 -0
  332. package/composables/focusTrap.ts +3 -3
  333. package/composables/resources.test.ts +63 -0
  334. package/composables/resources.ts +38 -0
  335. package/composables/useI18n.ts +12 -11
  336. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  337. package/config/labels-annotations.js +22 -11
  338. package/config/menuRouteMap.js +10 -0
  339. package/config/pagination-table-headers.js +8 -1
  340. package/config/private-label.js +0 -1
  341. package/config/product/auth.js +20 -3
  342. package/config/product/{cis.js → compliance.js} +23 -26
  343. package/config/product/explorer.js +80 -26
  344. package/config/product/fleet.js +77 -17
  345. package/config/product/manager.js +29 -46
  346. package/config/product/settings.js +23 -11
  347. package/config/product/uiplugins.js +13 -10
  348. package/config/query-params.js +16 -1
  349. package/config/roles.ts +2 -1
  350. package/config/router/navigation-guards/authentication.js +51 -2
  351. package/config/router/navigation-guards/index.js +16 -20
  352. package/config/router/routes.js +65 -31
  353. package/config/secret.ts +15 -0
  354. package/config/settings.ts +33 -16
  355. package/config/store.js +2 -0
  356. package/config/system-namespaces.js +1 -1
  357. package/config/table-headers.js +91 -30
  358. package/config/types.js +18 -7
  359. package/config/version.js +1 -1
  360. package/core/plugin-helpers.ts +3 -2
  361. package/core/plugin.ts +32 -7
  362. package/core/types.ts +25 -7
  363. package/detail/catalog.cattle.io.app.vue +5 -1
  364. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  365. package/detail/fleet.cattle.io.bundle.vue +70 -6
  366. package/detail/fleet.cattle.io.cluster.vue +28 -15
  367. package/detail/fleet.cattle.io.gitrepo.vue +11 -2
  368. package/detail/fleet.cattle.io.helmop.vue +157 -0
  369. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  370. package/detail/management.cattle.io.oidcclient.vue +369 -0
  371. package/detail/namespace.vue +0 -3
  372. package/detail/node.vue +48 -39
  373. package/detail/pod.vue +2 -2
  374. package/detail/provisioning.cattle.io.cluster.vue +16 -50
  375. package/detail/service.vue +10 -2
  376. package/detail/workload/index.vue +48 -39
  377. package/dialog/AddCustomBadgeDialog.vue +17 -10
  378. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  379. package/dialog/AddonConfigConfirmationDialog.vue +1 -1
  380. package/dialog/AssignToDialog.vue +176 -0
  381. package/dialog/ChangePasswordDialog.vue +106 -0
  382. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  383. package/dialog/DisableAuthProviderDialog.vue +101 -0
  384. package/dialog/DrainNode.vue +1 -1
  385. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  386. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
  387. package/dialog/FeatureFlagListDialog.vue +288 -0
  388. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  389. package/dialog/GenericPrompt.vue +1 -1
  390. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  391. package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
  392. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  393. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  394. package/dialog/MoveNamespaceDialog.vue +157 -0
  395. package/dialog/OidcClientSecretDialog.vue +117 -0
  396. package/dialog/RedeployWorkloadDialog.vue +164 -0
  397. package/dialog/RollbackWorkloadDialog.vue +1 -1
  398. package/dialog/RotateEncryptionKeyDialog.vue +10 -30
  399. package/dialog/ScalePoolDownDialog.vue +1 -1
  400. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  401. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  402. package/dialog/WechatDialog.vue +57 -0
  403. package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
  404. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  405. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  406. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  407. package/edit/__tests__/service.test.ts +2 -1
  408. package/edit/auth/ldap/__tests__/config.test.ts +14 -0
  409. package/edit/auth/ldap/config.vue +24 -0
  410. package/edit/auth/oidc.vue +159 -93
  411. package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
  412. package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +9 -6
  413. package/edit/autoscaling.horizontalpodautoscaler/index.vue +7 -2
  414. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
  415. package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
  416. package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
  417. package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
  418. package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
  419. package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
  420. package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
  421. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  422. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  423. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  424. package/edit/configmap.vue +12 -2
  425. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  426. package/edit/fleet.cattle.io.gitrepo.vue +70 -256
  427. package/edit/fleet.cattle.io.helmop.vue +786 -0
  428. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  429. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  430. package/edit/logging-flow/index.vue +2 -2
  431. package/edit/logging.banzaicloud.io.output/index.vue +2 -1
  432. package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +8 -9
  433. package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +19 -19
  434. package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +23 -23
  435. package/edit/logging.banzaicloud.io.output/providers/datadog.vue +19 -19
  436. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +14 -14
  437. package/edit/logging.banzaicloud.io.output/providers/forward.vue +12 -12
  438. package/edit/logging.banzaicloud.io.output/providers/gcs.vue +23 -23
  439. package/edit/logging.banzaicloud.io.output/providers/gelf.vue +6 -6
  440. package/edit/logging.banzaicloud.io.output/providers/kafka.vue +10 -10
  441. package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +8 -8
  442. package/edit/logging.banzaicloud.io.output/providers/logdna.vue +17 -17
  443. package/edit/logging.banzaicloud.io.output/providers/logz.vue +7 -7
  444. package/edit/logging.banzaicloud.io.output/providers/loki.vue +12 -12
  445. package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +3 -3
  446. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +14 -14
  447. package/edit/logging.banzaicloud.io.output/providers/redis.vue +6 -6
  448. package/edit/logging.banzaicloud.io.output/providers/s3.vue +23 -23
  449. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +13 -13
  450. package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +2 -2
  451. package/edit/logging.banzaicloud.io.output/providers/syslog.vue +54 -54
  452. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  453. package/edit/management.cattle.io.oidcclient.vue +162 -0
  454. package/edit/management.cattle.io.project.vue +4 -1
  455. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  456. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  457. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  458. package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
  459. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  460. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  461. package/edit/monitoring.coreos.com.route.vue +1 -0
  462. package/edit/namespace.vue +2 -4
  463. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  464. package/edit/networking.k8s.io.ingress/Certificate.vue +25 -8
  465. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  466. package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
  467. package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
  468. package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
  469. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  470. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +6 -17
  471. package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
  472. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +69 -73
  473. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
  474. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
  475. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
  476. package/edit/networking.k8s.io.networkpolicy/index.vue +24 -32
  477. package/edit/node.vue +1 -0
  478. package/edit/persistentvolume/index.vue +7 -2
  479. package/edit/persistentvolumeclaim.vue +2 -0
  480. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  481. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
  482. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  483. package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
  484. package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
  485. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +49 -40
  486. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  487. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  488. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
  489. package/edit/resources.cattle.io.restore.vue +1 -1
  490. package/edit/secret/basic.vue +1 -0
  491. package/edit/secret/index.vue +129 -17
  492. package/edit/service.vue +21 -30
  493. package/edit/serviceaccount.vue +4 -1
  494. package/edit/storage.k8s.io.storageclass/index.vue +14 -9
  495. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
  496. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
  497. package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
  498. package/edit/workload/Job.vue +31 -34
  499. package/edit/workload/Upgrading.vue +5 -5
  500. package/edit/workload/index.vue +32 -32
  501. package/edit/workload/mixins/workload.js +0 -2
  502. package/edit/workload/storage/Mount.vue +1 -0
  503. package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
  504. package/edit/workload/storage/azureDisk.vue +14 -10
  505. package/edit/workload/storage/azureFile.vue +9 -7
  506. package/edit/workload/storage/csi/index.vue +6 -9
  507. package/edit/workload/storage/emptyDir.vue +7 -5
  508. package/edit/workload/storage/gcePersistentDisk.vue +9 -7
  509. package/edit/workload/storage/hostPath.vue +7 -5
  510. package/edit/workload/storage/nfs.vue +8 -6
  511. package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
  512. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +20 -15
  513. package/edit/workload/storage/secret.vue +9 -6
  514. package/edit/workload/storage/vsphereVolume.vue +11 -7
  515. package/initialize/app-extended.js +7 -1
  516. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  517. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  518. package/list/fleet.cattle.io.helmop.vue +108 -0
  519. package/list/harvesterhci.io.management.cluster.vue +0 -17
  520. package/list/management.cattle.io.feature.vue +4 -288
  521. package/list/management.cattle.io.oidcclient.vue +108 -0
  522. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +8 -6
  523. package/list/management.cattle.io.user.vue +13 -20
  524. package/list/namespace.vue +6 -2
  525. package/list/node.vue +2 -0
  526. package/list/projectsecret.vue +345 -0
  527. package/list/secret.vue +109 -0
  528. package/list/workload.vue +6 -2
  529. package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
  530. package/machine-config/amazonec2.vue +3 -24
  531. package/machine-config/components/GCEImage.vue +374 -0
  532. package/machine-config/google.vue +617 -0
  533. package/machine-config/vmwarevsphere.vue +7 -17
  534. package/mixins/__tests__/brand.spec.ts +170 -0
  535. package/mixins/auth-config.js +8 -1
  536. package/mixins/brand.js +16 -17
  537. package/mixins/create-edit-view/impl.js +20 -1
  538. package/mixins/create-edit-view/index.js +5 -0
  539. package/mixins/preset.js +100 -0
  540. package/mixins/resource-fetch-api-pagination.js +73 -44
  541. package/mixins/resource-fetch.js +18 -8
  542. package/mixins/resource-table-watch.js +45 -0
  543. package/mixins/vue-select-overrides.js +1 -4
  544. package/models/__tests__/chart.test.ts +296 -0
  545. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  546. package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
  547. package/models/__tests__/node.test.ts +7 -63
  548. package/models/__tests__/workload.test.ts +1 -0
  549. package/models/chart.js +157 -2
  550. package/models/cluster/node.js +2 -1
  551. package/models/cluster.js +32 -2
  552. package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
  553. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  554. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  555. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  556. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  557. package/models/fleet-application.js +297 -0
  558. package/models/fleet.cattle.io.bundle.js +9 -8
  559. package/models/fleet.cattle.io.cluster.js +21 -4
  560. package/models/fleet.cattle.io.gitrepo.js +46 -382
  561. package/models/fleet.cattle.io.helmop.js +202 -0
  562. package/models/management.cattle.io.authconfig.js +1 -0
  563. package/models/management.cattle.io.cluster.js +0 -20
  564. package/models/management.cattle.io.feature.js +7 -1
  565. package/models/management.cattle.io.fleetworkspace.js +14 -1
  566. package/models/management.cattle.io.node.js +7 -22
  567. package/models/management.cattle.io.nodepool.js +12 -0
  568. package/models/management.cattle.io.oidcclient.js +18 -0
  569. package/models/management.cattle.io.registration.js +3 -0
  570. package/models/management.cattle.io.setting.js +0 -1
  571. package/models/namespace.js +12 -1
  572. package/models/provisioning.cattle.io.cluster.js +79 -115
  573. package/models/secret.js +157 -2
  574. package/models/service.js +28 -9
  575. package/models/storage.k8s.io.storageclass.js +2 -2
  576. package/models/workload.js +93 -53
  577. package/package.json +6 -5
  578. package/pages/about.vue +17 -61
  579. package/pages/account/index.vue +105 -116
  580. package/pages/auth/login.vue +2 -3
  581. package/pages/auth/setup.vue +36 -17
  582. package/pages/auth/verify.vue +13 -1
  583. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  584. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  585. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
  586. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  587. package/pages/c/_cluster/apps/charts/index.vue +501 -468
  588. package/pages/c/_cluster/apps/charts/install.vue +0 -1
  589. package/pages/c/_cluster/auth/roles/index.vue +72 -44
  590. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  591. package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -1
  592. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  593. package/pages/c/_cluster/explorer/index.vue +16 -4
  594. package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
  595. package/pages/c/_cluster/explorer/tools/index.vue +6 -6
  596. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  597. package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
  598. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  599. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  600. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  601. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  602. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  603. package/pages/c/_cluster/fleet/index.vue +866 -328
  604. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  605. package/pages/c/_cluster/longhorn/index.vue +5 -2
  606. package/pages/c/_cluster/settings/banners.vue +56 -2
  607. package/pages/c/_cluster/settings/brand.vue +2 -1
  608. package/pages/c/_cluster/settings/performance.vue +7 -26
  609. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  610. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  611. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  612. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  613. package/pages/explorer/resource/detail/configmap.vue +42 -0
  614. package/pages/explorer/resource/detail/projectsecret.vue +9 -0
  615. package/pages/explorer/resource/detail/secret.vue +63 -0
  616. package/pages/home.vue +63 -117
  617. package/pages/prefs.vue +0 -1
  618. package/pages/support/index.vue +4 -6
  619. package/pkg/tsconfig.json +9 -9
  620. package/pkg/vue.config.js +1 -1
  621. package/plugins/clean-html.js +2 -0
  622. package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
  623. package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
  624. package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
  625. package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
  626. package/plugins/dashboard-store/actions.js +213 -56
  627. package/plugins/dashboard-store/getters.js +112 -24
  628. package/plugins/dashboard-store/mutations.js +61 -12
  629. package/plugins/dashboard-store/normalize.js +29 -19
  630. package/plugins/dashboard-store/resource-class.js +105 -21
  631. package/plugins/steve/__tests__/getters.test.ts +19 -12
  632. package/plugins/steve/__tests__/steve-class.test.ts +1 -0
  633. package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
  634. package/plugins/steve/actions.js +37 -24
  635. package/plugins/steve/getters.js +47 -12
  636. package/plugins/steve/resourceWatcher.js +10 -3
  637. package/plugins/steve/steve-class.js +5 -0
  638. package/plugins/steve/steve-pagination-utils.ts +225 -43
  639. package/plugins/steve/subscribe.js +418 -53
  640. package/plugins/steve/worker/web-worker.advanced.js +5 -1
  641. package/public/favicon.png +0 -0
  642. package/public/index.html +1 -1
  643. package/rancher-components/BadgeState/BadgeState.vue +33 -52
  644. package/rancher-components/Banner/Banner.test.ts +51 -3
  645. package/rancher-components/Banner/Banner.vue +53 -10
  646. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  647. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
  648. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
  649. package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
  650. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  651. package/rancher-components/Form/Radio/RadioButton.vue +21 -5
  652. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  653. package/rancher-components/Form/Radio/RadioGroup.vue +90 -39
  654. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
  655. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
  656. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +32 -2
  657. package/rancher-components/RcButton/RcButton.vue +1 -1
  658. package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
  659. package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
  660. package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
  661. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
  662. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
  663. package/rancher-components/RcDropdown/index.ts +2 -0
  664. package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
  665. package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
  666. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  667. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  668. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  669. package/rancher-components/RcItemCard/index.ts +2 -0
  670. package/rancher-components/StringList/StringList.vue +1 -1
  671. package/scripts/build-pkg.sh +18 -23
  672. package/scripts/extension/publish +1 -1
  673. package/scripts/publish-shell.sh +1 -1
  674. package/static/loading-indicator.html +1 -1
  675. package/store/action-menu.js +26 -56
  676. package/store/auth.js +3 -0
  677. package/store/catalog.js +85 -25
  678. package/store/features.js +0 -1
  679. package/store/growl.js +97 -8
  680. package/store/i18n.js +5 -1
  681. package/store/index.js +48 -18
  682. package/store/notifications.ts +426 -0
  683. package/store/prefs.js +2 -8
  684. package/store/slideInPanel.ts +6 -0
  685. package/store/type-map.js +35 -20
  686. package/store/type-map.utils.ts +49 -6
  687. package/store/uiplugins.ts +15 -1
  688. package/types/fleet.d.ts +60 -1
  689. package/types/kube/kube-api.ts +34 -0
  690. package/types/notifications/index.ts +74 -0
  691. package/types/resources/fleet.d.ts +43 -0
  692. package/types/resources/pod-security-admission.ts +36 -0
  693. package/types/resources/settings.d.ts +107 -0
  694. package/types/resources/userPreferences.d.ts +13 -0
  695. package/types/shell/index.d.ts +949 -741
  696. package/types/store/dashboard-store.types.ts +57 -4
  697. package/types/store/pagination.types.ts +41 -9
  698. package/types/store/subscribe.types.ts +50 -0
  699. package/utils/__mocks__/tabbable.js +13 -0
  700. package/utils/__tests__/back-off.test.ts +354 -0
  701. package/utils/__tests__/create-yaml.test.ts +235 -0
  702. package/utils/__tests__/fleet.test.ts +148 -0
  703. package/utils/__tests__/kontainer.test.ts +19 -0
  704. package/utils/__tests__/object.test.ts +54 -1
  705. package/utils/__tests__/string.test.ts +273 -1
  706. package/utils/__tests__/time.test.ts +31 -0
  707. package/utils/auth.js +41 -6
  708. package/utils/back-off.ts +176 -0
  709. package/utils/cluster.js +24 -20
  710. package/utils/create-yaml.js +103 -9
  711. package/utils/crypto/encryption.ts +103 -0
  712. package/utils/cspAdaptor.ts +51 -0
  713. package/utils/error.js +26 -9
  714. package/utils/errorTranslate.json +410 -6
  715. package/utils/errorTranslateNew.json +39 -0
  716. package/utils/fleet-types.ts +0 -0
  717. package/utils/fleet.ts +204 -74
  718. package/utils/grafana.js +1 -0
  719. package/utils/kontainer.ts +3 -5
  720. package/utils/object.js +36 -12
  721. package/utils/pagination-utils.ts +50 -3
  722. package/utils/pagination-wrapper.ts +132 -50
  723. package/utils/perf-setting.utils.ts +28 -0
  724. package/utils/release-notes.ts +48 -0
  725. package/utils/roleFiltering.js +33 -0
  726. package/utils/selector-typed.ts +210 -0
  727. package/utils/selector.js +29 -6
  728. package/utils/settings.ts +4 -1
  729. package/utils/string.js +24 -0
  730. package/utils/style.ts +39 -0
  731. package/utils/{time.js → time.ts} +25 -6
  732. package/utils/uiplugins.ts +41 -8
  733. package/utils/v-sphere.ts +5 -1
  734. package/utils/validators/formRules/__tests__/index.test.ts +76 -6
  735. package/utils/validators/formRules/index.ts +99 -4
  736. package/utils/window.js +11 -7
  737. package/vue.config.js +1 -1
  738. package/.DS_Store +0 -0
  739. package/components/AssignTo.vue +0 -199
  740. package/components/DisableAuthProviderModal.vue +0 -115
  741. package/components/MoveModal.vue +0 -167
  742. package/components/PromptChangePassword.vue +0 -123
  743. package/components/ResourceList/Masthead-btn.vue +0 -225
  744. package/components/__tests__/ApplicationCard.test.ts +0 -27
  745. package/components/cards/ApplicationCard.vue +0 -145
  746. package/components/fleet/FleetBundleResources.vue +0 -86
  747. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  748. package/components/formatter/RKETemplateName.vue +0 -37
  749. package/config/product/legacy.js +0 -62
  750. package/config/secret.js +0 -14
  751. package/dialog/SaveAsRKETemplateDialog.vue +0 -139
  752. package/models/etcdbackup.js +0 -45
  753. package/pages/auth copy/login.vue +0 -595
  754. package/pages/auth copy/logout.vue +0 -47
  755. package/pages/auth copy/setup.vue +0 -523
  756. package/pages/auth copy/verify.vue +0 -203
  757. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  758. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  759. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  760. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  761. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
@@ -1,36 +1,49 @@
1
1
  <script>
2
- import { mapState } from 'vuex';
2
+ import debounce from 'lodash/debounce';
3
+ import { getVersionData } from '@shell/config/version';
4
+ import { mapState, mapGetters } from 'vuex';
5
+ import { isEmpty } from '@shell/utils/object';
3
6
  import { FLEET } from '@shell/config/types';
4
7
  import { WORKSPACE } from '@shell/store/prefs';
5
- import {
6
- getStateLabel,
7
- primaryDisplayStatusFromCount,
8
- STATES,
9
- STATES_ENUM,
10
- } from '@shell/plugins/dashboard-store/resource-class';
11
8
  import Loading from '@shell/components/Loading';
12
- import CollapsibleCard from '@shell/components/CollapsibleCard.vue';
13
- import ResourceTable from '@shell/components/ResourceTable';
14
- import CompoundStatusBadge from '@shell/components/CompoundStatusBadge';
15
9
  import { checkPermissions, checkSchemasForFindAllHash } from '@shell/utils/auth';
16
10
  import { WORKSPACE_ANNOTATION } from '@shell/config/labels-annotations';
17
11
  import { filterBy } from '@shell/utils/array';
18
- import FleetNoWorkspaces from '@shell/components/fleet/FleetNoWorkspaces.vue';
19
- import { NAME } from '@shell/config/product/fleet';
20
- import { xOfy } from '@shell/utils/string';
12
+ import NoWorkspaces from '@shell/components/fleet/FleetNoWorkspaces.vue';
13
+ import { RcButton } from '@components/RcButton';
14
+ import ResourcePanel from '@shell/components/fleet/dashboard/ResourcePanel.vue';
15
+ import ResourceCard from '@shell/components/fleet/dashboard/ResourceCard.vue';
16
+ import ResourceDetails from '@shell/components/fleet/dashboard/ResourceDetails.vue';
17
+ import EmptyDashboard from '@shell/components/fleet/dashboard/Empty.vue';
18
+ import ButtonGroup from '@shell/components/ButtonGroup';
19
+ import Checkbox from '@components/Form/Checkbox/Checkbox.vue';
20
+ import FleetApplications from '@shell/components/fleet/FleetApplications.vue';
21
+ import FleetUtils from '@shell/utils/fleet';
22
+ import Preset from '@shell/mixins/preset';
23
+
24
+ const VIEW_MODE = {
25
+ TABLE: 'flat',
26
+ CARDS: 'cards'
27
+ };
21
28
 
22
29
  export default {
23
30
  name: 'FleetDashboard',
24
31
  components: {
32
+ ButtonGroup,
33
+ Checkbox,
34
+ EmptyDashboard,
35
+ FleetApplications,
25
36
  Loading,
26
- ResourceTable,
27
- CollapsibleCard,
28
- CompoundStatusBadge,
29
- FleetNoWorkspaces
37
+ NoWorkspaces,
38
+ RcButton,
39
+ ResourceCard,
40
+ ResourcePanel,
30
41
  },
31
42
 
43
+ mixins: [Preset],
44
+
32
45
  async fetch() {
33
- const hash = await checkSchemasForFindAllHash({
46
+ const schemas = {
34
47
  fleetWorkspaces: {
35
48
  inStoreType: 'management',
36
49
  type: FLEET.WORKSPACE,
@@ -51,17 +64,37 @@ export default {
51
64
  inStoreType: 'management',
52
65
  type: FLEET.GIT_REPO,
53
66
  },
67
+ helmOps: {
68
+ inStoreType: 'management',
69
+ type: FLEET.HELM_OP,
70
+ },
54
71
  fleetClusters: {
55
72
  inStoreType: 'management',
56
73
  type: FLEET.CLUSTER,
57
74
  }
58
- }, this.$store);
75
+ };
76
+
77
+ const hash = await checkSchemasForFindAllHash(schemas, this.$store);
78
+
79
+ this.fleetWorkspaces = hash.fleetWorkspaces || [];
59
80
 
60
- this.gitRepos = hash.gitRepos;
61
- this.fleetWorkspacesData = hash.fleetWorkspaces || [];
81
+ this[FLEET.GIT_REPO] = hash.gitRepos || [];
82
+ this[FLEET.HELM_OP] = hash.helmOps || [];
62
83
 
63
84
  try {
64
- const permissions = await checkPermissions({ workspaces: { type: FLEET.WORKSPACE }, gitRepos: { type: FLEET.GIT_REPO, schemaValidator: (schema) => schema.resourceMethods.includes('PUT') } }, this.$store.getters);
85
+ const permissionsSchemas = {
86
+ workspaces: { type: FLEET.WORKSPACE },
87
+ gitRepos: {
88
+ type: FLEET.GIT_REPO,
89
+ schemaValidator: (schema) => schema.resourceMethods.includes('PUT')
90
+ },
91
+ helmOps: {
92
+ type: FLEET.HELM_OP,
93
+ schemaValidator: (schema) => schema.resourceMethods.includes('PUT')
94
+ },
95
+ };
96
+
97
+ const permissions = await checkPermissions(permissionsSchemas, this.$store.getters);
65
98
 
66
99
  this.permissions = permissions;
67
100
  } catch (e) {
@@ -71,211 +104,364 @@ export default {
71
104
 
72
105
  data() {
73
106
  return {
74
- admissableAreas: ['clusters', 'bundles', 'resources'],
75
- headers: [
107
+ permissions: {},
108
+ FLEET,
109
+ [FLEET.GIT_REPO]: [],
110
+ [FLEET.HELM_OP]: [],
111
+ fleetWorkspaces: [],
112
+ VIEW_MODE,
113
+ viewModeOptions: [
76
114
  {
77
- name: 'name',
78
- labelKey: 'tableHeaders.repoName',
79
- value: 'nameDisplay',
80
- sort: ['nameSort'],
81
- formatter: 'LinkDetail',
82
- canBeVariable: true,
115
+ tooltipKey: 'fleet.dashboard.viewMode.table',
116
+ icon: 'icon-list-flat',
117
+ value: VIEW_MODE.TABLE,
83
118
  },
84
119
  {
85
- name: 'clustersReady',
86
- labelKey: 'tableHeaders.clustersReady',
87
- value: 'status.readyClusters',
88
- sort: 'status.readyClusters',
89
- search: false,
120
+ tooltipKey: 'fleet.dashboard.viewMode.cards',
121
+ icon: 'icon-apps',
122
+ value: VIEW_MODE.CARDS,
90
123
  },
91
- {
92
- name: 'bundlesReady',
93
- labelKey: 'tableHeaders.bundlesReady',
94
- value: 'status.readyClusters',
95
- sort: 'status.readyClusters',
96
- search: false,
97
- },
98
- {
99
- name: 'resourcesReady',
100
- labelKey: 'tableHeaders.resourcesReady',
101
- value: 'status.resourceCounts.ready',
102
- sort: 'status.resourceCounts.ready',
103
- }
104
124
  ],
105
- schema: {},
106
- gitRepos: [],
107
- fleetWorkspacesData: [],
108
- isCollapsed: {},
109
- permissions: {},
110
- getStartedLink: {
111
- name: 'c-cluster-product-resource-create',
112
- params: {
113
- product: NAME,
114
- resource: FLEET.GIT_REPO
115
- },
116
- }
125
+ CARDS_MIN: 50,
126
+ CARDS_SIZE: 50,
127
+ cardsCount: {},
128
+ viewMode: VIEW_MODE.CARDS,
129
+ isWorkspaceCollapsed: {},
130
+ isStateCollapsed: {},
131
+ typeFilter: {},
132
+ stateFilter: {},
133
+ searchFilter: {},
134
+ selectedCard: null,
135
+ presetVersion: getVersionData()?.Version,
117
136
  };
118
137
  },
138
+
139
+ created() {
140
+ this.$store.dispatch('showWorkspaceSwitcher', false);
141
+
142
+ this.debouncedUpdateSearchFilter = debounce((workspace, value) => {
143
+ this.searchFilter[workspace] = value;
144
+ }, 300);
145
+ },
146
+
147
+ mounted() {
148
+ this.preset('cardsCount', 'object');
149
+ this.preset('viewMode', 'string');
150
+ },
151
+
152
+ beforeUnmount() {
153
+ this.$store.dispatch('showWorkspaceSwitcher', true);
154
+ },
155
+
119
156
  computed: {
120
157
  ...mapState(['workspace', 'allNamespaces']),
121
- fleetWorkspaces() {
122
- if (this.fleetWorkspacesData?.length) {
123
- return this.fleetWorkspacesData;
158
+ ...mapGetters({ isOpenSlideInPanel: 'slideInPanel/isOpen' }),
159
+ ...mapGetters({ isClosingSlideInPanel: 'slideInPanel/isClosing' }),
160
+
161
+ repoSchema() {
162
+ return this.$store.getters['management/schemaFor'](FLEET.GIT_REPO);
163
+ },
164
+
165
+ createRoute() {
166
+ return { name: 'c-cluster-fleet-application-create' };
167
+ },
168
+
169
+ workspaces() {
170
+ if (this.fleetWorkspaces?.length) {
171
+ return this.fleetWorkspaces;
124
172
  }
125
173
 
126
174
  // When user doesn't have access to the workspaces fall back to namespaces
127
175
  return this.allNamespaces.filter((item) => {
128
176
  return item.metadata.annotations[WORKSPACE_ANNOTATION] === WORKSPACE;
129
177
  }).map(( obj ) => {
130
- const repos = filterBy(this.gitRepos, 'metadata.namespace', obj.id);
178
+ const repos = filterBy(this[FLEET.GIT_REPO], 'metadata.namespace', obj.id);
179
+ const helmOps = filterBy(this[FLEET.HELM_OP], 'metadata.namespace', obj.id);
131
180
 
132
181
  return {
133
182
  ...obj,
134
- counts: {
135
- clusters: '-',
136
- clusterGroups: '-',
137
- gitRepos: repos.length
138
- },
139
183
  repos,
140
- nameDisplay: obj.id
184
+ helmOps,
185
+ id: obj.id
141
186
  };
142
187
  });
143
188
  },
144
- workspacesData() {
145
- return this.fleetWorkspaces.filter((ws) => ws.counts.gitRepos > 0);
189
+
190
+ applicationStates() {
191
+ return this._groupByWorkspace((ws) => this._resourceStates([...ws.repos, ...ws.helmOps]));
146
192
  },
147
- emptyWorkspaces() {
148
- return this.fleetWorkspaces.filter((ws) => ws.counts.gitRepos === 0);
193
+
194
+ clusterStates() {
195
+ return this._groupByWorkspace((ws) => this._resourceStates(ws.clusters));
149
196
  },
150
- areAllCardsExpanded() {
151
- return Object.keys(this.isCollapsed).every((key) => !this.isCollapsed[key]);
197
+
198
+ clusterGroupsStates() {
199
+ return this._groupByWorkspace((ws) => this._resourceStates(ws.clusterGroups));
152
200
  },
153
- gitReposCounts() {
154
- return this.gitRepos.reduce((prev, gitRepo) => {
155
- prev[gitRepo.id] = {
156
- bundles: gitRepo.allBundlesStatuses,
157
- resources: gitRepo.allResourceStatuses,
158
- };
159
201
 
160
- return prev;
161
- }, {});
202
+ cardResources() {
203
+ return this._groupByWorkspace((ws) => {
204
+ const filtered = this.applicationStates[ws.id].reduce((acc, state) => ({
205
+ ...acc,
206
+ [state.stateDisplay]: this._filterResources(state),
207
+ }), {});
208
+
209
+ return filtered;
210
+ });
162
211
  },
163
- },
164
- methods: {
165
- setWorkspaceFilterAndLinkToGitRepo(value) {
166
- this.$store.commit('updateWorkspace', { value, getters: this.$store.getters } );
167
- this.$store.dispatch('prefs/set', { key: WORKSPACE, value });
168
-
169
- this.$router.push({
170
- name: 'c-cluster-product-resource',
171
- params: {
172
- product: NAME,
173
- resource: FLEET.GIT_REPO
174
- },
212
+
213
+ tableResources() {
214
+ return this._groupByWorkspace((ws) => {
215
+ const filtered = this.applicationStates[ws.id].reduce((acc, state) => ([
216
+ ...acc,
217
+ ...this._filterResources(state)
218
+ ]), []);
219
+
220
+ return filtered;
175
221
  });
176
222
  },
177
- getStatusInfo(area, row, rowCounts) {
178
- const defaultStatusInfo = {
179
- badgeClass: `${ STATES[STATES_ENUM.NOT_READY].color } badge-class-default`,
180
- icon: STATES[STATES_ENUM.NOT_READY].compoundIcon
181
- };
182
223
 
183
- // classes are defined in the themes SASS files...
184
- return this.getBadgeClassAndIcon(area, row, rowCounts) || defaultStatusInfo;
224
+ isEmptyDashboard() {
225
+ return this[FLEET.GIT_REPO]?.length === 0 && this[FLEET.HELM_OP]?.length === 0;
185
226
  },
186
- getBadgeClassAndIcon(area, row, rowCounts) {
187
- if (!this.admissableAreas.includes(area)) {
188
- return false;
189
- }
190
227
 
191
- let group;
228
+ allCardsExpanded() {
229
+ return Object.keys(this.isWorkspaceCollapsed).every((key) => !this.isWorkspaceCollapsed[key]);
230
+ },
231
+ },
232
+
233
+ methods: {
234
+ selectStates(workspace, state) {
235
+ this._checkInit(workspace, 'stateFilter');
192
236
 
193
- if (area === 'clusters') {
194
- const clusterInfo = row.clusterInfo;
195
- const state = clusterInfo.ready === clusterInfo.total ? STATES_ENUM.ACTIVE : STATES_ENUM.NOT_READY;
237
+ this._cleanStateFilter(workspace);
196
238
 
197
- return {
198
- badgeClass: `${ STATES[state].color } badge-class-area-${ area }`,
199
- icon: STATES[state].compoundIcon
200
- };
201
- } else if (area === 'bundles') {
202
- group = rowCounts[row.id].bundles;
203
- } else if (area === 'resources') {
204
- group = rowCounts[row.id].resources;
239
+ if (this.stateFilter[workspace][state]) {
240
+ delete this.stateFilter[workspace][state];
205
241
  } else {
206
- // unreachable
207
- return false;
242
+ this.stateFilter[workspace][state] = true;
208
243
  }
209
244
 
210
- if (group.total === group.states.ready) {
211
- return {
212
- badgeClass: STATES[STATES_ENUM.ACTIVE].color,
213
- icon: STATES[STATES_ENUM.ACTIVE].compoundIcon,
214
- };
245
+ if (this.isWorkspaceCollapsed[workspace]) {
246
+ this.toggleCard(workspace);
215
247
  }
216
- const state = primaryDisplayStatusFromCount(group.states);
217
248
 
218
- return {
219
- badgeClass: STATES[state].color ? STATES[state].color : `${ STATES[STATES_ENUM.UNKNOWN].color } bg-unmapped-state`,
220
- icon: STATES[state].compoundIcon ? STATES[state].compoundIcon : `${ STATES[STATES_ENUM.UNKNOWN].compoundIcon } unmapped-icon`
221
- };
249
+ this.$nextTick(() => {
250
+ this.toggleStateAll(workspace, 'expand');
251
+ });
252
+ },
253
+
254
+ selectType(workspace, type, value) {
255
+ this._checkInit(workspace, 'typeFilter');
256
+
257
+ this.typeFilter[workspace][type] = value;
258
+
259
+ this.toggleStateAll(workspace, 'expand');
260
+ },
261
+
262
+ toggleCard(key) {
263
+ this.isWorkspaceCollapsed[key] = !this.isWorkspaceCollapsed[key];
222
264
  },
223
- getTooltipInfo(area, row, rowCounts) {
224
- if (!this.admissableAreas.includes(area)) {
225
- return {};
226
- }
227
265
 
228
- if (area === 'bundles') {
229
- return this.generateTooltipData(rowCounts[row.id].bundles.states);
230
- } else if (area === 'resources') {
231
- return this.generateTooltipData(rowCounts[row.id].resources.states);
266
+ toggleCardAll(action) {
267
+ const val = action !== 'expand';
268
+
269
+ Object.keys(this.isWorkspaceCollapsed).forEach((key) => {
270
+ this.isWorkspaceCollapsed[key] = val;
271
+ });
272
+ },
273
+
274
+ toggleState(workspace, state) {
275
+ this._checkInit(workspace, 'isStateCollapsed');
276
+
277
+ this.isStateCollapsed[workspace][state] = !this.isStateCollapsed[workspace][state];
278
+ },
279
+
280
+ toggleStateAll(workspace, action) {
281
+ const val = action !== 'expand';
282
+
283
+ Object.keys(this.isStateCollapsed[workspace] || []).forEach((state) => {
284
+ this.isStateCollapsed[workspace][state] = val;
285
+ });
286
+ },
287
+
288
+ loadMore(workspace, state) {
289
+ this._checkInit(workspace, 'cardsCount');
290
+
291
+ const count = this.cardsCount[workspace][state] || this.CARDS_MIN;
292
+
293
+ const val = count + this.CARDS_SIZE;
294
+
295
+ this.cardsCount[workspace][state] = val;
296
+ },
297
+
298
+ loadLess(workspace, state) {
299
+ this._checkInit(workspace, 'cardsCount');
300
+
301
+ const count = this.cardsCount[workspace][state] || this.CARDS_MIN;
302
+
303
+ const val = count - this.CARDS_MIN < 0 ? this.CARDS_MIN : count - this.CARDS_SIZE;
304
+
305
+ this.cardsCount[workspace][state] = val;
306
+ },
307
+
308
+ createResource(workspace) {
309
+ this.$store.dispatch('showWorkspaceSwitcher', true);
310
+
311
+ this.$nextTick(() => {
312
+ this.$store.commit('updateWorkspace', { value: workspace, getters: this.$store.getters });
313
+ this.$router.push(this.createRoute);
314
+ });
315
+ },
316
+
317
+ showResourceDetails(value, statePanel, workspace, selected) {
318
+ if (this.isClosingSlideInPanel) {
319
+ return;
232
320
  }
233
321
 
234
- return '';
322
+ this.selectedCard = selected;
323
+
324
+ this.$shell.slideInPanel({
325
+ component: ResourceDetails,
326
+ componentProps: {
327
+ value,
328
+ statePanel,
329
+ workspace,
330
+ showHeader: false,
331
+ width: window.innerWidth / 3 > 530 ? `${ window.innerWidth / 3 }px` : '530px',
332
+ triggerFocusTrap: true,
333
+ returnFocusSelector: `[data-testid="resource-card-${ value.id }"]`
334
+ }
335
+ });
336
+ },
337
+
338
+ _resourceStates(resources) {
339
+ const out = [];
340
+
341
+ resources.forEach((obj) => {
342
+ const {
343
+ stateDisplay,
344
+ stateSort
345
+ } = obj;
346
+
347
+ const exists = out.find((s) => s.stateDisplay === stateDisplay);
348
+
349
+ if (exists) {
350
+ exists.resources.push(obj);
351
+ } else {
352
+ out.push({
353
+ stateDisplay,
354
+ stateSort,
355
+ statePanel: FleetUtils.getDashboardState(obj),
356
+ resources: [obj]
357
+ });
358
+ }
359
+ });
360
+
361
+ return out.sort((a, b) => a.stateSort.localeCompare(b.stateSort));
235
362
  },
236
- generateTooltipData(infoObj) {
237
- return Object.keys(infoObj)
238
- .filter((key) => infoObj[key] > 0) // filter zero values
239
- .map((key) => `${ getStateLabel(key) }: ${ infoObj[key] }<br>`).join('');
363
+
364
+ _filterResources(state) {
365
+ return state.resources.filter((item) => this._decodeTypeFilter(item.namespace, item.type) &&
366
+ this._decodeStateFilter(item.namespace, state) &&
367
+ this._decodeSearchFilter(item.namespace, item.nameDisplay)
368
+ );
369
+ },
370
+
371
+ _groupByWorkspace(callback) {
372
+ return this.workspaces.reduce((acc, ws) => ({
373
+ ...acc,
374
+ [ws.id]: callback(ws)
375
+ }), {});
240
376
  },
241
- getBadgeValue(area, row, rowCounts) {
242
- let value;
243
377
 
244
- if (!this.admissableAreas.includes(area)) {
245
- return 'N/A';
378
+ _stateExistsInWorkspace(workspace, state) {
379
+ return !!this.applicationStates[workspace]?.find((s) => s.statePanel.id === state);
380
+ },
381
+
382
+ _decodeStateFilter(workspace, state) {
383
+ const stateFilter = Object.keys(this.stateFilter[workspace] || {});
384
+
385
+ if (stateFilter.length === 0) {
386
+ return true;
387
+ }
388
+
389
+ if (stateFilter.filter((key) => this.stateFilter[workspace][key] && this._stateExistsInWorkspace(workspace, key)).length === 0) {
390
+ return true;
246
391
  }
247
392
 
248
- if (area === 'clusters') {
249
- value = `${ row.clusterInfo.ready }/${ row.clusterInfo.total }`;
250
- } else if (area === 'bundles') {
251
- const bundles = rowCounts[row.id].bundles;
393
+ return !!this.stateFilter[workspace]?.[state.statePanel.id];
394
+ },
252
395
 
253
- value = xOfy(bundles.states.ready || 0, bundles.total);
254
- } else if (area === 'resources') {
255
- const resources = rowCounts[row.id].resources;
396
+ _decodeTypeFilter(workspace, type) {
397
+ if (isEmpty(this.typeFilter)) {
398
+ return true;
399
+ }
256
400
 
257
- value = xOfy(resources.states.ready || 0, resources.total);
401
+ if (!this.viewMode) {
402
+ return true;
258
403
  }
259
404
 
260
- return value;
405
+ return !!this.typeFilter[workspace]?.[type];
261
406
  },
262
- toggleCollapse(val, key) {
263
- this.isCollapsed[key] = val;
407
+
408
+ _decodeSearchFilter(workspace, name) {
409
+ if (isEmpty(this.searchFilter)) {
410
+ return true;
411
+ }
412
+
413
+ if (this.viewMode !== VIEW_MODE.CARDS) {
414
+ return true;
415
+ }
416
+
417
+ const search = this.searchFilter[workspace];
418
+
419
+ return !search || name?.includes(search);
264
420
  },
265
- toggleAll(action) {
266
- const val = action !== 'expand';
267
421
 
268
- Object.keys(this.isCollapsed).forEach((key) => {
269
- this.isCollapsed[key] = val;
422
+ _cleanStateFilter(workspace) {
423
+ const all = [...Object.keys(this.stateFilter[workspace] || {})];
424
+
425
+ all.forEach((state) => {
426
+ const exists = this._stateExistsInWorkspace(workspace, state);
427
+
428
+ if (!exists) {
429
+ delete this.stateFilter[workspace][state];
430
+ }
270
431
  });
271
- }
432
+ },
433
+
434
+ _checkInit(workspace, name) {
435
+ if (!this[name][workspace]) {
436
+ this[name][workspace] = {};
437
+ }
438
+ },
272
439
  },
273
440
 
274
441
  watch: {
275
- fleetWorkspaces(value) {
276
- value?.filter((ws) => ws.repos?.length).forEach((ws) => {
277
- this.isCollapsed[ws.id] = false;
278
- });
442
+ workspaces(neu) {
443
+ if (neu) {
444
+ neu?.forEach((ws) => {
445
+ this.isWorkspaceCollapsed[ws.id] = neu.length > 1;
446
+
447
+ this.isStateCollapsed[ws.id] = { Active: true };
448
+
449
+ this.typeFilter[ws.id] = {
450
+ [FLEET.GIT_REPO]: true,
451
+ [FLEET.HELM_OP]: true,
452
+ };
453
+
454
+ this.stateFilter[ws.id] = {};
455
+
456
+ this.searchFilter[ws.id] = '';
457
+ });
458
+
459
+ this.preset('isWorkspaceCollapsed', 'object');
460
+ this.preset('isStateCollapsed', 'object');
461
+ this.preset('typeFilter', 'object');
462
+ this.preset('stateFilter', 'object');
463
+ this.preset('searchFilter', 'object');
464
+ }
279
465
  }
280
466
  }
281
467
  };
@@ -284,223 +470,575 @@ export default {
284
470
  <template>
285
471
  <div>
286
472
  <Loading v-if="$fetchState.pending" />
287
- <!-- no git repos -->
288
- <FleetNoWorkspaces
289
- v-else-if="!fleetWorkspacesData.length"
473
+ <NoWorkspaces
474
+ v-else-if="!workspaces?.length"
290
475
  :can-view="permissions.workspaces"
291
476
  />
292
- <div
293
- v-else-if="!gitRepos.length"
294
- class="fleet-empty-dashboard"
295
- >
296
- <i class="icon-fleet mb-30" />
297
- <h1>{{ t('fleet.dashboard.welcome') }}</h1>
298
- <p class="mb-30">
299
- <span>{{ t('fleet.dashboard.gitOpsScale') }}</span>
300
- <a
301
- :href="t('fleet.dashboard.learnMoreLink')"
302
- target="_blank"
303
- rel="noopener noreferrer nofollow"
304
- >
305
- {{ t('fleet.dashboard.learnMore') }} <i class="icon icon-external-link" />
306
- </a>
307
- </p>
308
- <template v-if="permissions.gitRepos">
309
- <h3 class="mb-30">
310
- {{ t('fleet.dashboard.noRepo', null, true) }}
311
- </h3>
312
- <router-link
313
- :to="getStartedLink"
314
- class="btn role-secondary"
315
- >
316
- {{ t('fleet.dashboard.getStarted') }}
317
- </router-link>
318
- </template>
319
- </div>
320
- <!-- fleet dashboard with repos -->
477
+ <EmptyDashboard
478
+ v-else-if="isEmptyDashboard"
479
+ :permissions="permissions"
480
+ />
321
481
  <div
322
482
  v-else
323
- class="fleet-dashboard-data"
483
+ class="dashboard"
484
+ :data-testid="'fleet-dashboard-workspace-cards'"
324
485
  >
325
- <div class="title">
486
+ <div class="dashboard-header">
326
487
  <h1>
327
488
  <t k="fleet.dashboard.pageTitle" />
328
489
  </h1>
329
- <div>
330
- <p
331
- v-if="areAllCardsExpanded"
332
- @click="toggleAll('collapse')"
333
- >
334
- {{ t('fleet.dashboard.collapseAll') }}
335
- </p>
336
- <p
337
- v-else
338
- @click="toggleAll('expand')"
490
+
491
+ <div class="dashboard-main-actions">
492
+ <ButtonGroup
493
+ :data-testid="'view-button'"
494
+ :value="viewMode"
495
+ :options="viewModeOptions"
496
+ @update:value="viewMode = $event"
497
+ />
498
+ <RcButton
499
+ small
500
+ ghost
501
+ data-testid="fleet-dashboard-expand-all"
502
+ class="collapse-all-btn"
503
+ @click="toggleCardAll(allCardsExpanded ? 'collapse' : 'expand')"
339
504
  >
340
- {{ t('fleet.dashboard.expandAll') }}
341
- </p>
505
+ <p class="ml-10">
506
+ {{ allCardsExpanded ? t('fleet.dashboard.collapseAll') : t('fleet.dashboard.expandAll') }}
507
+ </p>
508
+ <template #after>
509
+ <i
510
+ :class="{
511
+ ['icon icon-chevron-down']: !allCardsExpanded,
512
+ ['icon icon-chevron-up']: allCardsExpanded,
513
+ }"
514
+ aria-hidden="true"
515
+ />
516
+ </template>
517
+ </RcButton>
342
518
  </div>
343
519
  </div>
344
520
  <div
345
- v-if="emptyWorkspaces.length"
346
- class="title-footnote"
347
- >
348
- <p>{{ t('fleet.dashboard.thereIsMore', { count: emptyWorkspaces.length }) }}:&nbsp;</p>
349
- <p
350
- v-for="(ews, i) in emptyWorkspaces"
351
- :key="i"
352
- >
353
- {{ ews.nameDisplay }}<span v-if="i != (emptyWorkspaces.length - 1)">,&nbsp;</span>
354
- </p>
355
- </div>
356
- <CollapsibleCard
357
- v-for="(ws, i) in workspacesData"
521
+ v-for="(workspace, i) in workspaces"
358
522
  :key="i"
359
- class="mt-20 mb-40"
360
- :title="`${t('resourceDetail.masthead.workspace')}: ${ws.nameDisplay}`"
361
- :is-collapsed="isCollapsed[ws.id]"
362
- :is-title-clickable="true"
363
- :data-testid="`collapsible-card-${ ws.id }`"
364
- @toggleCollapse="toggleCollapse($event, ws.id)"
365
- @titleClick="setWorkspaceFilterAndLinkToGitRepo(ws.id)"
523
+ class="workspace-card-container m-0 mt-20"
524
+ :data-testid="`fleet-dashboard-workspace-card-${ workspace.id }`"
525
+ :show-actions="false"
526
+ :show-separator="false"
527
+ :show-highlight-border="false"
366
528
  >
367
- <template v-slot:header-right>
368
- <div class="header-icons">
369
- <p>
370
- <i class="icon icon-repository" />
371
- <span>{{ t('tableHeaders.repositories') }}: <span>{{ ws.counts.gitRepos }}</span></span>
372
- </p>
373
- <p>
374
- <i class="icon icon-storage" />
375
- <span>{{ t('tableHeaders.clusters') }}: <span>{{ ws.counts.clusters }}</span></span>
376
- </p>
377
- <p>
378
- <i class="icon icon-folder" />
379
- <span>{{ t('tableHeaders.clusterGroups') }}: <span>{{ ws.counts.clusterGroups }}</span></span>
380
- </p>
381
- </div>
382
- </template>
383
- <template v-slot:content>
384
- <ResourceTable
385
- :schema="schema"
386
- :headers="headers"
387
- :rows="ws.repos"
388
- key-field="_key"
389
- :search="false"
390
- :table-actions="false"
529
+ <div class="card-panel-main">
530
+ <div
531
+ class="card-panel-main-details"
532
+ :class="{ expand: !isWorkspaceCollapsed[workspace.id] }"
391
533
  >
392
- <template #cell:clustersReady="{row}">
393
- <span v-if="ws.type === 'namespace'"> - </span>
394
- <CompoundStatusBadge
395
- v-else
396
- data-testid="clusters-ready"
397
- :tooltip-text="getTooltipInfo('clusters', row, gitReposCounts)"
398
- :badge-class="getStatusInfo('clusters', row, gitReposCounts).badgeClass"
399
- :icon="getStatusInfo('clusters', row, gitReposCounts).icon"
400
- :value="getBadgeValue('clusters', row, gitReposCounts)"
534
+ <h2 class="workspace-title">
535
+ <span class="workspace-label label-secondary">
536
+ <i class="icon icon-folder" />
537
+ <span>{{ t('fleet.dashboard.workspace') }} : &nbsp;</span>
538
+ </span>
539
+ <router-link
540
+ class="name"
541
+ role="link"
542
+ tabindex="0"
543
+ :aria-label="workspace.nameDisplay"
544
+ :to="workspace.detailLocation || {}"
545
+ >
546
+ {{ workspace.nameDisplay }}
547
+ </router-link>
548
+ </h2>
549
+ <div class="body">
550
+ <ResourcePanel
551
+ v-if="workspace.repos?.length || workspace.helmOps?.length"
552
+ :data-testid="'resource-panel-applications'"
553
+ :states="applicationStates[workspace.id]"
554
+ :workspace="workspace.id"
555
+ :type="FLEET.APPLICATION"
556
+ :selected-states="stateFilter[workspace.id] || {}"
557
+ @click:state="selectStates(workspace.id, $event)"
401
558
  />
402
- </template>
403
- <template #cell:bundlesReady="{row}">
404
- <span v-if="ws.type === 'namespace'"> - </span>
405
- <CompoundStatusBadge
406
- v-else
407
- data-testid="bundles-ready"
408
- :tooltip-text="getTooltipInfo('bundles', row, gitReposCounts)"
409
- :badge-class="getStatusInfo('bundles', row, gitReposCounts).badgeClass"
410
- :icon="getStatusInfo('bundles', row, gitReposCounts).icon"
411
- :value="getBadgeValue('bundles', row, gitReposCounts)"
559
+ <ResourcePanel
560
+ v-if="workspace.clusters?.length"
561
+ :data-testid="'resource-panel-clusters'"
562
+ :states="clusterStates[workspace.id]"
563
+ :workspace="workspace.id"
564
+ :type="FLEET.CLUSTER"
565
+ :selectable="false"
412
566
  />
413
- </template>
414
- <template #cell:resourcesReady="{row}">
415
- <CompoundStatusBadge
416
- data-testid="resources-ready"
417
- :tooltip-text="getTooltipInfo('resources', row, gitReposCounts)"
418
- :badge-class="getStatusInfo('resources', row, gitReposCounts).badgeClass"
419
- :icon="getStatusInfo('resources', row, gitReposCounts).icon"
420
- :value="getBadgeValue('resources', row, gitReposCounts)"
567
+ <ResourcePanel
568
+ v-if="workspace.clusterGroups?.length"
569
+ :data-testid="'resource-panel-cluster-groups'"
570
+ :states="clusterGroupsStates[workspace.id]"
571
+ :workspace="workspace.id"
572
+ :type="FLEET.CLUSTER_GROUP"
573
+ :show-chart="false"
574
+ :selectable="false"
421
575
  />
422
- </template>
423
-
424
- <template #cell:target="{row}">
425
- {{ row.targetInfo.modeDisplay }}
426
- </template>
427
- </ResourceTable>
428
- </template>
429
- </CollapsibleCard>
576
+ </div>
577
+ </div>
578
+ <div class="card-panel-main-actions">
579
+ <div
580
+ v-if="workspace.repos?.length || workspace.helmOps?.length"
581
+ class="expand-button"
582
+ :data-testid="'expand-button'"
583
+ >
584
+ <RcButton
585
+ small
586
+ ghost
587
+ :aria-label="`workspace-expand-btn-${ workspace.id }`"
588
+ :data-testid="`workspace-expand-btn-${ workspace.id }`"
589
+ @click="toggleCard(workspace.id)"
590
+ >
591
+ <i
592
+ :class="{
593
+ ['icon icon-lg icon-chevron-down']: isWorkspaceCollapsed[workspace.id],
594
+ ['icon icon-lg icon-chevron-up']: !isWorkspaceCollapsed[workspace.id],
595
+ }"
596
+ aria-hidden="true"
597
+ />
598
+ </RcButton>
599
+ </div>
600
+ </div>
601
+ </div>
602
+ <div
603
+ v-if="!isWorkspaceCollapsed[workspace.id] && (workspace.repos?.length || workspace.helmOps?.length)"
604
+ class="panel-expand mt-10"
605
+ :data-testid="`fleet-dashboard-expanded-panel-${ workspace.id }`"
606
+ >
607
+ <div class="actions">
608
+ <div class="resource-filters">
609
+ <div
610
+ v-if="viewMode === VIEW_MODE.CARDS"
611
+ class="search-filter"
612
+ >
613
+ <input
614
+ :value="searchFilter[workspace.id]"
615
+ type="search"
616
+ role="textbox"
617
+ class="input"
618
+ :data-testid="`fleet-dashboard-search-input-${ workspace.id }`"
619
+ :aria-label="t('fleet.dashboard.cards.search')"
620
+ :placeholder="t('fleet.dashboard.cards.search')"
621
+ @input="debouncedUpdateSearchFilter(workspace.id, $event.target.value)"
622
+ >
623
+ </div>
624
+ <div class="type-filter">
625
+ <Checkbox
626
+ :data-testid="'fleet-dashboard-filter-git-repos'"
627
+ :value="typeFilter[workspace.id]?.[FLEET.GIT_REPO]"
628
+ @update:value="selectType(workspace.id, FLEET.GIT_REPO, $event)"
629
+ >
630
+ <template #label>
631
+ <i class="icon icon-lg icon-git mr-5" />
632
+ <span class="label">{{ t('fleet.dashboard.cards.filters.gitRepos') }}</span>
633
+ </template>
634
+ </Checkbox>
635
+ <Checkbox
636
+ :data-testid="'fleet-dashboard-filter-helm-ops'"
637
+ :value="typeFilter[workspace.id]?.[FLEET.HELM_OP]"
638
+ @update:value="selectType(workspace.id, FLEET.HELM_OP, $event)"
639
+ >
640
+ <template #label>
641
+ <i class="icon icon-lg icon-helm mr-5" />
642
+ <span class="label">{{ t('fleet.dashboard.cards.filters.helmOps') }}</span>
643
+ </template>
644
+ </Checkbox>
645
+ </div>
646
+ </div>
647
+ <div
648
+ v-if="permissions.gitRepos || permissions.helmOps"
649
+ class="create-button"
650
+ >
651
+ <RcButton
652
+ small
653
+ @click="createResource(workspace.id)"
654
+ >
655
+ {{ t('fleet.application.intro.add') }}
656
+ </RcButton>
657
+ </div>
658
+ </div>
659
+ <div
660
+ v-if="viewMode === VIEW_MODE.CARDS"
661
+ class="cards-panel"
662
+ >
663
+ <div
664
+ v-for="(state, j) in applicationStates[workspace.id]"
665
+ :key="j"
666
+ :data-testid="`state-panel-${ state.stateDisplay }`"
667
+ >
668
+ <div
669
+ v-if="cardResources[workspace.id][state.stateDisplay]?.length"
670
+ class="card-panel"
671
+ >
672
+ <div
673
+ role="button"
674
+ tabindex="0"
675
+ class="title"
676
+ :aria-label="`state-expand-btn-${ state.stateDisplay }`"
677
+ @click="toggleState(workspace.id, state.stateDisplay)"
678
+ @keydown.space.enter.stop.prevent="toggleState(workspace.id, state.stateDisplay)"
679
+ >
680
+ <i
681
+ :class="{
682
+ ['icon icon-chevron-right']: isStateCollapsed[workspace.id]?.[state.stateDisplay],
683
+ ['icon icon-chevron-down']: !isStateCollapsed[workspace.id]?.[state.stateDisplay],
684
+ }"
685
+ />
686
+ <i
687
+ v-if="state.statePanel.id !== 'success'"
688
+ class="state-icon"
689
+ :class="state.statePanel.icon"
690
+ :style="{ color: state.statePanel.color }"
691
+ />
692
+ <h3 class="state-title">
693
+ <span class="state-label">
694
+ {{ state.stateDisplay }}
695
+ </span>
696
+ <span class="state-amount">
697
+ {{ cardResources[workspace.id]?.[state.stateDisplay]?.length }}
698
+ </span>
699
+ <span class="total label-secondary">/{{ [ ...workspace.repos, ...workspace.helmOps ].length }}</span>
700
+ </h3>
701
+ </div>
702
+ <div
703
+ v-if="!isStateCollapsed[workspace.id]?.[state.stateDisplay]"
704
+ class="card-panel-body"
705
+ >
706
+ <div class="resource-cards-container">
707
+ <div
708
+ v-for="(item, y) in cardResources[workspace.id][state.stateDisplay]"
709
+ :key="y"
710
+ class="resource-card"
711
+ :class="{
712
+ ['selected']: selectedCard === `${ item.id }-${ y }` && isOpenSlideInPanel
713
+ }"
714
+ :data-testid="`card-${ item.id }`"
715
+ >
716
+ <ResourceCard
717
+ v-if="y < (cardsCount[workspace.id]?.[state.stateDisplay] || CARDS_MIN)"
718
+ role="button"
719
+ tabindex="0"
720
+ :aria-label="`resource-card-${ item.id }`"
721
+ :data-testid="`resource-card-${ item.id }`"
722
+ :value="item"
723
+ :state-panel="state.statePanel"
724
+ @click="showResourceDetails(item, state.statePanel, workspace, `${ item.id }-${ y }`)"
725
+ />
726
+ </div>
727
+ </div>
728
+ <div class="resource-cards-action">
729
+ <p
730
+ v-if="(cardsCount[workspace.id]?.[state.stateDisplay] || 0) > CARDS_MIN"
731
+ @click="loadLess(workspace.id, state.stateDisplay)"
732
+ >
733
+ {{ t('generic.showLess') }}
734
+ </p>
735
+ <div />
736
+ <p
737
+ v-if="cardResources[workspace.id][state.stateDisplay]?.length > (cardsCount[workspace.id]?.[state.stateDisplay] || CARDS_MIN)"
738
+ @click="loadMore(workspace.id, state.stateDisplay)"
739
+ >
740
+ {{ t('generic.showMore') }}
741
+ </p>
742
+ </div>
743
+ </div>
744
+ </div>
745
+ </div>
746
+ </div>
747
+ <div
748
+ v-if="viewMode === VIEW_MODE.TABLE"
749
+ class="table-panel"
750
+ >
751
+ <FleetApplications
752
+ :workspace="workspace.id"
753
+ :rows="tableResources[workspace.id]"
754
+ :schema="{
755
+ id: FLEET.APPLICATION,
756
+ type: 'schema'
757
+ }"
758
+ :loading="$fetchState.pending"
759
+ :use-query-params-for-simple-filtering="true"
760
+ :show-intro="false"
761
+ />
762
+ </div>
763
+ </div>
764
+ </div>
430
765
  </div>
431
766
  </div>
432
767
  </template>
433
768
 
434
769
  <style lang="scss" scoped>
435
- .fleet-empty-dashboard {
436
- flex: 1;
770
+
771
+ .dashboard-main-actions {
437
772
  display: flex;
438
773
  align-items: center;
439
- justify-content: center;
440
- flex-direction: column;
441
- min-height: 100%;
774
+ justify-content: end;
775
+ gap: 16px;
442
776
 
443
- .icon-fleet {
444
- font-size: 100px;
445
- color: var(--disabled-text);
777
+ .collapse-all-btn {
778
+ width: 105px;
446
779
  }
780
+ }
781
+
782
+ .dashboard-header {
783
+ display: flex;
784
+ align-items: center;
785
+ justify-content: space-between;
447
786
 
448
- > p > span {
449
- color: var(--disabled-text);
787
+ h1 {
788
+ margin: 0;
789
+ }
790
+
791
+ > div {
792
+ display: flex;
793
+ align-items: center;
794
+
795
+ i {
796
+ color: var(--primary);
797
+ }
450
798
  }
451
799
  }
452
800
 
453
- .fleet-dashboard-data {
454
- .title {
801
+ .workspace-card-container {
802
+ display: flex;
803
+ flex-direction: column;
804
+ border: 1px solid var(--border);
805
+ border-radius: 16px;
806
+ background-color: var(--body-bg);
807
+ box-shadow: none;
808
+ min-width: 500px;
809
+ padding: 16px;
810
+
811
+ :focus-visible {
812
+ @include focus-outline;
813
+ }
814
+
815
+ .card-panel-main {
455
816
  display: flex;
456
817
  align-items: center;
457
818
  justify-content: space-between;
458
- min-height: 48px;
819
+ margin-top: auto;
820
+ margin-bottom: auto;
459
821
 
460
- > div {
822
+ .card-panel-main-details {
461
823
  display: flex;
462
824
  align-items: center;
463
825
 
464
- p{
465
- color: var(--primary);
826
+ .workspace-title {
827
+ min-width: 150px;
828
+ margin: 0 32px 0 0;
829
+ display: flex;
830
+ flex-direction: column;
831
+
832
+ .workspace-label {
833
+ font-size: 16px;
834
+ font-weight: normal;
835
+ display: flex;
836
+ align-items: center;
837
+ margin: 0 0 2px 0;
838
+
839
+ .icon {
840
+ margin-right: 5px;
841
+ }
842
+ }
843
+
844
+ .name {
845
+ font-size: 21px;
846
+ }
847
+ }
848
+
849
+ .body {
850
+ display: flex;
851
+ justify-content: flex-start;
852
+ flex-wrap: wrap;
853
+ gap: 24px;
854
+
855
+ .spacer {
856
+ border-left: 1px solid var(--border);
857
+ }
858
+ }
859
+ }
860
+
861
+ .card-panel-main-actions {
862
+ display: flex;
863
+ flex-direction: column;
864
+ align-items: end;
865
+
866
+ .expand-button {
867
+ display: flex;
868
+ align-items: center;
466
869
 
467
870
  &:hover {
468
- text-decoration: underline;
469
871
  cursor: pointer;
470
872
  }
471
873
  }
472
874
  }
473
875
  }
474
876
 
475
- .title-footnote {
476
- display: flex;
477
- align-items: center;
478
- color: var(--darker);
479
- }
877
+ .panel-expand {
878
+ animation: slideInOut 0.5s ease-in-out;
480
879
 
481
- .header-icons {
482
- display: flex;
483
- align-items: center;
880
+ :focus-visible {
881
+ @include focus-outline;
882
+ }
484
883
 
485
- p {
486
- margin-right: 30px;
884
+ .actions {
487
885
  display: flex;
488
886
  align-items: center;
887
+ justify-content: space-between;
888
+
889
+ .resource-filters {
890
+ display: flex;
891
+ flex-direction: row;
892
+ align-items: center;
893
+
894
+ .type-filter {
895
+ display: flex;
896
+ flex-direction: column;
897
+ margin-top: 5px;
489
898
 
490
- > span {
491
- color: var(--disabled-text);
899
+ .checkbox-outer-container {
900
+ width: fit-content;
901
+ }
492
902
 
493
- > span {
494
- color: var(--body-text);
903
+ .label {
904
+ margin-top: 2px;
905
+ line-height: 20px;
906
+ }
907
+
908
+ .icon {
909
+ padding: 2px;
910
+ font-size: 25px;
911
+ }
912
+ }
913
+
914
+ .search-filter {
915
+ margin-top: 2px;
916
+ margin-right: 32px;
917
+
918
+ input {
919
+ width: 190px;
920
+ }
495
921
  }
496
922
  }
923
+ }
924
+
925
+ .cards-panel {
926
+ .card-panel {
927
+ margin-top: 24px;
928
+
929
+ .title {
930
+ display: flex;
931
+ align-items: center;
932
+ cursor: pointer;
933
+ width: fit-content;
934
+ margin-bottom: 12px;
935
+
936
+ .icon {
937
+ margin-right: 8px;
938
+ }
939
+
940
+ .state-icon,
941
+ .state-title {
942
+ font-size: 21px;
943
+ }
944
+
945
+ .state-icon {
946
+ margin-top: 1px;
947
+ }
948
+
949
+ .state-title {
950
+ display: flex;
951
+ align-items: baseline;
952
+ margin: 0;
953
+
954
+ .state-amount {
955
+ margin-left: 4px
956
+ }
957
+
958
+ .total {
959
+ margin-left: 4px;
960
+ font-size: 16px;
961
+ }
962
+
963
+ p {
964
+ font-size: small;
497
965
 
498
- i {
499
- color: var(--disabled-text);
500
- font-size: 20px;
501
- margin-right: 10px;
966
+ .icon {
967
+ line-height: -1px;
968
+ }
969
+ }
970
+ }
971
+ }
972
+
973
+ .card-panel-body {
974
+ .resource-cards-container {
975
+ display: grid;
976
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
977
+ gap: 16px;
978
+ min-height: 100%;
979
+
980
+ .resource-card {
981
+ cursor: pointer;
982
+
983
+ &.selected {
984
+ .dashboard-resource-card {
985
+ border: 2px solid var(--primary);
986
+ margin: 0;
987
+ }
988
+ }
989
+ }
990
+ }
991
+
992
+ .resource-cards-action {
993
+ display: flex;
994
+ justify-content: space-between;
995
+
996
+ p {
997
+ width: fit-content;
998
+ margin-left: 15px;
999
+ }
1000
+ }
1001
+ }
502
1002
  }
503
1003
  }
1004
+
1005
+ .table-panel {
1006
+ margin-top: 20px;
1007
+ }
1008
+ }
1009
+ }
1010
+
1011
+ p {
1012
+ color: var(--primary);
1013
+ margin-right: 2px;
1014
+
1015
+ &:hover {
1016
+ text-decoration: underline;
1017
+ cursor: pointer;
1018
+ }
1019
+ }
1020
+
1021
+ .label-secondary{
1022
+ color: var(--label-secondary);
1023
+ }
1024
+
1025
+ @keyframes slideInOut {
1026
+ 0% {
1027
+ opacity: 0;
1028
+ visibility: hidden;
1029
+ transform: translateY(-10px);
1030
+ }
1031
+
1032
+ 50% {
1033
+ opacity: 0.5;
1034
+ visibility: visible;
1035
+ transform: translateY(0);
1036
+ }
1037
+
1038
+ 100% {
1039
+ opacity: 1;
1040
+ visibility: visible;
1041
+ transform: translateY(0);
504
1042
  }
505
1043
  }
506
1044
  </style>