dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-test.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.
- package/assets/data/aws-regions.json +3 -0
- package/assets/icons/demo.css:Zone.Identifier +0 -0
- package/assets/icons/demo_index.html:Zone.Identifier +0 -0
- package/assets/icons/iconfont.css:Zone.Identifier +0 -0
- package/assets/icons/iconfont.js:Zone.Identifier +0 -0
- package/assets/icons/iconfont.json:Zone.Identifier +0 -0
- package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
- package/assets/images/icons/document.svg +3 -0
- package/assets/images/key.svg +17 -0
- package/assets/images/providers/sks.svg +1 -0
- package/assets/images/vendor/cognito.svg +1 -0
- package/assets/styles/app.scss +3 -0
- package/assets/styles/base/_basic.scss +10 -0
- package/assets/styles/base/_spacing.scss +29 -0
- package/assets/styles/base/_variables.scss +19 -13
- package/assets/styles/global/_button.scss +7 -7
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/global/_layout.scss +1 -1
- package/assets/styles/global/_tooltip.scss +4 -4
- package/assets/styles/themes/_dark.scss +30 -0
- package/assets/styles/themes/_light.scss +83 -3
- package/assets/translations/en-us.yaml +822 -105
- package/assets/translations/zh-hans.yaml +89 -3
- package/chart/__tests__/S3.test.ts +2 -1
- package/chart/monitoring/index.vue +1 -1
- package/cloud-credential/gcp.vue +9 -1
- package/components/ActionDropdown.vue +1 -1
- package/components/ActionMenuShell.vue +3 -7
- package/components/AppModal.vue +9 -28
- package/components/AsyncButton.vue +2 -0
- package/components/BrandImage.vue +0 -21
- package/components/Certificates.vue +5 -0
- package/components/CodeMirror.vue +3 -3
- package/components/CommunityLinks.vue +3 -58
- package/components/ConfigMapSettings/Settings.vue +377 -0
- package/components/ConfigMapSettings/index.vue +354 -0
- package/components/CopyToClipboard.vue +15 -0
- package/components/CruResource.vue +103 -16
- package/components/DetailText.vue +61 -11
- package/components/Drawer/Chrome.vue +115 -0
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
- package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
- package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
- package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
- package/components/Drawer/ResourceDetailDrawer/index.vue +124 -0
- package/components/ExplorerMembers.vue +18 -3
- package/components/ExplorerProjectsNamespaces.vue +46 -29
- package/components/FilterPanel.vue +156 -0
- package/components/FixedBanner.vue +19 -5
- package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
- package/components/GrowlManager.vue +16 -15
- package/components/IconOrSvg.vue +19 -35
- package/components/KeyValueView.vue +1 -1
- package/components/LandingPagePreference.vue +2 -0
- package/components/Loading.vue +1 -1
- package/components/LocaleSelector.vue +10 -2
- package/components/PaginatedResourceTable.vue +53 -1
- package/components/PodSecurityAdmission.vue +1 -1
- package/components/ProgressBarMulti.vue +1 -0
- package/components/PromptModal.vue +38 -7
- package/components/PromptRemove.vue +5 -1
- package/components/PromptRestore.vue +22 -44
- package/components/RelatedResources.vue +4 -12
- package/components/Resource/Detail/Additional.vue +46 -0
- package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
- package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
- package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
- package/components/Resource/Detail/Card/Scaler.vue +89 -0
- package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
- package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
- package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
- package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
- package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
- package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
- package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
- package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
- package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
- package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
- package/components/Resource/Detail/Card/index.vue +56 -0
- package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
- package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +138 -0
- package/components/Resource/Detail/Metadata/KeyValue.vue +144 -0
- package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
- package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
- package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
- package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
- package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
- package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
- package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
- package/components/Resource/Detail/Metadata/composables.ts +81 -0
- package/components/Resource/Detail/Metadata/index.vue +90 -0
- package/components/Resource/Detail/Page.vue +37 -0
- package/components/Resource/Detail/PercentageBar.vue +40 -0
- package/components/Resource/Detail/ResourceRow.vue +138 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
- package/components/Resource/Detail/SpacedRow.vue +14 -0
- package/components/Resource/Detail/StatusBar.vue +59 -0
- package/components/Resource/Detail/StatusRow.vue +61 -0
- package/components/Resource/Detail/TitleBar/Title.vue +15 -0
- package/components/Resource/Detail/TitleBar/Top.vue +16 -0
- package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
- package/components/Resource/Detail/TitleBar/composables.ts +46 -0
- package/components/Resource/Detail/TitleBar/index.vue +289 -0
- package/components/Resource/Detail/Top/index.vue +34 -0
- package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
- package/components/Resource/Detail/composables.ts +45 -0
- package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
- package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
- package/components/ResourceDetail/Masthead/index.vue +65 -0
- package/components/ResourceDetail/Masthead/latest.vue +44 -0
- package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +235 -165
- package/components/ResourceDetail/__tests__/index.test.ts +135 -0
- package/components/ResourceDetail/index.vue +75 -575
- package/components/ResourceDetail/legacy.vue +580 -0
- package/components/ResourceList/Masthead.vue +70 -21
- package/components/ResourceList/index.vue +3 -2
- package/components/ResourceTable.vue +59 -85
- package/components/ResourceYaml.vue +15 -2
- package/components/RichTranslation.vue +106 -0
- package/components/SlideInPanelManager.vue +116 -14
- package/components/SortableTable/index.vue +12 -4
- package/components/SortableTable/paging.js +15 -16
- package/components/SortableTable/selection.js +22 -10
- package/components/StateDot/index.vue +28 -0
- package/components/StatusBadge.vue +6 -4
- package/components/SubtleLink.vue +25 -0
- package/components/Tabbed/index.vue +38 -22
- package/components/Wizard.vue +16 -3
- package/components/YamlEditor.vue +1 -2
- package/components/__tests__/AsyncButton.test.ts +39 -0
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/CruResource.test.ts +63 -0
- package/components/__tests__/FilterPanel.test.ts +81 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/__tests__/PromptModal.test.ts +146 -0
- package/components/__tests__/PromptRestore.test.ts +1 -65
- package/components/__tests__/RichTranslation.test.ts +115 -0
- package/components/auth/AuthBanner.vue +15 -14
- package/components/auth/Principal.vue +35 -12
- package/components/auth/RoleDetailEdit.vue +44 -4
- package/components/auth/login/ldap.vue +2 -2
- package/components/auth/login/oidc.vue +6 -1
- package/components/breadcrumb/index.vue +316 -0
- package/components/fleet/FleetApplications.vue +174 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
- package/components/fleet/FleetClusterTargets/index.vue +455 -0
- package/components/fleet/FleetClusters.vue +25 -6
- package/components/fleet/FleetGitRepoPaths.vue +476 -0
- package/components/fleet/FleetHelmOps.vue +123 -0
- package/components/fleet/FleetIntro.vue +58 -28
- package/components/fleet/FleetNoWorkspaces.vue +5 -1
- package/components/fleet/FleetOCIStorageSecret.vue +171 -0
- package/components/fleet/FleetRepos.vue +37 -80
- package/components/fleet/FleetResources.vue +69 -27
- package/components/fleet/FleetSummary.vue +26 -51
- package/components/fleet/FleetValuesFrom.vue +295 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
- package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
- package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
- package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
- package/components/fleet/dashboard/Empty.vue +73 -0
- package/components/fleet/dashboard/ResourceCard.vue +184 -0
- package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
- package/components/fleet/dashboard/ResourceDetails.vue +194 -0
- package/components/fleet/dashboard/ResourcePanel.vue +384 -0
- package/components/form/ArrayList.vue +144 -116
- package/components/form/BannerSettings.vue +117 -50
- package/components/form/ChangePassword.vue +3 -1
- package/components/form/ColorInput.vue +35 -6
- package/components/form/FileImageSelector.vue +1 -1
- package/components/form/Footer.vue +10 -4
- package/components/form/KeyValue.vue +92 -51
- package/components/form/LabeledSelect.vue +74 -55
- package/components/form/Labels.vue +91 -21
- package/components/form/MatchExpressions.vue +56 -9
- package/components/form/NameNsDescription.vue +12 -8
- package/components/form/Networking.vue +24 -19
- package/components/form/NotificationSettings.vue +15 -1
- package/components/form/ResourceLabeledSelect.vue +22 -8
- package/components/form/ResourceSelector.vue +27 -23
- package/components/form/ResourceTabs/index.vue +7 -1
- package/components/form/SSHKnownHosts/index.vue +14 -11
- package/components/form/SecretSelector.vue +18 -2
- package/components/form/Select.vue +57 -26
- package/components/form/SelectOrCreateAuthSecret.vue +6 -3
- package/components/form/SimpleSecretSelector.vue +17 -4
- package/components/form/Taints.vue +23 -3
- package/components/form/UnitInput.vue +21 -0
- package/components/form/ValueFromResource.vue +31 -19
- package/components/form/WorkloadPorts.vue +143 -123
- package/components/form/__tests__/ArrayList.test.ts +32 -0
- package/components/form/__tests__/ColorInput.test.ts +35 -0
- package/components/form/__tests__/KeyValue.test.ts +36 -0
- package/components/form/__tests__/LabeledSelect.test.ts +79 -2
- package/components/form/__tests__/Labels.test.ts +360 -0
- package/components/form/__tests__/MatchExpressions.test.ts +16 -13
- package/components/form/__tests__/Networking.test.ts +116 -0
- package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
- package/components/form/__tests__/Select.test.ts +37 -1
- package/components/form/__tests__/UnitInput.test.ts +23 -1
- package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
- package/components/formatter/ClusterLink.vue +5 -8
- package/components/formatter/Description.vue +30 -0
- package/components/formatter/FleetApplicationClustersReady.vue +77 -0
- package/components/formatter/FleetApplicationSource.vue +79 -0
- package/components/formatter/FleetSummaryGraph.vue +7 -0
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
- package/components/formatter/__tests__/LiveDate.test.ts +10 -2
- package/components/google/AccountAccess.vue +209 -0
- package/components/google/types/gcp.d.ts +136 -0
- package/components/google/types/index.d.ts +101 -0
- package/components/google/util/__mocks__/gcp.ts +465 -0
- package/components/google/util/formatter.ts +82 -0
- package/components/google/util/gcp.ts +134 -0
- package/components/google/util/index.d.ts +11 -0
- package/components/nav/Favorite.vue +1 -1
- package/components/nav/Group.vue +5 -0
- package/components/nav/Header.vue +27 -42
- package/components/nav/NamespaceFilter.vue +139 -83
- package/components/nav/NotificationCenter/Notification.vue +484 -0
- package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
- package/components/nav/NotificationCenter/index.vue +148 -0
- package/components/nav/TopLevelMenu.helper.ts +55 -34
- package/components/nav/TopLevelMenu.vue +11 -0
- package/components/nav/Type.vue +4 -1
- package/components/nav/WindowManager/ContainerLogs.vue +87 -61
- package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
- package/components/nav/WindowManager/index.vue +3 -2
- package/components/templates/default.vue +0 -3
- package/components/templates/plain.vue +0 -3
- package/composables/drawer.ts +26 -0
- package/composables/focusTrap.ts +3 -3
- package/composables/resources.test.ts +63 -0
- package/composables/resources.ts +38 -0
- package/composables/useI18n.ts +12 -11
- package/composables/useIsNewDetailPageEnabled.ts +17 -0
- package/config/labels-annotations.js +22 -11
- package/config/pagination-table-headers.js +8 -1
- package/config/private-label.js +0 -1
- package/config/product/auth.js +20 -3
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +49 -17
- package/config/product/fleet.js +77 -17
- package/config/product/manager.js +1 -29
- package/config/product/settings.js +23 -11
- package/config/query-params.js +16 -1
- package/config/roles.ts +2 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/navigation-guards/index.js +5 -67
- package/config/router/routes.js +65 -31
- package/config/secret.ts +15 -0
- package/config/settings.ts +33 -16
- package/config/store.js +2 -0
- package/config/system-namespaces.js +1 -1
- package/config/table-headers.js +91 -30
- package/config/types.js +18 -7
- package/config/version.js +1 -1
- package/core/plugin-helpers.ts +3 -2
- package/core/plugin.ts +32 -7
- package/core/types.ts +25 -7
- package/detail/catalog.cattle.io.app.vue +5 -1
- package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
- package/detail/fleet.cattle.io.bundle.vue +70 -6
- package/detail/fleet.cattle.io.cluster.vue +28 -15
- package/detail/fleet.cattle.io.gitrepo.vue +11 -2
- package/detail/fleet.cattle.io.helmop.vue +157 -0
- package/detail/management.cattle.io.fleetworkspace.vue +18 -27
- package/detail/management.cattle.io.oidcclient.vue +369 -0
- package/detail/namespace.vue +0 -3
- package/detail/node.vue +20 -16
- package/detail/pod.vue +2 -2
- package/detail/provisioning.cattle.io.cluster.vue +16 -50
- package/detail/service.vue +10 -2
- package/detail/workload/index.vue +48 -39
- package/dialog/AddCustomBadgeDialog.vue +0 -1
- package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
- package/dialog/AddonConfigConfirmationDialog.vue +1 -1
- package/dialog/AssignToDialog.vue +176 -0
- package/dialog/ChangePasswordDialog.vue +106 -0
- package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
- package/dialog/DisableAuthProviderDialog.vue +101 -0
- package/dialog/DrainNode.vue +1 -1
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
- package/dialog/FeatureFlagListDialog.vue +288 -0
- package/dialog/ForceMachineRemoveDialog.vue +1 -1
- package/dialog/GenericPrompt.vue +1 -1
- package/dialog/HelmOpForceUpdateDialog.vue +132 -0
- package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
- package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
- package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
- package/dialog/MoveNamespaceDialog.vue +157 -0
- package/dialog/OidcClientSecretDialog.vue +117 -0
- package/dialog/RedeployWorkloadDialog.vue +164 -0
- package/dialog/RotateEncryptionKeyDialog.vue +10 -30
- package/dialog/ScalePoolDownDialog.vue +1 -1
- package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
- package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
- package/dialog/WechatDialog.vue +57 -0
- package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/edit/__tests__/service.test.ts +2 -1
- package/edit/auth/ldap/__tests__/config.test.ts +14 -0
- package/edit/auth/ldap/config.vue +24 -0
- package/edit/auth/oidc.vue +159 -93
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
- package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
- package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
- package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
- package/edit/configmap.vue +8 -2
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +70 -256
- package/edit/fleet.cattle.io.helmop.vue +786 -0
- package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
- package/edit/logging-flow/index.vue +1 -0
- package/edit/logging.banzaicloud.io.output/index.vue +2 -1
- package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
- package/edit/management.cattle.io.fleetworkspace.vue +44 -10
- package/edit/management.cattle.io.oidcclient.vue +162 -0
- package/edit/management.cattle.io.project.vue +4 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
- package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
- package/edit/monitoring.coreos.com.route.vue +1 -0
- package/edit/namespace.vue +2 -4
- package/edit/networking.istio.io.destinationrule/index.vue +4 -1
- package/edit/networking.k8s.io.ingress/Certificate.vue +11 -3
- package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
- package/edit/networking.k8s.io.ingress/index.vue +4 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -14
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +57 -62
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
- package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +23 -31
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +4 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
- package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
- package/edit/resources.cattle.io.restore.vue +1 -1
- package/edit/secret/basic.vue +1 -0
- package/edit/secret/index.vue +127 -15
- package/edit/service.vue +17 -29
- package/edit/serviceaccount.vue +4 -1
- package/edit/storage.k8s.io.storageclass/index.vue +4 -1
- package/edit/workload/index.vue +14 -18
- package/edit/workload/mixins/workload.js +0 -2
- package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
- package/list/fleet.cattle.io.gitrepo.vue +1 -1
- package/list/fleet.cattle.io.helmop.vue +108 -0
- package/list/harvesterhci.io.management.cluster.vue +0 -17
- package/list/management.cattle.io.feature.vue +4 -288
- package/list/management.cattle.io.oidcclient.vue +108 -0
- package/list/management.cattle.io.user.vue +13 -20
- package/list/namespace.vue +6 -2
- package/list/node.vue +2 -0
- package/list/projectsecret.vue +345 -0
- package/list/secret.vue +109 -0
- package/list/workload.vue +6 -2
- package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
- package/machine-config/amazonec2.vue +3 -24
- package/machine-config/components/GCEImage.vue +374 -0
- package/machine-config/google.vue +617 -0
- package/machine-config/vmwarevsphere.vue +7 -17
- package/mixins/__tests__/brand.spec.ts +170 -0
- package/mixins/auth-config.js +8 -1
- package/mixins/brand.js +16 -17
- package/mixins/create-edit-view/impl.js +10 -1
- package/mixins/create-edit-view/index.js +5 -0
- package/mixins/preset.js +100 -0
- package/mixins/resource-fetch-api-pagination.js +73 -44
- package/mixins/resource-fetch.js +18 -8
- package/mixins/resource-table-watch.js +45 -0
- package/mixins/vue-select-overrides.js +1 -4
- package/models/__tests__/chart.test.ts +296 -0
- package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/models/__tests__/node.test.ts +7 -63
- package/models/__tests__/workload.test.ts +1 -0
- package/models/chart.js +157 -2
- package/models/cluster/node.js +2 -1
- package/models/cluster.js +32 -2
- package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
- package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
- package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
- package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
- package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
- package/models/fleet-application.js +297 -0
- package/models/fleet.cattle.io.bundle.js +9 -8
- package/models/fleet.cattle.io.cluster.js +21 -4
- package/models/fleet.cattle.io.gitrepo.js +46 -382
- package/models/fleet.cattle.io.helmop.js +202 -0
- package/models/management.cattle.io.authconfig.js +1 -0
- package/models/management.cattle.io.cluster.js +0 -20
- package/models/management.cattle.io.feature.js +7 -1
- package/models/management.cattle.io.fleetworkspace.js +14 -1
- package/models/management.cattle.io.node.js +7 -22
- package/models/management.cattle.io.nodepool.js +12 -0
- package/models/management.cattle.io.oidcclient.js +18 -0
- package/models/management.cattle.io.registration.js +3 -0
- package/models/management.cattle.io.setting.js +0 -1
- package/models/namespace.js +12 -1
- package/models/provisioning.cattle.io.cluster.js +60 -97
- package/models/secret.js +157 -2
- package/models/service.js +28 -9
- package/models/storage.k8s.io.storageclass.js +2 -2
- package/models/workload.js +91 -51
- package/package.json +6 -5
- package/pages/about.vue +17 -61
- package/pages/account/index.vue +34 -80
- package/pages/auth/login.vue +2 -3
- package/pages/auth/verify.vue +13 -1
- package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
- package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
- package/pages/c/_cluster/apps/charts/index.vue +501 -468
- package/pages/c/_cluster/apps/charts/install.vue +0 -1
- package/pages/c/_cluster/auth/roles/index.vue +45 -41
- package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
- package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +14 -3
- package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
- package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
- package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
- package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
- package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
- package/pages/c/_cluster/fleet/application/create.vue +341 -0
- package/pages/c/_cluster/fleet/application/index.vue +139 -0
- package/pages/c/_cluster/fleet/graph/config.js +277 -0
- package/pages/c/_cluster/fleet/index.vue +866 -328
- package/pages/c/_cluster/fleet/settings/index.vue +229 -0
- package/pages/c/_cluster/longhorn/index.vue +5 -2
- package/pages/c/_cluster/settings/banners.vue +56 -2
- package/pages/c/_cluster/settings/brand.vue +2 -1
- package/pages/c/_cluster/settings/performance.vue +7 -26
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
- package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
- package/pages/c/_cluster/uiplugins/index.vue +98 -55
- package/pages/explorer/resource/detail/configmap.vue +42 -0
- package/pages/explorer/resource/detail/projectsecret.vue +9 -0
- package/pages/explorer/resource/detail/secret.vue +63 -0
- package/pages/home.vue +8 -104
- package/pages/prefs.vue +0 -1
- package/pages/support/index.vue +4 -6
- package/pkg/tsconfig.json +9 -9
- package/pkg/vue.config.js +2 -2
- package/plugins/clean-html.js +2 -0
- package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
- package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
- package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
- package/plugins/dashboard-store/actions.js +212 -55
- package/plugins/dashboard-store/getters.js +112 -24
- package/plugins/dashboard-store/mutations.js +61 -12
- package/plugins/dashboard-store/normalize.js +29 -19
- package/plugins/dashboard-store/resource-class.js +105 -21
- package/plugins/steve/__tests__/getters.test.ts +19 -12
- package/plugins/steve/__tests__/steve-class.test.ts +1 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
- package/plugins/steve/actions.js +37 -24
- package/plugins/steve/getters.js +47 -12
- package/plugins/steve/resourceWatcher.js +10 -3
- package/plugins/steve/steve-class.js +5 -0
- package/plugins/steve/steve-pagination-utils.ts +225 -43
- package/plugins/steve/subscribe.js +418 -53
- package/plugins/steve/worker/web-worker.advanced.js +5 -1
- package/rancher-components/BadgeState/BadgeState.vue +33 -52
- package/rancher-components/Banner/Banner.test.ts +51 -3
- package/rancher-components/Banner/Banner.vue +39 -8
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
- package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
- package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
- package/rancher-components/Form/Radio/RadioButton.vue +21 -5
- package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
- package/rancher-components/Form/Radio/RadioGroup.vue +81 -38
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
- package/rancher-components/RcButton/RcButton.vue +1 -1
- package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
- package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
- package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
- package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
- package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
- package/rancher-components/RcDropdown/index.ts +2 -0
- package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
- package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
- package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
- package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
- package/rancher-components/RcItemCard/index.ts +2 -0
- package/rancher-components/StringList/StringList.vue +1 -1
- package/scripts/extension/publish +1 -1
- package/scripts/publish-shell.sh +1 -1
- package/static/loading-indicator.html +1 -1
- package/store/action-menu.js +26 -56
- package/store/auth.js +3 -0
- package/store/catalog.js +85 -25
- package/store/features.js +0 -1
- package/store/growl.js +97 -8
- package/store/i18n.js +4 -1
- package/store/index.js +44 -14
- package/store/notifications.ts +426 -0
- package/store/prefs.js +2 -8
- package/store/slideInPanel.ts +6 -0
- package/store/type-map.js +35 -18
- package/store/type-map.utils.ts +49 -6
- package/store/uiplugins.ts +15 -1
- package/types/fleet.d.ts +60 -1
- package/types/kube/kube-api.ts +34 -0
- package/types/notifications/index.ts +74 -0
- package/types/resources/fleet.d.ts +43 -0
- package/types/resources/pod-security-admission.ts +36 -0
- package/types/resources/settings.d.ts +107 -0
- package/types/resources/userPreferences.d.ts +13 -0
- package/types/shell/index.d.ts +944 -744
- package/types/store/dashboard-store.types.ts +57 -4
- package/types/store/pagination.types.ts +41 -9
- package/types/store/subscribe.types.ts +50 -0
- package/utils/__mocks__/tabbable.js +13 -0
- package/utils/__tests__/back-off.test.ts +354 -0
- package/utils/__tests__/create-yaml.test.ts +235 -0
- package/utils/__tests__/fleet.test.ts +148 -0
- package/utils/__tests__/kontainer.test.ts +19 -0
- package/utils/__tests__/object.test.ts +54 -1
- package/utils/__tests__/string.test.ts +273 -1
- package/utils/__tests__/time.test.ts +31 -0
- package/utils/auth.js +41 -6
- package/utils/back-off.ts +176 -0
- package/utils/cluster.js +24 -20
- package/utils/create-yaml.js +103 -9
- package/utils/crypto/encryption.ts +103 -0
- package/utils/cspAdaptor.ts +51 -0
- package/utils/error.js +3 -6
- package/utils/errorTranslate.json +15 -0
- package/utils/fleet-types.ts +0 -0
- package/utils/fleet.ts +204 -74
- package/utils/grafana.js +1 -0
- package/utils/kontainer.ts +3 -5
- package/utils/object.js +36 -12
- package/utils/pagination-utils.ts +50 -3
- package/utils/pagination-wrapper.ts +132 -50
- package/utils/perf-setting.utils.ts +28 -0
- package/utils/release-notes.ts +48 -0
- package/utils/selector-typed.ts +210 -0
- package/utils/selector.js +29 -6
- package/utils/settings.ts +4 -1
- package/utils/string.js +24 -0
- package/utils/style.ts +39 -0
- package/utils/{time.js → time.ts} +25 -6
- package/utils/uiplugins.ts +41 -8
- package/utils/v-sphere.ts +5 -1
- package/utils/validators/formRules/__tests__/index.test.ts +76 -6
- package/utils/validators/formRules/index.ts +99 -4
- package/utils/window.js +11 -7
- package/vue.config.js +5 -5
- package/.DS_Store +0 -0
- package/components/AssignTo.vue +0 -199
- package/components/DisableAuthProviderModal.vue +0 -115
- package/components/MoveModal.vue +0 -167
- package/components/PromptChangePassword.vue +0 -123
- package/components/ResourceList/Masthead-btn.vue +0 -225
- package/components/__tests__/ApplicationCard.test.ts +0 -27
- package/components/cards/ApplicationCard.vue +0 -145
- package/components/fleet/FleetBundleResources.vue +0 -86
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
- package/components/formatter/RKETemplateName.vue +0 -37
- package/config/product/legacy.js +0 -62
- package/config/secret.js +0 -14
- package/dialog/SaveAsRKETemplateDialog.vue +0 -139
- package/models/etcdbackup.js +0 -45
- package/pages/auth copy/login.vue +0 -595
- package/pages/auth copy/logout.vue +0 -47
- package/pages/auth copy/setup.vue +0 -523
- package/pages/auth copy/verify.vue +0 -203
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
- package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
- package/pages/c/_cluster/legacy/project/_page.vue +0 -57
- package/pages/c/_cluster/legacy/project/index.vue +0 -32
- package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import day from 'dayjs';
|
|
2
|
+
import { escapeHtml } from '@shell/utils/string';
|
|
3
|
+
import { DATE_FORMAT, TIME_FORMAT } from '@shell/store/prefs';
|
|
4
|
+
import { type Store } from 'vuex';
|
|
2
5
|
|
|
3
6
|
const FACTORS = [60, 60, 24];
|
|
4
7
|
const LABELS = ['sec', 'min', 'hour', 'day'];
|
|
@@ -6,7 +9,7 @@ const LABELS = ['sec', 'min', 'hour', 'day'];
|
|
|
6
9
|
// Diff two dates and return an object with values for presentation
|
|
7
10
|
// If 't' is also passed, 'string' property is set on the return object with the diff formatted as a string
|
|
8
11
|
// e.g. formats a date difference to return '1 day', '20 hours' etc
|
|
9
|
-
export function diffFrom(value, from, t) {
|
|
12
|
+
export function diffFrom(value: any, from: any, t: any) {
|
|
10
13
|
const now = day();
|
|
11
14
|
|
|
12
15
|
from = from || now;
|
|
@@ -15,7 +18,7 @@ export function diffFrom(value, from, t) {
|
|
|
15
18
|
let absDiff = Math.abs(diff);
|
|
16
19
|
|
|
17
20
|
let next = 1;
|
|
18
|
-
let label = '?';
|
|
21
|
+
let label: any = '?';
|
|
19
22
|
|
|
20
23
|
let i = 0;
|
|
21
24
|
|
|
@@ -30,7 +33,7 @@ export function diffFrom(value, from, t) {
|
|
|
30
33
|
} else {
|
|
31
34
|
label = Math.floor(absDiff);
|
|
32
35
|
}
|
|
33
|
-
const ret = {
|
|
36
|
+
const ret: any = {
|
|
34
37
|
diff,
|
|
35
38
|
absDiff,
|
|
36
39
|
label,
|
|
@@ -47,7 +50,7 @@ export function diffFrom(value, from, t) {
|
|
|
47
50
|
return ret;
|
|
48
51
|
}
|
|
49
52
|
|
|
50
|
-
export function safeSetTimeout(timeout, callback, that) {
|
|
53
|
+
export function safeSetTimeout(timeout: any, callback: any, that: any) {
|
|
51
54
|
if (timeout <= 2147483647) {
|
|
52
55
|
// Max value setTimeout can take is max 32 bit int (about 24.9 days)
|
|
53
56
|
return setTimeout(() => {
|
|
@@ -56,7 +59,7 @@ export function safeSetTimeout(timeout, callback, that) {
|
|
|
56
59
|
}
|
|
57
60
|
}
|
|
58
61
|
|
|
59
|
-
export function getSecondsDiff(startDate, endDate) {
|
|
62
|
+
export function getSecondsDiff(startDate: any, endDate: any) {
|
|
60
63
|
return Math.round(
|
|
61
64
|
Math.abs(Date.parse(endDate) - Date.parse(startDate)) / 1000
|
|
62
65
|
);
|
|
@@ -68,7 +71,7 @@ export function getSecondsDiff(startDate, endDate) {
|
|
|
68
71
|
* diff: update frequency in seconds
|
|
69
72
|
* label: content of the cell's column
|
|
70
73
|
*/
|
|
71
|
-
export function elapsedTime(seconds) {
|
|
74
|
+
export function elapsedTime(seconds: any) {
|
|
72
75
|
if (!seconds) {
|
|
73
76
|
return {};
|
|
74
77
|
}
|
|
@@ -119,3 +122,19 @@ export function elapsedTime(seconds) {
|
|
|
119
122
|
label: `${ hours }h${ minutes - (hours * 60) }m`,
|
|
120
123
|
};
|
|
121
124
|
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Format date and time using user preferences
|
|
128
|
+
* @param value Date string to format
|
|
129
|
+
* @returns Formatted date string
|
|
130
|
+
*/
|
|
131
|
+
export const dateTimeFormat = (value: string | undefined, store: Store<any>): string => {
|
|
132
|
+
if (!value) return '';
|
|
133
|
+
|
|
134
|
+
const dateFormat = escapeHtml( store.getters['prefs/get'](DATE_FORMAT));
|
|
135
|
+
const timeFormat = escapeHtml( store.getters['prefs/get'](TIME_FORMAT));
|
|
136
|
+
|
|
137
|
+
const format = `${ dateFormat } ${ timeFormat }`;
|
|
138
|
+
|
|
139
|
+
return day(value).format(format);
|
|
140
|
+
};
|
package/utils/uiplugins.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { matchesSomeRegex } from '@shell/utils/string';
|
|
2
2
|
import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
|
|
3
3
|
import { CATALOG } from '@shell/config/types';
|
|
4
|
-
import { UI_PLUGIN_BASE_URL, isSupportedChartVersion } from '@shell/config/uiplugins';
|
|
4
|
+
import { UI_PLUGIN_BASE_URL, isSupportedChartVersion, UI_PLUGIN_LABELS } from '@shell/config/uiplugins';
|
|
5
5
|
|
|
6
6
|
const MAX_RETRIES = 10;
|
|
7
7
|
const RETRY_WAIT = 2500;
|
|
@@ -44,9 +44,11 @@ export async function getLatestExtensionVersion(
|
|
|
44
44
|
*
|
|
45
45
|
* @param store Vue store
|
|
46
46
|
* @param name Name of the extension
|
|
47
|
+
* @param maxRetries Number of times to check for availability
|
|
48
|
+
* @param retryWait Gap (in ms) between availability checks
|
|
47
49
|
* @returns the extension object when available, null if timed out waiting for it to be available
|
|
48
50
|
*/
|
|
49
|
-
export async function waitForUIExtension(store: any, name: string): Promise<any> {
|
|
51
|
+
export async function waitForUIExtension(store: any, name: string, maxRetries = MAX_RETRIES, retryWait = RETRY_WAIT): Promise<any> {
|
|
50
52
|
let tries = 0;
|
|
51
53
|
|
|
52
54
|
while (true) {
|
|
@@ -69,11 +71,11 @@ export async function waitForUIExtension(store: any, name: string): Promise<any>
|
|
|
69
71
|
|
|
70
72
|
tries++;
|
|
71
73
|
|
|
72
|
-
if (tries >
|
|
74
|
+
if (tries > maxRetries) {
|
|
73
75
|
return null;
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
78
|
+
await new Promise((resolve) => setTimeout(resolve, retryWait));
|
|
77
79
|
}
|
|
78
80
|
}
|
|
79
81
|
|
|
@@ -82,9 +84,11 @@ export async function waitForUIExtension(store: any, name: string): Promise<any>
|
|
|
82
84
|
*
|
|
83
85
|
* @param store Vue store
|
|
84
86
|
* @param extension Extension object
|
|
87
|
+
* @param maxRetries Number of times to check for availability
|
|
88
|
+
* @param retryWait Gap (in MS) between availability checks
|
|
85
89
|
* @returns true when available, false if timed out waiting for it to be available
|
|
86
90
|
*/
|
|
87
|
-
export async function waitForUIPackage(store: any, extension: any): Promise<boolean> {
|
|
91
|
+
export async function waitForUIPackage(store: any, extension: any, maxRetries = MAX_RETRIES, retryWait = RETRY_WAIT): Promise<boolean> {
|
|
88
92
|
let tries = 0;
|
|
89
93
|
|
|
90
94
|
const { name, version } = extension;
|
|
@@ -104,11 +108,11 @@ export async function waitForUIPackage(store: any, extension: any): Promise<bool
|
|
|
104
108
|
|
|
105
109
|
tries++;
|
|
106
110
|
|
|
107
|
-
if (tries >
|
|
111
|
+
if (tries > maxRetries) {
|
|
108
112
|
return false;
|
|
109
113
|
}
|
|
110
114
|
|
|
111
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
115
|
+
await new Promise((resolve) => setTimeout(resolve, retryWait));
|
|
112
116
|
}
|
|
113
117
|
}
|
|
114
118
|
|
|
@@ -176,10 +180,17 @@ export async function getHelmRepositoryExact(store: any, url: string): Promise<H
|
|
|
176
180
|
*
|
|
177
181
|
* @param store Vue store
|
|
178
182
|
* @param urlRegexes Regex to match a community repository
|
|
183
|
+
* @param catalogImages Catalog images to match against the repository's labels
|
|
179
184
|
* @returns HelmRepository
|
|
180
185
|
*/
|
|
181
|
-
export async function getHelmRepositoryMatch(store: any, urlRegexes: string[]): Promise<HelmRepository> {
|
|
186
|
+
export async function getHelmRepositoryMatch(store: any, urlRegexes: string[], catalogImages: string[]): Promise<HelmRepository> {
|
|
182
187
|
return await getHelmRepository(store, (repository: any) => {
|
|
188
|
+
// if installed from rancher/ui-plugin-catalog or rancher/ui-extension-harvester-ui-extension
|
|
189
|
+
const catalog = repository?.metadata?.labels?.[UI_PLUGIN_LABELS.CATALOG_IMAGE] || '';
|
|
190
|
+
|
|
191
|
+
if (catalogImages.includes(catalog)) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
183
194
|
const target = repository.spec?.gitBranch ? repository.spec?.gitRepo : repository.spec?.url;
|
|
184
195
|
|
|
185
196
|
return matchesSomeRegex(target, urlRegexes);
|
|
@@ -317,3 +328,25 @@ export async function getHelmChart(store: any, repository: any, chartName: strin
|
|
|
317
328
|
await new Promise((resolve) => setTimeout(resolve, RETRY_WAIT));
|
|
318
329
|
}
|
|
319
330
|
}
|
|
331
|
+
|
|
332
|
+
export async function onExtensionsReady(store: any) {
|
|
333
|
+
const alreadyReady = store.getters['uiplugins/ready'];
|
|
334
|
+
|
|
335
|
+
if (alreadyReady) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const extensions = store.getters['uiplugins/plugins'] || [];
|
|
340
|
+
|
|
341
|
+
for (let i = 0; i < extensions.length; i++) {
|
|
342
|
+
const ext = extensions[i];
|
|
343
|
+
|
|
344
|
+
try {
|
|
345
|
+
await ext.onLogIn(store);
|
|
346
|
+
} catch (e) {
|
|
347
|
+
console.error(`Exception caught in onReady for extension ${ ext.name }`, e); // eslint-disable-line no-console
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
await store.dispatch('uiplugins/setReady', true);
|
|
352
|
+
}
|
package/utils/v-sphere.ts
CHANGED
|
@@ -40,7 +40,11 @@ class VSphereUtils {
|
|
|
40
40
|
generateName, upstreamClusterName, upstreamNamespace, downstreamName, downstreamNamespace
|
|
41
41
|
}: SecretDetails): Promise<SecretJson | undefined> {
|
|
42
42
|
// Fetch secrets in a specific namespace and partially matching the name to the generate name
|
|
43
|
-
const
|
|
43
|
+
const url = $store.getters['management/urlOptions'](
|
|
44
|
+
`/v1/${ SECRET }/${ upstreamNamespace }`,
|
|
45
|
+
{ filter: { 'metadata.name': generateName } }
|
|
46
|
+
);
|
|
47
|
+
const secrets = await $store.dispatch('management/request', { url });
|
|
44
48
|
|
|
45
49
|
// Filter by specific annotations
|
|
46
50
|
const applicableSecret = secrets.data?.filter((s: any) => {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { Translation } from '@shell/types/t';
|
|
1
2
|
import formRulesGenerator from '@shell/utils/validators/formRules';
|
|
2
3
|
|
|
3
|
-
const mockT = (key: string, args: any) => {
|
|
4
|
+
const mockT: Translation = (key: string, args: any) => {
|
|
4
5
|
return JSON.stringify({
|
|
5
6
|
message: key,
|
|
6
7
|
...args
|
|
@@ -8,6 +9,14 @@ const mockT = (key: string, args: any) => {
|
|
|
8
9
|
};
|
|
9
10
|
|
|
10
11
|
describe('formRules', () => {
|
|
12
|
+
it('should use "Value" as default label', () => {
|
|
13
|
+
const validators = formRulesGenerator(mockT, {});
|
|
14
|
+
|
|
15
|
+
const message = validators.required(null);
|
|
16
|
+
|
|
17
|
+
expect(message).toStrictEqual('{\"message\":\"validation.required\",\"key\":\"Value\"}');
|
|
18
|
+
});
|
|
19
|
+
|
|
11
20
|
const formRules = formRulesGenerator(mockT, { key: 'testDisplayKey' });
|
|
12
21
|
|
|
13
22
|
it('"required" : returns undefined when value supplied', () => {
|
|
@@ -87,39 +96,100 @@ describe('formRules', () => {
|
|
|
87
96
|
);
|
|
88
97
|
});
|
|
89
98
|
|
|
90
|
-
describe('
|
|
91
|
-
const message = JSON.stringify({ message: 'validation.
|
|
99
|
+
describe('urlRepository', () => {
|
|
100
|
+
const message = JSON.stringify({ message: 'validation.repository.url' });
|
|
92
101
|
const testCases = [
|
|
93
102
|
// Valid HTTP(s)
|
|
94
103
|
['https://github.com/rancher/dashboard.git', undefined],
|
|
95
104
|
['http://github.com/rancher/dashboard.git', undefined],
|
|
96
105
|
['https://github.com/rancher/dashboard', undefined],
|
|
97
106
|
['https://github.com/rancher/dashboard/', undefined],
|
|
107
|
+
['https://github.com/rancher/%20dashboard/', undefined],
|
|
108
|
+
['https://github.com/rancher/dashboard/%20', undefined],
|
|
109
|
+
['https://localhost:8005', undefined],
|
|
98
110
|
|
|
99
111
|
// Valid SSH
|
|
100
112
|
['git@github.com:rancher/dashboard.git', undefined],
|
|
101
113
|
['git@github.com:rancher/dashboard', undefined],
|
|
102
114
|
['git@github.com:rancher/dashboard/', undefined],
|
|
115
|
+
['git@github.com:rancher/%20dashboard/', undefined],
|
|
116
|
+
['git@github.com:rancher/dashboard/%20', undefined],
|
|
103
117
|
|
|
104
118
|
// Not valid HTTP(s)
|
|
105
119
|
['https://github.com/rancher/ dashboard.git', message],
|
|
106
120
|
['http://github.com/rancher/ dashboard.git', message],
|
|
121
|
+
['http://github.com/ rancher/dashboard.git', message],
|
|
122
|
+
['http://github.com /rancher/dashboard.git', message],
|
|
107
123
|
['https://github.com/rancher/dashboard ', message],
|
|
124
|
+
['https%20://github.com/rancher/dashboard ', message],
|
|
125
|
+
['ht%20tps://github.com/rancher/dashboard ', message],
|
|
126
|
+
['https://git%20hub.com/rancher/dashboard/%20', message],
|
|
127
|
+
['https://https://', message],
|
|
128
|
+
['http:/ww.abc.com', message],
|
|
129
|
+
['http:ww.abc.com', message],
|
|
108
130
|
['foo://github.com/rancher/dashboard/', message],
|
|
109
131
|
['github.com/rancher/dashboard/', message],
|
|
110
132
|
|
|
111
133
|
// Not valid SSH
|
|
112
134
|
['git@github.com:rancher/ dashboard.git', message],
|
|
113
135
|
['git@github.com:rancher/dashboard ', message],
|
|
136
|
+
['git@github.com:rancher/ dashboard', message],
|
|
137
|
+
['git @github.com:rancher/dashboard', message],
|
|
138
|
+
['git@github.com: rancher/dashboard', message],
|
|
114
139
|
['git@github.comrancher/dashboard', message],
|
|
115
|
-
|
|
116
|
-
[
|
|
140
|
+
['git@githubcomrancher/dashboard', message],
|
|
141
|
+
['%20git@github.comrancher/dashboard', message],
|
|
142
|
+
['git@git%20hub.comrancher/dashboard', message],
|
|
143
|
+
['git@.git', message],
|
|
144
|
+
['git@', message],
|
|
145
|
+
|
|
146
|
+
[undefined, message],
|
|
147
|
+
['', message]
|
|
117
148
|
];
|
|
118
149
|
|
|
119
150
|
it.each(testCases)(
|
|
120
151
|
'should return undefined or correct message based on the provided Git url: %p',
|
|
121
152
|
(url, expected) => {
|
|
122
|
-
const formRuleResult = formRules.
|
|
153
|
+
const formRuleResult = formRules.urlRepository(url);
|
|
154
|
+
|
|
155
|
+
expect(formRuleResult).toStrictEqual(expected);
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe('ociRegistry', () => {
|
|
161
|
+
const message = JSON.stringify({ message: 'validation.oci.url' });
|
|
162
|
+
const testCases = [
|
|
163
|
+
// Valid
|
|
164
|
+
['oci://registry.example.com', undefined],
|
|
165
|
+
['oci://myregistry.dev:5000', undefined],
|
|
166
|
+
['oci://192.168.1.100', undefined],
|
|
167
|
+
['oci://my.domain.com/my/image:tag', undefined],
|
|
168
|
+
['oci://localhost:5000', undefined],
|
|
169
|
+
['oci://region.objectstorage.example.com/n', undefined],
|
|
170
|
+
|
|
171
|
+
// Invalid
|
|
172
|
+
['http://example.com/oci', message],
|
|
173
|
+
['https://oci.cloud.com', message],
|
|
174
|
+
['ftp://oci.server.net', message],
|
|
175
|
+
['path/to/oci', message],
|
|
176
|
+
['oci://a', message],
|
|
177
|
+
['oci:/missing/slash', message],
|
|
178
|
+
['oci:', message],
|
|
179
|
+
['oci://', message],
|
|
180
|
+
['oci://oci://duplicate/protocol', message],
|
|
181
|
+
['oci ://registry.example.com/foo/bar', message],
|
|
182
|
+
['oci://registry.example. com/foo/bar', message],
|
|
183
|
+
['oci://registry.example.com/ foo/bar', message],
|
|
184
|
+
['oci://resource multiple spaces', message],
|
|
185
|
+
['', message],
|
|
186
|
+
[undefined, message],
|
|
187
|
+
];
|
|
188
|
+
|
|
189
|
+
it.each(testCases)(
|
|
190
|
+
'should return undefined or correct message based on the provided OCI url: %p',
|
|
191
|
+
(url, expected) => {
|
|
192
|
+
const formRuleResult = formRules.ociRegistry(url);
|
|
123
193
|
|
|
124
194
|
expect(formRuleResult).toStrictEqual(expected);
|
|
125
195
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parse } from '@shell/utils/url';
|
|
1
2
|
import { RBAC } from '@shell/config/types';
|
|
2
3
|
import { HCI } from '@shell/config/labels-annotations';
|
|
3
4
|
import isEmpty from 'lodash/isEmpty';
|
|
@@ -62,8 +63,21 @@ export interface ValidationOptions {
|
|
|
62
63
|
key?: string,
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
/**
|
|
67
|
+
* @param t the function name we use for getting a translated string
|
|
68
|
+
* @param key the argument passed to the translation to reference the label
|
|
69
|
+
* @returns { Validator<any> | ValidatorFactory } A dictionary of actual validation functions or factories (require parameter)
|
|
70
|
+
* @description
|
|
71
|
+
* This function returns a set of validators that can be used in the form validation process.
|
|
72
|
+
* @example
|
|
73
|
+
* const validators = formRulesGenerator(t, { key: 'MyLabel' });
|
|
74
|
+
* validators.required(); // '"MyLabel" is required'
|
|
75
|
+
* validators.minLength(5)('123'); // '"MyLabel" must contain more than 5 characters'
|
|
76
|
+
*/
|
|
77
|
+
export default function(
|
|
78
|
+
t: Translation,
|
|
79
|
+
{ key = 'Value' }: ValidationOptions
|
|
80
|
+
): { [key: string]: Validator<any> | ValidatorFactory } {
|
|
67
81
|
// utility validators these validators only get used by other validators
|
|
68
82
|
const startDot: ValidatorFactory = (label: string): Validator => (val: string) => val?.slice(0, 1) === '.' ? t(`validation.dns.${ label }.startDot`, { key }) : undefined;
|
|
69
83
|
|
|
@@ -157,7 +171,86 @@ export default function(t: Translation, { key = 'Value' }: ValidationOptions): {
|
|
|
157
171
|
|
|
158
172
|
const url: Validator = (val: string) => val && !isUrl(val) ? t('validation.setting.serverUrl.url') : undefined;
|
|
159
173
|
|
|
160
|
-
const
|
|
174
|
+
const genericUrl: Validator = (val: string) => val && !isUrl(val) ? t('validation.genericUrl') : undefined;
|
|
175
|
+
|
|
176
|
+
const urlRepository: Validator = (url: string) => {
|
|
177
|
+
const message = t('validation.repository.url');
|
|
178
|
+
|
|
179
|
+
if (!url) {
|
|
180
|
+
return message;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (url.includes(' ')) {
|
|
184
|
+
return message;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const {
|
|
188
|
+
protocol,
|
|
189
|
+
authority,
|
|
190
|
+
host,
|
|
191
|
+
path
|
|
192
|
+
} = parse(url);
|
|
193
|
+
|
|
194
|
+
// Test duplicate protocol
|
|
195
|
+
if (!host || protocol === host) {
|
|
196
|
+
return message;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Test http(s) protocol
|
|
200
|
+
if (protocol && (!/^(http|http(s))/gm.test(protocol) || (!url.startsWith('https://') && !url.startsWith('http://')))) {
|
|
201
|
+
return message;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Test ssh, authority must be valid (SSH user + host)
|
|
205
|
+
if (!protocol && !authority.endsWith(':')) {
|
|
206
|
+
return message;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Encoded space characters (%20) are allowed only in the path
|
|
210
|
+
const hostAndPath = `${ host }${ path.replaceAll('%20', '') }`;
|
|
211
|
+
|
|
212
|
+
// Test host/path
|
|
213
|
+
if (!/^([\w\.@\:\/\-]+)([\d\/\w.-]+?)(.git){0,1}(\/)?$/gm.test(hostAndPath)) {
|
|
214
|
+
return message;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return undefined;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const ociRegistry: Validator = (url: string) => {
|
|
221
|
+
const message = t('validation.oci.url');
|
|
222
|
+
|
|
223
|
+
if (!url) {
|
|
224
|
+
return message;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (url.includes(' ')) {
|
|
228
|
+
return message;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const {
|
|
232
|
+
protocol,
|
|
233
|
+
host,
|
|
234
|
+
path
|
|
235
|
+
} = parse(url);
|
|
236
|
+
|
|
237
|
+
// Test duplicate protocol
|
|
238
|
+
if (!host || protocol === host) {
|
|
239
|
+
return message;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Test oci protocol
|
|
243
|
+
if (!url.startsWith('oci://')) {
|
|
244
|
+
return message;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Test host/path
|
|
248
|
+
if (!/^([\w\.@\:\/\-]+)([\d\/\w.-]+?)(\/)?$/gm.test(`${ host }${ path }`)) {
|
|
249
|
+
return message;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return undefined;
|
|
253
|
+
};
|
|
161
254
|
|
|
162
255
|
const alphanumeric: Validator = (val: string) => val && !/^[a-zA-Z0-9]+$/.test(val) ? t('validation.alphanumeric', { key }) : undefined;
|
|
163
256
|
|
|
@@ -503,7 +596,7 @@ export default function(t: Translation, { key = 'Value' }: ValidationOptions): {
|
|
|
503
596
|
dnsLabelRestricted,
|
|
504
597
|
externalName,
|
|
505
598
|
fileRequired,
|
|
506
|
-
|
|
599
|
+
urlRepository,
|
|
507
600
|
groupsAreValid,
|
|
508
601
|
hostname,
|
|
509
602
|
imageUrl,
|
|
@@ -512,12 +605,14 @@ export default function(t: Translation, { key = 'Value' }: ValidationOptions): {
|
|
|
512
605
|
localhost,
|
|
513
606
|
trailingForwardSlash,
|
|
514
607
|
url,
|
|
608
|
+
genericUrl,
|
|
515
609
|
matching,
|
|
516
610
|
maxLength,
|
|
517
611
|
maxValue,
|
|
518
612
|
minLength,
|
|
519
613
|
minValue,
|
|
520
614
|
noUpperCase,
|
|
615
|
+
ociRegistry,
|
|
521
616
|
portNumber,
|
|
522
617
|
registryUrl,
|
|
523
618
|
required,
|
package/utils/window.js
CHANGED
|
@@ -28,7 +28,7 @@ export class Popup {
|
|
|
28
28
|
this.popup = null;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
open(url, name, opt) {
|
|
31
|
+
open(url, name, opt, doNotPollForClosure) {
|
|
32
32
|
this.onOpen();
|
|
33
33
|
this.popup = open(url, name, opt);
|
|
34
34
|
|
|
@@ -36,11 +36,15 @@ export class Popup {
|
|
|
36
36
|
throw new Error('Please disable your popup blocker for this site');
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
// In some cases, for example, if the origin policy does not allow, we will think the window has closed
|
|
40
|
+
// when it has not - we will see it as closed, because we don't have access
|
|
41
|
+
if (!doNotPollForClosure) {
|
|
42
|
+
const timer = setInterval(() => {
|
|
43
|
+
if (this.popup.closed) {
|
|
44
|
+
clearInterval(timer);
|
|
45
|
+
this.onClose();
|
|
46
|
+
}
|
|
47
|
+
}, 500);
|
|
48
|
+
}
|
|
45
49
|
}
|
|
46
50
|
}
|
package/vue.config.js
CHANGED
|
@@ -157,7 +157,7 @@ const getLoaders = (SHELL_ABS) => [
|
|
|
157
157
|
test: /\.m?[tj]sx?$/,
|
|
158
158
|
// This excludes no modules except for node_modules/@rancher/... so that plugins can properly compile
|
|
159
159
|
// when referencing @rancher/shell
|
|
160
|
-
exclude: /node_modules\/(?!(
|
|
160
|
+
exclude: /node_modules\/(?!(dashboard-shell-shell)\/).*/,
|
|
161
161
|
use: [
|
|
162
162
|
{
|
|
163
163
|
loader: 'cache-loader',
|
|
@@ -332,14 +332,14 @@ const getVirtualModules = (dir, includePkg) => {
|
|
|
332
332
|
reqs += `$plugin.loadAsync('${ i }', '/pkg/${ i }/${ librariesIndex[i] }');`;
|
|
333
333
|
});
|
|
334
334
|
|
|
335
|
-
return new VirtualModulesPlugin({ 'node_modules
|
|
335
|
+
return new VirtualModulesPlugin({ 'node_modules/dashboard-shell-shell/dynamic.js': `export default function ($plugin) { ${ reqs } };` });
|
|
336
336
|
};
|
|
337
337
|
|
|
338
|
-
const getAutoImport = () => new webpack.NormalModuleReplacementPlugin(
|
|
338
|
+
const getAutoImport = () => new webpack.NormalModuleReplacementPlugin(/^dashboard-shell-shell\/auto-import$/, (resource) => {
|
|
339
339
|
const ctx = resource.context.split('/');
|
|
340
340
|
const pkg = ctx[ctx.length - 1];
|
|
341
341
|
|
|
342
|
-
resource.request =
|
|
342
|
+
resource.request = `dashboard-shell-shell/auto-import/${ pkg }`;
|
|
343
343
|
});
|
|
344
344
|
|
|
345
345
|
/**
|
|
@@ -356,7 +356,7 @@ const getVirtualModulesAutoImport = (dir) => {
|
|
|
356
356
|
fs.readdirSync(pkgFolder)
|
|
357
357
|
.filter((name) => !name.startsWith('.')) // Ignore hidden folders
|
|
358
358
|
.forEach((name) => {
|
|
359
|
-
autoImportTypes[`node_modules
|
|
359
|
+
autoImportTypes[`node_modules/dashboard-shell-shell/auto-import/${ name }`] = generateDynamicTypeImport(`@pkg/${ name }`, path.join(dir, `pkg/${ name }`));
|
|
360
360
|
});
|
|
361
361
|
}
|
|
362
362
|
|
package/.DS_Store
DELETED
|
Binary file
|