'use strict' function call(method, params) { return m.request({ method: "POST", url: `/api/${method}`, body: params, }) } let BrowseModel = { path: undefined, subdirectories: [], entries: [], async reload(path) { this.path = path this.subdirectories = [] this.entries = [] let resp = await call('browse', {path: path}) this.subdirectories = resp.subdirectories this.entries = resp.entries }, } let Browse = { // Reload the model immediately, to improve responsibility. // But we don't need to: https://mithril.js.org/route.html#preloading-data // Also see: https://mithril.js.org/route.html#route-cancellation--blocking oninit(vnode) { let path = vnode.attrs.key || "/" BrowseModel.reload(path) }, view(vnode) { return m('.container', {}, [ m('.header', {}, "Browse"), m('h1', "Root"), m('ul', BrowseModel.subdirectories.map(sd => { const name = sd.split('/').pop() return m('li', m(m.route.Link, { href: `/browse/:key`, params: {key: `${BrowseModel.path}/${sd}`}, }, name)) })), m('.browser', {}, BrowseModel.entries.map(e => { return m(m.route.Link, {href: `/view/${e.sha1}`}, m('img', {src: `/thumb/${e.sha1}`, width: e.thumbW, height: e.thumbH, title: e.name})) })), ]) }, } let ViewModel = { sha1: undefined, paths: [], tags: {}, async reload(sha1) { this.sha1 = sha1 this.paths = [] this.tags = {} let resp = await call('info', {sha1: sha1}) this.paths = resp.paths this.tags = resp.tags }, } let View = { oninit(vnode) { let sha1 = vnode.attrs.key || "" ViewModel.reload(sha1) }, view(vnode) { // TODO: Show more information. return m('.container', {}, [ m('.header', {}, "View"), m('ul', ViewModel.paths.map(sd => m('li', sd))), ViewModel.sha1 !== undefined ? m('img', {src: `/image/${ViewModel.sha1}`}) : "No image.", ]) }, } window.addEventListener('load', () => { m.route(document.body, "/browse/", { // The path doesn't need to be escaped, perhaps change that (":key..."). "/browse/": Browse, "/browse/:key": Browse, "/view/:key": View, "/similar/:sha1": undefined, "/tags": undefined, "/tags/:space": undefined, "/tags/:space/:tag": undefined, }) })