@pautena/react-design-system 0.1.2 → 0.2.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.
Files changed (191) hide show
  1. package/README.md +4 -0
  2. package/dist/cjs/index.js +4 -259
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/types/generators/model-router/screens/add-screen.d.ts +1 -1
  5. package/dist/cjs/types/generators/model-router/screens/list-screen.d.ts +1 -1
  6. package/dist/cjs/types/generators/model-router/screens/screens.types.d.ts +20 -0
  7. package/dist/cjs/types/generators/model-router/screens/update-screen.d.ts +1 -1
  8. package/dist/cjs/types/index.d.ts +1 -0
  9. package/dist/esm/index.js +4 -259
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/types/generators/model-router/screens/add-screen.d.ts +1 -1
  12. package/dist/esm/types/generators/model-router/screens/list-screen.d.ts +1 -1
  13. package/dist/esm/types/generators/model-router/screens/screens.types.d.ts +20 -0
  14. package/dist/esm/types/generators/model-router/screens/update-screen.d.ts +1 -1
  15. package/dist/esm/types/index.d.ts +1 -0
  16. package/dist/index.d.ts +52 -3
  17. package/package.json +13 -2
  18. package/src/components/app-bar/app-bar.stories.tsx +54 -0
  19. package/src/components/app-bar/app-bar.test.tsx +142 -0
  20. package/src/components/app-bar/app-bar.tsx +150 -0
  21. package/src/components/app-bar/app-bar.types.ts +17 -0
  22. package/src/components/app-bar/index.ts +3 -0
  23. package/src/components/app-bar/mini-app-bar/index.ts +1 -0
  24. package/src/components/app-bar/mini-app-bar/mini-app-bar.tsx +31 -0
  25. package/src/components/bullet/bullet.stories.tsx +43 -0
  26. package/src/components/bullet/bullet.test.tsx +24 -0
  27. package/src/components/bullet/bullet.tsx +30 -0
  28. package/src/components/bullet/index.ts +1 -0
  29. package/src/components/center-container/center-container.stories.tsx +50 -0
  30. package/src/components/center-container/center-container.test.tsx +16 -0
  31. package/src/components/center-container/center-container.tsx +32 -0
  32. package/src/components/center-container/index.ts +1 -0
  33. package/src/components/content/content.stories.tsx +23 -0
  34. package/src/components/content/content.test.tsx +26 -0
  35. package/src/components/content/content.tsx +11 -0
  36. package/src/components/content/content.types.ts +5 -0
  37. package/src/components/content/index.ts +2 -0
  38. package/src/components/drawer/__snapshots__/drawer.test.tsx.snap +20 -0
  39. package/src/components/drawer/drawer.context.ts +20 -0
  40. package/src/components/drawer/drawer.mixins.ts +24 -0
  41. package/src/components/drawer/drawer.mock.tsx +100 -0
  42. package/src/components/drawer/drawer.provider.tsx +23 -0
  43. package/src/components/drawer/drawer.test.tsx +97 -0
  44. package/src/components/drawer/drawer.tsx +30 -0
  45. package/src/components/drawer/drawer.types.ts +53 -0
  46. package/src/components/drawer/index.ts +5 -0
  47. package/src/components/drawer/mini-drawer/index.ts +1 -0
  48. package/src/components/drawer/mini-drawer/mini-drawer.stories.tsx +34 -0
  49. package/src/components/drawer/mini-drawer/mini-drawer.tsx +67 -0
  50. package/src/components/drawer-content/drawer-content.stories.tsx +29 -0
  51. package/src/components/drawer-content/drawer-content.test.tsx +34 -0
  52. package/src/components/drawer-content/drawer-content.tsx +18 -0
  53. package/src/components/drawer-content/index.ts +1 -0
  54. package/src/components/drawer-item/drawer-item.stories.tsx +62 -0
  55. package/src/components/drawer-item/drawer-item.test.tsx +119 -0
  56. package/src/components/drawer-item/drawer-item.tsx +71 -0
  57. package/src/components/drawer-item/index.ts +1 -0
  58. package/src/components/drawer-section/drawer-section.mock.tsx +39 -0
  59. package/src/components/drawer-section/drawer-section.stories.tsx +28 -0
  60. package/src/components/drawer-section/drawer-section.test.tsx +44 -0
  61. package/src/components/drawer-section/drawer-section.tsx +40 -0
  62. package/src/components/drawer-section/index.ts +1 -0
  63. package/src/components/header/header.dummy.ts +55 -0
  64. package/src/components/header/header.stories.tsx +116 -0
  65. package/src/components/header/header.test.tsx +159 -0
  66. package/src/components/header/header.tsx +121 -0
  67. package/src/components/header/header.types.ts +61 -0
  68. package/src/components/header/index.ts +2 -0
  69. package/src/components/index.ts +18 -0
  70. package/src/components/label/index.ts +1 -0
  71. package/src/components/label/label.stories.tsx +49 -0
  72. package/src/components/label/label.test.tsx +30 -0
  73. package/src/components/label/label.tsx +60 -0
  74. package/src/components/link/index.ts +1 -0
  75. package/src/components/link/link.tsx +17 -0
  76. package/src/components/loading-area/index.ts +1 -0
  77. package/src/components/loading-area/loading-area.stories.tsx +17 -0
  78. package/src/components/loading-area/loading-area.test.tsx +11 -0
  79. package/src/components/loading-area/loading-area.tsx +13 -0
  80. package/src/components/placeholder/index.ts +1 -0
  81. package/src/components/placeholder/placeholder.mock.ts +15 -0
  82. package/src/components/placeholder/placeholder.stories.tsx +44 -0
  83. package/src/components/placeholder/placeholder.test.tsx +76 -0
  84. package/src/components/placeholder/placeholder.tsx +75 -0
  85. package/src/components/query-container/index.ts +1 -0
  86. package/src/components/query-container/query-container.stories.tsx +68 -0
  87. package/src/components/query-container/query-container.test.tsx +95 -0
  88. package/src/components/query-container/query-container.tsx +71 -0
  89. package/src/components/sign-in/index.ts +1 -0
  90. package/src/components/sign-in/sign-in.stories.tsx +36 -0
  91. package/src/components/sign-in/sign-in.test.tsx +95 -0
  92. package/src/components/sign-in/sign-in.tsx +97 -0
  93. package/src/components/tab/index.ts +2 -0
  94. package/src/components/tab/tab-card/index.ts +1 -0
  95. package/src/components/tab/tab-card/tab-card.dummy.tsx +30 -0
  96. package/src/components/tab/tab-card/tab-card.stories.tsx +22 -0
  97. package/src/components/tab/tab-card/tab-card.test.tsx +53 -0
  98. package/src/components/tab/tab-card/tab-card.tsx +27 -0
  99. package/src/components/tab/tab-panel/index.ts +1 -0
  100. package/src/components/tab/tab-panel/tab-panel.test.tsx +26 -0
  101. package/src/components/tab/tab-panel/tab-panel.tsx +27 -0
  102. package/src/components/table/enhanced-remote-table/enhanced-remote-table.mock.tsx +27 -0
  103. package/src/components/table/enhanced-remote-table/enhanced-remote-table.stories.tsx +24 -0
  104. package/src/components/table/enhanced-remote-table/enhanced-remote-table.test.tsx +77 -0
  105. package/src/components/table/enhanced-remote-table/enhanced-remote-table.tsx +74 -0
  106. package/src/components/table/enhanced-remote-table/index.ts +1 -0
  107. package/src/components/table/enhanced-table/enhanced-table-head.tsx +58 -0
  108. package/src/components/table/enhanced-table/enhanced-table.mock.tsx +93 -0
  109. package/src/components/table/enhanced-table/enhanced-table.stories.tsx +21 -0
  110. package/src/components/table/enhanced-table/enhanced-table.test.tsx +107 -0
  111. package/src/components/table/enhanced-table/enhanced-table.tsx +136 -0
  112. package/src/components/table/enhanced-table/index.ts +2 -0
  113. package/src/components/table/index.ts +2 -0
  114. package/src/components/table-list/index.ts +1 -0
  115. package/src/components/table-list/table-list.stories.tsx +75 -0
  116. package/src/components/table-list/table-list.test.tsx +291 -0
  117. package/src/components/table-list/table-list.tsx +127 -0
  118. package/src/components/value-displays/group-value-card/group-value-card.mock.tsx +35 -0
  119. package/src/components/value-displays/group-value-card/group-value-card.stories.tsx +26 -0
  120. package/src/components/value-displays/group-value-card/group-value-card.test.tsx +58 -0
  121. package/src/components/value-displays/group-value-card/group-value-card.tsx +63 -0
  122. package/src/components/value-displays/group-value-card/index.ts +1 -0
  123. package/src/components/value-displays/index.ts +4 -0
  124. package/src/components/value-displays/value-boolean/index.ts +1 -0
  125. package/src/components/value-displays/value-boolean/value-boolean.stories.tsx +25 -0
  126. package/src/components/value-displays/value-boolean/value-boolean.test.tsx +27 -0
  127. package/src/components/value-displays/value-boolean/value-boolean.tsx +33 -0
  128. package/src/components/value-displays/value-card/index.ts +1 -0
  129. package/src/components/value-displays/value-card/value-card.stories.tsx +22 -0
  130. package/src/components/value-displays/value-card/value-card.test.tsx +18 -0
  131. package/src/components/value-displays/value-card/value-card.tsx +12 -0
  132. package/src/components/value-displays/value-text/index.ts +1 -0
  133. package/src/components/value-displays/value-text/value-test.test.tsx +21 -0
  134. package/src/components/value-displays/value-text/value-text.stories.tsx +26 -0
  135. package/src/components/value-displays/value-text/value-text.tsx +32 -0
  136. package/src/generators/generators.mock.ts +238 -0
  137. package/src/generators/generators.model.ts +46 -0
  138. package/src/generators/index.ts +4 -0
  139. package/src/generators/model-form/index.ts +1 -0
  140. package/src/generators/model-form/model-form.stories.tsx +30 -0
  141. package/src/generators/model-form/model-form.test.tsx +100 -0
  142. package/src/generators/model-form/model-form.tsx +97 -0
  143. package/src/generators/model-router/index.ts +1 -0
  144. package/src/generators/model-router/model-router.test.tsx +831 -0
  145. package/src/generators/model-router/model-router.tsx +30 -0
  146. package/src/generators/model-router/model-router.types.ts +14 -0
  147. package/src/generators/model-router/screens/add-screen.tsx +70 -0
  148. package/src/generators/model-router/screens/details-screen.tsx +62 -0
  149. package/src/generators/model-router/screens/index.ts +4 -0
  150. package/src/generators/model-router/screens/list-screen.tsx +125 -0
  151. package/src/generators/model-router/screens/screens.types.ts +38 -0
  152. package/src/generators/model-router/screens/update-screen.tsx +97 -0
  153. package/src/generators/model-router/stories/details-screen.stories.tsx +38 -0
  154. package/src/generators/model-router/stories/list-screen.stories.tsx +96 -0
  155. package/src/generators/model-router/stories/model-router.stories.tsx +176 -0
  156. package/src/generators/model-router/stories/templates.tsx +39 -0
  157. package/src/generators/object-details/index.ts +1 -0
  158. package/src/generators/object-details/object-details.stories.tsx +20 -0
  159. package/src/generators/object-details/object-details.test.tsx +21 -0
  160. package/src/generators/object-details/object-details.tsx +76 -0
  161. package/src/index.ts +5 -0
  162. package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.stories.tsx +28 -0
  163. package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.test.tsx +30 -0
  164. package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.tsx +37 -0
  165. package/src/layouts/app-bar-with-drawer-layout/index.ts +1 -0
  166. package/src/layouts/header-layout/header-layout.stories.tsx +204 -0
  167. package/src/layouts/header-layout/header-layout.test.tsx +37 -0
  168. package/src/layouts/header-layout/header-layout.tsx +23 -0
  169. package/src/layouts/header-layout/index.ts +1 -0
  170. package/src/layouts/index.ts +2 -0
  171. package/src/providers/index.ts +2 -0
  172. package/src/providers/notification-center/index.ts +2 -0
  173. package/src/providers/notification-center/notification-center.context.ts +37 -0
  174. package/src/providers/notification-center/notification-center.provider.tsx +51 -0
  175. package/src/providers/notification-center/notification-center.stories.tsx +52 -0
  176. package/src/providers/notification-center/notification-center.test.tsx +112 -0
  177. package/src/providers/tab-provider/index.ts +2 -0
  178. package/src/providers/tab-provider/tab-provider.context.ts +8 -0
  179. package/src/providers/tab-provider/tab-provider.provider.tsx +13 -0
  180. package/src/storybook.tsx +90 -0
  181. package/src/tests/assertions.ts +76 -0
  182. package/src/tests/components.tsx +60 -0
  183. package/src/tests/content-placeholder.stories.tsx +16 -0
  184. package/src/tests/index.ts +3 -0
  185. package/src/tests/skeleton-card.stories.tsx +18 -0
  186. package/src/tests/testing-library.tsx +65 -0
  187. package/src/utils/arrays.test.ts +9 -0
  188. package/src/utils/arrays.ts +7 -0
  189. package/src/utils/index.ts +2 -0
  190. package/src/utils/theme.ts +11 -0
  191. package/.prettierrc.js +0 -5
@@ -0,0 +1,100 @@
1
+ import React from "react";
2
+ import { ModelForm } from "./model-form";
3
+ import {
4
+ expectModelFieldInputExist,
5
+ expectModelFieldInputValue,
6
+ render,
7
+ screen,
8
+ } from "../../tests";
9
+ import { createModelInstance, MockInstance, mockModel } from "../generators.mock";
10
+ import userEvent from "@testing-library/user-event";
11
+
12
+ describe("ModelForm", () => {
13
+ const renderComponent = ({
14
+ initialValues = undefined,
15
+ }: { initialValues?: MockInstance } = {}) => {
16
+ const onSubmit = jest.fn();
17
+ const instance = render(
18
+ <ModelForm
19
+ model={mockModel}
20
+ initialValues={initialValues}
21
+ saveButtonText="save"
22
+ onSubmit={onSubmit}
23
+ />,
24
+ );
25
+
26
+ return { ...instance, onSubmit };
27
+ };
28
+
29
+ it("would render a button", () => {
30
+ renderComponent();
31
+
32
+ expect(screen.getByRole("button", { name: /save/i })).toBeInTheDocument();
33
+ });
34
+
35
+ it("would render an input for each model", () => {
36
+ renderComponent();
37
+
38
+ expectModelFieldInputExist(mockModel.fields);
39
+ });
40
+
41
+ it("would render the initial value if initialValues is provided", () => {
42
+ const initialValues = createModelInstance<MockInstance>(mockModel);
43
+ renderComponent({ initialValues });
44
+
45
+ expectModelFieldInputValue(mockModel.fields, initialValues);
46
+ });
47
+
48
+ it("would call onSubmit if I fullfill all inputs and press the submit button", async () => {
49
+ const { onSubmit } = renderComponent();
50
+
51
+ await userEvent.type(screen.getByRole("textbox", { name: "Id" }), "Id-1");
52
+ await userEvent.type(screen.getByRole("textbox", { name: /first name/i }), "Karianne");
53
+ await userEvent.type(screen.getByRole("textbox", { name: /middle name/i }), "Noah");
54
+ await userEvent.type(screen.getByRole("textbox", { name: /last name/i }), "Gorczany");
55
+ await userEvent.type(screen.getByRole("textbox", { name: /gender/i }), "Cis Man");
56
+ await userEvent.type(screen.getByRole("spinbutton", { name: /age/i }), "37");
57
+ await userEvent.type(
58
+ screen.getByRole("textbox", { name: /birth date/i }),
59
+ "Tue Nov 26 2047 12:14:19",
60
+ );
61
+ await userEvent.type(screen.getByRole("textbox", { name: /model/i }), "Spyder");
62
+ await userEvent.type(screen.getByRole("textbox", { name: /manufacturer/i }), "Bugatti");
63
+ await userEvent.type(screen.getByRole("textbox", { name: /color/i }), "red");
64
+ await userEvent.type(screen.getByRole("textbox", { name: /type/i }), "Convertible");
65
+ await userEvent.type(screen.getByRole("textbox", { name: /vin/i }), "46N6UE4VJ2XL28828");
66
+ await userEvent.type(screen.getByRole("textbox", { name: /vrm/i }), "NE51AFH");
67
+ await userEvent.type(screen.getByRole("spinbutton", { name: /q/i }), "9");
68
+ await userEvent.type(screen.getByRole("textbox", { name: /available/i }), "true");
69
+ await userEvent.type(screen.getByRole("textbox", { name: /currency/i }), "mxn");
70
+ await userEvent.type(
71
+ screen.getByRole("textbox", { name: /trade date/i }),
72
+ "Thu Jul 21 2022 22:44:10",
73
+ );
74
+
75
+ await userEvent.click(screen.getByRole("button", { name: /save/i }));
76
+
77
+ expect(onSubmit).toHaveBeenCalledTimes(1);
78
+ expect(onSubmit).toHaveBeenCalledWith({
79
+ id: "Id-1",
80
+ firstName: "Karianne",
81
+ middleName: "Noah",
82
+ lastName: "Gorczany",
83
+ gender: "Cis Man",
84
+ age: "37",
85
+ birthDate: "Tue Nov 26 2047 12:14:19",
86
+ car: {
87
+ model: "Spyder",
88
+ manufacturer: "Bugatti",
89
+ color: "red",
90
+ type: "Convertible",
91
+ vin: "46N6UE4VJ2XL28828",
92
+ vrm: "NE51AFH",
93
+ },
94
+ quantity: "9",
95
+ available: "true",
96
+ currency: "mxn",
97
+ tradeDate: "Thu Jul 21 2022 22:44:10",
98
+ });
99
+ });
100
+ });
@@ -0,0 +1,97 @@
1
+ import { Box, Button, Grid, Paper, TextField, Typography } from "@mui/material";
2
+ import React, { ChangeEvent, FormEvent } from "react";
3
+ import { useState } from "react";
4
+ import { useGetDefaultThemeColor } from "../../utils/theme";
5
+ import { Model, ModelField, BasicModelInstance } from "../generators.model";
6
+
7
+ export interface ModelFormProps<T extends BasicModelInstance> {
8
+ model: Model;
9
+ initialValues?: T;
10
+ saveButtonText: string;
11
+ onSubmit: (values: T) => void;
12
+ }
13
+
14
+ export const ModelForm = <T extends BasicModelInstance>({
15
+ model,
16
+ saveButtonText,
17
+ onSubmit,
18
+ initialValues,
19
+ }: ModelFormProps<T>) => {
20
+ const [values, setValues] = useState<T>(initialValues || ({} as T));
21
+
22
+ const handleInputChange = (e: ChangeEvent<any>, key: string | undefined) => {
23
+ e.preventDefault();
24
+
25
+ e.target;
26
+
27
+ setValues((v) => {
28
+ const n: Record<string, object> = {};
29
+ if (key) {
30
+ n[key] = {
31
+ ...v[key],
32
+ [e.target.name]: e.target.value,
33
+ };
34
+ } else {
35
+ n[e.target.name] = e.target.value;
36
+ }
37
+
38
+ return { ...v, ...n };
39
+ });
40
+ };
41
+
42
+ const handleSubmit = (e: FormEvent<HTMLFormElement>) => {
43
+ e.preventDefault();
44
+ onSubmit(values);
45
+ };
46
+
47
+ const renderField = (field: ModelField, key: string | undefined = undefined) => {
48
+ const defaultColor = useGetDefaultThemeColor({ lightWeight: 200, darkWeight: 800 });
49
+
50
+ const { id, type, name, description, xs, sm, md, lg, xl } = field;
51
+ if (type === "group") {
52
+ return (
53
+ <Grid item key={id} xs={xs} sm={sm} md={md} lg={lg} xl={xl}>
54
+ <Paper>
55
+ <Box bgcolor={defaultColor} px={2} py={1} mb={2}>
56
+ <Typography variant="h6" role="heading" aria-level={1}>
57
+ {name}
58
+ </Typography>
59
+ <Typography variant="body2" role="heading" aria-level={2}>
60
+ {description}
61
+ </Typography>
62
+ </Box>
63
+ <Grid container spacing={2} sx={{ p: 2 }}>
64
+ {field.value.map((f) => renderField(f, id))}
65
+ </Grid>
66
+ </Paper>
67
+ </Grid>
68
+ );
69
+ }
70
+
71
+ return (
72
+ <Grid item key={id} xs={xs} sm={sm} md={md} lg={lg} xl={xl}>
73
+ <TextField
74
+ required
75
+ type={type}
76
+ label={name}
77
+ name={id}
78
+ variant="outlined"
79
+ fullWidth
80
+ value={key && key in values ? values[key][id] : values[id]}
81
+ onChange={(e) => handleInputChange(e, key)}
82
+ />
83
+ </Grid>
84
+ );
85
+ };
86
+
87
+ return (
88
+ <Grid container component="form" spacing={2} onSubmit={handleSubmit}>
89
+ {model.fields.map((f) => renderField(f))}
90
+ <Grid item xs={12}>
91
+ <Button type="submit" variant="contained">
92
+ {saveButtonText}
93
+ </Button>
94
+ </Grid>
95
+ </Grid>
96
+ );
97
+ };
@@ -0,0 +1 @@
1
+ export * from "./model-router";