@pautena/react-design-system 0.2.1 → 0.3.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/dist/cjs/index.js +13 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/components/value-displays/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-datetime/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-datetime/value-datetime.d.ts +18 -0
- package/dist/cjs/types/generators/generators.mock.d.ts +9 -5
- package/dist/cjs/types/generators/generators.model.d.ts +25 -1
- package/dist/esm/index.js +13 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/value-displays/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-datetime/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-datetime/value-datetime.d.ts +18 -0
- package/dist/esm/types/generators/generators.mock.d.ts +9 -5
- package/dist/esm/types/generators/generators.model.d.ts +25 -1
- package/dist/index.d.ts +45 -2
- package/package.json +6 -2
- package/src/components/value-displays/index.ts +1 -0
- package/src/components/value-displays/value-datetime/index.ts +1 -0
- package/src/components/value-displays/value-datetime/value-datetime.stories.tsx +21 -0
- package/src/components/value-displays/value-datetime/value-datetime.test.tsx +23 -0
- package/src/components/value-displays/value-datetime/value-datetime.tsx +40 -0
- package/src/components/value-displays/value-text/{value-test.test.tsx → value-text.test.tsx} +0 -0
- package/src/generators/generators.mock.ts +56 -17
- package/src/generators/generators.model.ts +39 -1
- package/src/generators/model-form/model-form.stories.tsx +2 -2
- package/src/generators/model-form/model-form.test.tsx +39 -22
- package/src/generators/model-form/model-form.tsx +220 -33
- package/src/generators/model-router/model-router.test.tsx +46 -52
- package/src/generators/model-router/stories/model-router.stories.tsx +6 -2
- package/src/generators/object-details/object-details.tsx +5 -4
- package/src/storybook.tsx +10 -0
- package/src/tests/actions.ts +43 -0
- package/src/tests/assertions.ts +70 -1
- package/src/tests/index.ts +1 -0
- package/src/tests/testing-library.tsx +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./value-datetime";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ValueDatetimeProps {
|
|
2
|
+
/**
|
|
3
|
+
* Name of the displayed value
|
|
4
|
+
*/
|
|
5
|
+
label: string;
|
|
6
|
+
/**
|
|
7
|
+
* Value displayed
|
|
8
|
+
*/
|
|
9
|
+
value: Date;
|
|
10
|
+
/**
|
|
11
|
+
* Datetime format
|
|
12
|
+
*/
|
|
13
|
+
format: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Displays a formated datetime with a label
|
|
17
|
+
*/
|
|
18
|
+
export declare const ValueDatetime: ({ label, value, format: fmt }: ValueDatetimeProps) => JSX.Element;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import { Model } from "./generators.model";
|
|
1
|
+
import { BasicModelInstance, Model } from "./generators.model";
|
|
2
|
+
export declare const BirthDateFormat = "dd/MM/yyyy";
|
|
3
|
+
export declare const ReturnTimeFormat = "HH:mm";
|
|
4
|
+
export declare const TradeDateFormat = "dd/MM/yyyy HH:mm";
|
|
2
5
|
export declare const mockModel: Model;
|
|
3
6
|
export interface MockInstance {
|
|
4
7
|
id: string;
|
|
@@ -7,18 +10,19 @@ export interface MockInstance {
|
|
|
7
10
|
lastName: string;
|
|
8
11
|
gender: string;
|
|
9
12
|
age: number;
|
|
10
|
-
birthDate:
|
|
13
|
+
birthDate: Date;
|
|
11
14
|
car: {
|
|
12
15
|
model: string;
|
|
13
16
|
manufacturer: string;
|
|
14
17
|
color: string;
|
|
15
|
-
type: string;
|
|
18
|
+
type: string[];
|
|
16
19
|
vin: string;
|
|
17
20
|
vrm: string;
|
|
21
|
+
returnTime: Date;
|
|
18
22
|
};
|
|
19
23
|
quantity: number;
|
|
20
24
|
available: boolean;
|
|
21
25
|
currency: string;
|
|
22
|
-
tradeDate:
|
|
26
|
+
tradeDate: Date;
|
|
23
27
|
}
|
|
24
|
-
export declare const createModelInstance: <T extends
|
|
28
|
+
export declare const createModelInstance: <T extends BasicModelInstance>(model: Model, seed?: number) => T;
|
|
@@ -20,7 +20,30 @@ declare type NumberField = {
|
|
|
20
20
|
declare type BooleanField = {
|
|
21
21
|
type: "boolean";
|
|
22
22
|
};
|
|
23
|
-
declare type
|
|
23
|
+
declare type EnumField = {
|
|
24
|
+
type: "enum";
|
|
25
|
+
value: string[];
|
|
26
|
+
};
|
|
27
|
+
declare type MultiEnumField = {
|
|
28
|
+
type: "multienum";
|
|
29
|
+
value: string[];
|
|
30
|
+
};
|
|
31
|
+
declare type DateField = {
|
|
32
|
+
type: "date";
|
|
33
|
+
format: string;
|
|
34
|
+
default: any;
|
|
35
|
+
};
|
|
36
|
+
declare type TimeField = {
|
|
37
|
+
type: "time";
|
|
38
|
+
format: string;
|
|
39
|
+
default: any;
|
|
40
|
+
};
|
|
41
|
+
declare type DatetimeField = {
|
|
42
|
+
type: "datetime";
|
|
43
|
+
format: string;
|
|
44
|
+
default: any;
|
|
45
|
+
};
|
|
46
|
+
declare type SingleFields = StringField | NumberField | BooleanField | EnumField | MultiEnumField | DateField | TimeField | DatetimeField;
|
|
24
47
|
export declare type GroupField = {
|
|
25
48
|
type: "group";
|
|
26
49
|
value: (Base & Breakpoints & SingleFields)[];
|
|
@@ -34,4 +57,5 @@ export interface BasicModelInstance {
|
|
|
34
57
|
id: string;
|
|
35
58
|
[key: string]: any;
|
|
36
59
|
}
|
|
60
|
+
export declare type ModelFieldTypes = "string" | "number" | "boolean" | "enum" | "multienum";
|
|
37
61
|
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -418,6 +418,25 @@ interface ValueBooleanProps {
|
|
|
418
418
|
*/
|
|
419
419
|
declare const ValueBoolean: ({ label, value }: ValueBooleanProps) => JSX.Element;
|
|
420
420
|
|
|
421
|
+
interface ValueDatetimeProps {
|
|
422
|
+
/**
|
|
423
|
+
* Name of the displayed value
|
|
424
|
+
*/
|
|
425
|
+
label: string;
|
|
426
|
+
/**
|
|
427
|
+
* Value displayed
|
|
428
|
+
*/
|
|
429
|
+
value: Date;
|
|
430
|
+
/**
|
|
431
|
+
* Datetime format
|
|
432
|
+
*/
|
|
433
|
+
format: string;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Displays a formated datetime with a label
|
|
437
|
+
*/
|
|
438
|
+
declare const ValueDatetime: ({ label, value, format: fmt }: ValueDatetimeProps) => JSX.Element;
|
|
439
|
+
|
|
421
440
|
declare type GroupValueItemProps = PropsWithChildren<Omit<GridProps, "item" | "container">>;
|
|
422
441
|
declare type GroupValueItemComponent = FunctionComponent<GroupValueItemProps>;
|
|
423
442
|
declare type GroupValueItemElement = ReactElement<GroupValueItemProps, GroupValueItemComponent>;
|
|
@@ -482,7 +501,30 @@ declare type NumberField = {
|
|
|
482
501
|
declare type BooleanField = {
|
|
483
502
|
type: "boolean";
|
|
484
503
|
};
|
|
485
|
-
declare type
|
|
504
|
+
declare type EnumField = {
|
|
505
|
+
type: "enum";
|
|
506
|
+
value: string[];
|
|
507
|
+
};
|
|
508
|
+
declare type MultiEnumField = {
|
|
509
|
+
type: "multienum";
|
|
510
|
+
value: string[];
|
|
511
|
+
};
|
|
512
|
+
declare type DateField = {
|
|
513
|
+
type: "date";
|
|
514
|
+
format: string;
|
|
515
|
+
default: any;
|
|
516
|
+
};
|
|
517
|
+
declare type TimeField = {
|
|
518
|
+
type: "time";
|
|
519
|
+
format: string;
|
|
520
|
+
default: any;
|
|
521
|
+
};
|
|
522
|
+
declare type DatetimeField = {
|
|
523
|
+
type: "datetime";
|
|
524
|
+
format: string;
|
|
525
|
+
default: any;
|
|
526
|
+
};
|
|
527
|
+
declare type SingleFields = StringField | NumberField | BooleanField | EnumField | MultiEnumField | DateField | TimeField | DatetimeField;
|
|
486
528
|
declare type GroupField = {
|
|
487
529
|
type: "group";
|
|
488
530
|
value: (Base & Breakpoints & SingleFields)[];
|
|
@@ -496,6 +538,7 @@ interface BasicModelInstance {
|
|
|
496
538
|
id: string;
|
|
497
539
|
[key: string]: any;
|
|
498
540
|
}
|
|
541
|
+
declare type ModelFieldTypes = "string" | "number" | "boolean" | "enum" | "multienum";
|
|
499
542
|
|
|
500
543
|
interface ObjectDetailsProps<T extends BasicModelInstance> {
|
|
501
544
|
model: Model;
|
|
@@ -666,4 +709,4 @@ declare type TabProviderProps = PropsWithChildren<{
|
|
|
666
709
|
}>;
|
|
667
710
|
declare const TabProvider: ({ children, initialValue }: TabProviderProps) => JSX.Element;
|
|
668
711
|
|
|
669
|
-
export { AppBarComponent, AppBarElement, AppBarProfile, AppBarProps, AppBarWithDrawerLayout, AppBarWithDrawerLayoutProps, BasicModelInstance, Bullet, BulletProps, BulletVariant, CenterContainer, CenterContainerProps, Content, ContentComponent, ContentElement, ContentProps, Drawer, DrawerComponent, DrawerContent, DrawerContentComponent, DrawerContentElement, DrawerContentProps, DrawerContext, DrawerContextProps, DrawerElement, DrawerItem, DrawerItemProps, DrawerProps, DrawerProvider, DrawerSection, DrawerSectionProps, EnhancedRemoteTable, EnhancedTable, EnhancedTableHead, GroupField, GroupValueCard, GroupValueCardProps, GroupValueItem, GroupValueItemComponent, GroupValueItemElement, GroupValueItemProps, HeadCell, Header, HeaderAction, HeaderActionVariant, HeaderBreadcrumb, HeaderComponent, HeaderElement, HeaderLayout, HeaderPreset, HeaderProps, HeaderTab, IdleRequest, Label, LabelProps, LabelVariant, Link, LinkBehaviour, LoadingRequest, MiniAppBar, MiniDrawer, Model, ModelField, ModelForm, ModelFormProps, ModelRouter, ModelRouterProps, Nav, NavItem, NavItemAvatar, NavItemBullet, NavItemLabel, NavSection, Notification, NotificationCenterContext, NotificationCenterProps, NotificationCenterProvider, NotificationCenterProviderProps, NotificationCenterProviderUndefinedError, ObjectDetails, ObjectDetailsProps, Order, Placeholder, PlaceholderAction, PlaceholderIconArgs, PlaceholderProps, QueryContainer, QueryContainerError, QueryContainerProps, QueryContainerSuccess, RequestState, SignIn, SnackbarActionType, SnackbarContentType, TabCard, TabContext, TabContextProvider, TabPanel, TabProvider, TableList, TableListProps, TableRowOption, UndefinedProvider, ValueBoolean, ValueBooleanProps, ValueCard, ValueCardProps, ValueText, ValueTextProps, bulletClasses, getRandomItem, groupValueItemClasses, labelClasses, newArrayWithSize, useDrawer, useGetDefaultThemeColor, useNotificationCenter, useTab };
|
|
712
|
+
export { AppBarComponent, AppBarElement, AppBarProfile, AppBarProps, AppBarWithDrawerLayout, AppBarWithDrawerLayoutProps, BasicModelInstance, Bullet, BulletProps, BulletVariant, CenterContainer, CenterContainerProps, Content, ContentComponent, ContentElement, ContentProps, Drawer, DrawerComponent, DrawerContent, DrawerContentComponent, DrawerContentElement, DrawerContentProps, DrawerContext, DrawerContextProps, DrawerElement, DrawerItem, DrawerItemProps, DrawerProps, DrawerProvider, DrawerSection, DrawerSectionProps, EnhancedRemoteTable, EnhancedTable, EnhancedTableHead, GroupField, GroupValueCard, GroupValueCardProps, GroupValueItem, GroupValueItemComponent, GroupValueItemElement, GroupValueItemProps, HeadCell, Header, HeaderAction, HeaderActionVariant, HeaderBreadcrumb, HeaderComponent, HeaderElement, HeaderLayout, HeaderPreset, HeaderProps, HeaderTab, IdleRequest, Label, LabelProps, LabelVariant, Link, LinkBehaviour, LoadingRequest, MiniAppBar, MiniDrawer, Model, ModelField, ModelFieldTypes, ModelForm, ModelFormProps, ModelRouter, ModelRouterProps, Nav, NavItem, NavItemAvatar, NavItemBullet, NavItemLabel, NavSection, Notification, NotificationCenterContext, NotificationCenterProps, NotificationCenterProvider, NotificationCenterProviderProps, NotificationCenterProviderUndefinedError, ObjectDetails, ObjectDetailsProps, Order, Placeholder, PlaceholderAction, PlaceholderIconArgs, PlaceholderProps, QueryContainer, QueryContainerError, QueryContainerProps, QueryContainerSuccess, RequestState, SignIn, SnackbarActionType, SnackbarContentType, TabCard, TabContext, TabContextProvider, TabPanel, TabProvider, TableList, TableListProps, TableRowOption, UndefinedProvider, ValueBoolean, ValueBooleanProps, ValueCard, ValueCardProps, ValueDatetime, ValueDatetimeProps, ValueText, ValueTextProps, bulletClasses, getRandomItem, groupValueItemClasses, labelClasses, newArrayWithSize, useDrawer, useGetDefaultThemeColor, useNotificationCenter, useTab };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pautena/react-design-system",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "My custom design system on top of MUI",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -35,11 +35,14 @@
|
|
|
35
35
|
"@mui/lab": "^5.0.0-alpha.90",
|
|
36
36
|
"@mui/material": "^5.9.0",
|
|
37
37
|
"@mui/x-data-grid": "^5.13.0",
|
|
38
|
+
"@mui/x-date-pickers": "^5.0.0-beta.7",
|
|
39
|
+
"date-fns": "^2.29.2",
|
|
38
40
|
"react": "^18.2.0",
|
|
39
41
|
"react-dom": "^18.2.0",
|
|
40
42
|
"react-router-dom": "^6.3.0"
|
|
41
43
|
},
|
|
42
44
|
"devDependencies": {
|
|
45
|
+
"@date-io/date-fns": "^2.15.0",
|
|
43
46
|
"@babel/core": "^7.18.6",
|
|
44
47
|
"@babel/preset-env": "^7.18.6",
|
|
45
48
|
"@babel/preset-react": "^7.18.6",
|
|
@@ -99,7 +102,8 @@
|
|
|
99
102
|
"@types/react": "^17.0.0 || ^18.0.0",
|
|
100
103
|
"react": "^17.0.0 || ^18.0.0",
|
|
101
104
|
"react-dom": "^17.0.0 || ^18.0.0",
|
|
102
|
-
"react-router-dom": "^6.0.0"
|
|
105
|
+
"react-router-dom": "^6.0.0",
|
|
106
|
+
"date-fns": "^2.0.0"
|
|
103
107
|
},
|
|
104
108
|
"repository": {
|
|
105
109
|
"type": "git",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./value-datetime";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ComponentMeta } from "@storybook/react";
|
|
2
|
+
import { ValueDatetime } from "./value-datetime";
|
|
3
|
+
import { createTemplate, withContainer } from "../../../storybook";
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: "Value displays/ValueDate",
|
|
7
|
+
component: ValueDatetime,
|
|
8
|
+
decorators: [withContainer({ width: 200 })],
|
|
9
|
+
parameters: {
|
|
10
|
+
layout: "centered",
|
|
11
|
+
},
|
|
12
|
+
} as ComponentMeta<typeof ValueDatetime>;
|
|
13
|
+
|
|
14
|
+
const Template = createTemplate(ValueDatetime);
|
|
15
|
+
|
|
16
|
+
export const Default = Template.bind({});
|
|
17
|
+
Default.args = {
|
|
18
|
+
label: "Lorem",
|
|
19
|
+
value: new Date(2022, 8, 22),
|
|
20
|
+
format: "yyyy/MM/dd",
|
|
21
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { render, screen } from "../../../tests";
|
|
3
|
+
import { ValueDatetime } from "./value-datetime";
|
|
4
|
+
|
|
5
|
+
describe("ValueDatetime", () => {
|
|
6
|
+
const renderComponent = () => {
|
|
7
|
+
return render(
|
|
8
|
+
<ValueDatetime label="Hello world" value={new Date(2022, 7, 10)} format="dd-MM-yyyy" />,
|
|
9
|
+
);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
it("would render the label", () => {
|
|
13
|
+
renderComponent();
|
|
14
|
+
|
|
15
|
+
expect(screen.getByRole("label", { name: /hello world/i })).toBeInTheDocument();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("would render the value", () => {
|
|
19
|
+
renderComponent();
|
|
20
|
+
|
|
21
|
+
expect(screen.getByText(/10-08-2022/i)).toBeInTheDocument();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Box, Tooltip, Typography } from "@mui/material";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { format } from "date-fns";
|
|
4
|
+
|
|
5
|
+
export interface ValueDatetimeProps {
|
|
6
|
+
/**
|
|
7
|
+
* Name of the displayed value
|
|
8
|
+
*/
|
|
9
|
+
label: string;
|
|
10
|
+
/**
|
|
11
|
+
* Value displayed
|
|
12
|
+
*/
|
|
13
|
+
value: Date;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Datetime format
|
|
17
|
+
*/
|
|
18
|
+
format: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Displays a formated datetime with a label
|
|
23
|
+
*/
|
|
24
|
+
export const ValueDatetime = ({ label, value, format: fmt }: ValueDatetimeProps) => {
|
|
25
|
+
const id = `label-${label.replace(/ /g, "-")}`;
|
|
26
|
+
const formatedValue = format(value, fmt);
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<Box>
|
|
30
|
+
<Typography variant="subtitle2" role="label" id={id}>
|
|
31
|
+
{label}
|
|
32
|
+
</Typography>
|
|
33
|
+
<Tooltip title={formatedValue} placement="top" enterDelay={2000}>
|
|
34
|
+
<Typography variant="h5" noWrap aria-labelledby={id}>
|
|
35
|
+
{formatedValue}
|
|
36
|
+
</Typography>
|
|
37
|
+
</Tooltip>
|
|
38
|
+
</Box>
|
|
39
|
+
);
|
|
40
|
+
};
|
package/src/components/value-displays/value-text/{value-test.test.tsx → value-text.test.tsx}
RENAMED
|
File without changes
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { Model, ModelField } from "./generators.model";
|
|
1
|
+
import { BasicModelInstance, Model, ModelField } from "./generators.model";
|
|
2
2
|
import { faker } from "@faker-js/faker";
|
|
3
|
-
import {
|
|
3
|
+
import { newArrayWithSize } from "../utils";
|
|
4
4
|
|
|
5
|
+
export const BirthDateFormat = "dd/MM/yyyy";
|
|
6
|
+
export const ReturnTimeFormat = "HH:mm";
|
|
7
|
+
export const TradeDateFormat = "dd/MM/yyyy HH:mm";
|
|
5
8
|
export const mockModel: Model = {
|
|
6
9
|
fields: [
|
|
7
10
|
{
|
|
@@ -46,7 +49,8 @@ export const mockModel: Model = {
|
|
|
46
49
|
},
|
|
47
50
|
{
|
|
48
51
|
id: "gender",
|
|
49
|
-
type: "
|
|
52
|
+
type: "enum",
|
|
53
|
+
value: faker.definitions.name?.gender || [],
|
|
50
54
|
description: "User gender",
|
|
51
55
|
name: "Gender",
|
|
52
56
|
xs: 12,
|
|
@@ -65,23 +69,27 @@ export const mockModel: Model = {
|
|
|
65
69
|
},
|
|
66
70
|
{
|
|
67
71
|
id: "birthDate",
|
|
68
|
-
type: "
|
|
72
|
+
type: "date",
|
|
73
|
+
format: BirthDateFormat,
|
|
74
|
+
default: new Date(2014, 8, 18),
|
|
69
75
|
description: "When he was born",
|
|
70
76
|
name: "Birth Date",
|
|
71
77
|
xs: 12,
|
|
72
78
|
sm: 6,
|
|
73
79
|
md: 6,
|
|
74
|
-
listable:
|
|
80
|
+
listable: false,
|
|
75
81
|
},
|
|
76
82
|
{
|
|
77
83
|
id: "car",
|
|
78
84
|
type: "group",
|
|
79
85
|
description: "Information about the user car",
|
|
80
86
|
name: "User car",
|
|
87
|
+
xs: 12,
|
|
81
88
|
value: [
|
|
82
89
|
{
|
|
83
90
|
id: "model",
|
|
84
|
-
type: "
|
|
91
|
+
type: "enum",
|
|
92
|
+
value: faker.definitions.vehicle?.model || [],
|
|
85
93
|
description: "Lorem ipsum",
|
|
86
94
|
name: "Model",
|
|
87
95
|
xs: 12,
|
|
@@ -89,7 +97,8 @@ export const mockModel: Model = {
|
|
|
89
97
|
},
|
|
90
98
|
{
|
|
91
99
|
id: "manufacturer",
|
|
92
|
-
type: "
|
|
100
|
+
type: "enum",
|
|
101
|
+
value: faker.definitions.vehicle?.manufacturer || [],
|
|
93
102
|
description: "Lorem ipsum",
|
|
94
103
|
name: "Manufacturer",
|
|
95
104
|
xs: 12,
|
|
@@ -105,7 +114,8 @@ export const mockModel: Model = {
|
|
|
105
114
|
},
|
|
106
115
|
{
|
|
107
116
|
id: "type",
|
|
108
|
-
type: "
|
|
117
|
+
type: "multienum",
|
|
118
|
+
value: faker.definitions.vehicle?.type || [],
|
|
109
119
|
description: "Lorem ipsum",
|
|
110
120
|
name: "Type",
|
|
111
121
|
xs: 12,
|
|
@@ -127,6 +137,16 @@ export const mockModel: Model = {
|
|
|
127
137
|
xs: 12,
|
|
128
138
|
sm: 4,
|
|
129
139
|
},
|
|
140
|
+
{
|
|
141
|
+
id: "returnTime",
|
|
142
|
+
type: "time",
|
|
143
|
+
format: ReturnTimeFormat,
|
|
144
|
+
default: new Date(1970, 0, 1, 9, 0),
|
|
145
|
+
description: "Lorem ipsum",
|
|
146
|
+
name: "Return time",
|
|
147
|
+
xs: 12,
|
|
148
|
+
sm: 4,
|
|
149
|
+
},
|
|
130
150
|
],
|
|
131
151
|
},
|
|
132
152
|
{
|
|
@@ -156,11 +176,13 @@ export const mockModel: Model = {
|
|
|
156
176
|
},
|
|
157
177
|
{
|
|
158
178
|
id: "tradeDate",
|
|
159
|
-
type: "
|
|
179
|
+
type: "datetime",
|
|
180
|
+
format: TradeDateFormat,
|
|
181
|
+
default: new Date(2022, 8, 12, 9, 0),
|
|
160
182
|
description: "Lorem ipsum",
|
|
161
183
|
name: "Trade date",
|
|
162
184
|
xs: 12,
|
|
163
|
-
sm:
|
|
185
|
+
sm: 5,
|
|
164
186
|
},
|
|
165
187
|
],
|
|
166
188
|
};
|
|
@@ -172,19 +194,20 @@ export interface MockInstance {
|
|
|
172
194
|
lastName: string;
|
|
173
195
|
gender: string;
|
|
174
196
|
age: number;
|
|
175
|
-
birthDate:
|
|
197
|
+
birthDate: Date;
|
|
176
198
|
car: {
|
|
177
199
|
model: string;
|
|
178
200
|
manufacturer: string;
|
|
179
201
|
color: string;
|
|
180
|
-
type: string;
|
|
202
|
+
type: string[];
|
|
181
203
|
vin: string;
|
|
182
204
|
vrm: string;
|
|
205
|
+
returnTime: Date;
|
|
183
206
|
};
|
|
184
207
|
quantity: number;
|
|
185
208
|
available: boolean;
|
|
186
209
|
currency: string;
|
|
187
|
-
tradeDate:
|
|
210
|
+
tradeDate: Date;
|
|
188
211
|
}
|
|
189
212
|
|
|
190
213
|
const mockFieldValue = {
|
|
@@ -194,20 +217,36 @@ const mockFieldValue = {
|
|
|
194
217
|
lastName: faker.name.lastName,
|
|
195
218
|
gender: faker.name.gender,
|
|
196
219
|
age: () => faker.datatype.number({ min: 20, max: 60 }),
|
|
197
|
-
birthDate: () =>
|
|
220
|
+
birthDate: () => {
|
|
221
|
+
const date = faker.date.recent();
|
|
222
|
+
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
223
|
+
},
|
|
224
|
+
returnTime: () => {
|
|
225
|
+
const date = faker.date.recent();
|
|
226
|
+
const time = new Date();
|
|
227
|
+
time.setHours(date.getHours());
|
|
228
|
+
time.setMinutes(date.getMinutes());
|
|
229
|
+
time.setSeconds(0);
|
|
230
|
+
time.setMilliseconds(0);
|
|
231
|
+
return time;
|
|
232
|
+
},
|
|
198
233
|
model: faker.vehicle.model,
|
|
199
234
|
manufacturer: faker.vehicle.manufacturer,
|
|
200
235
|
color: faker.vehicle.color,
|
|
201
|
-
type:
|
|
236
|
+
type: () => {
|
|
237
|
+
const array = newArrayWithSize(faker.datatype.number({ min: 2, max: 5 }), 0);
|
|
238
|
+
const result = array.map(() => faker.vehicle.type());
|
|
239
|
+
return [...new Set(result)];
|
|
240
|
+
},
|
|
202
241
|
vin: faker.vehicle.vin,
|
|
203
242
|
vrm: faker.vehicle.vrm,
|
|
204
243
|
quantity: () => faker.datatype.number({ min: 1, max: 9 }),
|
|
205
244
|
available: faker.datatype.boolean,
|
|
206
245
|
currency: () => "MXN",
|
|
207
|
-
tradeDate:
|
|
246
|
+
tradeDate: faker.date.recent,
|
|
208
247
|
};
|
|
209
248
|
|
|
210
|
-
export const createModelInstance = <T extends
|
|
249
|
+
export const createModelInstance = <T extends BasicModelInstance>(model: Model, seed = 100): T => {
|
|
211
250
|
faker.seed(seed);
|
|
212
251
|
const obj = {};
|
|
213
252
|
|
|
@@ -25,7 +25,43 @@ type BooleanField = {
|
|
|
25
25
|
type: "boolean";
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
-
type
|
|
28
|
+
type EnumField = {
|
|
29
|
+
type: "enum";
|
|
30
|
+
value: string[];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type MultiEnumField = {
|
|
34
|
+
type: "multienum";
|
|
35
|
+
value: string[];
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
type DateField = {
|
|
39
|
+
type: "date";
|
|
40
|
+
format: string;
|
|
41
|
+
default: any;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
type TimeField = {
|
|
45
|
+
type: "time";
|
|
46
|
+
format: string;
|
|
47
|
+
default: any;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
type DatetimeField = {
|
|
51
|
+
type: "datetime";
|
|
52
|
+
format: string;
|
|
53
|
+
default: any;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
type SingleFields =
|
|
57
|
+
| StringField
|
|
58
|
+
| NumberField
|
|
59
|
+
| BooleanField
|
|
60
|
+
| EnumField
|
|
61
|
+
| MultiEnumField
|
|
62
|
+
| DateField
|
|
63
|
+
| TimeField
|
|
64
|
+
| DatetimeField;
|
|
29
65
|
|
|
30
66
|
export type GroupField = {
|
|
31
67
|
type: "group";
|
|
@@ -44,3 +80,5 @@ export interface BasicModelInstance {
|
|
|
44
80
|
id: string;
|
|
45
81
|
[key: string]: any;
|
|
46
82
|
}
|
|
83
|
+
|
|
84
|
+
export type ModelFieldTypes = "string" | "number" | "boolean" | "enum" | "multienum";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ComponentMeta } from "@storybook/react";
|
|
2
2
|
import { ModelForm } from "./model-form";
|
|
3
|
-
import { createTemplate, withPadding } from "../../storybook";
|
|
3
|
+
import { createTemplate, withPadding, withLocalizationProvider } from "../../storybook";
|
|
4
4
|
import { createModelInstance, mockModel } from "../generators.mock";
|
|
5
5
|
|
|
6
6
|
const initialValues = createModelInstance(mockModel);
|
|
@@ -8,7 +8,7 @@ const initialValues = createModelInstance(mockModel);
|
|
|
8
8
|
export default {
|
|
9
9
|
title: "Generators/ModelForm",
|
|
10
10
|
component: ModelForm,
|
|
11
|
-
decorators: [withPadding(2)],
|
|
11
|
+
decorators: [withPadding(2), withLocalizationProvider],
|
|
12
12
|
parameters: {
|
|
13
13
|
layout: "fullscreen",
|
|
14
14
|
},
|
|
@@ -5,8 +5,19 @@ import {
|
|
|
5
5
|
expectModelFieldInputValue,
|
|
6
6
|
render,
|
|
7
7
|
screen,
|
|
8
|
+
selectOption,
|
|
9
|
+
selectOptions,
|
|
10
|
+
pickDatetime,
|
|
11
|
+
expectToHaveBeenCalledOnceWithMockInstance,
|
|
8
12
|
} from "../../tests";
|
|
9
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
BirthDateFormat,
|
|
15
|
+
createModelInstance,
|
|
16
|
+
MockInstance,
|
|
17
|
+
mockModel,
|
|
18
|
+
ReturnTimeFormat,
|
|
19
|
+
TradeDateFormat,
|
|
20
|
+
} from "../generators.mock";
|
|
10
21
|
import userEvent from "@testing-library/user-event";
|
|
11
22
|
|
|
12
23
|
describe("ModelForm", () => {
|
|
@@ -47,54 +58,60 @@ describe("ModelForm", () => {
|
|
|
47
58
|
|
|
48
59
|
it("would call onSubmit if I fullfill all inputs and press the submit button", async () => {
|
|
49
60
|
const { onSubmit } = renderComponent();
|
|
61
|
+
const birthDate = new Date(2047, 11, 26);
|
|
62
|
+
const returnTime = new Date(1970, 0, 1, 10, 12);
|
|
63
|
+
const tradeDate = new Date(2047, 11, 26, 12, 50);
|
|
50
64
|
|
|
51
65
|
await userEvent.type(screen.getByRole("textbox", { name: "Id" }), "Id-1");
|
|
52
66
|
await userEvent.type(screen.getByRole("textbox", { name: /first name/i }), "Karianne");
|
|
53
67
|
await userEvent.type(screen.getByRole("textbox", { name: /middle name/i }), "Noah");
|
|
54
68
|
await userEvent.type(screen.getByRole("textbox", { name: /last name/i }), "Gorczany");
|
|
55
|
-
await
|
|
69
|
+
await selectOption(screen.getByRole("button", { name: /gender/i }), "Cis Man");
|
|
56
70
|
await userEvent.type(screen.getByRole("spinbutton", { name: /age/i }), "37");
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
);
|
|
61
|
-
await userEvent.type(screen.getByRole("textbox", { name: /model/i }), "Spyder");
|
|
62
|
-
await userEvent.type(screen.getByRole("textbox", { name: /manufacturer/i }), "Bugatti");
|
|
71
|
+
pickDatetime(screen.getByRole("textbox", { name: /birth date/i }), birthDate, BirthDateFormat);
|
|
72
|
+
await selectOption(screen.getByRole("button", { name: /model/i }), "Spyder");
|
|
73
|
+
await selectOption(screen.getByRole("button", { name: /manufacturer/i }), "Bugatti");
|
|
63
74
|
await userEvent.type(screen.getByRole("textbox", { name: /color/i }), "red");
|
|
64
|
-
await
|
|
75
|
+
await selectOptions(screen.getByRole("button", { name: /type/i }), [
|
|
76
|
+
"Coupe",
|
|
77
|
+
"Hatchback",
|
|
78
|
+
"Minivan",
|
|
79
|
+
]);
|
|
65
80
|
await userEvent.type(screen.getByRole("textbox", { name: /vin/i }), "46N6UE4VJ2XL28828");
|
|
66
81
|
await userEvent.type(screen.getByRole("textbox", { name: /vrm/i }), "NE51AFH");
|
|
82
|
+
pickDatetime(
|
|
83
|
+
screen.getByRole("textbox", { name: /return time/i }),
|
|
84
|
+
returnTime,
|
|
85
|
+
ReturnTimeFormat,
|
|
86
|
+
);
|
|
67
87
|
await userEvent.type(screen.getByRole("spinbutton", { name: /q/i }), "9");
|
|
68
|
-
await userEvent.
|
|
88
|
+
await userEvent.click(screen.getByRole("checkbox", { name: /available/i }));
|
|
69
89
|
await userEvent.type(screen.getByRole("textbox", { name: /currency/i }), "mxn");
|
|
70
|
-
|
|
71
|
-
screen.getByRole("textbox", { name: /trade date/i }),
|
|
72
|
-
"Thu Jul 21 2022 22:44:10",
|
|
73
|
-
);
|
|
90
|
+
pickDatetime(screen.getByRole("textbox", { name: /trade date/i }), tradeDate, TradeDateFormat);
|
|
74
91
|
|
|
75
92
|
await userEvent.click(screen.getByRole("button", { name: /save/i }));
|
|
76
93
|
|
|
77
|
-
|
|
78
|
-
expect(onSubmit).toHaveBeenCalledWith({
|
|
94
|
+
expectToHaveBeenCalledOnceWithMockInstance(onSubmit, {
|
|
79
95
|
id: "Id-1",
|
|
80
96
|
firstName: "Karianne",
|
|
81
97
|
middleName: "Noah",
|
|
82
98
|
lastName: "Gorczany",
|
|
83
99
|
gender: "Cis Man",
|
|
84
|
-
age:
|
|
85
|
-
birthDate
|
|
100
|
+
age: 37,
|
|
101
|
+
birthDate,
|
|
86
102
|
car: {
|
|
87
103
|
model: "Spyder",
|
|
88
104
|
manufacturer: "Bugatti",
|
|
89
105
|
color: "red",
|
|
90
|
-
type: "
|
|
106
|
+
type: ["Coupe", "Hatchback", "Minivan"],
|
|
91
107
|
vin: "46N6UE4VJ2XL28828",
|
|
92
108
|
vrm: "NE51AFH",
|
|
109
|
+
returnTime,
|
|
93
110
|
},
|
|
94
|
-
quantity:
|
|
95
|
-
available:
|
|
111
|
+
quantity: 9,
|
|
112
|
+
available: true,
|
|
96
113
|
currency: "mxn",
|
|
97
|
-
tradeDate
|
|
114
|
+
tradeDate,
|
|
98
115
|
});
|
|
99
116
|
});
|
|
100
117
|
});
|