diff --git a/index.html b/index.html index 7e5192f..566648b 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,7 @@ /> <%- project_name %> +
diff --git a/package-lock.json b/package-lock.json index 49c9f5a..8a8f592 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,11 @@ "version": "0.0.0", "dependencies": { "@geoman-io/leaflet-geoman-free": "^2.14.2", + "@nuxt/devalue": "^2.0.0", "axios": "^1.3.5", "js-yaml": "^4.1.0", "leaflet": "^1.9.3", + "pinia": "^2.0.34", "vue": "^3.2.47", "vue-router": "^4.1.6" }, @@ -603,6 +605,11 @@ "node": ">= 8" } }, + "node_modules/@nuxt/devalue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.0.tgz", + "integrity": "sha512-YBI/6o2EBz02tdEJRBK8xkt3zvOFOWlLBf7WKYGBsSYSRtjjgrqPe2skp6VLLmKx5WbHHDNcW+6oACaurxGzeA==" + }, "node_modules/@tailwindcss/typography": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", @@ -958,9 +965,9 @@ } }, "node_modules/@vue/devtools-api": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", - "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "node_modules/@vue/reactivity": { "version": "3.2.47", @@ -3824,6 +3831,56 @@ "node": ">=0.10.0" } }, + "node_modules/pinia": { + "version": "2.0.34", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.34.tgz", + "integrity": "sha512-cgOoGUiyqX0SSgX8XelK9+Ri4XA2/YyNtgjogwfzIx1g7iZTaZPxm7/bZYMCLU2qHRiHhxG7SuQO0eBacFNc2Q==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", + "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -5558,6 +5615,11 @@ "fastq": "^1.6.0" } }, + "@nuxt/devalue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.0.tgz", + "integrity": "sha512-YBI/6o2EBz02tdEJRBK8xkt3zvOFOWlLBf7WKYGBsSYSRtjjgrqPe2skp6VLLmKx5WbHHDNcW+6oACaurxGzeA==" + }, "@tailwindcss/typography": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", @@ -5853,9 +5915,9 @@ } }, "@vue/devtools-api": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz", - "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, "@vue/reactivity": { "version": "3.2.47", @@ -7997,6 +8059,23 @@ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true }, + "pinia": { + "version": "2.0.34", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.34.tgz", + "integrity": "sha512-cgOoGUiyqX0SSgX8XelK9+Ri4XA2/YyNtgjogwfzIx1g7iZTaZPxm7/bZYMCLU2qHRiHhxG7SuQO0eBacFNc2Q==", + "requires": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", + "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", + "requires": {} + } + } + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", diff --git a/package.json b/package.json index 80bc6ba..b2e6709 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,11 @@ "type": "module", "scripts": { "dev": "node server", + "dev:spa": "vite dev", "build:spa": "vite build", "build": "npm run build:client && npm run build:server", "build:client": "vite build --ssrManifest --outDir dist/client", "build:server": "vite build --ssr src/entry-server.js --outDir dist/server", - "generate": "vite build --ssrManifest --outDir dist/static && npm run build:server && node prerender", "serve": "NODE_ENV=production node server", "debug": "node --inspect-brk server", "preview": "vite preview", @@ -16,9 +16,11 @@ }, "dependencies": { "@geoman-io/leaflet-geoman-free": "^2.14.2", + "@nuxt/devalue": "^2.0.0", "axios": "^1.3.5", "js-yaml": "^4.1.0", "leaflet": "^1.9.3", + "pinia": "^2.0.34", "vue": "^3.2.47", "vue-router": "^4.1.6" }, diff --git a/prerender.js b/prerender.js deleted file mode 100644 index 97f4283..0000000 --- a/prerender.js +++ /dev/null @@ -1,42 +0,0 @@ -// Pre-render the app into static HTML. -// run `npm run generate` and then `dist/static` can be served as a static site. - -import fs from 'node:fs' -import path from 'node:path' -import url from 'node:url' - -const __dirname = path.dirname(url.fileURLToPath(import.meta.url)) - -const toAbsolute = (p) => path.resolve(__dirname, p) - -const manifest = JSON.parse( - fs.readFileSync(toAbsolute('dist/static/ssr-manifest.json'), 'utf-8') -) -const template = fs.readFileSync(toAbsolute('dist/static/index.html'), 'utf-8') -const { render } = await import('./dist/server/entry-server.js') - -// determine routes to pre-render from src/pages -const routesToPrerender = fs - .readdirSync(toAbsolute('src/pages')) - .map((file) => { - const name = file.replace(/\.vue$/, '').toLowerCase() - return name === 'home' ? `/` : `/${name}` - }) - -;(async () => { - // pre-render each route... - for (const url of routesToPrerender) { - const [appHtml, preloadLinks] = await render(url, manifest) - - const html = template - .replace(``, preloadLinks) - .replace(``, appHtml) - - const filePath = `dist/static${url === '/' ? '/index' : url}.html` - fs.writeFileSync(toAbsolute(filePath), html) - console.log('pre-rendered:', filePath) - } - - // done, delete ssr manifest - fs.unlinkSync(toAbsolute('dist/static/ssr-manifest.json')) -})() diff --git a/server.js b/server.js index 64f9383..a1738f9 100644 --- a/server.js +++ b/server.js @@ -36,7 +36,7 @@ export async function createServer( vite = await ( await import('vite') ).createServer({ - base: '/test/', + base: '/', root, logLevel: isTest ? 'error' : 'info', server: { @@ -67,7 +67,7 @@ export async function createServer( app.use('*', async (req, res) => { try { - const url = req.originalUrl.replace('/test/', '/') + const url = req.originalUrl let template, render if (!isProd) { @@ -81,11 +81,12 @@ export async function createServer( render = (await import('./dist/server/entry-server.js')).render } - const [appHtml, preloadLinks] = await render(url, manifest) + const [appHtml, appState, preloadLinks] = await render(url, manifest) const html = template .replace(``, preloadLinks) .replace(``, appHtml) + .replace(``, appState) res.status(200).set({ 'Content-Type': 'text/html' }).end(html) } catch (e) { diff --git a/src/components/Gallery/GalleryMainImage.vue b/src/components/Gallery/GalleryMainImage.vue index f0f46f7..d53a8a1 100644 --- a/src/components/Gallery/GalleryMainImage.vue +++ b/src/components/Gallery/GalleryMainImage.vue @@ -1,6 +1,8 @@ diff --git a/src/modules/otus/components/Panel/PanelMap/PanelMap.vue b/src/modules/otus/components/Panel/PanelMap/PanelMap.vue index 4057b92..e2239ad 100644 --- a/src/modules/otus/components/Panel/PanelMap/PanelMap.vue +++ b/src/modules/otus/components/Panel/PanelMap/PanelMap.vue @@ -3,8 +3,6 @@
- - - - - - +
{ + return { + otu: null, + taxon: null, + images: null + } + }, + actions: { + async loadTaxon(id) { + const taxon = await TaxonWorks.summary(id) + + this.taxon = taxon.data + }, + async loadOtu(id) { + const otu = await TaxonWorks.getOtu(id) + + this.otu = otu.data + }, + + async loadInit(otuId) { + const otu = (await TaxonWorks.getOtu(otuId)).data + const taxon = (await TaxonWorks.summary(otu.taxon_name_id)).data + + this.otu = otu + this.taxon = taxon + }, + + async loadImages(otuId) { + const params = { + extend: ['depictions', 'attribution', 'source', 'citations'], + otu_scope: ['all'] + } + + this.images = (await TaxonWorks.getOtuImages(otuId, params)).data + } + }, +}) \ No newline at end of file diff --git a/src/modules/otus/views/Index.vue b/src/modules/otus/views/Index.vue index 03cc10d..11bd899 100644 --- a/src/modules/otus/views/Index.vue +++ b/src/modules/otus/views/Index.vue @@ -6,8 +6,9 @@ class="flex flex-col-reverse md:flex-row justify-between items-start" > @@ -45,7 +47,7 @@