diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 485e0839e..51b624a53 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -34,12 +34,12 @@ jobs: - name: Install Node Dependencies run: npm ci - - name: Build Assets - run: npm run build - - name: Install Dependencies run: composer install --no-interaction --prefer-dist --optimize-autoloader + - name: Build Assets + run: npm run build + - name: Copy Environment File run: cp .env.example .env diff --git a/.gitignore b/.gitignore index 3847c0df4..c625a11f7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ /public/build /public/hot /public/storage +/resources/js/actions +/resources/js/routes +/resources/js/wayfinder /storage/*.key /storage/pail /vendor diff --git a/.prettierignore b/.prettierignore index df954ecde..6b929aea9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,2 @@ resources/js/components/ui/* -resources/js/ziggy.js resources/views/mail/* diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 3af9fd499..bd8901335 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -5,7 +5,6 @@ use Illuminate\Foundation\Inspiring; use Illuminate\Http\Request; use Inertia\Middleware; -use Tighten\Ziggy\Ziggy; class HandleInertiaRequests extends Middleware { @@ -46,10 +45,6 @@ public function share(Request $request): array 'auth' => [ 'user' => $request->user(), ], - 'ziggy' => fn (): array => [ - ...(new Ziggy)->toArray(), - 'location' => $request->url(), - ], 'sidebarOpen' => ! $request->hasCookie('sidebar_state') || $request->cookie('sidebar_state') === 'true', ]; } diff --git a/composer.json b/composer.json index d33ae8c47..a53557207 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "inertiajs/inertia-laravel": "^2.0", "laravel/framework": "^12.0", "laravel/tinker": "^2.10.1", - "tightenco/ziggy": "^2.4" + "laravel/wayfinder": "^0.1.9" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/package-lock.json b/package-lock.json index c37c83189..09de92080 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ }, "devDependencies": { "@eslint/js": "^9.19.0", + "@laravel/vite-plugin-wayfinder": "^0.1.3", "@types/node": "^22.13.5", "eslint": "^9.17.0", "eslint-config-prettier": "^10.0.1", @@ -1046,6 +1047,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@laravel/vite-plugin-wayfinder": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@laravel/vite-plugin-wayfinder/-/vite-plugin-wayfinder-0.1.3.tgz", + "integrity": "sha512-S/21Lzl7lci7LrRo/VsN5AXT02AMf7rs+OPTyt3VPgffBB1wTrzwsPr28sCU0gcR/APhfC1eVIUwpLbAvBmyKw==", + "dev": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", diff --git a/package.json b/package.json index bff8d13e7..04e6b6527 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "devDependencies": { "@eslint/js": "^9.19.0", + "@laravel/vite-plugin-wayfinder": "^0.1.3", "@types/node": "^22.13.5", "eslint": "^9.17.0", "eslint-config-prettier": "^10.0.1", diff --git a/resources/js/components/app-header.tsx b/resources/js/components/app-header.tsx index 831f2c363..8dfcf694f 100644 --- a/resources/js/components/app-header.tsx +++ b/resources/js/components/app-header.tsx @@ -9,6 +9,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/comp import { UserMenuContent } from '@/components/user-menu-content'; import { useInitials } from '@/hooks/use-initials'; import { cn } from '@/lib/utils'; +import { dashboard } from '@/routes'; import { type BreadcrumbItem, type NavItem, type SharedData } from '@/types'; import { Link, usePage } from '@inertiajs/react'; import { BookOpen, Folder, LayoutGrid, Menu, Search } from 'lucide-react'; @@ -18,7 +19,7 @@ import AppLogoIcon from './app-logo-icon'; const mainNavItems: NavItem[] = [ { title: 'Dashboard', - href: '/dashboard', + href: dashboard(), icon: LayoutGrid, }, ]; @@ -78,7 +79,7 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { {rightNavItems.map((item) => ( - + @@ -108,7 +109,7 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { href={item.href} className={cn( navigationMenuTriggerStyle(), - page.url === item.href && activeItemStyles, + page.url === (typeof item.href === 'string' ? item.href : item.href.url) && activeItemStyles, 'h-9 cursor-pointer px-3', )} > @@ -135,7 +136,7 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { - + diff --git a/resources/js/components/delete-user.tsx b/resources/js/components/delete-user.tsx index 25870ab2f..6e6569662 100644 --- a/resources/js/components/delete-user.tsx +++ b/resources/js/components/delete-user.tsx @@ -1,3 +1,4 @@ +import { destroy } from '@/actions/App/Http/Controllers/Settings/ProfileController'; import HeadingSmall from '@/components/heading-small'; import InputError from '@/components/input-error'; import { Button } from '@/components/ui/button'; @@ -31,8 +32,7 @@ export default function DeleteUser() {
- + {item.icon && } {item.title} diff --git a/resources/js/components/nav-main.tsx b/resources/js/components/nav-main.tsx index 0dc62c6de..6fcbd7cc1 100644 --- a/resources/js/components/nav-main.tsx +++ b/resources/js/components/nav-main.tsx @@ -10,7 +10,11 @@ export function NavMain({ items = [] }: { items: NavItem[] }) { {items.map((item) => ( - + {item.icon && } {item.title} diff --git a/resources/js/components/user-menu-content.tsx b/resources/js/components/user-menu-content.tsx index c002b1947..0f198a52d 100644 --- a/resources/js/components/user-menu-content.tsx +++ b/resources/js/components/user-menu-content.tsx @@ -1,6 +1,8 @@ import { DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator } from '@/components/ui/dropdown-menu'; import { UserInfo } from '@/components/user-info'; import { useMobileNavigation } from '@/hooks/use-mobile-navigation'; +import { logout } from '@/routes'; +import { edit } from '@/routes/profile'; import { type User } from '@/types'; import { Link, router } from '@inertiajs/react'; import { LogOut, Settings } from 'lucide-react'; @@ -27,7 +29,7 @@ export function UserMenuContent({ user }: UserMenuContentProps) { - + Settings @@ -35,7 +37,7 @@ export function UserMenuContent({ user }: UserMenuContentProps) { - + Log out diff --git a/resources/js/layouts/auth/auth-card-layout.tsx b/resources/js/layouts/auth/auth-card-layout.tsx index d0bfc4e08..33e68c753 100644 --- a/resources/js/layouts/auth/auth-card-layout.tsx +++ b/resources/js/layouts/auth/auth-card-layout.tsx @@ -1,5 +1,6 @@ import AppLogoIcon from '@/components/app-logo-icon'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { home } from '@/routes'; import { Link } from '@inertiajs/react'; import { type PropsWithChildren } from 'react'; @@ -15,7 +16,7 @@ export default function AuthCardLayout({ return (
- +
diff --git a/resources/js/layouts/auth/auth-simple-layout.tsx b/resources/js/layouts/auth/auth-simple-layout.tsx index 6de3efcd8..68c0192c7 100644 --- a/resources/js/layouts/auth/auth-simple-layout.tsx +++ b/resources/js/layouts/auth/auth-simple-layout.tsx @@ -1,4 +1,5 @@ import AppLogoIcon from '@/components/app-logo-icon'; +import { home } from '@/routes'; import { Link } from '@inertiajs/react'; import { type PropsWithChildren } from 'react'; @@ -14,7 +15,7 @@ export default function AuthSimpleLayout({ children, title, description }: Props
- +
diff --git a/resources/js/layouts/auth/auth-split-layout.tsx b/resources/js/layouts/auth/auth-split-layout.tsx index 03daf1c0d..17fc6ae43 100644 --- a/resources/js/layouts/auth/auth-split-layout.tsx +++ b/resources/js/layouts/auth/auth-split-layout.tsx @@ -1,4 +1,5 @@ import AppLogoIcon from '@/components/app-logo-icon'; +import { home } from '@/routes'; import { type SharedData } from '@/types'; import { Link, usePage } from '@inertiajs/react'; import { type PropsWithChildren } from 'react'; @@ -15,7 +16,7 @@ export default function AuthSplitLayout({ children, title, description }: PropsW
- + {name} @@ -30,7 +31,7 @@ export default function AuthSplitLayout({ children, title, description }: PropsW
- +
diff --git a/resources/js/layouts/settings/layout.tsx b/resources/js/layouts/settings/layout.tsx index c661d1a2a..14f0a861c 100644 --- a/resources/js/layouts/settings/layout.tsx +++ b/resources/js/layouts/settings/layout.tsx @@ -2,6 +2,9 @@ import Heading from '@/components/heading'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; import { cn } from '@/lib/utils'; +import { appearance } from '@/routes'; +import { edit as editPassword } from '@/routes/password'; +import { edit } from '@/routes/profile'; import { type NavItem } from '@/types'; import { Link } from '@inertiajs/react'; import { type PropsWithChildren } from 'react'; @@ -9,17 +12,17 @@ import { type PropsWithChildren } from 'react'; const sidebarNavItems: NavItem[] = [ { title: 'Profile', - href: '/settings/profile', + href: edit(), icon: null, }, { title: 'Password', - href: '/settings/password', + href: editPassword(), icon: null, }, { title: 'Appearance', - href: '/settings/appearance', + href: appearance(), icon: null, }, ]; @@ -41,12 +44,12 @@ export default function SettingsLayout({ children }: PropsWithChildren) {