Skip to content

Commit f652133

Browse files
authored
Merge pull request #189 from jkeen/main
Add #removeError and #removeErrors to BufferedChangeset
2 parents 6559a3f + 30ff615 commit f652133

File tree

3 files changed

+148
-0
lines changed

3 files changed

+148
-0
lines changed

README.md

+21
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ export default class FormComponent {
145145
+ [`validate`](#validate)
146146
+ [`addError`](#adderror)
147147
+ [`pushErrors`](#pusherrors)
148+
+ [`removeError`](#removeerror)
149+
+ [`removeErrors`](#removeerrors)
148150
+ [`snapshot`](#snapshot)
149151
+ [`restore`](#restore)
150152
+ [`cast`](#cast)
@@ -654,6 +656,25 @@ Manually push errors to the changeset.
654656
changeset.pushErrors('age', 'Too short', 'Not a valid number', 'Must be greater than 18');
655657
changeset.pushErrors('dogYears.age', 'Too short', 'Not a valid number', 'Must be greater than 2.5');
656658
```
659+
#### `removeError`
660+
661+
Manually remove an error from the changeset.
662+
663+
```js
664+
changeset.removeError('email');
665+
```
666+
Removes an error without having to rollback the property.
667+
668+
**[⬆️ back to top](#api)**
669+
670+
#### `removeErrors`
671+
672+
Manually remove an error from the changeset.
673+
674+
```js
675+
changeset.removeErrors()
676+
```
677+
Removes all the errors without having to rollback properties.
657678

658679
**[⬆️ back to top](#api)**
659680

src/index.ts

+29
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,35 @@ export class BufferedChangeset implements IChangeset {
644644
return error;
645645
}
646646

647+
/**
648+
* Manually remove an error from the changeset.
649+
*
650+
* @method removeError
651+
*/
652+
removeError(key: string): this {
653+
if (key) {
654+
this._notifyVirtualProperties([key]);
655+
// @tracked
656+
this[ERRORS] = this._deleteKey(ERRORS, key) as Errors<any>;
657+
this[ERRORS_CACHE] = this[ERRORS];
658+
} else {
659+
this._notifyVirtualProperties();
660+
this[ERRORS] = {};
661+
this[ERRORS_CACHE] = this[ERRORS];
662+
}
663+
664+
return this;
665+
}
666+
667+
/**
668+
* @method removeErrors
669+
*/
670+
removeErrors() {
671+
// @tracked
672+
this[ERRORS] = {};
673+
this[ERRORS_CACHE] = this[ERRORS];
674+
}
675+
647676
/**
648677
* Manually push multiple errors to the changeset as an array.
649678
* key maybe in form 'name.short' so need to go deep

test/index.test.ts

+98
Original file line numberDiff line numberDiff line change
@@ -3188,6 +3188,104 @@ describe('Unit | Utility | changeset', () => {
31883188
expect(dummyChangeset.isValid).toEqual(true);
31893189
});
31903190

3191+
/**
3192+
* #removeError
3193+
*/
3194+
3195+
it('#removeError removes an error from the changeset', () => {
3196+
let dummyChangeset = Changeset(dummyModel);
3197+
dummyChangeset.addError('email', {
3198+
3199+
validation: 'Email already taken'
3200+
});
3201+
3202+
expect(dummyChangeset.isInvalid).toEqual(true);
3203+
expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken');
3204+
3205+
dummyChangeset.removeError('email');
3206+
expect(dummyChangeset.isValid).toEqual(true);
3207+
3208+
expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined);
3209+
});
3210+
3211+
it('#removeError using an invalid key does not throw an error', () => {
3212+
let dummyChangeset = Changeset(dummyModel);
3213+
dummyChangeset.addError('email', {
3214+
3215+
validation: 'Email already taken'
3216+
});
3217+
3218+
expect(dummyChangeset.isInvalid).toEqual(true);
3219+
expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken');
3220+
3221+
dummyChangeset.removeError('email');
3222+
dummyChangeset.removeError('foo');
3223+
expect(dummyChangeset.isValid).toEqual(true);
3224+
3225+
expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined);
3226+
});
3227+
3228+
it('#removeError removing one error leaves the other', () => {
3229+
let dummyChangeset = Changeset(dummyModel);
3230+
dummyChangeset.addError('email', {
3231+
3232+
validation: 'Email already taken'
3233+
});
3234+
dummyChangeset.addError('age', {
3235+
value: '0',
3236+
validation: 'Age is too low'
3237+
});
3238+
3239+
expect(dummyChangeset.isInvalid).toEqual(true);
3240+
expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken');
3241+
expect(get(dummyChangeset, 'error.age.validation')).toBe('Age is too low');
3242+
3243+
dummyChangeset.removeError('email');
3244+
expect(dummyChangeset.isValid).toEqual(false);
3245+
3246+
expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined);
3247+
expect(get(dummyChangeset, 'error.age.validation')).toBe('Age is too low');
3248+
});
3249+
3250+
/**
3251+
* #removeErrors
3252+
*/
3253+
3254+
it('#removeErrors removes all errors', () => {
3255+
let dummyChangeset = Changeset(dummyModel);
3256+
dummyChangeset.addError('email', {
3257+
3258+
validation: 'Email already taken'
3259+
});
3260+
3261+
dummyChangeset.addError('age', {
3262+
value: '0',
3263+
validation: 'Age is too low'
3264+
});
3265+
dummyChangeset.pushErrors('email.localPart', 'Cannot contain +');
3266+
3267+
expect(dummyChangeset.isInvalid).toEqual(true);
3268+
expect(get(dummyChangeset, 'error.email.validation')).toBe('Email already taken');
3269+
expect(get(dummyChangeset, 'error.age.validation')).toBe('Age is too low');
3270+
expect(get(dummyChangeset, 'error.email.localPart.validation')).toEqual(['Cannot contain +']);
3271+
3272+
dummyChangeset.removeErrors();
3273+
expect(dummyChangeset.isValid).toEqual(true);
3274+
3275+
expect(get(dummyChangeset, 'error.email.validation')).toBe(undefined);
3276+
expect(get(dummyChangeset, 'error.age.validation')).toBe(undefined);
3277+
expect(get(dummyChangeset, 'error.email.localPart.validation')).toBe(undefined);
3278+
expect(get(dummyChangeset, 'errors')).toStrictEqual([]);
3279+
});
3280+
3281+
it('#removeErrors succeeds even when there are no errors', () => {
3282+
let dummyChangeset = Changeset(dummyModel);
3283+
expect(dummyChangeset.isInvalid).toEqual(false);
3284+
dummyChangeset.removeErrors();
3285+
expect(dummyChangeset.isValid).toEqual(true);
3286+
expect(get(dummyChangeset, 'errors')).toStrictEqual([]);
3287+
});
3288+
31913289
/**
31923290
* #pushErrors
31933291
*/

0 commit comments

Comments
 (0)