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
@@ -44,25 +44,9 @@ export default {
44
44
  },
45
45
 
46
46
  data() {
47
- const rows = clone(this.value || []).map((row) => {
48
- row._showHost = false;
49
- row._serviceType = row._serviceType || '';
50
- row._name = row.name ? `${ row.name }` : `${ row.containerPort }${ row.protocol.toLowerCase() }${ row.hostPort || row._listeningPort || '' }`;
51
- if (row.hostPort || row.hostIP) {
52
- row._showHost = true;
53
- }
54
-
55
- row._ipam = '';
56
-
57
- return row;
58
- });
59
-
60
- // show host port column if existing port data has any host ports defined
61
- const showHostPorts = !!rows.some((row) => !!row.hostPort);
62
-
63
47
  return {
64
- rows,
65
- showHostPorts,
48
+ rows: [],
49
+ showHostPorts: false,
66
50
  workloadPortOptions: ['TCP', 'UDP']
67
51
  };
68
52
  },
@@ -168,6 +152,22 @@ export default {
168
152
  },
169
153
 
170
154
  created() {
155
+ const rows = clone(this.value || []).map((row) => {
156
+ row._showHost = false;
157
+ row._serviceType = row._serviceType || '';
158
+ row._name = row.name ? `${ row.name }` : `${ row.containerPort }${ row.protocol.toLowerCase() }${ row.hostPort || row._listeningPort || '' }`;
159
+ if (row.hostPort || row.hostIP) {
160
+ row._showHost = true;
161
+ }
162
+
163
+ row._ipam = '';
164
+
165
+ return row;
166
+ });
167
+
168
+ this.rows = rows;
169
+ // show host port column if existing port data has any host ports defined
170
+ this.showHostPorts = !!rows.some((row) => !!row.hostPort);
171
171
  this.queueUpdate = debounce(this.update, 500);
172
172
  this.rows.map((row) => {
173
173
  this.setServiceType(row);
@@ -4,6 +4,8 @@ import { _EDIT, _VIEW } from '@shell/config/query-params';
4
4
  import { ExtendedVue, Vue } from 'vue/types/vue';
5
5
  import { DefaultProps } from 'vue/types/options';
6
6
 
7
+ jest.mock('lodash/debounce', () => jest.fn((fn) => fn));
8
+
7
9
  describe('the ArrayList', () => {
8
10
  it('is empty', () => {
9
11
  const wrapper = mount(ArrayList, {
@@ -56,12 +58,13 @@ describe('the ArrayList', () => {
56
58
  });
57
59
 
58
60
  jest.useFakeTimers();
59
- await (wrapper.get('[data-testid="remove-item-1"]').element as HTMLElement).click();
61
+ await (wrapper.get('[data-testid="array-list-remove-item-1"]').element as HTMLElement).click();
60
62
  jest.advanceTimersByTime(50);
61
63
  jest.useRealTimers();
62
64
 
63
- expect(wrapper.find('[data-testid="remove-item-2"]').exists()).toBe(false);
65
+ expect(wrapper.find('[data-testid="array-list-remove-item-2"]').exists()).toBe(false);
64
66
  expect((wrapper.emitted('remove')![0][0] as any).row.value).toStrictEqual('string 1');
67
+ expect(wrapper.vm.rows).toStrictEqual([{ value: 'string 0' }, { value: 'string 2' }]);
65
68
  expect(wrapper.emitted('update:value')![0][0]).toStrictEqual(['string 0', 'string 2']);
66
69
  });
67
70
 
@@ -6,9 +6,9 @@ import { nextTick } from 'vue';
6
6
  describe('component: MatchExpressions', () => {
7
7
  it('should display all the inputs', () => {
8
8
  const wrapper = mount(MatchExpressions, {
9
- props: { mode: _CREATE },
10
- data: () => ({
11
- rules: [
9
+ props: {
10
+ mode: _CREATE,
11
+ value: [
12
12
  {
13
13
  id: '123',
14
14
  key: '123',
@@ -16,7 +16,7 @@ describe('component: MatchExpressions', () => {
16
16
  values: '123'
17
17
  }
18
18
  ]
19
- })
19
+ },
20
20
  });
21
21
 
22
22
  const inputWraps = wrapper.findAll('[data-testid^=input-match-expression-]');
@@ -29,9 +29,9 @@ describe('component: MatchExpressions', () => {
29
29
  'values',
30
30
  ])('should emit an update on %p input', async(field) => {
31
31
  const wrapper = mount(MatchExpressions, {
32
- props: { mode: _CREATE },
33
- data: () => ({
34
- rules: [
32
+ props: {
33
+ mode: _CREATE,
34
+ value: [
35
35
  {
36
36
  id: '123',
37
37
  key: '123',
@@ -39,7 +39,7 @@ describe('component: MatchExpressions', () => {
39
39
  values: '123'
40
40
  }
41
41
  ]
42
- })
42
+ },
43
43
  });
44
44
  const input = wrapper.find(`[data-testid="input-match-expression-${ field }-0"]`).find('input');
45
45
  const newValue = 123;
@@ -54,9 +54,9 @@ describe('component: MatchExpressions', () => {
54
54
  'operator',
55
55
  ])('should emit an update on %p selection change', async(field) => {
56
56
  const wrapper = mount(MatchExpressions, {
57
- props: { mode: _CREATE },
58
- data: () => ({
59
- rules: [
57
+ props: {
58
+ mode: _CREATE,
59
+ value: [
60
60
  {
61
61
  id: '123',
62
62
  key: '123',
@@ -64,7 +64,7 @@ describe('component: MatchExpressions', () => {
64
64
  values: '123'
65
65
  }
66
66
  ]
67
- })
67
+ },
68
68
  });
69
69
 
70
70
  const select = wrapper.find(`[data-testid="input-match-expression-${ field }-0"]`);
@@ -1,10 +1,18 @@
1
1
  import { mount } from '@vue/test-utils';
2
2
  import NameNsDescription from '@shell/components/form/NameNsDescription.vue';
3
+ import { createStore } from 'vuex';
3
4
 
4
5
  describe('component: NameNsDescription', () => {
5
6
  // Accessing to computed value due code complexity
6
7
  it('should map namespaces to options', () => {
7
8
  const namespaceName = 'test';
9
+ const store = createStore({
10
+ getters: {
11
+ allowedNamespaces: () => () => ({ [namespaceName]: true }),
12
+ currentStore: () => () => 'cluster',
13
+ 'cluster/schemaFor': () => jest.fn()
14
+ }
15
+ });
8
16
  const result = [
9
17
  {
10
18
  label: namespaceName,
@@ -13,20 +21,21 @@ describe('component: NameNsDescription', () => {
13
21
  ];
14
22
  const wrapper = mount(NameNsDescription, {
15
23
  props: {
16
- value: {},
24
+ value: {
25
+ setAnnotation: jest.fn(),
26
+ metadata: {}
27
+ },
17
28
  mode: 'create',
18
29
  cluster: {},
19
30
  },
20
31
  global: {
21
- mocks: {
32
+ provide: { store },
33
+ mocks: {
22
34
  $store: {
23
35
  dispatch: jest.fn(),
24
36
  getters: {
25
- namespaces: jest.fn(),
26
- allowedNamespaces: () => ({ [namespaceName]: true }),
27
- currentStore: () => 'cluster',
28
- 'cluster/schemaFor': jest.fn(),
29
- 'i18n/t': jest.fn(),
37
+ namespaces: jest.fn(),
38
+ 'i18n/t': jest.fn(),
30
39
  },
31
40
  },
32
41
  },
@@ -38,27 +47,35 @@ describe('component: NameNsDescription', () => {
38
47
 
39
48
  it('should emit in case of new namespace', () => {
40
49
  const namespaceName = 'test';
50
+ const store = createStore({
51
+ getters: {
52
+ allowedNamespaces: () => () => ({ [namespaceName]: true }),
53
+ currentStore: () => () => 'cluster',
54
+ 'cluster/schemaFor': () => jest.fn()
55
+ }
56
+ });
41
57
  const newNamespaceName = 'bananas';
42
58
  const wrapper = mount(NameNsDescription, {
43
59
  props: {
44
- value: { metadata: {} },
45
- mode: 'create',
60
+ value: {
61
+ setAnnotation: jest.fn(),
62
+ metadata: {}
63
+ },
64
+ mode: 'create',
46
65
  },
47
66
  global: {
48
- mocks: {
67
+ provide: { store },
68
+ mocks: {
49
69
  $store: {
50
70
  dispatch: jest.fn(),
51
71
  getters: {
52
72
  namespaces: jest.fn(),
53
- allowedNamespaces: () => ({ [namespaceName]: true }),
54
73
  'customizations/getPreviewCluster': {
55
74
  ready: true,
56
75
  isLocal: false,
57
76
  badge: {},
58
77
  },
59
- currentStore: () => 'cluster',
60
- 'cluster/schemaFor': jest.fn(),
61
- 'i18n/t': jest.fn(),
78
+ 'i18n/t': jest.fn(),
62
79
  },
63
80
  },
64
81
  },
@@ -69,4 +86,88 @@ describe('component: NameNsDescription', () => {
69
86
 
70
87
  expect(wrapper.emitted().isNamespaceNew?.[0][0]).toBe(true);
71
88
  });
89
+
90
+ it('renders the name input with the expected value', () => {
91
+ const namespaceName = 'test';
92
+ const store = createStore({
93
+ getters: {
94
+ allowedNamespaces: () => () => ({ [namespaceName]: true }),
95
+ currentStore: () => () => 'cluster',
96
+ 'cluster/schemaFor': () => jest.fn()
97
+ }
98
+ });
99
+ const wrapper = mount(NameNsDescription, {
100
+ props: {
101
+ value: {
102
+ setAnnotation: jest.fn(),
103
+ metadata: { name: 'Default' }
104
+ },
105
+ mode: 'create',
106
+ },
107
+ global: {
108
+ provide: { store },
109
+ mocks: {
110
+ $store: {
111
+ dispatch: jest.fn(),
112
+ getters: {
113
+ namespaces: jest.fn(),
114
+ 'customizations/getPreviewCluster': {
115
+ ready: true,
116
+ isLocal: false,
117
+ badge: {},
118
+ },
119
+ 'i18n/t': jest.fn(),
120
+ },
121
+ },
122
+ },
123
+ },
124
+ });
125
+
126
+ const nameInput = wrapper.find('[data-testid="NameNsDescriptionNameInput"]');
127
+
128
+ expect(nameInput.element.value).toBe('Default');
129
+ });
130
+
131
+ it('sets the name using the nameKey prop', () => {
132
+ const namespaceName = 'test';
133
+ const store = createStore({
134
+ getters: {
135
+ allowedNamespaces: () => () => ({ [namespaceName]: true }),
136
+ currentStore: () => () => 'cluster',
137
+ 'cluster/schemaFor': () => jest.fn()
138
+ }
139
+ });
140
+ const wrapper = mount(NameNsDescription, {
141
+ props: {
142
+ value: {
143
+ setAnnotation: jest.fn(),
144
+ metadata: {},
145
+ spec: { displayName: 'Default' }
146
+ },
147
+ mode: 'create',
148
+ nameKey: 'spec.displayName'
149
+ },
150
+ global: {
151
+ provide: { store },
152
+ mocks: {
153
+ $store: {
154
+ dispatch: jest.fn(),
155
+ getters: {
156
+ namespaces: jest.fn(),
157
+ 'customizations/getPreviewCluster': {
158
+ ready: true,
159
+ isLocal: false,
160
+ badge: {},
161
+ },
162
+ 'i18n/t': jest.fn(),
163
+ },
164
+ },
165
+ },
166
+ },
167
+ });
168
+
169
+ const nameInput = wrapper.find('[data-testid="NameNsDescriptionNameInput"]');
170
+
171
+ expect(nameInput.element.value).toBe('Default');
172
+ });
72
173
  });
@@ -6,18 +6,20 @@ import { DefaultProps } from 'vue/types/options';
6
6
 
7
7
  describe('component: Probe', () => {
8
8
  describe.each([
9
- ['HTTPS', ['port', 'path']],
10
- ['tcp', ['socket']],
11
- ['exec', ['command']],
12
- ])('given kind %p', (kind, extraFields) => {
9
+ [{ httpGet: { scheme: 'https' } }, ['port', 'path']],
10
+ [{ tcpSocket: {} }, ['socket']],
11
+ [{ exec: {} }, ['command']],
12
+ ])('given kind %p', (value, extraFields) => {
13
13
  it.each([
14
14
  ...extraFields,
15
15
  'successThreshold',
16
16
  'failureThreshold',
17
17
  ])('should emit an update on %p input', (field) => {
18
18
  const wrapper = mount(Probe as unknown as ExtendedVue<Vue, {}, {}, {}, DefaultProps>, {
19
- props: { mode: _EDIT },
20
- data: () => ({ kind })
19
+ props: {
20
+ mode: _EDIT,
21
+ value,
22
+ },
21
23
  });
22
24
  const input = wrapper.find(`[data-testid="input-probe-${ field }"]`).find('input');
23
25
  const newValue = 123;
@@ -33,8 +35,10 @@ describe('component: Probe', () => {
33
35
  'timeoutSeconds',
34
36
  ])('should emit an update on %p input and blur', (field) => {
35
37
  const wrapper = mount(Probe as unknown as ExtendedVue<Vue, {}, {}, {}, DefaultProps>, {
36
- props: { mode: _EDIT },
37
- data: () => ({ kind })
38
+ props: {
39
+ mode: _EDIT,
40
+ value
41
+ },
38
42
  });
39
43
  const input = wrapper.find(`[data-testid="input-probe-${ field }"]`).find('input');
40
44
  const newValue = 123;
@@ -2,6 +2,17 @@ import { mount } from '@vue/test-utils';
2
2
  import { _EDIT, _VIEW } from '@shell/config/query-params';
3
3
  import SSHKnownHosts from '@shell/components/form/SSHKnownHosts/index.vue';
4
4
 
5
+ jest.mock('focus-trap', () => {
6
+ return {
7
+ createFocusTrap: jest.fn().mockImplementation(() => {
8
+ return {
9
+ activate: jest.fn(),
10
+ deactivate: jest.fn(),
11
+ };
12
+ }),
13
+ };
14
+ });
15
+
5
16
  describe('component: SSHKnownHosts', () => {
6
17
  it.each([
7
18
  ['0 entities', '', 0],
@@ -27,4 +27,41 @@ describe('select.vue', () => {
27
27
  // eslint-disable-next-line no-console
28
28
  expect(console.warn).not.toHaveBeenCalled();
29
29
  });
30
+
31
+ it('a11y: adding ARIA props should correctly fill out the appropriate fields on the component', async() => {
32
+ const label = 'Foo';
33
+ const value = 'foo';
34
+ const ariaDescribedById = 'some-described-by-id';
35
+ const ariaLabelText = 'some-aria-label';
36
+
37
+ const wrapper = shallowMount(SelectComponent, {
38
+ props: {
39
+ value,
40
+ options: [
41
+ { label, value },
42
+ ],
43
+ },
44
+ attrs: {
45
+ 'aria-describedby': ariaDescribedById,
46
+ 'aria-label': ariaLabelText,
47
+ }
48
+ });
49
+
50
+ const labeledSelectContainer = wrapper.find('.unlabeled-select');
51
+ const ariaExpanded = labeledSelectContainer.attributes('aria-expanded');
52
+ const ariaDescribedBy = labeledSelectContainer.attributes('aria-describedby');
53
+ const ariaLabel = labeledSelectContainer.attributes('aria-label');
54
+
55
+ const vSelectInput = wrapper.find('.inline');
56
+
57
+ expect(ariaExpanded).toBe('false');
58
+ expect(ariaDescribedBy).toBe(ariaDescribedById);
59
+ expect(ariaLabel).toBe(ariaLabelText);
60
+
61
+ // make sure it's hardcoded to a "neutral" value so that
62
+ // in the current architecture of the component
63
+ // screen readers won't pick up the default "Select option" aria-label
64
+ // from the library
65
+ expect(vSelectInput.attributes('aria-label')).toBe('-');
66
+ });
30
67
  });
@@ -11,7 +11,7 @@ describe('component: UnitInput', () => {
11
11
  expect(wrapper.isVisible()).toBe(true);
12
12
  });
13
13
 
14
- it.each(['blur', 'change'])('should emit input event when "%p" is fired', async(event) => {
14
+ it.each(['blur', 'update:value'])('should emit input event when "%p" is fired', async(event) => {
15
15
  const wrapper = mount(UnitInput, { props: { value: 1, delay: 0 } });
16
16
  const input = wrapper.find('input');
17
17
 
@@ -20,7 +20,7 @@ describe('component: UnitInput', () => {
20
20
  input.trigger(event);
21
21
 
22
22
  expect(wrapper.emitted('update:value')).toBeTruthy();
23
- expect(wrapper.emitted('update:value')[2]).toStrictEqual([4]);
23
+ expect(wrapper.emitted('update:value')[1]).toStrictEqual([4]);
24
24
  });
25
25
 
26
26
  it.each([
@@ -184,7 +184,7 @@ describe('component: UnitInput', () => {
184
184
  input.trigger('blur');
185
185
 
186
186
  expect(wrapper.emitted('update:value')).toBeTruthy();
187
- expect(wrapper.emitted('update:value')[3][0]).toBe(value);
187
+ expect(wrapper.emitted('update:value')[0][0]).toBe(value);
188
188
  });
189
189
 
190
190
  describe.each([
@@ -207,7 +207,7 @@ describe('component: UnitInput', () => {
207
207
  expect(inputElement.value).toBe('123');
208
208
  });
209
209
 
210
- it.each(['input', 'blur'])('on %p 123 should display input value 123', async(trigger) => {
210
+ it.each(['update:value', 'blur'])('on %p 123 should display input value 123', async(trigger) => {
211
211
  const wrapper = mount(UnitInput, {
212
212
  props: {
213
213
  value: '0',
@@ -248,7 +248,6 @@ describe('component: UnitInput', () => {
248
248
  const input = wrapper.find('input');
249
249
 
250
250
  await input.trigger('update:value');
251
- await input.trigger('input');
252
251
 
253
252
  expect(input.element.value).toBe('123');
254
253
  });
@@ -1,8 +1,9 @@
1
1
  <script>
2
2
  import { BadgeState } from '@components/BadgeState';
3
+ import DotState from '@shell/components/DotState'
3
4
  import { colorForState, stateDisplay } from '@shell/plugins/dashboard-store/resource-class';
4
5
  export default {
5
- components: { BadgeState },
6
+ components: { BadgeState, DotState },
6
7
  props: {
7
8
  value: {
8
9
  type: String,
@@ -49,15 +50,17 @@ export default {
49
50
  <template>
50
51
  <div>
51
52
  <div v-if="arbitrary">
52
- <BadgeState
53
+ <!-- <BadgeState
53
54
  v-if="value"
54
55
  :color="stateBackground"
55
56
  :label="stateDisplay"
56
- />
57
+ /> -->
58
+ <DotState v-if="value" :color="stateBackground" :label="stateDisplay" />
57
59
  </div>
58
- <BadgeState
60
+ <!-- <BadgeState
59
61
  v-else
60
62
  :value="row"
61
- />
63
+ /> -->
64
+ <DotState v-else :value="row" />
62
65
  </div>
63
66
  </template>
@@ -28,6 +28,7 @@ export default {
28
28
  <span>
29
29
  <template v-if="isIp(row.externalIp)">
30
30
  {{ row.externalIp }} <CopyToClipboard
31
+ :aria-label="t('internalExternalIP.copyExternalIp')"
31
32
  label-as="tooltip"
32
33
  :text="row.externalIp"
33
34
  class="icon-btn"
@@ -43,6 +44,7 @@ export default {
43
44
  </template>
44
45
  <template v-else-if="isIp(row.internalIp)">
45
46
  {{ row.internalIp }}<CopyToClipboard
47
+ :aria-label="t('internalExternalIP.copyInternalIp')"
46
48
  label-as="tooltip"
47
49
  :text="row.internalIp"
48
50
  class="icon-btn"
@@ -1,5 +1,6 @@
1
1
  <script>
2
2
  import day from 'dayjs';
3
+ import 'dayjs/locale/zh-cn';
3
4
  import { DATE_FORMAT, TIME_FORMAT } from '@shell/store/prefs';
4
5
  import { escapeHtml } from '@shell/utils/string';
5
6
  import { diffFrom } from '@shell/utils/time';
@@ -65,8 +66,7 @@ export default {
65
66
  const dateFormat = escapeHtml( this.$store.getters['prefs/get'](DATE_FORMAT));
66
67
  const timeFormat = escapeHtml( this.$store.getters['prefs/get'](TIME_FORMAT));
67
68
 
68
- const out = day(this.value).format(`${ dateFormat } ${ timeFormat }`);
69
-
69
+ const out = day(this.value).locale('zh-cn').format('YYYY年M月D日 Ah:mm:ss');
70
70
  return out;
71
71
  },
72
72
 
@@ -126,7 +126,7 @@ export default {
126
126
  let label = diff.label;
127
127
 
128
128
  if ( diff.diff === 0 ) {
129
- label = 'Just now';
129
+ label = '刚刚';
130
130
  } else {
131
131
  label += ` ${ prefix }${ this.t(diff.unitsKey, { count: diff.label }) }`;
132
132
  label = label.trim();
@@ -13,17 +13,25 @@ export default {
13
13
  },
14
14
  },
15
15
 
16
- data() {
16
+ beforeMount() {
17
17
  if (this.value.issuer) {
18
18
  const { cn, notAfter, sans = [] } = this.value;
19
19
 
20
- return {
21
- cn, expiration: notAfter, sans, isTLS: true
22
- };
23
- } else {
24
- return { isTLS: false };
20
+ this.expiration = notAfter;
21
+ this.sans = sans;
22
+ this.cn = cn;
23
+ this.isTLS = true;
25
24
  }
26
25
  },
26
+
27
+ data() {
28
+ return {
29
+ isTLS: false,
30
+ cn: null,
31
+ sans: [],
32
+ expiration: null,
33
+ };
34
+ },
27
35
  computed: {
28
36
  // use 'text-warning' or 'text-error' classes if the cert is <8 days from expiring or expired respectively
29
37
  dateClass() {
@@ -43,7 +51,12 @@ export default {
43
51
 
44
52
  <template>
45
53
  <div v-if="isTLS">
46
- <t k="secret.certificate.cn" /> {{ cn }} <span v-if="row.unrepeatedSans && row.unrepeatedSans.length">{{ t('secret.certificate.plusMore', {n:row.unrepeatedSans.length}) }}</span><br>
54
+ <t k="secret.certificate.cn" />
55
+ {{ cn }}
56
+ <span v-if="row.unrepeatedSans && row.unrepeatedSans.length">
57
+ {{ t('secret.certificate.plusMore', {n:row.unrepeatedSans.length}) }}
58
+ </span>
59
+ <br>
47
60
  <t k="secret.certificate.expires" />: <DateComponent
48
61
  :class="dateClass"
49
62
  :value="expiration"
@@ -10,6 +10,9 @@ export default {
10
10
  computed: {
11
11
  isFavorite() {
12
12
  return this.$store.getters['type-map/isFavorite'](this.resource);
13
+ },
14
+ ariaLabel() {
15
+ return this.t(`resourceDetail.masthead.ariaLabel.${ this.isFavorite ? 'unfavoriteAction' : 'favoriteAction' }`, { resource: this.resource });
13
16
  }
14
17
  },
15
18
 
@@ -28,10 +31,11 @@ export default {
28
31
  <template>
29
32
  <i
30
33
  :tabindex="0"
31
- :aria-checked="!!isFavorite"
34
+ :aria-pressed="!!isFavorite"
32
35
  class="favorite icon"
33
36
  :class="{'icon-star-open': !isFavorite, 'icon-star': isFavorite}"
34
37
  aria-role="button"
38
+ :aria-label="ariaLabel"
35
39
  @click.stop.prevent="toggle"
36
40
  @keydown.enter.prevent="toggle"
37
41
  @keydown.space.prevent="toggle"
@@ -158,6 +158,17 @@ export default {
158
158
  items = this.group;
159
159
  }
160
160
 
161
+ let parentPath = '';
162
+ const cluster = this.$route.params?.cluster;
163
+
164
+ // Where we use nested route configuration, consider the parent route when trying to identify the nav location
165
+ if (this.$route.matched.length > 1) {
166
+ const parentRoute = this.$route.matched[this.$route.matched.length - 2];
167
+
168
+ parentPath = parentRoute.path.replace(':cluster', cluster);
169
+ parentPath = parentPath === '/' ? undefined : parentPath;
170
+ }
171
+
161
172
  for (const item of items.children) {
162
173
  if (item.children && this.hasActiveRoute(item)) {
163
174
  return true;
@@ -166,8 +177,12 @@ export default {
166
177
  const matchesNavLevel = navLevels.filter((param) => !this.$route.params[param] || this.$route.params[param] !== item.route.params[param]).length === 0;
167
178
  const withoutHash = this.$route.hash ? this.$route.fullPath.slice(0, this.$route.fullPath.indexOf(this.$route.hash)) : this.$route.fullPath;
168
179
  const withoutQuery = withoutHash.split('?')[0];
180
+ const itemFullPath = this.$router.resolve(item.route).fullPath;
169
181
 
170
- if (matchesNavLevel || this.$router.resolve(item.route).fullPath === withoutQuery) {
182
+ // if (matchesNavLevel || itemFullPath === withoutQuery) {
183
+ if (matchesNavLevel || itemFullPath === withoutQuery || withoutQuery.includes(itemFullPath)) {
184
+ return true;
185
+ } else if (parentPath && itemFullPath === parentPath) {
171
186
  return true;
172
187
  }
173
188
  }
@@ -263,7 +278,7 @@ export default {
263
278
  v-if="child.divider"
264
279
  :key="idx"
265
280
  >
266
- <hr>
281
+ <hr role="none">
267
282
  </li>
268
283
  <!-- <div v-else-if="child[childrenKey] && hideGroup(child[childrenKey])" :key="child.name">
269
284
  HIDDEN
@@ -469,7 +484,7 @@ export default {
469
484
  &.root {
470
485
  background: transparent;
471
486
  A {
472
- padding-left: 14px;
487
+ padding-left: 19px;
473
488
  }
474
489
  }
475
490
  }
@@ -479,4 +494,3 @@ export default {
479
494
  color: #a8abb2;
480
495
  }
481
496
  </style>
482
-