@pautena/react-design-system 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -31
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/components/app-bar/app-bar.types.d.ts +2 -2
- package/dist/cjs/types/components/bullet/bullet.d.ts +1 -1
- package/dist/cjs/types/components/content/content.types.d.ts +3 -3
- package/dist/cjs/types/components/drawer/drawer.provider.d.ts +1 -1
- package/dist/cjs/types/components/drawer/drawer.types.d.ts +4 -4
- package/dist/cjs/types/components/enhanced-select/enhanced-select.d.ts +1 -2
- package/dist/cjs/types/components/header/header.dummy.d.ts +1 -1
- package/dist/cjs/types/components/header/header.types.d.ts +6 -6
- package/dist/cjs/types/components/label/label.d.ts +1 -1
- package/dist/cjs/types/components/link/link.d.ts +1 -1
- package/dist/cjs/types/components/placeholder/placeholder.d.ts +1 -1
- package/dist/cjs/types/components/query-container/query-container.d.ts +1 -1
- package/dist/cjs/types/components/sign-in/sign-in.d.ts +2 -3
- package/dist/cjs/types/components/tab/tab-card/tab-card.d.ts +3 -4
- package/dist/cjs/types/components/tab/tab-card/tab-card.dummy.d.ts +2 -3
- package/dist/cjs/types/components/table/enhanced-remote-table/enhanced-remote-table.d.ts +5 -6
- package/dist/cjs/types/components/table/enhanced-remote-table/enhanced-remote-table.mock.d.ts +6 -6
- package/dist/cjs/types/components/table/enhanced-table/enhanced-table-head.d.ts +8 -8
- package/dist/cjs/types/components/table/enhanced-table/enhanced-table.d.ts +2 -2
- package/dist/cjs/types/components/table/enhanced-table/enhanced-table.mock.d.ts +6 -7
- package/dist/cjs/types/components/table-list/table-list.d.ts +2 -2
- package/dist/cjs/types/components/value-displays/group-value-card/group-value-card.d.ts +7 -4
- package/dist/cjs/types/components/value-displays/group-value-card/group-value-card.mock.d.ts +2 -1
- package/dist/cjs/types/components/value-displays/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-boolean/value-boolean.d.ts +3 -11
- package/dist/cjs/types/components/value-displays/value-card/value-card.d.ts +1 -1
- package/dist/cjs/types/components/value-displays/value-content/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-content/value-content.d.ts +24 -0
- package/dist/cjs/types/components/value-displays/value-datetime/value-datetime.d.ts +3 -10
- package/dist/cjs/types/components/value-displays/value-displays.types.d.ts +15 -0
- package/dist/cjs/types/components/value-displays/value-image/index.d.ts +1 -0
- package/dist/cjs/types/components/value-displays/value-image/value-image.d.ts +11 -0
- package/dist/cjs/types/components/value-displays/value-text/value-text.d.ts +3 -11
- package/dist/cjs/types/generators/generators.mock.d.ts +2 -1
- package/dist/cjs/types/generators/generators.model.d.ts +36 -20
- package/dist/cjs/types/generators/generators.model.test.d.ts +1 -0
- package/dist/cjs/types/generators/model-router/model-router.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/add-screen.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/details-screen.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/list-screen.d.ts +1 -1
- package/dist/cjs/types/generators/model-router/screens/update-screen.d.ts +1 -1
- package/dist/cjs/types/layouts/header-layout/header-layout.d.ts +1 -2
- package/dist/cjs/types/providers/notification-center/notification-center.context.d.ts +0 -2
- package/dist/cjs/types/providers/notification-center/notification-center.provider.d.ts +1 -1
- package/dist/cjs/types/providers/tab-provider/tab-provider.provider.d.ts +1 -1
- package/dist/cjs/types/utils/theme.d.ts +1 -1
- package/dist/esm/index.js +1 -31
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/components/app-bar/app-bar.types.d.ts +2 -2
- package/dist/esm/types/components/bullet/bullet.d.ts +1 -1
- package/dist/esm/types/components/content/content.types.d.ts +3 -3
- package/dist/esm/types/components/drawer/drawer.provider.d.ts +1 -1
- package/dist/esm/types/components/drawer/drawer.types.d.ts +4 -4
- package/dist/esm/types/components/enhanced-select/enhanced-select.d.ts +1 -2
- package/dist/esm/types/components/header/header.dummy.d.ts +1 -1
- package/dist/esm/types/components/header/header.types.d.ts +6 -6
- package/dist/esm/types/components/label/label.d.ts +1 -1
- package/dist/esm/types/components/link/link.d.ts +1 -1
- package/dist/esm/types/components/placeholder/placeholder.d.ts +1 -1
- package/dist/esm/types/components/query-container/query-container.d.ts +1 -1
- package/dist/esm/types/components/sign-in/sign-in.d.ts +2 -3
- package/dist/esm/types/components/tab/tab-card/tab-card.d.ts +3 -4
- package/dist/esm/types/components/tab/tab-card/tab-card.dummy.d.ts +2 -3
- package/dist/esm/types/components/table/enhanced-remote-table/enhanced-remote-table.d.ts +5 -6
- package/dist/esm/types/components/table/enhanced-remote-table/enhanced-remote-table.mock.d.ts +6 -6
- package/dist/esm/types/components/table/enhanced-table/enhanced-table-head.d.ts +8 -8
- package/dist/esm/types/components/table/enhanced-table/enhanced-table.d.ts +2 -2
- package/dist/esm/types/components/table/enhanced-table/enhanced-table.mock.d.ts +6 -7
- package/dist/esm/types/components/table-list/table-list.d.ts +2 -2
- package/dist/esm/types/components/value-displays/group-value-card/group-value-card.d.ts +7 -4
- package/dist/esm/types/components/value-displays/group-value-card/group-value-card.mock.d.ts +2 -1
- package/dist/esm/types/components/value-displays/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-boolean/value-boolean.d.ts +3 -11
- package/dist/esm/types/components/value-displays/value-card/value-card.d.ts +1 -1
- package/dist/esm/types/components/value-displays/value-content/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-content/value-content.d.ts +24 -0
- package/dist/esm/types/components/value-displays/value-datetime/value-datetime.d.ts +3 -10
- package/dist/esm/types/components/value-displays/value-displays.types.d.ts +15 -0
- package/dist/esm/types/components/value-displays/value-image/index.d.ts +1 -0
- package/dist/esm/types/components/value-displays/value-image/value-image.d.ts +11 -0
- package/dist/esm/types/components/value-displays/value-text/value-text.d.ts +3 -11
- package/dist/esm/types/generators/generators.mock.d.ts +2 -1
- package/dist/esm/types/generators/generators.model.d.ts +36 -20
- package/dist/esm/types/generators/generators.model.test.d.ts +1 -0
- package/dist/esm/types/generators/model-router/model-router.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/add-screen.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/details-screen.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/list-screen.d.ts +1 -1
- package/dist/esm/types/generators/model-router/screens/update-screen.d.ts +1 -1
- package/dist/esm/types/layouts/header-layout/header-layout.d.ts +1 -2
- package/dist/esm/types/providers/notification-center/notification-center.context.d.ts +0 -2
- package/dist/esm/types/providers/notification-center/notification-center.provider.d.ts +1 -1
- package/dist/esm/types/providers/tab-provider/tab-provider.provider.d.ts +1 -1
- package/dist/esm/types/utils/theme.d.ts +1 -1
- package/dist/index.d.ts +155 -150
- package/package.json +58 -53
- package/src/components/app-bar/app-bar.stories.tsx +2 -1
- package/src/components/app-bar/app-bar.test.tsx +1 -1
- package/src/components/bullet/bullet.test.tsx +1 -1
- package/src/components/center-container/center-container.test.tsx +1 -1
- package/src/components/content/content.stories.tsx +1 -1
- package/src/components/content/content.test.tsx +1 -1
- package/src/components/drawer/__snapshots__/drawer.test.tsx.snap +3 -3
- package/src/components/drawer/drawer.test.tsx +8 -8
- package/src/components/drawer-content/drawer-content.stories.tsx +0 -1
- package/src/components/drawer-content/drawer-content.test.tsx +1 -1
- package/src/components/drawer-item/drawer-item.test.tsx +3 -3
- package/src/components/drawer-section/drawer-section.test.tsx +1 -1
- package/src/components/enhanced-select/enhanced-select.stories.tsx +10 -10
- package/src/components/enhanced-select/enhanced-select.test.tsx +9 -4
- package/src/components/enhanced-select/enhanced-select.tsx +1 -3
- package/src/components/header/header.dummy.ts +1 -1
- package/src/components/header/header.stories.tsx +0 -6
- package/src/components/header/header.test.tsx +1 -1
- package/src/components/label/label.test.tsx +1 -1
- package/src/components/link/link.tsx +2 -2
- package/src/components/loading-area/loading-area.test.tsx +2 -1
- package/src/components/placeholder/placeholder.test.tsx +3 -2
- package/src/components/query-container/query-container.test.tsx +2 -1
- package/src/components/sign-in/sign-in.test.tsx +2 -1
- package/src/components/sign-in/sign-in.tsx +3 -3
- package/src/components/tab/tab-card/tab-card.dummy.tsx +2 -2
- package/src/components/tab/tab-card/tab-card.stories.tsx +2 -2
- package/src/components/tab/tab-card/tab-card.test.tsx +1 -1
- package/src/components/tab/tab-card/tab-card.tsx +3 -3
- package/src/components/table/enhanced-remote-table/enhanced-remote-table.mock.tsx +7 -6
- package/src/components/table/enhanced-remote-table/enhanced-remote-table.test.tsx +3 -3
- package/src/components/table/enhanced-remote-table/enhanced-remote-table.tsx +8 -8
- package/src/components/table/enhanced-table/enhanced-table-head.tsx +14 -9
- package/src/components/table/enhanced-table/enhanced-table.mock.tsx +12 -6
- package/src/components/table/enhanced-table/enhanced-table.test.tsx +6 -5
- package/src/components/table/enhanced-table/enhanced-table.tsx +8 -8
- package/src/components/table-list/table-list.stories.tsx +27 -17
- package/src/components/table-list/table-list.test.tsx +11 -6
- package/src/components/table-list/table-list.tsx +23 -12
- package/src/components/value-displays/group-value-card/group-value-card.mock.tsx +2 -2
- package/src/components/value-displays/group-value-card/group-value-card.stories.tsx +24 -1
- package/src/components/value-displays/group-value-card/group-value-card.test.tsx +7 -2
- package/src/components/value-displays/group-value-card/group-value-card.tsx +13 -4
- package/src/components/value-displays/index.ts +1 -0
- package/src/components/value-displays/value-boolean/value-boolean.test.tsx +15 -3
- package/src/components/value-displays/value-boolean/value-boolean.tsx +17 -17
- package/src/components/value-displays/value-card/value-card.test.tsx +1 -1
- package/src/components/value-displays/value-content/index.ts +1 -0
- package/src/components/value-displays/value-content/value-content.stories.tsx +20 -0
- package/src/components/value-displays/value-content/value-content.test.tsx +50 -0
- package/src/components/value-displays/value-content/value-content.tsx +55 -0
- package/src/components/value-displays/value-datetime/value-datetime.stories.tsx +13 -0
- package/src/components/value-displays/value-datetime/value-datetime.test.tsx +24 -5
- package/src/components/value-displays/value-datetime/value-datetime.tsx +15 -22
- package/src/components/value-displays/value-displays.types.ts +18 -0
- package/src/components/value-displays/value-image/index.ts +1 -0
- package/src/components/value-displays/value-image/value-image.stories.tsx +28 -0
- package/src/components/value-displays/value-image/value-image.test.tsx +22 -0
- package/src/components/value-displays/value-image/value-image.tsx +24 -0
- package/src/components/value-displays/value-text/value-text.stories.tsx +11 -0
- package/src/components/value-displays/value-text/value-text.test.tsx +19 -5
- package/src/components/value-displays/value-text/value-text.tsx +16 -22
- package/src/generators/generators.mock.ts +25 -22
- package/src/generators/generators.model.test.ts +77 -0
- package/src/generators/generators.model.ts +78 -6
- package/src/generators/model-form/model-form.test.tsx +11 -14
- package/src/generators/model-form/model-form.tsx +33 -65
- package/src/generators/model-router/model-router.test.tsx +45 -32
- package/src/generators/model-router/screens/add-screen.tsx +2 -1
- package/src/generators/model-router/screens/details-screen.tsx +2 -1
- package/src/generators/model-router/screens/list-screen.tsx +1 -1
- package/src/generators/model-router/screens/update-screen.tsx +4 -5
- package/src/generators/model-router/stories/model-router.stories.tsx +1 -1
- package/src/generators/object-details/object-details.test.tsx +2 -1
- package/src/generators/object-details/object-details.tsx +18 -9
- package/src/hooks/routing/routing.test.tsx +1 -1
- package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.stories.tsx +1 -1
- package/src/layouts/app-bar-with-drawer-layout/app-bar-with-drawer-layout.test.tsx +2 -1
- package/src/layouts/header-layout/header-layout.stories.tsx +11 -4
- package/src/layouts/header-layout/header-layout.test.tsx +1 -1
- package/src/layouts/header-layout/header-layout.tsx +1 -1
- package/src/providers/notification-center/notification-center.context.ts +0 -6
- package/src/providers/notification-center/notification-center.stories.tsx +1 -1
- package/src/providers/notification-center/notification-center.test.tsx +6 -7
- package/src/storybook.tsx +1 -1
- package/src/tests/actions.ts +4 -0
- package/src/tests/assertions.ts +18 -10
- package/src/tests/components.tsx +35 -1
- package/src/tests/file-mock.ts +1 -0
- package/src/tests/mocks.ts +21 -0
- package/src/tests/testing-library.tsx +11 -8
- package/src/types/index.d.ts +4 -0
- package/src/tests/index.ts +0 -4
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createModelInstance, mockModel } from "./generators.mock";
|
|
2
|
+
import { newInstanceFromValuesOrZeroValue } from "./generators.model";
|
|
3
|
+
|
|
4
|
+
describe("utilities", () => {
|
|
5
|
+
describe("newInstanceFromValuesOrZeroValue", () => {
|
|
6
|
+
it("would create a zero value instance if no values are provided", () => {
|
|
7
|
+
const instance = newInstanceFromValuesOrZeroValue(mockModel);
|
|
8
|
+
|
|
9
|
+
expect(instance).toStrictEqual({
|
|
10
|
+
age: 0,
|
|
11
|
+
available: false,
|
|
12
|
+
birthDate: new Date(2014, 8, 18),
|
|
13
|
+
car: {
|
|
14
|
+
color: "",
|
|
15
|
+
manufacturer: "",
|
|
16
|
+
model: "",
|
|
17
|
+
returnTime: new Date(2022, 8, 21, 9, 0),
|
|
18
|
+
type: [],
|
|
19
|
+
vin: "",
|
|
20
|
+
vrm: "",
|
|
21
|
+
},
|
|
22
|
+
currency: "",
|
|
23
|
+
firstName: "",
|
|
24
|
+
gender: "",
|
|
25
|
+
id: "",
|
|
26
|
+
lastName: "",
|
|
27
|
+
middleName: "",
|
|
28
|
+
quantity: 0,
|
|
29
|
+
tradeDate: new Date(2022, 8, 12, 9, 0),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("would create the same instance if a full instance is provided", () => {
|
|
34
|
+
const values = createModelInstance(mockModel);
|
|
35
|
+
const instance = newInstanceFromValuesOrZeroValue(mockModel, values);
|
|
36
|
+
|
|
37
|
+
expect(instance).toStrictEqual(instance);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("would create a mixed instance if just some values are provided", () => {
|
|
41
|
+
const instance = newInstanceFromValuesOrZeroValue(mockModel, {
|
|
42
|
+
id: "1",
|
|
43
|
+
age: 10,
|
|
44
|
+
currency: "EUR",
|
|
45
|
+
car: {
|
|
46
|
+
returnTime: new Date(2022, 9, 10, 23),
|
|
47
|
+
type: ["sub", "sport"],
|
|
48
|
+
},
|
|
49
|
+
available: true,
|
|
50
|
+
gender: "female",
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
expect(instance).toStrictEqual({
|
|
54
|
+
age: 10,
|
|
55
|
+
available: true,
|
|
56
|
+
birthDate: new Date(2014, 8, 18),
|
|
57
|
+
car: {
|
|
58
|
+
color: "",
|
|
59
|
+
manufacturer: "",
|
|
60
|
+
model: "",
|
|
61
|
+
returnTime: new Date(2022, 9, 10, 23),
|
|
62
|
+
type: ["sub", "sport"],
|
|
63
|
+
vin: "",
|
|
64
|
+
vrm: "",
|
|
65
|
+
},
|
|
66
|
+
currency: "EUR",
|
|
67
|
+
firstName: "",
|
|
68
|
+
gender: "female",
|
|
69
|
+
id: "1",
|
|
70
|
+
lastName: "",
|
|
71
|
+
middleName: "",
|
|
72
|
+
quantity: 0,
|
|
73
|
+
tradeDate: new Date(2022, 8, 12, 9, 0),
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MODEL TYPES
|
|
3
|
+
* Types used to specify the model
|
|
4
|
+
*/
|
|
5
|
+
export type ModelFieldTypes =
|
|
6
|
+
| "string"
|
|
7
|
+
| "number"
|
|
8
|
+
| "boolean"
|
|
9
|
+
| "enum"
|
|
10
|
+
| "multienum"
|
|
11
|
+
| "date"
|
|
12
|
+
| "time"
|
|
13
|
+
| "datetime";
|
|
14
|
+
|
|
1
15
|
type Base = {
|
|
2
16
|
id: string;
|
|
3
17
|
description: string;
|
|
@@ -38,19 +52,19 @@ type MultiEnumField = {
|
|
|
38
52
|
type DateField = {
|
|
39
53
|
type: "date";
|
|
40
54
|
format: string;
|
|
41
|
-
default:
|
|
55
|
+
default: Date;
|
|
42
56
|
};
|
|
43
57
|
|
|
44
58
|
type TimeField = {
|
|
45
59
|
type: "time";
|
|
46
60
|
format: string;
|
|
47
|
-
default:
|
|
61
|
+
default: Date;
|
|
48
62
|
};
|
|
49
63
|
|
|
50
64
|
type DatetimeField = {
|
|
51
65
|
type: "datetime";
|
|
52
66
|
format: string;
|
|
53
|
-
default:
|
|
67
|
+
default: Date;
|
|
54
68
|
};
|
|
55
69
|
|
|
56
70
|
type SingleFields =
|
|
@@ -69,16 +83,74 @@ export type GroupField = {
|
|
|
69
83
|
} & Base;
|
|
70
84
|
|
|
71
85
|
type Fields = SingleFields | GroupField;
|
|
72
|
-
|
|
73
86
|
export type ModelField = Base & Breakpoints & Fields;
|
|
74
87
|
|
|
75
88
|
export type Model = {
|
|
76
89
|
fields: ModelField[];
|
|
77
90
|
};
|
|
78
91
|
|
|
92
|
+
/**
|
|
93
|
+
* INSTANCE TYPES
|
|
94
|
+
* Types used to represent an instance of a model specification
|
|
95
|
+
*/
|
|
96
|
+
export type BaseFieldType = string | number | boolean | Date;
|
|
97
|
+
export type ArrayFieldType = string[];
|
|
98
|
+
export type SingleFieldType = BaseFieldType | ArrayFieldType;
|
|
99
|
+
export type GroupInstanceType = { [key: string]: SingleFieldType };
|
|
100
|
+
export type FieldType = SingleFieldType | GroupInstanceType;
|
|
101
|
+
|
|
79
102
|
export interface BasicModelInstance {
|
|
80
103
|
id: string;
|
|
81
|
-
[key: string]:
|
|
104
|
+
[key: string]: FieldType;
|
|
82
105
|
}
|
|
83
106
|
|
|
84
|
-
|
|
107
|
+
/**
|
|
108
|
+
* UTILITIES
|
|
109
|
+
* Some functions used in several places to help to manage models
|
|
110
|
+
*/
|
|
111
|
+
const InitialStateZeroValue: Record<ModelFieldTypes | "group", FieldType | undefined> = {
|
|
112
|
+
string: "",
|
|
113
|
+
number: 0,
|
|
114
|
+
boolean: false,
|
|
115
|
+
enum: "",
|
|
116
|
+
multienum: [],
|
|
117
|
+
date: new Date(1970, 0, 1, 0, 0),
|
|
118
|
+
time: new Date(1970, 0, 1, 0, 0),
|
|
119
|
+
datetime: new Date(1970, 0, 1, 0, 0),
|
|
120
|
+
group: {},
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const getFieldValueOrZero = (
|
|
124
|
+
field: ModelField,
|
|
125
|
+
values: BasicModelInstance | GroupInstanceType | undefined,
|
|
126
|
+
) => {
|
|
127
|
+
return (
|
|
128
|
+
(values && values[field.id]) ||
|
|
129
|
+
("default" in field && field.default) ||
|
|
130
|
+
InitialStateZeroValue[field.type]
|
|
131
|
+
);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export const newInstanceFromValuesOrZeroValue = <T extends BasicModelInstance>(
|
|
135
|
+
model: Model,
|
|
136
|
+
values: T | undefined = undefined,
|
|
137
|
+
): T => {
|
|
138
|
+
const obj: Record<string, FieldType | undefined> = {};
|
|
139
|
+
|
|
140
|
+
model.fields.forEach((field) => {
|
|
141
|
+
if (field.type === "group") {
|
|
142
|
+
const value: GroupInstanceType = {};
|
|
143
|
+
field.value.forEach((groupField) => {
|
|
144
|
+
value[groupField.id] = getFieldValueOrZero(
|
|
145
|
+
groupField,
|
|
146
|
+
values && (values[field.id] as GroupInstanceType),
|
|
147
|
+
) as SingleFieldType;
|
|
148
|
+
});
|
|
149
|
+
obj[field.id] = value;
|
|
150
|
+
} else {
|
|
151
|
+
obj[field.id] = getFieldValueOrZero(field, values);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return obj as T;
|
|
156
|
+
};
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { ModelForm } from "./model-form";
|
|
3
|
-
import {
|
|
4
|
-
expectModelFieldInputExist,
|
|
5
|
-
expectModelFieldInputValue,
|
|
6
|
-
render,
|
|
7
|
-
screen,
|
|
8
|
-
selectOption,
|
|
9
|
-
selectOptions,
|
|
10
|
-
pickDatetime,
|
|
11
|
-
expectToHaveBeenCalledOnceWithMockInstance,
|
|
12
|
-
} from "../../tests";
|
|
3
|
+
import { render, screen } from "~/tests/testing-library";
|
|
13
4
|
import {
|
|
14
5
|
BirthDateFormat,
|
|
15
6
|
createModelInstance,
|
|
@@ -19,6 +10,12 @@ import {
|
|
|
19
10
|
TradeDateFormat,
|
|
20
11
|
} from "../generators.mock";
|
|
21
12
|
import userEvent from "@testing-library/user-event";
|
|
13
|
+
import { selectOption, typeNumericInput, pickDatetime, selectOptions } from "~/tests/actions";
|
|
14
|
+
import {
|
|
15
|
+
expectModelFieldInputExist,
|
|
16
|
+
expectModelFieldInputValue,
|
|
17
|
+
expectToHaveBeenCalledOnceWithMockInstance,
|
|
18
|
+
} from "~/tests/assertions";
|
|
22
19
|
|
|
23
20
|
describe("ModelForm", () => {
|
|
24
21
|
const renderComponent = ({
|
|
@@ -66,8 +63,8 @@ describe("ModelForm", () => {
|
|
|
66
63
|
await userEvent.type(screen.getByRole("textbox", { name: /first name/i }), "Karianne");
|
|
67
64
|
await userEvent.type(screen.getByRole("textbox", { name: /middle name/i }), "Noah");
|
|
68
65
|
await userEvent.type(screen.getByRole("textbox", { name: /last name/i }), "Gorczany");
|
|
69
|
-
await selectOption(screen.getByRole("button", { name: /gender/i }), "Cis
|
|
70
|
-
|
|
66
|
+
await selectOption(screen.getByRole("button", { name: /gender/i }), "Cis man");
|
|
67
|
+
typeNumericInput(screen.getByRole("spinbutton", { name: /age/i }), 37);
|
|
71
68
|
pickDatetime(screen.getByRole("textbox", { name: /birth date/i }), birthDate, BirthDateFormat);
|
|
72
69
|
await selectOption(screen.getByRole("button", { name: /model/i }), "Spyder");
|
|
73
70
|
await selectOption(screen.getByRole("button", { name: /manufacturer/i }), "Bugatti");
|
|
@@ -84,7 +81,7 @@ describe("ModelForm", () => {
|
|
|
84
81
|
returnTime,
|
|
85
82
|
ReturnTimeFormat,
|
|
86
83
|
);
|
|
87
|
-
|
|
84
|
+
typeNumericInput(screen.getByRole("spinbutton", { name: /q/i }), 9);
|
|
88
85
|
await userEvent.click(screen.getByRole("checkbox", { name: /available/i }));
|
|
89
86
|
await userEvent.type(screen.getByRole("textbox", { name: /currency/i }), "mxn");
|
|
90
87
|
pickDatetime(screen.getByRole("textbox", { name: /trade date/i }), tradeDate, TradeDateFormat);
|
|
@@ -96,7 +93,7 @@ describe("ModelForm", () => {
|
|
|
96
93
|
firstName: "Karianne",
|
|
97
94
|
middleName: "Noah",
|
|
98
95
|
lastName: "Gorczany",
|
|
99
|
-
gender: "Cis
|
|
96
|
+
gender: "Cis man",
|
|
100
97
|
age: 37,
|
|
101
98
|
birthDate,
|
|
102
99
|
car: {
|
|
@@ -18,52 +18,16 @@ import { DesktopDatePicker, TimePicker, DateTimePicker } from "@mui/x-date-picke
|
|
|
18
18
|
import React, { ChangeEvent, FormEvent, ReactElement, useMemo } from "react";
|
|
19
19
|
import { useState } from "react";
|
|
20
20
|
import { useGetDefaultThemeColor } from "../../utils/theme";
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const getFieldInitialState = <T extends BasicModelInstance>(
|
|
34
|
-
field: ModelField,
|
|
35
|
-
initialValues: T | undefined,
|
|
36
|
-
) => {
|
|
37
|
-
return initialValues ? initialValues[field.id] : InitialStateZeroValue[field.type];
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const getValuesInitialState = <T extends BasicModelInstance>(
|
|
41
|
-
model: Model,
|
|
42
|
-
initialValues: T | undefined,
|
|
43
|
-
): T => {
|
|
44
|
-
const obj = {} as any;
|
|
45
|
-
|
|
46
|
-
model.fields.forEach((field) => {
|
|
47
|
-
let value: any;
|
|
48
|
-
if (field.type === "group") {
|
|
49
|
-
value = {};
|
|
50
|
-
field.value.forEach((groupField) => {
|
|
51
|
-
value[groupField.id] = getFieldInitialState(
|
|
52
|
-
groupField,
|
|
53
|
-
initialValues && initialValues[field.id],
|
|
54
|
-
);
|
|
55
|
-
});
|
|
56
|
-
} else if (field.type === "date" || field.type === "time") {
|
|
57
|
-
value = (initialValues && initialValues[field.id]) || field.default;
|
|
58
|
-
} else {
|
|
59
|
-
value = getFieldInitialState(field, initialValues);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
obj[field.id] = value;
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
return obj;
|
|
66
|
-
};
|
|
21
|
+
import {
|
|
22
|
+
Model,
|
|
23
|
+
ModelField,
|
|
24
|
+
BasicModelInstance,
|
|
25
|
+
ModelFieldTypes,
|
|
26
|
+
GroupInstanceType,
|
|
27
|
+
FieldType,
|
|
28
|
+
ArrayFieldType,
|
|
29
|
+
newInstanceFromValuesOrZeroValue,
|
|
30
|
+
} from "../generators.model";
|
|
67
31
|
|
|
68
32
|
export interface ModelFormProps<T extends BasicModelInstance> {
|
|
69
33
|
model: Model;
|
|
@@ -79,19 +43,19 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
79
43
|
initialValues,
|
|
80
44
|
}: ModelFormProps<T>) => {
|
|
81
45
|
const valuesInitialState = useMemo(
|
|
82
|
-
() =>
|
|
46
|
+
() => newInstanceFromValuesOrZeroValue<T>(model, initialValues),
|
|
83
47
|
[model, initialValues],
|
|
84
48
|
);
|
|
85
49
|
const [values, setValues] = useState<T>(valuesInitialState);
|
|
86
50
|
|
|
87
|
-
const setKeyValue = (name: string, key: string | undefined, value:
|
|
51
|
+
const setKeyValue = (name: string, key: string | undefined, value: FieldType | null) => {
|
|
88
52
|
setValues((v) => {
|
|
89
|
-
const n: Record<string,
|
|
53
|
+
const n: Record<string, FieldType | null> = {};
|
|
90
54
|
if (key) {
|
|
91
55
|
n[key] = {
|
|
92
|
-
...v[key],
|
|
56
|
+
...(v[key] as GroupInstanceType),
|
|
93
57
|
[name]: value,
|
|
94
|
-
};
|
|
58
|
+
} as GroupInstanceType;
|
|
95
59
|
} else {
|
|
96
60
|
n[name] = value;
|
|
97
61
|
}
|
|
@@ -100,17 +64,17 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
100
64
|
});
|
|
101
65
|
};
|
|
102
66
|
|
|
103
|
-
const handleCheckboxChange = (e: ChangeEvent<
|
|
67
|
+
const handleCheckboxChange = (e: ChangeEvent<HTMLInputElement>, key: string | undefined) => {
|
|
104
68
|
e.preventDefault();
|
|
105
69
|
setKeyValue(e.target.name, key, e.target.checked);
|
|
106
70
|
};
|
|
107
71
|
|
|
108
|
-
const handleSelectChange = (e: SelectChangeEvent<
|
|
72
|
+
const handleSelectChange = (e: SelectChangeEvent<FieldType>, key: string | undefined) => {
|
|
109
73
|
e.preventDefault();
|
|
110
74
|
setKeyValue(e.target.name, key, e.target.value);
|
|
111
75
|
};
|
|
112
76
|
|
|
113
|
-
const handleMultiSelectChange = (e: SelectChangeEvent<
|
|
77
|
+
const handleMultiSelectChange = (e: SelectChangeEvent<FieldType>, key: string | undefined) => {
|
|
114
78
|
e.preventDefault();
|
|
115
79
|
const { value } = e.target;
|
|
116
80
|
const newValue = typeof value === "string" ? value.split(",") : value;
|
|
@@ -118,20 +82,20 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
118
82
|
};
|
|
119
83
|
|
|
120
84
|
const handleInputChange = (
|
|
121
|
-
e: ChangeEvent<
|
|
85
|
+
e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,
|
|
122
86
|
key: string | undefined,
|
|
123
87
|
type: ModelFieldTypes,
|
|
124
88
|
) => {
|
|
125
89
|
e.preventDefault();
|
|
126
90
|
|
|
127
|
-
let value = e.target.value;
|
|
128
|
-
if (type === "number") {
|
|
91
|
+
let value: string | number = e.target.value;
|
|
92
|
+
if (type === "number" && typeof value === "string") {
|
|
129
93
|
value = parseInt(e.target.value);
|
|
130
94
|
}
|
|
131
95
|
setKeyValue(e.target.name, key, value);
|
|
132
96
|
};
|
|
133
97
|
|
|
134
|
-
const handleDateChange = (value:
|
|
98
|
+
const handleDateChange = (value: FieldType | null, key: string | undefined, id: string) => {
|
|
135
99
|
setKeyValue(id, key, value);
|
|
136
100
|
};
|
|
137
101
|
|
|
@@ -146,7 +110,7 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
146
110
|
const { id, type, name, description, xs, sm, md, lg, xl } = field;
|
|
147
111
|
|
|
148
112
|
let fieldInput: ReactElement;
|
|
149
|
-
const value = key ? values[key][id] : values[id];
|
|
113
|
+
const value = key ? (values[key] as GroupInstanceType)[id] : values[id];
|
|
150
114
|
if (type === "group") {
|
|
151
115
|
fieldInput = (
|
|
152
116
|
<Paper>
|
|
@@ -168,7 +132,11 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
168
132
|
<Box sx={{ height: 1, display: "flex", alignItems: "center" }}>
|
|
169
133
|
<FormControlLabel
|
|
170
134
|
control={
|
|
171
|
-
<Checkbox
|
|
135
|
+
<Checkbox
|
|
136
|
+
name={id}
|
|
137
|
+
onChange={(e) => handleCheckboxChange(e, key)}
|
|
138
|
+
checked={value as boolean}
|
|
139
|
+
/>
|
|
172
140
|
}
|
|
173
141
|
label={name}
|
|
174
142
|
/>
|
|
@@ -203,7 +171,7 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
203
171
|
labelId={`${id}-select-label`}
|
|
204
172
|
id={`${id}-select`}
|
|
205
173
|
value={value || []}
|
|
206
|
-
renderValue={(selected) => selected.join(", ")}
|
|
174
|
+
renderValue={(selected) => (selected as ArrayFieldType).join(", ")}
|
|
207
175
|
label={name}
|
|
208
176
|
name={id}
|
|
209
177
|
onChange={(e) => handleMultiSelectChange(e, key)}
|
|
@@ -212,7 +180,7 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
212
180
|
>
|
|
213
181
|
{field.value.map((fieldValue) => (
|
|
214
182
|
<MenuItem key={fieldValue} value={fieldValue}>
|
|
215
|
-
<Checkbox checked={(value || []).includes(fieldValue)} />
|
|
183
|
+
<Checkbox checked={((value as ArrayFieldType) || []).includes(fieldValue)} />
|
|
216
184
|
<ListItemText primary={fieldValue} />
|
|
217
185
|
</MenuItem>
|
|
218
186
|
))}
|
|
@@ -226,7 +194,7 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
226
194
|
inputFormat={field.format}
|
|
227
195
|
value={value}
|
|
228
196
|
onChange={(value) => handleDateChange(value, key, id)}
|
|
229
|
-
renderInput={(params
|
|
197
|
+
renderInput={(params) => <TextField {...params} />}
|
|
230
198
|
/>
|
|
231
199
|
);
|
|
232
200
|
} else if (type === "time") {
|
|
@@ -236,7 +204,7 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
236
204
|
inputFormat={field.format}
|
|
237
205
|
value={value}
|
|
238
206
|
onChange={(value) => handleDateChange(value, key, id)}
|
|
239
|
-
renderInput={(params
|
|
207
|
+
renderInput={(params) => <TextField {...params} />}
|
|
240
208
|
/>
|
|
241
209
|
);
|
|
242
210
|
} else if (type === "datetime") {
|
|
@@ -246,7 +214,7 @@ export const ModelForm = <T extends BasicModelInstance>({
|
|
|
246
214
|
inputFormat={field.format}
|
|
247
215
|
value={value}
|
|
248
216
|
onChange={(value) => handleDateChange(value, key, id)}
|
|
249
|
-
renderInput={(params
|
|
217
|
+
renderInput={(params) => <TextField {...params} />}
|
|
250
218
|
/>
|
|
251
219
|
);
|
|
252
220
|
} else {
|
|
@@ -1,16 +1,5 @@
|
|
|
1
1
|
import React, { useState } from "react";
|
|
2
2
|
import { DummyModelRouter, InternalModelRouter } from "./stories/model-router.stories";
|
|
3
|
-
import {
|
|
4
|
-
expectModelFieldInputExist,
|
|
5
|
-
expectProgressIndicator,
|
|
6
|
-
waitForProgressIndicatorToBeRemoved,
|
|
7
|
-
render,
|
|
8
|
-
screen,
|
|
9
|
-
TestRouter,
|
|
10
|
-
expectModelFieldValue,
|
|
11
|
-
expectModelFieldInputValue,
|
|
12
|
-
selectOption,
|
|
13
|
-
} from "~/tests";
|
|
14
3
|
import { data as mockData } from "./stories/templates";
|
|
15
4
|
import userEvent from "@testing-library/user-event";
|
|
16
5
|
import { getRandomItem } from "../../utils";
|
|
@@ -27,16 +16,27 @@ import { NotificationCenterProvider } from "../../providers";
|
|
|
27
16
|
import { Box } from "@mui/system";
|
|
28
17
|
import { Button } from "@mui/material";
|
|
29
18
|
import { useNavigate } from "react-router-dom";
|
|
19
|
+
import { render, screen, TestRouter } from "~/tests/testing-library";
|
|
20
|
+
import { AddScreen, ListScreen, UpdateScreen } from "./screens";
|
|
21
|
+
import { IdleRequest, LoadingRequest, SuccessRequest } from "./model-router.types";
|
|
30
22
|
import {
|
|
31
23
|
clearCheckbox,
|
|
32
24
|
clearMultiSelect,
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
selectOption,
|
|
26
|
+
typeNumericInput,
|
|
35
27
|
pickDatetime,
|
|
36
28
|
selectOptions,
|
|
37
|
-
} from "
|
|
38
|
-
import {
|
|
39
|
-
|
|
29
|
+
} from "~/tests/actions";
|
|
30
|
+
import {
|
|
31
|
+
expectProgressIndicator,
|
|
32
|
+
waitForProgressIndicatorToBeRemoved,
|
|
33
|
+
expectModelFieldInputExist,
|
|
34
|
+
expectModelFieldInputValue,
|
|
35
|
+
expectToHaveBeenCalledOnceWithMockInstance,
|
|
36
|
+
expectAlert,
|
|
37
|
+
expectModelFieldValue,
|
|
38
|
+
} from "~/tests/assertions";
|
|
39
|
+
import { mockConsoleWarn } from "~/tests/mocks";
|
|
40
40
|
|
|
41
41
|
const REQUEST_TIMEOUT = 20;
|
|
42
42
|
|
|
@@ -87,10 +87,11 @@ describe("ModelRouter", () => {
|
|
|
87
87
|
).not.toBeInTheDocument(),
|
|
88
88
|
expectListItems: async ({ data, model }: { data: MockInstance[]; model: Model }) => {
|
|
89
89
|
for (let i = 0; i < model.fields.length; ++i) {
|
|
90
|
-
const {
|
|
90
|
+
const { listable, id } = model.fields[i];
|
|
91
91
|
|
|
92
92
|
if (listable) {
|
|
93
|
-
|
|
93
|
+
const name = data[i][id] as string;
|
|
94
|
+
expect(await screen.findAllByRole("cell", { name })).toBeTruthy();
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
},
|
|
@@ -145,30 +146,36 @@ describe("ModelRouter", () => {
|
|
|
145
146
|
const lastNameElement = screen.getByRole("textbox", { name: /last name/i });
|
|
146
147
|
const genderElement = screen.getByRole("button", { name: /gender/i });
|
|
147
148
|
const ageElement = screen.getByRole("spinbutton", { name: /age/i });
|
|
148
|
-
const birthDateElement = screen.getByRole("textbox", {
|
|
149
|
+
const birthDateElement = screen.getByRole<HTMLInputElement>("textbox", {
|
|
150
|
+
name: /birth date/i,
|
|
151
|
+
});
|
|
149
152
|
const manufacturerElement = screen.getByRole("button", { name: /manufacturer/i });
|
|
150
153
|
const modelElement = screen.getByRole("button", { name: /model/i });
|
|
151
154
|
const colorElement = screen.getByRole("textbox", { name: /color/i });
|
|
152
155
|
const typeElement = screen.getByRole("button", { name: /type/i });
|
|
153
156
|
const vinElement = screen.getByRole("textbox", { name: /vin/i });
|
|
154
157
|
const vrmElement = screen.getByRole("textbox", { name: /vrm/i });
|
|
155
|
-
const timeReturnElement = screen.getByRole("textbox", {
|
|
158
|
+
const timeReturnElement = screen.getByRole<HTMLInputElement>("textbox", {
|
|
159
|
+
name: /return time/i,
|
|
160
|
+
});
|
|
156
161
|
const quantityElement = screen.getByRole("spinbutton", { name: /q/i });
|
|
157
|
-
const availableElement = screen.getByRole("checkbox", {
|
|
162
|
+
const availableElement = screen.getByRole<HTMLInputElement>("checkbox", {
|
|
163
|
+
name: /available/i,
|
|
164
|
+
});
|
|
158
165
|
const currencyElement = screen.getByRole("textbox", { name: /currency/i });
|
|
159
|
-
const tradeDateElement = screen.getByRole("textbox", {
|
|
166
|
+
const tradeDateElement = screen.getByRole<HTMLInputElement>("textbox", {
|
|
167
|
+
name: /trade date/i,
|
|
168
|
+
});
|
|
160
169
|
|
|
161
170
|
if (clear) {
|
|
162
171
|
await userEvent.clear(idElement);
|
|
163
172
|
await userEvent.clear(firstNameElement);
|
|
164
173
|
await userEvent.clear(middleNameElement);
|
|
165
174
|
await userEvent.clear(lastNameElement);
|
|
166
|
-
await userEvent.clear(ageElement);
|
|
167
175
|
await userEvent.clear(birthDateElement);
|
|
168
176
|
await userEvent.clear(colorElement);
|
|
169
177
|
await userEvent.clear(vinElement);
|
|
170
178
|
await userEvent.clear(vrmElement);
|
|
171
|
-
await userEvent.clear(quantityElement);
|
|
172
179
|
await userEvent.clear(availableElement);
|
|
173
180
|
await userEvent.clear(currencyElement);
|
|
174
181
|
await userEvent.clear(tradeDateElement);
|
|
@@ -181,7 +188,7 @@ describe("ModelRouter", () => {
|
|
|
181
188
|
await userEvent.type(middleNameElement, instance.middleName);
|
|
182
189
|
await userEvent.type(lastNameElement, instance.lastName);
|
|
183
190
|
await selectOption(genderElement, instance.gender);
|
|
184
|
-
|
|
191
|
+
typeNumericInput(ageElement, instance.age);
|
|
185
192
|
pickDatetime(birthDateElement, instance.birthDate, BirthDateFormat);
|
|
186
193
|
await selectOption(modelElement, instance.car.model);
|
|
187
194
|
await selectOption(manufacturerElement, instance.car.manufacturer);
|
|
@@ -190,7 +197,7 @@ describe("ModelRouter", () => {
|
|
|
190
197
|
await userEvent.type(vinElement, instance.car.vin);
|
|
191
198
|
await userEvent.type(vrmElement, instance.car.vrm);
|
|
192
199
|
pickDatetime(timeReturnElement, instance.car.returnTime, ReturnTimeFormat);
|
|
193
|
-
|
|
200
|
+
typeNumericInput(quantityElement, instance.quantity);
|
|
194
201
|
if (instance.available) {
|
|
195
202
|
await userEvent.click(availableElement);
|
|
196
203
|
}
|
|
@@ -788,13 +795,13 @@ describe("ModelRouter", () => {
|
|
|
788
795
|
expect(onRequestItem).toHaveBeenCalledWith(id);
|
|
789
796
|
});
|
|
790
797
|
|
|
791
|
-
it("would show a loading indicator when the request is in progress", async () => {
|
|
798
|
+
it.skip("would show a loading indicator when the request is in progress", async () => {
|
|
792
799
|
await renderComponent({ screen: "details" });
|
|
793
800
|
|
|
794
801
|
expectProgressIndicator();
|
|
795
802
|
});
|
|
796
803
|
|
|
797
|
-
it("would show the details of an instance", async () => {
|
|
804
|
+
it.skip("would show the details of an instance", async () => {
|
|
798
805
|
const { model, randomItem } = await renderComponent({ screen: "details" });
|
|
799
806
|
|
|
800
807
|
await waitForProgressIndicatorToBeRemoved();
|
|
@@ -862,13 +869,13 @@ describe("ModelRouter", () => {
|
|
|
862
869
|
expect(onRequestUpdateItem).toHaveBeenCalledWith(id);
|
|
863
870
|
});
|
|
864
871
|
|
|
865
|
-
it("would show a loading indicator while the instance is requested", async () => {
|
|
872
|
+
it.skip("would show a loading indicator while the instance is requested", async () => {
|
|
866
873
|
await renderComponent({ screen: "update" });
|
|
867
874
|
|
|
868
875
|
await expectProgressIndicator();
|
|
869
876
|
});
|
|
870
877
|
|
|
871
|
-
it("would render a form with the instance values", async () => {
|
|
878
|
+
it.skip("would render a form with the instance values", async () => {
|
|
872
879
|
const {
|
|
873
880
|
model,
|
|
874
881
|
randomItem: { item },
|
|
@@ -879,7 +886,7 @@ describe("ModelRouter", () => {
|
|
|
879
886
|
expectModelFieldInputValue(model.fields, item);
|
|
880
887
|
});
|
|
881
888
|
|
|
882
|
-
it("would make a request with the new values when the form is submitted", async () => {
|
|
889
|
+
it.skip("would make a request with the new values when the form is submitted", async () => {
|
|
883
890
|
const { model, onSubmitUpdate } = await renderComponent({ screen: "update" });
|
|
884
891
|
|
|
885
892
|
await waitForProgressIndicatorToBeRemoved();
|
|
@@ -888,7 +895,7 @@ describe("ModelRouter", () => {
|
|
|
888
895
|
expectToHaveBeenCalledOnceWithMockInstance(onSubmitUpdate, newInstance);
|
|
889
896
|
});
|
|
890
897
|
|
|
891
|
-
it("would show a loading indicator while the submit request is in progress", async () => {
|
|
898
|
+
it.skip("would show a loading indicator while the submit request is in progress", async () => {
|
|
892
899
|
const { model } = await renderComponent({ screen: "update" });
|
|
893
900
|
|
|
894
901
|
await waitForProgressIndicatorToBeRemoved();
|
|
@@ -1014,6 +1021,8 @@ describe("ModelRouter", () => {
|
|
|
1014
1021
|
});
|
|
1015
1022
|
|
|
1016
1023
|
describe("updateFeature disabled", () => {
|
|
1024
|
+
mockConsoleWarn();
|
|
1025
|
+
|
|
1017
1026
|
it("wouldn't have an option to remove an item from the list", async () => {
|
|
1018
1027
|
const { data } = await renderComponent({ updateFeature: false });
|
|
1019
1028
|
const {
|
|
@@ -1053,6 +1062,8 @@ describe("ModelRouter", () => {
|
|
|
1053
1062
|
});
|
|
1054
1063
|
|
|
1055
1064
|
describe("addFeature disabled", () => {
|
|
1065
|
+
mockConsoleWarn();
|
|
1066
|
+
|
|
1056
1067
|
it("wouldn't render a button to navigate to the add screen", async () => {
|
|
1057
1068
|
await renderComponent({ addFeature: false });
|
|
1058
1069
|
|
|
@@ -1071,6 +1082,8 @@ describe("ModelRouter", () => {
|
|
|
1071
1082
|
});
|
|
1072
1083
|
|
|
1073
1084
|
describe("detailsFeature disabled", () => {
|
|
1085
|
+
mockConsoleWarn();
|
|
1086
|
+
|
|
1074
1087
|
it("wouldn't navigate to the details screen if I click a row item", async () => {
|
|
1075
1088
|
const {
|
|
1076
1089
|
randomItem: {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Header, Content } from "~/components";
|
|
3
|
-
import { BasicModelInstance
|
|
3
|
+
import { BasicModelInstance } from "../../generators.model";
|
|
4
|
+
import { ModelForm } from "../../model-form";
|
|
4
5
|
import { HeaderLayout } from "../../../layouts";
|
|
5
6
|
import { useNotifyWhenValueChanges } from "../../../providers";
|
|
6
7
|
import { RequestState } from "../model-router.types";
|
|
@@ -4,7 +4,8 @@ import { RequestState } from "../model-router.types";
|
|
|
4
4
|
import { Content, Header } from "~/components";
|
|
5
5
|
import { HeaderLayout } from "~/layouts";
|
|
6
6
|
import { BaseScreenProps } from "./screens.types";
|
|
7
|
-
import { BasicModelInstance
|
|
7
|
+
import { BasicModelInstance } from "../../generators.model";
|
|
8
|
+
import { ObjectDetails } from "~/generators/object-details";
|
|
8
9
|
|
|
9
10
|
export interface DetailsScreenProps<T extends BasicModelInstance> extends BaseScreenProps {
|
|
10
11
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useEffect } from "react";
|
|
2
2
|
import { useNavigate } from "react-router-dom";
|
|
3
3
|
import { Content, Header, HeaderAction, TableList, TableRowOption } from "~/components";
|
|
4
|
-
import { BasicModelInstance } from "
|
|
4
|
+
import { BasicModelInstance } from "../../generators.model";
|
|
5
5
|
import { useNotifyWhenValueChanges } from "~/providers";
|
|
6
6
|
import { HeaderLayout } from "../../../layouts";
|
|
7
7
|
import { RequestState } from "../model-router.types";
|