Migration Review -- Master Summary¶
Last Updated: 2026-02-27
Project: Progress Credit Union -- Umbraco v8 to v17 Migration
V8 Source: psCreditUnion/Progress.Web/ + SQL Server progresscu.ie
V17 Target: dbl.Progress/src/www/ + Umbraco 17 at psv17.double.pt
Migration Tool: double-migration-tool/
Shared codebase note: This codebase is shared across multiple credit union client databases. Items with zero content in
progresscu.iemay be actively used in other client databases. All datatypes and element types are migrated. Cleanup is performed per-destination-DB only after cross-validating all clients.
Current Status¶
| Area | Status |
|---|---|
| Page Templates | DONE -- 45 of 48 migrated; 3 confirmed obsolete |
| Component Views | DONE -- 146 total (121 blockgrid + 7 blocklist + 18 SiteLayout) |
| Bootstrap 5 Upgrade | DONE -- 1,142 CSS replacements across 159 files |
| Migration Tool Fixes | DONE -- duplication eliminated (commits 09935d2, 164069f, 76a17cf) |
| Calculator Localization | DONE -- 6 partials with IDictionaryService |
| Color Picker / Double-Hash | DONE -- fixed across 20+ files |
| MediaPicker3 Single-Pick | DONE -- fixed across 20+ files |
| DropDown.Flexible JSON | DONE -- wrapped across 20+ files |
| RTE TipTap Config | DONE -- toolbar, extensions, HTML preservation |
| Obsolete API Calls | DONE -- .Children/.Parent properties converted to methods |
| API Keys Externalized | DONE -- moved to appsettings.json |
| Orphan Element Views | DONE -- 4 removed (commit 81d4ca6) |
Overall migration completeness: ~95%
Completed Phases¶
| Phase | Scope | Status |
|---|---|---|
| Phase 1 -- P0 Fixes | Data protection files, camelCase duplicates, DT 1055 | DONE |
| Phase 2 -- MkDocs | Documentation site setup | DONE |
| Phase 3 -- P1 Fixes | Page templates, component views, calculator localization, video slides, orphan audit | DONE |
| Phase 4 -- Bootstrap 5 | Bootstrap 4.4.1 to 5.3.3 upgrade (package, templates, layouts, components, partials, JS, CSS) | DONE |
| Phase 5 -- P2/P3 | LoanBoxes, API keys, obsolete API calls | DONE |
Key Decisions Made¶
-
Per-datatype element types retained. Report 11 confirmed zero identical layouts across datatypes. Layout/area wrapper deduplication is impossible without breaking editor permissions. This architecture is correct by design.
-
Settings deduplication deferred. 29 potential savings, but GUID remapping risk across all client databases outweighs the benefit. No functional impact from keeping them separate.
-
4-level BlockGrid hierarchy retained. Row Config, Layout, Area Wrapper, Content. Area Wrappers preserve v8 cell-level styles. Mitigated via Content Templates and Quick Add backoffice extension (documented in Report 13).
-
Bootstrap 5.3.3 chosen. Latest stable release. All
data-*attributes converted todata-bs-*, class renames applied across all views and JS files. -
3 page templates declared obsolete:
TrustpilotWidget,LoanBoxContactControl,NewsCategoryItems. These were v8-specific widgets with no content in any client database. -
Flat directory structure retained for
blockgrid/Components/. Subdirectory organization (Report 08 Option A) was deferred -- the prefix-based naming convention (grid_element_*,grid_builtin_*, etc.) provides sufficient organization.
Remaining Work¶
P2 -- Medium (non-blocking for go-live)¶
| # | Item | Detail |
|---|---|---|
| 1 | Calculator slider UI | Number inputs instead of jQuery UI sliders. Hidden fields and data attributes are in place. |
| 2 | LoanBoxes performance | DescendantsOrSelf() traverses content tree on every render. Should use ISiteSettingsService. |
| 3 | Calculator form validation | Basic HTML5 only. Needs jQuery validation with localization support. |
P3 -- Low (post-launch cleanup)¶
| # | Item | Detail |
|---|---|---|
| 4 | Test DataType 2236 cleanup | Not checked across client databases. Candidate for removal if unused everywhere. |
| 5 | Content usage audit | Detailed content-per-element-type breakdown (Report 04 Section 7). |
| 6 | Settings element type deduplication | 29 savings. Deferred due to GUID remapping risk. |
Component Readiness¶
| Component | Status | Notes |
|---|---|---|
| News | 100% | All display modes, culture/visibility filters, property casing verified. |
| Grid Layouts | 100% | Property whitelist confirmed complete. 11 v8 files consolidated to 3. |
| Testimonials | 100% | Slider layout, image suppression, read-more link, default mode all fixed. |
| LoanBoxes | 100% | All 4 modes (Tabs, Boxes, FlipCards, Accordion). P2 performance item deferred. |
| Calculators | 95% | All types implemented, localization done. P2 slider UI and form validation remain. |
| Data Protection | 100% | All 5 components working. Duplicate camelCase views removed. |
| Video Slides | 100% | YouTube, Vimeo, and internal video slides created. |
| Announcement/Spotlight | 100% | Scroll and spotlight grid verified working. |
Key Numbers¶
| Metric | Value |
|---|---|
| V8 views (total) | 257 |
| V17 views (migrated) | ~246 (~96%) |
| Page templates | 45 of 48 (3 obsolete) |
| Component views | 146 (121 blockgrid + 7 blocklist + 18 SiteLayout) |
| V8 grid datatypes | 14 |
| V17 BlockGrid datatypes | 13 (one v8 DT had no doc type) |
| V17 element types (after fresh migration) | ~430 (~25 duplicates eliminated) |
| Element types in-use (in content) | 164 |
| Element types configured (no content) | 217 |
| Element types orphaned | 74 (30 infrastructure + 44 content) |
| Migration tool fix commits | 3 (09935d2, 164069f, 76a17cf) |
| Bootstrap 5 commits | 5 (643174b, 4cfa267, 7cd8ee8, f7f697c, 08e9a5d) |
| Bootstrap CSS replacements | 1,142 across 159 files |
| Content nodes in v17 | 115 |
| Nodes with BlockGrid data | 76 |
| Duplicate view pairs | 0 (all resolved) |
| Case sensitivity issues | 0 (all resolved) |
| P0/P1 issues | ALL RESOLVED |
| P2 items remaining | 3 |
| P3 items remaining | 3 |
4-Level BlockGrid Hierarchy¶
The v17 BlockGrid uses a strict 4-level nesting hierarchy:
Row Config -> Layout -> Area Wrapper -> Content
- Layout AllowAtRoot is set to
false, enforcing that editors must start with a Row Config. - Frontend rendering (
BootstrapGrid.cshtml) handles all 4 levels. No changes needed. - Content migration (
GridLayoutToBlockGridMigrator.cs) creates proper 4-level nesting. Existing migrated content is correct.
Why 4 Levels Are Necessary¶
Area Wrappers preserve v8 cell-level styles (background color, padding, margins, etc.) that have no other home in the BlockGrid model. The Row Config level provides page-level section configuration (full-width breakout, container behavior). Both are required for feature parity with v8.
Backoffice UX Mitigations¶
The 4-level hierarchy approximately doubles editor clicks. Three mitigations are documented:
- Content Templates (lowest effort) -- pre-populated page blueprints that eliminate hierarchy setup.
- Quick Add backoffice extension -- toolbar button offering presets like "Add Full Width Row" in one click.
- Auto-insert single-choice levels -- skip the catalogue modal when only one option exists (5 of 14 datatypes).
Report Index¶
| Report | File | Topic |
|---|---|---|
| 00 | 00-SUMMARY.md |
This summary |
| 01 | 01-views-migration-audit.md |
V8 to v17 views comparison |
| 02 | 02-duplicate-views-analysis.md |
Duplicate view resolution |
| 03 | 03-v8-grid-baseline.md |
Immutable v8 reference |
| 04 | 04-v17-element-type-audit.md |
455 element types audit |
| 05 | 05-grid-deduplication-analysis.md |
Deduplication analysis and decisions |
| 06 | 06-view-element-crossref.md |
View/element type cross-reference |
| 07 | 07-deep-dive-analysis.md |
Component deep-dive analysis |
| 08 | 08-fix-plan-frontend.md |
Frontend naming fix plan |
| 09 | 09-fix-plan-doctypes.md |
DocType/DataType fix plan |
| 10 | 10-fix-plan-logic.md |
Component logic fix plan |
| 11 | 11-grid-dedup-deep-investigation.md |
Grid dedup investigation (zero identical layouts confirmed) |
| 12 | 12-grid-architecture-explained.md |
Grid architecture documentation |
| 13 | 13-grid-migration-visual-plan.md |
Content migration and UX mitigations |
Supporting Data Files¶
| File | Purpose |
|---|---|
_v17-api-results.json |
Full API results (element types, doc types, tree) |
_blockgrid-configs.json |
All 13 BlockGrid data type configurations |
_content-usage.json |
Content node analysis -- element type usage counts |
_element-type-status.json |
Classified: in-use / configured / orphaned |