From 723eefea66614b6a621413d0d48e3d5238cd53b6 Mon Sep 17 00:00:00 2001 From: Andrei Kvapil Date: Sat, 1 Nov 2025 22:29:49 +0100 Subject: [PATCH] [dashboard] Migrate patches to upstream project [dashboard] Fix nested lists in addtiionalProperties Signed-off-by: Andrei Kvapil --- .../images/openapi-ui-k8s-bff/Dockerfile | 6 +- .../patches/namespaces.diff | 21 -- .../dashboard/images/openapi-ui/Dockerfile | 4 +- .../patches/additional-properties-types.diff | 230 ++++++++++++++++++ .../openapi-ui/patches/namespaces.diff | 18 +- .../system/dashboard/templates/configmap.yaml | 8 +- packages/system/dashboard/templates/web.yaml | 16 +- packages/system/dashboard/values.yaml | 6 +- 8 files changed, 262 insertions(+), 47 deletions(-) delete mode 100644 packages/system/dashboard/images/openapi-ui-k8s-bff/patches/namespaces.diff create mode 100644 packages/system/dashboard/images/openapi-ui/openapi-k8s-toolkit/patches/additional-properties-types.diff diff --git a/packages/system/dashboard/images/openapi-ui-k8s-bff/Dockerfile b/packages/system/dashboard/images/openapi-ui-k8s-bff/Dockerfile index d8447e7a..b0c34cfe 100644 --- a/packages/system/dashboard/images/openapi-ui-k8s-bff/Dockerfile +++ b/packages/system/dashboard/images/openapi-ui-k8s-bff/Dockerfile @@ -1,15 +1,11 @@ # imported from https://github.com/cozystack/openapi-ui-k8s-bff ARG NODE_VERSION=20.18.1 FROM node:${NODE_VERSION}-alpine AS builder -RUN apk add git WORKDIR /src -ARG COMMIT_REF=88531ed6881b4ce4808e56c00905951d7ba8031c +ARG COMMIT_REF=92906a7f21050cfb8e352f98d36b209c57844f63 RUN wget -O- https://github.com/PRO-Robotech/openapi-ui-k8s-bff/archive/${COMMIT_REF}.tar.gz | tar xzf - --strip-components=1 -COPY patches /patches -RUN git apply /patches/*.diff - ENV PATH=/src/node_modules/.bin:$PATH RUN npm install RUN npm run build diff --git a/packages/system/dashboard/images/openapi-ui-k8s-bff/patches/namespaces.diff b/packages/system/dashboard/images/openapi-ui-k8s-bff/patches/namespaces.diff deleted file mode 100644 index 3ed11a7c..00000000 --- a/packages/system/dashboard/images/openapi-ui-k8s-bff/patches/namespaces.diff +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/src/endpoints/forms/prepareFormProps/prepareFormProps.ts b/src/endpoints/forms/prepareFormProps/prepareFormProps.ts -index 7e437db..90c40f6 100644 ---- a/src/endpoints/forms/prepareFormProps/prepareFormProps.ts -+++ b/src/endpoints/forms/prepareFormProps/prepareFormProps.ts -@@ -15,6 +15,7 @@ export const prepareFormProps: RequestHandler = async (req: TPrepareFormReq, res - - const filteredHeaders = { ...req.headers } - delete filteredHeaders['host'] // Avoid passing internal host header -+ delete filteredHeaders['content-length'] // This header causes "stream has been aborted" - - const { data: formsOverridesData } = await userKubeApi.get( - `/apis/${BASE_API_GROUP}/${BASE_API_VERSION}/customformsoverrides`, -@@ -40,7 +41,7 @@ export const prepareFormProps: RequestHandler = async (req: TPrepareFormReq, res - }, - ) - -- const { data: namespacesData } = await userKubeApi.get(`/api/v1/namespaces`, { -+ const { data: namespacesData } = await userKubeApi.get(`/apis/core.cozystack.io/v1alpha1/tenantnamespaces`, { - headers: { - // Authorization: `Bearer ${bearerToken}`, - // Cookie: cookies, diff --git a/packages/system/dashboard/images/openapi-ui/Dockerfile b/packages/system/dashboard/images/openapi-ui/Dockerfile index af41cb65..82650cd8 100644 --- a/packages/system/dashboard/images/openapi-ui/Dockerfile +++ b/packages/system/dashboard/images/openapi-ui/Dockerfile @@ -5,7 +5,7 @@ ARG NODE_VERSION=20.18.1 FROM node:${NODE_VERSION}-alpine AS openapi-k8s-toolkit-builder RUN apk add git WORKDIR /src -ARG COMMIT=e5f16b45de19f892de269cc4ef27e74aa62f4c92 +ARG COMMIT=7086a2d8a07dcf6a94bb4276433db5d84acfcf3b RUN wget -O- https://github.com/cozystack/openapi-k8s-toolkit/archive/${COMMIT}.tar.gz | tar -xzvf- --strip-components=1 COPY openapi-k8s-toolkit/patches /patches @@ -22,7 +22,7 @@ FROM node:${NODE_VERSION}-alpine AS builder RUN apk add git WORKDIR /src -ARG COMMIT_REF=9ce4367657f49c0032d8016b1d9491f8abbd2b15 +ARG COMMIT_REF=fe237518348e94cead6d4f3283b2fce27f26aa12 RUN wget -O- https://github.com/PRO-Robotech/openapi-ui/archive/${COMMIT_REF}.tar.gz | tar xzf - --strip-components=1 COPY openapi-ui/patches /patches diff --git a/packages/system/dashboard/images/openapi-ui/openapi-k8s-toolkit/patches/additional-properties-types.diff b/packages/system/dashboard/images/openapi-ui/openapi-k8s-toolkit/patches/additional-properties-types.diff new file mode 100644 index 00000000..7bc9a4c3 --- /dev/null +++ b/packages/system/dashboard/images/openapi-ui/openapi-k8s-toolkit/patches/additional-properties-types.diff @@ -0,0 +1,230 @@ +diff --git a/src/components/molecules/BlackholeForm/molecules/FormObjectFromSwagger/FormObjectFromSwagger.tsx b/src/components/molecules/BlackholeForm/molecules/FormObjectFromSwagger/FormObjectFromSwagger.tsx +index a7135d4..2fea0bb 100644 +--- a/src/components/molecules/BlackholeForm/molecules/FormObjectFromSwagger/FormObjectFromSwagger.tsx ++++ b/src/components/molecules/BlackholeForm/molecules/FormObjectFromSwagger/FormObjectFromSwagger.tsx +@@ -68,13 +68,60 @@ export const FormObjectFromSwagger: FC = ({ + properties?: OpenAPIV2.SchemaObject['properties'] + required?: string + } ++ ++ // Check if the field name exists in additionalProperties.properties ++ // If so, use the type from that property definition ++ const nestedProp = addProps?.properties?.[additionalPropValue] as OpenAPIV2.SchemaObject | undefined ++ let fieldType: string = addProps.type ++ let fieldItems: { type: string } | undefined = addProps.items ++ let fieldNestedProperties = addProps.properties || {} ++ let fieldRequired: string | undefined = addProps.required ++ ++ if (nestedProp) { ++ // Use the nested property definition if it exists ++ // Handle type - it can be string or string[] in OpenAPI v2 ++ if (nestedProp.type) { ++ if (Array.isArray(nestedProp.type)) { ++ fieldType = nestedProp.type[0] || addProps.type ++ } else if (typeof nestedProp.type === 'string') { ++ fieldType = nestedProp.type ++ } else { ++ fieldType = addProps.type ++ } ++ } else { ++ fieldType = addProps.type ++ } ++ ++ // Handle items - it can be ItemsObject or ReferenceObject ++ if (nestedProp.items) { ++ // Check if it's a valid ItemsObject with type property ++ if ('type' in nestedProp.items && typeof nestedProp.items.type === 'string') { ++ fieldItems = { type: nestedProp.items.type } ++ } else { ++ fieldItems = addProps.items ++ } ++ } else { ++ fieldItems = addProps.items ++ } ++ ++ fieldNestedProperties = nestedProp.properties || {} ++ // Handle required field - it can be string[] in OpenAPI schema ++ if (Array.isArray(nestedProp.required)) { ++ fieldRequired = nestedProp.required.join(',') ++ } else if (typeof nestedProp.required === 'string') { ++ fieldRequired = nestedProp.required ++ } else { ++ fieldRequired = addProps.required ++ } ++ } ++ + inputProps?.addField({ + path: Array.isArray(name) ? [...name, String(collapseTitle)] : [name, String(collapseTitle)], + name: additionalPropValue, +- type: addProps.type, +- items: addProps.items, +- nestedProperties: addProps.properties || {}, +- required: addProps.required, ++ type: fieldType, ++ items: fieldItems, ++ nestedProperties: fieldNestedProperties, ++ required: fieldRequired, + }) + setAddditionalPropValue(undefined) + } +diff --git a/src/components/molecules/BlackholeForm/molecules/FormStringInput/FormStringInput.tsx b/src/components/molecules/BlackholeForm/molecules/FormStringInput/FormStringInput.tsx +index 487d480..3ca46c1 100644 +--- a/src/components/molecules/BlackholeForm/molecules/FormStringInput/FormStringInput.tsx ++++ b/src/components/molecules/BlackholeForm/molecules/FormStringInput/FormStringInput.tsx +@@ -42,7 +42,11 @@ export const FormStringInput: FC = ({ + const formValue = Form.useWatch(formFieldName) + + // Derive multiline based on current local value +- const isMultiline = useMemo(() => isMultilineString(formValue), [formValue]) ++ const isMultiline = useMemo(() => { ++ // Normalize value for multiline check ++ const value = typeof formValue === 'string' ? formValue : (formValue === null || formValue === undefined ? '' : String(formValue)) ++ return isMultilineString(value) ++ }, [formValue]) + + const title = ( + <> +@@ -77,6 +81,23 @@ export const FormStringInput: FC = ({ + rules={[{ required: forceNonRequired === false && required?.includes(getStringByName(name)) }]} + validateTrigger="onBlur" + hasFeedback={designNewLayout ? { icons: feedbackIcons } : true} ++ normalize={(value) => { ++ // Normalize value to string - prevent "[object Object]" display ++ if (value === undefined || value === null) { ++ return '' ++ } ++ if (typeof value === 'string') { ++ return value ++ } ++ if (typeof value === 'number' || typeof value === 'boolean') { ++ return String(value) ++ } ++ // If it's an object or array, it shouldn't be in a string field - return empty string ++ if (typeof value === 'object') { ++ return '' ++ } ++ return String(value) ++ }} + > + { +- const t = ap?.type ?? 'object' ++ const makeChildFromAP = (ap: any, value?: unknown): OpenAPIV2.SchemaObject => { ++ // Determine type based on actual value if not explicitly defined in additionalProperties ++ let t = ap?.type ++ if (!t && value !== undefined && value !== null) { ++ if (Array.isArray(value)) { ++ t = 'array' ++ } else if (typeof value === 'object') { ++ t = 'object' ++ } else if (typeof value === 'string') { ++ t = 'string' ++ } else if (typeof value === 'number') { ++ t = 'number' ++ } else if (typeof value === 'boolean') { ++ t = 'boolean' ++ } else { ++ t = 'object' ++ } ++ } ++ t = t ?? 'object' ++ + const child: OpenAPIV2.SchemaObject = { type: t } as any + + // Copy common schema details (if present) +@@ -134,6 +152,20 @@ export const materializeAdditionalFromValues = ( + if (ap?.required) + (child as any).required = _.cloneDeep(ap.required) + ++ // If value is an array and items type is not defined, infer it from the first item ++ if (t === 'array' && Array.isArray(value) && value.length > 0 && !ap?.items) { ++ const firstItem = value[0] ++ if (typeof firstItem === 'string') { ++ ;(child as any).items = { type: 'string' } ++ } else if (typeof firstItem === 'number') { ++ ;(child as any).items = { type: 'number' } ++ } else if (typeof firstItem === 'boolean') { ++ ;(child as any).items = { type: 'boolean' } ++ } else if (typeof firstItem === 'object') { ++ ;(child as any).items = { type: 'object' } ++ } ++ } ++ + // Mark as originating from `additionalProperties` + ;(child as any).isAdditionalProperties = true + return child +@@ -177,7 +209,16 @@ export const materializeAdditionalFromValues = ( + + // If the key doesn't exist in schema, create it from `additionalProperties` + if (!schemaNode.properties![k]) { +- schemaNode.properties![k] = makeChildFromAP(ap) ++ // Check if there's a nested property definition in additionalProperties ++ const nestedProp = ap?.properties?.[k] ++ if (nestedProp) { ++ // Use the nested property definition from additionalProperties ++ schemaNode.properties![k] = _.cloneDeep(nestedProp) as any ++ ;(schemaNode.properties![k] as any).isAdditionalProperties = true ++ } else { ++ // Create from additionalProperties with value-based type inference ++ schemaNode.properties![k] = makeChildFromAP(ap, vo[k]) ++ } + // If it's an existing additional property, merge any nested structure + } else if ((schemaNode.properties![k] as any).isAdditionalProperties && ap?.properties) { + ;(schemaNode.properties![k] as any).properties ??= _.cloneDeep(ap.properties) +diff --git a/src/components/molecules/BlackholeForm/organisms/BlackholeForm/utils.tsx b/src/components/molecules/BlackholeForm/organisms/BlackholeForm/utils.tsx +index 2d887c7..d69d711 100644 +--- a/src/components/molecules/BlackholeForm/organisms/BlackholeForm/utils.tsx ++++ b/src/components/molecules/BlackholeForm/organisms/BlackholeForm/utils.tsx +@@ -394,9 +394,11 @@ export const getArrayFormItemFromSwagger = ({ + {(fields, { add, remove }, { errors }) => ( + <> + {fields.map(field => { +- const fieldType = ( ++ const rawFieldType = ( + schema.items as (OpenAPIV2.ItemsObject & { properties?: OpenAPIV2.SchemaObject }) | undefined + )?.type ++ // Handle type as string or string[] (OpenAPI v2 allows both) ++ const fieldType = Array.isArray(rawFieldType) ? rawFieldType[0] : rawFieldType + const description = (schema.items as (OpenAPIV2.ItemsObject & { description?: string }) | undefined) + ?.description + const entry = schema.items as +@@ -577,7 +579,29 @@ export const getArrayFormItemFromSwagger = ({ + type="text" + size="small" + onClick={() => { +- add() ++ // Determine initial value based on item type ++ const fieldType = ( ++ schema.items as (OpenAPIV2.ItemsObject & { properties?: OpenAPIV2.SchemaObject }) | undefined ++ )?.type ++ ++ let initialValue: unknown ++ // Handle type as string or string[] (OpenAPI v2 allows both) ++ const typeStr = Array.isArray(fieldType) ? fieldType[0] : fieldType ++ if (typeStr === 'string') { ++ initialValue = '' ++ } else if (typeStr === 'number' || typeStr === 'integer') { ++ initialValue = 0 ++ } else if (typeStr === 'boolean') { ++ initialValue = false ++ } else if (typeStr === 'array') { ++ initialValue = [] ++ } else if (typeStr === 'object') { ++ initialValue = {} ++ } else { ++ initialValue = '' ++ } ++ ++ add(initialValue) + }} + > + diff --git a/packages/system/dashboard/images/openapi-ui/openapi-ui/patches/namespaces.diff b/packages/system/dashboard/images/openapi-ui/openapi-ui/patches/namespaces.diff index b76c86d3..c35ec47d 100644 --- a/packages/system/dashboard/images/openapi-ui/openapi-ui/patches/namespaces.diff +++ b/packages/system/dashboard/images/openapi-ui/openapi-ui/patches/namespaces.diff @@ -1,16 +1,18 @@ diff --git a/src/components/organisms/ListInsideClusterAndNs/ListInsideClusterAndNs.tsx b/src/components/organisms/ListInsideClusterAndNs/ListInsideClusterAndNs.tsx -index b6fb99f..965bac0 100644 +index ac56e5f..c6e2350 100644 --- a/src/components/organisms/ListInsideClusterAndNs/ListInsideClusterAndNs.tsx +++ b/src/components/organisms/ListInsideClusterAndNs/ListInsideClusterAndNs.tsx -@@ -1,11 +1,16 @@ +@@ -1,6 +1,6 @@ import React, { FC, useState } from 'react' import { Button, Alert, Spin, Typography } from 'antd' --import { filterSelectOptions, Spacer, useBuiltinResources } from '@prorobotech/openapi-k8s-toolkit' +-import { filterSelectOptions, Spacer, useBuiltinResources, useApiResources } from '@prorobotech/openapi-k8s-toolkit' +import { filterSelectOptions, Spacer, useApiResources } from '@prorobotech/openapi-k8s-toolkit' import { useNavigate } from 'react-router-dom' import { useSelector, useDispatch } from 'react-redux' import { RootState } from 'store/store' - import { setCluster } from 'store/cluster/cluster/cluster' +@@ -11,6 +11,11 @@ import { + CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME, + } from 'constants/customizationApiGroupAndVersion' import { Styled } from './styled' +import { + BASE_PROJECTS_API_GROUP, @@ -20,9 +22,9 @@ index b6fb99f..965bac0 100644 export const ListInsideClusterAndNs: FC = () => { const clusterList = useSelector((state: RootState) => state.clusterList.clusterList) -@@ -17,9 +22,11 @@ export const ListInsideClusterAndNs: FC = () => { - const [selectedCluster, setSelectedCluster] = useState() - const [selectedNamespace, setSelectedNamespace] = useState() +@@ -33,9 +38,11 @@ export const ListInsideClusterAndNs: FC = () => { + typeof CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME === 'string' && + CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME.length > 0 - const namespacesData = useBuiltinResources({ + const namespacesData = useApiResources({ @@ -32,7 +34,7 @@ index b6fb99f..965bac0 100644 + apiVersion: BASE_PROJECTS_VERSION, + typeName: BASE_PROJECTS_RESOURCE_NAME, limit: null, - isEnabled: selectedCluster !== undefined, + isEnabled: selectedCluster !== undefined && !isCustomNamespaceResource, }) diff --git a/src/hooks/useNavSelectorInside.ts b/src/hooks/useNavSelectorInside.ts index 5736e2b..1ec0f71 100644 diff --git a/packages/system/dashboard/templates/configmap.yaml b/packages/system/dashboard/templates/configmap.yaml index 5c541dff..96550a35 100644 --- a/packages/system/dashboard/templates/configmap.yaml +++ b/packages/system/dashboard/templates/configmap.yaml @@ -1,9 +1,9 @@ {{- $brandingConfig:= lookup "v1" "ConfigMap" "cozy-system" "cozystack-branding" }} -{{- $tenantText := "v0.37.0" }} +{{- $tenantText := "latest" }} {{- $footerText := "Cozystack" }} {{- $titleText := "Cozystack Dashboard" }} -{{- $logoText := "false" }} +{{- $logoText := "" }} {{- $logoSvg := "PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjMwIiB2aWV3Qm94PSIwIDAgMTUwIDMwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Ik0xMzMuMzMxMDkgMjIuMzczOTg3VjQuNzk1Mjc2OWgyLjA0NDUyVjEyLjc3Mzg5aC4wNDk5bDguNTI3NzEtNy45NzkxNjcyaDIuNjE4MjdsLTkuNzc0NjQgOS4xMDExNTgyLjAyNDktMS4wOTcwNTkgMTAuMjk4MjQgOS41NzQ4ODloLTIuNjkyNzlsLTkuMDAxNjktOC4yNzgzNjNoLS4wNDk5djguMjc4MzYzem0tOS4xNzIzNi4yMjQzOTljLTEuNzI4NjkuMC0zLjIwODA1LS4zNjU2ODYtNC40MzgxLTEuMDk3MDU5LTEuMjMwNTktLjczMTM3My0yLjE3ODA0LTEuNzcwMjU0LTIuODQyOTMtMy4xMTY2NDUtLjY0ODI3LTEuMzQ2NjY3LS45NzIzOS0yLjk1MDk3OC0uOTcyMzktNC44MTI2NTQuMC0xLjg2MTY3Ny4zMjQxMi0zLjQ1NzM5OS45NzIzOS00Ljc4NzQ0NS42NjQ4OS0xLjM0NjM5MDYgMS42MTIzNC0yLjM4NTI3MjUgMi44NDI2Ni0zLjExNjkyMjQgMS4yMzAwMy0uNzMxMzcyOSAyLjcwOTQxLTEuMDk3MDU5MiA0LjQzODM3LTEuMDk3MDU5MiAxLjIxMzQyLjAgMi4zMzU0MS4xOTExNTQzIDMuMzY2MjYuNTczNDYyOCAxLjAzMDU3LjM4MjMwODUgMS44OTQ5My45MzkxNDkxIDIuNTkzMDUgMS42NzA1MjE5bC0uNzk3ODYgMS42NzA1MjE5Yy0uNzY0NjItLjcxNDc1LTEuNTYyNDgtMS4yMzAwMzYtMi4zOTM1OS0xLjU0NTg1NjEtLjgxNDQ3LS4zMzI0NDIxLTEuNzIwMzgtLjQ5ODY2MzItMi43MTc3MS0uNDk4NjYzMi0xLjk3ODU5LjAtMy40OTEyLjYyMzMyOS00LjUzODM4IDEuODY5OTg4My0xLjA0NzIxIDEuMjQ2NjU3LTEuNTcwOCAzLjAwMDU2Ni0xLjU3MDggNS4yNjE0NTEuMCAyLjI2MDYwNi41MjM1OSA0LjAyMjU0OSAxLjU3MDggNS4yODYxMDggMS4wNDcxOCAxLjI0NjY1NyAyLjU1OTc5IDEuODY5OTg2IDQuNTM4MDkgMS44Njk5ODYuOTk3MzQuMCAxLjkwMzI0LS4xNTc5MDkgMi43MTc3My0uNDczNzMuODMxMzgtLjMzMjQ0MiAxLjYyOTI0LS44NTYwMzggMi4zOTM4Ni0xLjU3MDc4OWwuNzk3ODYgMS42NzA1MjJjLS42OTgxMi43MTQ3NTEtMS41NjI0OCAxLjI3MTg2OS0yLjU5MzA1IDEuNjcwNzk5LTEuMDMwNTguMzgyMzA5LTIuMTUyNTcuNTczNDYyLTMuMzY1OTcuNTczNDYyek05Ni45ODQ2MzEgMjIuMzczOTg3IDEwNC43Mzk0IDQuNzk0OTk5OWgxLjc0NTMzbDcuNzU0NzYgMTcuNTc4OTg3MWgtMi4xMTkzMmwtMi4xNjkxOS01LjAxMTg0MS45OTczMy41MjM1OTVoLTEwLjcyMjA5bDEuMDIyMjctLjUyMzU5NS0yLjE0NDI1NCA1LjAxMTg0MXptOC42MDI0OTktMTUuMTg1NDAzNC00LjAxNDI0IDkuNDUwNTAwNC0uNTk4NC0uNDczNzNoOS4yMjU1NWwtLjU0ODUzLjQ3MzczLTQuMDE0MjUtOS40NTA1MDA0ek04OS44OTM5MjEgMjIuMzczOTg3VjYuNTY1NTMxNkg4My41MTAyMDJWNC43OTUyNzY5aDE0LjgzNjMzVjYuNTY1NTMxNkg5MS45NjMzNjZWMjIuMzc0MjY1eiIgZmlsbD17dG9rZW4uY29sb3JUZXh0fT48L3BhdGg+CiAgPHBhdGggZD0ibTY3Ljg1NDM4NSA0Ljc3MzExNDJoMTQuMDgwODd2MS43NjAwMDQyaC0xNC4wODA4N3ptMCAxNS44NDA4Njk4aDE0LjA4MDg3djEuNzYwMDAzaC0xNC4wODA4N3ptMTQuMDgwODctNy45MjA0MzVoLTE0LjA4MDg3djEuNzYwMDA1aDE0LjA4MDg3eiIgZmlsbD17dG9rZW4uY29sb3JUZXh0fT48L3BhdGg+CiAgPHBhdGggZD0ibTU3LjY2NDQ3MyAyMi4zNzM5ODd2LTkuMTAxMTU4bC40NDg4MDQgMS40MjExOTEtNy4xODEzMDktOS44OTkwMjAxaDIuMzkzODYxbDUuNjYwMTA5IDcuODI5NTY3MWgtLjUyMzYwNmw1LjY2MDM5MS03LjgyOTU2NzFoMi4zMTg3ODdsLTcuMTU2MzczIDkuODk4NzQyMS40MjQxNC0xLjQyMTE4OXY5LjEwMTE1OHptLTIwLjE4ODEwMi4wVjIwLjg1MzA2NUw0OC4xNDg1OTYgNS43NjczOTMydi43OTc4NjEzSDM3LjQ3NjM3MVY0Ljc5NDk5OTlINTAuMDY4NDVWNi4zMTU5MjI4TDM5LjM5NjUwMSAyMS4zNzY2NjF2LS43NzI5MjdoMTEuMDIxMjl2MS43NzAyNTN6bS0xMC4zOTYyOTguMjI0Mzk5Yy0xLjIxMzQxNC4wLTIuMzE5MDYyLS4yMDc3NzYtMy4zMTYzODktLjYyMzMyOC0uOTk3MzI3LS40MzIxNzUtMS44NDUwNTUtMS4wMzg4ODItMi41NDMxODQtMS44MjAxMjEtLjY5ODQwNi0uNzgxMjM5LTEuMjM4NjI0LTEuNzI4Ny0xLjYyMDkzMy0yLjg0MjY1OC0uMzY1Njg2LTEuMTEzNjgyLS41NDg1MjktMi4zNjAzMzktLjU0ODUyOS0zLjc0MDI1MS4wLTEuMzk2MjU3LjE4Mjg0My0yLjY0MjkxNy41NDg1MjktMy43NDAyNTIuMzgyMzA5LTEuMTEzNjgyLjkyMjUyNy0yLjA1MjgzMDkgMS42MjA2NTYtMi44MTc0NDc1LjY5ODEyOS0uNzgxMjM5MiAxLjUzNzU0NS0xLjM3OTkxMjEgMi41MTgyNS0xLjc5NTQ2NDguOTk3NjA0LS40MzIxNzQ5IDIuMTExMjg3LS42NDgyNjIzIDMuMzQxNi0uNjQ4MjYyMyAxLjI0NjY1Ny4wIDIuMzYwMzM5LjIwNzc3NjMgMy4zNDEwNDQuNjIzMzI5MS45OTczMjcuNDE1NTUyNyAxLjg0NTA1NSAxLjAxMzk0ODYgMi41NDM0NTkgMS43OTUxODc3LjcxNDc1MS43ODEyMzk4IDEuMjU0OTY5IDEuNzI4Njk5OCAxLjYyMDY1NSAyLjg0MjY1NzguMzgyMzEgMS4wOTcwNTkuNTczNDY0IDIuMzM1NDA2LjU3MzQ2NCAzLjcxNTA0Mi4wIDEuMzk2NTMzLS4xOTExNTQgMi42NTE3NzktLjU3MzQ2NCAzLjc2NTQ2MS0uMzgyMzA4IDEuMTEzNjgyLS45MjI1MjYgMi4wNjExNDItMS42MjA2NTUgMi44NDIzODFzLTEuNTQ1ODU2IDEuMzg3OTQ2LTIuNTQzMTgzIDEuODIwMzk4Yy0uOTgwNzA0LjQxNTU1Mi0yLjA5NDY2My42MjMzMjgtMy4zNDEzMi42MjMzMjh6bTAtMS44MjAxMmMxLjI2MzI3OS4wIDIuMzI3MDk0LS4yODI1NzYgMy4xOTE0NDMtLjg0NzcyOC44ODA5NzMtLjU2NTE1MiAxLjU1NDE2OS0xLjM4Nzk0NiAyLjAxOTU4OC0yLjQ2ODY2LjQ2NTY5Ni0xLjA4MDQzNy42OTg0MDYtMi4zNzY5NjEuNjk4NDA2LTMuODg5ODUuMC0xLjUyOTIzNC0uMjMyNzEtMi44MjU3NTgtLjY5ODEyOS0zLjg4OTg1MS0uNDY1NDE5LTEuMDYzODE1LTEuMTM4NjE0LTEuODc4Mjk3OC0yLjAxOTU4Ny0yLjQ0MzQ1LS44NjQzNS0uNTY1MTUxOC0xLjkyODQ0Mi0uODQ3NzI3Ni0zLjE5MTcyMS0uODQ3NzI3Ni0xLjIzMDAzOC4wLTIuMjg1ODE4LjI4MjU3NTgtMy4xNjY3OTEuODQ3NzI3Ni0uODY0MzUuNTY1MTUyMi0xLjUyOTIzNCAxLjM4Nzk0Ni0xLjk5NDY1MyAyLjQ2ODM4My0uNDY1NDE5IDEuMDYzODE1LS42OTgxMjkgMi4zNTIwMjktLjY5ODEyOSAzLjg2NDY0MS4wIDEuNTEyODg5LjIzMjcxIDIuODA5NjkuNjk4MTI5IDMuODkwMTI3LjQ2NTQxOSAxLjA2MzgxNSAxLjEzMDMwMyAxLjg4NjYwOSAxLjk5NDY1MyAyLjQ2ODM4My44ODA5NzMuNTY1MTUxIDEuOTM2NDc4Ljg0NzcyNyAzLjE2NjUxMy44NDc3Mjd6bS0xNi4wNDE3MjQgMS44MjAxMmMtMS43Mjg2OTgxLjAtMy4yMDgzNDE3LS4zNjU2ODYtNC40Mzg2NTYxLTEuMDk3MDU5QzUuMzY5NjU3MSAyMC43Njk5NTQgNC40MjIxOTY2IDE5LjczMTA3MyAzLjc1NzMxMzEgMTguMzg0NjgyYy0uNjQ4MjYzLTEuMzQ2NjY3LS45NzIzOTM2LTIuOTUwOTc4LS45NzIzOTM2LTQuODEyNjU0LjAtMS44NjE2NzcuMzI0MTMwNi0zLjQ1NzM5OS45NzIzOTM2LTQuNzg3NDQ1LjY2NDg4MzUtMS4zNDYzOTA2IDEuNjEyMzQ0LTIuMzg1MjcyNSAyLjg0MjM3OTgtMy4xMTY5MjI0QzcuODI5NzI5OCA0LjkzNjI4NzcgOS4zMDkzNzM0IDQuNTcwNjAxNCAxMS4wMzgzNDkgNC41NzA2MDE0YzEuMjEzNDE0LjAgMi4zMzU0MDguMTkxMTU0MyAzLjM2NTk3OC41NzM0NjI4IDEuMDMwNTcyLjM4MjMwODUgMS44OTQ5MjIuOTM5MTQ5MSAyLjU5MzMyNiAxLjY3MDUyMTlMMTYuMTk5NzkxIDguNDg1MTA4QzE1LjQzNTE3NSA3Ljc3MDM1OCAxNC42MzczMTMgNy4yNTUwNzIgMTMuODA2MjA5IDYuOTM5MjUxOSAxMi45OTE0NDcgNi42MDY4MDk4IDEyLjA4NTU0MyA2LjQ0MDU4ODcgMTEuMDg4MjE2IDYuNDQwNTg4N2MtMS45NzgwMzA0LjAtMy40OTA5MTg4LjYyMzMyOS00LjUzODM4OTIgMS44Njk5ODgzLTEuMDQ3MTkyNyAxLjI0NjY1Ny0xLjU3MDc4ODYgMy4wMDA1NjYtMS41NzA3ODg2IDUuMjYxNDUxLjAgMi4yNjA2MDYuNTIzNTk1OSA0LjAyMjU0OSAxLjU3MDc4ODYgNS4yODYxMDggMS4wNDcxOTI5IDEuMjQ2NjU3IDIuNTYwMDgyMyAxLjg2OTk4NiA0LjUzODM4OTIgMS44Njk5ODYuOTk3MzI3LjAgMS45MDMyMzEtLjE1NzkwOSAyLjcxNzcxNS0uNDczNzMuODMxMTA2LS4zMzI0NDIgMS42Mjg5NjgtLjg1NjAzOCAyLjM5MzU4NC0xLjU3MDc4OWwuNzk4MTM4IDEuNjcwNTIyYy0uNjk4MTI4LjcxNDc1MS0xLjU2MjQ3OCAxLjI3MTg2OS0yLjU5MzA0OCAxLjY3MDc5OS0xLjAzMDU3Mi4zODIzMDktMi4xNTI4NDIuNTczNDYyLTMuMzY2MjU2LjU3MzQ2MnoiIGZpbGw9e3Rva2VuLmNvbG9yVGV4dH0+PC9wYXRoPgo8L3N2Zz4K" }} {{- $iconSvg := "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgd2lkdGg9IjkxIgogICBoZWlnaHQ9IjkxIgogICB2aWV3Qm94PSIwIDAgNjguMjUwMDI0IDY4LjI1MDAyNCIKICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnODI2IgogICBzb2RpcG9kaTpkb2NuYW1lPSJmYXZpY29uLnN2ZyIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4xLjEgKGMzMDg0ZWYsIDIwMjEtMDktMjIpIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM4MzAiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJuYW1lZHZpZXc4MjgiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZWNoZWNrZXJib2FyZD0iMCIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC43NzAzNTc0MSIKICAgICBpbmtzY2FwZTpjeD0iNDM2LjgxMDIzIgogICAgIGlua3NjYXBlOmN5PSI1NDEuOTU2MjMiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNzIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzODciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjE3MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI1IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnODI2IiAvPgogIDxyZWN0CiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC42MTc5MDUiCiAgICAgaWQ9InJlY3Q5MzgiCiAgICAgd2lkdGg9IjY4LjI1MDAyMyIKICAgICBoZWlnaHQ9IjY4LjI1MDAyMyIKICAgICB4PSIwIgogICAgIHk9Ii0xLjc3NjM1NjhlLTE1IiAvPgogIDxwYXRoCiAgICAgZmlsbC1ydWxlPSJldmVub2RkIgogICAgIGNsaXAtcnVsZT0iZXZlbm9kZCIKICAgICBkPSJtIDE2LjYwMTU5OCwxMy45MjY5MSBjIDAsLTEuMjgwMTE1IDEuMDE1MDUxLC0yLjMxNzg2MSAyLjI2NzQyNCwtMi4zMTc4NjEgaCAzMS43NDM5MzcgYyAxLjI1MjM3OCwwIDIuMjY3NDIsMS4wMzc3NDYgMi4yNjc0MiwyLjMxNzg2MSB2IDAgYyAwLDEuMjgwMTMzIC0xLjAxNTA0MiwyLjMxNzg3IC0yLjI2NzQyLDIuMzE3ODcgSCAxOC44NjkwMjIgYyAtMS4yNTIzNzMsMCAtMi4yNjc0MjQsLTEuMDM3NzM3IC0yLjI2NzQyNCwtMi4zMTc4NyB6IG0gMCw0MS43MjE1NzIgYyAwLC0xLjI4MDA4MSAxLjAxNTA1MSwtMi4zMTc4NjUgMi4yNjc0MjQsLTIuMzE3ODY1IGggMzEuNzQzOTM3IGMgMS4yNTIzNzgsMCAyLjI2NzQyLDEuMDM3Nzg0IDIuMjY3NDIsMi4zMTc4NjUgdiAwIGMgMCwxLjI4MDE1OCAtMS4wMTUwNDIsMi4zMTc4NjYgLTIuMjY3NDIsMi4zMTc4NjYgSCAxOC44NjkwMjIgYyAtMS4yNTIzNzMsMCAtMi4yNjc0MjQsLTEuMDM3NzA4IC0yLjI2NzQyNCwtMi4zMTc4NjYgeiBtIDM2LjI3ODc4MSwtMjAuODYwOCBjIDAsLTEuMjgwMDggLTEuMDE1MDQyLC0yLjMxNzg2NSAtMi4yNjc0MiwtMi4zMTc4NjUgSCAxOC44NjkwMjIgYyAtMS4yNTIzNzMsMCAtMi4yNjc0MjQsMS4wMzc3ODUgLTIuMjY3NDI0LDIuMzE3ODY1IHYgMCBjIDAsMS4yODAxNTggMS4wMTUwNTEsMi4zMTc4NjYgMi4yNjc0MjQsMi4zMTc4NjYgaCAzMS43NDM5MzcgYyAxLjI1MjM3OCwwIDIuMjY3NDIsLTEuMDM3NzA4IDIuMjY3NDIsLTIuMzE3ODY2IHoiCiAgICAgZmlsbD0iI2ZmZmZmZiIKICAgICBpZD0icGF0aDg0MCIKICAgICBzdHlsZT0ic3Ryb2tlLXdpZHRoOjAuNzY0MTYzIiAvPgo8L3N2Zz4K" }} @@ -16,9 +16,9 @@ metadata: app.kubernetes.io/instance: incloud-web app.kubernetes.io/name: web data: - TENANT_TEXT: {{ $brandingConfig | dig "data" "tenantText" $tenantText | quote }} + CUSTOM_TENANT_TEXT: {{ $brandingConfig | dig "data" "tenantText" $tenantText | quote }} FOOTER_TEXT: {{ $brandingConfig | dig "data" "footerText" $footerText | quote }} TITLE_TEXT: {{ $brandingConfig | dig "data" "titleText" $titleText | quote }} LOGO_TEXT: {{ $brandingConfig | dig "data" "logoText" $logoText | quote }} - LOGO_SVG: {{ $brandingConfig | dig "data" "logoSvg" $logoSvg | quote }} + CUSTOM_LOGO_SVG: {{ $brandingConfig | dig "data" "logoSvg" $logoSvg | quote }} ICON_SVG: {{ $brandingConfig | dig "data" "iconSvg" $iconSvg | quote }} diff --git a/packages/system/dashboard/templates/web.yaml b/packages/system/dashboard/templates/web.yaml index 8a12d3f5..77a0cba3 100644 --- a/packages/system/dashboard/templates/web.yaml +++ b/packages/system/dashboard/templates/web.yaml @@ -42,6 +42,8 @@ spec: value: dashboard.cozystack.io - name: BASE_API_VERSION value: v1alpha1 + - name: BASE_NAMESPACE_FULL_PATH + value: "/apis/core.cozystack.io/v1alpha1/tenantnamespaces" - name: LOGGER value: "TRUE" - name: LOGGER_WITH_HEADERS @@ -122,6 +124,12 @@ spec: value: tenantnamespaces - name: PROJECTS_VERSION value: v1alpha1 + - name: CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP + value: core.cozystack.io + - name: CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION + value: v1alpha1 + - name: CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME + value: tenantnamespaces - name: USE_NAMESPACE_NAV value: "true" - name: LOGIN_URL @@ -140,21 +148,21 @@ spec: configMapKeyRef: name: incloud-web-dashboard-config key: TITLE_TEXT - - name: TENANT_TEXT + - name: CUSTOM_TENANT_TEXT valueFrom: configMapKeyRef: name: incloud-web-dashboard-config - key: TENANT_TEXT + key: CUSTOM_TENANT_TEXT - name: LOGO_TEXT valueFrom: configMapKeyRef: name: incloud-web-dashboard-config key: LOGO_TEXT - - name: LOGO_SVG + - name: CUSTOM_LOGO_SVG valueFrom: configMapKeyRef: name: incloud-web-dashboard-config - key: LOGO_SVG + key: CUSTOM_LOGO_SVG - name: ICON_SVG valueFrom: configMapKeyRef: diff --git a/packages/system/dashboard/values.yaml b/packages/system/dashboard/values.yaml index 03e11b3d..cdbee73c 100644 --- a/packages/system/dashboard/values.yaml +++ b/packages/system/dashboard/values.yaml @@ -1,6 +1,6 @@ openapiUI: - image: ghcr.io/cozystack/cozystack/openapi-ui:latest@sha256:dfd3227aec5944e303a96f8e3197ac37a6b6bd7994ddbd681b7d5827bd621f4b + image: ghcr.io/cozystack/cozystack/openapi-ui:latest@sha256:b942d98ff0ea36e3c6e864b6459b404d37ed68bc2b0ebc5d3007a1be4faf60c5 openapiUIK8sBff: - image: ghcr.io/cozystack/cozystack/openapi-ui-k8s-bff:latest@sha256:d2200791865a84640722079f2a3194af0c67d83c27c1bd303215183450265485 + image: ghcr.io/cozystack/cozystack/openapi-ui-k8s-bff:latest@sha256:5ddc6546baf3acdb8e0572536665fe73053a7f985b05e51366454efa11c201d2 tokenProxy: - image: ghcr.io/cozystack/cozystack/token-proxy:v0.37.0@sha256:fad27112617bb17816702571e1f39d0ac3fe5283468d25eb12f79906cdab566b + image: ghcr.io/cozystack/cozystack/token-proxy:latest@sha256:fad27112617bb17816702571e1f39d0ac3fe5283468d25eb12f79906cdab566b