Skip to content

Commit 9a1147d

Browse files
Merge pull request #31 from SimplrJS/feature/default-and-initial-value
Feature/default and initial value
2 parents 901e8df + 3793a7b commit 9a1147d

File tree

22 files changed

+821
-394
lines changed

22 files changed

+821
-394
lines changed

packages/simplr-forms-core/__tests__/stores/form-store.test.ts

Lines changed: 150 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ import { FieldStatePropsRecord, FieldStateProps } from "../../src/contracts/fiel
88
import { MyFieldProps } from "../test-components/test-field";
99

1010
describe("Form store", () => {
11+
const formId = "form-id";
12+
let formStore: FormStore;
13+
14+
beforeEach(() => {
15+
formStore = new FormStore(formId);
16+
});
17+
1118
it("returns state", () => {
1219
const formId = "FORM-ID";
1320
const formStore = new FormStore(formId);
@@ -16,10 +23,8 @@ describe("Form store", () => {
1623
});
1724

1825
it("returns fieldId from fieldName and fieldGroupId", () => {
19-
const formId = "FORM-ID";
2026
const fieldName = "FIELD-NAME";
2127
const fieldGroupId = "FIELD-GROUP-ID";
22-
const formStore = new FormStore(formId);
2328

2429
const fieldId = formStore.GetFieldId(fieldName, fieldGroupId);
2530

@@ -29,78 +34,65 @@ describe("Form store", () => {
2934
});
3035

3136
it("registers a field", () => {
32-
const formId = "FORM-ID";
3337
const fieldId = "FIELD-ID";
34-
const initialValue = "INITIAL-VALUE";
38+
const value = "value";
3539
const defaultValue = "DEFAULT-VALUE";
36-
const formStore = new FormStore(formId);
3740

38-
formStore.RegisterField(fieldId, initialValue, defaultValue);
41+
formStore.RegisterField(fieldId, defaultValue, undefined, value);
42+
3943
expect(formStore.HasField(fieldId)).toBe(true);
40-
expect(formStore.GetField(fieldId)).not.toBeUndefined();
41-
expect(formStore.GetField(fieldId).Value).toBe(initialValue);
42-
expect(formStore.GetField(fieldId).DefaultValue).toBe(defaultValue);
44+
45+
const fieldState = formStore.GetField(fieldId);
46+
47+
expect(fieldState).not.toBeUndefined();
48+
expect(fieldState.Value).toBe(value);
49+
expect(fieldState.InitialValue).toBe(value);
50+
expect(fieldState.DefaultValue).toBe(defaultValue);
4351
});
4452

53+
// TODO: Write test with initial value
54+
4555
it("unregisters a field", () => {
46-
const formId = "FORM-ID";
47-
const fieldId = "FIELD-ID";
48-
const initialValue = "INITIAL-VALUE";
49-
const defaultValue = "DEFAULT-VALUE";
50-
const formStore = new FormStore(formId);
56+
const fieldId = "field-id";
5157

52-
formStore.RegisterField(fieldId, initialValue, defaultValue);
58+
formStore.RegisterField(fieldId, "", undefined, "value");
5359
formStore.UnregisterField(fieldId);
60+
5461
expect(formStore.GetField(fieldId)).toBeUndefined();
5562
expect(formStore.HasField(fieldId)).toBe(false);
5663
});
5764

5865
it("has a field", () => {
59-
const formId = "FORM-ID";
60-
const fieldId = "FIELD-ID";
61-
const initialValue = "INITIAL-VALUE";
62-
const defaultValue = "DEFAULT-VALUE";
63-
const formStore = new FormStore(formId);
64-
66+
const fieldId = "field-id";
6567
expect(formStore.HasField(fieldId)).toBe(false);
66-
formStore.RegisterField(fieldId, initialValue, defaultValue);
68+
formStore.RegisterField(fieldId, "", undefined, "");
6769
expect(formStore.HasField(fieldId)).toBe(true);
6870
});
6971

7072
it("get a field", () => {
71-
const formId = "FORM-ID";
72-
const fieldId = "FIELD-ID";
73-
const initialValue = "INITIAL-VALUE";
74-
const defaultValue = "DEFAULT-VALUE";
75-
const formStore = new FormStore(formId);
73+
const fieldId = "field-id";
7674

7775
expect(formStore.GetField(fieldId)).toBeUndefined();
78-
formStore.RegisterField(fieldId, initialValue, defaultValue);
76+
formStore.RegisterField(fieldId, "", undefined, "");
7977
expect(formStore.GetField(fieldId)).not.toBeUndefined();
8078
});
8179

8280
it("value changed", () => {
83-
const formId = "FORM-ID";
84-
const fieldId = "FIELD-ID";
85-
const initialValue = "INITIAL-VALUE";
86-
const defaultValue = "DEFAULT-VALUE";
81+
const fieldId = "field-id";
82+
const value = "value";
8783
const nextValue = "NEXT-VALUE";
88-
const formStore = new FormStore(formId);
8984

90-
formStore.RegisterField(fieldId, initialValue, defaultValue);
91-
expect(formStore.GetField(fieldId).Value).toBe(initialValue);
85+
formStore.RegisterField(fieldId, undefined, undefined, value);
86+
expect(formStore.GetField(fieldId).Value).toBe(value);
87+
9288
formStore.ValueChanged(fieldId, nextValue);
9389
expect(formStore.GetField(fieldId).Value).toBe(nextValue);
9490
});
9591

9692
it("validate field without error", async (done) => {
97-
const formId = "FORM-ID";
98-
const fieldId = "FIELD-ID";
99-
const initialValue = "INITIAL-VALUE";
100-
const defaultValue = "DEFAULT-VALUE";
101-
const formStore = new FormStore(formId);
93+
const fieldId = "field-id";
10294

103-
formStore.RegisterField(fieldId, initialValue, defaultValue);
95+
formStore.RegisterField(fieldId, undefined, undefined, "value");
10496
const validationPromise = new Promise<never>((resolve, reject) => {
10597
setTimeout(() => {
10698
resolve();
@@ -124,14 +116,10 @@ describe("Form store", () => {
124116
});
125117

126118
it("validate field with error", async (done) => {
127-
const formId = "FORM-ID";
128119
const fieldId = "FIELD-ID";
129-
const initialValue = "INITIAL-VALUE";
130-
const defaultValue = "DEFAULT-VALUE";
131-
const formStore = new FormStore(formId);
132120
const formError: FormError = { Message: "Error Message" };
133121

134-
formStore.RegisterField(fieldId, initialValue, defaultValue);
122+
formStore.RegisterField(fieldId, undefined, undefined, "value");
135123
const validationPromise = new Promise<never>((resolve, reject) => {
136124
setTimeout(() => {
137125
reject(formError);
@@ -154,6 +142,7 @@ describe("Form store", () => {
154142

155143
try {
156144
const error = formStore.GetField(fieldId).Error;
145+
157146
expect(formStore.GetField(fieldId).Validating).toBe(false);
158147
expect(error).not.toBeUndefined();
159148
expect(error).not.toBeNull();
@@ -166,14 +155,11 @@ describe("Form store", () => {
166155
});
167156

168157
it("skip validation when newValue has expired", async (done) => {
169-
const formId = "FORM-ID";
170158
const fieldId = "FIELD-ID";
171-
const initialValue = "INITIAL-VALUE";
172-
const defaultValue = "DEFAULT-VALUE";
173-
const formStore = new FormStore(formId);
174159
const formError = "field error";
160+
const value = "text";
175161

176-
formStore.RegisterField(fieldId, initialValue, defaultValue);
162+
formStore.RegisterField(fieldId, undefined, undefined, value);
177163
const validationPromise = new Promise<never>((resolve, reject) => {
178164
setTimeout(() => {
179165
reject(formError);
@@ -183,7 +169,7 @@ describe("Form store", () => {
183169
formStore.Validate(fieldId, validationPromise);
184170

185171
// Imitate removal of last letter
186-
formStore.ValueChanged(fieldId, initialValue.slice(0, initialValue.length - 1));
172+
formStore.ValueChanged(fieldId, value.slice(0, value.length - 1));
187173

188174
try {
189175
expect(formStore.GetField(fieldId).Validating).toBe(true);
@@ -210,18 +196,13 @@ describe("Form store", () => {
210196
});
211197

212198
it("registers field with props", () => {
213-
const formId = "FORM-ID";
214-
const fieldId = "FIELD-ID";
215-
const defaultValue = "DEFAULT-VALUE";
199+
const fieldId = "field-id";
216200
const fieldProps: MyFieldProps = {
217201
name: "fieldName",
218-
value: "initial-value",
219-
defaultValue: defaultValue,
220202
randomKey: "random value"
221203
};
222-
const formStore = new FormStore(formId);
223204

224-
formStore.RegisterField(fieldId, fieldProps.value, fieldProps.defaultValue, fieldProps);
205+
formStore.RegisterField(fieldId, undefined, undefined, undefined, fieldProps);
225206

226207
const fieldPropsRecord = recordify<FieldStateProps, FieldStatePropsRecord>(fieldProps);
227208

@@ -230,28 +211,130 @@ describe("Form store", () => {
230211
});
231212

232213
it("updates field props", () => {
233-
const formId = "FORM-ID";
234214
const fieldId = "FIELD-ID";
235-
const defaultValue = "DEFAULT-VALUE";
236215
const fieldProps: MyFieldProps = {
237216
name: "field-name",
238-
value: "initialValue",
239-
defaultValue: defaultValue,
240217
randomKey: "random value"
241218
};
242219

243-
// Changed value and removed randomKey prop
220+
// Removed randomKey prop
244221
const fieldPropsNext: MyFieldProps = {
245222
name: fieldProps.name,
246-
value: "Updated value"
247223
};
248224
const fieldPropsNextRecord = recordify<FieldStateProps, FieldStatePropsRecord>(fieldPropsNext);
249-
const formStore = new FormStore(formId);
250225

251-
formStore.RegisterField(fieldId, fieldProps.value, fieldProps.defaultValue, fieldProps);
226+
formStore.RegisterField(fieldId, undefined, undefined, undefined, fieldProps);
252227
formStore.UpdateProps(fieldId, fieldPropsNext);
253228

254229
// Deep-check the updated props
255230
expect(Immutable.is(formStore.GetField(fieldId).Props, fieldPropsNextRecord)).toBe(true);
256231
});
232+
233+
it("clears all fields values to default values", () => {
234+
let fieldsIds: string[] = [];
235+
for (let i = 0; i < 5; i++) {
236+
fieldsIds.push(`field-id-${i}`);
237+
}
238+
239+
const defaultValue = "default value";
240+
const fieldProps: MyFieldProps = {
241+
name: "field-name",
242+
defaultValue: defaultValue,
243+
value: "value"
244+
};
245+
246+
for (const fieldId of fieldsIds) {
247+
formStore.RegisterField(fieldId, fieldProps.defaultValue, undefined, fieldProps.value, fieldProps);
248+
}
249+
formStore.ClearFields();
250+
251+
for (const fieldId of fieldsIds) {
252+
const fieldState = formStore.GetField(fieldId);
253+
expect(fieldState.Value).toBe(defaultValue);
254+
}
255+
});
256+
257+
it("clears fields values by fieldsIds to default values", () => {
258+
let fieldsIds: string[] = [];
259+
for (let i = 0; i < 5; i++) {
260+
fieldsIds.push(`field-id-${i}`);
261+
}
262+
const fieldToClearId = fieldsIds[0];
263+
const defaultValue = "default value";
264+
const fieldProps: MyFieldProps = {
265+
name: "field-name",
266+
defaultValue: defaultValue,
267+
value: "value",
268+
};
269+
270+
for (const fieldId of fieldsIds) {
271+
formStore.RegisterField(fieldId, fieldProps.defaultValue, undefined, fieldProps.value, fieldProps);
272+
}
273+
formStore.ClearFields([fieldToClearId]);
274+
275+
for (const fieldId of fieldsIds) {
276+
const fieldState = formStore.GetField(fieldId);
277+
if (fieldId === fieldToClearId) {
278+
expect(fieldState.Value).toBe(defaultValue);
279+
} else {
280+
expect(fieldState.Value).not.toBe(defaultValue);
281+
}
282+
}
283+
});
284+
285+
it("resets all fields values to initial values", () => {
286+
let fieldsIds: string[] = [];
287+
for (let i = 0; i < 5; i++) {
288+
fieldsIds.push(`field-id-${i}`);
289+
}
290+
const initialValue = "initial value";
291+
const nextValue = "next value";
292+
const fieldProps: MyFieldProps = {
293+
name: "field-name",
294+
initialValue: initialValue,
295+
value: "value",
296+
randomKey: "random value"
297+
};
298+
299+
for (const fieldId of fieldsIds) {
300+
formStore.RegisterField(fieldId, undefined, fieldProps.initialValue, fieldProps.value, fieldProps);
301+
formStore.ValueChanged(fieldId, nextValue);
302+
}
303+
formStore.ResetFields();
304+
305+
for (const fieldId of fieldsIds) {
306+
const fieldState = formStore.GetField(fieldId);
307+
expect(fieldState.Value).toBe(initialValue);
308+
}
309+
});
310+
311+
it("resets fields values by fieldsIds to initial values", () => {
312+
let fieldsIds: string[] = [];
313+
for (let i = 0; i < 5; i++) {
314+
fieldsIds.push(`field-id-${i}`);
315+
}
316+
const fieldToResetId = fieldsIds[0];
317+
const value = "value";
318+
const nextValue = "next value";
319+
const fieldProps: MyFieldProps = {
320+
name: "field-name",
321+
value: value,
322+
randomKey: "random value"
323+
};
324+
325+
for (const fieldId of fieldsIds) {
326+
formStore.RegisterField(fieldId, undefined, undefined, fieldProps.value, fieldProps);
327+
formStore.ValueChanged(fieldId, nextValue);
328+
}
329+
formStore.ResetFields([fieldToResetId]);
330+
331+
for (const fieldId of fieldsIds) {
332+
const fieldState = formStore.GetField(fieldId);
333+
if (fieldId === fieldToResetId) {
334+
expect(fieldState.Value).toBe(value);
335+
} else {
336+
expect(fieldState.Value).toBe(nextValue);
337+
}
338+
}
339+
});
257340
});

packages/simplr-forms-core/__tests__/test-components/test-field.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import { BaseField, BaseFieldState } from "../../src/abstractions/base-field";
44
import { FieldProps, FieldValue } from "../../src/contracts/field";
55

66
export interface MyFieldProps extends FieldProps {
7-
value?: string;
87
defaultValue?: string;
8+
initialValue?: string;
9+
value?: string;
910
randomKey?: string;
1011
}
1112

@@ -25,7 +26,14 @@ export class MyTestField extends BaseField<MyFieldProps, MyFieldState> {
2526
return "";
2627
}
2728

28-
protected get DefaultValue(): FieldValue {
29+
protected get RawValue(): FieldValue {
30+
return "";
31+
}
32+
33+
protected get RawDefaultValue(): FieldValue {
34+
if (this.props.defaultValue != null) {
35+
return this.props.defaultValue;
36+
}
2937
return "";
3038
}
31-
}
39+
}

packages/simplr-forms-core/src/abstractions.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)