Skip to content

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:

var parentFolderId = elementType.ParentFolderId ?? 1314;  // Default to GridEditors folder

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:

  1. GuidGenerationUtility.GenerateForLayoutElementType: Remove dataTypeId from the input string:

    // Current:  var input = $"layout_{dataTypeId}_{name}";
    // Proposed: var input = $"layout_shared_{name}";
    

  2. CreateLayoutElementTypesAsync: Skip creation if the element type already exists. Check by GUID first.

  3. BuildBlockGridConfigurationAsync: The area wrapper creation already uses per-datatype GUIDs, so no change needed there.

  4. Content migration: The GridLayoutToBlockGridMigrator looks up layout element types by dataTypeId + layoutAlias. The tracker registration would need to map shared GUIDs.

  5. Row config types: Similar change -- remove dataTypeId from 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

  1. 134 area wrappers all named "Area 0", "Area 1", etc. -- completely indistinguishable in the backoffice list without examining the alias.

  2. 9 items named "Half", 10+ named "FullWidth/Full Width/fullWidth" -- same problem, no visual way to tell which belongs to which datatype.

  3. 42 settings items named "Grid NNNN Row/Cell/Block Settings" -- the numeric IDs are meaningless to an admin.

  4. 3 items with empty display names -- the unnamed templates from datatypes 1534, 1780, 1798.

  5. 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

  1. 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.

  2. Layout element types are EMPTY containers. Sharing them would save ~42 database records but zero properties or data complexity.

  3. Area wrappers are the real carriers of editor permissions. They CANNOT be shared because no two datatypes have identical content type sets.

  4. Settings deduplication is the only meaningful optimization, potentially saving 29 element types (42 down to 13), but requires GUID remapping in all content data.

  5. 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.

Migration documentation by Double for Progress Credit Union