chore: complete v1.0 milestone

Archive 5 phases (36 plans) to milestones/v1.0-phases/.
Archive roadmap, requirements, and audit to milestones/.
Evolve PROJECT.md with shipped state and validated requirements.
Collapse ROADMAP.md to one-line milestone summary.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dev
2026-04-07 09:15:14 +02:00
parent b815c323d7
commit 724fdc550d
959 changed files with 6852 additions and 728 deletions

View File

@@ -0,0 +1,124 @@
---
phase: 03-storage
plan: 05
subsystem: export
tags: [csharp, csv, html, search, duplicates, export]
# Dependency graph
requires:
- phase: 03-01
provides: export stubs and test scaffolds for SearchCsvExportService, SearchHtmlExportService, DuplicatesHtmlExportService
- phase: 03-04
provides: SearchResult and DuplicateGroup models consumed by exporters
provides:
- SearchCsvExportService: UTF-8 BOM CSV with 8-column header for SearchResult list
- SearchHtmlExportService: self-contained sortable/filterable HTML report for SearchResult list
- DuplicatesHtmlExportService: grouped card HTML report for DuplicateGroup list
affects: [03-08, SearchViewModel, DuplicatesViewModel]
# Tech tracking
tech-stack:
added: []
patterns:
- "System.IO.File used explicitly in WPF project (no implicit using for System.IO)"
- "Self-contained HTML exports with inline CSS + JS (no external CDN dependencies)"
- "Segoe UI font stack and #0078d4 color palette consistent across all Phase 2/3 HTML exports"
key-files:
created: []
modified:
- SharepointToolbox/Services/Export/SearchCsvExportService.cs
- SharepointToolbox/Services/Export/SearchHtmlExportService.cs
- SharepointToolbox/Services/Export/DuplicatesHtmlExportService.cs
key-decisions:
- "SearchCsvExportService uses UTF-8 BOM (encoderShouldEmitUTF8Identifier: true) for Excel compatibility"
- "SearchHtmlExportService result count rendered at generation time (not via JS variable) to avoid C# interpolation conflicts with JS template strings"
- "DuplicatesHtmlExportService always uses badge-dup class (red) — no ok/diff distinction needed per DUPL-03"
patterns-established:
- "sortTable(col) JS function: uses data-sort attribute for numeric columns (Size), falls back to innerText"
- "filterTable() JS function: hides rows by adding 'hidden' class, updates result count display"
- "Group cards use toggleGroup(id) with collapsed CSS class for collapsible behavior"
requirements-completed: [SRCH-03, SRCH-04, DUPL-03]
# Metrics
duration: 4min
completed: 2026-04-02
---
# Phase 03 Plan 05: Search and Duplicate Export Services Summary
**SearchCsvExportService (UTF-8 BOM CSV), SearchHtmlExportService (sortable/filterable HTML), and DuplicatesHtmlExportService (grouped card HTML) — all 9 export tests pass**
## Performance
- **Duration:** 4 min
- **Started:** 2026-04-02T13:34:47Z
- **Completed:** 2026-04-02T13:38:47Z
- **Tasks:** 2
- **Files modified:** 3
## Accomplishments
- SearchCsvExportService: UTF-8 BOM CSV with proper 8-column header and RFC 4180 CSV escaping
- SearchHtmlExportService: self-contained HTML with click-to-sort columns and live filter input, ported from PS Export-SearchToHTML
- DuplicatesHtmlExportService: collapsible group cards with item count badges and path tables, ported from PS Export-DuplicatesToHTML
## Task Commits
Each task was committed atomically:
1. **Task 1: SearchCsvExportService + SearchHtmlExportService** - `e174a18` (feat, part of 03-07 session)
2. **Task 2: DuplicatesHtmlExportService** - `fc1ba00` (feat)
**Plan metadata:** (see final docs commit)
## Files Created/Modified
- `SharepointToolbox/Services/Export/SearchCsvExportService.cs` - UTF-8 BOM CSV exporter for SearchResult list (SRCH-03)
- `SharepointToolbox/Services/Export/SearchHtmlExportService.cs` - Sortable/filterable HTML exporter for SearchResult list (SRCH-04)
- `SharepointToolbox/Services/Export/DuplicatesHtmlExportService.cs` - Grouped card HTML exporter for DuplicateGroup list (DUPL-03)
## Decisions Made
- `SearchCsvExportService` uses `UTF8Encoding(encoderShouldEmitUTF8Identifier: true)` for Excel compatibility — consistent with Phase 2 CsvExportService pattern
- Result count in `SearchHtmlExportService` is rendered as a C# interpolated string at generation time rather than a JS variable — avoids conflict between C# `$$"""` interpolation and JS template literal syntax
- `DuplicatesHtmlExportService` uses `badge-dup` (red) for all groups — DUPL-03 requires showing copies count; ok/diff distinction was removed from final spec
## Deviations from Plan
### Auto-fixed Issues
**1. [Rule 1 - Bug] Fixed implicit `File` class resolution in WPF project**
- **Found during:** Task 1 (SearchCsvExportService and SearchHtmlExportService)
- **Issue:** `File.WriteAllTextAsync` fails to compile — WPF project does not include `System.IO` in implicit usings (established project pattern documented in STATE.md decisions)
- **Fix:** Changed `File.WriteAllTextAsync` to `System.IO.File.WriteAllTextAsync` in both services
- **Files modified:** SearchCsvExportService.cs, SearchHtmlExportService.cs
- **Verification:** Test project builds successfully; 6/6 SearchExportServiceTests pass
- **Committed in:** e174a18 (Task 1 commit, part of 03-07 session)
---
**Total deviations:** 1 auto-fixed (Rule 1 — known WPF project pattern)
**Impact on plan:** Necessary correctness fix. No scope creep.
## Issues Encountered
- Task 1 (SearchCsvExportService + SearchHtmlExportService) was already committed in the prior `feat(03-07)` session — the plan was executed out of order. Task 2 (DuplicatesHtmlExportService) was the only remaining work in this session.
- WPF temp project (`_wpftmp.csproj`) showed pre-existing errors for `StorageView` and `ClientRuntimeContext.Url` during build attempts — these are pre-existing blockers from plan 03-07 state (StorageView untracked, not in scope for this plan). Used `dotnet build SharepointToolbox.Tests/` directly to avoid them.
## User Setup Required
None - no external service configuration required.
## Next Phase Readiness
- All 3 export services are fully implemented and tested (9/9 tests pass)
- SearchViewModel and DuplicatesViewModel (plan 03-08) can now wire export commands to these services
- StorageView.xaml is untracked (created in 03-07 session) — needs to be committed before plan 03-08 runs
---
*Phase: 03-storage*
*Completed: 2026-04-02*