diff --git a/src/common/k8s-api/endpoints/crd.api.ts b/src/common/k8s-api/endpoints/crd.api.ts index 2f330feaf9..0d6ce0f1e5 100644 --- a/src/common/k8s-api/endpoints/crd.api.ts +++ b/src/common/k8s-api/endpoints/crd.api.ts @@ -5,7 +5,7 @@ import { KubeCreationError, KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -import { crdResourcesURL } from "../../routes"; +import { customResourceDefinitionsURL } from "../../routes"; import { isClusterPageContext } from "../../utils/cluster-id-url-parsing"; import type { KubeJsonApiData } from "../kube-json-api"; @@ -99,7 +99,7 @@ export class CustomResourceDefinition extends KubeObject { } getResourceUrl() { - return crdResourcesURL({ + return customResourceDefinitionsURL({ params: { group: this.getGroup(), name: this.getPluralName(), diff --git a/src/common/k8s-api/endpoints/helm-releases.api.ts b/src/common/k8s-api/endpoints/helm-releases.api.ts index 3f46e343cd..8db15b448e 100644 --- a/src/common/k8s-api/endpoints/helm-releases.api.ts +++ b/src/common/k8s-api/endpoints/helm-releases.api.ts @@ -11,7 +11,7 @@ import { helmChartStore } from "../../../renderer/components/+helm-charts/helm-c import type { ItemObject } from "../../item.store"; import { KubeObject } from "../kube-object"; import type { JsonApiData } from "../json-api"; -import { buildURLPositional } from "../../utils/buildUrl"; +import { buildURL } from "../../utils/buildUrl"; import type { KubeJsonApiData } from "../kube-json-api"; interface IReleasePayload { @@ -77,16 +77,16 @@ interface EndpointQuery { all?: boolean; } -const endpoint = buildURLPositional("/v2/releases/:namespace?/:name?/:route?"); +const endpoint = buildURL("/v2/releases/:namespace?/:name?/:route?"); export async function listReleases(namespace?: string): Promise { - const releases = await apiBase.get(endpoint({ namespace })); + const releases = await apiBase.get(endpoint({ params: { namespace }})); return releases.map(toHelmRelease); } export async function getRelease(name: string, namespace: string): Promise { - const path = endpoint({ name, namespace }); + const path = endpoint({ params: { name, namespace }}); const { resources: rawResources, ...details } = await apiBase.get(path); const resources = rawResources.map(KubeObject.create); @@ -115,7 +115,7 @@ export async function updateRelease(name: string, namespace: string, payload: IR const chart = `${repo}/${rawChart}`; const values = yaml.load(rawValues); - return apiBase.put(endpoint({ name, namespace }), { + return apiBase.put(endpoint({ params: { name, namespace }}), { data: { chart, values, @@ -125,28 +125,28 @@ export async function updateRelease(name: string, namespace: string, payload: IR } export async function deleteRelease(name: string, namespace: string): Promise { - const path = endpoint({ name, namespace }); + const path = endpoint({ params: { name, namespace }}); return apiBase.del(path); } export async function getReleaseValues(name: string, namespace: string, all?: boolean): Promise { const route = "values"; - const path = endpoint({ name, namespace, route }, { all }); + const path = endpoint({ params: { name, namespace, route }, query: { all }}); return apiBase.get(path); } export async function getReleaseHistory(name: string, namespace: string): Promise { const route = "history"; - const path = endpoint({ name, namespace, route }); + const path = endpoint({ params: { name, namespace, route }}); return apiBase.get(path); } export async function rollbackRelease(name: string, namespace: string, revision: number): Promise { const route = "rollback"; - const path = endpoint({ name, namespace, route }); + const path = endpoint({ params: { name, namespace, route }}); const data = { revision }; return apiBase.put(path, { data }); diff --git a/src/common/routes/add-cluster.ts b/src/common/routes/add-cluster.ts index 6642bc3313..5ae4fdd5cc 100644 --- a/src/common/routes/add-cluster.ts +++ b/src/common/routes/add-cluster.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const addClusterRoute: RouteProps = { path: "/add-cluster", diff --git a/src/common/routes/catalog.ts b/src/common/routes/catalog.ts index 7a74b5bce2..187598aaf9 100644 --- a/src/common/routes/catalog.ts +++ b/src/common/routes/catalog.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export interface CatalogViewRouteParam { group?: string; diff --git a/src/common/routes/cluster-view.ts b/src/common/routes/cluster-view.ts index 8ae6e9445c..5416084dfc 100644 --- a/src/common/routes/cluster-view.ts +++ b/src/common/routes/cluster-view.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export interface ClusterViewRouteParams { clusterId: string; diff --git a/src/common/routes/cluster.ts b/src/common/routes/cluster.ts index 201517fced..cf05ce3b93 100644 --- a/src/common/routes/cluster.ts +++ b/src/common/routes/cluster.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const clusterRoute: RouteProps = { path: "/overview", diff --git a/src/common/routes/config-maps.ts b/src/common/routes/config-maps.ts index ba27fd96d8..37f7717b2b 100644 --- a/src/common/routes/config-maps.ts +++ b/src/common/routes/config-maps.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const configMapsRoute: RouteProps = { path: "/configmaps", diff --git a/src/common/routes/config.ts b/src/common/routes/config.ts index fd8e055927..440c458606 100644 --- a/src/common/routes/config.ts +++ b/src/common/routes/config.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; +import type { RouteProps as RouterProps } from "react-router"; import type { URLParams } from "../utils/buildUrl"; import { configMapsRoute, configMapsURL } from "./config-maps"; import { hpaRoute } from "./hpa"; @@ -12,15 +12,15 @@ import { pdbRoute } from "./pod-disruption-budgets"; import { resourceQuotaRoute } from "./resource-quotas"; import { secretsRoute } from "./secrets"; -export const configRoute: RouteProps = { +export const configRoute: RouterProps = { path: [ - configMapsRoute, - secretsRoute, - resourceQuotaRoute, - limitRangesRoute, - hpaRoute, - pdbRoute, - ].map(route => route.path.toString()), + configMapsRoute.path, + secretsRoute.path, + resourceQuotaRoute.path, + limitRangesRoute.path, + hpaRoute.path, + pdbRoute.path, + ], }; export const configURL = (params?: URLParams) => configMapsURL(params); diff --git a/src/common/routes/crd.ts b/src/common/routes/crd.ts index 18a3b7c81d..7bfdce4146 100644 --- a/src/common/routes/crd.ts +++ b/src/common/routes/crd.ts @@ -3,29 +3,17 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; -export const crdRoute: RouteProps = { - path: "/crd", +export const customResourcesRoute = "/crd"; + +export const customResourceDefinitionsRoute: RouteProps = { + path: `${customResourcesRoute}/definitions/:group?/:name?`, }; -export const crdDefinitionsRoute: RouteProps = { - path: `${crdRoute.path}/definitions`, -}; - -export const crdResourcesRoute: RouteProps = { - path: `${crdRoute.path}/:group/:name`, -}; - -export interface CRDListQuery { - groups?: string; +export interface CustomResourceDefinitionsRouteParams { + group?: string; + name?: string; } -export interface CRDRouteParams { - group: string; - name: string; -} - -export const crdURL = buildURL<{}, CRDListQuery>(crdDefinitionsRoute.path); -export const crdResourcesURL = buildURL(crdResourcesRoute.path); +export const customResourceDefinitionsURL = buildURL(customResourceDefinitionsRoute.path); diff --git a/src/common/routes/endpoints.ts b/src/common/routes/endpoints.ts index 657f6d8b45..c76943a8f9 100644 --- a/src/common/routes/endpoints.ts +++ b/src/common/routes/endpoints.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const endpointRoute: RouteProps = { path: "/endpoints", diff --git a/src/common/routes/entity-settings.ts b/src/common/routes/entity-settings.ts index 202ae8e9a6..7597acb1ba 100644 --- a/src/common/routes/entity-settings.ts +++ b/src/common/routes/entity-settings.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export interface EntitySettingsRouteParams { entityId: string; diff --git a/src/common/routes/events.ts b/src/common/routes/events.ts index 70b7a3c387..4a59950900 100644 --- a/src/common/routes/events.ts +++ b/src/common/routes/events.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const eventRoute: RouteProps = { path: "/events", diff --git a/src/common/routes/extensions.ts b/src/common/routes/extensions.ts index e9dba5421c..12669d66c2 100644 --- a/src/common/routes/extensions.ts +++ b/src/common/routes/extensions.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const extensionsRoute: RouteProps = { path: "/extensions", diff --git a/src/common/routes/helm-charts.ts b/src/common/routes/helm-charts.ts index 3777ac0ebd..34ea1e08a6 100644 --- a/src/common/routes/helm-charts.ts +++ b/src/common/routes/helm-charts.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; import { helmRoute } from "./helm"; export const helmChartsRoute: RouteProps = { diff --git a/src/common/routes/helm.ts b/src/common/routes/helm.ts index bb5d5b6914..ca141c3fb3 100644 --- a/src/common/routes/helm.ts +++ b/src/common/routes/helm.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const helmRoute: RouteProps = { path: "/helm", diff --git a/src/common/routes/hpa.ts b/src/common/routes/hpa.ts index 2904dc933d..1724ab4ee5 100644 --- a/src/common/routes/hpa.ts +++ b/src/common/routes/hpa.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const hpaRoute: RouteProps = { path: "/hpa", diff --git a/src/common/routes/ingresses.ts b/src/common/routes/ingresses.ts index fb6096aeba..278510dd20 100644 --- a/src/common/routes/ingresses.ts +++ b/src/common/routes/ingresses.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const ingressRoute: RouteProps = { path: "/ingresses", diff --git a/src/common/routes/limit-ranges.ts b/src/common/routes/limit-ranges.ts index fbee123f09..10ede4adc8 100644 --- a/src/common/routes/limit-ranges.ts +++ b/src/common/routes/limit-ranges.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const limitRangesRoute: RouteProps = { path: "/limitranges", diff --git a/src/common/routes/namespaces.ts b/src/common/routes/namespaces.ts index 408abefeb4..c6995d8492 100644 --- a/src/common/routes/namespaces.ts +++ b/src/common/routes/namespaces.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const namespacesRoute: RouteProps = { path: "/namespaces", diff --git a/src/common/routes/network-policies.ts b/src/common/routes/network-policies.ts index 83a1fe0ed8..000aa3724a 100644 --- a/src/common/routes/network-policies.ts +++ b/src/common/routes/network-policies.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const networkPoliciesRoute: RouteProps = { path: "/network-policies", diff --git a/src/common/routes/network.ts b/src/common/routes/network.ts index 7a76e4f922..804958132e 100644 --- a/src/common/routes/network.ts +++ b/src/common/routes/network.ts @@ -4,7 +4,6 @@ */ import type { RouteProps } from "react-router"; -import type { URLParams } from "../utils/buildUrl"; import { endpointRoute } from "./endpoints"; import { ingressRoute } from "./ingresses"; import { networkPoliciesRoute } from "./network-policies"; @@ -21,4 +20,4 @@ export const networkRoute: RouteProps = { ].map(route => route.path.toString()), }; -export const networkURL = (params?: URLParams) => servicesURL(params); +export const networkURL = servicesURL; diff --git a/src/common/routes/nodes.ts b/src/common/routes/nodes.ts index 3a5fcf0f2f..09fd6dcf85 100644 --- a/src/common/routes/nodes.ts +++ b/src/common/routes/nodes.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const nodesRoute: RouteProps = { path: "/nodes", diff --git a/src/common/routes/pod-disruption-budgets.ts b/src/common/routes/pod-disruption-budgets.ts index d97aa02236..047d05a1da 100644 --- a/src/common/routes/pod-disruption-budgets.ts +++ b/src/common/routes/pod-disruption-budgets.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const pdbRoute: RouteProps = { path: "/poddisruptionbudgets", diff --git a/src/common/routes/port-forwards.ts b/src/common/routes/port-forwards.ts index 9fe74e03d5..2789f1903a 100644 --- a/src/common/routes/port-forwards.ts +++ b/src/common/routes/port-forwards.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const portForwardsRoute: RouteProps = { path: "/port-forwards/:forwardport?", diff --git a/src/common/routes/preferences.ts b/src/common/routes/preferences.ts index 3afd81e614..2d83ddb920 100644 --- a/src/common/routes/preferences.ts +++ b/src/common/routes/preferences.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const preferencesRoute: RouteProps = { path: "/preferences", diff --git a/src/common/routes/releases.ts b/src/common/routes/releases.ts index 191d186570..1f22d08ad3 100644 --- a/src/common/routes/releases.ts +++ b/src/common/routes/releases.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; import { helmRoute } from "./helm"; export const releaseRoute: RouteProps = { diff --git a/src/common/routes/resource-quotas.ts b/src/common/routes/resource-quotas.ts index afe6f072e1..5f0efe648b 100644 --- a/src/common/routes/resource-quotas.ts +++ b/src/common/routes/resource-quotas.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const resourceQuotaRoute: RouteProps = { path: "/resourcequotas", diff --git a/src/common/routes/secrets.ts b/src/common/routes/secrets.ts index 4a467630bd..4fdb3ef02f 100644 --- a/src/common/routes/secrets.ts +++ b/src/common/routes/secrets.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const secretsRoute: RouteProps = { path: "/secrets", diff --git a/src/common/routes/services.ts b/src/common/routes/services.ts index 595ea1b4c7..0e00930e41 100644 --- a/src/common/routes/services.ts +++ b/src/common/routes/services.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const servicesRoute: RouteProps = { path: "/services", diff --git a/src/common/routes/storage-classes.ts b/src/common/routes/storage-classes.ts index 235a1c6df4..3080c1d335 100644 --- a/src/common/routes/storage-classes.ts +++ b/src/common/routes/storage-classes.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const storageClassesRoute: RouteProps = { path: "/storage-classes", diff --git a/src/common/routes/storage.ts b/src/common/routes/storage.ts index baa5750113..11db320345 100644 --- a/src/common/routes/storage.ts +++ b/src/common/routes/storage.ts @@ -4,7 +4,6 @@ */ import type { RouteProps } from "react-router"; -import type { URLParams } from "../utils/buildUrl"; import { storageClassesRoute } from "./storage-classes"; import { volumeClaimsRoute, volumeClaimsURL } from "./volume-claims"; import { volumesRoute } from "./volumes"; @@ -17,4 +16,4 @@ export const storageRoute: RouteProps = { ].map(route => route.path.toString()), }; -export const storageURL = (params?: URLParams) => volumeClaimsURL(params); +export const storageURL = volumeClaimsURL; diff --git a/src/common/routes/user-management.ts b/src/common/routes/user-management.ts index 47d781568d..8abacae48f 100644 --- a/src/common/routes/user-management.ts +++ b/src/common/routes/user-management.ts @@ -3,8 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL, URLParams } from "../utils/buildUrl"; +import type { RouteProps as RouterProps } from "react-router"; +import { buildURL, RouteProps, URLParams } from "../utils/buildUrl"; // Routes export const serviceAccountsRoute: RouteProps = { @@ -26,15 +26,15 @@ export const clusterRoleBindingsRoute: RouteProps = { path: "/cluster-role-bindings", }; -export const usersManagementRoute: RouteProps = { +export const usersManagementRoute: RouterProps = { path: [ - serviceAccountsRoute, - podSecurityPoliciesRoute, - roleBindingsRoute, - clusterRoleBindingsRoute, - rolesRoute, - clusterRolesRoute, - ].map(route => route.path.toString()), + serviceAccountsRoute.path, + podSecurityPoliciesRoute.path, + roleBindingsRoute.path, + clusterRoleBindingsRoute.path, + rolesRoute.path, + clusterRolesRoute.path, + ], }; // Route params diff --git a/src/common/routes/volume-claims.ts b/src/common/routes/volume-claims.ts index d775395ef9..6070fdd746 100644 --- a/src/common/routes/volume-claims.ts +++ b/src/common/routes/volume-claims.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const volumeClaimsRoute: RouteProps = { path: "/persistent-volume-claims", diff --git a/src/common/routes/volumes.ts b/src/common/routes/volumes.ts index 89508904b0..57d32ee54a 100644 --- a/src/common/routes/volumes.ts +++ b/src/common/routes/volumes.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const volumesRoute: RouteProps = { path: "/persistent-volumes", diff --git a/src/common/routes/welcome.ts b/src/common/routes/welcome.ts index 95465738a2..2463b5dddd 100644 --- a/src/common/routes/welcome.ts +++ b/src/common/routes/welcome.ts @@ -3,8 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL } from "../utils/buildUrl"; +import { buildURL, RouteProps } from "../utils/buildUrl"; export const welcomeRoute: RouteProps = { path: "/welcome", diff --git a/src/common/routes/workloads.ts b/src/common/routes/workloads.ts index 6b053fc1bf..87820b766d 100644 --- a/src/common/routes/workloads.ts +++ b/src/common/routes/workloads.ts @@ -3,8 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { RouteProps } from "react-router"; -import { buildURL, URLParams } from "../utils/buildUrl"; +import type { RouteProps as RouterProps } from "react-router"; +import { buildURL, RouteProps, URLParams } from "../utils/buildUrl"; import type { KubeResource } from "../rbac"; // Routes @@ -33,17 +33,17 @@ export const cronJobsRoute: RouteProps = { path: "/cronjobs", }; -export const workloadsRoute: RouteProps = { +export const workloadsRoute: RouterProps = { path: [ - overviewRoute, - podsRoute, - deploymentsRoute, - daemonSetsRoute, - statefulSetsRoute, - replicaSetsRoute, - jobsRoute, - cronJobsRoute, - ].map(route => route.path.toString()), + overviewRoute.path, + podsRoute.path, + deploymentsRoute.path, + daemonSetsRoute.path, + statefulSetsRoute.path, + replicaSetsRoute.path, + jobsRoute.path, + cronJobsRoute.path, + ], }; // Route params diff --git a/src/common/utils/buildUrl.ts b/src/common/utils/buildUrl.ts index 8f7e994427..0e6a05ceb5 100644 --- a/src/common/utils/buildUrl.ts +++ b/src/common/utils/buildUrl.ts @@ -4,32 +4,37 @@ */ import { compile } from "path-to-regexp"; +import type { RouteProps as RouterProps } from "react-router"; +import { format } from "url"; -export interface URLParams

{ +export interface RouteProps extends RouterProps { + path?: string; +} + +type MaybeIfRecord = Type extends object + ? { [field in FieldName]?: Type } + : {}; + +export type URLParams

= { + fragment?: string; +} & MaybeIfRecord<"params", P> & MaybeIfRecord<"query", Q>; + +interface InternalURLParams { + fragment?: string; params?: P; query?: Q; - fragment?: string; } -export function buildURL

(path: string | any) { - const pathBuilder = compile(String(path)); +export function buildURL

(path: string): (urlParams?: URLParams) => string { + const pathBuilder = compile(path); - return function ({ params, query, fragment }: URLParams = {}): string { - const queryParams = query ? new URLSearchParams(Object.entries(query)).toString() : ""; - const parts = [ - pathBuilder(params), - queryParams && `?${queryParams}`, - fragment && `#${fragment}`, - ]; + return (urlParams) => { + const { params = {}, query = {}, fragment } = urlParams as InternalURLParams ?? {}; - return parts.filter(Boolean).join(""); - }; -} - -export function buildURLPositional

(path: string | any) { - const builder = buildURL(path); - - return function (params?: P, query?: Q, fragment?: string): string { - return builder({ params, query, fragment }); + return format({ + pathname: pathBuilder(params), + query: new URLSearchParams(query).toString(), + search: fragment, + }); }; } diff --git a/src/renderer/components/+custom-resources/crd-list.tsx b/src/renderer/components/+custom-resources/crd-list.tsx index 1806b99926..a14b472d2f 100644 --- a/src/renderer/components/+custom-resources/crd-list.tsx +++ b/src/renderer/components/+custom-resources/crd-list.tsx @@ -32,7 +32,7 @@ enum columnId { } @observer -export class CrdList extends React.Component { +export class CustomResourceDefinitions extends React.Component { constructor(props: {}) { super(props); makeObservable(this); diff --git a/src/renderer/components/+custom-resources/crd-resources.tsx b/src/renderer/components/+custom-resources/crd-resources.tsx index 37f537ffaf..fbe1380e6a 100644 --- a/src/renderer/components/+custom-resources/crd-resources.tsx +++ b/src/renderer/components/+custom-resources/crd-resources.tsx @@ -16,9 +16,9 @@ import { crdStore } from "./crd.store"; import type { TableSortCallbacks } from "../table"; import { apiManager } from "../../../common/k8s-api/api-manager"; import { parseJsonPath } from "../../utils/jsonPath"; -import type { CRDRouteParams } from "../../../common/routes"; +import type { CustomResourceDefinitionsRouteParams } from "../../../common/routes"; -interface Props extends RouteComponentProps { +interface Props extends RouteComponentProps { } enum columnId { @@ -28,7 +28,7 @@ enum columnId { } @observer -export class CrdResources extends React.Component { +export class CustomResourceDefinitionObjectList extends React.Component { constructor(props: Props) { super(props); makeObservable(this); @@ -93,16 +93,12 @@ export class CrdResources extends React.Component { renderTableHeader={[ { title: "Name", className: "name", sortBy: columnId.name, id: columnId.name }, isNamespaced && { title: "Namespace", className: "namespace", sortBy: columnId.namespace, id: columnId.namespace }, - ...extraColumns.map(column => { - const { name } = column; - - return { - title: name, - className: name.toLowerCase(), - sortBy: name, - id: name, - }; - }), + ...extraColumns.map(({ name }) => ({ + title: name, + className: name.toLowerCase(), + sortBy: name, + id: name, + })), { title: "Age", className: "age", sortBy: columnId.age, id: columnId.age }, ]} renderTableContents={crdInstance => [ diff --git a/src/renderer/components/+custom-resources/route-tabs.injectable.ts b/src/renderer/components/+custom-resources/route-tabs.injectable.tsx similarity index 50% rename from src/renderer/components/+custom-resources/route-tabs.injectable.ts rename to src/renderer/components/+custom-resources/route-tabs.injectable.tsx index 9030077388..8d34a1bb7a 100644 --- a/src/renderer/components/+custom-resources/route-tabs.injectable.ts +++ b/src/renderer/components/+custom-resources/route-tabs.injectable.tsx @@ -3,55 +3,69 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import { computed, IComputedValue } from "mobx"; +import { comparer, computed, IComputedValue } from "mobx"; +import React from "react"; +import type { RouteComponentProps } from "react-router"; +import type { RequireExactlyOne } from "type-fest"; import type { CustomResourceDefinition } from "../../../common/k8s-api/endpoints"; -import { crdURL, crdDefinitionsRoute } from "../../../common/routes"; +import { customResourceDefinitionsURL, customResourceDefinitionsRoute, CustomResourceDefinitionsRouteParams } from "../../../common/routes"; import type { TabLayoutRoute } from "../layout/tab-layout"; -import { CrdList } from "./crd-list"; -import { CrdResources } from "./crd-resources"; +import { CustomResourceDefinitions } from "./crd-list"; +import { CustomResourceDefinitionObjectList } from "./crd-resources"; import groupedCustomResourceDefinitionsInjectable from "./grouped-custom-resources.injectable"; -export interface CustomResourceTabLayoutRoute extends TabLayoutRoute { +export interface CustomResourceTabLayoutRoute extends Omit { id: string; + component: React.ComponentType>; } -export interface CustomResourceGroupTabLayoutRoute extends CustomResourceTabLayoutRoute { - subRoutes?: CustomResourceTabLayoutRoute[]; -} +export type CustomResourceGroupTabLayoutRoute = Omit & { + id: string; +} & RequireExactlyOne<{ + subRoutes: CustomResourceTabLayoutRoute[]; + component: React.ComponentType<{}>; +}>; interface Dependencies { customResourcesDefinitions: IComputedValue>; } -function getRouteTabs({ customResourcesDefinitions }: Dependencies) { +function getRouteTabs({ customResourcesDefinitions }: Dependencies): IComputedValue { return computed(() => { + const definitionsUrl = customResourceDefinitionsURL(); + const tabs: CustomResourceGroupTabLayoutRoute[] = [ { id: "definitions", title: "Definitions", - component: CrdList, - url: crdURL(), - routePath: String(crdDefinitionsRoute.path), + component: () => , + url: definitionsUrl, + routePath: definitionsUrl, exact: true, }, ]; for (const [group, definitions] of customResourcesDefinitions.get()) { + const groupUrl = customResourceDefinitionsURL({ params: { group }}); + tabs.push({ id: `crd-group:${group}`, title: group, - routePath: crdURL({ query: { groups: group }}), - component: CrdResources, + url: groupUrl, + routePath: groupUrl, subRoutes: definitions.map(crd => ({ id: `crd-resource:${crd.getResourceApiBase()}`, title: crd.getResourceKind(), - routePath: crd.getResourceUrl(), - component: CrdResources, + url: crd.getResourceUrl(), + routePath: customResourceDefinitionsRoute.path, + component: (props) => , })), }); } return tabs; + }, { + equals: comparer.shallow, }); } diff --git a/src/renderer/components/+custom-resources/route.tsx b/src/renderer/components/+custom-resources/route.tsx index a8f3da4388..cd07d72161 100644 --- a/src/renderer/components/+custom-resources/route.tsx +++ b/src/renderer/components/+custom-resources/route.tsx @@ -7,7 +7,7 @@ import React from "react"; import { observer } from "mobx-react"; import { Redirect, Route, Switch } from "react-router"; import { TabLayout } from "../layout/tab-layout"; -import { crdURL } from "../../../common/routes"; +import { customResourceDefinitionsURL } from "../../../common/routes"; import type { IComputedValue } from "mobx"; import type { CustomResourceGroupTabLayoutRoute } from "./route-tabs.injectable"; import { withInjectables } from "@ogre-tools/injectable-react"; @@ -21,16 +21,26 @@ const NonInjectedCustomResourcesRoute = observer(({ routes }: Dependencies) => ( { - routes.get().map(({ id, component, routePath, exact }) => ( - - )) + routes.get() + .flatMap(({ id, component, routePath, exact, subRoutes }) => ( + subRoutes?.map(({ id, component, routePath, exact }) => ( + + )) ?? ( + + ) + )) } - + )); diff --git a/src/renderer/components/+custom-resources/sidebar-item.tsx b/src/renderer/components/+custom-resources/sidebar-item.tsx index 40fb76b34a..3434d07e80 100644 --- a/src/renderer/components/+custom-resources/sidebar-item.tsx +++ b/src/renderer/components/+custom-resources/sidebar-item.tsx @@ -9,7 +9,7 @@ import { observer } from "mobx-react"; import customResourcesRouteTabsInjectable, { type CustomResourceGroupTabLayoutRoute } from "./route-tabs.injectable"; import type { IsAllowedResource } from "../../../common/utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../common/utils/is-allowed-resource.injectable"; -import { crdURL, crdRoute } from "../../../common/routes"; +import { customResourceDefinitionsURL, customResourcesRoute } from "../../../common/routes"; import { isActiveRoute } from "../../navigation"; import { Icon } from "../icon"; import { SidebarItem } from "../layout/sidebar-item"; @@ -35,8 +35,8 @@ const NonInjectedCustomResourcesSidebarItem = observer(({ routes, isAllowedResou } > @@ -45,13 +45,13 @@ const NonInjectedCustomResourcesSidebarItem = observer(({ routes, isAllowedResou key={route.id} id={route.id} text={route.title} - url={route.routePath} + url={route.url} > {route.subRoutes?.map((subRoute) => ( ))} diff --git a/src/renderer/components/command-palette/registered-commands/internal-commands.injectable.tsx b/src/renderer/components/command-palette/registered-commands/internal-commands.injectable.tsx index 76e8ed7743..6511858376 100644 --- a/src/renderer/components/command-palette/registered-commands/internal-commands.injectable.tsx +++ b/src/renderer/components/command-palette/registered-commands/internal-commands.injectable.tsx @@ -154,7 +154,7 @@ function getInternalCommands({ openCommandDialog, getEntitySettingItems, createT id: "cluster.viewCustomResourceDefinitions", title: "Cluster: View Custom Resource Definitions", isActive: isKubernetesClusterActive, - action: ({ navigate }) => navigate(routes.crdURL()), + action: ({ navigate }) => navigate(routes.customResourceDefinitionsURL()), }, { id: "entity.viewSettings", diff --git a/src/renderer/components/layout/tab-layout.tsx b/src/renderer/components/layout/tab-layout.tsx index 185422636a..54f9bb14e2 100644 --- a/src/renderer/components/layout/tab-layout.tsx +++ b/src/renderer/components/layout/tab-layout.tsx @@ -23,7 +23,7 @@ export interface TabLayoutProps { export interface TabLayoutRoute { routePath: string; title: React.ReactNode; - component: React.ComponentType; + component: React.ComponentType<{}>; url?: string; // page-url, if not provided `routePath` is used (doesn't work when path has some :placeholder(s)) exact?: boolean; // route-path matching rule default?: boolean; // initial tab to open with provided `url, by default tabs[0] is used diff --git a/src/renderer/frames/cluster-frame/cluster-frame.tsx b/src/renderer/frames/cluster-frame/cluster-frame.tsx index 9392b9f4c8..3f5cf112c3 100755 --- a/src/renderer/frames/cluster-frame/cluster-frame.tsx +++ b/src/renderer/frames/cluster-frame/cluster-frame.tsx @@ -155,7 +155,7 @@ class NonInjectedClusterFrame extends React.Component { - + {this.renderExtensionTabLayoutRoutes()}