Compare commits

..

17 Commits

Author SHA1 Message Date
s8613 5fe96a7697 Merge remote-tracking branch 'origin/main' into deploy_exxeta
# Conflicts:
#	project/frontend/src/main.tsx
#	project/frontend/src/socket.ts
2025-07-01 20:53:02 +02:00
EC2 Default User 7534eaa2e4 Fix socket connection URL path handling 2025-06-29 21:43:13 +00:00
s8613 4c3325b0ef socket.io fix 2025-06-29 22:13:24 +02:00
s8613 cda1baf7c0 socket.io fix 2025-06-29 21:52:32 +02:00
s8613 ac7f3ef790 / routing 2025-06-29 21:43:51 +02:00
s8613 4c05334283 routing ff 2025-06-29 21:29:39 +02:00
s8613 43d39a7caa fixed problems 2025-06-29 20:17:49 +02:00
s8613 bcb844b7ba Merge remote-tracking branch 'origin/main' into deploy_exxeta
# Conflicts:
#	project/docker-compose.yml
#	project/frontend/Dockerfile
2025-06-29 18:26:47 +02:00
s8613 01f866a8db fixed problems 2025-06-29 16:32:11 +02:00
s8613 cc49ec0063 fixed problems 2025-06-29 16:18:08 +02:00
s8613 047e204b82 fixed problems 2025-06-29 16:16:18 +02:00
s8613 c721140003 fixed problems 2025-06-29 16:07:09 +02:00
s8613 2a469eed6a fixed problems 2025-06-29 16:05:54 +02:00
s8613 0380edeb2a fixed problems 2025-06-29 16:04:20 +02:00
s8613 06a517af53 fixed problems 2025-06-29 15:33:52 +02:00
s8613 d5234ac2e7 fixed typo 2025-06-29 15:16:29 +02:00
s8613 c4fcfef4f0 Traefik configuration 2025-06-29 15:07:09 +02:00
15 changed files with 241 additions and 213 deletions

View File

@ -2,22 +2,32 @@ services:
frontend: frontend:
build: build:
context: frontend context: frontend
ports:
- 8080:80
environment: environment:
- API_HOST=http://localhost:5050 - API_HOST=http://ec2-18-193-8-169.eu-central-1.compute.amazonaws.com/ff-api
labels:
- "traefik.enable=true"
- "traefik.http.routers.ff-frontend.rule=PathPrefix(`/ff`)"
- "traefik.http.routers.ff-frontend.entrypoints=web"
- "traefik.http.services.ff-frontend.loadbalancer.server.port=80"
- "traefik.http.middlewares.ff-frontend-stripprefix.stripprefix.prefixes=/ff"
- "traefik.http.routers.ff-frontend.middlewares=ff-frontend-stripprefix"
networks:
- proxy
- app-network
db: db:
image: postgres:17-alpine image: postgres:17-alpine
env_file: env_file:
- .env - .env
# ports:
# - "5432:5432"
healthcheck: healthcheck:
test: ["CMD-SHELL", "pg_isready -U admin"] test: ["CMD-SHELL", "pg_isready -U admin"]
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 5 retries: 5
volumes:
- db_data:/var/lib/postgresql/data
networks:
- app-network
coordinator: coordinator:
build: build:
@ -35,8 +45,16 @@ services:
interval: 20s interval: 20s
timeout: 10s timeout: 10s
retries: 10 retries: 10
ports: labels:
- 5050:5000 - "traefik.enable=true"
- "traefik.http.routers.ff-api.rule=PathPrefix(`/ff-api`)"
- "traefik.http.routers.ff-api.entrypoints=web"
- "traefik.http.services.ff-api.loadbalancer.server.port=5000"
- "traefik.http.middlewares.ff-api-stripprefix.stripprefix.prefixes=/ff-api"
- "traefik.http.routers.ff-api.middlewares=ff-api-stripprefix"
networks:
- proxy
- app-network
ocr: ocr:
build: build:
@ -48,18 +66,18 @@ services:
- EXXETA_SERVICE_URL=http://exxeta:5000/extract - EXXETA_SERVICE_URL=http://exxeta:5000/extract
- SPACY_SERVICE_URL=http://spacy:5052/extract - SPACY_SERVICE_URL=http://spacy:5052/extract
- COORDINATOR_URL=http://coordinator:5000 - COORDINATOR_URL=http://coordinator:5000
ports: networks:
- 5051:5000 - app-network
spacy: spacy:
build: build:
context: backend/spacy-service context: backend/spacy-service
environment: environment:
- VALIDATE_SERVICE_URL=http://validate:5000/validate - VALIDATE_SERVICE_URL=http://validate:5000/validate
ports:
- 5052:5052
volumes: volumes:
- ./backend/spacy-service/spacy_training:/app/spacy_training - ./backend/spacy-service/spacy_training:/app/spacy_training
networks:
- app-network
exxeta: exxeta:
build: build:
@ -70,8 +88,8 @@ services:
environment: environment:
- VALIDATE_SERVICE_URL=http://validate:5000/validate - VALIDATE_SERVICE_URL=http://validate:5000/validate
- COORDINATOR_URL=http://coordinator:5000 - COORDINATOR_URL=http://coordinator:5000
ports: networks:
- 5053:5000 - app-network
validate: validate:
build: build:
@ -81,5 +99,14 @@ services:
- .env - .env
environment: environment:
- COORDINATOR_URL=http://coordinator:5000 - COORDINATOR_URL=http://coordinator:5000
ports: networks:
- 5054:5000 - app-network
networks:
proxy:
external: true
app-network:
driver: bridge
volumes:
db_data:

View File

@ -4,10 +4,8 @@ WORKDIR /usr/src/app
# install dependencies into temp directory # install dependencies into temp directory
# this will cache them and speed up future builds # this will cache them and speed up future builds
COPY package.json bun.lockb ./ COPY package.json bun.lockb ./
#RUN bun install --frozen-lockfile
RUN bun install RUN bun install
COPY . . COPY . .
# dummy environment variable for build - DONT CHANGE!!! # dummy environment variable for build - DONT CHANGE!!!

View File

@ -181,7 +181,7 @@ export function ConfigTable({ from, trainingRunning }: ConfigTableProps) {
} }
navigate({ navigate({
to: `/config-detail/$kpiId`, to: `/ff/config-detail/$kpiId`,
params: { kpiId: kennzahl.id.toString() }, params: { kpiId: kennzahl.id.toString() },
search: from ? { from } : undefined, search: from ? { from } : undefined,
}); });

View File

@ -170,7 +170,7 @@ export default function KennzahlenTable({
const handleNavigateToDetail = (settingName: string) => { const handleNavigateToDetail = (settingName: string) => {
navigate({ navigate({
to: "/extractedResult/$pitchBook/$kpi", to: "/ff/extractedResult/$pitchBook/$kpi",
params: { params: {
pitchBook: pdfId, pitchBook: pdfId,
kpi: settingName, kpi: settingName,

View File

@ -59,7 +59,7 @@ export function PitchBooksTable() {
const handleRowClick = (pitchBookId: number) => { const handleRowClick = (pitchBookId: number) => {
navigate({ navigate({
to: "/extractedResult/$pitchBook", to: "/ff/extractedResult/$pitchBook",
params: { pitchBook: pitchBookId.toString() }, params: { pitchBook: pitchBookId.toString() },
search: { from: "overview" }, search: { from: "overview" },
}); });

View File

@ -19,7 +19,7 @@ export default function UploadPage() {
const uploadFile = useCallback(async () => { const uploadFile = useCallback(async () => {
const formData = new FormData(); const formData = new FormData();
formData.append("file", files[0]); formData.append("file", files[0]);
const response = await fetch(`${API_HOST}/api/pitch_book`, { const response = await fetch(`${API_HOST}/api/pitch_book/`, {
method: "POST", method: "POST",
body: formData, body: formData,
}); });
@ -47,7 +47,7 @@ export default function UploadPage() {
setPageId(null); setPageId(null);
setLoadingState(null); setLoadingState(null);
navigate({ navigate({
to: "/extractedResult/$pitchBook", to: "/ff/extractedResult/$pitchBook",
params: { pitchBook: progress.id.toString() }, params: { pitchBook: progress.id.toString() },
}); });
} }
@ -109,7 +109,7 @@ export default function UploadPage() {
/> />
</Box> </Box>
<IconButton onClick={() => navigate({ to: "/config" })}> <IconButton onClick={() => navigate({ to: "/ff/config" })}>
<SettingsIcon fontSize="large" /> <SettingsIcon fontSize="large" />
</IconButton> </IconButton>
</Box> </Box>
@ -204,8 +204,8 @@ export default function UploadPage() {
backgroundColor: "#383838", backgroundColor: "#383838",
"&:hover": { backgroundColor: "#2e2e2e" }, "&:hover": { backgroundColor: "#2e2e2e" },
}} }}
onMouseEnter={() => router.preloadRoute({ to: "/pitchbooks" })} onMouseEnter={() => router.preloadRoute({ to: "/ff/pitchbooks" })}
onClick={() => navigate({ to: "/pitchbooks" })} onClick={() => navigate({ to: "/ff/pitchbooks" })}
> >
Alle Pitchbooks anzeigen Alle Pitchbooks anzeigen
</Button> </Button>

View File

@ -11,56 +11,58 @@
// Import Routes // Import Routes
import { Route as rootRoute } from './routes/__root' import { Route as rootRoute } from './routes/__root'
import { Route as PitchbooksImport } from './routes/pitchbooks' import { Route as FfIndexImport } from './routes/ff/index'
import { Route as ConfigAddImport } from './routes/config-add' import { Route as FfPitchbooksImport } from './routes/ff/pitchbooks'
import { Route as ConfigImport } from './routes/config' import { Route as FfConfigAddImport } from './routes/ff/config-add'
import { Route as IndexImport } from './routes/index' import { Route as FfConfigImport } from './routes/ff/config'
import { Route as ExtractedResultPitchBookImport } from './routes/extractedResult.$pitchBook' import { Route as FfExtractedResultPitchBookImport } from './routes/ff/extractedResult.$pitchBook'
import { Route as ConfigDetailKpiIdImport } from './routes/config-detail.$kpiId' import { Route as FfConfigDetailKpiIdImport } from './routes/ff/config-detail.$kpiId'
import { Route as ExtractedResultPitchBookKpiImport } from './routes/extractedResult_.$pitchBook.$kpi' import { Route as FfExtractedResultPitchBookKpiImport } from './routes/ff/extractedResult_.$pitchBook.$kpi'
// Create/Update Routes // Create/Update Routes
const PitchbooksRoute = PitchbooksImport.update({ const FfIndexRoute = FfIndexImport.update({
id: '/pitchbooks', id: '/ff/',
path: '/pitchbooks', path: '/ff/',
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
} as any) } as any)
const ConfigAddRoute = ConfigAddImport.update({ const FfPitchbooksRoute = FfPitchbooksImport.update({
id: '/config-add', id: '/ff/pitchbooks',
path: '/config-add', path: '/ff/pitchbooks',
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
} as any) } as any)
const ConfigRoute = ConfigImport.update({ const FfConfigAddRoute = FfConfigAddImport.update({
id: '/config', id: '/ff/config-add',
path: '/config', path: '/ff/config-add',
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
} as any) } as any)
const IndexRoute = IndexImport.update({ const FfConfigRoute = FfConfigImport.update({
id: '/', id: '/ff/config',
path: '/', path: '/ff/config',
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
} as any) } as any)
const ExtractedResultPitchBookRoute = ExtractedResultPitchBookImport.update({ const FfExtractedResultPitchBookRoute = FfExtractedResultPitchBookImport.update(
id: '/extractedResult/$pitchBook', {
path: '/extractedResult/$pitchBook', id: '/ff/extractedResult/$pitchBook',
path: '/ff/extractedResult/$pitchBook',
getParentRoute: () => rootRoute,
} as any,
)
const FfConfigDetailKpiIdRoute = FfConfigDetailKpiIdImport.update({
id: '/ff/config-detail/$kpiId',
path: '/ff/config-detail/$kpiId',
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
} as any) } as any)
const ConfigDetailKpiIdRoute = ConfigDetailKpiIdImport.update({ const FfExtractedResultPitchBookKpiRoute =
id: '/config-detail/$kpiId', FfExtractedResultPitchBookKpiImport.update({
path: '/config-detail/$kpiId', id: '/ff/extractedResult_/$pitchBook/$kpi',
getParentRoute: () => rootRoute, path: '/ff/extractedResult/$pitchBook/$kpi',
} as any)
const ExtractedResultPitchBookKpiRoute =
ExtractedResultPitchBookKpiImport.update({
id: '/extractedResult_/$pitchBook/$kpi',
path: '/extractedResult/$pitchBook/$kpi',
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
} as any) } as any)
@ -68,53 +70,53 @@ const ExtractedResultPitchBookKpiRoute =
declare module '@tanstack/react-router' { declare module '@tanstack/react-router' {
interface FileRoutesByPath { interface FileRoutesByPath {
'/': { '/ff/config': {
id: '/' id: '/ff/config'
path: '/' path: '/ff/config'
fullPath: '/' fullPath: '/ff/config'
preLoaderRoute: typeof IndexImport preLoaderRoute: typeof FfConfigImport
parentRoute: typeof rootRoute parentRoute: typeof rootRoute
} }
'/config': { '/ff/config-add': {
id: '/config' id: '/ff/config-add'
path: '/config' path: '/ff/config-add'
fullPath: '/config' fullPath: '/ff/config-add'
preLoaderRoute: typeof ConfigImport preLoaderRoute: typeof FfConfigAddImport
parentRoute: typeof rootRoute parentRoute: typeof rootRoute
} }
'/config-add': { '/ff/pitchbooks': {
id: '/config-add' id: '/ff/pitchbooks'
path: '/config-add' path: '/ff/pitchbooks'
fullPath: '/config-add' fullPath: '/ff/pitchbooks'
preLoaderRoute: typeof ConfigAddImport preLoaderRoute: typeof FfPitchbooksImport
parentRoute: typeof rootRoute parentRoute: typeof rootRoute
} }
'/pitchbooks': { '/ff/': {
id: '/pitchbooks' id: '/ff/'
path: '/pitchbooks' path: '/ff'
fullPath: '/pitchbooks' fullPath: '/ff'
preLoaderRoute: typeof PitchbooksImport preLoaderRoute: typeof FfIndexImport
parentRoute: typeof rootRoute parentRoute: typeof rootRoute
} }
'/config-detail/$kpiId': { '/ff/config-detail/$kpiId': {
id: '/config-detail/$kpiId' id: '/ff/config-detail/$kpiId'
path: '/config-detail/$kpiId' path: '/ff/config-detail/$kpiId'
fullPath: '/config-detail/$kpiId' fullPath: '/ff/config-detail/$kpiId'
preLoaderRoute: typeof ConfigDetailKpiIdImport preLoaderRoute: typeof FfConfigDetailKpiIdImport
parentRoute: typeof rootRoute parentRoute: typeof rootRoute
} }
'/extractedResult/$pitchBook': { '/ff/extractedResult/$pitchBook': {
id: '/extractedResult/$pitchBook' id: '/ff/extractedResult/$pitchBook'
path: '/extractedResult/$pitchBook' path: '/ff/extractedResult/$pitchBook'
fullPath: '/extractedResult/$pitchBook' fullPath: '/ff/extractedResult/$pitchBook'
preLoaderRoute: typeof ExtractedResultPitchBookImport preLoaderRoute: typeof FfExtractedResultPitchBookImport
parentRoute: typeof rootRoute parentRoute: typeof rootRoute
} }
'/extractedResult_/$pitchBook/$kpi': { '/ff/extractedResult_/$pitchBook/$kpi': {
id: '/extractedResult_/$pitchBook/$kpi' id: '/ff/extractedResult_/$pitchBook/$kpi'
path: '/extractedResult/$pitchBook/$kpi' path: '/ff/extractedResult/$pitchBook/$kpi'
fullPath: '/extractedResult/$pitchBook/$kpi' fullPath: '/ff/extractedResult/$pitchBook/$kpi'
preLoaderRoute: typeof ExtractedResultPitchBookKpiImport preLoaderRoute: typeof FfExtractedResultPitchBookKpiImport
parentRoute: typeof rootRoute parentRoute: typeof rootRoute
} }
} }
@ -123,85 +125,85 @@ declare module '@tanstack/react-router' {
// Create and export the route tree // Create and export the route tree
export interface FileRoutesByFullPath { export interface FileRoutesByFullPath {
'/': typeof IndexRoute '/ff/config': typeof FfConfigRoute
'/config': typeof ConfigRoute '/ff/config-add': typeof FfConfigAddRoute
'/config-add': typeof ConfigAddRoute '/ff/pitchbooks': typeof FfPitchbooksRoute
'/pitchbooks': typeof PitchbooksRoute '/ff': typeof FfIndexRoute
'/config-detail/$kpiId': typeof ConfigDetailKpiIdRoute '/ff/config-detail/$kpiId': typeof FfConfigDetailKpiIdRoute
'/extractedResult/$pitchBook': typeof ExtractedResultPitchBookRoute '/ff/extractedResult/$pitchBook': typeof FfExtractedResultPitchBookRoute
'/extractedResult/$pitchBook/$kpi': typeof ExtractedResultPitchBookKpiRoute '/ff/extractedResult/$pitchBook/$kpi': typeof FfExtractedResultPitchBookKpiRoute
} }
export interface FileRoutesByTo { export interface FileRoutesByTo {
'/': typeof IndexRoute '/ff/config': typeof FfConfigRoute
'/config': typeof ConfigRoute '/ff/config-add': typeof FfConfigAddRoute
'/config-add': typeof ConfigAddRoute '/ff/pitchbooks': typeof FfPitchbooksRoute
'/pitchbooks': typeof PitchbooksRoute '/ff': typeof FfIndexRoute
'/config-detail/$kpiId': typeof ConfigDetailKpiIdRoute '/ff/config-detail/$kpiId': typeof FfConfigDetailKpiIdRoute
'/extractedResult/$pitchBook': typeof ExtractedResultPitchBookRoute '/ff/extractedResult/$pitchBook': typeof FfExtractedResultPitchBookRoute
'/extractedResult/$pitchBook/$kpi': typeof ExtractedResultPitchBookKpiRoute '/ff/extractedResult/$pitchBook/$kpi': typeof FfExtractedResultPitchBookKpiRoute
} }
export interface FileRoutesById { export interface FileRoutesById {
__root__: typeof rootRoute __root__: typeof rootRoute
'/': typeof IndexRoute '/ff/config': typeof FfConfigRoute
'/config': typeof ConfigRoute '/ff/config-add': typeof FfConfigAddRoute
'/config-add': typeof ConfigAddRoute '/ff/pitchbooks': typeof FfPitchbooksRoute
'/pitchbooks': typeof PitchbooksRoute '/ff/': typeof FfIndexRoute
'/config-detail/$kpiId': typeof ConfigDetailKpiIdRoute '/ff/config-detail/$kpiId': typeof FfConfigDetailKpiIdRoute
'/extractedResult/$pitchBook': typeof ExtractedResultPitchBookRoute '/ff/extractedResult/$pitchBook': typeof FfExtractedResultPitchBookRoute
'/extractedResult_/$pitchBook/$kpi': typeof ExtractedResultPitchBookKpiRoute '/ff/extractedResult_/$pitchBook/$kpi': typeof FfExtractedResultPitchBookKpiRoute
} }
export interface FileRouteTypes { export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath fileRoutesByFullPath: FileRoutesByFullPath
fullPaths: fullPaths:
| '/' | '/ff/config'
| '/config' | '/ff/config-add'
| '/config-add' | '/ff/pitchbooks'
| '/pitchbooks' | '/ff'
| '/config-detail/$kpiId' | '/ff/config-detail/$kpiId'
| '/extractedResult/$pitchBook' | '/ff/extractedResult/$pitchBook'
| '/extractedResult/$pitchBook/$kpi' | '/ff/extractedResult/$pitchBook/$kpi'
fileRoutesByTo: FileRoutesByTo fileRoutesByTo: FileRoutesByTo
to: to:
| '/' | '/ff/config'
| '/config' | '/ff/config-add'
| '/config-add' | '/ff/pitchbooks'
| '/pitchbooks' | '/ff'
| '/config-detail/$kpiId' | '/ff/config-detail/$kpiId'
| '/extractedResult/$pitchBook' | '/ff/extractedResult/$pitchBook'
| '/extractedResult/$pitchBook/$kpi' | '/ff/extractedResult/$pitchBook/$kpi'
id: id:
| '__root__' | '__root__'
| '/' | '/ff/config'
| '/config' | '/ff/config-add'
| '/config-add' | '/ff/pitchbooks'
| '/pitchbooks' | '/ff/'
| '/config-detail/$kpiId' | '/ff/config-detail/$kpiId'
| '/extractedResult/$pitchBook' | '/ff/extractedResult/$pitchBook'
| '/extractedResult_/$pitchBook/$kpi' | '/ff/extractedResult_/$pitchBook/$kpi'
fileRoutesById: FileRoutesById fileRoutesById: FileRoutesById
} }
export interface RootRouteChildren { export interface RootRouteChildren {
IndexRoute: typeof IndexRoute FfConfigRoute: typeof FfConfigRoute
ConfigRoute: typeof ConfigRoute FfConfigAddRoute: typeof FfConfigAddRoute
ConfigAddRoute: typeof ConfigAddRoute FfPitchbooksRoute: typeof FfPitchbooksRoute
PitchbooksRoute: typeof PitchbooksRoute FfIndexRoute: typeof FfIndexRoute
ConfigDetailKpiIdRoute: typeof ConfigDetailKpiIdRoute FfConfigDetailKpiIdRoute: typeof FfConfigDetailKpiIdRoute
ExtractedResultPitchBookRoute: typeof ExtractedResultPitchBookRoute FfExtractedResultPitchBookRoute: typeof FfExtractedResultPitchBookRoute
ExtractedResultPitchBookKpiRoute: typeof ExtractedResultPitchBookKpiRoute FfExtractedResultPitchBookKpiRoute: typeof FfExtractedResultPitchBookKpiRoute
} }
const rootRouteChildren: RootRouteChildren = { const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute, FfConfigRoute: FfConfigRoute,
ConfigRoute: ConfigRoute, FfConfigAddRoute: FfConfigAddRoute,
ConfigAddRoute: ConfigAddRoute, FfPitchbooksRoute: FfPitchbooksRoute,
PitchbooksRoute: PitchbooksRoute, FfIndexRoute: FfIndexRoute,
ConfigDetailKpiIdRoute: ConfigDetailKpiIdRoute, FfConfigDetailKpiIdRoute: FfConfigDetailKpiIdRoute,
ExtractedResultPitchBookRoute: ExtractedResultPitchBookRoute, FfExtractedResultPitchBookRoute: FfExtractedResultPitchBookRoute,
ExtractedResultPitchBookKpiRoute: ExtractedResultPitchBookKpiRoute, FfExtractedResultPitchBookKpiRoute: FfExtractedResultPitchBookKpiRoute,
} }
export const routeTree = rootRoute export const routeTree = rootRoute
@ -214,35 +216,35 @@ export const routeTree = rootRoute
"__root__": { "__root__": {
"filePath": "__root.tsx", "filePath": "__root.tsx",
"children": [ "children": [
"/", "/ff/config",
"/config", "/ff/config-add",
"/config-add", "/ff/pitchbooks",
"/pitchbooks", "/ff/",
"/config-detail/$kpiId", "/ff/config-detail/$kpiId",
"/extractedResult/$pitchBook", "/ff/extractedResult/$pitchBook",
"/extractedResult_/$pitchBook/$kpi" "/ff/extractedResult_/$pitchBook/$kpi"
] ]
}, },
"/": { "/ff/config": {
"filePath": "index.tsx" "filePath": "ff/config.tsx"
}, },
"/config": { "/ff/config-add": {
"filePath": "config.tsx" "filePath": "ff/config-add.tsx"
}, },
"/config-add": { "/ff/pitchbooks": {
"filePath": "config-add.tsx" "filePath": "ff/pitchbooks.tsx"
}, },
"/pitchbooks": { "/ff/": {
"filePath": "pitchbooks.tsx" "filePath": "ff/index.tsx"
}, },
"/config-detail/$kpiId": { "/ff/config-detail/$kpiId": {
"filePath": "config-detail.$kpiId.tsx" "filePath": "ff/config-detail.$kpiId.tsx"
}, },
"/extractedResult/$pitchBook": { "/ff/extractedResult/$pitchBook": {
"filePath": "extractedResult.$pitchBook.tsx" "filePath": "ff/extractedResult.$pitchBook.tsx"
}, },
"/extractedResult_/$pitchBook/$kpi": { "/ff/extractedResult_/$pitchBook/$kpi": {
"filePath": "extractedResult_.$pitchBook.$kpi.tsx" "filePath": "ff/extractedResult_.$pitchBook.$kpi.tsx"
} }
} }
} }

View File

@ -1,12 +1,12 @@
import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { Box, Typography, IconButton } from "@mui/material"; import { Box, Typography, IconButton } from "@mui/material";
import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import { KPIForm } from "../components/KPIForm"; import { KPIForm } from "../../components/KPIForm";
import type { Kennzahl } from "../types/kpi"; import type { Kennzahl } from "../../types/kpi";
import { API_HOST } from "../util/api"; import { API_HOST } from "../../util/api";
export const Route = createFileRoute("/config-add")({ export const Route = createFileRoute("/ff/config-add")({
component: ConfigAddPage, component: ConfigAddPage,
validateSearch: (search: Record<string, unknown>): { from?: string } => { validateSearch: (search: Record<string, unknown>): { from?: string } => {
return { return {
@ -21,7 +21,7 @@ function ConfigAddPage() {
const handleBack = () => { const handleBack = () => {
navigate({ navigate({
to: "/config", to: "/ff/config",
search: from ? { from } : undefined, search: from ? { from } : undefined,
}); });
}; };
@ -54,7 +54,7 @@ function ConfigAddPage() {
} }
navigate({ navigate({
to: "/config", to: "/ff/config",
search: { success: "true", ...(from ? { from } : {}) }, search: { success: "true", ...(from ? { from } : {}) },
}); });
@ -67,7 +67,7 @@ function ConfigAddPage() {
const handleCancel = () => { const handleCancel = () => {
navigate({ navigate({
to: "/config", to: "/ff/config",
search: from ? { from } : undefined, search: from ? { from } : undefined,
}); });
}; };

View File

@ -4,12 +4,12 @@ import {
} from "@mui/material"; } from "@mui/material";
import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import type { Kennzahl } from "../types/kpi"; import type { Kennzahl } from "../../types/kpi";
import { KPIForm } from "../components/KPIForm"; import { KPIForm } from "../../components/KPIForm";
import { typeDisplayMapping } from "../types/kpi"; import { typeDisplayMapping } from "../../types/kpi";
import { API_HOST } from "../util/api"; import { API_HOST } from "../../util/api";
export const Route = createFileRoute("/config-detail/$kpiId")({ export const Route = createFileRoute("/ff/config-detail/$kpiId")({
component: KPIDetailPage, component: KPIDetailPage,
validateSearch: (search: Record<string, unknown>): { from?: string } => { validateSearch: (search: Record<string, unknown>): { from?: string } => {
return { return {
@ -29,7 +29,7 @@ function KPIDetailPage() {
const handleBack = () => { const handleBack = () => {
navigate({ navigate({
to: "/config", to: "/ff/config",
search: from ? { from } : undefined search: from ? { from } : undefined
}); });
}; };
@ -121,7 +121,7 @@ function KPIDetailPage() {
</Typography> </Typography>
<Button <Button
variant="contained" variant="contained"
onClick={() => navigate({ to: "/config" })} onClick={() => navigate({ to: "/ff/config" })}
sx={{ sx={{
backgroundColor: "#383838", backgroundColor: "#383838",
"&:hover": { backgroundColor: "#2e2e2e" }, "&:hover": { backgroundColor: "#2e2e2e" },

View File

@ -2,8 +2,8 @@ import { createFileRoute } from "@tanstack/react-router";
import { Box, Button, IconButton, Typography } from "@mui/material"; import { Box, Button, IconButton, Typography } from "@mui/material";
import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import { useNavigate } from "@tanstack/react-router"; import { useNavigate } from "@tanstack/react-router";
import { ConfigTable } from "../components/ConfigTable"; import { ConfigTable } from "../../components/ConfigTable";
import { API_HOST } from "../util/api"; import { API_HOST } from "../../util/api";
import Snackbar from "@mui/material/Snackbar"; import Snackbar from "@mui/material/Snackbar";
import MuiAlert from "@mui/material/Alert"; import MuiAlert from "@mui/material/Alert";
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
@ -14,7 +14,7 @@ import Tooltip from "@mui/material/Tooltip";
export const Route = createFileRoute("/config")({ export const Route = createFileRoute("/ff/config")({
component: ConfigPage, component: ConfigPage,
validateSearch: (search: Record<string, unknown>): { from?: string; success?: string } => { validateSearch: (search: Record<string, unknown>): { from?: string; success?: string } => {
return { return {
@ -58,7 +58,7 @@ function ConfigPage() {
if (success === "true") { if (success === "true") {
setTimeout(() => { setTimeout(() => {
navigate({ navigate({
to: "/config", to: "/ff/config",
search: from ? { from } : undefined, search: from ? { from } : undefined,
replace: true replace: true
}); });
@ -87,16 +87,16 @@ function ConfigPage() {
const handleAddNewKPI = () => { const handleAddNewKPI = () => {
navigate({ navigate({
to: "/config-add", to: "/ff/config-add",
search: from ? { from } : undefined search: from ? { from } : undefined
}); });
}; };
const handleBack = () => { const handleBack = () => {
if (from === "pitchbooks") { if (from === "pitchbooks") {
navigate({ to: "/pitchbooks" }); navigate({ to: "/ff/pitchbooks" });
} else { } else {
navigate({ to: "/" }); navigate({ to: "/ff" });
} }
}; };

View File

@ -4,12 +4,12 @@ import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import { useSuspenseQuery } from "@tanstack/react-query"; import { useSuspenseQuery } from "@tanstack/react-query";
import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { useCallback, useState, useMemo } from "react"; import { useCallback, useState, useMemo } from "react";
import KennzahlenTable from "../components/KennzahlenTable"; import KennzahlenTable from "../../components/KennzahlenTable";
import PDFViewer from "../components/pdfViewer"; import PDFViewer from "../../components/pdfViewer";
import { kpiQueryOptions, settingsQueryOptions } from "../util/query"; import { kpiQueryOptions, settingsQueryOptions } from "../../util/query";
import { redirect } from "@tanstack/react-router"; import { redirect } from "@tanstack/react-router";
export const Route = createFileRoute("/extractedResult/$pitchBook")({ export const Route = createFileRoute("/ff/extractedResult/$pitchBook")({
component: ExtractedResultsPage, component: ExtractedResultsPage,
validateSearch: (search: Record<string, unknown>): { from?: string } => { validateSearch: (search: Record<string, unknown>): { from?: string } => {
return { return {
@ -23,7 +23,7 @@ export const Route = createFileRoute("/extractedResult/$pitchBook")({
]); ]);
if (results[0].status === "rejected") { if (results[0].status === "rejected") {
throw redirect({ throw redirect({
to: "/" to: "/ff"
}); });
} }
return results; return results;
@ -143,7 +143,7 @@ function ExtractedResultsPage() {
<Box display="flex" alignItems="center" gap={3}> <Box display="flex" alignItems="center" gap={3}>
{from === "overview" && ( {from === "overview" && (
<IconButton <IconButton
onClick={() => navigate({ to: "/pitchbooks" })} onClick={() => navigate({ to: "/ff/pitchbooks" })}
sx={{ ml: -1 }} sx={{ ml: -1 }}
> >
<ArrowBackIcon fontSize="large" sx={{ color: '#383838' }}/> <ArrowBackIcon fontSize="large" sx={{ color: '#383838' }}/>
@ -259,7 +259,7 @@ function ExtractedResultsPage() {
<Button <Button
variant="contained" variant="contained"
sx={{ backgroundColor: "#383838" }} sx={{ backgroundColor: "#383838" }}
onClick={() => navigate({ to: "/" })} onClick={() => navigate({ to: "/ff" })}
> >
Neues Pitchbook hochladen Neues Pitchbook hochladen
</Button> </Button>

View File

@ -28,12 +28,12 @@ import {
} from "@tanstack/react-query"; } from "@tanstack/react-query";
import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { useEffect, useState, type KeyboardEvent } from "react"; import { useEffect, useState, type KeyboardEvent } from "react";
import PDFViewer from "../components/pdfViewer"; import PDFViewer from "../../components/pdfViewer";
import { fetchPutKPI } from "../util/api"; import { fetchPutKPI } from "../../util/api";
import { kpiQueryOptions } from "../util/query"; import { kpiQueryOptions } from "../../util/query";
import { redirect } from "@tanstack/react-router"; import { redirect } from "@tanstack/react-router";
export const Route = createFileRoute("/extractedResult_/$pitchBook/$kpi")({ export const Route = createFileRoute("/ff/extractedResult_/$pitchBook/$kpi")({
component: ExtractedResultsPage, component: ExtractedResultsPage,
validateSearch: (search: Record<string, unknown>) => { validateSearch: (search: Record<string, unknown>) => {
return { return {
@ -45,7 +45,7 @@ export const Route = createFileRoute("/extractedResult_/$pitchBook/$kpi")({
return await queryClient.ensureQueryData(kpiQueryOptions(pitchBook)); return await queryClient.ensureQueryData(kpiQueryOptions(pitchBook));
} catch (err) { } catch (err) {
throw redirect({ throw redirect({
to: "/" to: "/ff"
}); });
} }
}, },
@ -151,7 +151,7 @@ function ExtractedResultsPage() {
queryKey: ["pitchBookKPI", pitchBook], queryKey: ["pitchBookKPI", pitchBook],
}); });
navigate({ navigate({
to: "/extractedResult/$pitchBook", to: "/ff/extractedResult/$pitchBook",
params: { pitchBook }, params: { pitchBook },
search: from ? { from } : undefined search: from ? { from } : undefined
}); });
@ -216,7 +216,7 @@ function ExtractedResultsPage() {
setShowConfirmDialog(true); setShowConfirmDialog(true);
} else { } else {
navigate({ navigate({
to: "/extractedResult/$pitchBook", to: "/ff/extractedResult/$pitchBook",
params: { pitchBook }, params: { pitchBook },
search: from ? { from } : undefined search: from ? { from } : undefined
}); });
@ -226,7 +226,7 @@ function ExtractedResultsPage() {
const handleConfirmDiscard = () => { const handleConfirmDiscard = () => {
setShowConfirmDialog(false); setShowConfirmDialog(false);
navigate({ navigate({
to: "/extractedResult/$pitchBook", to: "/ff/extractedResult/$pitchBook",
params: { pitchBook }, params: { pitchBook },
search: from ? { from } : undefined search: from ? { from } : undefined
}); });

View File

@ -1,8 +1,8 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import UploadPage from "../components/UploadPage"; import UploadPage from "../../components/UploadPage";
export const Route = createFileRoute("/")({ export const Route = createFileRoute("/ff/")({
component: App, component: App,
}); });

View File

@ -3,10 +3,10 @@ import { Box, Typography, IconButton } from "@mui/material";
import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import SettingsIcon from "@mui/icons-material/Settings"; import SettingsIcon from "@mui/icons-material/Settings";
import { useNavigate } from "@tanstack/react-router"; import { useNavigate } from "@tanstack/react-router";
import { PitchBooksTable } from "../components/PitchBooksTable"; import { PitchBooksTable } from "../../components/PitchBooksTable";
import { pitchBooksQueryOptions } from "../util/query"; import { pitchBooksQueryOptions } from "../../util/query";
export const Route = createFileRoute("/pitchbooks")({ export const Route = createFileRoute("/ff/pitchbooks")({
component: PitchBooksPage, component: PitchBooksPage,
loader: ({ context: { queryClient } }) => loader: ({ context: { queryClient } }) =>
queryClient.ensureQueryData(pitchBooksQueryOptions()), queryClient.ensureQueryData(pitchBooksQueryOptions()),
@ -35,7 +35,7 @@ function PitchBooksPage() {
mb={4} mb={4}
> >
<Box display="flex" alignItems="center"> <Box display="flex" alignItems="center">
<IconButton onClick={() => navigate({ to: "/" })}> <IconButton onClick={() => navigate({ to: "/ff" })}>
<ArrowBackIcon fontSize="large" sx={{ color: '#383838' }}/> <ArrowBackIcon fontSize="large" sx={{ color: '#383838' }}/>
</IconButton> </IconButton>
<Typography variant="h5" fontWeight="bold" ml={3}> <Typography variant="h5" fontWeight="bold" ml={3}>
@ -44,7 +44,7 @@ function PitchBooksPage() {
</Box> </Box>
<IconButton <IconButton
onClick={() => navigate({ onClick={() => navigate({
to: "/config", to: "/ff/config",
search: { from: "pitchbooks" } search: { from: "pitchbooks" }
})} })}
> >

View File

@ -4,6 +4,7 @@ import { defineConfig } from "vite";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
base: "/ff/",
plugins: [TanStackRouterVite({ autoCodeSplitting: true }), viteReact()], plugins: [TanStackRouterVite({ autoCodeSplitting: true }), viteReact()],
build: { build: {
chunkSizeWarningLimit: 1000, // default ist 500 chunkSizeWarningLimit: 1000, // default ist 500