import { html, list, node, text, hydrate } from 'wirejs-dom/v2'; import { Main } from '../layouts/main.js'; import { admin, Endpoint, Setting, SystemAttribute } from 'internal-api'; function SettingInput(setting: Setting, dirtySettings: Map) { if (setting.isPrivate) { return html` dirtySettings.set( setting.key, (event.target as any).value )} />`; } if (setting.options) { return html``; } return html` dirtySettings.set( setting.key, (event.target as any).value )} />`; } function Admin() { const dirtySettings = new Map(); const styledLink = (endpoint: Endpoint) => { const origin = endpoint.url.slice(0, endpoint.path.length); return html` ${origin}${endpoint.path} `; } const copyLinkButton = (endpoint: Endpoint) => { const COPY_ICON = "📋"; const COPIED_ICON = "✅"; const self = html` { navigator.clipboard.writeText(endpoint.url); self.data.status = COPIED_ICON; setTimeout(() => self.data.status = COPY_ICON, 1500); }} >${text('status', COPY_ICON)} `; return self; } const copyValueButton = (value: string) => { const COPY_ICON = "📋"; const COPIED_ICON = "✅"; const self = html` { navigator.clipboard.writeText(value); self.data.status = COPIED_ICON; setTimeout(() => self.data.status = COPY_ICON, 1500); }} >${text('status', COPY_ICON)} `; return self; } const load = async () => { self.data.settings = (await admin.listSettings(null)) .sort((a, b) => a.key > b.key ? 1 : -1); self.data.endpoints = (await admin.listEndpoints(null)) .sort((a, b) => a.id > b.id ? 1 : -1); self.data.attributes = (await admin.listSystemAttributes(null)) .sort((a, b) => a.name > b.name ? 1 : -1); }; const self = html`

Endpoints

${list('endpoints', (endpoint: Endpoint) => html``)}
${endpoint.id}
${endpoint.description}
${styledLink(endpoint)} ${copyLinkButton(endpoint)}

Settings

{ event.preventDefault(); self.data.status = 'Saving ...'; const settings = [...dirtySettings .entries() .map(([key, value]) => ({ key, value, })) ]; dirtySettings.clear(); try { await admin.saveSettings(null, settings); await load(); self.data.status = 'Saved.'; } catch { self.data.status = 'Error Saving.'; } }}> ${list('settings', [], (setting: Setting) => html``)}
${setting.key}${setting.description ? `
${setting.description}` : '' }
${SettingInput(setting, dirtySettings)}
${text('status', 'Loaded')}

System Information

${list('attributes', (attr: SystemAttribute) => html``)}
${attr.name}
${attr.description}
${attr.value || `EMPTY`} ${copyValueButton(attr.value)}
`.onadd(load); return self; } async function App() { const self = html`
${node('isAdmin', false, (isAdmin: boolean | undefined) => isAdmin ? html`

Your are an admin.

${Admin()}
` : html`

You are NOT an admin.

` )}
`.onadd(async self => { self.data.isAdmin = await admin.isAdmin(null); }); return self; } export async function generate() { return Main({ pageTitle: 'Admin', content: await App(), }); } export function onload() { hydrate('app', App as any); }