Skip to content

Commit 6185525

Browse files
authored
refactor!: move crud confirm dialogs to light DOM (#9783)
1 parent c9f493c commit 6185525

File tree

8 files changed

+159
-128
lines changed

8 files changed

+159
-128
lines changed

packages/crud/src/vaadin-crud-mixin.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,9 @@ export const CrudMixin = (superClass) =>
416416
);
417417

418418
this.addController(this.__focusRestorationController);
419+
420+
this._confirmCancelDialog = this.querySelector('vaadin-confirm-dialog[slot="confirm-cancel"]');
421+
this._confirmDeleteDialog = this.querySelector('vaadin-confirm-dialog[slot="confirm-delete"]');
419422
}
420423

421424
/**
@@ -786,7 +789,7 @@ export const CrudMixin = (superClass) =>
786789
this.__isDirty && // Form change has been made
787790
this.editedItem !== item // Item is different
788791
) {
789-
this.$.confirmCancel.opened = true;
792+
this._confirmCancelDialog.opened = true;
790793
this.addEventListener(
791794
'cancel',
792795
(event) => {
@@ -986,7 +989,7 @@ export const CrudMixin = (superClass) =>
986989
/** @private */
987990
__cancel() {
988991
if (this.__isDirty) {
989-
this.$.confirmCancel.opened = true;
992+
this._confirmCancelDialog.opened = true;
990993
} else {
991994
this.__confirmCancel();
992995
}
@@ -1003,7 +1006,7 @@ export const CrudMixin = (superClass) =>
10031006

10041007
/** @private */
10051008
__delete() {
1006-
this.$.confirmDelete.opened = true;
1009+
this._confirmDeleteDialog.opened = true;
10071010
}
10081011

10091012
/** @private */

packages/crud/src/vaadin-crud.js

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import '@vaadin/confirm-dialog/src/vaadin-confirm-dialog.js';
1313
import './vaadin-crud-dialog.js';
1414
import './vaadin-crud-grid.js';
1515
import './vaadin-crud-form.js';
16-
import { html, LitElement } from 'lit';
16+
import { html, LitElement, render } from 'lit';
1717
import { ifDefined } from 'lit/directives/if-defined.js';
1818
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
1919
import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
@@ -172,6 +172,14 @@ import { CrudMixin } from './vaadin-crud-mixin.js';
172172
* @mixes CrudMixin
173173
*/
174174
class Crud extends CrudMixin(ElementMixin(ThemableMixin(PolylitMixin(LumoInjectionMixin(LitElement))))) {
175+
static get is() {
176+
return 'vaadin-crud';
177+
}
178+
179+
static get cvdlName() {
180+
return 'vaadin-crud';
181+
}
182+
175183
static get styles() {
176184
return crudStyles;
177185
}
@@ -222,38 +230,54 @@ class Crud extends CrudMixin(ElementMixin(ThemableMixin(PolylitMixin(LumoInjecti
222230
@opened-changed="${this.__onDialogOpened}"
223231
></vaadin-crud-dialog>
224232
225-
<vaadin-confirm-dialog
226-
theme="${ifDefined(this._theme)}"
227-
id="confirmCancel"
228-
@confirm="${this.__confirmCancel}"
229-
cancel-button-visible
230-
.confirmText="${this.__effectiveI18n.confirm.cancel.button.confirm}"
231-
.cancelText="${this.__effectiveI18n.confirm.cancel.button.dismiss}"
232-
.header="${this.__effectiveI18n.confirm.cancel.title}"
233-
.message="${this.__effectiveI18n.confirm.cancel.content}"
234-
confirm-theme="primary"
235-
></vaadin-confirm-dialog>
233+
<slot name="confirm-cancel"></slot>
236234
237-
<vaadin-confirm-dialog
238-
theme="${ifDefined(this._theme)}"
239-
id="confirmDelete"
240-
@confirm="${this.__confirmDelete}"
241-
cancel-button-visible
242-
.confirmText="${this.__effectiveI18n.confirm.delete.button.confirm}"
243-
.cancelText="${this.__effectiveI18n.confirm.delete.button.dismiss}"
244-
.header="${this.__effectiveI18n.confirm.delete.title}"
245-
.message="${this.__effectiveI18n.confirm.delete.content}"
246-
confirm-theme="primary error"
247-
></vaadin-confirm-dialog>
235+
<slot name="confirm-delete"></slot>
248236
`;
249237
}
250238

251-
static get is() {
252-
return 'vaadin-crud';
239+
/**
240+
* Override update to render slotted overlays into light DOM after rendering shadow DOM.
241+
* @param changedProperties
242+
* @protected
243+
*/
244+
update(changedProperties) {
245+
super.update(changedProperties);
246+
247+
this.__renderSlottedOverlays();
253248
}
254249

255-
static get cvdlName() {
256-
return 'vaadin-crud';
250+
/** @private */
251+
__renderSlottedOverlays() {
252+
render(
253+
html`
254+
<vaadin-confirm-dialog
255+
theme="${ifDefined(this._theme)}"
256+
slot="confirm-cancel"
257+
@confirm="${this.__confirmCancel}"
258+
cancel-button-visible
259+
.confirmText="${this.__effectiveI18n.confirm.cancel.button.confirm}"
260+
.cancelText="${this.__effectiveI18n.confirm.cancel.button.dismiss}"
261+
.header="${this.__effectiveI18n.confirm.cancel.title}"
262+
.message="${this.__effectiveI18n.confirm.cancel.content}"
263+
confirm-theme="primary"
264+
></vaadin-confirm-dialog>
265+
266+
<vaadin-confirm-dialog
267+
theme="${ifDefined(this._theme)}"
268+
slot="confirm-delete"
269+
@confirm="${this.__confirmDelete}"
270+
cancel-button-visible
271+
.confirmText="${this.__effectiveI18n.confirm.delete.button.confirm}"
272+
.cancelText="${this.__effectiveI18n.confirm.delete.button.dismiss}"
273+
.header="${this.__effectiveI18n.confirm.delete.title}"
274+
.message="${this.__effectiveI18n.confirm.delete.content}"
275+
confirm-theme="primary error"
276+
></vaadin-confirm-dialog>
277+
`,
278+
this,
279+
{ host: this },
280+
);
257281
}
258282
}
259283

packages/crud/test/a11y.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('a11y', () => {
2626
form = crud.querySelector('vaadin-crud-form');
2727
newButton = crud.querySelector('[slot=new-button]');
2828
saveButton = crud.querySelector('[slot=save-button]');
29-
cancelButton = crud.querySelector('[slot=cancel-button]');
29+
cancelButton = crud.querySelector(':scope > [slot=cancel-button]');
3030
editButtons = crud.querySelectorAll('vaadin-crud-edit');
3131
});
3232

@@ -81,7 +81,7 @@ describe('a11y', () => {
8181
form = crud.querySelector('vaadin-crud-form');
8282
newButton = crud.querySelector('[slot=new-button]');
8383
saveButton = crud.querySelector('[slot=save-button]');
84-
cancelButton = crud.querySelector('[slot=cancel-button]');
84+
cancelButton = crud.querySelector(':scope > [slot=cancel-button]');
8585
editButtons = crud.querySelectorAll('vaadin-crud-edit');
8686
});
8787

packages/crud/test/crud-buttons.test.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ describe('crud buttons', () => {
3535
crud.items = [{ foo: 'bar' }];
3636
await nextRender();
3737
saveButton = crud.querySelector('[slot=save-button]');
38-
cancelButton = crud.querySelector('[slot=cancel-button]');
38+
cancelButton = crud.querySelector(':scope > [slot=cancel-button]');
3939
deleteButton = crud.querySelector('[slot=delete-button]');
4040
});
4141

@@ -74,7 +74,7 @@ describe('crud buttons', () => {
7474
let confirmDeleteDialog, confirmDeleteOverlay;
7575

7676
beforeEach(() => {
77-
confirmDeleteDialog = crud.$.confirmDelete;
77+
confirmDeleteDialog = crud._confirmDeleteDialog;
7878
confirmDeleteOverlay = confirmDeleteDialog.$.overlay;
7979
});
8080

@@ -171,7 +171,7 @@ describe('crud buttons', () => {
171171
let confirmCancelOverlay;
172172

173173
beforeEach(() => {
174-
confirmCancelDialog = crud.$.confirmCancel;
174+
confirmCancelDialog = crud._confirmCancelDialog;
175175
confirmCancelOverlay = confirmCancelDialog.$.overlay;
176176
});
177177

@@ -316,7 +316,7 @@ describe('crud buttons', () => {
316316
let confirmDeleteOverlay;
317317

318318
beforeEach(() => {
319-
confirmDeleteDialog = crud.$.confirmDelete;
319+
confirmDeleteDialog = crud._confirmDeleteDialog;
320320
confirmDeleteOverlay = confirmDeleteDialog.$.overlay;
321321
});
322322

@@ -417,7 +417,7 @@ describe('crud buttons', () => {
417417
beforeEach(async () => {
418418
crud.editorPosition = 'bottom';
419419
crud.editOnClick = true;
420-
confirmCancelDialog = crud.$.confirmCancel;
420+
confirmCancelDialog = crud._confirmCancelDialog;
421421
confirmCancelOverlay = confirmCancelDialog.$.overlay;
422422
await nextRender();
423423
flushGrid(crud._grid);
@@ -660,7 +660,7 @@ describe('crud buttons', () => {
660660
let confirmDeleteOverlay;
661661

662662
beforeEach(() => {
663-
confirmDeleteDialog = crud.$.confirmDelete;
663+
confirmDeleteDialog = crud._confirmDeleteDialog;
664664
confirmDeleteOverlay = confirmDeleteDialog.$.overlay;
665665
});
666666

@@ -951,7 +951,7 @@ describe('crud buttons', () => {
951951
});
952952

953953
it('should not create default cancel-button', () => {
954-
expect(crud.querySelector('[slot="cancel-button"]')).to.be.null;
954+
expect(crud.querySelector(':scope > [slot="cancel-button"]')).to.be.null;
955955
});
956956

957957
it('should not create default delete-button', () => {

packages/crud/test/crud-editor.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('crud editor', () => {
2727
beforeEach(async () => {
2828
crud = fixtureSync('<vaadin-crud style="width: 300px;"></vaadin-crud>');
2929
crud.items = [{ foo: 'bar' }];
30-
header = crud.querySelector('[slot=header]');
30+
header = crud.querySelector(':scope > [slot=header]');
3131
await nextRender();
3232
});
3333

@@ -77,7 +77,7 @@ describe('crud editor', () => {
7777
dialog = crud.$.dialog;
7878
overlay = dialog.$.overlay;
7979
form = crud.querySelector('[slot=form]');
80-
btnCancel = crud.querySelector('[slot="cancel-button"]');
80+
btnCancel = crud.querySelector(':scope > [slot="cancel-button"]');
8181
});
8282

8383
it(`should move ${type} form to dialog content with default editorPosition`, async () => {
@@ -158,7 +158,7 @@ describe('crud editor', () => {
158158
await nextRender();
159159

160160
// Get the elementFromPoint of the editor header
161-
const header = crud.querySelector('[slot=header]');
161+
const header = crud.querySelector(':scope > [slot=header]');
162162
const headerRect = header.getBoundingClientRect();
163163
const x = headerRect.left + headerRect.width / 2;
164164
const y = headerRect.top + headerRect.height / 2;

packages/crud/test/crud.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ describe('crud', () => {
8080
crud._form,
8181
crud.$.dialog,
8282
crud.$.dialog.$.overlay,
83-
crud.$.confirmCancel,
84-
crud.$.confirmDelete,
83+
crud._confirmCancelDialog,
84+
crud._confirmDeleteDialog,
8585
].forEach((e) => expect(e.getAttribute('theme')).to.be.match(/foo/u));
8686
});
8787
});
@@ -509,7 +509,7 @@ describe('crud', () => {
509509
crud.items = [{ foo: 'bar' }, { foo: 'baz' }];
510510
await nextRender();
511511
flushGrid(crud._grid);
512-
confirmCancelDialog = crud.$.confirmCancel;
512+
confirmCancelDialog = crud._confirmCancelDialog;
513513
confirmCancelOverlay = confirmCancelDialog.$.overlay;
514514
});
515515

0 commit comments

Comments
 (0)