@rancher/shell 3.0.8-rc.1 → 3.0.8-rc.12

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 (345) hide show
  1. package/assets/brand/suse/banner.svg +1 -0
  2. package/assets/brand/suse/dark/banner.svg +1 -0
  3. package/assets/brand/suse/dark/login-landscape.svg +1 -0
  4. package/assets/brand/suse/dark/rancher-logo.svg +1 -1
  5. package/assets/brand/suse/favicon.png +0 -0
  6. package/assets/brand/suse/login-landscape.svg +1 -0
  7. package/assets/brand/suse/metadata.json +11 -1
  8. package/assets/brand/suse/rancher-logo.svg +1 -1
  9. package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
  10. package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
  11. package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
  12. package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
  13. package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
  14. package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
  15. package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
  16. package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
  17. package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
  18. package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
  19. package/assets/images/content/README.md +5 -0
  20. package/assets/images/content/cloud-native.svg +84 -0
  21. package/assets/images/content/dark/cloud-native.svg +21 -0
  22. package/assets/images/content/dark/shield.svg +59 -0
  23. package/assets/images/content/dark/suse.svg +10 -0
  24. package/assets/images/content/shield.svg +59 -0
  25. package/assets/images/content/suse.svg +10 -0
  26. package/assets/styles/base/_typography.scss +1 -0
  27. package/assets/styles/fonts/_fontstack.scss +53 -1
  28. package/assets/styles/global/_cards.scss +0 -3
  29. package/assets/styles/global/_layout.scss +21 -35
  30. package/assets/styles/themes/_dark.scss +1 -1
  31. package/assets/styles/themes/_light.scss +1 -1
  32. package/assets/styles/themes/_modern.scss +11 -3
  33. package/assets/styles/themes/_suse.scss +116 -24
  34. package/assets/translations/en-us.yaml +94 -10
  35. package/components/AutoscalerCard.vue +113 -0
  36. package/components/AutoscalerTab.vue +94 -0
  37. package/components/BackLink.vue +8 -0
  38. package/components/BannerGraphic.vue +36 -21
  39. package/components/BrandImage.vue +17 -6
  40. package/components/ClusterIconMenu.vue +1 -1
  41. package/components/ClusterProviderIcon.vue +1 -1
  42. package/components/Cron/CronExpressionEditor.vue +1 -1
  43. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  44. package/components/Drawer/Chrome.vue +2 -6
  45. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
  46. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
  47. package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
  48. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
  49. package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
  50. package/components/Drawer/types.ts +3 -0
  51. package/components/DynamicContent/DynamicContentBanner.vue +102 -0
  52. package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
  53. package/components/DynamicContent/DynamicContentIcon.vue +132 -0
  54. package/components/DynamicContent/DynamicContentPanel.vue +112 -0
  55. package/components/DynamicContent/content.ts +78 -0
  56. package/components/EmberPage.vue +1 -1
  57. package/components/IconOrSvg.vue +2 -2
  58. package/components/PaginatedResourceTable.vue +2 -6
  59. package/components/PopoverCard.vue +192 -0
  60. package/components/Questions/__tests__/index.test.ts +159 -0
  61. package/components/Resource/Detail/CopyToClipboard.vue +4 -1
  62. package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
  63. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  64. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
  65. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
  66. package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
  67. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  68. package/components/Resource/Detail/Metadata/composables.ts +9 -9
  69. package/components/Resource/Detail/Metadata/index.vue +3 -3
  70. package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
  71. package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
  72. package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
  73. package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
  74. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  75. package/components/Resource/Detail/TitleBar/composables.ts +2 -1
  76. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  77. package/components/Resource/Detail/composables.ts +12 -0
  78. package/components/ResourceDetail/Masthead/latest.vue +29 -0
  79. package/components/ResourceDetail/index.vue +4 -1
  80. package/components/ResourceList/Masthead.vue +1 -1
  81. package/components/ResourceTable.vue +1 -1
  82. package/components/SortableTable/index.vue +2 -1
  83. package/components/Tabbed/__tests__/index.test.ts +86 -0
  84. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  85. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  86. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  87. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  88. package/components/__tests__/AutoscalerCard.test.ts +154 -0
  89. package/components/__tests__/AutoscalerTab.test.ts +125 -0
  90. package/components/__tests__/PopoverCard.test.ts +204 -0
  91. package/components/auth/SelectPrincipal.vue +24 -6
  92. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  93. package/components/auth/login/ldap.vue +3 -3
  94. package/components/form/NodeScheduling.vue +2 -2
  95. package/components/formatter/Autoscaler.vue +97 -0
  96. package/components/formatter/InternalExternalIP.vue +198 -24
  97. package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
  98. package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
  99. package/components/google/util/__tests__/formatter.test.ts +47 -0
  100. package/components/google/util/formatter.ts +5 -2
  101. package/components/nav/Group.vue +21 -5
  102. package/components/nav/Header.vue +37 -17
  103. package/components/nav/NamespaceFilter.vue +13 -1
  104. package/components/nav/NotificationCenter/index.vue +2 -1
  105. package/components/nav/TopLevelMenu.helper.ts +16 -6
  106. package/components/nav/TopLevelMenu.vue +4 -2
  107. package/components/nav/Type.vue +8 -3
  108. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  109. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  110. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  111. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  112. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  113. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  114. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  115. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  116. package/components/nav/WindowManager/constants.ts +23 -0
  117. package/components/nav/WindowManager/index.vue +61 -575
  118. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  119. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  120. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  121. package/components/nav/__tests__/Type.test.ts +59 -0
  122. package/components/templates/default.vue +4 -40
  123. package/components/templates/home.vue +31 -5
  124. package/components/templates/plain.vue +30 -4
  125. package/components/templates/standalone.vue +1 -1
  126. package/composables/useI18n.ts +10 -1
  127. package/composables/useInterval.ts +15 -0
  128. package/config/__test__/uiplugins.test.ts +309 -0
  129. package/config/labels-annotations.js +9 -1
  130. package/config/product/explorer.js +3 -1
  131. package/config/product/manager.js +20 -9
  132. package/config/router/navigation-guards/clusters.js +3 -3
  133. package/config/router/navigation-guards/products.js +1 -1
  134. package/config/router/routes.js +10 -2
  135. package/config/settings.ts +2 -1
  136. package/config/store.js +4 -2
  137. package/config/table-headers.js +8 -0
  138. package/config/types.js +9 -0
  139. package/config/uiplugins.js +46 -2
  140. package/config/version.js +1 -1
  141. package/core/__test__/extension-manager-impl.test.js +236 -0
  142. package/core/extension-manager-impl.js +21 -4
  143. package/core/plugin-helpers.ts +4 -2
  144. package/core/plugins-loader.js +2 -2
  145. package/core/types-provisioning.ts +8 -1
  146. package/detail/pod.vue +1 -0
  147. package/detail/provisioning.cattle.io.cluster.vue +19 -7
  148. package/dialog/DeveloperLoadExtensionDialog.vue +13 -4
  149. package/dialog/RollbackWorkloadDialog.vue +2 -5
  150. package/dialog/SearchDialog.vue +1 -0
  151. package/directives/ui-context.ts +103 -0
  152. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +2 -2
  153. package/edit/auth/__tests__/oidc.test.ts +26 -0
  154. package/edit/auth/github.vue +5 -0
  155. package/edit/auth/oidc.vue +5 -1
  156. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  157. package/edit/cloudcredential.vue +1 -1
  158. package/edit/configmap.vue +1 -0
  159. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  160. package/edit/fleet.cattle.io.gitrepo.vue +0 -10
  161. package/edit/fleet.cattle.io.helmop.vue +6 -6
  162. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  163. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  164. package/edit/logging-flow/index.vue +1 -0
  165. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  166. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  167. package/edit/management.cattle.io.project.vue +1 -0
  168. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  169. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  170. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  171. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  172. package/edit/monitoring.coreos.com.route.vue +1 -1
  173. package/edit/namespace.vue +1 -0
  174. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  175. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  176. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  177. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  178. package/edit/node.vue +1 -0
  179. package/edit/persistentvolume/index.vue +27 -22
  180. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  181. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  182. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  183. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  184. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  185. package/edit/persistentvolume/plugins/csi.vue +18 -16
  186. package/edit/persistentvolume/plugins/fc.vue +13 -14
  187. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  188. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  189. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  190. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  191. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  192. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  193. package/edit/persistentvolume/plugins/local.vue +1 -3
  194. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  195. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  196. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  197. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  198. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  199. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  200. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  201. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  202. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  203. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
  204. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
  205. package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
  206. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +21 -21
  207. package/edit/provisioning.cattle.io.cluster/index.vue +28 -18
  208. package/edit/provisioning.cattle.io.cluster/rke2.vue +50 -16
  209. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
  210. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
  211. package/edit/secret/index.vue +1 -1
  212. package/edit/service.vue +9 -4
  213. package/edit/serviceaccount.vue +1 -0
  214. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  215. package/edit/workload/index.vue +2 -1
  216. package/edit/workload/mixins/workload.js +1 -1
  217. package/initialize/App.vue +4 -4
  218. package/initialize/install-directives.js +2 -0
  219. package/initialize/install-plugins.js +19 -2
  220. package/list/provisioning.cattle.io.cluster.vue +15 -2
  221. package/machine-config/amazonec2.vue +42 -135
  222. package/machine-config/components/EC2Networking.vue +490 -0
  223. package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
  224. package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
  225. package/machine-config/digitalocean.vue +11 -0
  226. package/machine-config/google.vue +1 -1
  227. package/mixins/__tests__/brand.spec.ts +2 -2
  228. package/mixins/__tests__/chart.test.ts +21 -0
  229. package/mixins/brand.js +1 -7
  230. package/mixins/chart.js +7 -1
  231. package/mixins/create-edit-view/index.js +5 -0
  232. package/models/__tests__/chart.test.ts +33 -4
  233. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
  234. package/models/chart.js +25 -13
  235. package/models/cluster/node.js +13 -6
  236. package/models/cluster.x-k8s.io.machine.js +10 -20
  237. package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
  238. package/models/management.cattle.io.cluster.js +21 -3
  239. package/models/management.cattle.io.kontainerdriver.js +1 -0
  240. package/models/provisioning.cattle.io.cluster.js +249 -33
  241. package/package.json +8 -7
  242. package/pages/auth/login.vue +41 -5
  243. package/pages/auth/setup.vue +1 -1
  244. package/pages/auth/verify.vue +3 -3
  245. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  246. package/pages/c/_cluster/apps/charts/chart.vue +33 -15
  247. package/pages/c/_cluster/apps/charts/index.vue +11 -13
  248. package/pages/c/_cluster/apps/charts/install.vue +1 -1
  249. package/pages/c/_cluster/explorer/index.vue +8 -6
  250. package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
  251. package/pages/c/_cluster/settings/brand.vue +1 -1
  252. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  253. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  254. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  255. package/pages/home.vue +14 -4
  256. package/pkg/auto-import.js +3 -3
  257. package/pkg/dynamic-importer.lib.js +5 -1
  258. package/pkg/import.js +1 -1
  259. package/plugins/dashboard-client-init.js +3 -0
  260. package/plugins/dashboard-store/getters.js +19 -2
  261. package/plugins/dashboard-store/model-loader.js +1 -1
  262. package/plugins/dashboard-store/resource-class.js +10 -6
  263. package/plugins/dynamic-content.js +13 -0
  264. package/plugins/i18n.js +8 -0
  265. package/plugins/plugin.js +2 -2
  266. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
  267. package/plugins/steve/steve-class.js +1 -1
  268. package/plugins/steve/steve-pagination-utils.ts +39 -20
  269. package/plugins/steve/subscribe.js +17 -9
  270. package/plugins/subscribe-events.ts +4 -2
  271. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  272. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
  273. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  274. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  275. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  276. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  277. package/rancher-components/Pill/types.ts +0 -1
  278. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
  279. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  280. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  281. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  282. package/rancher-components/RcIcon/index.ts +1 -0
  283. package/rancher-components/RcIcon/types.ts +160 -0
  284. package/rancher-components/utils/status.test.ts +67 -0
  285. package/rancher-components/utils/status.ts +77 -0
  286. package/scripts/typegen.sh +1 -0
  287. package/store/__tests__/catalog.test.ts +1 -1
  288. package/store/action-menu.js +8 -0
  289. package/store/auth.js +4 -4
  290. package/store/catalog.js +6 -0
  291. package/store/features.js +1 -0
  292. package/store/i18n.js +3 -3
  293. package/store/index.js +40 -19
  294. package/store/notifications.ts +51 -4
  295. package/store/plugins.js +7 -3
  296. package/store/prefs.js +6 -6
  297. package/store/type-map.js +7 -7
  298. package/store/ui-context.ts +86 -0
  299. package/store/wm.ts +244 -0
  300. package/types/notifications/index.ts +27 -3
  301. package/types/shell/index.d.ts +80 -4
  302. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  303. package/types/store/pagination.types.ts +157 -9
  304. package/types/store/subscribe-events.types.ts +8 -1
  305. package/types/store/subscribe.types.ts +1 -0
  306. package/types/window-manager.ts +24 -0
  307. package/utils/__tests__/object.test.ts +19 -0
  308. package/utils/__tests__/provider.test.ts +98 -0
  309. package/utils/__tests__/selector-typed.test.ts +263 -0
  310. package/utils/__tests__/version.test.ts +19 -1
  311. package/utils/autoscaler-utils.ts +7 -0
  312. package/utils/back-off.ts +3 -3
  313. package/utils/brand.ts +29 -0
  314. package/utils/chart.js +18 -0
  315. package/utils/color.js +1 -1
  316. package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
  317. package/utils/dynamic-content/__tests__/info.test.ts +21 -9
  318. package/utils/dynamic-content/announcement.ts +142 -0
  319. package/utils/dynamic-content/example.json +40 -0
  320. package/utils/dynamic-content/index.ts +6 -2
  321. package/utils/dynamic-content/info.ts +44 -2
  322. package/utils/dynamic-content/new-release.ts +1 -1
  323. package/utils/dynamic-content/notification-handler.ts +48 -0
  324. package/utils/dynamic-content/types.d.ts +53 -1
  325. package/utils/dynamic-importer.js +2 -2
  326. package/utils/favicon.js +4 -4
  327. package/utils/object.js +20 -2
  328. package/utils/pagination-utils.ts +2 -2
  329. package/utils/pagination-wrapper.ts +13 -9
  330. package/utils/provider.ts +14 -0
  331. package/utils/scroll.js +7 -0
  332. package/utils/selector-typed.ts +6 -2
  333. package/utils/settings.ts +15 -0
  334. package/utils/unit-tests/pagination-utils.spec.ts +8 -8
  335. package/utils/validators/machine-pool.ts +13 -3
  336. package/utils/version.js +15 -0
  337. package/vue.config.js +3 -3
  338. package/assets/images/icons/document.svg +0 -3
  339. package/plugins/nuxt-client-init.js +0 -3
  340. package/store/wm.js +0 -95
  341. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  342. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  343. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  344. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  345. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
@@ -1,6 +1,7 @@
1
1
  <script>
2
2
  import Closeable from '@shell/mixins/closeable';
3
3
  import BrandImage from '@shell/components/BrandImage';
4
+ import { getBrandMeta } from '@shell/utils/brand';
4
5
 
5
6
  export default {
6
7
  components: { BrandImage },
@@ -15,22 +16,29 @@ export default {
15
16
  type: String,
16
17
  default: null,
17
18
  },
18
-
19
- small: {
20
- type: Boolean,
21
- default: false
22
- }
23
19
  },
20
+
21
+ data() {
22
+ const brandMeta = getBrandMeta(this.$store.getters['management/brand']);
23
+ const banner = brandMeta?.banner || {};
24
+ const align = banner.textAlign || 'center';
25
+ const bannerClass = banner.bannerClass || '';
26
+
27
+ return { alignClass: `banner-text-${ align }`, bannerClass };
28
+ }
24
29
  };
25
30
  </script>
26
31
 
27
32
  <template>
28
33
  <div
29
34
  v-if="shown"
30
- class="banner-graphic"
31
- :class="{'small': small}"
35
+ class="banner-graphic-area"
36
+ :class="{[alignClass]: true}"
32
37
  >
33
- <div class="graphic">
38
+ <div
39
+ :class="bannerClass"
40
+ class="graphic banner-graphic-height"
41
+ >
34
42
  <BrandImage
35
43
  class="banner"
36
44
  data-testid="banner-brand__img"
@@ -55,17 +63,15 @@ export default {
55
63
  </div>
56
64
  </template>
57
65
 
58
- <style lang="scss">
59
- $banner-height: 240px;
60
- $banner-height-small: 200px;
66
+ <style lang="scss" scoped>
67
+ $banner-height: 200px;
61
68
 
62
- .banner-graphic {
69
+ .banner-graphic-area {
63
70
  position: relative;
64
71
 
65
72
  .graphic {
66
73
  display: flex;
67
74
  flex-direction: column;
68
- height: $banner-height;
69
75
  overflow: hidden;
70
76
  > img.banner {
71
77
  flex: 1;
@@ -74,22 +80,31 @@ export default {
74
80
  }
75
81
  .title {
76
82
  display: flex;
77
- justify-content: center;
78
83
  align-items: center;
79
84
  position: absolute;
80
85
  text-align: center;
81
86
  top: 0;
82
87
  height: 100%;
83
88
  width: 100%;
84
- margin-top: -20px;
85
89
  }
86
- &.small {
87
- .graphic {
88
- height: $banner-height-small;
89
- img.banner {
90
- margin-top: math.div(($banner-height-small - $banner-height), 2);
91
- }
90
+
91
+ &.banner-text-center {
92
+ .title {
93
+ justify-content: center;
94
+ margin-top: -20px;
95
+ }
96
+ }
97
+
98
+ &.banner-text-left {
99
+ .title {
100
+ justify-content: left;
101
+ padding-left: 20px;
92
102
  }
93
103
  }
94
104
  }
105
+
106
+ // Use top-level style so that a theme style can easily override via its own style without having to worry about specificity of CSS styles
107
+ .banner-graphic-height {
108
+ height: var(--banner-graphic-height, $banner-height);
109
+ }
95
110
  </style>
@@ -36,9 +36,9 @@ export default {
36
36
  };
37
37
  },
38
38
  computed: {
39
- ...mapGetters({ theme: 'prefs/theme' }),
39
+ ...mapGetters({ theme: 'prefs/theme', brand: 'management/brand' }),
40
40
 
41
- brand() {
41
+ brandBase() {
42
42
  const setting = this.managementSettings.filter((setting) => setting.id === SETTING.BRAND)[0] || {};
43
43
 
44
44
  return setting.value;
@@ -78,19 +78,30 @@ export default {
78
78
  }
79
79
  },
80
80
 
81
+ isDark() {
82
+ return this.theme === 'dark';
83
+ },
84
+
81
85
  pathToBrandedImage() {
82
86
  if (this.fileName === 'rancher-logo.svg' || this.supportCustomLogo) {
83
- if (this.theme === 'dark' && this.uiLogoDark) {
87
+ if (this.isDark && this.uiLogoDark) {
84
88
  return this.uiLogoDark;
85
89
  }
86
90
 
87
91
  if (this.uiLogoLight) {
88
92
  return this.uiLogoLight;
89
93
  }
94
+
95
+ // csp, rgs, and federal map to SUSE, but have their own custom logos
96
+ if (this.brandBase !== this.brand) {
97
+ try {
98
+ return require(`~shell/assets/brand/${ this.brandBase }/${ this.isDark ? 'dark/' : '' }${ this.fileName }`);
99
+ } catch { }
100
+ }
90
101
  }
91
102
 
92
103
  if (this.fileName === 'banner.svg') {
93
- if (this.theme === 'dark' && this.uiBannerDark) {
104
+ if (this.isDark && this.uiBannerDark) {
94
105
  return this.uiBannerDark;
95
106
  }
96
107
 
@@ -100,7 +111,7 @@ export default {
100
111
  }
101
112
 
102
113
  if (this.fileName === 'login-landscape.svg') {
103
- if (this.theme === 'dark' && this.uiLoginBackgroundDark) {
114
+ if (this.isDark && this.uiLoginBackgroundDark) {
104
115
  return this.uiLoginBackgroundDark;
105
116
  }
106
117
 
@@ -112,7 +123,7 @@ export default {
112
123
  if (!this.brand) {
113
124
  return this.defaultPathToBrandedImage;
114
125
  } else {
115
- if (this.theme === 'dark' || this.dark) {
126
+ if (this.isDark || this.dark) {
116
127
  try {
117
128
  return require(`~shell/assets/brand/${ this.brand }/dark/${ this.fileName }`);
118
129
  } catch {}
@@ -119,7 +119,7 @@ export default {
119
119
 
120
120
  <style lang="scss" scoped>
121
121
  .rancher-icon-fill {
122
- fill: var(--link, var(--primary));
122
+ fill: var(--on-tertiary, var(--primary));
123
123
  }
124
124
 
125
125
  .cluster-icon-menu {
@@ -79,7 +79,7 @@ export default {
79
79
 
80
80
  <style lang="scss" scoped>
81
81
  .rancher-icon-fill {
82
- fill: var(--link, var(--primary));
82
+ fill: var(--on-tertiary, var(--primary));
83
83
  }
84
84
  .cluster-icon {
85
85
  align-items: center;
@@ -268,7 +268,7 @@ const handleBlur = (field: CronField) => {
268
268
  </template>
269
269
 
270
270
  <style scoped lang="scss">
271
- $input-max-width: 110px;
271
+ $input-max-width: 120px;
272
272
 
273
273
  .cron-row {
274
274
  display: flex;
@@ -207,7 +207,7 @@ onBeforeUnmount(() => {
207
207
 
208
208
  .custom-cron-editor {
209
209
  margin: 64px auto;
210
- max-width: 600px;
210
+ max-width: 660px;
211
211
  }
212
212
 
213
213
  .cron-info {
@@ -1,13 +1,9 @@
1
- <script lang="ts">
1
+ <script setup lang="ts">
2
2
  import { useI18n } from '@shell/composables/useI18n';
3
3
  import { useStore } from 'vuex';
4
4
  import { computed } from 'vue';
5
- export interface Props {
6
- ariaTarget: string;
7
- }
8
- </script>
5
+ import { Props } from './types';
9
6
 
10
- <script setup lang="ts">
11
7
  const props = defineProps<Props>();
12
8
  const emit = defineEmits(['close']);
13
9
 
@@ -1,17 +1,11 @@
1
- <script lang="ts">
1
+ <script setup lang="ts">
2
2
  import { useI18n } from '@shell/composables/useI18n';
3
3
  import { _VIEW } from '@shell/config/query-params';
4
4
  import { useStore } from 'vuex';
5
5
  import Tab from '@shell/components/Tabbed/Tab.vue';
6
+ import { ConfigProps } from '@shell/components/Drawer/ResourceDetailDrawer/types';
6
7
 
7
- export interface Props {
8
- resource: any;
9
- component: any;
10
- resourceType: string;
11
- }
12
- </script>
13
- <script setup lang="ts">
14
- const props = defineProps<Props>();
8
+ const props = defineProps<ConfigProps>();
15
9
  const store = useStore();
16
10
  const i18n = useI18n(store);
17
11
  </script>
@@ -31,6 +25,7 @@ const i18n = useI18n(store);
31
25
  :real-mode="_VIEW"
32
26
  :initial-value="props.resource"
33
27
  :use-tabbed-hash="false /* Have to disable hashing on child components or it modifies the url and closes the drawer */"
28
+ :default-tab="props.defaultTab"
34
29
  as="config"
35
30
  />
36
31
  </div>
@@ -1,18 +1,13 @@
1
- <script lang="ts">
1
+ <script setup lang="ts">
2
2
  import { useI18n } from '@shell/composables/useI18n';
3
3
  import { _VIEW } from '@shell/config/query-params';
4
4
  import { useStore } from 'vuex';
5
5
  import Tab from '@shell/components/Tabbed/Tab.vue';
6
6
  import { useTemplateRef } from 'vue';
7
7
  import ResourceYaml from '@shell/components/ResourceYaml.vue';
8
+ import { YamlProps } from '@shell/components/Drawer/ResourceDetailDrawer/types';
8
9
 
9
- export interface Props {
10
- resource: any;
11
- yaml: string;
12
- }
13
- </script>
14
- <script setup lang="ts">
15
- const props = defineProps<Props>();
10
+ const props = defineProps<YamlProps>();
16
11
  const store = useStore();
17
12
  const i18n = useI18n(store);
18
13
  const yamlComponent: any = useTemplateRef('yaml');
@@ -1,9 +1,8 @@
1
- import { Props as YamlTabProps } from '@shell/components/Drawer/ResourceDetailDrawer/YamlTab.vue';
2
- import { Props as ConfigTabProps } from '@shell/components/Drawer/ResourceDetailDrawer/ConfigTab.vue';
3
1
  import { useStore } from 'vuex';
4
2
  import { getYaml } from '@shell/components/Drawer/ResourceDetailDrawer/helpers';
3
+ import { ConfigProps, YamlProps } from '@shell/components/Drawer/ResourceDetailDrawer/types';
5
4
 
6
- export async function useDefaultYamlTabProps(resource: any): Promise<YamlTabProps> {
5
+ export async function useDefaultYamlTabProps(resource: any): Promise<YamlProps> {
7
6
  const yaml = await getYaml(resource);
8
7
 
9
8
  return {
@@ -12,7 +11,7 @@ export async function useDefaultYamlTabProps(resource: any): Promise<YamlTabProp
12
11
  };
13
12
  }
14
13
 
15
- export function useDefaultConfigTabProps(resource: any): ConfigTabProps | undefined {
14
+ export function useDefaultConfigTabProps(resource: any): ConfigProps | undefined {
16
15
  const store = useStore();
17
16
 
18
17
  // You don't want to show the Config tab if there isn't a an edit page to show and you don't want to show it if there isn't
@@ -1,4 +1,4 @@
1
- <script lang="ts">
1
+ <script setup lang="ts">
2
2
  import Drawer from '@shell/components/Drawer/Chrome.vue';
3
3
  import { useI18n } from '@shell/composables/useI18n';
4
4
  import { useStore } from 'vuex';
@@ -9,17 +9,11 @@ import ConfigTab from '@shell/components/Drawer/ResourceDetailDrawer/ConfigTab.v
9
9
  import { computed, ref } from 'vue';
10
10
  import RcButton from '@components/RcButton/RcButton.vue';
11
11
  import StateDot from '@shell/components/StateDot/index.vue';
12
+ import { ResourceDetailDrawerProps } from '@shell/components/Drawer/ResourceDetailDrawer/types';
12
13
 
13
- export interface Props {
14
- resource: any;
15
-
16
- onClose?: () => void;
17
- }
18
- </script>
19
- <script setup lang="ts">
20
14
  const editBttnDataTestId = 'save-configuration-bttn';
21
15
  const componentTestid = 'configuration-drawer-tabbed';
22
- const props = defineProps<Props>();
16
+ const props = defineProps<ResourceDetailDrawerProps>();
23
17
  const emit = defineEmits(['close']);
24
18
  const store = useStore();
25
19
  const i18n = useI18n(store);
@@ -85,6 +79,7 @@ const canEdit = computed(() => {
85
79
  <ConfigTab
86
80
  v-if="configTabProps"
87
81
  v-bind="configTabProps"
82
+ :default-tab="props.defaultTab"
88
83
  />
89
84
  <YamlTab
90
85
  v-if="yamlTabProps"
@@ -0,0 +1,17 @@
1
+ export interface YamlProps {
2
+ resource: any;
3
+ yaml: string;
4
+ }
5
+
6
+ export interface ConfigProps {
7
+ resource: any;
8
+ component: any;
9
+ resourceType: string;
10
+ defaultTab?: string;
11
+ }
12
+
13
+ export interface ResourceDetailDrawerProps {
14
+ resource: any;
15
+ defaultTab?: string;
16
+ onClose?: () => void;
17
+ }
@@ -0,0 +1,3 @@
1
+ export interface Props {
2
+ ariaTarget: string;
3
+ }
@@ -0,0 +1,102 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Component top render an announcement as a banner
4
+ */
5
+ import DynamicContentIcon from './DynamicContentIcon.vue';
6
+ import DynamicContentCloseButton from './DynamicContentCloseButton.vue';
7
+ import Markdown from '@shell/components/Markdown.vue';
8
+ import { useDynamicContent, DynamicInputProps } from './content';
9
+
10
+ const props = defineProps<DynamicInputProps>();
11
+ const {
12
+ dynamicContent,
13
+ invokeAction,
14
+ primaryButtonStyle,
15
+ } = useDynamicContent(props, 'banner');
16
+
17
+ </script>
18
+ <template>
19
+ <div
20
+ v-if="dynamicContent"
21
+ class="home-page-dynamic-content"
22
+ >
23
+ <template v-if="dynamicContent.data">
24
+ <DynamicContentIcon
25
+ v-if="dynamicContent.data.icon"
26
+ :icon="dynamicContent.data.icon"
27
+ :class="{'mr-10': dynamicContent.data.icon }"
28
+ />
29
+ </template>
30
+ <div class="dc-content">
31
+ <div class="dc-title">
32
+ {{ dynamicContent.title }}
33
+ </div>
34
+ <div class="dc-message">
35
+ <Markdown
36
+ v-if="dynamicContent.message"
37
+ v-model:value="dynamicContent.message"
38
+ />
39
+ </div>
40
+ </div>
41
+ <div class="dc-actions">
42
+ <button
43
+ v-if="dynamicContent.primaryAction"
44
+ role="button"
45
+ class="btn btn-sm"
46
+ :aria-label="t('dynamicContent.action.openPrimary')"
47
+ :class="primaryButtonStyle"
48
+ @click.stop.prevent="invokeAction(dynamicContent.primaryAction)"
49
+ >
50
+ {{ dynamicContent.primaryAction.label }}
51
+ </button>
52
+ <button
53
+ v-if="dynamicContent.secondaryAction"
54
+ role="button"
55
+ class="btn btn-sm role-secondary"
56
+ :aria-label="t('dynamicContent.action.openSecondary')"
57
+ @click.stop.prevent="invokeAction(dynamicContent.secondaryAction)"
58
+ >
59
+ {{ dynamicContent.secondaryAction.label }}
60
+ </button>
61
+ <DynamicContentCloseButton
62
+ :id="dynamicContent.id"
63
+ class="dc-close-button"
64
+ />
65
+ </div>
66
+ </div>
67
+ </template>
68
+
69
+ <style lang="scss" scoped>
70
+ .home-page-dynamic-content {
71
+ background-color: var(--box-bg);
72
+ border-top: 1px solid var(--border);
73
+ border-bottom: 1px solid var(--border);
74
+ display: flex;
75
+ flex-direction: row;
76
+ align-items: center;
77
+ padding: 10px;
78
+
79
+ .dc-content {
80
+ display: flex;
81
+ flex-direction: column;
82
+ flex: 1;
83
+ }
84
+
85
+ .dc-title {
86
+ font-weight: bold;
87
+ font-size: 1.1em;
88
+ margin-bottom: 4px;
89
+ }
90
+
91
+ .dc-message {
92
+ font-size: 1em;
93
+ }
94
+
95
+ .dc-actions {
96
+ display: flex;
97
+ align-items: center;
98
+ margin: 0 8px;
99
+ gap: 10px;
100
+ }
101
+ }
102
+ </style>
@@ -0,0 +1,42 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Common close button for dynamic component banners and panels
4
+ */
5
+
6
+ import { useStore } from 'vuex';
7
+ import { RcButton } from '@components/RcButton';
8
+
9
+ const props = defineProps<{id: string}>();
10
+ const store = useStore();
11
+
12
+ /*
13
+ * Marks the notification as read when the close button is clicked
14
+ */
15
+ const markRead = () => {
16
+ store.dispatch('notifications/markRead', props.id);
17
+ };
18
+ </script>
19
+ <template>
20
+ <RcButton
21
+ ghost
22
+ small
23
+ :aria-label="t('dynamicContent.action.close')"
24
+ tabindex="0"
25
+ @click="markRead()"
26
+ >
27
+ <i class="dc-close-button icon icon-close" />
28
+ </RcButton>
29
+ </template>
30
+ <style lang="scss" scoped>
31
+ .dc-close-button {
32
+ opacity: 0.5;
33
+ cursor: pointer;
34
+ border: 1px solid transparent;
35
+ padding: 4px;
36
+ border-radius: 4px;
37
+
38
+ &:hover {
39
+ opacity: 1;
40
+ }
41
+ }
42
+ </style>
@@ -0,0 +1,132 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Icon component to render an icon from the icon data in an announcement
4
+ */
5
+
6
+ import { useStore } from 'vuex';
7
+ import { computed } from 'vue';
8
+
9
+ import { AnnouncementNotificationIconData } from '@shell/utils/dynamic-content/types';
10
+
11
+ type KeyValues = {
12
+ [key: string]: string;
13
+ };
14
+
15
+ const ICON_FORMAT = /(@|#|>)/;
16
+
17
+ const props = defineProps<{icon: AnnouncementNotificationIconData}>();
18
+ const store = useStore();
19
+ const theme = computed(() => store.getters['prefs/theme']);
20
+
21
+ /**
22
+ * Get the correct url to use for light/dark mode
23
+ */
24
+ const url = computed(() => {
25
+ const darkTheme = theme.value === 'dark';
26
+
27
+ return darkTheme ? props.icon?.dark || props.icon?.light : props.icon?.light;
28
+ });
29
+
30
+ const iconName = computed(() => {
31
+ const decodedIcon = url.value.split(ICON_FORMAT);
32
+
33
+ if (decodedIcon[0].startsWith('!')) {
34
+ return `icon-${ decodedIcon[0].substring(1) }`;
35
+ }
36
+
37
+ return undefined;
38
+ });
39
+
40
+ /**
41
+ * Get the src value for an image tag
42
+ */
43
+ const src = computed(() => {
44
+ const decodedIcon = url.value.split(ICON_FORMAT);
45
+
46
+ // If the icon name starts with ~, then it references a built-in icon/image
47
+ if (decodedIcon[0].startsWith('~')) {
48
+ const img = decodedIcon[0].substring(1);
49
+ const themePrefix = theme.value === 'dark' ? 'dark/' : '';
50
+
51
+ try {
52
+ return require(`~shell/assets/images/content/${ themePrefix }${ img }`);
53
+ } catch {
54
+ return require(`~shell/assets/images/content/${ img }`);
55
+ }
56
+ }
57
+
58
+ // Regular URL, use it directly
59
+ return decodedIcon[0];
60
+ });
61
+
62
+ /**
63
+ * Icon value can include some custom style information:
64
+ *
65
+ * '@wxh' (or @w) To change the width/height
66
+ * '>x' to set the padding to x px
67
+ * '<x' to set the margin to x px
68
+ * '#rrggbb' to set the color
69
+ *
70
+ */
71
+ const style = computed(() => {
72
+ const decodedIcon = props.icon.light.split(ICON_FORMAT).slice(1);
73
+ const OPTIONS: { [key: string]: (v: string, result: KeyValues) => void } = {
74
+ '@': (v: string, result: KeyValues) => {
75
+ const wh = v.split('x');
76
+
77
+ result.width = `${ wh[0] }px`;
78
+ result.height = (wh.length === 2) ? `${ wh[1] }px` : `${ wh[0] }px`;
79
+ result.fontSize = result.width;
80
+ },
81
+ '#': (v: string, result: KeyValues) => {
82
+ result.color = `#${ v }`;
83
+ },
84
+ '>': (v: string, result: KeyValues) => {
85
+ result.padding = `${ v }px`;
86
+ },
87
+ '<': (v: string, result: KeyValues) => {
88
+ result.margin = `${ v }px`;
89
+ }
90
+ };
91
+
92
+ const pairs = Math.floor(decodedIcon.length / 2);
93
+ const result = {};
94
+
95
+ for (let i = 0; i < pairs; i++) {
96
+ const index = 2 * i;
97
+
98
+ if (OPTIONS[decodedIcon[index]]) {
99
+ const handler = OPTIONS[decodedIcon[index]];
100
+ const value = decodedIcon[index + 1];
101
+
102
+ if (handler) {
103
+ handler(value, result);
104
+ }
105
+ }
106
+ }
107
+
108
+ return result;
109
+ });
110
+
111
+ </script>
112
+ <template>
113
+ <i
114
+ v-if="iconName"
115
+ class="icon"
116
+ :style="style"
117
+ :class="iconName"
118
+ />
119
+ <img
120
+ v-else
121
+ :style="style"
122
+ :src="src"
123
+ class="dc-icon"
124
+ >
125
+ </template>
126
+
127
+ <style lang="scss" scoped>
128
+ .dc-icon {
129
+ width: 48px;
130
+ height: 48px;
131
+ }
132
+ </style>