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
- Move root-level status/feature/summary MDs into docs/ subdirs
- Convert .txt documentation files to .md format
- Tests-related MD moved to tests/
- Root now only contains README.md, CLAUDE.md, GEMINI.md
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.
- Add dedicated unit-tests job with MariaDB service container
- Add security-scan job with npm audit and secrets detection
- Build now depends on passing unit tests and security scan
- Add test coverage artifact upload
- Add quotes endpoint to API verification
- Add test screenshots artifact on failure
- Update deployment summary with all job statuses
- Change topicId/priorityId to topic_id/priority_id (snake_case for osTicket API)
- Update error message assertion to match actual API response extraction
CI Workflow (ci.yml):
- Lint and type check for frontend/backend
- Backend unit tests with MariaDB service container
- Frontend production build
- E2E Playwright tests on pull requests
- Security vulnerability scanning
- CI summary job for status reporting
Test Deployment (deploy-test.yml):
- Triggers on push to develop branch
- Manual workflow dispatch support
- SSH deployment with release management
- Health checks and API smoke tests
- Full E2E test suite on test environment
Production Deployment (deploy-prod.yml):
- Triggers on push to main or version tags
- Pre-deployment backup creation
- Atomic symlink deployment for zero-downtime
- Graceful PM2 reload
- Automatic rollback on verification failure
- Production smoke tests
- Deployment summary reporting
Documentation:
- Updated DEPLOYMENT-PIPELINE.md with complete guide
- Server directory structure documentation
- Required secrets documentation
- Rollback procedures
- Troubleshooting guide
- Update tech stack from PostgreSQL to MariaDB/MySQL
- Update port from 3000/3001 to unified server port 4032
- Add Smart Packages system (15 carpenter packages)
- Add 7 roof types documentation
- Add Ordrestyring GraphQL integration info
- Update project structure to reflect current state
- Add comprehensive API endpoints documentation
- Update docs/README.md with documentation index and architecture diagram
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)