@databiosphere/findable-ui 21.2.0 → 21.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +15 -0
- package/lib/common/entities.d.ts +33 -0
- package/lib/components/DataDictionary/common/utils.d.ts +38 -0
- package/lib/components/DataDictionary/common/utils.js +122 -0
- package/lib/components/Export/components/ExportForm/components/ExportButton/exportButton.js +6 -1
- package/lib/components/Export/components/ManifestDownload/components/ManifestDownloadEntity/components/FileManifestDownload/fileManifestDownload.js +5 -2
- package/lib/components/Filter/components/Filter/filter.js +1 -1
- package/lib/components/Filter/components/FilterLabel/filterLabel.d.ts +3 -1
- package/lib/components/Filter/components/FilterLabel/filterLabel.js +4 -2
- package/lib/components/Index/components/AzulFileDownload/azulFileDownload.js +10 -5
- package/lib/components/Index/components/Tabs/common/utils.js +2 -1
- package/lib/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenu/navigationMenu.js +1 -1
- package/lib/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenuItems/navigationMenuItems.js +20 -21
- package/lib/components/Layout/components/Header/components/Content/components/Navigation/constants.d.ts +1 -0
- package/lib/components/Layout/components/Header/components/Content/components/Navigation/constants.js +1 -0
- package/lib/components/Layout/components/Header/components/Content/components/Navigation/navigation.d.ts +2 -1
- package/lib/components/Layout/components/Header/components/Content/components/Navigation/navigation.js +16 -17
- package/lib/components/Layout/components/Header/header.js +2 -1
- package/lib/components/Login/components/Button/types.d.ts +1 -1
- package/lib/components/Login/components/Buttons/buttons.d.ts +2 -0
- package/lib/components/Login/components/Buttons/buttons.js +5 -0
- package/lib/components/Login/components/Buttons/types.d.ts +8 -0
- package/lib/components/Login/components/Buttons/types.js +1 -0
- package/lib/components/Login/components/Section/components/Consent/consent.d.ts +3 -0
- package/lib/components/Login/components/Section/components/Consent/consent.js +14 -0
- package/lib/components/Login/components/Section/components/Consent/consent.styles.d.ts +7 -0
- package/lib/components/Login/components/Section/components/Consent/consent.styles.js +14 -0
- package/lib/components/Login/components/Section/components/Consent/types.d.ts +6 -0
- package/lib/components/Login/components/Section/components/Consent/types.js +1 -0
- package/lib/components/Login/components/Section/components/Warning/warning.d.ts +3 -0
- package/lib/components/Login/components/Section/components/Warning/warning.js +9 -0
- package/lib/components/Login/hooks/useUserConsent/types.d.ts +10 -0
- package/lib/components/Login/hooks/useUserConsent/types.js +1 -0
- package/lib/components/Login/hooks/useUserConsent/useUserConsent.d.ts +2 -0
- package/lib/components/Login/hooks/useUserConsent/useUserConsent.js +24 -0
- package/lib/components/Login/hooks/useUserLogin/types.d.ts +6 -0
- package/lib/components/Login/hooks/useUserLogin/types.js +1 -0
- package/lib/components/Login/hooks/useUserLogin/useUserLogin.d.ts +2 -0
- package/lib/components/Login/hooks/useUserLogin/useUserLogin.js +21 -0
- package/lib/components/Table/components/TableHead/tableHead.js +4 -1
- package/lib/components/common/CustomIcon/components/CloseIcon/closeIcon.d.ts +2 -0
- package/lib/components/common/CustomIcon/components/CloseIcon/closeIcon.js +6 -0
- package/lib/components/common/LoginDialog/constants.d.ts +6 -0
- package/lib/components/common/LoginDialog/constants.js +21 -0
- package/lib/components/common/LoginDialog/loginDialog.d.ts +2 -0
- package/lib/components/common/LoginDialog/loginDialog.js +27 -0
- package/lib/components/common/LoginDialog/loginDialog.styles.d.ts +3 -0
- package/lib/components/common/LoginDialog/loginDialog.styles.js +50 -0
- package/lib/components/common/LoginDialog/types.d.ts +4 -0
- package/lib/components/common/LoginDialog/types.js +1 -0
- package/lib/components/common/Tabs/tabs.d.ts +2 -0
- package/lib/components/common/Tabs/tabs.js +14 -1
- package/lib/config/entities.d.ts +6 -1
- package/lib/hooks/useCategoryFilter.js +1 -0
- package/lib/providers/config.js +9 -2
- package/lib/providers/loginGuard/common/types.d.ts +18 -0
- package/lib/providers/loginGuard/common/types.js +1 -0
- package/lib/providers/loginGuard/context.d.ts +6 -0
- package/lib/providers/loginGuard/context.js +10 -0
- package/lib/providers/loginGuard/hook.d.ts +9 -0
- package/lib/providers/loginGuard/hook.js +12 -0
- package/lib/providers/loginGuard/provider.d.ts +11 -0
- package/lib/providers/loginGuard/provider.js +55 -0
- package/lib/styles/common/mui/typography.d.ts +1 -0
- package/lib/styles/common/mui/typography.js +7 -0
- package/package.json +1 -1
- package/src/common/entities.ts +37 -0
- package/src/components/DataDictionary/common/utils.ts +160 -0
- package/src/components/Export/components/ExportForm/components/ExportButton/exportButton.tsx +8 -1
- package/src/components/Export/components/ManifestDownload/components/ManifestDownloadEntity/components/FileManifestDownload/fileManifestDownload.tsx +11 -3
- package/src/components/Filter/components/Filter/filter.tsx +1 -0
- package/src/components/Filter/components/FilterLabel/filterLabel.tsx +16 -10
- package/src/components/Index/components/AzulFileDownload/azulFileDownload.tsx +12 -5
- package/src/components/Index/components/Tabs/common/utils.ts +2 -0
- package/src/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenu/navigationMenu.tsx +1 -1
- package/src/components/Layout/components/Header/components/Content/components/Navigation/components/NavigationMenuItems/navigationMenuItems.tsx +16 -15
- package/src/components/Layout/components/Header/components/Content/components/Navigation/constants.ts +1 -0
- package/src/components/Layout/components/Header/components/Content/components/Navigation/navigation.tsx +26 -18
- package/src/components/Layout/components/Header/header.tsx +6 -1
- package/src/components/Login/components/Button/types.ts +1 -1
- package/src/components/Login/components/Buttons/buttons.tsx +22 -0
- package/src/components/Login/components/Buttons/types.ts +9 -0
- package/src/components/Login/components/Section/components/Consent/consent.styles.ts +15 -0
- package/src/components/Login/components/Section/components/Consent/consent.tsx +30 -0
- package/src/components/Login/components/Section/components/Consent/types.ts +10 -0
- package/src/components/Login/components/Section/components/Warning/warning.tsx +24 -0
- package/src/components/Login/hooks/useUserConsent/types.ts +11 -0
- package/src/components/Login/hooks/useUserConsent/useUserConsent.ts +32 -0
- package/src/components/Login/hooks/useUserLogin/types.ts +8 -0
- package/src/components/Login/hooks/useUserLogin/useUserLogin.ts +29 -0
- package/src/components/Table/components/TableHead/tableHead.tsx +26 -15
- package/src/components/common/CustomIcon/components/CloseIcon/closeIcon.tsx +17 -0
- package/src/components/common/LoginDialog/constants.ts +33 -0
- package/src/components/common/LoginDialog/loginDialog.styles.ts +51 -0
- package/src/components/common/LoginDialog/loginDialog.tsx +56 -0
- package/src/components/common/LoginDialog/types.ts +4 -0
- package/src/components/common/Tabs/tabs.tsx +33 -3
- package/src/config/entities.ts +11 -1
- package/src/hooks/useCategoryFilter.ts +1 -0
- package/src/providers/config.tsx +10 -2
- package/src/providers/loginGuard/common/types.ts +21 -0
- package/src/providers/loginGuard/context.ts +12 -0
- package/src/providers/loginGuard/hook.ts +14 -0
- package/src/providers/loginGuard/provider.tsx +76 -0
- package/src/styles/common/mui/typography.ts +8 -0
- package/tests/dataDictionary_utils.test.ts +153 -0
- package/tests/provider.test.tsx +191 -0
- package/types/data-explorer-ui.d.ts +2 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import {
|
|
2
|
+
annotateColumnConfig,
|
|
3
|
+
annotateDefaultCategoryConfig,
|
|
4
|
+
annotateEntityCategoryConfig,
|
|
5
|
+
annotateEntityConfig,
|
|
6
|
+
} from "../src/components/DataDictionary/common/utils";
|
|
7
|
+
import { SiteConfig } from "../src/config/entities";
|
|
8
|
+
|
|
9
|
+
describe("Data Dictionary", () => {
|
|
10
|
+
it("annotates entity", () => {
|
|
11
|
+
const key = "entity";
|
|
12
|
+
|
|
13
|
+
// Create annotation for column and add to dummy annotation map.
|
|
14
|
+
const annotation = {
|
|
15
|
+
description: "description for entity",
|
|
16
|
+
label: "entity",
|
|
17
|
+
};
|
|
18
|
+
const annotationsByKey = {
|
|
19
|
+
[key]: annotation,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// Create dummy site config.
|
|
23
|
+
const siteConfig = {
|
|
24
|
+
entities: [
|
|
25
|
+
{
|
|
26
|
+
key,
|
|
27
|
+
list: {
|
|
28
|
+
columns: [{ id: "col150" }, { id: "col1" }],
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
} as unknown as SiteConfig;
|
|
33
|
+
|
|
34
|
+
// Annotate
|
|
35
|
+
annotateEntityConfig(siteConfig, annotationsByKey);
|
|
36
|
+
|
|
37
|
+
// Confirm entity is annotated.
|
|
38
|
+
const entity = siteConfig.entities[0];
|
|
39
|
+
expect(entity.annotation).toEqual(annotation);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("annotates entity category config", () => {
|
|
43
|
+
const key = "filter0";
|
|
44
|
+
|
|
45
|
+
// Create annotation for column and add to dummy annotation map.
|
|
46
|
+
const annotation = {
|
|
47
|
+
description: "description for filter 0",
|
|
48
|
+
label: "filter 0",
|
|
49
|
+
};
|
|
50
|
+
const annotationsByKey = {
|
|
51
|
+
[key]: annotation,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Create dummy site config.
|
|
55
|
+
const siteConfig = {
|
|
56
|
+
entities: [
|
|
57
|
+
{
|
|
58
|
+
categoryGroupConfig: {
|
|
59
|
+
categoryGroups: [
|
|
60
|
+
{
|
|
61
|
+
categoryConfigs: [
|
|
62
|
+
{
|
|
63
|
+
key,
|
|
64
|
+
label: "filter 0",
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
} as unknown as SiteConfig;
|
|
73
|
+
|
|
74
|
+
// Annotate
|
|
75
|
+
annotateEntityCategoryConfig(siteConfig, annotationsByKey);
|
|
76
|
+
|
|
77
|
+
// Confirm filter is annotated.
|
|
78
|
+
const categoryConfig =
|
|
79
|
+
siteConfig.entities[0].categoryGroupConfig?.categoryGroups[0]
|
|
80
|
+
.categoryConfigs[0];
|
|
81
|
+
expect(categoryConfig?.annotation).toEqual(annotation);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("annotates default category config", () => {
|
|
85
|
+
const key = "filter0";
|
|
86
|
+
|
|
87
|
+
// Create annotation for column and add to dummy annotation map.
|
|
88
|
+
const annotation = {
|
|
89
|
+
description: "description for filter 0",
|
|
90
|
+
label: "filter 0",
|
|
91
|
+
};
|
|
92
|
+
const annotationsByKey = {
|
|
93
|
+
[key]: annotation,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
// Create dummy site config.
|
|
97
|
+
const siteConfig = {
|
|
98
|
+
categoryGroupConfig: {
|
|
99
|
+
categoryGroups: [
|
|
100
|
+
{
|
|
101
|
+
categoryConfigs: [
|
|
102
|
+
{
|
|
103
|
+
key,
|
|
104
|
+
label: "filter 0",
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
} as unknown as SiteConfig;
|
|
111
|
+
|
|
112
|
+
// Annotate
|
|
113
|
+
annotateDefaultCategoryConfig(siteConfig, annotationsByKey);
|
|
114
|
+
|
|
115
|
+
// Confirm filter is annotated.
|
|
116
|
+
const categoryConfig =
|
|
117
|
+
siteConfig.categoryGroupConfig?.categoryGroups[0].categoryConfigs[0];
|
|
118
|
+
expect(categoryConfig?.annotation).toEqual(annotation);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("annotates column", () => {
|
|
122
|
+
const key = "col0";
|
|
123
|
+
|
|
124
|
+
// Create annotation for column and add to dummy annotation map.
|
|
125
|
+
const annotation = {
|
|
126
|
+
description: "description for column 0",
|
|
127
|
+
label: "column 0",
|
|
128
|
+
};
|
|
129
|
+
const annotationsByKey = {
|
|
130
|
+
[key]: annotation,
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Create dummy site config.
|
|
134
|
+
const siteConfig = {
|
|
135
|
+
entities: [
|
|
136
|
+
{
|
|
137
|
+
list: {
|
|
138
|
+
columns: [{ id: key }, { id: "col1" }],
|
|
139
|
+
},
|
|
140
|
+
name: "entity",
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
} as unknown as SiteConfig;
|
|
144
|
+
|
|
145
|
+
// Annotate
|
|
146
|
+
annotateColumnConfig(siteConfig, annotationsByKey);
|
|
147
|
+
|
|
148
|
+
// Confirm column 0 is annotated and column 1 is not.
|
|
149
|
+
const columns = siteConfig.entities[0].list.columns ?? [];
|
|
150
|
+
expect((columns[0]?.meta as any)?.annotation).toEqual(annotation);
|
|
151
|
+
expect((columns[1]?.meta as any)?.annotation).toBeUndefined();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { jest } from "@jest/globals";
|
|
2
|
+
import { act, render, screen } from "@testing-library/react";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { LoginGuardContext } from "../src/providers/loginGuard/context";
|
|
5
|
+
|
|
6
|
+
jest.unstable_mockModule("../src/hooks/useConfig", () => ({
|
|
7
|
+
useConfig: jest.fn(),
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
jest.unstable_mockModule("../src/providers/authentication/auth/hook", () => ({
|
|
11
|
+
useAuth: jest.fn(),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
jest.unstable_mockModule(
|
|
15
|
+
"../src/hooks/authentication/config/useAuthenticationConfig",
|
|
16
|
+
() => ({
|
|
17
|
+
useAuthenticationConfig: jest.fn(),
|
|
18
|
+
})
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const TEST_ID_LOGIN_DIALOG = "login-dialog";
|
|
22
|
+
const TEXT_DIALOG_CLOSED = "closed";
|
|
23
|
+
const TEXT_DIALOG_OPEN = "open";
|
|
24
|
+
jest.unstable_mockModule(
|
|
25
|
+
"../src/components/common/LoginDialog/loginDialog",
|
|
26
|
+
() => ({
|
|
27
|
+
LoginDialog: ({ open }: { open: boolean }): JSX.Element => (
|
|
28
|
+
<div data-testid={TEST_ID_LOGIN_DIALOG}>
|
|
29
|
+
{open ? TEXT_DIALOG_OPEN : TEXT_DIALOG_CLOSED}
|
|
30
|
+
</div>
|
|
31
|
+
),
|
|
32
|
+
})
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const { useConfig } = await import("../src/hooks/useConfig");
|
|
36
|
+
const { useAuth } = await import("../src/providers/authentication/auth/hook");
|
|
37
|
+
const { useAuthenticationConfig } = await import(
|
|
38
|
+
"../src/hooks/authentication/config/useAuthenticationConfig"
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const { LoginGuardProvider } = await import(
|
|
42
|
+
"../src/providers/loginGuard/provider"
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const TEXT_BUTTON_EXPORT = "export";
|
|
46
|
+
|
|
47
|
+
describe("LoginGuardProvider", () => {
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
// Mock hooks used by login guard.
|
|
50
|
+
(useConfig as jest.Mock).mockReturnValue({
|
|
51
|
+
config: {
|
|
52
|
+
exportsRequireAuth: true,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
(useAuth as jest.Mock).mockReturnValue({
|
|
56
|
+
authState: {
|
|
57
|
+
isAuthenticated: false,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
(useAuthenticationConfig as jest.Mock).mockReturnValue({});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should render children and login dialog closed", () => {
|
|
64
|
+
render(
|
|
65
|
+
<LoginGuardProvider>
|
|
66
|
+
<div data-testid="child">child component</div>
|
|
67
|
+
</LoginGuardProvider>
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
expect(screen.getByTestId("child")).toBeTruthy();
|
|
71
|
+
expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
|
|
72
|
+
TEXT_DIALOG_CLOSED
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("calls callback immediately if user is authenticated", () => {
|
|
77
|
+
const callback = jest.fn();
|
|
78
|
+
|
|
79
|
+
// Simulate user authentication.
|
|
80
|
+
(useAuth as jest.Mock).mockReturnValue({
|
|
81
|
+
authState: { isAuthenticated: true },
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
render(
|
|
85
|
+
<LoginGuardProvider>
|
|
86
|
+
<LoginGuardContext.Consumer>
|
|
87
|
+
{({ requireLogin }) => (
|
|
88
|
+
<button onClick={() => requireLogin(callback)}>
|
|
89
|
+
{TEXT_BUTTON_EXPORT}
|
|
90
|
+
</button>
|
|
91
|
+
)}
|
|
92
|
+
</LoginGuardContext.Consumer>
|
|
93
|
+
</LoginGuardProvider>
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
// Click button requiring login.
|
|
97
|
+
act(() => {
|
|
98
|
+
screen.getByText(TEXT_BUTTON_EXPORT).click();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// User is authenticated; callback should be fired immediately.
|
|
102
|
+
expect(callback).toHaveBeenCalled();
|
|
103
|
+
|
|
104
|
+
// Login dialog should not be open.
|
|
105
|
+
expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
|
|
106
|
+
TEXT_DIALOG_CLOSED
|
|
107
|
+
);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("calls callback immediately if exportsRequireAuth is false", () => {
|
|
111
|
+
const callback = jest.fn();
|
|
112
|
+
|
|
113
|
+
// Simulate exportsRequireAuth being false.
|
|
114
|
+
(useConfig as jest.Mock).mockReturnValue({
|
|
115
|
+
config: {
|
|
116
|
+
exportsRequireAuth: false,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
render(
|
|
121
|
+
<LoginGuardProvider>
|
|
122
|
+
<LoginGuardContext.Consumer>
|
|
123
|
+
{({ requireLogin }) => (
|
|
124
|
+
<button onClick={() => requireLogin(callback)}>
|
|
125
|
+
{TEXT_BUTTON_EXPORT}
|
|
126
|
+
</button>
|
|
127
|
+
)}
|
|
128
|
+
</LoginGuardContext.Consumer>
|
|
129
|
+
</LoginGuardProvider>
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
// Click button requiring login.
|
|
133
|
+
act(() => {
|
|
134
|
+
screen.getByText(TEXT_BUTTON_EXPORT).click();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// exportsRequireAuth is false; callback should be fired immediately.
|
|
138
|
+
expect(callback).toHaveBeenCalled();
|
|
139
|
+
|
|
140
|
+
// Login dialog should not be open.
|
|
141
|
+
expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
|
|
142
|
+
TEXT_DIALOG_CLOSED
|
|
143
|
+
);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("should call callback after user authenticates", async () => {
|
|
147
|
+
const callback = jest.fn();
|
|
148
|
+
|
|
149
|
+
const { rerender } = render(
|
|
150
|
+
<LoginGuardProvider>
|
|
151
|
+
<LoginGuardContext.Consumer>
|
|
152
|
+
{({ requireLogin }) => (
|
|
153
|
+
<button onClick={() => requireLogin(callback)}>
|
|
154
|
+
{TEXT_BUTTON_EXPORT}
|
|
155
|
+
</button>
|
|
156
|
+
)}
|
|
157
|
+
</LoginGuardContext.Consumer>
|
|
158
|
+
</LoginGuardProvider>
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
// Click button requiring login.
|
|
162
|
+
act(() => {
|
|
163
|
+
screen.getByText(TEXT_BUTTON_EXPORT).click();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// User is not authenticated; callback should not have been called.
|
|
167
|
+
expect(callback).not.toHaveBeenCalled();
|
|
168
|
+
|
|
169
|
+
// User is not authenticated; login dialog should be open.
|
|
170
|
+
expect(screen.getByTestId(TEST_ID_LOGIN_DIALOG).textContent).toBe(
|
|
171
|
+
TEXT_DIALOG_OPEN
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
// Simulate user authentication.
|
|
175
|
+
await act(async () => {
|
|
176
|
+
(useAuth as jest.Mock).mockReturnValue({
|
|
177
|
+
authState: { isAuthenticated: true },
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Rerender to trigger useEffect.
|
|
182
|
+
rerender(
|
|
183
|
+
<LoginGuardProvider>
|
|
184
|
+
<div />
|
|
185
|
+
</LoginGuardProvider>
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
// Callback should be called (in useEffect called on re-render).
|
|
189
|
+
expect(callback).toHaveBeenCalled();
|
|
190
|
+
});
|
|
191
|
+
});
|
|
@@ -18,6 +18,7 @@ import type {} from "@mui/material/Typography";
|
|
|
18
18
|
import type {} from "@tanstack/react-table";
|
|
19
19
|
import { RowData } from "@tanstack/react-table";
|
|
20
20
|
import { DataLayer } from "../src/common/analytics/entities";
|
|
21
|
+
import { DataDictionaryAnnotation } from "../src/common/entities";
|
|
21
22
|
import {
|
|
22
23
|
CustomFeatureInitialTableState,
|
|
23
24
|
CustomFeatureInstance,
|
|
@@ -268,6 +269,7 @@ declare module "@tanstack/react-table" {
|
|
|
268
269
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- TData and TValue are unused variables.
|
|
269
270
|
interface ColumnMeta<TData extends RowData, TValue> {
|
|
270
271
|
align?: TableCellProps["align"];
|
|
272
|
+
annotation?: DataDictionaryAnnotation;
|
|
271
273
|
columnPinned?: boolean;
|
|
272
274
|
header?: string;
|
|
273
275
|
width?: GridTrackSize;
|