dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-test.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +16 -10
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/global/_layout.scss +1 -1
- package/assets/styles/themes/_dark.scss +30 -0
- package/assets/styles/themes/_light.scss +80 -2
- package/assets/translations/en-us.yaml +822 -105
- package/assets/translations/zh-hans.yaml +13 -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/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/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 +123 -0
- 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/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 +140 -0
- package/components/Resource/Detail/Metadata/KeyValue.vue +140 -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 +88 -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 +14 -0
- package/components/Resource/Detail/TitleBar/Top.vue +14 -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 +204 -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} +0 -1
- package/components/ResourceDetail/__tests__/index.test.ts +135 -0
- package/components/ResourceDetail/index.vue +75 -575
- package/components/ResourceDetail/legacy.vue +564 -0
- package/components/ResourceList/Masthead.vue +69 -20
- 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 +10 -2
- 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 +0 -1
- 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/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 +72 -54
- 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 +21 -2
- package/components/form/UnitInput.vue +21 -0
- package/components/form/ValueFromResource.vue +31 -19
- 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 +24 -38
- package/components/nav/NamespaceFilter.vue +141 -84
- 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 +11 -15
- 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 +9 -1
- 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 +19 -48
- 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/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 +132 -49
- 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/Banner/Banner.test.ts +51 -3
- package/rancher-components/Banner/Banner.vue +37 -6
- 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/RcDropdownMenu.vue +7 -8
- 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/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 +1 -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 +34 -17
- 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 +971 -745
- 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 +0 -5
- 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/.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
package/utils/selector.js
CHANGED
|
@@ -11,7 +11,14 @@ const OP_MAP = {
|
|
|
11
11
|
'>': 'Gt',
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Convert a string to a matchExpression object
|
|
16
|
+
*
|
|
17
|
+
* *string* is from https://github.com/kubernetes/apimachinery/blob/master/pkg/labels/selector.go#L1010.
|
|
18
|
+
* However... it seems to contain more operators than just `=` which the labels.Selector `String` does not use
|
|
19
|
+
*
|
|
20
|
+
* matchExpression is an array of 'key' 'operator' 'values'
|
|
21
|
+
*/
|
|
15
22
|
export function parse(labelSelector) {
|
|
16
23
|
// matchLabels:
|
|
17
24
|
// comma-separated list, all rules ANDed together
|
|
@@ -32,6 +39,10 @@ export function parse(labelSelector) {
|
|
|
32
39
|
// operator: In, NotIn, Exists, or DoesNotExist
|
|
33
40
|
// values: [array, of, values, even, if, only, one]
|
|
34
41
|
|
|
42
|
+
if (!labelSelector) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
|
|
35
46
|
labelSelector = labelSelector.replace(/\+/g, ' ');
|
|
36
47
|
|
|
37
48
|
if ( parseCache[labelSelector] ) {
|
|
@@ -101,13 +112,17 @@ export function parse(labelSelector) {
|
|
|
101
112
|
return out;
|
|
102
113
|
}
|
|
103
114
|
|
|
104
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Convert a Selector object to matchExpressions
|
|
117
|
+
*/
|
|
105
118
|
export function convertSelectorObj(obj) {
|
|
106
119
|
return convert(obj.matchLabels || {}, obj.matchExpressions || []);
|
|
107
120
|
}
|
|
108
121
|
|
|
109
|
-
|
|
110
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Convert matchLabels to matchExpressions
|
|
124
|
+
* Optionally combining with an existing set of matchExpressions
|
|
125
|
+
*/
|
|
111
126
|
export function convert(matchLabelsObj, matchExpressions) {
|
|
112
127
|
const keys = Object.keys(matchLabelsObj || {});
|
|
113
128
|
const out = matchExpressions || [];
|
|
@@ -130,8 +145,10 @@ export function convert(matchLabelsObj, matchExpressions) {
|
|
|
130
145
|
return out;
|
|
131
146
|
}
|
|
132
147
|
|
|
133
|
-
|
|
134
|
-
|
|
148
|
+
/**
|
|
149
|
+
* Convert matchExpressions to matchLabels when possible,
|
|
150
|
+
* returning the simplest combination of them.
|
|
151
|
+
*/
|
|
135
152
|
export function simplify(matchExpressionsInput) {
|
|
136
153
|
const matchLabels = {};
|
|
137
154
|
const matchExpressions = [];
|
|
@@ -163,6 +180,12 @@ export function simplify(matchExpressionsInput) {
|
|
|
163
180
|
return { matchLabels, matchExpressions };
|
|
164
181
|
}
|
|
165
182
|
|
|
183
|
+
/**
|
|
184
|
+
*
|
|
185
|
+
* For a fn that accepts a kube labelSelector object see shell/utils/selector-typed.ts `matches`
|
|
186
|
+
*
|
|
187
|
+
* @param {*} selector Is NOT a labelSelector object
|
|
188
|
+
*/
|
|
166
189
|
export function matches(obj, selector, labelKey = 'metadata.labels') {
|
|
167
190
|
let rules = [];
|
|
168
191
|
|
package/utils/settings.ts
CHANGED
|
@@ -59,7 +59,10 @@ export const fetchInitialSettings = async(store: Store<any>): Promise<any> => {
|
|
|
59
59
|
// We're authed, we will always get the full list
|
|
60
60
|
return await store.dispatch('management/findAll', {
|
|
61
61
|
type: MANAGEMENT.SETTING,
|
|
62
|
-
opt: {
|
|
62
|
+
opt: {
|
|
63
|
+
url: `/v1/${ pluralize(MANAGEMENT.SETTING) }`,
|
|
64
|
+
watch: false, // Watch requires FF and Settings, see `loadManagement` to see how this is handled
|
|
65
|
+
}
|
|
63
66
|
} );
|
|
64
67
|
}
|
|
65
68
|
|
package/utils/string.js
CHANGED
|
@@ -361,3 +361,27 @@ export function isBase64(value) {
|
|
|
361
361
|
export function generateRandomAlphaString(length) {
|
|
362
362
|
return Array.from({ length }, () => String.fromCharCode(97 + Math.random() * 26 | 0)).join('');
|
|
363
363
|
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Generate a key-value nested object from a list of paths that represents a directory tree.
|
|
367
|
+
*
|
|
368
|
+
* Each key is a subpath
|
|
369
|
+
* Each value contains the children of the subpath
|
|
370
|
+
*/
|
|
371
|
+
export function pathArrayToTree(paths) {
|
|
372
|
+
const result = [];
|
|
373
|
+
const level = { result };
|
|
374
|
+
|
|
375
|
+
paths.forEach((path) => {
|
|
376
|
+
path?.split('/').reduce((r, name) => {
|
|
377
|
+
if (!r[name]) {
|
|
378
|
+
r[name] = { result: [] };
|
|
379
|
+
r.result.push({ name, children: r[name].result });
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return r[name];
|
|
383
|
+
}, level);
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
return result;
|
|
387
|
+
}
|
package/utils/style.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type StateColor = 'success' | 'warning' | 'error' | 'info' | 'disabled';
|
|
2
|
+
export const ALL_STATE_COLORS: StateColor[] = ['success', 'warning', 'error', 'info', 'disabled'];
|
|
3
|
+
|
|
4
|
+
export function stateColorCssVar(color: StateColor) {
|
|
5
|
+
return `var(--${ color })`;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function toBgColor(color?: StateColor) {
|
|
9
|
+
const withDefaultColor = color || 'info';
|
|
10
|
+
|
|
11
|
+
return `bg-${ withDefaultColor }`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Checks if 'a' is considered a higher alert than 'b'
|
|
16
|
+
* @param a target
|
|
17
|
+
* @param b comparison
|
|
18
|
+
* @returns true if 'a' is a higher alert than 'b' and false otherwise.
|
|
19
|
+
*/
|
|
20
|
+
export function isHigherAlert(a: StateColor, b: StateColor) {
|
|
21
|
+
const order: StateColor[] = ['info', 'success', 'warning', 'error'];
|
|
22
|
+
|
|
23
|
+
const aIndex = order.indexOf(a);
|
|
24
|
+
const bIndex = order.indexOf(b);
|
|
25
|
+
|
|
26
|
+
return aIndex > bIndex;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function getHighestAlertColor(colors: StateColor[]) {
|
|
30
|
+
let highestAlert: StateColor = 'info';
|
|
31
|
+
|
|
32
|
+
for (const color of colors) {
|
|
33
|
+
if (isHigherAlert(color, highestAlert)) {
|
|
34
|
+
highestAlert = color;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return highestAlert;
|
|
39
|
+
}
|
|
@@ -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/.DS_Store
DELETED
|
Binary file
|