@pautena/react-design-system 0.4.2 → 0.4.3
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/dist/cjs/index.js +1 -31
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/components/app-bar/app-bar.types.d.ts +2 -2
- package/dist/cjs/types/components/bullet/bullet.d.ts +1 -1
- package/dist/cjs/types/components/content/content.types.d.ts +3 -3
- package/dist/cjs/types/components/drawer/drawer.provider.d.ts +1 -1
- package/dist/cjs/types/components/drawer/drawer.types.d.ts +4 -4
- package/dist/cjs/types/components/enhanced-select/enhanced-select.d.ts +1 -2
- package/dist/cjs/types/components/header/header.dummy.d.ts +1 -1
- package/dist/cjs/types/components/header/header.types.d.ts +6 -6
- package/dist/cjs/types/components/label/label.d.ts +1 -1
- package/dist/cjs/types/components/link/link.d.ts +1 -1
- package/dist/cjs/types/components/placeholder/placeholder.d.ts +1 -1
- package/dist/cjs/types/components/query-container/query-container.d.ts +1 -1
- package/dist/cjs/types/components/sign-in/sign-in.d.ts +2 -3
- package/dist/cjs/types/components/tab/tab-card/tab-card.d.ts +3 -4
- package/dist/cjs/types/components/tab/tab-card/tab-card.dummy.d.ts +2 -3
- package/dist/cjs/types/components/table/enhanced-remote-table/enhanced-remote-table.d.ts +5 -6
- package/dist/cjs/types/components/table/enhanced-remote-table/enhanced-remote-table.mock.d.ts +6 -6
- package/dist/cjs/types/components/table/enhanced-table/enhanced-table-head.d.ts +8 -8
- package/dist/cjs/types/components/table/enhanced-table/enhanced-table.d.ts +2 -2
- package/dist/cjs/types/components/table/enhanced-table/enhanced-table.mock.d.ts +6 -7
- package/dist/cjs/types/components/table-list/table-list.d.ts +2 -2
- package/dist/cjs/types/components/value-displays/group-value-card/group-value-card.d.ts +7 -4
- package/dist/cjs/types/components/value-displays/group-value-card/group-value-card.mock.d.ts +2 -1
- package/dist/cjs/types/components/value-displays/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-boolean/value-boolean.d.ts +3 -11
- package/dist/cjs/types/components/value-displays/value-card/value-card.d.ts +1 -1
- package/dist/cjs/types/components/value-displays/value-content/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-content/value-content.d.ts +24 -0
- package/dist/cjs/types/components/value-displays/value-datetime/value-datetime.d.ts +3 -10
- package/dist/cjs/types/components/value-displays/value-displays.types.d.ts +15 -0
- package/dist/cjs/types/components/value-displays/value-image/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-image/value-image.d.ts +11 -0
- package/dist/cjs/types/components/value-displays/value-text/value-text.d.ts +3 -11
- package/dist/cjs/types/generators/generators.mock.d.ts +2 -1
- package/dist/cjs/types/generators/generators.model.d.ts +36 -20
- package/dist/cjs/types/generators/generators.model.test.d.ts +1 -0
- package/dist/cjs/types/generators/model-router/model-router.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/add-screen.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/details-screen.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/list-screen.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/update-screen.d.ts +1 -1
- package/dist/cjs/types/layouts/header-layout/header-layout.d.ts +1 -2
- package/dist/cjs/types/providers/notification-center/notification-center.context.d.ts +0 -2
- package/dist/cjs/types/providers/notification-center/notification-center.provider.d.ts +1 -1
- package/dist/cjs/types/providers/tab-provider/tab-provider.provider.d.ts +1 -1
- package/dist/cjs/types/utils/theme.d.ts +1 -1
- package/dist/esm/index.js +1 -31
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/app-bar/app-bar.types.d.ts +2 -2
- package/dist/esm/types/components/bullet/bullet.d.ts +1 -1
- package/dist/esm/types/components/content/content.types.d.ts +3 -3
- package/dist/esm/types/components/drawer/drawer.provider.d.ts +1 -1
- package/dist/esm/types/components/drawer/drawer.types.d.ts +4 -4
- package/dist/esm/types/components/enhanced-select/enhanced-select.d.ts +1 -2
- package/dist/esm/types/components/header/header.dummy.d.ts +1 -1
- package/dist/esm/types/components/header/header.types.d.ts +6 -6
- package/dist/esm/types/components/label/label.d.ts +1 -1
- package/dist/esm/types/components/link/link.d.ts +1 -1
- package/dist/esm/types/components/placeholder/placeholder.d.ts +1 -1
- package/dist/esm/types/components/query-container/query-container.d.ts +1 -1
- package/dist/esm/types/components/sign-in/sign-in.d.ts +2 -3
- package/dist/esm/types/components/tab/tab-card/tab-card.d.ts +3 -4
- package/dist/esm/types/components/tab/tab-card/tab-card.dummy.d.ts +2 -3
- package/dist/esm/types/components/table/enhanced-remote-table/enhanced-remote-table.d.ts +5 -6
- package/dist/esm/types/components/table/enhanced-remote-table/enhanced-remote-table.mock.d.ts +6 -6
- package/dist/esm/types/components/table/enhanced-table/enhanced-table-head.d.ts +8 -8
- package/dist/esm/types/components/table/enhanced-table/enhanced-table.d.ts +2 -2
- package/dist/esm/types/components/table/enhanced-table/enhanced-table.mock.d.ts +6 -7
- package/dist/esm/types/components/table-list/table-list.d.ts +2 -2
- package/dist/esm/types/components/value-displays/group-value-card/group-value-card.d.ts +7 -4
- package/dist/esm/types/components/value-displays/group-value-card/group-value-card.mock.d.ts +2 -1
- package/dist/esm/types/components/value-displays/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-boolean/value-boolean.d.ts +3 -11
- package/dist/esm/types/components/value-displays/value-card/value-card.d.ts +1 -1
- package/dist/esm/types/components/value-displays/value-content/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-content/value-content.d.ts +24 -0
- package/dist/esm/types/components/value-displays/value-datetime/value-datetime.d.ts +3 -10
- package/dist/esm/types/components/value-displays/value-displays.types.d.ts +15 -0
- package/dist/esm/types/components/value-displays/value-image/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-image/value-image.d.ts +11 -0
- package/dist/esm/types/components/value-displays/value-text/value-text.d.ts +3 -11
- package/dist/esm/types/generators/generators.mock.d.ts +2 -1
- package/dist/esm/types/generators/generators.model.d.ts +36 -20
- package/dist/esm/types/generators/generators.model.test.d.ts +1 -0
- package/dist/esm/types/generators/model-router/model-router.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/add-screen.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/details-screen.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/list-screen.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/update-screen.d.ts +1 -1
- package/dist/esm/types/layouts/header-layout/header-layout.d.ts +1 -2
- package/dist/esm/types/providers/notification-center/notification-center.context.d.ts +0 -2
- package/dist/esm/types/providers/notification-center/notification-center.provider.d.ts +1 -1
- package/dist/esm/types/providers/tab-provider/tab-provider.provider.d.ts +1 -1
- package/dist/esm/types/utils/theme.d.ts +1 -1
- package/dist/index.d.ts +155 -150
- package/package.json +58 -53
- package/src/components/app-bar/app-bar.stories.tsx +2 -1
- package/src/components/app-bar/app-bar.test.tsx +1 -1
- package/src/components/bullet/bullet.test.tsx +1 -1
- package/src/components/center-container/center-container.test.tsx +1 -1
- package/src/components/content/content.stories.tsx +1 -1
- package/src/components/content/content.test.tsx +1 -1
- package/src/components/drawer/__snapshots__/drawer.test.tsx.snap +3 -3
- package/src/components/drawer/drawer.test.tsx +8 -8
- package/src/components/drawer-content/drawer-content.stories.tsx +0 -1
- package/src/components/drawer-content/drawer-content.test.tsx +1 -1
- package/src/components/drawer-item/drawer-item.test.tsx +3 -3
- package/src/components/drawer-section/drawer-section.test.tsx +1 -1
- package/src/components/enhanced-select/enhanced-select.stories.tsx +10 -10
- package/src/components/enhanced-select/enhanced-select.test.tsx +9 -4
- package/src/components/enhanced-select/enhanced-select.tsx +1 -3
- package/src/components/header/header.dummy.ts +1 -1
- package/src/components/header/header.stories.tsx +0 -6
- package/src/components/header/header.test.tsx +1 -1
- package/src/components/label/label.test.tsx +1 -1
- package/src/components/link/link.tsx +2 -2
- package/src/components/loading-area/loading-area.test.tsx +2 -1
- package/src/components/placeholder/placeholder.test.tsx +3 -2
- package/src/components/query-container/query-container.test.tsx +2 -1
- package/src/components/sign-in/sign-in.test.tsx +2 -1
- package/src/components/sign-in/sign-in.tsx +3 -3
- package/src/components/tab/tab-card/tab-card.dummy.tsx +2 -2
- package/src/components/tab/tab-card/tab-card.stories.tsx +2 -2
- package/src/components/tab/tab-card/tab-card.test.tsx +1 -1
- package/src/components/tab/tab-card/tab-card.tsx +3 -3
- package/src/components/table/enhanced-remote-table/enhanced-remote-table.mock.tsx +7 -6
- package/src/components/table/enhanced-remote-table/enhanced-remote-table.test.tsx +3 -3
- package/src/components/table/enhanced-remote-table/enhanced-remote-table.tsx +8 -8
- package/src/components/table/enhanced-table/enhanced-table-head.tsx +14 -9
- package/src/components/table/enhanced-table/enhanced-table.mock.tsx +12 -6
- package/src/components/table/enhanced-table/enhanced-table.test.tsx +6 -5
- package/src/components/table/enhanced-table/enhanced-table.tsx +8 -8
- package/src/components/table-list/table-list.stories.tsx +27 -17
- package/src/components/table-list/table-list.test.tsx +11 -6
- package/src/components/table-list/table-list.tsx +23 -12
- package/src/components/value-displays/group-value-card/group-value-card.mock.tsx +2 -2
- package/src/components/value-displays/group-value-card/group-value-card.stories.tsx +24 -1
- package/src/components/value-displays/group-value-card/group-value-card.test.tsx +7 -2
- package/src/components/value-displays/group-value-card/group-value-card.tsx +13 -4
- package/src/components/value-displays/index.ts +1 -0
- package/src/components/value-displays/value-boolean/value-boolean.test.tsx +15 -3
- package/src/components/value-displays/value-boolean/value-boolean.tsx +17 -17
- package/src/components/value-displays/value-card/value-card.test.tsx +1 -1
- package/src/components/value-displays/value-content/index.ts +1 -0
- package/src/components/value-displays/value-content/value-content.stories.tsx +20 -0
- package/src/components/value-displays/value-content/value-content.test.tsx +50 -0
- package/src/components/value-displays/value-content/value-content.tsx +55 -0
- package/src/components/value-displays/value-datetime/value-datetime.stories.tsx +13 -0
- package/src/components/value-displays/value-datetime/value-datetime.test.tsx +24 -5
- package/src/components/value-displays/value-datetime/value-datetime.tsx +15 -22
- package/src/components/value-displays/value-displays.types.ts +18 -0
- package/src/components/value-displays/value-image/index.ts +1 -0
- package/src/components/value-displays/value-image/value-image.stories.tsx +28 -0
- package/src/components/value-displays/value-image/value-image.test.tsx +22 -0
- package/src/components/value-displays/value-image/value-image.tsx +24 -0
- package/src/components/value-displays/value-text/value-text.stories.tsx +11 -0
- package/src/components/value-displays/value-text/value-text.test.tsx +19 -5
- package/src/components/value-displays/value-text/value-text.tsx +16 -22
- package/src/generators/generators.mock.ts +25 -22
- package/src/generators/generators.model.test.ts +77 -0
- package/src/generators/generators.model.ts +78 -6
- package/src/generators/model-form/model-form.test.tsx +11 -14
- package/src/generators/model-form/model-form.tsx +33 -65
- package/src/generators/model-router/model-router.test.tsx +45 -32
- package/src/generators/model-router/screens/add-screen.tsx +2 -1
- package/src/generators/model-router/screens/details-screen.tsx +2 -1
- package/src/generators/model-router/screens/list-screen.tsx +1 -1
- package/src/generators/model-router/screens/update-screen.tsx +4 -5
- package/src/generators/model-router/stories/model-router.stories.tsx +1 -1
- package/src/generators/object-details/object-details.test.tsx +2 -1
- package/src/generators/object-details/object-details.tsx +18 -9
- package/src/hooks/routing/routing.test.tsx +1 -1
- package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.stories.tsx +1 -1
- package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.test.tsx +2 -1
- package/src/layouts/header-layout/header-layout.stories.tsx +11 -4
- package/src/layouts/header-layout/header-layout.test.tsx +1 -1
- package/src/layouts/header-layout/header-layout.tsx +1 -1
- package/src/providers/notification-center/notification-center.context.ts +0 -6
- package/src/providers/notification-center/notification-center.stories.tsx +1 -1
- package/src/providers/notification-center/notification-center.test.tsx +6 -7
- package/src/storybook.tsx +1 -1
- package/src/tests/actions.ts +4 -0
- package/src/tests/assertions.ts +18 -10
- package/src/tests/components.tsx +35 -1
- package/src/tests/file-mock.ts +1 -0
- package/src/tests/mocks.ts +21 -0
- package/src/tests/testing-library.tsx +11 -8
- package/src/types/index.d.ts +4 -0
- package/src/tests/index.ts +0 -4
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React, { useEffect } from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { useParams } from "react-router-dom";
|
|
3
3
|
import { Content, Header } from "~/components";
|
|
4
|
-
import { BasicModelInstance
|
|
4
|
+
import { BasicModelInstance } from "../../generators.model";
|
|
5
|
+
import { ModelForm } from "../../model-form";
|
|
5
6
|
import { useNavigateWhenValueChanges } from "~/hooks";
|
|
6
7
|
import { HeaderLayout } from "../../../layouts";
|
|
7
|
-
import {
|
|
8
|
+
import { useNotifyWhenValueChanges } from "../../../providers";
|
|
8
9
|
import { RequestState } from "../model-router.types";
|
|
9
10
|
import { BaseScreenProps } from "./screens.types";
|
|
10
11
|
|
|
@@ -48,8 +49,6 @@ export const UpdateScreen = <T extends BasicModelInstance>({
|
|
|
48
49
|
onRequestUpdateItem,
|
|
49
50
|
}: UpdateScreenProps<T>) => {
|
|
50
51
|
const { id = "" } = useParams();
|
|
51
|
-
const navigate = useNavigate();
|
|
52
|
-
const { show } = useNotificationCenter();
|
|
53
52
|
const loading = updateItemRequest.loading || submitUpdateItemRequest.loading;
|
|
54
53
|
|
|
55
54
|
useEffect(() => {
|
|
@@ -75,7 +75,7 @@ export const DummyModelRouter = (args: DummyModelRouterProps) => {
|
|
|
75
75
|
}, requestTimeout);
|
|
76
76
|
};
|
|
77
77
|
|
|
78
|
-
const handleClickDeleteItem = (item) => {
|
|
78
|
+
const handleClickDeleteItem = (item: MockInstance) => {
|
|
79
79
|
setRemoveRequestState({ idle: false, loading: true });
|
|
80
80
|
onRequestDeleteAction(item);
|
|
81
81
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { expectModelFieldValue
|
|
2
|
+
import { expectModelFieldValue } from "~/tests/assertions";
|
|
3
|
+
import { render } from "~/tests/testing-library";
|
|
3
4
|
import { mockModel, createModelInstance } from "../generators.mock";
|
|
4
5
|
import { ObjectDetails } from "./object-details";
|
|
5
6
|
|
|
@@ -8,28 +8,37 @@ import {
|
|
|
8
8
|
ValueText,
|
|
9
9
|
ValueDatetime,
|
|
10
10
|
} from "../../components";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
ModelField,
|
|
13
|
+
GroupField,
|
|
14
|
+
Model,
|
|
15
|
+
BasicModelInstance,
|
|
16
|
+
GroupInstanceType,
|
|
17
|
+
} from "../generators.model";
|
|
12
18
|
|
|
13
|
-
const singleDetailValueFactory = <T extends BasicModelInstance>(
|
|
19
|
+
const singleDetailValueFactory = <T extends BasicModelInstance>(
|
|
20
|
+
field: ModelField,
|
|
21
|
+
instance: T | GroupInstanceType,
|
|
22
|
+
) => {
|
|
14
23
|
const { id, name, type } = field;
|
|
15
24
|
const value = instance[id];
|
|
16
25
|
if (type === "boolean") {
|
|
17
|
-
return <ValueBoolean label={name} value={value} />;
|
|
26
|
+
return <ValueBoolean label={name} value={value as boolean} />;
|
|
18
27
|
} else if (type === "date" || type === "time" || type === "datetime") {
|
|
19
|
-
return <ValueDatetime label={name} value={value} format={field.format} />;
|
|
28
|
+
return <ValueDatetime label={name} value={value as Date} format={field.format} />;
|
|
20
29
|
}
|
|
21
30
|
return <ValueText label={name} value={value?.toString()} />;
|
|
22
31
|
};
|
|
23
32
|
|
|
24
|
-
interface ObjectDetailGroupProps
|
|
33
|
+
interface ObjectDetailGroupProps {
|
|
25
34
|
field: GroupField;
|
|
26
|
-
instance:
|
|
35
|
+
instance: GroupInstanceType;
|
|
27
36
|
}
|
|
28
37
|
|
|
29
|
-
const ObjectDetailGroup =
|
|
38
|
+
const ObjectDetailGroup = ({
|
|
30
39
|
field: { name, description, value },
|
|
31
40
|
instance,
|
|
32
|
-
}: ObjectDetailGroupProps
|
|
41
|
+
}: ObjectDetailGroupProps) => {
|
|
33
42
|
return (
|
|
34
43
|
<GroupValueCard title={name} subtitle={description}>
|
|
35
44
|
{value.map((field) => {
|
|
@@ -61,7 +70,7 @@ export const ObjectDetails = <T extends BasicModelInstance>({
|
|
|
61
70
|
if (type === "group") {
|
|
62
71
|
return (
|
|
63
72
|
<Grid item key={id} xs={12}>
|
|
64
|
-
<ObjectDetailGroup field={field} instance={instance[id]} />
|
|
73
|
+
<ObjectDetailGroup field={field} instance={instance[id] as GroupInstanceType} />
|
|
65
74
|
</Grid>
|
|
66
75
|
);
|
|
67
76
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Box, Button, Typography } from "@mui/material";
|
|
2
2
|
import React, { useState } from "react";
|
|
3
3
|
import { Routes, Route } from "react-router-dom";
|
|
4
|
-
import { render, screen } from "
|
|
4
|
+
import { render, screen } from "~/tests/testing-library";
|
|
5
5
|
import { useNavigateWhenValueChanges } from "./routing.hooks";
|
|
6
6
|
import userEvent from "@testing-library/user-event";
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { ComponentMeta } from "@storybook/react";
|
|
3
3
|
import { AppBarWithDrawerLayout } from "./app-bar-with-drawer-layout";
|
|
4
|
-
import { ContentPlaceholder } from "
|
|
4
|
+
import { ContentPlaceholder } from "~/tests/components";
|
|
5
5
|
import { mockNav } from "../../components/drawer/drawer.mock";
|
|
6
6
|
import { MiniAppBar } from "../../components/app-bar";
|
|
7
7
|
import { DrawerContent, MiniDrawer } from "../../components";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { MiniDrawerStory } from "./app-bar-with-drawer-layout.stories";
|
|
3
|
-
import {
|
|
3
|
+
import { render, screen } from "~/tests/testing-library";
|
|
4
4
|
import userEvent from "@testing-library/user-event";
|
|
5
|
+
import { expectContentPlaceholder } from "~/tests/assertions";
|
|
5
6
|
|
|
6
7
|
describe("AppBarWithDrawerLayout", () => {
|
|
7
8
|
const renderComponent = () => {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React, { ReactElement } from "react";
|
|
2
2
|
import { ComponentMeta } from "@storybook/react";
|
|
3
3
|
import { createTemplate } from "../../storybook";
|
|
4
|
-
import { HeaderLayout } from "./header-layout";
|
|
4
|
+
import { HeaderLayout, HeaderLayoutProps } from "./header-layout";
|
|
5
5
|
import { withMemoryRouter } from "~/storybook";
|
|
6
|
-
import { SkeletonGrid } from "../../tests";
|
|
6
|
+
import { SkeletonGrid } from "../../tests/components";
|
|
7
7
|
import { withFullHeight } from "../../storybook";
|
|
8
8
|
import { Content, Header, HeaderProps, HeaderTab, TableList, TabPanel } from "../../components";
|
|
9
9
|
import { Box, Typography } from "@mui/material";
|
|
@@ -58,7 +58,7 @@ export default {
|
|
|
58
58
|
},
|
|
59
59
|
} as ComponentMeta<typeof HeaderLayout>;
|
|
60
60
|
|
|
61
|
-
interface HeaderLayoutStoryProps {
|
|
61
|
+
interface HeaderLayoutStoryProps extends HeaderLayoutProps {
|
|
62
62
|
headerProps: HeaderProps;
|
|
63
63
|
contentChildren: ReactElement;
|
|
64
64
|
}
|
|
@@ -102,7 +102,14 @@ const ListContent = () => {
|
|
|
102
102
|
numeric: false,
|
|
103
103
|
}));
|
|
104
104
|
|
|
105
|
-
return
|
|
105
|
+
return (
|
|
106
|
+
<TableList
|
|
107
|
+
data={rows as any}
|
|
108
|
+
columns={columns}
|
|
109
|
+
defaultSort={columns[0].id}
|
|
110
|
+
defaultOrder="asc"
|
|
111
|
+
/>
|
|
112
|
+
);
|
|
106
113
|
};
|
|
107
114
|
|
|
108
115
|
export const List = Template.bind({});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { HeaderLayout } from "./header-layout";
|
|
3
|
-
import { render, screen } from "
|
|
3
|
+
import { render, screen } from "~/tests/testing-library";
|
|
4
4
|
import { Content, Header } from "../../components";
|
|
5
5
|
import { Typography } from "@mui/material";
|
|
6
6
|
|
|
@@ -4,7 +4,7 @@ import { ContentElement, HeaderElement } from "../../components";
|
|
|
4
4
|
import { LoadingArea } from "../../components/loading-area";
|
|
5
5
|
import { TabProvider } from "../../providers";
|
|
6
6
|
|
|
7
|
-
interface HeaderLayoutProps {
|
|
7
|
+
export interface HeaderLayoutProps {
|
|
8
8
|
loading?: boolean;
|
|
9
9
|
children: [HeaderElement, ContentElement];
|
|
10
10
|
}
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
1
|
import { AlertColor } from "@mui/material";
|
|
3
2
|
import React from "react";
|
|
4
3
|
|
|
5
4
|
export const NotificationCenterProviderUndefinedError = new Error(
|
|
6
5
|
"NotificationCenterContext.Provider is required and was undefined",
|
|
7
6
|
);
|
|
8
|
-
export type SnackbarContentType =
|
|
9
|
-
| React.ReactElement<any, any>
|
|
10
|
-
| ((key: string) => React.ReactElement<any, any>);
|
|
11
|
-
|
|
12
|
-
export type SnackbarActionType = React.ReactNode | ((key: string) => React.ReactNode);
|
|
13
7
|
|
|
14
8
|
export interface Notification {
|
|
15
9
|
severity: AlertColor;
|
|
@@ -2,7 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { ComponentMeta } from "@storybook/react";
|
|
3
3
|
import { NotificationCenterProvider } from "./notification-center.provider";
|
|
4
4
|
import { useNotificationCenter } from "./notification-center.context";
|
|
5
|
-
import { ContentPlaceholder } from "
|
|
5
|
+
import { ContentPlaceholder } from "~/tests/components";
|
|
6
6
|
import { Button, Box } from "@mui/material";
|
|
7
7
|
|
|
8
8
|
const DummyError = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useState } from "react";
|
|
2
2
|
import userEvent from "@testing-library/user-event";
|
|
3
3
|
import { AlertColor, Box, Button } from "@mui/material";
|
|
4
|
-
import { render, screen, waitForElementToBeRemoved
|
|
4
|
+
import { render, screen, waitForElementToBeRemoved } from "~/tests/testing-library";
|
|
5
5
|
import { NotificationCenterProvider } from "./notification-center.provider";
|
|
6
6
|
import {
|
|
7
7
|
NotificationCenterContext,
|
|
@@ -10,6 +10,8 @@ import {
|
|
|
10
10
|
Notification,
|
|
11
11
|
} from "./notification-center.context";
|
|
12
12
|
import { useNotifyWhenValueChanges } from "./notification-center.hooks";
|
|
13
|
+
import { expectAlert } from "~/tests/assertions";
|
|
14
|
+
import { mockConsoleError } from "~/tests/mocks";
|
|
13
15
|
|
|
14
16
|
describe("NotificationCenterProvider", () => {
|
|
15
17
|
const renderComponent = ({ autoHideDuration }: { autoHideDuration?: number } = {}) => {
|
|
@@ -99,18 +101,15 @@ describe("NotificationCenterProvider", () => {
|
|
|
99
101
|
});
|
|
100
102
|
|
|
101
103
|
describe("useNotificationCenter", () => {
|
|
104
|
+
mockConsoleError();
|
|
105
|
+
|
|
102
106
|
it("would throw an error if the component is not wrapped by a NotificationCenterContext.Provider", () => {
|
|
103
107
|
const FailingComponent = () => {
|
|
104
108
|
useNotificationCenter();
|
|
105
109
|
return <Box>FailingComponent</Box>;
|
|
106
110
|
};
|
|
107
111
|
|
|
108
|
-
|
|
109
|
-
render(<FailingComponent />);
|
|
110
|
-
fail();
|
|
111
|
-
} catch (err) {
|
|
112
|
-
expect(err).toStrictEqual(NotificationCenterProviderUndefinedError);
|
|
113
|
-
}
|
|
112
|
+
expect(() => render(<FailingComponent />)).toThrow(NotificationCenterProviderUndefinedError);
|
|
114
113
|
});
|
|
115
114
|
});
|
|
116
115
|
|
package/src/storybook.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import { action } from "@storybook/addon-actions";
|
|
|
9
9
|
import { LocalizationProvider } from "@mui/x-date-pickers/";
|
|
10
10
|
import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns";
|
|
11
11
|
|
|
12
|
-
export function createTemplate<P>(
|
|
12
|
+
export function createTemplate<P extends object>(
|
|
13
13
|
C: JSXElementConstructor<P>,
|
|
14
14
|
): ComponentStory<JSXElementConstructor<P>> {
|
|
15
15
|
return (args) => <C {...args} />;
|
package/src/tests/actions.ts
CHANGED
|
@@ -2,6 +2,10 @@ import userEvent from "@testing-library/user-event";
|
|
|
2
2
|
import { screen, fireEvent } from "./testing-library";
|
|
3
3
|
import { format } from "date-fns";
|
|
4
4
|
|
|
5
|
+
export const typeNumericInput = (element: HTMLElement, value: number) => {
|
|
6
|
+
fireEvent.change(element, { target: { value } });
|
|
7
|
+
};
|
|
8
|
+
|
|
5
9
|
export const selectOption = async (element: HTMLElement, option: string) => {
|
|
6
10
|
await userEvent.click(element);
|
|
7
11
|
await userEvent.click(screen.getByRole("option", { name: option }));
|
package/src/tests/assertions.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AlertColor } from "@mui/material";
|
|
2
|
-
import { ModelField } from "../generators";
|
|
2
|
+
import { BasicModelInstance, GroupInstanceType, ModelField } from "../generators";
|
|
3
3
|
import { screen, waitForElementToBeRemoved } from "./testing-library";
|
|
4
4
|
import { format } from "date-fns";
|
|
5
5
|
import { MockInstance } from "../generators/generators.mock";
|
|
@@ -26,19 +26,22 @@ export const expectModelFieldInputExist = (fields: ModelField[]) => {
|
|
|
26
26
|
});
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
export const expectModelFieldInputValue = (
|
|
29
|
+
export const expectModelFieldInputValue = (
|
|
30
|
+
fields: ModelField[],
|
|
31
|
+
initialValues: BasicModelInstance | GroupInstanceType,
|
|
32
|
+
) => {
|
|
30
33
|
fields.forEach((field) => {
|
|
31
34
|
const value = initialValues[field.id];
|
|
32
35
|
if (field.type === "group") {
|
|
33
|
-
expectModelFieldInputValue(field.value, value);
|
|
36
|
+
expectModelFieldInputValue(field.value, value as GroupInstanceType);
|
|
34
37
|
} else if (field.type === "number") {
|
|
35
|
-
expect(screen.getByDisplayValue(value
|
|
38
|
+
expect(screen.getByDisplayValue(value as number)).toBeInTheDocument();
|
|
36
39
|
} else if (field.type === "boolean") {
|
|
37
40
|
expect(
|
|
38
|
-
screen.getByRole("checkbox", { name: field.name, checked: value }),
|
|
41
|
+
screen.getByRole("checkbox", { name: field.name, checked: value as boolean }),
|
|
39
42
|
).toBeInTheDocument();
|
|
40
43
|
} else if (field.type === "date" || field.type === "time" || field.type === "datetime") {
|
|
41
|
-
const expectedDateValue = format(value, field.format);
|
|
44
|
+
const expectedDateValue = format(value as Date, field.format);
|
|
42
45
|
expect(screen.getByRole("textbox", { name: field.name })).toHaveAttribute(
|
|
43
46
|
"value",
|
|
44
47
|
expectedDateValue,
|
|
@@ -49,14 +52,19 @@ export const expectModelFieldInputValue = (fields: ModelField[], initialValues:
|
|
|
49
52
|
});
|
|
50
53
|
};
|
|
51
54
|
|
|
52
|
-
export const expectModelFieldValue = (
|
|
55
|
+
export const expectModelFieldValue = (
|
|
56
|
+
field: ModelField,
|
|
57
|
+
instance: BasicModelInstance | GroupInstanceType,
|
|
58
|
+
) => {
|
|
53
59
|
const { id, type, name, description } = field;
|
|
54
60
|
const value = instance[id];
|
|
55
61
|
|
|
56
62
|
if (type === "group") {
|
|
57
63
|
expect(screen.getByRole("heading", { level: 1, name }));
|
|
58
64
|
expect(screen.getByRole("heading", { level: 2, name: description }));
|
|
59
|
-
field.value.forEach((groupValue) =>
|
|
65
|
+
field.value.forEach((groupValue) =>
|
|
66
|
+
expectModelFieldValue(groupValue, value as GroupInstanceType),
|
|
67
|
+
);
|
|
60
68
|
return;
|
|
61
69
|
}
|
|
62
70
|
|
|
@@ -64,10 +72,10 @@ export const expectModelFieldValue = (field: ModelField, instance: object) => {
|
|
|
64
72
|
if (type === "boolean") {
|
|
65
73
|
expect(screen.getByTestId(value ? "CheckIcon" : "CloseIcon")).toBeInTheDocument();
|
|
66
74
|
} else if (type === "date" || type === "time" || type === "datetime") {
|
|
67
|
-
const formatedValue = format(value, field.format);
|
|
75
|
+
const formatedValue = format(value as Date, field.format);
|
|
68
76
|
expect(screen.getByLabelText(name)).toHaveTextContent(formatedValue);
|
|
69
77
|
} else {
|
|
70
|
-
expect(screen.getByLabelText(name)).toHaveTextContent(value);
|
|
78
|
+
expect(screen.getByLabelText(name)).toHaveTextContent(value as string);
|
|
71
79
|
}
|
|
72
80
|
};
|
|
73
81
|
|
package/src/tests/components.tsx
CHANGED
|
@@ -2,6 +2,8 @@ import React, { PropsWithChildren } from "react";
|
|
|
2
2
|
import { Typography, Container, Skeleton, Grid, Box } from "@mui/material";
|
|
3
3
|
import { loremIpsum } from "lorem-ipsum";
|
|
4
4
|
import { newArrayWithSize } from "../utils";
|
|
5
|
+
import { useDemoData } from "@mui/x-data-grid-generator";
|
|
6
|
+
import { DataGrid } from "@mui/x-data-grid";
|
|
5
7
|
|
|
6
8
|
export const Placeholder = () => {
|
|
7
9
|
return (
|
|
@@ -14,7 +16,7 @@ export const Placeholder = () => {
|
|
|
14
16
|
);
|
|
15
17
|
};
|
|
16
18
|
|
|
17
|
-
interface SkeletonCardProps {
|
|
19
|
+
export interface SkeletonCardProps {
|
|
18
20
|
width?: number | string;
|
|
19
21
|
animation?: "pulse" | "wave" | false;
|
|
20
22
|
}
|
|
@@ -58,3 +60,35 @@ export const ContentPlaceholder = ({ size = 20, children, p }: ContentPlaceholde
|
|
|
58
60
|
</Container>
|
|
59
61
|
);
|
|
60
62
|
};
|
|
63
|
+
|
|
64
|
+
export interface DatatablePlaceholderProps {
|
|
65
|
+
rowLength?: number;
|
|
66
|
+
maxColumns?: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const DatatablePlaceholder = ({
|
|
70
|
+
rowLength = 1000,
|
|
71
|
+
maxColumns = 10,
|
|
72
|
+
}: DatatablePlaceholderProps) => {
|
|
73
|
+
const {
|
|
74
|
+
data: { rows, columns },
|
|
75
|
+
} = useDemoData({
|
|
76
|
+
dataSet: "Commodity",
|
|
77
|
+
rowLength,
|
|
78
|
+
maxColumns,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<Box sx={{ height: 400, width: 1 }}>
|
|
83
|
+
<DataGrid
|
|
84
|
+
rows={rows}
|
|
85
|
+
columns={columns}
|
|
86
|
+
pageSize={5}
|
|
87
|
+
rowsPerPageOptions={[5]}
|
|
88
|
+
checkboxSelection
|
|
89
|
+
disableSelectionOnClick
|
|
90
|
+
experimentalFeatures={{ newEditingApi: true }}
|
|
91
|
+
/>
|
|
92
|
+
</Box>
|
|
93
|
+
);
|
|
94
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = "";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const mockConsoleError = () => {
|
|
2
|
+
mockConsole("error");
|
|
3
|
+
};
|
|
4
|
+
|
|
5
|
+
export const mockConsoleWarn = () => {
|
|
6
|
+
mockConsole("warn");
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const mockConsole = (severity: "error" | "warn") => {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
let logFn: (message?: any, ...optionalParams: any[]) => void;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
logFn = console[severity];
|
|
15
|
+
console[severity] = jest.fn();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
console[severity] = logFn;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { render, RenderOptions } from "@testing-library/react";
|
|
1
|
+
import { render, RenderOptions, RenderResult } from "@testing-library/react";
|
|
2
2
|
import { MemoryRouter, Router } from "react-router-dom";
|
|
3
3
|
import { createMemoryHistory, MemoryHistory } from "history";
|
|
4
4
|
import React from "react";
|
|
@@ -28,12 +28,11 @@ const createWrapper =
|
|
|
28
28
|
const isMemoryRouter = router === "memory";
|
|
29
29
|
|
|
30
30
|
const R = isMemoryRouter ? MemoryRouter : Router;
|
|
31
|
-
const routerArgs =
|
|
32
|
-
|
|
33
|
-
:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
};
|
|
31
|
+
const routerArgs = {
|
|
32
|
+
location: history.location,
|
|
33
|
+
navigator: history,
|
|
34
|
+
};
|
|
35
|
+
|
|
37
36
|
return (
|
|
38
37
|
<ThemeProvider theme={theme}>
|
|
39
38
|
<LocalizationProvider dateAdapter={AdapterDateFns}>
|
|
@@ -49,7 +48,11 @@ interface CustomRenderOptions {
|
|
|
49
48
|
router?: TestRouter;
|
|
50
49
|
}
|
|
51
50
|
|
|
52
|
-
|
|
51
|
+
type CustomRenderResult = RenderResult & { history: MemoryHistory };
|
|
52
|
+
const customRender = (
|
|
53
|
+
ui: React.ReactElement,
|
|
54
|
+
options: CustomRenderOptions = {},
|
|
55
|
+
): CustomRenderResult => {
|
|
53
56
|
const renderOptions = options.renderOptions || {};
|
|
54
57
|
const mode = options.mode || "light";
|
|
55
58
|
const router = options.router || "router";
|
package/src/tests/index.ts
DELETED