@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.
Files changed (191) hide show
  1. package/dist/cjs/index.js +1 -31
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/components/app-bar/app-bar.types.d.ts +2 -2
  4. package/dist/cjs/types/components/bullet/bullet.d.ts +1 -1
  5. package/dist/cjs/types/components/content/content.types.d.ts +3 -3
  6. package/dist/cjs/types/components/drawer/drawer.provider.d.ts +1 -1
  7. package/dist/cjs/types/components/drawer/drawer.types.d.ts +4 -4
  8. package/dist/cjs/types/components/enhanced-select/enhanced-select.d.ts +1 -2
  9. package/dist/cjs/types/components/header/header.dummy.d.ts +1 -1
  10. package/dist/cjs/types/components/header/header.types.d.ts +6 -6
  11. package/dist/cjs/types/components/label/label.d.ts +1 -1
  12. package/dist/cjs/types/components/link/link.d.ts +1 -1
  13. package/dist/cjs/types/components/placeholder/placeholder.d.ts +1 -1
  14. package/dist/cjs/types/components/query-container/query-container.d.ts +1 -1
  15. package/dist/cjs/types/components/sign-in/sign-in.d.ts +2 -3
  16. package/dist/cjs/types/components/tab/tab-card/tab-card.d.ts +3 -4
  17. package/dist/cjs/types/components/tab/tab-card/tab-card.dummy.d.ts +2 -3
  18. package/dist/cjs/types/components/table/enhanced-remote-table/enhanced-remote-table.d.ts +5 -6
  19. package/dist/cjs/types/components/table/enhanced-remote-table/enhanced-remote-table.mock.d.ts +6 -6
  20. package/dist/cjs/types/components/table/enhanced-table/enhanced-table-head.d.ts +8 -8
  21. package/dist/cjs/types/components/table/enhanced-table/enhanced-table.d.ts +2 -2
  22. package/dist/cjs/types/components/table/enhanced-table/enhanced-table.mock.d.ts +6 -7
  23. package/dist/cjs/types/components/table-list/table-list.d.ts +2 -2
  24. package/dist/cjs/types/components/value-displays/group-value-card/group-value-card.d.ts +7 -4
  25. package/dist/cjs/types/components/value-displays/group-value-card/group-value-card.mock.d.ts +2 -1
  26. package/dist/cjs/types/components/value-displays/index.d.ts +1 -0
  27. package/dist/cjs/types/components/value-displays/value-boolean/value-boolean.d.ts +3 -11
  28. package/dist/cjs/types/components/value-displays/value-card/value-card.d.ts +1 -1
  29. package/dist/cjs/types/components/value-displays/value-content/index.d.ts +1 -0
  30. package/dist/cjs/types/components/value-displays/value-content/value-content.d.ts +24 -0
  31. package/dist/cjs/types/components/value-displays/value-datetime/value-datetime.d.ts +3 -10
  32. package/dist/cjs/types/components/value-displays/value-displays.types.d.ts +15 -0
  33. package/dist/cjs/types/components/value-displays/value-image/index.d.ts +1 -0
  34. package/dist/cjs/types/components/value-displays/value-image/value-image.d.ts +11 -0
  35. package/dist/cjs/types/components/value-displays/value-text/value-text.d.ts +3 -11
  36. package/dist/cjs/types/generators/generators.mock.d.ts +2 -1
  37. package/dist/cjs/types/generators/generators.model.d.ts +36 -20
  38. package/dist/cjs/types/generators/generators.model.test.d.ts +1 -0
  39. package/dist/cjs/types/generators/model-router/model-router.d.ts +1 -1
  40. package/dist/cjs/types/generators/model-router/screens/add-screen.d.ts +1 -1
  41. package/dist/cjs/types/generators/model-router/screens/details-screen.d.ts +1 -1
  42. package/dist/cjs/types/generators/model-router/screens/list-screen.d.ts +1 -1
  43. package/dist/cjs/types/generators/model-router/screens/update-screen.d.ts +1 -1
  44. package/dist/cjs/types/layouts/header-layout/header-layout.d.ts +1 -2
  45. package/dist/cjs/types/providers/notification-center/notification-center.context.d.ts +0 -2
  46. package/dist/cjs/types/providers/notification-center/notification-center.provider.d.ts +1 -1
  47. package/dist/cjs/types/providers/tab-provider/tab-provider.provider.d.ts +1 -1
  48. package/dist/cjs/types/utils/theme.d.ts +1 -1
  49. package/dist/esm/index.js +1 -31
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/types/components/app-bar/app-bar.types.d.ts +2 -2
  52. package/dist/esm/types/components/bullet/bullet.d.ts +1 -1
  53. package/dist/esm/types/components/content/content.types.d.ts +3 -3
  54. package/dist/esm/types/components/drawer/drawer.provider.d.ts +1 -1
  55. package/dist/esm/types/components/drawer/drawer.types.d.ts +4 -4
  56. package/dist/esm/types/components/enhanced-select/enhanced-select.d.ts +1 -2
  57. package/dist/esm/types/components/header/header.dummy.d.ts +1 -1
  58. package/dist/esm/types/components/header/header.types.d.ts +6 -6
  59. package/dist/esm/types/components/label/label.d.ts +1 -1
  60. package/dist/esm/types/components/link/link.d.ts +1 -1
  61. package/dist/esm/types/components/placeholder/placeholder.d.ts +1 -1
  62. package/dist/esm/types/components/query-container/query-container.d.ts +1 -1
  63. package/dist/esm/types/components/sign-in/sign-in.d.ts +2 -3
  64. package/dist/esm/types/components/tab/tab-card/tab-card.d.ts +3 -4
  65. package/dist/esm/types/components/tab/tab-card/tab-card.dummy.d.ts +2 -3
  66. package/dist/esm/types/components/table/enhanced-remote-table/enhanced-remote-table.d.ts +5 -6
  67. package/dist/esm/types/components/table/enhanced-remote-table/enhanced-remote-table.mock.d.ts +6 -6
  68. package/dist/esm/types/components/table/enhanced-table/enhanced-table-head.d.ts +8 -8
  69. package/dist/esm/types/components/table/enhanced-table/enhanced-table.d.ts +2 -2
  70. package/dist/esm/types/components/table/enhanced-table/enhanced-table.mock.d.ts +6 -7
  71. package/dist/esm/types/components/table-list/table-list.d.ts +2 -2
  72. package/dist/esm/types/components/value-displays/group-value-card/group-value-card.d.ts +7 -4
  73. package/dist/esm/types/components/value-displays/group-value-card/group-value-card.mock.d.ts +2 -1
  74. package/dist/esm/types/components/value-displays/index.d.ts +1 -0
  75. package/dist/esm/types/components/value-displays/value-boolean/value-boolean.d.ts +3 -11
  76. package/dist/esm/types/components/value-displays/value-card/value-card.d.ts +1 -1
  77. package/dist/esm/types/components/value-displays/value-content/index.d.ts +1 -0
  78. package/dist/esm/types/components/value-displays/value-content/value-content.d.ts +24 -0
  79. package/dist/esm/types/components/value-displays/value-datetime/value-datetime.d.ts +3 -10
  80. package/dist/esm/types/components/value-displays/value-displays.types.d.ts +15 -0
  81. package/dist/esm/types/components/value-displays/value-image/index.d.ts +1 -0
  82. package/dist/esm/types/components/value-displays/value-image/value-image.d.ts +11 -0
  83. package/dist/esm/types/components/value-displays/value-text/value-text.d.ts +3 -11
  84. package/dist/esm/types/generators/generators.mock.d.ts +2 -1
  85. package/dist/esm/types/generators/generators.model.d.ts +36 -20
  86. package/dist/esm/types/generators/generators.model.test.d.ts +1 -0
  87. package/dist/esm/types/generators/model-router/model-router.d.ts +1 -1
  88. package/dist/esm/types/generators/model-router/screens/add-screen.d.ts +1 -1
  89. package/dist/esm/types/generators/model-router/screens/details-screen.d.ts +1 -1
  90. package/dist/esm/types/generators/model-router/screens/list-screen.d.ts +1 -1
  91. package/dist/esm/types/generators/model-router/screens/update-screen.d.ts +1 -1
  92. package/dist/esm/types/layouts/header-layout/header-layout.d.ts +1 -2
  93. package/dist/esm/types/providers/notification-center/notification-center.context.d.ts +0 -2
  94. package/dist/esm/types/providers/notification-center/notification-center.provider.d.ts +1 -1
  95. package/dist/esm/types/providers/tab-provider/tab-provider.provider.d.ts +1 -1
  96. package/dist/esm/types/utils/theme.d.ts +1 -1
  97. package/dist/index.d.ts +155 -150
  98. package/package.json +58 -53
  99. package/src/components/app-bar/app-bar.stories.tsx +2 -1
  100. package/src/components/app-bar/app-bar.test.tsx +1 -1
  101. package/src/components/bullet/bullet.test.tsx +1 -1
  102. package/src/components/center-container/center-container.test.tsx +1 -1
  103. package/src/components/content/content.stories.tsx +1 -1
  104. package/src/components/content/content.test.tsx +1 -1
  105. package/src/components/drawer/__snapshots__/drawer.test.tsx.snap +3 -3
  106. package/src/components/drawer/drawer.test.tsx +8 -8
  107. package/src/components/drawer-content/drawer-content.stories.tsx +0 -1
  108. package/src/components/drawer-content/drawer-content.test.tsx +1 -1
  109. package/src/components/drawer-item/drawer-item.test.tsx +3 -3
  110. package/src/components/drawer-section/drawer-section.test.tsx +1 -1
  111. package/src/components/enhanced-select/enhanced-select.stories.tsx +10 -10
  112. package/src/components/enhanced-select/enhanced-select.test.tsx +9 -4
  113. package/src/components/enhanced-select/enhanced-select.tsx +1 -3
  114. package/src/components/header/header.dummy.ts +1 -1
  115. package/src/components/header/header.stories.tsx +0 -6
  116. package/src/components/header/header.test.tsx +1 -1
  117. package/src/components/label/label.test.tsx +1 -1
  118. package/src/components/link/link.tsx +2 -2
  119. package/src/components/loading-area/loading-area.test.tsx +2 -1
  120. package/src/components/placeholder/placeholder.test.tsx +3 -2
  121. package/src/components/query-container/query-container.test.tsx +2 -1
  122. package/src/components/sign-in/sign-in.test.tsx +2 -1
  123. package/src/components/sign-in/sign-in.tsx +3 -3
  124. package/src/components/tab/tab-card/tab-card.dummy.tsx +2 -2
  125. package/src/components/tab/tab-card/tab-card.stories.tsx +2 -2
  126. package/src/components/tab/tab-card/tab-card.test.tsx +1 -1
  127. package/src/components/tab/tab-card/tab-card.tsx +3 -3
  128. package/src/components/table/enhanced-remote-table/enhanced-remote-table.mock.tsx +7 -6
  129. package/src/components/table/enhanced-remote-table/enhanced-remote-table.test.tsx +3 -3
  130. package/src/components/table/enhanced-remote-table/enhanced-remote-table.tsx +8 -8
  131. package/src/components/table/enhanced-table/enhanced-table-head.tsx +14 -9
  132. package/src/components/table/enhanced-table/enhanced-table.mock.tsx +12 -6
  133. package/src/components/table/enhanced-table/enhanced-table.test.tsx +6 -5
  134. package/src/components/table/enhanced-table/enhanced-table.tsx +8 -8
  135. package/src/components/table-list/table-list.stories.tsx +27 -17
  136. package/src/components/table-list/table-list.test.tsx +11 -6
  137. package/src/components/table-list/table-list.tsx +23 -12
  138. package/src/components/value-displays/group-value-card/group-value-card.mock.tsx +2 -2
  139. package/src/components/value-displays/group-value-card/group-value-card.stories.tsx +24 -1
  140. package/src/components/value-displays/group-value-card/group-value-card.test.tsx +7 -2
  141. package/src/components/value-displays/group-value-card/group-value-card.tsx +13 -4
  142. package/src/components/value-displays/index.ts +1 -0
  143. package/src/components/value-displays/value-boolean/value-boolean.test.tsx +15 -3
  144. package/src/components/value-displays/value-boolean/value-boolean.tsx +17 -17
  145. package/src/components/value-displays/value-card/value-card.test.tsx +1 -1
  146. package/src/components/value-displays/value-content/index.ts +1 -0
  147. package/src/components/value-displays/value-content/value-content.stories.tsx +20 -0
  148. package/src/components/value-displays/value-content/value-content.test.tsx +50 -0
  149. package/src/components/value-displays/value-content/value-content.tsx +55 -0
  150. package/src/components/value-displays/value-datetime/value-datetime.stories.tsx +13 -0
  151. package/src/components/value-displays/value-datetime/value-datetime.test.tsx +24 -5
  152. package/src/components/value-displays/value-datetime/value-datetime.tsx +15 -22
  153. package/src/components/value-displays/value-displays.types.ts +18 -0
  154. package/src/components/value-displays/value-image/index.ts +1 -0
  155. package/src/components/value-displays/value-image/value-image.stories.tsx +28 -0
  156. package/src/components/value-displays/value-image/value-image.test.tsx +22 -0
  157. package/src/components/value-displays/value-image/value-image.tsx +24 -0
  158. package/src/components/value-displays/value-text/value-text.stories.tsx +11 -0
  159. package/src/components/value-displays/value-text/value-text.test.tsx +19 -5
  160. package/src/components/value-displays/value-text/value-text.tsx +16 -22
  161. package/src/generators/generators.mock.ts +25 -22
  162. package/src/generators/generators.model.test.ts +77 -0
  163. package/src/generators/generators.model.ts +78 -6
  164. package/src/generators/model-form/model-form.test.tsx +11 -14
  165. package/src/generators/model-form/model-form.tsx +33 -65
  166. package/src/generators/model-router/model-router.test.tsx +45 -32
  167. package/src/generators/model-router/screens/add-screen.tsx +2 -1
  168. package/src/generators/model-router/screens/details-screen.tsx +2 -1
  169. package/src/generators/model-router/screens/list-screen.tsx +1 -1
  170. package/src/generators/model-router/screens/update-screen.tsx +4 -5
  171. package/src/generators/model-router/stories/model-router.stories.tsx +1 -1
  172. package/src/generators/object-details/object-details.test.tsx +2 -1
  173. package/src/generators/object-details/object-details.tsx +18 -9
  174. package/src/hooks/routing/routing.test.tsx +1 -1
  175. package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.stories.tsx +1 -1
  176. package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.test.tsx +2 -1
  177. package/src/layouts/header-layout/header-layout.stories.tsx +11 -4
  178. package/src/layouts/header-layout/header-layout.test.tsx +1 -1
  179. package/src/layouts/header-layout/header-layout.tsx +1 -1
  180. package/src/providers/notification-center/notification-center.context.ts +0 -6
  181. package/src/providers/notification-center/notification-center.stories.tsx +1 -1
  182. package/src/providers/notification-center/notification-center.test.tsx +6 -7
  183. package/src/storybook.tsx +1 -1
  184. package/src/tests/actions.ts +4 -0
  185. package/src/tests/assertions.ts +18 -10
  186. package/src/tests/components.tsx +35 -1
  187. package/src/tests/file-mock.ts +1 -0
  188. package/src/tests/mocks.ts +21 -0
  189. package/src/tests/testing-library.tsx +11 -8
  190. package/src/types/index.d.ts +4 -0
  191. package/src/tests/index.ts +0 -4
@@ -1,10 +1,11 @@
1
1
  import React, { useEffect } from "react";
2
- import { useNavigate, useParams } from "react-router-dom";
2
+ import { useParams } from "react-router-dom";
3
3
  import { Content, Header } from "~/components";
4
- import { BasicModelInstance, ModelForm } from "~/generators";
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 { useNotificationCenter, useNotifyWhenValueChanges } from "../../../providers";
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, render } from "../../tests";
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 { ModelField, GroupField, Model, BasicModelInstance } from "../generators.model";
11
+ import {
12
+ ModelField,
13
+ GroupField,
14
+ Model,
15
+ BasicModelInstance,
16
+ GroupInstanceType,
17
+ } from "../generators.model";
12
18
 
13
- const singleDetailValueFactory = <T extends BasicModelInstance>(field: ModelField, instance: T) => {
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<T extends BasicModelInstance> {
33
+ interface ObjectDetailGroupProps {
25
34
  field: GroupField;
26
- instance: T;
35
+ instance: GroupInstanceType;
27
36
  }
28
37
 
29
- const ObjectDetailGroup = <T extends BasicModelInstance>({
38
+ const ObjectDetailGroup = ({
30
39
  field: { name, description, value },
31
40
  instance,
32
- }: ObjectDetailGroupProps<T>) => {
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 "../../tests";
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 "../../tests";
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 { expectContentPlaceholder, render, screen } from "../../tests";
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 <TableList data={rows} columns={columns} defaultSort={columns[0].id} defaultOrder="asc" />;
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 "../../tests";
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 "../../tests";
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, expectAlert } from "../../tests";
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
- try {
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} />;
@@ -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 }));
@@ -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 = (fields: ModelField[], initialValues: object) => {
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.toString())).toBeInTheDocument();
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 = (field: ModelField, instance: object) => {
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) => expectModelFieldValue(groupValue, value));
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
 
@@ -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 = isMemoryRouter
32
- ? {}
33
- : {
34
- location: history.location,
35
- navigator: history,
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
- const customRender = (ui: React.ReactElement, options: CustomRenderOptions = {}) => {
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";
@@ -0,0 +1,4 @@
1
+ declare module "*.jpg" {
2
+ const value: string;
3
+ export default value;
4
+ }
@@ -1,4 +0,0 @@
1
- export * from "./components";
2
- export * from "./testing-library";
3
- export * from "./assertions";
4
- export * from "./actions";