@@ -28,7 +28,7 @@ import { addErrorSnackbar, addSnackbar } from "../../utils/snackbar";
28
28
import { BackendAdminSignInGuard } from "../elements/admin_signin_guard" ;
29
29
30
30
type EditorFormDataEventType = IChangeEvent < Record < string , string > , RJSFSchema , { [ k in string ] : unknown } > ;
31
- type onSubmitType = ( data : EditorFormDataEventType , event : React . FormEvent < unknown > ) => void ;
31
+ type onSubmitType = ( data : Record < string , string > , event : React . FormEvent < unknown > ) => void ;
32
32
33
33
type AppResourceType = { app : string ; resource : string } ;
34
34
type AppResourceIdType = AppResourceType & { id ?: string } ;
@@ -97,9 +97,12 @@ const InnerAdminEditor: React.FC<AppResourceIdType & AdminEditorPropsType> = Err
97
97
const backendAdminClient = Common . Hooks . BackendAdminAPI . useBackendAdminClient ( ) ;
98
98
const { data : schemaInfo } = Common . Hooks . BackendAdminAPI . useSchemaQuery ( backendAdminClient , app , resource ) ;
99
99
100
- const setTab = ( _ : React . SyntheticEvent , selectedTab : number ) =>
101
- setEditorState ( ( ps ) => ( { ...ps , tab : selectedTab } ) ) ;
102
- const setFormDataState = ( formData ?: Record < string , string > ) => setEditorState ( ( ps ) => ( { ...ps , formData } ) ) ;
100
+ const setTab = ( _ : React . SyntheticEvent , tab : number ) => setEditorState ( ( ps ) => ( { ...ps , tab } ) ) ;
101
+ const setFormDataState = ( newFormData ?: Record < string , string > ) =>
102
+ setEditorState ( ( ps ) => {
103
+ const formData = newFormData ? { ...ps . formData , ...newFormData } : ps . formData ;
104
+ return { ...ps , formData } ;
105
+ } ) ;
103
106
const selectedLanguage = editorState . tab === 0 ? "ko" : "en" ;
104
107
const notSelectedLanguage = editorState . tab === 0 ? "en" : "ko" ;
105
108
@@ -140,14 +143,18 @@ const InnerAdminEditor: React.FC<AppResourceIdType & AdminEditorPropsType> = Err
140
143
const onSubmitButtonClick : React . MouseEventHandler < HTMLButtonElement > = ( ) =>
141
144
formRef . current && formRef . current . submit ( ) ;
142
145
143
- const onSubmitFunc : onSubmitType = ( data , event ) => {
144
- beforeSubmit ?.( data , event ) ;
145
- submitMutation . mutate ( data . formData || { } , {
146
- onSuccess : ( ) => {
146
+ const onSubmitFunc = ( data : EditorFormDataEventType , event : React . FormEvent ) => {
147
+ // react-jsonschema-form에서 주는 formData에는 translation_fields로 필터링된 필드가 빠져있어,
148
+ // 사용자가 특정 탭에서 수정한 후 다른 탭으로 이동해서 수정하게 되면 이전 탭의 수정 내용이 사라지는 문제가 발생함.
149
+ // 따라서, onChange로 항상 값이 추적되는 editorState.formData를 가장 우선적으로 사용함.
150
+ const newFormData = editorState . formData || data . formData || { } ;
151
+ beforeSubmit ?.( newFormData , event ) ;
152
+ submitMutation . mutate ( newFormData , {
153
+ onSuccess : ( newFormData ) => {
147
154
addSnackbar ( id ? "저장했습니다." : "페이지를 생성했습니다." , "success" ) ;
148
- afterSubmit ?.( data , event ) ;
155
+ afterSubmit ?.( newFormData , event ) ;
149
156
150
- if ( ! id && data . formData ?. id ) navigate ( `/${ app } /${ resource } /${ data . formData ? .id } ` ) ;
157
+ if ( ! id && newFormData . id ) navigate ( `/${ app } /${ resource } /${ newFormData . id } ` ) ;
151
158
} ,
152
159
onError : addErrorSnackbar ,
153
160
} ) ;
0 commit comments