89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
/* @license This file Copyright (C) 2020-2022 Mnemosyne LLC.
|
|
It may be used under GPLv2 (SPDX: GPL-2.0-only), GPLv3 (SPDX: GPL-3.0-only),
|
|
or any future license endorsed by Mnemosyne LLC.
|
|
License text can be found in the licenses/ folder. */
|
|
|
|
import { createDialogContainer } from './utils.js';
|
|
|
|
export class LabelsDialog extends EventTarget {
|
|
constructor(controller, remote) {
|
|
super();
|
|
|
|
this.controller = controller;
|
|
this.remote = remote;
|
|
this.elements = {};
|
|
this.torrents = [];
|
|
|
|
this.show();
|
|
}
|
|
|
|
show() {
|
|
const torrents = this.controller.getSelectedTorrents();
|
|
if (torrents.length === 0) {
|
|
console.error('At least one selected torrent expected.');
|
|
return;
|
|
}
|
|
const [first] = torrents;
|
|
|
|
this.torrents = torrents;
|
|
this.elements = LabelsDialog._create();
|
|
this.elements.dismiss.addEventListener('click', () => this._onDismiss());
|
|
this.elements.confirm.addEventListener('click', () => this._onConfirm());
|
|
this.elements.entry.value = first.getLabels().join(', ');
|
|
document.body.append(this.elements.root);
|
|
|
|
this.elements.entry.focus();
|
|
}
|
|
|
|
close() {
|
|
this.elements.root.remove();
|
|
this.dispatchEvent(new Event('close'));
|
|
|
|
delete this.elements;
|
|
delete this.torrents;
|
|
}
|
|
|
|
_onDismiss() {
|
|
this.close();
|
|
}
|
|
|
|
_onConfirm() {
|
|
const { torrents } = this;
|
|
const { remote } = this;
|
|
const ids = torrents.map((t) => t.getId());
|
|
const { elements } = this;
|
|
const { entry } = elements;
|
|
const { value } = entry;
|
|
const labels = value.split(/ *, */).filter((l) => l.length > 0);
|
|
|
|
remote.setLabels(ids, labels, (response) => {
|
|
if (response.result === 'success') {
|
|
for (const t of torrents) {
|
|
t.refresh({ labels });
|
|
}
|
|
}
|
|
});
|
|
this.close();
|
|
}
|
|
|
|
static _create() {
|
|
const elements = createDialogContainer('labels-dialog');
|
|
elements.root.setAttribute('aria-label', 'Edit Labels');
|
|
elements.heading.textContent = 'Edit Labels:';
|
|
elements.confirm.textContent = 'Save';
|
|
|
|
const label = document.createElement('label');
|
|
label.setAttribute('for', 'torrent-labels');
|
|
label.textContent = 'Labels:';
|
|
elements.workarea.append(label);
|
|
|
|
const entry = document.createElement('input');
|
|
entry.setAttribute('type', 'text');
|
|
entry.id = 'torrent-labels';
|
|
elements.entry = entry;
|
|
elements.workarea.append(entry);
|
|
|
|
return elements;
|
|
}
|
|
}
|