feat(router-phase5): App.tsx + Nav um neue Routen erweitern + db-migrate nicht ve [tsc:fail]

This commit is contained in:
Dennis (via Claude+Gemma) 2026-05-23 05:26:14 +02:00
parent 6bc539533a
commit a2ce92f0db
5 changed files with 80 additions and 18 deletions

View File

@ -4,9 +4,10 @@
"customer-detail-page", "customer-detail-page",
"project-detail-page" "project-detail-page"
], ],
"current_feature": "api-client-phase5", "current_feature": "router-phase5",
"started_at": "2026-05-23T05:20:11.407108", "started_at": "2026-05-23T05:20:11.407108",
"attempted_features": [ "attempted_features": [
"settings-page" "settings-page",
"api-client-phase5"
] ]
} }

View File

@ -603,3 +603,21 @@ src/routes/settings.ts(3,10): error TS2305: Module '"../db/schema"' has no expor
undefined undefined
/home/dark/Developer/EmberClone/apps/api: /home/dark/Developer/EmberClone/apps/api:
ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL Command failed with exit code 2: tsc --noEmit -p tsconfig.json ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL Command failed with exit code 2: tsc --noEmit -p tsconfig.json
- `05:24:51` **INFO** Committed feature api-client-phase5
- `05:24:52` **INFO** Pushed: rc=0
## Phase-3 Feature: router-phase5 (2026-05-23 05:24:52)
- `05:24:52` **INFO** Description: App.tsx + Nav um neue Routen erweitern + db-migrate nicht vergessen
- `05:24:52` **INFO** Generating apps/api/src/routes/index.ts (ERWEITERT — behalte alle bestehenden registrations. Füge `settingsRout…)
- `05:24:57` **INFO** wrote 703 chars in 5.6s (attempt 1)
- `05:24:57` **INFO** Generating apps/web/src/App.tsx (ERWEITERT — füge Routes /customers/$id (CustomerDetail), /projects/$id…)
- `05:25:26` **INFO** wrote 3410 chars in 29.0s (attempt 1)
- `05:25:26` **INFO** Generating apps/web/src/components/Nav.tsx (ERWEITERT — füge Settings-Link bei admin-role + Theme-Toggle. Behalte …)
- `05:26:12` **INFO** wrote 5232 chars in 46.3s (attempt 1)
- `05:26:12` **INFO** Running tsc --noEmit on api…
- `05:26:14` **WARN** tsc errors:
src/routes/settings.ts(3,10): error TS2305: Module '"../db/schema"' has no exported member 'settings'.
undefined
/home/dark/Developer/EmberClone/apps/api:
ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL Command failed with exit code 2: tsc --noEmit -p tsconfig.json

View File

@ -4,6 +4,7 @@ import customerRoutes from "./customers"
import projectRoutes from "./projects" import projectRoutes from "./projects"
import timeEntryRoutes from "./time-entries" import timeEntryRoutes from "./time-entries"
import userRoutes from "./users" import userRoutes from "./users"
import settingsRoutes from "./settings"
export async function setupRoutes(server: FastifyInstance) { export async function setupRoutes(server: FastifyInstance) {
server.register(authRoutes, { prefix: "/api/auth" }) server.register(authRoutes, { prefix: "/api/auth" })
@ -11,4 +12,5 @@ export async function setupRoutes(server: FastifyInstance) {
server.register(customerRoutes, { prefix: "/api/customers" }) server.register(customerRoutes, { prefix: "/api/customers" })
server.register(projectRoutes, { prefix: "/api/projects" }) server.register(projectRoutes, { prefix: "/api/projects" })
server.register(userRoutes, { prefix: "/api/users" }) server.register(userRoutes, { prefix: "/api/users" })
server.register(settingsRoutes, { prefix: "/api/settings" })
} }

View File

@ -3,9 +3,12 @@ import Dashboard from "./pages/Dashboard"
import Login from "./pages/Login" import Login from "./pages/Login"
import TimeEntries from "./pages/TimeEntries" import TimeEntries from "./pages/TimeEntries"
import Customers from "./pages/Customers" import Customers from "./pages/Customers"
import CustomerDetail from "./pages/CustomerDetail"
import Projects from "./pages/Projects" import Projects from "./pages/Projects"
import ProjectDetail from "./pages/ProjectDetail"
import Profile from "./pages/Profile" import Profile from "./pages/Profile"
import AdminUsers from "./pages/AdminUsers" import AdminUsers from "./pages/AdminUsers"
import Settings from "./pages/Settings"
import Nav from "./components/Nav" import Nav from "./components/Nav"
import { ToastProvider } from "./components/Toast" import { ToastProvider } from "./components/Toast"
import ErrorBoundary from "./components/ErrorBoundary" import ErrorBoundary from "./components/ErrorBoundary"
@ -73,6 +76,13 @@ const customersRoute = createRoute({
component: Customers component: Customers
}) })
const customerDetailRoute = createRoute({
getParentRoute: () => rootRoute,
path: "/customers/$id",
beforeLoad: authCheck,
component: CustomerDetail
})
const projectsRoute = createRoute({ const projectsRoute = createRoute({
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
path: "/projects", path: "/projects",
@ -80,6 +90,13 @@ const projectsRoute = createRoute({
component: Projects component: Projects
}) })
const projectDetailRoute = createRoute({
getParentRoute: () => rootRoute,
path: "/projects/$id",
beforeLoad: authCheck,
component: ProjectDetail
})
const profileRoute = createRoute({ const profileRoute = createRoute({
getParentRoute: () => rootRoute, getParentRoute: () => rootRoute,
path: "/profile", path: "/profile",
@ -94,14 +111,24 @@ const adminRoute = createRoute({
component: AdminUsers component: AdminUsers
}) })
const settingsRoute = createRoute({
getParentRoute: () => rootRoute,
path: "/settings",
beforeLoad: adminCheck,
component: Settings
})
const routeTree = rootRoute.addChildren([ const routeTree = rootRoute.addChildren([
indexRoute, indexRoute,
loginRoute, loginRoute,
timeEntriesRoute, timeEntriesRoute,
customersRoute, customersRoute,
customerDetailRoute,
projectsRoute, projectsRoute,
projectDetailRoute,
profileRoute, profileRoute,
adminRoute adminRoute,
settingsRoute
]) ])
const router = createRouter({ const router = createRouter({

View File

@ -9,7 +9,8 @@ import {
LogOut, LogOut,
ShieldCheck, ShieldCheck,
Sun, Sun,
Moon Moon,
Settings
} from "lucide-react" } from "lucide-react"
import { useQuery } from "@tanstack/react-query" import { useQuery } from "@tanstack/react-query"
import { api } from "../lib/api" import { api } from "../lib/api"
@ -73,6 +74,7 @@ export default function Nav() {
})} })}
{user?.role === 'admin' && ( {user?.role === 'admin' && (
<>
<Link <Link
to="/admin" to="/admin"
className={`flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors ${ className={`flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors ${
@ -84,6 +86,18 @@ export default function Nav() {
<ShieldCheck className="w-4 h-4" /> <ShieldCheck className="w-4 h-4" />
Admin Admin
</Link> </Link>
<Link
to="/settings"
className={`flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium transition-colors ${
location.pathname === "/settings"
? "bg-indigo-50 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300"
: "text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-slate-100"
}`}
>
<Settings className="w-4 h-4" />
Settings
</Link>
</>
)} )}
</div> </div>
</div> </div>
@ -111,7 +125,7 @@ export default function Nav() {
<button <button
onClick={handleLogout} onClick={handleLogout}
className="flex items-center gap-2 text-sm font-medium text-gray-500 hover:text-red-600 dark:text-slate-400 dark:hover:text-red-400 transition-colors px-3 py-2" className="flex items-center gap-2 px-3 py-2 rounded-md text-sm font-medium text-gray-600 hover:bg-gray-50 hover:text-red-600 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-red-400 transition-colors"
> >
<LogOut className="w-4 h-4" /> <LogOut className="w-4 h-4" />
Logout Logout