Skip to content

Commit d09f010

Browse files
Martynas ŽilinskasDovydasNavickas
authored andcommitted
Added ClearFields and ResetFields to FormStore. Added InitialValue to FieldState.
Added reset and clear tests.
1 parent eea5999 commit d09f010

File tree

3 files changed

+169
-22
lines changed

3 files changed

+169
-22
lines changed

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

Lines changed: 118 additions & 22 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,11 +34,9 @@ describe("Form store", () => {
2934
});
3035

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

3841
formStore.RegisterField(fieldId, initialValue, defaultValue);
3942
expect(formStore.HasField(fieldId)).toBe(true);
@@ -43,11 +46,9 @@ describe("Form store", () => {
4346
});
4447

4548
it("unregisters a field", () => {
46-
const formId = "FORM-ID";
4749
const fieldId = "FIELD-ID";
4850
const initialValue = "INITIAL-VALUE";
4951
const defaultValue = "DEFAULT-VALUE";
50-
const formStore = new FormStore(formId);
5152

5253
formStore.RegisterField(fieldId, initialValue, defaultValue);
5354
formStore.UnregisterField(fieldId);
@@ -56,36 +57,30 @@ describe("Form store", () => {
5657
});
5758

5859
it("has a field", () => {
59-
const formId = "FORM-ID";
6060
const fieldId = "FIELD-ID";
6161
const initialValue = "INITIAL-VALUE";
6262
const defaultValue = "DEFAULT-VALUE";
63-
const formStore = new FormStore(formId);
6463

6564
expect(formStore.HasField(fieldId)).toBe(false);
6665
formStore.RegisterField(fieldId, initialValue, defaultValue);
6766
expect(formStore.HasField(fieldId)).toBe(true);
6867
});
6968

7069
it("get a field", () => {
71-
const formId = "FORM-ID";
7270
const fieldId = "FIELD-ID";
7371
const initialValue = "INITIAL-VALUE";
7472
const defaultValue = "DEFAULT-VALUE";
75-
const formStore = new FormStore(formId);
7673

7774
expect(formStore.GetField(fieldId)).toBeUndefined();
7875
formStore.RegisterField(fieldId, initialValue, defaultValue);
7976
expect(formStore.GetField(fieldId)).not.toBeUndefined();
8077
});
8178

8279
it("value changed", () => {
83-
const formId = "FORM-ID";
8480
const fieldId = "FIELD-ID";
8581
const initialValue = "INITIAL-VALUE";
8682
const defaultValue = "DEFAULT-VALUE";
8783
const nextValue = "NEXT-VALUE";
88-
const formStore = new FormStore(formId);
8984

9085
formStore.RegisterField(fieldId, initialValue, defaultValue);
9186
expect(formStore.GetField(fieldId).Value).toBe(initialValue);
@@ -94,11 +89,9 @@ describe("Form store", () => {
9489
});
9590

9691
it("validate field without error", async (done) => {
97-
const formId = "FORM-ID";
9892
const fieldId = "FIELD-ID";
9993
const initialValue = "INITIAL-VALUE";
10094
const defaultValue = "DEFAULT-VALUE";
101-
const formStore = new FormStore(formId);
10295

10396
formStore.RegisterField(fieldId, initialValue, defaultValue);
10497
const validationPromise = new Promise<never>((resolve, reject) => {
@@ -124,11 +117,9 @@ describe("Form store", () => {
124117
});
125118

126119
it("validate field with error", async (done) => {
127-
const formId = "FORM-ID";
128120
const fieldId = "FIELD-ID";
129121
const initialValue = "INITIAL-VALUE";
130122
const defaultValue = "DEFAULT-VALUE";
131-
const formStore = new FormStore(formId);
132123
const formError: FormError = { Message: "Error Message" };
133124

134125
formStore.RegisterField(fieldId, initialValue, defaultValue);
@@ -166,11 +157,9 @@ describe("Form store", () => {
166157
});
167158

168159
it("skip validation when newValue has expired", async (done) => {
169-
const formId = "FORM-ID";
170160
const fieldId = "FIELD-ID";
171161
const initialValue = "INITIAL-VALUE";
172162
const defaultValue = "DEFAULT-VALUE";
173-
const formStore = new FormStore(formId);
174163
const formError = "field error";
175164

176165
formStore.RegisterField(fieldId, initialValue, defaultValue);
@@ -210,7 +199,6 @@ describe("Form store", () => {
210199
});
211200

212201
it("registers field with props", () => {
213-
const formId = "FORM-ID";
214202
const fieldId = "FIELD-ID";
215203
const defaultValue = "DEFAULT-VALUE";
216204
const fieldProps: MyFieldProps = {
@@ -219,7 +207,6 @@ describe("Form store", () => {
219207
defaultValue: defaultValue,
220208
randomKey: "random value"
221209
};
222-
const formStore = new FormStore(formId);
223210

224211
formStore.RegisterField(fieldId, fieldProps.value, fieldProps.defaultValue, fieldProps);
225212

@@ -230,7 +217,6 @@ describe("Form store", () => {
230217
});
231218

232219
it("updates field props", () => {
233-
const formId = "FORM-ID";
234220
const fieldId = "FIELD-ID";
235221
const defaultValue = "DEFAULT-VALUE";
236222
const fieldProps: MyFieldProps = {
@@ -246,12 +232,122 @@ describe("Form store", () => {
246232
value: "Updated value"
247233
};
248234
const fieldPropsNextRecord = recordify<FieldStateProps, FieldStatePropsRecord>(fieldPropsNext);
249-
const formStore = new FormStore(formId);
250235

251236
formStore.RegisterField(fieldId, fieldProps.value, fieldProps.defaultValue, fieldProps);
252237
formStore.UpdateProps(fieldId, fieldPropsNext);
253238

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

packages/simplr-forms-core/src/contracts/field.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface FieldProps {
2121

2222
export interface FieldState {
2323
DefaultValue: FieldValue;
24+
InitialValue: FieldValue;
2425
Value: FieldValue;
2526
Error?: FormErrorRecord;
2627
Touched: boolean;

packages/simplr-forms-core/src/stores/form-store.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export class FormStore extends ActionEmitter {
8181
// Construct field state
8282
let fieldState = this.GetInitialFieldState();
8383
fieldState.DefaultValue = defaultValue;
84+
fieldState.InitialValue = initialValue;
8485
fieldState.Value = initialValue;
8586

8687
if (props != null) {
@@ -262,6 +263,54 @@ export class FormStore extends ActionEmitter {
262263
}
263264
}
264265

266+
/**
267+
* Set fields to default values.
268+
*/
269+
public ClearFields(fieldsIds?: string[]) {
270+
this.State = this.State.withMutations(state => {
271+
if (fieldsIds == null) {
272+
fieldsIds = state.Fields.keySeq().toArray();
273+
}
274+
275+
fieldsIds.forEach(fieldId => {
276+
const fieldState = state.Fields.get(fieldId);
277+
278+
if (fieldState != null) {
279+
state.Fields = state.Fields.set(fieldId, fieldState.merge({
280+
Error: undefined,
281+
Value: fieldState.DefaultValue,
282+
Pristine: (fieldState.InitialValue === fieldState.DefaultValue),
283+
Touched: false
284+
} as FieldState));
285+
}
286+
});
287+
});
288+
}
289+
290+
/**
291+
* Set fields to initial values.
292+
*/
293+
public ResetFields(fieldsIds?: string[]) {
294+
this.State = this.State.withMutations(state => {
295+
if (fieldsIds == null) {
296+
fieldsIds = state.Fields.keySeq().toArray();
297+
}
298+
299+
fieldsIds.forEach(fieldId => {
300+
const fieldState = state.Fields.get(fieldId);
301+
302+
if (fieldState != null) {
303+
state.Fields = state.Fields.set(fieldId, fieldState.merge({
304+
Error: undefined,
305+
Value: fieldState.InitialValue,
306+
Pristine: true,
307+
Touched: false
308+
} as FieldState));
309+
}
310+
});
311+
});
312+
}
313+
265314
public ToObject<TObject = any>(): TObject {
266315
if (this.BuiltFormObject == null ||
267316
this.BuiltFormObject.Fields !== this.State.Fields) {
@@ -302,6 +351,7 @@ export class FormStore extends ActionEmitter {
302351
protected GetInitialFieldState(): FieldState {
303352
return {
304353
DefaultValue: undefined,
354+
InitialValue: undefined,
305355
Value: undefined,
306356
Touched: false,
307357
Pristine: true,

0 commit comments

Comments
 (0)