dashboard-shell-shell 1.0.122 → 1.0.1000000082

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 (372) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/brand/harvester/favicon.png +0 -0
  3. package/assets/brand/suse/favicon.png +0 -0
  4. package/assets/icons/iconfont.css +19 -3
  5. package/assets/icons/iconfont.js +1 -1
  6. package/assets/icons/iconfont.json +28 -0
  7. package/assets/icons/iconfont.ttf +0 -0
  8. package/assets/icons/iconfont.woff +0 -0
  9. package/assets/icons/iconfont.woff2 +0 -0
  10. package/assets/images/pl/half-logo.svg +2 -23
  11. package/assets/styles/base/_functions.scss +0 -0
  12. package/assets/styles/base/_mixins.scss +0 -0
  13. package/assets/styles/base/_variables.scss +1 -1
  14. package/assets/styles/global/_labeled-input.scss +0 -1
  15. package/assets/styles/global/_layout.scss +1 -1
  16. package/assets/styles/global/_select.scss +4 -2
  17. package/assets/styles/global/_table.scss +5 -0
  18. package/assets/styles/vendor/vue-select.scss +2 -1
  19. package/assets/translations/en-us.yaml +1 -1
  20. package/assets/translations/zh-hans.yaml +25 -15
  21. package/chart/monitoring/index.vue +3 -1
  22. package/chart/monitoring/prometheus/index.vue +13 -10
  23. package/cloud-credential/aws.vue +2 -0
  24. package/components/ActionDropdown.vue +1 -1
  25. package/components/ActionDropdownShell.vue +71 -0
  26. package/components/ActionMenu.vue +2 -2
  27. package/components/ActionMenuShell.vue +3 -0
  28. package/components/AppModal.vue +84 -8
  29. package/components/AssignTo.vue +25 -11
  30. package/components/AsyncButton.vue +24 -7
  31. package/components/BannerGraphic.vue +1 -0
  32. package/components/ButtonDropdown.vue +26 -4
  33. package/components/ButtonGroup.vue +4 -0
  34. package/components/ButtonMultiAction.vue +1 -0
  35. package/components/CodeMirror.vue +19 -6
  36. package/components/CommunityLinks.vue +3 -3
  37. package/components/ConsumptionGauge.vue +24 -5
  38. package/components/CopyToClipboardText.vue +2 -1
  39. package/components/CruResource.vue +13 -7
  40. package/components/CruResourceFooter.vue +2 -2
  41. package/components/DashboardOptions.vue +29 -17
  42. package/components/DetailText.vue +5 -0
  43. package/components/DisableAuthProviderModal.vue +1 -0
  44. package/components/DotState.vue +84 -0
  45. package/components/ExplorerMembers.vue +1 -1
  46. package/components/ExplorerProjectsNamespaces.vue +88 -16
  47. package/components/FixedBanner.vue +19 -12
  48. package/components/GlobalRoleBindings.vue +5 -1
  49. package/components/GrafanaDashboard.vue +4 -4
  50. package/components/GrowlManager.vue +4 -1
  51. package/components/HardwareResourceGauge.vue +39 -3
  52. package/components/InfoBox.vue +3 -3
  53. package/components/InputOrDisplay.vue +28 -2
  54. package/components/LabelValue.vue +20 -1
  55. package/components/LandingPagePreference.vue +5 -3
  56. package/components/LocaleSelector.vue +39 -93
  57. package/components/ModalManager.vue +55 -0
  58. package/components/ModalWithCard.vue +13 -3
  59. package/components/MoveModal.vue +1 -0
  60. package/components/PodSecurityAdmission.vue +1 -1
  61. package/components/PromptChangePassword.vue +1 -1
  62. package/components/PromptModal.vue +16 -3
  63. package/components/PromptRemove.vue +29 -9
  64. package/components/PromptRestore.vue +1 -0
  65. package/components/ResourceCancelModal.vue +1 -0
  66. package/components/ResourceDetail/Masthead.vue +52 -17
  67. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  68. package/components/ResourceDetail/index.vue +54 -16
  69. package/components/ResourceList/Masthead.vue +26 -4
  70. package/components/ResourceList/index.vue +4 -3
  71. package/components/ResourceTable.vue +1 -0
  72. package/components/SideNav.vue +20 -15
  73. package/components/SlideInPanelManager.vue +126 -0
  74. package/components/SortableTable/THead.vue +10 -4
  75. package/components/SortableTable/actions.js +1 -1
  76. package/components/SortableTable/index.vue +542 -553
  77. package/components/SortableTable/selection.js +2 -13
  78. package/components/StatusBadge.vue +77 -0
  79. package/components/Tabbed/Tab.vue +3 -3
  80. package/components/Tabbed/index.vue +47 -29
  81. package/components/Wizard.vue +2 -2
  82. package/components/YamlEditor.vue +1 -1
  83. package/components/__tests__/AsyncButton.test.ts +2 -2
  84. package/components/__tests__/FixedBanner.test.ts +3 -3
  85. package/components/__tests__/ModalManager.spec.ts +176 -0
  86. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  87. package/components/auth/Principal.vue +10 -3
  88. package/components/auth/RoleDetailEdit.vue +1 -1
  89. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  90. package/components/form/ArrayList.vue +123 -85
  91. package/components/form/ArrayListGrouped.vue +10 -2
  92. package/components/form/ArrayListSelect.vue +1 -1
  93. package/components/form/Command.vue +6 -15
  94. package/components/form/EnvVars.vue +16 -8
  95. package/components/form/Footer.vue +10 -7
  96. package/components/form/HealthCheck.vue +3 -3
  97. package/components/form/HookOption.vue +11 -16
  98. package/components/form/InputWithSelect.vue +6 -5
  99. package/components/form/KeyValue.vue +39 -10
  100. package/components/form/LabeledSelect.vue +73 -77
  101. package/components/form/Labels.vue +6 -3
  102. package/components/form/LifecycleHooks.vue +3 -3
  103. package/components/form/MatchExpressions.vue +42 -17
  104. package/components/form/NameNsDescription.vue +163 -116
  105. package/components/form/Networking.vue +20 -12
  106. package/components/form/NodeAffinity.vue +31 -23
  107. package/components/form/NodeScheduling.vue +13 -3
  108. package/components/form/Password.vue +11 -5
  109. package/components/form/PodAffinity.vue +47 -48
  110. package/components/form/Probe.vue +68 -66
  111. package/components/form/ResourceQuota/Namespace.vue +4 -4
  112. package/components/form/ResourceQuota/NamespaceRow.vue +5 -7
  113. package/components/form/ResourceQuota/Project.vue +9 -5
  114. package/components/form/ResourceQuota/ProjectRow.vue +4 -6
  115. package/components/form/ResourceSelector.vue +7 -9
  116. package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
  117. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
  118. package/components/form/SSHKnownHosts/index.vue +16 -2
  119. package/components/form/Security.vue +54 -56
  120. package/components/form/Select.vue +44 -7
  121. package/components/form/ShellInput.vue +5 -1
  122. package/components/form/SimpleSecretSelector.vue +29 -9
  123. package/components/form/Tolerations.vue +5 -1
  124. package/components/form/UnitInput.vue +10 -5
  125. package/components/form/ValueFromResource.vue +134 -121
  126. package/components/form/WorkloadPorts.vue +18 -18
  127. package/components/form/__tests__/ArrayList.test.ts +5 -2
  128. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  129. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  130. package/components/form/__tests__/Probe.test.ts +12 -8
  131. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
  132. package/components/form/__tests__/Select.test.ts +37 -0
  133. package/components/form/__tests__/UnitInput.test.ts +4 -5
  134. package/components/formatter/BadgeStateFormatter.vue +8 -5
  135. package/components/formatter/InternalExternalIP.vue +2 -0
  136. package/components/formatter/LiveDate.vue +3 -3
  137. package/components/formatter/SecretData.vue +20 -7
  138. package/components/nav/Favorite.vue +5 -1
  139. package/components/nav/Group.vue +18 -4
  140. package/components/nav/Header.vue +39 -13
  141. package/components/nav/Jump.vue +7 -0
  142. package/components/nav/NamespaceFilter.vue +21 -11
  143. package/components/nav/Pinned.vue +1 -1
  144. package/components/nav/TopLevelMenu.vue +5 -17
  145. package/components/nav/Type.vue +30 -33
  146. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
  147. package/components/rancherResourceDetail/Masthead.vue +769 -0
  148. package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
  149. package/components/rancherResourceDetail/index.vue +591 -0
  150. package/components/rancherResourceList/Masthead-btn.vue +225 -0
  151. package/components/rancherResourceList/Masthead.vue +375 -0
  152. package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
  153. package/components/rancherResourceList/index.vue +307 -0
  154. package/components/rancherResourceList/resource-list.config.js +7 -0
  155. package/components/rancherResourceTable.vue +783 -0
  156. package/components/rancherSortableTable/THead.vue +561 -0
  157. package/components/rancherSortableTable/actions.js +153 -0
  158. package/components/rancherSortableTable/advanced-filtering.js +272 -0
  159. package/components/rancherSortableTable/debug.js +117 -0
  160. package/components/rancherSortableTable/filtering.js +290 -0
  161. package/components/rancherSortableTable/grouping.js +48 -0
  162. package/components/rancherSortableTable/index.vue +2712 -0
  163. package/components/rancherSortableTable/paging.js +155 -0
  164. package/components/rancherSortableTable/selection.js +629 -0
  165. package/components/rancherSortableTable/sortable-config.ts +4 -0
  166. package/components/rancherSortableTable/sorting.js +129 -0
  167. package/components/templates/blank.vue +4 -1
  168. package/components/templates/default.vue +8 -0
  169. package/components/templates/home.vue +10 -1
  170. package/components/templates/plain.vue +10 -1
  171. package/composables/focusTrap.ts +11 -3
  172. package/composables/useRuntimeFlag.ts +29 -0
  173. package/config/private-label.js +15 -10
  174. package/config/router/routes.js +21 -13
  175. package/config/store.js +4 -0
  176. package/config/table-headers.js +3 -2
  177. package/config/uiplugins.js +5 -1
  178. package/core/plugin-routes.ts +5 -115
  179. package/core/plugins.js +1 -1
  180. package/core/types.ts +23 -2
  181. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +84 -23
  182. package/detail/autoscaling.horizontalpodautoscaler/index.vue +13 -3
  183. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  184. package/dialog/AddCustomBadgeDialog.vue +1 -0
  185. package/dialog/DeactivateDriverDialog.vue +5 -4
  186. package/dialog/ForceMachineRemoveDialog.vue +6 -3
  187. package/dialog/GitRepoForceUpdateDialog.vue +1 -1
  188. package/dialog/ScalePoolDownDialog.vue +2 -2
  189. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  190. package/edit/auth/__tests__/oidc.test.ts +162 -88
  191. package/edit/auth/azuread.vue +2 -1
  192. package/edit/auth/github.vue +1 -1
  193. package/edit/auth/googleoauth.vue +5 -1
  194. package/edit/auth/ldap/__tests__/config.test.ts +0 -14
  195. package/edit/auth/ldap/config.vue +0 -24
  196. package/edit/auth/ldap/index.vue +1 -1
  197. package/edit/auth/oidc.vue +39 -6
  198. package/edit/auth/saml.vue +1 -1
  199. package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +5 -2
  200. package/edit/cloudcredential.vue +24 -9
  201. package/edit/fleet.cattle.io.clustergroup.vue +5 -3
  202. package/edit/fleet.cattle.io.gitrepo.vue +2 -0
  203. package/edit/logging-flow/Match.vue +1 -1
  204. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  205. package/edit/management.cattle.io.user.vue +28 -3
  206. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
  207. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
  208. package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
  209. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
  210. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
  211. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
  212. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
  213. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
  214. package/edit/monitoring.coreos.com.receiver/auth.vue +29 -29
  215. package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
  216. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
  217. package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
  218. package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
  219. package/edit/namespace.vue +1 -2
  220. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  221. package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
  222. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  223. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  224. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  225. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  226. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -10
  227. package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -40
  228. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +5 -2
  229. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  230. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  231. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +3 -3
  232. package/edit/service.vue +0 -3
  233. package/edit/token.vue +32 -11
  234. package/edit/workload/Job.vue +6 -6
  235. package/edit/workload/__tests__/Job.test.ts +0 -1
  236. package/edit/workload/index.vue +1 -0
  237. package/edit/workload/mixins/workload.js +3 -3
  238. package/initialize/install-plugins.js +2 -1
  239. package/list/harvesterhci.io.management.cluster.vue +4 -1
  240. package/list/management.cattle.io.feature.vue +1 -0
  241. package/list/namespace.vue +3 -1
  242. package/list/provisioning.cattle.io.cluster.vue +20 -12
  243. package/list/workload.vue +7 -6
  244. package/machine-config/__tests__/vmwarevsphere.test.ts +48 -3
  245. package/machine-config/azure.vue +16 -4
  246. package/machine-config/vmwarevsphere.vue +16 -0
  247. package/mixins/resource-fetch.js +2 -1
  248. package/models/__tests__/logging.banzaicloud.io.flow.test.ts +88 -0
  249. package/models/__tests__/namespace.test.ts +25 -1
  250. package/models/cloudcredential.js +5 -0
  251. package/models/kontainerdriver.js +6 -3
  252. package/models/logging.banzaicloud.io.flow.js +2 -1
  253. package/models/management.cattle.io.node.js +3 -3
  254. package/models/management.cattle.io.setting.js +2 -1
  255. package/models/namespace.js +4 -5
  256. package/models/nodedriver.js +6 -3
  257. package/models/storage.k8s.io.storageclass.js +2 -2
  258. package/models/workload.js +4 -1
  259. package/package.json +1 -1
  260. package/pages/about.vue +16 -8
  261. package/pages/account/index.vue +80 -24
  262. package/pages/account/pri.vue +229 -0
  263. package/pages/auth/login.vue +195 -44
  264. package/pages/auth/logout.vue +4 -1
  265. package/pages/auth/setup.vue +144 -19
  266. package/pages/auth/verify.vue +13 -8
  267. package/pages/auth copy/login.vue +595 -0
  268. package/pages/auth copy/logout.vue +47 -0
  269. package/pages/auth copy/setup.vue +523 -0
  270. package/pages/auth copy/verify.vue +203 -0
  271. package/pages/c/_cluster/_product/namespaces.vue +5 -5
  272. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  273. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  274. package/pages/c/_cluster/auth/config/index.vue +10 -12
  275. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  276. package/pages/c/_cluster/explorer/index.vue +17 -15
  277. package/pages/c/_cluster/istio/index.vue +2 -2
  278. package/pages/c/_cluster/longhorn/index.vue +1 -1
  279. package/pages/c/_cluster/monitoring/index.vue +1 -1
  280. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  281. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  282. package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
  283. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  284. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  285. package/pages/c/_cluster/neuvector/index.vue +1 -1
  286. package/pages/c/_cluster/settings/brand.vue +3 -3
  287. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  288. package/pages/diagnostic.vue +59 -11
  289. package/pages/fail-whale.vue +14 -8
  290. package/pages/home.vue +24 -18
  291. package/pages/prefs.vue +9 -7
  292. package/pages/support/index.vue +4 -1
  293. package/pkg/tsconfig.json +9 -9
  294. package/pkg/vue.config.js +1 -1
  295. package/plugins/dashboard-store/normalize.js +3 -1
  296. package/plugins/dashboard-store/resource-class.js +31 -29
  297. package/plugins/internal-api/index.ts +37 -0
  298. package/plugins/internal-api/shared/base-api.ts +13 -0
  299. package/plugins/internal-api/shell/shell.api.ts +108 -0
  300. package/promptRemove/management.cattle.io.fleetworkspace.vue +1 -1
  301. package/promptRemove/management.cattle.io.globalrole.vue +1 -1
  302. package/promptRemove/management.cattle.io.project.vue +2 -2
  303. package/promptRemove/management.cattle.io.roletemplate.vue +1 -1
  304. package/promptRemove/pod.vue +1 -1
  305. package/public/index.html +2 -1
  306. package/rancher-components/BadgeState/BadgeState.vue +5 -1
  307. package/rancher-components/Banner/Banner.vue +8 -2
  308. package/rancher-components/Card/Card.vue +3 -6
  309. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
  310. package/rancher-components/Form/LabeledInput/LabeledInput.vue +5 -2
  311. package/rancher-components/Form/Radio/RadioButton.vue +3 -3
  312. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -5
  313. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  314. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
  315. package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -3
  316. package/rancher-components/RcDropdown/types.ts +1 -0
  317. package/scripts/clean +0 -0
  318. package/scripts/extension/bundle +20 -0
  319. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +2 -2
  320. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  321. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  322. package/scripts/extension/helm/scripts/package +0 -0
  323. package/scripts/extension/helm/scripts/patch +0 -0
  324. package/scripts/extension/helm/scripts/version +0 -0
  325. package/scripts/extension/helmpatch +44 -31
  326. package/scripts/extension/parse-tag-name +0 -0
  327. package/scripts/extension/publish +12 -12
  328. package/scripts/publish-shell.sh +18 -23
  329. package/scripts/serve-pkgs +0 -0
  330. package/scripts/sync-shell-deps +0 -0
  331. package/scripts/test-plugins-build.sh +4 -6
  332. package/scripts/typegen.sh +28 -46
  333. package/server/har-file.js +25 -3
  334. package/static/favicon.ico +0 -0
  335. package/static/favicon.png +0 -0
  336. package/static/loading-indicator.html +2 -2
  337. package/store/aws.js +9 -2
  338. package/store/features.js +2 -1
  339. package/store/i18n.js +3 -3
  340. package/store/modal.ts +71 -0
  341. package/store/slideInPanel.ts +47 -0
  342. package/store/type-map.js +9 -1
  343. package/types/cloud-shell/index.d.ts +11020 -0
  344. package/types/global-vue.d.ts +5 -0
  345. package/types/internal-api/shell/growl.d.ts +25 -0
  346. package/types/internal-api/shell/modal.d.ts +77 -0
  347. package/types/internal-api/shell/slideIn.d.ts +15 -0
  348. package/types/shell/index.d.ts +118 -128
  349. package/types/vue-shim.d.ts +4 -1
  350. package/utils/__tests__/object.test.ts +38 -4
  351. package/utils/__tests__/string.test.ts +2 -2
  352. package/utils/auth.js +1 -0
  353. package/utils/banners.js +0 -45
  354. package/utils/cluster.js +35 -0
  355. package/utils/color.js +9 -8
  356. package/utils/error.js +61 -3
  357. package/utils/errorTranslate.json +450 -30
  358. package/utils/object.js +46 -6
  359. package/utils/router.js +22 -1
  360. package/utils/select.js +26 -3
  361. package/utils/string.js +9 -8
  362. package/utils/title.ts +1 -1
  363. package/utils/validators/machine-pool.ts +20 -0
  364. package/vue.config.js +7 -2
  365. package/components/formatter/ExtensionCache.vue +0 -74
  366. package/components/formatter/Port.vue +0 -24
  367. package/components/formatter/SecretType.vue +0 -41
  368. package/types/resources/fleet.d.ts +0 -57
  369. package/types/resources/pod-security-admission.ts +0 -36
  370. package/types/resources/settings.d.ts +0 -93
  371. package/types/resources/userPreferences.d.ts +0 -13
  372. package/types/vue-shim.d +0 -20
@@ -0,0 +1,140 @@
1
+ <script>
2
+ import { COUNT } from '@shell/config/types';
3
+
4
+ /**
5
+ * Loading Indicator for resources - used when we are loading resources incrementally, by page
6
+ */
7
+ export default {
8
+
9
+ name: 'ResourceLoadingIndicator',
10
+
11
+ props: {
12
+ resources: {
13
+ type: Array,
14
+ required: true,
15
+ },
16
+ indeterminate: {
17
+ type: Boolean,
18
+ default: false,
19
+ },
20
+ },
21
+
22
+ data() {
23
+ const inStore = this.$store.getters['currentStore'](this.resource);
24
+
25
+ return { inStore };
26
+ },
27
+
28
+ computed: {
29
+ // Count of rows - either from the data provided or from the rows for the first resource
30
+ rowsCount() {
31
+ if (this.resources.length > 0) {
32
+ const existingData = this.$store.getters[`${ this.inStore }/all`](this.resources[0]) || [];
33
+
34
+ return (existingData || []).length;
35
+ }
36
+
37
+ return 0;
38
+ },
39
+
40
+ // Have we loaded all resources for the types that are needed
41
+ haveAll() {
42
+ return this.resources.reduce((acc, r) => {
43
+ return acc && this.$store.getters[`${ this.inStore }/haveAll`](r);
44
+ }, true);
45
+ },
46
+
47
+ // Total of all counts of all resources for all of the resources being loaded
48
+ total() {
49
+ const clusterCounts = this.$store.getters[`${ this.inStore }/all`](COUNT);
50
+
51
+ return this.resources.reduce((acc, r) => {
52
+ const resourceCounts = clusterCounts?.[0]?.counts?.[r];
53
+ const resourceCount = resourceCounts?.summary?.count;
54
+ const count = resourceCount || 0;
55
+
56
+ return acc + count;
57
+ }, 0);
58
+ },
59
+
60
+ // Total count of all of the resources for all of the resources being loaded
61
+ count() {
62
+ return this.resources.reduce((acc, r) => {
63
+ return acc + (this.$store.getters[`${ this.inStore }/all`](r) || []).length;
64
+ }, 0);
65
+ },
66
+
67
+ // Width style to enable the progress bar style presentation
68
+ width() {
69
+ const progress = Math.ceil(100 * (this.count / this.total));
70
+
71
+ return `${ progress }%`;
72
+ }
73
+ },
74
+ };
75
+ </script>
76
+
77
+ <template>
78
+ <div
79
+ v-if="count && !haveAll"
80
+ class="resource-loading-indicator"
81
+ >
82
+ <div class="inner">
83
+ <div class="resource-loader">
84
+ <div class="rl-bg">
85
+ <i class="icon icon-spinner icon-spin" /><span>{{ t( 'resourceLoadingIndicator.loading' ) }} <span v-if="!indeterminate">{{ count }} / {{ total }}</span></span>
86
+ </div>
87
+ </div>
88
+ <div
89
+ class="resource-loader"
90
+ :style="{width}"
91
+ >
92
+ <div class="rl-fg">
93
+ <i class="icon icon-spinner icon-spin" /><span>{{ t( 'resourceLoadingIndicator.loading' ) }} <span v-if="!indeterminate">{{ count }} / {{ total }}</span></span>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </template>
99
+
100
+ <style lang="scss" scoped>
101
+ .resource-loading-indicator {
102
+ border: 1px solid var(--link);
103
+ border-radius: 10px;
104
+ position: relative;
105
+ width: min-content;
106
+ overflow: hidden;
107
+
108
+ .resource-loader:last-child {
109
+ position: absolute;
110
+ top: 0;
111
+
112
+ background-color: var(--link);
113
+ color: var(--link-text);
114
+ overflow: hidden;
115
+ white-space: nowrap;
116
+ }
117
+
118
+ .resource-loader {
119
+ padding: 1px 10px;
120
+ width: max-content;
121
+ height: 20px;
122
+
123
+ .rl-fg, .rl-bg {
124
+ display: flex;
125
+ align-content: center;
126
+ font-size: 12px;
127
+
128
+ > i {
129
+ font-size: 18px;
130
+ line-height: 18px;
131
+ }
132
+
133
+ > span {
134
+ margin-top: 2px;
135
+ margin-left: 5px;
136
+ }
137
+ }
138
+ }
139
+ }
140
+ </style>
@@ -0,0 +1,307 @@
1
+ <script>
2
+ import ResourceTable from '@shell/components/ResourceTable';
3
+ import Loading from '@shell/components/Loading';
4
+ import Masthead from './Masthead';
5
+ import ResourceLoadingIndicator from './ResourceLoadingIndicator';
6
+ import ResourceFetch from '@shell/mixins/resource-fetch';
7
+ import IconMessage from '@shell/components/IconMessage.vue';
8
+ import { ResourceListComponentName } from './resource-list.config';
9
+ import { PanelLocation, ExtensionPoint } from '@shell/core/types';
10
+ import ExtensionPanel from '@shell/components/ExtensionPanel';
11
+ import { sameContents } from '@shell/utils/array';
12
+ import { cloud2harvesterhci } from '@shell/utils/router'
13
+
14
+ export default {
15
+ name: ResourceListComponentName,
16
+
17
+ components: {
18
+ Loading,
19
+ ResourceTable,
20
+ Masthead,
21
+ ResourceLoadingIndicator,
22
+ IconMessage,
23
+ ExtensionPanel
24
+ },
25
+ mixins: [ResourceFetch],
26
+
27
+ props: {
28
+ hasAdvancedFiltering: {
29
+ type: Boolean,
30
+ default: false
31
+ },
32
+ advFilterHideLabelsAsCols: {
33
+ type: Boolean,
34
+ default: false
35
+ },
36
+ advFilterPreventFilteringLabels: {
37
+ type: Boolean,
38
+ default: false
39
+ },
40
+ },
41
+
42
+ async fetch() {
43
+ const store = this.$store;
44
+ const resource = cloud2harvesterhci(this.resource);
45
+
46
+ const schema = this.schema;
47
+
48
+ if ( this.hasListComponent ) {
49
+ // If you provide your own list then call its fetch
50
+ const importer = this.listComponent;
51
+
52
+ const component = await importer.__asyncLoader();
53
+
54
+ if ( component?.typeDisplay ) {
55
+ this.customTypeDisplay = component.typeDisplay.apply(this);
56
+ }
57
+
58
+ // Is the custom component responsible fetching the resources?
59
+ // - Component has a fetch method - legacy method. fetch will handle the requests
60
+ // - Component contains the PaginatedResourceTable component - go forward method. PaginatedResourceTable owns fetching the resources
61
+ if ( component?.fetch || component?.components?.['PaginatedResourceTable']) {
62
+ this.componentWillFetch = true;
63
+ }
64
+
65
+ // If the custom component supports it, ask it what resources it loads, so we can
66
+ // use the incremental loading indicator when enabled
67
+ if (component?.$loadingResources) {
68
+ const { loadResources, loadIndeterminate } = component?.$loadingResources(this.$route, this.$store);
69
+
70
+ this.loadResources = loadResources || [resource];
71
+ this.loadIndeterminate = loadIndeterminate || false;
72
+ }
73
+ }
74
+
75
+ if ( !this.componentWillFetch ) {
76
+ if ( !schema ) {
77
+ store.dispatch('loadingError', new Error(this.t('nav.failWhale.resourceListNotFound', { resource }, true)));
78
+
79
+ return;
80
+ }
81
+
82
+ // See comment for `namespaceFilter` and `pagination` watchers, skip fetch if we're not ready yet... and something is going to call fetch later on
83
+ if (!this.namespaceFilterRequired && (!this.canPaginate || this.refreshFlag)) {
84
+ await this.$fetchType(resource);
85
+ }
86
+ }
87
+ },
88
+
89
+ data() {
90
+ const getters = this.$store.getters;
91
+ const params = { ...this.$route.params };
92
+ const resource = cloud2harvesterhci(params.resource);
93
+
94
+ const hasListComponent = getters['type-map/hasCustomList'](resource);
95
+
96
+ const inStore = getters['currentStore'](resource);
97
+ const schema = getters[`${ inStore }/schemaFor`](resource);
98
+
99
+ const showMasthead = getters[`type-map/optionsFor`](resource).showListMasthead;
100
+
101
+ return {
102
+ schema,
103
+ hasListComponent,
104
+ showMasthead: showMasthead === undefined ? true : showMasthead,
105
+ resource,
106
+ extensionType: ExtensionPoint.PANEL,
107
+ extensionLocation: PanelLocation.RESOURCE_LIST,
108
+ loadResources: [resource], // List of resources that will be loaded, this could be many (`Workloads`)
109
+ /**
110
+ * Will the custom component handle the fetch of resources....
111
+ * or will this instance fetch resources
112
+ */
113
+ componentWillFetch: false,
114
+ // manual refresh
115
+ manualRefreshInit: false,
116
+ watch: false,
117
+ force: false,
118
+ // Provided by fetch later
119
+ customTypeDisplay: null,
120
+ // incremental loading
121
+ loadIndeterminate: false,
122
+ // query param for simple filtering
123
+ useQueryParamsForSimpleFiltering: true,
124
+ };
125
+ },
126
+
127
+ computed: {
128
+ headers() {
129
+ if ( this.hasListComponent || !this.schema ) {
130
+ // Custom lists figure out their own headers
131
+ return [];
132
+ }
133
+
134
+ return this.$store.getters['type-map/headersFor'](this.schema, this.canPaginate);
135
+ },
136
+
137
+ groupBy() {
138
+ return this.$store.getters['type-map/groupByFor'](this.schema);
139
+ },
140
+
141
+ showIncrementalLoadingIndicator() {
142
+ return this.perfConfig?.incrementalLoading?.enabled;
143
+ },
144
+
145
+ },
146
+
147
+ watch: {
148
+
149
+ /**
150
+ * When a NS filter is required and the user selects a different one, kick off a new set of API requests
151
+ *
152
+ * ResourceList has two modes
153
+ * 1) ResourceList component handles API request to fetch resources
154
+ * 2) Custom list component handles API request to fetch resources
155
+ *
156
+ * This covers case 1
157
+ */
158
+ namespaceFilter(neu, old) {
159
+ if (neu && !this.componentWillFetch) {
160
+ if (sameContents(neu, old)) {
161
+ return;
162
+ }
163
+
164
+ this.$fetchType(this.resource);
165
+ }
166
+ },
167
+
168
+ /**
169
+ * When a pagination is required and the user changes page / sort / filter, kick off a new set of API requests
170
+ *
171
+ * ResourceList has two modes
172
+ * 1) ResourceList component handles API request to fetch resources
173
+ * 2) Custom list component handles API request to fetch resources
174
+ *
175
+ * This covers case 1
176
+ */
177
+ pagination(neu, old) {
178
+ if (neu && !this.componentWillFetch && !this.paginationEqual(neu, old)) {
179
+ this.$fetchType(this.resource);
180
+ }
181
+ },
182
+
183
+ /**
184
+ * Monitor the rows to ensure deleting the last entry in a server-side paginated page doesn't
185
+ * result in an empty page
186
+ */
187
+ rows(neu) {
188
+ if (!this.pagination) {
189
+ return;
190
+ }
191
+
192
+ if (this.pagination.page > 1 && neu.length === 0) {
193
+ this.setPagination({
194
+ ...this.pagination,
195
+ page: this.pagination.page - 1
196
+ });
197
+ }
198
+ },
199
+ },
200
+
201
+ created() {
202
+ let listComponent = false;
203
+
204
+ const resource = cloud2harvesterhci(this.$route.params.resource);
205
+ const hasListComponent = this.$store.getters['type-map/hasCustomList'](resource);
206
+
207
+ if ( hasListComponent ) {
208
+ listComponent = this.$store.getters['type-map/importList'](resource);
209
+ }
210
+
211
+ this.listComponent = listComponent;
212
+ },
213
+ };
214
+ </script>
215
+
216
+ <template>
217
+ <IconMessage
218
+ v-if="namespaceFilterRequired"
219
+ :vertical="true"
220
+ :subtle="false"
221
+ icon="icon-filter_alt"
222
+ >
223
+ <template #message>
224
+ {{ t('resourceList.nsFiltering') }}
225
+ </template>
226
+ </IconMessage>
227
+ <IconMessage
228
+ v-else-if="paginationNsFilterRequired"
229
+ :vertical="true"
230
+ :subtle="false"
231
+ icon="icon-filter_alt"
232
+ >
233
+ <template #message>
234
+ {{ t('resourceList.nsFilteringGeneric') }}
235
+ </template>
236
+ </IconMessage>
237
+ <div
238
+ v-else
239
+ class="outlet"
240
+ >
241
+ <Masthead
242
+ v-if="showMasthead"
243
+ :type-display="customTypeDisplay"
244
+ :schema="schema"
245
+ :resource="resource"
246
+ :show-incremental-loading-indicator="showIncrementalLoadingIndicator"
247
+ :load-resources="loadResources"
248
+ :load-indeterminate="loadIndeterminate"
249
+ >
250
+ <template #extraActions>
251
+ <slot name="extraActions" />
252
+ </template>
253
+ </Masthead>
254
+ <!-- Extensions area -->
255
+ <ExtensionPanel
256
+ :resource="{}"
257
+ :type="extensionType"
258
+ :location="extensionLocation"
259
+ />
260
+
261
+ <div
262
+ v-if="hasListComponent"
263
+ >
264
+ <component
265
+ :is="listComponent"
266
+ :incremental-loading-indicator="showIncrementalLoadingIndicator"
267
+ :rows="rows"
268
+ v-bind="$data"
269
+ />
270
+ </div>
271
+ <ResourceTable
272
+ v-else
273
+ :schema="schema"
274
+ :rows="rows"
275
+ :alt-loading="canPaginate && !isFirstLoad"
276
+ :loading="loading"
277
+ :headers="headers"
278
+ :group-by="groupBy"
279
+ :has-advanced-filtering="hasAdvancedFiltering"
280
+ :adv-filter-hide-labels-as-cols="advFilterHideLabelsAsCols"
281
+ :adv-filter-prevent-filtering-labels="advFilterPreventFilteringLabels"
282
+ :use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
283
+ :force-update-live-and-delayed="forceUpdateLiveAndDelayed"
284
+ :external-pagination-enabled="canPaginate"
285
+ :external-pagination-result="paginationResult"
286
+ @pagination-changed="paginationChanged"
287
+ />
288
+ </div>
289
+ </template>
290
+
291
+ <style lang="scss" scoped>
292
+ .header {
293
+ position: relative;
294
+ }
295
+ H2 {
296
+ position: relative;
297
+ margin: 0 0 20px 0;
298
+ }
299
+ .filter{
300
+ line-height: 45px;
301
+ }
302
+ .right-action {
303
+ position: absolute;
304
+ top: 10px;
305
+ right: 10px;
306
+ }
307
+ </style>
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Component name of the `ResourceList`
3
+ *
4
+ * This needs to be a in separate file to avoid circular dependency of
5
+ * index.vue --> resource-fetch mixin --> resource-fetch-namespaced mixin --> index.vue
6
+ */
7
+ export const ResourceListComponentName = 'ResourceList';