Add QR set duplicate button

3455da404ac735e94110d57ce11fd102f39dc25f

Wolfsblvt <wolfsblvt@gmail.com>

2 files changed, +36 -0Showing whitespace changes
public/scripts/extensions/quick-reply/html/settings.html+1 -0
@@ -51,6 +51,7 @@
5151 <div class="qr--add menu_button menu_button_icon fa-solid fa-file-import" id="qr--set-import" title="Import quick reply set"></div>
5252 <input type="file" id="qr--set-importFile" accept=".json" hidden>
5353 <div class="qr--add menu_button menu_button_icon fa-solid fa-file-export" id="qr--set-export" title="Export quick reply set"></div>
54+ <div class="qr-add menu_button menu_button_icon fa-solid fa-paste" id="qr--set-duplicate" title="Duplicate quick reply set"></div>
5455 <div class="qr--del menu_button menu_button_icon fa-solid fa-trash redWarningBG" id="qr--set-delete" title="Delete quick reply set"></div>
5556 </div>
5657 </div>
public/scripts/extensions/quick-reply/src/ui/SettingsUi.js+35 -0
@@ -121,6 +121,7 @@ export class SettingsUi {
121121 });
122122 this.dom.querySelector('#qr--set-import').addEventListener('click', ()=>importFile.click());
123123 this.dom.querySelector('#qr--set-export').addEventListener('click', async () => this.exportQrSet());
124+ this.dom.querySelector('#qr--set-duplicate').addEventListener('click', async () => this.duplicateQrSet());
124125 this.dom.querySelector('#qr--set-delete').addEventListener('click', async()=>this.deleteQrSet());
125126 this.dom.querySelector('#qr--set-add').addEventListener('click', async()=>{
126127 this.currentQrSet.addQuickReply();
@@ -460,6 +461,40 @@ export class SettingsUi {
460461 URL.revokeObjectURL(url);
461462 }
462463
464+ async duplicateQrSet() {
465+ const newName = await Popup.show.input('Duplicate Quick Reply Set', 'Enter a name for the new Quick Reply Set:', `${this.currentQrSet.name} (Copy)`);
466+ if (newName && newName.length > 0) {
467+ const existingSet = QuickReplySet.get(newName);
468+ if (existingSet) {
469+ toastr.error(`A Quick Reply Set named "${newName}" already exists.`);
470+ return;
471+ }
472+ const newQrSet = QuickReplySet.from(JSON.parse(JSON.stringify(this.currentQrSet)));
473+ newQrSet.name = newName;
474+ newQrSet.qrList = this.currentQrSet.qrList.map(qr => QuickReply.from(JSON.parse(JSON.stringify(qr))));
475+ newQrSet.addQuickReply();
476+ const idx = QuickReplySet.list.findIndex(it => it.name.toLowerCase().localeCompare(newName.toLowerCase()) == 1);
477+ if (idx > -1) {
478+ QuickReplySet.list.splice(idx, 0, newQrSet);
479+ } else {
480+ QuickReplySet.list.push(newQrSet);
481+ }
482+ const opt = document.createElement('option'); {
483+ opt.value = newQrSet.name;
484+ opt.textContent = newQrSet.name;
485+ if (idx > -1) {
486+ this.currentSet.children[idx].insertAdjacentElement('beforebegin', opt);
487+ } else {
488+ this.currentSet.append(opt);
489+ }
490+ }
491+ this.currentSet.value = newName;
492+ this.onQrSetChange();
493+ this.prepareGlobalSetList();
494+ this.prepareChatSetList();
495+ }
496+ }
497+
463498 selectQrSet(qrs) {
464499 this.currentSet.value = qrs.name;
465500 this.onQrSetChange();