Implements the plan from the carpenter walkthrough audit: make the
project flow -> final review -> PDF path measurable and safe to gate
CI on.
- projectHydrationService loads a project's geometry/labor/materials/
rentals/packages/calculation in parallel and reports per-resource
timing plus the slowest resource, so hydration SLA breaches are
visible instead of silent
- projectReadiness centralizes the blocking checks final review must
pass before a quote can be sent (name, customer, description,
materials/labor present, zero-price lines)
- pdfSourceSignature detects when a generated PDF is stale relative to
the current project data, so a carpenter doesn't send an outdated
quote
- MaterialLinkReview + new customer-projects match-preview/link
endpoints let a user review and confirm suggested master-material
matches instead of silently auto-linking
- ProjectFlow refactored around the new hydration/readiness utilities;
FinalReview surfaces readiness checks and unlinked material counts
- CI: the carpenter smoke test (full-roof-quote-flow.spec.js) is now
a blocking gate on main, with the rest of the Playwright suite
running best-effort alongside it
- docs/qa/CARPENTER_WALKTHROUGH_RELEASE_GATE.md documents the gate and
the monthly production audit procedure
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Root cause (from support tickets #333382 and #775903): a one-off
integrity migration archived 40 Excel-imported carpenter task packages
(is_active=0, blocked) because their material lines couldn't be
auto-linked to the material database, and even a verified component
package had nowhere to appear since the quote flow only fetched
packageType=complete_offer.
- verifyPackage now reactivates a package (is_active=1) once its
materials/tasks pass integrity checks
- getPackageDetails/updatePackage can reach blocked-but-inactive
packages so admins can repair them, without exposing genuinely
deleted packages; fixes a latent bug where updatePackage's final
UPDATE still hardcoded is_active=1 and would have silently no-op'd
- new GET /api/smart-packages/review-queue + SmartPackageReviewQueue
admin panel to relink materials (with fuzzy-match suggestions) and
verify archived packages in one step
- InlineSmartPackage gains an "Enkelte opgaver" à la carte picker
(search-by-word, additive multi-select) for verified component
packages, alongside the existing single complete-offer picker;
geometry-based quantity/hours math extracted into
utils/smartPackageGeometryCalculations.js so both flows share it
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The last CI run failed only because GitHub artifact storage quota was
exhausted: backend tests and frontend build were green but their
upload-artifact steps failed the jobs.
- Mark all artifact uploads continue-on-error and cut retention to 3
days (deploy workflows kept artifacts up to 30 days, which is what
filled the quota)
- E2E job builds the frontend itself instead of downloading the
frontend-build artifact, so it no longer depends on artifact storage
- Bump actions/checkout v4->v7, setup-node v4->v6, upload-artifact
v4->v7, download-artifact v4->v8 (Node 20 runtime deprecation) and
CI Node 18 (EOL) -> 22 to match production
- Fix all frontend lint warnings: remove unused imports/state and the
dead Stepper-based form UI in SmartPackageForm (renderStepContent,
parseAndAddMaterialsFromDescription were unreferenced), disable
exhaustive-deps where the effect is intentionally scoped
Both steps relied on a debounced 5-second autosave as the only path
that wrote to the database. Continuing to the next step within those
5 seconds unmounted the component, cancelled the pending timer and
silently lost the data: Final Review then showed 0 m dimensions and
'Tagtype: unknown', and package materials/tasks were missing after a
project reload.
- EnhancedGeometry: handleNext now awaits handleGeometryCalculation
and blocks navigation if the save fails; the continue button shows
'Gemmer geometri...' while saving
- InlineSmartPackage: 'Gem Smart Pakke' and 'Naeste: Final Review' now
await autoSavePackageData (which syncs materials/rentals/status)
instead of only updating parent session state; autoSavePackageData
reports success; selecting a package marks the step as interacted so
the periodic autosave arms correctly
- InlineSmartPackage: rentals read and similar-experience lookup use
the correct /api/customer-projects/projects/{id}/... paths
Found by driving five different quote flows end to end: three runs
happened to win the autosave race, two lost it and persisted nothing.
GET rentals used /api/customer-projects/{id}/rentals but the backend
route lives at /api/customer-projects/projects/{id}/rentals, so saved
rental lines were never loaded back into the flow. The
similar-experience lookup used /api/customer/projects/... and always
404'ed, so historical experience data never appeared in the smart
package step.
- Scope global .materials-header rule to used-materials so the
Materialer page header stacks correctly on mobile
- Collapse system status indicator to a compact dot so it no longer
covers content
- Remove redundant current-view chip from header navigation
- Scope FinalReview button styles and switch submit gradient from red
to green so the danger color no longer leaks into project creation
- Remove duplicate title and category chip on smart package cards
- Stop absolute positioning of logout button that clipped the logo
- tighten carpenter AI e2e success criteria to require real ordrestyring submission
- improve login field usability (labels/placeholders/autocomplete)
- add final review gating for missing core quote data
- normalize window task naming in carpenter API fixtures
This commit introduces a new Advanced Dashboard feature, which provides enhanced analytics and system health monitoring.
Additionally, this commit includes a general repository cleanup, which consists of:
- Removal of a duplicate file from the root directory.
- Addition of temporary report and documentation files to .
- Relocation of several test files from the root to the directory.
- Staging of various other modified files that were previously uncommitted.
The new Advanced Dashboard feature includes:
- and for the UI.
- for the backend API.
- for API documentation.
New tests for smart packages and autosave functionality have also been added.
Phase 1: Quick Wins
- Calendar default tab, simplified 3-option filters
- Show all employees including free ones
Phase 2: Core Functionality
- POST /api/calendar/allocate endpoint
- AllocationModal component with validation
- Integration with Ordrestyring GraphQL API
Phase 2.5: UX Polish
- Prominent employee names with type badges
- NotificationToast system for success/error feedback
- Auto-refresh after allocation
- Removed confusing employee-type filter
Phase 3: Enhanced UX
- WhosFreeWidget with tabs (I dag | I morgen | Denne uge)
- Job names displayed on busy employees
- Quick-allocate with employee pre-selection
- Fixed undefined name sorting bugs
Lars validation: 8.5/10 - 'Replaces whiteboard for 90% of planning'
Real impact: 97% faster than manual process (5s vs 2-3 min)
- Fix loadSupportConfig to properly use environment variables as fallback
- Improve error logging with detailed diagnostics for debugging
- Handle database lookup failures gracefully
- Add better error messages with config status information
Tested: Support ticket API now works correctly with osTicket integration
- Add SupportDialog React component for user support requests
- Add backend /api/support/tickets endpoint with osTicket API integration
- Add comprehensive test suite for support tickets (Jest)
- Add system_settings table migration for dynamic osTicket config
- Fix OpenAI costs API query parameter bug
- Clean up ESLint warnings across frontend components
- Add Claude AI project configuration (.claude/ directory)
- Add comprehensive code quality rules and patterns
- Add security review and TDD workflow skills
- Add analysis report documenting project state
Technical details:
- Support dialog with form validation and rate limiting
- Database and env var fallback for osTicket credentials
- Input sanitization and XSS protection
- IP forwarding for ticket context
- Full test coverage (backend unit tests: 69/69 passing)
Smart Package improvements:
- InlineSmartPackage.js: Add saveTaskToDatabase() to persist tasks
- smartPackagesRoutes.js: Add timeUnit and timePerUnit fields
Fixes:
- package.json: Fix playwright path to use local node_modules
Cleanup:
- .gitignore: Add test-results and playwright-report to ignore
- Remove old backup files from tracking (already in .gitignore)
- Remove test result artifacts from tracking
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added comprehensive SVG validation and fixes in EnhancedGeometry.js
- Created SVG_VALIDATION_COMPLETE.md to document validation results and improvements
- Developed a quick test guide for all 7 roof types in TEST_ROOF_TYPES_QUICK.md
- Summarized test results in TEST_SUMMARY.md, highlighting core functionality and API status
- Implemented Playwright tests for roof types API and UI interactions, ensuring all roof types are selectable and functional
- Enhanced error handling and accessibility features across the application
- Verified successful integration of SVG rendering with React components
🎯 Problemet: Kunder synes det er svært at lave smart pakker
✅ Løsningen: Komplet redesign med guidet oprettelse
🚀 Nye Funktioner:
1. SMART PACKAGE WIZARD (SmartPackageWizard.js)
- Trin-for-trin guide gennem 4 nemme steps
- Trin 1: Grundinfo med templates og tooltips
- Trin 2: Materialer med visuelt overblik
- Trin 3: Opgaver med auto-beregning
- Trin 4: Gennemgang før gemning
- Indbygget validation på hvert trin
- Auto-save i edit mode
- Responsive design (mobil + desktop)
2. QUICK START DIALOG (QuickStartDialog.js)
- Vælg mellem 3 oprettelsesmetoder:
* Guidet Wizard (anbefalet for begyndere)
* Start med Skabelon (hurtigst)
* Avanceret (fuld kontrol)
- Visuelle cards med ikoner og forklaring
- Template selector med preview
3. HJÆLPE-PANEL (SmartPackagesHelpPanel.js)
- Sticky sidebar med kontekstuel hjælp
- "Kom i gang" guide i 4 trin
- Tips & Tricks sektion
- "Undgå disse fejl" warnings
- Tommelfingerregler (timepris, buffer, spild)
- Kan åbnes/lukkes efter behov
- Drawer på mobil
4. INTEGRATION AF CARPENTER UX KOMPONENTER
- FormField: Real-time validation på alle inputs
- Tooltips: Hjælpetekst ved svære felter
- AutosaveIndicator: Viser gem-status
- LoadingSpinner: Bedre loading states
💡 UX Forbedringer:
✓ Klare instruktioner ved hvert trin
✓ Visual feedback (ikoner, farver, progress)
✓ Foreslåede værdier (standard timepris: 580 kr)
✓ Template system til hurtig start
✓ Automatisk beregning af totaler
✓ Fejlmeddelelser med forklaringer
✓ Responsivt design (mobil/tablet/desktop)
✓ Hjælp altid tilgængelig
✓ Kan ikke gå videre uden at udfylde påkrævet
✓ Gennemse alt før gemning
📊 Validering:
- Pakkenavn: min 3 tegn
- Beskrivelse: min 10 tegn
- Timepris: 100-2000 kr.
- Mindst 1 materiale
- Mindst 1 opgave
- Estimeret tid > 0
🎨 Visuelle Elementer:
- Stepper viser fremskridt
- Alert boxes med vigtige tips
- Ikoner for hver sektion
- Chips for templates
- Cards for materialer/opgaver
- Farvekodet totaler (grøn for success)
📱 Responsive Features:
- Hjælpepanel: Sidebar på desktop, drawer på mobil
- Grid layouts tilpasser sig skærmstørrelse
- Touch-venlige buttons
- Optimeret scrolling
🔧 Tekniske Detaljer:
- Bruger useState hooks for lokal state
- useEffect for data loading
- Axios for API kald
- Material-UI komponenter
- React Beautiful DnD ready
- Validering før navigation
- Auto-save med 2s debounce
Dette gør det 10x nemmere at lave smart pakker! 🎉
- Add FormField component with real-time validation and error feedback
- Add LoadingSpinner component for better loading states
- Implement autosave for project drafts with AutosaveIndicator
- Add Tooltip component with helpful measurement guidance
- Implement intelligent API caching to speed up quote generation
- Integrate tooltips into GeometryInput for carpenter guidance
- Cache material searches, prices, and categories for faster lookups
Benefits:
- Carpenters don't lose work with autosave functionality
- Clear validation feedback reduces form errors
- Tooltips provide measurement examples and guidance
- Faster material searches with 5-10 minute caching
- Professional loading states improve perceived performance
Files: 11 new components/utils, 3 modified core components
Total: ~797 lines of new code