@rancher/shell 3.0.4 → 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 (270) hide show
  1. package/assets/images/providers/sks.svg +1 -0
  2. package/assets/styles/base/_basic.scss +6 -0
  3. package/assets/styles/base/_helpers.scss +4 -0
  4. package/assets/styles/base/_variables.scss +1 -0
  5. package/assets/styles/global/_button.scss +1 -0
  6. package/assets/translations/en-us.yaml +65 -15
  7. package/assets/translations/zh-hans.yaml +4 -3
  8. package/chart/monitoring/index.vue +3 -1
  9. package/cloud-credential/aws.vue +2 -0
  10. package/components/ActionDropdownShell.vue +71 -0
  11. package/components/AppModal.vue +18 -4
  12. package/components/AsyncButton.vue +24 -7
  13. package/components/BannerGraphic.vue +1 -0
  14. package/components/CommunityLinks.vue +4 -59
  15. package/components/CopyToClipboardText.vue +2 -1
  16. package/components/CruResource.vue +6 -1
  17. package/components/DetailText.vue +5 -0
  18. package/components/ExplorerMembers.vue +1 -1
  19. package/components/ExplorerProjectsNamespaces.vue +68 -18
  20. package/components/GlobalRoleBindings.vue +5 -1
  21. package/components/GrowlManager.vue +1 -0
  22. package/components/LandingPagePreference.vue +7 -3
  23. package/components/LocaleSelector.vue +39 -95
  24. package/components/ModalManager.vue +55 -0
  25. package/components/ModalWithCard.vue +1 -0
  26. package/components/PromptModal.vue +47 -8
  27. package/components/PromptRemove.vue +1 -0
  28. package/components/PromptRestore.vue +1 -0
  29. package/components/ResourceCancelModal.vue +1 -0
  30. package/components/ResourceDetail/Masthead.vue +38 -12
  31. package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
  32. package/components/ResourceDetail/index.vue +47 -12
  33. package/components/ResourceTable.vue +54 -19
  34. package/components/SideNav.vue +5 -1
  35. package/components/SlideInPanelManager.vue +126 -0
  36. package/components/SortableTable/THead.vue +5 -2
  37. package/components/SortableTable/actions.js +1 -1
  38. package/components/SortableTable/index.vue +64 -51
  39. package/components/SortableTable/paging.js +16 -19
  40. package/components/SortableTable/selection.js +0 -11
  41. package/components/Wizard.vue +2 -2
  42. package/components/__tests__/AsyncButton.test.ts +2 -2
  43. package/components/__tests__/ModalManager.spec.ts +176 -0
  44. package/components/__tests__/PromptModal.test.ts +148 -0
  45. package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
  46. package/components/auth/AuthBanner.vue +13 -11
  47. package/components/auth/Principal.vue +1 -0
  48. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  49. package/components/auth/login/ldap.vue +1 -1
  50. package/components/fleet/FleetResources.vue +21 -6
  51. package/components/form/ArrayList.vue +76 -60
  52. package/components/form/BannerSettings.vue +17 -2
  53. package/components/form/ColorInput.vue +35 -6
  54. package/components/form/Command.vue +6 -15
  55. package/components/form/EnvVars.vue +16 -8
  56. package/components/form/HealthCheck.vue +3 -3
  57. package/components/form/HookOption.vue +11 -16
  58. package/components/form/LabeledSelect.vue +18 -22
  59. package/components/form/LifecycleHooks.vue +3 -3
  60. package/components/form/MatchExpressions.vue +14 -8
  61. package/components/form/NameNsDescription.vue +128 -104
  62. package/components/form/Networking.vue +20 -12
  63. package/components/form/NodeAffinity.vue +31 -23
  64. package/components/form/NodeScheduling.vue +13 -3
  65. package/components/form/NotificationSettings.vue +15 -1
  66. package/components/form/Password.vue +1 -0
  67. package/components/form/PodAffinity.vue +43 -43
  68. package/components/form/Probe.vue +68 -66
  69. package/components/form/ResourceQuota/Project.vue +5 -1
  70. package/components/form/ResourceSelector.vue +7 -9
  71. package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +16 -24
  72. package/components/form/SSHKnownHosts/index.vue +30 -13
  73. package/components/form/Security.vue +54 -56
  74. package/components/form/Select.vue +32 -21
  75. package/components/form/ShellInput.vue +5 -1
  76. package/components/form/Tolerations.vue +5 -1
  77. package/components/form/ValueFromResource.vue +134 -121
  78. package/components/form/WorkloadPorts.vue +18 -18
  79. package/components/form/__tests__/ArrayList.test.ts +5 -2
  80. package/components/form/__tests__/ColorInput.test.ts +35 -0
  81. package/components/form/__tests__/LabeledSelect.test.ts +40 -0
  82. package/components/form/__tests__/MatchExpressions.test.ts +12 -12
  83. package/components/form/__tests__/NameNsDescription.test.ts +115 -14
  84. package/components/form/__tests__/Probe.test.ts +12 -8
  85. package/components/form/__tests__/SSHKnownHosts.test.ts +22 -2
  86. package/components/form/__tests__/Select.test.ts +37 -0
  87. package/components/formatter/InternalExternalIP.vue +2 -0
  88. package/components/formatter/SecretData.vue +20 -7
  89. package/components/nav/Group.vue +27 -5
  90. package/components/nav/Header.vue +17 -43
  91. package/components/nav/NamespaceFilter.vue +134 -86
  92. package/components/nav/TopLevelMenu.vue +4 -5
  93. package/components/nav/Type.vue +12 -1
  94. package/components/nav/WindowManager/ContainerLogs.vue +87 -61
  95. package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
  96. package/components/templates/blank.vue +4 -1
  97. package/components/templates/default.vue +8 -3
  98. package/components/templates/home.vue +10 -1
  99. package/components/templates/plain.vue +10 -4
  100. package/composables/focusTrap.ts +12 -4
  101. package/composables/useRuntimeFlag.ts +29 -0
  102. package/config/router/routes.js +20 -13
  103. package/config/store.js +4 -0
  104. package/config/uiplugins.js +5 -1
  105. package/core/types.ts +12 -6
  106. package/detail/catalog.cattle.io.app.vue +6 -1
  107. package/detail/fleet.cattle.io.bundle.vue +70 -6
  108. package/detail/fleet.cattle.io.gitrepo.vue +1 -1
  109. package/detail/namespace.vue +0 -3
  110. package/detail/node.vue +17 -13
  111. package/detail/provisioning.cattle.io.cluster.vue +72 -6
  112. package/dialog/AddCustomBadgeDialog.vue +1 -1
  113. package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
  114. package/{components/AssignTo.vue → dialog/AssignToDialog.vue} +71 -80
  115. package/dialog/ChangePasswordDialog.vue +106 -0
  116. package/dialog/DeactivateDriverDialog.vue +1 -0
  117. package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
  118. package/dialog/DisableAuthProviderDialog.vue +101 -0
  119. package/dialog/DrainNode.vue +1 -1
  120. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
  121. package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +69 -57
  122. package/dialog/FeatureFlagListDialog.vue +288 -0
  123. package/dialog/ForceMachineRemoveDialog.vue +5 -2
  124. package/{components/Import.vue → dialog/ImportDialog.vue} +0 -5
  125. package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
  126. package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -59
  127. package/dialog/MoveNamespaceDialog.vue +157 -0
  128. package/dialog/ScalePoolDownDialog.vue +1 -1
  129. package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
  130. package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
  131. package/dialog/WechatDialog.vue +57 -0
  132. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
  133. package/edit/auth/__tests__/oidc.test.ts +152 -109
  134. package/edit/auth/azuread.vue +2 -1
  135. package/edit/auth/github.vue +1 -1
  136. package/edit/auth/googleoauth.vue +5 -1
  137. package/edit/auth/ldap/index.vue +1 -1
  138. package/edit/auth/oidc.vue +38 -5
  139. package/edit/auth/saml.vue +1 -1
  140. package/edit/cloudcredential.vue +24 -9
  141. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
  142. package/edit/management.cattle.io.user.vue +28 -3
  143. package/edit/namespace.vue +1 -4
  144. package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
  145. package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
  146. package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
  147. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
  148. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
  149. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -8
  150. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
  151. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +66 -0
  152. package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
  153. package/edit/provisioning.cattle.io.cluster/rke2.vue +49 -41
  154. package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
  155. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
  156. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
  157. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +2 -2
  158. package/edit/token.vue +2 -0
  159. package/edit/workload/index.vue +1 -0
  160. package/edit/workload/mixins/workload.js +0 -2
  161. package/initialize/install-plugins.js +2 -1
  162. package/list/harvesterhci.io.management.cluster.vue +4 -1
  163. package/list/management.cattle.io.feature.vue +4 -287
  164. package/list/provisioning.cattle.io.cluster.vue +20 -12
  165. package/machine-config/azure.vue +16 -4
  166. package/mixins/vue-select-overrides.js +0 -4
  167. package/models/__tests__/namespace.test.ts +25 -1
  168. package/models/cloudcredential.js +5 -0
  169. package/models/fleet.cattle.io.cluster.js +8 -2
  170. package/models/fleet.cattle.io.gitrepo.js +8 -34
  171. package/models/kontainerdriver.js +6 -3
  172. package/models/management.cattle.io.feature.js +7 -1
  173. package/models/management.cattle.io.node.js +3 -3
  174. package/models/namespace.js +11 -6
  175. package/models/nodedriver.js +6 -3
  176. package/models/workload.js +4 -1
  177. package/package.json +3 -3
  178. package/pages/about.vue +13 -3
  179. package/pages/account/index.vue +16 -6
  180. package/pages/auth/login.vue +18 -7
  181. package/pages/auth/logout.vue +4 -1
  182. package/pages/auth/setup.vue +2 -0
  183. package/pages/auth/verify.vue +13 -8
  184. package/pages/c/_cluster/apps/charts/chart.vue +1 -1
  185. package/pages/c/_cluster/apps/charts/install.vue +26 -26
  186. package/pages/c/_cluster/auth/config/index.vue +10 -12
  187. package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
  188. package/pages/c/_cluster/explorer/index.vue +17 -15
  189. package/pages/c/_cluster/istio/index.vue +2 -2
  190. package/pages/c/_cluster/longhorn/index.vue +1 -1
  191. package/pages/c/_cluster/monitoring/index.vue +1 -1
  192. package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
  193. package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
  194. package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
  195. package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
  196. package/pages/c/_cluster/neuvector/index.vue +1 -1
  197. package/pages/c/_cluster/settings/banners.vue +4 -3
  198. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
  199. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
  200. package/pages/c/_cluster/uiplugins/index.vue +98 -55
  201. package/pages/diagnostic.vue +59 -11
  202. package/pages/fail-whale.vue +14 -8
  203. package/pages/home.vue +24 -18
  204. package/pages/prefs.vue +7 -6
  205. package/pages/support/index.vue +4 -1
  206. package/plugins/internal-api/index.ts +37 -0
  207. package/plugins/internal-api/shared/base-api.ts +13 -0
  208. package/plugins/internal-api/shell/shell.api.ts +108 -0
  209. package/plugins/steve/actions.js +0 -12
  210. package/public/index.html +1 -0
  211. package/rancher-components/Card/Card.vue +1 -1
  212. package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
  213. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -3
  214. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +47 -0
  215. package/rancher-components/Form/LabeledInput/LabeledInput.vue +20 -2
  216. package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
  217. package/rancher-components/Form/Radio/RadioButton.vue +20 -4
  218. package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
  219. package/rancher-components/Form/Radio/RadioGroup.vue +52 -10
  220. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +17 -0
  221. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +5 -0
  222. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +10 -1
  223. package/rancher-components/RcButton/RcButton.vue +2 -1
  224. package/rancher-components/RcButton/types.ts +1 -0
  225. package/rancher-components/RcDropdown/RcDropdown.vue +18 -6
  226. package/rancher-components/RcDropdown/RcDropdownItem.vue +3 -56
  227. package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +68 -0
  228. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +92 -0
  229. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -0
  230. package/rancher-components/RcDropdown/index.ts +2 -0
  231. package/rancher-components/RcDropdown/useDropdownCollection.ts +8 -0
  232. package/rancher-components/RcDropdown/useDropdownContext.ts +9 -3
  233. package/rancher-components/RcDropdown/useDropdownItem.ts +63 -0
  234. package/scripts/extension/bundle +20 -0
  235. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
  236. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  237. package/scripts/extension/helmpatch +44 -31
  238. package/scripts/extension/publish +12 -12
  239. package/scripts/typegen.sh +2 -4
  240. package/server/har-file.js +25 -3
  241. package/store/action-menu.js +26 -56
  242. package/store/features.js +2 -1
  243. package/store/index.js +5 -0
  244. package/store/modal.ts +71 -0
  245. package/store/slideInPanel.ts +47 -0
  246. package/store/type-map.js +12 -1
  247. package/store/type-map.utils.ts +4 -4
  248. package/types/global-vue.d.ts +5 -0
  249. package/types/internal-api/shell/growl.d.ts +25 -0
  250. package/types/internal-api/shell/modal.d.ts +77 -0
  251. package/types/internal-api/shell/slideIn.d.ts +15 -0
  252. package/types/resources/fleet.d.ts +0 -14
  253. package/types/shell/index.d.ts +43 -24
  254. package/types/vue-shim.d.ts +4 -1
  255. package/utils/__mocks__/tabbable.js +13 -0
  256. package/utils/__tests__/object.test.ts +38 -4
  257. package/utils/cluster.js +35 -0
  258. package/utils/fleet.ts +15 -73
  259. package/utils/object.js +48 -5
  260. package/utils/validators/formRules/__tests__/index.test.ts +10 -1
  261. package/utils/validators/formRules/index.ts +27 -3
  262. package/utils/validators/machine-pool.ts +20 -0
  263. package/components/DisableAuthProviderModal.vue +0 -114
  264. package/components/MoveModal.vue +0 -166
  265. package/components/PromptChangePassword.vue +0 -123
  266. package/components/fleet/FleetBundleResources.vue +0 -86
  267. package/components/formatter/ExtensionCache.vue +0 -74
  268. package/components/formatter/Port.vue +0 -24
  269. package/components/formatter/SecretType.vue +0 -41
  270. package/types/vue-shim.d +0 -20
@@ -10,8 +10,11 @@ import AsyncButton from '@shell/components/AsyncButton';
10
10
  import Select from '@shell/components/form/Select';
11
11
  import VirtualList from 'vue3-virtual-scroll-list';
12
12
  import LogItem from '@shell/components/LogItem';
13
+ import ContainerLogsActions from '@shell/components/nav/WindowManager/ContainerLogsActions.vue';
13
14
  import { shallowRef } from 'vue';
15
+ import { useStore } from 'vuex';
14
16
  import { debounce } from 'lodash';
17
+ import { useRuntimeFlag } from '@shell/composables/useRuntimeFlag';
15
18
 
16
19
  import { escapeRegex } from '@shell/utils/string';
17
20
  import { HARVESTER_NAME as VIRTUAL } from '@shell/config/features';
@@ -91,6 +94,7 @@ export default {
91
94
  Checkbox,
92
95
  AsyncButton,
93
96
  VirtualList,
97
+ ContainerLogsActions,
94
98
  },
95
99
 
96
100
  props: {
@@ -130,6 +134,13 @@ export default {
130
134
  }
131
135
  },
132
136
 
137
+ setup() {
138
+ const store = useStore();
139
+ const { featureDropdownMenu } = useRuntimeFlag(store);
140
+
141
+ return { featureDropdownMenu };
142
+ },
143
+
133
144
  data() {
134
145
  return {
135
146
  container: this.initialContainer || this.pod?.defaultContainerName,
@@ -145,7 +156,8 @@ export default {
145
156
  lines: [],
146
157
  now: new Date(),
147
158
  logItem: shallowRef(LogItem),
148
- isContainerMenuOpen: false
159
+ isContainerMenuOpen: false,
160
+ range: '',
149
161
  };
150
162
  },
151
163
 
@@ -636,72 +648,85 @@ export default {
636
648
  </div>
637
649
 
638
650
  <div class="log-action log-action-group ml-5">
639
- <div
640
- role="menu"
641
- tabindex="0"
642
- :aria-label="t('wm.containerLogs.logActionMenu')"
643
- @click="openContainerMenu"
644
- @blur.capture="closeContainerMenu"
645
- @keyup.enter="openContainerMenu"
646
- @keyup.space="openContainerMenu"
647
- >
648
- <v-dropdown
649
- :triggers="[]"
650
- :shown="isContainerMenuOpen"
651
- placement="top"
652
- popperClass="containerLogsDropdown"
653
- :autoHide="false"
654
- :flip="false"
655
- :container="false"
656
- @focus.capture="openContainerMenu"
651
+ <template v-if="featureDropdownMenu">
652
+ <ContainerLogsActions
653
+ :range="range"
654
+ :range-options="rangeOptions"
655
+ :wrap="wrap"
656
+ :timestamps="timestamps"
657
+ @toggle-range="toggleRange"
658
+ @toggle-wrap="toggleWrap"
659
+ @toggle-timestamps="toggleTimestamps"
660
+ />
661
+ </template>
662
+ <template v-else>
663
+ <div
664
+ role="menu"
665
+ tabindex="0"
666
+ :aria-label="t('wm.containerLogs.logActionMenu')"
667
+ @click="openContainerMenu"
668
+ @blur.capture="closeContainerMenu"
669
+ @keyup.enter="openContainerMenu"
670
+ @keyup.space="openContainerMenu"
657
671
  >
658
- <button
659
- class="btn role-primary btn-cog"
660
- role="button"
661
- :aria-label="t('wm.containerLogs.options')"
672
+ <v-dropdown
673
+ :triggers="[]"
674
+ :shown="isContainerMenuOpen"
675
+ placement="top"
676
+ popperClass="containerLogsDropdown"
677
+ :autoHide="false"
678
+ :flip="false"
679
+ :container="false"
680
+ @focus.capture="openContainerMenu"
662
681
  >
663
- <i
664
- class="icon icon-gear"
665
- :alt="t('wm.containerLogs.options')"
666
- />
667
- <i
668
- class="icon icon-chevron-up"
669
- :alt="t('wm.containerLogs.expand')"
670
- />
671
- </button>
672
-
673
- <template #popper>
674
- <div class="filter-popup">
675
- <LabeledSelect
676
- v-model:value="range"
677
- class="range"
678
- :label="t('wm.containerLogs.range.label')"
679
- :options="rangeOptions"
680
- :clearable="false"
681
- placement="top"
682
- role="menuitem"
683
- @update:value="toggleRange($event)"
682
+ <button
683
+ class="btn role-primary btn-cog"
684
+ role="button"
685
+ :aria-label="t('wm.containerLogs.options')"
686
+ >
687
+ <i
688
+ class="icon icon-gear"
689
+ :alt="t('wm.containerLogs.options')"
684
690
  />
685
- <div>
686
- <Checkbox
687
- :label="t('wm.containerLogs.wrap')"
688
- :value="wrap"
689
- role="menuitem"
690
- @update:value="toggleWrap"
691
- />
692
- </div>
693
- <div>
694
- <Checkbox
695
- :label="t('wm.containerLogs.timestamps')"
696
- :value="timestamps"
691
+ <i
692
+ class="icon icon-chevron-up"
693
+ :alt="t('wm.containerLogs.expand')"
694
+ />
695
+ </button>
696
+
697
+ <template #popper>
698
+ <div class="filter-popup">
699
+ <LabeledSelect
700
+ v-model:value="range"
701
+ class="range"
702
+ :label="t('wm.containerLogs.range.label')"
703
+ :options="rangeOptions"
704
+ :clearable="false"
705
+ placement="top"
697
706
  role="menuitem"
698
- @update:value="toggleTimestamps"
707
+ @update:value="toggleRange($event)"
699
708
  />
709
+ <div>
710
+ <Checkbox
711
+ :label="t('wm.containerLogs.wrap')"
712
+ :value="wrap"
713
+ role="menuitem"
714
+ @update:value="toggleWrap"
715
+ />
716
+ </div>
717
+ <div>
718
+ <Checkbox
719
+ :label="t('wm.containerLogs.timestamps')"
720
+ :value="timestamps"
721
+ role="menuitem"
722
+ @update:value="toggleTimestamps"
723
+ />
724
+ </div>
700
725
  </div>
701
- </div>
702
- </template>
703
- </v-dropdown>
704
- </div>
726
+ </template>
727
+ </v-dropdown>
728
+ </div>
729
+ </template>
705
730
  </div>
706
731
 
707
732
  <div class="log-action log-action-group ml-5">
@@ -874,4 +899,5 @@ export default {
874
899
  }
875
900
  }
876
901
  }
902
+
877
903
  </style>
@@ -0,0 +1,76 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ RcDropdown,
4
+ RcDropdownTrigger,
5
+ RcDropdownItemCheckbox,
6
+ RcDropdownItemSelect,
7
+ } from '@components/RcDropdown';
8
+
9
+ defineProps({
10
+ range: {
11
+ type: String,
12
+ default: '',
13
+ },
14
+ rangeOptions: {
15
+ type: Array,
16
+ default() {
17
+ return [];
18
+ },
19
+ },
20
+ wrap: Boolean,
21
+ timestamps: Boolean,
22
+ });
23
+
24
+ defineEmits([
25
+ 'toggleRange',
26
+ 'toggleWrap',
27
+ 'toggleTimestamps',
28
+ ]);
29
+
30
+ </script>
31
+
32
+ <template>
33
+ <rc-dropdown>
34
+ <rc-dropdown-trigger
35
+ class="condensed"
36
+ >
37
+ <i
38
+ class="icon icon-gear"
39
+ :alt="t('wm.containerLogs.options')"
40
+ />
41
+ <template #after>
42
+ <i
43
+ class="icon icon-chevron-up"
44
+ :alt="t('wm.containerLogs.expand')"
45
+ />
46
+ </template>
47
+ </rc-dropdown-trigger>
48
+ <template #dropdownCollection>
49
+ <rc-dropdown-item-select
50
+ :model-value="range"
51
+ :options="rangeOptions"
52
+ @select="$emit('toggleRange', $event)"
53
+ />
54
+ <rc-dropdown-item-checkbox
55
+ :model-value="wrap"
56
+ @click="$emit('toggleWrap', $event)"
57
+ >
58
+ {{ t('wm.containerLogs.wrap') }}
59
+ </rc-dropdown-item-checkbox>
60
+ <rc-dropdown-item-checkbox
61
+ :model-value="timestamps"
62
+ @click="$emit('toggleTimestamps', $event)"
63
+ >
64
+ {{ t('wm.containerLogs.timestamps') }}
65
+ </rc-dropdown-item-checkbox>
66
+ </template>
67
+ </rc-dropdown>
68
+ </template>
69
+
70
+ <style lang="scss" scoped>
71
+ .condensed {
72
+ padding-left: 0.5rem;
73
+ padding-right: 0.5rem;
74
+ min-height: 30px;
75
+ }
76
+ </style>
@@ -9,7 +9,10 @@ export default {
9
9
  </script>
10
10
 
11
11
  <template>
12
- <main class="main-layout">
12
+ <main
13
+ class="main-layout"
14
+ :aria-label="t('layouts.blank')"
15
+ >
13
16
  <router-view :key="$route.path" />
14
17
 
15
18
  <Inactivity />
@@ -7,11 +7,12 @@ import {
7
7
  } from '@shell/store/prefs';
8
8
  import ActionMenu from '@shell/components/ActionMenu';
9
9
  import GrowlManager from '@shell/components/GrowlManager';
10
+ import ModalManager from '@shell/components/ModalManager';
11
+ import SlideInPanelManager from '@shell/components/SlideInPanelManager';
10
12
  import WindowManager from '@shell/components/nav/WindowManager';
11
13
  import PromptRemove from '@shell/components/PromptRemove';
12
14
  import PromptRestore from '@shell/components/PromptRestore';
13
15
  import PromptModal from '@shell/components/PromptModal';
14
- import AssignTo from '@shell/components/AssignTo';
15
16
  import Header from '@shell/components/nav/Header';
16
17
  import Inactivity from '@shell/components/Inactivity';
17
18
  import Brand from '@shell/mixins/brand';
@@ -34,11 +35,12 @@ export default {
34
35
  components: {
35
36
  PromptRemove,
36
37
  PromptRestore,
37
- AssignTo,
38
38
  PromptModal,
39
39
  Header,
40
40
  ActionMenu,
41
41
  GrowlManager,
42
+ ModalManager,
43
+ SlideInPanelManager,
42
44
  WindowManager,
43
45
  FixedBanner,
44
46
  AwsComplianceBanner,
@@ -198,6 +200,7 @@ export default {
198
200
  <main
199
201
  v-if="clusterAndRouteReady"
200
202
  class="main-layout"
203
+ :aria-label="t('layouts.default')"
201
204
  >
202
205
  <router-view
203
206
  :key="$route.path"
@@ -206,8 +209,8 @@ export default {
206
209
  <ActionMenu />
207
210
  <PromptRemove />
208
211
  <PromptRestore />
209
- <AssignTo />
210
212
  <PromptModal />
213
+ <ModalManager />
211
214
  <button
212
215
  v-if="noLocaleShortcut"
213
216
  v-shortkey.once="['shift','l']"
@@ -235,6 +238,7 @@ export default {
235
238
  <main
236
239
  v-else-if="unmatchedRoute"
237
240
  class="main-layout"
241
+ :aria-label="t('layouts.default')"
238
242
  >
239
243
  <router-view
240
244
  :key="$route.path"
@@ -257,6 +261,7 @@ export default {
257
261
  </div>
258
262
  <FixedBanner :footer="true" />
259
263
  <GrowlManager />
264
+ <SlideInPanelManager />
260
265
  <Inactivity />
261
266
  <DraggableZone ref="draggableZone" />
262
267
  </div>
@@ -3,6 +3,8 @@ import Header from '@shell/components/nav/Header';
3
3
  import Brand from '@shell/mixins/brand';
4
4
  import FixedBanner from '@shell/components/FixedBanner';
5
5
  import GrowlManager from '@shell/components/GrowlManager';
6
+ import ModalManager from '@shell/components/ModalManager';
7
+ import SlideInPanelManager from '@shell/components/SlideInPanelManager';
6
8
  import { mapPref, THEME_SHORTCUT } from '@shell/store/prefs';
7
9
  import AwsComplianceBanner from '@shell/components/AwsComplianceBanner';
8
10
  import AzureWarning from '@shell/components/auth/AzureWarning';
@@ -17,6 +19,8 @@ export default {
17
19
  Header,
18
20
  FixedBanner,
19
21
  GrowlManager,
22
+ ModalManager,
23
+ SlideInPanelManager,
20
24
  AzureWarning,
21
25
  AwsComplianceBanner,
22
26
  Inactivity,
@@ -58,6 +62,7 @@ export default {
58
62
  <AwsComplianceBanner />
59
63
  <AzureWarning />
60
64
  <PromptModal />
65
+ <ModalManager />
61
66
  <div
62
67
  class="dashboard-content"
63
68
  :class="{'dashboard-padding-left': showTopLevelMenu}"
@@ -67,7 +72,10 @@ export default {
67
72
  :simple="true"
68
73
  />
69
74
 
70
- <main class="main-layout">
75
+ <main
76
+ class="main-layout"
77
+ :aria-label="t('layouts.home')"
78
+ >
71
79
  <router-view
72
80
  :key="$route.path"
73
81
  class="outlet"
@@ -76,6 +84,7 @@ export default {
76
84
  </div>
77
85
  <FixedBanner :footer="true" />
78
86
  <GrowlManager />
87
+ <SlideInPanelManager />
79
88
  <button
80
89
  v-if="themeShortcut"
81
90
  v-shortkey.once="['shift','t']"
@@ -3,11 +3,12 @@ import { mapPref, THEME_SHORTCUT } from '@shell/store/prefs';
3
3
  import ActionMenu from '@shell/components/ActionMenu';
4
4
  import Header from '@shell/components/nav/Header';
5
5
  import PromptRemove from '@shell/components/PromptRemove';
6
- import AssignTo from '@shell/components/AssignTo';
7
6
  import IndentedPanel from '@shell/components/IndentedPanel';
8
7
  import Brand from '@shell/mixins/brand';
9
8
  import FixedBanner from '@shell/components/FixedBanner';
10
9
  import GrowlManager from '@shell/components/GrowlManager';
10
+ import ModalManager from '@shell/components/ModalManager';
11
+ import SlideInPanelManager from '@shell/components/SlideInPanelManager';
11
12
  import AwsComplianceBanner from '@shell/components/AwsComplianceBanner';
12
13
  import AzureWarning from '@shell/components/auth/AzureWarning';
13
14
  import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
@@ -19,13 +20,14 @@ export default {
19
20
 
20
21
  components: {
21
22
  ActionMenu,
22
- AssignTo,
23
23
  Header,
24
24
  IndentedPanel,
25
25
  PromptRemove,
26
26
  PromptModal,
27
27
  FixedBanner,
28
28
  GrowlManager,
29
+ ModalManager,
30
+ SlideInPanelManager,
29
31
  AwsComplianceBanner,
30
32
  AzureWarning,
31
33
  Inactivity
@@ -68,7 +70,10 @@ export default {
68
70
  :class="{'dashboard-padding-left': showTopLevelMenu}"
69
71
  >
70
72
  <Header :simple="true" />
71
- <main class="main-layout">
73
+ <main
74
+ class="main-layout"
75
+ :aria-label="t('layouts.plain')"
76
+ >
72
77
  <IndentedPanel class="pt-20">
73
78
  <router-view
74
79
  :key="$route.path"
@@ -78,7 +83,7 @@ export default {
78
83
  <ActionMenu />
79
84
  <PromptRemove />
80
85
  <PromptModal />
81
- <AssignTo />
86
+ <ModalManager />
82
87
  <button
83
88
  v-if="themeShortcut"
84
89
  v-shortkey.once="['shift','t']"
@@ -96,6 +101,7 @@ export default {
96
101
 
97
102
  <FixedBanner :footer="true" />
98
103
  <GrowlManager />
104
+ <SlideInPanelManager />
99
105
  <Inactivity />
100
106
  </div>
101
107
  </template>
@@ -46,12 +46,12 @@ export function useBasicSetupFocusTrap(focusElement: string | HTMLElement, opts:
46
46
  });
47
47
  }
48
48
 
49
- export function useWatcherBasedSetupFocusTrapWithDestroyIncluded(watchVar:any, focusElement: string | HTMLElement, opts:any = DEFAULT_FOCUS_TRAP_OPTS) {
49
+ export function useWatcherBasedSetupFocusTrapWithDestroyIncluded(watchVar:any, focusElement: string | HTMLElement, opts:any = DEFAULT_FOCUS_TRAP_OPTS, useUnmountHook = false) {
50
50
  let focusTrapInstance: FocusTrap;
51
51
  let focusEl;
52
52
 
53
53
  watch(watchVar, (neu) => {
54
- if (neu) {
54
+ if (neu && !focusTrapInstance) {
55
55
  nextTick(() => {
56
56
  focusEl = typeof focusElement === 'string' ? document.querySelector(focusElement) as HTMLElement : focusElement;
57
57
 
@@ -61,8 +61,16 @@ export function useWatcherBasedSetupFocusTrapWithDestroyIncluded(watchVar:any, f
61
61
  focusTrapInstance.activate();
62
62
  });
63
63
  });
64
- } else if (!neu && Object.keys(focusTrapInstance).length) {
64
+ } else if (!neu && focusTrapInstance && Object.keys(focusTrapInstance).length && !useUnmountHook) {
65
65
  focusTrapInstance.deactivate();
66
66
  }
67
- });
67
+ }, { immediate: true });
68
+
69
+ if (useUnmountHook) {
70
+ onBeforeUnmount(() => {
71
+ if (focusTrapInstance && Object.keys(focusTrapInstance).length) {
72
+ focusTrapInstance.deactivate();
73
+ }
74
+ });
75
+ }
68
76
  }
@@ -0,0 +1,29 @@
1
+ import { computed } from 'vue';
2
+ import { Store } from 'vuex';
3
+ import semver from 'semver';
4
+
5
+ import { getVersionInfo } from '@shell/utils/version';
6
+
7
+ let store: Store<any>;
8
+
9
+ /**
10
+ * Initializes runtime flags.
11
+ * @param vuexStore The Vuex store instance
12
+ */
13
+ export const useRuntimeFlag = (vuexStore: Store<any>) => {
14
+ store = vuexStore;
15
+
16
+ return { featureDropdownMenu };
17
+ };
18
+
19
+ /**
20
+ * Check if the dropdown menu feature is enabled
21
+ * @returns A boolean indicating whether the dropdownMenu feature is enabled.
22
+ */
23
+ const featureDropdownMenu = computed(() => {
24
+ const { fullVersion } = getVersionInfo(store);
25
+
26
+ const coerced = semver.coerce(fullVersion) || { version: '0.0.0' };
27
+
28
+ return semver.gte(coerced.version, '2.11.0');
29
+ });
@@ -276,14 +276,24 @@ export default [
276
276
  name: 'c-cluster-neuvector',
277
277
  meta: { ...installRedirectRouteMeta(NEUVECTOR_NAME, NEUVECTOR_CHART_NAME, undefined, false) }
278
278
  }, {
279
- path: '/c/:cluster/apps/charts',
280
- component: () => interopDefault(import('@shell/pages/c/_cluster/apps/charts/index.vue')),
281
- name: 'c-cluster-apps-charts'
282
- },
283
- {
284
- path: '/c/:cluster/apps/charts/install',
285
- component: () => interopDefault(import('@shell/pages/c/_cluster/apps/charts/install.vue')),
286
- name: 'c-cluster-apps-charts-install'
279
+ path: '/c/:cluster/apps/charts',
280
+ children: [
281
+ {
282
+ path: '',
283
+ component: () => interopDefault(import('@shell/pages/c/_cluster/apps/charts/index.vue')),
284
+ name: 'c-cluster-apps-charts'
285
+ },
286
+ {
287
+ path: 'chart',
288
+ component: () => interopDefault(import('@shell/pages/c/_cluster/apps/charts/chart.vue')),
289
+ name: 'c-cluster-apps-charts-chart',
290
+ },
291
+ {
292
+ path: 'install',
293
+ component: () => interopDefault(import('@shell/pages/c/_cluster/apps/charts/install.vue')),
294
+ name: 'c-cluster-apps-charts-install',
295
+ },
296
+ ]
287
297
  },
288
298
  {
289
299
  path: '/c/:cluster/auth/config',
@@ -353,10 +363,6 @@ export default [
353
363
  path: '/c/:cluster/settings/performance',
354
364
  component: () => interopDefault(import('@shell/pages/c/_cluster/settings/performance.vue')),
355
365
  name: 'c-cluster-settings-performance'
356
- }, {
357
- path: '/c/:cluster/apps/charts/chart',
358
- component: () => interopDefault(import('@shell/pages/c/_cluster/apps/charts/chart.vue')),
359
- name: 'c-cluster-apps-charts-chart'
360
366
  }, {
361
367
  path: '/c/:cluster/auth/group.principal/assign-edit',
362
368
  component: () => interopDefault(import('@shell/pages/c/_cluster/auth/group.principal/assign-edit.vue')),
@@ -364,7 +370,8 @@ export default [
364
370
  }, {
365
371
  path: '/c/:cluster/auth/user.retention',
366
372
  component: () => interopDefault(import('@shell/pages/c/_cluster/auth/user.retention/index.vue')),
367
- name: 'c-cluster-auth-user.retention'
373
+ name: 'c-cluster-auth-user.retention',
374
+ meta: { nav: '/c/:cluster/auth/management.cattle.io.user' }
368
375
  }, {
369
376
  path: '/c/:cluster/manager/cloudCredential/create',
370
377
  component: () => interopDefault(import('@shell/pages/c/_cluster/manager/cloudCredential/create.vue')),
package/config/store.js CHANGED
@@ -27,10 +27,12 @@ let store = {};
27
27
  resolveStoreModules(require('../store/growl.js'), 'growl.js');
28
28
  resolveStoreModules(require('../store/i18n.js'), 'i18n.js');
29
29
  resolveStoreModules(require('../store/linode.js'), 'linode.js');
30
+ resolveStoreModules(require('../store/modal.ts'), 'modal.ts');
30
31
  resolveStoreModules(require('../store/plugins.js'), 'plugins.js');
31
32
  resolveStoreModules(require('../store/pnap.js'), 'pnap.js');
32
33
  resolveStoreModules(require('../store/prefs.js'), 'prefs.js');
33
34
  resolveStoreModules(require('../store/resource-fetch.js'), 'resource-fetch.js');
35
+ resolveStoreModules(require('../store/slideInPanel.ts'), 'slideInPanel.ts');
34
36
  resolveStoreModules(require('../store/type-map.js'), 'type-map.js');
35
37
  resolveStoreModules(require('../store/uiplugins.ts'), 'uiplugins.ts');
36
38
  resolveStoreModules(require('../store/wm.js'), 'wm.js');
@@ -54,10 +56,12 @@ let store = {};
54
56
  '../store/i18n.js',
55
57
  '../store/index.js',
56
58
  '../store/linode.js',
59
+ '../store/modal.ts',
57
60
  '../store/plugins.js',
58
61
  '../store/pnap.js',
59
62
  '../store/prefs.js',
60
63
  '../store/resource-fetch.js',
64
+ '../store/slideInPanel.ts',
61
65
  '../store/type-map.js',
62
66
  '../store/uiplugins.ts',
63
67
  '../store/wm.js',
@@ -148,7 +148,11 @@ function checkIncompatibility(currentVersion, requiredVersion, incompatibilityDa
148
148
  * @returns String | Boolean
149
149
  */
150
150
  export function shouldNotLoadPlugin(UIPluginResource, { rancherVersion, kubeVersion }, loadedPlugins) {
151
- if (!UIPluginResource.name || !UIPluginResource.version || !UIPluginResource.endpoint) {
151
+ const {
152
+ name, version, endpoint, compressedEndpoint
153
+ } = UIPluginResource;
154
+
155
+ if (!name || !version || (!endpoint && !compressedEndpoint)) {
152
156
  return 'plugins.error.generic';
153
157
  }
154
158
 
package/core/types.ts CHANGED
@@ -40,7 +40,7 @@ export type OnNavToPackage = (store: any, config: OnEnterLeavePackageConfig) =>
40
40
  export type OnNavAwayFromPackage = (store: any, config: OnEnterLeavePackageConfig) => Promise<void>;
41
41
  export type OnLogOut = (store: any) => Promise<void>;
42
42
 
43
- /** Enum regarding the extensionable areas/places of the UI */
43
+ /** Enum regarding the extensible areas/places of the UI */
44
44
  export enum ExtensionPoint {
45
45
  ACTION = 'Action', // eslint-disable-line no-unused-vars
46
46
  TAB = 'Tab', // eslint-disable-line no-unused-vars
@@ -49,31 +49,32 @@ export enum ExtensionPoint {
49
49
  TABLE_COL = 'TableColumn', // eslint-disable-line no-unused-vars
50
50
  }
51
51
 
52
- /** Enum regarding action locations that are extensionable in the UI */
52
+ /** Enum regarding action locations that are extensible in the UI */
53
53
  export enum ActionLocation {
54
54
  HEADER = 'header-action', // eslint-disable-line no-unused-vars
55
55
  TABLE = 'table-action', // eslint-disable-line no-unused-vars
56
56
  }
57
57
 
58
- /** Enum regarding panel locations that are extensionable in the UI */
58
+ /** Enum regarding panel locations that are extensible in the UI */
59
59
  export enum PanelLocation {
60
+ ABOUT_TOP = 'about-top', // eslint-disable-line no-unused-vars
60
61
  DETAILS_MASTHEAD = 'details-masthead', // eslint-disable-line no-unused-vars
61
62
  DETAIL_TOP = 'detail-top', // eslint-disable-line no-unused-vars
62
63
  RESOURCE_LIST = 'resource-list', // eslint-disable-line no-unused-vars
63
64
  }
64
65
 
65
- /** Enum regarding tab locations that are extensionable in the UI */
66
+ /** Enum regarding tab locations that are extensible in the UI */
66
67
  export enum TabLocation {
67
68
  RESOURCE_DETAIL = 'tab', // eslint-disable-line no-unused-vars
68
69
  CLUSTER_CREATE_RKE2 = 'cluster-create-rke2', // eslint-disable-line no-unused-vars
69
70
  }
70
71
 
71
- /** Enum regarding card locations that are extensionable in the UI */
72
+ /** Enum regarding card locations that are extensible in the UI */
72
73
  export enum CardLocation {
73
74
  CLUSTER_DASHBOARD_CARD = 'cluster-dashboard-card', // eslint-disable-line no-unused-vars
74
75
  }
75
76
 
76
- /** Enum regarding table col locations that are extensionable in the UI */
77
+ /** Enum regarding table col locations that are extensible in the UI */
77
78
  export enum TableColumnLocation {
78
79
  RESOURCE = 'resource-list', // eslint-disable-line no-unused-vars
79
80
  }
@@ -373,6 +374,11 @@ export interface ConfigureTypeOptions {
373
374
  */
374
375
  customRoute?: Object;
375
376
 
377
+ /**
378
+ * Custom options vary pre resource type
379
+ */
380
+ custom?: any;
381
+
376
382
  /**
377
383
  * Leaving these here for completeness but I don't think these should be advertised as useable to plugin creators.
378
384
  */