63 lines
2.4 KiB
JavaScript
63 lines
2.4 KiB
JavaScript
import { BaseItem } from './base-item';
|
|
export class SelectorItem extends BaseItem {
|
|
constructor(id, title, items) {
|
|
super(id, title);
|
|
this.items = items;
|
|
this.entries = [];
|
|
}
|
|
getDOMNode() {
|
|
this.container = document.createElement('div');
|
|
this.listContainer = document.createElement('ul');
|
|
this.label = document.createElement('legend');
|
|
this.fieldSet = document.createElement('fieldset');
|
|
this.fieldSet.setAttribute('class', 'radiogroup');
|
|
this.fieldSet.id = `fs_selector_${this.id}`;
|
|
const name = document.createTextNode(this.title);
|
|
this.label.appendChild(name);
|
|
this.fieldSet.appendChild(this.label);
|
|
this.buildEntries();
|
|
this.container.appendChild(this.fieldSet);
|
|
this.container.addEventListener('focus', this.onFocus.bind(this));
|
|
return this.container;
|
|
}
|
|
buildEntries() {
|
|
this.items.forEach((item, index) => {
|
|
const node = document.createElement('input');
|
|
node.type = 'radio';
|
|
node.id = `${this.id}_${item.id}`;
|
|
node.name = this.id;
|
|
node.value = item.id || `${index}`;
|
|
node.addEventListener('focus', this.onItemFocus.bind(this));
|
|
node.addEventListener('select', this.onSelectItem.bind(this));
|
|
node.addEventListener('change', this.onChangeItem.bind(this));
|
|
this.entries.push(node);
|
|
const label = document.createElement('label');
|
|
label.setAttribute('for', `${this.id}_${item.id}`);
|
|
label.textContent = item.title;
|
|
this.fieldSet.append(node);
|
|
this.fieldSet.append(label);
|
|
});
|
|
}
|
|
onItemFocus(event) {
|
|
console.log(`Item focused: `, event);
|
|
this.emit('focus', this.id);
|
|
}
|
|
getContents() {
|
|
return this.currentValue;
|
|
}
|
|
onSelectItem(event) { }
|
|
onChangeItem(event) {
|
|
const node = document.querySelector(`input[name = "${this.id}"]:checked`);
|
|
this.currentValue = this.items.find((item) => `${this.id}_${item.id}` === node.id);
|
|
this.emit('update', {
|
|
type: 'selector',
|
|
value: this.currentValue
|
|
});
|
|
}
|
|
focus() {
|
|
const node = document.querySelector(`input[name = "${this.id}"]:checked`) ||
|
|
this.entries[0];
|
|
node.focus();
|
|
}
|
|
}
|