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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/icons/document.svg +3 -0
  3. package/assets/images/key.svg +17 -0
  4. package/assets/images/vendor/cognito.svg +1 -0
  5. package/assets/styles/app.scss +1 -0
  6. package/assets/styles/base/_basic.scss +10 -0
  7. package/assets/styles/base/_spacing.scss +29 -0
  8. package/assets/styles/global/_form.scss +1 -1
  9. package/assets/styles/global/_labeled-input.scss +1 -1
  10. package/assets/styles/global/_layout.scss +1 -1
  11. package/assets/styles/themes/_dark.scss +28 -0
  12. package/assets/styles/themes/_light.scss +68 -0
  13. package/assets/styles/vendor/vue-select.scss +1 -1
  14. package/assets/translations/en-us.yaml +721 -83
  15. package/assets/translations/zh-hans.yaml +11 -9
  16. package/cloud-credential/gcp.vue +9 -1
  17. package/components/AppModal.vue +2 -0
  18. package/components/Certificates.vue +5 -0
  19. package/components/CodeMirror.vue +1 -1
  20. package/components/ConfigMapSettings/Settings.vue +377 -0
  21. package/components/ConfigMapSettings/index.vue +354 -0
  22. package/components/CruResource.vue +1 -2
  23. package/components/DetailText.vue +61 -11
  24. package/components/Drawer/Chrome.vue +116 -0
  25. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  26. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  27. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  28. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  29. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +82 -0
  30. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  31. package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
  32. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  33. package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
  34. package/components/FilterPanel.vue +156 -0
  35. package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
  36. package/components/GrowlManager.vue +16 -15
  37. package/components/IconOrSvg.vue +19 -35
  38. package/components/KeyValueView.vue +1 -1
  39. package/components/LocaleSelector.vue +9 -1
  40. package/components/ProgressBarMulti.vue +1 -0
  41. package/components/PromptModal.vue +6 -1
  42. package/components/PromptRemove.vue +5 -1
  43. package/components/RelatedResources.vue +4 -12
  44. package/components/Resource/Detail/Additional.vue +46 -0
  45. package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
  46. package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
  47. package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
  48. package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
  49. package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
  50. package/components/Resource/Detail/Card/Scaler.vue +89 -0
  51. package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
  52. package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
  53. package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
  54. package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
  55. package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
  56. package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
  57. package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
  58. package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
  59. package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
  60. package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
  61. package/components/Resource/Detail/Card/index.vue +56 -0
  62. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
  63. package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
  64. package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
  65. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  66. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
  67. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +64 -0
  68. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
  69. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +133 -0
  70. package/components/Resource/Detail/Metadata/KeyValue.vue +138 -0
  71. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
  72. package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
  73. package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
  74. package/components/Resource/Detail/Metadata/Rectangle.vue +32 -0
  75. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
  76. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
  77. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  78. package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
  79. package/components/Resource/Detail/Metadata/composables.ts +78 -0
  80. package/components/Resource/Detail/Metadata/index.vue +73 -0
  81. package/components/Resource/Detail/Page.vue +37 -0
  82. package/components/Resource/Detail/PercentageBar.vue +40 -0
  83. package/components/Resource/Detail/ResourceRow.vue +138 -0
  84. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  85. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  86. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  87. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  88. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  89. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  90. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  91. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  92. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  93. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  94. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  95. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  96. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  97. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  98. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  99. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  100. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  101. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  102. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  103. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  104. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  105. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  106. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  107. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  108. package/components/Resource/Detail/SpacedRow.vue +14 -0
  109. package/components/Resource/Detail/StatusBar.vue +59 -0
  110. package/components/Resource/Detail/StatusRow.vue +61 -0
  111. package/components/Resource/Detail/TitleBar/Title.vue +14 -0
  112. package/components/Resource/Detail/TitleBar/Top.vue +14 -0
  113. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
  114. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
  115. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  116. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
  117. package/components/Resource/Detail/TitleBar/composables.ts +44 -0
  118. package/components/Resource/Detail/TitleBar/index.vue +196 -0
  119. package/components/Resource/Detail/Top/index.vue +34 -0
  120. package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
  121. package/components/Resource/Detail/composables.ts +45 -0
  122. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  123. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  124. package/components/ResourceDetail/Masthead/index.vue +65 -0
  125. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  126. package/components/ResourceDetail/__tests__/index.test.ts +135 -0
  127. package/components/ResourceDetail/index.vue +73 -557
  128. package/components/ResourceDetail/legacy.vue +562 -0
  129. package/components/ResourceList/Masthead.vue +6 -0
  130. package/components/ResourceTable.vue +41 -7
  131. package/components/ResourceYaml.vue +14 -1
  132. package/components/SlideInPanelManager.vue +117 -10
  133. package/components/SortableTable/index.vue +13 -2
  134. package/components/SortableTable/selection.js +21 -8
  135. package/components/StateDot/index.vue +28 -0
  136. package/components/StatusBadge.vue +6 -4
  137. package/components/SubtleLink.vue +25 -0
  138. package/components/Tabbed/index.vue +11 -15
  139. package/components/Wizard.vue +16 -3
  140. package/components/YamlEditor.vue +1 -1
  141. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  142. package/components/__tests__/FilterPanel.test.ts +81 -0
  143. package/components/__tests__/GrowlManager.test.ts +0 -25
  144. package/components/auth/AuthBanner.vue +2 -3
  145. package/components/auth/RoleDetailEdit.vue +45 -3
  146. package/components/auth/login/ldap.vue +1 -1
  147. package/components/auth/login/oidc.vue +6 -1
  148. package/components/fleet/FleetApplications.vue +174 -0
  149. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  150. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  151. package/components/fleet/FleetClusters.vue +25 -6
  152. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  153. package/components/fleet/FleetHelmOps.vue +123 -0
  154. package/components/fleet/FleetIntro.vue +58 -28
  155. package/components/fleet/FleetNoWorkspaces.vue +5 -1
  156. package/components/fleet/FleetOCIStorageSecret.vue +171 -0
  157. package/components/fleet/FleetRepos.vue +37 -80
  158. package/components/fleet/FleetResources.vue +53 -26
  159. package/components/fleet/FleetSummary.vue +26 -51
  160. package/components/fleet/FleetValuesFrom.vue +295 -0
  161. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  162. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  163. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
  164. package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
  165. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  166. package/components/fleet/dashboard/Empty.vue +73 -0
  167. package/components/fleet/dashboard/ResourceCard.vue +184 -0
  168. package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
  169. package/components/fleet/dashboard/ResourceDetails.vue +194 -0
  170. package/components/fleet/dashboard/ResourcePanel.vue +383 -0
  171. package/components/form/ArrayList.vue +19 -2
  172. package/components/form/ChangePassword.vue +3 -1
  173. package/components/form/Footer.vue +10 -4
  174. package/components/form/KeyValue.vue +81 -43
  175. package/components/form/LabeledSelect.vue +56 -16
  176. package/components/form/Labels.vue +90 -17
  177. package/components/form/MatchExpressions.vue +46 -5
  178. package/components/form/NameNsDescription.vue +1 -1
  179. package/components/form/ResourceSelector.vue +1 -0
  180. package/components/form/ResourceTabs/index.vue +5 -0
  181. package/components/form/SecretSelector.vue +9 -2
  182. package/components/form/Select.vue +57 -19
  183. package/components/form/SimpleSecretSelector.vue +17 -4
  184. package/components/form/Taints.vue +21 -2
  185. package/components/form/UnitInput.vue +8 -0
  186. package/components/form/ValueFromResource.vue +31 -19
  187. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  188. package/components/form/__tests__/Labels.test.ts +360 -0
  189. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  190. package/components/form/__tests__/Select.test.ts +5 -2
  191. package/components/formatter/FleetApplicationClustersReady.vue +77 -0
  192. package/components/formatter/FleetApplicationSource.vue +71 -0
  193. package/components/formatter/FleetSummaryGraph.vue +7 -0
  194. package/components/formatter/WorkloadHealthScale.vue +1 -1
  195. package/components/google/AccountAccess.vue +211 -0
  196. package/components/google/types/gcp.d.ts +136 -0
  197. package/components/google/types/index.d.ts +101 -0
  198. package/components/google/util/__mocks__/gcp.ts +465 -0
  199. package/components/google/util/formatter.ts +82 -0
  200. package/components/google/util/gcp.ts +134 -0
  201. package/components/google/util/index.d.ts +11 -0
  202. package/components/nav/Favorite.vue +1 -1
  203. package/components/nav/Group.vue +70 -47
  204. package/components/nav/Header.vue +13 -8
  205. package/components/nav/NamespaceFilter.vue +13 -1
  206. package/components/nav/NotificationCenter/Notification.vue +510 -0
  207. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  208. package/components/nav/NotificationCenter/index.vue +148 -0
  209. package/components/nav/TopLevelMenu.helper.ts +55 -34
  210. package/components/nav/TopLevelMenu.vue +11 -0
  211. package/components/nav/Type.vue +4 -1
  212. package/composables/drawer.ts +26 -0
  213. package/composables/resources.test.ts +63 -0
  214. package/composables/resources.ts +38 -0
  215. package/composables/useI18n.ts +12 -11
  216. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  217. package/config/labels-annotations.js +20 -11
  218. package/config/product/auth.js +17 -1
  219. package/config/product/{cis.js → compliance.js} +23 -26
  220. package/config/product/explorer.js +5 -1
  221. package/config/product/fleet.js +77 -17
  222. package/config/product/settings.js +22 -11
  223. package/config/query-params.js +6 -1
  224. package/config/roles.ts +2 -1
  225. package/config/router/navigation-guards/authentication.js +51 -2
  226. package/config/router/routes.js +45 -31
  227. package/config/secret.ts +15 -0
  228. package/config/settings.ts +24 -5
  229. package/config/store.js +2 -0
  230. package/config/system-namespaces.js +1 -1
  231. package/config/table-headers.js +53 -23
  232. package/config/types.js +17 -6
  233. package/core/plugin-helpers.ts +3 -2
  234. package/core/plugin.ts +32 -7
  235. package/core/types.ts +18 -1
  236. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  237. package/detail/fleet.cattle.io.cluster.vue +28 -15
  238. package/detail/fleet.cattle.io.gitrepo.vue +10 -1
  239. package/detail/fleet.cattle.io.helmop.vue +157 -0
  240. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  241. package/detail/management.cattle.io.oidcclient.vue +369 -0
  242. package/detail/node.vue +2 -2
  243. package/detail/pod.vue +2 -2
  244. package/detail/service.vue +10 -1
  245. package/detail/workload/index.vue +8 -2
  246. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  247. package/dialog/GenericPrompt.vue +1 -1
  248. package/dialog/HelmOpForceUpdateDialog.vue +132 -0
  249. package/dialog/ImportDialog.vue +8 -8
  250. package/dialog/OidcClientSecretDialog.vue +117 -0
  251. package/dialog/RedeployWorkloadDialog.vue +164 -0
  252. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  253. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
  254. package/edit/auth/oidc.vue +159 -93
  255. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  256. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  257. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  258. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  259. package/edit/configmap.vue +4 -1
  260. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  261. package/edit/fleet.cattle.io.gitrepo.vue +70 -255
  262. package/edit/fleet.cattle.io.helmop.vue +772 -0
  263. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  264. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  265. package/edit/logging-flow/index.vue +1 -0
  266. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  267. package/edit/management.cattle.io.fleetworkspace.vue +44 -10
  268. package/edit/management.cattle.io.oidcclient.vue +162 -0
  269. package/edit/management.cattle.io.project.vue +4 -1
  270. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  271. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  272. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  273. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  274. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  275. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  276. package/edit/monitoring.coreos.com.route.vue +1 -0
  277. package/edit/namespace.vue +1 -0
  278. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  279. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  280. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  281. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  282. package/edit/node.vue +1 -0
  283. package/edit/persistentvolume/index.vue +4 -1
  284. package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
  285. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
  286. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  287. package/edit/resources.cattle.io.restore.vue +1 -1
  288. package/edit/secret/index.vue +1 -0
  289. package/edit/service.vue +4 -1
  290. package/edit/serviceaccount.vue +4 -1
  291. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  292. package/edit/workload/index.vue +5 -0
  293. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  294. package/list/fleet.cattle.io.gitrepo.vue +1 -1
  295. package/list/fleet.cattle.io.helmop.vue +108 -0
  296. package/list/management.cattle.io.oidcclient.vue +108 -0
  297. package/list/namespace.vue +5 -2
  298. package/list/node.vue +2 -0
  299. package/machine-config/amazonec2.vue +3 -24
  300. package/machine-config/components/GCEImage.vue +374 -0
  301. package/machine-config/google.vue +617 -0
  302. package/mixins/__tests__/brand.spec.ts +170 -0
  303. package/mixins/auth-config.js +8 -1
  304. package/mixins/brand.js +16 -17
  305. package/mixins/create-edit-view/index.js +5 -0
  306. package/mixins/preset.js +100 -0
  307. package/mixins/resource-fetch-api-pagination.js +18 -0
  308. package/mixins/resource-fetch.js +1 -1
  309. package/mixins/resource-table-watch.js +45 -0
  310. package/mixins/vue-select-overrides.js +1 -0
  311. package/models/__tests__/chart.test.ts +273 -0
  312. package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
  313. package/models/chart.js +144 -2
  314. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  315. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  316. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  317. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  318. package/models/fleet-application.js +314 -0
  319. package/models/fleet.cattle.io.bundle.js +9 -8
  320. package/models/fleet.cattle.io.cluster.js +11 -0
  321. package/models/fleet.cattle.io.gitrepo.js +41 -365
  322. package/models/fleet.cattle.io.helmop.js +198 -0
  323. package/models/management.cattle.io.authconfig.js +1 -0
  324. package/models/management.cattle.io.fleetworkspace.js +14 -1
  325. package/models/management.cattle.io.oidcclient.js +18 -0
  326. package/models/management.cattle.io.registration.js +3 -0
  327. package/models/provisioning.cattle.io.cluster.js +5 -5
  328. package/models/service.js +4 -0
  329. package/models/workload.js +19 -18
  330. package/package.json +2 -1
  331. package/pages/about.vue +4 -58
  332. package/pages/auth/login.vue +1 -1
  333. package/pages/auth/verify.vue +13 -1
  334. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
  335. package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
  336. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +54 -0
  337. package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
  338. package/pages/c/_cluster/apps/charts/index.vue +487 -465
  339. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  340. package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
  341. package/pages/c/_cluster/explorer/index.vue +3 -3
  342. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  343. package/pages/c/_cluster/fleet/__tests__/index.test.ts +426 -0
  344. package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
  345. package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
  346. package/pages/c/_cluster/fleet/application/create.vue +341 -0
  347. package/pages/c/_cluster/fleet/application/index.vue +139 -0
  348. package/pages/c/_cluster/fleet/graph/config.js +277 -0
  349. package/pages/c/_cluster/fleet/index.vue +809 -329
  350. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  351. package/pages/c/_cluster/longhorn/index.vue +5 -2
  352. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  353. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  354. package/pages/explorer/resource/detail/configmap.vue +42 -0
  355. package/pages/explorer/resource/detail/secret.vue +50 -0
  356. package/pages/home.vue +9 -55
  357. package/pages/support/index.vue +4 -6
  358. package/plugins/dashboard-store/actions.js +50 -14
  359. package/plugins/dashboard-store/getters.js +38 -21
  360. package/plugins/dashboard-store/mutations.js +51 -7
  361. package/plugins/dashboard-store/resource-class.js +30 -4
  362. package/plugins/steve/__tests__/subscribe.spec.ts +66 -1
  363. package/plugins/steve/actions.js +3 -0
  364. package/plugins/steve/steve-pagination-utils.ts +17 -8
  365. package/plugins/steve/subscribe.js +235 -43
  366. package/rancher-components/BadgeState/BadgeState.vue +3 -1
  367. package/rancher-components/Banner/Banner.vue +13 -0
  368. package/rancher-components/Form/Checkbox/Checkbox.vue +11 -6
  369. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  370. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  371. package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
  372. package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
  373. package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
  374. package/rancher-components/RcItemCard/index.ts +2 -0
  375. package/store/auth.js +3 -0
  376. package/store/catalog.js +85 -25
  377. package/store/growl.js +97 -8
  378. package/store/index.js +39 -14
  379. package/store/notifications.ts +426 -0
  380. package/store/prefs.js +0 -1
  381. package/store/slideInPanel.ts +6 -0
  382. package/store/type-map.js +19 -15
  383. package/store/uiplugins.ts +15 -1
  384. package/types/fleet.d.ts +59 -0
  385. package/types/notifications/index.ts +74 -0
  386. package/types/resources/settings.d.ts +19 -1
  387. package/types/shell/index.d.ts +388 -307
  388. package/types/store/dashboard-store.types.ts +33 -3
  389. package/types/store/pagination.types.ts +6 -1
  390. package/types/store/subscribe.types.ts +50 -0
  391. package/utils/__tests__/fleet.test.ts +148 -0
  392. package/utils/__tests__/object.test.ts +54 -1
  393. package/utils/__tests__/string.test.ts +273 -1
  394. package/utils/__tests__/time.test.ts +31 -0
  395. package/utils/auth.js +41 -5
  396. package/utils/crypto/encryption.ts +103 -0
  397. package/utils/cspAdaptor.ts +51 -0
  398. package/utils/fleet-types.ts +0 -0
  399. package/utils/fleet.ts +190 -2
  400. package/utils/object.js +36 -0
  401. package/utils/pagination-utils.ts +27 -2
  402. package/utils/pagination-wrapper.ts +132 -50
  403. package/utils/release-notes.ts +48 -0
  404. package/utils/selector-typed.ts +7 -2
  405. package/utils/settings.ts +4 -1
  406. package/utils/string.js +24 -0
  407. package/utils/style.ts +39 -0
  408. package/utils/{time.js → time.ts} +25 -6
  409. package/utils/uiplugins.ts +22 -0
  410. package/utils/validators/formRules/__tests__/index.test.ts +36 -3
  411. package/utils/validators/formRules/index.ts +13 -3
  412. package/utils/window.js +11 -7
  413. package/components/__tests__/ApplicationCard.test.ts +0 -27
  414. package/components/cards/ApplicationCard.vue +0 -145
  415. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
  416. package/config/product/legacy.js +0 -62
  417. package/config/secret.js +0 -14
  418. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
  419. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  420. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  421. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  422. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
  423. /package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
  424. /package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +0 -0
@@ -12,6 +12,7 @@ import { _EDIT, _VIEW } from '@shell/config/query-params';
12
12
  import { asciiLike } from '@shell/utils/string';
13
13
  import CodeMirror from '@shell/components/CodeMirror';
14
14
  import isEqual from 'lodash/isEqual';
15
+ import { LabeledTooltip } from '@components/LabeledTooltip';
15
16
 
16
17
  export default {
17
18
  name: 'KeyValue',
@@ -22,7 +23,8 @@ export default {
22
23
  CodeMirror,
23
24
  Select,
24
25
  TextAreaAutoGrow,
25
- FileSelector
26
+ FileSelector,
27
+ LabeledTooltip
26
28
  },
27
29
  props: {
28
30
  value: {
@@ -64,6 +66,12 @@ export default {
64
66
  type: [String, Boolean],
65
67
  default: '',
66
68
  },
69
+
70
+ protipValue: {
71
+ type: [String, Boolean],
72
+ default: '',
73
+ },
74
+
67
75
  // For asMap=false, the name of the field that goes into the row objects
68
76
  keyName: {
69
77
  type: String,
@@ -95,20 +103,6 @@ export default {
95
103
  type: String,
96
104
  default: '',
97
105
  },
98
- /**
99
- * List of keys which needs to be disabled and hidden based on toggler
100
- */
101
- protectedKeys: {
102
- type: Array,
103
- default: () => [],
104
- },
105
- /**
106
- * Conditionally display protected keys, if any
107
- */
108
- toggleFilter: {
109
- type: Boolean,
110
- default: false,
111
- },
112
106
  separatorLabel: {
113
107
  type: String,
114
108
  default: '',
@@ -184,6 +178,10 @@ export default {
184
178
  type: String,
185
179
  default: '',
186
180
  },
181
+ addClass: {
182
+ type: String,
183
+ default: '',
184
+ },
187
185
  addAllowed: {
188
186
  type: Boolean,
189
187
  default: true,
@@ -210,7 +208,7 @@ export default {
210
208
  },
211
209
  removeIcon: {
212
210
  type: String,
213
- default: 'icon-minus',
211
+ default: '',
214
212
  },
215
213
  removeAllowed: {
216
214
  type: Boolean,
@@ -240,6 +238,10 @@ export default {
240
238
  default: false,
241
239
  type: Boolean
242
240
  },
241
+ keyErrors: {
242
+ type: Object,
243
+ default: () => ({})
244
+ }
243
245
  },
244
246
  data() {
245
247
  const rows = this.getRows(this.value);
@@ -252,6 +254,10 @@ export default {
252
254
  },
253
255
  computed: {
254
256
  _protip() {
257
+ if (this.protip === false) {
258
+ return null;
259
+ }
260
+
255
261
  return this.protip || this.t('keyValue.protip', null, true);
256
262
  },
257
263
  _keyLabel() {
@@ -323,10 +329,6 @@ export default {
323
329
  }
324
330
  },
325
331
 
326
- isProtected(key) {
327
- return this.protectedKeys && this.protectedKeys.includes(key);
328
- },
329
-
330
332
  getRows(value) {
331
333
  const rows = [];
332
334
 
@@ -515,10 +517,16 @@ export default {
515
517
  const text = event.clipboardData.getData('text/plain');
516
518
  const lines = text.split('\n');
517
519
  const splits = lines.map((line) => {
518
- const splitter = this.parserSeparators.find((sep) => line.includes(sep));
520
+ const separatorIndex = line.search(new RegExp(this.parserSeparators.join('|')));
521
+
522
+ if (separatorIndex === -1) {
523
+ return [];
524
+ }
525
+ const key = line.substring(0, separatorIndex).trim();
526
+ const value = line.substring(separatorIndex + 1).trim();
519
527
 
520
- return splitter ? line.split(splitter) : '';
521
- }).filter((split) => split && split.length > 0);
528
+ return [key, value];
529
+ }).filter((split) => split.length > 0);
522
530
 
523
531
  if (splits.length === 0 || (splits.length === 1 && splits[0].length < 2)) {
524
532
  return;
@@ -606,8 +614,8 @@ export default {
606
614
  <template v-if="rows.length || isView">
607
615
  <div class="rowgroup">
608
616
  <div class="row">
609
- <label
610
- class="text-label"
617
+ <div
618
+ class="text-label key-value-label"
611
619
  role="columnheader"
612
620
  >
613
621
  {{ _keyLabel }}
@@ -617,21 +625,32 @@ export default {
617
625
  v-stripped-aria-label="_protip"
618
626
  class="icon icon-info"
619
627
  tabindex="0"
628
+ role="tooltip"
620
629
  />
621
- </label>
622
- <label
623
- class="text-label"
630
+ </div>
631
+ <div
632
+ class="text-label key-value-label"
624
633
  role="columnheader"
625
634
  >
626
635
  {{ _valueLabel }}
627
- </label>
628
- <label
636
+ <i
637
+ v-if="protipValue && !isView && addAllowed"
638
+ v-clean-tooltip="{content: protipValue, triggers: ['hover', 'touch', 'focus'] }"
639
+ v-stripped-aria-label="protipValue"
640
+ class="icon icon-info"
641
+ tabindex="0"
642
+ role="tooltip"
643
+ />
644
+ </div>
645
+ <div
629
646
  v-for="(c, i) in extraColumns"
630
647
  :key="i"
631
648
  role="columnheader"
632
649
  >
633
- <slot :name="'label:'+c">{{ c }}</slot>
634
- </label>
650
+ <slot :name="'label:'+c">
651
+ {{ c }}
652
+ </slot>
653
+ </div>
635
654
  <slot
636
655
  v-if="canRemove"
637
656
  name="remove"
@@ -664,10 +683,7 @@ export default {
664
683
  v-else
665
684
  :key="i"
666
685
  >
667
- <div
668
- class="rowgroup"
669
- :class="{'hide': isProtected(row.key) && !toggleFilter}"
670
- >
686
+ <div class="rowgroup">
671
687
  <div class="row">
672
688
  <!-- Key -->
673
689
  <div
@@ -675,6 +691,10 @@ export default {
675
691
  role="gridcell"
676
692
  :aria-rowindex="i+1"
677
693
  :aria-colindex="1"
694
+ :class="{
695
+ 'labeled-input-key': keyErrors[row.key],
696
+ 'v-popper--has-tooltip': keyErrors[row.key],
697
+ }"
678
698
  >
679
699
  <slot
680
700
  name="key"
@@ -690,7 +710,7 @@ export default {
690
710
  ref="key"
691
711
  v-model:value="row[keyName]"
692
712
  :searchable="true"
693
- :disabled="disabled || isProtected(row.key)"
713
+ :disabled="disabled"
694
714
  :clearable="false"
695
715
  :taggable="keyTaggable"
696
716
  :options="calculateOptions(row[keyName])"
@@ -702,13 +722,18 @@ export default {
702
722
  v-else
703
723
  ref="key"
704
724
  v-model="row[keyName]"
705
- :disabled="isView || disabled || !keyEditable || isProtected(row.key)"
725
+ :disabled="isView || disabled || !keyEditable"
706
726
  :placeholder="_keyPlaceholder"
707
727
  :data-testid="`input-kv-item-key-${i}`"
708
728
  :aria-label="t('generic.ariaLabel.key', {index: i+1})"
709
729
  @input="queueUpdate"
710
730
  @paste="onPaste(i, $event)"
711
731
  >
732
+ <LabeledTooltip
733
+ v-if="keyErrors[row.key]"
734
+ :value="keyErrors[row.key]"
735
+ :hover="true"
736
+ />
712
737
  </slot>
713
738
  </div>
714
739
 
@@ -758,7 +783,7 @@ export default {
758
783
  v-model:value="row[valueName]"
759
784
  data-testid="value-multiline"
760
785
  :class="{'conceal': valueConcealed}"
761
- :disabled="disabled || isProtected(row.key)"
786
+ :disabled="disabled"
762
787
  :mode="mode"
763
788
  :placeholder="_valuePlaceholder"
764
789
  :min-height="40"
@@ -769,7 +794,7 @@ export default {
769
794
  <input
770
795
  v-else
771
796
  v-model="row[valueName]"
772
- :disabled="isView || disabled || isProtected(row.key)"
797
+ :disabled="isView || disabled"
773
798
  :type="valueConcealed ? 'password' : 'text'"
774
799
  :placeholder="_valuePlaceholder"
775
800
  autocorrect="off"
@@ -823,12 +848,16 @@ export default {
823
848
  <button
824
849
  type="button"
825
850
  role="button"
826
- :disabled="isView || isProtected(row.key) || disabled"
851
+ :disabled="isView || disabled"
827
852
  :aria-label="t('generic.ariaLabel.remove', {index: i+1})"
828
853
  class="btn role-link"
829
854
  @click="remove(i)"
830
855
  >
831
856
  {{ removeLabel || t('generic.remove') }}
857
+ <i
858
+ v-if="removeIcon"
859
+ :class="[removeIcon]"
860
+ />
832
861
  </button>
833
862
  </slot>
834
863
  </div>
@@ -838,7 +867,7 @@ export default {
838
867
  </div>
839
868
  <div
840
869
  v-if="(addAllowed || readAllowed) && !isView"
841
- class="footer mt-20"
870
+ class="footer mt-10"
842
871
  >
843
872
  <slot
844
873
  name="add"
@@ -849,6 +878,7 @@ export default {
849
878
  type="button"
850
879
  role="button"
851
880
  class="btn role-tertiary add"
881
+ :class="[addClass]"
852
882
  data-testid="add_row_item_button"
853
883
  :disabled="loading || disabled || (keyOptions && filteredKeyOptions.length === 0)"
854
884
  :aria-label="t('generic.ariaLabel.addKeyValue')"
@@ -885,7 +915,8 @@ export default {
885
915
  display: grid;
886
916
  align-items: center;
887
917
  column-gap: 20px;
888
- label {
918
+
919
+ .key-value-label {
889
920
  margin-bottom: 0;
890
921
  }
891
922
  & .kv-item {
@@ -962,4 +993,11 @@ export default {
962
993
  padding: 0px 0px 0px 10px;
963
994
  }
964
995
  }
996
+
997
+ .labeled-input-key {
998
+ position: relative;
999
+ display: flex;
1000
+ border-collapse: separate;
1001
+ z-index: 0; // Prevent label from cover other elements outside of the input
1002
+ }
965
1003
  </style>
@@ -9,6 +9,9 @@ import { generateRandomAlphaString } from '@shell/utils/string';
9
9
  import LabeledSelectPagination from '@shell/components/form/labeled-select-utils/labeled-select-pagination';
10
10
  import { LABEL_SELECT_NOT_OPTION_KINDS } from '@shell/types/components/labeledSelect';
11
11
  import { mapGetters } from 'vuex';
12
+ import { _VIEW } from '@shell/config/query-params';
13
+ import { useClickOutside } from '@shell/composables/useClickOutside';
14
+ import { ref } from 'vue';
12
15
 
13
16
  export default {
14
17
  name: 'LabeledSelect',
@@ -114,12 +117,22 @@ export default {
114
117
  }
115
118
  },
116
119
 
120
+ setup() {
121
+ const select = ref(null);
122
+ const isOpen = ref(false);
123
+
124
+ useClickOutside(select, () => {
125
+ isOpen.value = false;
126
+ });
127
+
128
+ return { isOpen, select };
129
+ },
130
+
117
131
  data() {
118
132
  return {
119
133
  selectedVisibility: 'visible',
120
134
  shouldOpen: true,
121
135
  labeledSelectLabelId: `ls-label-id-${ generateRandomAlphaString(12) }`,
122
- isOpen: false,
123
136
  generatedUid: `ls-uid-${ generateRandomAlphaString(12) }`
124
137
  };
125
138
  },
@@ -156,20 +169,24 @@ export default {
156
169
  },
157
170
 
158
171
  methods: {
159
- // resizeHandler = in mixin
160
- focusSearch(ev) {
161
- if (this.isView || this.disabled || this.loading) {
172
+ // Ensure we only focus on open, otherwise we re-open on close
173
+ clickSelect() {
174
+ if (this.mode === _VIEW || this.loading === true || this.disabled === true) {
162
175
  return;
163
176
  }
164
177
 
165
- const searchBox = document.querySelector('.vs__search');
178
+ this.isOpen = !this.isOpen;
166
179
 
167
- // added to mitigate https://github.com/rancher/dashboard/issues/14361
168
- if (!this.isSearchable || (searchBox && document.activeElement && !searchBox.contains(document.activeElement))) {
169
- ev.preventDefault();
180
+ if (this.isOpen) {
181
+ this.focusSearch();
170
182
  }
183
+ },
171
184
 
172
- this.$refs['select-input'].open = true;
185
+ // resizeHandler = in mixin
186
+ focusSearch() {
187
+ if (this.isView || this.disabled || this.loading) {
188
+ return;
189
+ }
173
190
 
174
191
  this.$nextTick(() => {
175
192
  const el = this.$refs['select-input']?.searchEl;
@@ -180,6 +197,10 @@ export default {
180
197
  });
181
198
  },
182
199
 
200
+ focusWrapper() {
201
+ this.$refs.select.focus();
202
+ },
203
+
183
204
  onFocus() {
184
205
  this.selectedVisibility = 'hidden';
185
206
  this.onFocusLabeled();
@@ -191,14 +212,27 @@ export default {
191
212
  },
192
213
 
193
214
  onOpen() {
194
- this.isOpen = true;
215
+ this.focusSearch();
195
216
  this.$emit('on-open');
196
217
  this.resizeHandler();
197
218
  },
198
219
 
199
- onClose() {
220
+ closeOnSelecting(e) {
221
+ if (e.value === this.value) {
222
+ this.close();
223
+ }
224
+
225
+ this.$emit('selecting', e);
226
+ },
227
+
228
+ close() {
200
229
  this.isOpen = false;
230
+ this.onClose();
231
+ },
232
+
233
+ onClose() {
201
234
  this.$emit('on-close');
235
+ this.focusWrapper();
202
236
  },
203
237
 
204
238
  getOptionLabel(option) {
@@ -233,6 +267,10 @@ export default {
233
267
  },
234
268
 
235
269
  dropdownShouldOpen(instance, forceOpen = false) {
270
+ if (!this.isOpen) {
271
+ return false;
272
+ }
273
+
236
274
  const { noDrop, mutableLoading } = instance;
237
275
  const { open } = instance;
238
276
  const shouldOpen = this.shouldOpen;
@@ -297,10 +335,10 @@ export default {
297
335
  :aria-expanded="isOpen"
298
336
  :aria-describedby="$attrs['aria-describedby'] || undefined"
299
337
  :aria-required="requiredField"
300
- @click="focusSearch"
301
- @keydown.enter="focusSearch"
302
- @keydown.down.prevent="focusSearch"
303
- @keydown.space="focusSearch"
338
+ @click="clickSelect"
339
+ @keydown.self.enter="clickSelect"
340
+ @keydown.self.down.prevent="clickSelect"
341
+ @keydown.self.space.prevent="clickSelect"
304
342
  >
305
343
  <div
306
344
  :class="{ 'labeled-container': true, raised, empty, [mode]: true }"
@@ -327,6 +365,7 @@ export default {
327
365
  ref="select-input"
328
366
  v-bind="filteredAttrs"
329
367
  class="inline"
368
+ :close-on-select="false"
330
369
  :append-to-body="appendToBody"
331
370
  :calculate-position="positionDropdown"
332
371
  :class="{ 'no-label': !(label || '').length}"
@@ -353,7 +392,8 @@ export default {
353
392
  @search="onSearch"
354
393
  @open="onOpen"
355
394
  @close="onClose"
356
- @option:selecting="$emit('selecting', $event)"
395
+ @option:selecting="closeOnSelecting"
396
+ @option:selected="close"
357
397
  @option:deselecting="$emit('deselecting', $event)"
358
398
  @keydown.enter.stop
359
399
  >
@@ -1,6 +1,74 @@
1
- <script>
2
- import KeyValue from '@shell/components/form/KeyValue';
1
+ <script lang="ts">
2
+ import { pickBy, omitBy, mapValues } from 'lodash';
3
+ import { matchesSomeRegex } from '@shell/utils/string';
4
+ import { LABELS_TO_IGNORE_REGEX, ANNOTATIONS_TO_IGNORE_REGEX } from '@shell/config/labels-annotations';
5
+ import KeyValue from '@shell/components/form/KeyValue.vue';
3
6
  import { ToggleSwitch } from '@components/Form/ToggleSwitch';
7
+ import { _VIEW } from '@shell/config/query-params';
8
+
9
+ export class Factory {
10
+ private protectedKeys: string[] = [];
11
+ private protectedRegexes: RegExp[] = [];
12
+ private protectedWarning = '';
13
+
14
+ private isProtected(key: string) {
15
+ return this.protectedKeys.includes(key) || matchesSomeRegex(key, this.protectedRegexes);
16
+ }
17
+
18
+ private omitProtected(obj: object) {
19
+ return omitBy(obj, (_, key) => this.isProtected(key));
20
+ }
21
+
22
+ private pickProtected(obj: object) {
23
+ return pickBy(obj, (_, key) => this.isProtected(key));
24
+ }
25
+
26
+ private keyErrorMap(elems: object) {
27
+ return mapValues(this.pickProtected(elems), () => this.protectedWarning);
28
+ }
29
+
30
+ constructor(protectedKeys: string[], protectedRegexes: RegExp[], msg: string, initValue: object) {
31
+ // Init privates
32
+ this.protectedKeys = protectedKeys || [];
33
+ this.protectedRegexes = protectedRegexes || [];
34
+ this.protectedWarning = msg || '';
35
+
36
+ this.initValue = initValue || {};
37
+ this.value = this.omitProtected(this.initValue);
38
+ this.keyErrors = this.keyErrorMap(this.value);
39
+ this.hasProtectedKeys = Object.keys(this.pickProtected(this.initValue)).length > 0;
40
+ }
41
+
42
+ initValue: object = {};
43
+ value: object = {};
44
+ keyErrors: object = {};
45
+ hasProtectedKeys = false;
46
+
47
+ /**
48
+ * Updates resource's model and discard new protected keys
49
+ * Old protected keys remain untouched on edit
50
+ *
51
+ * @param value edited labels/annotations
52
+ * @param callbackFn function to set model's labels/annotations
53
+ */
54
+ update(value: Record<string, string>, callbackFn: (value: object) => void) {
55
+ const neu = value || {};
56
+
57
+ callbackFn({
58
+ ...this.omitProtected(neu),
59
+ ...this.pickProtected(this.initValue),
60
+ });
61
+
62
+ this.value = neu;
63
+ this.keyErrors = this.keyErrorMap(neu);
64
+ }
65
+ }
66
+
67
+ interface DataType {
68
+ labels: Factory,
69
+ annotations: Factory,
70
+ toggler: boolean,
71
+ }
4
72
 
5
73
  export default {
6
74
  components: {
@@ -60,8 +128,14 @@ export default {
60
128
  },
61
129
  },
62
130
 
63
- data() {
64
- return { toggler: false };
131
+ data(): DataType {
132
+ const protectedWarning = this.t('labels.protectedWarning');
133
+
134
+ return {
135
+ labels: new Factory(this.value.systemLabels, LABELS_TO_IGNORE_REGEX, protectedWarning, this.value.labels),
136
+ annotations: new Factory(this.value.systemAnnotations, ANNOTATIONS_TO_IGNORE_REGEX, protectedWarning, this.value.annotations),
137
+ toggler: false
138
+ };
65
139
  },
66
140
 
67
141
  computed: {
@@ -75,6 +149,10 @@ export default {
75
149
 
76
150
  columnsClass() {
77
151
  return `${ this.displaySideBySide ? 'col span-6' : 'row' }`.trim();
152
+ },
153
+
154
+ showToggler() {
155
+ return this.mode === _VIEW && (this.labels.hasProtectedKeys || this.annotations.hasProtectedKeys);
78
156
  }
79
157
  }
80
158
  };
@@ -88,7 +166,7 @@ export default {
88
166
  <t k="labels.labels.title" />
89
167
  </h3>
90
168
  <ToggleSwitch
91
- v-if="value.hasSystemLabels"
169
+ v-if="showToggler"
92
170
  v-model:value="toggler"
93
171
  name="label-system-toggle"
94
172
  :on-label="t('labels.labels.show')"
@@ -98,21 +176,17 @@ export default {
98
176
  <t k="labels.labels.description" />
99
177
  </p>
100
178
  <div :class="columnsClass">
101
- <slot
102
- name="labels"
103
- :toggler="toggler"
104
- >
179
+ <slot name="labels">
105
180
  <KeyValue
106
181
  key="labels"
107
- :value="value.labels"
108
- :protected-keys="value.systemLabels || []"
109
- :toggle-filter="toggler"
182
+ :value="toggler ? labels.initValue : labels.value"
110
183
  :add-label="t('labels.addLabel')"
111
184
  :add-icon="addIcon"
112
185
  :mode="mode"
113
186
  :read-allowed="false"
114
187
  :value-can-be-empty="true"
115
- @update:value="value.setLabels($event)"
188
+ :key-errors="labels.keyErrors"
189
+ @update:value="labels.update($event, (x) => value.setLabels(x))"
116
190
  />
117
191
  </slot>
118
192
  </div>
@@ -125,17 +199,16 @@ export default {
125
199
  >
126
200
  <KeyValue
127
201
  key="annotations"
128
- :value="value.annotations"
202
+ :value="toggler ? annotations.initValue : annotations.value"
129
203
  :add-label="t('labels.addAnnotation')"
130
204
  :add-icon="addIcon"
131
205
  :mode="mode"
132
- :protected-keys="value.systemAnnotations || []"
133
- :toggle-filter="toggler"
134
206
  :title="t('labels.annotations.title')"
135
207
  :title-protip="annotationTitleTooltip"
136
208
  :read-allowed="false"
137
209
  :value-can-be-empty="true"
138
- @update:value="value.setAnnotations($event)"
210
+ :key-errors="annotations.keyErrors"
211
+ @update:value="annotations.update($event, (x) => value.setAnnotations(x))"
139
212
  />
140
213
  </div>
141
214
  </div>