Загрузка данных


import { DataSource } from '@core/DataSource';
import { DrawingsManager, DrawingsManagerSnapshot } from '@core/DrawingsManager';
import { Pane, PaneParams } from '@core/Pane';
import { ISerializable, PaneSnapshot } from '@src/types/snapshot';

interface PaneManagerParams extends Omit<PaneParams, 'isMainPane' | 'id' | 'basedOn' | 'onDelete'> {
  panesSnapshot: PaneSnapshot[];
}

export class PaneManager implements ISerializable<PaneSnapshot[]> {
  private mainPane: Pane;
  private paneChartInheritedParams: PaneManagerParams & { isMainPane: boolean };
  private panesMap: Map<number, Pane> = new Map<number, Pane>();
  private panesIdIterator = 0;

  constructor(params: PaneManagerParams) {
    this.paneChartInheritedParams = { ...params, isMainPane: false };

    const mainSnapshot = params.panesSnapshot.find((pane) => pane.isMain) ?? params.panesSnapshot[0];

    this.mainPane = new Pane({
      ...params,
      isMainPane: true,
      id: 0,
      onDelete: () => {},
    });

    this.panesMap.set(0, this.mainPane);
    this.panesIdIterator = 1;

    if (mainSnapshot?.drawings) {
      this.mainPane.setDrawingsSnapshot(mainSnapshot.drawings);
    }

    params.panesSnapshot
      .filter((pane) => !pane.isMain)
      .forEach((paneSnapshot) => {
        const pane = this.addPane();

        pane.setDrawingsSnapshot(paneSnapshot.drawings);
      });

    this.updateLastPane();
  }

  public getPaneById(id: number): Pane | undefined {
    return this.panesMap.get(id);
  }

  public getDrawingsSnapshot(): DrawingsManagerSnapshot {
    return this.mainPane.getDrawingsSnapshot();
  }

  public setDrawingsSnapshot(snapshot: DrawingsManagerSnapshot): void {
    this.mainPane.setDrawingsSnapshot(snapshot);
  }

  public getPanes(): Map<number, Pane> {
    return this.panesMap;
  }

  public getMainPane(): Pane {
    return this.mainPane;
  }

  public addPane(dataSource?: DataSource): Pane {
    const id = this.panesIdIterator;

    this.panesIdIterator += 1;

    const pane = new Pane({
      ...this.paneChartInheritedParams,
      id,
      dataSource: dataSource ?? null,
      basedOn: dataSource ? undefined : this.mainPane,
      onDelete: () => {
        this.panesMap.delete(id);
        this.updateLastPane();
      },
    });

    this.panesMap.set(id, pane);
    this.updateLastPane();

    return pane;
  }

  public getDrawingsManager(): DrawingsManager {
    return this.mainPane.getDrawingManager();
  }

  public updateDrawings(): void {
    this.panesMap.forEach((pane) => {
      pane.updateDrawings();
    });
  }

  public getSnapshot(): PaneSnapshot[] {
    return Array.from(this.panesMap.values()).map((pane) => pane.getSnapshot());
  }

  private updateLastPane(): void {
    const panes = Array.from(this.panesMap.values());

    panes.forEach((pane) => pane.setIsLast(false));
    panes.at(-1)?.setIsLast(true);
  }
}