Skip to content

Commit 40fe6ae

Browse files
fix: bypass unsaved changes prompt when clicking cancel
1 parent 7055bd8 commit 40fe6ae

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

x-pack/platform/plugins/shared/onechat/public/application/components/agents/edit/agent_form.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { FormProvider, useForm } from 'react-hook-form';
3535

3636
import { css } from '@emotion/react';
3737
import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt';
38+
import { defer } from 'lodash';
3839
import { useAgentEdit } from '../../../hooks/agents/use_agent_edit';
3940
import { useKibana } from '../../../hooks/use_kibana';
4041
import { useNavigation } from '../../../hooks/use_navigation';
@@ -125,7 +126,7 @@ export const AgentForm: React.FC<AgentFormProps> = ({ editingAgentId, onDelete }
125126
mode: 'onBlur',
126127
resolver: zodResolver(agentFormSchema),
127128
});
128-
const { control, handleSubmit, reset, formState, watch } = formMethods;
129+
const { control, handleSubmit, reset, formState, watch, getValues } = formMethods;
129130
const { errors, isDirty } = formState;
130131
const hasErrors = Object.keys(errors).length > 0;
131132

@@ -143,6 +144,12 @@ export const AgentForm: React.FC<AgentFormProps> = ({ editingAgentId, onDelete }
143144
}
144145
}, [agentState, isLoading, reset]);
145146

147+
const handleCancel = useCallback(() => {
148+
// Bypass unsaved changes prompt
149+
reset(getValues());
150+
defer(() => navigateToOnechatUrl(appPaths.agents.list));
151+
}, [navigateToOnechatUrl, reset, getValues]);
152+
146153
const handleSave = useCallback(
147154
async (
148155
data: AgentFormData,
@@ -512,12 +519,7 @@ export const AgentForm: React.FC<AgentFormProps> = ({ editingAgentId, onDelete }
512519
>
513520
<EuiFlexGroup gutterSize="s" justifyContent="flexEnd">
514521
<EuiFlexItem grow={false}>
515-
<EuiButtonEmpty
516-
size="s"
517-
iconType="cross"
518-
color="text"
519-
onClick={() => navigateToOnechatUrl(appPaths.agents.list)}
520-
>
522+
<EuiButtonEmpty size="s" iconType="cross" color="text" onClick={handleCancel}>
521523
{i18n.translate('xpack.onechat.agents.cancelButtonLabel', {
522524
defaultMessage: 'Cancel',
523525
})}

x-pack/platform/plugins/shared/onechat/public/application/components/tools/tool.tsx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@ import type { ToolDefinitionWithSchema } from '@kbn/onechat-common';
2525
import { isEsqlTool, isIndexSearchTool } from '@kbn/onechat-common/tools';
2626
import { ToolType } from '@kbn/onechat-common/tools/definition';
2727
import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template';
28+
import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt';
29+
import { defer } from 'lodash';
2830
import React, { useCallback, useEffect, useMemo, useState } from 'react';
2931
import { FormProvider } from 'react-hook-form';
30-
import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt';
3132
import type {
3233
CreateToolPayload,
3334
CreateToolResponse,
3435
UpdateToolPayload,
3536
UpdateToolResponse,
3637
} from '../../../../common/http_api/tools';
3738
import { useToolForm } from '../../hooks/tools/use_tool_form';
39+
import { useKibana } from '../../hooks/use_kibana';
3840
import { useNavigation } from '../../hooks/use_navigation';
3941
import { useQueryState } from '../../hooks/use_query_state';
4042
import { appPaths } from '../../utils/app_paths';
@@ -55,7 +57,6 @@ import { ToolTestFlyout } from './execute/test_tools';
5557
import { ToolEditContextMenu } from './form/components/tool_edit_context_menu';
5658
import { ToolForm, ToolFormMode } from './form/tool_form';
5759
import type { ToolFormData } from './form/types/tool_form_types';
58-
import { useKibana } from '../../hooks/use_kibana';
5960

6061
const BUTTON_IDS = {
6162
SAVE: 'save',
@@ -108,12 +109,17 @@ export const Tool: React.FC<ToolProps> = ({ mode, tool, isLoading, isSubmitting,
108109
}, [urlToolType]);
109110

110111
const form = useToolForm(tool, initialToolType);
111-
const { reset, formState, watch, handleSubmit } = form;
112+
const { reset, formState, watch, handleSubmit, getValues } = form;
112113
const { errors, isDirty } = formState;
113114
const [showTestFlyout, setShowTestFlyout] = useState(false);
114115
const [submittingButtonId, setSubmittingButtonId] = useState<string | undefined>();
115116
const { services } = useKibana();
116-
const { application, overlays, http, appParams } = services;
117+
const {
118+
application: { navigateToUrl },
119+
overlays: { openConfirm },
120+
http,
121+
appParams: { history },
122+
} = services;
117123

118124
const currentToolId = watch('toolId');
119125

@@ -126,8 +132,10 @@ export const Tool: React.FC<ToolProps> = ({ mode, tool, isLoading, isSubmitting,
126132
}, [openTestFlyoutParam, currentToolId, showTestFlyout, setOpenTestFlyoutParam]);
127133

128134
const handleCancel = useCallback(() => {
129-
navigateToOnechatUrl(appPaths.tools.list);
130-
}, [navigateToOnechatUrl]);
135+
// Bypass unsaved changes prompt
136+
reset(getValues());
137+
defer(() => navigateToOnechatUrl(appPaths.tools.list));
138+
}, [navigateToOnechatUrl, reset, getValues]);
131139

132140
const handleSave = useCallback(
133141
async (
@@ -205,10 +213,10 @@ export const Tool: React.FC<ToolProps> = ({ mode, tool, isLoading, isSubmitting,
205213
const isViewMode = mode === ToolFormMode.View;
206214
useUnsavedChangesPrompt({
207215
hasUnsavedChanges: !isViewMode && isDirty,
208-
history: appParams.history,
216+
history,
209217
http,
210-
navigateToUrl: application.navigateToUrl,
211-
openConfirm: overlays.openConfirm,
218+
navigateToUrl,
219+
openConfirm,
212220
});
213221
const hasErrors = Object.keys(errors).length > 0;
214222

0 commit comments

Comments
 (0)