@rancher/shell 0.1.3 → 0.1.4

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 (131) hide show
  1. package/assets/brand/suse/dark/rancher-logo.svg +1 -148
  2. package/assets/brand/suse/rancher-logo.svg +1 -130
  3. package/assets/images/featured/img1.jpg +0 -0
  4. package/assets/images/featured.jpg +0 -0
  5. package/assets/images/generic-plugin.svg +7 -0
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/translations/en-us.yaml +183 -45
  10. package/assets/translations/zh-hans.yaml +21 -24
  11. package/components/AsyncButton.vue +17 -2
  12. package/components/ButtonDropdown.vue +4 -0
  13. package/components/Carousel.vue +291 -0
  14. package/components/CommunityLinks.vue +69 -18
  15. package/components/CruResource.vue +11 -3
  16. package/components/Dialog.vue +102 -0
  17. package/components/ExplorerMembers.vue +2 -4
  18. package/components/ExplorerProjectsNamespaces.vue +6 -7
  19. package/components/IconMessage.vue +9 -1
  20. package/components/LocaleSelector.vue +62 -29
  21. package/components/ResourceTable.vue +7 -2
  22. package/components/SimpleBox.vue +6 -4
  23. package/components/SortableTable/index.vue +11 -21
  24. package/components/Tabbed/Tab.vue +5 -0
  25. package/components/Tabbed/index.vue +29 -2
  26. package/components/auth/Principal.vue +1 -0
  27. package/components/fleet/FleetBundles.vue +8 -3
  28. package/components/fleet/FleetSummary.vue +6 -0
  29. package/components/form/KeyValue.vue +80 -58
  30. package/components/form/NameNsDescription.vue +10 -4
  31. package/components/form/ResourceTabs/index.vue +5 -1
  32. package/components/formatter/ClusterLink.vue +3 -7
  33. package/components/nav/NamespaceFilter.vue +3 -3
  34. package/components/nav/TopLevelMenu.vue +10 -28
  35. package/config/footer.js +13 -14
  36. package/config/labels-annotations.js +2 -1
  37. package/config/product/explorer.js +5 -4
  38. package/config/product/legacy.js +0 -47
  39. package/config/product/multi-cluster-apps.js +0 -12
  40. package/config/product/settings.js +12 -1
  41. package/config/product/uiplugins.js +17 -0
  42. package/config/settings.js +21 -2
  43. package/config/types.js +5 -1
  44. package/config/uiplugins.js +60 -0
  45. package/content/docs/en-us/getting-started.md +1 -26
  46. package/core/plugins.js +12 -0
  47. package/detail/provisioning.cattle.io.cluster.vue +3 -3
  48. package/detail/workload/index.vue +2 -2
  49. package/dialog/DiagnosticTimingsDialog.vue +116 -0
  50. package/dialog/RotateCertificatesDialog.vue +9 -3
  51. package/edit/auth/azuread.vue +28 -9
  52. package/edit/networking.k8s.io.ingress/index.vue +2 -2
  53. package/edit/persistentvolume/index.vue +3 -0
  54. package/edit/pod.vue +27 -0
  55. package/edit/provisioning.cattle.io.cluster/rke2.vue +76 -5
  56. package/edit/service.vue +7 -5
  57. package/edit/workload/__tests__/Upgrading.test.ts +1 -0
  58. package/edit/workload/index.vue +13 -1
  59. package/edit/workload/mixins/workload.js +13 -13
  60. package/edit/workload/storage/ContainerMountPaths.vue +240 -0
  61. package/edit/workload/storage/Mount.vue +1 -0
  62. package/edit/workload/storage/awsElasticBlockStore.vue +20 -1
  63. package/edit/workload/storage/azureDisk.vue +22 -2
  64. package/edit/workload/storage/azureFile.vue +20 -2
  65. package/edit/workload/storage/csi/index.vue +23 -1
  66. package/edit/workload/storage/gcePersistentDisk.vue +20 -2
  67. package/edit/workload/storage/index.vue +23 -49
  68. package/edit/workload/storage/vsphereVolume.vue +11 -1
  69. package/layouts/default.vue +14 -8
  70. package/layouts/home.vue +9 -4
  71. package/layouts/plain.vue +10 -5
  72. package/list/management.cattle.io.setting.vue +3 -3
  73. package/list/provisioning.cattle.io.cluster.vue +1 -1
  74. package/machine-config/harvester.vue +5 -3
  75. package/models/catalog.cattle.io.uiplugin.js +34 -0
  76. package/models/cluster/node.js +25 -2
  77. package/models/fleet.cattle.io.bundle.js +1 -1
  78. package/models/harvesterhci.io.management.cluster.js +11 -5
  79. package/models/provisioning.cattle.io.cluster.js +12 -6
  80. package/models/workload.js +5 -3
  81. package/nuxt.config.js +69 -25
  82. package/package.json +108 -109
  83. package/pages/auth/login.vue +1 -1
  84. package/pages/c/_cluster/apps/charts/index.vue +46 -1
  85. package/pages/c/_cluster/apps/charts/install.vue +10 -9
  86. package/pages/c/_cluster/explorer/index.vue +72 -9
  87. package/pages/c/_cluster/explorer/tools/index.vue +12 -5
  88. package/pages/c/_cluster/mcapps/index.vue +1 -1
  89. package/pages/c/_cluster/settings/brand.vue +0 -40
  90. package/pages/c/_cluster/settings/links.vue +200 -0
  91. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +232 -0
  92. package/pages/c/_cluster/uiplugins/InstallDialog.vue +242 -0
  93. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +284 -0
  94. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +130 -0
  95. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +253 -0
  96. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +115 -0
  97. package/pages/c/_cluster/uiplugins/index.vue +694 -0
  98. package/pages/diagnostic.vue +185 -101
  99. package/pages/docs/_doc.vue +3 -1
  100. package/pages/home.vue +21 -56
  101. package/pages/prefs.vue +108 -88
  102. package/pages/safeMode.vue +17 -0
  103. package/pages/support/index.vue +23 -15
  104. package/pkg/dynamic-importer.lib.js +4 -0
  105. package/plugins/dashboard-store/resource-class.js +2 -2
  106. package/plugins/formatters.js +15 -0
  107. package/plugins/plugin.js +56 -4
  108. package/plugins/steve/mutations.js +1 -1
  109. package/plugins/steve/subscribe.js +94 -72
  110. package/plugins/steve/web-worker.steve-sub-worker.js +24 -15
  111. package/promptRemove/management.cattle.io.globalrole.vue +47 -0
  112. package/promptRemove/management.cattle.io.roletemplate.vue +47 -0
  113. package/promptRemove/mixin/roleDeletionCheck.js +97 -0
  114. package/scripts/publish-shell.sh +1 -1
  115. package/scripts/sync-shell-deps +37 -0
  116. package/store/catalog.js +9 -8
  117. package/store/i18n.js +10 -1
  118. package/store/prefs.js +16 -0
  119. package/store/type-map.js +32 -5
  120. package/store/uiplugins.ts +15 -61
  121. package/utils/__tests__/object.test.ts +0 -24
  122. package/utils/__tests__/selector.test.ts +1 -1
  123. package/utils/dynamic-importer.js +4 -0
  124. package/utils/grafana.js +2 -6
  125. package/utils/socket.js +41 -20
  126. package/utils/string.js +1 -7
  127. package/utils/validators/formRules/__tests__/index.test.ts +108 -0
  128. package/utils/validators/formRules/index.ts +9 -1
  129. package/yarn-error.log +195 -0
  130. package/pages/plugins.vue +0 -387
  131. package/server/verdaccio-middleware.js +0 -56
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -32,125 +32,124 @@
32
32
  "e2e:dev": "start-server-and-test dev https://localhost:8005 cy:open"
33
33
  },
34
34
  "dependencies": {
35
- "@aws-sdk/client-ec2": "^3.1.0",
36
- "@aws-sdk/client-eks": "^3.1.0",
37
- "@aws-sdk/client-kms": "^3.8.1",
38
- "@babel/plugin-proposal-optional-chaining": "^7.14.5",
39
- "@babel/plugin-proposal-private-property-in-object": "^7.14.5",
40
- "@babel/preset-typescript": "^7.15.0",
41
- "@innologica/vue-dropdown-menu": "^0.1.3",
42
- "@novnc/novnc": "^1.2.0",
35
+ "@aws-sdk/client-ec2": "3.1.0",
36
+ "@aws-sdk/client-eks": "3.1.0",
37
+ "@aws-sdk/client-kms": "3.8.1",
38
+ "@babel/plugin-proposal-optional-chaining": "7.14.5",
39
+ "@babel/plugin-proposal-private-property-in-object": "7.14.5",
40
+ "@babel/preset-typescript": "7.16.7",
41
+ "@innologica/vue-dropdown-menu": "0.1.3",
42
+ "@novnc/novnc": "1.2.0",
43
43
  "@nuxt/types": "2.14.6",
44
- "@nuxt/typescript-build": "^2.1.0",
45
- "@nuxtjs/axios": "^5.3.6",
46
- "@nuxtjs/eslint-config-typescript": "^6.0.1",
47
- "@nuxtjs/eslint-module": "^1.1.0",
48
- "@nuxtjs/proxy": "^1.3.3",
49
- "@nuxtjs/style-resources": "^1.2.1",
50
- "@nuxtjs/webpack-profile": "^0.1.0",
51
- "@popperjs/core": "^2.4.0",
52
- "@types/node": "^16.4.3",
53
- "@typescript-eslint/eslint-plugin": "^4.18.0",
54
- "@typescript-eslint/parser": "^4.18.0",
55
- "@vue/cli-plugin-babel": "^4.5.15",
56
- "@vue/cli-plugin-typescript": "^4.5.15",
57
- "@vue/cli-service": "^4.5.13",
44
+ "@nuxt/typescript-build": "2.1.0",
45
+ "@nuxtjs/axios": "5.12.0",
46
+ "@nuxtjs/eslint-config-typescript": "6.0.1",
47
+ "@nuxtjs/eslint-module": "1.2.0",
48
+ "@nuxtjs/proxy": "1.3.3",
49
+ "@nuxtjs/style-resources": "1.2.1",
50
+ "@nuxtjs/webpack-profile": "0.1.0",
51
+ "@popperjs/core": "2.4.4",
52
+ "@types/node": "16.4.3",
53
+ "@typescript-eslint/eslint-plugin": "4.33.0",
54
+ "@typescript-eslint/parser": "4.33.0",
55
+ "@vue/cli-plugin-babel": "4.5.15",
56
+ "@vue/cli-plugin-typescript": "4.5.15",
57
+ "@vue/cli-service": "4.5.15",
58
58
  "@vue/test-utils": "1.2.1",
59
- "@vue/vue2-jest": "^27.0.0",
60
- "add": "^2.0.6",
61
- "ansi_up": "^5.0.0",
62
- "babel-eslint": "^10.0.1",
63
- "babel-plugin-module-resolver": "^4.0.0",
64
- "babel-preset-vue": "^2.0.2",
65
- "browser-env": "^3.2.6",
66
- "comlink": "^4.3.1",
67
- "cookie": "^0.4.0",
68
- "cookie-universal-nuxt": "^2.0.17",
69
- "core-js": "^3.20.3",
70
- "cron-validator": "^1.2.0",
71
- "cronstrue": "^1.92.0",
72
- "cross-env": "^6.0.3",
59
+ "@vue/vue2-jest": "27.0.0",
60
+ "add": "2.0.6",
61
+ "ansi_up": "5.0.0",
62
+ "babel-eslint": "10.1.0",
63
+ "babel-plugin-module-resolver": "4.0.0",
64
+ "babel-preset-vue": "2.0.2",
65
+ "browser-env": "3.3.0",
66
+ "cookie": "0.5.0",
67
+ "cookie-universal-nuxt": "2.1.4",
68
+ "core-js": "3.21.1",
69
+ "cron-validator": "1.2.0",
70
+ "cronstrue": "1.95.0",
71
+ "cross-env": "6.0.3",
73
72
  "css-loader": "4.3.0",
74
- "csv-loader": "^3.0.3",
75
- "cypress": "8.4.1",
76
- "d3": "^5.12.0",
77
- "d3-selection": "^1.3.0",
78
- "dagre-d3": "^0.6.3",
79
- "dayjs": "^1.8.16",
80
- "diff2html": "^2.11.2",
81
- "dompurify": "^2.0.12",
73
+ "csv-loader": "3.0.3",
74
+ "cypress": "10.3.1",
75
+ "d3": "7.3.0",
76
+ "d3-selection": "1.4.1",
77
+ "dagre-d3": "0.6.4",
78
+ "dayjs": "1.8.29",
79
+ "diff2html": "2.11.2",
80
+ "dompurify": "2.0.12",
82
81
  "eslint": "7.32.0",
83
- "eslint-config-standard": ">=12.0.0",
82
+ "eslint-config-standard": "16.0.3",
84
83
  "eslint-import-resolver-node": "0.3.4",
85
84
  "eslint-module-utils": "2.6.1",
86
- "eslint-plugin-cypress": "^2.11.3",
85
+ "eslint-plugin-cypress": "2.12.1",
87
86
  "eslint-plugin-import": "2.23.4",
88
- "eslint-plugin-jest": "^23.6.0",
89
- "eslint-plugin-n": "^15.2.0",
87
+ "eslint-plugin-jest": "24.4.0",
88
+ "eslint-plugin-n": "15.2.0",
90
89
  "eslint-plugin-vue": "7.14.0",
91
- "event-target-shim": "^5.0.1",
92
- "express": "^4.17.1",
93
- "file-saver": "^2.0.2",
94
- "frontmatter-markdown-loader": "^3.6.3",
95
- "identicon.js": "^2.3.3",
96
- "intl-messageformat": "^7.7.2",
97
- "is-url": "^1.2.4",
98
- "jest": "^27.5.1",
99
- "jest-serializer-vue": "^2.0.2",
100
- "jexl": "^2.2.2",
101
- "jquery": "^3.5.0",
102
- "js-cookie": "^2.2.0",
103
- "js-yaml": "^4.1.0",
104
- "js-yaml-loader": "^1.2.2",
105
- "jsdiff": "^1.1.1",
106
- "jsdom-global": "^3.0.2",
107
- "jsonpath-plus": "^6.0.1",
108
- "jsrsasign": "^10.2.0",
109
- "jszip": "^3.7.0",
110
- "lodash": "^4.17.21",
111
- "marked": "^2.0.0",
112
- "nodemon": "^2.0.2",
90
+ "event-target-shim": "5.0.1",
91
+ "express": "4.17.1",
92
+ "file-saver": "2.0.2",
93
+ "frontmatter-markdown-loader": "3.7.0",
94
+ "identicon.js": "2.3.3",
95
+ "intl-messageformat": "7.8.4",
96
+ "is-url": "1.2.4",
97
+ "jest": "27.5.1",
98
+ "jest-serializer-vue": "2.0.2",
99
+ "jexl": "2.2.2",
100
+ "jquery": "3.5.1",
101
+ "js-cookie": "2.2.1",
102
+ "js-yaml": "4.1.0",
103
+ "js-yaml-loader": "1.2.2",
104
+ "jsdiff": "1.1.1",
105
+ "jsdom-global": "3.0.2",
106
+ "jsonpath-plus": "6.0.1",
107
+ "jsrsasign": "10.2.0",
108
+ "jszip": "3.7.0",
109
+ "lodash": "4.17.21",
110
+ "marked": "4.0.17",
111
+ "nodemon": "2.0.4",
113
112
  "nuxt": "2.15.8",
114
- "nyc": "^15.0.0",
115
- "papaparse": "^5.3.0",
116
- "portal-vue": "^2.1.5",
117
- "rancher-icons": "rancher/icons#v2.0.0",
118
- "require-extension-hooks": "^0.3.3",
119
- "require-extension-hooks-babel": "^1.0.0-beta.1",
120
- "require-extension-hooks-vue": "^3.0.0",
121
- "sass": "^1.38.2",
122
- "sass-loader": "10",
123
- "serve-static": "^1.14.1",
124
- "set-cookie-parser": "^2.4.0",
125
- "shell-quote": "^1.7.2",
126
- "sinon": "^8.0.4",
127
- "start-server-and-test": "^1.13.1",
128
- "style-loader": "^1.1.2",
129
- "ts-node": "^8.3.0",
130
- "typescript": "~4.1.5",
131
- "url-parse": "^1.5.0",
132
- "v-tooltip": "^2.0.2",
113
+ "nyc": "15.1.0",
114
+ "papaparse": "5.3.0",
115
+ "portal-vue": "2.1.7",
116
+ "rancher-icons": "rancher/icons#v2.0.3",
117
+ "require-extension-hooks": "0.3.3",
118
+ "require-extension-hooks-babel": "1.0.0",
119
+ "require-extension-hooks-vue": "3.0.0",
120
+ "sass": "1.51.0",
121
+ "sass-loader": "10.2.1",
122
+ "serve-static": "1.14.1",
123
+ "set-cookie-parser": "2.4.6",
124
+ "shell-quote": "1.7.3",
125
+ "sinon": "8.1.1",
126
+ "start-server-and-test": "1.13.1",
127
+ "style-loader": "1.2.1",
128
+ "ts-node": "8.10.2",
129
+ "typescript": "4.1.6",
130
+ "url-parse": "1.5.10",
131
+ "v-tooltip": "2.0.3",
133
132
  "vue": "2.6.14",
134
- "vue-clipboard2": "^0.3.1",
135
- "vue-codemirror": "^4.0.6",
136
- "vue-js-modal": "^1.3.31",
137
- "vue-resize": "^0.4.5",
138
- "vue-select": "^3.13.0",
133
+ "vue-clipboard2": "0.3.1",
134
+ "vue-codemirror": "4.0.6",
135
+ "vue-js-modal": "1.3.35",
136
+ "vue-resize": "0.4.5",
137
+ "vue-select": "3.18.3",
139
138
  "vue-server-renderer": "2.6.14",
140
- "vue-shortkey": "^3.1.7",
139
+ "vue-shortkey": "3.1.7",
141
140
  "vue-template-compiler": "2.6.14",
142
- "vue2-transitions": "^0.3.0",
143
- "vuedraggable": "^2.24.3",
144
- "vuex": "^3.6.2",
145
- "webpack-bundle-analyzer": "^4.5.0",
146
- "webpack-virtual-modules": "^0.4.3",
147
- "xterm": "^4.9.0",
148
- "xterm-addon-fit": "^0.4.0",
149
- "xterm-addon-search": "^0.7.0",
150
- "xterm-addon-web-links": "^0.4.0",
151
- "xterm-addon-webgl": "^0.9.0",
152
- "worker-loader": "^3.0.8",
153
- "yarn": "^1.22.11"
141
+ "vue2-transitions": "0.3.0",
142
+ "vuedraggable": "2.24.3",
143
+ "vuex": "3.6.2",
144
+ "webpack-bundle-analyzer": "4.5.0",
145
+ "webpack-virtual-modules": "0.4.3",
146
+ "xterm": "4.9.0",
147
+ "xterm-addon-fit": "0.4.0",
148
+ "xterm-addon-search": "0.7.0",
149
+ "xterm-addon-web-links": "0.4.0",
150
+ "xterm-addon-webgl": "0.9.0",
151
+ "worker-loader": "3.0.8",
152
+ "yarn": "1.22.18"
154
153
  },
155
154
  "nyc": {
156
155
  "extension": [
@@ -158,4 +157,4 @@
158
157
  ".vue"
159
158
  ]
160
159
  }
161
- }
160
+ }
@@ -395,7 +395,7 @@ export default {
395
395
  </a>
396
396
  </div>
397
397
  <div class="locale-elector">
398
- <LocaleSelector></LocaleSelector>
398
+ <LocaleSelector mode="login" />
399
399
  </div>
400
400
  </template>
401
401
  </div>
@@ -2,6 +2,8 @@
2
2
  import AsyncButton from '@shell/components/AsyncButton';
3
3
  import Loading from '@shell/components/Loading';
4
4
  import { Banner } from '@components/Banner';
5
+ import Carousel from '@shell/components/Carousel';
6
+ import ButtonGroup from '@shell/components/ButtonGroup';
5
7
  import SelectIconGrid from '@shell/components/SelectIconGrid';
6
8
  import TypeDescription from '@shell/components/TypeDescription';
7
9
  import {
@@ -12,15 +14,18 @@ import { sortBy } from '@shell/utils/sort';
12
14
  import { mapGetters } from 'vuex';
13
15
  import { Checkbox } from '@components/Form/Checkbox';
14
16
  import Select from '@shell/components/form/Select';
15
- import { mapPref, HIDE_REPOS, SHOW_PRE_RELEASE } from '@shell/store/prefs';
17
+ import { mapPref, HIDE_REPOS, SHOW_PRE_RELEASE, SHOW_CHART_MODE } from '@shell/store/prefs';
16
18
  import { removeObject, addObject, findBy } from '@shell/utils/array';
17
19
  import { compatibleVersionsFor, filterAndArrangeCharts } from '@shell/store/catalog';
18
20
  import { CATALOG } from '@shell/config/labels-annotations';
21
+ import { isUIPlugin } from '@shell/config/uiplugins';
19
22
 
20
23
  export default {
21
24
  components: {
22
25
  AsyncButton,
23
26
  Banner,
27
+ Carousel,
28
+ ButtonGroup,
24
29
  Loading,
25
30
  Checkbox,
26
31
  Select,
@@ -48,6 +53,17 @@ export default {
48
53
  searchQuery: null,
49
54
  showDeprecated: null,
50
55
  showHidden: null,
56
+ chartMode: this.$store.getters['prefs/get'](SHOW_CHART_MODE),
57
+ chartOptions: [
58
+ {
59
+ label: 'Browse',
60
+ value: 'browse',
61
+ },
62
+ {
63
+ label: 'Featured',
64
+ value: 'featured'
65
+ }
66
+ ]
51
67
  };
52
68
  },
53
69
 
@@ -134,6 +150,10 @@ export default {
134
150
  return false;
135
151
  }
136
152
 
153
+ if (isUIPlugin(c)) {
154
+ return false;
155
+ }
156
+
137
157
  return true;
138
158
  });
139
159
  },
@@ -154,6 +174,14 @@ export default {
154
174
  });
155
175
  },
156
176
 
177
+ getFeaturedCharts() {
178
+ const allCharts = (this.filteredCharts || []);
179
+
180
+ const featuredCharts = allCharts.filter(value => value.featured).sort((a, b) => a.featured - b.featured);
181
+
182
+ return featuredCharts.slice(0, 5);
183
+ },
184
+
157
185
  categories() {
158
186
  const map = {};
159
187
 
@@ -184,6 +212,10 @@ export default {
184
212
  return out;
185
213
  },
186
214
 
215
+ showCarousel() {
216
+ return this.chartMode === 'featured' && this.getFeaturedCharts.length;
217
+ }
218
+
187
219
  },
188
220
 
189
221
  watch: {
@@ -313,7 +345,20 @@ export default {
313
345
  {{ t('catalog.charts.header') }}
314
346
  </h1>
315
347
  </div>
348
+ <div v-if="getFeaturedCharts.length > 0" class="actions-container">
349
+ <ButtonGroup
350
+ v-model="chartMode"
351
+ :options="chartOptions"
352
+ />
353
+ </div>
316
354
  </header>
355
+ <div v-if="showCarousel">
356
+ <h3>Featured Charts</h3>
357
+ <Carousel
358
+ :sliders="getFeaturedCharts"
359
+ @clicked="(row) => selectChart(row)"
360
+ />
361
+ </div>
317
362
  <TypeDescription resource="chart" />
318
363
  <div class="left-right-split">
319
364
  <Select
@@ -632,10 +632,6 @@ export default {
632
632
  return { name: 'c-cluster-legacy-project' };
633
633
  },
634
634
 
635
- mcmRoute() {
636
- return { name: 'c-cluster-mcapps' };
637
- },
638
-
639
635
  windowsIncompatible() {
640
636
  if (this.chart?.windowsIncompatible) {
641
637
  return this.t('catalog.charts.windowsIncompatible');
@@ -762,8 +758,10 @@ export default {
762
758
 
763
759
  // Load a values component for the UI if it is named in the Helm chart.
764
760
  if ( component ) {
765
- if ( this.$store.getters['catalog/haveComponent'](component) ) {
766
- this.valuesComponent = this.$store.getters['catalog/importComponent'](component);
761
+ const hasChartComponent = this.$store.getters['type-map/hasCustomChart'](component);
762
+
763
+ if ( hasChartComponent ) {
764
+ this.valuesComponent = this.$store.getters['type-map/importChart'](component);
767
765
  const loaded = await this.valuesComponent();
768
766
 
769
767
  this.showValuesComponent = true;
@@ -1537,7 +1535,7 @@ export default {
1537
1535
  </div>
1538
1536
 
1539
1537
  <Banner color="warning" class="description">
1540
- <span>
1538
+ <span v-if="!mcapp">
1541
1539
  {{ t('catalog.install.error.legacy.label', { legacyType: mcapp ? legacyDefs.mcm : legacyDefs.legacy }, true) }}
1542
1540
  </span>
1543
1541
  <template v-if="!legacyEnabled">
@@ -1546,9 +1544,12 @@ export default {
1546
1544
  {{ t('catalog.install.error.legacy.enableLegacy.goto') }}
1547
1545
  </nuxt-link>
1548
1546
  </template>
1547
+ <template v-else-if="mcapp">
1548
+ <span v-html="t('catalog.install.error.legacy.mcmNotSupported')" />
1549
+ </template>
1549
1550
  <template v-else>
1550
- <nuxt-link :to="mcapp ? mcmRoute : legacyAppRoute">
1551
- <span v-html="t('catalog.install.error.legacy.navigate', { legacyType: mcapp ? legacyDefs.mcm : legacyDefs.legacy }, true)" />
1551
+ <nuxt-link :to="legacyAppRoute">
1552
+ <span v-html="t('catalog.install.error.legacy.navigate')" />
1552
1553
  </nuxt-link>
1553
1554
  </template>
1554
1555
  </Banner>
@@ -24,8 +24,9 @@ import {
24
24
  COUNT,
25
25
  CATALOG,
26
26
  POD,
27
+ PSP,
27
28
  } from '@shell/config/types';
28
- import { mapPref, CLUSTER_TOOLS_TIP } from '@shell/store/prefs';
29
+ import { mapPref, CLUSTER_TOOLS_TIP, PSP_DEPRECATION_BANNER } from '@shell/store/prefs';
29
30
  import { haveV1Monitoring, monitoringStatus } from '@shell/utils/monitoring';
30
31
  import Tabbed from '@shell/components/Tabbed';
31
32
  import Tab from '@shell/components/Tabbed/Tab';
@@ -111,12 +112,12 @@ export default {
111
112
 
112
113
  return {
113
114
  nodeHeaders,
114
- constraints: [],
115
- events: [],
116
- nodeMetrics: [],
117
- showClusterMetrics: false,
118
- showK8sMetrics: false,
119
- showEtcdMetrics: false,
115
+ constraints: [],
116
+ events: [],
117
+ nodeMetrics: [],
118
+ showClusterMetrics: false,
119
+ showK8sMetrics: false,
120
+ showEtcdMetrics: false,
120
121
  CLUSTER_METRICS_DETAIL_URL,
121
122
  CLUSTER_METRICS_SUMMARY_URL,
122
123
  K8S_METRICS_DETAIL_URL,
@@ -124,7 +125,7 @@ export default {
124
125
  ETCD_METRICS_DETAIL_URL,
125
126
  ETCD_METRICS_SUMMARY_URL,
126
127
  clusterCounts,
127
- selectedTab: 'cluster-events',
128
+ selectedTab: 'cluster-events',
128
129
  };
129
130
  },
130
131
 
@@ -142,6 +143,20 @@ export default {
142
143
  ...mapGetters(['currentCluster']),
143
144
  ...monitoringStatus(),
144
145
 
146
+ displayPspDeprecationBanner() {
147
+ const cluster = this.currentCluster;
148
+ const major = cluster.status?.version?.major ? parseInt(cluster.status?.version?.major) : 0;
149
+ const minor = cluster.status?.version?.minor ? parseInt(cluster.status?.version?.minor) : 0;
150
+
151
+ if (major === 1 && minor >= 21 && minor < 25) {
152
+ const clusterCounts = this.$store.getters[`cluster/all`](COUNT)?.[0]?.counts;
153
+
154
+ return !!clusterCounts?.[PSP]?.summary?.count;
155
+ }
156
+
157
+ return false;
158
+ },
159
+
145
160
  nodes() {
146
161
  return this.$store.getters['cluster/all'](NODE);
147
162
  },
@@ -150,7 +165,8 @@ export default {
150
165
  return this.$store.getters['management/all'](MANAGEMENT.CLUSTER);
151
166
  },
152
167
 
153
- hideClusterToolsTip: mapPref(CLUSTER_TOOLS_TIP),
168
+ hideClusterToolsTip: mapPref(CLUSTER_TOOLS_TIP),
169
+ hidePspDeprecationBanner: mapPref(PSP_DEPRECATION_BANNER),
154
170
 
155
171
  hasV1Monitoring() {
156
172
  return haveV1Monitoring(this.$store.getters);
@@ -324,6 +340,16 @@ export default {
324
340
 
325
341
  hasDescription() {
326
342
  return !!this.currentCluster?.spec?.description;
343
+ },
344
+
345
+ allEventsLink() {
346
+ return {
347
+ name: 'c-cluster-product-resource',
348
+ params: {
349
+ product: 'explorer',
350
+ resource: 'event',
351
+ }
352
+ };
327
353
  }
328
354
  },
329
355
 
@@ -378,6 +404,14 @@ export default {
378
404
  </div>
379
405
  </div>
380
406
  </header>
407
+ <Banner
408
+ v-if="displayPspDeprecationBanner && !hidePspDeprecationBanner"
409
+ :closable="true"
410
+ color="warning"
411
+ @close="hidePspDeprecationBanner = true"
412
+ >
413
+ <t k="landing.deprecatedPsp" :raw="true" />
414
+ </Banner>
381
415
  <Banner
382
416
  v-if="!hideClusterToolsTip"
383
417
  :closable="true"
@@ -403,6 +437,14 @@ export default {
403
437
  <label>{{ t('glance.created') }}: </label>
404
438
  <span><LiveDate :value="currentCluster.metadata.creationTimestamp" :add-suffix="true" :show-tooltip="true" /></span>
405
439
  </div>
440
+ <p
441
+ v-if="displayPspDeprecationBanner && hidePspDeprecationBanner"
442
+ v-tooltip="t('landing.deprecatedPsp')"
443
+ class="alt-psp-deprecation-info"
444
+ >
445
+ <span>{{ t('landing.psps') }}</span>
446
+ <i class="icon icon-warning" />
447
+ </p>
406
448
  <div :style="{'flex':1}" />
407
449
  <div v-if="!monitoringStatus.v2 && !monitoringStatus.v1">
408
450
  <n-link :to="{name: 'c-cluster-explorer-tools'}" class="monitoring-install">
@@ -446,6 +488,11 @@ export default {
446
488
  <div class="mt-30">
447
489
  <Tabbed @changed="tabChange">
448
490
  <Tab name="cluster-events" :label="t('clusterIndexPage.sections.events.label')" :weight="2">
491
+ <span class="events-table-link">
492
+ <n-link :to="allEventsLink">
493
+ <span>{{ t('glance.eventsTable') }}</span>
494
+ </n-link>
495
+ </span>
449
496
  <EventsTable />
450
497
  </Tab>
451
498
  <Tab v-if="hasMonitoring" name="cluster-alerts" :label="t('clusterIndexPage.sections.alerts.label')" :weight="1">
@@ -534,6 +581,16 @@ export default {
534
581
  margin-top: 0;
535
582
  }
536
583
 
584
+ .alt-psp-deprecation-info {
585
+ display: flex;
586
+ align-items: center;
587
+ color: var(--warning);
588
+
589
+ span {
590
+ margin-right: 4px;
591
+ }
592
+ }
593
+
537
594
  .monitoring-install {
538
595
  display: flex;
539
596
  margin-left: 10px;
@@ -548,6 +605,12 @@ export default {
548
605
  }
549
606
  }
550
607
 
608
+ .events-table-link {
609
+ display: flex;
610
+ justify-content: flex-end;
611
+ margin-bottom: 20px;
612
+ }
613
+
551
614
  .k8s-component-status {
552
615
  align-items: center;
553
616
  display: inline-flex;
@@ -121,13 +121,15 @@ export default {
121
121
  showTypes: [CATALOG_ANNOTATIONS._CLUSTER_TOOL],
122
122
  });
123
123
 
124
+ charts = charts.filter(c => c.sideLabel !== 'Experimental');
125
+
124
126
  // If legacy support is enabled, show V1 charts for some V1 Cluster tools
125
127
  if (this.legacyEnabled) {
126
128
  charts = charts.concat(this.legacyCharts);
127
129
  charts = sortBy(charts, ['certifiedSort', 'chartNameDisplay']);
128
130
  }
129
131
 
130
- const chartsWithApps = charts.map((chart) => {
132
+ let chartsWithApps = charts.map((chart) => {
131
133
  return {
132
134
  chart,
133
135
  app: this.installedAppForChart[chart.id],
@@ -136,9 +138,9 @@ export default {
136
138
 
137
139
  // V1 Legacy support
138
140
  if (this.legacyEnabled) {
139
- this.checkLegacyApp(chartsWithApps, this.v1Apps, 'v1-monitoring', 'rancher-monitoring', 'cluster-monitoring');
140
- this.checkLegacyApp(chartsWithApps, this.v1Apps, 'v1-istio', 'rancher-istio', 'cluster-istio');
141
- this.checkLegacyApp(chartsWithApps, this.v1Apps, 'v1-logging', 'rancher-logging', 'rancher-logging');
141
+ chartsWithApps = this.checkLegacyApp(chartsWithApps, this.v1Apps, 'v1-monitoring', 'rancher-monitoring', 'cluster-monitoring', false);
142
+ chartsWithApps = this.checkLegacyApp(chartsWithApps, this.v1Apps, 'v1-istio', 'rancher-istio', 'cluster-istio', true);
143
+ chartsWithApps = this.checkLegacyApp(chartsWithApps, this.v1Apps, 'v1-logging', 'rancher-logging', 'rancher-logging', true);
142
144
  }
143
145
 
144
146
  return chartsWithApps;
@@ -231,7 +233,7 @@ export default {
231
233
  return versions;
232
234
  },
233
235
 
234
- checkLegacyApp(chartsWithApps, v1Apps, v1ChartName, v2ChartName, v1AppName) {
236
+ checkLegacyApp(chartsWithApps, v1Apps, v1ChartName, v2ChartName, v1AppName, showOnlyIfInstalled) {
235
237
  const v1 = chartsWithApps.find(a => a.chart.chartName === v1ChartName);
236
238
  const v2 = chartsWithApps.find(a => a.chart.chartName === v2ChartName);
237
239
 
@@ -251,6 +253,9 @@ export default {
251
253
  v1.app.upgradeAvailable = latest;
252
254
  }
253
255
  }
256
+ } else if (showOnlyIfInstalled) {
257
+ // Remove the v1 chart if it is not already installed for charts which we no longer support
258
+ chartsWithApps = chartsWithApps.filter(c => c !== v1);
254
259
  }
255
260
 
256
261
  if (v2) {
@@ -262,6 +267,8 @@ export default {
262
267
  }
263
268
  }
264
269
  }
270
+
271
+ return chartsWithApps;
265
272
  }
266
273
  }
267
274
  };
@@ -8,7 +8,7 @@ export default {
8
8
  params: {
9
9
  ...route.params,
10
10
  product: NAME,
11
- page: 'apps'
11
+ page: 'catalogs'
12
12
  }
13
13
  });
14
14
  }