@rancher/shell 3.0.5-rc.1 → 3.0.5-rc.2

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 (200) hide show
  1. package/assets/images/providers/sks.svg +1 -0
  2. package/assets/styles/base/_helpers.scss +4 -0
  3. package/assets/styles/base/_variables.scss +1 -0
  4. package/assets/translations/en-us.yaml +31 -15
  5. package/assets/translations/zh-hans.yaml +4 -3
  6. package/chart/monitoring/index.vue +3 -1
  7. package/components/ActionDropdownShell.vue +71 -0
  8. package/components/AppModal.vue +18 -4
  9. package/components/CommunityLinks.vue +3 -58
  10. package/components/CruResource.vue +6 -1
  11. package/components/ExplorerProjectsNamespaces.vue +12 -4
  12. package/components/GlobalRoleBindings.vue +5 -1
  13. package/components/GrowlManager.vue +1 -0
  14. package/components/LandingPagePreference.vue +2 -0
  15. package/components/LocaleSelector.vue +1 -1
  16. package/components/ModalManager.vue +55 -0
  17. package/components/PromptModal.vue +47 -8
  18. package/components/ResourceDetail/Masthead.vue +38 -12
  19. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  20. package/components/ResourceDetail/index.vue +47 -12
  21. package/components/ResourceTable.vue +54 -19
  22. package/components/SideNav.vue +5 -1
  23. package/components/SlideInPanelManager.vue +126 -0
  24. package/components/SortableTable/THead.vue +5 -2
  25. package/components/SortableTable/actions.js +1 -1
  26. package/components/SortableTable/index.vue +54 -40
  27. package/components/SortableTable/paging.js +16 -19
  28. package/components/SortableTable/selection.js +0 -11
  29. package/components/Wizard.vue +2 -2
  30. package/components/__tests__/ModalManager.spec.ts +176 -0
  31. package/components/__tests__/PromptModal.test.ts +148 -0
  32. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  33. package/components/auth/AuthBanner.vue +13 -11
  34. package/components/auth/Principal.vue +1 -0
  35. package/components/auth/login/ldap.vue +1 -1
  36. package/components/fleet/FleetResources.vue +21 -6
  37. package/components/form/ArrayList.vue +10 -6
  38. package/components/form/BannerSettings.vue +17 -2
  39. package/components/form/ColorInput.vue +35 -6
  40. package/components/form/EnvVars.vue +1 -0
  41. package/components/form/LabeledSelect.vue +18 -23
  42. package/components/form/MatchExpressions.vue +4 -1
  43. package/components/form/NameNsDescription.vue +5 -1
  44. package/components/form/NotificationSettings.vue +15 -1
  45. package/components/form/Password.vue +1 -0
  46. package/components/form/Probe.vue +1 -0
  47. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +15 -34
  48. package/components/form/SSHKnownHosts/index.vue +14 -11
  49. package/components/form/Select.vue +1 -15
  50. package/components/form/ValueFromResource.vue +12 -12
  51. package/components/form/__tests__/ArrayList.test.ts +2 -2
  52. package/components/form/__tests__/ColorInput.test.ts +35 -0
  53. package/components/form/__tests__/LabeledSelect.test.ts +40 -0
  54. package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
  55. package/components/nav/Group.vue +12 -4
  56. package/components/nav/Header.vue +16 -43
  57. package/components/nav/NamespaceFilter.vue +134 -86
  58. package/components/nav/TopLevelMenu.vue +4 -5
  59. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  60. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  61. package/components/templates/default.vue +6 -3
  62. package/components/templates/home.vue +6 -0
  63. package/components/templates/plain.vue +6 -3
  64. package/composables/focusTrap.ts +12 -4
  65. package/config/store.js +4 -0
  66. package/config/uiplugins.js +5 -1
  67. package/core/types.ts +7 -6
  68. package/detail/catalog.cattle.io.app.vue +6 -1
  69. package/detail/fleet.cattle.io.bundle.vue +70 -6
  70. package/detail/fleet.cattle.io.gitrepo.vue +1 -1
  71. package/detail/namespace.vue +0 -3
  72. package/detail/node.vue +17 -13
  73. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  74. package/dialog/AddCustomBadgeDialog.vue +0 -1
  75. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  76. package/dialog/AssignToDialog.vue +176 -0
  77. package/dialog/ChangePasswordDialog.vue +106 -0
  78. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  79. package/dialog/DisableAuthProviderDialog.vue +101 -0
  80. package/dialog/DrainNode.vue +1 -1
  81. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  82. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +69 -57
  83. package/dialog/FeatureFlagListDialog.vue +288 -0
  84. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  85. package/{components/Import.vue → dialog/ImportDialog.vue} +0 -5
  86. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  87. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
  88. package/dialog/MoveNamespaceDialog.vue +157 -0
  89. package/dialog/ScalePoolDownDialog.vue +1 -1
  90. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  91. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  92. package/dialog/WechatDialog.vue +57 -0
  93. package/edit/auth/azuread.vue +1 -1
  94. package/edit/auth/github.vue +1 -1
  95. package/edit/auth/googleoauth.vue +1 -1
  96. package/edit/auth/ldap/index.vue +1 -1
  97. package/edit/auth/oidc.vue +1 -1
  98. package/edit/auth/saml.vue +1 -1
  99. package/edit/cloudcredential.vue +24 -10
  100. package/edit/management.cattle.io.user.vue +28 -3
  101. package/edit/namespace.vue +1 -4
  102. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  103. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -10
  104. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -8
  105. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  106. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +66 -0
  107. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  108. package/edit/provisioning.cattle.io.cluster/rke2.vue +24 -7
  109. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  110. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +4 -1
  111. package/initialize/install-plugins.js +2 -1
  112. package/list/harvesterhci.io.management.cluster.vue +4 -1
  113. package/list/management.cattle.io.feature.vue +4 -288
  114. package/machine-config/azure.vue +16 -4
  115. package/mixins/vue-select-overrides.js +0 -4
  116. package/models/fleet.cattle.io.cluster.js +8 -2
  117. package/models/fleet.cattle.io.gitrepo.js +8 -34
  118. package/models/management.cattle.io.feature.js +7 -1
  119. package/models/namespace.js +7 -1
  120. package/package.json +1 -1
  121. package/pages/about.vue +13 -3
  122. package/pages/account/index.vue +12 -5
  123. package/pages/auth/login.vue +7 -4
  124. package/pages/auth/setup.vue +1 -0
  125. package/pages/auth/verify.vue +9 -7
  126. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  127. package/pages/c/_cluster/auth/config/index.vue +10 -12
  128. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  129. package/pages/c/_cluster/explorer/index.vue +17 -15
  130. package/pages/c/_cluster/istio/index.vue +2 -2
  131. package/pages/c/_cluster/longhorn/index.vue +1 -1
  132. package/pages/c/_cluster/monitoring/index.vue +1 -1
  133. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  134. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  135. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  136. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  137. package/pages/c/_cluster/neuvector/index.vue +1 -1
  138. package/pages/c/_cluster/settings/banners.vue +4 -3
  139. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  140. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  141. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  142. package/pages/diagnostic.vue +12 -9
  143. package/pages/fail-whale.vue +8 -5
  144. package/pages/prefs.vue +7 -6
  145. package/plugins/internal-api/index.ts +37 -0
  146. package/plugins/internal-api/shared/base-api.ts +13 -0
  147. package/plugins/internal-api/shell/shell.api.ts +108 -0
  148. package/plugins/steve/actions.js +0 -12
  149. package/public/index.html +1 -0
  150. package/rancher-components/Card/Card.vue +1 -1
  151. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  152. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -3
  153. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +47 -0
  154. package/rancher-components/Form/LabeledInput/LabeledInput.vue +20 -2
  155. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  156. package/rancher-components/Form/Radio/RadioButton.vue +20 -4
  157. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  158. package/rancher-components/Form/Radio/RadioGroup.vue +75 -35
  159. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +17 -0
  160. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +5 -0
  161. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +10 -1
  162. package/rancher-components/RcButton/RcButton.vue +2 -1
  163. package/rancher-components/RcButton/types.ts +1 -0
  164. package/rancher-components/RcDropdown/RcDropdown.vue +17 -6
  165. package/rancher-components/RcDropdown/RcDropdownItem.vue +3 -56
  166. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +68 -0
  167. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +92 -0
  168. package/rancher-components/RcDropdown/index.ts +2 -0
  169. package/rancher-components/RcDropdown/useDropdownItem.ts +63 -0
  170. package/scripts/extension/bundle +20 -0
  171. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  172. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  173. package/scripts/extension/helmpatch +44 -31
  174. package/scripts/extension/publish +12 -13
  175. package/scripts/typegen.sh +2 -4
  176. package/store/action-menu.js +26 -56
  177. package/store/index.js +5 -0
  178. package/store/modal.ts +71 -0
  179. package/store/slideInPanel.ts +47 -0
  180. package/store/type-map.js +8 -1
  181. package/store/type-map.utils.ts +4 -4
  182. package/types/global-vue.d.ts +5 -0
  183. package/types/internal-api/shell/growl.d.ts +25 -0
  184. package/types/internal-api/shell/modal.d.ts +77 -0
  185. package/types/internal-api/shell/slideIn.d.ts +15 -0
  186. package/types/resources/fleet.d.ts +0 -14
  187. package/types/shell/index.d.ts +35 -23
  188. package/types/vue-shim.d.ts +4 -1
  189. package/utils/__mocks__/tabbable.js +13 -0
  190. package/utils/__tests__/object.test.ts +38 -4
  191. package/utils/fleet.ts +15 -73
  192. package/utils/object.js +48 -5
  193. package/utils/validators/formRules/__tests__/index.test.ts +10 -1
  194. package/utils/validators/formRules/index.ts +27 -3
  195. package/components/AssignTo.vue +0 -199
  196. package/components/DisableAuthProviderModal.vue +0 -115
  197. package/components/MoveModal.vue +0 -167
  198. package/components/PromptChangePassword.vue +0 -123
  199. package/components/fleet/FleetBundleResources.vue +0 -86
  200. package/types/vue-shim.d +0 -20
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 66 57" fill="#fff" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round"><use xlink:href="#A" x=".5" y=".5"/><symbol id="A" overflow="visible"><path d="M32 0L0 55.426h4.44L32 7.963v7.8L9.033 55.426h4.593L32 23.733v7.962l-13.78 23.73h4.593L32 39.656v7.8l-4.593 7.962H64z" stroke="none" fill="#da291c" fill-rule="nonzero"/></symbol></svg>
@@ -131,6 +131,10 @@ $spacing-property-map: (
131
131
  color: var(--input-label);
132
132
  }
133
133
 
134
+ .text-no-break {
135
+ white-space: nowrap;
136
+ }
137
+
134
138
  .hide {
135
139
  display: none !important;
136
140
  }
@@ -8,6 +8,7 @@ $min-width: 75% !default;
8
8
  $input-height: 61px;
9
9
  $unlabeled-input-height: 40px;
10
10
  $unlabaled-select-padding: 3px 0;
11
+ $footer-height: 60px;
11
12
 
12
13
  $input-padding-lg: 18px;
13
14
  $input-padding-sm: 10px;
@@ -144,6 +144,7 @@ nav:
144
144
  localClusterIcon: Local Cluster icon
145
145
  clusterProvIcon: Cluster {cluster} provider icon
146
146
  topLevelMenu: Main menu
147
+ sideNav: Secondary menu
147
148
  homePage: Home page navigation menu
148
149
  cluster: Cluster menu item
149
150
  harvesterCluster: Harvester cluster menu item
@@ -237,9 +238,10 @@ nav:
237
238
  clusters: clusters
238
239
  ariaLabel: Filter clusters on main menu
239
240
  resourceSearch:
240
- label: Resource Search
241
- toolTip: Resource Search {key}
242
- placeholder: Type to search for a resource...
241
+ label: Resource Type Search
242
+ prompt: Search for a Kubernetes Resource/Custom Resource type
243
+ toolTip: Resource Type Search {key}
244
+ placeholder: Type to search for a resource type...
243
245
  filteringDescription: Using this input will immediately filter the results in the list below
244
246
  header:
245
247
  setLoginPage: Set as login page
@@ -328,7 +330,7 @@ layouts:
328
330
  unauthenticated: unauthenticated layout
329
331
  logout: logout layout
330
332
  verify: verify layout
331
-
333
+
332
334
  windowmanager:
333
335
  closeTab: Close tab {tabId}
334
336
  about:
@@ -497,7 +499,7 @@ authConfig:
497
499
  4: 'Under Scopes for Google APIs, enable "email", "profile", and "openid".'
498
500
  5: 'Click on "Save".'
499
501
  topPrivateDomain: 'Top private domain of:'
500
- ariaLabel:
502
+ ariaLabel:
501
503
  hostname: Copy Hostname to clipboard
502
504
  serverUrl: Copy Server URL to clipboard
503
505
  2:
@@ -508,7 +510,7 @@ authConfig:
508
510
  3: 'Authorized redirect URIs:'
509
511
  4: 'Click "Create", and then click on the "Download JSON" button.'
510
512
  5: 'Upload the downloaded JSON file in the OAuth credentials box.'
511
- ariaLabel:
513
+ ariaLabel:
512
514
  serverUrlVerify: Copy Server Auth Verfication URL to clipboard
513
515
  3:
514
516
  title: 'Create Service Account credentials'
@@ -871,13 +873,13 @@ asyncButton:
871
873
  success: Generated
872
874
  waiting: Generating&hellip;
873
875
 
874
- backupRestoreOperator:
876
+ backupRestoreOperator:
875
877
  backup:
876
878
  label: Resource Set
877
879
  description: The Resource Set determines which resources the backup-restore-operator collects in a backup
878
880
  enableEncryptionWarning: 'Enabling encryption is highly recommended when using <b><i>Full Rancher backup resource set</i></b>, otherwise sensitive information will be backed up as plain-text. <a target="_blank" rel="noopener noreferrer nofollow" href="https://ranchermanager.docs.rancher.com/reference-guides/backup-restore-configuration/backup-configuration#resourcesets">Read more</a>.'
879
881
  missingResourceSetWarning: The <b><i>{resourceSet}</i></b> resource set doesn't exist, it's possible it has been deleted. Please select a different option.
880
- resourceSetOptions:
882
+ resourceSetOptions:
881
883
  'rancher-resource-set-basic': 'Basic Rancher backup resource set'
882
884
  'rancher-resource-set-full': 'Full Rancher backup resource set'
883
885
  custom: Custom
@@ -1365,7 +1367,7 @@ cluster:
1365
1367
  registrationCommand:
1366
1368
  label: Registration Command
1367
1369
  linuxDetail: Run this command on each of the existing Linux machines you want to register.
1368
- windowsDetail: Run this command in PowerShell on each of the existing Windows machines you want to register.
1370
+ windowsDetail: Run this command in PowerShell on each of the existing Windows machines you want to register.
1369
1371
  windowsWorkersOnly: <b>Windows nodes can only be workers.</b>
1370
1372
  windowsNotReady: The cluster must be up and running with Linux etcd, control plane, and worker nodes before the registration command for adding Windows workers will display.<br /> <br /><b>Windows nodes can only be workers.</b>
1371
1373
  windowsWarning: Workload pods, including some deployed by Rancher charts, will be scheduled on both Linux and Windows nodes by default. Edit NodeSelector in the chart to direct them to be placed onto a compatible node.
@@ -1883,11 +1885,11 @@ cluster:
1883
1885
  subGroups:
1884
1886
  podAffinityAnti: Pod Affinity/Anti-Affinity
1885
1887
  nodeAffinity: Node Affinity
1886
- schedulingCustomization:
1888
+ schedulingCustomization:
1887
1889
  label: Prevent Rancher cluster agent pod eviction
1888
1890
  description: This ensures that the cluster agent pod is not evicted due to node pressure, resource constraints or scheduler policies.
1889
1891
  banner: This feature has been enabled with settings that are different from the global default settings.
1890
- innerCheckbox: Apply global settings for Priority Class and Pod Disruption Budget
1892
+ innerCheckbox: Apply global settings for Priority Class and Pod Disruption Budget
1891
1893
  banners:
1892
1894
  advanced: These are advanced configuration options. Generally, they should be left as-is.
1893
1895
  tolerations: Additional Pod Tolerations will be added to the default Tolerations applied by Rancher.
@@ -2056,6 +2058,7 @@ cluster:
2056
2058
  docker: Docker
2057
2059
  eks: Amazon EKS
2058
2060
  exoscale: Exoscale
2061
+ sks: Exoscale SKS
2059
2062
  gcp: Google
2060
2063
  google: Google GCE
2061
2064
  googlegke: Google GKE
@@ -2214,7 +2217,7 @@ cluster:
2214
2217
  snapshotScheduleCron:
2215
2218
  label: Cron Schedule
2216
2219
  snapshotRetention:
2217
- label: Snapshot retention count
2220
+ label: Snapshot retention count
2218
2221
  tooltip: Each backup records 1 snapshot per etcd node. If you specify 3 snapshots and you have 3 etcd nodes you will only retain 1 full backup.
2219
2222
  exportMetric:
2220
2223
  label: Metrics
@@ -3943,6 +3946,10 @@ namespaceFilter:
3943
3946
  one {1 item selected}
3944
3947
  other {{total} items selected}
3945
3948
  }
3949
+ input: Filter namespace options
3950
+ button:
3951
+ clear: Remove applied namespace filters
3952
+ clearFilter: Clear namespace options filter
3946
3953
 
3947
3954
  namespaceList:
3948
3955
  selectLabel: Namespace
@@ -4743,6 +4750,7 @@ prefs:
4743
4750
  allNamespaces: Show dynamic Namespaces managed by Rancher (not intended for editing or deletion)
4744
4751
  themeShortcut: Enable Dark/Light Theme keyboard shortcut toggle (shift+T)
4745
4752
  pluginDeveloper: Enable Extension developer features
4753
+ pluginDeveloperTooltip: Enables the ability to perform a developer load of UI extensions
4746
4754
  hideDesc:
4747
4755
  label: Hide Type Description banners above resource lists
4748
4756
  helm:
@@ -4759,6 +4767,8 @@ principal:
4759
4767
  name: Name
4760
4768
  loginName: Username
4761
4769
  type: Type
4770
+ alt:
4771
+ avatar: User avatar image
4762
4772
 
4763
4773
  probe:
4764
4774
  checkInterval:
@@ -5138,6 +5148,8 @@ rbac:
5138
5148
  label: Login Access
5139
5149
  clustertemplaterevisions-create:
5140
5150
  label: Create RKE Template Revisions
5151
+ errors:
5152
+ escalation: You cannot assign Global Permissions that are higher than your own. Please verify the permissions you are attempting to assign.
5141
5153
 
5142
5154
  resourceDetail:
5143
5155
  detailTop:
@@ -5214,6 +5226,7 @@ resourceTable:
5214
5226
  role: Group by Role
5215
5227
  cluster: Group by Cluster
5216
5228
  device: Group by Device
5229
+ pool: Group by Pool
5217
5230
  groupLabel:
5218
5231
  cluster: "<span>Cluster:</span> {name}"
5219
5232
  notInACluster: Not in a Cluster
@@ -7571,6 +7584,9 @@ typeLabel:
7571
7584
  }
7572
7585
 
7573
7586
  action:
7587
+ ariaLabel:
7588
+ hidePass: Hide {area}
7589
+ showPass: Reveal {area}
7574
7590
  clone: Clone
7575
7591
  disable: Disable
7576
7592
  download: Download YAML
@@ -7822,9 +7838,9 @@ performance:
7822
7838
  banner:
7823
7839
  label: Fixed Banners
7824
7840
  settingName: Banners
7825
- headerBanner: Header Banner
7826
- footerBanner: Footer Banner
7827
- loginScreenBanner: Login Screen Banner
7841
+ bannerHeader: Header Banner
7842
+ bannerFooter: Footer Banner
7843
+ bannerConsent: Login Screen Banner
7828
7844
  text: Text
7829
7845
  buttonText: Accept Button Text
7830
7846
  textColor: Text Color
@@ -1773,6 +1773,7 @@ cluster:
1773
1773
  docker: Docker
1774
1774
  eks: Amazon EKS
1775
1775
  exoscale: Exoscale
1776
+ sks: Exoscale SKS
1776
1777
  gcp: Google
1777
1778
  google: Google GCE
1778
1779
  googlegke: Google GKE
@@ -7131,9 +7132,9 @@ performance:
7131
7132
  banner:
7132
7133
  label: 固定横幅
7133
7134
  settingName: 横幅
7134
- headerBanner: 标题横幅
7135
- footerBanner: 页脚横幅
7136
- loginScreenBanner: 登录屏幕横幅
7135
+ bannerHeader: 标题横幅
7136
+ bannerFooter: 页脚横幅
7137
+ bannerConsent: 登录屏幕横幅
7137
7138
  text: 文本
7138
7139
  buttonText: 同意按钮文本
7139
7140
  textColor: 文本颜色
@@ -72,7 +72,9 @@ export default {
72
72
  const { existing = false } = this.$attrs;
73
73
 
74
74
  // If needed, fetch all the workloads that have prometheus operator like containers
75
- this.workloadTypes = !existing ? Object.values(WORKLOAD_TYPES) : [];
75
+ const { CRON_JOB, ...validWorkloads } = WORKLOAD_TYPES;
76
+
77
+ this.workloadTypes = !existing ? Object.values(validWorkloads) : [];
76
78
 
77
79
  this.workloadTypes.forEach((type) => {
78
80
  // We'll use a filter to fetch the results. Atm there's no neat way to differentiate between ALL results and JUST filtered
@@ -0,0 +1,71 @@
1
+ <script setup lang="ts">
2
+ import { RcDropdown, RcDropdownTrigger, RcDropdownItem } from '@components/RcDropdown';
3
+ type HiddenAction = {
4
+ action: string;
5
+ enabled: boolean;
6
+ icon: string;
7
+ label: string;
8
+ bulkable: boolean;
9
+ bulkAction: string;
10
+ allEnabled: boolean;
11
+ anyEnabled: boolean;
12
+ }
13
+
14
+ defineProps<{
15
+ disabled: boolean,
16
+ hiddenActions: HiddenAction[],
17
+ actionTooltip: unknown,
18
+ }>();
19
+
20
+ const emit = defineEmits(['click', 'mouseover', 'mouseleave']);
21
+
22
+ const applyTableAction = (act: HiddenAction, args: unknown, event: Event) => {
23
+ emit('click', act, args, event);
24
+ };
25
+
26
+ const setBulkActionOfInterest = (act: HiddenAction | null, event: 'mouseover' | 'mouseleave' = 'mouseover') => {
27
+ emit(event, act);
28
+ };
29
+ </script>
30
+
31
+ <template>
32
+ <rc-dropdown
33
+ :distance="14"
34
+ placement="bottom"
35
+ >
36
+ <rc-dropdown-trigger
37
+ class="bulk-actions-dropdown"
38
+ :disabled="disabled"
39
+ >
40
+ <template #before>
41
+ <i class="icon icon-gear" />
42
+ </template>
43
+ <span>{{ t('sortableTable.bulkActions.collapsed.label') }}</span>
44
+ <template #after>
45
+ <i class="ml-10 icon icon-chevron-down" />
46
+ </template>
47
+ </rc-dropdown-trigger>
48
+ <template #dropdownCollection>
49
+ <rc-dropdown-item
50
+ v-for="(act, i) in hiddenActions"
51
+ :key="i"
52
+ v-clean-tooltip="{
53
+ content: actionTooltip,
54
+ placement: 'right'
55
+ }"
56
+ :disabled="!act.enabled"
57
+ @click="applyTableAction(act, null, $event)"
58
+ @mouseover="setBulkActionOfInterest(act)"
59
+ @mouseleave="setBulkActionOfInterest(null, 'mouseleave')"
60
+ >
61
+ <template #before>
62
+ <i
63
+ v-if="act.icon"
64
+ :class="act.icon"
65
+ />
66
+ </template>
67
+ <span v-clean-html="act.label" />
68
+ </rc-dropdown-item>
69
+ </template>
70
+ </rc-dropdown>
71
+ </template>
@@ -1,6 +1,10 @@
1
1
  <script lang="ts">
2
- import { defineComponent } from 'vue';
3
- import { DEFAULT_FOCUS_TRAP_OPTS, useBasicSetupFocusTrap, getFirstFocusableElement } from '@shell/composables/focusTrap';
2
+ import { defineComponent, ref } from 'vue';
3
+ import {
4
+ DEFAULT_FOCUS_TRAP_OPTS,
5
+ getFirstFocusableElement,
6
+ useWatcherBasedSetupFocusTrapWithDestroyIncluded
7
+ } from '@shell/composables/focusTrap';
4
8
 
5
9
  export const DEFAULT_ITERABLE_NODE_SELECTOR = 'body;';
6
10
 
@@ -80,6 +84,13 @@ export default defineComponent({
80
84
  returnFocusFirstIterableNodeSelector: {
81
85
  type: String,
82
86
  default: DEFAULT_ITERABLE_NODE_SELECTOR,
87
+ },
88
+ /**
89
+ * watcher-based focus trap variable to watch
90
+ */
91
+ focusTrapWatcherBasedVariable: {
92
+ type: Boolean,
93
+ default: undefined,
83
94
  }
84
95
  },
85
96
  computed: {
@@ -107,7 +118,7 @@ export default defineComponent({
107
118
  width: this.modalWidth,
108
119
  ...this.stylesPropToObj,
109
120
  };
110
- },
121
+ }
111
122
  },
112
123
  setup(props) {
113
124
  if (props.triggerFocusTrap) {
@@ -131,7 +142,10 @@ export default defineComponent({
131
142
  };
132
143
  }
133
144
 
134
- useBasicSetupFocusTrap('#modal-container-element', opts);
145
+ // prop used to immediately trigger the focus trap when a proper watch variable is not required
146
+ const autoTriggerFocusTrapWatcher = ref(true);
147
+
148
+ useWatcherBasedSetupFocusTrapWithDestroyIncluded(() => props.focusTrapWatcherBasedVariable ?? autoTriggerFocusTrapWatcher, '#modal-container-element', opts, true);
135
149
  }
136
150
  },
137
151
  mounted() {
@@ -1,6 +1,5 @@
1
1
  <script>
2
2
  import SimpleBox from '@shell/components/SimpleBox';
3
- import AppModal from '@shell/components/AppModal.vue';
4
3
  import Closeable from '@shell/mixins/closeable';
5
4
  import { MANAGEMENT } from '@shell/config/types';
6
5
  import { SETTING } from '@shell/config/settings';
@@ -9,11 +8,11 @@ import { isRancherPrime } from '@shell/config/version';
9
8
  import { fetchLinks } from '@shell/config/home-links';
10
9
  import { processLink } from '@shell/plugins/clean-html';
11
10
 
12
- // i18n-ignore footer.wechat.title, footer.wechat.modalText, footer.wechat.modalText2
11
+ // i18n-ignore footer.wechat.title
13
12
  export default {
14
13
  name: 'CommunityLinks',
15
14
 
16
- components: { SimpleBox, AppModal },
15
+ components: { SimpleBox },
17
16
 
18
17
  props: {
19
18
  linkOptions: {
@@ -87,10 +86,7 @@ export default {
87
86
  },
88
87
  methods: {
89
88
  show() {
90
- this.showWeChatModal = true;
91
- },
92
- close() {
93
- this.showWeChatModal = false;
89
+ this.$store.dispatch('management/promptModal', { component: 'WechatDialog' });
94
90
  }
95
91
  },
96
92
  };
@@ -146,32 +142,6 @@ export default {
146
142
  </a>
147
143
  </div>
148
144
  </SimpleBox>
149
- <app-modal
150
- v-if="showWeChatModal"
151
- name="wechat-modal"
152
- height="auto"
153
- :width="640"
154
- :trigger-focus-trap="true"
155
- @close="close"
156
- >
157
- <div class="wechat-modal">
158
- <h1>{{ t('footer.wechat.modalText') }}</h1>
159
- <h1>{{ t('footer.wechat.modalText2') }}</h1>
160
- <div class="qr-img" />
161
- <div>
162
- <button
163
- class="btn role-primary"
164
- tabindex="0"
165
- :aria-label="t('generic.close')"
166
- role="button"
167
- @click="close"
168
- @keydown.enter.stop
169
- >
170
- {{ t('generic.close') }}
171
- </button>
172
- </div>
173
- </div>
174
- </app-modal>
175
145
  </div>
176
146
  </template>
177
147
 
@@ -188,29 +158,4 @@ export default {
188
158
  .support-link:not(:last-child) {
189
159
  margin-bottom: 15px;
190
160
  }
191
-
192
- .wechat-modal {
193
- margin: 60px;
194
- display: flex;
195
- flex-direction: column;
196
- align-items: center;
197
- }
198
-
199
- .link {
200
- cursor: pointer;
201
- }
202
-
203
- .btn {
204
- margin: 20px auto 0;
205
- }
206
-
207
- .qr-img {
208
- background-image: url('../assets/images/wechat-qr-code.jpg');
209
- background-repeat: no-repeat;
210
- background-size: cover;
211
- background-position: center center;
212
- height: 128px;
213
- width: 128px;
214
- margin: 15px auto 10px;
215
- }
216
161
  </style>
@@ -544,7 +544,10 @@ export default {
544
544
  class="flex-right"
545
545
  >{{ t('generic.moreInfo') }} <i class="icon icon-external-link" /></a>
546
546
  </div>
547
- <hr v-if="subtype.description">
547
+ <hr
548
+ v-if="subtype.description"
549
+ role="none"
550
+ >
548
551
  <div
549
552
  v-if="subtype.description"
550
553
  class="description"
@@ -906,6 +909,8 @@ form.create-resource-container .cru {
906
909
  position: sticky;
907
910
  bottom: 0;
908
911
  background-color: var(--header-bg);
912
+ height: $footer-height;
913
+ box-sizing: border-box;
909
914
 
910
915
  // Overrides outlet padding
911
916
  margin-left: -$space-m;
@@ -9,7 +9,6 @@ import { PanelLocation, ExtensionPoint } from '@shell/core/types';
9
9
  import ExtensionPanel from '@shell/components/ExtensionPanel';
10
10
  import Masthead from '@shell/components/ResourceList/Masthead';
11
11
  import { mapPref, GROUP_RESOURCES, ALL_NAMESPACES, DEV } from '@shell/store/prefs';
12
- import MoveModal from '@shell/components/MoveModal';
13
12
  import ButtonMultiAction from '@shell/components/ButtonMultiAction.vue';
14
13
  import { escapeHtml } from '@shell/utils/string';
15
14
  import { NAMESPACE_FILTER_ALL_ORPHANS } from '@shell/utils/namespace-filter';
@@ -24,7 +23,6 @@ export default {
24
23
  components: {
25
24
  ExtensionPanel,
26
25
  Masthead,
27
- MoveModal,
28
26
  ResourceTable,
29
27
  ButtonMultiAction,
30
28
  ActionMenu,
@@ -89,9 +87,20 @@ export default {
89
87
  }
90
88
  };
91
89
  },
92
-
90
+ watch: {
91
+ actionCb: {
92
+ handler(neu) {
93
+ if (neu?.moveNamespaceCb) {
94
+ this.clearSelection();
95
+ this.$store.dispatch('action-menu/clearCallbackData');
96
+ }
97
+ },
98
+ immediate: true
99
+ }
100
+ },
93
101
  computed: {
94
102
  ...mapGetters(['currentCluster', 'currentProduct']),
103
+ ...mapGetters({ actionCb: 'action-menu/performCallbackData' }),
95
104
  namespaces() {
96
105
  const inStore = this.$store.getters['currentStore'](NAMESPACE);
97
106
 
@@ -569,7 +578,6 @@ export default {
569
578
  </tr>
570
579
  </template>
571
580
  </ResourceTable>
572
- <MoveModal @moving="clearSelection" />
573
581
  </div>
574
582
  </template>
575
583
  <style lang="scss" scoped>
@@ -49,6 +49,10 @@ export default {
49
49
  userId: {
50
50
  type: String,
51
51
  default: ''
52
+ },
53
+ watchOverride: {
54
+ type: Boolean,
55
+ default: true,
52
56
  }
53
57
  },
54
58
  async fetch() {
@@ -138,7 +142,7 @@ export default {
138
142
  this.update();
139
143
  },
140
144
  userId(userId, oldUserId) {
141
- if (userId === oldUserId) {
145
+ if (userId === oldUserId || this.watchOverride === true) {
142
146
  return;
143
147
  }
144
148
  this.update();
@@ -107,6 +107,7 @@ export default {
107
107
  @click="close(growl)"
108
108
  />
109
109
  <div
110
+ v-if="growl.title"
110
111
  :id="`growl-title-${ growl.id }`"
111
112
  class="growl-text-title"
112
113
  >
@@ -108,6 +108,7 @@ export default {
108
108
  :value="afterLoginRoute"
109
109
  name="login-route"
110
110
  :options="routeRadioOptions"
111
+ :aria-label="`${t('prefs.landing.label')} - ${ t('landing.landingPrefs.body')}`"
111
112
  @update:value="updateLoginRoute"
112
113
  >
113
114
  <template #label>
@@ -119,6 +120,7 @@ export default {
119
120
  <div class="custom-page">
120
121
  <RadioButton
121
122
  :label="option.label"
123
+ :radio-option-id="option.radioOptionId"
122
124
  :val="false"
123
125
  :value="afterLoginRoute=== 'home' || afterLoginRoute === 'last-visited'"
124
126
  :v-bind="$attrs"
@@ -4,7 +4,7 @@ import Select from '@shell/components/form/Select.vue';
4
4
  import { RcDropdown, RcDropdownTrigger, RcDropdownItem } from '@components/RcDropdown';
5
5
 
6
6
  export default {
7
- name: 'LocalSelector',
7
+ name: 'LocaleSelector',
8
8
 
9
9
  components: {
10
10
  Select,
@@ -0,0 +1,55 @@
1
+ <script lang="ts" setup>
2
+ import { computed, ref } from 'vue';
3
+ import { useStore } from 'vuex';
4
+
5
+ import AppModal from '@shell/components/AppModal.vue';
6
+
7
+ const store = useStore();
8
+
9
+ const isOpen = computed(() => store.getters['modal/isOpen']);
10
+ const component = computed(() => store.getters['modal/component']);
11
+ const componentProps = computed(() => store.getters['modal/componentProps']);
12
+ const resources = computed(() => store.getters['modal/resources']);
13
+ const closeOnClickOutside = computed(() => store.getters['modal/closeOnClickOutside']);
14
+ const modalWidth = computed(() => store.getters['modal/modalWidth']);
15
+ // const modalSticky = computed(() => store.getters['modal/modalSticky']); // TODO: Implement sticky modals
16
+
17
+ const backgroundClosing = ref<Function | null>(null);
18
+
19
+ function close() {
20
+ if (!isOpen.value) return;
21
+
22
+ if (backgroundClosing.value) {
23
+ backgroundClosing.value();
24
+ }
25
+
26
+ store.commit('modal/closeModal');
27
+ }
28
+
29
+ function registerBackgroundClosing(fn: Function) {
30
+ backgroundClosing.value = fn;
31
+ }
32
+ </script>
33
+
34
+ <template>
35
+ <Teleport to="#modals">
36
+ <app-modal
37
+ v-if="isOpen && component"
38
+ :click-to-close="closeOnClickOutside"
39
+ :width="modalWidth"
40
+ :style="{ '--prompt-modal-width': modalWidth }"
41
+ :trigger-focus-trap="true"
42
+ tabindex="0"
43
+ @close="close"
44
+ >
45
+ <component
46
+ :is="component"
47
+ v-bind="componentProps || {}"
48
+ data-testid="modal-manager-component"
49
+ :resources="resources"
50
+ :register-background-closing="registerBackgroundClosing"
51
+ @close="close"
52
+ />
53
+ </app-modal>
54
+ </Teleport>
55
+ </template>