{"version":3,"file":"figures-Bdr-CTN1.mjs","names":["createFigureHelper","params: IFigure['params']"],"sources":["../src/helpers/templates/editor/figures/base.ts","../src/helpers/templates/editor/figures/md.ts","../src/helpers/templates/editor/figures/metric.ts","../src/helpers/templates/editor/figures/table.ts","../src/helpers/templates/editor/figures/vega.ts","../src/helpers/templates/editor/figures/index.ts"],"sourcesContent":["import { nanoid } from 'nanoid/non-secure';\nimport objectHash from 'object-hash';\n\nimport type { TemplateFilter, TemplateBodyFigure } from '~/modules/templates';\n\ninterface FigureHelper {\n  readonly id: string;\n  readonly type: string;\n  // oxlint-disable-next-line no-explicit-any\n  params: Record<string, any>;\n  slots: Set<number>;\n  readonly hash: string;\n}\n\nfunction hashFigure(figure: FigureHelper | TemplateBodyFigure): string {\n  return objectHash({\n    type: figure.type,\n    data: 'data' in figure ? figure.data : undefined,\n    filters: 'filters' in figure ? figure.filters : undefined,\n    params: figure.params,\n    slots: figure.slots,\n  });\n}\n\nfunction createFigureHelper<Fig extends FigureHelper = FigureHelper>(\n  type: string,\n  params: Record<string, unknown> = {},\n  slots?: number[]\n): Fig {\n  return {\n    id: nanoid(),\n    type,\n    params,\n    slots: new Set(slots ?? []),\n    hash: '',\n  } satisfies FigureHelper as Fig;\n}\n\nexport interface FigureHelperWithData extends FigureHelper {\n  data: string | unknown[];\n}\n\nexport function createFigureHelperWithData<\n  Fig extends FigureHelperWithData = FigureHelperWithData,\n>(\n  type: string,\n  data: string | unknown[],\n  params: Record<string, unknown> = {},\n  slots?: number[]\n): Fig {\n  const figure = {\n    ...createFigureHelper(type, params, slots),\n    data,\n  } satisfies FigureHelperWithData;\n\n  figure.hash = hashFigure(figure);\n  return figure as Fig;\n}\n\nexport interface FigureHelperWithFilters extends FigureHelper {\n  filters: Map<string, TemplateFilter>;\n}\n\nexport function createFigureHelperWithFilters<\n  Fig extends FigureHelperWithFilters = FigureHelperWithFilters,\n>(\n  type: string,\n  filters: TemplateFilter[] = [],\n  params: Record<string, unknown> = {},\n  slots?: number[]\n): Fig {\n  const figure = {\n    ...createFigureHelper(type, params, slots),\n    filters: new Map(filters?.map((filter) => [filter.name, filter]) ?? []),\n    hash: '',\n  } satisfies FigureHelperWithFilters;\n\n  figure.hash = hashFigure(figure);\n  return figure as Fig;\n}\n","import type { TemplateBodyFigure } from '~/modules/templates';\nimport { type FigureHelperWithData, createFigureHelperWithData } from './base';\n\nexport interface MdFigure extends FigureHelperWithData {\n  readonly type: 'md';\n  data: string;\n  readonly params: Record<string, never>;\n}\n\nexport function createMdFigureHelper(data = '', slots?: number[]): MdFigure {\n  return createFigureHelperWithData('md', data, {}, slots);\n}\n\nexport function createMdFigureHelperFrom(figure: TemplateBodyFigure): MdFigure {\n  const data = typeof figure.data === 'string' ? figure.data : '';\n  return createMdFigureHelper(data, figure.slots);\n}\n\nexport function mdHelperParamsToJSON(\n  params: MdFigure['params']\n): TemplateBodyFigure['params'] {\n  return params;\n}\n","import type { TemplateFilter, TemplateBodyFigure } from '~/modules/templates';\nimport type { FigureAggregation } from '../aggregations';\nimport type { FigureOrder } from './utils';\nimport {\n  type FigureHelperWithFilters,\n  createFigureHelperWithFilters,\n} from './base';\n\n/**\n * Type for labels used in metrics\n */\nexport interface MetricLabel {\n  /**\n   * The text of the label (rendered under the value)\n   */\n  text: string;\n  /**\n   * The aggregation used to fetch data,\n   * if not set, the count of documents will be used\n   */\n  aggregation?: FigureAggregation;\n  /**\n   * Format options used to format the data\n   */\n  format?: {\n    type: 'date' | 'number';\n    params?: string[];\n  };\n}\n\nexport interface MetricFigureHelper extends FigureHelperWithFilters {\n  readonly type: 'metric';\n  params: {\n    labels: MetricLabel[];\n    order: FigureOrder;\n  };\n}\n\nexport function createMetricFigureHelper(\n  labels: MetricLabel[] = [],\n  filters: TemplateFilter[] = [],\n  order: FigureOrder = true,\n  slots?: number[]\n): MetricFigureHelper {\n  return createFigureHelperWithFilters(\n    'metric',\n    filters,\n    {\n      labels,\n      order,\n    },\n    slots\n  );\n}\n\nexport function createMetricFigureHelperFrom(\n  figure: TemplateBodyFigure\n): MetricFigureHelper {\n  return createMetricFigureHelper(\n    figure.params?.labels ?? [],\n    figure.filters ?? [],\n    figure.params?.order ?? true,\n    figure.slots\n  );\n}\n\nexport function metricHelperParamsToJSON(\n  params: MetricFigureHelper['params']\n): TemplateBodyFigure['params'] {\n  return {\n    labels: params.labels,\n    order: params.order,\n  };\n}\n\nexport function getMetricLabelKey(label: MetricLabel): string {\n  return label.text;\n}\n\nexport function getAllMetricLabelKeysOfHelper(\n  figure: MetricFigureHelper\n): string[] {\n  return figure.params.labels.map(getMetricLabelKey);\n}\n\nexport function addMetricLabelOfHelper(\n  figure: MetricFigureHelper,\n  element: MetricLabel,\n  index?: number\n): MetricFigureHelper {\n  const key = getMetricLabelKey(element);\n  if (figure.params.labels.some((lab) => getMetricLabelKey(lab) === key)) {\n    throw new Error(`Label \"${element.text}\" already exists`);\n  }\n  figure.params.labels.splice(index ?? figure.params.labels.length, 0, element);\n  return figure;\n}\n\nexport function removeMetricLabelOfHelper(\n  figure: MetricFigureHelper,\n  element: MetricLabel\n): MetricFigureHelper {\n  const fig = figure;\n  const key = getMetricLabelKey(element);\n  fig.params.labels = figure.params.labels.filter(\n    (lab) => getMetricLabelKey(lab) !== key\n  );\n  return figure;\n}\n\nexport function updateMetricLabelOfHelper(\n  figure: MetricFigureHelper,\n  oldElement: MetricLabel,\n  newElement: MetricLabel\n): MetricFigureHelper {\n  const oldKey = getMetricLabelKey(oldElement);\n  const index = figure.params.labels.findIndex(\n    (lab) => getMetricLabelKey(lab) === oldKey\n  );\n  if (index < 0) {\n    throw new Error(`Label \"${oldElement.text}\" not found`);\n  }\n  const fig = figure;\n  fig.params.labels[index] = newElement;\n  return figure;\n}\n","import type { TemplateFilter, TemplateBodyFigure } from '~/modules/templates';\nimport type { FigureAggregation } from '../aggregations';\nimport type { FigureOrder } from './utils';\nimport {\n  type FigureHelperWithFilters,\n  createFigureHelperWithFilters,\n} from './base';\n\n/**\n * Type for columns used in tables\n */\nexport interface TableColumn {\n  /**\n   * The name of the column\n   */\n  header: string;\n  /**\n   * Whether the column is a metric,\n   * can only be used once in a table\n   */\n  metric?: boolean;\n  /**\n   * The aggregation used to fetch data,\n   * if not set, the \"value\" of the previous column will be used\n   */\n  aggregation?: FigureAggregation;\n  /**\n   * The style of the cells in this column\n   */\n  styles?: {\n    fontStyle?: 'normal' | 'bold' | 'italic' | 'bolditalic';\n    fillColor?: string | [number, number, number];\n    textColor?: string | [number, number, number];\n    headerColor?: string | [number, number, number];\n    halign?: 'left' | 'center' | 'right' | 'justify';\n    valign?: 'top' | 'middle' | 'bottom';\n    fontSize?: number;\n    lineColor?: string | [number, number, number];\n  };\n}\n\n/**\n * Type for tables\n */\nexport interface TableFigureHelper extends FigureHelperWithFilters {\n  readonly type: 'table';\n  params: {\n    title: string;\n    columns: TableColumn[];\n    total?: boolean;\n    order?: FigureOrder;\n  };\n}\n\nexport function createTableFigureHelper(\n  title: string = '',\n  columns: TableColumn[] = [],\n  total: boolean = false,\n  filters: TemplateFilter[] = [],\n  order: FigureOrder = true,\n  slots?: number[]\n): TableFigureHelper {\n  return createFigureHelperWithFilters(\n    'table',\n    filters,\n    {\n      title,\n      columns,\n      total,\n      order,\n    },\n    slots\n  );\n}\n\nexport function createTableFigureHelperFrom(\n  figure: TemplateBodyFigure\n): TableFigureHelper {\n  return createTableFigureHelper(\n    figure.params?.title,\n    figure.params?.columns ?? [],\n    figure.params?.total ?? false,\n    figure.filters ?? [],\n    figure.params?.order ?? true,\n    figure.slots\n  );\n}\n\nexport function tableHelperParamsToJSON(\n  params: TableFigureHelper['params']\n): TemplateBodyFigure['params'] {\n  return {\n    title: params.title,\n    columns: params.columns,\n    total: params.total,\n    order: params.order,\n  };\n}\n\nexport function getTableColumnKey(column: TableColumn): string {\n  return column.header;\n}\n\nexport function getAllTableColumnKeysOfHelper(\n  figure: TableFigureHelper\n): string[] {\n  return figure.params.columns.map(getTableColumnKey);\n}\n\nexport function addTableColumnOfHelper(\n  figure: TableFigureHelper,\n  element: TableColumn,\n  index?: number\n): TableFigureHelper {\n  const key = getTableColumnKey(element);\n  if (figure.params.columns.some((col) => getTableColumnKey(col) === key)) {\n    throw new Error(`Column \"${element.header}\" already exists`);\n  }\n  figure.params.columns.splice(\n    index ?? figure.params.columns.length,\n    0,\n    element\n  );\n  return figure;\n}\n\nexport function removeTableColumnOfHelper(\n  figure: TableFigureHelper,\n  element: TableColumn\n): TableFigureHelper {\n  const fig = figure;\n  const key = getTableColumnKey(element);\n  fig.params.columns = figure.params.columns.filter(\n    (col) => getTableColumnKey(col) !== key\n  );\n  return figure;\n}\n\nexport function updateTableColumnOfHelper(\n  figure: TableFigureHelper,\n  oldElement: TableColumn,\n  newElement: TableColumn\n): TableFigureHelper {\n  const oldKey = getTableColumnKey(oldElement);\n  const index = figure.params.columns.findIndex(\n    (col) => getTableColumnKey(col) === oldKey\n  );\n  if (index < 0) {\n    throw new Error(`Column \"${oldKey}\" not found`);\n  }\n  const fig = figure;\n  fig.params.columns[index] = newElement;\n  return figure;\n}\n","import type { TemplateFilter, TemplateBodyFigure } from '~/modules/templates';\nimport type { FigureAggregation } from '../aggregations';\nimport type { FigureOrder } from './utils';\nimport {\n  type FigureHelperWithFilters,\n  createFigureHelperWithFilters,\n} from './base';\n\n/**\n * Type for layers used in vega\n */\nexport interface VegaLayer extends Record<string, unknown> {\n  /**\n   * The aggregation used to fetch data,\n   * if not set, the \"value\" of the label (or color if present) layer will be used\n   */\n  aggregation?: FigureAggregation;\n  /**\n   * The title of the axis\n   */\n  title?: string;\n  /**\n   * The legend, if `null` no legend will be shown\n   */\n  legend?: null | { title?: string };\n}\n\n/**\n * Type for data label options\n */\nexport interface VegaDataLabelOptions {\n  format: 'percent' | 'numeric';\n  position?: 'out' | 'in';\n  showLabel?: boolean;\n  minValue?: number;\n}\n\nexport interface VegaFigureHelper extends FigureHelperWithFilters {\n  params: {\n    /**\n     * The title of the figure\n     */\n    title: string;\n    /**\n     * Whether the axis should be inverted\n     */\n    invertAxis?: boolean;\n    /**\n     * The label layer of the figure, often used for the x axis\n     */\n    label: VegaLayer;\n    /**\n     * The value layer of the figure, often used for the y axis\n     */\n    value: VegaLayer;\n    /**\n     * The color layer of the figure, often used for splitting the value\n     */\n    color?: VegaLayer;\n    /**\n     * The data label options\n     *\n     * Data labels are displayed on top of the value layer, and show details about values\n     */\n    dataLabel?: VegaDataLabelOptions;\n    /**\n     * The order of the data in the chart\n     */\n    order?: FigureOrder;\n  };\n}\n\nexport function createVegaFigureHelper(\n  type: string,\n  title: string = '',\n  label: VegaLayer = {},\n  value: VegaLayer = {},\n  color?: VegaLayer,\n  dataLabel?: VegaDataLabelOptions,\n  invertAxis: boolean = false,\n  filters: TemplateFilter[] = [],\n  order: FigureOrder = true,\n  slots?: number[]\n): VegaFigureHelper {\n  return createFigureHelperWithFilters(\n    type,\n    filters,\n    {\n      title,\n      invertAxis,\n      label,\n      value,\n      color,\n      dataLabel,\n      order,\n    },\n    slots\n  );\n}\n\nexport function createVegaFigureHelperFrom(\n  figure: TemplateBodyFigure\n): VegaFigureHelper {\n  return createVegaFigureHelper(\n    figure.type,\n    figure.params?.title ?? '',\n    figure.params?.label ?? {},\n    figure.params?.value ?? {},\n    figure.params?.color,\n    figure.params?.dataLabel,\n    figure.params?.invertAxis ?? false,\n    figure.filters ?? [],\n    figure.params?.order ?? true,\n    figure.slots\n  );\n}\n\nexport function vegaHelperParamsToJSON(\n  params: VegaFigureHelper['params']\n): TemplateBodyFigure['params'] {\n  return {\n    title: params.title,\n    invertAxis: params.invertAxis,\n    label: params.label,\n    value: params.value,\n    color: params.color,\n    dataLabel: params.dataLabel,\n    order: params.order,\n  };\n}\n","import type {\n  TemplateFilter,\n  TemplateBodyFigure as IFigure,\n} from '~/modules/templates';\nimport type { FigureOrder } from './utils';\n\nimport {\n  type MdFigure,\n  createMdFigureHelper,\n  createMdFigureHelperFrom,\n  mdHelperParamsToJSON,\n} from './md';\nimport {\n  type MetricFigureHelper,\n  createMetricFigureHelper,\n  createMetricFigureHelperFrom,\n  metricHelperParamsToJSON,\n} from './metric';\nimport {\n  type TableFigureHelper,\n  createTableFigureHelper,\n  createTableFigureHelperFrom,\n  tableHelperParamsToJSON,\n} from './table';\nimport {\n  type VegaFigureHelper,\n  createVegaFigureHelper,\n  createVegaFigureHelperFrom,\n  vegaHelperParamsToJSON,\n} from './vega';\n\nexport type AnyFigureHelper =\n  | MdFigure\n  | MetricFigureHelper\n  | TableFigureHelper\n  | VegaFigureHelper;\n\nexport type FigureHelperSet = Map<string, AnyFigureHelper>;\n\n/**\n * Create a figure helper\n *\n * @param figure The figure object\n *\n * @returns The figure helper\n */\nexport function createFigureHelper(\n  type: AnyFigureHelper['type'],\n  filters?: TemplateFilter[],\n  order?: FigureOrder,\n  slots?: number[]\n): AnyFigureHelper {\n  switch (type) {\n    case 'md':\n      return createMdFigureHelper(undefined, slots);\n\n    case 'metric':\n      return createMetricFigureHelper(undefined, filters, order, slots);\n\n    case 'table':\n      return createTableFigureHelper(\n        undefined,\n        undefined,\n        undefined,\n        filters,\n        order,\n        slots\n      );\n\n    default:\n      return createVegaFigureHelper(\n        type,\n        undefined,\n        undefined,\n        undefined,\n        undefined,\n        undefined,\n        undefined,\n        filters,\n        order,\n        slots\n      );\n  }\n}\n\n/**\n * Create a figure helper from a figure object\n *\n * @param figure The figure object\n *\n * @returns The figure helper\n */\nexport function createFigureHelperFrom(figure: IFigure): AnyFigureHelper {\n  switch (figure.type) {\n    case 'md':\n      return createMdFigureHelperFrom(figure);\n\n    case 'metric':\n      return createMetricFigureHelperFrom(figure);\n\n    case 'table':\n      return createTableFigureHelperFrom(figure);\n\n    default:\n      return createVegaFigureHelperFrom(figure);\n  }\n}\n\n/**\n * Create a figure object from a figure helper\n *\n * @param figure The figure helper\n *\n * @returns The figure object\n */\nexport function figureHelperToJSON(figure: AnyFigureHelper): IFigure {\n  let params: IFigure['params'] = {};\n  switch (figure.type) {\n    case 'md':\n      params = mdHelperParamsToJSON((figure as MdFigure).params);\n      break;\n\n    case 'metric':\n      params = metricHelperParamsToJSON((figure as MetricFigureHelper).params);\n      break;\n\n    case 'table':\n      params = tableHelperParamsToJSON((figure as TableFigureHelper).params);\n      break;\n\n    default:\n      params = vegaHelperParamsToJSON((figure as VegaFigureHelper).params);\n      break;\n  }\n\n  return {\n    type: figure.type,\n    data: 'data' in figure ? figure.data : undefined,\n    filters:\n      'filters' in figure ? Array.from(figure.filters.values()) : undefined,\n    params,\n    slots: Array.from(figure.slots),\n  };\n}\n\nexport function isFigureHelperMarkdown(\n  figure: AnyFigureHelper\n): figure is MdFigure {\n  return figure.type === 'md';\n}\nexport function isFigureHelperMetric(\n  figure: AnyFigureHelper\n): figure is MetricFigureHelper {\n  return figure.type === 'metric';\n}\nexport function isFigureHelperTable(\n  figure: AnyFigureHelper\n): figure is TableFigureHelper {\n  return figure.type === 'table';\n}\nexport function isFigureHelperVega(\n  figure: AnyFigureHelper\n): figure is VegaFigureHelper {\n  return (\n    !isFigureHelperMarkdown(figure) &&\n    !isFigureHelperMetric(figure) &&\n    !isFigureHelperTable(figure)\n  );\n}\n\nexport * from './utils';\nexport * from './md';\nexport * from './metric';\nexport * from './table';\nexport * from './vega';\n"],"mappings":"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"}