diff --git a/README.md b/README.md index c3df7bbf..d8243044 100644 --- a/README.md +++ b/README.md @@ -316,6 +316,8 @@ export default class ValidatedForm extends Component { - [`validate`](#validate) - [`addError`](#adderror) - [`pushErrors`](#pusherrors) + - [`removeError`](#removeerror) + - [`removeErrors`](#removeerrors) - [`snapshot`](#snapshot) - [`restore`](#restore) - [`cast`](#cast) @@ -823,6 +825,28 @@ This is compatible with `ember-changeset-validations`, and allows you to either **[⬆️ back to top](#api)** +#### `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)** + #### `snapshot` Creates a snapshot of the changeset's errors and changes. This can be used to `restore` the changeset at a later time. diff --git a/addon/index.js b/addon/index.js index 339b7c91..cdb7289b 100644 --- a/addon/index.js +++ b/addon/index.js @@ -126,6 +126,29 @@ export class EmberChangeset extends BufferedChangeset { return error; } + /** + * Manually remove an error from the changeset. + * + * @method removeError + */ + removeError(key) { + super.removeError(key); + + notifyPropertyChange(this, key); + // Return passed-in `error`. + return this; + } + + /** + * Manually clears the errors from the changeset + * + * @method removeError + */ + removeErrors() { + super.removeErrors(); + return this; + } + /** * Manually push multiple errors to the changeset as an array. * diff --git a/tests/unit/changeset-test.js b/tests/unit/changeset-test.js index ac3ac24c..d3e10e93 100644 --- a/tests/unit/changeset-test.js +++ b/tests/unit/changeset-test.js @@ -2325,6 +2325,94 @@ module('Unit | Utility | changeset', function (hooks) { assert.ok(get(dummyChangeset, 'isValid'), 'should be valid'); }); + /** + * #removeError + */ + + test('#removeError removes an error from the changeset', async function (assert) { + let dummyChangeset = Changeset(dummyModel); + dummyChangeset.addError('email', { + value: 'jim@bob.com', + validation: 'Email already taken', + }); + + assert.true(dummyChangeset.isInvalid); + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), 'Email already taken'); + + dummyChangeset.removeError('email'); + assert.true(dummyChangeset.isValid); + + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), undefined); + }); + + test('#removeError using an invalid key does not throw an error', async function (assert) { + let dummyChangeset = Changeset(dummyModel); + dummyChangeset.addError('email', { + value: 'jim@bob.com', + validation: 'Email already taken', + }); + + assert.true(dummyChangeset.isInvalid); + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), 'Email already taken'); + + dummyChangeset.removeError('email'); + dummyChangeset.removeError('foo'); + assert.true(dummyChangeset.isValid); + + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), undefined); + }); + + test('#removeError removing one error leaves the other', async function (assert) { + 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', + }); + + assert.true(dummyChangeset.isInvalid); + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), 'Email already taken'); + assert.strictEqual(get(dummyChangeset, 'error.age.validation'), 'Age is too low'); + + dummyChangeset.removeError('email'); + assert.false(dummyChangeset.isValid); + + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), undefined); + assert.strictEqual(get(dummyChangeset, 'error.age.validation'), 'Age is too low'); + }); + + /** + * #removeErrors + */ + + test('#removeErrors removes all errors', async function (assert) { + let dummyChangeset = Changeset(dummyModel); + dummyChangeset.addError('email', { + value: 'jim@bob.com', + validation: 'Email already taken', + }); + + assert.true(dummyChangeset.isInvalid); + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), 'Email already taken'); + + dummyChangeset.removeErrors(); + assert.true(dummyChangeset.isValid); + + assert.strictEqual(get(dummyChangeset, 'error.email.validation'), undefined); + assert.propEqual(get(dummyChangeset, 'errors'), []); + }); + + test('#removeErrors succeeds even when there are no errors', async function (assert) { + let dummyChangeset = Changeset(dummyModel); + assert.false(dummyChangeset.isInvalid); + dummyChangeset.removeErrors(); + assert.true(dummyChangeset.isValid); + assert.propEqual(get(dummyChangeset, 'errors'), []); + }); + /** * #pushErrors */