12 -- Grid Migration Architecture: Complete Explanation¶
Date: 2026-02-26
Sources: GridConfigurationMigrationService.cs, GuidGenerationUtility.cs, GridMigrationDatabaseHelper.cs, _v17-api-results.json, _blockgrid-configs.json, 03-v8-grid-baseline.md, 11-grid-dedup-deep-investigation.md
Section A: How It Works Now¶
A.1 Element Type Categories and Alias Patterns¶
The migration tool creates six categories of element types per v8 Grid datatype. Here are the exact patterns:
| Category | Alias Pattern | GUID Input String | Per-DT? | Example |
|---|---|---|---|---|
| Layout | grid_{dtId}_layout_{sanitizedName} |
layout_{dtId}_{sanitizedName} |
Yes | grid_1257_layout_fullwidth |
| Area Wrapper | grid_{dtId}_areawrapper_{sanitizedName}_{areaIdx} |
settings_{dtId}_areaWrapper_{sanitizedName}_{areaIdx} |
Yes | grid_1257_areawrapper_fullwidth_0 |
| Row Config | grid_{dtId}_rowconfig_{templateAlias} |
rowconfig_{dtId}_{templateAlias} |
Yes | grid_1257_rowconfig_1ColumnLayout |
| Row Settings | grid_{dtId}_rowsettings |
settings_{dtId}_rowSettings |
Yes | grid_1257_rowsettings |
| Cell Settings | grid_{dtId}_cellsettings |
settings_{dtId}_cellSettings |
Yes | grid_1257_cellsettings |
| Block Settings | grid_{dtId}_blocksettings |
settings_{dtId}_blockSettings |
Yes | grid_1257_blocksettings |
| Content (built-in) | grid_builtin_{normalizedAlias} |
grid_builtin_{normalizedAlias} |
No | grid_builtin_rte |
| Content (DTGE/custom) | grid_element_{normalizedAlias} or original v8 alias |
content_{normalizedAlias} or original v8 GUID |
No | grid_element_testimonialcompletegrideditor |
Key observations:
- SanitizeAlias() strips all non-alphanumeric characters and lowercases. E.g., "Full Width" -> "fullwidth", "full & thirds thirds" -> "fullthirdsthirds".
- Row config aliases use a different format: templateName.ToLower().Replace(" ", "-"). E.g., "1 column layout" -> "1ColumnLayout" (case preserved differently).
- Content element types do NOT include dataTypeId in their GUID generation -- they are shared across datatypes.
A.2 GUID Generation¶
All GUIDs are deterministic via MD5 hashing in GuidGenerationUtility.cs:
public static Guid GenerateFromString(string input)
{
using (var md5 = MD5.Create())
{
var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
return new Guid(hash);
}
}
Input string patterns per category:
| Method | Input Format | Includes DataTypeId? |
|---|---|---|
GenerateForLayoutElementType(dtId, name) |
layout_{dtId}_{name} |
Yes |
GenerateForRowConfigElementType(dtId, name) |
rowconfig_{dtId}_{name} |
Yes |
GenerateForSettingsElementType(dtId, type) |
settings_{dtId}_{type} |
Yes |
GenerateForBlockArea(dtId, block, idx) |
area_{dtId}_{block}_{idx} |
Yes |
GenerateForContentElementType(alias) |
content_{alias} |
No |
GenerateForBlockGroup(dtId, group) |
blockgroup_{dtId}_{group} |
Yes |
A.3 Backoffice Folder Structure¶
All migration-created element types are placed under node ID 1314 (the "GridEditors" folder) in the Umbraco document type tree, unless the element type was found via "Path A" (reusing an existing v8 element type), in which case it preserves its original parent folder.
From GridMigrationDatabaseHelper.cs line 72:
There is no sub-folder structure within the GridEditors folder. ALL migration-created types (layouts, area wrappers, row configs, settings) go into the same flat folder. The v17 backoffice shows them in a single flat list under "GridEditors".
Document Types (root)
|
+-- GridEditors (node 1314)
| |-- grid_1055_areawrapper_fullwidth_0 (Area Wrapper)
| |-- grid_1055_areawrapper_half_0 (Area Wrapper)
| |-- grid_1055_areawrapper_half_1 (Area Wrapper)
| |-- grid_1055_areawrapper_thirds_0 (Area Wrapper)
| |-- grid_1055_areawrapper_thirds_1 (Area Wrapper)
| |-- grid_1055_areawrapper_thirds_2 (Area Wrapper)
| |-- grid_1055_blocksettings (Settings)
| |-- grid_1055_cellsettings (Settings)
| |-- grid_1055_layout_fullwidth (Layout)
| |-- grid_1055_layout_half (Layout)
| |-- grid_1055_layout_thirds (Layout)
| |-- grid_1055_rowconfig_1ColumnLayout (Row Config)
| |-- grid_1055_rowconfig_leftNav (Row Config)
| |-- grid_1055_rowconfig_rightNav (Row Config)
| |-- grid_1055_rowsettings (Settings)
| |-- grid_1093_areawrapper_fullwidth_0 (Area Wrapper)
| |-- grid_1093_areawrapper_twotwo_0 (Area Wrapper)
| |-- grid_1093_areawrapper_twotwo_1 (Area Wrapper)
| |-- ... (hundreds more)
| |-- grid_builtin_embed (Content - shared)
| |-- grid_builtin_media (Content - shared)
| |-- grid_builtin_quote (Content - shared)
| |-- grid_builtin_rte (Content - shared)
| |-- grid_builtin_submenu (Content - shared)
| |-- grid_element_calculatorsgrideditor (Content - shared)
| |-- grid_element_cardcontrol (Content - shared)
| |-- ... (more shared content types)
|
+-- (Original v8 folders with DTGE element types that were found via Path A)
|-- heroItem, cTAItem, spotlightItem, etc.
A.4 Complete Walkthrough: Standard Page Grid (DataType 1257)¶
This is the most complex datatype with 17 row layouts and 3 templates.
Step 1: Block Groups Created (2 groups)
- Layouts group: GUID from blockgroup_1257_Layouts
- GridEditors group: GUID from blockgroup_1257_GridEditors
Step 2: Layout Element Types Created (17 layouts)
| Alias | Name | Areas | Column Widths |
|---|---|---|---|
grid_1257_layout_fullwidth |
Full Width | 1 | 12 |
grid_1257_layout_half |
Half | 2 | 6+6 |
grid_1257_layout_thirds |
Thirds | 3 | 4+4+4 |
grid_1257_layout_sidebar |
SideBar | 1 | 12 |
grid_1257_layout_leftnav |
LeftNav | 2 | 4+8 |
grid_1257_layout_rightsidebar |
Right SideBar | 1 | 12 |
grid_1257_layout_fivesevens |
five sevens | 2 | 5+7 |
grid_1257_layout_fullthirdsthirds |
full & thirds thirds | 7 | 12+4+4+4+4+4+4 |
grid_1257_layout_iconcalc |
ICon Calc | 3 | 6+4+2 |
grid_1257_layout_fours |
Fours | 4 | 3+3+3+3 |
grid_1257_layout_textbuttonblock |
text-button-block | 2 | 8+4 |
grid_1257_layout_membershipbenefits |
membership-benefits | 3 | 6+6+12 |
grid_1257_layout_faqhome |
FaqHome | 1 | 12 |
grid_1257_layout_services |
Services | 1 | 12 |
grid_1257_layout_twofourtwofour |
two-four-two-four | 5 | 2+3+2+3+2 |
grid_1257_layout_loanapplicationprocess |
Loan Application Process | 5 | 12+3+3+3+3 |
grid_1257_layout_cardrawtext |
car draw text | 2 | 7+5 |
All layout element types are EMPTY (no properties). Their area configurations are stored in metadata only.
Step 3: Row Config Element Types Created (3 row configs)
| Alias | Name | Areas | Column Widths |
|---|---|---|---|
grid_1257_rowconfig_1ColumnLayout |
1 column layout | 1 | 12 |
grid_1257_rowconfig_leftsidebar |
LeftSidebar | 2 | 4+8 |
grid_1257_rowconfig_rightsidebar |
RightSidebar | 2 | 8+4 |
Row configs are also EMPTY. Their areas allow ALL layout element types for this datatype.
Step 4: Content Element Types (shared, ~108 for DT 1257)
These are shared across datatypes. Examples: grid_builtin_rte, grid_element_testimonialcompletegrideditor, heroItem, cTAItem, etc.
Step 5: Settings Element Types Created (3 settings)
| Alias | Properties |
|---|---|
grid_1257_rowsettings |
class, ID, data-aos, data-aos-offset, data-aos-delay, data-aos-duration, data-aos-easing, background-image, background-color, padding, margin, visible |
grid_1257_cellsettings |
background-color |
grid_1257_blocksettings |
(same as rowsettings + hidden) |
Step 6: Area Wrappers Created (17 per layout, one per area)
For grid_1257_layout_half (2 areas):
- grid_1257_areawrapper_half_0 -- allows: rte, media, embed, quote, headingItem, stripedList, NumberedList, imageList, videoPopOut, donutChart, imageGalleryControl, staffMemberControl, barChart, videoFullWidth, cardControl, faqControls, accordionControls, umbraco_form_picker, Services List, cardItem, ... (31 editors)
- grid_1257_areawrapper_half_1 -- allows: rte, media, macro, quote, headingItem, stripedList, NumberedList, imageList, videoPopOut, donutChart, imageGalleryControl, staffMemberControl, barChart, videoFullWidth, cardControl, faqControls, accordionControls, umbraco_form_picker, Services List, cardItem, ... (32 editors)
Note: Area 0 and Area 1 have DIFFERENT allowed editors (Half area 1 has macro, area 0 doesn't; area 0 has GlobalAddressCompleteGridEditor, area 1 has loanInputCTA).
For grid_1257_layout_fullwidth (1 area, allowAll=true):
- grid_1257_areawrapper_fullwidth_0 -- allows ALL 108 content element types
Step 7: BlockGrid Configuration Built
The final BlockGrid config has a blocks[] array containing:
1. Layout blocks (17): allowAtRoot=false, allowInAreas=true — Layouts go INSIDE Row Config areas, not at root
2. Row config blocks (3): allowAtRoot=true, allowInAreas=false — Row Configs are the only root-level blocks
3. Area wrapper blocks (depends on total area count): allowAtRoot=false, allowInAreas=true, each with one "content" area containing specifiedAllowance
4. Content blocks (~108): allowAtRoot=false, allowInAreas=true, no settings
The strict hierarchy is: Row Config (root) -> Layout -> Area Wrapper -> Content. Only Row Config blocks have allowAtRoot=true.
The full chain for a user adding a "Half" row to a Standard Page:
Row Config "1 column layout" <- root block, 1 area (12 cols)
+-- Layout "Half" <- placed in row config area, 2 areas (6+6)
+-- Area Wrapper (half_0) <- placed in layout area 0, 1 "content" area
| +-- RTE <- content block in area wrapper
| +-- Media <- content block in area wrapper
+-- Area Wrapper (half_1) <- placed in layout area 1, 1 "content" area
+-- RTE <- content block in area wrapper
A.5 Summary of Element Type Counts in v17¶
| Category | Count | Notes |
|---|---|---|
| Layout element types | 62 | Per-datatype |
| Area wrapper element types | 134 | Per-datatype per layout per area |
| Row config element types | 26 | Per-datatype (3 have empty alias) |
| Row settings | 14 | One per datatype |
| Cell settings | 14 | One per datatype |
| Block settings | 14 | One per datatype |
| Content (built-in) | 5 | Shared: rte, media, quote, embed, submenu |
| Content (grid_element_*) | 28 | Shared across datatypes |
| Total grid_* types | 297 |
Plus approximately 50-60 additional DTGE/Path A element types that use their original v8 aliases (not prefixed with grid_).
Section B: The Duplication Picture¶
B.1 "FullWidth" Layout Across All Datatypes¶
The fullwidth or full layout name (both normalize to a 1-area, 12-column layout) appears in these datatypes:
| DataType (ID) | Layout Alias | Areas | Column Widths | AllowAll? | Allowed Editor Count |
|---|---|---|---|---|---|
| Animated Grid (1534) | grid_1534_layout_fullwidth |
1 | 12 | No | 42 specific editors |
| Article Controls (1055) | grid_1055_layout_fullwidth |
1 | 12 | No | 27 specific editors |
| articleGrid (1683) | grid_1683_layout_full |
1 | 12 | No | 31 specific editors |
| Contact us Grid (1093) | grid_1093_layout_fullwidth |
1 | 12 | No | 8 specific editors |
| Cookie Grid (1709) | grid_1709_layout_full |
1 | 12 | Yes | all (8 content types) |
| Footer Grid (1127) | grid_1127_layout_fullwidth |
1 | 12 | No | 20 specific editors |
| Full width Grid (1736) | grid_1736_layout_fullwidth |
1 | 12 | No | 6 specific editors |
| Full Width Grid Bottom (1459) | grid_1459_layout_fullwidth |
1 | 12 | No | 1 specific editor (rte) |
| Homepage Grid (1151) | grid_1151_layout_fullwidth |
1 | 12 | No | 38 specific editors |
| services Grid (1780) | grid_1780_layout_full |
1 | 12 | No | 13 specific editors |
| Sp with Nav Left (1798) | grid_1798_layout_full |
1 | 12 | No | 14 specific editors |
| Standard Page FW (1803) | grid_1803_layout_full |
1 | 12 | No | 28 specific editors |
| Standard Page (1257) | grid_1257_layout_fullwidth |
1 | 12 | Yes | all (108 content types) |
Structural comparison: IDENTICAL. Every "fullwidth/full" layout has exactly 1 area with columnSpan=12. The ONLY difference is the allowed editors list.
B.2 "Half" Layout Across All Datatypes¶
| DataType (ID) | Layout Alias | Areas | Columns | Area 0 Editors | Area 1 Editors |
|---|---|---|---|---|---|
| Animated Grid (1534) | grid_1534_layout_half |
2 | 6+6 | allowAll | allowAll |
| Article Controls (1055) | grid_1055_layout_half |
2 | 6+6 | 18 restricted | 19 restricted |
| articleGrid (1683) | grid_1683_layout_half |
2 | 6+6 | allowAll | allowAll |
| Cookie Grid (1709) | grid_1709_layout_half |
2 | 6+6 | allowAll | allowAll |
| Full width Grid (1736) | grid_1736_layout_half |
2 | 6+6 | 6 restricted | 5 restricted |
| Homepage Grid (1151) | grid_1151_layout_half |
2 | 6+6 | 23 restricted | 22 restricted |
| Sp with Nav Left (1798) | grid_1798_layout_half |
2 | 6+6 | 10 restricted | 8 restricted |
| Standard Page FW (1803) | grid_1803_layout_half |
2 | 6+6 | 25 restricted | 26 restricted |
| Standard Page (1257) | grid_1257_layout_half |
2 | 6+6 | 31 restricted | 32 restricted |
Structural comparison: IDENTICAL. Every "Half" has exactly 2 areas, both with columnSpan=6. The allowed editors differ not only between datatypes but often between Area 0 and Area 1 within the same datatype.
B.3 "Thirds" Layout Across All Datatypes¶
| DataType (ID) | Layout Alias | Areas | Columns | Editor Restrictions |
|---|---|---|---|---|
| Animated Grid (1534) | grid_1534_layout_thirds |
3 | 4+4+4 | allowAll, allowAll, allowAll |
| Article Controls (1055) | grid_1055_layout_thirds |
3 | 4+4+4 | 12 / 13 / 13 restricted |
| articleGrid (1683) | grid_1683_layout_thirds |
3 | 4+4+4 | allowAll, allowAll, allowAll |
| Cookie Grid (1709) | grid_1709_layout_thirds |
3 | 4+4+4 | allowAll, allowAll, allowAll |
| Full width Grid (1736) | grid_1736_layout_thirds |
3 | 4+4+4 | 6 / 6 / 6 restricted |
| Homepage Grid (1151) | grid_1151_layout_thirds |
3 | 4+4+4 | 14 / 14 / 15 restricted |
| Sp with Nav Left (1798) | grid_1798_layout_thirds |
3 | 4+4+4 | 8 / 8 / 8 restricted |
| Standard Page FW (1803) | grid_1803_layout_thirds |
3 | 4+4+4 | 17 / 22 / 23 restricted |
| Standard Page (1257) | grid_1257_layout_thirds |
3 | 4+4+4 | 14 / 15 / 14 restricted |
Structural comparison: IDENTICAL. Every "Thirds" has exactly 3 areas, all with columnSpan=4. Again, only editor restrictions differ.
B.4 Answer to the Key Question¶
Do "fullwidth" layouts across datatypes have the SAME number of areas with the SAME column widths?
YES. Column structures are IDENTICAL for every shared layout name:
| Layout Name | Structure | Same Across All DTs? |
|---|---|---|
| fullwidth/full | 1 area: [12] | Yes |
| half | 2 areas: [6, 6] | Yes |
| thirds | 3 areas: [4, 4, 4] | Yes |
| leftnav | 2 areas: [4, 8] | Yes |
| sidebar | 1 area: [12] | Yes |
| 2columnlayout | varies | No (4+8 vs 8+4) |
| rightsidebar | varies | No (12 vs 8+4) |
The differences are ONLY in which content editors are allowed in each area. The column grid geometry is always the same for the same layout name.
B.5 Unique Layouts by DataType¶
| DataType (ID) | Total Layouts | Unique to This DT |
|---|---|---|
| Standard Page Grid (1257) | 17 | 11 (fours, textbuttonblock, membershipbenefits, faqhome, services, twofourtwofour, loanapplicationprocess, cardrawtext, fullthirdsthirds, iconcalc, fivesevens) |
| Standard Page FW (1803) | 8 | 3 (careerfull, careerhalf, twofivefive, cookieconsent) |
| Footer Grid (1127) | 6 | 3 (ninethree, sixfiveone, fourfivethree, sixths) |
| Homepage Grid (1151) | 4 | 1 (twothirds) |
| Contact us Grid (1093) | 2 | 1 (twotwo) |
| test data type (2236) | 2 | 2 (headline, article) |
| All others | 1-4 each | 0 (use only fullwidth/half/thirds/leftnav/sidebar) |
Section C: Could It Be Different?¶
C.1 The Hypothesis: Shared Layout Element Types¶
Since column structures are identical for shared layout names, could we create ONE layout_fullwidth element type and manage editor permissions differently?
The BlockGrid architecture has a critical constraint: the specifiedAllowance array in a layout's area configuration is part of the BlockGrid datatype config, not the element type definition. This means:
- The layout element type itself is EMPTY (no properties) -- it is already just a "label" for the grid structure.
- The area configurations (columnSpan, specifiedAllowance) are defined in the
blocks[].areas[]within the BlockGrid datatype. - Each BlockGrid datatype has its OWN
blocks[]array with its own area configurations.
So in theory, sharing the layout element type GUID is possible because each BlockGrid datatype could still define different specifiedAllowance in its own config. BUT:
C.2 Why Area Wrappers Still Cannot Be Shared¶
The migration tool uses a two-level indirection:
Layout Area -> specifiedAllowance -> [Area Wrapper GUID]
Area Wrapper -> inner area -> specifiedAllowance -> [content type GUIDs]
If we share the layout element type GUID, the layout's areas in each BlockGrid datatype already have separate specifiedAllowance entries. BUT those entries point to area wrapper element types, and each area wrapper encodes a specific set of allowed content types.
The area wrappers MUST remain per-datatype because they encode different allowance lists. A fullwidth_0 area wrapper for Standard Page Grid allows 108 content types while the same name for Contact us Grid allows only 8.
C.3 What Sharing Would Actually Save¶
If we shared layout element types across datatypes:
| What | Current Count | Shared Count | Savings |
|---|---|---|---|
| Layout element types | 62 | ~31 | 31 element types |
| Area wrappers | 134 | 134 (unchanged) | 0 |
| Row configs | 26 | ~15 | ~11 element types |
| Settings | 42 | 42 (unchanged) | 0 |
| Content types | ~33 | ~33 (already shared) | 0 |
| Total | ~297 | ~255 | ~42 empty types |
The savings are minimal: ~42 element types, all of which are EMPTY (no properties). The area wrappers, which are the bulk of the element types and contain the actual logic, cannot be shared.
C.4 What the Migration Tool Would Need to Change¶
To share layout element types:
-
GuidGenerationUtility.GenerateForLayoutElementType: RemovedataTypeIdfrom the input string: -
CreateLayoutElementTypesAsync: Skip creation if the element type already exists. Check by GUID first. -
BuildBlockGridConfigurationAsync: The area wrapper creation already uses per-datatype GUIDs, so no change needed there. -
Content migration: The
GridLayoutToBlockGridMigratorlooks up layout element types bydataTypeId + layoutAlias. The tracker registration would need to map shared GUIDs. -
Row config types: Similar change -- remove
dataTypeIdfrom row config GUID generation.
Risk level: LOW for layout/rowconfig types since they are empty. The changes are isolated to GUID generation and tracker lookups.
C.5 ASCII Tree Comparison¶
CURRENT STRUCTURE:
GridEditors/ (node 1314) -- FLAT, ~297 element types
|
|-- grid_1055_areawrapper_fullwidth_0 grid_1093_areawrapper_fullwidth_0
|-- grid_1055_areawrapper_half_0 grid_1093_areawrapper_twotwo_0
|-- grid_1055_areawrapper_half_1 grid_1093_areawrapper_twotwo_1
|-- grid_1055_areawrapper_thirds_0 grid_1093_blocksettings
|-- grid_1055_areawrapper_thirds_1 grid_1093_cellsettings
|-- grid_1055_areawrapper_thirds_2 grid_1093_layout_fullwidth
|-- grid_1055_blocksettings grid_1093_layout_twotwo
|-- grid_1055_cellsettings grid_1093_rowconfig_fullWidth
|-- grid_1055_layout_fullwidth grid_1093_rowconfig_leftNav
|-- grid_1055_layout_half grid_1093_rowconfig_rightNav
|-- grid_1055_layout_thirds grid_1093_rowsettings
|-- grid_1055_rowconfig_1ColumnLayout ... (repeat for 12 more datatypes)
|-- grid_1055_rowconfig_leftNav grid_builtin_embed
|-- grid_1055_rowconfig_rightNav grid_builtin_media
|-- grid_1055_rowsettings grid_builtin_quote
| grid_builtin_rte
| grid_builtin_submenu
| grid_element_calculatorsgrideditor
| grid_element_cardcontrol
| ... (28 more shared content types)
PROPOSED STRUCTURE (with shared layouts):
GridEditors/ (node 1314) -- ~255 element types
|
|-- Shared Layouts (would still be flat in same folder):
| |-- grid_shared_layout_fullwidth (shared by 10+ DTs)
| |-- grid_shared_layout_half (shared by 9 DTs)
| |-- grid_shared_layout_thirds (shared by 9 DTs)
| |-- grid_shared_layout_leftnav (shared by 3 DTs)
| |-- grid_shared_layout_sidebar (shared by 3 DTs)
| |-- grid_1127_layout_fourfivethree (unique to Footer Grid)
| |-- grid_1127_layout_ninethree (unique to Footer Grid)
| |-- grid_1127_layout_sixfiveone (unique to Footer Grid)
| |-- grid_1127_layout_sixths (unique to Footer Grid)
| |-- grid_1257_layout_cardrawtext (unique to Standard Page)
| |-- ... (remaining unique layouts)
|
|-- Area wrappers (UNCHANGED -- 134 types, still per-DT):
| |-- grid_1055_areawrapper_fullwidth_0
| |-- grid_1055_areawrapper_half_0
| |-- ... (all 134 remain)
|
|-- Settings (UNCHANGED -- 42 types):
| |-- grid_1055_rowsettings, cellsettings, blocksettings
| |-- ... (all 42 remain)
|
|-- Content types (UNCHANGED -- ~33 shared types):
| |-- grid_builtin_rte, media, quote, embed, submenu
| |-- grid_element_*, DTGE types
The visual difference in the backoffice would be small: approximately 42 fewer items in the flat list.
Section D: Backoffice Preview¶
D.1 Current State: Flat List Under GridEditors¶
The Umbraco v17 backoffice Document Types section currently shows ALL migration-created element types in a single flat folder. Here is what an admin sees:
Document Types
+-- [GridEditors] (click to expand -- 297+ items)
| |
| |-- (unnamed) <- grid_1534_rowconfig_ (empty alias templates)
| |-- (unnamed) <- grid_1780_rowconfig_
| |-- (unnamed) <- grid_1798_rowconfig_
| |-- 1 column layout <- grid_1534_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_1055_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_1709_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_1736_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_1459_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_1151_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_1803_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_1257_rowconfig_1ColumnLayout
| |-- 1 column layout <- grid_2236_rowconfig_1ColumnLayout
| |-- 2 column layout <- grid_1534_rowconfig_2ColumnLayout
| |-- 2 column layout <- grid_1683_rowconfig_2ColumnLayout
| |-- 2 column layout <- grid_1459_rowconfig_2ColumnLayout
| |-- 2 column layout <- grid_2236_rowconfig_2ColumnLayout
| |-- Area 0 <- grid_1534_areawrapper_fullwidth_0
| |-- Area 0 <- grid_1534_areawrapper_half_0
| |-- Area 0 <- grid_1534_areawrapper_thirds_0
| |-- Area 0 <- grid_1093_areawrapper_fullwidth_0
| |-- Area 0 <- grid_1093_areawrapper_twotwo_0
| |-- Area 0 <- grid_1709_areawrapper_full_0
| |-- Area 0 <- grid_1709_areawrapper_half_0
| |-- Area 0 (x80 total) <- ... 80 area wrappers with index 0
| |-- Area 1 <- grid_1534_areawrapper_half_1
| |-- Area 1 (x40 total) <- ... 40 area wrappers with index 1
| |-- Area 2 (x20 total) <- ... area wrappers with index 2
| |-- Area 3 (x7 total) <- ... area wrappers with index 3
| |-- Area 4 (x5 total) <- ... area wrappers with index 4
| |-- Area 5 (x2 total) <- ... area wrappers with index 5
| |-- Area 6 (x1 total) <- grid_1257_areawrapper_fullthirdsthirds_6
| |-- Article <- grid_2236_layout_article
| |-- Calculators Grid Editor <- grid_element_calculatorsgrideditor
| |-- car draw text <- grid_1257_layout_cardrawtext
| |-- Card Control <- grid_element_cardcontrol
| |-- Career Full <- grid_1803_layout_careerfull
| |-- Career Half <- grid_1803_layout_careerhalf
| |-- CookieConsent <- grid_1803_layout_cookieconsent
| |-- Embed <- grid_builtin_embed
| |-- Faq Accordion Home <- grid_element_faq_accordion_home
| |-- FaqHome <- grid_1257_layout_faqhome
| |-- five sevens <- grid_1257_layout_fivesevens
| |-- four five three <- grid_1127_layout_fourfivethree
| |-- Fours <- grid_1257_layout_fours
| |-- full <- grid_1683_layout_full
| |-- Full <- grid_1709_layout_full
| |-- Full <- grid_1780_layout_full
| |-- Full <- grid_1803_layout_full
| |-- full & thirds thirds <- grid_1257_layout_fullthirdsthirds
| |-- Full Width <- grid_1093_layout_fullwidth
| |-- Full width <- grid_1093_rowconfig_fullWidth
| |-- Full Width <- grid_1736_layout_fullwidth
| |-- Full Width <- grid_1798_layout_full
| |-- Full Width <- grid_1257_layout_fullwidth
| |-- FullWidth <- grid_1534_layout_fullwidth
| |-- FullWidth <- grid_1055_layout_fullwidth
| |-- FullWidth <- grid_1127_layout_fullwidth
| |-- FullWidth <- grid_1127_rowconfig_fullwidth
| |-- FullWidth <- grid_1459_layout_fullwidth
| |-- fullWidth <- grid_1151_layout_fullwidth
| |-- GE Social Feeds <- grid_element_gesocialfeeds
| |-- Global Address Complete Grid Editor <- grid_element_globaladdresscompletegrideditor
| |-- Grid 1055 Block Settings <- grid_1055_blocksettings
| |-- Grid 1055 Cell Settings <- grid_1055_cellsettings
| |-- Grid 1055 Row Settings <- grid_1055_rowsettings
| |-- Grid 1093 Block Settings <- grid_1093_blocksettings
| |-- ... (x14 blocksettings, x14 cellsettings, x14 rowsettings = 42 settings types)
| |-- Half <- grid_1534_layout_half (x9 datatypes)
| |-- Headline <- grid_2236_layout_headline
| |-- ICon Calc <- grid_1257_layout_iconcalc
| |-- Large Google Map <- grid_element_largegooglemap
| |-- Large Leaflet Map <- grid_element_largeleafletmap
| |-- Left Column <- grid_1803_rowconfig_leftColumn
| |-- Left Nav <- grid_1055_rowconfig_leftNav
| |-- Left Nav <- grid_1093_rowconfig_leftNav
| |-- LeftNav <- grid_1709_layout_leftnav
| |-- LeftNav <- grid_1459_layout_leftnav
| |-- LeftNav <- grid_1257_layout_leftnav
| |-- LeftSidebar <- grid_1257_rowconfig_leftsidebar
| |-- Loan Application Process <- grid_1257_layout_loanapplicationprocess
| |-- Loan Boxes Complete Grid Editor <- grid_element_loanboxescompletegrideditor
| |-- Media <- grid_builtin_media
| |-- membership-benefits <- grid_1257_layout_membershipbenefits
| |-- News Complete Grid Editor <- grid_element_newscompletegrideditor
| |-- nineThree <- grid_1127_layout_ninethree
| |-- PS Data Protection DPO <- grid_element_psdataprotectiondpo
| |-- ... (5 more PS Data Protection types)
| |-- PS Fancy Video <- grid_element_psfancyvideo
| |-- PS Styled Heading <- grid_element_psstyledheading
| |-- Quote <- grid_builtin_quote
| |-- Rich Text Editor <- grid_builtin_rte
| |-- right column <- grid_1803_rowconfig_rightColumn
| |-- Right Nav <- grid_1055_rowconfig_rightNav
| |-- Right Nav <- grid_1093_rowconfig_rightNav
| |-- Right SideBar <- grid_1257_layout_rightsidebar
| |-- RightSidebar <- grid_1257_rowconfig_rightsidebar
| |-- Services <- grid_1257_layout_services
| |-- Services List <- grid_element_services_list
| |-- Services List Image <- grid_element_services_list_image
| |-- Side Bar <- grid_1780_layout_sidebar
| |-- sideBar <- grid_1803_layout_sidebar
| |-- SideBar <- grid_1257_layout_sidebar
| |-- six Five One <- grid_1127_layout_sixfiveone
| |-- Sixths <- grid_1127_layout_sixths
| |-- Social Footer <- grid_element_socialfooter
| |-- Sticky Social <- grid_element_stickysocial
| |-- SubMenu <- grid_builtin_submenu
| |-- Testimonial <- grid_element_testimonial
| |-- Testimonial Complete Grid Editor <- grid_element_testimonialcompletegrideditor
| |-- Testimonial Control <- grid_element_testimonialcontrol
| |-- Testimonial List <- grid_element_testimoniallist
| |-- Testimonials <- grid_element_testimonials
| |-- Testimonials Grid Editor <- grid_element_testimonialsgrideditor
| |-- text-button-block <- grid_1257_layout_textbuttonblock
| |-- Third <- grid_1127_layout_third
| |-- Thirds <- grid_1534_layout_thirds (x9 datatypes)
| |-- Twitter <- grid_element_twitter
| |-- Two & Two <- grid_1093_layout_twotwo
| |-- Two Five Five <- grid_1803_layout_twofivefive
| |-- two thirds <- grid_1151_layout_twothirds
| |-- two-four-two-four <- grid_1257_layout_twofourtwofour
| |
| +-- (Total: ~297 items in a flat list)
|
+-- [Grid Element Types] (original v8 DTGE folders, ~50-60 items)
| |-- heroItem
| |-- cTAItem
| |-- spotlightItem
| |-- ... (preserved from v8 with original aliases)
D.2 The Problems with the Current Backoffice View¶
-
134 area wrappers all named "Area 0", "Area 1", etc. -- completely indistinguishable in the backoffice list without examining the alias.
-
9 items named "Half", 10+ named "FullWidth/Full Width/fullWidth" -- same problem, no visual way to tell which belongs to which datatype.
-
42 settings items named "Grid NNNN Row/Cell/Block Settings" -- the numeric IDs are meaningless to an admin.
-
3 items with empty display names -- the unnamed templates from datatypes 1534, 1780, 1798.
-
No folder grouping by datatype -- everything is mixed together alphabetically.
D.3 Proposed Organized Structure (If Sub-Folders Were Added)¶
If the migration tool created sub-folders by datatype:
Document Types
+-- [GridEditors]
| |
| +-- [Shared Content Types] (33 items)
| | |-- grid_builtin_embed
| | |-- grid_builtin_media
| | |-- grid_builtin_quote
| | |-- grid_builtin_rte
| | |-- grid_builtin_submenu
| | |-- grid_element_calculatorsgrideditor
| | |-- ... (28 more)
| |
| +-- [Standard Page Grid (1257)] (56 items)
| | +-- [Layouts] (17 items)
| | | |-- Full Width
| | | |-- Half
| | | |-- Thirds
| | | |-- SideBar
| | | |-- ... (13 more)
| | +-- [Area Wrappers] (36 items)
| | | |-- fullwidth / area 0
| | | |-- half / area 0
| | | |-- half / area 1
| | | |-- thirds / area 0, 1, 2
| | | |-- ... (30 more)
| | +-- [Row Configs] (3 items)
| | | |-- 1 column layout
| | | |-- LeftSidebar
| | | |-- RightSidebar
| | +-- [Settings] (3 items)
| | |-- Row Settings
| | |-- Cell Settings
| | |-- Block Settings
| |
| +-- [Homepage Grid (1151)] (18 items)
| | +-- [Layouts] (4 items)
| | +-- [Area Wrappers] (8 items)
| | +-- [Row Configs] (1 item)
| | +-- [Settings] (3 items)
| |
| +-- [Animated Grid (1534)] (16 items)
| | +-- [Layouts] (3 items)
| | +-- [Area Wrappers] (6 items)
| | +-- [Row Configs] (2 items)
| | +-- [Settings] (3 items)
| |
| +-- [Footer Grid (1127)] (24 items)
| | +-- [Layouts] (6 items)
| | +-- [Area Wrappers] (12 items)
| | +-- [Row Configs] (1 item)
| | +-- [Settings] (3 items)
| |
| +-- [Standard Page Full Width (1803)] (24 items)
| | +-- ... (same structure)
| |
| +-- ... (9 more datatype folders)
This would make it much easier for administrators to understand what belongs to what, though it requires additional folder creation in GridMigrationDatabaseHelper.
D.4 Element Type Counts Per DataType¶
| DataType | Layouts | Area Wrappers | Row Configs | Settings | Total Per-DT |
|---|---|---|---|---|---|
| Standard Page Grid (1257) | 17 | 36 | 3 | 3 | 59 |
| Standard Page FW (1803) | 8 | 11 | 3 | 3 | 25 |
| Footer Grid (1127) | 6 | 12 | 1 | 3 | 22 |
| Homepage Grid (1151) | 4 | 8 | 1 | 3 | 16 |
| Animated Grid (1534) | 3 | 6 | 3 | 3 | 15 |
| articleGrid (1683) | 3 | 6 | 1 | 3 | 13 |
| Article Controls (1055) | 3 | 6 | 3 | 3 | 15 |
| Cookie Grid (1709) | 4 | 8 | 1 | 3 | 16 |
| Sp with Nav Left (1798) | 3 | 6 | 1 | 3 | 13 |
| Full width Grid (1736) | 3 | 6 | 1 | 3 | 13 |
| Contact us Grid (1093) | 2 | 3 | 3 | 3 | 11 |
| Full Width Grid Bottom (1459) | 2 | 3 | 2 | 3 | 10 |
| services Grid (1780) | 2 | 2 | 1 | 3 | 8 |
| test data type (2236) | 2 | 3 | 2 | 3 | 10 |
| Subtotal (per-DT) | 62 | 116 | 26 | 42 | 246 |
| Shared content types | -- | -- | -- | -- | ~33 |
| DTGE/Path A types | -- | -- | -- | -- | ~50-60 |
| GRAND TOTAL | ~330-340 |
Note: The 134 area wrappers counted in the v17 API results is higher than the 116 calculated from the v8 baseline. The difference (18) comes from area wrappers with additional area indices (e.g., fullthirdsthirds has 7 areas producing 7 area wrappers).
Summary¶
-
The per-datatype architecture for layouts, area wrappers, and row configs is correct by design. Even though column structures are identical across datatypes, the allowed editor lists are always different.
-
Layout element types are EMPTY containers. Sharing them would save ~42 database records but zero properties or data complexity.
-
Area wrappers are the real carriers of editor permissions. They CANNOT be shared because no two datatypes have identical content type sets.
-
Settings deduplication is the only meaningful optimization, potentially saving 29 element types (42 down to 13), but requires GUID remapping in all content data.
-
The biggest backoffice improvement would be folder organization, not deduplication. Creating sub-folders per datatype within GridEditors would make the 297+ flat items navigable without changing any functional behavior.