Commit Graph

6 Commits (88945b47f6961736f788f9da0c58b167d433500a)

Author SHA1 Message Date
Boban Blaskovic 7e6d0d4ab4 feat(ui): dashboard MVP — feature-folders, lazy skeletons, wire-elements modals, brand logos
Major refactor + UX polish for authenticated dashboard MVP.

Architecture:
- Feature-based folder structure: app/Livewire/<Feature>/{Index, Modals/*}
  Dashboard, Subjects, Tasks, PhotoHelp, Rewards, Progress, Notifications, Settings
- Matching view structure: resources/views/livewire/<feature>/{index, modals/*}.blade.php
- Removed legacy Pages/ and Modals/ top-level folders

Modals (wire-elements/modal v3):
- 7 modal components extending LivewireUI\Modal\ModalComponent
- Vendor view override: z-50 (above sidebar z-20), items-center justify-center,
  bg-bg-soft surface, role=dialog + aria-modal, design-token-driven backdrop
- Server-side dispatch uses ->to('livewire-ui-modal') for cross-component routing

URL state + skeleton:
- Tasks + Notifications + Settings use #[Url(as, keep:true)] with allowlist
  validation in mount()/setSection()/setFilter() to block injection
- Tasks startTask + repeatTask actions dispatch openModal targeted at modal
- All 8 main pages declare #[Lazy] + placeholder() returning a page-level
  skeleton (animate-pulse, bg-bg-soft container, bg-line bars) so first paint
  is structured instead of blank

Skeleton/no-jump:
- Skeleton container uses bg-bg-soft (matches table card surface) — no color
  jump between skeleton and resolved table
- Settings sub-nav renders active state server-side (no Alpine :class flicker)
  with @if-server-render instead of x-show
- Font flicker eliminated: font-display: block + <link rel="preload"> on both
  layouts for Plus Jakarta Sans + JetBrains Mono

Logos / PWA:
- public/logo/, public/icons/, public/manifest.webmanifest deployed per
  Logos/DEPLOY.md
- Brand component (default / wordmark / icon-only variants) with href prop
- Favicon SVG/ICO + apple-touch-icon + manifest tags in dashboard + guest layouts
- Sidebar brand wires to route('dashboard')

Layout / a11y:
- Sidebar fixed left (top-0, h-screen, w-60) with header+footer shrink-0 and
  scrollable content
- Topbar sticky with z-10
- Sidebar uses x-layout.brand :href="route('dashboard')"
- Logout: POST /logout route + sidebar-user widget with @csrf form button

Bug fixes:
- Tasks rows are passive divs (not buttons) with explicit info-icon + Start
  button — eliminates nested-button invalid HTML
- Tasks Start/Wiederholen buttons wire:click to startTask/repeatTask actions
  (previously did nothing)
- Modals centered + above sidebar z-index
- Settings section sub-nav no longer flickers on hydration
- public/hot cleanup: Vite runs as docker compose service with auto-restart

Test infrastructure:
- Pest beforeEach calls Livewire::withoutLazyLoading() so #[Lazy] components
  hydrate fully under test
- 157 tests passing, 0 skipped, 0 failed (411 assertions)
- New test files:
  AssetReachabilityTest, BrandAssetsTest, FontLoadingTest, LazySkeletonTest,
  LogoutTest, ModalLayoutTest, ModalsTest, NoNestedButtonsTest,
  SettingsNavTest, SidebarPagesTest, TasksStartButtonTest, UrlStateTest

Config:
- config/sidebar.php as single source of truth for sidebar nav items
- config/reverb.php allowed_origins set
- Test DB isolated: phpunit.xml DB_DATABASE=lernschiff_test +
  tests/TestCase.php refreshApplication override

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 21:36:04 +02:00
Boban Blaskovic 934cc03367 feat(icons): install blade-heroicons + render <x-heroicon-o-academic-cap> in dashboard (AC-13)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 06:28:19 +02:00
Boban Blaskovic 26f508395d feat(auth): Breeze Livewire stack + dashboard/lizenz-abgelaufen views + layout shells
- Install laravel/breeze v2.4.2 (Livewire/Volt stack)
- Restore Livewire v4.3.0 (Breeze downgraded to v3; pinned back to ^4.0)
- Replace layouts/app.blade.php with Lernschiff-branded version (lang=de, CSS vars)
- Add layouts/auth.blade.php for auth pages
- Add components/layouts/{app,auth}.blade.php as anonymous components for <x-layouts.*>
- Add resources/views/dashboard.blade.php and lizenz-abgelaufen.blade.php (stub views)
- Rewrite routes/web.php: / redirects to /dashboard, dashboard returns view, merge Breeze routes
- Add TenantAwareUserProvider: bypasses TenantScope for Auth::attempt() credential lookups
  (TenantScope applies WHERE 0=1 for unauthenticated queries, blocking login)
- Register tenant-aware-eloquent provider in config/auth.php and AppServiceProvider
- Fix phpunit.xml.dist: force APP_ENV=testing via both env+server to override Docker shell env
  (Docker sets APP_ENV=local in $_SERVER; PHPUnit env override was silently ignored)
- Add auth.js to vite inputs for auth layout asset bundling
- Update ExampleTest: / now redirects to /dashboard (not welcome view)
- Fix RegistrationTest: skip self-registration test (Lernschiff requires tenant_id)
- Fix ProfileTest: assert soft-deleted user via withoutGlobalScope+withTrashed
- All 40 tests pass (1 skipped: self-registration not supported in Lernschiff)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 05:55:59 +02:00
Boban Blaskovic 7595d28613 feat(ui): Livewire v4 + blade-icons + de locale + timezone Vienna
Installed livewire/livewire v4.3 and blade-ui-kit/blade-icons v1.10, published
their configs. Updated config/app.php: locale default='de', timezone='Europe/Vienna'.
Created lang/de.json with core German translation strings.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 00:38:36 +02:00
Boban Blaskovic fe3b8d904f feat(testing): Pest v3 + Dusk + phpunit.xml.dist SESSION overrides + laravel/reverb
Installed pestphp/pest v4.7, pestphp/pest-plugin-laravel v4.1, laravel/dusk v8.6,
and laravel/reverb v1.10. Added phpunit.xml.dist and updated phpunit.xml with required
SESSION_SECURE_COOKIE=false, SESSION_DOMAIN=null, DB_CONNECTION=mysql overrides.
Created Browser/Smoke/AppReachableTest.php Dusk smoke test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 00:32:10 +02:00
Boban Blaskovic 8eb1759d7e feat(scaffold): Laravel 12 scaffold + .env.example
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 00:19:49 +02:00