/** * Tech Tools plugin routes. * * `default` = AppLayout child routes; `toplevel` = full-screen routes. * * The generator sits INSIDE the app shell, unlike the label pages in core. * Those are toplevel because a print from inside AppLayout would put the * sidebar on the label stock - which is true unless the print stylesheet says * otherwise, and style.css now does: the shell is hidden at print time so only * the labels reach the page. A tool someone spends ten minutes in wants the * navigation; a one-shot print page does not. */ export default [ { path: 'tools', name: 'tools', component: () => import('./views/ToolsIndex.vue'), meta: { requiresAuth: true, plugin: 'tools' } }, { path: 'tools/codes', name: 'tools-codes', component: () => import('./views/CodeGenerator.vue'), meta: { requiresAuth: true, plugin: 'tools' } }, { path: 'tools/secure-send', name: 'tools-secure-send', component: () => import('./views/SecureSendCreate.vue'), // Creating a secret needs a login AND tools.secrets. The route guard covers // the login; the server enforces the permission, and the page surfaces its // refusal rather than pretending the form worked. meta: { requiresAuth: true, plugin: 'tools' } }, ] // PUBLIC and OUTSIDE AppLayout. The recipient of a secret usually has no account // here, so this page carries no navigation and asks for no login - the // unguessable token in the path, and the key in the fragment, are what let them // read it. Short path because the whole link gets pasted into a chat message. export const toplevel = [ { path: '/s/:token', name: 'secure-send-read', component: () => import('./views/SecureSendRead.vue'), meta: { plugin: 'tools' } }, ]