Skip to content

Commit a271364

Browse files
authored
Make see fields generate draft (#810)
* Making a hook to share the generate functionality * Allowing a presave function to be called * Wiring up refresh button so it can handle generating the draft * Updating to use the new mutate context * Getting captures using the next context * Better way to check if the call worked * No longer need to pass disabled to refresh Better handling of errors for refresh button * Adding a hook to scroll elements into view * Having the general error scroll into view * Having validation errors scroll into view * Cleaning up logging * Adding in disabled so it can be disabled while the form is active * POST MERGE - fixing imports * Cleaning up more of the post generate mutate being passed around * PR : Commenting * PR : Commenting * Switching back to null so things do not fail silently * PR - cleaning up code a bit * This did nothing - reverting the changes * Allowing for options to be passed * PR Cleaning up comments and code
1 parent 8c10f80 commit a271364

20 files changed

+948
-726
lines changed

src/components/capture/Create/index.tsx

+43-40
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import EntitySaveButton from 'components/shared/Entity/Actions/SaveButton';
1111
import EntityTestButton from 'components/shared/Entity/Actions/TestButton';
1212
import EntityCreate from 'components/shared/Entity/Create';
1313
import EntityToolbar from 'components/shared/Entity/Header';
14+
import { MutateDraftSpecProvider } from 'components/shared/Entity/MutateDraftSpecContext';
1415
import useConnectorWithTagDetail from 'hooks/useConnectorWithTagDetail';
1516
import useDraftSpecs from 'hooks/useDraftSpecs';
1617
import usePageTitle from 'hooks/usePageTitle';
@@ -86,46 +87,48 @@ function CaptureCreate() {
8687
<DetailsFormHydrator>
8788
<EndpointConfigHydrator>
8889
<ResourceConfigHydrator>
89-
<EntityCreate
90-
entityType={entityType}
91-
draftSpecMetadata={draftSpecsMetadata}
92-
toolbar={
93-
<EntityToolbar
94-
waitTimes={{ generate: MAX_DISCOVER_TIME }}
95-
GenerateButton={
96-
<CaptureGenerateButton
97-
entityType={entityType}
98-
disabled={!hasConnectors}
99-
postGenerateMutate={updateDraftSpecs}
100-
createWorkflowMetadata={{
101-
initiateDiscovery,
102-
setInitiateDiscovery,
103-
}}
104-
/>
105-
}
106-
TestButton={
107-
<EntityTestButton
108-
disabled={!hasConnectors}
109-
logEvent={CustomEvents.CAPTURE_TEST}
110-
/>
111-
}
112-
SaveButton={
113-
<EntitySaveButton
114-
disabled={!draftId}
115-
taskNames={tasks}
116-
logEvent={CustomEvents.CAPTURE_CREATE}
117-
/>
118-
}
119-
/>
120-
}
121-
RediscoverButton={
122-
<RediscoverButton
123-
entityType={entityType}
124-
disabled={!hasConnectors}
125-
postGenerateMutate={updateDraftSpecs}
126-
/>
127-
}
128-
/>
90+
<MutateDraftSpecProvider value={updateDraftSpecs}>
91+
<EntityCreate
92+
entityType={entityType}
93+
draftSpecMetadata={draftSpecsMetadata}
94+
toolbar={
95+
<EntityToolbar
96+
waitTimes={{ generate: MAX_DISCOVER_TIME }}
97+
GenerateButton={
98+
<CaptureGenerateButton
99+
entityType={entityType}
100+
disabled={!hasConnectors}
101+
createWorkflowMetadata={{
102+
initiateDiscovery,
103+
setInitiateDiscovery,
104+
}}
105+
/>
106+
}
107+
TestButton={
108+
<EntityTestButton
109+
disabled={!hasConnectors}
110+
logEvent={CustomEvents.CAPTURE_TEST}
111+
/>
112+
}
113+
SaveButton={
114+
<EntitySaveButton
115+
disabled={!draftId}
116+
taskNames={tasks}
117+
logEvent={
118+
CustomEvents.CAPTURE_CREATE
119+
}
120+
/>
121+
}
122+
/>
123+
}
124+
RediscoverButton={
125+
<RediscoverButton
126+
entityType={entityType}
127+
disabled={!hasConnectors}
128+
/>
129+
}
130+
/>
131+
</MutateDraftSpecProvider>
129132
</ResourceConfigHydrator>
130133
</EndpointConfigHydrator>
131134
</DetailsFormHydrator>

src/components/capture/Edit.tsx

+45-40
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import EntityTestButton from 'components/shared/Entity/Actions/TestButton';
1111
import EntityEdit from 'components/shared/Entity/Edit';
1212
import DraftInitializer from 'components/shared/Entity/Edit/DraftInitializer';
1313
import EntityToolbar from 'components/shared/Entity/Header';
14+
import { MutateDraftSpecProvider } from 'components/shared/Entity/MutateDraftSpecContext';
1415
import useGlobalSearchParams, {
1516
GlobalSearchParams,
1617
} from 'hooks/searchParams/useGlobalSearchParams';
@@ -68,46 +69,50 @@ function CaptureEdit() {
6869
<DetailsFormHydrator>
6970
<EndpointConfigHydrator>
7071
<ResourceConfigHydrator>
71-
<EntityEdit
72-
title="routeTitle.captureEdit"
73-
entityType={entityType}
74-
readOnly={{ detailsForm: true }}
75-
draftSpecMetadata={draftSpecsMetadata}
76-
toolbar={
77-
<EntityToolbar
78-
waitTimes={{ generate: MAX_DISCOVER_TIME }}
79-
GenerateButton={
80-
<CaptureGenerateButton
81-
entityType={entityType}
82-
disabled={!hasConnectors}
83-
postGenerateMutate={
84-
updateDraftSpecs
85-
}
86-
/>
87-
}
88-
TestButton={
89-
<EntityTestButton
90-
disabled={!hasConnectors}
91-
logEvent={CustomEvents.CAPTURE_TEST}
92-
/>
93-
}
94-
SaveButton={
95-
<EntitySaveButton
96-
disabled={!draftId}
97-
taskNames={taskNames}
98-
logEvent={CustomEvents.CAPTURE_EDIT}
99-
/>
100-
}
101-
/>
102-
}
103-
RediscoverButton={
104-
<RediscoverButton
105-
entityType={entityType}
106-
disabled={!hasConnectors}
107-
postGenerateMutate={updateDraftSpecs}
108-
/>
109-
}
110-
/>
72+
<MutateDraftSpecProvider value={updateDraftSpecs}>
73+
<EntityEdit
74+
title="routeTitle.captureEdit"
75+
entityType={entityType}
76+
readOnly={{ detailsForm: true }}
77+
draftSpecMetadata={draftSpecsMetadata}
78+
toolbar={
79+
<EntityToolbar
80+
waitTimes={{
81+
generate: MAX_DISCOVER_TIME,
82+
}}
83+
GenerateButton={
84+
<CaptureGenerateButton
85+
entityType={entityType}
86+
disabled={!hasConnectors}
87+
/>
88+
}
89+
TestButton={
90+
<EntityTestButton
91+
disabled={!hasConnectors}
92+
logEvent={
93+
CustomEvents.CAPTURE_TEST
94+
}
95+
/>
96+
}
97+
SaveButton={
98+
<EntitySaveButton
99+
disabled={!draftId}
100+
taskNames={taskNames}
101+
logEvent={
102+
CustomEvents.CAPTURE_EDIT
103+
}
104+
/>
105+
}
106+
/>
107+
}
108+
RediscoverButton={
109+
<RediscoverButton
110+
entityType={entityType}
111+
disabled={!hasConnectors}
112+
/>
113+
}
114+
/>
115+
</MutateDraftSpecProvider>
111116
</ResourceConfigHydrator>
112117
</EndpointConfigHydrator>
113118
</DetailsFormHydrator>

src/components/capture/GenerateButton.tsx

-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import useDiscoverCapture from './useDiscoverCapture';
1616
interface Props {
1717
entityType: Entity;
1818
disabled: boolean;
19-
postGenerateMutate: Function;
2019
createWorkflowMetadata?: {
2120
initiateDiscovery: boolean;
2221
setInitiateDiscovery: Dispatch<SetStateAction<boolean>>;
@@ -26,14 +25,11 @@ interface Props {
2625
function CaptureGenerateButton({
2726
entityType,
2827
disabled,
29-
postGenerateMutate,
3028
createWorkflowMetadata,
3129
}: Props) {
3230
const rediscoveryRequired = useResourceConfig_rediscoveryRequired();
33-
3431
const { generateCatalog, isSaving, formActive } = useDiscoverCapture(
3532
entityType,
36-
postGenerateMutate,
3733
{
3834
initiateDiscovery: createWorkflowMetadata?.initiateDiscovery,
3935
initiateRediscovery: rediscoveryRequired,

src/components/capture/RediscoverButton.tsx

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ import { Entity } from 'types';
88
interface Props {
99
entityType: Entity;
1010
disabled: boolean;
11-
postGenerateMutate: Function;
1211
}
1312

14-
function RediscoverButton({ entityType, disabled, postGenerateMutate }: Props) {
13+
function RediscoverButton({ entityType, disabled }: Props) {
1514
const { generateCatalog, isSaving, formActive } = useDiscoverCapture(
1615
entityType,
17-
postGenerateMutate,
1816
{ initiateRediscovery: true }
1917
);
2018

src/components/capture/useCaptureDraftUpdate.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
useEditorStore_setId,
99
} from 'components/editor/Store/hooks';
1010
import useEntityWorkflowHelpers from 'components/shared/Entity/hooks/useEntityWorkflowHelpers';
11+
import { useMutateDraftSpec } from 'components/shared/Entity/MutateDraftSpecContext';
1112
import { useEntityWorkflow_Editing } from 'context/Workflow';
1213
import useEntityNameSuffix from 'hooks/useEntityNameSuffix';
1314
import { useCallback } from 'react';
@@ -21,10 +22,11 @@ import {
2122
import { useResourceConfig_resourceConfig } from 'stores/ResourceConfig/hooks';
2223
import { modifyExistingCaptureDraftSpec } from 'utils/workflow-utils';
2324

24-
function useDiscoverDraftUpdate(
25-
postGenerateMutate: Function,
26-
options?: { initiateRediscovery?: boolean; initiateDiscovery?: boolean }
27-
) {
25+
function useDiscoverDraftUpdate(options?: {
26+
initiateRediscovery?: boolean;
27+
initiateDiscovery?: boolean;
28+
}) {
29+
const postGenerateMutate = useMutateDraftSpec();
2830
const isEdit = useEntityWorkflow_Editing();
2931
const { callFailed } = useEntityWorkflowHelpers();
3032

src/components/capture/useDiscoverCapture.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,11 @@ import useDiscoverStartDiscovery from './useDiscoverStartDiscovery';
2727

2828
function useDiscoverCapture(
2929
entityType: Entity,
30-
postGenerateMutate: Function,
3130
options?: { initiateRediscovery?: boolean; initiateDiscovery?: boolean }
3231
) {
33-
const draftUpdate = useDiscoverDraftUpdate(postGenerateMutate, options);
32+
const draftUpdate = useDiscoverDraftUpdate(options);
3433
const configEncrypt = useDiscoverConfigEncrypt();
35-
const startDiscovery = useDiscoverStartDiscovery(
36-
entityType,
37-
postGenerateMutate
38-
);
34+
const startDiscovery = useDiscoverStartDiscovery(entityType);
3935

4036
const isEdit = useEntityWorkflow_Editing();
4137

src/components/capture/useDiscoverStartDiscovery.ts

+3-8
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,9 @@ import { useFormStateStore_setFormState } from 'stores/FormState/hooks';
1414
import { Entity } from 'types';
1515
import useDiscoverStartSubscription from './useDiscoverStartSubscription';
1616

17-
function useDiscoverStartDiscovery(
18-
entityType: Entity,
19-
postGenerateMutate: Function
20-
) {
21-
const createDiscoversSubscription = useDiscoverStartSubscription(
22-
entityType,
23-
postGenerateMutate
24-
);
17+
function useDiscoverStartDiscovery(entityType: Entity) {
18+
const createDiscoversSubscription =
19+
useDiscoverStartSubscription(entityType);
2520
const { callFailed } = useEntityWorkflowHelpers();
2621

2722
const persistedDraftId = useEditorStore_persistedDraftId();

src/components/capture/useDiscoverStartSubscription.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
useEditorStore_setId,
44
} from 'components/editor/Store/hooks';
55
import useEntityWorkflowHelpers from 'components/shared/Entity/hooks/useEntityWorkflowHelpers';
6+
import { useMutateDraftSpec } from 'components/shared/Entity/MutateDraftSpecContext';
67
import { useClient } from 'hooks/supabase-swr';
78
import useStoreDiscoveredCaptures from 'hooks/useStoreDiscoveredCaptures';
89
import { useCallback } from 'react';
@@ -33,10 +34,9 @@ const trackEvent = (payload: any) => {
3334
});
3435
};
3536

36-
function useDiscoverStartSubscription(
37-
entityType: Entity,
38-
postGenerateMutate: Function
39-
) {
37+
function useDiscoverStartSubscription(entityType: Entity) {
38+
const postGenerateMutate = useMutateDraftSpec();
39+
4040
const supabaseClient = useClient();
4141

4242
const { callFailed } = useEntityWorkflowHelpers();
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,56 @@
1-
import { useEditorStore_id } from 'components/editor/Store/hooks';
2-
import EntityCreateSave from 'components/shared/Entity/Actions/Save';
1+
import { Button } from '@mui/material';
2+
import useGenerateCatalog from 'components/materialization/useGenerateCatalog';
3+
import useSave from 'components/shared/Entity/Actions/useSave';
34
import useEntityWorkflowHelpers from 'components/shared/Entity/hooks/useEntityWorkflowHelpers';
5+
import { useMutateDraftSpec } from 'components/shared/Entity/MutateDraftSpecContext';
6+
import { useState } from 'react';
7+
import { FormattedMessage } from 'react-intl';
48
import { CustomEvents } from 'services/logrocket';
59

610
interface Props {
7-
disabled: boolean;
8-
logEvent: CustomEvents.MATERIALIZATION_TEST;
911
buttonLabelId: string;
12+
logEvent: CustomEvents.MATERIALIZATION_TEST;
13+
disabled?: boolean;
1014
}
1115

1216
function RefreshButton({ disabled, logEvent, buttonLabelId }: Props) {
1317
const { callFailed } = useEntityWorkflowHelpers();
1418

15-
// Draft Editor Store
16-
const draftId = useEditorStore_id();
19+
const [updating, setUpdating] = useState(false);
20+
21+
const generateCatalog = useGenerateCatalog();
22+
const mutateDraftSpec = useMutateDraftSpec();
23+
const saveCatalog = useSave(logEvent, callFailed, true, true);
1724

1825
return (
19-
<EntityCreateSave
20-
dryRun
21-
disabled={disabled || !draftId}
22-
onFailure={callFailed}
23-
logEvent={logEvent}
24-
buttonLabelId={buttonLabelId}
25-
forceLogsClosed
26-
/>
26+
<Button
27+
disabled={Boolean(updating || disabled)}
28+
onClick={async () => {
29+
setUpdating(true);
30+
31+
let evaluatedDraftId;
32+
try {
33+
evaluatedDraftId = await generateCatalog(mutateDraftSpec);
34+
} catch (_error: unknown) {
35+
setUpdating(false);
36+
}
37+
38+
// Make sure we have a draft id so we know the generate worked
39+
// if this is not returned then the function itself handled showing an error
40+
if (evaluatedDraftId) {
41+
try {
42+
await saveCatalog(evaluatedDraftId);
43+
} catch (_error: unknown) {
44+
setUpdating(false);
45+
}
46+
}
47+
48+
// I do not think this is truly needed but being safe so the user is not stuck with a disabled button
49+
setUpdating(false);
50+
}}
51+
>
52+
<FormattedMessage id={buttonLabelId} />
53+
</Button>
2754
);
2855
}
2956
export default RefreshButton;

src/components/editor/Bindings/FieldSelection/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,9 @@ function FieldSelectionViewer({ collectionName }: Props) {
295295
{/* The shared test and save button component is disabled when the form is active.
296296
No additional disabled conditions are needed. */}
297297
<RefreshButton
298-
disabled={false}
299-
logEvent={CustomEvents.MATERIALIZATION_TEST}
300298
buttonLabelId="fieldSelection.cta.populateTable"
299+
disabled={formActive}
300+
logEvent={CustomEvents.MATERIALIZATION_TEST}
301301
/>
302302
</Box>
303303
</Stack>

0 commit comments

Comments
 (0)