mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-08 00:45:41 +00:00
Merge pull request #2 from Tria-plc/feat/add_auth_integration
Feat/add auth integration
This commit is contained in:
@@ -6,5 +6,5 @@ export default defineConfig({
|
|||||||
server: {
|
server: {
|
||||||
port: 5183,
|
port: 5183,
|
||||||
host: "0.0.0.0",
|
host: "0.0.0.0",
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
1
apps/edr-freight-web/portal/index.css
Normal file
1
apps/edr-freight-web/portal/index.css
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@import "tailwindcss";
|
||||||
@@ -8,5 +8,6 @@
|
|||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<script type="module" src="/src/main.tsx"></script>
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
|
<link rel="stylesheet" href="/index.css" />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -12,10 +12,10 @@
|
|||||||
"type-check": "tsc --noEmit"
|
"type-check": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tria-plc/iamui-common": "1.0.3",
|
|
||||||
"@edr/types": "workspace:*",
|
"@edr/types": "workspace:*",
|
||||||
"@edr/ui-common": "workspace:*",
|
"@edr/ui-common": "workspace:*",
|
||||||
"@tanstack/react-query": "^5.59.0",
|
"@tanstack/react-query": "^5.59.0",
|
||||||
|
"@tria-plc/iamui-common": "1.1.1",
|
||||||
"axios": "^1.7.7",
|
"axios": "^1.7.7",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
@@ -26,13 +26,14 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@edr/eslint-config": "workspace:*",
|
"@edr/eslint-config": "workspace:*",
|
||||||
"@edr/tsconfig": "workspace:*",
|
"@edr/tsconfig": "workspace:*",
|
||||||
|
"@tailwindcss/vite": "^4.3.0",
|
||||||
"@types/react": "^18.3.11",
|
"@types/react": "^18.3.11",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
"@vitejs/plugin-react": "^4.3.2",
|
"@vitejs/plugin-react": "^4.3.2",
|
||||||
"autoprefixer": "^10.4.20",
|
"autoprefixer": "^10.4.20",
|
||||||
"jsdom": "^25.0.1",
|
"jsdom": "^25.0.1",
|
||||||
"postcss": "^8.4.47",
|
"postcss": "^8.4.47",
|
||||||
"tailwindcss": "^3.4.13",
|
"tailwindcss": "^4.3.0",
|
||||||
"typescript": "^5.5.4",
|
"typescript": "^5.5.4",
|
||||||
"vite": "^5.4.8",
|
"vite": "^5.4.8",
|
||||||
"vitest": "^2.1.2"
|
"vitest": "^2.1.2"
|
||||||
|
|||||||
1
apps/edr-freight-web/portal/public/assets/logo.svg
Normal file
1
apps/edr-freight-web/portal/public/assets/logo.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 123 KiB |
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 16 KiB |
@@ -16,6 +16,7 @@ import TrackingPage from "./pages/tracking/TrackingPage";
|
|||||||
import BillingPage from "./pages/billing/BillingPage";
|
import BillingPage from "./pages/billing/BillingPage";
|
||||||
import TrainsPage from "./pages/trains/TrainsPage";
|
import TrainsPage from "./pages/trains/TrainsPage";
|
||||||
import DashboardPage from "./pages/dashboard/DashboardPage";
|
import DashboardPage from "./pages/dashboard/DashboardPage";
|
||||||
|
import { IamLoginPage } from "@tria-plc/iamui-common";
|
||||||
|
|
||||||
const sidebarItems: SidebarItem[] = [
|
const sidebarItems: SidebarItem[] = [
|
||||||
{ label: "Dashboard", href: "/" },
|
{ label: "Dashboard", href: "/" },
|
||||||
@@ -30,6 +31,15 @@ const App = () => {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
|
||||||
|
if (location.pathname === "/auth") {
|
||||||
|
return (
|
||||||
|
<Routes>
|
||||||
|
<Route path="/auth" element={<IamLoginPage />} />
|
||||||
|
<Route path="*" element={<Navigate to="/auth" replace />} />
|
||||||
|
</Routes>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DashboardLayout
|
<DashboardLayout
|
||||||
title="EDR Freight"
|
title="EDR Freight"
|
||||||
|
|||||||
@@ -2,17 +2,51 @@ import { StrictMode } from "react";
|
|||||||
import { createRoot } from "react-dom/client";
|
import { createRoot } from "react-dom/client";
|
||||||
import { BrowserRouter } from "react-router-dom";
|
import { BrowserRouter } from "react-router-dom";
|
||||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||||
|
import "@tria-plc/iamui-common/styles.css";
|
||||||
|
|
||||||
import App from "./App";
|
import App from "./App";
|
||||||
|
import {
|
||||||
|
AuthProvider,
|
||||||
|
BrandingProvider,
|
||||||
|
configureIam,
|
||||||
|
UserProvider,
|
||||||
|
} from "@tria-plc/iamui-common";
|
||||||
|
|
||||||
const queryClient = new QueryClient();
|
const queryClient = new QueryClient();
|
||||||
|
window.__IAM_CONFIG__ = {
|
||||||
|
apiUrl: `${import.meta.env.VITE_BASE_API_URL}/api`,
|
||||||
|
postLoginPath: "/user-management",
|
||||||
|
};
|
||||||
|
window.__USER_MANAGEMENT_BRANDING__ = {
|
||||||
|
organizationName: "EDR Platform",
|
||||||
|
appName: "EDR Portal",
|
||||||
|
moduleBasePath: "/user-management",
|
||||||
|
backToAppPath: "/dashboard",
|
||||||
|
backToAppLabel: "Back to dashboard",
|
||||||
|
};
|
||||||
|
|
||||||
|
configureIam({
|
||||||
|
apiUrl: `${import.meta.env.VITE_BASE_API_URL}/api`,
|
||||||
|
});
|
||||||
|
|
||||||
|
const rootElement = document.getElementById("root");
|
||||||
|
|
||||||
|
if (!rootElement) {
|
||||||
|
throw new Error("Root element not found");
|
||||||
|
}
|
||||||
|
|
||||||
createRoot(document.getElementById("root")!).render(
|
createRoot(document.getElementById("root")!).render(
|
||||||
<StrictMode>
|
<StrictMode>
|
||||||
<QueryClientProvider client={queryClient}>
|
<QueryClientProvider client={queryClient}>
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<App />
|
<BrandingProvider>
|
||||||
</BrowserRouter>
|
<AuthProvider>
|
||||||
|
<UserProvider>
|
||||||
|
<App />
|
||||||
|
</UserProvider>
|
||||||
|
</AuthProvider>
|
||||||
|
</BrandingProvider>
|
||||||
|
</BrowserRouter>
|
||||||
</QueryClientProvider>
|
</QueryClientProvider>
|
||||||
</StrictMode>,
|
</StrictMode>,
|
||||||
);
|
);
|
||||||
|
|||||||
14
apps/edr-freight-web/portal/src/vite-env.d.ts
vendored
14
apps/edr-freight-web/portal/src/vite-env.d.ts
vendored
@@ -1,5 +1,19 @@
|
|||||||
/// <reference types="vite/client" />
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
interface Window {
|
||||||
|
__IAM_CONFIG__?: {
|
||||||
|
apiUrl: string;
|
||||||
|
postLoginPath?: string;
|
||||||
|
};
|
||||||
|
__USER_MANAGEMENT_BRANDING__?: {
|
||||||
|
organizationName: string;
|
||||||
|
appName: string;
|
||||||
|
moduleBasePath: string;
|
||||||
|
backToAppPath?: string;
|
||||||
|
backToAppLabel?: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
interface ImportMetaEnv {
|
interface ImportMetaEnv {
|
||||||
readonly VITE_API_URL: string;
|
readonly VITE_API_URL: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import { defineConfig } from "vite";
|
import { defineConfig } from "vite";
|
||||||
import react from "@vitejs/plugin-react";
|
import react from "@vitejs/plugin-react";
|
||||||
|
import tailwindcss from "@tailwindcss/vite";
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [react()],
|
plugins: [react(), tailwindcss()],
|
||||||
server: {
|
server: {
|
||||||
port: 5173,
|
port: 5173,
|
||||||
host: "0.0.0.0",
|
host: "0.0.0.0",
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
52
infrastructure/docker/docker-compose.db.dev.yml
Normal file
52
infrastructure/docker/docker-compose.db.dev.yml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
version: "3.9"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
edr-network:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres-freight-data:
|
||||||
|
postgres-passenger-data:
|
||||||
|
redis-data:
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres-freight:
|
||||||
|
image: postgres:17-alpine
|
||||||
|
container_name: edr-postgres-freight
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_DB: edr_freight
|
||||||
|
ports:
|
||||||
|
- "5433:5432"
|
||||||
|
volumes:
|
||||||
|
- postgres-freight-data:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- edr-network
|
||||||
|
|
||||||
|
postgres-passenger:
|
||||||
|
image: postgres:17-alpine
|
||||||
|
container_name: edr-postgres-passenger
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_DB: edr_passenger
|
||||||
|
ports:
|
||||||
|
- "5434:5432"
|
||||||
|
volumes:
|
||||||
|
- postgres-passenger-data:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- edr-network
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: edr-redis
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
volumes:
|
||||||
|
- redis-data:/data
|
||||||
|
networks:
|
||||||
|
- edr-network
|
||||||
20
packages/ui-common/components.json
Normal file
20
packages/ui-common/components.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://ui.shadcn.com/schema.json",
|
||||||
|
"style": "new-york",
|
||||||
|
"rsc": false,
|
||||||
|
"tsx": true,
|
||||||
|
"tailwind": {
|
||||||
|
"config": "",
|
||||||
|
"css": "src/styles/globals.css",
|
||||||
|
"baseColor": "neutral",
|
||||||
|
"cssVariables": true
|
||||||
|
},
|
||||||
|
"iconLibrary": "lucide",
|
||||||
|
"aliases": {
|
||||||
|
"components": "#components",
|
||||||
|
"ui": "#components",
|
||||||
|
"lib": "#lib",
|
||||||
|
"utils": "#lib/utils",
|
||||||
|
"hooks": "#hooks"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,7 +18,13 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@edr/types": "workspace:*",
|
"@edr/types": "workspace:*",
|
||||||
"clsx": "^2.1.1"
|
"class-variance-authority": "^0.7.1",
|
||||||
|
"clsx": "^2.1.1",
|
||||||
|
"lucide-react": "^1.14.0",
|
||||||
|
"radix-ui": "^1.4.3",
|
||||||
|
"shadcn": "^4.7.0",
|
||||||
|
"tailwind-merge": "^3.6.0",
|
||||||
|
"tw-animate-css": "^1.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@edr/eslint-config": "workspace:*",
|
"@edr/eslint-config": "workspace:*",
|
||||||
@@ -28,5 +34,13 @@
|
|||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1",
|
"react-dom": "^18.3.1",
|
||||||
"typescript": "^5.5.4"
|
"typescript": "^5.5.4"
|
||||||
|
},
|
||||||
|
"imports": {
|
||||||
|
"#components": "./src/components",
|
||||||
|
"#components/*": "./src/components/*",
|
||||||
|
"#lib": "./src/lib",
|
||||||
|
"#lib/*": "./src/lib/*",
|
||||||
|
"#hooks": "./src/hooks",
|
||||||
|
"#hooks/*": "./src/hooks/*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
64
packages/ui-common/src/components/button.tsx
Normal file
64
packages/ui-common/src/components/button.tsx
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import * as React from "react"
|
||||||
|
import { cva, type VariantProps } from "class-variance-authority"
|
||||||
|
import { Slot } from "radix-ui"
|
||||||
|
|
||||||
|
import { cn } from "../lib/utils"
|
||||||
|
|
||||||
|
const buttonVariants = cva(
|
||||||
|
"inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
||||||
|
{
|
||||||
|
variants: {
|
||||||
|
variant: {
|
||||||
|
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
||||||
|
destructive:
|
||||||
|
"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
|
||||||
|
outline:
|
||||||
|
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
|
||||||
|
secondary:
|
||||||
|
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
||||||
|
ghost:
|
||||||
|
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
||||||
|
link: "text-primary underline-offset-4 hover:underline",
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
||||||
|
xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
|
||||||
|
sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
|
||||||
|
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
||||||
|
icon: "size-9",
|
||||||
|
"icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
|
||||||
|
"icon-sm": "size-8",
|
||||||
|
"icon-lg": "size-10",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
variant: "default",
|
||||||
|
size: "default",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
function Button({
|
||||||
|
className,
|
||||||
|
variant = "default",
|
||||||
|
size = "default",
|
||||||
|
asChild = false,
|
||||||
|
...props
|
||||||
|
}: React.ComponentProps<"button"> &
|
||||||
|
VariantProps<typeof buttonVariants> & {
|
||||||
|
asChild?: boolean
|
||||||
|
}) {
|
||||||
|
const Comp = asChild ? Slot.Root : "button"
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Comp
|
||||||
|
data-slot="button"
|
||||||
|
data-variant={variant}
|
||||||
|
data-size={size}
|
||||||
|
className={cn(buttonVariants({ variant, size, className }))}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export { Button, buttonVariants }
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
export { default as Button } from "./components/Button";
|
|
||||||
export type {
|
export type {
|
||||||
ButtonProps,
|
ButtonProps,
|
||||||
ButtonVariant,
|
ButtonVariant,
|
||||||
@@ -18,10 +17,13 @@ export { default as Badge } from "./components/Badge";
|
|||||||
export type { BadgeProps, BadgeTone } from "./components/Badge";
|
export type { BadgeProps, BadgeTone } from "./components/Badge";
|
||||||
|
|
||||||
export { Sidebar, DashboardLayout } from "./components/Layout";
|
export { Sidebar, DashboardLayout } from "./components/Layout";
|
||||||
|
|
||||||
export type {
|
export type {
|
||||||
SidebarProps,
|
SidebarProps,
|
||||||
SidebarItem,
|
SidebarItem,
|
||||||
DashboardLayoutProps,
|
DashboardLayoutProps,
|
||||||
} from "./components/Layout";
|
} from "./components/Layout";
|
||||||
|
|
||||||
|
export { Button } from "./components/button";
|
||||||
|
|
||||||
export * from "./theme";
|
export * from "./theme";
|
||||||
|
|||||||
6
packages/ui-common/src/lib/utils.ts
Normal file
6
packages/ui-common/src/lib/utils.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { clsx, type ClassValue } from "clsx";
|
||||||
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
|
export function cn(...inputs: ClassValue[]) {
|
||||||
|
return twMerge(clsx(inputs));
|
||||||
|
}
|
||||||
2
packages/ui-common/src/styles/globals.css
Normal file
2
packages/ui-common/src/styles/globals.css
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
@import "tailwindcss";
|
||||||
|
@import "tw-animate-css";
|
||||||
@@ -1,6 +1,15 @@
|
|||||||
{
|
{
|
||||||
"extends": "@edr/tsconfig/react.json",
|
"extends": "@edr/tsconfig/react.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"#components": ["src/components"],
|
||||||
|
"#components/*": ["src/components/*"],
|
||||||
|
"#lib": ["src/lib"],
|
||||||
|
"#lib/*": ["src/lib/*"],
|
||||||
|
"#hooks": ["src/hooks"],
|
||||||
|
"#hooks/*": ["src/hooks/*"]
|
||||||
|
},
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"rootDir": "src"
|
"rootDir": "src"
|
||||||
},
|
},
|
||||||
|
|||||||
1585
pnpm-lock.yaml
generated
1585
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user