Skip to content

Commit 19dd957

Browse files
authored
fix: unique key value input error message updates (#860)
1 parent b91fe20 commit 19dd957

File tree

3 files changed

+38
-39
lines changed

3 files changed

+38
-39
lines changed

web/crux-ui/src/components/projects/versions/deployments/instances/use-instance-state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export type InstanceState = {
2929
}
3030

3131
export type InstanceActions = {
32-
resetSection: (section: ImageConfigProperty) => InstanceContainerConfigData
32+
resetSection: (section: ImageConfigProperty) => void
3333
onPatch: (newConfig: Partial<ContainerConfigData>) => void
3434
onParseError: (error: Error) => void
3535
}

web/crux-ui/src/pages/[teamSlug]/deployments/[deploymentId]/instances/[instanceId].tsx

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Layout } from '@app/components/layout'
55
import useInstanceState from '@app/components/projects/versions/deployments/instances/use-instance-state'
66
import useDeploymentState from '@app/components/projects/versions/deployments/use-deployment-state'
77
import CommonConfigSection from '@app/components/projects/versions/images/config/common-config-section'
8+
import configToFilters from '@app/components/projects/versions/images/config/config-to-filters'
89
import CraneConfigSection from '@app/components/projects/versions/images/config/crane-config-section'
910
import DagentConfigSection from '@app/components/projects/versions/images/config/dagent-config-section'
1011
import EditImageJson from '@app/components/projects/versions/images/edit-image-json'
@@ -34,13 +35,12 @@ import {
3435
} from '@app/models'
3536
import { TeamRoutes } from '@app/routes'
3637
import { withContextAuthorization } from '@app/utils'
37-
import { jsonErrorOf, getMergedContainerConfigFieldErrors, ContainerConfigValidationErrors } from '@app/validations'
38+
import { ContainerConfigValidationErrors, getMergedContainerConfigFieldErrors, jsonErrorOf } from '@app/validations'
3839
import { getCruxFromContext } from '@server/crux-api'
3940
import { NextPageContext } from 'next'
4041
import useTranslation from 'next-translate/useTranslation'
41-
import { useEffect, useState } from 'react'
42+
import { useCallback, useEffect, useState } from 'react'
4243
import toast from 'react-hot-toast'
43-
import configToFilters from '@app/components/projects/versions/images/config/config-to-filters'
4444

4545
interface InstanceDetailsPageProps {
4646
deployment: DeploymentRoot
@@ -103,28 +103,21 @@ const InstanceDetailsPage = (props: InstanceDetailsPageProps) => {
103103
setFilters(current => configToFilters(current, state.config))
104104
}, [state.config])
105105

106-
const onChange = (newConfig: Partial<InstanceContainerConfigData>) => {
107-
const applied: InstanceContainerConfigData = {
108-
...state.config,
109-
...newConfig,
110-
}
111-
112-
const merged = mergeConfigs(instance.image.config, applied)
113-
const errors = getMergedContainerConfigFieldErrors(merged, t)
114-
setFieldErrors(errors)
115-
setJsonError(jsonErrorOf(errors))
116-
117-
actions.onPatch(instance.id, newConfig)
118-
}
106+
const setErrorsForConfig = useCallback(
107+
(imageConfig, instanceConfig) => {
108+
const merged = mergeConfigs(imageConfig, instanceConfig)
109+
const errors = getMergedContainerConfigFieldErrors(merged, t)
110+
setFieldErrors(errors)
111+
setJsonError(jsonErrorOf(errors))
112+
},
113+
[t],
114+
)
119115

120-
const onResetSection = (section: ImageConfigProperty) => {
121-
const newConfig = actions.resetSection(section)
116+
useEffect(() => {
117+
setErrorsForConfig(instance.image.config, instance.config)
118+
}, [instance.image.config, instance.config, setErrorsForConfig])
122119

123-
const merged = mergeConfigs(instance.image.config, newConfig)
124-
const errors = getMergedContainerConfigFieldErrors(merged, t)
125-
setFieldErrors(errors)
126-
setJsonError(jsonErrorOf(errors))
127-
}
120+
const onChange = (newConfig: Partial<InstanceContainerConfigData>) => actions.onPatch(instance.id, newConfig)
128121

129122
const pageLink: BreadcrumbLink = {
130123
name: t('common:container'),
@@ -206,7 +199,7 @@ const InstanceDetailsPage = (props: InstanceDetailsPageProps) => {
206199
config={state.config}
207200
resetableConfig={state.resetableConfig}
208201
onChange={onChange}
209-
onResetSection={onResetSection}
202+
onResetSection={actions.resetSection}
210203
editorOptions={editorState}
211204
fieldErrors={fieldErrors}
212205
configType="instance"
@@ -221,7 +214,7 @@ const InstanceDetailsPage = (props: InstanceDetailsPageProps) => {
221214
config={state.config}
222215
resetableConfig={state.resetableConfig}
223216
onChange={onChange}
224-
onResetSection={onResetSection}
217+
onResetSection={actions.resetSection}
225218
editorOptions={editorState}
226219
fieldErrors={fieldErrors}
227220
configType="instance"
@@ -234,7 +227,7 @@ const InstanceDetailsPage = (props: InstanceDetailsPageProps) => {
234227
config={state.config}
235228
resetableConfig={state.resetableConfig}
236229
onChange={onChange}
237-
onResetSection={onResetSection}
230+
onResetSection={actions.resetSection}
238231
editorOptions={editorState}
239232
fieldErrors={fieldErrors}
240233
configType="instance"

web/crux-ui/src/pages/[teamSlug]/projects/[projectId]/versions/[versionId]/images/[imageId].tsx

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import useEditorState from '@app/components/editor/use-editor-state'
33
import useItemEditorState from '@app/components/editor/use-item-editor-state'
44
import { Layout } from '@app/components/layout'
55
import CommonConfigSection from '@app/components/projects/versions/images/config/common-config-section'
6+
import configToFilters from '@app/components/projects/versions/images/config/config-to-filters'
67
import CraneConfigSection from '@app/components/projects/versions/images/config/crane-config-section'
78
import DagentConfigSection from '@app/components/projects/versions/images/config/dagent-config-section'
89
import EditImageJson from '@app/components/projects/versions/images/edit-image-json'
@@ -47,8 +48,7 @@ import { getCruxFromContext } from '@server/crux-api'
4748
import { NextPageContext } from 'next'
4849
import useTranslation from 'next-translate/useTranslation'
4950
import { useRouter } from 'next/router'
50-
import { useEffect, useRef, useState } from 'react'
51-
import configToFilters from '@app/components/projects/versions/images/config/config-to-filters'
51+
import { useCallback, useEffect, useRef, useState } from 'react'
5252

5353
interface ImageDetailsPageProps {
5454
project: ProjectDetails
@@ -106,15 +106,21 @@ const ImageDetailsPage = (props: ImageDetailsPageProps) => {
106106
setFilters(current => configToFilters(current, config))
107107
}, [config])
108108

109+
const setErrorsForConfig = useCallback(
110+
newConfig => {
111+
const errors = getContainerConfigFieldErrors(newConfig, t)
112+
setFieldErrors(errors)
113+
setJsonError(jsonErrorOf(errors))
114+
},
115+
[t],
116+
)
117+
109118
const onChange = (newConfig: Partial<ContainerConfigData>) => {
110119
setSaveState('saving')
111120

112121
const value = { ...config, ...newConfig }
113122
setConfig(value)
114-
115-
const errors = getContainerConfigFieldErrors(value, t)
116-
setFieldErrors(errors)
117-
setJsonError(jsonErrorOf(errors))
123+
setErrorsForConfig(value)
118124

119125
const newPatch = {
120126
...patch.current,
@@ -137,10 +143,7 @@ const ImageDetailsPage = (props: ImageDetailsPageProps) => {
137143
newConfig[section] = section === 'user' ? -1 : null
138144

139145
setConfig(newConfig)
140-
141-
const errors = getContainerConfigFieldErrors(newConfig, t)
142-
setFieldErrors(errors)
143-
setJsonError(jsonErrorOf(errors))
146+
setErrorsForConfig(newConfig)
144147

145148
versionSock.send(WS_TYPE_PATCH_IMAGE, {
146149
id: image.id,
@@ -153,10 +156,13 @@ const ImageDetailsPage = (props: ImageDetailsPageProps) => {
153156
return
154157
}
155158

156-
setConfig({
159+
const newConfig = {
157160
...config,
158161
...message.config,
159-
})
162+
}
163+
164+
setConfig(newConfig)
165+
setErrorsForConfig(newConfig)
160166
})
161167

162168
const onDelete = async () => {

0 commit comments

Comments
 (0)