@@ -22,6 +22,7 @@ import { QueryModel } from './QueryModel';
2222
2323import { DetailPanel , DetailPanelWithModel } from './DetailPanel' ;
2424import { EDIT_METHOD } from '../../internal/constants' ;
25+ import { useRouteLeave } from '../../internal/util/RouteLeave' ;
2526
2627export interface EditableDetailPanelProps {
2728 appEditable ?: boolean ;
@@ -71,6 +72,7 @@ export const EditableDetailPanel: FC<EditableDetailPanelProps> = props => {
7172 } = props ;
7273
7374 const { api } = useAppContext ( ) ;
75+ const [ _ , setIsDirty ] = useRouteLeave ( ) ;
7476 const [ canSubmit , setCanSubmit ] = useState < boolean > ( false ) ;
7577 const [ editing , setEditing ] = useState < boolean > ( false ) ;
7678 const [ error , setError ] = useState < string > ( undefined ) ;
@@ -90,10 +92,11 @@ export const EditableDetailPanel: FC<EditableDetailPanelProps> = props => {
9092 const toggleEditing = useCallback ( ( ) : void => {
9193 const updated = ! editing ;
9294 setEditing ( updated ) ;
95+ setIsDirty ( false ) ;
9396 setWarning ( undefined ) ;
9497 setError ( undefined ) ;
9598 onEditToggle ?.( updated ) ;
96- } , [ editing , onEditToggle ] ) ;
99+ } , [ editing , onEditToggle , setIsDirty ] ) ;
97100
98101 const disableSubmitButton = useCallback ( ( ) : void => {
99102 setCanSubmit ( false ) ;
@@ -103,9 +106,13 @@ export const EditableDetailPanel: FC<EditableDetailPanelProps> = props => {
103106 setCanSubmit ( true ) ;
104107 } , [ ] ) ;
105108
106- const handleFormChange = useCallback ( ( ) : void => {
107- setWarning ( undefined ) ;
108- } , [ ] ) ;
109+ const handleFormChange = useCallback (
110+ ( _ : never , isChanged : boolean ) : void => {
111+ setWarning ( undefined ) ;
112+ if ( isChanged ) setIsDirty ( true ) ;
113+ } ,
114+ [ setIsDirty ]
115+ ) ;
109116
110117 const fileInputRenderer = useCallback ( ( col : QueryColumn , data : any ) : ReactNode => {
111118 return < FileInput formsy initialValue = { data } name = { col . fieldKey } queryColumn = { col } showLabel = { false } /> ;
@@ -121,6 +128,7 @@ export const EditableDetailPanel: FC<EditableDetailPanelProps> = props => {
121128 setCanSubmit ( false ) ;
122129 setError ( undefined ) ;
123130 setWarning ( 'No changes detected. Please update the form and click save.' ) ;
131+ setIsDirty ( false ) ;
124132 return ;
125133 }
126134
@@ -146,6 +154,7 @@ export const EditableDetailPanel: FC<EditableDetailPanelProps> = props => {
146154 auditUserComment : comment ,
147155 } ) ;
148156
157+ setIsDirty ( false ) ;
149158 setEditing ( false ) ;
150159 onUpdate ?.( ) ;
151160 onEditToggle ?.( false ) ;
@@ -154,7 +163,7 @@ export const EditableDetailPanel: FC<EditableDetailPanelProps> = props => {
154163 setWarning ( undefined ) ;
155164 }
156165 } ,
157- [ model , onBeforeUpdate , api . query , containerPath , comment , onUpdate , onEditToggle ]
166+ [ model , onBeforeUpdate , api . query , containerPath , comment , onUpdate , onEditToggle , setIsDirty ]
158167 ) ;
159168
160169 const isEditable = ! model . isLoading && model . hasRows && ( model . queryInfo ?. isAppEditable ( ) || appEditable ) ;
0 commit comments