@rancher/shell 0.3.4 → 0.3.5

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 (246) hide show
  1. package/assets/styles/app.scss +1 -1
  2. package/assets/styles/fonts/_fontstack.scss +11 -11
  3. package/assets/styles/vendor/vue-js-modal.scss +3 -3
  4. package/assets/translations/en-us.yaml +92 -22
  5. package/assets/translations/zh-hans.yaml +84 -15
  6. package/babel.config.js +13 -0
  7. package/chart/gatekeeper.vue +77 -0
  8. package/chart/istio.vue +108 -111
  9. package/chart/logging/index.vue +13 -4
  10. package/chart/monitoring/index.vue +15 -5
  11. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  12. package/chart/rancher-backup/index.vue +10 -3
  13. package/cloud-credential/aws.vue +1 -1
  14. package/cloud-credential/digitalocean.vue +1 -1
  15. package/cloud-credential/gcp.vue +1 -1
  16. package/cloud-credential/generic.vue +2 -2
  17. package/cloud-credential/linode.vue +1 -1
  18. package/cloud-credential/pnap.vue +1 -1
  19. package/components/ActionMenu.vue +3 -4
  20. package/components/AssignTo.vue +1 -1
  21. package/components/AsyncButton.vue +1 -1
  22. package/components/BannerGraphic.vue +1 -1
  23. package/components/ButtonDropdown.vue +2 -3
  24. package/components/ChartPsp.vue +76 -0
  25. package/components/CruResource.vue +6 -2
  26. package/components/DashboardMetrics.vue +12 -10
  27. package/components/DetailText.vue +1 -1
  28. package/components/DisableAuthProviderModal.vue +1 -1
  29. package/components/EmberPage.vue +1 -1
  30. package/components/EtcdInfoBanner.vue +5 -4
  31. package/components/ExplorerMembers.vue +1 -1
  32. package/components/ExplorerProjectsNamespaces.vue +14 -1
  33. package/components/FileDiff.vue +6 -7
  34. package/components/GrafanaDashboard.vue +18 -21
  35. package/components/LazyImage.vue +10 -12
  36. package/components/LogItem.vue +1 -1
  37. package/components/Markdown.vue +1 -1
  38. package/components/PromptRemove.vue +2 -2
  39. package/components/PromptRestore.vue +1 -1
  40. package/components/ResourceDetail/Masthead.vue +16 -0
  41. package/components/ResourceDetail/index.vue +21 -4
  42. package/components/ResourceList/index.vue +1 -1
  43. package/components/ResourceTable.vue +4 -1
  44. package/components/SingleClusterInfo.vue +2 -2
  45. package/components/SortableTable/THead.vue +1 -1
  46. package/components/SortableTable/index.vue +5 -2
  47. package/components/__tests__/AsyncButton.test.ts +3 -1
  48. package/components/__tests__/ChartPsp.test.ts +75 -0
  49. package/components/__tests__/CruResource.test.ts +3 -1
  50. package/components/auth/Principal.vue +1 -1
  51. package/components/fleet/FleetBundles.vue +3 -1
  52. package/components/fleet/FleetClusters.vue +1 -2
  53. package/components/fleet/FleetIntro.vue +9 -1
  54. package/components/fleet/FleetNoWorkspaces.vue +62 -0
  55. package/components/fleet/FleetSummary.vue +7 -1
  56. package/components/form/LabeledSelect.vue +14 -11
  57. package/components/form/MatchExpressions.vue +17 -2
  58. package/components/form/NameNsDescription.vue +31 -45
  59. package/components/form/ResourceSelector.vue +1 -1
  60. package/components/form/SecretSelector.vue +5 -1
  61. package/components/form/ServiceNameSelect.vue +1 -1
  62. package/components/form/SimpleSecretSelector.vue +9 -9
  63. package/components/form/__tests__/LabeledSelect.test.ts +138 -0
  64. package/components/form/__tests__/NameNsDescription.ts +32 -0
  65. package/components/formatter/InternalExternalIP.vue +6 -0
  66. package/components/formatter/InvolvedObjectLink.vue +54 -0
  67. package/components/formatter/Link.vue +20 -4
  68. package/components/formatter/LinkName.vue +6 -1
  69. package/components/formatter/ServiceTargets.vue +1 -1
  70. package/components/nav/Group.vue +2 -2
  71. package/components/nav/NamespaceFilter.vue +15 -11
  72. package/components/nav/TopLevelMenu.vue +2 -4
  73. package/components/nav/Type.vue +1 -1
  74. package/components/nav/WorkspaceSwitcher.vue +46 -5
  75. package/config/labels-annotations.js +17 -0
  76. package/config/product/auth.js +3 -2
  77. package/config/product/explorer.js +11 -4
  78. package/config/product/fleet.js +2 -0
  79. package/config/router.js +414 -0
  80. package/config/table-headers.js +10 -2
  81. package/config/types.js +11 -8
  82. package/config/uiplugins.js +30 -0
  83. package/content/docs/en-us/whats-new.md +10 -0
  84. package/content/docs/zh-hans/whats-new.md +11 -1
  85. package/core/plugin-routes.ts +23 -0
  86. package/creators/app/app.package.json +2 -1
  87. package/creators/app/files/.eslintrc.js +1 -1
  88. package/creators/app/files/babel.config.js +1 -18
  89. package/creators/app/files/vue.config.js +7 -0
  90. package/creators/app/init +5 -5
  91. package/creators/pkg/files/.github/workflows/build-extension.yml +111 -0
  92. package/creators/pkg/init +35 -4
  93. package/creators/update/init +1 -1
  94. package/detail/constraints.gatekeeper.sh.constraint.vue +20 -10
  95. package/detail/fleet.cattle.io.gitrepo.vue +19 -11
  96. package/detail/harvesterhci.io.management.cluster.vue +3 -3
  97. package/detail/provisioning.cattle.io.cluster.vue +54 -12
  98. package/detail/workload/index.vue +3 -3
  99. package/dialog/AddClusterMemberDialog.vue +1 -1
  100. package/dialog/AddProjectMemberDialog.vue +2 -2
  101. package/dialog/AddonConfigConfirmationDialog.vue +27 -15
  102. package/dialog/DiagnosticTimingsDialog.vue +1 -1
  103. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  104. package/dialog/GenericPrompt.vue +18 -6
  105. package/dialog/RotateEncryptionKeyDialog.vue +1 -1
  106. package/dialog/SaveAsRKETemplateDialog.vue +1 -1
  107. package/dialog/ScaleMachineDownDialog.vue +1 -1
  108. package/edit/auth/github.vue +8 -8
  109. package/edit/auth/googleoauth.vue +5 -5
  110. package/edit/auth/ldap/index.vue +1 -1
  111. package/edit/auth/oidc.vue +1 -1
  112. package/edit/auth/saml.vue +1 -1
  113. package/edit/cis.cattle.io.clusterscan.vue +1 -1
  114. package/edit/fleet.cattle.io.clustergroup.vue +6 -4
  115. package/edit/fleet.cattle.io.gitrepo.vue +16 -3
  116. package/edit/helm.cattle.io.projecthelmchart.vue +5 -1
  117. package/edit/management.cattle.io.fleetworkspace.vue +141 -6
  118. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +4 -1
  119. package/edit/management.cattle.io.setting.vue +1 -1
  120. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +2 -2
  121. package/edit/monitoring.coreos.com.receiver/tls.vue +18 -18
  122. package/edit/monitoring.coreos.com.receiver/types/webhook.banner.vue +4 -4
  123. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +1 -1
  124. package/edit/namespace.vue +2 -2
  125. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +126 -45
  126. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  127. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +10 -0
  128. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +1 -0
  129. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +202 -2
  130. package/edit/provisioning.cattle.io.cluster/rke2.vue +248 -84
  131. package/edit/resources.cattle.io.backup.vue +1 -1
  132. package/edit/service.vue +1 -1
  133. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +2 -2
  134. package/edit/workload/__tests__/Job.test.ts +3 -1
  135. package/edit/workload/index.vue +8 -3
  136. package/edit/workload/mixins/workload.js +16 -0
  137. package/layouts/default.vue +7 -3
  138. package/list/fleet.cattle.io.bundle.vue +6 -3
  139. package/list/fleet.cattle.io.clusterregistrationtoken.vue +3 -1
  140. package/list/fleet.cattle.io.gitrepo.vue +44 -5
  141. package/list/management.cattle.io.fleetworkspace.vue +45 -0
  142. package/list/node.vue +69 -16
  143. package/list/provisioning.cattle.io.cluster.vue +30 -1
  144. package/machine-config/azure.vue +97 -38
  145. package/middleware/authenticated.js +34 -0
  146. package/mixins/chart.js +73 -2
  147. package/mixins/resource-fetch.js +2 -2
  148. package/models/apps.statefulset.js +28 -0
  149. package/models/cluster/node.js +23 -2
  150. package/models/cluster.x-k8s.io.machine.js +4 -2
  151. package/models/clusterroletemplatebinding.js +7 -0
  152. package/models/constraints.gatekeeper.sh.constraint.js +9 -0
  153. package/models/fleet.cattle.io.cluster.js +19 -10
  154. package/models/fleet.cattle.io.gitrepo.js +7 -2
  155. package/models/management.cattle.io.cluster.js +1 -1
  156. package/models/management.cattle.io.fleetworkspace.js +12 -0
  157. package/models/management.cattle.io.gitreporestriction.js +5 -0
  158. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.js +3 -0
  159. package/models/provisioning.cattle.io.cluster.js +7 -5
  160. package/nuxt/App.js +210 -0
  161. package/nuxt/axios.js +186 -0
  162. package/nuxt/client.js +817 -0
  163. package/nuxt/components/nuxt-build-indicator.vue +143 -0
  164. package/nuxt/components/nuxt-child.js +122 -0
  165. package/nuxt/components/nuxt-error.vue +98 -0
  166. package/nuxt/components/nuxt-link.client.js +98 -0
  167. package/nuxt/components/nuxt-link.server.js +16 -0
  168. package/nuxt/components/nuxt-loading.vue +154 -0
  169. package/nuxt/components/nuxt.js +101 -0
  170. package/nuxt/cookie-universal-nuxt.js +9 -0
  171. package/nuxt/empty.js +1 -0
  172. package/nuxt/index.js +365 -0
  173. package/nuxt/jsonp.js +82 -0
  174. package/nuxt/loading.html +39 -0
  175. package/nuxt/middleware.js +12 -0
  176. package/nuxt/mixins/fetch.client.js +90 -0
  177. package/nuxt/mixins/fetch.server.js +69 -0
  178. package/nuxt/portal-vue.js +4 -0
  179. package/nuxt/server.js +312 -0
  180. package/nuxt/store.js +178 -0
  181. package/nuxt/utils.js +630 -0
  182. package/nuxt/views/app.template.html +9 -0
  183. package/nuxt/views/error.html +23 -0
  184. package/package.json +5 -9
  185. package/pages/auth/setup.vue +2 -2
  186. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +33 -0
  187. package/pages/c/_cluster/apps/charts/chart.vue +4 -4
  188. package/pages/c/_cluster/apps/charts/install.helpers.js +26 -0
  189. package/pages/c/_cluster/apps/charts/install.vue +40 -66
  190. package/pages/c/_cluster/explorer/EventsTable.vue +5 -19
  191. package/pages/c/_cluster/explorer/index.vue +29 -25
  192. package/pages/c/_cluster/explorer/tools/index.vue +8 -8
  193. package/pages/c/_cluster/fleet/index.vue +95 -34
  194. package/pages/c/_cluster/gatekeeper/index.vue +1 -1
  195. package/pages/c/_cluster/istio/index.vue +5 -5
  196. package/pages/c/_cluster/manager/cloudCredential/index.vue +1 -1
  197. package/pages/c/_cluster/monitoring/index.vue +7 -0
  198. package/pages/c/_cluster/uiplugins/InstallDialog.vue +8 -8
  199. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +20 -7
  200. package/pages/c/_cluster/uiplugins/index.vue +49 -17
  201. package/pages/home.vue +9 -4
  202. package/pages/index.vue +10 -1
  203. package/plugins/clean-html-directive.js +31 -0
  204. package/plugins/dashboard-store/actions.js +32 -9
  205. package/plugins/dashboard-store/mutations.js +5 -2
  206. package/plugins/dashboard-store/resource-class.js +8 -1
  207. package/plugins/steve/mutations.js +3 -2
  208. package/plugins/steve/steve-description-class.js +5 -1
  209. package/plugins/steve/subscribe.js +63 -54
  210. package/plugins/steve-create-worker.js +14 -0
  211. package/promptRemove/management.cattle.io.globalrole.vue +2 -2
  212. package/promptRemove/management.cattle.io.project.vue +2 -2
  213. package/promptRemove/management.cattle.io.roletemplate.vue +2 -2
  214. package/promptRemove/pod.vue +1 -1
  215. package/public/index.html +65 -0
  216. package/rancher-components/components/Banner/Banner.test.ts +9 -1
  217. package/rancher-components/components/Banner/Banner.vue +1 -1
  218. package/rancher-components/components/Form/Checkbox/Checkbox.vue +2 -0
  219. package/rancher-components/components/Form/Radio/RadioButton.vue +1 -1
  220. package/scripts/build-pkg.sh +1 -0
  221. package/scripts/clean +6 -0
  222. package/scripts/extension/bundle +58 -0
  223. package/scripts/extension/helmpatch +89 -0
  224. package/scripts/extension/publish +314 -0
  225. package/scripts/test-plugins-build.sh +4 -0
  226. package/store/__tests__/index.test.ts +110 -0
  227. package/store/index.js +145 -58
  228. package/store/type-map.js +5 -1
  229. package/tsconfig.default.json +36 -0
  230. package/tsconfig.json +24 -0
  231. package/types/shell/index.d.ts +420 -343
  232. package/utils/__tests__/string.test.ts +12 -0
  233. package/utils/auth.js +65 -0
  234. package/utils/monitoring.js +2 -1
  235. package/utils/position.js +5 -8
  236. package/utils/router.scrollBehavior.js +80 -0
  237. package/utils/select.js +1 -3
  238. package/utils/socket.js +1 -0
  239. package/utils/string.js +13 -0
  240. package/utils/time.js +9 -0
  241. package/vue.config.js +679 -0
  242. package/chart/rancher-alerting-drivers.vue +0 -53
  243. package/chart/rancher-gatekeeper.vue +0 -37
  244. package/creators/app/files/nuxt.config.js +0 -6
  245. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +0 -4
  246. package/nuxt.config.js +0 -798
package/store/index.js CHANGED
@@ -55,89 +55,150 @@ export const plugins = [
55
55
  }),
56
56
  ];
57
57
 
58
- const getActiveNamespaces = (state, getters) => {
59
- const out = {};
58
+ /**
59
+ * Get all the namespaces categories
60
+ * @returns Record<string, true>
61
+ */
62
+ const getActiveNamespacesCategories = (getters, namespaces, filters) => {
63
+ // Split namespaces by category
64
+ const includeAll = getters.isAllNamespaces;
65
+ const includeSystem = filters.includes(ALL_SYSTEM);
66
+ const includeUser = filters.includes(ALL_USER);
67
+ const includeOrphans = filters.includes(ALL_ORPHANS);
68
+
69
+ // Categories to pull in all the user, system, or orphaned namespaces
70
+ const hasCategory = includeAll || includeOrphans || includeSystem || includeUser;
71
+
72
+ return hasCategory ? Object.values(namespaces).reduce((acc, ns) => {
73
+ if (
74
+ includeAll ||
75
+ (includeOrphans && !ns.projectId) ||
76
+ (includeUser && !ns.isSystem) ||
77
+ (includeSystem && ns.isSystem)
78
+ ) {
79
+ acc[ns.id] = true;
80
+ }
81
+
82
+ return acc;
83
+ }, {}) : {};
84
+ };
85
+
86
+ /**
87
+ * Get handpicked namespaces from the filters
88
+ * @returns Record<string, true>
89
+ */
90
+ const getActiveSingleNamespaces = (getters, filters) => {
91
+ const activeNamespaces = {};
92
+
93
+ // Individual cases for stacked project and/or namespace filters
94
+ if ( !getters.isAllNamespaces ) {
95
+ const clusterId = getters['currentCluster']?.id;
96
+
97
+ for ( const filter of filters ) {
98
+ const [type, id] = filter.split('://', 2);
99
+
100
+ if ( !type ) {
101
+ continue;
102
+ }
103
+
104
+ if ( type === 'ns' ) {
105
+ activeNamespaces[id] = true;
106
+ } else if (type === 'project') {
107
+ // Set all the namespaces contained in the project
108
+ const project = getters['management/byId'](MANAGEMENT.PROJECT, `${ clusterId }/${ id }`);
109
+
110
+ if ( project ) {
111
+ for ( const projectNamespace of project.namespaces ) {
112
+ activeNamespaces[projectNamespace.id] = true;
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ return activeNamespaces;
120
+ };
121
+
122
+ /**
123
+ * Get only namespaces for user with roles "Cluster Member" and "View All Projects"
124
+ * @returns Record<string, true>
125
+ */
126
+ const getReadOnlyActiveNamespaces = (namespaces, activeNamespaces) => {
127
+ const readonlyNamespaces = Object
128
+ .values(namespaces)
129
+ .filter(ns => !!ns.links.update)
130
+ .map(({ id }) => id);
131
+
132
+ return Object.keys(activeNamespaces)
133
+ .filter(ns => readonlyNamespaces.includes(ns))
134
+ .reduce((acc, ns) => ({
135
+ ...acc,
136
+ [ns]: true
137
+ }), {});
138
+ };
139
+
140
+ /**
141
+ * Collect all the namespaces grouped by category, project or single pick
142
+ * @returns Record<string, true>
143
+ */
144
+ const getActiveNamespaces = (state, getters, readonly = false) => {
60
145
  const product = getters['currentProduct'];
61
- const workspace = state.workspace;
62
146
 
63
147
  if ( !product ) {
64
- return out;
148
+ return {};
65
149
  }
66
150
 
151
+ // TODO: Add comment with logic for fleet
67
152
  if ( product.showWorkspaceSwitcher ) {
68
- const fleetOut = { [workspace]: true };
153
+ const fleetOut = { [state.workspace]: true };
69
154
 
70
155
  updateActiveNamespaceCache(state, fleetOut);
71
156
 
72
157
  return fleetOut;
73
158
  }
74
159
 
160
+ // Reset cache if no cluster is found or is not in store
75
161
  const inStore = product?.inStore;
76
162
  const clusterId = getters['currentCluster']?.id;
77
163
 
78
164
  if ( !clusterId || !inStore ) {
79
- updateActiveNamespaceCache(state, out);
165
+ updateActiveNamespaceCache(state, {});
80
166
 
81
- return out;
167
+ return {};
82
168
  }
83
169
 
84
- let namespaces = [];
170
+ // Use default "All Namespaces" category if no namespaces is found
171
+ const hasNamespaces = Array.isArray(state.allNamespaces) && state.allNamespaces.length > 0;
172
+ const allNamespaces = hasNamespaces ? state.allNamespaces : getters[`${ inStore }/all`](NAMESPACE);
85
173
 
86
- if (Array.isArray(state.allNamespaces) && state.allNamespaces.length > 0) {
87
- namespaces = state.allNamespaces;
88
- } else {
89
- namespaces = getters[`${ inStore }/all`](NAMESPACE);
90
- }
174
+ const allowedNamespaces = allNamespaces
175
+ .filter(ns => state.prefs.data['all-namespaces'] ? true : !ns.isObscure) // Filter out Rancher system namespaces
176
+ .filter(ns => product.hideSystemResources ? !ns.isSystem : true); // Filter out Fleet system namespaces
91
177
 
92
- const filters = state.namespaceFilters.filter(x => !!x && !`${ x }`.startsWith(NAMESPACED_PREFIX));
93
- const includeAll = getters.isAllNamespaces;
94
- const includeSystem = filters.includes(ALL_SYSTEM);
95
- const includeUser = filters.includes(ALL_USER);
96
- const includeOrphans = filters.includes(ALL_ORPHANS);
178
+ // Retrieve all the filters selected by the user
179
+ const filters = state.namespaceFilters.filter(
180
+ filters => !!filters && !`${ filters }`.startsWith(NAMESPACED_PREFIX)
181
+ );
97
182
 
98
- // Special cases to pull in all the user, system, or orphaned namespaces
99
- if ( includeAll || includeOrphans || includeSystem || includeUser ) {
100
- for ( const ns of namespaces ) {
101
- if (
102
- includeAll ||
103
- ( includeOrphans && !ns.projectId ) ||
104
- ( includeUser && !ns.isSystem ) ||
105
- ( includeSystem && ns.isSystem )
106
- ) {
107
- out[ns.id] = true;
108
- }
109
- }
110
- }
111
-
112
- // Individual requests for a specific project/namespace
113
- if ( !includeAll ) {
114
- for ( const filter of filters ) {
115
- const [type, id] = filter.split('://', 2);
116
-
117
- if ( !type ) {
118
- continue;
119
- }
183
+ const activeNamespaces = {
184
+ ...getActiveNamespacesCategories(getters, allowedNamespaces, filters),
185
+ ...getActiveSingleNamespaces(getters, filters),
186
+ };
120
187
 
121
- if ( type === 'ns' ) {
122
- out[id] = true;
123
- } else if ( type === 'project' ) {
124
- const project = getters['management/byId'](MANAGEMENT.PROJECT, `${ clusterId }/${ id }`);
188
+ // Create map that can be used to efficiently check if a resource should be displayed
189
+ updateActiveNamespaceCache(state, activeNamespaces);
125
190
 
126
- if ( project ) {
127
- for ( const ns of project.namespaces ) {
128
- out[ns.id] = true;
129
- }
130
- }
131
- }
132
- }
191
+ // Exclude namespaces restricted to the user for writing
192
+ if (readonly) {
193
+ return getReadOnlyActiveNamespaces(allowedNamespaces, activeNamespaces);
133
194
  }
134
- // Create map that can be used to efficiently check if a
135
- // resource should be displayed
136
- updateActiveNamespaceCache(state, out);
137
195
 
138
- return out;
196
+ return activeNamespaces;
139
197
  };
140
198
 
199
+ /**
200
+ * Caching side-effect while retrieving namespaces filters
201
+ */
141
202
  const updateActiveNamespaceCache = (state, activeNamespaceCache) => {
142
203
  // This is going to run a lot, so keep it optimised
143
204
  let cacheKey = '';
@@ -164,8 +225,8 @@ export const state = () => {
164
225
  namespaceFilters: [],
165
226
  activeNamespaceCache: {}, // Used to efficiently check if a resource should be displayed
166
227
  activeNamespaceCacheKey: '', // Fingerprint of activeNamespaceCache
167
- allNamespaces: null,
168
- allWorkspaces: null,
228
+ allNamespaces: [],
229
+ allWorkspaces: [],
169
230
  clusterId: null,
170
231
  productId: null,
171
232
  workspace: null,
@@ -241,6 +302,12 @@ export const getters = {
241
302
  return out;
242
303
  },
243
304
 
305
+ getStoreNameByProductId(state) {
306
+ const products = state['type-map']?.products;
307
+
308
+ return (products.find(p => p.name === state.productId) || {})?.inStore || 'cluster';
309
+ },
310
+
244
311
  currentStore(state, getters) {
245
312
  return (type) => {
246
313
  const product = getters['currentProduct'];
@@ -404,6 +471,10 @@ export const getters = {
404
471
  return state.namespaceFilters;
405
472
  },
406
473
 
474
+ allNamespaces(state) {
475
+ return state.allNamespaces;
476
+ },
477
+
407
478
  namespaces(state, getters) {
408
479
  // Call this getter if you want to recompute the active namespaces
409
480
  // by looping over all namespaces in a cluster. Otherwise call activeNamespaceCache,
@@ -412,6 +483,14 @@ export const getters = {
412
483
  return () => getActiveNamespaces(state, getters);
413
484
  },
414
485
 
486
+ /**
487
+ * Return namespaces which the user can refer to create resources
488
+ * @returns Record<string, true>
489
+ */
490
+ allowedNamespaces(state, getters) {
491
+ return () => getActiveNamespaces(state, getters, true);
492
+ },
493
+
415
494
  defaultNamespace(state, getters, rootState, rootGetters) {
416
495
  const product = getters['currentProduct'];
417
496
 
@@ -529,6 +608,15 @@ export const mutations = {
529
608
  getActiveNamespaces(state, getters);
530
609
  },
531
610
 
611
+ changeAllNamespaces(state, namespace) {
612
+ // `allNamespaces/changeAllNamespaces` allow products to restrict the namespaces shown to the user in the NamespaceFilter and NameNsDescription components.
613
+ // You can configure the `notFilterNamespace` parameter for each resource page to define namespaces that do not need to be filtered, and then change `allNamespaces` by calling `changeAllNamespaces`
614
+ // eg:
615
+ // const notFilterNamespaces = this.$store.getters[`type-map/optionsFor`](resource).notFilterNamespace || [];
616
+ // const allNamespaces = this.$store.getters[`${ this.currentProduct.inStore }/filterNamespace`](notFilterNamespaces);
617
+ state.allNamespaces = namespace;
618
+ },
619
+
532
620
  setNamespaceFilterMode(state, mode) {
533
621
  state.namespaceFilterMode = mode;
534
622
  },
@@ -552,7 +640,6 @@ export const mutations = {
552
640
  }
553
641
 
554
642
  state.workspace = value;
555
-
556
643
  getActiveNamespaces(state, getters);
557
644
  },
558
645
 
package/store/type-map.js CHANGED
@@ -104,6 +104,8 @@
104
104
  // customRoute: undefined,
105
105
  // hasGraph: undefined -- If true, render ForceDirectedTreeChart graph (ATTENTION: option graphConfig is needed also!!!)
106
106
  // graphConfig: undefined -- Use this to pass along the graph configuration
107
+ // notFilterNamespace: undefined -- Define namespaces that do not need to be filtered
108
+ // localOnly: False -- Hide this type from the nav/search bar on downstream clusters
107
109
  // }
108
110
  // )
109
111
  // ignoreGroup(group): Never show group or any types in it
@@ -842,7 +844,7 @@ export const getters = {
842
844
 
843
845
  allTypes(state, getters, rootState, rootGetters) {
844
846
  return (product, mode = ALL) => {
845
- const module = findBy(state.products, 'name', product).inStore;
847
+ const module = findBy(state.products, 'name', product)?.inStore;
846
848
  const schemas = rootGetters[`${ module }/all`](SCHEMA);
847
849
  const counts = rootGetters[`${ module }/all`](COUNT)?.[0]?.counts || {};
848
850
  const isDev = rootGetters['prefs/get'](VIEW_IN_API);
@@ -869,6 +871,8 @@ export const getters = {
869
871
  continue;
870
872
  } else if ( typeof typeOptions.ifRancherCluster !== 'undefined' && typeOptions.ifRancherCluster !== rootGetters.isRancher ) {
871
873
  continue;
874
+ } else if (typeOptions.localOnly && !rootGetters.currentCluster?.isLocal) {
875
+ continue;
872
876
  }
873
877
 
874
878
  out[schema.id] = {
@@ -0,0 +1,36 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2018",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Node",
6
+ "lib": [
7
+ "ESNext",
8
+ "ESNext.AsyncIterable",
9
+ "DOM"
10
+ ],
11
+ "esModuleInterop": true,
12
+ "allowJs": true,
13
+ "sourceMap": true,
14
+ "strict": true,
15
+ "noEmit": false,
16
+ "baseUrl": ".",
17
+ "rootDir": ".",
18
+ "paths": {
19
+ "~/*": [
20
+ "../*"
21
+ ],
22
+ "@/*": [
23
+ "../*"
24
+ ],
25
+ "@shell/*": [
26
+ "../shell/*"
27
+ ],
28
+ "@pkg/*": [
29
+ "../shell/pkg/*"
30
+ ]
31
+ },
32
+ "typeRoots": [
33
+ "./node_modules/@types"
34
+ ],
35
+ },
36
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "extends": "./tsconfig.default.json",
3
+ "compilerOptions": {
4
+ "types": [
5
+ "@types/node",
6
+ "@types/jest",
7
+ "@nuxt/types"
8
+ ]
9
+ },
10
+ "exclude": [
11
+ "node_modules",
12
+ ".nuxt",
13
+ "dist",
14
+ "dist-pkg",
15
+ "cypress",
16
+ "shell/creators",
17
+ "shell/scripts",
18
+ "cypress",
19
+ "./cypress.config.ts",
20
+ "docusaurus",
21
+ "script/standalone",
22
+ "**/*.spec.ts"
23
+ ]
24
+ }