|
| 1 | +/** |
| 2 | + * @license |
| 3 | + * Copyright (c) 2000 - 2024 Vaadin Ltd. |
| 4 | + * |
| 5 | + * This program is available under Vaadin Commercial License and Service Terms. |
| 6 | + * |
| 7 | + * |
| 8 | + * See https://vaadin.com/commercial-license-and-service-terms for the full |
| 9 | + * license. |
| 10 | + */ |
| 11 | +import { css, html, LitElement } from 'lit'; |
| 12 | +import { ifDefined } from 'lit/directives/if-defined.js'; |
| 13 | +import { defineCustomElement } from '@vaadin/component-base/src/define.js'; |
| 14 | +import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js'; |
| 15 | +import { OverlayClassMixin } from '@vaadin/component-base/src/overlay-class-mixin.js'; |
| 16 | +import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js'; |
| 17 | +import { DialogBaseMixin } from '@vaadin/dialog/src/vaadin-dialog-base-mixin.js'; |
| 18 | +import { dialogOverlay, resizableOverlay } from '@vaadin/dialog/src/vaadin-dialog-styles.js'; |
| 19 | +import { OverlayMixin } from '@vaadin/overlay/src/vaadin-overlay-mixin.js'; |
| 20 | +import { overlayStyles } from '@vaadin/overlay/src/vaadin-overlay-styles.js'; |
| 21 | +import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js'; |
| 22 | +import { ThemePropertyMixin } from '@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js'; |
| 23 | +import { crudDialogOverlayStyles } from './vaadin-crud-styles.js'; |
| 24 | + |
| 25 | +/** |
| 26 | + * An element used internally by `<vaadin-crud>`. Not intended to be used separately. |
| 27 | + * |
| 28 | + * @extends HTMLElement |
| 29 | + * @mixes DirMixin |
| 30 | + * @mixes OverlayMixin |
| 31 | + * @mixes ThemableMixin |
| 32 | + * @private |
| 33 | + */ |
| 34 | +class CrudDialogOverlay extends OverlayMixin(DirMixin(ThemableMixin(PolylitMixin(LitElement)))) { |
| 35 | + static get is() { |
| 36 | + return 'vaadin-crud-dialog-overlay'; |
| 37 | + } |
| 38 | + |
| 39 | + static get styles() { |
| 40 | + return [overlayStyles, dialogOverlay, resizableOverlay, crudDialogOverlayStyles]; |
| 41 | + } |
| 42 | + |
| 43 | + /** @protected */ |
| 44 | + render() { |
| 45 | + return html` |
| 46 | + <div part="backdrop" id="backdrop" ?hidden="${!this.withBackdrop}"></div> |
| 47 | + <div part="overlay" id="overlay" tabindex="0"> |
| 48 | + <section id="resizerContainer" class="resizer-container"> |
| 49 | + <header part="header"><slot name="header"></slot></header> |
| 50 | + <div part="content" id="content"> |
| 51 | + <slot name="form"></slot> |
| 52 | + </div> |
| 53 | + <footer part="footer" role="toolbar"> |
| 54 | + <slot name="save-button"></slot> |
| 55 | + <slot name="cancel-button"></slot> |
| 56 | + <slot name="delete-button"></slot> |
| 57 | + </footer> |
| 58 | + </section> |
| 59 | + </div> |
| 60 | + `; |
| 61 | + } |
| 62 | + |
| 63 | + /** |
| 64 | + * @protected |
| 65 | + * @override |
| 66 | + */ |
| 67 | + ready() { |
| 68 | + super.ready(); |
| 69 | + |
| 70 | + // CRUD has header and footer but does not use renderers |
| 71 | + this.setAttribute('has-header', ''); |
| 72 | + this.setAttribute('has-footer', ''); |
| 73 | + } |
| 74 | +} |
| 75 | + |
| 76 | +defineCustomElement(CrudDialogOverlay); |
| 77 | + |
| 78 | +/** |
| 79 | + * An element used internally by `<vaadin-crud>`. Not intended to be used separately. |
| 80 | + * @private |
| 81 | + */ |
| 82 | +class CrudDialog extends DialogBaseMixin(OverlayClassMixin(ThemePropertyMixin(PolylitMixin(LitElement)))) { |
| 83 | + static get is() { |
| 84 | + return 'vaadin-crud-dialog'; |
| 85 | + } |
| 86 | + |
| 87 | + static get styles() { |
| 88 | + return css` |
| 89 | + :host { |
| 90 | + display: none; |
| 91 | + } |
| 92 | + `; |
| 93 | + } |
| 94 | + |
| 95 | + static get properties() { |
| 96 | + return { |
| 97 | + ariaLabel: { |
| 98 | + type: String, |
| 99 | + }, |
| 100 | + |
| 101 | + fullscreen: { |
| 102 | + type: Boolean, |
| 103 | + }, |
| 104 | + }; |
| 105 | + } |
| 106 | + |
| 107 | + /** @protected */ |
| 108 | + render() { |
| 109 | + return html` |
| 110 | + <vaadin-crud-dialog-overlay |
| 111 | + id="overlay" |
| 112 | + .opened="${this.opened}" |
| 113 | + aria-label="${ifDefined(this.ariaLabel)}" |
| 114 | + @opened-changed="${this._onOverlayOpened}" |
| 115 | + @mousedown="${this._bringOverlayToFront}" |
| 116 | + @touchstart="${this._bringOverlayToFront}" |
| 117 | + theme="${ifDefined(this._theme)}" |
| 118 | + .modeless="${this.modeless}" |
| 119 | + .withBackdrop="${!this.modeless}" |
| 120 | + ?fullscreen="${this.fullscreen}" |
| 121 | + role="dialog" |
| 122 | + focus-trap |
| 123 | + ></vaadin-crud-dialog-overlay> |
| 124 | + `; |
| 125 | + } |
| 126 | +} |
| 127 | + |
| 128 | +defineCustomElement(CrudDialog); |
0 commit comments