blob: 881ccedca69f95a817711fd6e583267789d90ae8 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {LitElement, html, css} from 'lit-element';
/**
* `<mr-multi-checkbox>`
*
* A web component for managing values in a set of checkboxes.
*
*/
export class MrMultiCheckbox extends LitElement {
/** @override */
static get styles() {
return css`
input[type="checkbox"] {
width: auto;
height: auto;
}
`;
}
/** @override */
render() {
return html`
${this.options.map((option) => html`
<label title=${option.docstring}>
<input
type="checkbox"
name=${this.name}
value=${option.optionName}
?checked=${this.values.includes(option.optionName)}
@change=${this._changeHandler}
/>
${option.optionName}
</label>
`)}
`;
}
/** @override */
static get properties() {
return {
values: {type: Array},
options: {type: Array},
_inputRefs: {type: Object},
};
}
/** @override */
updated(changedProperties) {
if (changedProperties.has('options')) {
this._inputRefs = this.shadowRoot.querySelectorAll('input');
}
if (changedProperties.has('values')) {
this.reset();
}
}
reset() {
this.setValues(this.values);
}
getValues() {
if (!this._inputRefs) return;
const valueList = [];
this._inputRefs.forEach((c) => {
if (c.checked) {
valueList.push(c.value.trim());
}
});
return valueList;
}
setValues(values) {
if (!this._inputRefs) return;
this._inputRefs.forEach(
(checkbox) => {
checkbox.checked = values.includes(checkbox.value);
},
);
}
/**
* @fires CustomEvent#change
* @private
*/
_changeHandler() {
this.dispatchEvent(new CustomEvent('change'));
}
}
customElements.define('mr-multi-checkbox', MrMultiCheckbox);