{"version":3,"file":"XChart.min.mjs","sources":["../../../../src/shapes/canvasx/XChart.ts"],"sourcesContent":["import { ObjectProps } from '../Object/types/ObjectProps';\nimport { FabricObject } from '../Object/FabricObject';\nimport { Chart, ChartConfiguration, registerables } from 'chart.js';\nimport { classRegistry } from '../../ClassRegistry';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { WidgetChartInterface, EntityKeys } from './type/widget.entity.chart';\nimport { WidgetType } from './type/widget.type';\n\nChart.register(...registerables);\n\ninterface ChartObjectOptions extends ObjectProps {\n  chartConfig: ChartConfiguration;\n  width: number;\n  height: number;\n}\n\nclass XChart extends FabricObject implements WidgetChartInterface {\n  private chartConfig: ChartConfiguration;\n  private chartInstance: Chart | null = null;\n  private canvasElement: HTMLCanvasElement | null = null;\n  private needsUpdate: boolean = true; // Flag to track if update is needed\n\n  static type: WidgetType = 'XChart';\n  static objType: WidgetType = 'XChart';\n\n  constructor(options: any) {\n\n    super(options);\n    this.chartConfig = options.chartConfig!;\n    this.width = options.width!;\n    this.height = options.height!;\n    this.createCanvasElement();\n    this.addDoubleClickEventListener();\n    Object.assign(this, options);\n    this.objType = 'XChart';\n  }\n  updatedBy: string;\n  updatedByName: string;\n\n  createdByName: string;\n  chartOptions: any;\n  boardId: string;\n  objType: WidgetType;\n  userId: string;\n  zIndex: number;\n  version: string;\n  updatedAt: number;\n\n  createdAt: number;\n  createdBy: string;\n\n  private createCanvasElement() {\n    if (!this.canvasElement) {\n      this.canvasElement = createCanvasElement();\n      this.canvasElement.width = this.width!;\n      this.canvasElement.height = this.height!;\n      this.canvasElement.style.width = `${this.width}px`;\n      this.canvasElement.style.height = `${this.height}px`;\n      this.canvasElement.style.position = 'absolute';\n      this.canvasElement.style.top = `${-1000000}px`;\n      this.canvasElement.style.left = `${-1000000}px`;\n\n      document.body.appendChild(this.canvasElement); // Ensure canvas is in the DOM\n    }\n  }\n\n  private async createOrUpdateChart() {\n    if (!this.canvasElement) {\n      this.createCanvasElement();\n    }\n\n    // Ensure the canvas element is part of the DOM\n    if (!document.body.contains(this.canvasElement!)) {\n      document.body.appendChild(this.canvasElement!);\n    }\n\n    if (this.chartInstance) {\n      this.chartInstance.destroy();\n    }\n\n    return new Promise<void>((resolve) => {\n      this.canvasElement!.width = this.width!;\n      this.canvasElement!.height = this.height!;\n      this.canvasElement!.style.width = `${this.width}px`;\n      this.canvasElement!.style.height = `${this.height}px`;\n\n      this.chartInstance = new Chart(\n        this.canvasElement!.getContext('2d')!,\n        this.chartConfig\n      );\n\n      // Wait for the next animation frame to ensure the chart has rendered\n      requestAnimationFrame(() => {\n        this.chartInstance!.resize(); // Force a resize to ensure proper rendering\n        resolve();\n      });\n    });\n  }\n  getObject() {\n    const entityKeys: string[] = EntityKeys;\n    const result: Record<string, any> = {};\n\n    entityKeys.forEach((key) => {\n      if (key in this) {\n        result[key] = (this as any)[key];\n      }\n    });\n\n    return result;\n  }\n\n\n  async _render(ctx: CanvasRenderingContext2D) {\n    if (this.needsUpdate) {\n      await this.createOrUpdateChart();\n      this.needsUpdate = false; // Reset the flag after updating\n    }\n\n    if (\n      this.canvasElement &&\n      this.canvasElement.width > 0 &&\n      this.canvasElement.height > 0\n    ) {\n      ctx.drawImage(\n        this.canvasElement,\n        -this.width! / 2,\n        -this.height! / 2,\n        this.width!,\n        this.height!\n      );\n    }\n  }\n\n  updateChart(newConfig: ChartConfiguration) {\n    this.chartConfig = newConfig;\n    this.needsUpdate = true; // Set the flag to indicate an update is needed\n    this.dirty = true;\n    this.canvas?.requestRenderAll();\n  }\n\n  private addDoubleClickEventListener() {\n    this.on('mousedblclick', () => {\n      this.openEditModal();\n    });\n  }\n\n  private openEditModal() {\n    // Implement modal opening logic here\n    const modal = document.createElement('div');\n    modal.style.position = 'fixed';\n    modal.style.top = '50%';\n    modal.style.left = '50%';\n    modal.style.width = '400px';\n    modal.style.transform = 'translate(-50%, -50%)';\n    modal.style.padding = '20px';\n    modal.style.backgroundColor = 'white';\n    modal.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.5)';\n    modal.innerHTML = `\n      <h2>Edit Chart Data</h2>\n      <textarea id=\"chartDataInput\" rows=\"10\" cols=\"40\">${JSON.stringify(\n      this.chartConfig.data,\n      null,\n      2\n    )}</textarea>\n      <br />\n      <button id=\"saveChartData\">Save</button>\n      <button id=\"cancelEdit\">Cancel</button>\n    `;\n    document.body.appendChild(modal);\n\n    const saveButton = modal.querySelector('#saveChartData')!;\n    const cancelButton = modal.querySelector('#cancelEdit')!;\n    const chartDataInput = modal.querySelector(\n      '#chartDataInput'\n    ) as HTMLTextAreaElement;\n\n    saveButton.addEventListener('click', () => {\n      const newChartData = JSON.parse(chartDataInput.value);\n      this.chartConfig.data = newChartData;\n      this.updateChart(this.chartConfig);\n      document.body.removeChild(modal);\n    });\n\n    cancelButton.addEventListener('click', () => {\n      document.body.removeChild(modal);\n    });\n  }\n}\n\nexport { XChart };\n\nclassRegistry.setClass(XChart);\n"],"names":["Chart","register","registerables","XChart","FabricObject","constructor","options","super","_defineProperty","this","chartConfig","width","height","createCanvasElement","addDoubleClickEventListener","Object","assign","objType","canvasElement","style","concat","position","top","left","document","body","appendChild","createOrUpdateChart","contains","chartInstance","destroy","Promise","resolve","getContext","requestAnimationFrame","resize","getObject","result","EntityKeys","forEach","key","_render","ctx","needsUpdate","drawImage","updateChart","newConfig","_this$canvas","dirty","canvas","requestRenderAll","on","openEditModal","modal","createElement","transform","padding","backgroundColor","boxShadow","innerHTML","JSON","stringify","data","saveButton","querySelector","cancelButton","chartDataInput","addEventListener","newChartData","parse","value","removeChild","classRegistry","setClass"],"mappings":"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"}