From 5cbb5d8350e4e666106b646cdf754a02ed2b6fde Mon Sep 17 00:00:00 2001 From: Jeff Keen Date: Wed, 17 May 2023 15:18:53 -0500 Subject: [PATCH 1/2] Add #removeError and #removeErrors methods to BufferedChangeset --- src/index.ts | 29 +++++++++++++++ test/index.test.ts | 88 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/src/index.ts b/src/index.ts index 4e7066e..3204502 100644 --- a/src/index.ts +++ b/src/index.ts @@ -644,6 +644,35 @@ export class BufferedChangeset implements IChangeset { return error; } + /** + * Manually remove an error from the changeset. + * + * @method removeError + */ + removeError(key: string): this { + if (key) { + this._notifyVirtualProperties([key]); + // @tracked + this[ERRORS] = this._deleteKey(ERRORS, key) as Errors; + this[ERRORS_CACHE] = this[ERRORS]; + } else { + this._notifyVirtualProperties(); + this[ERRORS] = {}; + this[ERRORS_CACHE] = this[ERRORS]; + } + + return this; + } + + /** + * @method removeError + */ + removeErrors() { + // @tracked + this[ERRORS] = {}; + this[ERRORS_CACHE] = this[ERRORS]; + } + /** * Manually push multiple errors to the changeset as an array. * key maybe in form 'name.short' so need to go deep diff --git a/test/index.test.ts b/test/index.test.ts index 158aa97..11fe28d 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -3188,6 +3188,94 @@ describe('Unit | Utility | changeset', () => { expect(dummyChangeset.isValid).toEqual(true); }); + /** + * #removeError + */ + + it('#removeError removes an error from the changeset', () => { + let dummyChangeset = Changeset(dummyModel); + dummyChangeset.addError('email', { + value: 'jim@bob.com', + validation: 'Email already taken' + }); + + expect(dummyChangeset.isInvalid).toEqual(true); + expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken'); + + dummyChangeset.removeError('email'); + expect(dummyChangeset.isValid).toEqual(true); + + expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined); + }); + + it('#removeError using an invalid key does not throw an error', () => { + let dummyChangeset = Changeset(dummyModel); + dummyChangeset.addError('email', { + value: 'jim@bob.com', + validation: 'Email already taken' + }); + + expect(dummyChangeset.isInvalid).toEqual(true); + expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken'); + + dummyChangeset.removeError('email'); + dummyChangeset.removeError('foo'); + expect(dummyChangeset.isValid).toEqual(true); + + expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined); + }); + + it('#removeError removing one error leaves the other', () => { + let dummyChangeset = Changeset(dummyModel); + dummyChangeset.addError('email', { + value: 'jim@bob.com', + validation: 'Email already taken' + }); + dummyChangeset.addError('age', { + value: '0', + validation: 'Age is too low' + }); + + expect(dummyChangeset.isInvalid).toEqual(true); + expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken'); + expect(get(dummyChangeset, 'error.age.validation')).toBe('Age is too low'); + + dummyChangeset.removeError('email'); + expect(dummyChangeset.isValid).toEqual(false); + + expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined); + expect(get(dummyChangeset, 'error.age.validation')).toBe('Age is too low'); + }); + + /** + * #removeErrors + */ + + it('#removeErrors removes all errors', () => { + let dummyChangeset = Changeset(dummyModel); + dummyChangeset.addError('email', { + value: 'jim@bob.com', + validation: 'Email already taken' + }); + + expect(dummyChangeset.isInvalid).toEqual(true); + expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken'); + + dummyChangeset.removeErrors(); + expect(dummyChangeset.isValid).toEqual(true); + + expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined); + expect(get(dummyChangeset, 'errors')).toStrictEqual([]); + }); + + it('#removeErrors succeeds even when there are no errors', () => { + let dummyChangeset = Changeset(dummyModel); + expect(dummyChangeset.isInvalid).toEqual(false); + dummyChangeset.removeErrors(); + expect(dummyChangeset.isValid).toEqual(true); + expect(get(dummyChangeset, 'errors')).toStrictEqual([]); + }); + /** * #pushErrors */ From 85fd8ad2159a8253a38988f6b5ef745762767c6b Mon Sep 17 00:00:00 2001 From: Jeff Keen Date: Wed, 17 May 2023 17:25:27 -0500 Subject: [PATCH 2/2] Update readme --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index 84f423f..43d776a 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,8 @@ export default class FormComponent { + [`validate`](#validate) + [`addError`](#adderror) + [`pushErrors`](#pusherrors) + + [`removeError`](#removeerror) + + [`removeErrors`](#removeerrors) + [`snapshot`](#snapshot) + [`restore`](#restore) + [`cast`](#cast) @@ -654,6 +656,25 @@ Manually push errors to the changeset. changeset.pushErrors('age', 'Too short', 'Not a valid number', 'Must be greater than 18'); changeset.pushErrors('dogYears.age', 'Too short', 'Not a valid number', 'Must be greater than 2.5'); ``` +#### `removeError` + +Manually remove an error from the changeset. + +```js +changeset.removeError('email'); +``` +Removes an error without having to rollback the property. + +**[⬆️ back to top](#api)** + +#### `removeErrors` + +Manually remove an error from the changeset. + +```js +changeset.removeErrors() +``` +Removes all the errors without having to rollback properties. **[⬆️ back to top](#api)**