Skip to content

Commit cf1c50a

Browse files
committed
fix(manager): recalculate dirty/pristine based on fields
1 parent 6f5af6c commit cf1c50a

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' });
@@ -1925,4 +1929,36 @@ describe('managerApi', () => {
19251929
expect(onSubmit).not.toHaveBeenCalled();
19261930
});
19271931
});
1932+
1933+
it('set form dirty and pristine according to fields', () => {
1934+
const onSubmit = jest.fn();
1935+
1936+
const managerApi = createManagerApi({ onSubmit });
1937+
1938+
managerApi().registerField({ name: 'field', render: jest.fn(), internalId: 1 });
1939+
managerApi().registerField({ name: 'field2', render: jest.fn(), internalId: 1, initialValue: 'initial' });
1940+
1941+
expect(managerApi().getState().pristine).toEqual(true);
1942+
expect(managerApi().getState().dirty).toEqual(false);
1943+
1944+
managerApi().change('field', 'foo');
1945+
1946+
expect(managerApi().getState().pristine).toEqual(false);
1947+
expect(managerApi().getState().dirty).toEqual(true);
1948+
1949+
managerApi().change('field2', 'initial-123');
1950+
1951+
expect(managerApi().getState().pristine).toEqual(false);
1952+
expect(managerApi().getState().dirty).toEqual(true);
1953+
1954+
managerApi().change('field', undefined);
1955+
1956+
expect(managerApi().getState().pristine).toEqual(false);
1957+
expect(managerApi().getState().dirty).toEqual(true);
1958+
1959+
managerApi().change('field2', 'initial');
1960+
1961+
expect(managerApi().getState().pristine).toEqual(true);
1962+
expect(managerApi().getState().dirty).toEqual(false);
1963+
});
19281964
});

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)