{"version":3,"file":"layouts.mjs","names":[],"sources":["../../src/helpers/templates/editor/layouts/templates.ts","../../src/helpers/templates/editor/layouts/tasks.ts","../../src/helpers/templates/editor/layouts/index.ts"],"sourcesContent":["import { nanoid } from 'nanoid/non-secure';\nimport objectHash from 'object-hash';\n\nimport type { TemplateBodyLayout } from '~/modules/templates';\n\nimport {\n  createFigureHelperFrom,\n  figureHelperToJSON,\n  type AnyFigureHelper,\n} from '../figures';\n\nexport interface LayoutHelper {\n  readonly id: string;\n  figures: AnyFigureHelper[];\n  readonly hash: string;\n}\n\nexport function hashLayout(layout: LayoutHelper | TemplateBodyLayout): string {\n  return objectHash({ figures: layout.figures });\n}\n\nexport function createLayoutHelper(figures: AnyFigureHelper[]): LayoutHelper {\n  const layout = {\n    id: nanoid(),\n    figures,\n    hash: '',\n  };\n\n  layout.hash = hashLayout(layout);\n\n  return layout;\n}\n\nexport function createLayoutHelperFrom(\n  layout: TemplateBodyLayout\n): LayoutHelper {\n  return createLayoutHelper(\n    layout.figures.map((fig) => createFigureHelperFrom(fig))\n  );\n}\n\nexport function layoutHelperToJSON(layout: LayoutHelper): TemplateBodyLayout {\n  return {\n    figures: layout.figures.map((fig) => figureHelperToJSON(fig)),\n  };\n}\n","import type { TaskBodyLayout } from '~/modules/tasks';\n\nimport type { AnyFigureHelper } from '../figures';\nimport {\n  type LayoutHelper,\n  createLayoutHelper,\n  createLayoutHelperFrom,\n  layoutHelperToJSON,\n} from './templates';\n\nexport interface TaskLayoutHelper extends LayoutHelper {\n  at: number;\n}\n\nexport function createTaskLayoutHelper(\n  figures: AnyFigureHelper[],\n  at: number\n): TaskLayoutHelper {\n  const layout = createLayoutHelper(figures);\n  return {\n    ...layout,\n    at,\n  };\n}\n\nexport function createTaskLayoutHelperFrom(\n  layout: TaskBodyLayout\n): TaskLayoutHelper {\n  const base = createLayoutHelperFrom(layout);\n  return createTaskLayoutHelper(base.figures, layout.at);\n}\n\nexport function taskLayoutHelperToJSON(\n  layout: TaskLayoutHelper\n): TaskBodyLayout {\n  return {\n    ...layoutHelperToJSON(layout),\n    at: layout.at,\n  };\n}\n","import type { AnyFigureHelper } from '../figures';\nimport type { TaskLayoutHelper } from './tasks';\nimport { hashLayout, type LayoutHelper } from './templates';\n\nexport type AnyLayoutHelper = LayoutHelper | TaskLayoutHelper;\n\nexport function isTaskLayoutHelper(\n  layout: AnyLayoutHelper\n): layout is TaskLayoutHelper {\n  return 'at' in layout;\n}\n\nexport function isTemplateLayoutHelper(\n  layout: AnyLayoutHelper\n): layout is LayoutHelper {\n  return !isTaskLayoutHelper(layout);\n}\n\nexport function hasLayoutHelperChanged(layout: AnyLayoutHelper): boolean {\n  return layout.hash !== hashLayout(layout);\n}\n\nexport function addFigureOfHelper(\n  layout: AnyLayoutHelper,\n  figure: AnyFigureHelper,\n  index?: number\n): AnyFigureHelper {\n  if (layout.figures.some((fig) => fig.id === figure.id)) {\n    throw new Error(`Figure \"${figure.id}\" already exists`);\n  }\n  layout.figures.splice(index ?? layout.figures.length, 0, figure);\n  return figure;\n}\n\nexport function removeFigureOfHelper(\n  layout: AnyLayoutHelper,\n  figure: AnyFigureHelper\n): AnyLayoutHelper {\n  const lay = layout;\n  lay.figures = layout.figures.filter((fig) => fig.id !== figure.id);\n  return layout;\n}\n\nexport function updateFigureOfHelper(\n  layout: AnyLayoutHelper,\n  oldFigure: AnyFigureHelper,\n  newFigure: AnyFigureHelper\n): AnyLayoutHelper {\n  const index = layout.figures.findIndex((fig) => fig.id === oldFigure.id);\n  if (index < 0) {\n    throw new Error(`Figure \"${oldFigure.id}\" not found`);\n  }\n  const lay = layout;\n  lay.figures[index] = newFigure;\n  return layout;\n}\n\nexport * from './templates';\nexport * from './tasks';\n"],"mappings":";;;;;;AAiBA,SAAgB,WAAW,QAAmD;CAC5E,OAAO,WAAW,EAAE,SAAS,OAAO,QAAQ,CAAC;AAC/C;AAEA,SAAgB,mBAAmB,SAA0C;CAC3E,MAAM,SAAS;EACb,IAAI,OAAO;EACX;EACA,MAAM;CACR;CAEA,OAAO,OAAO,WAAW,MAAM;CAE/B,OAAO;AACT;AAEA,SAAgB,uBACd,QACc;CACd,OAAO,mBACL,OAAO,QAAQ,KAAK,QAAQ,uBAAuB,GAAG,CAAC,CACzD;AACF;AAEA,SAAgB,mBAAmB,QAA0C;CAC3E,OAAO,EACL,SAAS,OAAO,QAAQ,KAAK,QAAQ,mBAAmB,GAAG,CAAC,EAC9D;AACF;;;;AC/BA,SAAgB,uBACd,SACA,IACkB;CAElB,yCADe,mBAAmB,OAExB,UACR,IACF;AACF;AAEA,SAAgB,2BACd,QACkB;CAElB,OAAO,uBADM,uBAAuB,MACH,CAAC,CAAC,SAAS,OAAO,EAAE;AACvD;AAEA,SAAgB,uBACd,QACgB;CAChB,yCACK,mBAAmB,MAAM,UAC5B,IAAI,OAAO,IACb;AACF;;;;ACjCA,SAAgB,mBACd,QAC4B;CAC5B,OAAO,QAAQ;AACjB;AAEA,SAAgB,uBACd,QACwB;CACxB,OAAO,CAAC,mBAAmB,MAAM;AACnC;AAEA,SAAgB,uBAAuB,QAAkC;CACvE,OAAO,OAAO,SAAS,WAAW,MAAM;AAC1C;AAEA,SAAgB,kBACd,QACA,QACA,OACiB;CACjB,IAAI,OAAO,QAAQ,MAAM,QAAQ,IAAI,OAAO,OAAO,EAAE,GACnD,MAAM,IAAI,MAAM,WAAW,OAAO,GAAG,iBAAiB;CAExD,OAAO,QAAQ,OAAO,6CAAS,OAAO,QAAQ,QAAQ,GAAG,MAAM;CAC/D,OAAO;AACT;AAEA,SAAgB,qBACd,QACA,QACiB;CACjB,MAAM,MAAM;CACZ,IAAI,UAAU,OAAO,QAAQ,QAAQ,QAAQ,IAAI,OAAO,OAAO,EAAE;CACjE,OAAO;AACT;AAEA,SAAgB,qBACd,QACA,WACA,WACiB;CACjB,MAAM,QAAQ,OAAO,QAAQ,WAAW,QAAQ,IAAI,OAAO,UAAU,EAAE;CACvE,IAAI,QAAQ,GACV,MAAM,IAAI,MAAM,WAAW,UAAU,GAAG,YAAY;CAEtD,MAAM,MAAM;CACZ,IAAI,QAAQ,SAAS;CACrB,OAAO;AACT"}