From 69d6441522cdf4353142f240ab8282fb01d5cf50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Thu, 10 Mar 2022 10:43:43 +0100 Subject: [PATCH] fix: do not fail when saving a new item using dataProvider (#3533) --- packages/crud/src/vaadin-crud.js | 1 + packages/crud/test/crud.test.js | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) 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..1a03579c17 100644 --- a/packages/crud/test/crud.test.js +++ b/packages/crud/test/crud.test.js @@ -137,6 +137,41 @@ describe('crud', () => { }); }); + describe('dataProvider', () => { + const items = [{ foo: 'bar' }]; + + beforeEach(async () => { + crud = fixtureSync(''); + crud.dataProvider = (_, callback) => callback(items, items.length); + await nextRender(crud); + [btnSave, btnCancel, btnDelete] = crud.querySelectorAll('vaadin-button'); + }); + + 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 () => {