All files / src/app/core/store/content/pages pages.selectors.ts

100% Statements 35/35
100% Branches 7/7
100% Functions 7/7
100% Lines 31/31

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 7332x 32x     32x   32x       32x 32x 32x 32x   32x   32x   32x   32x   32x 10x     32x 8x         8x 1x       7x   7x       7x 1x 1x       7x 6x   14x 3x 3x     14x 9x                   7x      
import { createSelector, createSelectorFactory, resultMemoize } from '@ngrx/store';
import { isEqual } from 'lodash-es';
 
import { BreadcrumbItem } from 'ish-core/models/breadcrumb-item/breadcrumb-item.interface';
import { createContentPageTreeView } from 'ish-core/models/content-page-tree-view/content-page-tree-view.model';
import { ContentPageTree } from 'ish-core/models/content-page-tree/content-page-tree.model';
import {
  ContentPageletEntryPointView,
  createContentPageletEntryPointView,
} from 'ish-core/models/content-view/content-view.model';
import { generateContentPageUrl } from 'ish-core/routing/content-page/content-page.route';
import { getContentState } from 'ish-core/store/content/content-store';
import { getPageTree } from 'ish-core/store/content/page-tree';
import { selectRouteParam } from 'ish-core/store/core/router';
 
import { pagesAdapter } from './pages.reducer';
 
const getPagesState = createSelector(getContentState, state => state.pages);
 
const { selectEntities: getPageEntities } = pagesAdapter.getSelectors(getPagesState);
 
export const getContentPageLoading = createSelector(getPagesState, state => state.loading);
 
export const getSelectedContentPage = createSelector(getPageEntities, selectRouteParam('contentPageId'), (pages, id) =>
  createContentPageletEntryPointView(pages[id])
);
 
export const getBreadcrumbForContentPage = (rootId: string) =>
  createSelectorFactory<object, BreadcrumbItem[]>(projector => resultMemoize(projector, isEqual))(
    getSelectedContentPage,
    getPageTree,
    (contentPage: ContentPageletEntryPointView, pagetree: ContentPageTree) => {
      // return undefined if no contentPage is selected (instead of an array with undefined key entry)
      if (!contentPage) {
        return;
      }
 
      // set default breadcrumb data: just the selected content page name
      let breadcrumbData = [{ key: contentPage?.displayName }] as BreadcrumbItem[];
      // initialize root flag (no root yet)
      let gotRoot = false;
 
      // if 'COMPLETE' is used as rootId the complete available page path is returned as breadcrumb data
      // (in case we have no explicit root information but the full path is wanted)
      if (rootId === 'COMPLETE') {
        gotRoot = true;
        breadcrumbData = [];
      }
 
      // determine if pagetree information is available for the selected content page
      if (pagetree.nodes[contentPage?.id]) {
        pagetree.nodes[contentPage.id].path.forEach((item, i, path) => {
          // check if we are at the wanted path element for the root
          if (item === rootId) {
            gotRoot = true;
            breadcrumbData = [];
          }
          // push breadcrumb data once we have a root
          if (gotRoot) {
            breadcrumbData.push({
              key: pagetree.nodes[item].name,
              link:
                i !== path.length - 1
                  ? generateContentPageUrl(createContentPageTreeView(pagetree, item, item))
                  : undefined,
            });
          }
        });
      }
      return breadcrumbData;
    }
  );