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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/key.svg +17 -0
  3. package/assets/styles/base/_spacing.scss +2 -2
  4. package/assets/styles/global/_form.scss +1 -1
  5. package/assets/styles/global/_labeled-input.scss +1 -1
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/vendor/vue-select.scss +1 -1
  9. package/assets/translations/en-us.yaml +404 -64
  10. package/assets/translations/zh-hans.yaml +3 -4
  11. package/cloud-credential/gcp.vue +9 -1
  12. package/components/AppModal.vue +2 -0
  13. package/components/CodeMirror.vue +1 -1
  14. package/components/ConfigMapSettings/Settings.vue +377 -0
  15. package/components/ConfigMapSettings/index.vue +354 -0
  16. package/components/CruResource.vue +1 -2
  17. package/components/DetailText.vue +61 -11
  18. package/components/Drawer/Chrome.vue +116 -0
  19. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  20. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  21. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  22. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  23. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +82 -0
  24. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  25. package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
  26. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  27. package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
  28. package/components/GrowlManager.vue +16 -15
  29. package/components/IconOrSvg.vue +5 -0
  30. package/components/KeyValueView.vue +1 -1
  31. package/components/LocaleSelector.vue +9 -1
  32. package/components/ProgressBarMulti.vue +1 -0
  33. package/components/PromptModal.vue +6 -1
  34. package/components/RelatedResources.vue +4 -12
  35. package/components/Resource/Detail/Additional.vue +46 -0
  36. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
  37. package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
  38. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  39. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +37 -254
  40. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
  41. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +27 -5
  42. package/components/Resource/Detail/Metadata/KeyValue.vue +25 -17
  43. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
  44. package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
  45. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
  46. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
  47. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  48. package/components/Resource/Detail/Metadata/composables.ts +60 -11
  49. package/components/Resource/Detail/Metadata/index.vue +12 -5
  50. package/components/Resource/Detail/Page.vue +15 -0
  51. package/components/Resource/Detail/ResourceRow.vue +37 -18
  52. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  53. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  54. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  55. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  56. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  57. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  58. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  59. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  60. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  61. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  62. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  63. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  64. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  65. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  66. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  67. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  68. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  69. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  70. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  71. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  72. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  73. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  74. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  75. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  76. package/components/Resource/Detail/TitleBar/Title.vue +2 -1
  77. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
  78. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
  79. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  80. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
  81. package/components/Resource/Detail/TitleBar/composables.ts +44 -0
  82. package/components/Resource/Detail/TitleBar/index.vue +83 -11
  83. package/components/Resource/Detail/composables.ts +45 -0
  84. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  85. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  86. package/components/ResourceDetail/Masthead/index.vue +65 -0
  87. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  88. package/components/ResourceDetail/__tests__/index.test.ts +26 -5
  89. package/components/ResourceDetail/index.vue +30 -16
  90. package/components/ResourceDetail/legacy.vue +18 -1
  91. package/components/ResourceList/Masthead.vue +6 -0
  92. package/components/ResourceYaml.vue +14 -1
  93. package/components/SlideInPanelManager.vue +46 -7
  94. package/components/StateDot/index.vue +28 -0
  95. package/components/Tabbed/index.vue +11 -15
  96. package/components/Wizard.vue +4 -2
  97. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  98. package/components/__tests__/GrowlManager.test.ts +0 -25
  99. package/components/auth/login/ldap.vue +1 -1
  100. package/components/fleet/FleetApplications.vue +0 -7
  101. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  102. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  103. package/components/fleet/FleetClusters.vue +25 -6
  104. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  105. package/components/fleet/FleetHelmOps.vue +8 -0
  106. package/components/fleet/FleetRepos.vue +1 -6
  107. package/components/fleet/FleetResources.vue +4 -5
  108. package/components/fleet/FleetValuesFrom.vue +295 -0
  109. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  110. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  111. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +13 -13
  112. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  113. package/components/fleet/dashboard/ResourceCard.vue +1 -0
  114. package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
  115. package/components/fleet/dashboard/ResourceDetails.vue +8 -10
  116. package/components/fleet/dashboard/ResourcePanel.vue +15 -8
  117. package/components/form/ArrayList.vue +13 -2
  118. package/components/form/ChangePassword.vue +3 -1
  119. package/components/form/Footer.vue +10 -4
  120. package/components/form/KeyValue.vue +81 -43
  121. package/components/form/LabeledSelect.vue +56 -16
  122. package/components/form/Labels.vue +90 -17
  123. package/components/form/MatchExpressions.vue +46 -5
  124. package/components/form/NameNsDescription.vue +1 -1
  125. package/components/form/ResourceSelector.vue +1 -0
  126. package/components/form/ResourceTabs/index.vue +5 -0
  127. package/components/form/SecretSelector.vue +9 -2
  128. package/components/form/Select.vue +57 -19
  129. package/components/form/SimpleSecretSelector.vue +9 -2
  130. package/components/form/Taints.vue +21 -2
  131. package/components/form/UnitInput.vue +8 -0
  132. package/components/form/ValueFromResource.vue +1 -1
  133. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  134. package/components/form/__tests__/Labels.test.ts +360 -0
  135. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  136. package/components/form/__tests__/Select.test.ts +5 -2
  137. package/components/formatter/FleetApplicationSource.vue +1 -1
  138. package/components/formatter/WorkloadHealthScale.vue +1 -1
  139. package/components/google/AccountAccess.vue +211 -0
  140. package/components/google/types/gcp.d.ts +136 -0
  141. package/components/google/types/index.d.ts +101 -0
  142. package/components/google/util/__mocks__/gcp.ts +465 -0
  143. package/components/google/util/formatter.ts +82 -0
  144. package/components/google/util/gcp.ts +134 -0
  145. package/components/google/util/index.d.ts +11 -0
  146. package/components/nav/Favorite.vue +1 -1
  147. package/components/nav/Group.vue +70 -47
  148. package/components/nav/Header.vue +5 -1
  149. package/components/nav/NamespaceFilter.vue +13 -1
  150. package/components/nav/NotificationCenter/Notification.vue +510 -0
  151. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  152. package/components/nav/NotificationCenter/index.vue +148 -0
  153. package/composables/drawer.ts +26 -0
  154. package/composables/resources.test.ts +63 -0
  155. package/composables/resources.ts +38 -0
  156. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  157. package/config/labels-annotations.js +6 -0
  158. package/config/product/auth.js +16 -1
  159. package/config/product/{cis.js → compliance.js} +23 -26
  160. package/config/product/explorer.js +5 -1
  161. package/config/product/fleet.js +7 -0
  162. package/config/product/settings.js +22 -11
  163. package/config/query-params.js +3 -0
  164. package/config/roles.ts +1 -1
  165. package/config/router/navigation-guards/authentication.js +51 -2
  166. package/config/router/routes.js +27 -31
  167. package/config/settings.ts +21 -3
  168. package/config/store.js +2 -0
  169. package/config/system-namespaces.js +1 -1
  170. package/config/table-headers.js +2 -2
  171. package/config/types.js +15 -6
  172. package/core/plugin.ts +32 -7
  173. package/core/types.ts +18 -1
  174. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  175. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  176. package/detail/management.cattle.io.oidcclient.vue +369 -0
  177. package/detail/node.vue +2 -2
  178. package/detail/pod.vue +2 -2
  179. package/detail/service.vue +10 -1
  180. package/detail/workload/index.vue +8 -2
  181. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  182. package/dialog/GenericPrompt.vue +1 -1
  183. package/dialog/ImportDialog.vue +8 -8
  184. package/dialog/OidcClientSecretDialog.vue +117 -0
  185. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  186. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
  187. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  188. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  189. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  190. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  191. package/edit/configmap.vue +4 -1
  192. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  193. package/edit/fleet.cattle.io.gitrepo.vue +44 -222
  194. package/edit/fleet.cattle.io.helmop.vue +44 -269
  195. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  196. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  197. package/edit/logging-flow/index.vue +1 -0
  198. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  199. package/edit/management.cattle.io.fleetworkspace.vue +1 -0
  200. package/edit/management.cattle.io.oidcclient.vue +162 -0
  201. package/edit/management.cattle.io.project.vue +4 -1
  202. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  203. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  204. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  205. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  206. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  207. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  208. package/edit/monitoring.coreos.com.route.vue +1 -0
  209. package/edit/namespace.vue +1 -0
  210. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  211. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  212. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  213. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  214. package/edit/node.vue +1 -0
  215. package/edit/persistentvolume/index.vue +4 -1
  216. package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
  217. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
  218. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  219. package/edit/resources.cattle.io.restore.vue +1 -1
  220. package/edit/secret/index.vue +1 -0
  221. package/edit/service.vue +4 -1
  222. package/edit/serviceaccount.vue +4 -1
  223. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  224. package/edit/workload/index.vue +5 -0
  225. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  226. package/list/management.cattle.io.oidcclient.vue +108 -0
  227. package/list/node.vue +2 -0
  228. package/machine-config/amazonec2.vue +3 -24
  229. package/machine-config/components/GCEImage.vue +374 -0
  230. package/machine-config/google.vue +617 -0
  231. package/mixins/__tests__/brand.spec.ts +170 -0
  232. package/mixins/brand.js +16 -17
  233. package/mixins/create-edit-view/index.js +5 -0
  234. package/mixins/resource-fetch-api-pagination.js +16 -0
  235. package/mixins/vue-select-overrides.js +1 -0
  236. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  237. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  238. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  239. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  240. package/models/fleet-application.js +8 -79
  241. package/models/fleet.cattle.io.cluster.js +11 -0
  242. package/models/fleet.cattle.io.gitrepo.js +2 -2
  243. package/models/fleet.cattle.io.helmop.js +9 -39
  244. package/models/management.cattle.io.fleetworkspace.js +2 -1
  245. package/models/management.cattle.io.oidcclient.js +18 -0
  246. package/models/management.cattle.io.registration.js +3 -0
  247. package/models/provisioning.cattle.io.cluster.js +5 -5
  248. package/models/service.js +4 -0
  249. package/models/workload.js +5 -0
  250. package/package.json +1 -1
  251. package/pages/about.vue +4 -58
  252. package/pages/auth/login.vue +1 -1
  253. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
  254. package/pages/c/_cluster/apps/charts/index.vue +285 -81
  255. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  256. package/pages/c/_cluster/explorer/index.vue +3 -3
  257. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  258. package/pages/c/_cluster/fleet/application/create.vue +3 -2
  259. package/pages/c/_cluster/fleet/index.vue +94 -56
  260. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  261. package/pages/c/_cluster/longhorn/index.vue +5 -2
  262. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  263. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  264. package/pages/explorer/resource/detail/configmap.vue +30 -7
  265. package/pages/explorer/resource/detail/secret.vue +50 -0
  266. package/pages/home.vue +9 -55
  267. package/pages/support/index.vue +4 -6
  268. package/plugins/dashboard-store/actions.js +19 -5
  269. package/plugins/dashboard-store/getters.js +4 -0
  270. package/plugins/dashboard-store/resource-class.js +16 -2
  271. package/plugins/steve/steve-pagination-utils.ts +26 -18
  272. package/plugins/steve/subscribe.js +6 -1
  273. package/rancher-components/Banner/Banner.vue +13 -0
  274. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
  275. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  276. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  277. package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
  278. package/store/auth.js +2 -0
  279. package/store/catalog.js +23 -1
  280. package/store/growl.js +97 -8
  281. package/store/index.js +6 -0
  282. package/store/notifications.ts +426 -0
  283. package/store/prefs.js +0 -1
  284. package/store/type-map.js +19 -16
  285. package/store/uiplugins.ts +15 -1
  286. package/types/fleet.d.ts +24 -0
  287. package/types/notifications/index.ts +74 -0
  288. package/types/shell/index.d.ts +46 -32
  289. package/types/store/dashboard-store.types.ts +16 -0
  290. package/utils/__tests__/fleet.test.ts +148 -0
  291. package/utils/__tests__/object.test.ts +54 -1
  292. package/utils/__tests__/string.test.ts +273 -1
  293. package/utils/__tests__/time.test.ts +31 -0
  294. package/utils/auth.js +9 -2
  295. package/utils/crypto/encryption.ts +103 -0
  296. package/utils/cspAdaptor.ts +51 -0
  297. package/utils/fleet.ts +54 -65
  298. package/utils/object.js +36 -0
  299. package/utils/pagination-utils.ts +1 -1
  300. package/utils/release-notes.ts +48 -0
  301. package/utils/selector-typed.ts +7 -2
  302. package/utils/string.js +24 -0
  303. package/utils/{time.js → time.ts} +25 -6
  304. package/utils/uiplugins.ts +22 -0
  305. package/utils/validators/formRules/index.ts +3 -0
  306. package/components/Resource/Detail/TitleBar/composable.ts +0 -31
  307. package/config/product/legacy.js +0 -62
  308. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  309. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  310. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  311. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
  312. /package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
@@ -736,6 +736,17 @@ export default class Resource {
736
736
  );
737
737
  }
738
738
 
739
+ get stateColorPair() {
740
+ return {
741
+ state: this.stateDisplay,
742
+ color: this.stateSimpleColor
743
+ };
744
+ }
745
+
746
+ get stateSimpleColor() {
747
+ return this.stateColor.replace('text-', '');
748
+ }
749
+
739
750
  get stateBackground() {
740
751
  return this.stateColor.replace('text-', 'bg-');
741
752
  }
@@ -1868,10 +1879,13 @@ export default class Resource {
1868
1879
  namespace,
1869
1880
  labelSelector: { matchExpressions: parse(selector) }
1870
1881
  },
1871
- opts: opt
1882
+ opts: {
1883
+ transient: true,
1884
+ ...opt,
1885
+ },
1872
1886
  });
1873
1887
 
1874
- addObjects(out, matching);
1888
+ addObjects(out, matching.data);
1875
1889
  }
1876
1890
 
1877
1891
  // Find all the resources that match the required id's
@@ -454,7 +454,6 @@ class StevePaginationUtils extends NamespaceProjectFilters {
454
454
 
455
455
  // First check in our hardcoded list of supported filters
456
456
  if (
457
- process.env.NODE_ENV === 'dev' &&
458
457
  !!schema &&
459
458
  [
460
459
  StevePaginationUtils.VALID_FIELDS[''], // Global
@@ -500,16 +499,25 @@ class StevePaginationUtils extends NamespaceProjectFilters {
500
499
  // Check if the API supports filtering by this field
501
500
  this.validateField(validateFields, schema, field.field);
502
501
 
503
- const value = encodeURIComponent(field.value);
502
+ const encodedValue = encodeURIComponent(field.value);
504
503
 
505
504
  // = exact match (equals + exact)
506
505
  // ~ partial match (equals + !exact)
507
506
  // != not exact match (!equals + exact)
508
507
  // !~ not partial match (!equals + !exact)
509
508
  const operator = `${ field.equals ? '' : '!' }${ field.exact ? '=' : '~' }`;
510
- const quotedValue = StevePaginationUtils.VALID_FIELD_VALUE_REGEX.test(value) ? value : `"${ value }"`;
511
-
512
- return `${ this.convertArrayPath(field.field) }${ operator }${ quotedValue }`;
509
+ let safeValue;
510
+
511
+ if (StevePaginationUtils.VALID_FIELD_VALUE_REGEX.test(field.value)) {
512
+ // Does not contain any protected characters, send as is
513
+ safeValue = encodedValue;
514
+ } else {
515
+ // Contains protected characters, wrap in quotes to ensure backend doesn't fail
516
+ // - replace reserver `"`/`%22` with empty string - see https://github.com/rancher/dashboard/issues/14549 for improvement
517
+ safeValue = `"${ encodedValue.replaceAll('%22', '') }"`;
518
+ }
519
+
520
+ return `${ this.convertArrayPath(field.field) }${ operator }${ safeValue }`;
513
521
  }
514
522
 
515
523
  return field.value;
@@ -658,19 +666,19 @@ export const PAGINATION_SETTINGS_STORE_DEFAULTS: PaginationSettingsStore = {
658
666
  }
659
667
  }
660
668
  },
661
- // Disabled due to https://github.com/rancher/dashboard/issues/14493
662
- // management: {
663
- // resources: {
664
- // enableAll: false,
665
- // enableSome: {
666
- // enabled: [
667
- // { resource: CAPI.RANCHER_CLUSTER, context: ['home', 'side-bar'] },
668
- // { resource: MANAGEMENT.CLUSTER, context: ['side-bar'] },
669
- // ],
670
- // generic: false,
671
- // }
672
- // }
673
- // }
669
+ management: {
670
+ resources: {
671
+ enableAll: false,
672
+ enableSome: {
673
+ enabled: [
674
+ // { resource: CAPI.RANCHER_CLUSTER, context: ['home', 'side-bar'] }, // Disabled due to https://github.com/rancher/dashboard/issues/14493
675
+ // { resource: MANAGEMENT.CLUSTER, context: ['side-bar'] }, // Disabled due to https://github.com/rancher/dashboard/issues/14493
676
+ { resource: CATALOG.APP, context: ['branding'] },
677
+ ],
678
+ generic: false,
679
+ }
680
+ }
681
+ }
674
682
  };
675
683
 
676
684
  export default new StevePaginationUtils();
@@ -544,6 +544,9 @@ const sharedActions = {
544
544
  return dispatch('send', msg);
545
545
  },
546
546
 
547
+ /**
548
+ * @param {STEVE_WATCH_PARAMS} params
549
+ */
547
550
  unwatch(ctx, {
548
551
  type, id, namespace, selector, all, mode
549
552
  }) {
@@ -577,7 +580,7 @@ const sharedActions = {
577
580
  dispatch('watch', obj); // Ask the backend to stop watching the type
578
581
  } else if (all) {
579
582
  getters['watchesOfType'](type).forEach((obj) => {
580
- unwatch(obj);
583
+ unwatch({ ...obj, stop: true });
581
584
  });
582
585
  } else if (getters['watchStarted'](obj)) {
583
586
  unwatch(obj);
@@ -752,6 +755,7 @@ const defaultActions = {
752
755
  if (mode === STEVE_WATCH_MODE.RESOURCE_CHANGES) {
753
756
  // Other findX use options (id/ns/selector) from the messages received over socket.
754
757
  // However paginated requests have more complex params so grab them from store from the store.
758
+ // of type @StorePagination
755
759
  const storePagination = getters['havePage'](resourceType);
756
760
 
757
761
  if (!!storePagination) {
@@ -766,6 +770,7 @@ const defaultActions = {
766
770
  type: resourceType,
767
771
  opt: {
768
772
  ...opt,
773
+ namespaced: namespace,
769
774
  // This brings in page, page size, filter, etc
770
775
  ...storePagination.request
771
776
  }
@@ -3,6 +3,19 @@ import { defineComponent } from 'vue';
3
3
  import { nlToBr, generateRandomAlphaString } from '@shell/utils/string';
4
4
  import { stringify } from '@shell/utils/error';
5
5
 
6
+ /**
7
+ * These should eventually be used when making this component use the composable api but I need the props elsewhere so I'm defining them here.
8
+ */
9
+ export interface Props {
10
+ color?: string;
11
+ label?: string | Error | Object;
12
+ labelKey?: string;
13
+ icon?: string;
14
+ closable?: boolean;
15
+ stacked?: boolean;
16
+ disabled?: boolean;
17
+ }
18
+
6
19
  export default defineComponent({
7
20
  props: {
8
21
  /**
@@ -305,12 +305,15 @@ export default defineComponent({
305
305
  :class="{ 'checkbox-primary': primary }"
306
306
  >
307
307
  <slot name="label">
308
- <t
308
+ <span
309
309
  v-if="labelKey"
310
310
  :id="idForLabel"
311
- :k="labelKey"
312
- :raw="true"
313
- />
311
+ >
312
+ <t
313
+ :k="labelKey"
314
+ :raw="true"
315
+ />
316
+ </span>
314
317
  <span
315
318
  v-else-if="label"
316
319
  :id="idForLabel"
@@ -322,6 +325,7 @@ export default defineComponent({
322
325
  class="checkbox-info icon icon-info icon-lg"
323
326
  :data-testid="componentTestid + '-info-icon'"
324
327
  :tabindex="isDisabled ? -1 : 0"
328
+ role="tooltip"
325
329
  />
326
330
  <i
327
331
  v-else-if="tooltip"
@@ -330,6 +334,7 @@ export default defineComponent({
330
334
  class="checkbox-info icon icon-info icon-lg"
331
335
  :data-testid="componentTestid + '-info-icon'"
332
336
  :tabindex="isDisabled ? -1 : 0"
337
+ role="tooltip"
333
338
  />
334
339
  </slot>
335
340
  </span>
@@ -407,7 +407,7 @@ export default defineComponent({
407
407
  :id="inputId"
408
408
  ref="value"
409
409
  v-stripped-aria-label="!hasLabel && ariaLabel ? ariaLabel : undefined"
410
- role="textbox"
410
+ :role="type === 'number' ? undefined : 'textbox'"
411
411
  :class="{ 'no-label': !hasLabel }"
412
412
  v-bind="$attrs"
413
413
  :maxlength="_maxlength"
@@ -73,6 +73,7 @@ export default defineComponent({
73
73
  class="icon status-icon"
74
74
  tabindex="0"
75
75
  :data-testid="componentTestid"
76
+ role="tooltip"
76
77
  />
77
78
  </template>
78
79
  <template v-else>
@@ -80,7 +80,7 @@ interface RcItemCardProps {
80
80
  image?: Image;
81
81
 
82
82
  /** Optional actions that will be displayed inside an action-menu */
83
- actions?: DropdownOption;
83
+ actions?: DropdownOption[];
84
84
 
85
85
  /** Text content inside the card body. A slot is available for it too #item-card-content */
86
86
  content?: Label;
@@ -149,6 +149,10 @@ const cardMeta = computed(() => ({
149
149
  <div
150
150
  ref="cardEl"
151
151
  class="item-card"
152
+ :class="{
153
+ 'clickable':
154
+ clickable
155
+ }"
152
156
  :role="cardMeta.role"
153
157
  :tabindex="cardMeta.tabIndex"
154
158
  :aria-label="cardMeta.ariaLabel"
@@ -288,7 +292,7 @@ $image-medium-box-width: 48px;
288
292
  border: 1px solid var(--border);
289
293
  background: var(--body-bg);
290
294
 
291
- &:hover {
295
+ &.clickable:hover {
292
296
  border-color: var(--primary);
293
297
  }
294
298
 
@@ -329,10 +333,11 @@ $image-medium-box-width: 48px;
329
333
 
330
334
  &-left {
331
335
  flex-grow: 1;
336
+ min-width: 0;
332
337
  }
333
338
 
334
339
  &-title {
335
- max-width: 60%;
340
+ max-width: 80%;
336
341
  font-size: 18px;
337
342
  font-weight: 600;
338
343
  margin-bottom: 0px;
package/store/auth.js CHANGED
@@ -356,6 +356,8 @@ export const actions = {
356
356
 
357
357
  commit('loggedOut');
358
358
  dispatch('onLogout', null, { root: true });
359
+
360
+ dispatch('uiplugins/setReady', false, { root: true });
359
361
  },
360
362
 
361
363
  async logout({ dispatch, getters, rootState }, options = {}) {
package/store/catalog.js CHANGED
@@ -1,4 +1,4 @@
1
- import { CATALOG, EXPERIMENTAL, DEPRECATED } from '@shell/config/types';
1
+ import { CATALOG, EXPERIMENTAL, DEPRECATED, CATALOG_SORT_OPTIONS } from '@shell/config/types';
2
2
  import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
3
3
  import { addParams } from '@shell/utils/url';
4
4
  import { allHash, allHashSettled } from '@shell/utils/promise';
@@ -536,6 +536,7 @@ function addChart(ctx, map, chart, repo) {
536
536
  chartNameDisplay: chart.annotations?.[CATALOG_ANNOTATIONS.DISPLAY_NAME] || chart.name,
537
537
  chartDescription: chart.description,
538
538
  featured: chart.annotations?.[CATALOG_ANNOTATIONS.FEATURED],
539
+ featuredIndex: chart.annotations?.[CATALOG_ANNOTATIONS.FEATURED] ? Number(chart.annotations?.[CATALOG_ANNOTATIONS.FEATURED]) : Number.MAX_SAFE_INTEGER,
539
540
  repoKey: repo._key,
540
541
  versions: [],
541
542
  categories: filterCategories(chart.keywords),
@@ -565,6 +566,10 @@ function addChart(ctx, map, chart, repo) {
565
566
  }
566
567
 
567
568
  obj.versions.push(chart);
569
+
570
+ if (!obj.durationSinceRelease) {
571
+ obj.durationSinceRelease = Date.now() - new Date(obj.versions[0].created).getTime();
572
+ }
568
573
  }
569
574
 
570
575
  function preferSameRepo(matching, repoType, repoName) {
@@ -648,6 +653,7 @@ export function filterAndArrangeCharts(charts, {
648
653
  category,
649
654
  tag,
650
655
  searchQuery,
656
+ sort,
651
657
  showDeprecated = false,
652
658
  showHidden = false,
653
659
  showPrerelease = true,
@@ -700,5 +706,21 @@ export function filterAndArrangeCharts(charts, {
700
706
  return true;
701
707
  });
702
708
 
709
+ if (sort === CATALOG_SORT_OPTIONS.RECOMMENDED) {
710
+ return sortBy(out, ['featuredIndex', 'certifiedSort', 'repoName', 'chartNameDisplay']);
711
+ }
712
+
713
+ if (sort === CATALOG_SORT_OPTIONS.LAST_UPDATED_DESC) {
714
+ return sortBy(out, ['durationSinceRelease', 'featuredIndex', 'certifiedSort', 'repoName', 'chartNameDisplay']);
715
+ }
716
+
717
+ if (sort === CATALOG_SORT_OPTIONS.ALPHABETICAL_ASC) {
718
+ return sortBy(out, ['chartNameDisplay', 'featuredIndex', 'certifiedSort', 'repoName']);
719
+ }
720
+
721
+ if (sort === CATALOG_SORT_OPTIONS.ALPHABETICAL_DESC) {
722
+ return sortBy(out, ['chartNameDisplay'], true);
723
+ }
724
+
703
725
  return sortBy(out, ['certifiedSort', 'repoName', 'chartNameDisplay']);
704
726
  }
package/store/growl.js CHANGED
@@ -1,8 +1,11 @@
1
1
  import { clear, findBy, removeObject } from '@shell/utils/array';
2
2
  import { stringify } from '@shell/utils/error';
3
+ import { NotificationLevel } from '@shell/types/notifications';
3
4
 
4
5
  const DEFAULT_TIMEOUT = 5000;
5
6
 
7
+ const MAX_GROWLS = 5;
8
+
6
9
  export const state = function() {
7
10
  return {
8
11
  nextId: 1,
@@ -13,18 +16,28 @@ export const state = function() {
13
16
  export const getters = {
14
17
  find: (state) => ({ key, val }) => {
15
18
  return findBy(state.stack, key, val);
19
+ },
20
+
21
+ // findBy is slow, so more efficient getter for id
22
+ byId: (state) => (id) => {
23
+ return state.stack.find((item) => item.id === id);
16
24
  }
17
25
  };
18
26
 
19
27
  export const mutations = {
20
28
  add(state, data) {
29
+ if (state.stack.length === MAX_GROWLS) {
30
+ // Remove the last one
31
+ state.stack.pop();
32
+ }
33
+
21
34
  state.stack = [
22
- ...state.stack,
23
35
  {
24
36
  id: state.nextId++,
25
37
  started: (new Date().getTime()),
26
38
  ...data
27
- }
39
+ },
40
+ ...state.stack
28
41
  ];
29
42
  },
30
43
 
@@ -50,11 +63,29 @@ export const actions = {
50
63
  commit('remove', id);
51
64
  },
52
65
 
53
- success({ commit }, data) {
66
+ async close({ commit, dispatch, getters }, id ) {
67
+ const growl = getters.byId(id);
68
+
69
+ commit('remove', id);
70
+
71
+ // If the growl has a notification, mark it as read if the user dismisses the growl
72
+ if (growl.notification) {
73
+ await dispatch('notifications/markRead', growl.notification, { root: true });
74
+ }
75
+ },
76
+
77
+ async success({ commit, dispatch }, data) {
78
+ // Send a notification for the growl
79
+ const notification = await dispatch('notifications/fromGrowl', {
80
+ ...data,
81
+ level: NotificationLevel.Success
82
+ }, { root: true });
83
+
54
84
  commit('add', {
55
85
  color: 'success',
56
86
  icon: 'checkmark',
57
87
  timeout: DEFAULT_TIMEOUT,
88
+ notification,
58
89
  ...data
59
90
  });
60
91
  },
@@ -68,31 +99,89 @@ export const actions = {
68
99
  });
69
100
  },
70
101
 
71
- warning({ commit }, data) {
102
+ async warning({ commit, dispatch }, data) {
103
+ // Send a notification for the growl
104
+ const notification = await dispatch('notifications/fromGrowl', {
105
+ ...data,
106
+ level: NotificationLevel.Warning
107
+ }, { root: true });
108
+
72
109
  commit('add', {
73
110
  color: 'warning',
74
111
  icon: 'warning',
75
112
  timeout: DEFAULT_TIMEOUT,
113
+ notification,
76
114
  ...data
77
115
  });
78
116
  },
79
117
 
80
- error({ commit }, data) {
118
+ async error({ commit, dispatch }, data) {
119
+ // Send a notification for the growl
120
+ const notification = await dispatch('notifications/fromGrowl', {
121
+ ...data,
122
+ level: NotificationLevel.Error
123
+ }, { root: true });
124
+
81
125
  commit('add', {
82
126
  color: 'error',
83
127
  icon: 'error',
84
- timeout: 0, // Errors don't timeout
128
+ timeout: DEFAULT_TIMEOUT, // Errors timeout since they will be available as a notification
129
+ notification,
85
130
  ...data
86
131
  });
87
132
  },
88
133
 
89
- fromError({ commit }, { title, err }) {
134
+ async fromError({ commit, dispatch }, { title, err }) {
135
+ // Send a notification for the growl
136
+ const notification = await dispatch('notifications/fromGrowl', {
137
+ title,
138
+ message: stringify(err),
139
+ level: NotificationLevel.Error
140
+ }, { root: true });
141
+
90
142
  commit('add', {
91
143
  color: 'error',
92
144
  icon: 'error',
93
- timeout: 0, // Errors don't timeout
145
+ timeout: DEFAULT_TIMEOUT, // Errors timeout since they will be available as a notification
146
+ notification,
94
147
  title,
95
148
  message: stringify(err),
96
149
  });
150
+ },
151
+
152
+ /**
153
+ * Used to create a growl when a notification is sent
154
+ *
155
+ * Growls are only shown for Success, Warning and Error notifications
156
+ */
157
+ notification({ commit }, notification) {
158
+ const growl = {
159
+ title: notification.title,
160
+ message: notification.message,
161
+ notification: notification.id,
162
+ timeout: DEFAULT_TIMEOUT,
163
+ };
164
+
165
+ switch (notification.level) {
166
+ case NotificationLevel.Success:
167
+ growl.color = 'success';
168
+ growl.icon = 'checkmark';
169
+ break;
170
+ case NotificationLevel.Warning:
171
+ growl.color = 'warning';
172
+ growl.icon = 'warning';
173
+ break;
174
+ case NotificationLevel.Error:
175
+ growl.color = 'error';
176
+ growl.icon = 'error';
177
+ break;
178
+ default:
179
+ growl.skip = true;
180
+ }
181
+
182
+ // We don't show growls for info, announcement, task
183
+ if (!growl.skip) {
184
+ commit('add', growl);
185
+ }
97
186
  }
98
187
  };
package/store/index.js CHANGED
@@ -39,6 +39,7 @@ import { STORE, BLANK_CLUSTER } from '@shell/store/store-types';
39
39
  import { isDevBuild } from '@shell/utils/version';
40
40
  import { markRaw } from 'vue';
41
41
  import paginationUtils from '@shell/utils/pagination-utils';
42
+ import { addReleaseNotesNotification } from '@shell/utils/release-notes';
42
43
 
43
44
  // Disables strict mode for all store instances to prevent warning about changing state outside of mutations
44
45
  // because it's more efficient to do that sometimes.
@@ -896,6 +897,11 @@ export const actions = {
896
897
  setBrand(brand);
897
898
  }
898
899
 
900
+ // Add the notification for the release notes
901
+ if (isRancher) {
902
+ await addReleaseNotesNotification(dispatch, getters);
903
+ }
904
+
899
905
  if (systemNamespaces) {
900
906
  const namespace = (systemNamespaces.value || systemNamespaces.default)?.split(',');
901
907