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; const pid = localStorage.getItem('plugin'); if (pid && this.plugins.map((p) => p.id).includes(pid)) this.pid = pid; else if (this.plugins.length > 0) this.pid = this.plugins[0].id; 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); }); }, }; };