@@ -28,7 +28,7 @@ import { addErrorSnackbar, addSnackbar } from "../../utils/snackbar";
2828import { BackendAdminSignInGuard } from "../elements/admin_signin_guard" ;
2929
3030type 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 ;
3232
3333type AppResourceType = { app : string ; resource : string } ;
3434type AppResourceIdType = AppResourceType & { id ?: string } ;
@@ -97,9 +97,12 @@ const InnerAdminEditor: React.FC<AppResourceIdType & AdminEditorPropsType> = Err
9797 const backendAdminClient = Common . Hooks . BackendAdminAPI . useBackendAdminClient ( ) ;
9898 const { data : schemaInfo } = Common . Hooks . BackendAdminAPI . useSchemaQuery ( backendAdminClient , app , resource ) ;
9999
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+ } ) ;
103106 const selectedLanguage = editorState . tab === 0 ? "ko" : "en" ;
104107 const notSelectedLanguage = editorState . tab === 0 ? "en" : "ko" ;
105108
@@ -140,14 +143,18 @@ const InnerAdminEditor: React.FC<AppResourceIdType & AdminEditorPropsType> = Err
140143 const onSubmitButtonClick : React . MouseEventHandler < HTMLButtonElement > = ( ) =>
141144 formRef . current && formRef . current . submit ( ) ;
142145
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 ) => {
147154 addSnackbar ( id ? "저장했습니다." : "페이지를 생성했습니다." , "success" ) ;
148- afterSubmit ?.( data , event ) ;
155+ afterSubmit ?.( newFormData , event ) ;
149156
150- if ( ! id && data . formData ?. id ) navigate ( `/${ app } /${ resource } /${ data . formData ? .id } ` ) ;
157+ if ( ! id && newFormData . id ) navigate ( `/${ app } /${ resource } /${ newFormData . id } ` ) ;
151158 } ,
152159 onError : addErrorSnackbar ,
153160 } ) ;
0 commit comments