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/routes/+layout.svelte | 9 + ping/frontend/src/routes/+page.svelte | 59 +++ ping/frontend/src/routes/dashboard/+layout.svelte | 44 ++ ping/frontend/src/routes/dashboard/+page.svelte | 81 +++ .../src/routes/dashboard/analyses/+page.svelte | 409 +++++++++++++++ .../src/routes/dashboard/messages/+page.svelte | 403 +++++++++++++++ .../src/routes/dashboard/models/+page.svelte | 568 +++++++++++++++++++++ .../src/routes/dashboard/personnel/+page.svelte | 290 +++++++++++ .../src/routes/dashboard/settings/+page.svelte | 452 ++++++++++++++++ .../src/routes/dashboard/transactions/+page.svelte | 360 +++++++++++++ ping/frontend/src/routes/login/+page.svelte | 149 ++++++ .../frontend/src/routes/stocksapi/chart/+server.ts | 21 + .../src/routes/stocksapi/insights/+server.ts | 19 + .../frontend/src/routes/stocksapi/quote/+server.ts | 18 + .../src/routes/stocksapi/search/+server.ts | 18 + .../routes/stocksapi/trendingSymbols/+server.ts | 16 + 16 files changed, 2916 insertions(+) create mode 100644 ping/frontend/src/routes/+layout.svelte create mode 100644 ping/frontend/src/routes/+page.svelte create mode 100644 ping/frontend/src/routes/dashboard/+layout.svelte create mode 100644 ping/frontend/src/routes/dashboard/+page.svelte create mode 100644 ping/frontend/src/routes/dashboard/analyses/+page.svelte create mode 100644 ping/frontend/src/routes/dashboard/messages/+page.svelte create mode 100644 ping/frontend/src/routes/dashboard/models/+page.svelte create mode 100644 ping/frontend/src/routes/dashboard/personnel/+page.svelte create mode 100644 ping/frontend/src/routes/dashboard/settings/+page.svelte create mode 100644 ping/frontend/src/routes/dashboard/transactions/+page.svelte create mode 100644 ping/frontend/src/routes/login/+page.svelte create mode 100644 ping/frontend/src/routes/stocksapi/chart/+server.ts create mode 100644 ping/frontend/src/routes/stocksapi/insights/+server.ts create mode 100644 ping/frontend/src/routes/stocksapi/quote/+server.ts create mode 100644 ping/frontend/src/routes/stocksapi/search/+server.ts create mode 100644 ping/frontend/src/routes/stocksapi/trendingSymbols/+server.ts (limited to 'ping/frontend/src/routes') diff --git a/ping/frontend/src/routes/+layout.svelte b/ping/frontend/src/routes/+layout.svelte new file mode 100644 index 0000000..ba995cc --- /dev/null +++ b/ping/frontend/src/routes/+layout.svelte @@ -0,0 +1,9 @@ + + +{@render children()} + diff --git a/ping/frontend/src/routes/+page.svelte b/ping/frontend/src/routes/+page.svelte new file mode 100644 index 0000000..7088945 --- /dev/null +++ b/ping/frontend/src/routes/+page.svelte @@ -0,0 +1,59 @@ + + + + + {#snippet rightComponent()} + + {/snippet} + +
+
+
+
+

Investissons plus mieux et plus vert

+
    +
  • Investissez facilement
  • +
  • Analysez les risques et les performances
  • +
  • Soulagez votre éco-conscience
  • +
+
+
+ + diff --git a/ping/frontend/src/routes/dashboard/+layout.svelte b/ping/frontend/src/routes/dashboard/+layout.svelte new file mode 100644 index 0000000..a2f7efe --- /dev/null +++ b/ping/frontend/src/routes/dashboard/+layout.svelte @@ -0,0 +1,44 @@ + + + + + {#snippet rightComponent()} +
+
+ +
+ +
+ {/snippet} +
+ +
{@render children()}
+ + diff --git a/ping/frontend/src/routes/dashboard/+page.svelte b/ping/frontend/src/routes/dashboard/+page.svelte new file mode 100644 index 0000000..c38e281 --- /dev/null +++ b/ping/frontend/src/routes/dashboard/+page.svelte @@ -0,0 +1,81 @@ + + +
+ +
+
+ +
+ + +
+ +
+ +
+
+ + diff --git a/ping/frontend/src/routes/dashboard/analyses/+page.svelte b/ping/frontend/src/routes/dashboard/analyses/+page.svelte new file mode 100644 index 0000000..1a8ed47 --- /dev/null +++ b/ping/frontend/src/routes/dashboard/analyses/+page.svelte @@ -0,0 +1,409 @@ + + +
+
+

Analyses des Transactions

+
+ + +
+
+ + + + {#if analysisData.thresholdAlerts} +
+ {#if analysisData.thresholdAlerts.dailySpending} +
+ ⚠️ Dépenses quotidiennes élevées ({(Math.abs(analysisData.totalAmount) / selectedPeriod).toFixed(0)}€/jour) +
+ {/if} + {#if analysisData.thresholdAlerts.co2Impact} +
+ 🌍 Impact CO2 élevé ({analysisData.totalCO2}g) +
+ {/if} + {#if analysisData.thresholdAlerts.profitTarget} +
+ 🎯 Objectif de profit atteint ({analysisData.totalAmount.toFixed(0)}€) +
+ {/if} +
+ {/if} + +
+
+

Transactions dans le temps

+ {#if analysisData.chartData?.length > 0} + + {:else} +

Aucune donnée

+ {/if} +
+ +
+

Top destinataires

+
+ {#each (analysisData.recipientChartData || []).slice(0, 5) as recipient} +
+ {recipient.x} +
+ {#if analysisData.recipientChartData?.length > 0} + {@const maxValue = Math.max(...analysisData.recipientChartData.map(r => r.y))} +
+ {:else} +
+ {/if} + {recipient.y.toFixed(0)}€ +
+
+ {/each} +
+
+ +
+

Répartition des transactions

+
+
+ Achats: + + {(analysisData.filteredTransactions || []).filter((t: Transaction) => t.type === 'buy').length} + +
+
+ Ventes: + + {(analysisData.filteredTransactions || []).filter((t: Transaction) => t.type === 'sell').length} + +
+
+ Volume total: + + {Math.abs(analysisData.totalAmount || 0).toFixed(0)}€ + +
+
+
+ +
+

Métriques CO2

+
+
+ Impact total: + + {analysisData.totalCO2 || 0}g CO2 + +
+
+ Par transaction: + + {(analysisData.filteredTransactions?.length ? analysisData.totalCO2 / analysisData.filteredTransactions.length : 0).toFixed(1)}g + +
+
+
+
+
+ + diff --git a/ping/frontend/src/routes/dashboard/messages/+page.svelte b/ping/frontend/src/routes/dashboard/messages/+page.svelte new file mode 100644 index 0000000..52869e4 --- /dev/null +++ b/ping/frontend/src/routes/dashboard/messages/+page.svelte @@ -0,0 +1,403 @@ + + +
+
+ +
+

Messages

+ +
+ +
+ +
+

Boîte de réception

+
+ {#each messages as message} +
selectMessage(message)} + > +
+ {message.sender} + {message.date.toLocaleDateString()} +
+
{message.subject}
+
{message.content.substring(0, 80)}...
+ {#if message.unread} +
+ {/if} +
+ {/each} +
+
+ + +
+ {#if selectedMessage} +
+

{selectedMessage.subject}

+
+ +
+
+
+ De: {selectedMessage.sender} + Date: {selectedMessage.date.toLocaleDateString()} +
+
+ {selectedMessage.content} +
+ + +
+

Répondre

+ + +
+ {:else} +
+

Sélectionnez un message

+

Choisissez un message dans la liste pour le lire

+
+ {/if} +
+
+
+
+ + diff --git a/ping/frontend/src/routes/dashboard/models/+page.svelte b/ping/frontend/src/routes/dashboard/models/+page.svelte new file mode 100644 index 0000000..3be6f00 --- /dev/null +++ b/ping/frontend/src/routes/dashboard/models/+page.svelte @@ -0,0 +1,568 @@ + + +
+
+
+

Modèles actifs

+
+ {#each models as m, i} +
+
+ {m.name}
+ {m.id} +
+
+
+ Eco score + {69} % +
+
+ Efficacité + {69} % +
+
+ + +
+ {/each} +
+
+ +
+
+
+ {#if modelToEdit !== null} +

Modifier un modèle

+ {:else} +

Nouveau modèle

+ {/if} + +
+
+ + +
+ {#if modelToEdit !== null} + + {:else if currentUser} + + {:else} + Chargement en cours... + {/if} + +
+
+ +
+
+ Sources de données + +
+ + {#each sources as source, index} +
+ + +
+ + +
+
+ {/each} +
+
+
+
+
+ + diff --git a/ping/frontend/src/routes/dashboard/personnel/+page.svelte b/ping/frontend/src/routes/dashboard/personnel/+page.svelte new file mode 100644 index 0000000..a1722c1 --- /dev/null +++ b/ping/frontend/src/routes/dashboard/personnel/+page.svelte @@ -0,0 +1,290 @@ + + +{#if user} +
+
+
+

Mon compte

+ +

Nom: {user.displayName}

+

Login: {user.login}

+

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

+

Id: {user.id}

+
+
+

Modifier

+ Laisser vide pour ne pas modifier
+ {#if user.isAdmin} +

Vous pouvez modifier les informations de n'importe quel utilisateur.

+ {:else} +

Vous ne pouvez modifier que vos propres informations.

+ {/if} +

+
+ {#if user.isAdmin} + + + {/if} + + + + + + + +
+
+
+ + {#if user.isAdmin} +
+
+

Créer un nouvel utilisateur

+
+ + + + + + + + + +
+
+
+

Liste des utilisateurs

+
+ {#each allUsers as u} + { + idValue = u.id; + urlValue = u.avatar || ''; + nameValue = u.displayName || ''; + }} + onDelete={() => { + authFetch(`/api/user/${u.id}`, { + method: 'DELETE' + }) + .then(async (res) => { + if (!res.ok) { + addToast({ + title: 'Erreur', + message: "Impossible de supprimer l'utilisateur." + }); + throw new Error("Erreur lors de la suppression de l'utilisateur"); + } + allUsers = allUsers.filter((user) => user.id !== u.id); + addToast({ + title: 'Succès', + message: 'Utilisateur supprimé avec succès.', + color: 'green' + }); + }) + .catch(() => { + addToast({ + title: 'Erreur', + message: "Impossible de supprimer l'utilisateur." + }); + }); + }} + /> + {/each} +
+
+
+ {/if} +
+{:else} +

Chargement des informations utilisateur...

+{/if} + + diff --git a/ping/frontend/src/routes/dashboard/settings/+page.svelte b/ping/frontend/src/routes/dashboard/settings/+page.svelte new file mode 100644 index 0000000..99c5d8f --- /dev/null +++ b/ping/frontend/src/routes/dashboard/settings/+page.svelte @@ -0,0 +1,452 @@ + + +
+
+
+

Paramètres

+
+ +
+
+

👤 Profil utilisateur

+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+

🔔 Notifications

+
+
+ + + + + +
+ +
+
+ +
+

🔒 Sécurité

+
+
+ +
+
+ + +
+
+ +
+ +
+ +
+

Changer le mot de passe

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ +
+

🎨 Affichage

+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+

📊 Gestion des données

+
+
+
+

Exporter mes données

+

Téléchargez toutes vos données personnelles dans un fichier JSON

+
+ +
+
+
+

Supprimer mon compte

+

Supprimez définitivement votre compte et toutes vos données

+
+ +
+
+
+
+
+
+ + diff --git a/ping/frontend/src/routes/dashboard/transactions/+page.svelte b/ping/frontend/src/routes/dashboard/transactions/+page.svelte new file mode 100644 index 0000000..86f9292 --- /dev/null +++ b/ping/frontend/src/routes/dashboard/transactions/+page.svelte @@ -0,0 +1,360 @@ + + +
+
+
+

Transactions

+ +
+ +
+
+ Trier +
+ + +
+
+
+ + +
+
+ +
+ {#each visibleTransactions as transaction} +
+
+
+

{transaction.label}

+

+ {transaction.receiverIban} • {transaction.receiverLabel} +

+
+
+
+ CO2 + {transaction.eco_score} +
+
+ {transaction.currency} + {transaction.amount} +
+
+ +
+
+ {/each} +
+
+
+ + + diff --git a/ping/frontend/src/routes/login/+page.svelte b/ping/frontend/src/routes/login/+page.svelte new file mode 100644 index 0000000..0d66f8d --- /dev/null +++ b/ping/frontend/src/routes/login/+page.svelte @@ -0,0 +1,149 @@ + + +
+
+

Connectez-vous

+
+ + + + + +
+
+
+ + + diff --git a/ping/frontend/src/routes/stocksapi/chart/+server.ts b/ping/frontend/src/routes/stocksapi/chart/+server.ts new file mode 100644 index 0000000..3271e83 --- /dev/null +++ b/ping/frontend/src/routes/stocksapi/chart/+server.ts @@ -0,0 +1,21 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import yahooFinance from 'yahoo-finance2'; + +/** + * Example request : GET /stocksapi/chart?query=AAPL&startDate=2025-01-01& + */ +export const GET: RequestHandler = async ({ request }) => { + const sp = new URL(request.url).searchParams; + const query = sp.get('query') || 'AAPL'; + const startDate = sp.get('startDate') || '2025-01-01'; + const endDate = sp.get('endDate') || new Date().toISOString().split('T')[0]; + const interval = sp.get('interval') || '1d'; + + const data = await yahooFinance.chart(query, { period1: startDate, period2: endDate, interval: interval }); + return new Response(JSON.stringify(data), { + headers: { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-cache', + }, + }); +}; \ No newline at end of file diff --git a/ping/frontend/src/routes/stocksapi/insights/+server.ts b/ping/frontend/src/routes/stocksapi/insights/+server.ts new file mode 100644 index 0000000..6be76e9 --- /dev/null +++ b/ping/frontend/src/routes/stocksapi/insights/+server.ts @@ -0,0 +1,19 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import yahooFinance from 'yahoo-finance2'; + +/** + * Example request : GET /stocksapi/insights?query=AAPL + */ +export const GET: RequestHandler = async ({ request }) => { + const sp = new URL(request.url).searchParams; + const query = sp.get('query') || 'AAPL'; + + const queryOptions = { lang: 'en-US', reportsCount: 2, region: 'US' }; + const data = await yahooFinance.insights(query, queryOptions); + return new Response(JSON.stringify(data), { + headers: { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-cache', + }, + }); +}; \ No newline at end of file diff --git a/ping/frontend/src/routes/stocksapi/quote/+server.ts b/ping/frontend/src/routes/stocksapi/quote/+server.ts new file mode 100644 index 0000000..96619fc --- /dev/null +++ b/ping/frontend/src/routes/stocksapi/quote/+server.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import yahooFinance from 'yahoo-finance2'; + +/** + * Example request : GET /stocksapi/quote?query=AAPL + */ +export const GET: RequestHandler = async ({ request }) => { + const sp = new URL(request.url).searchParams; + const query = sp.get('query') || 'AAPL'; + + const data = await yahooFinance.quote(query); + return new Response(JSON.stringify(data), { + headers: { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-cache', + }, + }); +}; \ No newline at end of file diff --git a/ping/frontend/src/routes/stocksapi/search/+server.ts b/ping/frontend/src/routes/stocksapi/search/+server.ts new file mode 100644 index 0000000..e58fc6b --- /dev/null +++ b/ping/frontend/src/routes/stocksapi/search/+server.ts @@ -0,0 +1,18 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import yahooFinance from 'yahoo-finance2'; + +/** + * Example request : GET /stocksapi/search?query=AAPL + */ +export const GET: RequestHandler = async ({ request }) => { + const sp = new URL(request.url).searchParams; + const query = sp.get('query') || 'AAPL'; + + const data = await yahooFinance.search(query, { region: 'US' }) + return new Response(JSON.stringify(data), { + headers: { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-cache', + }, + }); +}; \ No newline at end of file diff --git a/ping/frontend/src/routes/stocksapi/trendingSymbols/+server.ts b/ping/frontend/src/routes/stocksapi/trendingSymbols/+server.ts new file mode 100644 index 0000000..3dac574 --- /dev/null +++ b/ping/frontend/src/routes/stocksapi/trendingSymbols/+server.ts @@ -0,0 +1,16 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import yahooFinance from 'yahoo-finance2'; + +/** + * Example request : GET /stocksapi/trendingSymbols + */ +export const GET: RequestHandler = async () => { + const queryOptions = { count: 5, lang: 'en-US' }; + const data = await yahooFinance.trendingSymbols('US', queryOptions); + return new Response(JSON.stringify(data), { + headers: { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-cache', + }, + }); +}; \ No newline at end of file -- cgit v1.2.3