mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
77 lines
2.3 KiB
JavaScript
77 lines
2.3 KiB
JavaScript
import { SubMenu } from './SubMenu.js';
|
|
|
|
export class MenuItem {
|
|
/**@type {String}*/ label;
|
|
/**@type {Object}*/ value;
|
|
/**@type {Function}*/ callback;
|
|
/**@type {MenuItem[]}*/ childList = [];
|
|
/**@type {SubMenu}*/ subMenu;
|
|
/**@type {Boolean}*/ isForceExpanded = false;
|
|
|
|
/**@type {HTMLElement}*/ root;
|
|
|
|
/**@type {Function}*/ onExpand;
|
|
|
|
|
|
|
|
|
|
constructor(/**@type {String}*/label, /**@type {Object}*/value, /**@type {function}*/callback, /**@type {MenuItem[]}*/children = []) {
|
|
this.label = label;
|
|
this.value = value;
|
|
this.callback = callback;
|
|
this.childList = children;
|
|
}
|
|
|
|
|
|
render() {
|
|
if (!this.root) {
|
|
const item = document.createElement('li'); {
|
|
this.root = item;
|
|
item.classList.add('list-group-item');
|
|
item.classList.add('ctx-item');
|
|
item.title = this.value;
|
|
if (this.callback) {
|
|
item.addEventListener('click', (evt) => this.callback(evt, this));
|
|
}
|
|
item.append(this.label);
|
|
if (this.childList.length > 0) {
|
|
item.classList.add('ctx-has-children');
|
|
const sub = new SubMenu(this.childList);
|
|
this.subMenu = sub;
|
|
const trigger = document.createElement('div'); {
|
|
trigger.classList.add('ctx-expander');
|
|
trigger.textContent = '⋮';
|
|
trigger.addEventListener('click', (evt) => {
|
|
evt.stopPropagation();
|
|
this.toggle();
|
|
});
|
|
item.append(trigger);
|
|
}
|
|
item.addEventListener('mouseover', () => sub.show(item));
|
|
item.addEventListener('mouseleave', () => sub.hide());
|
|
|
|
}
|
|
}
|
|
}
|
|
return this.root;
|
|
}
|
|
|
|
|
|
expand() {
|
|
this.subMenu?.show(this.root);
|
|
if (this.onExpand) {
|
|
this.onExpand();
|
|
}
|
|
}
|
|
collapse() {
|
|
this.subMenu?.hide();
|
|
}
|
|
toggle() {
|
|
if (this.subMenu.isActive) {
|
|
this.expand();
|
|
} else {
|
|
this.collapse();
|
|
}
|
|
}
|
|
}
|