Duffer Derek

Current Path : /var/www/uibuilder.cmshelp.dk/httpdocs/src/app/_components/mappers/
Upload File :
Current File : /var/www/uibuilder.cmshelp.dk/httpdocs/src/app/_components/mappers/pageMapper.ts

import { mapBlockToComponent } from './componentMapper';
import { v4 as uuidv4 } from 'uuid';

interface GridItem {
  contentKey: string;
  columnSpan: number;
  rowSpan: number;
  areas: Array<{
    key: string;
    items: GridItem[];
  }>;
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const mapUmbracoToComponentData = (umbracoData: any) => {
  const mainContent = umbracoData.values.find(
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    (item: any) => item.alias === "mainContent"
  )?.value;

  if (!mainContent?.layout?.["Umbraco.BlockGrid"]) {
    return {};
  }

  const pageId = umbracoData.id;
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const result:{ [key: string]: any } = {
    [pageId]: {
      layouts: [],
      components: {}
    }
  };

  // Find content data by key
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const findContentData = (key: string) => mainContent.contentData.find((item: any) => item.key === key);

  // Process grid items recursively
  const processGridItem = (item: GridItem, parentId?: string) => {
    const contentData = findContentData(item.contentKey);
    if (!contentData) return null;

    // Check if this is a grid (based on contentTypeKey matching grid types)
    const isGrid = [
      '99740655-b76b-4d34-aaac-aace495a39b6', // DEFAULT
      'c996b4ec-1a0d-4a7c-b99d-466c2b153da4', // ONE_COLUMN
      'd6dbc5f5-510a-4020-be64-ef32b741be22', // TWO_COLUMN
      'bfe13a0c-ab38-4f4f-8720-dcf34f8475d1'  // THREE_COLUMN
    ].includes(contentData.contentTypeKey);

    if (isGrid) {
      // Generate a unique ID for this grid instance
      const gridInstanceId = `${contentData.contentTypeKey}-${uuidv4()}`;
      
      const grid = {
        id: gridInstanceId, // Use the unique instance ID
        documentId: contentData.contentTypeKey, // Keep the original content type key
          // eslint-disable-next-line @typescript-eslint/no-explicit-any
        columns: [] as any[][],
        parentId
      };

      // Process areas as columns
      if (item.areas) {
        grid.columns = item.areas.map(area => {
          return area.items.map(subItem => {
            const subItemData = findContentData(subItem.contentKey);
            if (!subItemData) return null;

            // Check if subitem is a grid
            if ([
              '99740655-b76b-4d34-aaac-aace495a39b6',
              'c996b4ec-1a0d-4a7c-b99d-466c2b153da4',
              'd6dbc5f5-510a-4020-be64-ef32b741be22',
              'bfe13a0c-ab38-4f4f-8720-dcf34f8475d1'
            ].includes(subItemData.contentTypeKey)) {
              return processGridItem(subItem, gridInstanceId);
            } else {
              // This is a component
              const component = mapBlockToComponent(subItemData);
              if (component) {
                if (!result[pageId].components[gridInstanceId]) {
                  result[pageId].components[gridInstanceId] = [];
                }
                result[pageId].components[gridInstanceId].push(component);
                return component;
              }
            }
            return null;
          }).filter(Boolean);
        });
      }

      return grid;
    }

    // If not a grid, treat as component
    const component = mapBlockToComponent(contentData);
    if (component) {
      if (!result[pageId].components[parentId || 'root']) {
        result[pageId].components[parentId || 'root'] = [];
      }
      result[pageId].components[parentId || 'root'].push(component);
      return component;
    }

    return null;
  };

  // Process the root level grid items
  mainContent.layout["Umbraco.BlockGrid"].forEach((item: GridItem) => {
    const grid = processGridItem(item);
    if (grid) {
      result[pageId].layouts.push(grid);
    }
  });

  return result;
};

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists