@rancher/shell 3.0.2-rc.2 → 3.0.2-rc.3

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 (141) hide show
  1. package/assets/styles/base/_basic.scss +5 -7
  2. package/assets/styles/global/_button.scss +10 -0
  3. package/assets/styles/global/_tooltip.scss +2 -2
  4. package/assets/styles/themes/_dark.scss +14 -2
  5. package/assets/styles/themes/_light.scss +7 -2
  6. package/assets/styles/vendor/vue-select.scss +4 -0
  7. package/assets/translations/en-us.yaml +44 -5
  8. package/components/BannerGraphic.vue +0 -42
  9. package/components/ButtonMultiAction.vue +1 -1
  10. package/components/Carousel.vue +36 -29
  11. package/components/CommunityLinks.vue +6 -1
  12. package/components/GrowlManager.vue +9 -2
  13. package/components/LocaleSelector.vue +8 -1
  14. package/components/PaginatedResourceTable.vue +4 -7
  15. package/components/ProgressBarMulti.vue +14 -0
  16. package/components/Questions/Reference.vue +57 -28
  17. package/components/SelectIconGrid.vue +12 -1
  18. package/components/SideNav.vue +12 -38
  19. package/components/SortableTable/index.vue +1 -0
  20. package/components/Tabbed/index.vue +12 -1
  21. package/components/YamlEditor.vue +1 -0
  22. package/components/auth/Principal.vue +5 -3
  23. package/components/fleet/FleetClusters.vue +82 -1
  24. package/components/fleet/FleetRepos.vue +13 -30
  25. package/components/fleet/ForceDirectedTreeChart/index.vue +2 -2
  26. package/components/form/ChangePassword.vue +2 -0
  27. package/components/form/ColorInput.vue +24 -1
  28. package/components/form/FileSelector.vue +2 -0
  29. package/components/form/KeyValue.vue +230 -160
  30. package/components/form/LabeledSelect.vue +1 -1
  31. package/components/form/PlusMinus.vue +14 -2
  32. package/components/form/ResourceLabeledSelect.vue +13 -53
  33. package/components/form/ResourceSelector.vue +1 -0
  34. package/components/form/ResourceTabs/index.vue +79 -36
  35. package/components/form/SecretSelector.vue +2 -2
  36. package/components/form/__tests__/KeyValue.test.ts +1 -1
  37. package/components/formatter/FleetClusterSummaryGraph.vue +2 -2
  38. package/components/formatter/FleetSummaryGraph.vue +6 -7
  39. package/components/formatter/WorkloadHealthScale.vue +7 -0
  40. package/components/nav/Group.vue +30 -4
  41. package/components/nav/Header.vue +82 -114
  42. package/components/nav/HeaderPageActionMenu.vue +27 -131
  43. package/components/nav/NamespaceFilter.vue +1 -1
  44. package/components/nav/Type.vue +15 -0
  45. package/config/home-links.js +21 -13
  46. package/config/labels-annotations.js +2 -0
  47. package/config/page-actions.js +1 -0
  48. package/config/pagination-table-headers.js +15 -1
  49. package/config/product/explorer.js +7 -17
  50. package/config/table-headers.js +6 -0
  51. package/config/version.js +5 -1
  52. package/core/plugin.ts +41 -1
  53. package/core/plugins.js +125 -72
  54. package/core/types-provisioning.ts +91 -2
  55. package/core/types.ts +55 -0
  56. package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +12 -3
  57. package/detail/catalog.cattle.io.app.vue +1 -1
  58. package/detail/fleet.cattle.io.cluster.vue +3 -3
  59. package/detail/namespace.vue +13 -19
  60. package/detail/networking.k8s.io.ingress.vue +13 -53
  61. package/detail/provisioning.cattle.io.cluster.vue +12 -1
  62. package/detail/workload/index.vue +3 -3
  63. package/dialog/AddCustomBadgeDialog.vue +5 -1
  64. package/edit/auth/ldap/__tests__/config.test.ts +18 -0
  65. package/edit/auth/ldap/config.vue +24 -0
  66. package/edit/auth/saml.vue +8 -6
  67. package/edit/fleet.cattle.io.gitrepo.vue +7 -1
  68. package/edit/logging-flow/index.vue +4 -19
  69. package/edit/networking.k8s.io.ingress/index.vue +18 -65
  70. package/edit/networking.k8s.io.networkpolicy/index.vue +4 -5
  71. package/edit/provisioning.cattle.io.cluster/index.vue +13 -1
  72. package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -115
  73. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +2 -2
  74. package/edit/provisioning.cattle.io.cluster/tabs/networking/ACE.vue +14 -28
  75. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +25 -12
  76. package/edit/service.vue +1 -2
  77. package/list/networking.k8s.io.ingress.vue +1 -1
  78. package/list/node.vue +15 -8
  79. package/list/persistentvolume.vue +12 -4
  80. package/list/service.vue +1 -1
  81. package/list/workload.vue +4 -0
  82. package/mixins/chart.js +4 -1
  83. package/models/catalog.cattle.io.app.js +3 -1
  84. package/models/catalog.cattle.io.clusterrepo.js +56 -7
  85. package/models/fleet.cattle.io.bundle.js +0 -11
  86. package/models/fleet.cattle.io.cluster.js +17 -1
  87. package/models/fleet.cattle.io.gitrepo.js +86 -50
  88. package/models/provisioning.cattle.io.cluster.js +47 -2
  89. package/models/service.js +1 -0
  90. package/models/workload.js +19 -1
  91. package/package.json +5 -4
  92. package/pages/c/_cluster/apps/charts/index.vue +4 -0
  93. package/pages/c/_cluster/explorer/ConfigBadge.vue +8 -7
  94. package/pages/c/_cluster/explorer/index.vue +13 -6
  95. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +3 -3
  96. package/pages/c/_cluster/fleet/index.vue +75 -89
  97. package/pages/c/_cluster/settings/links.vue +2 -2
  98. package/pages/diagnostic.vue +17 -15
  99. package/pages/home.vue +32 -6
  100. package/plugins/clean-html.js +50 -0
  101. package/plugins/dashboard-store/resource-class.js +4 -0
  102. package/plugins/plugin.js +54 -49
  103. package/plugins/steve/mutations.js +1 -1
  104. package/plugins/steve/steve-class.js +8 -0
  105. package/plugins/steve/steve-pagination-utils.ts +3 -1
  106. package/rancher-components/Accordion/Accordion.vue +4 -4
  107. package/rancher-components/BadgeState/BadgeState.vue +7 -0
  108. package/rancher-components/Card/Card.vue +27 -1
  109. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -2
  110. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  111. package/rancher-components/Form/LabeledInput/LabeledInput.vue +18 -1
  112. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +39 -2
  113. package/rancher-components/RcButton/RcButton.vue +90 -0
  114. package/rancher-components/RcButton/index.ts +2 -0
  115. package/rancher-components/RcButton/types.ts +17 -0
  116. package/rancher-components/RcDropdown/RcDropdown.vue +111 -0
  117. package/rancher-components/RcDropdown/RcDropdownItem.vue +127 -0
  118. package/rancher-components/RcDropdown/RcDropdownSeparator.vue +6 -0
  119. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +43 -0
  120. package/rancher-components/RcDropdown/index.ts +4 -0
  121. package/rancher-components/RcDropdown/types.ts +22 -0
  122. package/rancher-components/RcDropdown/useDropdownCollection.ts +45 -0
  123. package/rancher-components/RcDropdown/useDropdownContext.ts +83 -0
  124. package/scripts/test-plugins-build.sh +2 -0
  125. package/scripts/typegen.sh +2 -0
  126. package/store/catalog.js +1 -1
  127. package/tsconfig.json +2 -1
  128. package/types/components/paginatedResourceTable.ts +25 -0
  129. package/types/components/resourceLabeledSelect.ts +48 -0
  130. package/types/resources/fleet.d.ts +17 -0
  131. package/types/shell/index.d.ts +61 -0
  132. package/utils/auth.js +5 -1
  133. package/utils/cluster.js +106 -0
  134. package/utils/fleet.ts +35 -3
  135. package/utils/ingress.ts +64 -0
  136. package/utils/uiplugins.ts +56 -44
  137. package/utils/validators/cron-schedule.js +7 -2
  138. package/utils/validators/formRules/__tests__/index.test.ts +53 -17
  139. package/utils/validators/formRules/index.ts +20 -5
  140. package/vue.config.js +1 -1
  141. package/components/RelatedWorkloadsTable.vue +0 -50
@@ -83,14 +83,12 @@ TEXTAREA,
83
83
  }
84
84
  }
85
85
 
86
- BUTTON,
87
- .btn {
88
- &:focus, &.focused {
89
- outline: none;
90
- box-shadow: 0 0 0 var(--outline-width) var(--outline);
91
- background: var(--primary-hover-bg);
92
- }
86
+ .unlabeled-select {
87
+ &:focus-visible, &.focused {
88
+ @include focus-outline;
89
+ }
93
90
  }
91
+
94
92
  A {
95
93
  @include link-color(var(--link), var(--body-text));
96
94
 
@@ -126,6 +126,11 @@ button,
126
126
  &.btn:not(.btn-sm) {
127
127
  line-height: $btn-height - 2px;
128
128
  }
129
+
130
+ &:focus-visible {
131
+ @include focus-outline;
132
+ outline-offset: 2px;
133
+ }
129
134
  }
130
135
 
131
136
  .role-link {
@@ -141,6 +146,11 @@ button,
141
146
  color: var(--link);
142
147
  box-shadow: none;
143
148
  }
149
+
150
+ &:focus-visible {
151
+ @include focus-outline;
152
+ outline-offset: 2px;
153
+ }
144
154
  }
145
155
 
146
156
  .role-multi-action {
@@ -105,13 +105,13 @@
105
105
  .v-popper__popper {
106
106
  $color: var(--popover-bg);
107
107
  border: 1px solid var(--border);
108
- border-radius: var(--border-radius);
108
+ border-radius: var(--border-radius-lg);
109
109
 
110
110
  .v-popper__inner {
111
111
  background: $color;
112
112
  color: var(--popover-text);
113
113
  padding: 10px;
114
- border-radius: var(--border-radius);
114
+ border-radius: var(--border-radius-lg);
115
115
  border: none;
116
116
 
117
117
  a {
@@ -35,6 +35,10 @@
35
35
 
36
36
  $drag-over: #DCDEE7;
37
37
 
38
+ $slate: #4B4F6B;
39
+
40
+ --slate: #{$slate};
41
+
38
42
  --default : #{$dark};
39
43
  --default-text : #{$light};
40
44
  --default-hover-bg : #{darken($dark, 10%)};
@@ -111,7 +115,7 @@
111
115
  --dropdown-active-text : #{$lightest};
112
116
  --dropdown-active-bg : #{$light};
113
117
  --dropdown-hover-text : #{$lightest};
114
- --dropdown-hover-bg : var(--link);
118
+ --dropdown-hover-bg : #{$slate};
115
119
  --dropdown-disabled-bg : #{$disabled};
116
120
  --dropdown-disabled-text : #{$disabled};
117
121
  --dropdown-group-text : #{$disabled};
@@ -146,7 +150,7 @@
146
150
  --tag-primary : #{$lightest};
147
151
  --tag-bg : #{$medium};
148
152
 
149
- --popover-bg : var(--body-bg);
153
+ --popover-bg : #{$darker};
150
154
  --popover-border : var(--border);
151
155
  --popover-text : var(--body-text);
152
156
 
@@ -219,4 +223,12 @@
219
223
 
220
224
  --product-icon : #{$lighter};
221
225
  --product-icon-active : #{$lightest};
226
+
227
+ --badge-state-disabled-text : #{$desc-light};
228
+ --badge-state-disabled-bg : #{$medium};
229
+ --badge-state-disabled-border: #{$lighter};
230
+
231
+ $slate: #4B4F6B;
232
+
233
+ --slate: #{$slate};
222
234
  }
@@ -347,6 +347,7 @@ BODY, .theme-light {
347
347
  --border : #{$medium};
348
348
  --border-width : 1px;
349
349
  --border-radius : 4px;
350
+ --border-radius-lg : 8px;
350
351
  --outline : var(--primary);
351
352
  --outline-width : 1px;
352
353
 
@@ -374,8 +375,8 @@ BODY, .theme-light {
374
375
  --dropdown-text : #{$darkest};
375
376
  --dropdown-active-text : #{$lightest};
376
377
  --dropdown-active-bg : #{$dark};
377
- --dropdown-hover-text : #{$lightest};
378
- --dropdown-hover-bg : var(--link);
378
+ --dropdown-hover-text : var(--body-text);
379
+ --dropdown-hover-bg : #{$light};
379
380
  --dropdown-disabled-text : var(--muted);
380
381
  --dropdown-disabled-bg : #{$disabled};
381
382
  --dropdown-group-text : #{$darker};
@@ -544,4 +545,8 @@ BODY, .theme-light {
544
545
 
545
546
  --product-icon : #{$darker};
546
547
  --product-icon-active : #{$darkest};
548
+
549
+ --badge-state-disabled-text : #{$darker};
550
+ --badge-state-disabled-bg : #{$lighter};
551
+ --badge-state-disabled-border: #{$medium};
547
552
  }
@@ -74,6 +74,10 @@
74
74
  color: var(--dropdown-text);
75
75
  white-space: nowrap;
76
76
  z-index: 1000;
77
+ overflow-y: auto;
78
+ // needs overflow-x hidden so that select for type of charts in cluster chart page
79
+ // doesn't show a horizontal scroll https://github.com/rancher/dashboard/pull/13139/files/9e6a8e64181de4525ad378d4d1b93c8efc2ed6d5#r1929296126
80
+ overflow-x: hidden;
77
81
 
78
82
  &:hover {
79
83
  cursor: pointer;
@@ -9,6 +9,7 @@ generic:
9
9
  back: Back
10
10
  cancel: Cancel
11
11
  confirm: Confirm
12
+ colorPicker: Color picker
12
13
  clear: Clear
13
14
  clearAll: Clear All
14
15
  close: Close
@@ -116,6 +117,10 @@ generic:
116
117
  }
117
118
  basic: Basic
118
119
 
120
+ ariaLabel:
121
+ key: Key {index}
122
+ value: Value {index}
123
+
119
124
  locale:
120
125
  menu: Locale selector menu
121
126
  en-us: English
@@ -134,6 +139,8 @@ nav:
134
139
  support: Support page link
135
140
  about: About page link
136
141
  pinCluster: Pin/Unpin cluster
142
+ collapseExpand: Collapse/Expand menu group
143
+ productAboutPage: Product about page link
137
144
  alt:
138
145
  mainMenuIcon: Main menu icon
139
146
  mainMenuRancherLogo: Main menu Rancher logo
@@ -221,10 +228,18 @@ nav:
221
228
  header:
222
229
  setLoginPage: Set as login page
223
230
  restoreCards: Restore hidden cards
231
+ showHideBanner: Show/Hide Banner
224
232
  userMenu:
225
233
  preferences: Preferences
226
234
  accountAndKeys: Account & API Keys
227
235
  logOut: Log Out
236
+ label: User menu
237
+ button:
238
+ label: Open user menu
239
+ actionMenu:
240
+ label: Page actions menu
241
+ button:
242
+ label: Open page actions menu
228
243
  failWhale:
229
244
  authMiddleware: Auth Middleware
230
245
  clusterNotFound: Cluster { clusterId } not found
@@ -514,6 +529,9 @@ authConfig:
514
529
  starttls:
515
530
  label: Start TLS
516
531
  tip: Upgrades non-encrypted connections by wrapping with TLS during the connection process. Can not be used in conjunction with TLS.
532
+ searchUsingServiceAccount:
533
+ label: Enable Service Account Search
534
+ tip: When enabled, Rancher will use the service account instead of the user account to search for users and groups.
517
535
  tls: TLS
518
536
  userEnabledAttribute: User Enabled Attribute
519
537
  userMemberAttribute: User Member Attribute
@@ -931,6 +949,7 @@ catalog:
931
949
  experimentalWarning: '{chartName} has been marked as experimental. Use caution when installing this helm chart as it might not function as expected.'
932
950
  deprecatedAndExperimentalWarning: '{chartName} has been marked as deprecated and experimental. Use caution when installing this helm chart as it might be removed in the future and might not function as expected.'
933
951
  charts:
952
+ refresh: refresh charts
934
953
  all: All
935
954
  categories:
936
955
  all: All Categories
@@ -950,7 +969,7 @@ catalog:
950
969
  all: All Operating Systems
951
970
  linux: Linux
952
971
  windows: Windows
953
- search: Filter
972
+ search: Filter charts results
954
973
  deprecatedChartsFilter:
955
974
  label: Show deprecated apps
956
975
  install:
@@ -961,7 +980,7 @@ catalog:
961
980
  chart: Chart
962
981
  warning:
963
982
  managed:
964
- Warning, Rancher manages deployment and upgrade of the {name} app. Upgrading this app is not supported.<br>
983
+ Warning, {manager} manages deployment and upgrade of the {name} app. Upgrading this app is not supported.<br>
965
984
  {version, select,
966
985
  null { }
967
986
  other { Under most circumstances, no user intervention should be needed to ensure that the {version} version is compatible with the version of Rancher that you are running.}
@@ -1061,7 +1080,7 @@ catalog:
1061
1080
  windows: '{ver} (Windows-only)'
1062
1081
  delete:
1063
1082
  warning:
1064
- managed: Warning, Rancher manages deployment and upgrade of the {name} app. Deleting this app is not supported.
1083
+ managed: Warning, {manager} manages deployment and upgrade of the {name} app. Deleting this app is not supported.
1065
1084
  operation:
1066
1085
  tableHeaders:
1067
1086
  action: Action
@@ -2074,6 +2093,7 @@ cluster:
2074
2093
  label: Control Plane Concurrency
2075
2094
  toolTip: "This can be either a fixed number of nodes (e.g. 1) at a time or a percentage (e.g. 10%)"
2076
2095
  workerConcurrency:
2096
+ header: Worker Nodes
2077
2097
  label: Worker Concurrency
2078
2098
  toolTip: "This can be either a fixed number of nodes (e.g. 1) at a time or a percentage (e.g. 10%)"
2079
2099
  drain:
@@ -2109,6 +2129,7 @@ cluster:
2109
2129
  tlsSan:
2110
2130
  label: TLS Alternate Names
2111
2131
  fqdn:
2132
+ label: FQDN
2112
2133
  toolTip: A FQDN which will resolve to the healthy control plane nodes of the cluster.
2113
2134
  caCerts:
2114
2135
  label: CA Certificates
@@ -2381,6 +2402,9 @@ fleet:
2381
2402
  cluster:
2382
2403
  summary: Resource Summary
2383
2404
  nonReady: Non-Ready Bundles
2405
+ labels: Labels
2406
+ hideLabels: Show less
2407
+ showLabels: Show more
2384
2408
  clusters:
2385
2409
  harvester: |-
2386
2410
  There {count, plural,
@@ -2732,6 +2756,8 @@ hpa:
2732
2756
 
2733
2757
  import:
2734
2758
  title: Import YAML
2759
+ editor:
2760
+ label: YAML Editor
2735
2761
  defaultNamespace:
2736
2762
  label: Default Namespace
2737
2763
  success: |-
@@ -5363,6 +5389,7 @@ sortableTable:
5363
5389
  =1 {{count} {count, plural, =1 {{singularLabel}} other {{pluralLabel}}}}
5364
5390
  other {{from} - {to} of {count} {pluralLabel}}}
5365
5391
  search: Filter
5392
+ searchLabel: Filter table results
5366
5393
  in: in
5367
5394
  addFilter: Add Filter
5368
5395
  filterFor: Filter for...
@@ -6030,6 +6057,8 @@ validation:
6030
6057
  flowOutput:
6031
6058
  both: Requires "Output" or "Cluster Output" to be selected.
6032
6059
  global: Requires "Cluster Output" to be selected.
6060
+ git:
6061
+ repository: Repository URL must be a HTTP(s) or SSH url with no trailing spaces
6033
6062
  output:
6034
6063
  logdna:
6035
6064
  apiKey: Required an "Api Key" to be set.
@@ -6133,6 +6162,11 @@ validation:
6133
6162
  interval: '"{key}" must be of a format with digits followed by a unit i.e. 1h, 2m, 30s'
6134
6163
  tab: "One or more fields in this tab contain a form validation error"
6135
6164
 
6165
+ carousel:
6166
+ previous: Previous
6167
+ next: Next
6168
+ controlItem: Go to slide nº {number}
6169
+
6136
6170
  wizard:
6137
6171
  previous: Previous
6138
6172
  finish: Finish
@@ -6176,7 +6210,7 @@ wm:
6176
6210
  containerShell:
6177
6211
  clear: Clear
6178
6212
  containerName: "Container: {label}"
6179
- failed: "Unable to open a shell to the container (none of the shell commmands succeeded)\n\r"
6213
+ failed: "Unable to open a shell to the container (none of the shell commands succeeded)\n\r"
6180
6214
  logLevel:
6181
6215
  info: INFO
6182
6216
  error: ERROR
@@ -6189,6 +6223,11 @@ wm:
6189
6223
  title: "Kubectl: {name}"
6190
6224
 
6191
6225
  workload:
6226
+ scaleWorkloads: Scale workloads
6227
+ healthWorkloads: Jobs/Pods health status
6228
+ healthScaleToggle: Toggle/Expand workloads scaling/health
6229
+ plus: Scale up workload
6230
+ minus: Scale down workload
6192
6231
  container:
6193
6232
  command:
6194
6233
  addEnvVar: Add Variable
@@ -7746,7 +7785,7 @@ customLinks:
7746
7785
  issues: File an Issue
7747
7786
  getStarted: Get Started
7748
7787
  commercialSupport: Commercial Support
7749
- suseCollective: SUSE Collective
7788
+ appCo: SUSE Application Collection
7750
7789
 
7751
7790
 
7752
7791
  ##############################
@@ -51,19 +51,6 @@ export default {
51
51
  data-testid="banner-title"
52
52
  class="title"
53
53
  />
54
- <div
55
- v-if="pref"
56
- class="close-button"
57
- data-testid="graphic-banner-close"
58
- tabindex="0"
59
- :aria-label="t('generic.close')"
60
- role="button"
61
- @click="hide()"
62
- @keyup.enter="hide()"
63
- @keyup.space="hide()"
64
- >
65
- <i class="icon icon-close" />
66
- </div>
67
54
  </div>
68
55
  </template>
69
56
 
@@ -74,35 +61,6 @@ export default {
74
61
  .banner-graphic {
75
62
  position: relative;
76
63
 
77
- .close-button {
78
- position: absolute;
79
- visibility: hidden;
80
-
81
- &:focus-visible {
82
- @include focus-outline;
83
- outline-offset: 2px;
84
- }
85
- }
86
-
87
- &:hover .close-button {
88
- visibility: visible;
89
- position: absolute;
90
- right: 4px;
91
- top: 4px;
92
- font-size: 16px;
93
- padding: 4px;
94
- display: flex;
95
- align-items: center;
96
- cursor: pointer;
97
- opacity: 0.4;
98
-
99
- &:hover {
100
- background-color: var(--accent-btn-hover);
101
- color: var(--accent-btn-hover-text);
102
- opacity: 1;
103
- }
104
- }
105
-
106
64
  .graphic {
107
65
  display: flex;
108
66
  flex-direction: column;
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed, defineEmits } from 'vue';
2
+ import { computed } from 'vue';
3
3
 
4
4
  defineEmits(['click']);
5
5
 
@@ -195,33 +195,51 @@ export default {
195
195
  </div>
196
196
  </component>
197
197
  </div>
198
- <div
199
- class="controls"
200
- :class="{'disable': sliders.length === 1}"
201
- >
202
- <div
203
- v-for="(slide, i) in slider"
204
- :key="i"
205
- class="control-item"
206
- :class="{'active': activeItemId === i}"
207
- @click="scrollSlide(i, slider.length)"
208
- />
209
- </div>
210
198
  <div
211
199
  ref="prev"
200
+ role="button"
212
201
  class="prev"
202
+ :aria-label="t('carousel.previous')"
203
+ :aria-disabled="sliders.length === 1"
213
204
  :class="{'disable': sliders.length === 1}"
205
+ tabindex="0"
214
206
  @click="nextPrev('prev')"
207
+ @keyup.enter.space="nextPrev('prev')"
215
208
  >
216
- <i class="icon icon-chevron-left icon-4x" />
209
+ <i
210
+ class="icon icon-chevron-left icon-4x"
211
+ />
217
212
  </div>
218
213
  <div
219
214
  ref="next"
215
+ role="button"
220
216
  class="next"
217
+ :aria-label="t('carousel.next')"
218
+ :aria-disabled="sliders.length === 1"
221
219
  :class="{'disable': sliders.length === 1}"
220
+ tabindex="0"
222
221
  @click="nextPrev('next')"
222
+ @keyup.enter.space="nextPrev('next')"
223
+ >
224
+ <i
225
+ class="icon icon-chevron-right icon-4x"
226
+ />
227
+ </div>
228
+ <div
229
+ class="controls"
230
+ :class="{'disable': sliders.length === 1}"
223
231
  >
224
- <i class="icon icon-chevron-right icon-4x" />
232
+ <div
233
+ v-for="(slide, i) in slider"
234
+ :key="i"
235
+ class="control-item"
236
+ :class="{'active': activeItemId === i}"
237
+ role="button"
238
+ tabindex="0"
239
+ :aria-label="t('carousel.controlItem', { number: i+1 })"
240
+ @click="scrollSlide(i, slider.length)"
241
+ @keyup.enter.space="scrollSlide(i, slider.length)"
242
+ />
225
243
  </div>
226
244
  </div>
227
245
  </template>
@@ -240,20 +258,6 @@ export default {
240
258
  &.disable::after {
241
259
  display: none;
242
260
  }
243
-
244
- &.disable:hover {
245
- .prev,
246
- .next {
247
- display: none;
248
- }
249
- }
250
-
251
- &:hover {
252
- .prev,
253
- .next {
254
- display: block;
255
- }
256
- }
257
261
  }
258
262
 
259
263
  .slide-track {
@@ -367,13 +371,16 @@ export default {
367
371
  position: absolute;
368
372
  z-index: 20;
369
373
  top: 90px;
370
- display: none;
371
374
  cursor: pointer;
372
375
 
373
376
  &.disabled .icon {
374
377
  color: var(--disabled-bg);
375
378
  cursor: not-allowed;
376
379
  }
380
+
381
+ .icon:focus-visible {
382
+ @include focus-outline;
383
+ }
377
384
  }
378
385
 
379
386
  .next {
@@ -7,6 +7,7 @@ import { SETTING } from '@shell/config/settings';
7
7
  import { mapGetters } from 'vuex';
8
8
  import { isRancherPrime } from '@shell/config/version';
9
9
  import { fetchLinks } from '@shell/config/home-links';
10
+ import { processLink } from '@shell/plugins/clean-html';
10
11
 
11
12
  // i18n-ignore footer.wechat.title, footer.wechat.modalText, footer.wechat.modalText2
12
13
  export default {
@@ -77,7 +78,11 @@ export default {
77
78
  all.push(...this.links.defaults.filter((link) => link.enabled));
78
79
  }
79
80
 
80
- return all;
81
+ // Process the links
82
+ return all.map((item) => ({
83
+ ...item,
84
+ value: processLink(item.value)
85
+ }));
81
86
  }
82
87
  },
83
88
  methods: {
@@ -87,7 +87,10 @@ export default {
87
87
  <div class="growl-list">
88
88
  <div
89
89
  v-for="(growl, idx) in stack"
90
- :key="idx"
90
+ :key="growl.id"
91
+ role="alert"
92
+ :aria-labelledby="`growl-title-${ growl.id }`"
93
+ :aria-describedby="`growl-message-${ growl.id }`"
91
94
  :data-testid="`growl-list-item-${idx}`"
92
95
  :class="{'growl': true, ['bg-'+growl.color]: true}"
93
96
  >
@@ -103,11 +106,15 @@ export default {
103
106
  class="close hand icon icon-close"
104
107
  @click="close(growl)"
105
108
  />
106
- <div class="growl-text-title">
109
+ <div
110
+ :id="`growl-title-${ growl.id }`"
111
+ class="growl-text-title"
112
+ >
107
113
  {{ growl.title }}
108
114
  </div>
109
115
  <p
110
116
  v-if="growl.message"
117
+ :id="`growl-message-${ growl.id }`"
111
118
  :class="{ 'has-title': !!growl.title }"
112
119
  >
113
120
  {{ growl.message }}
@@ -11,6 +11,10 @@ export default {
11
11
  mode: {
12
12
  type: String,
13
13
  default: ''
14
+ },
15
+ showIcon: {
16
+ type: Boolean,
17
+ default: true
14
18
  }
15
19
  },
16
20
 
@@ -89,7 +93,10 @@ export default {
89
93
  class="locale-chooser"
90
94
  >
91
95
  {{ selectedLocaleLabel }}
92
- <i class="icon icon-fw icon-sort-down" />
96
+ <i
97
+ v-if="showIcon"
98
+ class="icon icon-fw icon-sort-down"
99
+ />
93
100
  </a>
94
101
  <template #popper>
95
102
  <ul
@@ -2,13 +2,6 @@
2
2
  import { defineComponent } from 'vue';
3
3
  import ResourceFetch from '@shell/mixins/resource-fetch';
4
4
  import ResourceTable from '@shell/components/ResourceTable.vue';
5
- import { StorePaginationResult } from '@shell/types/store/pagination.types';
6
-
7
- export type FetchSecondaryResourcesOpts = { canPaginate: boolean }
8
- export type FetchSecondaryResources = (opts: FetchSecondaryResourcesOpts) => Promise<any>
9
-
10
- export type FetchPageSecondaryResourcesOpts = { canPaginate: boolean, force: boolean, page: any[], pagResult: StorePaginationResult }
11
- export type FetchPageSecondaryResources = (opts: FetchPageSecondaryResourcesOpts) => Promise<any>
12
5
 
13
6
  /**
14
7
  * This is meant to enable ResourceList like capabilities outside of List pages / components
@@ -57,6 +50,8 @@ export default defineComponent({
57
50
  * Information may be required from resources other than the primary one shown per row
58
51
  *
59
52
  * This will fetch them ALL and will be run in a non-server-side pagination world
53
+ *
54
+ * of type PagTableFetchSecondaryResources
60
55
  */
61
56
  fetchSecondaryResources: {
62
57
  type: Function,
@@ -69,6 +64,8 @@ export default defineComponent({
69
64
  * This will fetch only those relevant to the current page using server-side pagination based filters
70
65
  *
71
66
  * called from shell/mixins/resource-fetch-api-pagination.js
67
+ *
68
+ * of type PagTableFetchPageSecondaryResources
72
69
  */
73
70
  fetchPageSecondaryResources: {
74
71
  type: Function,
@@ -90,6 +90,19 @@ export default {
90
90
 
91
91
  return out.filter((obj) => obj.percent);
92
92
  },
93
+ ariaLabelText() {
94
+ if (Array.isArray(this.values) && this.values.length) {
95
+ let ariaLabel = '';
96
+
97
+ this.values.forEach((val) => {
98
+ ariaLabel += `${ val.value } ${ val.value === 1 ? 'item' : 'items' } ${ val.label }`;
99
+ });
100
+
101
+ return ariaLabel;
102
+ }
103
+
104
+ return '';
105
+ }
93
106
  }
94
107
  };
95
108
 
@@ -108,6 +121,7 @@ function toPercent(value, min, max) {
108
121
  <div
109
122
  v-trim-whitespace
110
123
  :class="{progress: true, multi: pieces.length > 1}"
124
+ :aria-label="ariaLabelText"
111
125
  >
112
126
  <div
113
127
  v-for="(piece, idx) of pieces"