Browse Source

added router to svelte

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
feature/document
Stephan Richter 4 months ago
parent
commit
56cdedcdb8
  1. 31
      frontend/package-lock.json
  2. 3
      frontend/package.json
  3. 24
      frontend/src/App.svelte
  4. 13
      frontend/src/Components/Menu.svelte
  5. 1
      frontend/src/routes/About.svelte
  6. 0
      frontend/src/routes/Home.svelte
  7. 4
      frontend/src/routes/User.svelte
  8. 7
      web/src/main/java/de/srsoftware/umbrella/web/WebHandler.java

31
frontend/package-lock.json generated

@ -7,6 +7,9 @@ @@ -7,6 +7,9 @@
"": {
"name": "frontend",
"version": "0.0.0",
"dependencies": {
"svelte-tiny-router": "^1.0.5"
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"svelte": "^5.28.1",
@ -17,7 +20,6 @@ @@ -17,7 +20,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@ -456,7 +458,6 @@ @@ -456,7 +458,6 @@
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
"integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
@ -471,7 +472,6 @@ @@ -471,7 +472,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@ -481,7 +481,6 @@ @@ -481,7 +481,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@ -491,14 +490,12 @@ @@ -491,14 +490,12 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@ -789,7 +786,6 @@ @@ -789,7 +786,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz",
"integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"acorn": "^8.9.0"
@ -839,14 +835,12 @@ @@ -839,14 +835,12 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@ -859,7 +853,6 @@ @@ -859,7 +853,6 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
"integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">= 0.4"
@ -869,7 +862,6 @@ @@ -869,7 +862,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">= 0.4"
@ -879,7 +871,6 @@ @@ -879,7 +871,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@ -958,14 +949,12 @@ @@ -958,14 +949,12 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
"dev": true,
"license": "MIT"
},
"node_modules/esrap": {
"version": "1.4.9",
"resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.9.tgz",
"integrity": "sha512-3OMlcd0a03UGuZpPeUC1HxR3nA23l+HEyCiZw3b3FumJIN9KphoGzDJKMXI1S72jVS1dsenDyQC0kJlO1U9E1g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.4.15"
@ -1005,7 +994,6 @@ @@ -1005,7 +994,6 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.6"
@ -1025,14 +1013,12 @@ @@ -1025,14 +1013,12 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
"dev": true,
"license": "MIT"
},
"node_modules/magic-string": {
"version": "0.30.17",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
"integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
@ -1167,7 +1153,6 @@ @@ -1167,7 +1153,6 @@
"version": "5.34.8",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.34.8.tgz",
"integrity": "sha512-TF+8irl7rpj3+fpaLuPRX5BqReTAqckp0Fumxa/mCeK3fo0/MnBb9W/Z2bLwtqj3C3r5Lm6NKIAw7YrgIv1Fwg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.3.0",
@ -1189,6 +1174,15 @@ @@ -1189,6 +1174,15 @@
"node": ">=18"
}
},
"node_modules/svelte-tiny-router": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/svelte-tiny-router/-/svelte-tiny-router-1.0.5.tgz",
"integrity": "sha512-ZKmQX5OoYHKX4lp8IL4O4zF/6SqoYOPoHnr2RpplK3bmYctM4UyZRNl5Psmi+WFOsZc3tposKw8uP+yR+/MDMg==",
"license": "MIT",
"peerDependencies": {
"svelte": ">=5.0.0"
}
},
"node_modules/tinyglobby": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
@ -1304,7 +1298,6 @@ @@ -1304,7 +1298,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
"integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==",
"dev": true,
"license": "MIT"
}
}

3
frontend/package.json

@ -12,5 +12,8 @@ @@ -12,5 +12,8 @@
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"svelte": "^5.28.1",
"vite": "^6.3.5"
},
"dependencies": {
"svelte-tiny-router": "^1.0.5"
}
}

24
frontend/src/App.svelte

@ -2,6 +2,14 @@ @@ -2,6 +2,14 @@
import { onMount } from 'svelte';
import { loadTranslation } from './translations.svelte.js';
import { user } from './user.svelte.js';
import { Router, Route } from 'svelte-tiny-router';
import About from "./routes/About.svelte";
import Footer from "./Components/Footer.svelte";
import Home from "./routes/Home.svelte";
import Login from "./Components/Login.svelte";
import Menu from "./Components/Menu.svelte";
import User from "./routes/User.svelte";
let translations_ready = false;
onMount(async () => {
@ -9,16 +17,19 @@ @@ -9,16 +17,19 @@
translations_ready = true;
});
import Footer from "./Components/Footer.svelte";
import Homepage from "./Components/Homepage.svelte";
import Login from "./Components/Login.svelte";
import Menu from "./Components/Menu.svelte";
</script>
{#if translations_ready }
<Menu />
{#if user.name }
<Homepage />
<Router>
<Menu />
<Route path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/user/:id" component={User} />
<Route>
<p>Page not found</p>
</Route>
</Router>
{:else}
<Login />
{/if}
@ -26,3 +37,4 @@ @@ -26,3 +37,4 @@
{:else}
<p>Loading translations...</p>
{/if}

13
frontend/src/Components/Menu.svelte

@ -1,15 +1,24 @@ @@ -1,15 +1,24 @@
<script>
import { useTinyRouter } from 'svelte-tiny-router';
import { t } from '../translations.svelte.js';
import { user } from '../user.svelte.js';
const router = useTinyRouter();
function gotoAbout(){
router.navigate('/about');
}
function logout(){
user.name = null;
}
</script>
<nav>
<a href="/">{t('nav.Home')}</a>
<a on:click={() => router.navigate('/')}>{t('nav.Home')}</a>
<a on:click={gotoAbout}>{t('nav.About')}</a>
<a on:click={() => router.navigate('/user/5')}>{t('nav.User5')}</a>
<a href="https://svelte.dev/tutorial/svelte/state" target="_blank">{t('nav.Tutorial')}</a>
{#if user.name }
<a href="#" on:click={logout}>Logout</a>
<a on:click={logout}>Logout</a>
{/if}
</nav>

1
frontend/src/routes/About.svelte

@ -0,0 +1 @@ @@ -0,0 +1 @@
<h1>About</h1>

0
frontend/src/Components/Homepage.svelte → frontend/src/routes/Home.svelte

4
frontend/src/routes/User.svelte

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
<script>
let { id } = $props();
</script>
<h1>User {id}</h1>

7
web/src/main/java/de/srsoftware/umbrella/web/WebHandler.java

@ -13,9 +13,12 @@ import java.io.IOException; @@ -13,9 +13,12 @@ import java.io.IOException;
public class WebHandler extends PathHandler {
@Override
public boolean doGet(Path path, HttpExchange ex) throws IOException {
LOG.log(DEBUG,"doGet({0},ex)",path);
if (path.empty()) {
// we always need to load the index.html first, when we encounter something like /module/entry/4/view
// the index page itself references required elements with absolute path: /assets/index-x.js
var first = path.isEmpty() ? null : path.firstElement();
if (first == null || !first.contains(".")){
path.clear();
path.push("index.html");
}
var url = getClass().getClassLoader().getResource("web/"+path);

Loading…
Cancel
Save