File

src/lib/fs/cms/page/processing/fs-editing-area/fs-editing-area-injector-pipeline-step.ts

Description

A Pipeline step that injects the editing area to a content slot if this is empty.

Index

Methods

Constructor

constructor(fsComponentInjector: FsCmsPageComponentInjector, fsSpartacusBridgeConfig: FsSpartacusBridgeConfig, baseSiteService: BaseSiteService)
Parameters :
Name Type Optional
fsComponentInjector FsCmsPageComponentInjector No
fsSpartacusBridgeConfig FsSpartacusBridgeConfig No
baseSiteService BaseSiteService No

Methods

Private addFsEditingAreasToOccCmsPage
addFsEditingAreasToOccCmsPage(occCmsStructureModel: CmsStructureModel, fsCmsStructureModel: CmsStructureModel)
Parameters :
Name Type Optional
occCmsStructureModel CmsStructureModel No
fsCmsStructureModel CmsStructureModel No
Returns : CmsStructureModel
execute
execute(occCmsStructureModel: CmsStructureModel, fsCmsStructureModel: CmsStructureModel)

This methode injects the editing area to a content slot if it is empty.

Parameters :
Name Type Optional Description
occCmsStructureModel CmsStructureModel No

The page generated by the SAP Commerce CMS.

fsCmsStructureModel CmsStructureModel No

The page generated by FirstSpirit.

Returns : CmsStructureModel

The page that is expanded by an editing area.

Private findFirstSpiritManagedPage
findFirstSpiritManagedPage(occCmsPage: CmsStructureModel, fsCmsPage: CmsStructureModel)
Parameters :
Name Type Optional
occCmsPage CmsStructureModel No
fsCmsPage CmsStructureModel No
Returns : any
Private findSlotsThatRequireFsEditingArea
findSlotsThatRequireFsEditingArea(occCmsPage: CmsStructureModel, fsCmsPage: CmsStructureModel)

This methode returns all slots within the FirstSpirit managed page that are defined in FirstSpirit but empty and not defined or empty in the OCC model.

Parameters :
Name Type Optional Description
occCmsPage CmsStructureModel No

The page generated by the OCC CMS.

fsCmsPage CmsStructureModel No

The page generated by the FirstSpirit CMS.

Returns : string[]

List of all slots that require a FirstSpirit editing area.

Private isContentSlotEmpty
isContentSlotEmpty(contentSlot: ContentSlotData)
Parameters :
Name Type Optional
contentSlot ContentSlotData No
Returns : boolean
Private isSlotDefinedButEmpty
isSlotDefinedButEmpty(cmsStructureModel: CmsStructureModel, slotName: string)
Parameters :
Name Type Optional
cmsStructureModel CmsStructureModel No
slotName string No
Returns : boolean
Private isSlotUndefinedOrEmpty
isSlotUndefinedOrEmpty(cmsStructureModel: CmsStructureModel, slotName: string)
Parameters :
Name Type Optional
cmsStructureModel CmsStructureModel No
slotName string No
Returns : boolean
Private tryGetPageTemplate
tryGetPageTemplate(cmsStructureModel: CmsStructureModel)
Parameters :
Name Type Optional
cmsStructureModel CmsStructureModel No
Returns : Optional<string>
import { PipelineStep } from '../pipeline-step';
import { BaseSiteService, CmsStructureModel, ContentSlotData } from '@spartacus/core';
import { getSlotIgnoreCase } from '../../../../util/content-slots';
import { Injectable } from '@angular/core';
import { FsCmsPageComponentInjector } from '../fs-cms-page-component-injector';
import { FsEditingAreaComponent } from '../../../../../fs-editing-area/fs-editing-area.component';
import { getFsManagedPageConfigByTemplateId } from '../../../../util/helper';
import { FsSpartacusBridgeConfig, Optional } from 'fs-spartacus-common';
import { first } from 'rxjs/operators';

/**
 * A {@link Pipeline} step that injects the editing area to a content slot if this is empty.
 *
 * @export
 * @class FsEditingAreaInjectorPipelineStep
 * @implements {PipelineStep}
 */
@Injectable({
  providedIn: 'root',
})
export class FsEditingAreaInjectorPipelineStep implements PipelineStep {
  constructor(
    private fsComponentInjector: FsCmsPageComponentInjector,
    private fsSpartacusBridgeConfig: FsSpartacusBridgeConfig,
    private baseSiteService: BaseSiteService
  ) {}

  /**
   * This methode injects the editing area to a content slot if it is empty.
   *
   * @param {CmsStructureModel} occCmsStructureModel The page generated by the SAP Commerce CMS.
   * @param {CmsStructureModel} fsCmsStructureModel The page generated by FirstSpirit.
   * @return {CmsStructureModel} The page that is expanded by an editing area.
   * @memberof FsEditingAreaInjectorPipelineStep
   */
  execute(occCmsStructureModel: CmsStructureModel, fsCmsStructureModel: CmsStructureModel): CmsStructureModel {
    return this.addFsEditingAreasToOccCmsPage(occCmsStructureModel, fsCmsStructureModel);
  }

  private addFsEditingAreasToOccCmsPage(
    occCmsStructureModel: CmsStructureModel,
    fsCmsStructureModel: CmsStructureModel
  ): CmsStructureModel {
    const slots = this.findSlotsThatRequireFsEditingArea(occCmsStructureModel, fsCmsStructureModel);
    return this.fsComponentInjector.addCmsPageComponents(occCmsStructureModel, slots);
  }

  /**
   * This methode returns all slots within the FirstSpirit managed page that are defined in FirstSpirit but empty and not defined or empty in the OCC model.
   *
   * @private
   * @param {CmsStructureModel} occCmsPage The page generated by the OCC CMS.
   * @param {CmsStructureModel} fsCmsPage The page generated by the FirstSpirit CMS.
   * @return {string[]} List of all slots that require a FirstSpirit editing area.
   * @memberof FsEditingAreaInjectorPipelineStep
   */
  private findSlotsThatRequireFsEditingArea(occCmsPage: CmsStructureModel, fsCmsPage: CmsStructureModel): string[] {
    const fsManagedPage = this.findFirstSpiritManagedPage(occCmsPage, fsCmsPage);
    if (fsManagedPage) {
      let slots = fsManagedPage.slots.map((slot) => slot.name);
      if (fsCmsPage) {
        slots = slots.filter((fsManagedSlotName) => this.isSlotDefinedButEmpty(fsCmsPage, fsManagedSlotName));
      }

      if (occCmsPage) {
        slots = slots.filter((fsManagedSlotName) => this.isSlotUndefinedOrEmpty(occCmsPage, fsManagedSlotName));
      }
      return slots;
    }
    return [];
  }

  private findFirstSpiritManagedPage(occCmsPage: CmsStructureModel, fsCmsPage: CmsStructureModel) {
    let baseSite;
    this.baseSiteService
      .getActive()
      .pipe(first())
      .subscribe((activeBaseSite) => (baseSite = activeBaseSite));
    return getFsManagedPageConfigByTemplateId(
      this.fsSpartacusBridgeConfig.bridge[baseSite].firstSpiritManagedPages,
      this.tryGetPageTemplate(occCmsPage) || this.tryGetPageTemplate(fsCmsPage)
    );
  }

  private tryGetPageTemplate(cmsStructureModel: CmsStructureModel): Optional<string> {
    return cmsStructureModel?.page?.properties?.fsPageTemplate || cmsStructureModel?.page?.template || null;
  }

  private isSlotDefinedButEmpty(cmsStructureModel: CmsStructureModel, slotName: string) {
    const slot = getSlotIgnoreCase(cmsStructureModel, slotName);
    return getSlotIgnoreCase(cmsStructureModel, slotName) && this.isContentSlotEmpty(slot);
  }

  private isSlotUndefinedOrEmpty(cmsStructureModel: CmsStructureModel, slotName: string) {
    const slot = getSlotIgnoreCase(cmsStructureModel, slotName);
    return !getSlotIgnoreCase(cmsStructureModel, slotName) || this.isContentSlotEmpty(slot);
  }

  private isContentSlotEmpty(contentSlot: ContentSlotData): boolean {
    return !Array.isArray(contentSlot.components) || contentSlot.components.length === 0;
  }
}

/**
 * A factory function that creates the {@link FsEditingAreaInjectorPipelineStep} from a given FsSpartacusBridgeConfig and BaseSiteService.
 *
 * @export
 * @param {FsSpartacusBridgeConfig} fsSpartacusBridgeConfig The FsSpartacusBridgeConfig from which the step will be created.
 * @param {BaseSiteService} baseSiteService The BaseSiteService to check for the active base site.
 * @return {FsEditingAreaInjectorPipelineStep} The created FsEditingAreaInjectorPipelineStep instance.
 */
export function createFsEditingAreaInjectorPipelineStep(
  fsSpartacusBridgeConfig: FsSpartacusBridgeConfig,
  baseSiteService: BaseSiteService
): FsEditingAreaInjectorPipelineStep {
  const fsComponentInjector: FsCmsPageComponentInjector = new FsCmsPageComponentInjector(FsEditingAreaComponent.TYPE_CODE);
  return new FsEditingAreaInjectorPipelineStep(fsComponentInjector, fsSpartacusBridgeConfig, baseSiteService);
}

results matching ""

    No results matching ""