diff --git a/packages/crud/src/vaadin-crud.js b/packages/crud/src/vaadin-crud.js index d71538c5c8..817e04f177 100644 --- a/packages/crud/src/vaadin-crud.js +++ b/packages/crud/src/vaadin-crud.js @@ -1031,6 +1031,7 @@ class Crud extends ElementMixin(ThemableMixin(PolymerElement)) { this.items.push(item); } } else { + this.editedItem = this.editedItem || {}; Object.assign(this.editedItem, item); } this._grid.clearCache(); diff --git a/packages/crud/test/crud.test.js b/packages/crud/test/crud.test.js index 82f48ac2f2..d08c7c080e 100644 --- a/packages/crud/test/crud.test.js +++ b/packages/crud/test/crud.test.js @@ -137,6 +137,40 @@ describe('crud', () => { }); }); + describe('dataProvider', () => { + const items = [{ foo: 'bar' }]; + + beforeEach(async () => { + crud = fixtureSync(''); + crud.dataProvider = (_, callback) => callback(items, items.length); + await nextRender(crud); + }); + + it('should save a new item', (done) => { + listenOnce(crud, 'save', (e) => { + expect(e.detail.item.foo).to.be.equal('baz'); + done(); + }); + crud.$.new.click(); + crud._form._fields[0].value = 'baz'; + change(crud._form); + btnSave().click(); + expect(crud.editedItem.foo).to.be.equal('baz'); + }); + + it('should save an edited item', (done) => { + listenOnce(crud, 'save', (e) => { + expect(e.detail.item.foo).to.be.equal('baz'); + done(); + }); + edit(items[0]); + crud._form._fields[0].value = 'baz'; + change(crud._form); + btnSave().click(); + expect(crud.editedItem.foo).to.be.equal('baz'); + }); + }); + ['default', 'slotted buttons'].forEach((mode) => { describe(`[${mode}] items`, () => { beforeEach(async () => {