Skip to content

Commit db79bfa

Browse files
authored
Stay on current tab when building feature set (#1247)
* stay on current preview tab * linting * react deps
1 parent ac2ee7d commit db79bfa

4 files changed

Lines changed: 39 additions & 29 deletions

File tree

ui/src/components/tabs.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,20 @@ export type TabsProps = {
2626
};
2727

2828
export function Tabs(props: TabsProps) {
29-
const [currentTab, setCurrentTab] = useState(props?.configs?.[0]?.id);
29+
const [currentTab, setCurrentTab] = useState(
30+
props.currentTab ?? props?.configs?.[0]?.id
31+
);
3032

3133
const onChange = (event: React.SyntheticEvent, newValue: string) => {
3234
(props.setCurrentTab ?? setCurrentTab)(newValue);
3335
};
3436

3537
useEffect(() => {
3638
// If the data feature for currentTab was deleted, reset to the first in the list
37-
if (!props.configs.some((c) => c.id === currentTab)) {
38-
setCurrentTab(props?.configs?.[0]?.id);
39+
if (!props.configs.some((c) => c.id === (props.currentTab ?? currentTab))) {
40+
(props.setCurrentTab ?? setCurrentTab)(props?.configs?.[0]?.id);
3941
}
40-
}, [props.configs, currentTab]);
42+
}, [props.configs, currentTab, props.currentTab, props.setCurrentTab]);
4143

4244
return (
4345
<TabContext

ui/src/featureSet/featureSet.tsx

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,14 @@ export type PreviewTabData = {
299299
};
300300

301301
function Preview() {
302-
const previewContext = useFeatureSetPreviewContext();
302+
const {
303+
previewData,
304+
updatePreviewData,
305+
updating,
306+
setUpdating,
307+
currentTab,
308+
setCurrentTab,
309+
} = useFeatureSetPreviewContext();
303310
const featureSet = useFeatureSet();
304311
const underlaySource = useUnderlaySource();
305312
const underlay = useUnderlay();
@@ -324,22 +331,20 @@ function Preview() {
324331
newPreviewOccurrences.sort((a, b) => a.id.localeCompare(b.id));
325332
let previewOccurrencesToLoad: PreviewOccurrence[] = [];
326333
let updateExisting = false;
327-
if (newPreviewOccurrences.length > previewContext.previewData?.length) {
334+
if (newPreviewOccurrences.length > previewData?.length) {
328335
previewOccurrencesToLoad = newPreviewOccurrences.filter(
329-
(npo) => !previewContext.previewData.some((po) => po.name === npo.id)
336+
(npo) => !previewData.some((po) => po.name === npo.id)
330337
);
331-
} else if (
332-
newPreviewOccurrences.length === previewContext.previewData?.length
333-
) {
338+
} else if (newPreviewOccurrences.length === previewData?.length) {
334339
const updatedPreviewOccurrences = newPreviewOccurrences.filter(
335340
(npo, n) =>
336341
JSON.stringify(npo.sourceCriteria) !==
337-
JSON.stringify(previewContext.previewData[n].sourceCriteria)
342+
JSON.stringify(previewData[n].sourceCriteria)
338343
);
339344
if (updatedPreviewOccurrences.length > 0) {
340345
previewOccurrencesToLoad = updatedPreviewOccurrences;
341-
previewContext.updatePreviewData(
342-
previewContext.previewData.map((pd) => {
346+
updatePreviewData(
347+
previewData.map((pd) => {
343348
const updatedIndex = updatedPreviewOccurrences.findIndex(
344349
(upo) => upo.id === pd.name
345350
);
@@ -356,13 +361,11 @@ function Preview() {
356361
);
357362
updateExisting = true;
358363
}
359-
} else if (
360-
newPreviewOccurrences.length < previewContext.previewData?.length
361-
) {
362-
const newPreviewData = previewContext.previewData.filter((pd) =>
364+
} else if (newPreviewOccurrences.length < previewData?.length) {
365+
const newPreviewData = previewData.filter((pd) =>
363366
newPreviewOccurrences.some((npo) => npo.id === pd.name)
364367
);
365-
previewContext.updatePreviewData(newPreviewData);
368+
updatePreviewData(newPreviewData);
366369
}
367370
if (previewOccurrencesToLoad?.length > 0) {
368371
loadNewPreviewData(
@@ -387,7 +390,7 @@ function Preview() {
387390
allOccurrences: PreviewOccurrence[],
388391
updateExisting?: boolean
389392
) => {
390-
previewContext.setUpdating(true);
393+
setUpdating(true);
391394
const newOccurrenceData = await Promise.all(
392395
newOccurrences.map(async (params) => {
393396
const res = await underlaySource.exportPreview(
@@ -420,14 +423,14 @@ function Preview() {
420423
})
421424
);
422425
if (!updateExisting) {
423-
const updatedPreviewData = [
424-
...previewContext.previewData,
425-
...newOccurrenceData,
426-
];
426+
const updatedPreviewData = [...previewData, ...newOccurrenceData];
427427
updatedPreviewData.sort((a, b) => a.name.localeCompare(b.name));
428-
previewContext.updatePreviewData(updatedPreviewData);
428+
updatePreviewData(updatedPreviewData);
429+
if (!currentTab) {
430+
setCurrentTab(updatedPreviewData[0].name);
431+
}
429432
}
430-
previewContext.setUpdating(false);
433+
setUpdating(false);
431434
allOccurrences.sort((a, b) => a.id.localeCompare(b.id));
432435
setPreviewOccurrences(allOccurrences);
433436
};
@@ -438,14 +441,12 @@ function Preview() {
438441
featureSet.predefinedCriteria.length > 0 ? (
439442
<Loading
440443
status={{}}
441-
isLoading={
442-
occurrenceFiltersState.isLoading || previewContext.updating
443-
}
444+
isLoading={occurrenceFiltersState.isLoading || updating}
444445
showLoadingMessage={true}
445446
>
446447
<Tabs
447448
configs={
448-
(previewContext.previewData ?? []).map((data) => ({
449+
(previewData ?? []).map((data) => ({
449450
id: data.name,
450451
title: data.name,
451452
render: () => {
@@ -472,6 +473,8 @@ function Preview() {
472473
},
473474
})) ?? []
474475
}
476+
currentTab={currentTab}
477+
setCurrentTab={setCurrentTab}
475478
/>
476479
</Loading>
477480
) : (

ui/src/featureSet/featureSetContext.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ type FeatureSetPreviewContextData = {
3434
updatePreviewData: (state: PreviewTabData[]) => void;
3535
updating: boolean;
3636
setUpdating: (state: boolean) => void;
37+
currentTab: string;
38+
setCurrentTab: (state: string) => void;
3739
};
3840

3941
export const FeatureSetPreviewContext =

ui/src/featureSet/featureSetRoot.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default function FeatureSetRoot() {
1919
const [message, setMessage] = useState("");
2020
const [previewData, setPreviewData] = useState<PreviewTabData[]>([]);
2121
const [updatingPreview, setUpdatingPreview] = useState<boolean>(false);
22+
const [currentTab, setCurrentTab] = useState<string>("");
2223

2324
const status = useNewFeatureSetContext((message: string) => {
2425
setMessage(message);
@@ -45,6 +46,8 @@ export default function FeatureSetRoot() {
4546
updatePreviewData: setPreviewData,
4647
updating: updatingPreview,
4748
setUpdating: setUpdatingPreview,
49+
currentTab,
50+
setCurrentTab,
4851
}}
4952
>
5053
<Outlet />

0 commit comments

Comments
 (0)