Merge pull request #2 from Tria-plc/feat/add_auth_integration

Feat/add auth integration
This commit is contained in:
Michael Abebe
2026-05-15 13:48:48 +03:00
committed by GitHub
19 changed files with 1827 additions and 21 deletions

View File

@@ -6,5 +6,5 @@ export default defineConfig({
server: {
port: 5183,
host: "0.0.0.0",
}
},
});

View File

@@ -0,0 +1 @@
@import "tailwindcss";

View File

@@ -8,5 +8,6 @@
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
<link rel="stylesheet" href="/index.css" />
</body>
</html>

View File

@@ -12,10 +12,10 @@
"type-check": "tsc --noEmit"
},
"dependencies": {
"@tria-plc/iamui-common": "1.0.3",
"@edr/types": "workspace:*",
"@edr/ui-common": "workspace:*",
"@tanstack/react-query": "^5.59.0",
"@tria-plc/iamui-common": "1.1.1",
"axios": "^1.7.7",
"clsx": "^2.1.1",
"react": "^18.3.1",
@@ -26,13 +26,14 @@
"devDependencies": {
"@edr/eslint-config": "workspace:*",
"@edr/tsconfig": "workspace:*",
"@tailwindcss/vite": "^4.3.0",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react": "^4.3.2",
"autoprefixer": "^10.4.20",
"jsdom": "^25.0.1",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.13",
"tailwindcss": "^4.3.0",
"typescript": "^5.5.4",
"vite": "^5.4.8",
"vitest": "^2.1.2"

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

View File

@@ -16,6 +16,7 @@ import TrackingPage from "./pages/tracking/TrackingPage";
import BillingPage from "./pages/billing/BillingPage";
import TrainsPage from "./pages/trains/TrainsPage";
import DashboardPage from "./pages/dashboard/DashboardPage";
import { IamLoginPage } from "@tria-plc/iamui-common";
const sidebarItems: SidebarItem[] = [
{ label: "Dashboard", href: "/" },
@@ -30,6 +31,15 @@ const App = () => {
const navigate = useNavigate();
const location = useLocation();
if (location.pathname === "/auth") {
return (
<Routes>
<Route path="/auth" element={<IamLoginPage />} />
<Route path="*" element={<Navigate to="/auth" replace />} />
</Routes>
);
}
return (
<DashboardLayout
title="EDR Freight"

View File

@@ -2,17 +2,51 @@ import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import "@tria-plc/iamui-common/styles.css";
import App from "./App";
import {
AuthProvider,
BrandingProvider,
configureIam,
UserProvider,
} from "@tria-plc/iamui-common";
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(
<StrictMode>
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<App />
</BrowserRouter>
<BrowserRouter>
<BrandingProvider>
<AuthProvider>
<UserProvider>
<App />
</UserProvider>
</AuthProvider>
</BrandingProvider>
</BrowserRouter>
</QueryClientProvider>
</StrictMode>,
);

View File

@@ -1,5 +1,19 @@
/// <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 {
readonly VITE_API_URL: string;
}

View File

@@ -1,10 +1,11 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite";
export default defineConfig({
plugins: [react()],
plugins: [react(), tailwindcss()],
server: {
port: 5173,
host: "0.0.0.0",
}
},
});

View 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

View 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"
}
}

View File

@@ -18,7 +18,13 @@
},
"dependencies": {
"@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": {
"@edr/eslint-config": "workspace:*",
@@ -28,5 +34,13 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"typescript": "^5.5.4"
},
"imports": {
"#components": "./src/components",
"#components/*": "./src/components/*",
"#lib": "./src/lib",
"#lib/*": "./src/lib/*",
"#hooks": "./src/hooks",
"#hooks/*": "./src/hooks/*"
}
}

View 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 }

View File

@@ -1,4 +1,3 @@
export { default as Button } from "./components/Button";
export type {
ButtonProps,
ButtonVariant,
@@ -18,10 +17,13 @@ export { default as Badge } from "./components/Badge";
export type { BadgeProps, BadgeTone } from "./components/Badge";
export { Sidebar, DashboardLayout } from "./components/Layout";
export type {
SidebarProps,
SidebarItem,
DashboardLayoutProps,
} from "./components/Layout";
export { Button } from "./components/button";
export * from "./theme";

View 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));
}

View File

@@ -0,0 +1,2 @@
@import "tailwindcss";
@import "tw-animate-css";

View File

@@ -1,6 +1,15 @@
{
"extends": "@edr/tsconfig/react.json",
"compilerOptions": {
"baseUrl": ".",
"paths": {
"#components": ["src/components"],
"#components/*": ["src/components/*"],
"#lib": ["src/lib"],
"#lib/*": ["src/lib/*"],
"#hooks": ["src/hooks"],
"#hooks/*": ["src/hooks/*"]
},
"outDir": "dist",
"rootDir": "src"
},

1585
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff