forms prefills and overrides via id

This commit is contained in:
typescreep
2025-07-03 18:54:22 +03:00
parent 0832c68efe
commit 2b2cadcf4c
20 changed files with 93 additions and 39 deletions

View File

@@ -1,16 +1,8 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import React, { FC, useState, useEffect } from 'react'
import { useParams } from 'react-router-dom'
import {
BlackholeFormDataProvider,
useBuiltinResources,
useCrdResources,
TJSON,
TFormsPrefillsData,
} from '@prorobotech/openapi-k8s-toolkit'
import { BlackholeFormDataProvider, TJSON } from '@prorobotech/openapi-k8s-toolkit'
import { useSelector } from 'react-redux'
import type { RootState } from 'store/store'
import { BASE_API_GROUP, BASE_API_VERSION } from 'constants/customizationApiGroupAndVersion'
import {
HEAD_FIRST_ROW,
HEAD_SECOND_ROW,
@@ -37,6 +29,7 @@ type TBlackholeFormProps = {
prefillValuesSchema?: TJSON
prefillValueNamespaceOnly?: string
}
customizationId: string
isCreate?: boolean
backlink?: string | null
modeData?: {
@@ -46,7 +39,7 @@ type TBlackholeFormProps = {
}
}
export const BlackholeForm: FC<TBlackholeFormProps> = ({ data, isCreate, backlink, modeData }) => {
export const BlackholeForm: FC<TBlackholeFormProps> = ({ data, customizationId, isCreate, backlink, modeData }) => {
const theme = useSelector((state: RootState) => state.openapiTheme.theme)
const cluster = useSelector((state: RootState) => state.cluster.cluster)
const params = useParams()
@@ -89,30 +82,14 @@ export const BlackholeForm: FC<TBlackholeFormProps> = ({ data, isCreate, backlin
typeName: params.typeName,
}
const namespacesData = useBuiltinResources({
clusterName: cluster,
typeName: 'namespaces',
refetchInterval: false,
limit: null,
})
const formsPrefillsData = useCrdResources<TFormsPrefillsData['items']>({
clusterName: cluster,
crdName: 'customformsprefills',
apiGroup: BASE_API_GROUP,
apiVersion: BASE_API_VERSION,
refetchInterval: false,
})
return (
<BlackholeFormDataProvider
theme={theme}
cluster={cluster}
urlParams={urlParams}
urlParamsForPermissions={urlParamsForPermissions}
formsPrefillsData={formsPrefillsData.data}
namespacesData={namespacesData.data}
data={data}
customizationId={customizationId}
isCreate={isCreate}
backlink={backlink}
modeData={modeData}

View File

@@ -4,10 +4,11 @@ import { ManageableBreadcrumbsWithDataProvider } from '@prorobotech/openapi-k8s-
import { BASE_API_GROUP, BASE_API_VERSION } from 'constants/customizationApiGroupAndVersion'
type TManageableBreadCrumbsProps = {
idToCompare: string
inside?: boolean
}
export const ManageableBreadcrumbs: FC<TManageableBreadCrumbsProps> = ({ inside }) => {
export const ManageableBreadcrumbs: FC<TManageableBreadCrumbsProps> = ({ idToCompare, inside }) => {
const { pathname } = useLocation()
const params = useParams()
const clusterName = params?.clusterName || ''
@@ -22,6 +23,7 @@ export const ManageableBreadcrumbs: FC<TManageableBreadCrumbsProps> = ({ inside
return (
<ManageableBreadcrumbsWithDataProvider
idToCompare={idToCompare}
uri={`/api/clusters/${clusterName}/k8s/apis/${BASE_API_GROUP}/${BASE_API_VERSION}/${
inside ? 'breadcrumbsinside' : 'breadcrumbs'
}/`}

View File

@@ -48,6 +48,7 @@ export const CreateApisForm: FC<TCreateApisFormProps> = ({ namespace, apiGroup,
typeName,
prefillValueNamespaceOnly: namespace,
}}
customizationId={`default-${apiGroup}/${apiVersion}/${typeName}`}
isCreate
backlink={backLink}
modeData={modeData}

View File

@@ -84,6 +84,7 @@ export const UpdateApisForm: FC<TUpdateApisFormProps> = ({
// prefillValuesSchema: { ...noStatusData, metadata },
prefillValuesSchema: { ...data, metadata },
}}
customizationId={`default-${apiGroup}/${apiVersion}/${typeName}`}
backlink={backLink}
modeData={modeData}
/>

View File

@@ -44,6 +44,7 @@ export const CreateBuiltinForm: FC<TCreateBuiltinFormProps> = ({ namespace, type
typeName,
prefillValueNamespaceOnly: namespace,
}}
customizationId={`default-v1/${typeName}`}
isCreate
backlink={backLink}
modeData={modeData}

View File

@@ -71,6 +71,7 @@ export const UpdateBuiltinForm: FC<TUpdateBuiltinFormProps> = ({ typeName, entry
// prefillValuesSchema: { ...noStatusData, metadata },
prefillValuesSchema: { ...data, metadata },
}}
customizationId={`default-v1/${typeName}`}
backlink={backLink}
modeData={modeData}
/>

View File

@@ -48,6 +48,7 @@ export const CreateCrdsForm: FC<TCreateCrdsFormProps> = ({ namespace, apiGroup,
typeName,
prefillValueNamespaceOnly: namespace,
}}
customizationId={`default-${apiGroup}/${apiVersion}/${typeName}`}
isCreate
backlink={backLink}
modeData={modeData}

View File

@@ -84,6 +84,7 @@ export const UpdateCrdsForm: FC<TUpdateCrdsFormProps> = ({
// prefillValuesSchema: { ...noStatusData, metadata },
prefillValuesSchema: { ...data, metadata },
}}
customizationId={`default-${apiGroup}/${apiVersion}/${typeName}`}
backlink={backLink}
modeData={modeData}
/>

View File

@@ -10,7 +10,7 @@ export const FactoryPage: FC<TFactoryPageProps> = ({ forcedTheme }) => {
return (
<BaseTemplate forcedTheme={forcedTheme} withNoCluster>
<NavigationContainer>
<ManageableBreadcrumbs />
<ManageableBreadcrumbs idToCompare={`factory-${window.location.pathname}`} />
</NavigationContainer>
<Factory />
</BaseTemplate>

View File

@@ -12,6 +12,7 @@ import {
NavigationContainer,
} from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
type TFormApiPageProps = {
@@ -38,6 +39,11 @@ export const FormApiPage: FC<TFormApiPageProps> = ({ forcedTheme, inside }) => {
const backLink = searchParams.get('backlink')?.startsWith('/') ? searchParams.get('backlink') : undefined
const sidebarId = `${getSidebarIdPrefix({ instance: !!syntheticProject, project: !!namespace, inside })}api-form`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({
instance: !!syntheticProject,
project: !!namespace,
inside,
})}api-form`
return (
<BaseTemplate
@@ -53,7 +59,7 @@ export const FormApiPage: FC<TFormApiPageProps> = ({ forcedTheme, inside }) => {
}
>
<NavigationContainer>
<ManageableBreadcrumbs inside={inside} />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside={inside} />
<BackLink
to={backLink || customBacklink}
title={`${entryName ? 'Update' : 'Create'} ${apiGroup}/${apiVersion}/${typeName}${

View File

@@ -12,6 +12,7 @@ import {
NavigationContainer,
} from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
type TFormBuiltinPageProps = {
@@ -38,6 +39,11 @@ export const FormBuiltinPage: FC<TFormBuiltinPageProps> = ({ forcedTheme, inside
const backLink = searchParams.get('backlink')?.startsWith('/') ? searchParams.get('backlink') : undefined
const sidebarId = `${getSidebarIdPrefix({ instance: !!syntheticProject, project: !!namespace, inside })}builtin-form`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({
instance: !!syntheticProject,
project: !!namespace,
inside,
})}builtin-form`
return (
<BaseTemplate
@@ -53,7 +59,7 @@ export const FormBuiltinPage: FC<TFormBuiltinPageProps> = ({ forcedTheme, inside
}
>
<NavigationContainer>
<ManageableBreadcrumbs inside={inside} />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside={inside} />
<BackLink
to={backLink || customBacklink}
title={`${entryName ? 'Update' : 'Create'} ${typeName}${entryName ? `/${entryName}` : ''}`}

View File

@@ -12,6 +12,7 @@ import {
NavigationContainer,
} from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
type TFormCrdPageProps = {
@@ -38,6 +39,11 @@ export const FormCrdPage: FC<TFormCrdPageProps> = ({ forcedTheme, inside }) => {
const backLink = searchParams.get('backlink')?.startsWith('/') ? searchParams.get('backlink') : undefined
const sidebarId = `${getSidebarIdPrefix({ instance: !!syntheticProject, project: !!namespace, inside })}crd-form`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({
instance: !!syntheticProject,
project: !!namespace,
inside,
})}crd-form`
return (
<BaseTemplate
@@ -53,7 +59,7 @@ export const FormCrdPage: FC<TFormCrdPageProps> = ({ forcedTheme, inside }) => {
}
>
<NavigationContainer>
<ManageableBreadcrumbs inside={inside} />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside={inside} />
<BackLink
to={backLink || customBacklink}
title={`${entryName ? 'Update' : 'Create'} ${apiGroup}/${apiVersion}/${typeName}${

View File

@@ -3,6 +3,7 @@ import { ContentCard } from '@prorobotech/openapi-k8s-toolkit'
import { useParams } from 'react-router-dom'
import { ListInsideApisByApiGroup, ManageableBreadcrumbs, ManageableSidebar, NavigationContainer } from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
type TListInsideApiByApiGroupPageProps = {
@@ -14,11 +15,12 @@ export const ListInsideApiByApiGroupPage: FC<TListInsideApiByApiGroupPageProps>
const { namespace, apiGroup, apiVersion } = useParams()
const sidebarId = `${getSidebarIdPrefix({ namespace: !!namespace, inside })}api-by-api`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({ namespace: !!namespace, inside })}api-by-api`
return (
<BaseTemplate forcedTheme={forcedTheme} inside={inside} sidebar={<ManageableSidebar idToCompare={sidebarId} />}>
<NavigationContainer>
<ManageableBreadcrumbs inside />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside />
</NavigationContainer>
<ContentCard flexGrow={1} displayFlex flexFlow="column">
{apiGroup && apiVersion && (

View File

@@ -3,6 +3,7 @@ import { ContentCard } from '@prorobotech/openapi-k8s-toolkit'
import { useParams } from 'react-router-dom'
import { ListInsideAllResources, ManageableBreadcrumbs, ManageableSidebar, NavigationContainer } from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
type TListInsideApiPageProps = {
@@ -14,11 +15,12 @@ export const ListInsideApiPage: FC<TListInsideApiPageProps> = ({ forcedTheme, in
const { namespace } = useParams()
const sidebarId = `${getSidebarIdPrefix({ namespace: !!namespace, inside })}apis`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({ namespace: !!namespace, inside })}apis`
return (
<BaseTemplate forcedTheme={forcedTheme} inside={inside} sidebar={<ManageableSidebar idToCompare={sidebarId} />}>
<NavigationContainer>
<ManageableBreadcrumbs inside />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside />
</NavigationContainer>
<ContentCard flexGrow={1} displayFlex flexFlow="column">
<ListInsideAllResources namespace={namespace} />

View File

@@ -3,6 +3,7 @@ import { ContentCard } from '@prorobotech/openapi-k8s-toolkit'
import { useParams } from 'react-router-dom'
import { ListInsideCrdsByApiGroup, ManageableBreadcrumbs, ManageableSidebar, NavigationContainer } from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
type TListInsideCrdByApiGroupPageProps = {
@@ -14,11 +15,12 @@ export const ListInsideCrdByApiGroupPage: FC<TListInsideCrdByApiGroupPageProps>
const { namespace, apiGroup, apiVersion, apiExtensionVersion } = useParams()
const sidebarId = `${getSidebarIdPrefix({ namespace: !!namespace, inside })}crd-by-api`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({ namespace: !!namespace, inside })}crd-by-api`
return (
<BaseTemplate forcedTheme={forcedTheme} inside={inside} sidebar={<ManageableSidebar idToCompare={sidebarId} />}>
<NavigationContainer>
<ManageableBreadcrumbs inside />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside />
</NavigationContainer>
<ContentCard flexGrow={1} displayFlex flexFlow="column">
{apiGroup && apiVersion && apiExtensionVersion && (

View File

@@ -2,6 +2,7 @@ import React, { FC } from 'react'
import { ContentCard } from '@prorobotech/openapi-k8s-toolkit'
import { ListProjects, ManageableBreadcrumbs, ManageableSidebar, NavigationContainer } from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
type TListProjectsPageProps = {
@@ -10,11 +11,12 @@ type TListProjectsPageProps = {
export const ListProjectsPage: FC<TListProjectsPageProps> = ({ forcedTheme }) => {
const sidebarId = `${getSidebarIdPrefix({})}projects-list`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({})}projects-list`
return (
<BaseTemplate forcedTheme={forcedTheme} sidebar={<ManageableSidebar idToCompare={sidebarId} />}>
<NavigationContainer>
<ManageableBreadcrumbs />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} />
</NavigationContainer>
<ContentCard flexGrow={1} displayFlex flexFlow="column">
<ListProjects />

View File

@@ -5,6 +5,7 @@ import { useSelector } from 'react-redux'
import type { RootState } from 'store/store'
import { TableNonCrdInfo, BackLink, ManageableBreadcrumbs, ManageableSidebar, NavigationContainer } from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
import {
BASE_INSTANCES_API_GROUP,
@@ -44,6 +45,11 @@ export const TableApiPage: FC<TTableApiPageProps> = ({ forcedTheme, inside }) =>
// const nonInstanceBackLink = namespace ? customBacklink : clustererBacklink
const sidebarId = `${getSidebarIdPrefix({ instance: !!syntheticProject, project: !!namespace, inside })}api-table`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({
instance: !!syntheticProject,
project: !!namespace,
inside,
})}api-table`
return (
<BaseTemplate
@@ -59,7 +65,7 @@ export const TableApiPage: FC<TTableApiPageProps> = ({ forcedTheme, inside }) =>
}
>
<NavigationContainer>
<ManageableBreadcrumbs inside={inside} />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside={inside} />
<BackLink
to={namespace ? customBacklinkWithInside : clustererBacklink}
title={`${apiGroup}/${apiVersion}/${typeName}`}

View File

@@ -5,6 +5,7 @@ import { useSelector } from 'react-redux'
import type { RootState } from 'store/store'
import { TableBuiltinInfo, BackLink, ManageableBreadcrumbs, ManageableSidebar, NavigationContainer } from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
import {
BASE_INSTANCES_API_GROUP,
@@ -36,6 +37,11 @@ export const TableBuiltinPage: FC<TTableBuiltinPageProps> = ({ forcedTheme, insi
const clustererBacklink = inside ? customBacklinkWithInside : `${baseprefix}/clusters`
const sidebarId = `${getSidebarIdPrefix({ instance: !!syntheticProject, project: !!namespace, inside })}builtin-table`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({
instance: !!syntheticProject,
project: !!namespace,
inside,
})}builtin-table`
return (
<BaseTemplate
@@ -51,7 +57,7 @@ export const TableBuiltinPage: FC<TTableBuiltinPageProps> = ({ forcedTheme, insi
}
>
<NavigationContainer>
<ManageableBreadcrumbs inside={inside} />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside={inside} />
<BackLink to={namespace ? customBacklinkWithInside : clustererBacklink} title={typeName} />
</NavigationContainer>
<ContentCard flexGrow={1} displayFlex flexFlow="column">

View File

@@ -5,6 +5,7 @@ import { useSelector } from 'react-redux'
import type { RootState } from 'store/store'
import { TableCrdInfo, BackLink, ManageableBreadcrumbs, ManageableSidebar, NavigationContainer } from 'components'
import { getSidebarIdPrefix } from 'utils/getSidebarIdPrefix'
import { getBreadcrumbsIdPrefix } from 'utils/getBreadcrumbsIdPrefix'
import { BaseTemplate } from 'templates'
import {
BASE_INSTANCES_API_GROUP,
@@ -35,6 +36,11 @@ export const TableCrdPage: FC<TTableCrdPageProps> = ({ forcedTheme, inside }) =>
const clustererBacklink = inside ? customBacklinkWithInside : `${baseprefix}/clusters`
const sidebarId = `${getSidebarIdPrefix({ instance: !!syntheticProject, project: !!namespace, inside })}crd-table`
const breadcrumbsId = `${getBreadcrumbsIdPrefix({
instance: !!syntheticProject,
project: !!namespace,
inside,
})}crd-table`
return (
<BaseTemplate
@@ -50,7 +56,7 @@ export const TableCrdPage: FC<TTableCrdPageProps> = ({ forcedTheme, inside }) =>
}
>
<NavigationContainer>
<ManageableBreadcrumbs inside={inside} />
<ManageableBreadcrumbs idToCompare={breadcrumbsId} inside={inside} />
<BackLink
to={namespace ? customBacklinkWithInside : clustererBacklink}
title={`${apiGroup}/${apiVersion}/${crdName}`}

View File

@@ -0,0 +1,25 @@
export const getBreadcrumbsIdPrefix = ({
project,
instance,
namespace,
inside,
}: {
project?: boolean
instance?: boolean
namespace?: boolean
inside?: boolean
}): string => {
let result = inside ? 'inside-' : 'stock-'
if (instance) {
result += 'instance-'
} else if (project) {
result += 'project-'
} else if (namespace) {
result += 'namespace-'
} else {
result += 'cluster-'
}
return result
}