From 967be9e750221ab2ab783f95df79bb26d290a45e Mon Sep 17 00:00:00 2001 From: Martial Simon Date: Mon, 15 Sep 2025 01:07:58 +0200 Subject: add: added projects --- ping/frontend/src/lib/components/Avatar.svelte | 48 +++++ ping/frontend/src/lib/components/Button.svelte | 17 ++ ping/frontend/src/lib/components/NavBar.svelte | 44 ++++ .../src/lib/components/NumberStatList.svelte | 55 +++++ ping/frontend/src/lib/components/SideBar.svelte | 61 ++++++ .../src/lib/components/SteppedLineChart.svelte | 76 +++++++ ping/frontend/src/lib/components/ToastList.svelte | 67 ++++++ ping/frontend/src/lib/components/UserItem.svelte | 42 ++++ .../lib/components/dashboard/RiskAnalysis.svelte | 10 + .../src/lib/components/dashboard/StockGraph.svelte | 136 ++++++++++++ .../components/dashboard/TrendingSymbols.svelte | 85 ++++++++ .../dashboard/transactions/TransactionModal.svelte | 165 +++++++++++++++ .../src/lib/components/input/StockSelector.svelte | 231 +++++++++++++++++++++ .../src/lib/components/input/UserSelector.svelte | 35 ++++ ping/frontend/src/lib/pages.ts | 54 +++++ ping/frontend/src/lib/stores/auth.ts | 66 ++++++ ping/frontend/src/lib/stores/toast.ts | 22 ++ 17 files changed, 1214 insertions(+) create mode 100644 ping/frontend/src/lib/components/Avatar.svelte create mode 100644 ping/frontend/src/lib/components/Button.svelte create mode 100644 ping/frontend/src/lib/components/NavBar.svelte create mode 100644 ping/frontend/src/lib/components/NumberStatList.svelte create mode 100644 ping/frontend/src/lib/components/SideBar.svelte create mode 100644 ping/frontend/src/lib/components/SteppedLineChart.svelte create mode 100644 ping/frontend/src/lib/components/ToastList.svelte create mode 100644 ping/frontend/src/lib/components/UserItem.svelte create mode 100644 ping/frontend/src/lib/components/dashboard/RiskAnalysis.svelte create mode 100644 ping/frontend/src/lib/components/dashboard/StockGraph.svelte create mode 100644 ping/frontend/src/lib/components/dashboard/TrendingSymbols.svelte create mode 100644 ping/frontend/src/lib/components/dashboard/transactions/TransactionModal.svelte create mode 100644 ping/frontend/src/lib/components/input/StockSelector.svelte create mode 100644 ping/frontend/src/lib/components/input/UserSelector.svelte create mode 100644 ping/frontend/src/lib/pages.ts create mode 100644 ping/frontend/src/lib/stores/auth.ts create mode 100644 ping/frontend/src/lib/stores/toast.ts (limited to 'ping/frontend/src/lib') diff --git a/ping/frontend/src/lib/components/Avatar.svelte b/ping/frontend/src/lib/components/Avatar.svelte new file mode 100644 index 0000000..c04b563 --- /dev/null +++ b/ping/frontend/src/lib/components/Avatar.svelte @@ -0,0 +1,48 @@ + + + +
+ + (showTooltip = true)} + onmouseleave={() => (showTooltip = false)} + {onclick} + alt="User Avatar" + /> + {#if showTooltip} +
{username}
+ {/if} +
+ + diff --git a/ping/frontend/src/lib/components/Button.svelte b/ping/frontend/src/lib/components/Button.svelte new file mode 100644 index 0000000..54b26ab --- /dev/null +++ b/ping/frontend/src/lib/components/Button.svelte @@ -0,0 +1,17 @@ + + +{#if href} + {@render children?.()} +{:else} + +{/if} diff --git a/ping/frontend/src/lib/components/NavBar.svelte b/ping/frontend/src/lib/components/NavBar.svelte new file mode 100644 index 0000000..1a76876 --- /dev/null +++ b/ping/frontend/src/lib/components/NavBar.svelte @@ -0,0 +1,44 @@ + + + + + diff --git a/ping/frontend/src/lib/components/NumberStatList.svelte b/ping/frontend/src/lib/components/NumberStatList.svelte new file mode 100644 index 0000000..b6444e8 --- /dev/null +++ b/ping/frontend/src/lib/components/NumberStatList.svelte @@ -0,0 +1,55 @@ + + +
+ {#each statsList as stat} +
+ + {stat.name} + {stat.value} +
+ {/each} +
+ + diff --git a/ping/frontend/src/lib/components/SideBar.svelte b/ping/frontend/src/lib/components/SideBar.svelte new file mode 100644 index 0000000..9ea8a04 --- /dev/null +++ b/ping/frontend/src/lib/components/SideBar.svelte @@ -0,0 +1,61 @@ + + + + + diff --git a/ping/frontend/src/lib/components/SteppedLineChart.svelte b/ping/frontend/src/lib/components/SteppedLineChart.svelte new file mode 100644 index 0000000..d393b44 --- /dev/null +++ b/ping/frontend/src/lib/components/SteppedLineChart.svelte @@ -0,0 +1,76 @@ + + +
+ +
diff --git a/ping/frontend/src/lib/components/ToastList.svelte b/ping/frontend/src/lib/components/ToastList.svelte new file mode 100644 index 0000000..5351ef7 --- /dev/null +++ b/ping/frontend/src/lib/components/ToastList.svelte @@ -0,0 +1,67 @@ + + +
+ {#each $toastList as toast} +
+

{toast.title}

+

{toast.message}

+
+ {/each} +
+ + diff --git a/ping/frontend/src/lib/components/UserItem.svelte b/ping/frontend/src/lib/components/UserItem.svelte new file mode 100644 index 0000000..44add60 --- /dev/null +++ b/ping/frontend/src/lib/components/UserItem.svelte @@ -0,0 +1,42 @@ + + +
+
+ + + +
+
+

Nom: {user.displayName}

+

Login: {user.login}

+

Role: {user.isAdmin ? 'ADMIN' : 'USER'}

+

Id: {user.id}

+
+
+ + diff --git a/ping/frontend/src/lib/components/dashboard/RiskAnalysis.svelte b/ping/frontend/src/lib/components/dashboard/RiskAnalysis.svelte new file mode 100644 index 0000000..3844abc --- /dev/null +++ b/ping/frontend/src/lib/components/dashboard/RiskAnalysis.svelte @@ -0,0 +1,10 @@ +

Analyse de risque

+tkt t safe c hardcodé chef + + diff --git a/ping/frontend/src/lib/components/dashboard/StockGraph.svelte b/ping/frontend/src/lib/components/dashboard/StockGraph.svelte new file mode 100644 index 0000000..beefed9 --- /dev/null +++ b/ping/frontend/src/lib/components/dashboard/StockGraph.svelte @@ -0,0 +1,136 @@ + + +
+
+

Vue d'ensemble : {selectedStock}

+
+ + + + + +
+
+ +
+ + diff --git a/ping/frontend/src/lib/components/dashboard/TrendingSymbols.svelte b/ping/frontend/src/lib/components/dashboard/TrendingSymbols.svelte new file mode 100644 index 0000000..3d947ad --- /dev/null +++ b/ping/frontend/src/lib/components/dashboard/TrendingSymbols.svelte @@ -0,0 +1,85 @@ + + +

Tendances

+ + + diff --git a/ping/frontend/src/lib/components/dashboard/transactions/TransactionModal.svelte b/ping/frontend/src/lib/components/dashboard/transactions/TransactionModal.svelte new file mode 100644 index 0000000..b9f0224 --- /dev/null +++ b/ping/frontend/src/lib/components/dashboard/transactions/TransactionModal.svelte @@ -0,0 +1,165 @@ + + + + +{#if isOpen} +
+ e.stopPropagation()}> +

Créer une nouvelle transaction

+
+ + + + + + + +
+
+
+{/if} + + diff --git a/ping/frontend/src/lib/components/input/StockSelector.svelte b/ping/frontend/src/lib/components/input/StockSelector.svelte new file mode 100644 index 0000000..1237128 --- /dev/null +++ b/ping/frontend/src/lib/components/input/StockSelector.svelte @@ -0,0 +1,231 @@ + + + + + +
+ + +
+
+
+ {#if stocks.length === 0} +

Aucune action, ETFs trouvés.

+ {:else} +

{stocks.length} actions, ETFs trouvés

+ {#each stocks as stock} + + {/each} + {/if} +
+
+ {#if news.length === 0} +

Pas de news trouvés.

+ {:else} +

{news.length} news trouvées

+ {#each news as newsItem} + + {#if newsItem.thumbnail?.resolutions?.length > 0} + News Thumbnail + {/if} +

{newsItem.title}

+ {/each} + {/if} +
+
+
+ + +
+ + diff --git a/ping/frontend/src/lib/components/input/UserSelector.svelte b/ping/frontend/src/lib/components/input/UserSelector.svelte new file mode 100644 index 0000000..a0c80c7 --- /dev/null +++ b/ping/frontend/src/lib/components/input/UserSelector.svelte @@ -0,0 +1,35 @@ + + +
+ {#each users as u, i} + { + users = users.filter((_, index) => index !== i); + }} + /> + {/each} + { + let userId = prompt("Entrez l'ID de l'utilisateur à ajouter :"); + if (userId === null || userId.trim() === '') { + addToast({ title: 'ID utilisateur invalide.' }); + return; + } + if (users.map((u) => u.displayName).includes(userId)) { + addToast({ title: 'Cet utilisateur est déjà ajouté.' }); + return; + } + users = [...users, { displayName: userId, avatar: '/img/default-avatar.png' } as IUser]; + }} + /> +
diff --git a/ping/frontend/src/lib/pages.ts b/ping/frontend/src/lib/pages.ts new file mode 100644 index 0000000..e5d424e --- /dev/null +++ b/ping/frontend/src/lib/pages.ts @@ -0,0 +1,54 @@ +interface SideBarItem { + icon: string; + name: string; + href: string; +} + +export const pages: SideBarItem[] = [ + { + name: 'Dashboard', + icon: '/icons/dashboard.svg', + href: '/dashboard' + }, + { + name: 'Transactions', + icon: '/icons/credit-card.svg', + href: '/dashboard/transactions' + }, + { + name: 'Modèles', + icon: '/icons/floppy-disk.svg', + href: '/dashboard/models' + }, + { + name: 'Analyses', + icon: '/icons/magnifying_glass_icon.svg', + href: '/dashboard/analyses' + }, + { + name: 'Personnel', + icon: '/icons/people.svg', + href: '/dashboard/personnel' + }, + { + name: 'Messages', + icon: '/icons/msg.svg', + href: '/dashboard/messages' + }, + { + name: 'Paramètres', + icon: '/icons/settings.svg', + href: '/dashboard/settings' + } +]; + +export function getPageIndex(pathname: string) { + if (pathname === '/dashboard') return 0; + if (pathname.startsWith('/dashboard/transactions')) return 1; + if (pathname.startsWith('/dashboard/models')) return 2; + if (pathname.startsWith('/dashboard/analyses')) return 3; + if (pathname.startsWith('/dashboard/personnel')) return 4; + if (pathname.startsWith('/dashboard/messages')) return 5; + if (pathname.startsWith('/dashboard/settings')) return 6; + return -1; // Not found +} \ No newline at end of file diff --git a/ping/frontend/src/lib/stores/auth.ts b/ping/frontend/src/lib/stores/auth.ts new file mode 100644 index 0000000..97acaf2 --- /dev/null +++ b/ping/frontend/src/lib/stores/auth.ts @@ -0,0 +1,66 @@ +import { error } from "@sveltejs/kit"; +import { get, writable } from "svelte/store"; + +export interface IUser { + id: string; + login: string; + displayName: string; + avatar: string; + isAdmin: boolean; +} + +export const user = writable(null); + +export async function getUser() { + const userVal = get(user); + if (userVal) { + return userVal; + } + return getUpdatedUser(); +} + +export async function getUpdatedUser() { + const token = localStorage.getItem("token"); + if (!token) { + localStorage.clear(); + window.location.replace("/login"); + throw new Error("Pas de token"); + } + try { + const userId = JSON.parse(atob(token.split(".")[1])).sub; + + const res = await authFetch(`/api/user/${userId}`); + if (!res.ok) { + throw error(res.status, "Erreur lors de la récupération de l'utilisateur"); + } + const data = await res.json(); + user.set({ ...data }); + return data; + } + catch (e) { + console.error("Erreur lors de la récupération de l'ID utilisateur depuis le token", e); + localStorage.clear(); + window.location.replace("/login"); + throw new Error("Token invalide " + e); + } +} + +// place files you want to import through the `$lib` alias in this folder. +export function authFetch(url: string | URL, options: RequestInit = {}) { + const token = localStorage.getItem("token"); + if (!token) { + localStorage.clear(); + window.location.replace("/login"); + throw new Error("Pas de token"); + } + + const mergedOptions: RequestInit = { + ...options, + headers: { + Authorization: `Bearer ${token}`, + ...(options.headers ?? {}) + } + }; + + return fetch(url, mergedOptions); +} \ No newline at end of file diff --git a/ping/frontend/src/lib/stores/toast.ts b/ping/frontend/src/lib/stores/toast.ts new file mode 100644 index 0000000..454461b --- /dev/null +++ b/ping/frontend/src/lib/stores/toast.ts @@ -0,0 +1,22 @@ +import { writable } from "svelte/store"; + +export interface Toast { + color?: string | undefined; + title?: string | undefined; + message?: string | undefined; +} + +export const toastList = writable([]); + +export function addToast(toast: Toast) { + toast ??= { color: "red", title: "Error", message: "An error occurred" }; + toast.color ??= "red"; + toast.title ??= "Error"; + toast.message ??= "An error occurred"; + + toastList.update((list) => [...list, toast]); + + setTimeout(() => { + toastList.update((list) => list.filter((t) => t !== toast)); + }, 5000); +} \ No newline at end of file -- cgit v1.2.3