Skip to content

Commit

Permalink
refactor: extract input-container logic into reusable mixin (#6574)
Browse files Browse the repository at this point in the history
  • Loading branch information
web-padawan authored Sep 29, 2023
1 parent bf9b0b3 commit 02bc61a
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 52 deletions.
62 changes: 62 additions & 0 deletions packages/input-container/src/vaadin-input-container-mixin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/**
* @license
* Copyright (c) 2021 - 2023 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/

/**
* @polymerMixin
*/
export const InputContainerMixin = (superClass) =>
class InputContainerMixinClass extends superClass {
static get properties() {
return {
/**
* If true, the user cannot interact with this element.
*/
disabled: {
type: Boolean,
reflectToAttribute: true,
},

/**
* Set to true to make this element read-only.
*/
readonly: {
type: Boolean,
reflectToAttribute: true,
},

/**
* Set to true when the element is invalid.
*/
invalid: {
type: Boolean,
reflectToAttribute: true,
},
};
}

/** @protected */
ready() {
super.ready();

this.addEventListener('pointerdown', (event) => {
if (event.target === this) {
// Prevent direct clicks to the input container from blurring the input
event.preventDefault();
}
});

this.addEventListener('click', (event) => {
if (event.target === this) {
// The vaadin-input-container element was directly clicked,
// focus any focusable child element from the default slot
this.shadowRoot
.querySelector('slot:not([name])')
.assignedNodes({ flatten: true })
.forEach((node) => node.focus && node.focus());
}
});
}
};
55 changes: 3 additions & 52 deletions packages/input-container/src/vaadin-input-container.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@ import { html, PolymerElement } from '@polymer/polymer';
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';
import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
import { InputContainerMixin } from './vaadin-input-container-mixin.js';

/**
* @customElement
* @extends HTMLElement
* @mixes ThemableMixin
* @mixes DirMixin
* @mixes InputContainerMixin
*/
export class InputContainer extends ThemableMixin(DirMixin(PolymerElement)) {
export class InputContainer extends InputContainerMixin(ThemableMixin(DirMixin(PolymerElement))) {
static get is() {
return 'vaadin-input-container';
}
Expand Down Expand Up @@ -92,57 +94,6 @@ export class InputContainer extends ThemableMixin(DirMixin(PolymerElement)) {
<slot name="suffix"></slot>
`;
}

static get properties() {
return {
/**
* If true, the user cannot interact with this element.
*/
disabled: {
type: Boolean,
reflectToAttribute: true,
},

/**
* Set to true to make this element read-only.
*/
readonly: {
type: Boolean,
reflectToAttribute: true,
},

/**
* Set to true when the element is invalid.
*/
invalid: {
type: Boolean,
reflectToAttribute: true,
},
};
}

/** @protected */
ready() {
super.ready();

this.addEventListener('pointerdown', (event) => {
if (event.target === this) {
// Prevent direct clicks to the input container from blurring the input
event.preventDefault();
}
});

this.addEventListener('click', (event) => {
if (event.target === this) {
// The vaadin-input-container element was directly clicked,
// focus any focusable child element from the default slot
this.shadowRoot
.querySelector('slot:not([name])')
.assignedNodes({ flatten: true })
.forEach((node) => node.focus && node.focus());
}
});
}
}

defineCustomElement(InputContainer);

0 comments on commit 02bc61a

Please sign in to comment.