From 3eafb413a48cde60dea8a7355ee621c6acca952f Mon Sep 17 00:00:00 2001
From: Doog <157747121+doogongithub@users.noreply.github.com>
Date: Wed, 21 Feb 2024 22:07:27 -0500
Subject: first commit
---
fe/src/App.svelte | 167 ++++++++++++++++++++++++++++++++++++++++++++++
fe/src/app.css | 111 ++++++++++++++++++++++++++++++
fe/src/assets/svelte.svg | 1 +
fe/src/lib/Card.svelte | 22 ++++++
fe/src/lib/Counter.svelte | 10 +++
fe/src/lib/Table.svelte | 41 ++++++++++++
fe/src/lib/errors.ts | 7 ++
fe/src/lib/utils.ts | 9 +++
fe/src/main.ts | 8 +++
fe/src/vite-env.d.ts | 2 +
10 files changed, 378 insertions(+)
create mode 100644 fe/src/App.svelte
create mode 100644 fe/src/app.css
create mode 100644 fe/src/assets/svelte.svg
create mode 100644 fe/src/lib/Card.svelte
create mode 100644 fe/src/lib/Counter.svelte
create mode 100644 fe/src/lib/Table.svelte
create mode 100644 fe/src/lib/errors.ts
create mode 100644 fe/src/lib/utils.ts
create mode 100644 fe/src/main.ts
create mode 100644 fe/src/vite-env.d.ts
(limited to 'fe/src')
diff --git a/fe/src/App.svelte b/fe/src/App.svelte
new file mode 100644
index 0000000..cc4e594
--- /dev/null
+++ b/fe/src/App.svelte
@@ -0,0 +1,167 @@
+
+
+
+ {#if !authenticated}
+
+
+
+ {:else}
+
+
+
+
+
+
+
+ {#await data}
+ ...fetching
+ {:then data}
+ {#if data}
+ Status
+ {data.status}
+
+
+
+ {:else}
+ No data yet
+ {/if}
+ {:catch errror}
+ {error.message}
+ {/await}
+ {/if}
+
+
+
diff --git a/fe/src/app.css b/fe/src/app.css
new file mode 100644
index 0000000..4768cf6
--- /dev/null
+++ b/fe/src/app.css
@@ -0,0 +1,111 @@
+:root {
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ --submit: #28a745;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+.card {
+ padding: 2em;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ color: #000;
+ }
+}
+
+.form {
+ display: flex;
+ flex-direction: column;
+}
+
+.form.input.group {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 1em;
+}
+
+.form.input.group label {
+ margin-bottom: .5em;
+}
+
+.form.input.group input {
+ padding: 1em;
+}
+
+.form button[type=submit] {
+ align-self: flex-end;
+ background: var(--submit);
+ color: #fff;
+}
diff --git a/fe/src/assets/svelte.svg b/fe/src/assets/svelte.svg
new file mode 100644
index 0000000..c5e0848
--- /dev/null
+++ b/fe/src/assets/svelte.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fe/src/lib/Card.svelte b/fe/src/lib/Card.svelte
new file mode 100644
index 0000000..feb5bcc
--- /dev/null
+++ b/fe/src/lib/Card.svelte
@@ -0,0 +1,22 @@
+
+
+
+ {#if title}
+
{title}
+ {/if}
+
+
+
+
diff --git a/fe/src/lib/Counter.svelte b/fe/src/lib/Counter.svelte
new file mode 100644
index 0000000..979b4df
--- /dev/null
+++ b/fe/src/lib/Counter.svelte
@@ -0,0 +1,10 @@
+
+
+
diff --git a/fe/src/lib/Table.svelte b/fe/src/lib/Table.svelte
new file mode 100644
index 0000000..2df9f8c
--- /dev/null
+++ b/fe/src/lib/Table.svelte
@@ -0,0 +1,41 @@
+
+
+ {#if title}
+ {title}
+ {/if}
+ {#if !noheader}
+
+
+
+ Data Header
+ |
+
+
+ {/if}
+
+
+ Data |
+
+
+ {#if !nofooter}
+
+
+
+ Table Footer |
+
+
+
+ {/if}
+
+
diff --git a/fe/src/lib/errors.ts b/fe/src/lib/errors.ts
new file mode 100644
index 0000000..0663d63
--- /dev/null
+++ b/fe/src/lib/errors.ts
@@ -0,0 +1,7 @@
+export class UnauthorizedError extends Error {
+ constructor (message?: string , options?: ErrorOptions) {
+ super(message, options);
+ }
+}
+
+
diff --git a/fe/src/lib/utils.ts b/fe/src/lib/utils.ts
new file mode 100644
index 0000000..c5501ae
--- /dev/null
+++ b/fe/src/lib/utils.ts
@@ -0,0 +1,9 @@
+export function processFormInput(form) {
+ const formData = new FormData(form);
+ const data = {};
+ for (let field of formData) {
+ const [key, value] = field;
+ data[key] = value;
+ }
+ return data;
+}
diff --git a/fe/src/main.ts b/fe/src/main.ts
new file mode 100644
index 0000000..8a909a1
--- /dev/null
+++ b/fe/src/main.ts
@@ -0,0 +1,8 @@
+import './app.css'
+import App from './App.svelte'
+
+const app = new App({
+ target: document.getElementById('app'),
+})
+
+export default app
diff --git a/fe/src/vite-env.d.ts b/fe/src/vite-env.d.ts
new file mode 100644
index 0000000..4078e74
--- /dev/null
+++ b/fe/src/vite-env.d.ts
@@ -0,0 +1,2 @@
+///
+///
--
cgit v1.1
From e37c73e33a4aaf7fb8d25b5af03627f20bcda19f Mon Sep 17 00:00:00 2001
From: Doog <157747121+doogongithub@users.noreply.github.com>
Date: Sat, 24 Feb 2024 20:08:35 -0500
Subject: add gitignore
---
fe/src/App.svelte | 147 +++-----------------------------------------
fe/src/app.css | 2 +-
fe/src/lib/DataView.svelte | 67 ++++++++++++++++++++
fe/src/lib/Layout.svelte | 57 +++++++++++++++++
fe/src/lib/LoginForm.svelte | 64 +++++++++++++++++++
fe/src/lib/Table.svelte | 61 +++++++++++++++---
fe/src/stores/auth.ts | 48 +++++++++++++++
7 files changed, 300 insertions(+), 146 deletions(-)
create mode 100644 fe/src/lib/DataView.svelte
create mode 100644 fe/src/lib/Layout.svelte
create mode 100644 fe/src/lib/LoginForm.svelte
create mode 100644 fe/src/stores/auth.ts
(limited to 'fe/src')
diff --git a/fe/src/App.svelte b/fe/src/App.svelte
index cc4e594..8811c52 100644
--- a/fe/src/App.svelte
+++ b/fe/src/App.svelte
@@ -1,146 +1,19 @@
- {#if !authenticated}
-
-
-
+
+ {#if !$authenticated}
+
{:else}
-
-
-
-
-
-
-
- {#await data}
- ...fetching
- {:then data}
- {#if data}
- Status
- {data.status}
-
-
-
- {:else}
- No data yet
- {/if}
- {:catch errror}
- {error.message}
- {/await}
+
{/if}
+
diff --git a/fe/src/lib/LoginForm.svelte b/fe/src/lib/LoginForm.svelte
new file mode 100644
index 0000000..22c0faf
--- /dev/null
+++ b/fe/src/lib/LoginForm.svelte
@@ -0,0 +1,64 @@
+
+
+
+
+
diff --git a/fe/src/lib/Table.svelte b/fe/src/lib/Table.svelte
index 2df9f8c..5572280 100644
--- a/fe/src/lib/Table.svelte
+++ b/fe/src/lib/Table.svelte
@@ -1,8 +1,38 @@
{#if title}
@@ -11,16 +41,27 @@
{#if !noheader}
-
- Data Header
- |
+ {#each getDataKeys(data) as header}
+ {header} |
+ {/each}
{/if}
+ {#if data}
+ {#each data as row}
- Data |
+ {#each getRow(row) as datum}
+
+ {formatDatum(datum)} |
+ {/each}
+ {/each}
+ {:else}
+
+ There is not data.
+
+ {/if}
{#if !nofooter}
@@ -38,4 +79,8 @@ table {
margin: 8px;
border: solid 1px black;
}
+
+th {
+ text-transform: capitalize;
+}
diff --git a/fe/src/stores/auth.ts b/fe/src/stores/auth.ts
new file mode 100644
index 0000000..7e70cda
--- /dev/null
+++ b/fe/src/stores/auth.ts
@@ -0,0 +1,48 @@
+import type { Invalidator, Subscriber, Unsubscriber } from 'svelte/store';
+import { writable, derived } from 'svelte/store';
+
+type Nullable = T | null;
+
+interface User {
+ uuid: string;
+ username: string;
+}
+
+interface TokenStore {
+ subscribe: (run: Subscriber>, invalidate: Invalidator>) => Unsubscriber,
+ authenticate: (newToken: string) => void,
+ unauthenticate: () => void
+}
+
+function createTokenStore(): TokenStore {
+ const storedToken = localStorage.getItem("token");
+ const { subscribe, set } = writable(storedToken);
+
+ function authenticate(newToken: string): void {
+ try {
+ localStorage.setItem("token", newToken);
+ set(newToken);
+ } catch (e) {
+ console.error('error', e);
+ }
+ }
+
+ function unauthenticate(): void {
+ localStorage.removeItem("token");
+ set(null);
+ }
+
+ return {
+ subscribe,
+ authenticate,
+ unauthenticate
+ };
+}
+
+function onTokenChange ($token: Nullable): boolean {
+ return $token ? true : false;
+}
+
+export const token = createTokenStore();
+export const authenticated = derived(token, onTokenChange);
+export const user = writable(null);
--
cgit v1.1
From 9f9a33cbf55d38987a66b709284d2bb4ffea0fe9 Mon Sep 17 00:00:00 2001
From: Doog <157747121+doogongithub@users.noreply.github.com>
Date: Thu, 29 Feb 2024 20:13:48 -0500
Subject: modify api, build additional FE components, add types
---
fe/src/lib/DataView.svelte | 67 ++++++++++++++++++++++++++++++++++++---
fe/src/lib/LoginForm.svelte | 16 ++++++----
fe/src/lib/PreferencesForm.svelte | 45 ++++++++++++++++++++++++++
fe/src/lib/Table.svelte | 19 +++++++++++
fe/src/stores/auth.ts | 57 ++++++++++++++++++++++++++++++++-
fe/src/types.ts | 14 ++++++++
6 files changed, 206 insertions(+), 12 deletions(-)
create mode 100644 fe/src/lib/PreferencesForm.svelte
create mode 100644 fe/src/types.ts
(limited to 'fe/src')
diff --git a/fe/src/lib/DataView.svelte b/fe/src/lib/DataView.svelte
index cd7b042..dc8acae 100644
--- a/fe/src/lib/DataView.svelte
+++ b/fe/src/lib/DataView.svelte
@@ -1,11 +1,24 @@
+
@@ -65,3 +112,15 @@ onMount(() => {
{/await}
+
+
diff --git a/fe/src/lib/LoginForm.svelte b/fe/src/lib/LoginForm.svelte
index 22c0faf..499a457 100644
--- a/fe/src/lib/LoginForm.svelte
+++ b/fe/src/lib/LoginForm.svelte
@@ -1,8 +1,8 @@
+
+
diff --git a/fe/src/lib/Table.svelte b/fe/src/lib/Table.svelte
index 5572280..4b81800 100644
--- a/fe/src/lib/Table.svelte
+++ b/fe/src/lib/Table.svelte
@@ -30,6 +30,11 @@ function formatDatum([key, value]: any[]) {
const parsedDate = new Date(value);
return formatter.format(parsedDate);
}
+
+ if (key === 'user') {
+ return value['name'];
+ }
+
return value;
}
@@ -78,9 +83,23 @@ table {
padding: 16px;
margin: 8px;
border: solid 1px black;
+ border-collapse: collapse;
}
th {
text-transform: capitalize;
}
+
+thead tr {
+ background: rgba(0,0,23, 0.34);
+}
+
+tbody tr:nth-child(odd) {
+ background: rgba(0,0,23,0.14);
+}
+
+th, td {
+ padding: 1em;
+ border: 1px solid rgba(0,0,0, 1);
+}
diff --git a/fe/src/stores/auth.ts b/fe/src/stores/auth.ts
index 7e70cda..10e6bd3 100644
--- a/fe/src/stores/auth.ts
+++ b/fe/src/stores/auth.ts
@@ -1,4 +1,5 @@
import type { Invalidator, Subscriber, Unsubscriber } from 'svelte/store';
+import type { Preference } from '../types';
import { writable, derived } from 'svelte/store';
type Nullable = T | null;
@@ -14,6 +15,18 @@ interface TokenStore {
unauthenticate: () => void
}
+
+interface UserStore {
+ subscribe: (run: Subscriber>, invalidate: Invalidator>) => Unsubscriber,
+ setUser: (user: User) => void,
+ reset: () => void
+}
+
+interface PreferenceStore {
+ subscribe: (run: Subscriber>, invalidate: Invalidator>) => Unsubscriber,
+ set: (this: void, value: Nullable) => void
+}
+
function createTokenStore(): TokenStore {
const storedToken = localStorage.getItem("token");
const { subscribe, set } = writable(storedToken);
@@ -43,6 +56,48 @@ function onTokenChange ($token: Nullable): boolean {
return $token ? true : false;
}
+function createUserStore(): UserStore {
+ const user = localStorage.getItem('user');
+ const userObj: Nullable = user ? JSON.parse(user) : null;
+ const { subscribe, set } = writable(userObj);
+
+ const setUser = (user: User) => {
+ localStorage.setItem('user', JSON.stringify(user));
+ set(user);
+ }
+
+ const reset = () => {
+ localStorage.removeItem('user');
+ set(null);
+ }
+
+ return {
+ subscribe,
+ setUser,
+ reset
+ }
+}
+
+
+function createPreferenceStore(): PreferenceStore {
+ const preferences = localStorage.getItem('preferences');
+ const preferenceObj: Preference = preferences ? JSON.parse(preferences) : {
+ color: "#FF0000",
+ size: {
+ size: 16,
+ unit: 'oz'
+ }
+ };
+
+ const { subscribe, set } = writable>(preferenceObj);
+
+ return {
+ subscribe,
+ set
+ }
+}
+
export const token = createTokenStore();
export const authenticated = derived(token, onTokenChange);
-export const user = writable(null);
+export const user = createUserStore();
+export const preferences = createPreferenceStore();
diff --git a/fe/src/types.ts b/fe/src/types.ts
new file mode 100644
index 0000000..03d613d
--- /dev/null
+++ b/fe/src/types.ts
@@ -0,0 +1,14 @@
+export interface Size {
+ size: number;
+ unit: string;
+}
+
+export interface Preference {
+ color: string;
+ size: Size;
+}
+
+export interface User {
+ name: string;
+ uuid: string;
+}
--
cgit v1.1
From afeffe31bd7d0f8333627a972e1d32e64a325b5b Mon Sep 17 00:00:00 2001
From: Zach Berwaldt
Date: Fri, 1 Mar 2024 18:17:42 -0500
Subject: reformat fe
---
fe/src/App.svelte | 42 ++-------
fe/src/lib/Card.svelte | 14 +--
fe/src/lib/Counter.svelte | 10 ---
fe/src/lib/DataView.svelte | 177 +++++++++++++++++++-------------------
fe/src/lib/Layout.svelte | 77 +++++++++--------
fe/src/lib/LoginForm.svelte | 105 +++++++++++++---------
fe/src/lib/PreferencesForm.svelte | 32 ++++---
fe/src/lib/Table.svelte | 138 ++++++++++++++---------------
fe/src/lib/errors.ts | 6 +-
fe/src/lib/utils.ts | 16 ++--
fe/src/main.ts | 2 +-
fe/src/stores/auth.ts | 132 ++++++++++++++--------------
fe/src/types.ts | 18 ++--
13 files changed, 384 insertions(+), 385 deletions(-)
delete mode 100644 fe/src/lib/Counter.svelte
(limited to 'fe/src')
diff --git a/fe/src/App.svelte b/fe/src/App.svelte
index 8811c52..25d53dc 100644
--- a/fe/src/App.svelte
+++ b/fe/src/App.svelte
@@ -1,40 +1,16 @@
-
+
{#if !$authenticated}
-
+
{:else}
-
- {/if}
-
+
+ {/if}
+
-
-
diff --git a/fe/src/lib/Card.svelte b/fe/src/lib/Card.svelte
index feb5bcc..0835940 100644
--- a/fe/src/lib/Card.svelte
+++ b/fe/src/lib/Card.svelte
@@ -1,16 +1,16 @@
- {#if title}
-
{title}
- {/if}
-
+ {#if title}
+ {title}
+ {/if}
+
diff --git a/fe/src/lib/Counter.svelte b/fe/src/lib/Counter.svelte
deleted file mode 100644
index 979b4df..0000000
--- a/fe/src/lib/Counter.svelte
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
diff --git a/fe/src/lib/DataView.svelte b/fe/src/lib/DataView.svelte
index dc8acae..1458c9a 100644
--- a/fe/src/lib/DataView.svelte
+++ b/fe/src/lib/DataView.svelte
@@ -1,126 +1,123 @@
-
+
-
-
-
-
- {#await json then data}
-
- {:catch error}
-
{error}
- {/await}
-
+
+
+
+ {#await json then data}
+
+ {:catch error}
+
{error}
+ {/await}
+
diff --git a/fe/src/lib/Layout.svelte b/fe/src/lib/Layout.svelte
index f349632..94ce84d 100644
--- a/fe/src/lib/Layout.svelte
+++ b/fe/src/lib/Layout.svelte
@@ -1,57 +1,62 @@
- {#if $authenticated}
+ {#if $authenticated}
- {/if}
-
-
-
+
+ {/if}
+
+
+
diff --git a/fe/src/lib/LoginForm.svelte b/fe/src/lib/LoginForm.svelte
index 499a457..bf6d9ad 100644
--- a/fe/src/lib/LoginForm.svelte
+++ b/fe/src/lib/LoginForm.svelte
@@ -1,66 +1,85 @@
-
-
+
diff --git a/fe/src/lib/PreferencesForm.svelte b/fe/src/lib/PreferencesForm.svelte
index 781866c..95e04c1 100644
--- a/fe/src/lib/PreferencesForm.svelte
+++ b/fe/src/lib/PreferencesForm.svelte
@@ -1,7 +1,8 @@
-