@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
@@ -23,7 +23,7 @@ class PaginationUtils {
23
23
  /**
24
24
  * In places where we're using paginated features but not in a page... this is what the max results should be
25
25
  */
26
- readonly defaultPageSize = 10000;
26
+ readonly defaultPageSize = 100000;
27
27
  /**
28
28
  * When a ns filter isn't one or more projects/namespaces... what are the valid values?
29
29
  *
@@ -0,0 +1,48 @@
1
+ import { getVersionData } from '@shell/config/version';
2
+ import { READ_WHATS_NEW } from '@shell/store/prefs';
3
+ import { NotificationLevel } from '@shell/types/notifications';
4
+
5
+ export async function addReleaseNotesNotification(dispatch: any, getters: any) {
6
+ const rancherVersion = getVersionData().Version.split('-')[0];
7
+ const prefix = 'release-notes-';
8
+ const id = `${ prefix }${ rancherVersion }`;
9
+ let found = false;
10
+ const all = getters['notifications/all'];
11
+ const lastReadVersion = getters['prefs/get'](READ_WHATS_NEW) || '';
12
+ const t = getters['i18n/t'];
13
+ const releaseNotesUrl = getters['releaseNotesUrl'];
14
+
15
+ // Delete notification(s) for old release notes
16
+ for (let i = 0; i < all.length; i++) {
17
+ const notification = all[i];
18
+
19
+ if (notification.id.startsWith(prefix)) {
20
+ if (notification.id === id) {
21
+ found = true;
22
+ } else {
23
+ await dispatch('notifications/delete', notification.id);
24
+ }
25
+ }
26
+ }
27
+
28
+ // Also use pref, so if we expired it, we don't add it back
29
+ if (!found && lastReadVersion !== rancherVersion) {
30
+ // Register notification
31
+ const notification = {
32
+ id,
33
+ level: NotificationLevel.Info,
34
+ title: t('landing.whatsNew.title', { version: rancherVersion }),
35
+ message: t('landing.whatsNew.message'),
36
+ preference: {
37
+ key: READ_WHATS_NEW,
38
+ value: rancherVersion
39
+ },
40
+ primaryAction: {
41
+ label: t('landing.whatsNew.link'),
42
+ target: releaseNotesUrl
43
+ }
44
+ };
45
+
46
+ await dispatch('notifications/add', notification);
47
+ }
48
+ }
@@ -34,7 +34,7 @@ export async function matching({
34
34
  $store,
35
35
  inScopeCount = undefined,
36
36
  namespace = undefined,
37
- transient = false,
37
+ transient = true,
38
38
  }: {
39
39
  /**
40
40
  * Standard kube label selector object.
@@ -101,7 +101,12 @@ export async function matching({
101
101
  const filterByNamespaceButNoNamespace = isNamespaced && !!namespace && (!safeNamespaces || safeNamespaces.length === 0);
102
102
  const explicityNullLabelSelector = labelSelector === null || (labelSelector?.matchLabels === null && !labelSelector.matchExpressions === null);
103
103
 
104
- if (noCandidates || filterByNamespaceButNoNamespace || explicityNullLabelSelector) {
104
+ // If we have matchLabels or matchExpression entries they must have a key
105
+ const matchLabelKeys = Object.keys(labelSelector.matchLabels || {});
106
+ const invalidMatchLabelKeys = matchLabelKeys.length && matchLabelKeys.filter((k) => !k).length;
107
+ const invalidMatchExpressionKeys = labelSelector?.matchExpressions?.length && labelSelector.matchExpressions.filter((me) => !me.key).length;
108
+
109
+ if (noCandidates || filterByNamespaceButNoNamespace || explicityNullLabelSelector || invalidMatchLabelKeys || invalidMatchExpressionKeys) {
105
110
  return generateMatchingResponse([], inScopeCount || 0);
106
111
  }
107
112
 
package/utils/string.js CHANGED
@@ -358,3 +358,27 @@ export function isBase64(value) {
358
358
  export function generateRandomAlphaString(length) {
359
359
  return Array.from({ length }, () => String.fromCharCode(97 + Math.random() * 26 | 0)).join('');
360
360
  }
361
+
362
+ /**
363
+ * Generate a key-value nested object from a list of paths that represents a directory tree.
364
+ *
365
+ * Each key is a subpath
366
+ * Each value contains the children of the subpath
367
+ */
368
+ export function pathArrayToTree(paths) {
369
+ const result = [];
370
+ const level = { result };
371
+
372
+ paths.forEach((path) => {
373
+ path?.split('/').reduce((r, name) => {
374
+ if (!r[name]) {
375
+ r[name] = { result: [] };
376
+ r.result.push({ name, children: r[name].result });
377
+ }
378
+
379
+ return r[name];
380
+ }, level);
381
+ });
382
+
383
+ return result;
384
+ }
@@ -1,4 +1,7 @@
1
1
  import day from 'dayjs';
2
+ import { escapeHtml } from '@shell/utils/string';
3
+ import { DATE_FORMAT, TIME_FORMAT } from '@shell/store/prefs';
4
+ import { type Store } from 'vuex';
2
5
 
3
6
  const FACTORS = [60, 60, 24];
4
7
  const LABELS = ['sec', 'min', 'hour', 'day'];
@@ -6,7 +9,7 @@ const LABELS = ['sec', 'min', 'hour', 'day'];
6
9
  // Diff two dates and return an object with values for presentation
7
10
  // If 't' is also passed, 'string' property is set on the return object with the diff formatted as a string
8
11
  // e.g. formats a date difference to return '1 day', '20 hours' etc
9
- export function diffFrom(value, from, t) {
12
+ export function diffFrom(value: any, from: any, t: any) {
10
13
  const now = day();
11
14
 
12
15
  from = from || now;
@@ -15,7 +18,7 @@ export function diffFrom(value, from, t) {
15
18
  let absDiff = Math.abs(diff);
16
19
 
17
20
  let next = 1;
18
- let label = '?';
21
+ let label: any = '?';
19
22
 
20
23
  let i = 0;
21
24
 
@@ -30,7 +33,7 @@ export function diffFrom(value, from, t) {
30
33
  } else {
31
34
  label = Math.floor(absDiff);
32
35
  }
33
- const ret = {
36
+ const ret: any = {
34
37
  diff,
35
38
  absDiff,
36
39
  label,
@@ -47,7 +50,7 @@ export function diffFrom(value, from, t) {
47
50
  return ret;
48
51
  }
49
52
 
50
- export function safeSetTimeout(timeout, callback, that) {
53
+ export function safeSetTimeout(timeout: any, callback: any, that: any) {
51
54
  if (timeout <= 2147483647) {
52
55
  // Max value setTimeout can take is max 32 bit int (about 24.9 days)
53
56
  return setTimeout(() => {
@@ -56,7 +59,7 @@ export function safeSetTimeout(timeout, callback, that) {
56
59
  }
57
60
  }
58
61
 
59
- export function getSecondsDiff(startDate, endDate) {
62
+ export function getSecondsDiff(startDate: any, endDate: any) {
60
63
  return Math.round(
61
64
  Math.abs(Date.parse(endDate) - Date.parse(startDate)) / 1000
62
65
  );
@@ -68,7 +71,7 @@ export function getSecondsDiff(startDate, endDate) {
68
71
  * diff: update frequency in seconds
69
72
  * label: content of the cell's column
70
73
  */
71
- export function elapsedTime(seconds) {
74
+ export function elapsedTime(seconds: any) {
72
75
  if (!seconds) {
73
76
  return {};
74
77
  }
@@ -119,3 +122,19 @@ export function elapsedTime(seconds) {
119
122
  label: `${ hours }h${ minutes - (hours * 60) }m`,
120
123
  };
121
124
  }
125
+
126
+ /**
127
+ * Format date and time using user preferences
128
+ * @param value Date string to format
129
+ * @returns Formatted date string
130
+ */
131
+ export const dateTimeFormat = (value: string | undefined, store: Store<any>): string => {
132
+ if (!value) return '';
133
+
134
+ const dateFormat = escapeHtml( store.getters['prefs/get'](DATE_FORMAT));
135
+ const timeFormat = escapeHtml( store.getters['prefs/get'](TIME_FORMAT));
136
+
137
+ const format = `${ dateFormat } ${ timeFormat }`;
138
+
139
+ return day(value).format(format);
140
+ };
@@ -321,3 +321,25 @@ export async function getHelmChart(store: any, repository: any, chartName: strin
321
321
  await new Promise((resolve) => setTimeout(resolve, RETRY_WAIT));
322
322
  }
323
323
  }
324
+
325
+ export async function onExtensionsReady(store: any) {
326
+ const alreadyReady = store.getters['uiplugins/ready'];
327
+
328
+ if (alreadyReady) {
329
+ return;
330
+ }
331
+
332
+ const extensions = store.getters['uiplugins/plugins'] || [];
333
+
334
+ for (let i = 0; i < extensions.length; i++) {
335
+ const ext = extensions[i];
336
+
337
+ try {
338
+ await ext.onLogIn(store);
339
+ } catch (e) {
340
+ console.error(`Exception caught in onReady for extension ${ ext.name }`, e); // eslint-disable-line no-console
341
+ }
342
+ }
343
+
344
+ await store.dispatch('uiplugins/setReady', true);
345
+ }
@@ -170,6 +170,8 @@ export default function(
170
170
 
171
171
  const url: Validator = (val: string) => val && !isUrl(val) ? t('validation.setting.serverUrl.url') : undefined;
172
172
 
173
+ const genericUrl: Validator = (val: string) => val && !isUrl(val) ? t('validation.genericUrl') : undefined;
174
+
173
175
  const urlRepository: Validator = (url: string) => {
174
176
  const regexPart1 = /^((http|git|ssh|http(s)|file|\/?)|(git@[\w\.]+))(:(\/\/)?)/gm;
175
177
  const regexPart2 = /^([\w\.@\:\/\-]+)([\d\/\w.-]+?)(.git){0,1}(\/)?$/gm;
@@ -542,6 +544,7 @@ export default function(
542
544
  localhost,
543
545
  trailingForwardSlash,
544
546
  url,
547
+ genericUrl,
545
548
  matching,
546
549
  maxLength,
547
550
  maxValue,
@@ -1,31 +0,0 @@
1
- import { TitleBarProps } from '@shell/components/Resource/Detail/TitleBar/index.vue';
2
- import { computed, Ref, toValue } from 'vue';
3
- import { useRoute } from 'vue-router';
4
- import { useStore } from 'vuex';
5
-
6
- export const useDefaultTitleBarData = (resource: any): Ref<TitleBarProps> => {
7
- const route = useRoute();
8
- const store = useStore();
9
-
10
- const resourceValue = toValue(resource);
11
-
12
- return computed(() => ({
13
- resourceTypeLabel: store.getters['type-map/labelFor']({ id: resourceValue.type }),
14
- resourceTo: {
15
- name: 'c-cluster-product-resource',
16
- params: {
17
- product: 'explorer',
18
- cluster: route.params.cluster,
19
- namespace: resourceValue.namespace,
20
- resource: resourceValue.type
21
- }
22
- },
23
- resourceName: resourceValue.nameDisplay,
24
- actionMenuResource: resourceValue,
25
- badge: {
26
- color: resourceValue.stateBackground,
27
- label: resourceValue.stateDisplay
28
- },
29
- onShowConfiguration: () => resourceValue.goToEdit()
30
- }));
31
- };
@@ -1,62 +0,0 @@
1
- import { LEGACY } from '@shell/store/features';
2
- import { DSL, IF_HAVE } from '@shell/store/type-map';
3
-
4
- export const NAME = 'legacy';
5
-
6
- export function init(store) {
7
- const {
8
- product,
9
- basicType,
10
- virtualType,
11
- setGroupDefaultType,
12
- } = DSL(store, NAME);
13
-
14
- product({
15
- weight: 80,
16
- ifFeature: LEGACY,
17
- showNamespaceFilter: true,
18
- });
19
-
20
- virtualType({
21
- ifHave: IF_HAVE.NO_PROJECT,
22
- labelKey: 'legacy.project.label',
23
- namespaced: true,
24
- name: 'v1-project-overview',
25
- weight: 105,
26
- route: { name: 'c-cluster-legacy-project' },
27
- exact: true,
28
- overview: false,
29
- });
30
-
31
- basicType(['v1-project-overview']);
32
-
33
- // Project Pages
34
-
35
- virtualType({
36
- ifHave: IF_HAVE.PROJECT,
37
- labelKey: 'legacy.secrets',
38
- namespaced: true,
39
- name: 'project-secrets',
40
- weight: 104,
41
- route: { name: 'c-cluster-legacy-project-page', params: { page: 'secrets' } },
42
- exact: true,
43
- overview: false,
44
- });
45
-
46
- virtualType({
47
- ifHave: IF_HAVE.PROJECT,
48
- labelKey: 'legacy.configMaps',
49
- namespaced: true,
50
- name: 'project-config-maps',
51
- weight: 104,
52
- route: { name: 'c-cluster-legacy-project-page', params: { page: 'config-maps' } },
53
- exact: true,
54
- overview: false,
55
- });
56
-
57
- basicType([
58
- 'project-config-maps',
59
- 'project-secrets',
60
- ], 'Project');
61
- setGroupDefaultType('project-config-maps', 'Project');
62
- }
@@ -1,29 +0,0 @@
1
- <script>
2
- import EmberPage from '@shell/components/EmberPage';
3
-
4
- const PAGES = {
5
- monitoring: 'monitoring/cluster-setting',
6
- cis: 'cis/scan',
7
- istio: 'istio/cluster-setting',
8
- snapshots: 'backups',
9
- };
10
-
11
- export default {
12
- components: { EmberPage },
13
-
14
- data() {
15
- const cluster = this.$store.getters['currentCluster'];
16
- const page = this.$route.params.page;
17
- const p = PAGES[page] || page;
18
-
19
- return { src: `/k/${ cluster.id }/${ p }` };
20
- }
21
- };
22
- </script>
23
-
24
- <template>
25
- <EmberPage
26
- v-if="src"
27
- :src="src"
28
- />
29
- </template>
@@ -1,57 +0,0 @@
1
- <script>
2
- import EmberPage from '@shell/components/EmberPage';
3
- import { project } from '@shell/store/type-map';
4
-
5
- const PAGES = {
6
- istio: 'istio/project-istio/metrics',
7
- monitoring: 'monitoring/project-setting',
8
- pipelineConfig: 'pipeline',
9
- pipelines: 'pipeline/pipelines'
10
- };
11
-
12
- export default {
13
- components: { EmberPage },
14
-
15
- data() {
16
- const page = this.$route.params.page;
17
- const p = PAGES[page] || page;
18
-
19
- return { page: p };
20
- },
21
-
22
- computed: {
23
- project() {
24
- return project(this.$store.getters);
25
- },
26
-
27
- src() {
28
- const prj = project(this.$store.getters);
29
-
30
- if (!!prj) {
31
- const id = prj.id.replace('/', ':');
32
-
33
- return `/p/${ id }/${ this.page }`;
34
- }
35
-
36
- return null;
37
- }
38
- },
39
-
40
- watch: {
41
- // User changed project while on this page
42
- project(a, b) {
43
- // Changed to no project, so redirect
44
- if (!a && b) {
45
- this.$router.replace({ name: 'c-cluster-legacy-project' } );
46
- }
47
- }
48
- }
49
- };
50
- </script>
51
-
52
- <template>
53
- <EmberPage
54
- v-if="src"
55
- :src="src"
56
- />
57
- </template>
@@ -1,32 +0,0 @@
1
- <script>
2
- import IconMessage from '@shell/components/IconMessage';
3
- import { project } from '@shell/store/type-map';
4
-
5
- export default {
6
- components: { IconMessage },
7
-
8
- computed: {
9
- project() {
10
- const prj = project(this.$store.getters);
11
-
12
- return prj;
13
- }
14
- },
15
-
16
- watch: {
17
- project(nue, old) {
18
- if (nue && !old) {
19
- // User selected a project while on this page, so redirect to the projects view now that we have a project
20
- this.$router.replace({ name: 'c-cluster-legacy-project-page', params: { page: 'config-maps' } });
21
- }
22
- }
23
- }
24
- };
25
- </script>
26
-
27
- <template>
28
- <IconMessage
29
- icon="icon-monitoring"
30
- message-key="legacy.project.select"
31
- />
32
- </template>
@@ -1,96 +0,0 @@
1
- <script>
2
- import EmberPage from '@shell/components/EmberPage';
3
- import Tabbed from '@shell/components/Tabbed';
4
- import Tab from '@shell/components/Tabbed/Tab';
5
- import { project } from '@shell/store/type-map';
6
-
7
- const PAGES = {
8
- pipelines: 'pipeline/pipelines',
9
- configuration: 'pipeline',
10
- };
11
-
12
- export default {
13
- components: {
14
- EmberPage,
15
- Tabbed,
16
- Tab
17
- },
18
-
19
- data() {
20
- return { activeTab: null };
21
- },
22
-
23
- computed: {
24
- pipelinesPage() {
25
- const prj = project(this.$store.getters);
26
-
27
- if (!!prj && this.activeTab) {
28
- const id = prj.id.replace('/', ':');
29
- const suffix = PAGES[this.activeTab];
30
-
31
- return `/p/${ id }/${ suffix }`;
32
- }
33
-
34
- return '';
35
- }
36
- },
37
-
38
- methods: {
39
- tabChanged(tab) {
40
- this.activeTab = tab.tab.name;
41
- },
42
-
43
- intercept(target) {
44
- if (target === 'authenticated.project.pipeline.settings') {
45
- // User went to the config page from the pipelines page, so change the active tab
46
- this.$refs.tabs.select('configuration');
47
- }
48
- }
49
- }
50
-
51
- };
52
- </script>
53
-
54
- <template>
55
- <div class="pipelines">
56
- <Tabbed
57
- ref="tabs"
58
- :use-hash="false"
59
- :no-content="true"
60
- @changed="tabChanged"
61
- >
62
- <Tab
63
- name="pipelines"
64
- label-key="legacy.pipelines"
65
- :weight="3"
66
- />
67
- <Tab
68
- name="configuration"
69
- label-key="legacy.configuration"
70
- :weight="2"
71
- />
72
- </Tabbed>
73
- <div
74
- id="legacy-pipelines"
75
- class="embed-pipelines"
76
- >
77
- <EmberPage
78
- v-if="pipelinesPage"
79
- inline="legacy-pipelines"
80
- :src="pipelinesPage"
81
- :force-inline-reuse="true"
82
- @before-nav="intercept"
83
- />
84
- </div>
85
- </div>
86
- </template>
87
-
88
- <style scoped lang='scss'>
89
- .pipelines {
90
- display: flex;
91
-
92
- .embed-pipelines {
93
- flex: 1;
94
- }
95
- }
96
- </style>