Skip to content

Commit d1ec51b

Browse files
authored
Merge pull request #863 from rvsia/recalculateDirty
fix(manager): recalculate dirty/pristine based on fields
2 parents 49bb7a2 + cf1c50a commit d1ec51b

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

packages/form-state-manager/src/tests/utils/manager-api.test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ describe('managerApi', () => {
6060

6161
describe('change', () => {
6262
it('should change the managerApi state', () => {
63+
const render = jest.fn();
64+
6365
const managerApi = createManagerApi({});
66+
managerApi().registerField({ name: 'foo', render, internalId: '1' });
67+
6468
managerApi().change('foo', 'bar');
6569

6670
expect(managerApi().values).toEqual({ foo: 'bar' });
@@ -1942,4 +1946,36 @@ describe('managerApi', () => {
19421946
expect(onSubmit).not.toHaveBeenCalled();
19431947
});
19441948
});
1949+
1950+
it('set form dirty and pristine according to fields', () => {
1951+
const onSubmit = jest.fn();
1952+
1953+
const managerApi = createManagerApi({ onSubmit });
1954+
1955+
managerApi().registerField({ name: 'field', render: jest.fn(), internalId: 1 });
1956+
managerApi().registerField({ name: 'field2', render: jest.fn(), internalId: 1, initialValue: 'initial' });
1957+
1958+
expect(managerApi().getState().pristine).toEqual(true);
1959+
expect(managerApi().getState().dirty).toEqual(false);
1960+
1961+
managerApi().change('field', 'foo');
1962+
1963+
expect(managerApi().getState().pristine).toEqual(false);
1964+
expect(managerApi().getState().dirty).toEqual(true);
1965+
1966+
managerApi().change('field2', 'initial-123');
1967+
1968+
expect(managerApi().getState().pristine).toEqual(false);
1969+
expect(managerApi().getState().dirty).toEqual(true);
1970+
1971+
managerApi().change('field', undefined);
1972+
1973+
expect(managerApi().getState().pristine).toEqual(false);
1974+
expect(managerApi().getState().dirty).toEqual(true);
1975+
1976+
managerApi().change('field2', 'initial');
1977+
1978+
expect(managerApi().getState().pristine).toEqual(true);
1979+
expect(managerApi().getState().dirty).toEqual(false);
1980+
});
19451981
});

packages/form-state-manager/src/utils/manager-api.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,8 +517,11 @@ const createManagerApi: CreateManagerApi = ({
517517
},
518518
value
519519
}));
520-
state.pristine = false;
521-
state.dirty = true;
520+
521+
const setDirty = isFormDirty();
522+
523+
state.pristine = !setDirty;
524+
state.dirty = setDirty;
522525

523526
revalidateFields([name, ...(state.fieldListeners[name]?.validateFields || state.registeredFields.filter((n) => n !== name))]);
524527

@@ -530,6 +533,10 @@ const createManagerApi: CreateManagerApi = ({
530533
});
531534
}
532535

536+
function isFormDirty(): boolean {
537+
return Object.entries(state.fieldListeners).some(([, field]) => field?.state?.meta?.dirty);
538+
}
539+
533540
function focus(name: string): void {
534541
if (state.active !== name) {
535542
const render = prepareRerender();

0 commit comments

Comments
 (0)