diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index fec3c7f..5e18036 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -35,7 +35,7 @@ - [x] **Phase 11: HTML Export Branding + ViewModel Integration** — Inject logos into all 5 HTML report types; wire branding into export-triggering ViewModels and logo management commands (completed 2026-04-08) - [x] **Phase 12: Branding UI Views** — Settings and profile dialog logo sections with live preview; auto-pull client logo from Entra branding API (completed 2026-04-08) - [x] **Phase 13: User Directory ViewModel** — Browse mode state, paginated directory load, member/guest filter, and department/job title columns (completed 2026-04-08) -- [ ] **Phase 14: User Directory View** — Toggle panel in UserAccessAuditView, user selection to trigger existing audit pipeline +- [x] **Phase 14: User Directory View** — Toggle panel in UserAccessAuditView, user selection to trigger existing audit pipeline (completed 2026-04-09) ## Phase Details @@ -124,4 +124,4 @@ Plans: | 11. HTML Export Branding + ViewModel Integration | 4/4 | Complete | 2026-04-08 | — | | 12. Branding UI Views | 3/3 | Complete | 2026-04-08 | — | | 13. User Directory ViewModel | 2/2 | Complete | 2026-04-08 | — | -| 14. User Directory View | 1/2 | In Progress| | — | +| 14. User Directory View | 2/2 | Complete | 2026-04-09 | — | diff --git a/.planning/STATE.md b/.planning/STATE.md index cf8cc51..f1f3c74 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,14 +3,14 @@ gsd_state_version: 1.0 milestone: v2.2 milestone_name: Report Branding & User Directory status: completed -stopped_at: Completed 14-01-PLAN.md -last_updated: "2026-04-09T07:27:37.598Z" +stopped_at: Completed 14-02-PLAN.md +last_updated: "2026-04-09T07:30:58.818Z" last_activity: 2026-04-08 — Phase 11 planning completed progress: total_phases: 5 - completed_phases: 4 + completed_phases: 5 total_plans: 14 - completed_plans: 13 + completed_plans: 14 --- # Project State @@ -72,6 +72,8 @@ Decisions are logged in PROJECT.md Key Decisions table. - [Phase 13]: Directory always fetches with includeGuests=true from Graph; member/guest filtering is in-memory via ICollectionView - [Phase 13]: Separate _directoryCts for directory load cancellation (independent from base class _cts) - [Phase 14]: SelectDirectoryUserCommand does not clear SearchQuery/SearchResults since it operates in browse mode context +- [Phase 14]: Used DataTrigger inverse visibility for search panel instead of ConverterParameter=Inverse +- [Phase 14]: Used plain English DataGrid column headers -- DataGridTextColumn.Header binding is unreliable in WPF ### Pending Todos @@ -86,7 +88,7 @@ None. ## Session Continuity -Last session: 2026-04-09T07:27:37.596Z -Stopped at: Completed 14-01-PLAN.md +Last session: 2026-04-09T07:30:58.816Z +Stopped at: Completed 14-02-PLAN.md Resume file: None Next step: `/gsd:execute-phase 11` diff --git a/.planning/phases/14-user-directory-view/14-02-SUMMARY.md b/.planning/phases/14-user-directory-view/14-02-SUMMARY.md new file mode 100644 index 0000000..6ccf3dd --- /dev/null +++ b/.planning/phases/14-user-directory-view/14-02-SUMMARY.md @@ -0,0 +1,95 @@ +--- +phase: 14-user-directory-view +plan: 02 +subsystem: ui +tags: [wpf, xaml, datagrid, radio-button, data-trigger, directory-browse] + +requires: + - phase: 14-user-directory-view/01 + provides: "Code-behind handler DirectoryDataGrid_MouseDoubleClick and localization keys" + - phase: 13-user-directory-data + provides: "ViewModel properties: IsBrowseMode, DirectoryUsersView, LoadDirectoryCommand, etc." +provides: + - "Complete directory browse UI in UserAccessAuditView with mode toggle, DataGrid, and loading UX" + - "Mode switching between search and browse panels" + - "Guest user highlighting in directory DataGrid" +affects: [user-directory-view] + +tech-stack: + added: [] + patterns: ["DataTrigger inverse visibility for mode-conditional panels", "Shared SelectedUsers section visible across modes"] + +key-files: + created: [] + modified: ["SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml"] + +key-decisions: + - "Used DataTrigger inverse visibility for search panel instead of ConverterParameter=Inverse (more reliable in WPF)" + - "Used plain English DataGrid column headers instead of localized bindings (DataGridTextColumn.Header binding is unreliable)" + - "GroupBox.Header uses nested TextBlock for localized binding compatibility with GroupBox.Style" + +patterns-established: + - "DataTrigger inverse visibility: Style with default Visible, DataTrigger sets Collapsed on true" + - "Mode-conditional panels: search/browse GroupBoxes with opposite visibility triggers" + +requirements-completed: [UDIR-05, UDIR-01] + +duration: 2min +completed: 2026-04-09 +--- + +# Phase 14 Plan 02: Directory Browse UI Summary + +**Full directory browse mode UI with mode toggle RadioButtons, 5-column DataGrid, loading status, guest highlighting, and shared SelectedUsers section** + +## Performance + +- **Duration:** 2 min +- **Started:** 2026-04-09T07:28:21Z +- **Completed:** 2026-04-09T07:30:10Z +- **Tasks:** 1 +- **Files modified:** 1 + +## Accomplishments +- Mode toggle (Search/Browse Directory) RadioButtons at top of left panel with InverseBoolConverter binding +- Search panel collapses when IsBrowseMode=true via DataTrigger approach; Browse panel shows via BoolToVisibilityConverter +- Directory panel with Load/Cancel buttons, IncludeGuests checkbox, filter TextBox, status/count display +- DataGrid with 5 columns (Name, Email, Department, Job Title, Type) bound to DirectoryUsersView +- Guest users highlighted in orange (#F39C12) with SemiBold font weight via DataTrigger on UserType +- SelectedUsers ItemsControl extracted from search GroupBox to shared section visible in both modes +- Scan Options and Run/Export buttons remain always visible in both modes + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: Restructure left panel with mode toggle and conditional panels** - `1a1e83c` (feat) + +## Files Created/Modified +- `SharepointToolbox/Views/Tabs/UserAccessAuditView.xaml` - Added mode toggle, browse panel with DataGrid, extracted SelectedUsers to shared section + +## Decisions Made +- Used DataTrigger inverse visibility for search panel (Visible by default, Collapsed when IsBrowseMode=True) instead of ConverterParameter=Inverse -- more reliable across WPF versions +- Used plain English strings for DataGrid column headers ("Name", "Email", "Department", "Job Title", "Type") instead of localized bindings -- DataGridTextColumn.Header does not reliably support binding in standard WPF +- Moved GroupBox.Header to nested TextBlock element for search panel to avoid conflict between inline Header binding and GroupBox.Style on the same element + +## Deviations from Plan + +None - plan executed exactly as written. + +## Issues Encountered +None. + +## User Setup Required +None - no external service configuration required. + +## Next Phase Readiness +- Phase 14 is now complete (both plans executed) +- All directory browse UI elements are wired to ViewModel properties from Phase 13 +- Manual testing recommended to verify visual layout, mode switching, DataGrid scrolling, and double-click selection + +--- +*Phase: 14-user-directory-view* +*Completed: 2026-04-09* + +## Self-Check: PASSED