dashboard-shell-shell 1.0.122 → 1.0.1000000081

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 +89 -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 +9 -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 +540 -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 +2 -1
  343. package/types/cloud-shell/index.d.ts +11014 -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
@@ -10,7 +10,7 @@ export const NONE = 'none';
10
10
 
11
11
  export default {
12
12
  mounted() {
13
- const table = this.$el.querySelector('TABLE');
13
+ const table = this.$el && this.$el.querySelector('TABLE');
14
14
 
15
15
  this._onRowClickBound = this.onRowClick.bind(this);
16
16
  this._onRowMousedownBound = this.onRowMousedown.bind(this);
@@ -22,7 +22,7 @@ export default {
22
22
  },
23
23
 
24
24
  beforeUnmount() {
25
- const table = this.$el.querySelector('TABLE');
25
+ const table = this.$el && this.$el.querySelector('TABLE');
26
26
 
27
27
  table.removeEventListener('click', this._onRowClickBound);
28
28
  table.removeEventListener('mousedown', this._onRowMousedownBound);
@@ -340,17 +340,6 @@ export default {
340
340
  if ( !isSelected ) {
341
341
  this.update([node], this.selectedRows.slice());
342
342
  }
343
-
344
- let resources = this.selectedRows;
345
-
346
- if ( this.mangleActionResources ) {
347
- resources = await this.mangleActionResources(resources);
348
- }
349
-
350
- this.$store.commit(`action-menu/show`, {
351
- resources,
352
- event: e,
353
- });
354
343
  },
355
344
 
356
345
  keySelectRow(row, more = false) {
@@ -0,0 +1,77 @@
1
+ <script setup lang="ts">
2
+
3
+ const STATUS = {
4
+ success: {
5
+ color: 'text-success',
6
+ icon: 'icon-checkmark'
7
+ },
8
+ warning: {
9
+ color: 'text-warning',
10
+ icon: 'icon-warning'
11
+ },
12
+ info: {
13
+ color: 'text-info',
14
+ icon: 'icon-info'
15
+ },
16
+ error: {
17
+ color: 'text-error',
18
+ icon: 'icon-error'
19
+ }
20
+ };
21
+
22
+ withDefaults(
23
+ defineProps<{
24
+ status?: 'success' | 'warning' | 'info' | 'error',
25
+ label?: string
26
+ }>(),
27
+ {
28
+ status: 'success',
29
+ label: '',
30
+ }
31
+ );
32
+
33
+ </script>
34
+ <template>
35
+ <div
36
+ class="status-badge"
37
+ >
38
+ <i
39
+ class="status-badge__icon icon"
40
+ :class="{
41
+ [STATUS[status].icon]: true,
42
+ [STATUS[status].color]: true
43
+ }"
44
+ />
45
+ <div
46
+ v-if="label"
47
+ class="status-badge__label"
48
+ >
49
+ {{ label }}
50
+ </div>
51
+ </div>
52
+ </template>
53
+
54
+ <style lang="scss" scoped>
55
+ .status-badge {
56
+ align-items: center;
57
+ display: inline-flex;
58
+ border: 1px solid;
59
+ border-color: var(--border);
60
+ margin-top: 20px;
61
+
62
+ & + & {
63
+ margin-left: 20px;
64
+ }
65
+
66
+ &__label {
67
+ border-left: 1px solid var(--border);
68
+ padding: 5px 20px;
69
+ color: var(--body-text);
70
+ }
71
+
72
+ &__icon {
73
+ text-align: center;
74
+ padding: 5px 10px;
75
+ }
76
+ }
77
+ </style>
@@ -100,14 +100,14 @@ export default {
100
100
  v-if="shouldShowHeader"
101
101
  class="tab-header"
102
102
  >
103
- <h2>
103
+ <!-- <h2>
104
104
  {{ labelDisplay }}
105
105
  <i
106
106
  v-if="tooltip"
107
107
  v-clean-tooltip="tooltip"
108
108
  class="icon icon-info icon-lg"
109
109
  />
110
- </h2>
110
+ </h2> -->
111
111
  <slot name="tab-header-right" />
112
112
  </div>
113
113
  <slot v-bind="{active}" />
@@ -118,7 +118,7 @@ export default {
118
118
  .tab-header {
119
119
  display: flex;
120
120
  justify-content: space-between;
121
- margin-bottom: 15px;
121
+ /* margin-bottom: 15px; */
122
122
  align-items: center;
123
123
 
124
124
  h2 {
@@ -273,15 +273,15 @@ export default {
273
273
  :data-testid="tab.name"
274
274
  :class="{tab: true, active: tab.active, disabled: tab.disabled, error: (tab.error)}"
275
275
  role="presentation"
276
+ @click.prevent="select(tab.name, $event)"
277
+ @keyup.enter.space="select(tab.name, $event)"
276
278
  >
277
279
  <a
278
280
  :data-testid="`btn-${tab.name}`"
279
281
  :aria-controls="'#' + tab.name"
280
282
  :aria-selected="tab.active"
281
283
  :aria-label="tab.labelDisplay || ''"
282
- role="tab"
283
- @click.prevent="select(tab.name, $event)"
284
- @keyup.enter.space="select(tab.name, $event)"
284
+ role="tab"
285
285
  >
286
286
  <span>{{ tab.labelDisplay }}</span>
287
287
  <span
@@ -367,15 +367,6 @@ export default {
367
367
  margin: 0;
368
368
  padding: 0;
369
369
 
370
- &:focus-visible {
371
- outline: none;
372
-
373
- .tab.active {
374
- @include focus-outline;
375
- outline-offset: -2px;
376
- }
377
- }
378
-
379
370
  &.horizontal {
380
371
  border: solid thin var(--border);
381
372
  border-bottom: 0;
@@ -391,8 +382,12 @@ export default {
391
382
  }
392
383
  }
393
384
 
394
- &:focus .tab.active a span {
395
- text-decoration: underline;
385
+ &:focus {
386
+ outline: none;
387
+
388
+ & .tab.active a span {
389
+ text-decoration: none;
390
+ }
396
391
  }
397
392
 
398
393
  .tab {
@@ -409,7 +404,7 @@ export default {
409
404
  &:hover {
410
405
  text-decoration: none;
411
406
  span {
412
- text-decoration: underline;
407
+ text-decoration: none;
413
408
  }
414
409
  }
415
410
  }
@@ -479,45 +474,68 @@ export default {
479
474
 
480
475
  .side-tabs {
481
476
  display: flex;
482
- box-shadow: 0 0 20px var(--shadow);
477
+ flex-direction: column;
478
+ /* box-shadow: 0 0 20px var(--shadow);
483
479
  border-radius: calc(var(--border-radius) * 2);
484
- background-color: var(--tabbed-sidebar-bg);
485
-
480
+ background-color: var(--tabbed-sidebar-bg); */
481
+ margin: 0px -20px;
486
482
  .tab-container {
487
483
  padding: 20px;
488
484
  }
489
485
 
490
486
  & .tabs {
491
- width: $sideways-tabs-width;
492
- min-width: $sideways-tabs-width;
487
+ /* width: $sideways-tabs-width; */
488
+ /* min-width: $sideways-tabs-width; */
493
489
  display: flex;
494
- flex: 1 0;
495
- flex-direction: column;
490
+ border-bottom:1px solid #d7d7d7;
491
+ padding: 0 0 0 20px;
492
+ /* flex: 1 0; */
493
+ /* flex-direction: column; */
496
494
 
497
495
  // &.vertical {
498
496
  // .tab.active {
499
497
  // background-color: var(--tabbed-container-bg);
500
498
  // }
501
499
  // }
502
-
503
500
  & .tab {
504
- width: 100%;
505
- border-left: solid 5px transparent;
501
+ /* width: 100%; */
502
+ min-width: 120px;
503
+ height: 36px;
504
+ /* border-top: solid 5px transparent; */
505
+ display: flex;
506
+ justify-content: center;
507
+ padding: 8px 16px;
508
+ box-sizing: border-box;
509
+ border: 1px solid #d7d7d7;
510
+ border-bottom: 0px;
511
+ margin-right: 5px;
512
+ border-radius: 2px;
506
513
 
507
514
  &.toggle A {
508
515
  color: var(--primary);
516
+ padding: 0px;
509
517
  }
510
518
 
511
519
  A {
512
- color: var(--primary);
520
+ color: var(--input-label);
521
+ padding: 0px;
513
522
  }
514
523
 
515
524
  &.active {
516
525
  background-color: var(--body-bg);
517
- border-left: solid 5px var(--primary);
526
+ border-top: solid 2px var(--primary);
527
+ position: relative;
528
+ &.active::before{
529
+ position: absolute;
530
+ right: 0;
531
+ left: 0;
532
+ top: 34px;
533
+ border-bottom: 1px solid #fff;
534
+ content: '';
518
535
 
536
+ }
519
537
  & A {
520
- color: var(--input-label);
538
+ color: var(--primary);
521
539
  }
522
540
  }
523
541
 
@@ -561,7 +579,7 @@ export default {
561
579
  &
562
580
 
563
581
  .tab-container {
564
- width: calc(100% - #{$sideways-tabs-width});
582
+ /* width: calc(100% - #{$sideways-tabs-width}); */
565
583
  flex-grow: 1;
566
584
  background-color: var(--body-bg);
567
585
  }
@@ -426,7 +426,7 @@ export default {
426
426
  </div>
427
427
  <div
428
428
  id="wizard-footer-controls"
429
- class="controls-row pt-20"
429
+ class="controls-row"
430
430
  >
431
431
  <slot
432
432
  name="cancel"
@@ -674,7 +674,7 @@ $spacer: 10px;
674
674
  // We have to account for the absolute position of the .controls-row
675
675
  .footer-error {
676
676
  margin-top: -40px;
677
- margin-bottom: 70px;
677
+ margin-bottom: calc($footer-height + 10px);
678
678
  }
679
679
 
680
680
  .controls-row {
@@ -235,6 +235,7 @@ export default {
235
235
  >{{ t('generic.split') }}</button>
236
236
  </span>
237
237
  </div>
238
+
238
239
  <CodeMirror
239
240
  v-if="showCodeEditor"
240
241
  ref="cm"
@@ -247,7 +248,6 @@ export default {
247
248
  @onInput="onInput"
248
249
  @onReady="onReady"
249
250
  @onChanges="onChanges"
250
- @validationChanged="$emit('validationChanged', $event)"
251
251
  />
252
252
  <FileDiff
253
253
  v-else
@@ -42,7 +42,7 @@ describe('component: AsyncButton', () => {
42
42
  expect(span.text()).toBe('some-string');
43
43
  });
44
44
 
45
- it('click on async button should emit click with a proper state of waiting, disabled and spinning ::: CB true', () => {
45
+ it('click on async button should emit click with a proper state of waiting, appear disabled and spinning ::: CB true', () => {
46
46
  jest.useFakeTimers();
47
47
 
48
48
  const wrapper: VueWrapper<InstanceType<typeof AsyncButton>> = mount(AsyncButton, {
@@ -65,7 +65,7 @@ describe('component: AsyncButton', () => {
65
65
  expect(wrapper.emitted('click')).toHaveLength(1);
66
66
  expect(wrapper.vm.phase).toBe(ASYNC_BUTTON_STATES.WAITING);
67
67
  expect(wrapper.vm.isSpinning).toBe(true);
68
- expect(wrapper.vm.isDisabled).toBe(true);
68
+ expect(wrapper.vm.appearsDisabled).toBe(true);
69
69
  // testing cb function has been emitted
70
70
  expect(typeof wrapper.emitted('click')![0][0]).toBe('function');
71
71
 
@@ -40,7 +40,7 @@ describe('component: FixedBanner', () => {
40
40
  expect(wrapper.vm.showHeader).toStrictEqual(true);
41
41
 
42
42
  const bannerElem = wrapper.find('.banner');
43
- const noArrayTextElem = wrapper.find('.banner > p');
43
+ const noArrayTextElem = wrapper.find('.banner .single-row');
44
44
 
45
45
  expect(bannerElem.exists()).toBe(true);
46
46
  expect(bannerElem.classes()).not.toContain('banner-consent');
@@ -60,7 +60,7 @@ describe('component: FixedBanner', () => {
60
60
  expect(wrapper.vm.showFooter).toStrictEqual(true);
61
61
 
62
62
  const bannerElem = wrapper.find('.banner');
63
- const noArrayTextElem = wrapper.find('.banner > p');
63
+ const noArrayTextElem = wrapper.find('.banner .single-row');
64
64
 
65
65
  expect(bannerElem.exists()).toBe(true);
66
66
  expect(bannerElem.classes()).not.toContain('banner-consent');
@@ -84,7 +84,7 @@ describe('component: FixedBanner', () => {
84
84
  const bannerDialogElem = wrapper.find('.banner-dialog');
85
85
  const bannerDialogFrameElem = wrapper.find('.banner-dialog-frame');
86
86
  const buttonDialog = wrapper.find('.banner-dialog button');
87
- const noArrayTextElem = wrapper.find('.banner > p');
87
+ const noArrayTextElem = wrapper.find('.banner .single-row');
88
88
 
89
89
  expect(bannerElem.exists()).toBe(true);
90
90
  expect(bannerDialogGlassElem.exists()).toBe(true);
@@ -0,0 +1,176 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import { createStore, Store } from 'vuex';
3
+ import { nextTick } from 'vue';
4
+
5
+ import ModalManager from '@shell/components/ModalManager.vue';
6
+
7
+ interface ModalManagerMethods {
8
+ registerBackgroundClosing(fn: Function): void;
9
+ close(): void;
10
+ }
11
+
12
+ const MockComponent = {
13
+ template: '<div data-testid="modal-manager-component">Mock Content</div>',
14
+ props: ['someProp', 'resources', 'registerBackgroundClosing']
15
+ };
16
+
17
+ describe('modalManager.vue with Teleport', () => {
18
+ let store: Store<any>;
19
+ let getters: Record<string, () => any>;
20
+ let modalsDiv: HTMLDivElement;
21
+
22
+ beforeEach(() => {
23
+ // Create the teleport target container
24
+ modalsDiv = document.createElement('div');
25
+ modalsDiv.setAttribute('id', 'modals');
26
+ document.body.appendChild(modalsDiv);
27
+
28
+ getters = {
29
+ 'modal/isOpen': () => true,
30
+ 'modal/component': () => MockComponent,
31
+ 'modal/componentProps': () => ({ someProp: 'testValue' }),
32
+ 'modal/resources': () => ({ data: 'mockData' }),
33
+ 'modal/closeOnClickOutside': () => true,
34
+ 'modal/modalWidth': () => '500px'
35
+ };
36
+
37
+ store = createStore({
38
+ getters,
39
+ mutations: { 'modal/closeModal': jest.fn() }
40
+ });
41
+ });
42
+
43
+ afterEach(() => {
44
+ // Clean up the teleport container after each test
45
+ document.body.removeChild(modalsDiv);
46
+ });
47
+
48
+ const factory = () => {
49
+ return mount(ModalManager, {
50
+ attachTo: document.body, // attach so Teleport can work properly
51
+ global: {
52
+ plugins: [store],
53
+ stubs: {
54
+ AppModal: {
55
+ name: 'AppModal',
56
+ template: `<div data-testid="app-modal" @close="$emit('close')" :style="{ '--prompt-modal-width': width }"><slot /></div>`,
57
+ props: ['clickToClose', 'width']
58
+ }
59
+ }
60
+ }
61
+ });
62
+ };
63
+
64
+ it('renders the AppModal and dynamic component when modal is open', async() => {
65
+ factory();
66
+
67
+ await nextTick();
68
+
69
+ // Because Teleport moves content out of the normal wrapper,
70
+ // we query the document for the teleported elements.
71
+ const appModal = document.querySelector('[data-testid="app-modal"]');
72
+ const dynamicComponent = document.querySelector('[data-testid="modal-manager-component"]');
73
+
74
+ expect(appModal).toBeTruthy();
75
+ expect(dynamicComponent).toBeTruthy();
76
+ expect(appModal?.getAttribute('style')).toContain('--prompt-modal-width: 500px');
77
+
78
+ // We assume the mock component is rendered correctly if its markup is found.
79
+ });
80
+
81
+ it('does not render the AppModal when modal is closed', async() => {
82
+ getters['modal/isOpen'] = () => false;
83
+ store = createStore({
84
+ getters,
85
+ mutations: { 'modal/closeModal': jest.fn() }
86
+ });
87
+ factory();
88
+ await nextTick();
89
+
90
+ const appModal = document.querySelector('[data-testid="app-modal"]');
91
+
92
+ expect(appModal).toBeNull();
93
+ });
94
+
95
+ it('does not render the AppModal when dynamic component is null', async() => {
96
+ getters['modal/component'] = () => null;
97
+ store = createStore({
98
+ getters,
99
+ mutations: { 'modal/closeModal': jest.fn() }
100
+ });
101
+ factory();
102
+ await nextTick();
103
+
104
+ const appModal = document.querySelector('[data-testid="app-modal"]');
105
+
106
+ expect(appModal).toBeNull();
107
+ });
108
+
109
+ it('calls store commit when close is triggered', async() => {
110
+ const closeModalMutation = jest.fn();
111
+
112
+ getters['modal/isOpen'] = () => true;
113
+ store = createStore({
114
+ getters,
115
+ mutations: { 'modal/closeModal': closeModalMutation }
116
+ });
117
+ const wrapper = factory();
118
+
119
+ await nextTick();
120
+
121
+ const appModalWrapper = wrapper.findComponent({ name: 'AppModal' });
122
+
123
+ appModalWrapper.vm.$emit('close');
124
+ await nextTick();
125
+
126
+ expect(closeModalMutation).toHaveBeenCalledWith({}, undefined);
127
+ });
128
+
129
+ it('calls registered background closing function on close', async() => {
130
+ const closeModalMutation = jest.fn();
131
+
132
+ getters['modal/isOpen'] = () => true;
133
+ store = createStore({
134
+ getters,
135
+ mutations: { 'modal/closeModal': closeModalMutation }
136
+ });
137
+ const wrapper = factory();
138
+
139
+ await nextTick();
140
+
141
+ const backgroundFn = jest.fn();
142
+
143
+ (wrapper.vm as unknown as ModalManagerMethods).registerBackgroundClosing(backgroundFn);
144
+ await nextTick();
145
+
146
+ const appModalWrapper = wrapper.findComponent({ name: 'AppModal' });
147
+
148
+ appModalWrapper.vm.$emit('close');
149
+ await nextTick();
150
+
151
+ expect(backgroundFn).toHaveBeenCalledWith();
152
+ expect(closeModalMutation).toHaveBeenCalledWith({}, undefined);
153
+ });
154
+
155
+ it('does nothing if modal is already closed when close is triggered', async() => {
156
+ const closeModalMutation = jest.fn();
157
+
158
+ getters['modal/isOpen'] = () => false;
159
+ store = createStore({
160
+ getters,
161
+ mutations: { 'modal/closeModal': closeModalMutation }
162
+ });
163
+ const wrapper = factory();
164
+
165
+ await nextTick();
166
+
167
+ const modalManager = wrapper.vm as unknown as ModalManagerMethods;
168
+ const spy = jest.spyOn(modalManager, 'close');
169
+
170
+ modalManager.close();
171
+ await nextTick();
172
+
173
+ expect(spy).toHaveBeenCalledWith();
174
+ expect(closeModalMutation).not.toHaveBeenCalled();
175
+ });
176
+ });