const component = () => { return { subscriptions: [], plugins: [], pid: undefined, subscription: undefined, // selected subscription loading: false, init() { fetch(`${base_url}api/admin/plugin`) .then((res) => res.json()) .then((data) => { if (!data.success) throw new Error(data.error); this.plugins = data.plugins; let pid = localStorage.getItem("plugin"); if (!pid || !this.plugins.find((p) => p.id === pid)) { pid = this.plugins[0].id; } this.pid = pid; this.list(pid); }) .catch((e) => { alert( "danger", `Failed to list the available plugins. Error: ${e}` ); }); }, pluginChanged() { localStorage.setItem("plugin", this.pid); this.list(this.pid); }, list(pid) { if (!pid) return; fetch( `${base_url}api/admin/plugin/subscriptions?${new URLSearchParams( { plugin: pid, } )}`, { method: "GET", } ) .then((response) => response.json()) .then((data) => { if (!data.success) throw new Error(data.error); this.subscriptions = data.subscriptions; }) .catch((e) => { alert( "danger", `Failed to list subscriptions. Error: ${e}` ); }); }, renderStrCell(str) { const maxLength = 40; if (str.length > maxLength) return `${str.substring( 0, maxLength )}...
${str}
`; return `${str}`; }, renderDateCell(timestamp) { return `${moment .duration(moment.unix(timestamp).diff(moment())) .humanize(true)}`; }, selected(event, modal) { const id = event.currentTarget.getAttribute("sid"); this.subscription = this.subscriptions.find((s) => s.id === id); UIkit.modal(modal).show(); }, renderFilterRow(ft) { const key = ft.key; let type = ft.type; switch (type) { case "number-min": type = "number (minimum value)"; break; case "number-max": type = "number (maximum value)"; break; case "date-min": type = "minimum date"; break; case "date-max": type = "maximum date"; break; } let value = ft.value; if (ft.type.startsWith("number") && isNaN(value)) value = ""; else if (ft.type.startsWith("date") && value) value = moment(Number(value)).format("MMM D, YYYY"); return `${key}${type}${value}`; }, actionHandler(event, type) { const id = $(event.currentTarget).closest("tr").attr("sid"); if (type !== 'delete') return this.action(id, type); UIkit.modal.confirm('Are you sure you want to delete the subscription? This cannot be undone.', { labels: { ok: 'Yes, delete it', cancel: 'Cancel' } }).then(() => { this.action(id, type); }); }, action(id, type) { if (this.loading) return; this.loading = true; fetch( `${base_url}api/admin/plugin/subscriptions${type === 'update' ? '/update' : ''}?${new URLSearchParams( { plugin: this.pid, subscription: id, } )}`, { method: type === 'delete' ? "DELETE" : 'POST' } ) .then((response) => response.json()) .then((data) => { if (!data.success) throw new Error(data.error); if (type === 'update') alert("success", `Checking updates for subscription ${id}. Check the log for the progress or come back to this page later.`); }) .catch((e) => { alert( "danger", `Failed to ${type} subscription. Error: ${e}` ); }) .finally(() => { this.loading = false; this.list(this.pid); }); }, }; };