@pautena/react-design-system 0.2.0 → 0.3.1

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 (65) hide show
  1. package/dist/cjs/index.js +13 -4
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/components/value-displays/index.d.ts +1 -0
  4. package/dist/cjs/types/components/value-displays/value-datetime/index.d.ts +1 -0
  5. package/dist/cjs/types/components/value-displays/value-datetime/value-datetime.d.ts +18 -0
  6. package/dist/cjs/types/generators/generators.mock.d.ts +9 -5
  7. package/dist/cjs/types/generators/generators.model.d.ts +25 -1
  8. package/dist/cjs/types/generators/model-router/index.d.ts +1 -0
  9. package/dist/cjs/types/generators/model-router/model-router.types.d.ts +1 -0
  10. package/dist/cjs/types/generators/model-router/screens/details-screen.d.ts +1 -1
  11. package/dist/cjs/types/hooks/index.d.ts +1 -0
  12. package/dist/cjs/types/hooks/routing/index.d.ts +1 -0
  13. package/dist/cjs/types/hooks/routing/routing.hooks.d.ts +5 -0
  14. package/dist/cjs/types/providers/notification-center/index.d.ts +1 -0
  15. package/dist/cjs/types/providers/notification-center/notification-center.hooks.d.ts +6 -0
  16. package/dist/esm/index.js +13 -4
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/types/components/value-displays/index.d.ts +1 -0
  19. package/dist/esm/types/components/value-displays/value-datetime/index.d.ts +1 -0
  20. package/dist/esm/types/components/value-displays/value-datetime/value-datetime.d.ts +18 -0
  21. package/dist/esm/types/generators/generators.mock.d.ts +9 -5
  22. package/dist/esm/types/generators/generators.model.d.ts +25 -1
  23. package/dist/esm/types/generators/model-router/index.d.ts +1 -0
  24. package/dist/esm/types/generators/model-router/model-router.types.d.ts +1 -0
  25. package/dist/esm/types/generators/model-router/screens/details-screen.d.ts +1 -1
  26. package/dist/esm/types/hooks/index.d.ts +1 -0
  27. package/dist/esm/types/hooks/routing/index.d.ts +1 -0
  28. package/dist/esm/types/hooks/routing/routing.hooks.d.ts +5 -0
  29. package/dist/esm/types/providers/notification-center/index.d.ts +1 -0
  30. package/dist/esm/types/providers/notification-center/notification-center.hooks.d.ts +6 -0
  31. package/dist/index.d.ts +54 -2
  32. package/package.json +6 -2
  33. package/src/components/value-displays/index.ts +1 -0
  34. package/src/components/value-displays/value-datetime/index.ts +1 -0
  35. package/src/components/value-displays/value-datetime/value-datetime.stories.tsx +21 -0
  36. package/src/components/value-displays/value-datetime/value-datetime.test.tsx +23 -0
  37. package/src/components/value-displays/value-datetime/value-datetime.tsx +40 -0
  38. package/src/components/value-displays/value-text/{value-test.test.tsx → value-text.test.tsx} +0 -0
  39. package/src/generators/generators.mock.ts +56 -17
  40. package/src/generators/generators.model.ts +39 -1
  41. package/src/generators/model-form/model-form.stories.tsx +2 -2
  42. package/src/generators/model-form/model-form.test.tsx +39 -22
  43. package/src/generators/model-form/model-form.tsx +220 -33
  44. package/src/generators/model-router/index.ts +1 -0
  45. package/src/generators/model-router/model-router.test.tsx +338 -70
  46. package/src/generators/model-router/model-router.tsx +1 -1
  47. package/src/generators/model-router/model-router.types.ts +4 -0
  48. package/src/generators/model-router/screens/add-screen.tsx +16 -20
  49. package/src/generators/model-router/screens/details-screen.tsx +3 -2
  50. package/src/generators/model-router/screens/list-screen.tsx +17 -0
  51. package/src/generators/model-router/screens/update-screen.tsx +22 -13
  52. package/src/generators/model-router/stories/model-router.stories.tsx +54 -3
  53. package/src/generators/object-details/object-details.tsx +5 -4
  54. package/src/hooks/index.ts +1 -0
  55. package/src/hooks/routing/index.ts +1 -0
  56. package/src/hooks/routing/routing.hooks.ts +23 -0
  57. package/src/hooks/routing/routing.test.tsx +83 -0
  58. package/src/providers/notification-center/index.ts +1 -0
  59. package/src/providers/notification-center/notification-center.hooks.ts +23 -0
  60. package/src/providers/notification-center/notification-center.test.tsx +87 -1
  61. package/src/storybook.tsx +10 -0
  62. package/src/tests/actions.ts +43 -0
  63. package/src/tests/assertions.ts +75 -1
  64. package/src/tests/index.ts +1 -0
  65. package/src/tests/testing-library.tsx +5 -1
@@ -1,4 +1,5 @@
1
1
  export * from "./value-text";
2
2
  export * from "./value-card";
3
3
  export * from "./value-boolean";
4
+ export * from "./value-datetime";
4
5
  export * from "./group-value-card";
@@ -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: string;
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: string;
26
+ tradeDate: Date;
23
27
  }
24
- export declare const createModelInstance: <T extends BasicData>(model: Model, seed?: number) => T;
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 SingleFields = StringField | NumberField | BooleanField;
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 {};
@@ -1 +1,2 @@
1
1
  export * from "./model-router";
2
+ export * from "./model-router.types";
@@ -6,3 +6,4 @@ export interface RequestState {
6
6
  }
7
7
  export declare const IdleRequest: RequestState;
8
8
  export declare const LoadingRequest: RequestState;
9
+ export declare const SuccessRequest: RequestState;
@@ -17,4 +17,4 @@ export interface DetailsScreenProps<T extends BasicModelInstance> extends BaseSc
17
17
  */
18
18
  detailsItem?: T;
19
19
  }
20
- export declare const DetailsScreen: <T extends BasicModelInstance>({ model, modelName, onRequestItem, itemRequest, detailsItem, }: DetailsScreenProps<T>) => JSX.Element;
20
+ export declare const DetailsScreen: <T extends BasicModelInstance>({ model, modelName, basePath, onRequestItem, itemRequest, detailsItem, }: DetailsScreenProps<T>) => JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./routing";
@@ -0,0 +1 @@
1
+ export * from "./routing.hooks";
@@ -0,0 +1,5 @@
1
+ export interface NavigateWhenValueChangesOptions<T> {
2
+ from: T;
3
+ to: T;
4
+ }
5
+ export declare const useNavigateWhenValueChanges: <T>(path: string, value: T | undefined, { from, to }: NavigateWhenValueChangesOptions<T>) => void;
@@ -1,2 +1,3 @@
1
1
  export * from "./notification-center.provider";
2
2
  export * from "./notification-center.context";
3
+ export * from "./notification-center.hooks";
@@ -0,0 +1,6 @@
1
+ import { Notification } from "./notification-center.context";
2
+ export interface NotifyWhenValueChangesOptions<T> {
3
+ from: T;
4
+ to: T;
5
+ }
6
+ export declare const useNotifyWhenValueChanges: <T>(notification: Notification, value: T | undefined, { from, to }: NotifyWhenValueChangesOptions<T>) => void;
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 SingleFields = StringField | NumberField | BooleanField;
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;
@@ -509,6 +552,9 @@ interface RequestState {
509
552
  error?: string;
510
553
  success?: boolean;
511
554
  }
555
+ declare const IdleRequest: RequestState;
556
+ declare const LoadingRequest: RequestState;
557
+ declare const SuccessRequest: RequestState;
512
558
 
513
559
  interface BaseScreenProps {
514
560
  /**
@@ -655,6 +701,12 @@ interface NotificationCenterProps {
655
701
  declare const NotificationCenterContext: React__default.Context<NotificationCenterProps | undefined>;
656
702
  declare const useNotificationCenter: () => NotificationCenterProps;
657
703
 
704
+ interface NotifyWhenValueChangesOptions<T> {
705
+ from: T;
706
+ to: T;
707
+ }
708
+ declare const useNotifyWhenValueChanges: <T>(notification: Notification, value: T | undefined, { from, to }: NotifyWhenValueChangesOptions<T>) => void;
709
+
658
710
  declare const TabContext: React.Context<[number, Dispatch<SetStateAction<number>>]>;
659
711
  declare const TabContextProvider: React.Provider<[number, Dispatch<SetStateAction<number>>]>;
660
712
  declare const useTab: () => [number, Dispatch<SetStateAction<number>>];
@@ -664,4 +716,4 @@ declare type TabProviderProps = PropsWithChildren<{
664
716
  }>;
665
717
  declare const TabProvider: ({ children, initialValue }: TabProviderProps) => JSX.Element;
666
718
 
667
- 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, Label, LabelProps, LabelVariant, Link, LinkBehaviour, 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, 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 };
719
+ 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, NotifyWhenValueChangesOptions, ObjectDetails, ObjectDetailsProps, Order, Placeholder, PlaceholderAction, PlaceholderIconArgs, PlaceholderProps, QueryContainer, QueryContainerError, QueryContainerProps, QueryContainerSuccess, RequestState, SignIn, SnackbarActionType, SnackbarContentType, SuccessRequest, 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, useNotifyWhenValueChanges, useTab };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pautena/react-design-system",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
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",
@@ -1,4 +1,5 @@
1
1
  export * from "./value-text";
2
2
  export * from "./value-card";
3
3
  export * from "./value-boolean";
4
+ export * from "./value-datetime";
4
5
  export * from "./group-value-card";
@@ -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
+ };
@@ -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 { BasicData } from "../components";
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: "string",
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: "string",
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: true,
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: "string",
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: "string",
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: "string",
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: "string",
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: 3,
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: string;
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: string;
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: () => faker.datatype.datetime().toString(),
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: faker.vehicle.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: () => "Thu Jul 21 2022 22:44:10 GMT+0200 (Central European Summer Time)",
246
+ tradeDate: faker.date.recent,
208
247
  };
209
248
 
210
- export const createModelInstance = <T extends BasicData>(model: Model, seed = 100): T => {
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 SingleFields = StringField | NumberField | BooleanField;
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
  },