From 6c3532016402e5a78b8bc33ff3af58d5fd6f166e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Feh=C3=A9r=20Roland?= Date: Tue, 14 Oct 2025 14:27:54 +0200 Subject: [PATCH] Add server manager Only removing is supported for now --- js/trdom_servermanager.js | 85 ++++++++++++++++++++++++++++++++++++++- js/trserver.js | 30 ++++++++++++++ js/trweb.js | 2 + style/trweb.css | 9 +++++ 4 files changed, 125 insertions(+), 1 deletion(-) diff --git a/js/trdom_servermanager.js b/js/trdom_servermanager.js index 73e800a..7a5d121 100644 --- a/js/trdom_servermanager.js +++ b/js/trdom_servermanager.js @@ -14,9 +14,33 @@ class trdom_servermanager extends EventTarget { return this.#servers; } - #registerServer = function(name, initdata) { + #elements = { + menuentry: document.createElement('div'), + serverlist: { + shade: document.createElement('div'), + form: document.createElement('div'), + header: { + container: document.createElement('div'), + addbutton: document.createElement('div') + }, + list: document.createElement('div') + } + }; + + get menuentry() { + return this.#elements.menuentry; + } + + #registerServer(name, initdata) { let server = new trserver(name, initdata, this.#logcb); this.#servers[name] = server; + this.#elements.serverlist.list.appendChild(server.element); + let button = document.createElement('div'); + server.addServerListButton('deleteserver', button); + button.setAttributeNS('trweb', 'servermanagerbutton', 'delete'); + button.setAttribute('server', name); + button.appendChild(document.createTextNode('[Delete]')); + button.addEventListener('click', this); //server.addEventListener('torrent-updated', this); server.addEventListener('torrent-initialize', this); let e = new CustomEvent('torrentserver-added', { @@ -34,6 +58,12 @@ class trdom_servermanager extends EventTarget { this.#saveServers(); } + deleteServer(name) { + delete this.#servers[name]; + this.saveServers(); + window.location.reload(); + } + #loadcb; #loadServers() { let serverjson = this.#loadcb('servers'); @@ -71,11 +101,64 @@ class trdom_servermanager extends EventTarget { this.#loadcb = loadcb; this.#savecb = savecb; this.#logcb = logcb + + this.menuentry.appendChild(document.createTextNode('[Servers]')); + this.menuentry.setAttributeNS('trweb', 'servermanagerbutton', 'manager'); + this.menuentry.addEventListener('click', this); + + this.#elements.serverlist.shade.classList.add('trweb_formshade', 'd-flex', 'justify-content-center', 'align-items-center'); + this.#elements.serverlist.shade.setAttributeNS('trweb', 'servermanagerbutton', 'hide'); + this.#elements.serverlist.shade.addEventListener('click', this); + this.#elements.serverlist.shade.appendChild(this.#elements.serverlist.form); + + this.#elements.serverlist.form.classList.add('trweb_form', 'd-flex', 'flex-column'); + this.#elements.serverlist.form.setAttributeNS('trweb', 'servermanagerbutton', 'block'); + this.#elements.serverlist.form.addEventListener('click', this); + this.#elements.serverlist.form.style.backgroundColor = 'cyan'; + this.#elements.serverlist.form.appendChild(this.#elements.serverlist.header.container); + this.#elements.serverlist.form.appendChild(this.#elements.serverlist.list); + + this.#elements.serverlist.header.container.classList.add('d-flex', 'flex-row'); + this.#elements.serverlist.header.container.appendChild(this.#elements.serverlist.header.addbutton); + + this.#elements.serverlist.header.addbutton.appendChild(document.createTextNode('[Add server]')); + this.#elements.serverlist.header.addbutton.setAttributeNS('trweb', 'servermanagerbutton', 'add'); + this.#elements.serverlist.header.addbutton.addEventListener('click', this); + + this.#elements.serverlist.list.classList.add('d-flex', 'flex-column'); } handleEvent(e) { this.#log(6, `Handling event of type ${e.type}`); switch (e.type) { + case 'click': + if (e.currentTarget.hasAttributeNS('trweb', 'servermanagerbutton')) { + switch (e.currentTarget.getAttributeNS('trweb', 'servermanagerbutton')) { + case 'add': + e.stopPropagation(); + window.alert('Server add form isn\'t implemented'); + break; + case 'block': + e.stopPropagation(); + break; + case 'delete': + e.stopPropagation(); + let deleteSrv = e.currentTarget.getAttribute('server'); + if (window.confirm(`Are you sure you want to delete server ${deleteSrv}?`)) { + this.deleteServer(deleteSrv); + } + break; + case 'hide': + e.stopPropagation(); + document.body.removeChild(this.#elements.serverlist.shade); + break; + case 'manager': + e.stopPropagation(); + document.body.appendChild(this.#elements.serverlist.shade); + break; + } + } + break; case 'torrent-initialize': let initControls = {}; let initHash = e.detail.torrentHash; diff --git a/js/trserver.js b/js/trserver.js index 2ac6112..5944dea 100644 --- a/js/trserver.js +++ b/js/trserver.js @@ -17,6 +17,30 @@ class trserver extends EventTarget { #sessionHeader; #requests = []; + #elements = { + serverlist: { + row: document.createElement('div'), + name: document.createElement('div'), + buttons: {} + } + }; + get element() { + return this.#elements.serverlist.row; + } + addServerListButton(name, button) { + if (this.#elements.serverlist.buttons[name] != null) { + this.removeServerListButton(name); + } + this.#elements.serverlist.buttons[name] = button; + this.#elements.serverlist.row.appendChild(button); + } + removeServerListButton(name) { + if (this.#elements.serverlist.buttons[name] != null) { + this.#elements.serverlist.row.removeChild(this.#elements.serverlist.buttons[name]); + this.#elements.serverlist.buttons[name] = null; + } + } + #torrentControls = {}; addControl(hash, control) { this.#torrentControls[hash] = control; @@ -50,6 +74,12 @@ class trserver extends EventTarget { this.#rpcurl = initdata.rpcurl; this.#authHeader = initdata.auth; this.#sessionHeader = null; + + this.#elements.serverlist.row.classList.add('d-flex', 'flex-row'); + this.#elements.serverlist.row.appendChild(this.#elements.serverlist.name); + + this.#elements.serverlist.name.classList.add('flex-grow-1'); + this.#elements.serverlist.name.appendChild(document.createTextNode(this.name)); } #rpccall_prepare(method, args) { diff --git a/js/trweb.js b/js/trweb.js index 7dcc06b..22c36f3 100644 --- a/js/trweb.js +++ b/js/trweb.js @@ -44,6 +44,8 @@ class trweb { this.#dom_servermanager.addEventListener('torrentserver-added', this.#dom_torrentmanagger); this.#dom_servermanager.addEventListener('torrent-created', this.#dom_torrentmanagger); + this.#dom_menubar.addMenuNode('servermanager', this.#dom_servermanager.menuentry); + this.#guiFooter = document.createElement('div'); this.#guiFooter.classList.add('trweb_footer'); diff --git a/style/trweb.css b/style/trweb.css index 183d75f..a7e6583 100644 --- a/style/trweb.css +++ b/style/trweb.css @@ -95,3 +95,12 @@ display: block; } +.trweb_formshade { + background-color: rgba(0,0,0,0.75); + height: 100%; + position:absolute; + top: 0; + left: 0; + width: 100%; + z-index: 10; +}