File

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

Description

A Pipeline step that injects the EditingOverlay component to a ContentSlot 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 addFsEditingOverlaysToOccCmsPage
addFsEditingOverlaysToOccCmsPage(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 overlay component to a content slot if it is empty.

Parameters :
Name Type Optional Description
occCmsStructureModel CmsStructureModel No

The page generated by the OCC CMS.

fsCmsStructureModel CmsStructureModel No

The page generated by FirstSpirit.

Returns : CmsStructureModel

The manipulated page.

Private findFirstSpiritManagedPage
findFirstSpiritManagedPage(occCmsPage: CmsStructureModel, fsCmsPage: CmsStructureModel)
Parameters :
Name Type Optional
occCmsPage CmsStructureModel No
fsCmsPage CmsStructureModel No
Returns : any
Private findSlotsThatRequireFsEditingOverlay
findSlotsThatRequireFsEditingOverlay(occCmsStructureModel: CmsStructureModel, fsCmsStructureModel: CmsStructureModel)
Parameters :
Name Type Optional
occCmsStructureModel CmsStructureModel No
fsCmsStructureModel CmsStructureModel No
Returns : string[]
Private requiresFsEditingOverly
requiresFsEditingOverly(fsCmsStructureModel: CmsStructureModel, slotName: string)
Parameters :
Name Type Optional
fsCmsStructureModel 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 } from '@spartacus/core';
import { getSlotIgnoreCase } from '../../../../util/content-slots';
import { Injectable } from '@angular/core';
import { FsCmsPageComponentInjector } from '../fs-cms-page-component-injector';
import { FsEditingOverlayComponent } from '../../../../../fs-editing-overlay/fs-editing-overlay.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 EditingOverlay component to a ContentSlot if this is empty.
 */
@Injectable({
  providedIn: 'root',
})
export class FsEditingOverlayInjectorPipelineStep implements PipelineStep {
  constructor(
    private fsComponentInjector: FsCmsPageComponentInjector,
    private fsSpartacusBridgeConfig: FsSpartacusBridgeConfig,
    private baseSiteService: BaseSiteService
  ) {}

  /**
   * This methode injects the editing overlay component to a content slot if it is empty.
   *
   * @param {CmsStructureModel} occCmsStructureModel The page generated by the OCC CMS.
   * @param {CmsStructureModel} fsCmsStructureModel The page generated by FirstSpirit.
   * @return {CmsStructureModel} The manipulated page.
   * @memberof FsEditingOverlayInjectorPipelineStep
   */
  execute(occCmsStructureModel: CmsStructureModel, fsCmsStructureModel: CmsStructureModel): CmsStructureModel {
    return this.addFsEditingOverlaysToOccCmsPage(occCmsStructureModel, fsCmsStructureModel);
  }

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

  private findSlotsThatRequireFsEditingOverlay(occCmsStructureModel: CmsStructureModel, fsCmsStructureModel: CmsStructureModel): string[] {
    const firstSpiritManagedPage = this.findFirstSpiritManagedPage(occCmsStructureModel, fsCmsStructureModel);
    if (firstSpiritManagedPage) {
      // If the fs page does not exist, we overlay each configured fs managed slot.
      // But if a page exists and a slot is not defined in the fs page, there is no body in the FirstSpirit page and it can not be edited.
      const slots = fsCmsStructureModel
        ? firstSpiritManagedPage.slots.filter((fsManagedSlot) => this.requiresFsEditingOverly(fsCmsStructureModel, fsManagedSlot.name))
        : firstSpiritManagedPage.slots;
      return slots.map((slot) => slot.name);
    } else {
      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 requiresFsEditingOverly(fsCmsStructureModel: CmsStructureModel, slotName: string) {
    const slot = getSlotIgnoreCase(fsCmsStructureModel, slotName);
    return slot && (!Array.isArray(slot.components) || slot.components.length === 0);
  }
}

/**
 * A factory function that creates the {@link FsEditingOverlayInjectorPipelineStep} 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 {FsEditingOverlayInjectorPipelineStep} The created FsEditingOverlayInjectorPipelineStep instance.
 */
export function createFsEditingOverlayInjectorPipelineStep(
  fsSpartacusBridgeConfig: FsSpartacusBridgeConfig,
  baseSiteService: BaseSiteService
): FsEditingOverlayInjectorPipelineStep {
  const fsComponentInjector: FsCmsPageComponentInjector = new FsCmsPageComponentInjector(FsEditingOverlayComponent.TYPE_CODE);
  return new FsEditingOverlayInjectorPipelineStep(fsComponentInjector, fsSpartacusBridgeConfig, baseSiteService);
}

results matching ""

    No results matching ""