@rancher/shell 3.0.7 → 3.0.8-rc.10

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 (375) 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/images/vendor/githubapp.svg +13 -0
  27. package/assets/styles/base/_typography.scss +2 -1
  28. package/assets/styles/fonts/_fontstack.scss +53 -1
  29. package/assets/styles/global/_cards.scss +0 -3
  30. package/assets/styles/global/_layout.scss +21 -35
  31. package/assets/styles/themes/_dark.scss +1 -1
  32. package/assets/styles/themes/_light.scss +1 -1
  33. package/assets/styles/themes/_modern.scss +16 -8
  34. package/assets/styles/themes/_suse.scss +116 -24
  35. package/assets/translations/en-us.yaml +185 -21
  36. package/assets/translations/zh-hans.yaml +0 -4
  37. package/components/AutoscalerCard.vue +113 -0
  38. package/components/AutoscalerTab.vue +94 -0
  39. package/components/BackLink.vue +8 -0
  40. package/components/BannerGraphic.vue +36 -21
  41. package/components/BrandImage.vue +17 -6
  42. package/components/ClusterIconMenu.vue +1 -1
  43. package/components/ClusterProviderIcon.vue +1 -1
  44. package/components/Cron/CronExpressionEditor.vue +1 -1
  45. package/components/Cron/CronExpressionEditorModal.vue +1 -1
  46. package/components/Drawer/Chrome.vue +2 -6
  47. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
  48. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
  49. package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
  50. package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
  51. package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
  52. package/components/Drawer/types.ts +3 -0
  53. package/components/DynamicContent/DynamicContentBanner.vue +102 -0
  54. package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
  55. package/components/DynamicContent/DynamicContentIcon.vue +132 -0
  56. package/components/DynamicContent/DynamicContentPanel.vue +112 -0
  57. package/components/DynamicContent/content.ts +78 -0
  58. package/components/EmberPage.vue +1 -1
  59. package/components/IconOrSvg.vue +2 -2
  60. package/components/Inactivity.vue +222 -106
  61. package/components/InstallHelmCharts.vue +2 -2
  62. package/components/PaginatedResourceTable.vue +2 -6
  63. package/components/PopoverCard.vue +192 -0
  64. package/components/Questions/__tests__/index.test.ts +159 -0
  65. package/components/Resource/Detail/CopyToClipboard.vue +4 -1
  66. package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
  67. package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
  68. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
  69. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
  70. package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
  71. package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
  72. package/components/Resource/Detail/Metadata/composables.ts +9 -9
  73. package/components/Resource/Detail/Metadata/index.vue +3 -3
  74. package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
  75. package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
  76. package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
  77. package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
  78. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
  79. package/components/Resource/Detail/TitleBar/composables.ts +2 -1
  80. package/components/Resource/Detail/TitleBar/index.vue +10 -6
  81. package/components/Resource/Detail/composables.ts +12 -0
  82. package/components/ResourceDetail/Masthead/latest.vue +29 -0
  83. package/components/ResourceDetail/index.vue +5 -2
  84. package/components/ResourceList/Masthead.vue +1 -1
  85. package/components/SortableTable/index.vue +18 -2
  86. package/components/Tabbed/__tests__/index.test.ts +86 -0
  87. package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
  88. package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
  89. package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
  90. package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
  91. package/components/__tests__/AutoscalerCard.test.ts +154 -0
  92. package/components/__tests__/AutoscalerTab.test.ts +125 -0
  93. package/components/__tests__/PopoverCard.test.ts +204 -0
  94. package/components/auth/SelectPrincipal.vue +24 -6
  95. package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
  96. package/components/fleet/FleetConfigMapSelector.vue +117 -0
  97. package/components/fleet/FleetSecretSelector.vue +127 -0
  98. package/components/fleet/__tests__/FleetConfigMapSelector.test.ts +125 -0
  99. package/components/fleet/__tests__/FleetSecretSelector.test.ts +82 -0
  100. package/components/form/FileImageSelector.vue +13 -4
  101. package/components/form/FileSelector.vue +11 -2
  102. package/components/form/ResourceLabeledSelect.vue +1 -0
  103. package/components/form/__tests__/ResourceLabeledSelect.test.ts +90 -0
  104. package/components/formatter/Autoscaler.vue +97 -0
  105. package/components/formatter/InternalExternalIP.vue +198 -24
  106. package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
  107. package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
  108. package/components/google/util/__tests__/formatter.test.ts +47 -0
  109. package/components/google/util/formatter.ts +5 -2
  110. package/components/nav/Group.vue +12 -3
  111. package/components/nav/Header.vue +37 -16
  112. package/components/nav/NamespaceFilter.vue +13 -1
  113. package/components/nav/NotificationCenter/index.vue +2 -1
  114. package/components/nav/TopLevelMenu.helper.ts +16 -6
  115. package/components/nav/TopLevelMenu.vue +4 -2
  116. package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
  117. package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
  118. package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
  119. package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
  120. package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
  121. package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
  122. package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
  123. package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
  124. package/components/nav/WindowManager/constants.ts +23 -0
  125. package/components/nav/WindowManager/index.vue +61 -575
  126. package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
  127. package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
  128. package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
  129. package/components/templates/default.vue +4 -40
  130. package/components/templates/home.vue +31 -5
  131. package/components/templates/plain.vue +30 -4
  132. package/components/templates/standalone.vue +1 -1
  133. package/composables/useI18n.ts +10 -1
  134. package/composables/useInterval.ts +15 -0
  135. package/config/__test__/uiplugins.test.ts +309 -0
  136. package/config/labels-annotations.js +9 -1
  137. package/config/product/auth.js +1 -0
  138. package/config/product/explorer.js +3 -1
  139. package/config/product/manager.js +20 -9
  140. package/config/query-params.js +1 -0
  141. package/config/router/routes.js +10 -2
  142. package/config/settings.ts +10 -2
  143. package/config/store.js +4 -2
  144. package/config/table-headers.js +8 -0
  145. package/config/types.js +11 -0
  146. package/config/uiplugins.js +46 -2
  147. package/config/version.js +1 -1
  148. package/core/__test__/extension-manager-impl.test.js +236 -0
  149. package/core/extension-manager-impl.js +23 -6
  150. package/core/plugin-helpers.ts +2 -0
  151. package/core/types-provisioning.ts +4 -1
  152. package/detail/pod.vue +1 -0
  153. package/detail/provisioning.cattle.io.cluster.vue +13 -1
  154. package/dialog/AddonConfigConfirmationDialog.vue +45 -1
  155. package/dialog/DeveloperLoadExtensionDialog.vue +12 -3
  156. package/dialog/RollbackWorkloadDialog.vue +2 -5
  157. package/directives/ui-context.ts +103 -0
  158. package/edit/__tests__/fleet.cattle.io.helmop.test.ts +52 -11
  159. package/edit/auth/AuthProviderWarningBanners.vue +14 -1
  160. package/edit/auth/__tests__/oidc.test.ts +26 -0
  161. package/edit/auth/github-app-steps.vue +97 -0
  162. package/edit/auth/github-steps.vue +75 -0
  163. package/edit/auth/github.vue +99 -65
  164. package/edit/auth/oidc.vue +5 -1
  165. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
  166. package/edit/cloudcredential.vue +1 -1
  167. package/edit/configmap.vue +1 -0
  168. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  169. package/edit/fleet.cattle.io.gitrepo.vue +0 -10
  170. package/edit/fleet.cattle.io.helmop.vue +51 -2
  171. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  172. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  173. package/edit/logging-flow/index.vue +1 -0
  174. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  175. package/edit/management.cattle.io.fleetworkspace.vue +1 -1
  176. package/edit/management.cattle.io.project.vue +1 -0
  177. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
  178. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
  179. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  180. package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
  181. package/edit/monitoring.coreos.com.route.vue +1 -1
  182. package/edit/namespace.vue +1 -0
  183. package/edit/networking.istio.io.destinationrule/index.vue +1 -0
  184. package/edit/networking.k8s.io.ingress/index.vue +1 -0
  185. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +15 -5
  186. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
  187. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
  188. package/edit/node.vue +1 -0
  189. package/edit/persistentvolume/index.vue +27 -22
  190. package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
  191. package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
  192. package/edit/persistentvolume/plugins/azureFile.vue +15 -14
  193. package/edit/persistentvolume/plugins/cephfs.vue +15 -14
  194. package/edit/persistentvolume/plugins/cinder.vue +15 -14
  195. package/edit/persistentvolume/plugins/csi.vue +18 -16
  196. package/edit/persistentvolume/plugins/fc.vue +13 -14
  197. package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
  198. package/edit/persistentvolume/plugins/flocker.vue +1 -3
  199. package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
  200. package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
  201. package/edit/persistentvolume/plugins/hostPath.vue +40 -39
  202. package/edit/persistentvolume/plugins/iscsi.vue +13 -14
  203. package/edit/persistentvolume/plugins/local.vue +1 -3
  204. package/edit/persistentvolume/plugins/longhorn.vue +23 -22
  205. package/edit/persistentvolume/plugins/nfs.vue +15 -14
  206. package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
  207. package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
  208. package/edit/persistentvolume/plugins/quobyte.vue +15 -14
  209. package/edit/persistentvolume/plugins/rbd.vue +15 -14
  210. package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
  211. package/edit/persistentvolume/plugins/storageos.vue +15 -14
  212. package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
  213. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
  214. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
  215. package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
  216. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +11 -9
  217. package/edit/provisioning.cattle.io.cluster/index.vue +25 -15
  218. package/edit/provisioning.cattle.io.cluster/rke2.vue +98 -17
  219. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +28 -2
  220. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
  221. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
  222. package/edit/secret/index.vue +1 -1
  223. package/edit/service.vue +9 -4
  224. package/edit/serviceaccount.vue +1 -0
  225. package/edit/storage.k8s.io.storageclass/index.vue +1 -0
  226. package/edit/workload/index.vue +2 -1
  227. package/edit/workload/mixins/workload.js +1 -1
  228. package/initialize/App.vue +4 -4
  229. package/initialize/install-directives.js +2 -0
  230. package/initialize/install-plugins.js +19 -2
  231. package/list/projectsecret.vue +1 -1
  232. package/list/provisioning.cattle.io.cluster.vue +15 -2
  233. package/machine-config/amazonec2.vue +42 -135
  234. package/machine-config/azure.vue +1 -1
  235. package/machine-config/components/EC2Networking.vue +490 -0
  236. package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
  237. package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
  238. package/machine-config/digitalocean.vue +11 -0
  239. package/machine-config/google.vue +1 -1
  240. package/mixins/__tests__/brand.spec.ts +2 -2
  241. package/mixins/__tests__/chart.test.ts +21 -0
  242. package/mixins/brand.js +1 -7
  243. package/mixins/chart.js +8 -2
  244. package/mixins/create-edit-view/index.js +5 -0
  245. package/models/__tests__/chart.test.ts +49 -12
  246. package/models/__tests__/compliance.cattle.io.clusterscanprofile.spec.js +30 -0
  247. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
  248. package/models/catalog.cattle.io.app.js +1 -1
  249. package/models/chart.js +28 -14
  250. package/models/cluster/node.js +13 -6
  251. package/models/cluster.x-k8s.io.machine.js +10 -20
  252. package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
  253. package/models/compliance.cattle.io.clusterscanprofile.js +1 -1
  254. package/models/management.cattle.io.authconfig.js +1 -0
  255. package/models/management.cattle.io.cluster.js +21 -3
  256. package/models/management.cattle.io.kontainerdriver.js +1 -0
  257. package/models/provisioning.cattle.io.cluster.js +249 -33
  258. package/package.json +6 -5
  259. package/pages/auth/login.vue +43 -4
  260. package/pages/auth/verify.vue +1 -1
  261. package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +3 -2
  262. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
  263. package/pages/c/_cluster/apps/charts/chart.vue +35 -17
  264. package/pages/c/_cluster/apps/charts/index.vue +11 -13
  265. package/pages/c/_cluster/apps/charts/install.vue +1 -1
  266. package/pages/c/_cluster/explorer/EventsTable.vue +89 -3
  267. package/pages/c/_cluster/explorer/index.vue +8 -6
  268. package/pages/c/_cluster/explorer/tools/index.vue +3 -3
  269. package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
  270. package/pages/c/_cluster/settings/brand.vue +1 -1
  271. package/pages/c/_cluster/settings/performance.vue +12 -25
  272. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
  273. package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
  274. package/pages/c/_cluster/uiplugins/index.vue +126 -184
  275. package/pages/home.vue +327 -16
  276. package/pkg/dynamic-importer.lib.js +4 -0
  277. package/plugins/axios.js +2 -1
  278. package/plugins/dashboard-client-init.js +3 -0
  279. package/plugins/dashboard-store/actions.js +1 -1
  280. package/plugins/dashboard-store/getters.js +18 -1
  281. package/plugins/dashboard-store/resource-class.js +21 -6
  282. package/plugins/dynamic-content.js +13 -0
  283. package/plugins/i18n.js +8 -0
  284. package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
  285. package/plugins/steve/steve-pagination-utils.ts +41 -22
  286. package/plugins/steve/subscribe.js +17 -9
  287. package/plugins/subscribe-events.ts +4 -2
  288. package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
  289. package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
  290. package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
  291. package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
  292. package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
  293. package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
  294. package/rancher-components/Pill/types.ts +0 -1
  295. package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
  296. package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
  297. package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
  298. package/rancher-components/RcIcon/RcIcon.vue +46 -0
  299. package/rancher-components/RcIcon/index.ts +1 -0
  300. package/rancher-components/RcIcon/types.ts +160 -0
  301. package/rancher-components/utils/status.test.ts +67 -0
  302. package/rancher-components/utils/status.ts +77 -0
  303. package/scripts/extension/publish +1 -1
  304. package/scripts/typegen.sh +1 -0
  305. package/store/action-menu.js +8 -0
  306. package/store/auth.js +11 -6
  307. package/store/aws.js +8 -6
  308. package/store/catalog.js +6 -0
  309. package/store/features.js +2 -0
  310. package/store/index.js +45 -20
  311. package/store/notifications.ts +51 -4
  312. package/store/plugins.js +7 -3
  313. package/store/prefs.js +12 -6
  314. package/store/type-map.js +3 -3
  315. package/store/ui-context.ts +86 -0
  316. package/store/wm.ts +244 -0
  317. package/types/kube/kube-api.ts +2 -1
  318. package/types/notifications/index.ts +27 -3
  319. package/types/rancher/index.d.ts +1 -0
  320. package/types/resources/settings.d.ts +29 -7
  321. package/types/shell/index.d.ts +138 -4
  322. package/types/store/__tests__/pagination.types.spec.ts +137 -0
  323. package/types/store/pagination.types.ts +157 -9
  324. package/types/store/subscribe-events.types.ts +8 -1
  325. package/types/store/subscribe.types.ts +1 -0
  326. package/types/window-manager.ts +24 -0
  327. package/utils/__tests__/cluster.test.ts +379 -1
  328. package/utils/__tests__/object.test.ts +19 -0
  329. package/utils/__tests__/provider.test.ts +98 -0
  330. package/utils/__tests__/selector-typed.test.ts +263 -0
  331. package/utils/__tests__/version.test.ts +19 -1
  332. package/utils/autoscaler-utils.ts +7 -0
  333. package/utils/back-off.ts +3 -3
  334. package/utils/brand.ts +29 -0
  335. package/utils/chart.js +18 -0
  336. package/utils/cluster.js +157 -3
  337. package/utils/color.js +1 -1
  338. package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
  339. package/utils/dynamic-content/__tests__/config.test.ts +187 -0
  340. package/utils/dynamic-content/__tests__/index.test.ts +390 -0
  341. package/utils/dynamic-content/__tests__/info.test.ts +275 -0
  342. package/utils/dynamic-content/__tests__/new-release.test.ts +216 -0
  343. package/utils/dynamic-content/__tests__/support-notice.test.ts +262 -0
  344. package/utils/dynamic-content/__tests__/util.test.ts +235 -0
  345. package/utils/dynamic-content/announcement.ts +142 -0
  346. package/utils/dynamic-content/config.ts +55 -0
  347. package/utils/dynamic-content/example.json +40 -0
  348. package/utils/dynamic-content/index.ts +277 -0
  349. package/utils/dynamic-content/info.ts +261 -0
  350. package/utils/dynamic-content/new-release.ts +126 -0
  351. package/utils/dynamic-content/notification-handler.ts +48 -0
  352. package/utils/dynamic-content/support-notice.ts +169 -0
  353. package/utils/dynamic-content/types.d.ts +153 -0
  354. package/utils/dynamic-content/util.ts +122 -0
  355. package/utils/dynamic-importer.js +2 -2
  356. package/utils/favicon.js +4 -4
  357. package/utils/inactivity.ts +104 -0
  358. package/utils/object.js +20 -2
  359. package/utils/pagination-utils.ts +19 -4
  360. package/utils/pagination-wrapper.ts +12 -8
  361. package/utils/provider.ts +14 -0
  362. package/utils/release-notes.ts +1 -1
  363. package/utils/scroll.js +7 -0
  364. package/utils/selector-typed.ts +6 -2
  365. package/utils/settings.ts +15 -0
  366. package/utils/validators/machine-pool.ts +13 -3
  367. package/utils/version.js +15 -0
  368. package/assets/images/icons/document.svg +0 -3
  369. package/plugins/nuxt-client-init.js +0 -3
  370. package/store/wm.js +0 -95
  371. /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
  372. /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
  373. /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
  374. /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
  375. /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
@@ -4,16 +4,15 @@ import CreateEditView from '@shell/mixins/create-edit-view';
4
4
  import CruResource from '@shell/components/CruResource';
5
5
  import { RadioGroup } from '@components/Form/Radio';
6
6
  import { LabeledInput } from '@components/Form/LabeledInput';
7
- import CopyToClipboard from '@shell/components/CopyToClipboard';
8
7
  import AllowedPrincipals from '@shell/components/auth/AllowedPrincipals';
9
8
  import { MANAGEMENT } from '@shell/config/types';
10
9
  import { findBy } from '@shell/utils/array';
11
10
  import AuthConfig from '@shell/mixins/auth-config';
12
11
  import AuthBanner from '@shell/components/auth/AuthBanner';
13
- import InfoBox from '@shell/components/InfoBox';
14
12
  import AuthProviderWarningBanners from '@shell/edit/auth/AuthProviderWarningBanners';
15
-
16
- const NAME = 'github';
13
+ import FileSelector from '@shell/components/form/FileSelector';
14
+ import GithubSteps from '@shell/edit/auth/github-steps.vue';
15
+ import GithubAppSteps from '@shell/edit/auth/github-app-steps.vue';
17
16
 
18
17
  export default {
19
18
  components: {
@@ -21,11 +20,12 @@ export default {
21
20
  CruResource,
22
21
  RadioGroup,
23
22
  LabeledInput,
24
- CopyToClipboard,
25
23
  AllowedPrincipals,
26
24
  AuthBanner,
27
- InfoBox,
28
- AuthProviderWarningBanners
25
+ AuthProviderWarningBanners,
26
+ FileSelector,
27
+ GithubSteps,
28
+ GithubAppSteps,
29
29
  },
30
30
 
31
31
  mixins: [CreateEditView, AuthConfig],
@@ -60,7 +60,7 @@ export default {
60
60
  },
61
61
 
62
62
  displayName() {
63
- return this.t(`model.authConfig.provider.${ NAME }`);
63
+ return this.t(`model.authConfig.provider.${ this.NAME }`);
64
64
  },
65
65
 
66
66
  tArgs() {
@@ -73,7 +73,7 @@ export default {
73
73
  },
74
74
 
75
75
  NAME() {
76
- return NAME;
76
+ return this.isGithubApp ? 'githubapp' : 'github';
77
77
  },
78
78
 
79
79
  AUTH_CONFIG() {
@@ -86,7 +86,32 @@ export default {
86
86
  githubConfig: this.model,
87
87
  description: 'Enable GitHub',
88
88
  };
89
- }
89
+ },
90
+
91
+ isGithubApp() {
92
+ return this.model?.id === 'githubapp';
93
+ },
94
+
95
+ steps() {
96
+ return this.isGithubApp ? GithubAppSteps : GithubSteps;
97
+ },
98
+
99
+ validationPassed() {
100
+ // Allows for configuring authorized users and groups
101
+ if ( this.model.enabled && !this.editConfig ) {
102
+ return true;
103
+ }
104
+
105
+ if (!this.model.clientId || !this.model.clientSecret) {
106
+ return false;
107
+ }
108
+
109
+ if (this.isGithubApp && (!this.model.appId || !this.model.privateKey)) {
110
+ return false;
111
+ }
112
+
113
+ return true;
114
+ },
90
115
 
91
116
  },
92
117
 
@@ -109,6 +134,10 @@ export default {
109
134
  this.model.hostname = match[4] || 'github.com';
110
135
  }
111
136
  },
137
+
138
+ updatePrivateKey(content) {
139
+ this.model.privateKey = content;
140
+ },
112
141
  },
113
142
  };
114
143
  </script>
@@ -122,7 +151,7 @@ export default {
122
151
  :mode="mode"
123
152
  :resource="model"
124
153
  :subtypes="[]"
125
- :validation-passed="true"
154
+ :validation-passed="validationPassed"
126
155
  :finish-button-mode="model.enabled ? 'edit' : 'enable'"
127
156
  :can-yaml="false"
128
157
  :errors="errors"
@@ -139,7 +168,7 @@ export default {
139
168
  >
140
169
  <template #rows>
141
170
  <tr><td>{{ t(`authConfig.${ NAME }.table.server`) }}: </td><td>{{ baseUrl }}</td></tr>
142
- <tr><td>{{ t(`authConfig.${ NAME }.table.clientId`) }}: </td><td>{{ value.clientId }}</td></tr>
171
+ <tr><td>{{ t(`authConfig.${ NAME }.table.clientId`) }}: </td><td>{{ model.clientId }}</td></tr>
143
172
  </template>
144
173
  </AuthBanner>
145
174
 
@@ -156,7 +185,17 @@ export default {
156
185
  <AuthProviderWarningBanners
157
186
  v-if="!model.enabled"
158
187
  :t-args="tArgs"
159
- />
188
+ >
189
+ <template
190
+ v-if="isGithubApp"
191
+ #additional-warning
192
+ >
193
+ <span
194
+ v-clean-html="t(`authConfig.${NAME}.warning`, {}, true)"
195
+ data-testid="github-app-banner"
196
+ />
197
+ </template>
198
+ </AuthProviderWarningBanners>
160
199
 
161
200
  <h3 v-t="`authConfig.${NAME}.target.label`" />
162
201
  <RadioGroup
@@ -182,60 +221,18 @@ export default {
182
221
  </div>
183
222
  </div>
184
223
 
185
- <InfoBox
186
- :step="1"
187
- class="step-box"
188
- >
189
- <ul class="step-list">
190
- <li v-clean-html="t(`authConfig.${NAME}.form.prefix.1`, tArgs, true)" />
191
- <li v-clean-html="t(`authConfig.${NAME}.form.prefix.2`, tArgs, true)" />
192
- <li v-clean-html="t(`authConfig.${NAME}.form.prefix.3`, tArgs, true)" />
193
- </ul>
194
- </InfoBox>
195
- <InfoBox
196
- :step="2"
197
- class="step-box"
198
- >
199
- <ul class="step-list">
200
- <li>
201
- {{ t(`authConfig.${NAME}.form.instruction`, tArgs, true) }}
202
- <ul class="mt-10">
203
- <li><b>{{ t(`authConfig.${NAME}.form.app.label`) }}</b>: <span v-clean-html="t(`authConfig.${NAME}.form.app.value`, tArgs, true)" /></li>
204
- <li>
205
- <b>{{ t(`authConfig.${NAME}.form.homepage.label`) }}</b>: {{ serverUrl }} <CopyToClipboard
206
- label-as="tooltip"
207
- :text="serverUrl"
208
- class="icon-btn"
209
- action-color="bg-transparent"
210
- />
211
- </li>
212
- <li><b>{{ t(`authConfig.${NAME}.form.description.label`) }}</b>: <span v-clean-html="t(`authConfig.${NAME}.form.description.value`, tArgs, true)" /></li>
213
- <li>
214
- <b>{{ t(`authConfig.${NAME}.form.callback.label`) }}</b>: {{ serverUrl }} <CopyToClipboard
215
- :text="serverUrl"
216
- label-as="tooltip"
217
- class="icon-btn"
218
- action-color="bg-transparent"
219
- />
220
- </li>
221
- </ul>
222
- </li>
223
- </ul>
224
- </InfoBox>
225
- <InfoBox
226
- :step="3"
227
- class="mb-20"
228
- >
229
- <ul class="step-list">
230
- <li v-clean-html="t(`authConfig.${NAME}.form.suffix.1`, tArgs, true)" />
231
- <li v-clean-html="t(`authConfig.${NAME}.form.suffix.2`, tArgs, true)" />
232
- </ul>
233
- </InfoBox>
224
+ <component
225
+ :is="steps"
226
+ :t-args="tArgs"
227
+ :name="NAME"
228
+ />
234
229
 
235
230
  <div class="row mb-20">
236
231
  <div class="col span-6">
237
232
  <LabeledInput
238
233
  v-model:value="model.clientId"
234
+ required
235
+ data-testid="client-id"
239
236
  :label="t(`authConfig.${NAME}.clientId.label`)"
240
237
  :mode="mode"
241
238
  />
@@ -243,21 +240,58 @@ export default {
243
240
  <div class="col span-6">
244
241
  <LabeledInput
245
242
  v-model:value="model.clientSecret"
243
+ required
244
+ data-testid="client-secret"
246
245
  type="password"
247
246
  :label="t(`authConfig.${NAME}.clientSecret.label`)"
248
247
  :mode="mode"
249
248
  />
250
249
  </div>
251
250
  </div>
251
+ <template v-if="isGithubApp">
252
+ <div class="row mb-20">
253
+ <div class="col span-6">
254
+ <LabeledInput
255
+ v-model:value="model.appId"
256
+ required
257
+ data-testid="app-id"
258
+ :label="t(`authConfig.${NAME}.githubAppId.label`)"
259
+ :mode="mode"
260
+ />
261
+ </div>
262
+ <div class="col span-6">
263
+ <LabeledInput
264
+ v-model:value="model.installationId"
265
+ data-testid="installation-id"
266
+ :label="t(`authConfig.${NAME}.installationId.label`)"
267
+ :mode="mode"
268
+ />
269
+ </div>
270
+ </div>
271
+ <div class="row mb-20">
272
+ <div class="col span-6">
273
+ <LabeledInput
274
+ v-model:value="model.privateKey"
275
+ required
276
+ data-testid="private-key"
277
+ type="multiline"
278
+ :label="t(`authConfig.${NAME}.privateKey.label`)"
279
+ :mode="mode"
280
+ />
281
+ <FileSelector
282
+ class="btn btn-sm role-secondary mt-10"
283
+ :label="t('generic.readFromFile')"
284
+ @selected="updatePrivateKey"
285
+ />
286
+ </div>
287
+ </div>
288
+ </template>
252
289
  </template>
253
290
  </CruResource>
254
291
  </div>
255
292
  </template>
256
293
 
257
294
  <style lang="scss" scoped>
258
- .step-list li:not(:last-child) {
259
- margin-bottom: 8px;
260
- }
261
295
  .banner {
262
296
  display: block;
263
297
 
@@ -442,12 +442,14 @@ export default {
442
442
  </div>
443
443
  </template>
444
444
 
445
- <template v-if="addCustomClaims">
445
+ <!-- Custom Claims -->
446
+ <template v-if="addCustomClaims && isGenericOidc">
446
447
  <h4>{{ t('authConfig.oidc.customClaims.label') }}</h4>
447
448
  <div class="row mb-20">
448
449
  <div class="col span-6">
449
450
  <LabeledInput
450
451
  v-model:value="model.nameClaim"
452
+ data-testid="input-name-claim"
451
453
  :label="t(`authConfig.oidc.customClaims.nameClaim.label`)"
452
454
  :mode="mode"
453
455
  />
@@ -455,6 +457,7 @@ export default {
455
457
  <div class="col span-6">
456
458
  <LabeledInput
457
459
  v-model:value="model.groupsClaim"
460
+ data-testid="input-groups-claim"
458
461
  :label="t(`authConfig.oidc.customClaims.groupsClaim.label`)"
459
462
  :mode="mode"
460
463
  />
@@ -464,6 +467,7 @@ export default {
464
467
  <div class="col span-6">
465
468
  <LabeledInput
466
469
  v-model:value="model.emailClaim"
470
+ data-testid="input-email-claim"
467
471
  :label="t(`authConfig.oidc.customClaims.emailClaim.label`)"
468
472
  :mode="mode"
469
473
  />
@@ -209,6 +209,7 @@ export default {
209
209
  <Tabbed
210
210
  :side-tabs="true"
211
211
  :use-hash="useTabbedHash"
212
+ :default-tab="defaultTab"
212
213
  >
213
214
  <Tab
214
215
  name="target"
@@ -139,8 +139,8 @@ export default {
139
139
  const fromDrivers = [...this.nodeDrivers, ...this.kontainerDrivers]
140
140
  .filter((x) => x.spec.active && x.id !== 'rancherkubernetesengine')
141
141
  .map((x) => x.spec.displayName || x.id);
142
+ const fromExtensions = this.extensions?.filter((x) => !x.hidden).map((x) => x.id) || [];
142
143
 
143
- const fromExtensions = this.extensions?.filter((x) => !!this.getCustomCloudCredentialComponent(x?.id)).map((x) => x?.id) || [];
144
144
  const providers = [...fromDrivers, ...fromExtensions];
145
145
 
146
146
  let types = uniq(providers.map((x) => this.$store.getters['plugins/credentialDriverFor'](x)));
@@ -111,6 +111,7 @@ export default {
111
111
  <Tabbed
112
112
  :side-tabs="true"
113
113
  :use-hash="useTabbedHash"
114
+ :default-tab="defaultTab"
114
115
  >
115
116
  <Tab
116
117
  name="data"
@@ -278,6 +278,7 @@ export default {
278
278
  <Tabbed
279
279
  :side-tabs="true"
280
280
  :use-hash="useTabbedHash"
281
+ :default-tab="defaultTab"
281
282
  @changed="onTabChanged"
282
283
  >
283
284
  <Tab
@@ -400,16 +400,6 @@ export default {
400
400
  }
401
401
  },
402
402
 
403
- scrollToBottom() {
404
- this.$nextTick(() => {
405
- const scrollable = document.getElementsByTagName('main')[0];
406
-
407
- if (scrollable) {
408
- scrollable.scrollTop = scrollable.scrollHeight;
409
- }
410
- });
411
- },
412
-
413
403
  updateBeforeSave() {
414
404
  this.value.spec['correctDrift'] = { enabled: this.correctDriftEnabled };
415
405
 
@@ -29,6 +29,8 @@ import UnitInput from '@shell/components/form/UnitInput';
29
29
  import FleetClusterTargets from '@shell/components/fleet/FleetClusterTargets/index.vue';
30
30
  import { toSeconds } from '@shell/utils/duration';
31
31
  import FleetValuesFrom from '@shell/components/fleet/FleetValuesFrom.vue';
32
+ import FleetSecretSelector from '@shell/components/fleet/FleetSecretSelector.vue';
33
+ import FleetConfigMapSelector from '@shell/components/fleet/FleetConfigMapSelector.vue';
32
34
 
33
35
  const MINIMUM_POLLING_INTERVAL = 15;
34
36
 
@@ -50,6 +52,8 @@ export default {
50
52
  Checkbox,
51
53
  CruResource,
52
54
  FleetClusterTargets,
55
+ FleetConfigMapSelector,
56
+ FleetSecretSelector,
53
57
  FleetValuesFrom,
54
58
  YamlEditor,
55
59
  LabeledInput,
@@ -230,7 +234,15 @@ export default {
230
234
  }
231
235
 
232
236
  return null;
233
- }
237
+ },
238
+
239
+ downstreamSecretsList() {
240
+ return (this.value.spec.downstreamResources || []).filter((r) => r.kind === 'Secret').map((r) => r.name);
241
+ },
242
+
243
+ downstreamConfigMapsList() {
244
+ return (this.value.spec.downstreamResources || []).filter((r) => r.kind === 'ConfigMap').map((r) => r.name);
245
+ },
234
246
  },
235
247
 
236
248
  watch: {
@@ -429,7 +441,24 @@ export default {
429
441
  }];
430
442
  break;
431
443
  }
432
- }
444
+ },
445
+
446
+ updateDownstreamResources(kind, list) {
447
+ switch (kind) {
448
+ case 'Secret':
449
+ this.value.spec.downstreamResources = [
450
+ ...(this.value.spec.downstreamResources || []).filter((r) => r.kind !== 'Secret'),
451
+ ...(list || []).map((name) => ({ name, kind: 'Secret' })),
452
+ ];
453
+ break;
454
+ case 'ConfigMap':
455
+ this.value.spec.downstreamResources = [
456
+ ...(this.value.spec.downstreamResources || []).filter((r) => r.kind !== 'ConfigMap'),
457
+ ...(list || []).map((name) => ({ name, kind: 'ConfigMap' })),
458
+ ];
459
+ break;
460
+ }
461
+ },
433
462
  },
434
463
  };
435
464
  </script>
@@ -711,6 +740,26 @@ export default {
711
740
 
712
741
  <h2 v-t="'fleet.helmOp.resources.label'" />
713
742
 
743
+ <div class="row mt-20 mb-20">
744
+ <div class="col span-6">
745
+ <FleetSecretSelector
746
+ :value="downstreamSecretsList"
747
+ :namespace="value.metadata.namespace"
748
+ :mode="mode"
749
+ @update:value="updateDownstreamResources('Secret', $event)"
750
+ />
751
+ </div>
752
+ </div>
753
+ <div class="row mt-20 mb-20">
754
+ <div class="col span-6">
755
+ <FleetConfigMapSelector
756
+ :value="downstreamConfigMapsList"
757
+ :namespace="value.metadata.namespace"
758
+ :mode="mode"
759
+ @update:value="updateDownstreamResources('ConfigMap', $event)"
760
+ />
761
+ </div>
762
+ </div>
714
763
  <div class="resource-handling mb-30">
715
764
  <Checkbox
716
765
  v-model:value="correctDriftEnabled"
@@ -143,6 +143,7 @@ export default {
143
143
  ref="tabs"
144
144
  :side-tabs="true"
145
145
  :use-hash="useTabbedHash"
146
+ :default-tab="defaultTab"
146
147
  >
147
148
  <Questions
148
149
  v-model:value="value.spec.values"
@@ -74,6 +74,7 @@ export default {
74
74
  class="mt-15"
75
75
  :side-tabs="true"
76
76
  :use-hash="useTabbedHash"
77
+ :default-tab="defaultTab"
77
78
  >
78
79
  <Tab
79
80
  name="basics"
@@ -405,6 +405,7 @@ export default {
405
405
  <Tabbed
406
406
  :side-tabs="true"
407
407
  :use-hash="useTabbedHash"
408
+ :default-tab="defaultTab"
408
409
  @changed="tabChanged($event)"
409
410
  >
410
411
  <Tab
@@ -212,6 +212,7 @@ export default {
212
212
  ref="tabbed"
213
213
  :side-tabs="true"
214
214
  :use-hash="useTabbedHash"
215
+ :default-tab="defaultTab"
215
216
  @changed="tabChanged($event)"
216
217
  >
217
218
  <Tab
@@ -199,7 +199,7 @@ export default {
199
199
 
200
200
  <Tabbed
201
201
  :side-tabs="true"
202
- default-tab="members"
202
+ :default-tab="defaultTab || 'members'"
203
203
  :use-hash="useTabbedHash"
204
204
  >
205
205
  <!-- <Tab name="members" label-key="generic.members" :weight="2">
@@ -198,6 +198,7 @@ export default {
198
198
  <Tabbed
199
199
  :side-tabs="true"
200
200
  :use-hash="useTabbedHash"
201
+ :default-tab="defaultTab"
201
202
  >
202
203
  <Tab
203
204
  v-if="canViewMembers"
@@ -204,7 +204,10 @@ export default {
204
204
  @input="$emit('input', $event)"
205
205
  />
206
206
 
207
- <Tabbed :use-hash="useTabbedHash">
207
+ <Tabbed
208
+ :use-hash="useTabbedHash"
209
+ :default-tab="defaultTab"
210
+ >
208
211
  <Tab
209
212
  :label="t('monitoring.route.label')"
210
213
  :weight="1"
@@ -313,8 +313,9 @@ export default {
313
313
  <Tabbed
314
314
  ref="tabbed"
315
315
  :side-tabs="true"
316
- default-tab="overview"
316
+ :default-tab="defaultTab || 'overview'"
317
317
  :use-hash="useTabbedHash"
318
+
318
319
  @changed="tabChanged"
319
320
  >
320
321
  <Tab
@@ -155,6 +155,7 @@ export default {
155
155
  :side-tabs="true"
156
156
  :show-tabs-add-remove="mode !== 'view'"
157
157
  :use-hash="useTabbedHash"
158
+ :default-tab="defaultTab"
158
159
  @addTab="addRuleGroup"
159
160
  @removeTab="removeGroupRule"
160
161
  >
@@ -218,8 +218,9 @@ export default {
218
218
  <Tabbed
219
219
  ref="tabbed"
220
220
  :side-tabs="true"
221
- default-tab="overview"
221
+ :default-tab="defaultTab || 'overview'"
222
222
  :use-hash="useTabbedHash"
223
+
223
224
  @changed="tabChanged"
224
225
  >
225
226
  <Tab
@@ -102,7 +102,7 @@ export default {
102
102
  <Tabbed
103
103
  ref="tabbed"
104
104
  :side-tabs="true"
105
- default-tab="overview"
105
+ :default-tab="defaultTab || 'overview'"
106
106
  :use-hash="useTabbedHash"
107
107
  >
108
108
  <Tab
@@ -203,6 +203,7 @@ export default {
203
203
  :mode="mode"
204
204
  :side-tabs="true"
205
205
  :use-hash="useTabbedHash"
206
+ :default-tab="defaultTab"
206
207
  @update:value="$emit('input', $event)"
207
208
  >
208
209
  <Tab
@@ -69,6 +69,7 @@ export default {
69
69
  <Tabbed
70
70
  :side-tabs="true"
71
71
  :use-hash="useTabbedHash"
72
+ :default-tab="defaultTab"
72
73
  >
73
74
  <Tab
74
75
  name="subsets"
@@ -229,6 +229,7 @@ export default {
229
229
  <Tabbed
230
230
  :side-tabs="true"
231
231
  :use-hash="useTabbedHash"
232
+ :default-tab="defaultTab"
232
233
  >
233
234
  <Tab
234
235
  :label="firstTabLabel"
@@ -149,25 +149,35 @@ export default {
149
149
  },
150
150
  watch: {
151
151
  namespace: {
152
- handler: 'debouncedUpdateMatches',
152
+ handler() {
153
+ this.debouncedUpdateMatches();
154
+ },
153
155
  immediate: true
154
156
  },
155
157
  'value.podSelector': {
156
- handler: 'debouncedUpdateMatches',
158
+ handler() {
159
+ this.debouncedUpdateMatches();
160
+ },
157
161
  immediate: true
158
162
  },
159
163
  'value.namespaceSelector': {
160
- handler: 'debouncedUpdateMatches',
164
+ handler() {
165
+ this.debouncedUpdateMatches();
166
+ },
161
167
  immediate: true
162
168
  },
163
169
  'value.ipBlock.cidr': 'validateCIDR',
164
170
  'value.ipBlock.except': 'validateCIDR',
165
171
  podSelectorExpressions: {
166
- handler: 'debouncedUpdateMatches',
172
+ handler() {
173
+ this.debouncedUpdateMatches();
174
+ },
167
175
  immediate: true
168
176
  },
169
177
  namespaceSelectorExpressions: {
170
- handler: 'debouncedUpdateMatches',
178
+ handler() {
179
+ this.debouncedUpdateMatches();
180
+ },
171
181
  immediate: true
172
182
  }
173
183
  },
@@ -59,6 +59,7 @@ export default {
59
59
  :side-tabs="true"
60
60
  :show-tabs-add-remove="mode !== 'view'"
61
61
  :use-hash="useTabbedHash"
62
+ :default-tab="defaultTab"
62
63
  @addTab="addPolicyRule"
63
64
  @removeTab="removePolicyRule"
64
65
  >
@@ -178,6 +178,7 @@ export default {
178
178
  <Tabbed
179
179
  :side-tabs="true"
180
180
  :use-hash="useTabbedHash"
181
+ :default-tab="defaultTab"
181
182
  >
182
183
  <Tab
183
184
  name="ingress"
package/edit/node.vue CHANGED
@@ -51,6 +51,7 @@ export default {
51
51
  :value="value"
52
52
  :mode="mode"
53
53
  :use-hash="useTabbedHash"
54
+ :default-tab="defaultTab"
54
55
  @update:value="$emit('input', $event)"
55
56
  >
56
57
  <Tab