Skip to content

Commit fab5dc3

Browse files
committed
adds layoutsets to appData
1 parent 98a0a41 commit fab5dc3

29 files changed

+163
-224
lines changed

src/App.test.tsx

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,6 @@ describe('App', () => {
2626
await screen.findByRole('heading', { level: 1, name: 'Ukjent feil' });
2727
});
2828

29-
test('should render unknown error when hasLayoutSetError', async () => {
30-
await renderWithInstanceAndLayout({
31-
renderer: () => <App />,
32-
queries: {
33-
fetchLayoutSets: () => Promise.reject(new Error('400 Bad Request')),
34-
},
35-
});
36-
await screen.findByRole('heading', { level: 1, name: 'Ukjent feil' });
37-
});
38-
3929
test('should render unknown error when hasOrgsError', async () => {
4030
await renderWithInstanceAndLayout({
4131
renderer: () => <App />,

src/__mocks__/getLayoutSetsMock.ts

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
1-
import type { ILayoutSet, ILayoutSets } from 'src/layout/common.generated';
1+
import type { ILayoutSet } from 'src/layout/common.generated';
22

33
export const defaultDataTypeMock = 'test-data-model';
44
export const statelessDataTypeMock = 'stateless';
5-
export function getLayoutSetsMock(): ILayoutSets {
6-
return {
7-
sets: [
8-
{
9-
id: 'stateless',
10-
dataType: statelessDataTypeMock,
11-
},
12-
{
13-
id: 'stateless-anon',
14-
dataType: 'stateless-anon',
15-
},
16-
{
17-
id: 'some-data-task',
18-
dataType: defaultDataTypeMock,
19-
tasks: ['Task_1'],
20-
},
21-
getSubFormLayoutSetMock(),
22-
],
23-
};
5+
export function getLayoutSetsMock(): ILayoutSet[] {
6+
return [
7+
{
8+
id: 'stateless',
9+
dataType: statelessDataTypeMock,
10+
},
11+
{
12+
id: 'stateless-anon',
13+
dataType: 'stateless-anon',
14+
},
15+
{
16+
id: 'some-data-task',
17+
dataType: defaultDataTypeMock,
18+
tasks: ['Task_1'],
19+
},
20+
getSubFormLayoutSetMock(),
21+
];
2422
}
2523

2624
export function getSubFormLayoutSetMock(): ILayoutSet {

src/features/appData/AppDataProvider.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,35 @@ import { appDataQueries } from 'src/features/appData/AppDataService';
99
import { VersionErrorOrChildren } from 'src/features/applicationMetadata/VersionErrorOrChildren';
1010
import { useNavigationParam } from 'src/features/routing/AppRoutingContext';
1111
import type { ApplicationMetadata } from 'src/features/applicationMetadata/types';
12+
import type { ILayoutSets } from 'src/layout/common.generated';
1213

1314
type AppData = {
1415
appMetadata: ApplicationMetadata;
16+
layoutSets: ILayoutSets;
1517
};
1618

1719
export const AppDataContext = createContext<AppData | null>(null);
1820
export function AppDataContextProvider({ children }: PropsWithChildren) {
1921
const instanceGuid = useNavigationParam('instanceGuid');
2022
const appMetadataQuery = useQuery(appDataQueries.applicationMetadata(instanceGuid));
23+
const layoutSetsQuery = useQuery(appDataQueries.layoutSets());
2124

2225
if (appMetadataQuery.isPending) {
2326
return <Loader reason='fetching-applicationMetadata' />;
2427
}
2528
if (appMetadataQuery.isError) {
2629
return <DisplayError error={appMetadataQuery.error} />;
2730
}
31+
if (layoutSetsQuery.isPending) {
32+
return <Loader reason='fetching-layoutSets' />;
33+
}
34+
35+
if (layoutSetsQuery.error) {
36+
return <DisplayError error={layoutSetsQuery.error} />;
37+
}
2838

2939
return (
30-
<AppDataContext.Provider value={{ appMetadata: appMetadataQuery.data }}>
40+
<AppDataContext.Provider value={{ appMetadata: appMetadataQuery.data, layoutSets: layoutSetsQuery.data }}>
3141
<VersionErrorOrChildren>{children}</VersionErrorOrChildren>
3242
</AppDataContext.Provider>
3343
);

src/features/appData/AppDataService.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { queryOptions } from '@tanstack/react-query';
2+
import { v4 as uuidv4 } from 'uuid';
23

34
import { MINIMUM_APPLICATION_VERSION } from 'src/features/applicationMetadata/minVersion';
4-
import { fetchApplicationMetadata } from 'src/queries/queries';
5+
import { fetchApplicationMetadata, fetchLayoutSets } from 'src/queries/queries';
56
import { isAtLeastVersion } from 'src/utils/versionCompare';
67
import type {
78
ApplicationMetadata,
@@ -43,4 +44,21 @@ export const appDataQueries = {
4344
};
4445
},
4546
}),
47+
layoutSets: () =>
48+
queryOptions({
49+
queryKey: ['layoutSets'],
50+
queryFn: async () => {
51+
const layoutSets = await fetchLayoutSets();
52+
if (layoutSets?.uiSettings?.taskNavigation) {
53+
return {
54+
...layoutSets,
55+
uiSettings: {
56+
...layoutSets.uiSettings,
57+
taskNavigation: layoutSets.uiSettings.taskNavigation.map((g) => ({ ...g, id: uuidv4() })),
58+
},
59+
};
60+
}
61+
return layoutSets;
62+
},
63+
}),
4664
} as const;

src/features/appData/hooks.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { useContext } from 'react';
22

33
import { AppDataContext } from 'src/features/appData/AppDataProvider';
4+
import type { GlobalPageSettings } from 'src/layout/common.generated';
45

56
function useAppDataContext() {
67
const appDataContext = useContext(AppDataContext);
7-
88
if (!appDataContext) {
99
throw new Error('No app data context');
1010
}
@@ -13,7 +13,13 @@ function useAppDataContext() {
1313
}
1414

1515
export function useApplicationMetadata() {
16-
const appDataContext = useAppDataContext();
16+
return useAppDataContext().appMetadata;
17+
}
18+
19+
export function useLayoutSets() {
20+
return useAppDataContext().layoutSets.sets;
21+
}
1722

18-
return appDataContext.appMetadata;
23+
export function useGlobalUISettings(): GlobalPageSettings | undefined {
24+
return useAppDataContext().layoutSets.uiSettings;
1925
}

src/features/datamodel/useBindingSchema.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ import { useCallback, useMemo } from 'react';
33
import type { JSONSchema7 } from 'json-schema';
44

55
import { useTaskStore } from 'src/core/contexts/taskStoreContext';
6-
import { useApplicationMetadata } from 'src/features/appData/hooks';
6+
import { useApplicationMetadata, useLayoutSets } from 'src/features/appData/hooks';
77
import {
88
getCurrentDataTypeForApplication,
99
getCurrentTaskDataElementId,
1010
} from 'src/features/applicationMetadata/appMetadataUtils';
1111
import { DataModels } from 'src/features/datamodel/DataModelsProvider';
12-
import { useLayoutSets } from 'src/features/form/layoutSets/LayoutSetsProvider';
1312
import { useLaxInstanceData, useLaxInstanceId } from 'src/features/instance/InstanceContext';
1413
import { useProcessTaskId } from 'src/features/instance/useProcessTaskId';
1514
import { useCurrentLanguage } from 'src/features/language/LanguageProvider';

src/features/expressions/shared-functions.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { getInstanceDataMock } from 'src/__mocks__/getInstanceDataMock';
1010
import { getSubFormLayoutSetMock } from 'src/__mocks__/getLayoutSetsMock';
1111
import { getProcessDataMock } from 'src/__mocks__/getProcessDataMock';
1212
import { getProfileMock } from 'src/__mocks__/getProfileMock';
13-
import { useApplicationMetadata } from 'src/features/appData/hooks';
13+
import { useApplicationMetadata, useLayoutSets } from 'src/features/appData/hooks';
1414
import { ApplicationMetadata } from 'src/features/applicationMetadata/types';
1515
import { type FunctionTestBase, getSharedTests, type SharedTestFunctionContext } from 'src/features/expressions/shared';
1616
import { ExprVal } from 'src/features/expressions/types';
@@ -329,6 +329,9 @@ describe('Expressions shared function tests', () => {
329329
jest.mocked(useApplicationMetadata).mockReturnValue(applicationMetadata);
330330
jest.mocked(useExternalApis).mockReturnValue(externalApis as ExternalApisResult);
331331
jest.mocked(fetchProcessState).mockImplementation(async () => process ?? getProcessDataMock());
332+
jest
333+
.mocked(useLayoutSets)
334+
.mockReturnValue([{ id: 'layout-set', dataType: 'default', tasks: ['Task_1'] }, getSubFormLayoutSetMock()]);
332335

333336
const renderFunc = stateless ? renderWithoutInstanceAndLayout : renderWithInstanceAndLayout;
334337
const { rerender } = await renderFunc({
@@ -341,9 +344,6 @@ describe('Expressions shared function tests', () => {
341344
/>
342345
),
343346
queries: {
344-
fetchLayoutSets: async () => ({
345-
sets: [{ id: 'layout-set', dataType: 'default', tasks: ['Task_1'] }, getSubFormLayoutSetMock()],
346-
}),
347347
fetchLayouts: async () => layouts,
348348
fetchFormData,
349349
fetchInstanceData,

src/features/form/layout/LayoutsContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { ContextNotProvided } from 'src/core/contexts/context';
77
import { delayedContext } from 'src/core/contexts/delayedContext';
88
import { createQueryContext } from 'src/core/contexts/queryContext';
99
import { useTaskStore } from 'src/core/contexts/taskStoreContext';
10+
import { useLayoutSets } from 'src/features/appData/hooks';
1011
import { useCurrentDataModelName } from 'src/features/datamodel/useBindingSchema';
1112
import { cleanLayout } from 'src/features/form/layout/cleanLayout';
1213
import { makeLayoutLookups } from 'src/features/form/layout/makeLayoutLookups';
1314
import { applyLayoutQuirks } from 'src/features/form/layout/quirks';
14-
import { useLayoutSets } from 'src/features/form/layoutSets/LayoutSetsProvider';
1515
import { useCurrentLayoutSetId } from 'src/features/form/layoutSets/useCurrentLayoutSet';
1616
import { useHasInstance } from 'src/features/instance/InstanceContext';
1717
import { useProcessQuery } from 'src/features/instance/useProcessQuery';

src/features/form/layoutSets/LayoutSetsProvider.tsx

Lines changed: 0 additions & 66 deletions
This file was deleted.

src/features/form/layoutSets/useCurrentLayoutSet.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import { ContextNotProvided } from 'src/core/contexts/context';
21
import { useTaskStore } from 'src/core/contexts/taskStoreContext';
3-
import { useApplicationMetadata } from 'src/features/appData/hooks';
2+
import { useApplicationMetadata, useLayoutSets } from 'src/features/appData/hooks';
43
import { getCurrentLayoutSet } from 'src/features/applicationMetadata/appMetadataUtils';
5-
import { useLaxLayoutSets } from 'src/features/form/layoutSets/LayoutSetsProvider';
64
import { useProcessTaskId } from 'src/features/instance/useProcessTaskId';
75

86
export function useCurrentLayoutSetId() {
@@ -11,14 +9,10 @@ export function useCurrentLayoutSetId() {
119

1210
export function useCurrentLayoutSet() {
1311
const application = useApplicationMetadata();
14-
const layoutSets = useLaxLayoutSets();
12+
const layoutSets = useLayoutSets();
1513
const taskId = useProcessTaskId();
1614
const overriddenLayoutSetId = useTaskStore((state) => state.overriddenLayoutSetId);
1715

18-
if (layoutSets === ContextNotProvided) {
19-
return undefined;
20-
}
21-
2216
if (overriddenLayoutSetId) {
2317
return layoutSets.find((set) => set.id === overriddenLayoutSetId);
2418
}

0 commit comments

Comments
 (0)