mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-02-03 12:47:35 +01:00
130 lines
4.0 KiB
JavaScript
130 lines
4.0 KiB
JavaScript
import { QuickReplySet } from './QuickReplySet.js';
|
|
|
|
export class QuickReplySetLink {
|
|
static from(props) {
|
|
props.set = QuickReplySet.get(props.set);
|
|
/**@type {QuickReplySetLink}*/
|
|
const instance = Object.assign(new this(), props);
|
|
return instance;
|
|
}
|
|
|
|
|
|
|
|
|
|
/**@type {QuickReplySet}*/ set;
|
|
/**@type {Boolean}*/ isVisible = true;
|
|
|
|
/**@type {Number}*/ index;
|
|
|
|
/**@type {Function}*/ onUpdate;
|
|
/**@type {Function}*/ onRequestEditSet;
|
|
/**@type {Function}*/ onDelete;
|
|
|
|
/**@type {HTMLElement}*/ settingsDom;
|
|
|
|
|
|
|
|
|
|
renderSettings(idx) {
|
|
this.index = idx;
|
|
const item = document.createElement('div'); {
|
|
this.settingsDom = item;
|
|
item.classList.add('qr--item');
|
|
item.setAttribute('data-order', String(this.index));
|
|
const drag = document.createElement('div'); {
|
|
drag.classList.add('drag-handle');
|
|
drag.classList.add('ui-sortable-handle');
|
|
drag.textContent = '☰';
|
|
item.append(drag);
|
|
}
|
|
const set = document.createElement('select'); {
|
|
set.classList.add('qr--set');
|
|
// fix for jQuery sortable breaking childrens' touch events
|
|
set.addEventListener('touchstart', (evt)=>evt.stopPropagation());
|
|
set.addEventListener('change', ()=>{
|
|
this.set = QuickReplySet.get(set.value);
|
|
this.update();
|
|
});
|
|
QuickReplySet.list.forEach(qrs=>{
|
|
const opt = document.createElement('option'); {
|
|
opt.value = qrs.name;
|
|
opt.textContent = qrs.name;
|
|
opt.selected = qrs == this.set;
|
|
set.append(opt);
|
|
}
|
|
});
|
|
item.append(set);
|
|
}
|
|
const visible = document.createElement('label'); {
|
|
visible.classList.add('qr--visible');
|
|
visible.title = 'Show buttons';
|
|
const cb = document.createElement('input'); {
|
|
cb.type = 'checkbox';
|
|
cb.checked = this.isVisible;
|
|
cb.addEventListener('click', ()=>{
|
|
this.isVisible = cb.checked;
|
|
this.update();
|
|
});
|
|
visible.append(cb);
|
|
}
|
|
visible.append('Buttons');
|
|
item.append(visible);
|
|
}
|
|
const edit = document.createElement('div'); {
|
|
edit.classList.add('menu_button');
|
|
edit.classList.add('menu_button_icon');
|
|
edit.classList.add('fa-solid');
|
|
edit.classList.add('fa-pencil');
|
|
edit.title = 'Edit quick reply set';
|
|
edit.addEventListener('click', ()=>this.requestEditSet());
|
|
item.append(edit);
|
|
}
|
|
const del = document.createElement('div'); {
|
|
del.classList.add('qr--del');
|
|
del.classList.add('menu_button');
|
|
del.classList.add('menu_button_icon');
|
|
del.classList.add('fa-solid');
|
|
del.classList.add('fa-trash-can');
|
|
del.title = 'Remove quick reply set';
|
|
del.addEventListener('click', ()=>this.delete());
|
|
item.append(del);
|
|
}
|
|
}
|
|
return this.settingsDom;
|
|
}
|
|
unrenderSettings() {
|
|
this.settingsDom?.remove();
|
|
this.settingsDom = null;
|
|
}
|
|
|
|
|
|
|
|
|
|
update() {
|
|
if (this.onUpdate) {
|
|
this.onUpdate(this);
|
|
}
|
|
}
|
|
requestEditSet() {
|
|
if (this.onRequestEditSet) {
|
|
this.onRequestEditSet(this.set);
|
|
}
|
|
}
|
|
delete() {
|
|
this.unrenderSettings();
|
|
if (this.onDelete) {
|
|
this.onDelete();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
toJSON() {
|
|
return {
|
|
set: this.set.name,
|
|
isVisible: this.isVisible,
|
|
};
|
|
}
|
|
}
|