angular-my-report 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +124 -40
  2. package/fesm2022/angular-my-report.mjs +7931 -0
  3. package/fesm2022/angular-my-report.mjs.map +1 -0
  4. package/index.d.ts +5 -0
  5. package/lib/engine/barcode.d.ts +17 -0
  6. package/lib/engine/chart.d.ts +26 -0
  7. package/lib/engine/chartLayout.d.ts +45 -0
  8. package/lib/engine/crosstab.d.ts +22 -0
  9. package/lib/engine/dataSources.d.ts +35 -0
  10. package/lib/engine/expressions.d.ts +46 -0
  11. package/lib/engine/measure.d.ts +7 -0
  12. package/lib/engine/parameters.d.ts +15 -0
  13. package/lib/engine/qr.d.ts +8 -0
  14. package/lib/engine/renderer.d.ts +43 -0
  15. package/lib/engine/table.d.ts +22 -0
  16. package/lib/model/defaults.d.ts +31 -0
  17. package/lib/model/factories.d.ts +31 -0
  18. package/lib/model/types.d.ts +244 -0
  19. package/lib/ui/css.d.ts +2 -0
  20. package/lib/ui/designer/banded-table-dialog.component.d.ts +27 -0
  21. package/lib/ui/designer/canvas.component.d.ts +41 -0
  22. package/lib/ui/designer/data-source-dialog.component.d.ts +37 -0
  23. package/lib/ui/designer/element-box.component.d.ts +32 -0
  24. package/lib/ui/designer/graphics.components.d.ts +36 -0
  25. package/lib/ui/designer/left-panel.component.d.ts +37 -0
  26. package/lib/ui/designer/safe-image.pipe.d.ts +13 -0
  27. package/lib/ui/designer/table-view.component.d.ts +19 -0
  28. package/lib/ui/designer.component.d.ts +59 -0
  29. package/lib/ui/designer.store.d.ts +82 -0
  30. package/lib/ui/inputs.d.ts +8 -0
  31. package/lib/ui/properties/band-props.component.d.ts +15 -0
  32. package/lib/ui/properties/element-props.component.d.ts +46 -0
  33. package/lib/ui/properties/expr-input.component.d.ts +43 -0
  34. package/lib/ui/properties/graphics-props.component.d.ts +52 -0
  35. package/lib/ui/properties/image-picker.component.d.ts +15 -0
  36. package/lib/ui/properties/properties-panel.component.d.ts +13 -0
  37. package/lib/ui/properties/report-extras.component.d.ts +40 -0
  38. package/lib/ui/properties/report-props.component.d.ts +34 -0
  39. package/lib/ui/properties/table-props.component.d.ts +31 -0
  40. package/lib/ui/viewer/page-view.component.d.ts +17 -0
  41. package/lib/ui/viewer/render.d.ts +43 -0
  42. package/lib/ui/viewer/viewer.component.d.ts +99 -0
  43. package/lib/ui/viewer.component.d.ts +40 -0
  44. package/package.json +16 -5
  45. package/{src/public-api.ts → public-api.d.ts} +0 -5
  46. package/ng-package.json +0 -7
  47. package/src/lib/engine/barcode.ts +0 -118
  48. package/src/lib/engine/chart.ts +0 -85
  49. package/src/lib/engine/chartLayout.ts +0 -265
  50. package/src/lib/engine/crosstab.ts +0 -96
  51. package/src/lib/engine/dataSources.ts +0 -204
  52. package/src/lib/engine/expressions.ts +0 -734
  53. package/src/lib/engine/measure.ts +0 -62
  54. package/src/lib/engine/parameters.ts +0 -96
  55. package/src/lib/engine/qr.ts +0 -26
  56. package/src/lib/engine/renderer.ts +0 -324
  57. package/src/lib/engine/table.ts +0 -58
  58. package/src/lib/model/defaults.ts +0 -249
  59. package/src/lib/model/factories.ts +0 -324
  60. package/src/lib/model/types.ts +0 -281
  61. package/src/lib/ui/css.ts +0 -12
  62. package/src/lib/ui/designer/banded-table-dialog.component.ts +0 -127
  63. package/src/lib/ui/designer/canvas.component.ts +0 -281
  64. package/src/lib/ui/designer/data-source-dialog.component.ts +0 -201
  65. package/src/lib/ui/designer/element-box.component.ts +0 -138
  66. package/src/lib/ui/designer/graphics.components.ts +0 -140
  67. package/src/lib/ui/designer/left-panel.component.ts +0 -189
  68. package/src/lib/ui/designer/safe-image.pipe.ts +0 -16
  69. package/src/lib/ui/designer/table-view.component.ts +0 -120
  70. package/src/lib/ui/designer.component.ts +0 -296
  71. package/src/lib/ui/designer.store.ts +0 -230
  72. package/src/lib/ui/inputs.ts +0 -34
  73. package/src/lib/ui/myreport.css +0 -267
  74. package/src/lib/ui/properties/band-props.component.ts +0 -86
  75. package/src/lib/ui/properties/element-props.component.ts +0 -326
  76. package/src/lib/ui/properties/expr-input.component.ts +0 -191
  77. package/src/lib/ui/properties/graphics-props.component.ts +0 -260
  78. package/src/lib/ui/properties/image-picker.component.ts +0 -62
  79. package/src/lib/ui/properties/properties-panel.component.ts +0 -37
  80. package/src/lib/ui/properties/report-extras.component.ts +0 -198
  81. package/src/lib/ui/properties/report-props.component.ts +0 -211
  82. package/src/lib/ui/properties/table-props.component.ts +0 -197
  83. package/src/lib/ui/viewer/page-view.component.ts +0 -73
  84. package/src/lib/ui/viewer/render.ts +0 -161
  85. package/src/lib/ui/viewer/viewer.component.ts +0 -555
  86. package/src/lib/ui/viewer.component.ts +0 -107
  87. package/tsconfig.lib.json +0 -12
  88. package/tsconfig.lib.prod.json +0 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-my-report.mjs","sources":["../../../projects/angular/src/lib/engine/table.ts","../../../projects/angular/src/lib/model/defaults.ts","../../../projects/angular/src/lib/model/factories.ts","../../../projects/angular/src/lib/engine/expressions.ts","../../../projects/angular/src/lib/engine/dataSources.ts","../../../projects/angular/src/lib/engine/parameters.ts","../../../projects/angular/src/lib/ui/designer.store.ts","../../../projects/angular/src/lib/engine/crosstab.ts","../../../projects/angular/src/lib/engine/chart.ts","../../../projects/angular/src/lib/engine/chartLayout.ts","../../../projects/angular/src/lib/engine/barcode.ts","../../../projects/angular/src/lib/engine/qr.ts","../../../projects/angular/src/lib/ui/designer/graphics.components.ts","../../../projects/angular/src/lib/ui/designer/safe-image.pipe.ts","../../../projects/angular/src/lib/engine/measure.ts","../../../projects/angular/src/lib/ui/css.ts","../../../projects/angular/src/lib/ui/designer/table-view.component.ts","../../../projects/angular/src/lib/ui/designer/element-box.component.ts","../../../projects/angular/src/lib/ui/designer/canvas.component.ts","../../../projects/angular/src/lib/ui/designer/left-panel.component.ts","../../../projects/angular/src/lib/ui/designer/data-source-dialog.component.ts","../../../projects/angular/src/lib/engine/renderer.ts","../../../projects/angular/src/lib/ui/viewer/render.ts","../../../projects/angular/src/lib/ui/viewer/page-view.component.ts","../../../projects/angular/src/lib/ui/viewer/viewer.component.ts","../../../projects/angular/src/lib/ui/designer/banded-table-dialog.component.ts","../../../projects/angular/src/lib/ui/properties/expr-input.component.ts","../../../projects/angular/src/lib/ui/properties/table-props.component.ts","../../../projects/angular/src/lib/ui/properties/image-picker.component.ts","../../../projects/angular/src/lib/ui/properties/graphics-props.component.ts","../../../projects/angular/src/lib/ui/properties/element-props.component.ts","../../../projects/angular/src/lib/ui/properties/report-extras.component.ts","../../../projects/angular/src/lib/ui/properties/report-props.component.ts","../../../projects/angular/src/lib/ui/properties/band-props.component.ts","../../../projects/angular/src/lib/ui/properties/properties-panel.component.ts","../../../projects/angular/src/lib/ui/inputs.ts","../../../projects/angular/src/lib/ui/designer.component.ts","../../../projects/angular/src/lib/ui/viewer.component.ts","../../../projects/angular/src/lib/model/types.ts","../../../projects/angular/src/public-api.ts","../../../projects/angular/src/angular-my-report.ts"],"sourcesContent":["import type { ElementStyle, FormatSpec, ReportElement, TableColumn, TableSpec } from '../model/types';\n\n/** Already-evaluated cell strings for drawing a table (designer and preview). */\nexport interface TableRenderData {\n header: string[] | null;\n headerHeight: number;\n rows: { cells: string[]; height: number; index: number }[];\n footer: string[] | null;\n footerHeight: number;\n}\n\nexport const hasGrid = (t: TableSpec) => !!t.gridColor && t.gridColor !== 'transparent';\n\n/** Pixel width of each column (relative widths scaled to the table width). */\nexport function columnWidths(el: ReportElement): number[] {\n const cols = el.table?.columns ?? [];\n const total = cols.reduce((s, c) => s + Math.max(0, c.width), 0) || 1;\n return cols.map((c) => (el.w * Math.max(0, c.width)) / total);\n}\n\n/** Style used for measuring/drawing one cell (1px grid line counts as a border). */\nexport function tableCellStyle(el: ReportElement, header: boolean): ElementStyle {\n const t = el.table!;\n return { ...el.style, bold: header || el.style.bold, borderWidth: hasGrid(t) ? 1 : 0 };\n}\n\n/** Height shown in the designer: header + one sample row + footer. */\nexport function designTableHeight(t: TableSpec): number {\n return (t.showHeader ? t.headerHeight : 0) + t.rowHeight + (t.showFooter ? t.rowHeight : 0);\n}\n\nexport function defaultTableSpec(columns: TableColumn[]): TableSpec {\n return {\n columns,\n showHeader: true,\n repeatHeader: true,\n showFooter: false,\n headerHeight: 24,\n rowHeight: 22,\n headerBackground: '#1f3a68',\n headerColor: '#ffffff',\n stripeBackground: '#f3f6fb',\n gridColor: '#c9d1dd',\n };\n}\n\nexport function createColumn(field: string, type?: string, format?: Partial<FormatSpec>): TableColumn {\n const numeric = type === 'number';\n return {\n id: Math.random().toString(36).slice(2, 10),\n header: field || 'Column',\n text: field ? `{${field}}` : '',\n footer: '',\n width: numeric ? 1 : type === 'date' ? 1.2 : 2,\n align: numeric ? 'right' : 'left',\n format: { kind: type === 'date' ? 'date' : 'none', decimals: 2, currency: 'USD', ...format },\n };\n}\n","import { createColumn, defaultTableSpec, designTableHeight } from '../engine/table';\nimport type {\n Band,\n BandType,\n DataSourceDef,\n ElementKind,\n ElementStyle,\n FormatSpec,\n PageSettings,\n ReportDefinition,\n ReportElement,\n} from './types';\n\nlet counter = 0;\nexport const uid = (prefix = 'id') =>\n `${prefix}_${Date.now().toString(36)}${(counter++).toString(36)}${Math.random().toString(36).slice(2, 6)}`;\n\nexport const PAGE_SIZES: Record<string, { width: number; height: number }> = {\n A4: { width: 794, height: 1123 },\n A5: { width: 559, height: 794 },\n Letter: { width: 816, height: 1056 },\n Legal: { width: 816, height: 1344 },\n 'Receipt 80mm': { width: 302, height: 1123 },\n 'Receipt 58mm': { width: 219, height: 1123 },\n};\n\nexport const BAND_LABELS: Record<BandType, string> = {\n reportHeader: 'Report Header',\n pageHeader: 'Page Header',\n groupHeader: 'Group Header',\n detail: 'Detail',\n groupFooter: 'Group Footer',\n pageFooter: 'Page Footer',\n reportFooter: 'Report Footer',\n};\n\nexport const FOOTER_TYPES: BandType[] = ['groupFooter', 'reportFooter', 'pageFooter'];\n\nexport const defaultStyle = (): ElementStyle => ({\n fontFamily: 'Segoe UI, Arial, sans-serif',\n fontSize: 12,\n bold: false,\n italic: false,\n underline: false,\n color: '#111111',\n background: 'transparent',\n align: 'left',\n vAlign: 'middle',\n borderWidth: 0,\n borderColor: '#333333',\n padding: 2,\n});\n\nexport const defaultFormat = (): FormatSpec => ({ kind: 'none', decimals: 2, currency: 'USD' });\n\nexport function createElement(\n kind: ElementKind,\n x: number,\n y: number,\n overrides: Partial<Omit<ReportElement, 'style' | 'format'>> & {\n style?: Partial<ElementStyle>;\n format?: Partial<FormatSpec>;\n } = {},\n): ReportElement {\n const size: Record<ElementKind, [number, number]> = {\n text: [120, 20],\n field: [120, 20],\n line: [200, 4],\n rect: [120, 60],\n image: [80, 80],\n table: [400, 46],\n chart: [360, 220],\n barcode: [200, 70],\n qrcode: [100, 100],\n crosstab: [480, 120],\n };\n const text: Record<ElementKind, string> = {\n text: 'Label',\n field: '{Field}',\n line: '',\n rect: '',\n image: '',\n table: '',\n chart: '',\n barcode: '{OrderID}',\n qrcode: 'https://example.com/{OrderID}',\n crosstab: '',\n };\n const { style, format, ...rest } = overrides;\n return {\n id: uid('el'),\n kind,\n x,\n y,\n w: size[kind][0],\n h: size[kind][1],\n text: text[kind],\n ...rest,\n format: { ...defaultFormat(), ...format },\n style: {\n ...defaultStyle(),\n ...(kind === 'rect' ? { borderWidth: 1 } : {}),\n ...(kind === 'line' ? { borderWidth: 1 } : {}),\n ...style,\n },\n };\n}\n\n/** A table with one column per field (up to 6), or two blank columns. */\nexport function createTable(x: number, y: number, w: number, fields: { name: string; type?: string }[]): ReportElement {\n const cols = fields.length ? fields.slice(0, 6).map((f) => createColumn(f.name, f.type)) : [createColumn(''), createColumn('')];\n const table = defaultTableSpec(cols);\n return createElement('table', x, y, { w, h: designTableHeight(table), text: '', table, style: { padding: 4 } });\n}\n\nexport const createBand = (type: BandType, height: number, groupId?: string): Band => ({\n id: uid('band'),\n type,\n height,\n visible: true,\n groupId,\n elements: [],\n});\n\nexport const emptyDataSource = (): DataSourceDef => ({\n type: 'json',\n url: '',\n inline: '',\n dataPath: '',\n headers: '',\n entitySet: '',\n select: '',\n filter: '',\n orderby: '',\n expand: '',\n top: null,\n maxRows: 5000,\n});\n\nexport const defaultPage = (): PageSettings => ({\n ...PAGE_SIZES.A4,\n marginTop: 38,\n marginBottom: 38,\n marginLeft: 38,\n marginRight: 38,\n});\n\nexport const contentWidth = (p: PageSettings) => p.width - p.marginLeft - p.marginRight;\n\nexport function newReport(): ReportDefinition {\n return {\n version: 1,\n name: 'New Report',\n page: defaultPage(),\n dataSource: emptyDataSource(),\n groups: [],\n sort: [],\n bands: [\n createBand('reportHeader', 60),\n createBand('pageHeader', 30),\n createBand('detail', 24),\n createBand('pageFooter', 30),\n createBand('reportFooter', 40),\n ],\n };\n}\n\n/** Bands in the order they are laid out on the page. */\nexport function orderedBands(r: ReportDefinition): Band[] {\n const of = (t: BandType) => r.bands.filter((b) => b.type === t);\n const groupBand = (t: BandType, gid: string) => r.bands.find((b) => b.type === t && b.groupId === gid);\n const gh = r.groups.map((g) => groupBand('groupHeader', g.id)).filter(Boolean) as Band[];\n const gf = [...r.groups].reverse().map((g) => groupBand('groupFooter', g.id)).filter(Boolean) as Band[];\n return [...of('reportHeader'), ...of('pageHeader'), ...gh, ...of('detail'), ...gf, ...of('pageFooter'), ...of('reportFooter')];\n}\n\n/** A ready-made report bound to the bundled sample JSON file. */\nexport function sampleReport(): ReportDefinition {\n const r = newReport();\n r.name = 'Sales Orders';\n r.dataSource = { ...emptyDataSource(), type: 'json', url: '/samples/orders.json', dataPath: 'data.items' };\n r.sort = [{ field: 'OrderDate', direction: 'asc' }];\n const band = (t: BandType) => r.bands.find((b) => b.type === t)!;\n\n band('reportHeader').elements.push(\n createElement('text', 0, 4, { w: 400, h: 32, text: 'Sales Orders Report', style: { fontSize: 22, bold: true, color: '#1f3a68' } }),\n createElement('text', 418, 10, { w: 300, h: 20, text: 'Printed {Now}', format: { kind: 'datetime' }, style: { align: 'right', color: '#666666' } }),\n createElement('line', 0, 46, { w: 718, h: 4, style: { borderColor: '#1f3a68', borderWidth: 2 } }),\n );\n\n const cols: [string, string, number, number, 'left' | 'right', Partial<FormatSpec>?][] = [\n ['Order #', 'OrderID', 0, 60, 'left'],\n ['Date', 'OrderDate', 64, 90, 'left', { kind: 'date' }],\n ['Customer', 'Customer', 158, 170, 'left'],\n ['Product', 'Product', 332, 150, 'left'],\n ['Qty', 'Quantity', 486, 50, 'right', { kind: 'number', decimals: 0 }],\n ['Unit Price', 'UnitPrice', 540, 80, 'right', { kind: 'currency' }],\n ['Amount', 'Amount', 624, 94, 'right', { kind: 'currency' }],\n ];\n for (const [label, field, x, w, align, format] of cols) {\n band('pageHeader').elements.push(createElement('text', x, 4, { w, h: 20, text: label, style: { bold: true, align, color: '#1f3a68' } }));\n band('detail').elements.push(createElement('field', x, 2, { w, h: 20, text: `{${field}}`, format, style: { align } }));\n }\n band('pageHeader').elements.push(createElement('line', 0, 26, { w: 718, h: 4, style: { borderColor: '#1f3a68' } }));\n\n const g = { id: uid('grp'), field: 'Country', direction: 'asc' as const };\n r.groups.push(g);\n const gh = createBand('groupHeader', 28, g.id);\n gh.elements.push(\n createElement('field', 0, 4, { w: 718, h: 22, text: 'Country: {Country}', style: { bold: true, background: '#e8eef8', padding: 4 } }),\n );\n const gf = createBand('groupFooter', 30, g.id);\n gf.elements.push(\n createElement('field', 332, 4, { w: 204, h: 20, text: '{count()} orders in {Country}', style: { italic: true, color: '#555555' } }),\n createElement('field', 540, 4, { w: 178, h: 20, text: '{sum(Amount)}', format: { kind: 'currency' }, style: { bold: true, align: 'right' } }),\n createElement('line', 540, 0, { w: 178, h: 4, style: { borderColor: '#999999' } }),\n );\n r.bands.push(gh, gf);\n\n band('pageFooter').elements.push(\n createElement('field', 418, 6, { w: 300, h: 20, text: 'Page {PageNumber} of {TotalPages}', style: { align: 'right', color: '#666666', fontSize: 11 } }),\n createElement('field', 0, 6, { w: 300, h: 20, text: '{ReportName}', style: { color: '#666666', fontSize: 11 } }),\n );\n band('reportFooter').elements.push(\n createElement('line', 0, 2, { w: 718, h: 4, style: { borderColor: '#1f3a68', borderWidth: 2 } }),\n createElement('text', 332, 10, { w: 204, h: 22, text: 'Grand total', style: { bold: true, fontSize: 14 } }),\n createElement('field', 540, 10, { w: 178, h: 22, text: '{sum(Amount)}', format: { kind: 'currency' }, style: { bold: true, fontSize: 14, align: 'right' } }),\n );\n return r;\n}\n\nexport const defaultWatermark = (): import('./types').Watermark => ({\n enabled: false,\n kind: 'text',\n text: 'CONFIDENTIAL',\n image: '',\n opacity: 0.12,\n angle: -40,\n fontSize: 96,\n color: '#c4372f',\n bold: true,\n imageScale: 60,\n layer: 'front',\n pages: 'all',\n});\n\nexport const defaultBackground = (): import('./types').PageBackground => ({ enabled: false, image: '', fit: 'cover', pages: 'all' });\n\nexport const defaultFieldOptions = (): import('./types').FieldOptions => ({ nullText: '', hideDuplicates: false, rules: [] });\n","import type { Band, BandType, ReportDefinition, ReportElement } from './types';\nimport { contentWidth, createBand, createElement } from './defaults';\n\nexport interface FieldRef {\n name: string;\n type?: string;\n}\n\nconst firstOf = (fields: FieldRef[], type: string, skip: string[] = []) =>\n fields.find((f) => f.type === type && !skip.includes(f.name))?.name ?? '';\n\nexport function createChart(x: number, y: number, w: number, fields: FieldRef[]): ReportElement {\n const category = firstOf(fields, 'string');\n const value = fields.find((f) => f.type === 'number' && !/id$/i.test(f.name))?.name ?? firstOf(fields, 'number');\n return createElement('chart', x, y, {\n w: Math.min(w, 420),\n h: 240,\n style: { fontSize: 11, color: '#333333' },\n chart: {\n // Horizontal bars read best for ranked categories with long names.\n type: 'hbar',\n title: value && category ? `${value} by ${category}` : 'Chart',\n categoryField: category,\n valueFields: value ? [value] : [],\n aggregate: value ? 'sum' : 'count',\n sort: 'valueDesc',\n maxCategories: 12,\n showLegend: true,\n showValues: false,\n showGrid: true,\n valueFormat: { kind: 'number', decimals: 0, currency: 'USD' },\n },\n });\n}\n\nexport function createBarcode(x: number, y: number, fields: FieldRef[]): ReportElement {\n const id = fields.find((f) => /id$|code|number|sku/i.test(f.name))?.name ?? fields[0]?.name;\n return createElement('barcode', x, y, {\n text: id ? `{${id}}` : '12345678',\n style: { fontSize: 11, fontFamily: \"Consolas, 'Courier New', monospace\" },\n barcode: { symbology: 'code128', showText: true, color: '#000000' },\n });\n}\n\nexport function createQr(x: number, y: number, fields: FieldRef[]): ReportElement {\n const id = fields.find((f) => /id$|code|number/i.test(f.name))?.name ?? fields[0]?.name;\n return createElement('qrcode', x, y, {\n text: id ? `https://example.com/item/{${id}}` : 'https://example.com',\n qr: { errorCorrection: 'M', color: '#000000' },\n });\n}\n\nexport function createCrosstab(x: number, y: number, w: number, fields: FieldRef[]): ReportElement {\n const rowField = firstOf(fields, 'string');\n const columnField = firstOf(fields, 'string', [rowField]);\n const valueField = fields.find((f) => f.type === 'number' && !/id$/i.test(f.name))?.name ?? '';\n return createElement('crosstab', x, y, {\n w: Math.max(200, w),\n h: 120,\n style: { fontSize: 11, padding: 4 },\n crosstab: {\n rowField,\n columnField,\n valueField,\n aggregate: valueField ? 'sum' : 'count',\n cornerText: '',\n showRowTotals: true,\n showColumnTotals: true,\n valueFormat: { kind: 'number', decimals: 0, currency: 'USD' },\n headerHeight: 24,\n rowHeight: 22,\n headerBackground: '#1f3a68',\n headerColor: '#ffffff',\n stripeBackground: '#f3f6fb',\n gridColor: '#c9d1dd',\n repeatHeader: true,\n },\n });\n}\n\n// ---------------------------------------------------------------------------------------------\n// Header/Detail (\"banded\") table: column titles in a header band, one field per column in Detail.\n\nexport interface BandedTableOptions {\n fields: FieldRef[];\n /** Band that receives the column titles. */\n titleBand: 'pageHeader' | 'reportHeader' | 'groupHeader';\n /** For titleBand 'groupHeader': which group. Defaults to the innermost. */\n groupId?: string;\n grid: boolean;\n headerBackground: string;\n headerColor: string;\n /** Adds sum() of numeric columns to the Report Footer. */\n totals: boolean;\n rowHeight: number;\n /** Clear the title band and Detail band first (otherwise the table is appended below). */\n replace: boolean;\n}\n\n/** Relative column width by field type. */\nconst weight = (f: FieldRef) => (f.type === 'number' ? 1 : f.type === 'date' ? 1.2 : 2);\n\n/** Finds or creates (and shows) the band a banded table writes into. */\nfunction ensureBand(r: ReportDefinition, type: BandType, groupId?: string): Band {\n let b = r.bands.find((x) => x.type === type && (!groupId || x.groupId === groupId));\n if (!b) {\n b = createBand(type, 0, groupId);\n b.elements = [];\n r.bands.push(b);\n }\n b.visible = true;\n return b;\n}\n\n/** Appends one row of cells to the bottom of a band (growing the band). */\nfunction appendRow(band: Band, cells: ReportElement[], rowHeight: number) {\n const y = band.elements.length ? band.height : 0;\n for (const c of cells) c.y = y;\n band.elements.push(...cells);\n band.height = y + rowHeight;\n}\n\n/** Adds the banded table to the report; returns the ids of the created elements. */\nexport function addBandedTable(r: ReportDefinition, o: BandedTableOptions): string[] {\n const width = contentWidth(r.page);\n const total = o.fields.reduce((s, f) => s + weight(f), 0) || 1;\n const border = o.grid ? 1 : 0;\n const lineColor = '#c9d1dd';\n\n // Integer column edges so neighbouring cells share their 1px border instead of doubling it.\n let acc = 0;\n const cols = o.fields.map((f) => {\n const x0 = Math.round((acc / total) * width);\n acc += weight(f);\n const x1 = Math.round((acc / total) * width);\n const align = f.type === 'number' ? ('right' as const) : ('left' as const);\n return { f, x: x0, w: x1 - x0 + (o.grid && x1 < width ? border : 0), align };\n });\n\n const groupId = o.titleBand === 'groupHeader' ? o.groupId ?? r.groups[r.groups.length - 1]?.id : undefined;\n const titleBand = ensureBand(r, o.titleBand === 'groupHeader' && !groupId ? 'pageHeader' : o.titleBand, groupId);\n const detail = ensureBand(r, 'detail');\n if (o.replace) for (const b of [titleBand, detail]) (b.elements = []), (b.height = 0);\n const ids: string[] = [];\n const cell = (el: ReportElement) => (ids.push(el.id), el);\n const cellStyle = { borderWidth: border, borderColor: lineColor, padding: 4 };\n\n appendRow(\n titleBand,\n cols.map((c) =>\n cell(\n createElement('text', c.x, 0, {\n w: c.w,\n h: o.rowHeight + border,\n text: c.f.name,\n canGrow: false,\n style: { ...cellStyle, bold: true, align: c.align, background: o.headerBackground, color: o.headerColor },\n }),\n ),\n ),\n o.rowHeight,\n );\n if (!o.grid) {\n appendRow(titleBand, [cell(createElement('line', 0, 0, { w: width, h: 4, style: { borderColor: o.headerBackground, borderWidth: 2 } }))], 4);\n }\n\n appendRow(\n detail,\n cols.map((c) =>\n cell(\n createElement('field', c.x, 0, {\n w: c.w,\n h: o.rowHeight + border,\n text: `{${c.f.name}}`,\n format: c.f.type === 'date' ? { kind: 'date' } : {},\n // Top-aligned so short cells line up with the first line of a tall neighbour.\n style: { ...cellStyle, align: c.align, vAlign: 'top' },\n }),\n ),\n ),\n o.rowHeight,\n );\n\n // Totals only for measures: skip identifiers such as OrderID.\n const summable = (c: (typeof cols)[number]) => c.f.type === 'number' && !/id$/i.test(c.f.name);\n if (o.totals && cols.some(summable)) {\n const footer = ensureBand(r, 'reportFooter');\n const firstNumeric = cols.findIndex(summable);\n const cells: ReportElement[] = [];\n if (firstNumeric > 0) {\n const label = cols[firstNumeric - 1];\n cells.push(cell(createElement('text', label.x, 0, { w: label.w, h: o.rowHeight, text: 'Total', style: { bold: true, align: 'right', padding: 4 } })));\n }\n for (const c of cols.filter(summable)) {\n cells.push(\n cell(\n createElement('field', c.x, 0, {\n w: c.w,\n h: o.rowHeight + border,\n text: `{sum(${c.f.name})}`,\n format: { kind: 'number', decimals: 2 },\n style: { ...cellStyle, bold: true, align: 'right' },\n }),\n ),\n );\n }\n appendRow(footer, cells, o.rowHeight);\n }\n return ids;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Receipt template (thermal roll): rows are the receipt's items; shop/payment details come from\n// the document itself as root.x (e.g. {root.store.name}).\n\nexport const RECEIPT_WIDTHS = { 80: 302, 58: 219 } as const; // px at 96 dpi\n\nexport function receiptReport(paper: 80 | 58 = 80): ReportDefinition {\n const width = RECEIPT_WIDTHS[paper];\n const margin = paper === 80 ? 10 : 6;\n const cw = width - margin * 2;\n const fs = paper === 80 ? 11 : 10;\n const mono = \"Consolas, 'Courier New', monospace\";\n const base = { fontFamily: mono, fontSize: fs, color: '#111111', padding: 1, vAlign: 'top' as const };\n const money = (expr: string) => `{format(${expr}, \"number\", 2)}`;\n const totalExpr = 'sum(qty * price) * (1 + root.taxRate)';\n\n const text = (x: number, y: number, w: number, h: number, t: string, style: Record<string, unknown> = {}) =>\n createElement('field', x, y, { w, h, text: t, style: { ...base, ...style } });\n const left = (y: number, t: string, style: Record<string, unknown> = {}, h = fs + 5) => text(0, y, Math.round(cw * 0.6), h, t, style);\n const right = (y: number, t: string, style: Record<string, unknown> = {}, h = fs + 5) =>\n text(Math.round(cw * 0.4), y, cw - Math.round(cw * 0.4), h, t, { ...style, align: 'right' });\n const center = (y: number, t: string, style: Record<string, unknown> = {}, h = fs + 5) => text(0, y, cw, h, t, { ...style, align: 'center' });\n const dashed = (y: number) => createElement('line', 0, y, { w: cw, h: 4, dash: 'dashed', style: { borderColor: '#444444', borderWidth: 1 } });\n\n const r: ReportDefinition = {\n version: 1,\n name: `Receipt ${paper}mm`,\n page: { width, height: 1123, marginTop: 10, marginBottom: 14, marginLeft: margin, marginRight: margin, continuous: true },\n dataSource: {\n type: 'json', url: '/samples/receipt.json', inline: '', dataPath: 'items', headers: '',\n entitySet: '', select: '', filter: '', orderby: '', expand: '', top: null, maxRows: 5000,\n },\n groups: [],\n sort: [],\n bands: [],\n };\n\n const header = createBand('reportHeader', 0);\n const lh = fs + 4;\n header.elements.push(\n center(0, '{root.store.name}', { fontSize: fs + 5, bold: true }, fs + 10),\n center(fs + 11, '{root.store.address}', { fontSize: fs - 1 }),\n center(fs + 11 + lh, 'Tel {root.store.phone}', { fontSize: fs - 1 }),\n center(fs + 11 + lh * 2, 'Tax ID {root.store.taxId}', { fontSize: fs - 1 }),\n );\n let y = fs + 15 + lh * 3;\n header.elements.push(dashed(y));\n y += 6;\n header.elements.push(\n left(y, 'Receipt'), right(y, '{root.receiptNo}'),\n left(y + lh, 'Date'), right(y + lh, '{formatdate(root.date, \"dd/MM/yyyy HH:mm\")}'),\n left(y + lh * 2, 'Cashier {root.cashier}'), right(y + lh * 2, 'Table {root.table}'),\n );\n y += lh * 3 + 2;\n header.elements.push(dashed(y));\n y += 6;\n header.elements.push(left(y, 'ITEM', { bold: true }), right(y, `TOTAL ${'{root.currency}'}`, { bold: true }));\n y += lh + 2;\n header.elements.push(dashed(y));\n header.height = y + 6;\n\n // Detail: name + line total on line 1 (they grow together for long names); \"qty x price\" below.\n const detail = createBand('detail', 0);\n const priceW = Math.round(cw * 0.32);\n detail.elements.push(\n text(0, 0, cw - priceW, fs + 5, '{name}', { bold: true }),\n text(cw - priceW, 0, priceW, fs + 5, money('qty * price'), { align: 'right' }),\n text(0, fs + 5, cw, fs + 4, ` {qty} x ${money('price')}`, { fontSize: fs - 1, color: '#444444' }),\n );\n detail.height = fs * 2 + 11;\n\n const footer = createBand('reportFooter', 0);\n y = 0;\n footer.elements.push(dashed(y));\n y += 6;\n footer.elements.push(left(y, 'Subtotal'), right(y, money('sum(qty * price)')));\n y += lh;\n footer.elements.push(left(y, 'VAT {format(root.taxRate, \"percent\", 0)}'), right(y, money('sum(qty * price) * root.taxRate')));\n y += lh + 4;\n footer.elements.push(\n left(y, 'TOTAL', { bold: true, fontSize: fs + 3 }, fs + 9),\n right(y, `{root.currency} ${money(totalExpr)}`, { bold: true, fontSize: fs + 3 }, fs + 9),\n );\n y += fs + 12;\n footer.elements.push(left(y, '{root.payment.method}'), right(y, money('root.payment.paid')));\n y += lh;\n footer.elements.push(left(y, 'Change'), right(y, money(`root.payment.paid - ${totalExpr}`)));\n y += lh + 4;\n footer.elements.push(dashed(y));\n y += 8;\n footer.elements.push(center(y, '{count()} items · {sum(qty)} pcs', { fontSize: fs - 1, color: '#444444' }));\n y += lh + 6;\n\n const bcW = Math.min(cw, 220);\n const barcode = createBarcode((cw - bcW) / 2, y, []);\n Object.assign(barcode, { w: bcW, h: 54, text: '{root.receiptNo}' });\n barcode.style = { ...barcode.style, fontSize: fs - 1 };\n footer.elements.push(barcode);\n y += 62;\n const qrSize = paper === 80 ? 96 : 84;\n const qr = createQr((cw - qrSize) / 2, y, []);\n Object.assign(qr, { w: qrSize, h: qrSize, text: 'https://example.com/r/{root.receiptNo}' });\n footer.elements.push(qr);\n y += qrSize + 4;\n footer.elements.push(center(y, 'Thank you for your visit!', { bold: true }), center(y + lh + 2, 'Please keep this receipt', { fontSize: fs - 1, color: '#444444' }));\n footer.height = y + lh * 2 + 4;\n\n const pageHeader = createBand('pageHeader', 0);\n const pageFooter = createBand('pageFooter', 0);\n pageHeader.visible = pageFooter.visible = false;\n r.bands.push(header, pageHeader, detail, pageFooter, footer);\n return r;\n}\n","import type { FormatSpec } from '../model/types';\n\nexport type Row = Record<string, unknown>;\n\nexport interface EvalContext {\n row: Row | undefined;\n /** Rows in the current scope (current group, or all rows for report bands). */\n rows: Row[];\n allRows: Row[];\n pageRows: Row[];\n rowNumber: number;\n pageNumber: number;\n totalPages: number;\n reportName: string;\n /** Report parameter values, by name. */\n params?: Record<string, unknown>;\n /** The whole loaded document (e.g. a receipt object whose items are the rows); read as root.x. */\n root?: unknown;\n}\n\nexport function getPath(obj: unknown, path: string): unknown {\n let cur: any = obj;\n for (const part of path.split('.')) {\n if (cur == null) return undefined;\n cur = cur[part];\n }\n return cur;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Formula language\n//\n// literals 123 1.5 \"text\" 'text' true false null\n// fields Customer address.city [Unit Price] (brackets for names with spaces)\n// parameters @Country Parameters.Country\n// operators + - * / % == = != <> < <= > >= && and || or ! not cond ? a : b\n// functions sum(Quantity * UnitPrice) count() iif(Amount > 100, \"High\", \"Low\") upper(Customer) …\n// aggregates take an optional scope as last argument: sum(Amount, report) | page | group\n// specials PageNumber TotalPages Now Today RowNumber ReportName\n\ntype Node =\n | { k: 'lit'; v: unknown }\n | { k: 'id'; name: string }\n | { k: 'param'; name: string }\n | { k: 'un'; op: '-' | '!'; a: Node }\n | { k: 'bin'; op: string; a: Node; b: Node }\n | { k: 'cond'; c: Node; a: Node; b: Node }\n | { k: 'call'; name: string; args: Node[] };\n\ntype Tok = { t: 'num'; v: number } | { t: 'str'; v: string } | { t: 'id'; v: string } | { t: 'param'; v: string } | { t: 'op'; v: string } | { t: 'eof' };\n\nconst IDENT = /^[A-Za-z_À-￿][\\w.À-￿]*/;\nconst OPS = ['==', '!=', '<>', '<=', '>=', '&&', '||', '<', '>', '+', '-', '*', '/', '%', '!', '?', ':', '(', ')', ',', '='];\n\nfunction tokenize(s: string): Tok[] {\n const out: Tok[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i];\n if (/\\s/.test(c)) {\n i++;\n continue;\n }\n if (/\\d/.test(c) || (c === '.' && /\\d/.test(s[i + 1] ?? ''))) {\n const m = /^\\d*\\.?\\d+(?:[eE][+-]?\\d+)?/.exec(s.slice(i))!;\n out.push({ t: 'num', v: Number(m[0]) });\n i += m[0].length;\n continue;\n }\n if (c === '\"' || c === \"'\") {\n let j = i + 1;\n let v = '';\n while (j < s.length && s[j] !== c) {\n if (s[j] === '\\\\' && j + 1 < s.length) {\n j++;\n v += s[j] === 'n' ? '\\n' : s[j];\n } else v += s[j];\n j++;\n }\n if (j >= s.length) throw new Error('Unterminated string');\n out.push({ t: 'str', v });\n i = j + 1;\n continue;\n }\n if (c === '[') {\n const j = s.indexOf(']', i);\n if (j < 0) throw new Error('Missing ]');\n out.push({ t: 'id', v: s.slice(i + 1, j).trim() });\n i = j + 1;\n continue;\n }\n if (c === '@') {\n const m = IDENT.exec(s.slice(i + 1));\n if (!m) throw new Error('Parameter name expected after @');\n out.push({ t: 'param', v: m[0] });\n i += 1 + m[0].length;\n continue;\n }\n const m = IDENT.exec(s.slice(i));\n if (m) {\n out.push({ t: 'id', v: m[0] });\n i += m[0].length;\n continue;\n }\n const op = OPS.find((o) => s.startsWith(o, i));\n if (op) {\n out.push({ t: 'op', v: op });\n i += op.length;\n continue;\n }\n throw new Error(`Unexpected \"${c}\"`);\n }\n out.push({ t: 'eof' });\n return out;\n}\n\nconst tokText = (t: Tok) => (t.t === 'eof' ? 'end' : String(t.v));\n\nfunction parse(src: string): Node {\n const toks = tokenize(src);\n let p = 0;\n const peek = () => toks[p];\n const isOp = (v: string) => peek().t === 'op' && (peek() as { v: string }).v === v;\n const isKw = (v: string) => peek().t === 'id' && (peek() as { v: string }).v.toLowerCase() === v;\n const expect = (v: string) => {\n if (!isOp(v)) throw new Error(`Expected \"${v}\" but found \"${tokText(peek())}\"`);\n p++;\n };\n const opv = () => (toks[p++] as { v: string }).v;\n\n function ternary(): Node {\n const c = or();\n if (isOp('?')) {\n p++;\n const a = ternary();\n expect(':');\n return { k: 'cond', c, a, b: ternary() };\n }\n return c;\n }\n function or(): Node {\n let a = and();\n while (isOp('||') || isKw('or')) {\n p++;\n a = { k: 'bin', op: '||', a, b: and() };\n }\n return a;\n }\n function and(): Node {\n let a = eq();\n while (isOp('&&') || isKw('and')) {\n p++;\n a = { k: 'bin', op: '&&', a, b: eq() };\n }\n return a;\n }\n function eq(): Node {\n let a = rel();\n for (;;) {\n if (isOp('==') || isOp('=')) {\n p++;\n a = { k: 'bin', op: '==', a, b: rel() };\n } else if (isOp('!=') || isOp('<>')) {\n p++;\n a = { k: 'bin', op: '!=', a, b: rel() };\n } else return a;\n }\n }\n function rel(): Node {\n let a = add();\n while (['<', '<=', '>', '>='].some(isOp)) a = { k: 'bin', op: opv(), a, b: add() };\n return a;\n }\n function add(): Node {\n let a = mul();\n while (isOp('+') || isOp('-')) a = { k: 'bin', op: opv(), a, b: mul() };\n return a;\n }\n function mul(): Node {\n let a = unary();\n while (isOp('*') || isOp('/') || isOp('%')) a = { k: 'bin', op: opv(), a, b: unary() };\n return a;\n }\n function unary(): Node {\n if (isOp('-')) {\n p++;\n return { k: 'un', op: '-', a: unary() };\n }\n if (isOp('!') || isKw('not')) {\n p++;\n return { k: 'un', op: '!', a: unary() };\n }\n return primary();\n }\n function primary(): Node {\n const t = toks[p++];\n switch (t.t) {\n case 'num':\n case 'str':\n return { k: 'lit', v: t.v };\n case 'param':\n return { k: 'param', name: t.v };\n case 'id': {\n const low = t.v.toLowerCase();\n if (low === 'true' || low === 'false') return { k: 'lit', v: low === 'true' };\n if (low === 'null') return { k: 'lit', v: null };\n if (isOp('(')) {\n p++;\n const args: Node[] = [];\n if (!isOp(')')) {\n args.push(ternary());\n while (isOp(',')) {\n p++;\n args.push(ternary());\n }\n }\n expect(')');\n if (!FUNCTIONS_BY_NAME.has(low)) throw new Error(`Unknown function \"${t.v}\"`);\n return { k: 'call', name: low, args };\n }\n return { k: 'id', name: t.v };\n }\n case 'op':\n if (t.v === '(') {\n const e = ternary();\n expect(')');\n return e;\n }\n throw new Error(`Unexpected \"${t.v}\"`);\n default:\n throw new Error('Incomplete expression');\n }\n }\n\n const node = ternary();\n if (peek().t !== 'eof') throw new Error(`Unexpected \"${tokText(peek())}\"`);\n return node;\n}\n\nconst cache = new Map<string, Node>();\nfunction compile(src: string): Node {\n let n = cache.get(src);\n if (!n) {\n n = parse(src);\n if (cache.size > 5000) cache.clear();\n cache.set(src, n);\n }\n return n;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Evaluation\n\nconst toNumber = (v: unknown): number =>\n typeof v === 'number' ? v : v instanceof Date ? v.getTime() : v == null || v === '' ? NaN : typeof v === 'boolean' ? +v : Number(v);\n\nfunction numLike(v: unknown): number | null {\n if (typeof v === 'number') return v;\n if (typeof v === 'boolean') return +v;\n if (v instanceof Date) return v.getTime();\n if (typeof v === 'string' && v.trim() !== '' && Number.isFinite(Number(v))) return Number(v);\n return null;\n}\n\nexport const truthy = (v: unknown) => !(v == null || v === false || v === 0 || v === '' || (typeof v === 'number' && Number.isNaN(v)));\n\nfunction compare(a: unknown, b: unknown): number {\n const na = numLike(a);\n const nb = numLike(b);\n if (na !== null && nb !== null) return na - nb;\n return String(a ?? '').localeCompare(String(b ?? ''), undefined, { numeric: true });\n}\n\nfunction equals(a: unknown, b: unknown): boolean {\n if (a == null || b == null) return (a == null || a === '') && (b == null || b === '');\n const na = numLike(a);\n const nb = numLike(b);\n if (na !== null && nb !== null) return na === nb;\n return String(a) === String(b);\n}\n\nfunction param(ctx: EvalContext, name: string): unknown {\n const p = ctx.params ?? {};\n if (name in p) return p[name];\n const key = Object.keys(p).find((k) => k.toLowerCase() === name.toLowerCase());\n return key ? p[key] : undefined;\n}\n\nfunction resolveId(name: string, ctx: EvalContext): unknown {\n if (ctx.row) {\n const v = getPath(ctx.row, name);\n if (v !== undefined) return v;\n }\n const low = name.toLowerCase();\n switch (low) {\n case 'pagenumber':\n return ctx.pageNumber;\n case 'totalpages':\n return ctx.totalPages;\n case 'now':\n return new Date();\n case 'today': {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d;\n }\n case 'rownumber':\n return ctx.rowNumber;\n case 'reportname':\n return ctx.reportName;\n }\n if (low.startsWith('parameters.')) return param(ctx, name.slice('parameters.'.length));\n if (low === 'root') return ctx.root;\n if (low.startsWith('root.')) return getPath(ctx.root, name.slice(5));\n return undefined;\n}\n\nfunction evalNode(n: Node, ctx: EvalContext): unknown {\n switch (n.k) {\n case 'lit':\n return n.v;\n case 'param':\n return param(ctx, n.name);\n case 'id':\n return resolveId(n.name, ctx);\n case 'un': {\n const v = evalNode(n.a, ctx);\n return n.op === '-' ? -toNumber(v) : !truthy(v);\n }\n case 'cond':\n return truthy(evalNode(n.c, ctx)) ? evalNode(n.a, ctx) : evalNode(n.b, ctx);\n case 'bin': {\n if (n.op === '&&') return truthy(evalNode(n.a, ctx)) && truthy(evalNode(n.b, ctx));\n if (n.op === '||') return truthy(evalNode(n.a, ctx)) || truthy(evalNode(n.b, ctx));\n const a = evalNode(n.a, ctx);\n const b = evalNode(n.b, ctx);\n switch (n.op) {\n case '==':\n return equals(a, b);\n case '!=':\n return !equals(a, b);\n case '<':\n return compare(a, b) < 0;\n case '<=':\n return compare(a, b) <= 0;\n case '>':\n return compare(a, b) > 0;\n case '>=':\n return compare(a, b) >= 0;\n case '+':\n // Text joins; numbers add.\n if ((typeof a === 'string' && numLike(a) === null) || (typeof b === 'string' && numLike(b) === null) || a == null || b == null) {\n if (a == null && b == null) return null;\n if (numLike(a) !== null && b == null) return toNumber(a);\n if (numLike(b) !== null && a == null) return toNumber(b);\n return String(a ?? '') + String(b ?? '');\n }\n return toNumber(a) + toNumber(b);\n case '-':\n return toNumber(a) - toNumber(b);\n case '*':\n return toNumber(a) * toNumber(b);\n case '/': {\n const d = toNumber(b);\n return d === 0 ? null : toNumber(a) / d;\n }\n case '%':\n return toNumber(a) % toNumber(b);\n }\n throw new Error(`Unknown operator ${n.op}`);\n }\n case 'call':\n return callFunction(n.name, n.args, ctx);\n }\n}\n\nconst SCOPES = new Set(['report', 'all', 'page', 'group']);\nexport const AGGREGATES = ['sum', 'avg', 'min', 'max', 'count', 'first', 'last', 'distinctcount'];\nconst AGG = new Set(AGGREGATES);\n\nfunction callFunction(name: string, args: Node[], ctx: EvalContext): unknown {\n if (AGG.has(name)) {\n const last = args[args.length - 1];\n const scope = last && last.k === 'id' && SCOPES.has(last.name.toLowerCase()) ? last.name.toLowerCase() : null;\n const a = scope ? args.slice(0, -1) : args;\n // min(a, b) / max(a, b) with 2+ values: plain numeric min/max.\n if ((name === 'min' || name === 'max') && a.length >= 2) {\n const nums = a.map((x) => toNumber(evalNode(x, ctx))).filter((x) => !Number.isNaN(x));\n return nums.length ? (name === 'min' ? Math.min(...nums) : Math.max(...nums)) : null;\n }\n const set = scope === 'report' || scope === 'all' ? ctx.allRows : scope === 'page' ? ctx.pageRows ?? ctx.rows : ctx.rows;\n if (name === 'count' && !a.length) return set.length;\n if (!a.length) throw new Error(`${name}() needs a field or expression`);\n const values = set.map((r) => evalNode(a[0], { ...ctx, row: r }));\n return reduceAggregate(name, values);\n }\n const v = args.map((x) => evalNode(x, ctx));\n const s = (i: number) => (v[i] == null ? '' : v[i] instanceof Date ? (v[i] as Date).toLocaleString() : String(v[i]));\n const n = (i: number) => toNumber(v[i]);\n const d = (i: number) => toDate(v[i]);\n switch (name) {\n // logic\n case 'iif':\n case 'if':\n return truthy(v[0]) ? v[1] : v[2];\n case 'isnull':\n case 'coalesce':\n return v.find((x) => x != null && x !== '') ?? (name === 'isnull' ? v[1] : null);\n case 'isempty':\n return v[0] == null || v[0] === '';\n // text\n case 'upper':\n return s(0).toUpperCase();\n case 'lower':\n return s(0).toLowerCase();\n case 'trim':\n return s(0).trim();\n case 'len':\n case 'length':\n return s(0).length;\n case 'left':\n return s(0).slice(0, Math.max(0, n(1)));\n case 'right':\n return n(1) > 0 ? s(0).slice(-n(1)) : '';\n case 'substr':\n return s(0).substr(n(1), args.length > 2 ? n(2) : undefined);\n case 'replace':\n return s(0).split(s(1)).join(s(2));\n case 'concat':\n return v.map((_, i) => s(i)).join('');\n case 'contains':\n return s(0).toLowerCase().includes(s(1).toLowerCase());\n case 'startswith':\n return s(0).toLowerCase().startsWith(s(1).toLowerCase());\n case 'endswith':\n return s(0).toLowerCase().endsWith(s(1).toLowerCase());\n case 'padleft':\n return s(0).padStart(n(1), args.length > 2 ? s(2) : ' ');\n case 'tostring':\n return s(0);\n // math\n case 'round': {\n const f = Math.pow(10, args.length > 1 ? n(1) : 0);\n return Math.round(n(0) * f) / f;\n }\n case 'floor':\n return Math.floor(n(0));\n case 'ceil':\n return Math.ceil(n(0));\n case 'abs':\n return Math.abs(n(0));\n case 'sqrt':\n return Math.sqrt(n(0));\n case 'pow':\n return Math.pow(n(0), n(1));\n case 'tonumber':\n return n(0);\n // dates\n case 'now':\n return new Date();\n case 'today': {\n const t = new Date();\n t.setHours(0, 0, 0, 0);\n return t;\n }\n case 'year':\n return d(0)?.getFullYear() ?? null;\n case 'month':\n return d(0) ? d(0)!.getMonth() + 1 : null;\n case 'day':\n return d(0)?.getDate() ?? null;\n case 'dateadd': {\n const t = d(0);\n if (!t) return null;\n const r = new Date(t);\n const unit = (s(2) || 'day').toLowerCase();\n if (unit.startsWith('year')) r.setFullYear(r.getFullYear() + n(1));\n else if (unit.startsWith('month')) r.setMonth(r.getMonth() + n(1));\n else r.setDate(r.getDate() + n(1));\n return r;\n }\n case 'datediff': {\n const a = d(0);\n const b = d(1);\n if (!a || !b) return null;\n const unit = (s(2) || 'day').toLowerCase();\n if (unit.startsWith('year')) return b.getFullYear() - a.getFullYear();\n if (unit.startsWith('month')) return (b.getFullYear() - a.getFullYear()) * 12 + b.getMonth() - a.getMonth();\n return Math.round((b.getTime() - a.getTime()) / 86400000);\n }\n case 'formatdate': {\n const t = d(0);\n return t ? formatDatePattern(t, s(1) || 'yyyy-MM-dd') : '';\n }\n case 'format': {\n const kind = (s(1) || 'number') as FormatSpec['kind'];\n return formatValue(v[0], { kind, decimals: args.length > 2 ? n(2) : 2, currency: args.length > 3 ? s(3) : 'USD' });\n }\n }\n throw new Error(`Unknown function ${name}`);\n}\n\nfunction reduceAggregate(fn: string, values: unknown[]): unknown {\n switch (fn) {\n case 'count':\n return values.filter((x) => x != null && x !== '').length;\n case 'first':\n return values[0];\n case 'last':\n return values[values.length - 1];\n case 'distinctcount':\n return new Set(values.map((x) => String(x))).size;\n }\n const nums = values.map(toNumber).filter((x) => !Number.isNaN(x));\n switch (fn) {\n case 'sum':\n return nums.reduce((a, b) => a + b, 0);\n case 'avg':\n return nums.length ? nums.reduce((a, b) => a + b, 0) / nums.length : null;\n case 'min':\n return nums.length ? Math.min(...nums) : null;\n case 'max':\n return nums.length ? Math.max(...nums) : null;\n }\n throw new Error(`Unknown aggregate ${fn}`);\n}\n\nconst SIMPLE_PATH = /^[A-Za-z_À-￿][\\w.À-￿]*$/;\n\n/** Aggregates a field (or expression) over rows — used by charts and cross tables. */\nexport function aggregate(fn: string, field: string, rows: Row[]): unknown {\n const ctx: EvalContext = { row: undefined, rows, allRows: rows, pageRows: rows, rowNumber: 0, pageNumber: 1, totalPages: 1, reportName: '' };\n if (!field) return fn === 'count' ? rows.length : null;\n const arg = SIMPLE_PATH.test(field) ? field : `[${field}]`;\n return evaluate(`${fn}(${arg})`, ctx);\n}\n\n/** Evaluates one expression (the part inside `{}`). */\nexport function evaluate(expr: string, ctx: EvalContext): unknown {\n const e = expr.trim();\n if (!e) return '';\n return evalNode(compile(e), ctx);\n}\n\n/** Parse error message for an expression, or null when valid. */\nexport function checkExpression(expr: string): string | null {\n if (!expr.trim()) return null;\n try {\n compile(expr.trim());\n return null;\n } catch (e) {\n return (e as Error).message;\n }\n}\n\n/** First parse error among the `{…}` parts of a template, or null. */\nexport function checkTemplate(template: string): string | null {\n const open = (template.match(/\\{/g) ?? []).length;\n const close = (template.match(/\\}/g) ?? []).length;\n if (open !== close) return open > close ? 'Missing }' : 'Unexpected }';\n for (const m of template.matchAll(/\\{([^{}]*)\\}/g)) {\n const err = checkExpression(m[1]);\n if (err) return `{${m[1]}}: ${err}`;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Formatting\n\nfunction toDate(v: unknown): Date | null {\n if (v instanceof Date) return v;\n if (typeof v === 'number') return new Date(v);\n if (typeof v === 'string') {\n const ms = /\\/Date\\((-?\\d+)/.exec(v); // OData v2 \"/Date(1234567890)/\"\n const d = ms ? new Date(Number(ms[1])) : new Date(v);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n/** yyyy yy MMM MM M dd d HH H mm ss */\nexport function formatDatePattern(d: Date, pattern: string): string {\n const p2 = (x: number) => String(x).padStart(2, '0');\n return pattern.replace(/yyyy|yy|MMM|MM|M|dd|d|HH|H|mm|ss/g, (t) => {\n switch (t) {\n case 'yyyy':\n return String(d.getFullYear());\n case 'yy':\n return p2(d.getFullYear() % 100);\n case 'MMM':\n return MONTHS[d.getMonth()];\n case 'MM':\n return p2(d.getMonth() + 1);\n case 'M':\n return String(d.getMonth() + 1);\n case 'dd':\n return p2(d.getDate());\n case 'd':\n return String(d.getDate());\n case 'HH':\n return p2(d.getHours());\n case 'H':\n return String(d.getHours());\n case 'mm':\n return p2(d.getMinutes());\n default:\n return p2(d.getSeconds());\n }\n });\n}\n\nexport function formatValue(v: unknown, f: FormatSpec): string {\n if (v == null) return '';\n const d = f.decimals ?? 2;\n try {\n switch (f.kind) {\n case 'number':\n case 'currency':\n case 'percent': {\n const n = toNumber(v);\n if (Number.isNaN(n)) return String(v);\n return n.toLocaleString(undefined, {\n style: f.kind === 'number' ? 'decimal' : f.kind,\n currency: f.kind === 'currency' ? f.currency || 'USD' : undefined,\n minimumFractionDigits: d,\n maximumFractionDigits: d,\n });\n }\n case 'date':\n case 'datetime':\n case 'time': {\n const dt = toDate(v);\n if (!dt) return String(v);\n if (f.kind === 'date') return dt.toLocaleDateString();\n if (f.kind === 'time') return dt.toLocaleTimeString();\n return dt.toLocaleString();\n }\n }\n } catch {\n return String(v);\n }\n if (v instanceof Date) return v.toLocaleString();\n if (typeof v === 'boolean') return v ? 'Yes' : 'No';\n if (typeof v === 'number' && !Number.isInteger(v)) return String(Math.round(v * 1e6) / 1e6);\n if (typeof v === 'object') return JSON.stringify(v);\n return String(v);\n}\n\n/** Replaces every `{expr}` in the template with its formatted value. */\nexport function renderTemplate(template: string, ctx: EvalContext, format: FormatSpec): string {\n return template.replace(/\\{([^{}]+)\\}/g, (_, ex: string) => {\n try {\n return formatValue(evaluate(ex, ctx), format);\n } catch {\n return '#ERR';\n }\n });\n}\n\n// ---------------------------------------------------------------------------------------------\n// Function catalogue (drives autocomplete and validation)\n\nexport interface FunctionInfo {\n name: string;\n signature: string;\n description: string;\n group: 'Aggregate' | 'Logic' | 'Text' | 'Math' | 'Date' | 'Format';\n}\n\nexport const FUNCTIONS: FunctionInfo[] = [\n { name: 'sum', signature: 'sum(expr [, report|page])', description: 'Total over the rows in scope', group: 'Aggregate' },\n { name: 'avg', signature: 'avg(expr [, scope])', description: 'Average', group: 'Aggregate' },\n { name: 'min', signature: 'min(expr [, scope]) | min(a, b)', description: 'Smallest value', group: 'Aggregate' },\n { name: 'max', signature: 'max(expr [, scope]) | max(a, b)', description: 'Largest value', group: 'Aggregate' },\n { name: 'count', signature: 'count([expr] [, scope])', description: 'Number of rows / non-empty values', group: 'Aggregate' },\n { name: 'distinctcount', signature: 'distinctcount(expr)', description: 'Number of different values', group: 'Aggregate' },\n { name: 'first', signature: 'first(expr)', description: 'Value in the first row of the scope', group: 'Aggregate' },\n { name: 'last', signature: 'last(expr)', description: 'Value in the last row of the scope', group: 'Aggregate' },\n { name: 'iif', signature: 'iif(condition, then, else)', description: 'Pick a value by condition', group: 'Logic' },\n { name: 'isnull', signature: 'isnull(value, fallback)', description: 'Fallback when empty', group: 'Logic' },\n { name: 'coalesce', signature: 'coalesce(a, b, …)', description: 'First non-empty value', group: 'Logic' },\n { name: 'isempty', signature: 'isempty(value)', description: 'True when empty', group: 'Logic' },\n { name: 'upper', signature: 'upper(text)', description: 'UPPER CASE', group: 'Text' },\n { name: 'lower', signature: 'lower(text)', description: 'lower case', group: 'Text' },\n { name: 'trim', signature: 'trim(text)', description: 'Remove surrounding spaces', group: 'Text' },\n { name: 'len', signature: 'len(text)', description: 'Length', group: 'Text' },\n { name: 'left', signature: 'left(text, n)', description: 'First n characters', group: 'Text' },\n { name: 'right', signature: 'right(text, n)', description: 'Last n characters', group: 'Text' },\n { name: 'substr', signature: 'substr(text, start, [length])', description: 'Part of text (start at 0)', group: 'Text' },\n { name: 'replace', signature: 'replace(text, find, with)', description: 'Replace all occurrences', group: 'Text' },\n { name: 'concat', signature: 'concat(a, b, …)', description: 'Join text', group: 'Text' },\n { name: 'contains', signature: 'contains(text, part)', description: 'True if text contains part', group: 'Text' },\n { name: 'startswith', signature: 'startswith(text, part)', description: 'True if text starts with part', group: 'Text' },\n { name: 'endswith', signature: 'endswith(text, part)', description: 'True if text ends with part', group: 'Text' },\n { name: 'padleft', signature: 'padleft(text, width, [char])', description: 'Pad on the left, e.g. 00042', group: 'Text' },\n { name: 'tostring', signature: 'tostring(value)', description: 'Convert to text', group: 'Text' },\n { name: 'round', signature: 'round(number, [decimals])', description: 'Round', group: 'Math' },\n { name: 'floor', signature: 'floor(number)', description: 'Round down', group: 'Math' },\n { name: 'ceil', signature: 'ceil(number)', description: 'Round up', group: 'Math' },\n { name: 'abs', signature: 'abs(number)', description: 'Absolute value', group: 'Math' },\n { name: 'sqrt', signature: 'sqrt(number)', description: 'Square root', group: 'Math' },\n { name: 'pow', signature: 'pow(number, power)', description: 'Power', group: 'Math' },\n { name: 'tonumber', signature: 'tonumber(text)', description: 'Convert to number', group: 'Math' },\n { name: 'now', signature: 'now()', description: 'Current date and time', group: 'Date' },\n { name: 'today', signature: 'today()', description: 'Today at 00:00', group: 'Date' },\n { name: 'year', signature: 'year(date)', description: 'Year', group: 'Date' },\n { name: 'month', signature: 'month(date)', description: 'Month 1–12', group: 'Date' },\n { name: 'day', signature: 'day(date)', description: 'Day of month', group: 'Date' },\n { name: 'dateadd', signature: 'dateadd(date, n, \"day\"|\"month\"|\"year\")', description: 'Add to a date', group: 'Date' },\n { name: 'datediff', signature: 'datediff(from, to, \"day\"|\"month\"|\"year\")', description: 'Difference between dates', group: 'Date' },\n { name: 'formatdate', signature: 'formatdate(date, \"dd/MM/yyyy\")', description: 'Date as text: yyyy MM MMM dd HH mm ss', group: 'Date' },\n { name: 'format', signature: 'format(value, \"currency\"|\"number\"|\"percent\"|\"date\", [decimals], [currency])', description: 'Format a value', group: 'Format' },\n];\nconst FUNCTIONS_BY_NAME = new Set([...FUNCTIONS.map((f) => f.name), 'if', 'length']);\n\nexport const SPECIAL_FIELDS = ['PageNumber', 'TotalPages', 'Now', 'Today', 'RowNumber', 'ReportName'];\n\n/** Scalar values of a document as root.x paths (arrays skipped) — for the field list and autocomplete. */\nexport function documentFields(root: unknown): { name: string; type: string }[] {\n const out: { name: string; type: string }[] = [];\n const visit = (o: unknown, prefix: string, depth: number) => {\n if (!o || typeof o !== 'object' || Array.isArray(o) || depth > 3) return;\n for (const [k, v] of Object.entries(o as Record<string, unknown>)) {\n if (k.startsWith('@') || k.startsWith('__') || Array.isArray(v)) continue;\n if (v && typeof v === 'object') visit(v, prefix + k + '.', depth + 1);\n else out.push({ name: prefix + k, type: typeof v === 'number' ? 'number' : typeof v === 'boolean' ? 'boolean' : 'string' });\n }\n };\n visit(root, 'root.', 0);\n return out;\n}\n","import type { DataSourceDef } from '../model/types';\nimport { emptyDataSource } from '../model/defaults';\nimport { getPath, type Row } from './expressions';\n\nexport type FieldType = 'string' | 'number' | 'boolean' | 'date' | 'object';\nexport interface FieldInfo {\n name: string;\n type: FieldType;\n}\nexport interface LoadResult {\n rows: Row[];\n fields: FieldInfo[];\n requestUrl: string;\n /** Non-fatal note, e.g. the array path was not found and auto-detect was used. */\n warning?: string;\n /** The whole JSON document (first page for OData), readable in formulas as root.x. */\n root?: unknown;\n}\n\nexport function parseHeaders(text: string): Record<string, string> {\n const h: Record<string, string> = {};\n for (const line of text.split(/\\r?\\n/)) {\n const i = line.indexOf(':');\n if (i > 0) h[line.slice(0, i).trim()] = line.slice(i + 1).trim();\n }\n return h;\n}\n\nexport const hasSource = (ds: DataSourceDef) => !!(ds.url.trim() || (ds.type === 'json' && ds.inline.trim()));\n\nexport function buildODataUrl(ds: DataSourceDef): string {\n let base = ds.url.trim().replace(/\\/+$/, '');\n if (ds.entitySet.trim()) base += '/' + ds.entitySet.trim();\n const q: string[] = [];\n const add = (k: string, v: string) => v.trim() && q.push(`${k}=${encodeURIComponent(v.trim())}`);\n add('$select', ds.select);\n add('$filter', ds.filter);\n add('$orderby', ds.orderby);\n add('$expand', ds.expand);\n if (ds.top) q.push(`$top=${ds.top}`);\n return q.length ? base + (base.includes('?') ? '&' : '?') + q.join('&') : base;\n}\n\nasync function fetchJson(url: string, headers: Record<string, string>, signal?: AbortSignal): Promise<any> {\n const res = await fetch(url, { headers: { Accept: 'application/json', ...headers }, signal });\n if (!res.ok) throw new Error(`HTTP ${res.status} ${res.statusText} — ${url}`);\n const text = await res.text();\n try {\n return JSON.parse(text);\n } catch {\n throw new Error(`Response is not valid JSON — ${url}`);\n }\n}\n\nfunction extractArray(data: unknown, path: string, onWarn: (w: string) => void = () => {}): Row[] {\n let cur: any = path.trim() ? getPath(data, path.trim()) : data;\n // A path that doesn't exist in this response (e.g. left over from another URL) falls back to auto-detect.\n if (cur === undefined && path.trim()) {\n onWarn(`Array path \"${path.trim()}\" not found in the response; auto-detected the data instead. Clear the Array path field.`);\n cur = data;\n path = '';\n }\n if (Array.isArray(cur)) return cur;\n if (cur && typeof cur === 'object') {\n for (const key of ['value', 'items', 'data', 'results', 'rows', 'records']) {\n if (Array.isArray(cur[key])) return cur[key];\n }\n const firstArray = Object.values(cur).find(Array.isArray);\n if (firstArray) return firstArray as Row[];\n return [cur];\n }\n throw new Error(path ? `No array found at \"${path}\"` : 'Data is not an array or object');\n}\n\nexport async function loadData(ds: DataSourceDef, signal?: AbortSignal): Promise<LoadResult> {\n const headers = parseHeaders(ds.headers);\n let rows: Row[];\n let requestUrl = '';\n let warning: string | undefined;\n let root: unknown;\n\n if (ds.type === 'json') {\n let data: unknown;\n if (ds.inline.trim()) {\n try {\n data = JSON.parse(ds.inline);\n } catch (e) {\n throw new Error('Pasted JSON is invalid: ' + (e as Error).message);\n }\n } else {\n requestUrl = ds.url.trim();\n data = await fetchJson(requestUrl, headers, signal);\n }\n root = data;\n rows = extractArray(data, ds.dataPath, (w) => (warning = w));\n } else {\n requestUrl = buildODataUrl(ds);\n rows = [];\n let next: string | undefined = requestUrl;\n const max = ds.maxRows || 5000;\n while (next && rows.length < max) {\n const json: any = await fetchJson(next, headers, signal);\n root ??= json;\n const page: Row[] = json.value ?? json.d?.results ?? (Array.isArray(json.d) ? json.d : json.d ? [json.d] : []);\n rows.push(...page);\n const link: string | undefined = json['@odata.nextLink'] ?? json['odata.nextLink'] ?? json.d?.__next;\n next = link && !ds.top ? new URL(link, next).toString() : undefined;\n }\n rows = rows.slice(0, max);\n }\n return { rows, fields: inferFields(rows), requestUrl, warning, root };\n}\n\nfunction typeOf(v: unknown): FieldType | null {\n if (v == null) return null;\n if (typeof v === 'number') return 'number';\n if (typeof v === 'boolean') return 'boolean';\n if (typeof v === 'string') {\n if (/^\\d{4}-\\d{2}-\\d{2}([T ][\\d:.]+)?(Z|[+-]\\d{2}:?\\d{2})?$/.test(v) || /^\\/Date\\(-?\\d+/.test(v)) return 'date';\n return 'string';\n }\n return 'object';\n}\n\n/** Infers field names (flattening nested objects into dot paths) from a sample of rows. */\nexport function inferFields(rows: Row[]): FieldInfo[] {\n const types = new Map<string, FieldType | null>();\n const visit = (obj: Record<string, unknown>, prefix: string, depth: number) => {\n for (const [k, v] of Object.entries(obj)) {\n if (k.startsWith('@') || k.startsWith('__')) continue;\n const name = prefix + k;\n if (v && typeof v === 'object' && !Array.isArray(v) && depth < 2) {\n visit(v as Record<string, unknown>, name + '.', depth + 1);\n continue;\n }\n if (Array.isArray(v)) continue;\n const t = typeOf(v);\n if (!types.has(name) || (types.get(name) === null && t)) types.set(name, t);\n }\n };\n for (const r of rows.slice(0, 50)) if (r && typeof r === 'object') visit(r, '', 0);\n return [...types].map(([name, type]) => ({ name, type: type ?? 'string' }));\n}\n\n/** Lists entity sets from an OData service ($metadata XML, falling back to the JSON service document). */\nexport async function loadODataEntitySets(serviceUrl: string, headersText: string): Promise<string[]> {\n const base = serviceUrl.trim().replace(/\\/+$/, '');\n const headers = parseHeaders(headersText);\n try {\n const res = await fetch(base + '/$metadata', { headers: { Accept: 'application/xml', ...headers } });\n if (res.ok) {\n const xml = new DOMParser().parseFromString(await res.text(), 'application/xml');\n const sets = [...xml.getElementsByTagNameNS('*', 'EntitySet')].map((n) => n.getAttribute('Name') ?? '').filter(Boolean);\n if (sets.length) return sets;\n }\n } catch {\n /* fall through */\n }\n const doc = await fetchJson(base, headers);\n const list: any[] = doc.value ?? doc.d?.EntitySets ?? [];\n return list.map((x) => (typeof x === 'string' ? x : x.name ?? x.url)).filter(Boolean);\n}\n\nexport interface DetectedSource {\n dataSource: DataSourceDef;\n /** Human-readable summary of what was detected. */\n note: string;\n}\n\n/**\n * Builds a data source from a pasted URL: fetches it once and decides between plain JSON and OData\n * (OData responses carry @odata.context / odata.metadata / a \"d\" wrapper). An OData service root\n * is resolved to its first entity set. Previous settings (array path, query options) are reset.\n */\nexport async function detectDataSource(rawUrl: string, headers = ''): Promise<DetectedSource> {\n let url = rawUrl.trim();\n if (!url) throw new Error('Enter a URL');\n url = url.replace(/\\/\\$metadata\\/?$/i, ''); // a $metadata link means the service root\n const base = { ...emptyDataSource(), headers };\n const json: any = await fetchJson(url, parseHeaders(headers));\n\n const isOData = json && typeof json === 'object' && !Array.isArray(json) && ('@odata.context' in json || 'odata.metadata' in json || 'd' in json);\n if (!isOData) {\n const rows = extractArray(json, '');\n return { dataSource: { ...base, type: 'json', url }, note: `JSON · ${rows.length} rows` };\n }\n\n // Service document: lists entity sets instead of data rows.\n const ctx: string = json['@odata.context'] ?? json['odata.metadata'] ?? '';\n const v4Sets = /\\$metadata$/.test(ctx) && Array.isArray(json.value) ? json.value.filter((x: any) => !x.kind || x.kind === 'EntitySet') : null;\n const v2Sets: string[] | null = Array.isArray(json.d?.EntitySets) ? json.d.EntitySets : null;\n const sets: string[] = v4Sets ? v4Sets.map((x: any) => x.url ?? x.name) : v2Sets ?? [];\n if (sets.length) {\n return {\n dataSource: { ...base, type: 'odata', url: url.replace(/\\/+$/, ''), entitySet: sets[0], top: 100 },\n note: `OData service · using entity set \"${sets[0]}\" (${sets.length} available, first 100 rows) — pick another under Entity set`,\n };\n }\n const rows = json.value ?? json.d?.results ?? json.d;\n return {\n dataSource: { ...base, type: 'odata', url },\n note: `OData · ${Array.isArray(rows) ? rows.length : 1} rows${json['@odata.nextLink'] ? ' (more pages will be fetched)' : ''}`,\n };\n}\n","import type { DataSourceDef, ReportDefinition, ReportParameter } from '../model/types';\nimport { evaluate, formatValue, truthy, type EvalContext, type Row } from './expressions';\n\nexport type ParamValues = Record<string, unknown>;\n\n/** Converts a raw (text) value to the parameter's type. */\nexport function coerceParam(p: ReportParameter, raw: unknown): unknown {\n if (raw == null || raw === '') return p.type === 'boolean' ? false : null;\n switch (p.type) {\n case 'number': {\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n }\n case 'boolean':\n return raw === true || /^(true|1|yes|on)$/i.test(String(raw));\n default:\n return String(raw); // dates stay ISO \"yyyy-MM-dd\" text, which compares correctly\n }\n}\n\n/** Default values for all parameters, overridden by `overrides` (e.g. from the page URL). */\nexport function resolveParams(report: ReportDefinition, overrides: Record<string, unknown> = {}): ParamValues {\n const out: ParamValues = {};\n for (const p of report.parameters ?? []) {\n if (!p.name) continue;\n const key = Object.keys(overrides).find((k) => k.toLowerCase() === p.name.toLowerCase());\n out[p.name] = coerceParam(p, key !== undefined ? overrides[key] : p.defaultValue);\n }\n return out;\n}\n\nexport const paramChoices = (p: ReportParameter) =>\n p.options\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\nconst paramCtx = (params: ParamValues): EvalContext => ({\n row: undefined,\n rows: [],\n allRows: [],\n pageRows: [],\n rowNumber: 0,\n pageNumber: 1,\n totalPages: 1,\n reportName: '',\n params,\n});\n\nconst NONE = { kind: 'none' as const, decimals: 0, currency: '' };\n\n/** Replaces {…} expressions in a data-source string with parameter values. */\nfunction substitute(text: string, params: ParamValues, encode: boolean): string {\n return text.replace(/\\{([^{}]+)\\}/g, (_, ex: string) => {\n let v: unknown;\n try {\n v = evaluate(ex, paramCtx(params));\n } catch {\n v = '';\n }\n const s = formatValue(v, NONE);\n return encode ? encodeURIComponent(s) : s;\n });\n}\n\n/**\n * Applies parameters to a data source: `{@Country}` in the URL (URL-encoded), OData options,\n * headers and array path. Pasted JSON is left alone (it contains braces of its own).\n */\nexport function applyParamsToDataSource(ds: DataSourceDef, params: ParamValues): DataSourceDef {\n return {\n ...ds,\n url: substitute(ds.url, params, true),\n entitySet: substitute(ds.entitySet, params, false),\n select: substitute(ds.select, params, false),\n filter: substitute(ds.filter, params, false),\n orderby: substitute(ds.orderby, params, false),\n expand: substitute(ds.expand, params, false),\n headers: substitute(ds.headers, params, false),\n dataPath: substitute(ds.dataPath, params, false),\n };\n}\n\n/** Rows that pass the report filter expression (all rows when there is none). */\nexport function filterRows(report: ReportDefinition, rows: Row[], params: ParamValues): Row[] {\n const f = report.filter?.trim();\n if (!f) return rows;\n const ctx = paramCtx(params);\n return rows.filter((row) => {\n try {\n return truthy(evaluate(f, { ...ctx, row, rows, allRows: rows }));\n } catch {\n return true; // an invalid filter never hides data silently; the designer shows the error\n }\n });\n}\n","import { Injectable, computed, effect, signal, untracked } from '@angular/core';\nimport type { Band, DataSourceDef, DataSourceType, ReportDefinition, ReportElement } from '../model/types';\nimport { newReport } from '../model/defaults';\nimport { hasSource, loadData, type FieldInfo } from '../engine/dataSources';\nimport { documentFields, type Row } from '../engine/expressions';\nimport { applyParamsToDataSource, resolveParams } from '../engine/parameters';\n\nexport interface Selection {\n elementIds: string[];\n bandId: string | null;\n}\n\nexport interface DataState {\n rows: Row[];\n /** The whole loaded document (root.x in formulas) and its scalar fields. */\n root?: unknown;\n docFields?: { name: string; type: string }[];\n fields: FieldInfo[];\n status: 'idle' | 'loading' | 'ready' | 'error';\n error?: string;\n}\n\nexport const GRID = 8;\nconst HISTORY_LIMIT = 100;\n\n/**\n * Data the host page supplies instead of the report's own data source:\n * a URL (JSON file/API, or OData service / entity-set URL), a JSON string, or the data itself.\n */\nexport interface DataOverride {\n source: unknown;\n type: DataSourceType;\n}\n\n/** Applies a host-supplied data source on top of the report's data source definition. */\nexport function overrideDataSource(ds: DataSourceDef, o: DataOverride | null): DataSourceDef {\n if (!o || o.source == null || o.source === '') return ds;\n const src = o.source;\n if (typeof src === 'string' && !/^\\s*[[{]/.test(src)) {\n const url = src.trim();\n if (o.type === 'odata') {\n // A full entity-set URL (…/Orders) already names the set; don't append the report's entitySet again.\n const path = url.split('?')[0].replace(/\\/+$/, '').toLowerCase();\n const set = ds.entitySet.trim().toLowerCase();\n const entitySet = set && path.endsWith('/' + set) ? '' : ds.entitySet;\n return { ...ds, type: 'odata', url, inline: '', entitySet };\n }\n return { ...ds, type: 'json', url, inline: '' };\n }\n // Inline data: a JSON string, or an array/object passed as a property.\n return { ...ds, type: 'json', url: '', inline: typeof src === 'string' ? src : JSON.stringify(src) };\n}\n\nfunction prune(r: ReportDefinition, s: Selection): Selection {\n const ids = new Set(r.bands.flatMap((b) => b.elements.map((e) => e.id)));\n return {\n elementIds: s.elementIds.filter((id) => ids.has(id)),\n bandId: r.bands.some((b) => b.id === s.bandId) ? s.bandId : null,\n };\n}\n\nexport function findElement(r: ReportDefinition, id: string): { band: Band; el: ReportElement } | null {\n for (const band of r.bands) {\n const el = band.elements.find((e) => e.id === id);\n if (el) return { band, el };\n }\n return null;\n}\n\n/**\n * All designer/viewer state: the report (with undo/redo), selection, view options and loaded data.\n * Provided per component (myreport-designer / myreport-viewer), so several can live on one page.\n */\n@Injectable()\nexport class DesignerStore {\n readonly report = signal<ReportDefinition>(newReport());\n readonly selection = signal<Selection>({ elementIds: [], bandId: null });\n readonly zoom = signal(1);\n readonly snap = signal(true);\n readonly data = signal<DataState>({ rows: [], fields: [], status: 'idle' });\n /** localStorage key the report is autosaved to; null = no autosave. */\n readonly persistKey = signal<string | null>(null);\n /** Data supplied by the host page, replacing the report's data source. */\n readonly dataOverride = signal<DataOverride | null>(null);\n /** Parameter values supplied by the host page (below values typed in the parameter bar). */\n readonly externalParams = signal<Record<string, unknown>>({});\n\n private readonly past = signal<ReportDefinition[]>([]);\n private readonly future = signal<ReportDefinition[]>([]);\n readonly canUndo = computed(() => this.past().length > 0);\n readonly canRedo = computed(() => this.future().length > 0);\n\n private readonly reloadToken = signal(0);\n /** Values typed in the preview's parameter bar (raw text), on top of host values and defaults. */\n readonly paramInput = signal<Record<string, unknown>>({});\n /** Effective, typed parameter values. */\n readonly params = computed(() => resolveParams(this.report(), { ...this.externalParams(), ...this.paramInput() }));\n /** The data source actually used: the report's own, or the host's override. */\n readonly effectiveDataSource = computed(() => overrideDataSource(this.report().dataSource, this.dataOverride()));\n /** Data source with {@Param} placeholders filled in; reloads when they change. */\n private readonly dsKey = computed(() => JSON.stringify(applyParamsToDataSource(this.effectiveDataSource(), this.params())));\n\n constructor() {\n // Autosave to the browser (only when a persist key is set).\n effect((onCleanup) => {\n const r = this.report();\n const key = this.persistKey();\n if (!key) return;\n const t = setTimeout(() => {\n try {\n localStorage.setItem(key, JSON.stringify(r));\n } catch {\n /* ignore */\n }\n }, 400);\n onCleanup(() => clearTimeout(t));\n });\n\n // (Re)load data whenever the data source definition changes.\n effect((onCleanup) => {\n const ds = JSON.parse(this.dsKey());\n this.reloadToken();\n untracked(() => {\n if (!hasSource(ds)) {\n this.data.set({ rows: [], fields: [], status: 'idle' });\n return;\n }\n const ac = new AbortController();\n this.data.update((d) => ({ ...d, status: 'loading', error: undefined }));\n const t = setTimeout(() => {\n loadData(ds, ac.signal)\n .then((res) => this.data.set({ rows: res.rows, fields: res.fields, status: 'ready', root: res.root, docFields: documentFields(res.root) }))\n .catch((e) => {\n if (!ac.signal.aborted) this.data.set({ rows: [], fields: [], status: 'error', error: String(e?.message ?? e) });\n });\n }, 300);\n onCleanup(() => {\n clearTimeout(t);\n ac.abort();\n });\n });\n });\n }\n\n /** Applies a change to a copy of the report. `history=false` for live drag updates (after `checkpoint()`). */\n update(recipe: (r: ReportDefinition) => void, history = true): void {\n const cur = this.report();\n const next = structuredClone(cur);\n recipe(next);\n if (history) {\n this.past.update((p) => [...p.slice(-HISTORY_LIMIT), cur]);\n this.future.set([]);\n }\n this.report.set(next);\n this.selection.update((s) => prune(next, s));\n }\n\n checkpoint(): void {\n const cur = this.report();\n this.past.update((p) => [...p.slice(-HISTORY_LIMIT), cur]);\n this.future.set([]);\n }\n\n undo(): void {\n const p = this.past();\n if (!p.length) return;\n const prev = p[p.length - 1];\n this.future.update((f) => [this.report(), ...f]);\n this.past.set(p.slice(0, -1));\n this.report.set(prev);\n this.selection.update((s) => prune(prev, s));\n }\n\n redo(): void {\n const [next, ...rest] = this.future();\n if (!next) return;\n this.past.update((p) => [...p, this.report()]);\n this.future.set(rest);\n this.report.set(next);\n this.selection.update((s) => prune(next, s));\n }\n\n load(r: ReportDefinition): void {\n this.report.set(r);\n this.past.set([]);\n this.future.set([]);\n this.selection.set({ elementIds: [], bandId: null });\n }\n\n /** Loads the report autosaved under `key` (if any) and keeps autosaving there. */\n restore(key: string): boolean {\n let ok = false;\n try {\n const saved = localStorage.getItem(key);\n if (saved) {\n this.load(JSON.parse(saved));\n ok = true;\n }\n } catch {\n /* ignore */\n }\n this.persistKey.set(key);\n return ok;\n }\n\n select(s: Selection): void {\n this.selection.set(s);\n }\n\n snapValue(v: number): number {\n return this.snap() ? Math.round(v / GRID) * GRID : Math.round(v);\n }\n\n reloadData(): void {\n this.reloadToken.update((n) => n + 1);\n }\n}\n\n/** Fetches a .report.json and checks it looks like a report definition. */\nexport async function fetchReport(path: string, signal?: AbortSignal): Promise<ReportDefinition> {\n const res = await fetch(path, { headers: { Accept: 'application/json' }, signal });\n if (!res.ok) throw new Error(`HTTP ${res.status} ${res.statusText} — ${path}`);\n return validateReport(await res.json());\n}\n\nexport function validateReport(r: unknown): ReportDefinition {\n const def = r as ReportDefinition;\n if (!def || def.version !== 1 || !Array.isArray(def.bands)) throw new Error('Not a report definition (expected version 1 with bands)');\n return def;\n}\n","import type { ReportElement, TableColumn } from '../model/types';\nimport { aggregate, formatValue, getPath, type Row } from './expressions';\nimport type { TableRenderData } from './table';\n\nexport interface Pivot {\n rowKeys: string[];\n colKeys: string[];\n /** cells[r][c] = aggregate, null when no rows fall in the cell. */\n cells: (number | null)[][];\n rowTotals: (number | null)[];\n colTotals: (number | null)[];\n grandTotal: number | null;\n}\n\nconst num = (v: unknown): number | null => (v == null || Number.isNaN(Number(v)) ? null : Number(v));\nconst byName = (a: string, b: string) => a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });\n// Braces would be read as expressions when the cell text is rendered.\nconst literal = (s: string) => s.replace(/[{}]/g, '');\n\nexport function pivot(el: ReportElement, rows: Row[]): Pivot {\n const x = el.crosstab!;\n const key = (r: Row, f: string) => (f ? String(getPath(r, f) ?? '(blank)') : 'All');\n const rowKeys = [...new Set(rows.map((r) => key(r, x.rowField)))].sort(byName);\n const colKeys = [...new Set(rows.map((r) => key(r, x.columnField)))].sort(byName);\n const bucket = new Map<string, Row[]>();\n for (const r of rows) {\n const k = key(r, x.rowField) + '\\u0000' + key(r, x.columnField);\n let b = bucket.get(k);\n if (!b) bucket.set(k, (b = []));\n b.push(r);\n }\n const agg = (set: Row[]) => (set.length ? num(aggregate(x.aggregate, x.valueField, set)) : null);\n const cells = rowKeys.map((rk) => colKeys.map((ck) => agg(bucket.get(rk + '\\u0000' + ck) ?? [])));\n // Totals aggregate the underlying rows (so avg/min/max stay correct, not sums of averages).\n const rowTotals = rowKeys.map((rk) => agg(rows.filter((r) => key(r, x.rowField) === rk)));\n const colTotals = colKeys.map((ck) => agg(rows.filter((r) => key(r, x.columnField) === ck)));\n return { rowKeys, colKeys, cells, rowTotals, colTotals, grandTotal: agg(rows) };\n}\n\n/**\n * Turns a cross table into an ordinary table element + data rows (cells pre-formatted), so the\n * renderer can paginate it with the table code: header repeats, rows flow, totals form the footer.\n */\nexport function crosstabAsTable(el: ReportElement, rows: Row[]): { table: ReportElement; data: Row[]; render: TableRenderData } {\n const x = el.crosstab!;\n const p = pivot(el, rows);\n const fmt = (v: number | null) => (v == null ? '' : formatValue(v, x.valueFormat));\n const totalLabel = x.aggregate === 'count' ? 'Count' : x.aggregate === 'avg' ? 'Average' : 'Total';\n\n const col = (id: string, header: string, footer: string, width: number, align: TableColumn['align']): TableColumn => ({\n id,\n header: literal(header),\n text: `{${id}}`,\n footer: literal(footer),\n width,\n align,\n format: { kind: 'none', decimals: 0, currency: '' },\n });\n const columns: TableColumn[] = [\n col('c0', x.cornerText || `${x.rowField || ''} / ${x.columnField || ''}`, totalLabel, 1.6, 'left'),\n ...p.colKeys.map((k, i) => col(`c${i + 1}`, k, fmt(p.colTotals[i]), 1, 'right')),\n ];\n if (x.showRowTotals) columns.push(col(`c${p.colKeys.length + 1}`, totalLabel, fmt(p.grandTotal), 1, 'right'));\n\n const data: Row[] = p.rowKeys.map((rk, r) => {\n const o: Row = { c0: literal(rk) };\n p.colKeys.forEach((_, c) => (o[`c${c + 1}`] = fmt(p.cells[r][c])));\n if (x.showRowTotals) o[`c${p.colKeys.length + 1}`] = fmt(p.rowTotals[r]);\n return o;\n });\n\n const table: ReportElement = {\n ...el,\n kind: 'table',\n table: {\n columns,\n showHeader: true,\n repeatHeader: x.repeatHeader,\n showFooter: x.showColumnTotals,\n headerHeight: x.headerHeight,\n rowHeight: x.rowHeight,\n headerBackground: x.headerBackground,\n headerColor: x.headerColor,\n stripeBackground: x.stripeBackground,\n gridColor: x.gridColor,\n },\n };\n const render: TableRenderData = {\n header: columns.map((c) => c.header),\n headerHeight: x.headerHeight,\n rows: data.map((d, i) => ({ cells: columns.map((c) => String(d[c.id] ?? '')), height: x.rowHeight, index: i })),\n footer: x.showColumnTotals ? columns.map((c) => c.footer) : null,\n footerHeight: x.rowHeight,\n };\n return { table, data, render };\n}\n","import type { ChartSpec } from '../model/types';\nimport { aggregate, getPath, type Row } from './expressions';\n\n/** Validated categorical palette (light surface), assigned in fixed order — never cycled. */\nexport const SERIES_COLORS = ['#2a78d6', '#eb6834', '#1baf7a', '#eda100', '#e87ba4', '#008300', '#6250d6', '#e34948'];\nexport const OTHER_COLOR = '#9a9a96';\nexport const MAX_SERIES = SERIES_COLORS.length;\n\nexport interface ChartData {\n categories: string[];\n series: { name: string; values: number[]; color: string }[];\n}\n\nconst toNum = (v: unknown) => (typeof v === 'number' && Number.isFinite(v) ? v : Number(v) || 0);\n\n/** Groups rows by category and aggregates each value field into a series. */\nexport function chartData(spec: ChartSpec, rows: Row[]): ChartData {\n const pie = spec.type === 'pie' || spec.type === 'doughnut';\n const fields = (spec.valueFields.filter(Boolean).length ? spec.valueFields.filter(Boolean) : ['']).slice(0, pie ? 1 : MAX_SERIES);\n\n const groups = new Map<string, Row[]>();\n for (const r of rows) {\n const key = spec.categoryField ? String(getPath(r, spec.categoryField) ?? '(blank)') : 'All';\n let g = groups.get(key);\n if (!g) groups.set(key, (g = []));\n g.push(r);\n }\n let cats = [...groups.keys()].map((name) => ({\n name,\n rows: groups.get(name)!,\n values: fields.map((f) => toNum(aggregate(spec.aggregate, f, groups.get(name)!))),\n }));\n\n if (spec.sort === 'category') cats.sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));\n else if (spec.sort === 'valueDesc') cats.sort((a, b) => b.values[0] - a.values[0]);\n else if (spec.sort === 'valueAsc') cats.sort((a, b) => a.values[0] - b.values[0]);\n\n // Pie slices beyond the palette (or maxCategories) fold into \"Other\"; other charts are just truncated.\n const max = Math.max(1, pie ? Math.min(spec.maxCategories || MAX_SERIES, MAX_SERIES) : spec.maxCategories || 50);\n if (cats.length > max) {\n if (pie) {\n const keep = cats.slice(0, max - 1);\n const rest = cats.slice(max - 1).flatMap((c) => c.rows);\n keep.push({ name: 'Other', rows: rest, values: fields.map((f) => toNum(aggregate(spec.aggregate, f, rest))) });\n cats = keep;\n } else {\n cats = cats.slice(0, max);\n }\n }\n\n if (pie) {\n return {\n categories: cats.map((c) => c.name),\n series: [{ name: fields[0] || 'Count', values: cats.map((c) => c.values[0]), color: SERIES_COLORS[0] }],\n };\n }\n return {\n categories: cats.map((c) => c.name),\n series: fields.map((f, i) => ({ name: f || 'Count', values: cats.map((c) => c.values[i]), color: SERIES_COLORS[i] })),\n };\n}\n\n/** Pie slice colors: one fixed-order hue per category, \"Other\" in neutral gray. */\nexport const sliceColor = (name: string, i: number) => (name === 'Other' ? OTHER_COLOR : SERIES_COLORS[i % MAX_SERIES]);\n\n/** \"Nice\" axis: rounded max and tick step for values in [min, max]. */\nexport function niceScale(min: number, max: number, ticks = 5): { min: number; max: number; step: number } {\n const lo = Math.min(0, min);\n const hi = Math.max(0, max);\n if (hi === lo) return { min: lo, max: lo + 1, step: 0.2 };\n const raw = (hi - lo) / ticks;\n const mag = Math.pow(10, Math.floor(Math.log10(raw)));\n const norm = raw / mag;\n const step = (norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 2.5 ? 2.5 : norm <= 5 ? 5 : 10) * mag;\n return { min: Math.floor(lo / step) * step, max: Math.ceil(hi / step) * step, step };\n}\n\n/** Short tick label: 1.2K, 3.4M. */\nexport function compactNumber(n: number): string {\n const a = Math.abs(n);\n if (a >= 1e9) return +(n / 1e9).toFixed(1) + 'B';\n if (a >= 1e6) return +(n / 1e6).toFixed(1) + 'M';\n if (a >= 1e3) return +(n / 1e3).toFixed(1) + 'K';\n return String(+n.toFixed(2));\n}\n","import type { ChartSpec } from '../model/types';\nimport { chartData, compactNumber, niceScale, sliceColor } from './chart';\nimport { formatValue, type Row } from './expressions';\n\n/** SVG drawing primitives (coordinates in element pixels). */\nexport type Prim =\n | { t: 'path'; d: string; fill: string; stroke?: string; sw?: number; opacity?: number; title?: string }\n | { t: 'line'; x1: number; y1: number; x2: number; y2: number; stroke: string; sw: number }\n | { t: 'poly'; points: string; stroke: string; sw: number }\n | { t: 'circle'; cx: number; cy: number; r: number; fill: string; stroke: string; sw: number; title?: string }\n | { t: 'text'; x: number; y: number; text: string; anchor: 'start' | 'middle' | 'end'; size: number; weight: number; fill: string };\n\nconst GRID = '#e4e4e0';\nconst AXIS = '#9a9a96';\nconst MUTED = '#5f5e5a';\nconst SURFACE_GAP = '#ffffff';\n\n/** Rect with a rounded data end (the end away from the baseline). */\nfunction bar(x: number, y: number, w: number, h: number, end: 'top' | 'bottom' | 'right' | 'left'): string {\n const r = Math.max(0, Math.min(3, w / 2, h / 2));\n const R = (n: number) => +n.toFixed(2);\n switch (end) {\n case 'top':\n return `M${R(x)},${R(y + h)}V${R(y + r)}Q${R(x)},${R(y)} ${R(x + r)},${R(y)}H${R(x + w - r)}Q${R(x + w)},${R(y)} ${R(x + w)},${R(y + r)}V${R(y + h)}Z`;\n case 'bottom':\n return `M${R(x)},${R(y)}V${R(y + h - r)}Q${R(x)},${R(y + h)} ${R(x + r)},${R(y + h)}H${R(x + w - r)}Q${R(x + w)},${R(y + h)} ${R(x + w)},${R(y + h - r)}V${R(y)}Z`;\n case 'right':\n return `M${R(x)},${R(y)}H${R(x + w - r)}Q${R(x + w)},${R(y)} ${R(x + w)},${R(y + r)}V${R(y + h - r)}Q${R(x + w)},${R(y + h)} ${R(x + w - r)},${R(y + h)}H${R(x)}Z`;\n case 'left':\n return `M${R(x + w)},${R(y)}H${R(x + r)}Q${R(x)},${R(y)} ${R(x)},${R(y + r)}V${R(y + h - r)}Q${R(x)},${R(y + h)} ${R(x + r)},${R(y + h)}H${R(x + w)}Z`;\n }\n}\n\n/** Lays out a chart into SVG primitives for a w×h box. */\nexport function layoutChart(spec: ChartSpec, rows: Row[], w: number, h: number, fontSize: number, textColor: string): Prim[] {\n const P: Prim[] = [];\n const fs = Math.max(6, fontSize);\n const cw = fs * 0.58; // average glyph width estimate\n const text = (x: number, y: number, s: string, anchor: 'start' | 'middle' | 'end', size = fs, weight = 400, fill = MUTED) =>\n s && P.push({ t: 'text', x, y, text: s, anchor, size, weight, fill });\n const fit = (s: string, maxW: number) => {\n if (s.length * cw <= maxW) return s;\n const n = Math.floor(maxW / cw) - 1;\n return n < 1 ? '' : s.slice(0, n) + '…';\n };\n const fmt = (v: number) => formatValue(v, spec.valueFormat);\n\n let top = 4;\n let bottom = h - 4;\n const left = 4;\n const right = w - 4;\n if (spec.title) {\n text(w / 2, top + fs + 1, fit(spec.title, w - 8), 'middle', fs + 2, 700, textColor);\n top += fs + 9;\n }\n\n const data = chartData(spec, rows);\n const pie = spec.type === 'pie' || spec.type === 'doughnut';\n if (!data.categories.length || bottom - top < 20) {\n text(w / 2, (top + bottom) / 2, 'No data', 'middle');\n return P;\n }\n\n // Legend (bottom): always for ≥2 series; pie slices are categories, so pies always get one.\n const legend = pie\n ? data.categories.map((c, i) => ({ name: c, color: sliceColor(c, i) }))\n : data.series.length > 1\n ? data.series.map((s) => ({ name: s.name, color: s.color }))\n : [];\n if (spec.showLegend && legend.length) {\n const lineH = fs + 6;\n const items = legend.map((l) => ({ ...l, label: fit(l.name, (right - left) / 2), width: 0 }));\n items.forEach((it) => (it.width = 14 + it.label.length * cw + 12));\n const lines: (typeof items)[] = [[]];\n let x = 0;\n for (const it of items) {\n if (x + it.width > right - left && lines[lines.length - 1].length) {\n lines.push([]);\n x = 0;\n }\n lines[lines.length - 1].push(it);\n x += it.width;\n }\n const shown = lines.slice(0, 3);\n bottom -= shown.length * lineH + 2;\n shown.forEach((line, li) => {\n const total = line.reduce((s, it) => s + it.width, 0) - 12;\n let lx = (w - total) / 2;\n const ly = bottom + 4 + li * lineH;\n for (const it of line) {\n P.push({ t: 'path', d: bar(lx, ly + (lineH - 10) / 2 - 1, 10, 10, 'top'), fill: it.color });\n text(lx + 14, ly + lineH / 2 + fs * 0.35 - 1, it.label, 'start', fs, 400, textColor);\n lx += it.width;\n }\n });\n }\n\n if (pie) {\n layoutPie(P, data, spec, left, top, right, bottom, fs, fmt);\n return P;\n }\n\n const values = data.series.flatMap((s) => s.values);\n const scale = niceScale(Math.min(...values), Math.max(...values));\n const ticks: number[] = [];\n for (let t = scale.min; t <= scale.max + scale.step / 2; t += scale.step) ticks.push(+t.toFixed(10));\n const n = data.categories.length;\n const sCount = data.series.length;\n const title = (cat: string, s: { name: string }, v: number) => `${cat}${sCount > 1 || spec.valueFields.length ? ' · ' + s.name : ''}: ${fmt(v)}`;\n\n if (spec.type === 'hbar') {\n const labelW = Math.min((right - left) * 0.35, Math.max(...data.categories.map((c) => c.length)) * cw + 8);\n const valueW = spec.showValues && sCount === 1 ? Math.max(...values.map((v) => fmt(v).length)) * cw + 6 : 6;\n const x0 = left + labelW;\n const x1 = right - valueW;\n const y0 = top + 2;\n const y1 = bottom - fs - 6;\n if (x1 - x0 < 20 || y1 - y0 < 10) return P;\n const xOf = (v: number) => x0 + ((v - scale.min) / (scale.max - scale.min)) * (x1 - x0);\n for (const t of ticks) {\n if (spec.showGrid) P.push({ t: 'line', x1: xOf(t), y1: y0, x2: xOf(t), y2: y1, stroke: GRID, sw: 1 });\n text(xOf(t), y1 + fs + 3, compactNumber(t), 'middle');\n }\n P.push({ t: 'line', x1: xOf(0), y1: y0, x2: xOf(0), y2: y1, stroke: AXIS, sw: 1 });\n const band = (y1 - y0) / n;\n const every = Math.max(1, Math.ceil((fs + 2) / band));\n const groupH = band * 0.72;\n const barH = Math.max(1, (groupH - (sCount - 1) * 2) / sCount);\n data.categories.forEach((cat, i) => {\n if (i % every === 0) text(x0 - 5, y0 + i * band + band / 2 + fs * 0.35, fit(cat, labelW - 8), 'end', fs, 400, textColor);\n data.series.forEach((s, j) => {\n const v = s.values[i];\n const y = y0 + i * band + (band - groupH) / 2 + j * (barH + 2);\n const a = xOf(0);\n const b = xOf(v);\n const x = Math.min(a, b);\n const bw = Math.abs(b - a);\n if (bw > 0) P.push({ t: 'path', d: bar(x, y, bw, barH, v >= 0 ? 'right' : 'left'), fill: s.color, title: title(cat, s, v) });\n if (spec.showValues && sCount === 1 && barH >= fs * 0.8) text(Math.max(a, b) + 4, y + barH / 2 + fs * 0.35, fmt(v), 'start', fs, 400, textColor);\n });\n });\n return P;\n }\n\n // Vertical charts: bar, line, area.\n const yLabelW = Math.max(...ticks.map((t) => compactNumber(t).length)) * cw + 6;\n const x0 = left + yLabelW;\n const x1 = right;\n const y0 = top + (spec.showValues ? fs + 2 : 4);\n const y1 = bottom - fs - 6;\n if (x1 - x0 < 20 || y1 - y0 < 10) return P;\n const yOf = (v: number) => y1 - ((v - scale.min) / (scale.max - scale.min)) * (y1 - y0);\n for (const t of ticks) {\n if (spec.showGrid) P.push({ t: 'line', x1: x0, y1: yOf(t), x2: x1, y2: yOf(t), stroke: GRID, sw: 1 });\n text(x0 - 5, yOf(t) + fs * 0.35, compactNumber(t), 'end');\n }\n const band = (x1 - x0) / n;\n const maxLabel = Math.max(...data.categories.map((c) => Math.min(c.length, 14))) * cw + 6;\n // Label every bar when ~4 characters fit (truncated); otherwise thin the labels out.\n const every = band >= cw * 4 + 4 ? 1 : Math.max(1, Math.ceil(maxLabel / band));\n data.categories.forEach((cat, i) => {\n if (i % every !== 0) return;\n const cx = x0 + i * band + band / 2;\n // Centred labels must not run past the plot edges.\n const room = Math.min(band * every - 4, 2 * (cx - left), 2 * (right - cx));\n text(cx, y1 + fs + 3, fit(cat, room), 'middle', fs, 400, textColor);\n });\n\n if (spec.type === 'bar') {\n const groupW = band * 0.72;\n const barW = Math.max(1, (groupW - (sCount - 1) * 2) / sCount);\n data.categories.forEach((cat, i) => {\n data.series.forEach((s, j) => {\n const v = s.values[i];\n const x = x0 + i * band + (band - groupW) / 2 + j * (barW + 2);\n const a = yOf(0);\n const b = yOf(v);\n const y = Math.min(a, b);\n const bh = Math.abs(a - b);\n if (bh > 0) P.push({ t: 'path', d: bar(x, y, barW, bh, v >= 0 ? 'top' : 'bottom'), fill: s.color, title: title(cat, s, v) });\n const label = fmt(v);\n if (spec.showValues && sCount === 1 && label.length * cw <= band + 4) text(x + barW / 2, Math.min(a, b) - 4, label, 'middle', fs, 400, textColor);\n });\n });\n } else {\n const xAt = (i: number) => x0 + i * band + band / 2;\n data.series.forEach((s) => {\n const pts = s.values.map((v, i) => [xAt(i), yOf(v)] as const);\n if (spec.type === 'area') {\n const d = `M${pts[0][0]},${yOf(0)}` + pts.map(([x, y]) => `L${x},${y}`).join('') + `L${pts[pts.length - 1][0]},${yOf(0)}Z`;\n P.push({ t: 'path', d, fill: s.color, opacity: 0.16 });\n }\n P.push({ t: 'poly', points: pts.map(([x, y]) => `${+x.toFixed(2)},${+y.toFixed(2)}`).join(' '), stroke: s.color, sw: 2 });\n const markers = n <= 40;\n pts.forEach(([x, y], i) => {\n // Small markers carry the hover tooltip; a 2px surface ring separates them from the line.\n P.push({ t: 'circle', cx: x, cy: y, r: markers ? 3.5 : 0.01, fill: s.color, stroke: SURFACE_GAP, sw: markers ? 1.5 : 0, title: title(data.categories[i], s, s.values[i]) });\n });\n if (spec.showValues && sCount === 1 && n <= 15) pts.forEach(([x, y], i) => text(x, y - 7, fmt(s.values[i]), 'middle', fs, 400, textColor));\n });\n }\n P.push({ t: 'line', x1: x0, y1: yOf(0), x2: x1, y2: yOf(0), stroke: AXIS, sw: 1 });\n return P;\n}\n\nfunction layoutPie(\n P: Prim[],\n data: ReturnType<typeof chartData>,\n spec: ChartSpec,\n left: number,\n top: number,\n right: number,\n bottom: number,\n fs: number,\n fmt: (v: number) => string,\n) {\n const vals = data.series[0].values.map((v) => Math.max(0, v));\n const total = vals.reduce((a, b) => a + b, 0);\n const cx = (left + right) / 2;\n const cy = (top + bottom) / 2;\n const r = Math.max(4, Math.min(right - left, bottom - top) / 2 - 2);\n const ir = spec.type === 'doughnut' ? r * 0.58 : 0;\n if (total <= 0) {\n P.push({ t: 'text', x: cx, y: cy, text: 'No data', anchor: 'middle', size: fs, weight: 400, fill: MUTED });\n return;\n }\n const pt = (a: number, rad: number) => `${+(cx + rad * Math.cos(a)).toFixed(2)},${+(cy + rad * Math.sin(a)).toFixed(2)}`;\n let a0 = -Math.PI / 2;\n vals.forEach((v, i) => {\n if (v <= 0) return;\n const cat = data.categories[i];\n const sweep = (v / total) * Math.PI * 2;\n const a1 = a0 + sweep;\n const pct = (v / total) * 100;\n const title = `${cat}: ${fmt(v)} (${pct.toFixed(1)}%)`;\n let d: string;\n if (sweep >= Math.PI * 2 - 1e-6) {\n // Full circle: two half arcs.\n d = `M${pt(0, r)}A${r},${r} 0 1 1 ${pt(Math.PI, r)}A${r},${r} 0 1 1 ${pt(0, r)}Z`;\n if (ir) d += `M${pt(0, ir)}A${ir},${ir} 0 1 0 ${pt(Math.PI, ir)}A${ir},${ir} 0 1 0 ${pt(0, ir)}Z`;\n } else {\n const large = sweep > Math.PI ? 1 : 0;\n d = ir\n ? `M${pt(a0, r)}A${r},${r} 0 ${large} 1 ${pt(a1, r)}L${pt(a1, ir)}A${ir},${ir} 0 ${large} 0 ${pt(a0, ir)}Z`\n : `M${cx},${cy}L${pt(a0, r)}A${r},${r} 0 ${large} 1 ${pt(a1, r)}Z`;\n }\n // 2px surface-colored stroke separates neighbouring slices.\n P.push({ t: 'path', d, fill: sliceColor(cat, i), stroke: SURFACE_GAP, sw: 2, title });\n if (spec.showValues && sweep > 0.35) {\n const mid = (a0 + a1) / 2;\n const lr = ir ? (r + ir) / 2 : r * 0.62;\n P.push({\n t: 'text',\n x: cx + lr * Math.cos(mid),\n y: cy + lr * Math.sin(mid) + fs * 0.35,\n text: `${Math.round(pct)}%`,\n anchor: 'middle',\n size: fs,\n weight: 700,\n fill: '#ffffff',\n });\n }\n a0 = a1;\n });\n}\n","import type { BarcodeSymbology } from '../model/types';\n\nexport interface BarcodeResult {\n /** One char per module: '1' = bar, '0' = space. Empty when `error` is set. */\n modules: string;\n /** Human-readable text printed under the bars. */\n text: string;\n error?: string;\n}\n\n// Code 128 symbol widths (bar, space, bar, space, bar, space) for values 0–105, then STOP (106).\nconst CODE128 = [\n '212222', '222122', '222221', '121223', '121322', '131222', '122213', '122312', '132212', '221213',\n '221312', '231212', '112232', '122132', '122231', '113222', '123122', '123221', '223211', '221132',\n '221231', '213212', '223112', '312131', '311222', '321122', '321221', '312212', '322112', '322211',\n '212123', '212321', '232121', '111323', '131123', '131321', '112313', '132113', '132311', '211313',\n '231113', '231311', '112133', '112331', '132131', '113123', '113321', '133121', '313121', '211331',\n '231131', '213113', '213311', '213131', '311123', '311321', '331121', '312113', '312311', '332111',\n '314111', '221411', '431111', '111224', '111422', '121124', '121421', '141122', '141221', '112214',\n '112412', '122114', '122411', '142112', '142211', '241211', '221114', '413111', '241112', '134111',\n '111242', '121142', '121241', '114212', '124112', '124211', '411212', '421112', '421211', '212141',\n '214121', '412121', '111143', '111341', '131141', '114113', '114311', '411113', '411311', '113141',\n '114131', '311141', '411131', '211412', '211214', '211232', '2331112',\n];\nconst START_B = 104;\nconst START_C = 105;\nconst CODE_B = 100;\nconst CODE_C = 99;\nconst STOP = 106;\n\nconst widthsToModules = (w: string) => [...w].map((n, i) => (i % 2 === 0 ? '1' : '0').repeat(Number(n))).join('');\n\n/**\n * Code 128: code set B for text, switching to code set C for runs of 4+ digits (denser).\n * Supports printable ASCII (32–126).\n */\nexport function encodeCode128(value: string): BarcodeResult {\n if (!value) return { modules: '', text: '', error: 'Empty value' };\n if (![...value].every((c) => c.charCodeAt(0) >= 32 && c.charCodeAt(0) <= 126)) {\n return { modules: '', text: value, error: 'Code 128 supports printable ASCII only' };\n }\n const digitRun = (i: number) => {\n let n = 0;\n while (i + n < value.length && value[i + n] >= '0' && value[i + n] <= '9') n++;\n return n;\n };\n\n const codes: number[] = [];\n let set: 'B' | 'C';\n let i = 0;\n const first = digitRun(0);\n if (first >= 4) {\n set = 'C';\n codes.push(START_C);\n } else {\n set = 'B';\n codes.push(START_B);\n }\n\n while (i < value.length) {\n const run = digitRun(i);\n if (set === 'C') {\n if (run >= 2) {\n codes.push(Number(value.slice(i, i + 2)));\n i += 2;\n continue;\n }\n codes.push(CODE_B);\n set = 'B';\n }\n // Switch to C for a run of >= 4 digits; an odd run keeps its first digit in B.\n if (run >= 4) {\n if (run % 2 === 1) {\n codes.push(value.charCodeAt(i) - 32);\n i++;\n }\n codes.push(CODE_C);\n set = 'C';\n continue;\n }\n codes.push(value.charCodeAt(i) - 32);\n i++;\n }\n\n const checksum = codes.reduce((sum, c, idx) => sum + c * (idx === 0 ? 1 : idx), 0) % 103;\n codes.push(checksum, STOP);\n return { modules: codes.map((c) => widthsToModules(CODE128[c])).join(''), text: value };\n}\n\nconst EAN_L = ['0001101', '0011001', '0010011', '0111101', '0100011', '0110001', '0101111', '0111011', '0110111', '0001011'];\nconst EAN_R = EAN_L.map((p) => [...p].map((b) => (b === '1' ? '0' : '1')).join(''));\nconst EAN_G = EAN_R.map((p) => [...p].reverse().join(''));\nconst EAN_PARITY = ['LLLLLL', 'LLGLGG', 'LLGGLG', 'LLGGGL', 'LGLLGG', 'LGGLLG', 'LGGGLL', 'LGLGLG', 'LGLGGL', 'LGGLGL'];\n\nexport function ean13CheckDigit(first12: string): number {\n const sum = [...first12].reduce((s, d, i) => s + Number(d) * (i % 2 === 0 ? 1 : 3), 0);\n return (10 - (sum % 10)) % 10;\n}\n\n/** EAN-13 from 12 digits (check digit added) or 13 digits (check digit verified). */\nexport function encodeEan13(value: string): BarcodeResult {\n const v = value.replace(/\\s+/g, '');\n if (!/^\\d{12,13}$/.test(v)) return { modules: '', text: value, error: 'EAN-13 needs 12 or 13 digits' };\n const check = ean13CheckDigit(v.slice(0, 12));\n if (v.length === 13 && Number(v[12]) !== check) return { modules: '', text: value, error: `Invalid check digit (expected ${check})` };\n const digits = v.slice(0, 12) + check;\n const parity = EAN_PARITY[Number(digits[0])];\n let m = '101';\n for (let k = 1; k <= 6; k++) m += (parity[k - 1] === 'L' ? EAN_L : EAN_G)[Number(digits[k])];\n m += '01010';\n for (let k = 7; k <= 12; k++) m += EAN_R[Number(digits[k])];\n m += '101';\n return { modules: m, text: digits };\n}\n\nexport function encodeBarcode(symbology: BarcodeSymbology, value: string): BarcodeResult {\n return symbology === 'ean13' ? encodeEan13(value) : encodeCode128(value);\n}\n","import qrcode from 'qrcode-generator';\nimport type { QrSpec } from '../model/types';\n\n// Encode text as UTF-8 so non-Latin text (e.g. Arabic) scans correctly.\nqrcode.stringToBytes = qrcode.stringToBytesFuncs['UTF-8'];\n\nexport interface QrResult {\n /** size × size, true = dark module. */\n modules: boolean[][];\n size: number;\n error?: string;\n}\n\nexport function encodeQr(value: string, level: QrSpec['errorCorrection']): QrResult {\n if (!value) return { modules: [], size: 0, error: 'Empty value' };\n try {\n const qr = qrcode(0, level);\n qr.addData(value, 'Byte');\n qr.make();\n const size = qr.getModuleCount();\n const modules = Array.from({ length: size }, (_, r) => Array.from({ length: size }, (_, c) => qr.isDark(r, c)));\n return { modules, size };\n } catch (e) {\n return { modules: [], size: 0, error: 'Value too long for a QR code' };\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { ReportElement } from '../../model/types';\nimport type { Row } from '../../engine/expressions';\nimport { layoutChart } from '../../engine/chartLayout';\nimport { encodeBarcode } from '../../engine/barcode';\nimport { encodeQr } from '../../engine/qr';\n\n/** Chart element: SVG drawn from the engine's layout primitives. Marks carry a hover tooltip. */\n@Component({\n selector: 'rpt-chart-view',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { style: 'position:absolute;inset:0;display:block' },\n template: `\n <svg [attr.width]=\"el().w\" [attr.height]=\"el().h\" [attr.viewBox]=\"'0 0 ' + el().w + ' ' + el().h\" [attr.font-family]=\"el().style.fontFamily\" style=\"display:block;overflow:visible\">\n @for (p of prims(); track $index) {\n @switch (p.t) {\n @case ('path') {\n <path [attr.d]=\"p.d\" [attr.fill]=\"p.fill\" [attr.stroke]=\"p.stroke ?? null\" [attr.stroke-width]=\"p.sw ?? null\" [attr.fill-opacity]=\"p.opacity ?? null\">\n @if (p.title) { <title>{{ p.title }}</title> }\n </path>\n }\n @case ('line') {\n <line [attr.x1]=\"p.x1\" [attr.y1]=\"p.y1\" [attr.x2]=\"p.x2\" [attr.y2]=\"p.y2\" [attr.stroke]=\"p.stroke\" [attr.stroke-width]=\"p.sw\" shape-rendering=\"crispEdges\" />\n }\n @case ('poly') {\n <polyline [attr.points]=\"p.points\" fill=\"none\" [attr.stroke]=\"p.stroke\" [attr.stroke-width]=\"p.sw\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />\n }\n @case ('circle') {\n <circle [attr.cx]=\"p.cx\" [attr.cy]=\"p.cy\" [attr.r]=\"p.r\" [attr.fill]=\"p.fill\" [attr.stroke]=\"p.stroke\" [attr.stroke-width]=\"p.sw\">\n @if (p.title) { <title>{{ p.title }}</title> }\n </circle>\n }\n @case ('text') {\n <text [attr.x]=\"p.x\" [attr.y]=\"p.y\" [attr.text-anchor]=\"p.anchor\" [attr.font-size]=\"p.size\" [attr.font-weight]=\"p.weight\" [attr.fill]=\"p.fill\">{{ p.text }}</text>\n }\n }\n }\n </svg>\n `,\n})\nexport class ChartViewComponent {\n readonly el = input.required<ReportElement>();\n readonly rows = input<Row[]>([]);\n readonly prims = computed(() => {\n const el = this.el();\n return el.chart ? layoutChart(el.chart, this.rows(), el.w, el.h, el.style.fontSize, el.style.color) : [];\n });\n}\n\n/** Barcode element (Code 128 / EAN-13): bars as one crisp SVG path, optional human-readable text. */\n@Component({\n selector: 'rpt-barcode-view',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { style: 'position:absolute;inset:0;display:block' },\n template: `\n <svg [attr.width]=\"el().w\" [attr.height]=\"el().h\" style=\"display:block\">\n @if (model(); as m) {\n @if (m.error) {\n <text [attr.x]=\"el().w / 2\" [attr.y]=\"el().h / 2\" text-anchor=\"middle\" font-size=\"11\" fill=\"#c4372f\">{{ m.error }}</text>\n } @else {\n <path [attr.d]=\"m.d\" [attr.fill]=\"color()\" shape-rendering=\"crispEdges\" />\n @if (m.showText) {\n <text [attr.x]=\"el().w / 2\" [attr.y]=\"el().h - 2\" text-anchor=\"middle\" [attr.font-size]=\"el().style.fontSize\" [attr.font-family]=\"el().style.fontFamily\" [attr.fill]=\"el().style.color\">{{ m.text }}</text>\n }\n }\n }\n </svg>\n `,\n})\nexport class BarcodeViewComponent {\n readonly el = input.required<ReportElement>();\n readonly value = input('');\n readonly color = computed(() => this.el().barcode?.color || '#000000');\n readonly model = computed(() => {\n const el = this.el();\n const spec = el.barcode ?? { symbology: 'code128' as const, showText: true, color: '#000' };\n const res = encodeBarcode(spec.symbology, this.value());\n if (res.error) return { error: res.error, d: '', text: '', showText: false };\n const quiet = 10; // quiet zone in modules, each side\n const total = res.modules.length + quiet * 2;\n const mw = el.w / total;\n const textH = spec.showText ? el.style.fontSize + 4 : 0;\n const barH = Math.max(4, el.h - textH);\n let d = '';\n let i = 0;\n while (i < res.modules.length) {\n if (res.modules[i] !== '1') {\n i++;\n continue;\n }\n let j = i;\n while (j < res.modules.length && res.modules[j] === '1') j++;\n const x = +((quiet + i) * mw).toFixed(3);\n const bw = +((j - i) * mw).toFixed(3);\n d += `M${x},0h${bw}v${barH}h${-bw}Z`;\n i = j;\n }\n return { error: '', d, text: res.text, showText: spec.showText };\n });\n}\n\n/** QR code element: dark modules as one SVG path, centred, with a 4-module quiet zone. */\n@Component({\n selector: 'rpt-qr-view',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { style: 'position:absolute;inset:0;display:block' },\n template: `\n <svg [attr.width]=\"el().w\" [attr.height]=\"el().h\" style=\"display:block\">\n @if (model(); as m) {\n @if (m.error) {\n <text [attr.x]=\"el().w / 2\" [attr.y]=\"el().h / 2\" text-anchor=\"middle\" font-size=\"11\" fill=\"#c4372f\">{{ m.error }}</text>\n } @else {\n <path [attr.d]=\"m.d\" [attr.fill]=\"el().qr?.color || '#000000'\" shape-rendering=\"crispEdges\" />\n }\n }\n </svg>\n `,\n})\nexport class QrViewComponent {\n readonly el = input.required<ReportElement>();\n readonly value = input('');\n readonly model = computed(() => {\n const el = this.el();\n const res = encodeQr(this.value(), el.qr?.errorCorrection ?? 'M');\n if (res.error) return { error: res.error, d: '' };\n const quiet = 4;\n const cell = Math.min(el.w, el.h) / (res.size + quiet * 2);\n const ox = (el.w - cell * res.size) / 2;\n const oy = (el.h - cell * res.size) / 2;\n const c3 = +cell.toFixed(3);\n let d = '';\n for (let r = 0; r < res.size; r++)\n for (let c = 0; c < res.size; c++)\n if (res.modules[r][c]) d += `M${+(ox + c * cell).toFixed(3)},${+(oy + r * cell).toFixed(3)}h${c3}v${c3}h${-c3}Z`;\n return { error: '', d };\n });\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { DomSanitizer, type SafeUrl } from '@angular/platform-browser';\n\n/**\n * Image source for <img [src]>. Angular's sanitizer rejects some data: images (e.g. SVG); uploads\n * are embedded as data:image/… URLs, so those are trusted here. An <img> never runs scripts.\n */\n@Pipe({ name: 'safeImage', standalone: true })\nexport class SafeImagePipe implements PipeTransform {\n private readonly sanitizer = inject(DomSanitizer);\n\n transform(url: string | null | undefined): SafeUrl | string {\n if (!url) return '';\n return /^data:image\\//i.test(url) ? this.sanitizer.bypassSecurityTrustUrl(url) : url;\n }\n}\n","import type { ReportElement } from '../model/types';\n\n/** Must match the line-height used by ElementBox when rendering text. */\nexport const LINE_HEIGHT = 1.2;\n\nlet ctx2d: CanvasRenderingContext2D | null | undefined;\nfunction context(): CanvasRenderingContext2D | null {\n if (ctx2d === undefined) {\n try {\n ctx2d = typeof document !== 'undefined' ? document.createElement('canvas').getContext('2d') : null;\n } catch {\n ctx2d = null;\n }\n }\n return ctx2d;\n}\n\n/** Whether the element grows vertically to fit its text (default: on for text and fields). */\nexport const canGrow = (el: ReportElement) => (el.kind === 'text' || el.kind === 'field') && el.canGrow !== false;\n\n/** Height (px) the element needs to show `text` fully at its current width, wrapping like the renderer. */\nexport function measureTextHeight(text: string, el: ReportElement): number {\n const s = el.style;\n const inset = s.padding * 2 + (s.borderWidth > 0 ? s.borderWidth * 2 : 0);\n const width = Math.max(1, el.w - inset);\n const c = context();\n let measure: (t: string) => number;\n if (c) {\n c.font = `${s.italic ? 'italic ' : ''}${s.bold ? 700 : 400} ${s.fontSize}px ${s.fontFamily}`;\n measure = (t) => c.measureText(t).width;\n } else {\n measure = (t) => t.length * s.fontSize * 0.55; // rough fallback outside the browser\n }\n\n let lines = 0;\n for (const para of text.split('\\n')) lines += countLines(para, width, measure);\n // +1px slack so rounding differences between canvas and DOM never clip the last line.\n return Math.ceil(lines * s.fontSize * LINE_HEIGHT + inset + 1);\n}\n\nfunction countLines(para: string, width: number, measure: (t: string) => number): number {\n if (!para) return 1;\n let n = 1;\n let line = '';\n for (const word of para.split(' ')) {\n const candidate = line ? `${line} ${word}` : word;\n if (measure(candidate) <= width) {\n line = candidate;\n continue;\n }\n if (line) n++;\n const w = measure(word);\n if (w > width) {\n // A single word wider than the box breaks across lines (word-break: break-word).\n n += Math.ceil(w / width) - 1;\n line = '';\n } else {\n line = word;\n }\n }\n return n;\n}\n","const UNITLESS = new Set(['fontWeight', 'lineHeight', 'flex', 'zIndex', 'opacity']);\n\n/** Builds an inline style string from a camelCase map; numbers get \"px\" unless unitless. */\nexport function css(o: Record<string, string | number | undefined | null | false>): string {\n let s = '';\n for (const [k, v] of Object.entries(o)) {\n if (v == null || v === '' || v === false) continue;\n const key = k.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\n s += `${key}:${typeof v === 'number' && !UNITLESS.has(k) ? `${v}px` : v};`;\n }\n return s;\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { ReportElement } from '../../model/types';\nimport { columnWidths, hasGrid, type TableRenderData } from '../../engine/table';\nimport { LINE_HEIGHT } from '../../engine/measure';\nimport { css } from '../css';\n\nexport type { TableRenderData };\n\n/** Data for drawing a table in the designer: the column templates themselves. */\nexport function designTableData(el: ReportElement): TableRenderData {\n const t = el.table!;\n return {\n header: t.showHeader ? t.columns.map((c) => c.header) : null,\n headerHeight: t.headerHeight,\n rows: [{ cells: t.columns.map((c) => c.text), height: t.rowHeight, index: 0 }],\n footer: t.showFooter ? t.columns.map((c) => c.footer) : null,\n footerHeight: t.rowHeight,\n };\n}\n\nconst JUSTIFY = { left: 'flex-start', center: 'center', right: 'flex-end' } as const;\nconst ALIGN_ITEMS = { top: 'flex-start', middle: 'center', bottom: 'flex-end' } as const;\n\n/** Draws the inside of a table element (fills its parent box). Shared by designer and preview. */\n@Component({\n selector: 'rpt-table-view',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[style]': 'hostStyle()' },\n template: `\n @if (data().header; as header) {\n <div [style]=\"headerRowStyle()\">\n @for (h of header; track $index) {\n <div [style]=\"cellStyles()[$index]\"><span style=\"width:100%\">{{ h }}</span></div>\n }\n </div>\n }\n @for (r of data().rows; track r.index) {\n <div [style]=\"rowStyle(r.index, r.height)\">\n @for (c of r.cells; track $index) {\n <div [style]=\"cellStyles()[$index]\"><span style=\"width:100%\">{{ c }}</span></div>\n }\n </div>\n }\n @if (data().footer; as footer) {\n <div [style]=\"footerRowStyle()\">\n @for (f of footer; track $index) {\n <div [style]=\"cellStyles()[$index]\"><span style=\"width:100%\">{{ f }}</span></div>\n }\n </div>\n }\n `,\n})\nexport class TableViewComponent {\n readonly el = input.required<ReportElement>();\n readonly data = input.required<TableRenderData>();\n\n private readonly line = computed(() => {\n const t = this.el().table!;\n return hasGrid(t) ? `1px solid ${t.gridColor}` : undefined;\n });\n\n readonly hostStyle = computed(() => {\n const s = this.el().style;\n return css({\n position: 'absolute',\n inset: 0,\n display: 'block',\n borderTop: this.line(),\n borderLeft: this.line(),\n fontFamily: s.fontFamily,\n fontSize: s.fontSize,\n fontWeight: s.bold ? 700 : 400,\n fontStyle: s.italic ? 'italic' : 'normal',\n color: s.color,\n overflow: 'hidden',\n });\n });\n\n readonly cellStyles = computed(() => {\n const el = this.el();\n const t = el.table!;\n const widths = columnWidths(el);\n return t.columns.map((c, i) =>\n css({\n width: widths[i],\n flex: 'none',\n display: 'flex',\n justifyContent: JUSTIFY[c.align],\n alignItems: ALIGN_ITEMS[el.style.vAlign],\n textAlign: c.align,\n padding: el.style.padding,\n borderRight: this.line(),\n borderBottom: this.line(),\n overflow: 'hidden',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n lineHeight: LINE_HEIGHT,\n boxSizing: 'border-box',\n }),\n );\n });\n\n readonly headerRowStyle = computed(() => {\n const t = this.el().table!;\n return css({ display: 'flex', height: this.data().headerHeight, background: t.headerBackground, color: t.headerColor, fontWeight: 700 });\n });\n\n readonly footerRowStyle = computed(() => {\n const t = this.el().table!;\n const border = hasGrid(t) ? t.gridColor : this.el().style.color;\n return css({ display: 'flex', height: this.data().footerHeight, fontWeight: 700, borderTop: `2px solid ${border}`, boxSizing: 'border-box' });\n });\n\n rowStyle(index: number, height: number): string {\n const t = this.el().table!;\n const bg = index % 2 === 1 && t.stripeBackground !== 'transparent' ? t.stripeBackground : this.el().style.background;\n return css({ display: 'flex', height, background: bg });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { renderTemplate, type Row } from '../../engine/expressions';\nimport { crosstabAsTable } from '../../engine/crosstab';\nimport { DesignerStore } from '../designer.store';\nimport { BarcodeViewComponent, ChartViewComponent, QrViewComponent } from './graphics.components';\nimport { SafeImagePipe } from './safe-image.pipe';\nimport type { ReportElement } from '../../model/types';\nimport { LINE_HEIGHT } from '../../engine/measure';\nimport { css } from '../css';\nimport { TableViewComponent, designTableData, type TableRenderData } from './table-view.component';\n\nconst JUSTIFY = { left: 'flex-start', center: 'center', right: 'flex-end' } as const;\nconst ALIGN_ITEMS = { top: 'flex-start', middle: 'center', bottom: 'flex-end' } as const;\n\n/** Draws one report element. Used by both the designer canvas and the preview. */\n@Component({\n selector: 'rpt-element',\n standalone: true,\n imports: [TableViewComponent, ChartViewComponent, BarcodeViewComponent, QrViewComponent, SafeImagePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[style]': 'hostStyle()' },\n template: `\n @switch (el().kind) {\n @case ('table') {\n @if (el().table) {\n <rpt-table-view [el]=\"el()\" [data]=\"tableData() ?? designData()\" />\n }\n }\n @case ('crosstab') {\n @if (crosstab(); as x) {\n <rpt-table-view [el]=\"x.table\" [data]=\"tableData() ?? x.render\" />\n }\n }\n @case ('chart') {\n <rpt-chart-view [el]=\"el()\" [rows]=\"chartRows()\" />\n }\n @case ('barcode') {\n <rpt-barcode-view [el]=\"el()\" [value]=\"codeValue()\" />\n }\n @case ('qrcode') {\n <rpt-qr-view [el]=\"el()\" [value]=\"codeValue()\" />\n }\n @case ('line') {\n <div [style]=\"lineStyle()\"></div>\n }\n @case ('rect') {}\n @case ('image') {\n @if (content()) {\n <img [src]=\"content() | safeImage\" alt=\"\" draggable=\"false\" style=\"width:100%;height:100%;display:block\" [style.object-fit]=\"el().imageFit ?? 'contain'\" />\n } @else if (design()) {\n <div class=\"image-placeholder\">Image</div>\n }\n }\n @default {\n <span style=\"width:100%\">{{ content() }}</span>\n }\n }\n <ng-content />\n `,\n})\nexport class ElementBoxComponent {\n readonly el = input.required<ReportElement>();\n readonly content = input('');\n readonly design = input(false);\n /** Overrides for grown/shifted elements in the preview. */\n readonly top = input<number | undefined>(undefined);\n readonly height = input<number | undefined>(undefined);\n /** Rows to draw for a table; omitted in the designer (templates are shown). */\n readonly tableData = input<TableRenderData | undefined>(undefined);\n\n /** Rows for a chart / cross table in the preview (its band's scope). */\n readonly rows = input<Row[] | undefined>(undefined);\n\n private readonly store = inject(DesignerStore);\n readonly designData = computed(() => designTableData(this.el()));\n\n /** In the designer, charts and cross tables show the loaded data. */\n readonly chartRows = computed(() => this.rows() ?? this.store.data().rows);\n readonly crosstab = computed(() => (this.el().crosstab ? crosstabAsTable(this.el(), this.chartRows()) : null));\n\n /** Barcode/QR value: the evaluated text in the preview; in the designer, evaluated on the first data row. */\n readonly codeValue = computed(() => {\n if (!this.design()) return this.content();\n const rows = this.store.data().rows;\n const ctx = { row: rows[0], rows, allRows: rows, pageRows: rows, rowNumber: 1, pageNumber: 1, totalPages: 1, reportName: this.store.report().name, params: this.store.params() };\n return renderTemplate(this.el().text, ctx, this.el().format);\n });\n\n readonly hostStyle = computed(() => {\n const el = this.el();\n const s = el.style;\n const box = {\n position: 'absolute',\n left: el.x,\n top: this.top() ?? el.y,\n width: el.w,\n height: this.height() ?? el.h,\n boxSizing: 'border-box',\n };\n if (el.kind === 'rect') {\n return css({ ...box, display: 'block', border: `${s.borderWidth}px ${el.dash ?? 'solid'} ${s.borderColor}`, background: s.background });\n }\n if (el.kind !== 'text' && el.kind !== 'field') return css({ ...box, display: 'block' });\n return css({\n ...box,\n display: 'flex',\n justifyContent: JUSTIFY[s.align],\n alignItems: ALIGN_ITEMS[s.vAlign],\n textAlign: s.align,\n fontFamily: s.fontFamily,\n fontSize: s.fontSize,\n fontWeight: s.bold ? 700 : 400,\n fontStyle: s.italic ? 'italic' : 'normal',\n textDecoration: s.underline ? 'underline' : 'none',\n color: s.color,\n background: s.background,\n padding: s.padding,\n overflow: 'hidden',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n lineHeight: LINE_HEIGHT,\n border: s.borderWidth > 0 ? `${s.borderWidth}px solid ${s.borderColor}` : undefined,\n });\n });\n\n readonly lineStyle = computed(() => {\n const el = this.el();\n const t = Math.max(1, el.style.borderWidth);\n const horizontal = el.w >= el.h;\n const stroke = `${t}px ${el.dash ?? 'solid'} ${el.style.borderColor}`;\n return css({\n position: 'absolute',\n ...(horizontal\n ? { left: 0, right: 0, top: `calc(50% - ${t / 2}px)`, height: 0, borderTop: stroke }\n : { top: 0, bottom: 0, left: `calc(50% - ${t / 2}px)`, width: 0, borderLeft: stroke }),\n });\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport type { Band, ReportElement } from '../../model/types';\nimport { BAND_LABELS, FOOTER_TYPES, contentWidth, createElement, createTable, orderedBands } from '../../model/defaults';\nimport { createColumn } from '../../engine/table';\nimport { createBarcode, createChart, createCrosstab, createQr, type FieldRef } from '../../model/factories';\nimport { DesignerStore } from '../designer.store';\nimport { ElementBoxComponent } from './element-box.component';\n\nexport const DRAG_MIME = 'application/x-report-item';\nexport type DragPayload =\n | { kind: 'text' | 'line' | 'rect' | 'image' }\n | { kind: 'table' | 'chart' | 'barcode' | 'qrcode' | 'crosstab'; fields: FieldRef[] }\n | { kind: 'field'; field: string; type?: string; template?: string };\n\nconst BAND_TITLE_H = 20;\ntype DragMode = 'move' | 'e' | 's' | 'se';\n\n/** Builds the element a toolbox/field drop creates, adjusted for the target band. */\nexport function elementFromPayload(p: DragPayload, band: Band, x: number, y: number, width: number): ReportElement {\n if (p.kind === 'table') return createTable(x, y, Math.max(120, width - x), p.fields);\n if (p.kind === 'chart') return createChart(x, y, Math.max(160, width - x), p.fields);\n if (p.kind === 'crosstab') return createCrosstab(x, y, Math.max(200, width - x), p.fields);\n if (p.kind === 'barcode') return createBarcode(x, y, p.fields);\n if (p.kind === 'qrcode') return createQr(x, y, p.fields);\n if (p.kind !== 'field') return createElement(p.kind, x, y);\n if (p.template) return createElement('field', x, y, { text: p.template });\n const numeric = p.type === 'number';\n const inFooter = FOOTER_TYPES.includes(band.type);\n return createElement('field', x, y, {\n text: numeric && inFooter ? `{sum(${p.field})}` : `{${p.field}}`,\n format: p.type === 'date' ? { kind: 'date' } : numeric && inFooter ? { kind: 'number', decimals: 2 } : {},\n style: numeric ? { align: 'right' } : {},\n });\n}\n\n@Component({\n selector: 'rpt-canvas',\n standalone: true,\n imports: [ElementBoxComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"canvas-scroll\" (pointerdown)=\"onBackgroundDown($event)\">\n <div class=\"canvas-sizer\" [style.width.px]=\"width() * store.zoom() + 2\" [style.height.px]=\"totalHeight() * store.zoom() + 2\">\n <div class=\"canvas\" [style.width.px]=\"width()\" [style.transform]=\"'scale(' + store.zoom() + ')'\">\n @for (band of bands(); track band.id) {\n <div class=\"band\">\n <div\n class=\"band-title band-{{ band.type }}\"\n [class.selected]=\"isBandSelected(band)\"\n [style.height.px]=\"titleHeight\"\n (pointerdown)=\"store.select({ elementIds: [], bandId: band.id })\"\n >\n {{ labels[band.type] }}\n @if (groupField(band); as g) {\n <span class=\"band-group\">: {{ g }}</span>\n }\n </div>\n <div\n class=\"band-body\"\n [attr.data-band-id]=\"band.id\"\n [style.height.px]=\"band.height\"\n [style.width.px]=\"width()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event, band)\"\n (pointerdown)=\"onBodyDown($event, band)\"\n >\n @for (el of band.elements; track el.id) {\n <rpt-element\n [el]=\"el\"\n [content]=\"el.text\"\n [design]=\"true\"\n class=\"design-el kind-{{ el.kind }}\"\n [class.selected]=\"isSelected(el)\"\n [attr.title]=\"el.text || null\"\n (pointerdown)=\"onElementDown($event, el, band)\"\n >\n @if (isSelected(el) && store.selection().elementIds.length === 1) {\n <div class=\"handle handle-e\" (pointerdown)=\"onHandleDown($event, el, band, 'e')\"></div>\n @if (el.kind !== 'table') {\n <div class=\"handle handle-s\" (pointerdown)=\"onHandleDown($event, el, band, 's')\"></div>\n <div class=\"handle handle-se\" (pointerdown)=\"onHandleDown($event, el, band, 'se')\"></div>\n }\n }\n </rpt-element>\n }\n </div>\n <div class=\"band-resizer\" title=\"Drag to resize band\" (pointerdown)=\"startBandResize($event, band)\"></div>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n})\nexport class CanvasComponent {\n protected readonly store = inject(DesignerStore);\n protected readonly labels = BAND_LABELS;\n protected readonly titleHeight = BAND_TITLE_H;\n\n protected readonly width = computed(() => contentWidth(this.store.report().page));\n protected readonly bands = computed(() => orderedBands(this.store.report()).filter((b) => b.visible));\n protected readonly totalHeight = computed(() => this.bands().reduce((h, b) => h + b.height + BAND_TITLE_H + 6, 0));\n\n protected isSelected(el: ReportElement): boolean {\n return this.store.selection().elementIds.includes(el.id);\n }\n\n protected isBandSelected(band: Band): boolean {\n const s = this.store.selection();\n return s.bandId === band.id && s.elementIds.length === 0;\n }\n\n protected groupField(band: Band): string | null {\n if (!band.groupId) return null;\n const g = this.store.report().groups.find((x) => x.id === band.groupId);\n return g ? g.field || '(no field)' : null;\n }\n\n protected onBackgroundDown(e: PointerEvent): void {\n if (e.target === e.currentTarget) this.store.select({ elementIds: [], bandId: null });\n }\n\n protected onBodyDown(e: PointerEvent, band: Band): void {\n if (e.target === e.currentTarget) this.store.select({ elementIds: [], bandId: band.id });\n }\n\n protected onDragOver(e: DragEvent): void {\n if (e.dataTransfer?.types.includes(DRAG_MIME)) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n }\n }\n\n protected onDrop(e: DragEvent, band: Band): void {\n const raw = e.dataTransfer?.getData(DRAG_MIME);\n if (!raw) return;\n e.preventDefault();\n const store = this.store;\n const zoom = store.zoom();\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const px = (e.clientX - rect.left) / zoom;\n const py = (e.clientY - rect.top) / zoom;\n const payload: DragPayload = JSON.parse(raw);\n\n // A field dropped onto a table adds a column to it.\n const target = band.elements.find((t) => t.kind === 'table' && px >= t.x && px <= t.x + t.w && py >= t.y && py <= t.y + t.h);\n if (target && payload.kind === 'field') {\n store.update((r) => {\n const t = r.bands.find((b) => b.id === band.id)!.elements.find((x) => x.id === target.id)!.table!;\n const col = createColumn(payload.field, payload.type);\n if (payload.template) Object.assign(col, { header: '', text: payload.template });\n if (payload.type === 'number') col.footer = `{sum(${payload.field})}`;\n t.columns.push(col);\n });\n store.select({ elementIds: [target.id], bandId: band.id });\n return;\n }\n\n const width = this.width();\n const el = elementFromPayload(payload, band, store.snapValue(px), store.snapValue(py), width);\n el.x = Math.max(0, Math.min(el.x, width - el.w));\n el.y = Math.max(0, Math.min(el.y, Math.max(0, band.height - el.h)));\n store.update((r) => {\n const b = r.bands.find((bb) => bb.id === band.id)!;\n b.elements.push(el);\n if (b.height < el.y + el.h) b.height = el.y + el.h;\n });\n store.select({ elementIds: [el.id], bandId: band.id });\n }\n\n protected startBandResize(e: PointerEvent, band: Band): void {\n e.preventDefault();\n e.stopPropagation();\n const store = this.store;\n const zoom = store.zoom();\n const startY = e.clientY;\n const startH = band.height;\n store.checkpoint();\n const move = (ev: PointerEvent) => {\n const h = Math.max(0, store.snapValue(startH + (ev.clientY - startY) / zoom));\n store.update((r) => {\n r.bands.find((b) => b.id === band.id)!.height = h;\n }, false);\n };\n const up = () => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n }\n\n protected onElementDown(e: PointerEvent, el: ReportElement, band: Band): void {\n if (e.button !== 0) return;\n e.stopPropagation();\n const selected = this.isSelected(el);\n let ids = this.store.selection().elementIds;\n if (e.shiftKey || e.ctrlKey || e.metaKey) {\n ids = selected ? ids.filter((i) => i !== el.id) : [...ids, el.id];\n this.store.select({ elementIds: ids, bandId: band.id });\n return;\n }\n if (!selected) {\n ids = [el.id];\n this.store.select({ elementIds: ids, bandId: band.id });\n }\n this.beginDrag(e, el, band, ids, 'move');\n }\n\n protected onHandleDown(e: PointerEvent, el: ReportElement, band: Band, mode: DragMode): void {\n e.stopPropagation();\n this.beginDrag(e, el, band, [el.id], mode);\n }\n\n private beginDrag(e: PointerEvent, el: ReportElement, band: Band, ids: string[], mode: DragMode): void {\n const store = this.store;\n const zoom = store.zoom();\n const width = this.width();\n const startX = e.clientX;\n const startY = e.clientY;\n const targets = band.elements.filter((x) => (mode === 'move' ? ids.includes(x.id) : x.id === el.id)).map((x) => ({ ...x }));\n const sourceBody = (e.currentTarget as HTMLElement).closest('.band-body') as HTMLElement;\n let moved = false;\n\n const move = (ev: PointerEvent) => {\n const dx = (ev.clientX - startX) / zoom;\n const dy = (ev.clientY - startY) / zoom;\n if (!moved) {\n if (Math.abs(dx) < 2 && Math.abs(dy) < 2) return;\n moved = true;\n store.checkpoint();\n }\n store.update((r) => {\n const b = r.bands.find((bb) => bb.id === band.id)!;\n for (const s of targets) {\n const t = b.elements.find((x) => x.id === s.id);\n if (!t) continue;\n if (mode === 'move') {\n t.x = Math.max(0, Math.min(store.snapValue(s.x + dx), width - t.w));\n t.y = store.snapValue(s.y + dy);\n } else {\n if (mode !== 's') t.w = Math.max(4, Math.min(store.snapValue(s.w + dx), width - t.x));\n if (mode !== 'e') t.h = Math.max(2, store.snapValue(s.h + dy));\n }\n }\n }, false);\n };\n\n const up = (ev: PointerEvent) => {\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n if (!moved || mode !== 'move') return;\n // Dropped over another band? Move the elements there, keeping their on-screen position.\n const targetBody = document.elementsFromPoint(ev.clientX, ev.clientY).find((n) => n.classList.contains('band-body')) as\n | HTMLElement\n | undefined;\n const targetId = targetBody?.dataset['bandId'];\n const srcTop = sourceBody.getBoundingClientRect().top;\n store.update((r) => {\n const src = r.bands.find((b) => b.id === band.id)!;\n const dst = targetId && targetId !== band.id ? r.bands.find((b) => b.id === targetId) : undefined;\n for (const s of targets) {\n const i = src.elements.findIndex((x) => x.id === s.id);\n if (i < 0) continue;\n const t = src.elements[i];\n if (dst && targetBody) {\n const dstTop = targetBody.getBoundingClientRect().top;\n src.elements.splice(i, 1);\n t.y = Math.max(0, Math.min(store.snapValue((srcTop + t.y * zoom - dstTop) / zoom), Math.max(0, dst.height - t.h)));\n dst.elements.push(t);\n } else {\n t.y = Math.max(0, Math.min(t.y, Math.max(0, src.height - t.h)));\n }\n }\n }, false);\n if (targetId && targetId !== band.id) store.select({ elementIds: targets.map((t) => t.id), bandId: targetId });\n };\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, output } from '@angular/core';\nimport { contentWidth } from '../../model/defaults';\nimport { DesignerStore } from '../designer.store';\nimport { DRAG_MIME, elementFromPayload, type DragPayload } from './canvas.component';\n\nconst TOOLS: { kind: 'text' | 'line' | 'rect' | 'image'; label: string; icon: string }[] = [\n { kind: 'text', label: 'Label', icon: 'A' },\n { kind: 'line', label: 'Line', icon: '―' },\n { kind: 'rect', label: 'Rectangle', icon: '▭' },\n { kind: 'image', label: 'Image', icon: '🖼' },\n];\n\ntype DataToolKind = 'table' | 'chart' | 'crosstab' | 'barcode' | 'qrcode';\nconst DATA_TOOLS: { kind: DataToolKind; label: string; icon: string; hint: string }[] = [\n { kind: 'chart', label: 'Chart', icon: '📊', hint: 'Bar, line, area, pie or doughnut chart over the rows of its band' },\n { kind: 'crosstab', label: 'Cross table', icon: '⊞', hint: 'Pivot: rows × columns of a value, with totals' },\n { kind: 'barcode', label: 'Barcode', icon: '║', hint: 'Code 128 or EAN-13; value can be a field like {OrderID}' },\n { kind: 'qrcode', label: 'QR code', icon: '▣', hint: 'QR code; value can contain fields' },\n];\n\nconst SPECIALS: { label: string; template: string }[] = [\n { label: 'Page N of M', template: 'Page {PageNumber} of {TotalPages}' },\n { label: 'Page number', template: '{PageNumber}' },\n { label: 'Current date/time', template: '{Now}' },\n { label: 'Row number', template: '{RowNumber}' },\n { label: 'Report name', template: '{ReportName}' },\n { label: 'Record count', template: '{count()}' },\n];\n\nconst TYPE_ICON: Record<string, string> = { number: '#', string: 'Ab', date: '📅', boolean: '✓', object: '{}' };\n\n@Component({\n selector: 'rpt-left-panel',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <aside class=\"panel left-panel\">\n <section>\n <h3>Toolbox</h3>\n <div class=\"toolbox\">\n <div\n class=\"tool\"\n draggable=\"true\"\n title=\"Self-contained table: lists the rows of its band (all rows in Report Header/Footer, group rows in group bands)\"\n (dragstart)=\"dragStart($event, dataPayload('table'))\"\n (click)=\"add(dataPayload('table'))\"\n >\n <span class=\"tool-icon\">▦</span>Table\n </div>\n <div class=\"tool\" title=\"Column titles in the header band, one field per column in Detail\" (click)=\"openBandedTable.emit()\">\n <span class=\"tool-icon\">☰</span>Header/Detail\n </div>\n @for (t of dataTools; track t.kind) {\n <div class=\"tool\" draggable=\"true\" [title]=\"t.hint\" (dragstart)=\"dragStart($event, dataPayload(t.kind))\" (click)=\"add(dataPayload(t.kind))\">\n <span class=\"tool-icon\">{{ t.icon }}</span>{{ t.label }}\n </div>\n }\n @for (t of tools; track t.kind) {\n <div class=\"tool\" draggable=\"true\" (dragstart)=\"dragStart($event, { kind: t.kind })\" (click)=\"add({ kind: t.kind })\">\n <span class=\"tool-icon\">{{ t.icon }}</span>{{ t.label }}\n </div>\n }\n </div>\n </section>\n\n <section class=\"grow\">\n <h3>\n Data\n <button class=\"link\" (click)=\"openDataSource.emit()\">Configure…</button>\n </h3>\n <div class=\"ds-summary\">\n {{ ds().type === 'odata' ? 'OData' : 'JSON' }}:\n <span class=\"muted\">{{ dsLabel() }}</span>\n @if (ds().entitySet) {\n <span class=\"muted\"> / {{ ds().entitySet }}</span>\n }\n </div>\n <div class=\"ds-status {{ data().status }}\">\n @switch (data().status) {\n @case ('loading') { Loading… }\n @case ('ready') { {{ data().rows.length }} rows, {{ data().fields.length }} fields }\n @case ('error') { {{ data().error }} }\n @default { No data source configured }\n }\n @if (data().status !== 'idle') {\n <button class=\"link\" (click)=\"store.reloadData()\">Refresh</button>\n }\n </div>\n <div class=\"field-list\">\n @for (f of data().fields; track f.name) {\n <div\n class=\"field-item\"\n draggable=\"true\"\n title=\"Drag onto a band or table (double-click adds to selected band). Numbers dropped in footers become sum().\"\n (dragstart)=\"dragStart($event, { kind: 'field', field: f.name, type: f.type })\"\n (dblclick)=\"add({ kind: 'field', field: f.name, type: f.type })\"\n >\n <span class=\"field-type\">{{ typeIcon[f.type] }}</span>{{ f.name }}\n </div>\n }\n </div>\n @if (data().docFields?.length) {\n <h4>Document fields</h4>\n <div class=\"field-list\">\n @for (f of data().docFields; track f.name) {\n <div\n class=\"field-item\"\n draggable=\"true\"\n title=\"A value of the whole document (not per row), e.g. a receipt number or shop name\"\n (dragstart)=\"dragStart($event, { kind: 'field', field: f.name, type: f.type })\"\n (dblclick)=\"add({ kind: 'field', field: f.name, type: f.type })\"\n >\n <span class=\"field-type\">{{ typeIcon[f.type] }}</span>{{ f.name.slice(5) }}\n </div>\n }\n </div>\n }\n @if (params().length) {\n <h4>Parameters</h4>\n <div class=\"field-list\">\n @for (p of params(); track p.name) {\n <div\n class=\"field-item special\"\n draggable=\"true\"\n (dragstart)=\"dragStart($event, { kind: 'field', field: '', template: '{@' + p.name + '}' })\"\n (dblclick)=\"add({ kind: 'field', field: '', template: '{@' + p.name + '}' })\"\n >\n <span class=\"field-type\">&#64;</span>{{ p.label || p.name }}\n </div>\n }\n </div>\n }\n <h4>Special fields</h4>\n <div class=\"field-list\">\n @for (s of specials; track s.label) {\n <div\n class=\"field-item special\"\n draggable=\"true\"\n (dragstart)=\"dragStart($event, { kind: 'field', field: '', template: s.template })\"\n (dblclick)=\"add({ kind: 'field', field: '', template: s.template })\"\n >\n <span class=\"field-type\">ƒ</span>{{ s.label }}\n </div>\n }\n </div>\n </section>\n </aside>\n `,\n})\nexport class LeftPanelComponent {\n protected readonly store = inject(DesignerStore);\n readonly openDataSource = output<void>();\n readonly openBandedTable = output<void>();\n protected readonly dataTools = DATA_TOOLS;\n\n protected readonly tools = TOOLS;\n protected readonly specials = SPECIALS;\n protected readonly typeIcon = TYPE_ICON;\n protected readonly data = this.store.data;\n protected readonly params = computed(() => (this.store.report().parameters ?? []).filter((p) => p.name));\n protected readonly ds = computed(() => this.store.report().dataSource);\n protected readonly dsLabel = computed(() => {\n const ds = this.ds();\n return ds.type === 'json' && ds.inline.trim() ? '(pasted JSON)' : ds.url || '(not set)';\n });\n /** Toolbox items that are pre-configured from the current data fields. */\n protected dataPayload(kind: DataToolKind): DragPayload {\n return { kind, fields: this.data().fields.filter((f) => f.type !== 'object') };\n }\n\n protected dragStart(e: DragEvent, payload: DragPayload): void {\n e.dataTransfer?.setData(DRAG_MIME, JSON.stringify(payload));\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'copy';\n }\n\n /** Click / double-click: add to the selected band (or Detail) at the top-left. */\n protected add(payload: DragPayload): void {\n const report = this.store.report();\n const band =\n report.bands.find((b) => b.id === this.store.selection().bandId) ?? report.bands.find((b) => b.type === 'detail')!;\n const el = elementFromPayload(payload, band, 0, 0, contentWidth(report.page));\n this.store.update((r) => {\n const b = r.bands.find((bb) => bb.id === band.id)!;\n b.elements.push(el);\n b.height = Math.max(b.height, el.h);\n });\n this.store.select({ elementIds: [el.id], bandId: band.id });\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { DataSourceDef } from '../../model/types';\nimport { buildODataUrl, detectDataSource, loadData, loadODataEntitySets, type LoadResult } from '../../engine/dataSources';\nimport { DesignerStore } from '../designer.store';\n\n@Component({\n selector: 'rpt-data-source-dialog',\n standalone: true,\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"modal-backdrop\" (pointerdown)=\"onBackdropDown($event)\">\n <div class=\"modal\">\n <header>\n <h2>Data source</h2>\n <button class=\"link\" (click)=\"closed.emit()\">✕</button>\n </header>\n <div class=\"modal-body\">\n <label class=\"field\">\n URL — paste a JSON API, OData service or OData entity-set URL to configure everything automatically\n <div class=\"inline\">\n <input\n [(ngModel)]=\"ds.url\"\n (paste)=\"onPaste($event)\"\n (keydown.enter)=\"detect()\"\n placeholder=\"https://jsonplaceholder.typicode.com/posts · https://services.odata.org/V4/Northwind/Northwind.svc/Orders\"\n />\n <button [disabled]=\"detecting() || !ds.url.trim()\" (click)=\"detect()\">{{ detecting() ? 'Detecting…' : 'Detect' }}</button>\n </div>\n @if (detectMsg(); as m) {\n <span [class.ok]=\"!m.error\" [class.error]=\"m.error\">{{ m.text }}</span>\n }\n </label>\n\n <div class=\"tabs\">\n <span class=\"muted tabs-label\">Type:</span>\n <button [class.on]=\"ds.type === 'json'\" (click)=\"ds.type = 'json'\">JSON</button>\n <button [class.on]=\"ds.type === 'odata'\" (click)=\"ds.type = 'odata'\">OData</button>\n </div>\n\n @if (ds.type === 'json') {\n <label class=\"field\">\n Or paste JSON (used instead of the URL when filled)\n <textarea rows=\"6\" [(ngModel)]=\"ds.inline\" placeholder='[{\"Name\":\"A\",\"Amount\":10}]'></textarea>\n </label>\n <label class=\"field\">\n Array path (optional)\n <input [(ngModel)]=\"ds.dataPath\" placeholder=\"e.g. data.items — blank = auto-detect\" />\n </label>\n } @else {\n <label class=\"field\">\n Entity set (leave empty if the URL already points to one)\n <div class=\"inline\">\n <input list=\"entity-sets\" [(ngModel)]=\"ds.entitySet\" placeholder=\"e.g. Orders\" />\n <button [disabled]=\"!ds.url.trim()\" (click)=\"fetchSets()\">Load entity sets</button>\n </div>\n @if (setsMsg()) {\n <span class=\"muted\">{{ setsMsg() }}</span>\n }\n <datalist id=\"entity-sets\">\n @for (s of sets(); track s) {\n <option [value]=\"s\"></option>\n }\n </datalist>\n </label>\n <div class=\"grid2\">\n <label class=\"field\">$select <input [(ngModel)]=\"ds.select\" placeholder=\"OrderID,ShipCountry,Freight\" /></label>\n <label class=\"field\">$filter <input [(ngModel)]=\"ds.filter\" placeholder=\"Freight gt 50\" /></label>\n <label class=\"field\">$orderby <input [(ngModel)]=\"ds.orderby\" placeholder=\"OrderDate desc\" /></label>\n <label class=\"field\">$expand <input [(ngModel)]=\"ds.expand\" placeholder=\"Customer\" /></label>\n <label class=\"field\">$top <input type=\"number\" min=\"1\" [(ngModel)]=\"ds.top\" /></label>\n <label class=\"field\">Max rows (paging cap) <input type=\"number\" min=\"1\" [(ngModel)]=\"ds.maxRows\" /></label>\n </div>\n <div class=\"muted url-preview\">{{ odataUrl() }}</div>\n }\n\n <label class=\"field\">\n Request headers (one per line)\n <textarea rows=\"2\" [(ngModel)]=\"ds.headers\" placeholder=\"Authorization: Bearer …\"></textarea>\n </label>\n\n <div class=\"test-area\">\n <button [disabled]=\"busy()\" (click)=\"runTest()\">{{ busy() ? 'Testing…' : 'Test connection' }}</button>\n @if (error()) {\n <div class=\"error\">{{ error() }}</div>\n }\n @if (result(); as res) {\n <div class=\"ok\">{{ res.rows.length }} rows · fields: {{ fieldSummary(res) }}</div>\n @if (res.warning) {\n <div class=\"error\">{{ res.warning }}</div>\n }\n }\n </div>\n <p class=\"hint\">The browser fetches the data directly, so the API must allow CORS from this page.</p>\n </div>\n <footer>\n <button (click)=\"closed.emit()\">Cancel</button>\n <button class=\"primary\" (click)=\"apply()\">Apply</button>\n </footer>\n </div>\n </div>\n `,\n})\nexport class DataSourceDialogComponent {\n private readonly store = inject(DesignerStore);\n readonly closed = output<void>();\n\n /** Working copy, edited with two-way binding and applied on \"Apply\". */\n protected ds: DataSourceDef = structuredClone(this.store.report().dataSource);\n protected readonly busy = signal(false);\n protected readonly result = signal<LoadResult | null>(null);\n protected readonly error = signal('');\n protected readonly sets = signal<string[]>([]);\n protected readonly setsMsg = signal('');\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n /**\n * Closes when clicking outside the dialog. Must return nothing: an Angular event handler that\n * returns `false` calls preventDefault(), which would stop clicks from focusing the inputs.\n */\n protected onBackdropDown(e: PointerEvent): void {\n if (e.target === e.currentTarget) this.closed.emit();\n }\n protected readonly detecting = signal(false);\n protected readonly detectMsg = signal<{ text: string; error: boolean } | null>(null);\n\n /** Pasting a URL into the URL field configures the source straight away. */\n protected onPaste(e: ClipboardEvent): void {\n const text = e.clipboardData?.getData('text').trim() ?? '';\n if (!/^(https?:\\/\\/|\\/)\\S+$/i.test(text)) return;\n e.preventDefault();\n this.ds = { ...this.ds, url: text };\n this.detect();\n }\n\n /** Fetches the URL, decides JSON vs OData, fills in the whole form and tests it. */\n protected async detect(): Promise<void> {\n const url = this.ds.url.trim();\n if (!url || this.detecting()) return;\n this.detecting.set(true);\n this.detectMsg.set(null);\n this.result.set(null);\n this.error.set('');\n try {\n const { dataSource, note } = await detectDataSource(url, this.ds.headers);\n this.ds = dataSource;\n this.cdr.markForCheck();\n this.detectMsg.set({ text: note, error: false });\n if (dataSource.type === 'odata' && dataSource.entitySet) this.fetchSets();\n await this.runTest();\n } catch (e) {\n this.detectMsg.set({ text: String((e as Error).message ?? e), error: true });\n } finally {\n this.detecting.set(false);\n }\n }\n\n protected odataUrl(): string {\n return buildODataUrl(this.normalized());\n }\n\n protected fieldSummary(res: LoadResult): string {\n return res.fields.map((f) => `${f.name} (${f.type})`).join(', ');\n }\n\n private normalized(): DataSourceDef {\n return { ...this.ds, top: this.ds.top ? Number(this.ds.top) : null, maxRows: Number(this.ds.maxRows) || 5000 };\n }\n\n protected async runTest(): Promise<void> {\n this.busy.set(true);\n this.error.set('');\n this.result.set(null);\n try {\n this.result.set(await loadData(this.normalized()));\n } catch (e) {\n this.error.set(String((e as Error).message ?? e));\n } finally {\n this.busy.set(false);\n }\n }\n\n protected async fetchSets(): Promise<void> {\n this.setsMsg.set('Loading…');\n try {\n const list = await loadODataEntitySets(this.ds.url, this.ds.headers);\n this.sets.set(list);\n this.setsMsg.set(list.length ? '' : 'No entity sets found');\n } catch (e) {\n this.setsMsg.set(String((e as Error).message ?? e));\n }\n }\n\n protected apply(): void {\n const ds = this.normalized();\n this.store.update((r) => (r.dataSource = ds));\n this.closed.emit();\n }\n}\n","import type { Band, BandType, ReportDefinition, ReportElement } from '../model/types';\nimport { getPath, renderTemplate, type EvalContext, type Row } from './expressions';\nimport { canGrow, measureTextHeight } from './measure';\nimport { columnWidths, tableCellStyle } from './table';\nimport { crosstabAsTable } from './crosstab';\nimport { filterRows, type ParamValues } from './parameters';\n\ntype BandContext = Pick<EvalContext, 'row' | 'rows' | 'allRows' | 'rowNumber' | 'reportName' | 'params' | 'root'>;\n\n/** The slice of a table rendered inside one band instance (tables can span pages). */\nexport interface PlacedTable {\n rows: Row[];\n rowHeights: number[];\n /** Index of rows[0] within the full table (for striping and RowNumber). */\n startIndex: number;\n header: boolean;\n headerHeight: number;\n footer: boolean;\n footerHeight: number;\n}\n\nexport interface PlacedElement {\n el: ReportElement;\n top: number;\n height: number;\n table?: PlacedTable;\n}\n\nexport interface PlacedBand {\n band: Band;\n top: number;\n /** Actual height of this band instance (>= band.height when fields grew). */\n height: number;\n items: PlacedElement[];\n ctx: BandContext;\n}\n\nexport interface RenderedPage {\n index: number;\n bands: PlacedBand[];\n rows: Row[];\n /** Set for continuous (receipt) pages: the actual page height. */\n height?: number;\n}\n\nconst measureCtx = (ctx: BandContext): EvalContext => ({ ...ctx, pageRows: [], pageNumber: 1, totalPages: 1 });\n\n/** Sizes one band instance: grows fields to fit their text and pushes elements below them down. */\nfunction layoutBand(band: Band, ctx: BandContext, grow: boolean): { height: number; items: PlacedElement[] } {\n const growth = new Map<string, number>();\n if (grow) {\n const evalCtx = measureCtx(ctx);\n for (const el of band.elements) {\n if (!canGrow(el)) continue;\n const needed = measureTextHeight(renderTemplate(el.text, evalCtx, el.format), el);\n if (needed > el.h) growth.set(el.id, needed - el.h);\n }\n // Cells of one row (same top and height, e.g. table columns in Detail) grow together,\n // so every box in the row ends up as tall as its tallest cell.\n const rows = new Map<string, typeof band.elements>();\n for (const el of band.elements) {\n if (el.kind === 'line') continue;\n const key = `${el.y}|${el.h}`;\n rows.set(key, [...(rows.get(key) ?? []), el]);\n }\n for (const row of rows.values()) {\n if (row.length < 2) continue;\n const max = Math.max(0, ...row.map((e) => growth.get(e.id) ?? 0));\n if (max > 0) for (const e of row) growth.set(e.id, max);\n }\n }\n if (!growth.size) return { height: band.height, items: band.elements.map((el) => ({ el, top: el.y, height: el.h })) };\n\n const grown = band.elements.filter((g) => growth.has(g.id));\n let height = band.height;\n const items = band.elements.map((el) => {\n // Shift by the largest growth of any growing element that sits entirely above this one.\n const shift = Math.max(0, ...grown.filter((g) => g !== el && el.y >= g.y + g.h).map((g) => growth.get(g.id)!));\n const item = { el, top: el.y + shift, height: el.h + (growth.get(el.id) ?? 0) };\n height = Math.max(height, item.top + item.height + Math.max(0, band.height - (el.y + el.h)));\n return item;\n });\n return { height, items };\n}\n\n/** Height of one table row: the fixed row height, or more if a cell's text needs it. */\nfunction tableRowHeight(table: ReportElement, widths: number[], base: number, texts: string[], ctx: EvalContext, header = false): number {\n if (table.canGrow === false) return base;\n const cols = table.table!.columns;\n let h = base;\n texts.forEach((tpl, i) => {\n if (!tpl) return;\n const text = renderTemplate(tpl, ctx, header ? { kind: 'none', decimals: 0, currency: '' } : cols[i].format);\n const probe: ReportElement = { ...table, w: widths[i], style: tableCellStyle(table, header) };\n h = Math.max(h, measureTextHeight(text, probe));\n });\n return h;\n}\n\nfunction compare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nfunction sortRows(r: ReportDefinition, rows: Row[]): Row[] {\n const keys = [\n ...r.groups.filter((g) => g.field).map((g) => ({ field: g.field, dir: g.direction })),\n ...r.sort.filter((s) => s.field).map((s) => ({ field: s.field, dir: s.direction })),\n ];\n if (!keys.length) return rows;\n return [...rows].sort((a, b) => {\n for (const k of keys) {\n const c = compare(getPath(a, k.field), getPath(b, k.field));\n if (c) return k.dir === 'desc' ? -c : c;\n }\n return 0;\n });\n}\n\n/**\n * Lays out bands onto pages. Text is evaluated later (needs TotalPages).\n * `params` are the report parameter values (also used by the report filter).\n */\nexport function paginate(report: ReportDefinition, inputRows: Row[], params: ParamValues = {}, root?: unknown): RenderedPage[] {\n const visible = (t: BandType, gid?: string) =>\n report.bands.find((b) => b.type === t && b.visible && (gid === undefined || b.groupId === gid));\n const { page } = report;\n const pageHeader = visible('pageHeader');\n const pageFooter = visible('pageFooter');\n const reportHeader = visible('reportHeader');\n const detail = visible('detail');\n // A receipt roll never breaks: the page simply gets as long as the content.\n const bodyBottom = page.continuous ? Infinity : page.height - page.marginBottom - (pageFooter?.height ?? 0);\n const rows = sortRows(report, filterRows(report, inputRows, params));\n const base = { allRows: rows, reportName: report.name, params, root };\n\n const pages: RenderedPage[] = [];\n let cur!: RenderedPage;\n let y = 0;\n let contentStart = 0;\n let rowNumber = 0;\n\n const startPage = () => {\n cur = { index: pages.length, bands: [], rows: [] };\n pages.push(cur);\n y = page.marginTop;\n // Report Header comes first on page 1, above the Page Header.\n if (pages.length === 1 && reportHeader) {\n placeFlow(reportHeader, { ...base, row: rows[0], rows, rowNumber: 0 }, false);\n // A table in the Report Header spilled onto later pages; those pages already have their Page Header.\n if (pages.length > 1) return;\n }\n if (pageHeader && pageHeader.height > 0) {\n const ctx = { ...base, row: undefined, rows: [], rowNumber };\n cur.bands.push({ band: pageHeader, top: y, ctx, ...layoutBand(pageHeader, ctx, false) });\n y += pageHeader.height;\n }\n contentStart = y;\n };\n\n /** Places a band; `canBreak` = may move to a new page when it doesn't fit. */\n function placeFlow(band: Band, ctx: BandContext, canBreak: boolean, keepWith = 0, pageRow?: Row) {\n if (band.height <= 0) return;\n const table = band.elements.find((e) => (e.kind === 'table' && e.table) || (e.kind === 'crosstab' && e.crosstab));\n if (table) return placeTable(band, table, ctx, canBreak);\n const layout = layoutBand(band, ctx, true);\n if (canBreak && y + layout.height + keepWith > bodyBottom && y > contentStart) startPage();\n cur.bands.push({ band, top: y, ctx, ...layout });\n y += layout.height;\n if (pageRow) cur.rows.push(pageRow);\n }\n\n const place = (band: Band | undefined, ctx: BandContext, keepWith = 0, pageRow?: Row) => {\n if (band) placeFlow(band, ctx, true, keepWith, pageRow);\n };\n\n /**\n * A band holding a table: elements above the table go in the first slice, rows flow across\n * as many pages as needed (header repeated), the footer row and elements below go in the last slice.\n */\n function placeTable(band: Band, source: ReportElement, ctx: BandContext, canBreak: boolean) {\n const scope = band.type === 'detail' ? (ctx.row ? [ctx.row] : []) : ctx.rows;\n // A cross table is laid out as a table of pivoted, pre-formatted rows.\n const pivoted = source.kind === 'crosstab' ? crosstabAsTable(source, scope) : null;\n const table = pivoted ? pivoted.table : source;\n const t = table.table!;\n // Detail bands repeat per record, so a table there shows just that record.\n const data = pivoted ? pivoted.data : scope;\n const widths = columnWidths(table);\n const mctx = measureCtx(ctx);\n const rowHeights = data.map((row, i) =>\n tableRowHeight(table, widths, t.rowHeight, t.columns.map((c) => c.text), { ...mctx, row, rowNumber: i + 1 }),\n );\n const headerH = t.showHeader ? tableRowHeight(table, widths, t.headerHeight, t.columns.map((c) => c.header), mctx, true) : 0;\n const footerH = t.showFooter\n ? tableRowHeight(table, widths, t.rowHeight, t.columns.map((c) => c.footer), { ...mctx, rows: data, row: data[data.length - 1] })\n : 0;\n\n const tableBottom = table.y + table.h;\n const aboveEls = band.elements.filter((e) => e.id !== table.id && e.y < tableBottom);\n const belowEls = band.elements.filter((e) => e.id !== table.id && e.y >= tableBottom);\n const tail = Math.max(0, band.height - tableBottom);\n\n const firstNeed = table.y + headerH + (rowHeights[0] ?? footerH);\n if (canBreak && y + firstNeed > bodyBottom && y > contentStart) startPage();\n\n let i = 0;\n let first = true;\n let footerDone = !t.showFooter;\n for (;;) {\n const sliceTop = y;\n const items: PlacedElement[] = [];\n let cy = 0;\n if (first) {\n items.push(...aboveEls.map((el) => ({ el, top: el.y, height: el.h })));\n cy = table.y;\n }\n const tableTop = cy;\n const header = headerH > 0 && (first || t.repeatHeader);\n if (header) cy += headerH;\n const start = i;\n while (i < data.length && (i === start || sliceTop + cy + rowHeights[i] <= bodyBottom)) cy += rowHeights[i++];\n\n let footer = false;\n if (i >= data.length && !footerDone && (i === start || sliceTop + cy + footerH <= bodyBottom)) {\n footer = footerDone = true;\n cy += footerH;\n }\n items.push({\n el: table,\n top: tableTop,\n height: cy - tableTop,\n table: { rows: data.slice(start, i), rowHeights: rowHeights.slice(start, i), startIndex: start, header, headerHeight: headerH, footer, footerHeight: footerH },\n });\n\n const complete = i >= data.length && footerDone;\n let height = first ? Math.max(cy, ...aboveEls.map((e) => e.y + e.h)) : cy;\n const tailHere = complete && sliceTop + Math.max(height, cy + tail) <= bodyBottom;\n if (tailHere) {\n items.push(...belowEls.map((el) => ({ el, top: cy + el.y - tableBottom, height: el.h })));\n height = Math.max(height, cy + tail);\n }\n cur.bands.push({ band, top: sliceTop, height, ctx, items });\n y = sliceTop + height;\n\n if (complete) {\n if (!tailHere && tail > 0) {\n startPage();\n cur.bands.push({ band, top: y, height: tail, ctx, items: belowEls.map((el) => ({ el, top: el.y - tableBottom, height: el.h })) });\n y += tail;\n }\n cur.rows.push(...data);\n return;\n }\n cur.rows.push(...data.slice(start, i));\n startPage();\n first = false;\n }\n }\n\n const emit = (level: number, groupRows: Row[]) => {\n if (level >= report.groups.length) {\n for (const row of groupRows) {\n rowNumber++;\n place(detail, { ...base, row, rows: groupRows, rowNumber }, 0, row);\n }\n return;\n }\n const g = report.groups[level];\n const parts: Row[][] = [];\n let lastKey: unknown = Symbol();\n for (const row of groupRows) {\n const key = String(getPath(row, g.field) ?? '');\n if (key !== lastKey) {\n parts.push([]);\n lastKey = key;\n }\n parts[parts.length - 1].push(row);\n }\n for (const part of parts) {\n place(visible('groupHeader', g.id), { ...base, row: part[0], rows: part, rowNumber }, detail?.height ?? 0);\n emit(level + 1, part);\n place(visible('groupFooter', g.id), { ...base, row: part[part.length - 1], rows: part, rowNumber });\n }\n };\n\n startPage();\n emit(0, rows);\n place(visible('reportFooter'), { ...base, row: rows[rows.length - 1], rows, rowNumber });\n\n const footerH = pageFooter && pageFooter.height > 0 ? pageFooter.height : 0;\n if (page.continuous) {\n // Footer right after the content; the page ends at the bottom margin.\n if (footerH) {\n const ctx = { ...base, row: undefined, rows: [], rowNumber };\n cur.bands.push({ band: pageFooter!, top: y, ctx, ...layoutBand(pageFooter!, ctx, false) });\n }\n cur.height = Math.ceil(y + footerH + page.marginBottom);\n return pages;\n }\n if (footerH) {\n const ctx = { ...base, row: undefined, rows: [], rowNumber };\n const layout = layoutBand(pageFooter!, ctx, false);\n for (const p of pages) {\n p.bands.push({ band: pageFooter!, top: page.height - page.marginBottom - footerH, ctx, ...layout });\n }\n }\n return pages;\n}\n\nexport function contextFor(placed: PlacedBand, page: RenderedPage, totalPages: number): EvalContext {\n const pageScoped = placed.band.type === 'pageHeader' || placed.band.type === 'pageFooter';\n return {\n ...placed.ctx,\n row: pageScoped ? page.rows[0] : placed.ctx.row,\n rows: pageScoped ? page.rows : placed.ctx.rows,\n pageRows: page.rows,\n pageNumber: page.index + 1,\n totalPages,\n };\n}\n","import type { ElementStyle, ReportDefinition, ReportElement } from '../../model/types';\nimport { defaultBackground, defaultWatermark } from '../../model/defaults';\nimport { contextFor, paginate, type PlacedElement } from '../../engine/renderer';\nimport { evaluate, getPath, renderTemplate, truthy, type EvalContext, type Row } from '../../engine/expressions';\nimport type { TableRenderData } from '../../engine/table';\nimport type { ParamValues } from '../../engine/parameters';\n\nexport interface ViewItem {\n /** Unique within the document: page:band:element. Used for find highlights. */\n key: string;\n el: ReportElement;\n rows?: Row[];\n top: number;\n height: number;\n content: string;\n tableData?: TableRenderData;\n /** Plain text of the item (content or table cells), for Find. */\n text: string;\n}\n\nexport interface ViewBand {\n top: number;\n height: number;\n items: ViewItem[];\n}\n\nexport interface ViewPage {\n index: number;\n height: number;\n background: boolean;\n watermark: boolean;\n bands: ViewBand[];\n}\n\n/** Group headers as a navigable tree. */\nexport interface Bookmark {\n label: string;\n page: number;\n top: number;\n children: Bookmark[];\n}\n\nexport interface ViewDocument {\n pages: ViewPage[];\n bookmarks: Bookmark[];\n rowCount: number;\n watermarkText: string;\n}\n\nconst NO_FORMAT = { kind: 'none', decimals: 0, currency: '' } as const;\n\n/** Condition check that treats an invalid expression as \"true\" (never hides content by accident). */\nfunction holds(expr: string | undefined, ctx: EvalContext): boolean {\n if (!expr?.trim()) return true;\n try {\n return truthy(evaluate(expr, ctx));\n } catch {\n return true;\n }\n}\n\n/** Evaluates the visible slice of a table into cell strings. */\nfunction tableData(item: PlacedElement, ctx: EvalContext): TableRenderData | undefined {\n const p = item.table;\n const t = item.el.table;\n if (!p || !t) return undefined;\n const all = ctx.rows;\n return {\n header: p.header ? t.columns.map((c) => renderTemplate(c.header, ctx, NO_FORMAT)) : null,\n headerHeight: p.headerHeight,\n rows: p.rows.map((row, i) => {\n const rctx = { ...ctx, row, rowNumber: p.startIndex + i + 1 };\n return { cells: t.columns.map((c) => renderTemplate(c.text, rctx, c.format)), height: p.rowHeights[i], index: p.startIndex + i };\n }),\n footer: p.footer ? t.columns.map((c) => renderTemplate(c.footer, { ...ctx, rows: all, row: all[all.length - 1] }, c.format)) : null,\n footerHeight: p.footerHeight,\n };\n}\n\nfunction evaluateItem(key: string, it: PlacedElement, ctx: EvalContext, lastValue: Map<string, string>): ViewItem {\n let el: ReportElement = it.el;\n let content = ['line', 'rect', 'table', 'chart'].includes(el.kind) ? '' : renderTemplate(el.text, ctx, el.format);\n\n const opts = el.fieldOptions;\n if (opts && (el.kind === 'text' || el.kind === 'field')) {\n if (!content.trim() && opts.nullText) content = renderTemplate(opts.nullText, ctx, el.format);\n if (opts.hideDuplicates) {\n if (lastValue.get(el.id) === content) content = '';\n else lastValue.set(el.id, content);\n }\n const rule = opts.rules.find((r) => r.when.trim() && holds(r.when, ctx));\n if (rule) {\n const style: Partial<ElementStyle> = { color: rule.color };\n if (rule.background) style.background = rule.background;\n if (rule.bold) style.bold = true;\n el = { ...el, style: { ...el.style, ...style } };\n }\n }\n // Chart titles may contain fields, e.g. \"Sales in {Country}\".\n if (el.chart) el = { ...el, chart: { ...el.chart, title: renderTemplate(el.chart.title, ctx, NO_FORMAT) } };\n\n const td = tableData(it, ctx);\n const text =\n el.kind === 'barcode' || el.kind === 'qrcode' || el.kind === 'image'\n ? ''\n : td\n ? [...(td.header ?? []), ...td.rows.flatMap((r) => r.cells), ...(td.footer ?? [])].join(' ')\n : el.chart?.title ?? content;\n return { key, el, rows: el.kind === 'chart' ? ctx.rows : undefined, top: it.top, height: it.height, content, tableData: td, text };\n}\n\n/** Lays out and evaluates the whole report into ready-to-draw pages, plus group bookmarks. */\nexport function buildDocument(report: ReportDefinition, rows: Row[], params: ParamValues, root: unknown): ViewDocument {\n const layout = paginate(report, rows, params, root);\n const wm = { ...defaultWatermark(), ...report.watermark };\n const bg = { ...defaultBackground(), ...report.background };\n\n const pages: ViewPage[] = layout.map((pg) => {\n const lastValue = new Map<string, string>(); // hide-duplicates state, per page\n return {\n index: pg.index,\n height: pg.height ?? report.page.height,\n background: bg.enabled && !!bg.image && (bg.pages === 'all' || pg.index === 0),\n watermark: wm.enabled && (wm.kind === 'image' ? !!wm.image : !!wm.text) && (wm.pages === 'all' || pg.index === 0),\n bands: pg.bands.map((pb, bi) => {\n const ctx = contextFor(pb, pg, layout.length);\n return {\n top: pb.top,\n height: pb.height,\n items: pb.items\n .filter((it) => holds(it.el.visibleWhen, ctx))\n .map((it) => evaluateItem(`${pg.index}:${bi}:${it.el.id}`, it, ctx, lastValue)),\n };\n }),\n };\n });\n\n // Bookmarks: one per group header, nested by group level.\n const bookmarks: Bookmark[] = [];\n const stack: Bookmark[] = [];\n for (const pg of layout) {\n for (const pb of pg.bands) {\n if (pb.band.type !== 'groupHeader' || !pb.band.groupId) continue;\n const level = report.groups.findIndex((g) => g.id === pb.band.groupId);\n if (level < 0) continue;\n const g = report.groups[level];\n const bm: Bookmark = { label: String(getPath(pb.ctx.row, g.field) ?? '(blank)'), page: pg.index, top: pb.top, children: [] };\n stack.length = level;\n (level > 0 && stack[level - 1] ? stack[level - 1].children : bookmarks).push(bm);\n stack[level] = bm;\n }\n }\n\n const ctx: EvalContext = { row: undefined, rows: [], allRows: [], pageRows: [], rowNumber: 0, pageNumber: 1, totalPages: 1, reportName: report.name, params, root };\n return {\n pages,\n bookmarks,\n rowCount: layout.reduce((n, p) => n + p.rows.length, 0),\n watermarkText: renderTemplate(wm.text, ctx, NO_FORMAT),\n };\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { PageBackground, PageSettings, Watermark } from '../../model/types';\nimport { contentWidth } from '../../model/defaults';\nimport { ElementBoxComponent } from '../designer/element-box.component';\nimport { SafeImagePipe } from '../designer/safe-image.pipe';\nimport type { ViewPage } from './render';\n\nconst FIT = { cover: 'cover', contain: 'contain', stretch: 'fill', center: 'none' } as const;\n\n/** One printed page: background, watermark, bands and their elements. */\n@Component({\n selector: 'rpt-page-view',\n standalone: true,\n imports: [NgTemplateOutlet, ElementBoxComponent, SafeImagePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let p = settings();\n <div class=\"rpt-page\" [class.roll]=\"p.continuous\" [style.width.px]=\"p.width\" [style.height.px]=\"page().height\">\n @if (page().background) {\n <img class=\"rpt-bg\" alt=\"\" [src]=\"background().image | safeImage\" [style.object-fit]=\"fit()\" />\n }\n @if (page().watermark && watermark().layer === 'behind') {\n <ng-container *ngTemplateOutlet=\"wm\" />\n }\n @for (b of page().bands; track $index) {\n <div style=\"position: absolute\" [style.left.px]=\"p.marginLeft\" [style.top.px]=\"b.top\" [style.width.px]=\"contentWidth()\" [style.height.px]=\"b.height\">\n @for (it of b.items; track it.key) {\n <rpt-element\n [el]=\"it.el\"\n [top]=\"it.top\"\n [height]=\"it.height\"\n [content]=\"it.content\"\n [tableData]=\"it.tableData\"\n [rows]=\"it.rows\"\n [attr.data-key]=\"it.key\"\n [class.find-hit]=\"highlights().has(it.key)\"\n [class.find-active]=\"active() === it.key\"\n />\n }\n </div>\n }\n @if (page().watermark && watermark().layer === 'front') {\n <ng-container *ngTemplateOutlet=\"wm\" />\n }\n </div>\n\n <ng-template #wm>\n @let w = watermark();\n <div class=\"rpt-watermark\" [style.opacity]=\"w.opacity\">\n @if (w.kind === 'image') {\n <img alt=\"\" [src]=\"w.image | safeImage\" [style.width.%]=\"w.imageScale\" [style.transform]=\"'rotate(' + w.angle + 'deg)'\" />\n } @else {\n <span [style.font-size.px]=\"w.fontSize\" [style.color]=\"w.color\" [style.font-weight]=\"w.bold ? 700 : 400\" [style.transform]=\"'rotate(' + w.angle + 'deg)'\">{{\n watermarkText()\n }}</span>\n }\n </div>\n </ng-template>\n `,\n})\nexport class PageViewComponent {\n readonly page = input.required<ViewPage>();\n readonly settings = input.required<PageSettings>();\n readonly watermark = input.required<Watermark>();\n readonly background = input.required<PageBackground>();\n readonly watermarkText = input('');\n readonly highlights = input<ReadonlySet<string>>(new Set());\n readonly active = input<string | null>(null);\n\n protected readonly contentWidth = computed(() => contentWidth(this.settings()));\n protected readonly fit = computed(() => FIT[this.background().fit]);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterNextRender,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { ReportParameter } from '../../model/types';\nimport { defaultBackground, defaultWatermark } from '../../model/defaults';\nimport { filterRows, paramChoices } from '../../engine/parameters';\nimport { DesignerStore } from '../designer.store';\nimport { buildDocument, type Bookmark } from './render';\nimport { PageViewComponent } from './page-view.component';\n\ntype ViewMode = 'continuous' | 'single' | 'two';\ntype ZoomMode = 'width' | 'page' | number;\nconst ZOOM_STEPS = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3];\n\n/**\n * Report viewer: paged view with navigation, zoom, view modes, find, bookmarks, thumbnails,\n * parameters, print and export. Used standalone (/viewer) and as the designer's preview.\n */\n@Component({\n selector: 'rpt-viewer',\n standalone: true,\n imports: [FormsModule, NgTemplateOutlet, PageViewComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"viewer\" [class.embedded]=\"embedded()\" #root>\n <!-- Toolbar -->\n <div class=\"viewer-toolbar\">\n <button class=\"vt\" [class.on]=\"sidebar()\" title=\"Bookmarks & pages\" (click)=\"sidebar.set(!sidebar())\">☰</button>\n <button class=\"vt\" title=\"Reload data\" (click)=\"store.reloadData()\">⟳</button>\n <span class=\"vsep\"></span>\n <button class=\"vt\" title=\"Print (Ctrl+P)\" (click)=\"print()\">🖨 Print</button>\n <select class=\"vt-select\" title=\"Save / export\" [ngModel]=\"''\" (ngModelChange)=\"save($event)\">\n <option value=\"\" disabled>💾 Save as…</option>\n <option value=\"pdf\">PDF (print dialog → Save as PDF)</option>\n <option value=\"html\">HTML document</option>\n <option value=\"csv\">Data — CSV (Excel)</option>\n <option value=\"json\">Report file (.report.json)</option>\n </select>\n <span class=\"vsep\"></span>\n <button class=\"vt\" title=\"First page (Home)\" [disabled]=\"current() === 0\" (click)=\"goTo(0)\">⏮</button>\n <button class=\"vt\" title=\"Previous page (PgUp)\" [disabled]=\"current() === 0\" (click)=\"goTo(current() - 1)\">◀</button>\n <input class=\"vt-page\" type=\"number\" min=\"1\" [max]=\"pageCount()\" [ngModel]=\"current() + 1\" (change)=\"goTo(+$any($event.target).value - 1)\" />\n <span class=\"muted\">/ {{ pageCount() }}</span>\n <button class=\"vt\" title=\"Next page (PgDn)\" [disabled]=\"current() >= pageCount() - 1\" (click)=\"goTo(current() + 1)\">▶</button>\n <button class=\"vt\" title=\"Last page (End)\" [disabled]=\"current() >= pageCount() - 1\" (click)=\"goTo(pageCount() - 1)\">⏭</button>\n <span class=\"vsep\"></span>\n <button class=\"vt\" title=\"Zoom out\" (click)=\"zoomStep(-1)\">−</button>\n <select class=\"vt-select\" title=\"Zoom\" [ngModel]=\"zoomKey()\" (ngModelChange)=\"setZoom($event)\">\n <option value=\"width\">Page width</option>\n <option value=\"page\">Whole page</option>\n @for (z of zoomSteps; track z) {\n <option [value]=\"'' + z\">{{ z * 100 }}%</option>\n }\n @if (zoomKey() === 'custom') {\n <option value=\"custom\">{{ (zoom() * 100).toFixed(0) }}%</option>\n }\n </select>\n <button class=\"vt\" title=\"Zoom in\" (click)=\"zoomStep(1)\">+</button>\n <select class=\"vt-select\" title=\"View mode\" [ngModel]=\"mode()\" (ngModelChange)=\"setMode($event)\">\n <option value=\"continuous\">Continuous</option>\n <option value=\"single\">Single page</option>\n <option value=\"two\">Two pages</option>\n </select>\n <span class=\"vsep\"></span>\n <button class=\"vt\" [class.on]=\"findOpen()\" title=\"Find (Ctrl+F)\" (click)=\"toggleFind()\">🔍</button>\n @if (parameters().length) {\n <button class=\"vt\" [class.on]=\"paramsOpen()\" title=\"Parameters\" (click)=\"paramsOpen.set(!paramsOpen())\">⚙ Parameters</button>\n }\n <button class=\"vt\" title=\"Full screen\" (click)=\"fullscreen()\">⛶</button>\n <span class=\"spacer\"></span>\n <strong class=\"viewer-title\">{{ store.report().name }}</strong>\n <span class=\"spacer\"></span>\n @if (embedded()) {\n <button class=\"primary\" (click)=\"closed.emit()\">Close</button>\n } @else {\n @if (allowOpen()) {\n <button class=\"vt\" title=\"Open a .report.json file\" (click)=\"file.click()\">📂 Open</button>\n <input #file type=\"file\" accept=\".json,application/json\" hidden (change)=\"openFile($event)\" />\n }\n @if (designerUrl()) {\n <a class=\"vt\" [href]=\"designerUrl()\" title=\"Back to the designer\">✎ Designer</a>\n }\n }\n </div>\n\n <!-- Parameters -->\n @if (paramsOpen() && parameters().length) {\n <form class=\"param-bar\" (submit)=\"$event.preventDefault(); applyParams()\">\n @for (p of parameters(); track p.name) {\n <label>\n <span>{{ p.label || p.name }}</span>\n @if (choices(p).length) {\n <select [name]=\"p.name\" [ngModel]=\"draft()[p.name]\" (ngModelChange)=\"setDraft(p.name, $event)\">\n @for (c of choices(p); track c) {\n <option [value]=\"c\">{{ c }}</option>\n }\n </select>\n } @else if (p.type === 'boolean') {\n <input type=\"checkbox\" [name]=\"p.name\" [ngModel]=\"draft()[p.name] === 'true'\" (ngModelChange)=\"setDraft(p.name, $event ? 'true' : 'false')\" />\n } @else {\n <input [type]=\"p.type === 'number' ? 'number' : p.type === 'date' ? 'date' : 'text'\" [name]=\"p.name\" [ngModel]=\"draft()[p.name]\" (ngModelChange)=\"setDraft(p.name, $event)\" />\n }\n </label>\n }\n <button class=\"primary\" type=\"submit\">Apply</button>\n </form>\n }\n\n <!-- Find -->\n @if (findOpen()) {\n <div class=\"find-bar\">\n <input #findBox placeholder=\"Find in report…\" [ngModel]=\"query()\" (ngModelChange)=\"setQuery($event)\" (keydown.enter)=\"findStep($any($event).shiftKey ? -1 : 1)\" (keydown.escape)=\"toggleFind()\" />\n <button class=\"vt\" title=\"Previous (Shift+Enter)\" [disabled]=\"!matches().length\" (click)=\"findStep(-1)\">▲</button>\n <button class=\"vt\" title=\"Next (Enter)\" [disabled]=\"!matches().length\" (click)=\"findStep(1)\">▼</button>\n <span class=\"muted\">\n @if (query().trim()) {\n {{ matches().length ? matchIndex() + 1 + ' of ' + matches().length : 'No matches' }}\n }\n </span>\n <button class=\"link\" (click)=\"toggleFind()\">✕</button>\n </div>\n }\n\n <div class=\"viewer-body\">\n <!-- Sidebar -->\n @if (sidebar()) {\n <aside class=\"viewer-sidebar\">\n <div class=\"tabs\">\n <button [class.on]=\"sideTab() === 'bookmarks'\" (click)=\"sideTab.set('bookmarks')\">Bookmarks</button>\n <button [class.on]=\"sideTab() === 'pages'\" (click)=\"sideTab.set('pages')\">Pages</button>\n </div>\n @if (sideTab() === 'bookmarks') {\n @if (doc().bookmarks.length) {\n <ul class=\"bm-tree\">\n <ng-container *ngTemplateOutlet=\"bmList; context: { $implicit: doc().bookmarks }\" />\n </ul>\n } @else {\n <p class=\"hint\">Bookmarks are made from groups. Add a group to the report to get a clickable outline here.</p>\n }\n } @else {\n <div class=\"thumbs\">\n @for (pg of doc().pages; track pg.index) {\n <button class=\"thumb\" [class.on]=\"pg.index === current()\" (click)=\"goTo(pg.index)\">\n <div class=\"thumb-page\" [style.zoom]=\"thumbScale()\">\n <rpt-page-view [page]=\"pg\" [settings]=\"settings()\" [watermark]=\"watermark()\" [background]=\"background()\" [watermarkText]=\"doc().watermarkText\" />\n </div>\n <span>{{ pg.index + 1 }}</span>\n </button>\n }\n </div>\n }\n </aside>\n }\n\n <!-- Pages -->\n <div class=\"viewer-scroll\" #scroll (scroll)=\"onScroll()\">\n @if (store.data().status === 'loading') {\n <div class=\"viewer-msg\">Loading data…</div>\n }\n @if (store.data().status === 'error') {\n <div class=\"viewer-msg error\">{{ store.data().error }}</div>\n }\n <div class=\"viewer-pages mode-{{ mode() }}\" [style.zoom]=\"zoom()\">\n @for (pg of shownPages(); track pg.index) {\n <rpt-page-view\n [attr.data-page]=\"pg.index\"\n [page]=\"pg\"\n [settings]=\"settings()\"\n [watermark]=\"watermark()\"\n [background]=\"background()\"\n [watermarkText]=\"doc().watermarkText\"\n [highlights]=\"highlightSet()\"\n [active]=\"activeKey()\"\n />\n }\n </div>\n </div>\n </div>\n\n <!-- Status bar -->\n <div class=\"viewer-status\">\n <span>Page {{ current() + 1 }} of {{ pageCount() }}</span>\n <span>{{ doc().rowCount }} rows</span>\n <span>{{ (zoom() * 100).toFixed(0) }}%</span>\n @if (store.data().status === 'loading') {\n <span>Loading…</span>\n }\n </div>\n </div>\n\n <ng-template #bmList let-items>\n @for (b of asBookmarks(items); track $index) {\n <li>\n <button class=\"bm\" (click)=\"goToBookmark(b)\">{{ b.label }} <span class=\"muted\">p{{ b.page + 1 }}</span></button>\n @if (b.children.length) {\n <ul>\n <ng-container *ngTemplateOutlet=\"bmList; context: { $implicit: b.children }\" />\n </ul>\n }\n </li>\n }\n </ng-template>\n `,\n})\nexport class ViewerComponent {\n protected readonly store = inject(DesignerStore);\n /** Inside the designer (shows Close) vs. the standalone /viewer page. */\n readonly embedded = input(false);\n /** Standalone viewer: shows a \"Designer\" link to this URL. */\n readonly designerUrl = input<string | null | undefined>(null);\n /** Standalone viewer: shows the Open button for local .report.json files. */\n readonly allowOpen = input(true);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly closed = output<void>();\n\n private readonly root = viewChild.required<ElementRef<HTMLElement>>('root');\n private readonly scroll = viewChild.required<ElementRef<HTMLElement>>('scroll');\n private readonly findBox = viewChild<ElementRef<HTMLInputElement>>('findBox');\n\n protected readonly zoomSteps = ZOOM_STEPS;\n protected readonly mode = signal<ViewMode>('continuous');\n protected readonly zoomMode = signal<ZoomMode>(1);\n protected readonly current = signal(0);\n protected readonly sidebar = signal(false);\n protected readonly sideTab = signal<'bookmarks' | 'pages'>('bookmarks');\n protected readonly findOpen = signal(false);\n protected readonly query = signal('');\n protected readonly matchIndex = signal(0);\n protected readonly paramsOpen = signal(true);\n private readonly viewport = signal({ w: 1000, h: 800 });\n\n protected readonly settings = computed(() => this.store.report().page);\n protected readonly watermark = computed(() => ({ ...defaultWatermark(), ...this.store.report().watermark }));\n protected readonly background = computed(() => ({ ...defaultBackground(), ...this.store.report().background }));\n protected readonly parameters = computed(() => (this.store.report().parameters ?? []).filter((p) => p.name));\n\n protected readonly doc = computed(() => buildDocument(this.store.report(), this.store.data().rows, this.store.params(), this.store.data().root));\n protected readonly pageCount = computed(() => this.doc().pages.length);\n protected readonly shownPages = computed(() => {\n const pages = this.doc().pages;\n return this.mode() === 'single' ? pages.slice(this.current(), this.current() + 1) : pages;\n });\n\n /** Effective zoom factor (fit modes depend on the viewport and the page size). */\n protected readonly zoom = computed(() => {\n const z = this.zoomMode();\n if (typeof z === 'number') return z;\n const { w, h } = this.viewport();\n const s = this.settings();\n const pageW = this.mode() === 'two' ? s.width * 2 + 24 : s.width;\n const fitW = (w - 48) / pageW;\n if (z === 'width') return Math.max(0.1, fitW);\n const pageH = this.doc().pages[this.current()]?.height ?? s.height;\n return Math.max(0.1, Math.min(fitW, (h - 48) / pageH));\n });\n protected readonly zoomKey = computed(() => {\n const z = this.zoomMode();\n return typeof z === 'number' ? (ZOOM_STEPS.includes(z) ? String(z) : 'custom') : z;\n });\n protected readonly thumbScale = computed(() => 150 / this.settings().width);\n\n // Find: every item whose text contains the query.\n protected readonly matches = computed(() => {\n const q = this.query().trim().toLowerCase();\n if (!q) return [] as { key: string; page: number }[];\n return this.doc().pages.flatMap((p) => p.bands.flatMap((b) => b.items.filter((it) => it.text.toLowerCase().includes(q)).map((it) => ({ key: it.key, page: p.index }))));\n });\n protected readonly highlightSet = computed<ReadonlySet<string>>(() => new Set(this.matches().map((m) => m.key)));\n protected readonly activeKey = computed(() => this.matches()[this.matchIndex()]?.key ?? null);\n\n // Parameters: edit a draft, apply to re-run the report.\n protected readonly draft = signal<Record<string, string>>(\n Object.fromEntries(Object.entries(this.store.params()).map(([k, v]) => [k, v == null ? '' : String(v)])),\n );\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n const el = this.scroll().nativeElement;\n const ro = new ResizeObserver(() => this.viewport.set({ w: el.clientWidth, h: el.clientHeight }));\n ro.observe(el);\n destroyRef.onDestroy(() => ro.disconnect());\n });\n }\n\n protected choices(p: ReportParameter): string[] {\n return paramChoices(p);\n }\n\n protected setDraft(name: string, value: unknown): void {\n this.draft.update((d) => ({ ...d, [name]: value == null ? '' : String(value) }));\n }\n\n protected applyParams(): void {\n this.store.paramInput.set({ ...this.draft() });\n this.current.set(0);\n }\n\n protected asBookmarks(v: unknown): Bookmark[] {\n return v as Bookmark[];\n }\n\n // --- Navigation -----------------------------------------------------------------------------\n\n protected goTo(index: number, top = 0): void {\n const i = Math.max(0, Math.min(this.pageCount() - 1, Math.round(index) || 0));\n this.current.set(i);\n if (this.mode() === 'single') {\n this.scroll().nativeElement.scrollTop = top * this.zoom();\n return;\n }\n const el = this.scroll().nativeElement.querySelector<HTMLElement>(`[data-page=\"${i}\"]`);\n if (!el) return;\n const box = this.scroll().nativeElement;\n box.scrollTop += el.getBoundingClientRect().top - box.getBoundingClientRect().top - 12 + top * this.zoom();\n }\n\n protected goToBookmark(b: Bookmark): void {\n this.goTo(b.page, b.top);\n }\n\n /** Continuous modes: the current page is the one at the top third of the viewport. */\n protected onScroll(): void {\n if (this.mode() === 'single') return;\n const box = this.scroll().nativeElement;\n const limit = box.getBoundingClientRect().top + box.clientHeight / 3;\n let cur = 0;\n box.querySelectorAll<HTMLElement>('[data-page]').forEach((el) => {\n if (el.getBoundingClientRect().top <= limit) cur = Number(el.dataset['page']);\n });\n if (cur !== this.current()) this.current.set(cur);\n }\n\n protected setMode(m: ViewMode): void {\n const page = this.current();\n this.mode.set(m);\n setTimeout(() => this.goTo(page));\n }\n\n // --- Zoom -----------------------------------------------------------------------------------\n\n protected setZoom(v: string): void {\n if (v === 'custom') return;\n this.zoomMode.set(v === 'width' || v === 'page' ? v : Number(v));\n }\n\n protected zoomStep(dir: 1 | -1): void {\n const z = this.zoom();\n const next = dir > 0 ? ZOOM_STEPS.find((s) => s > z + 0.001) : [...ZOOM_STEPS].reverse().find((s) => s < z - 0.001);\n if (next) this.zoomMode.set(next);\n }\n\n // --- Find -----------------------------------------------------------------------------------\n\n protected toggleFind(): void {\n this.findOpen.set(!this.findOpen());\n if (this.findOpen()) setTimeout(() => this.findBox()?.nativeElement.select());\n else this.query.set('');\n }\n\n protected setQuery(q: string): void {\n this.query.set(q);\n this.matchIndex.set(0);\n if (this.matches().length) this.revealMatch();\n }\n\n protected findStep(dir: 1 | -1): void {\n const n = this.matches().length;\n if (!n) return;\n this.matchIndex.set((this.matchIndex() + dir + n) % n);\n this.revealMatch();\n }\n\n private revealMatch(): void {\n const m = this.matches()[this.matchIndex()];\n if (!m) return;\n if (this.mode() === 'single') this.current.set(m.page);\n setTimeout(() => {\n const el = this.scroll().nativeElement.querySelector<HTMLElement>(`[data-key=\"${m.key}\"]`);\n el?.scrollIntoView({ block: 'center', inline: 'nearest' });\n this.onScroll();\n });\n }\n\n // --- Print & export -------------------------------------------------------------------------\n\n /** Runs `fn` with every page rendered at 100% (single-page mode would otherwise print one page). */\n private withAllPages(fn: () => void): void {\n const mode = this.mode();\n const zoom = this.zoomMode();\n this.mode.set('continuous');\n this.zoomMode.set(1);\n setTimeout(() => {\n try {\n fn();\n } finally {\n this.mode.set(mode);\n this.zoomMode.set(zoom);\n }\n }, 60);\n }\n\n protected print(): void {\n const s = this.settings();\n const height = s.continuous ? this.doc().pages[0]?.height ?? s.height : s.height;\n this.withAllPages(() => {\n // Print a copy of the pages placed directly under <body>, so the host page's layout\n // (scroll containers, overflow, positioning) can't clip or shift them.\n const root = document.createElement('div');\n root.className = 'myreport myreport-print-root';\n const pages = document.createElement('div');\n pages.className = 'viewer-pages';\n pages.innerHTML = this.scroll().nativeElement.querySelector('.viewer-pages')!.innerHTML;\n root.appendChild(pages);\n document.body.appendChild(root);\n const style = document.createElement('style');\n style.textContent = `@page { size: ${s.width}px ${height}px; margin: 0; }`;\n document.head.appendChild(style);\n document.documentElement.classList.add('myreport-printing');\n const cleanup = () => {\n document.documentElement.classList.remove('myreport-printing');\n style.remove();\n root.remove();\n window.removeEventListener('afterprint', cleanup);\n };\n window.addEventListener('afterprint', cleanup);\n // Cleanup runs on afterprint (print() may return before the dialog closes); leftovers are invisible on screen.\n window.print();\n });\n }\n\n protected save(kind: string): void {\n const name = this.store.report().name.replace(/[^\\w\\- ]+/g, '').trim() || 'report';\n if (kind === 'pdf') return this.print();\n if (kind === 'json') return download(`${name}.report.json`, JSON.stringify(this.store.report(), null, 2), 'application/json');\n if (kind === 'csv') return download(`${name}.csv`, '' + this.csv(), 'text/csv;charset=utf-8');\n if (kind === 'html') {\n this.withAllPages(() => {\n const pages = this.scroll().nativeElement.querySelector('.viewer-pages')!.innerHTML;\n const html = `<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>${escapeHtml(\n this.store.report().name,\n )}</title><style>${EXPORT_CSS}</style></head><body><div class=\"viewer-pages\">${pages}</div></body></html>`;\n download(`${name}.html`, html, 'text/html;charset=utf-8');\n });\n }\n }\n\n /** The report's data rows (after the report filter) as CSV. */\n private csv(): string {\n const rows = filterRows(this.store.report(), this.store.data().rows, this.store.params());\n const fields = this.store.data().fields.map((f) => f.name);\n const cell = (v: unknown) => {\n const s = v == null ? '' : typeof v === 'object' ? JSON.stringify(v) : String(v);\n return /[\",\\n\\r]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const get = (r: Record<string, unknown>, path: string) => path.split('.').reduce<unknown>((o, k) => (o == null ? o : (o as Record<string, unknown>)[k]), r);\n return [fields.map(cell).join(','), ...rows.map((r) => fields.map((f) => cell(get(r, f))).join(','))].join('\\r\\n');\n }\n\n protected fullscreen(): void {\n const el = this.root().nativeElement;\n if (document.fullscreenElement) document.exitFullscreen();\n else el.requestFullscreen?.();\n }\n\n protected async openFile(e: Event): Promise<void> {\n const inputEl = e.target as HTMLInputElement;\n const f = inputEl.files?.[0];\n inputEl.value = '';\n if (!f) return;\n try {\n const r = JSON.parse(await f.text());\n if (!r || r.version !== 1 || !Array.isArray(r.bands)) throw new Error('Not a report definition file');\n this.store.load(r);\n this.current.set(0);\n } catch (err) {\n alert('Could not open file: ' + (err as Error).message);\n }\n }\n\n // --- Keyboard -------------------------------------------------------------------------------\n\n @HostListener('window:keydown', ['$event'])\n protected onKey(e: KeyboardEvent): void {\n // Standalone viewers react only when focus is inside them (or nowhere), so a host page keeps its own shortcuts.\n const t = e.target as HTMLElement | null;\n if (!this.embedded() && t && t !== document.body && t !== document.documentElement && !this.host.nativeElement.contains(t)) return;\n const typing = t?.closest?.('input, textarea, select');\n const ctrl = e.ctrlKey || e.metaKey;\n if (ctrl && e.key.toLowerCase() === 'f') {\n e.preventDefault();\n if (!this.findOpen()) this.toggleFind();\n else this.findBox()?.nativeElement.select();\n } else if (ctrl && e.key.toLowerCase() === 'p') {\n e.preventDefault();\n this.print();\n } else if (typing) {\n return;\n } else if (e.key === 'PageDown') {\n e.preventDefault();\n this.goTo(this.current() + 1);\n } else if (e.key === 'PageUp') {\n e.preventDefault();\n this.goTo(this.current() - 1);\n } else if (e.key === 'Home' && ctrl) {\n this.goTo(0);\n } else if (e.key === 'End' && ctrl) {\n this.goTo(this.pageCount() - 1);\n } else if ((e.key === '+' || e.key === '=') && ctrl) {\n e.preventDefault();\n this.zoomStep(1);\n } else if (e.key === '-' && ctrl) {\n e.preventDefault();\n this.zoomStep(-1);\n } else if (e.key === 'Escape') {\n if (this.findOpen()) this.toggleFind();\n else if (this.embedded()) this.closed.emit();\n }\n }\n}\n\nfunction download(filename: string, content: string, type: string): void {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(new Blob([content], { type }));\n a.download = filename;\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 1000);\n}\n\nconst escapeHtml = (s: string) => s.replace(/[&<>\"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' })[c]!);\n\n/** Styles a saved HTML report needs (elements carry their own inline styles). */\nconst EXPORT_CSS = `\n*{box-sizing:border-box}body{margin:0;background:#e6e8eb;font-family:'Segoe UI',Arial,sans-serif}\n.viewer-pages{display:flex;flex-direction:column;align-items:center;gap:20px;padding:24px}\n.rpt-page{position:relative;background:#fff;box-shadow:0 2px 10px rgba(0,0,0,.25);overflow:hidden;flex-shrink:0;-webkit-print-color-adjust:exact;print-color-adjust:exact}\n.rpt-bg{position:absolute;inset:0;width:100%;height:100%;object-position:center}\n.rpt-watermark{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;overflow:hidden;z-index:5}\n.rpt-watermark span{white-space:nowrap;line-height:1}\nrpt-page-view{display:block}\n@media print{body{background:#fff}.viewer-pages{padding:0;gap:0;display:block}.rpt-page{box-shadow:none;break-after:page}.rpt-page:last-child{break-after:auto}}\n`;\n","import { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { addBandedTable, type BandedTableOptions } from '../../model/factories';\nimport { DesignerStore } from '../designer.store';\n\n/**\n * Header/Detail table wizard: titles go in a header band, one field per column in Detail.\n * Everything it creates is ordinary labels/fields, editable afterwards.\n */\n@Component({\n selector: 'rpt-banded-table-dialog',\n standalone: true,\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"modal-backdrop\" (pointerdown)=\"onBackdropDown($event)\">\n <div class=\"modal\">\n <header>\n <h2>Header / Detail table</h2>\n <button class=\"link\" (click)=\"closed.emit()\">✕</button>\n </header>\n <div class=\"modal-body\">\n @if (!fields().length) {\n <p class=\"error\">Load a data source first — the columns are made from its fields.</p>\n } @else {\n <div class=\"field\">\n Columns ({{ selectedCount() }} selected)\n <div class=\"wizard-fields\">\n @for (f of fields(); track f.name) {\n <label class=\"check\">\n <input type=\"checkbox\" [ngModel]=\"picked()[f.name]\" (ngModelChange)=\"toggle(f.name, $event)\" />\n {{ f.name }} <span class=\"muted\">({{ f.type }})</span>\n </label>\n }\n </div>\n <div class=\"inline\">\n <button class=\"small\" (click)=\"all(true)\">All</button>\n <button class=\"small\" (click)=\"all(false)\">None</button>\n </div>\n </div>\n <div class=\"grid2\">\n <label class=\"field\">\n Column titles in\n <select [(ngModel)]=\"titleBand\">\n <option value=\"pageHeader\">Page Header (every page)</option>\n <option value=\"reportHeader\">Report Header (first page)</option>\n @if (hasGroups()) {\n <option value=\"groupHeader\">Group Header (every group)</option>\n }\n </select>\n </label>\n <label class=\"field\">\n Row height\n <input type=\"number\" min=\"12\" [(ngModel)]=\"rowHeight\" />\n </label>\n <label class=\"field\">\n Title background\n <input type=\"color\" [(ngModel)]=\"headerBackground\" />\n </label>\n <label class=\"field\">\n Title text\n <input type=\"color\" [(ngModel)]=\"headerColor\" />\n </label>\n </div>\n <label class=\"check\"><input type=\"checkbox\" [(ngModel)]=\"grid\" /> Grid borders around cells</label>\n <label class=\"check\"><input type=\"checkbox\" [(ngModel)]=\"totals\" /> Totals of number columns in Report Footer</label>\n <label class=\"check\"><input type=\"checkbox\" [(ngModel)]=\"replace\" /> Replace what is in the title band and Detail band now</label>\n }\n </div>\n <footer>\n <button (click)=\"closed.emit()\">Cancel</button>\n <button class=\"primary\" [disabled]=\"!selectedCount()\" (click)=\"create()\">Create table</button>\n </footer>\n </div>\n </div>\n `,\n})\nexport class BandedTableDialogComponent {\n private readonly store = inject(DesignerStore);\n readonly closed = output<void>();\n\n protected readonly fields = computed(() => this.store.data().fields.filter((f) => f.type !== 'object'));\n protected readonly hasGroups = computed(() => this.store.report().groups.length > 0);\n protected readonly picked = signal<Record<string, boolean>>(\n Object.fromEntries(this.store.data().fields.filter((f) => f.type !== 'object').map((f, i) => [f.name, i < 8])),\n );\n protected readonly selectedCount = computed(() => this.fields().filter((f) => this.picked()[f.name]).length);\n\n protected titleBand: BandedTableOptions['titleBand'] = 'pageHeader';\n protected rowHeight = 22;\n protected headerBackground = '#1f3a68';\n protected headerColor = '#ffffff';\n protected grid = true;\n protected totals = true;\n protected replace = true;\n\n protected onBackdropDown(e: PointerEvent): void {\n if (e.target === e.currentTarget) this.closed.emit();\n }\n\n protected toggle(name: string, on: boolean): void {\n this.picked.update((p) => ({ ...p, [name]: on }));\n }\n\n protected all(on: boolean): void {\n this.picked.set(Object.fromEntries(this.fields().map((f) => [f.name, on])));\n }\n\n protected create(): void {\n const opts: BandedTableOptions = {\n fields: this.fields().filter((f) => this.picked()[f.name]),\n titleBand: this.titleBand,\n grid: this.grid,\n headerBackground: this.headerBackground,\n headerColor: this.headerColor,\n totals: this.totals,\n rowHeight: Math.max(12, Number(this.rowHeight) || 22),\n replace: this.replace,\n };\n let ids: string[] = [];\n this.store.update((r) => (ids = addBandedTable(r, opts)));\n const detail = this.store.report().bands.find((b) => b.type === 'detail');\n this.store.select({ elementIds: [], bandId: detail?.id ?? null });\n void ids;\n this.closed.emit();\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, computed, inject, input, output, signal, viewChild } from '@angular/core';\nimport { FUNCTIONS, SPECIAL_FIELDS, checkExpression, checkTemplate } from '../../engine/expressions';\nimport { DesignerStore } from '../designer.store';\n\ninterface Suggestion {\n label: string;\n insert: string;\n kind: 'field' | 'param' | 'fn' | 'special';\n detail: string;\n}\n\nconst KIND_ICON = { field: 'Ab', param: '@', fn: 'ƒ', special: '★' } as const;\nconst SIMPLE_NAME = /^[A-Za-z_À-￿][\\w.À-￿]*$/;\n\n/**\n * Text box for templates (\"Total: {sum(Amount)}\") or bare expressions (\"Amount > 100\") with\n * autocomplete of fields, @parameters, functions and special fields, plus live validation.\n * Template mode suggests inside {…}; expression mode suggests anywhere. Ctrl+Space opens the list.\n */\n@Component({\n selector: 'rpt-expr-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"expr-input\">\n @if (rows() > 1) {\n <textarea\n #box\n [rows]=\"rows()\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n spellcheck=\"false\"\n (input)=\"onInput()\"\n (keydown)=\"onKey($event)\"\n (click)=\"refresh()\"\n (blur)=\"open.set(false)\"\n ></textarea>\n } @else {\n <input\n #box\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n spellcheck=\"false\"\n (input)=\"onInput()\"\n (keydown)=\"onKey($event)\"\n (click)=\"refresh()\"\n (blur)=\"open.set(false)\"\n />\n }\n @if (open() && items().length) {\n <ul class=\"ac-list\" role=\"listbox\">\n @for (it of items(); track it.kind + it.label; let i = $index) {\n <li [class.active]=\"i === active()\" role=\"option\" (mousedown)=\"$event.preventDefault(); accept(it)\">\n <span class=\"ac-kind ac-{{ it.kind }}\">{{ icons[it.kind] }}</span>\n <b>{{ it.label }}</b>\n <span class=\"muted\">{{ it.detail }}</span>\n </li>\n }\n </ul>\n }\n @if (error()) {\n <div class=\"expr-error\">⚠ {{ error() }}</div>\n }\n </div>\n `,\n})\nexport class ExprInputComponent {\n private readonly store = inject(DesignerStore);\n readonly value = input('');\n readonly mode = input<'template' | 'expression'>('template');\n readonly rows = input(1);\n readonly placeholder = input('');\n readonly valueChange = output<string>();\n\n private readonly box = viewChild<ElementRef<HTMLInputElement | HTMLTextAreaElement>>('box');\n protected readonly icons = KIND_ICON;\n protected readonly open = signal(false);\n protected readonly active = signal(0);\n protected readonly items = signal<Suggestion[]>([]);\n /** The partial word being completed: [start, end) in the box. */\n private word = { start: 0, end: 0 };\n\n protected readonly error = computed(() => (this.mode() === 'template' ? checkTemplate(this.value()) : checkExpression(this.value())));\n\n private readonly all = computed<Suggestion[]>(() => [\n ...this.store.data().fields.map((f) => ({\n label: f.name,\n insert: SIMPLE_NAME.test(f.name) ? f.name : `[${f.name}]`,\n kind: 'field' as const,\n detail: f.type,\n })),\n ...(this.store.data().docFields ?? []).map((f) => ({ label: f.name, insert: f.name, kind: 'field' as const, detail: `document · ${f.type}` })),\n ...(this.store.report().parameters ?? [])\n .filter((p) => p.name)\n .map((p) => ({ label: '@' + p.name, insert: '@' + p.name, kind: 'param' as const, detail: `parameter · ${p.type}` })),\n ...FUNCTIONS.map((f) => ({ label: f.name + '()', insert: f.name, kind: 'fn' as const, detail: f.signature })),\n ...SPECIAL_FIELDS.map((s) => ({ label: s, insert: s, kind: 'special' as const, detail: 'special field' })),\n ]);\n\n protected onInput(): void {\n const el = this.box()?.nativeElement;\n if (!el) return;\n this.valueChange.emit(el.value);\n this.refresh();\n }\n\n /** Works out whether the caret is inside an expression and which word is being typed. */\n protected refresh(force = false): void {\n const el = this.box()?.nativeElement;\n if (!el) return;\n const pos = el.selectionStart ?? el.value.length;\n const before = el.value.slice(0, pos);\n let start = 0;\n if (this.mode() === 'template') {\n const openAt = before.lastIndexOf('{');\n if (openAt < 0 || before.lastIndexOf('}') > openAt) return this.open.set(false);\n start = openAt + 1;\n }\n const seg = before.slice(start);\n if ((seg.match(/\"/g) ?? []).length % 2 === 1 || (seg.match(/'/g) ?? []).length % 2 === 1) return this.open.set(false); // inside a string\n const word = /@?\\[?[\\w.À-￿]*$/.exec(seg)?.[0] ?? '';\n this.word = { start: pos - word.length, end: pos };\n\n const q = word.replace(/^[@[]/, '').toLowerCase();\n let pool = this.all();\n if (word.startsWith('@')) pool = pool.filter((s) => s.kind === 'param');\n const matches = q\n ? [...pool.filter((s) => s.label.replace(/^@/, '').toLowerCase().startsWith(q)), ...pool.filter((s) => !s.label.replace(/^@/, '').toLowerCase().startsWith(q) && s.label.toLowerCase().includes(q))]\n : pool;\n // Don't pop up for a finished word that exactly matches, unless asked.\n const exact = matches.length === 1 && matches[0].insert.toLowerCase() === word.toLowerCase();\n this.items.set(matches.slice(0, 40));\n this.active.set(0);\n this.open.set((force || word.length > 0 || /[{(,\\s+\\-*/<>=!?:&|]$/.test(before) || seg === '') && matches.length > 0 && !exact);\n }\n\n protected onKey(e: KeyboardEvent): void {\n // Typing \"}\" right before an auto-inserted \"}\" steps over it instead of doubling it.\n const el = this.box()?.nativeElement;\n if (e.key === '}' && el && el.selectionStart === el.selectionEnd && el.value[el.selectionStart ?? -1] === '}') {\n e.preventDefault();\n const p = (el.selectionStart ?? 0) + 1;\n el.setSelectionRange(p, p);\n this.open.set(false);\n return;\n }\n if (e.key === ' ' && e.ctrlKey) {\n e.preventDefault();\n this.refresh(true);\n return;\n }\n if (!this.open() || !this.items().length) return;\n const n = this.items().length;\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.active.set((this.active() + 1) % n);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.active.set((this.active() - 1 + n) % n);\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n this.accept(this.items()[this.active()]);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n this.open.set(false);\n }\n }\n\n /** Inserts the suggestion; functions get \"()\" with the caret inside, templates get a closing \"}\". */\n protected accept(s: Suggestion): void {\n const el = this.box()?.nativeElement;\n if (!el) return;\n const v = el.value;\n const after = v.slice(this.word.end);\n let insert = s.kind === 'fn' ? s.insert + '()' : s.insert;\n let caret = this.word.start + (s.kind === 'fn' ? s.insert.length + 1 : insert.length);\n if (this.mode() === 'template' && s.kind !== 'fn') {\n const nextClose = after.indexOf('}');\n const nextOpen = after.indexOf('{');\n // Close the expression, but keep the caret inside so the formula can continue (\"{Qty * …\").\n if (nextClose < 0 || (nextOpen >= 0 && nextOpen < nextClose)) insert += '}';\n }\n el.value = v.slice(0, this.word.start) + insert + after;\n el.setSelectionRange(caret, caret);\n el.focus();\n this.valueChange.emit(el.value);\n this.open.set(false);\n if (s.kind === 'fn') this.refresh(true); // suggest the argument\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ExprInputComponent } from './expr-input.component';\nimport type { FormatKind, HAlign, ReportElement, TableColumn, TableSpec } from '../../model/types';\nimport { columnWidths, createColumn, designTableHeight } from '../../engine/table';\nimport { DesignerStore, findElement } from '../designer.store';\n\nconst FORMAT_KINDS: FormatKind[] = ['none', 'number', 'currency', 'percent', 'date', 'datetime', 'time'];\ntype ColorKey = 'headerBackground' | 'stripeBackground' | 'gridColor' | 'headerColor';\n\n@Component({\n selector: 'rpt-table-props',\n standalone: true,\n imports: [FormsModule, ExprInputComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let t = spec();\n <section>\n <h4>Table</h4>\n <label class=\"check\">\n <input type=\"checkbox\" [ngModel]=\"t.showHeader\" (ngModelChange)=\"set(flag('showHeader', $event))\" /> Header row\n </label>\n <label class=\"check\">\n <input type=\"checkbox\" [ngModel]=\"t.repeatHeader\" (ngModelChange)=\"set(flag('repeatHeader', $event))\" /> Repeat header on each page\n </label>\n <label class=\"check\">\n <input type=\"checkbox\" [ngModel]=\"t.showFooter\" (ngModelChange)=\"set(flag('showFooter', $event))\" /> Footer (totals) row\n </label>\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Header h</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"8\" [ngModel]=\"t.headerHeight\" (ngModelChange)=\"height('headerHeight', $event)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Row h</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"8\" [ngModel]=\"t.rowHeight\" (ngModelChange)=\"height('rowHeight', $event)\" /></div>\n </label>\n </div>\n <div class=\"prop-row\"><span>Header fill</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"colorValue(t.headerBackground)\" (ngModelChange)=\"set(color('headerBackground', $event))\" />\n <button class=\"small\" [class.on]=\"t.headerBackground === 'transparent'\" (click)=\"set(color('headerBackground', 'transparent'))\">None</button>\n </div>\n </div>\n <div class=\"prop-row\"><span>Header text</span>\n <div class=\"prop-value\"><input type=\"color\" [ngModel]=\"t.headerColor\" (ngModelChange)=\"set(color('headerColor', $event))\" /></div>\n </div>\n <div class=\"prop-row\"><span>Row fill</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"colorValue(el().style.background)\" (ngModelChange)=\"set(rowFill($event))\" />\n <button class=\"small\" [class.on]=\"el().style.background === 'transparent'\" (click)=\"set(rowFill('transparent'))\">None</button>\n </div>\n </div>\n <div class=\"prop-row\"><span>Alt. row</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"colorValue(t.stripeBackground)\" (ngModelChange)=\"set(color('stripeBackground', $event))\" />\n <button class=\"small\" [class.on]=\"t.stripeBackground === 'transparent'\" (click)=\"set(color('stripeBackground', 'transparent'))\">None</button>\n </div>\n </div>\n <div class=\"prop-row\"><span>Grid lines</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"colorValue(t.gridColor)\" (ngModelChange)=\"set(color('gridColor', $event))\" />\n <button class=\"small\" [class.on]=\"t.gridColor === 'transparent'\" (click)=\"set(color('gridColor', 'transparent'))\">None</button>\n </div>\n </div>\n <p class=\"hint\">\n Lists the rows of its band: all rows in Report Header/Footer, the group's rows in Group bands. It continues onto new pages\n automatically. Drop a field on the table to add a column.\n </p>\n </section>\n\n <section>\n <h4>Columns</h4>\n @for (c of t.columns; track c.id; let i = $index, last = $last) {\n <div class=\"col-card\">\n <div class=\"col-head\">\n <strong>{{ i + 1 }}</strong>\n <span class=\"muted\">{{ widths()[i] }}px</span>\n <span class=\"spacer\"></span>\n <button class=\"small\" [disabled]=\"i === 0\" title=\"Move left\" (click)=\"moveColumn(i, -1)\">←</button>\n <button class=\"small\" [disabled]=\"last\" title=\"Move right\" (click)=\"moveColumn(i, 1)\">→</button>\n <button class=\"small danger\" title=\"Remove column\" (click)=\"removeColumn(i)\">✕</button>\n </div>\n <label class=\"prop-row\"><span>Header</span>\n <div class=\"prop-value\"><input [ngModel]=\"c.header\" (ngModelChange)=\"col(i, setHeader($event))\" /></div>\n </label>\n <label class=\"prop-row\"><span>Cell</span>\n <div class=\"prop-value\"><rpt-expr-input [value]=\"c.text\" placeholder=\"{Field}\" (valueChange)=\"col(i, setCell($event))\" /></div>\n </label>\n @if (t.showFooter) {\n <label class=\"prop-row\"><span>Footer</span>\n <div class=\"prop-value\"><rpt-expr-input [value]=\"c.footer\" placeholder=\"{sum(Amount)}\" (valueChange)=\"col(i, setFooter($event))\" /></div>\n </label>\n }\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Width</span>\n <div class=\"prop-value\">\n <input type=\"number\" min=\"0.1\" step=\"0.1\" [ngModel]=\"c.width\" (ngModelChange)=\"colWidth(i, $event)\" />\n </div>\n </label>\n <label class=\"prop-row\"><span>Align</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"c.align\" (ngModelChange)=\"col(i, setAlign($event))\">\n <option value=\"left\">Left</option>\n <option value=\"center\">Center</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n </label>\n </div>\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Format</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"c.format.kind\" (ngModelChange)=\"col(i, setFormat($event))\">\n @for (k of formatKinds; track k) {\n <option [value]=\"k\">{{ k }}</option>\n }\n </select>\n </div>\n </label>\n @if (c.format.kind === 'number' || c.format.kind === 'currency' || c.format.kind === 'percent') {\n <label class=\"prop-row\"><span>Decimals</span>\n <div class=\"prop-value\">\n <input type=\"number\" min=\"0\" [ngModel]=\"c.format.decimals\" (ngModelChange)=\"colDecimals(i, $event)\" />\n </div>\n </label>\n }\n </div>\n </div>\n }\n <button (click)=\"addColumn()\">+ Add column</button>\n </section>\n `,\n})\nexport class TablePropsComponent {\n private readonly store = inject(DesignerStore);\n readonly el = input.required<ReportElement>();\n\n protected readonly formatKinds = FORMAT_KINDS;\n protected readonly spec = computed(() => this.el().table!);\n protected readonly widths = computed(() => columnWidths(this.el()).map((w) => Math.round(w)));\n\n /** Edits the table and keeps the element height in sync with its header/row/footer heights. */\n protected set(fn: (t: TableSpec, e: ReportElement) => void): void {\n const id = this.el().id;\n this.store.update((r) => {\n const f = findElement(r, id);\n if (!f?.el.table) return;\n fn(f.el.table, f.el);\n f.el.h = designTableHeight(f.el.table);\n f.band.height = Math.max(f.band.height, f.el.y + f.el.h);\n });\n }\n\n protected col(i: number, fn: (c: TableColumn) => void): void {\n this.set((t) => t.columns[i] && fn(t.columns[i]));\n }\n\n protected colorValue(v: string): string {\n return !v || v === 'transparent' ? '#ffffff' : v;\n }\n\n protected flag = (k: 'showHeader' | 'repeatHeader' | 'showFooter', v: boolean) => (t: TableSpec) => (t[k] = v);\n protected color = (k: ColorKey, v: string) => (t: TableSpec) => (t[k] = v);\n protected rowFill = (v: string) => (_: TableSpec, e: ReportElement) => (e.style.background = v);\n protected setHeader = (v: string) => (c: TableColumn) => (c.header = v);\n protected setCell = (v: string) => (c: TableColumn) => (c.text = v);\n protected setFooter = (v: string) => (c: TableColumn) => (c.footer = v);\n protected setAlign = (v: HAlign) => (c: TableColumn) => (c.align = v);\n protected setFormat = (v: FormatKind) => (c: TableColumn) => (c.format.kind = v);\n\n protected height(k: 'headerHeight' | 'rowHeight', v: number | null): void {\n if (v != null && Number.isFinite(v)) this.set((t) => (t[k] = Math.max(8, v)));\n }\n\n protected colWidth(i: number, v: number | null): void {\n if (v != null && Number.isFinite(v)) this.col(i, (c) => (c.width = Math.max(0.1, v)));\n }\n\n protected colDecimals(i: number, v: number | null): void {\n if (v != null && Number.isFinite(v)) this.col(i, (c) => (c.format.decimals = Math.max(0, Math.min(10, v))));\n }\n\n protected moveColumn(i: number, d: number): void {\n this.set((t) => {\n const j = i + d;\n if (j < 0 || j >= t.columns.length) return;\n [t.columns[i], t.columns[j]] = [t.columns[j], t.columns[i]];\n });\n }\n\n protected removeColumn(i: number): void {\n this.set((t) => t.columns.splice(i, 1));\n }\n\n protected addColumn(): void {\n this.set((t) => t.columns.push(createColumn('')));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal } from '@angular/core';\nimport { SafeImagePipe } from '../designer/safe-image.pipe';\n\nconst MAX_BYTES = 5 * 1024 * 1024;\n\n/** Image source: a URL (may contain {Field}) or an uploaded file embedded as a base64 data URL. */\n@Component({\n selector: 'rpt-image-picker',\n standalone: true,\n imports: [SafeImagePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"image-picker\">\n @if (embedded()) {\n <div class=\"muted\">Embedded image · {{ size() }}</div>\n } @else {\n <input [value]=\"value()\" [placeholder]=\"placeholder()\" (input)=\"valueChange.emit($any($event.target).value)\" />\n }\n <div class=\"inline\">\n <button class=\"small\" (click)=\"file.click()\">Upload…</button>\n @if (value()) {\n <button class=\"small\" (click)=\"valueChange.emit('')\">Remove</button>\n }\n <input #file type=\"file\" accept=\"image/*\" hidden (change)=\"upload($event)\" />\n </div>\n @if (value() && !value().includes('{')) {\n <img class=\"thumb\" alt=\"\" [src]=\"value() | safeImage\" />\n }\n @if (message()) {\n <div class=\"error\">{{ message() }}</div>\n }\n </div>\n `,\n})\nexport class ImagePickerComponent {\n readonly value = input('');\n readonly placeholder = input('https://… or {Field}');\n readonly valueChange = output<string>();\n\n protected readonly message = signal('');\n protected readonly embedded = computed(() => this.value().startsWith('data:'));\n /** Approximate decoded size of the embedded image. */\n protected readonly size = computed(() => {\n const bytes = Math.round(((this.value().length - this.value().indexOf(',') - 1) * 3) / 4);\n return bytes < 1024 ? `${bytes} bytes` : `${(bytes / 1024).toFixed(bytes < 10240 ? 1 : 0)} KB`;\n });\n\n /** Reads the file as base64 (data URL) so the image travels inside the report file. */\n protected upload(e: Event): void {\n const inputEl = e.target as HTMLInputElement;\n const f = inputEl.files?.[0];\n inputEl.value = '';\n if (!f) return;\n if (!f.type.startsWith('image/')) return this.message.set('Please choose an image file.');\n if (f.size > MAX_BYTES) return this.message.set(`Image is ${(f.size / 1048576).toFixed(1)} MB; the limit is 5 MB.`);\n this.message.set('');\n const reader = new FileReader();\n reader.onload = () => this.valueChange.emit(String(reader.result));\n reader.onerror = () => this.message.set('Could not read the file.');\n reader.readAsDataURL(f);\n }\n}\n","import { ChangeDetectionStrategy, Component, Directive, computed, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { AggregateKind, ChartType, FormatKind, ReportElement } from '../../model/types';\nimport { MAX_SERIES } from '../../engine/chart';\nimport { DesignerStore, findElement } from '../designer.store';\n\nconst AGGREGATES: AggregateKind[] = ['sum', 'count', 'avg', 'min', 'max'];\nconst VALUE_FORMATS: FormatKind[] = ['none', 'number', 'currency', 'percent'];\n\n/** Base: edits one element in place by id (one undo step per change). */\n@Directive()\nabstract class SpecEditor {\n protected readonly store = inject(DesignerStore);\n readonly el = input.required<ReportElement>();\n protected readonly aggregates = AGGREGATES;\n protected readonly valueFormats = VALUE_FORMATS;\n\n protected edit(fn: (e: ReportElement) => void): void {\n const id = this.el().id;\n this.store.update((r) => {\n const f = findElement(r, id);\n if (f) fn(f.el);\n });\n }\n\n protected positive(v: number | null, fn: (n: number) => void): void {\n if (v != null && Number.isFinite(v)) fn(Math.max(0, v));\n }\n}\n\n@Component({\n selector: 'rpt-chart-props',\n standalone: true,\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let c = el().chart!;\n <section>\n <h4>Chart</h4>\n <div class=\"btn-group\">\n @for (t of types; track t.value) {\n <button [class.on]=\"c.type === t.value\" [title]=\"t.label\" (click)=\"edit(set('type', t.value))\">{{ t.icon }} {{ t.label }}</button>\n }\n </div>\n <label class=\"prop-row\"><span>Title</span>\n <div class=\"prop-value\"><input [ngModel]=\"c.title\" placeholder=\"e.g. Sales in {Country}\" (ngModelChange)=\"edit(set('title', $event))\" /></div>\n </label>\n <label class=\"prop-row\"><span>Category</span>\n <div class=\"prop-value\"><input list=\"field-names\" [ngModel]=\"c.categoryField\" placeholder=\"Field\" (ngModelChange)=\"edit(set('categoryField', $event))\" /></div>\n </label>\n <label class=\"prop-row\"><span>{{ pie() ? 'Value' : 'Values' }}</span>\n <div class=\"prop-value\">\n <input list=\"field-names\" [ngModel]=\"c.valueFields.join(', ')\" [placeholder]=\"pie() ? 'Field' : 'Field, Field…'\" (ngModelChange)=\"setValues($event)\" />\n </div>\n </label>\n <label class=\"prop-row\"><span>Aggregate</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"c.aggregate\" (ngModelChange)=\"edit(set('aggregate', $event))\">\n @for (a of aggregates; track a) { <option [value]=\"a\">{{ a }}</option> }\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Sort</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"c.sort\" (ngModelChange)=\"edit(set('sort', $event))\">\n <option value=\"none\">Data order</option>\n <option value=\"category\">By category</option>\n <option value=\"valueDesc\">Value, high → low</option>\n <option value=\"valueAsc\">Value, low → high</option>\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Max items</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"1\" [ngModel]=\"c.maxCategories\" (ngModelChange)=\"positive($event, setMax)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Value format</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"c.valueFormat.kind\" (ngModelChange)=\"edit(setFormat($event))\">\n @for (k of valueFormats; track k) { <option [value]=\"k\">{{ k }}</option> }\n </select>\n </div>\n </label>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"c.showLegend\" (ngModelChange)=\"edit(set('showLegend', $event))\" /> Legend</label>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"c.showValues\" (ngModelChange)=\"edit(set('showValues', $event))\" /> Value labels</label>\n @if (!pie()) {\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"c.showGrid\" (ngModelChange)=\"edit(set('showGrid', $event))\" /> Grid lines</label>\n }\n <p class=\"hint\">\n Charts the rows of its band: all rows in Report Header/Footer, the group's rows in a Group band.\n @if (pie()) { Pie slices beyond {{ maxSeries }} fold into \"Other\". } @else { Up to {{ maxSeries }} value fields (one colour each). }\n </p>\n </section>\n `,\n})\nexport class ChartPropsComponent extends SpecEditor {\n protected readonly maxSeries = MAX_SERIES;\n protected readonly types: { value: ChartType; label: string; icon: string }[] = [\n { value: 'bar', label: 'Bar', icon: '▮' },\n { value: 'hbar', label: 'H-bar', icon: '▬' },\n { value: 'line', label: 'Line', icon: '⟋' },\n { value: 'area', label: 'Area', icon: '◭' },\n { value: 'pie', label: 'Pie', icon: '◔' },\n { value: 'doughnut', label: 'Doughnut', icon: '◯' },\n ];\n protected readonly pie = computed(() => this.el().chart?.type === 'pie' || this.el().chart?.type === 'doughnut');\n protected set = <K extends keyof NonNullable<ReportElement['chart']>>(k: K, v: NonNullable<ReportElement['chart']>[K]) => (e: ReportElement) =>\n (e.chart![k] = v);\n protected setMax = (n: number) => this.edit((e) => (e.chart!.maxCategories = Math.max(1, Math.round(n))));\n protected setFormat = (k: FormatKind) => (e: ReportElement) => (e.chart!.valueFormat.kind = k);\n protected setValues(v: string): void {\n const fields = v.split(',').map((s) => s.trim()).filter(Boolean).slice(0, MAX_SERIES);\n this.edit((e) => (e.chart!.valueFields = fields));\n }\n}\n\n@Component({\n selector: 'rpt-barcode-props',\n standalone: true,\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let b = el().barcode!;\n <section>\n <h4>Barcode</h4>\n <label class=\"prop-row\"><span>Type</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"b.symbology\" (ngModelChange)=\"edit(setType($event))\">\n <option value=\"code128\">Code 128 (any text)</option>\n <option value=\"ean13\">EAN-13 (12–13 digits)</option>\n </select>\n </div>\n </label>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"b.showText\" (ngModelChange)=\"edit(setShowText($event))\" /> Show text under bars</label>\n <label class=\"prop-row\"><span>Bar color</span>\n <div class=\"prop-value\"><input type=\"color\" [ngModel]=\"b.color\" (ngModelChange)=\"edit(setColor($event))\" /></div>\n </label>\n <p class=\"hint\">Keep bars dark on a light background for reliable scanning. EAN-13 adds the check digit when you give 12 digits.</p>\n </section>\n `,\n})\nexport class BarcodePropsComponent extends SpecEditor {\n protected setType = (v: 'code128' | 'ean13') => (e: ReportElement) => (e.barcode!.symbology = v);\n protected setShowText = (v: boolean) => (e: ReportElement) => (e.barcode!.showText = v);\n protected setColor = (v: string) => (e: ReportElement) => (e.barcode!.color = v);\n}\n\n@Component({\n selector: 'rpt-qr-props',\n standalone: true,\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let q = el().qr!;\n <section>\n <h4>QR code</h4>\n <label class=\"prop-row\"><span>Error level</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"q.errorCorrection\" (ngModelChange)=\"edit(setLevel($event))\">\n <option value=\"L\">L — 7% (smallest)</option>\n <option value=\"M\">M — 15%</option>\n <option value=\"Q\">Q — 25%</option>\n <option value=\"H\">H — 30% (most robust)</option>\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Color</span>\n <div class=\"prop-value\"><input type=\"color\" [ngModel]=\"q.color\" (ngModelChange)=\"edit(setColor($event))\" /></div>\n </label>\n </section>\n `,\n})\nexport class QrPropsComponent extends SpecEditor {\n protected setLevel = (v: 'L' | 'M' | 'Q' | 'H') => (e: ReportElement) => (e.qr!.errorCorrection = v);\n protected setColor = (v: string) => (e: ReportElement) => (e.qr!.color = v);\n}\n\n@Component({\n selector: 'rpt-crosstab-props',\n standalone: true,\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let x = el().crosstab!;\n <section>\n <h4>Cross table</h4>\n <label class=\"prop-row\"><span>Rows</span>\n <div class=\"prop-value\"><input list=\"field-names\" [ngModel]=\"x.rowField\" placeholder=\"Field\" (ngModelChange)=\"edit(set('rowField', $event))\" /></div>\n </label>\n <label class=\"prop-row\"><span>Columns</span>\n <div class=\"prop-value\"><input list=\"field-names\" [ngModel]=\"x.columnField\" placeholder=\"Field\" (ngModelChange)=\"edit(set('columnField', $event))\" /></div>\n </label>\n <label class=\"prop-row\"><span>Value</span>\n <div class=\"prop-value\"><input list=\"field-names\" [ngModel]=\"x.valueField\" placeholder=\"Field (empty = count)\" (ngModelChange)=\"edit(set('valueField', $event))\" /></div>\n </label>\n <label class=\"prop-row\"><span>Aggregate</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"x.aggregate\" (ngModelChange)=\"edit(set('aggregate', $event))\">\n @for (a of aggregates; track a) { <option [value]=\"a\">{{ a }}</option> }\n </select>\n </div>\n </label>\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Format</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"x.valueFormat.kind\" (ngModelChange)=\"edit(setFormat($event))\">\n @for (k of valueFormats; track k) { <option [value]=\"k\">{{ k }}</option> }\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Decimals</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"0\" [ngModel]=\"x.valueFormat.decimals\" (ngModelChange)=\"positive($event, setDecimals)\" /></div>\n </label>\n </div>\n <label class=\"prop-row\"><span>Corner text</span>\n <div class=\"prop-value\"><input [ngModel]=\"x.cornerText\" placeholder=\"Rows / Columns\" (ngModelChange)=\"edit(set('cornerText', $event))\" /></div>\n </label>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"x.showRowTotals\" (ngModelChange)=\"edit(set('showRowTotals', $event))\" /> Row totals (right column)</label>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"x.showColumnTotals\" (ngModelChange)=\"edit(set('showColumnTotals', $event))\" /> Column totals (bottom row)</label>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"x.repeatHeader\" (ngModelChange)=\"edit(set('repeatHeader', $event))\" /> Repeat header on each page</label>\n </section>\n <section>\n <h4>Look</h4>\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Header h</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"8\" [ngModel]=\"x.headerHeight\" (ngModelChange)=\"positive($event, setHeaderH)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Row h</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"8\" [ngModel]=\"x.rowHeight\" (ngModelChange)=\"positive($event, setRowH)\" /></div>\n </label>\n </div>\n <div class=\"prop-row\"><span>Header fill</span>\n <div class=\"prop-value\"><input type=\"color\" [ngModel]=\"x.headerBackground\" (ngModelChange)=\"edit(set('headerBackground', $event))\" /></div>\n </div>\n <div class=\"prop-row\"><span>Header text</span>\n <div class=\"prop-value\"><input type=\"color\" [ngModel]=\"x.headerColor\" (ngModelChange)=\"edit(set('headerColor', $event))\" /></div>\n </div>\n <div class=\"prop-row\"><span>Alt. row</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"x.stripeBackground === 'transparent' ? '#ffffff' : x.stripeBackground\" (ngModelChange)=\"edit(set('stripeBackground', $event))\" />\n <button class=\"small\" [class.on]=\"x.stripeBackground === 'transparent'\" (click)=\"edit(set('stripeBackground', 'transparent'))\">None</button>\n </div>\n </div>\n <div class=\"prop-row\"><span>Grid lines</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"x.gridColor === 'transparent' ? '#ffffff' : x.gridColor\" (ngModelChange)=\"edit(set('gridColor', $event))\" />\n <button class=\"small\" [class.on]=\"x.gridColor === 'transparent'\" (click)=\"edit(set('gridColor', 'transparent'))\">None</button>\n </div>\n </div>\n <p class=\"hint\">Pivots the rows of its band. It grows to fit and continues onto new pages in the preview.</p>\n </section>\n `,\n})\nexport class CrosstabPropsComponent extends SpecEditor {\n protected set = <K extends keyof NonNullable<ReportElement['crosstab']>>(k: K, v: NonNullable<ReportElement['crosstab']>[K]) => (e: ReportElement) =>\n (e.crosstab![k] = v);\n protected setFormat = (k: FormatKind) => (e: ReportElement) => (e.crosstab!.valueFormat.kind = k);\n protected setDecimals = (n: number) => this.edit((e) => (e.crosstab!.valueFormat.decimals = Math.min(10, Math.round(n))));\n protected setHeaderH = (n: number) => this.edit((e) => (e.crosstab!.headerHeight = Math.max(8, n)));\n protected setRowH = (n: number) => this.edit((e) => (e.crosstab!.rowHeight = Math.max(8, n)));\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { ElementStyle, FormatKind, ReportElement, StyleRule } from '../../model/types';\nimport { contentWidth, defaultFieldOptions } from '../../model/defaults';\nimport { AGGREGATES } from '../../engine/expressions';\nimport { DesignerStore } from '../designer.store';\nimport { TablePropsComponent } from './table-props.component';\nimport { ExprInputComponent } from './expr-input.component';\nimport { ImagePickerComponent } from './image-picker.component';\nimport { BarcodePropsComponent, ChartPropsComponent, CrosstabPropsComponent, QrPropsComponent } from './graphics-props.component';\n\nexport const FORMAT_KINDS: FormatKind[] = ['none', 'number', 'currency', 'percent', 'date', 'datetime', 'time'];\nconst NUMERIC_FORMATS = ['number', 'currency', 'percent'];\n\n@Component({\n selector: 'rpt-element-props',\n standalone: true,\n imports: [FormsModule, ExprInputComponent, ImagePickerComponent, TablePropsComponent, ChartPropsComponent, BarcodePropsComponent, QrPropsComponent, CrosstabPropsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let e = el();\n @let s = e.style;\n <h3>\n {{ title() }}\n @if (count() > 1) {\n <span class=\"muted\">({{ count() }} selected)</span>\n }\n </h3>\n\n @if (e.kind === 'image') {\n <section>\n <h4>Image</h4>\n <rpt-image-picker [value]=\"e.text\" (valueChange)=\"set(setText($event))\" />\n <label class=\"prop-row\"><span>Fit</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"e.imageFit ?? 'contain'\" (ngModelChange)=\"set(setFit($event))\">\n <option value=\"contain\">Contain (whole image)</option>\n <option value=\"cover\">Cover (fill, crop)</option>\n <option value=\"fill\">Stretch</option>\n </select>\n </div>\n </label>\n </section>\n }\n @if (isText() || isCode()) {\n <section>\n <div class=\"prop-label\">{{ isCode() ? 'Value' : 'Text' }} <span class=\"muted\">— type {{ '{' }} for fields &amp; formulas, Ctrl+Space for suggestions</span></div>\n <rpt-expr-input [value]=\"e.text\" [rows]=\"3\" (valueChange)=\"set(setText($event))\" />\n @if (isCode()) {\n <p class=\"hint\">Use fields, e.g. <code>{{ '{' }}OrderID{{ '}' }}</code>. The designer shows the first data row.</p>\n }\n @if (isText()) {\n <p class=\"hint\">\n e.g. <code>{{ '{' }}Quantity * UnitPrice{{ '}' }}</code>, <code>{{ '{' }}sum(Amount, report){{ '}' }}</code>,\n <code>{{ '{' }}iif(Amount &gt; 100, \"High\", \"Low\"){{ '}' }}</code>, <code>{{ '{' }}upper(Customer){{ '}' }}</code>,\n <code>{{ '{' }}&#64;Country{{ '}' }}</code> (parameter). Outside Detail, a field shows the first record of its band.\n </p>\n }\n </section>\n }\n\n <section>\n <h4>Layout</h4>\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>X</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"0\" [ngModel]=\"e.x\" (ngModelChange)=\"num($event, setX)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Y</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"0\" [ngModel]=\"e.y\" (ngModelChange)=\"num($event, setY)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Width</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"1\" [ngModel]=\"e.w\" (ngModelChange)=\"num($event, setW)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Height</span>\n <div class=\"prop-value\">\n @if (isTable()) {\n <span class=\"muted\">{{ e.h }} (auto)</span>\n } @else {\n <input type=\"number\" min=\"1\" [ngModel]=\"e.h\" (ngModelChange)=\"num($event, setH)\" />\n }\n </div>\n </label>\n </div>\n @if (isText() || isTable()) {\n <label class=\"check\" title=\"Grow taller to fit long text; elements below are pushed down\">\n <input type=\"checkbox\" [ngModel]=\"e.canGrow !== false\" (ngModelChange)=\"set(setGrow($event))\" />\n Can grow (fit long text)\n </label>\n }\n </section>\n\n @if (isTable()) {\n <rpt-table-props [el]=\"e\" />\n }\n @switch (e.kind) {\n @case ('chart') { @if (e.chart) { <rpt-chart-props [el]=\"e\" /> } }\n @case ('barcode') { @if (e.barcode) { <rpt-barcode-props [el]=\"e\" /> } }\n @case ('qrcode') { @if (e.qr) { <rpt-qr-props [el]=\"e\" /> } }\n @case ('crosstab') { @if (e.crosstab) { <rpt-crosstab-props [el]=\"e\" /> } }\n }\n\n @if (isText()) {\n <section>\n <h4>Format</h4>\n <label class=\"prop-row\"><span>Type</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"e.format.kind\" (ngModelChange)=\"set(setFormatKind($event))\">\n @for (k of formatKinds; track k) {\n <option [value]=\"k\">{{ k }}</option>\n }\n </select>\n </div>\n </label>\n @if (numericFormats.includes(e.format.kind)) {\n <label class=\"prop-row\"><span>Decimals</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"0\" [ngModel]=\"e.format.decimals\" (ngModelChange)=\"num($event, setDecimals)\" /></div>\n </label>\n }\n @if (e.format.kind === 'currency') {\n <label class=\"prop-row\"><span>Currency</span>\n <div class=\"prop-value\"><input maxlength=\"3\" [ngModel]=\"e.format.currency\" (ngModelChange)=\"set(setCurrency($event))\" /></div>\n </label>\n }\n </section>\n }\n\n @if (isText()) {\n @let o = options();\n <section>\n <h4>Field options</h4>\n <div class=\"prop-label\">Text when empty</div>\n <rpt-expr-input [value]=\"o.nullText\" placeholder=\"e.g. — or n/a\" (valueChange)=\"setNullText($event)\" />\n <label class=\"check\" title=\"Leave the box empty when the value is the same as in the row above (restarts on each page)\">\n <input type=\"checkbox\" [ngModel]=\"o.hideDuplicates\" (ngModelChange)=\"setHideDuplicates($event)\" /> Hide repeated values\n </label>\n <div class=\"prop-label\">Conditional formatting <span class=\"muted\">— first matching rule wins</span></div>\n @for (r of o.rules; track $index; let i = $index) {\n <div class=\"col-card\">\n <div class=\"col-head\">\n <strong>When</strong><span class=\"spacer\"></span>\n <button class=\"small danger\" title=\"Remove rule\" (click)=\"removeRule(i)\">✕</button>\n </div>\n <rpt-expr-input mode=\"expression\" [value]=\"r.when\" placeholder=\"e.g. Amount > 1000\" (valueChange)=\"setRule(i, 'when', $event)\" />\n <div class=\"prop-row\"><span>Text color</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"r.color\" (ngModelChange)=\"setRule(i, 'color', $event)\" />\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"r.bold\" (ngModelChange)=\"setRule(i, 'bold', $event)\" /> Bold</label>\n </div>\n </div>\n <div class=\"prop-row\"><span>Fill</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"r.background || '#ffffff'\" (ngModelChange)=\"setRule(i, 'background', $event)\" />\n <button class=\"small\" [class.on]=\"!r.background\" (click)=\"setRule(i, 'background', '')\">None</button>\n </div>\n </div>\n </div>\n }\n <button (click)=\"addRule()\">+ Add rule</button>\n </section>\n }\n\n <section>\n <h4>Visibility</h4>\n <div class=\"prop-label\">Visible when <span class=\"muted\">— empty = always</span></div>\n <rpt-expr-input mode=\"expression\" [value]=\"e.visibleWhen ?? ''\" placeholder=\"e.g. Amount > 0 or @ShowDetails\" (valueChange)=\"set(setVisible($event))\" />\n </section>\n\n @if (isText() || isTable() || hasFont()) {\n <section>\n <h4>Font</h4>\n <label class=\"prop-row\"><span>Family</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"s.fontFamily\" (ngModelChange)=\"style('fontFamily', $event)\">\n <option value=\"Segoe UI, Arial, sans-serif\">Sans-serif</option>\n <option value=\"Georgia, 'Times New Roman', serif\">Serif</option>\n <option value=\"Consolas, 'Courier New', monospace\">Monospace</option>\n <option value=\"Tahoma, Arial, sans-serif\">Tahoma (Arabic)</option>\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Size</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"4\" [ngModel]=\"s.fontSize\" (ngModelChange)=\"numStyle('fontSize', $event)\" /></div>\n </label>\n <div class=\"btn-group\">\n <button [class.on]=\"s.bold\" (click)=\"style('bold', !s.bold)\"><b>B</b></button>\n <button [class.on]=\"s.italic\" (click)=\"style('italic', !s.italic)\"><i>I</i></button>\n <button [class.on]=\"s.underline\" (click)=\"style('underline', !s.underline)\"><u>U</u></button>\n @if (isText()) {\n <span class=\"sep\"></span>\n <button [class.on]=\"s.align === 'left'\" (click)=\"style('align', 'left')\" title=\"Align left\">⇤</button>\n <button [class.on]=\"s.align === 'center'\" (click)=\"style('align', 'center')\" title=\"Align center\">↔</button>\n <button [class.on]=\"s.align === 'right'\" (click)=\"style('align', 'right')\" title=\"Align right\">⇥</button>\n }\n <span class=\"sep\"></span>\n <button [class.on]=\"s.vAlign === 'top'\" (click)=\"style('vAlign', 'top')\" title=\"Vertical top\">⤒</button>\n <button [class.on]=\"s.vAlign === 'middle'\" (click)=\"style('vAlign', 'middle')\" title=\"Vertical middle\">↕</button>\n <button [class.on]=\"s.vAlign === 'bottom'\" (click)=\"style('vAlign', 'bottom')\" title=\"Vertical bottom\">⤓</button>\n </div>\n <label class=\"prop-row\"><span>Color</span>\n <div class=\"prop-value\"><input type=\"color\" [ngModel]=\"s.color\" (ngModelChange)=\"style('color', $event)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Padding</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"0\" [ngModel]=\"s.padding\" (ngModelChange)=\"numStyle('padding', $event)\" /></div>\n </label>\n </section>\n }\n\n @if (!isTable() && e.kind !== 'crosstab') {\n <section>\n <h4>{{ e.kind === 'line' ? 'Line' : 'Border & fill' }}</h4>\n @if (e.kind !== 'line' && e.kind !== 'image') {\n <div class=\"prop-row\"><span>Background</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"s.background === 'transparent' ? '#ffffff' : s.background\" (ngModelChange)=\"style('background', $event)\" />\n <button class=\"small\" [class.on]=\"s.background === 'transparent'\" (click)=\"style('background', 'transparent')\">None</button>\n </div>\n </div>\n }\n @if (e.kind === 'line' || e.kind === 'rect') {\n <label class=\"prop-row\"><span>Style</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"e.dash ?? 'solid'\" (ngModelChange)=\"set(setDash($event))\">\n <option value=\"solid\">Solid ───</option>\n <option value=\"dashed\">Dashed - - -</option>\n <option value=\"dotted\">Dotted ·····</option>\n </select>\n </div>\n </label>\n }\n <label class=\"prop-row\"><span>{{ e.kind === 'line' ? 'Thickness' : 'Border width' }}</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"0\" [ngModel]=\"s.borderWidth\" (ngModelChange)=\"numStyle('borderWidth', $event)\" /></div>\n </label>\n <label class=\"prop-row\"><span>{{ e.kind === 'line' ? 'Color' : 'Border color' }}</span>\n <div class=\"prop-value\"><input type=\"color\" [ngModel]=\"s.borderColor\" (ngModelChange)=\"style('borderColor', $event)\" /></div>\n </label>\n </section>\n }\n `,\n})\nexport class ElementPropsComponent {\n private readonly store = inject(DesignerStore);\n readonly el = input.required<ReportElement>();\n readonly count = input(1);\n\n protected readonly formatKinds = FORMAT_KINDS;\n protected readonly numericFormats = NUMERIC_FORMATS;\n protected readonly aggregates = AGGREGATES.join(', ');\n protected readonly isText = computed(() => this.el().kind === 'text' || this.el().kind === 'field');\n protected readonly isTable = computed(() => this.el().kind === 'table' && !!this.el().table);\n protected readonly isCode = computed(() => this.el().kind === 'barcode' || this.el().kind === 'qrcode');\n /** Elements that draw text with the element font (beyond labels/fields/tables). */\n protected readonly hasFont = computed(() => ['chart', 'crosstab', 'barcode'].includes(this.el().kind));\n protected readonly title = computed(() => {\n const k = this.el().kind;\n return k === 'field' ? 'Field' : k[0].toUpperCase() + k.slice(1);\n });\n\n private readonly width = computed(() => contentWidth(this.store.report().page));\n\n // Setters (applied to every selected element).\n protected readonly setX = (v: number) => (e: ReportElement) => (e.x = Math.max(0, Math.min(v, this.width() - e.w)));\n protected readonly setY = (v: number) => (e: ReportElement) => (e.y = Math.max(0, v));\n protected readonly setW = (v: number) => (e: ReportElement) => (e.w = Math.max(1, v));\n protected readonly setH = (v: number) => (e: ReportElement) => (e.h = Math.max(1, v));\n protected readonly setDecimals = (v: number) => (e: ReportElement) => (e.format.decimals = Math.max(0, Math.min(10, v)));\n protected setText = (v: string) => (e: ReportElement) => (e.text = v);\n protected setDash = (v: 'solid' | 'dashed' | 'dotted') => (e: ReportElement) => (e.dash = v === 'solid' ? undefined : v);\n protected setFit = (v: 'contain' | 'cover' | 'fill') => (e: ReportElement) => (e.imageFit = v);\n protected setVisible = (v: string) => (e: ReportElement) => (e.visibleWhen = v || undefined);\n protected setGrow = (v: boolean) => (e: ReportElement) => (e.canGrow = v);\n protected setFormatKind = (v: FormatKind) => (e: ReportElement) => (e.format.kind = v);\n protected setCurrency = (v: string) => (e: ReportElement) => (e.format.currency = v.toUpperCase());\n\n protected readonly options = computed(() => ({ ...defaultFieldOptions(), ...this.el().fieldOptions }));\n\n protected setNullText(v: string): void {\n this.set((e) => (e.fieldOptions = { ...defaultFieldOptions(), ...e.fieldOptions, nullText: v }));\n }\n\n protected setHideDuplicates(v: boolean): void {\n this.set((e) => (e.fieldOptions = { ...defaultFieldOptions(), ...e.fieldOptions, hideDuplicates: v }));\n }\n\n protected addRule(): void {\n this.set((e) => {\n const o = { ...defaultFieldOptions(), ...e.fieldOptions };\n e.fieldOptions = { ...o, rules: [...o.rules, { when: '', color: '#c4372f', background: '', bold: true }] };\n });\n }\n\n protected setRule<K extends keyof StyleRule>(i: number, k: K, v: StyleRule[K]): void {\n this.set((e) => {\n const r = e.fieldOptions?.rules[i];\n if (r) r[k] = v;\n });\n }\n\n protected removeRule(i: number): void {\n this.set((e) => e.fieldOptions?.rules.splice(i, 1));\n }\n\n protected set(fn: (e: ReportElement) => void): void {\n const ids = this.store.selection().elementIds;\n this.store.update((r) => {\n for (const b of r.bands)\n for (const e of b.elements)\n if (ids.includes(e.id)) {\n fn(e);\n // Keep the element inside its band: grow the band to fit a new Y/height.\n b.height = Math.max(b.height, e.y + e.h);\n }\n });\n }\n\n protected num(v: number | null, setter: (v: number) => (e: ReportElement) => void): void {\n if (v != null && Number.isFinite(v)) this.set(setter(v));\n }\n\n protected style<K extends keyof ElementStyle>(k: K, v: ElementStyle[K]): void {\n this.set((e) => (e.style[k] = v));\n }\n\n protected numStyle(k: 'fontSize' | 'padding' | 'borderWidth', v: number | null): void {\n if (v != null && Number.isFinite(v)) this.style(k, Math.max(0, v));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { PageBackground, ParameterType, ReportParameter, Watermark } from '../../model/types';\nimport { defaultBackground, defaultWatermark } from '../../model/defaults';\nimport { DesignerStore } from '../designer.store';\nimport { ExprInputComponent } from './expr-input.component';\nimport { ImagePickerComponent } from './image-picker.component';\n\n/** Report-level settings: parameters, row filter, watermark and page background. */\n@Component({\n selector: 'rpt-report-extras',\n standalone: true,\n imports: [FormsModule, ExprInputComponent, ImagePickerComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <section>\n <h4>Parameters</h4>\n @for (p of parameters(); track $index; let i = $index) {\n <div class=\"col-card\">\n <div class=\"col-head\">\n <strong>&#64;{{ p.name || '?' }}</strong><span class=\"spacer\"></span>\n <button class=\"small danger\" title=\"Remove parameter\" (click)=\"removeParam(i)\">✕</button>\n </div>\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Name</span>\n <div class=\"prop-value\"><input [ngModel]=\"p.name\" placeholder=\"Country\" (ngModelChange)=\"setParam(i, 'name', clean($event))\" /></div>\n </label>\n <label class=\"prop-row\"><span>Type</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"p.type\" (ngModelChange)=\"setParam(i, 'type', $event)\">\n @for (t of types; track t) { <option [value]=\"t\">{{ t }}</option> }\n </select>\n </div>\n </label>\n </div>\n <label class=\"prop-row\"><span>Label</span>\n <div class=\"prop-value\"><input [ngModel]=\"p.label\" placeholder=\"Shown in the preview\" (ngModelChange)=\"setParam(i, 'label', $event)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Default</span>\n <div class=\"prop-value\"><input [ngModel]=\"p.defaultValue\" (ngModelChange)=\"setParam(i, 'defaultValue', $event)\" /></div>\n </label>\n <label class=\"prop-row\"><span>Choices</span>\n <div class=\"prop-value\"><input [ngModel]=\"p.options\" placeholder=\"Egypt, USA, France (optional)\" (ngModelChange)=\"setParam(i, 'options', $event)\" /></div>\n </label>\n </div>\n }\n <button (click)=\"addParam()\">+ Add parameter</button>\n <p class=\"hint\">\n Use as <code>&#64;Name</code> in formulas, <code>{{ '{' }}&#64;Name{{ '}' }}</code> in the data source URL or OData filter\n (e.g. <code>Country eq '{{ '{' }}&#64;Country{{ '}' }}'</code>), or pass in the page address: <code>?Country=Egypt</code>.\n </p>\n </section>\n\n <section>\n <h4>Filter rows</h4>\n <rpt-expr-input mode=\"expression\" [value]=\"filter()\" placeholder=\"e.g. Country == @Country\" (valueChange)=\"setFilter($event)\" />\n <p class=\"hint\">Only rows where this is true are printed. Empty = all rows.</p>\n </section>\n\n <section>\n @let w = watermark();\n <h4>Watermark</h4>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"w.enabled\" (ngModelChange)=\"setWm('enabled', $event)\" /> Show watermark</label>\n @if (w.enabled) {\n <div class=\"tabs\">\n <button [class.on]=\"w.kind === 'text'\" (click)=\"setWm('kind', 'text')\">Text</button>\n <button [class.on]=\"w.kind === 'image'\" (click)=\"setWm('kind', 'image')\">Image</button>\n </div>\n @if (w.kind === 'text') {\n <rpt-expr-input [value]=\"w.text\" placeholder=\"CONFIDENTIAL\" (valueChange)=\"setWm('text', $event)\" />\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Size</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"8\" [ngModel]=\"w.fontSize\" (ngModelChange)=\"num($event, 'fontSize', 8)\" /></div>\n </label>\n <div class=\"prop-row\"><span>Color</span>\n <div class=\"prop-value\">\n <input type=\"color\" [ngModel]=\"w.color\" (ngModelChange)=\"setWm('color', $event)\" />\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"w.bold\" (ngModelChange)=\"setWm('bold', $event)\" /> Bold</label>\n </div>\n </div>\n </div>\n } @else {\n <rpt-image-picker [value]=\"w.image\" placeholder=\"https://…/logo.png\" (valueChange)=\"setWm('image', $event)\" />\n <label class=\"prop-row\"><span>Width %</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"5\" max=\"200\" [ngModel]=\"w.imageScale\" (ngModelChange)=\"num($event, 'imageScale', 5)\" /></div>\n </label>\n }\n <label class=\"prop-row\"><span>Opacity</span>\n <div class=\"prop-value\">\n <input type=\"range\" min=\"0.02\" max=\"1\" step=\"0.01\" [ngModel]=\"w.opacity\" (ngModelChange)=\"setWm('opacity', +$event)\" />\n <span class=\"muted\">{{ (w.opacity * 100).toFixed(0) }}%</span>\n </div>\n </label>\n <label class=\"prop-row\"><span>Angle</span>\n <div class=\"prop-value\">\n <input type=\"range\" min=\"-90\" max=\"90\" step=\"1\" [ngModel]=\"w.angle\" (ngModelChange)=\"setWm('angle', +$event)\" />\n <span class=\"muted\">{{ w.angle }}°</span>\n </div>\n </label>\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Layer</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"w.layer\" (ngModelChange)=\"setWm('layer', $event)\">\n <option value=\"front\">In front</option>\n <option value=\"behind\">Behind</option>\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Pages</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"w.pages\" (ngModelChange)=\"setWm('pages', $event)\">\n <option value=\"all\">All</option>\n <option value=\"first\">First only</option>\n </select>\n </div>\n </label>\n </div>\n }\n </section>\n\n <section>\n @let b = background();\n <h4>Background image</h4>\n <label class=\"check\"><input type=\"checkbox\" [ngModel]=\"b.enabled\" (ngModelChange)=\"setBg('enabled', $event)\" /> Page background</label>\n @if (b.enabled) {\n <rpt-image-picker [value]=\"b.image\" placeholder=\"https://…/letterhead.png\" (valueChange)=\"setBg('image', $event)\" />\n <div class=\"grid2\">\n <label class=\"prop-row\"><span>Fit</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"b.fit\" (ngModelChange)=\"setBg('fit', $event)\">\n <option value=\"cover\">Cover page</option>\n <option value=\"contain\">Contain</option>\n <option value=\"stretch\">Stretch</option>\n <option value=\"center\">Center (actual size)</option>\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Pages</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"b.pages\" (ngModelChange)=\"setBg('pages', $event)\">\n <option value=\"all\">All</option>\n <option value=\"first\">First only</option>\n </select>\n </div>\n </label>\n </div>\n <p class=\"hint\">Fills the whole sheet behind everything (e.g. a letterhead). For a see-through mark, use Watermark.</p>\n }\n </section>\n `,\n})\nexport class ReportExtrasComponent {\n private readonly store = inject(DesignerStore);\n protected readonly types: ParameterType[] = ['string', 'number', 'date', 'boolean'];\n protected readonly parameters = computed(() => this.store.report().parameters ?? []);\n protected readonly filter = computed(() => this.store.report().filter ?? '');\n protected readonly watermark = computed(() => ({ ...defaultWatermark(), ...this.store.report().watermark }));\n protected readonly background = computed(() => ({ ...defaultBackground(), ...this.store.report().background }));\n\n /** Parameter names: letters, digits and _ only (they are used as @Name). */\n protected clean(v: string): string {\n return v.replace(/[^\\wÀ-￿]/g, '');\n }\n\n protected addParam(): void {\n this.store.update((r) => {\n const n = (r.parameters?.length ?? 0) + 1;\n r.parameters = [...(r.parameters ?? []), { name: `Param${n}`, label: '', type: 'string', defaultValue: '', options: '' }];\n });\n }\n\n protected setParam<K extends keyof ReportParameter>(i: number, k: K, v: ReportParameter[K]): void {\n this.store.update((r) => {\n const p = r.parameters?.[i];\n if (p) p[k] = v;\n });\n }\n\n protected removeParam(i: number): void {\n this.store.update((r) => r.parameters?.splice(i, 1));\n }\n\n protected setFilter(v: string): void {\n this.store.update((r) => (r.filter = v || undefined));\n }\n\n protected setWm<K extends keyof Watermark>(k: K, v: Watermark[K]): void {\n this.store.update((r) => (r.watermark = { ...defaultWatermark(), ...r.watermark, [k]: v }));\n }\n\n protected num(v: number | null, k: 'fontSize' | 'imageScale', min: number): void {\n if (v != null && Number.isFinite(v)) this.setWm(k, Math.max(min, v));\n }\n\n protected setBg<K extends keyof PageBackground>(k: K, v: PageBackground[K]): void {\n this.store.update((r) => (r.background = { ...defaultBackground(), ...r.background, [k]: v }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { BandType, PageSettings, ReportDefinition } from '../../model/types';\nimport { BAND_LABELS, PAGE_SIZES, createBand, uid } from '../../model/defaults';\nimport { DesignerStore } from '../designer.store';\nimport { ReportExtrasComponent } from './report-extras.component';\n\nexport function removeGroup(r: ReportDefinition, gid: string): void {\n r.groups = r.groups.filter((g) => g.id !== gid);\n r.bands = r.bands.filter((b) => b.groupId !== gid);\n}\n\nconst OPTIONAL_BANDS: BandType[] = ['reportHeader', 'pageHeader', 'detail', 'pageFooter', 'reportFooter'];\ntype PageKey = Exclude<keyof PageSettings, 'continuous'>;\n\n@Component({\n selector: 'rpt-report-props',\n standalone: true,\n imports: [FormsModule, ReportExtrasComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @let r = report();\n <h3>Report</h3>\n <section>\n <label class=\"prop-row\"><span>Name</span>\n <div class=\"prop-value\"><input [ngModel]=\"r.name\" (ngModelChange)=\"setName($event)\" /></div>\n </label>\n </section>\n\n <section>\n <h4>Page</h4>\n <label class=\"prop-row\"><span>Size</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"sizeName()\" (ngModelChange)=\"setSize($event)\">\n @for (k of sizeNames; track k) {\n <option [value]=\"k\">{{ k }}</option>\n }\n @if (sizeName() === 'Custom') {\n <option value=\"Custom\">Custom</option>\n }\n </select>\n </div>\n </label>\n <label class=\"prop-row\"><span>Orientation</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"landscape() ? 'landscape' : 'portrait'\" (ngModelChange)=\"setOrientation($event)\">\n <option value=\"portrait\">Portrait</option>\n <option value=\"landscape\">Landscape</option>\n </select>\n </div>\n </label>\n <div class=\"grid2\">\n @for (f of pageFields; track f.key) {\n <label class=\"prop-row\"><span>{{ f.label }}</span>\n <div class=\"prop-value\">\n <input type=\"number\" [min]=\"f.min\" [ngModel]=\"r.page[f.key]\" (ngModelChange)=\"setPage(f.key, f.min, $event)\" />\n </div>\n </label>\n }\n </div>\n <label class=\"check\" title=\"Receipt roll: one page as long as its content, no page breaks\">\n <input type=\"checkbox\" [ngModel]=\"!!r.page.continuous\" (ngModelChange)=\"setContinuous($event)\" /> Continuous (receipt roll, no page breaks)\n </label>\n <p class=\"hint\">Units are pixels at 96 DPI (A4 = 794 × 1123, 80 mm receipt = 302 wide).</p>\n </section>\n\n <section>\n <h4>Sections</h4>\n @for (t of optionalBands; track t) {\n <label class=\"check\">\n <input type=\"checkbox\" [ngModel]=\"isVisible(t)\" (ngModelChange)=\"setVisible(t, $event)\" />\n {{ labels[t] }}\n </label>\n }\n <p class=\"hint\">Without Detail, the report prints its header/footer once — fields there show the first/last record, or use sum(), count()… for totals.</p>\n </section>\n\n <section>\n <h4>Groups</h4>\n @for (g of r.groups; track g.id; let i = $index) {\n <div class=\"group-row\">\n <span class=\"muted\">{{ i + 1 }}.</span>\n <input list=\"field-names\" placeholder=\"Field name\" [ngModel]=\"g.field\" (ngModelChange)=\"setGroupField(g.id, $event)\" />\n <button class=\"small danger\" title=\"Remove group\" (click)=\"deleteGroup(g.id)\">✕</button>\n </div>\n }\n <button (click)=\"addGroup()\">+ Add group</button>\n </section>\n\n <section>\n <h4>Sort</h4>\n @for (s of r.sort; track $index; let i = $index) {\n <div class=\"group-row\">\n <input list=\"field-names\" placeholder=\"Field name\" [ngModel]=\"s.field\" (ngModelChange)=\"setSort(i, 'field', $event)\" />\n <select [ngModel]=\"s.direction\" (ngModelChange)=\"setSort(i, 'direction', $event)\">\n <option value=\"asc\">Asc</option>\n <option value=\"desc\">Desc</option>\n </select>\n <button class=\"small danger\" (click)=\"removeSort(i)\">✕</button>\n </div>\n }\n <button (click)=\"addSort()\">+ Add sort</button>\n </section>\n\n <rpt-report-extras />\n `,\n})\nexport class ReportPropsComponent {\n private readonly store = inject(DesignerStore);\n protected readonly report = this.store.report;\n protected readonly labels = BAND_LABELS;\n protected readonly optionalBands = OPTIONAL_BANDS;\n protected readonly sizeNames = Object.keys(PAGE_SIZES);\n protected readonly pageFields: { key: PageKey; label: string; min: number }[] = [\n { key: 'width', label: 'Width', min: 100 },\n { key: 'height', label: 'Height', min: 100 },\n { key: 'marginTop', label: 'Margin Top', min: 0 },\n { key: 'marginBottom', label: 'Margin Bottom', min: 0 },\n { key: 'marginLeft', label: 'Margin Left', min: 0 },\n { key: 'marginRight', label: 'Margin Right', min: 0 },\n ];\n\n protected readonly landscape = computed(() => this.report().page.width > this.report().page.height);\n protected readonly sizeName = computed(() => {\n const p = this.report().page;\n const hit = Object.entries(PAGE_SIZES).find(\n ([, s]) => (s.width === p.width && s.height === p.height) || (s.width === p.height && s.height === p.width),\n );\n return hit?.[0] ?? 'Custom';\n });\n\n protected setName(v: string): void {\n this.store.update((r) => (r.name = v));\n }\n\n protected setSize(name: string): void {\n const s = PAGE_SIZES[name];\n if (!s) return;\n const land = this.landscape();\n const receipt = name.startsWith('Receipt');\n this.store.update((r) => {\n r.page.width = land && !receipt ? s.height : s.width;\n r.page.height = land && !receipt ? s.width : s.height;\n if (receipt) {\n // Thermal roll: narrow margins, page as long as the content.\n r.page.continuous = true;\n r.page.marginLeft = r.page.marginRight = name.includes('58') ? 6 : 10;\n r.page.marginTop = 10;\n r.page.marginBottom = 14;\n } else r.page.continuous = false;\n });\n }\n\n protected setContinuous(on: boolean): void {\n this.store.update((r) => (r.page.continuous = on));\n }\n\n protected setOrientation(v: string): void {\n if ((v === 'landscape') !== this.landscape()) this.store.update((r) => ([r.page.width, r.page.height] = [r.page.height, r.page.width]));\n }\n\n protected setPage(k: PageKey, min: number, v: number | null): void {\n if (v != null && Number.isFinite(v)) this.store.update((r) => (r.page[k] = Math.max(min, v)));\n }\n\n protected isVisible(t: BandType): boolean {\n return !!this.report().bands.find((b) => b.type === t)?.visible;\n }\n\n protected setVisible(t: BandType, on: boolean): void {\n this.store.update((r) => {\n const ex = r.bands.find((x) => x.type === t);\n if (ex) ex.visible = on;\n else r.bands.push(createBand(t, 30));\n });\n }\n\n protected setGroupField(gid: string, v: string): void {\n this.store.update((r) => {\n const g = r.groups.find((x) => x.id === gid);\n if (g) g.field = v;\n });\n }\n\n protected deleteGroup(gid: string): void {\n this.store.update((r) => removeGroup(r, gid));\n }\n\n protected addGroup(): void {\n this.store.update((r) => {\n const id = uid('grp');\n r.groups.push({ id, field: '', direction: 'asc' });\n r.bands.push(createBand('groupHeader', 26, id), createBand('groupFooter', 26, id));\n });\n }\n\n protected setSort(i: number, k: 'field' | 'direction', v: string): void {\n this.store.update((r) => {\n if (k === 'field') r.sort[i].field = v;\n else r.sort[i].direction = v as 'asc' | 'desc';\n });\n }\n\n protected removeSort(i: number): void {\n this.store.update((r) => r.sort.splice(i, 1));\n }\n\n protected addSort(): void {\n this.store.update((r) => r.sort.push({ field: '', direction: 'asc' }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BAND_LABELS } from '../../model/defaults';\nimport { DesignerStore } from '../designer.store';\nimport { removeGroup } from './report-props.component';\n\n@Component({\n selector: 'rpt-band-props',\n standalone: true,\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (band(); as b) {\n <h3>{{ labels[b.type] }}</h3>\n <section>\n <label class=\"prop-row\"><span>Height</span>\n <div class=\"prop-value\"><input type=\"number\" min=\"0\" [ngModel]=\"b.height\" (ngModelChange)=\"setHeight($event)\" /></div>\n </label>\n <div class=\"prop-row\"><span>Elements</span><div class=\"prop-value\">{{ b.elements.length }}</div></div>\n </section>\n @if (group(); as g) {\n <section>\n <h4>Group</h4>\n <label class=\"prop-row\"><span>Group by</span>\n <div class=\"prop-value\">\n <input list=\"field-names\" placeholder=\"Field name\" [ngModel]=\"g.field\" (ngModelChange)=\"setGroup('field', $event)\" />\n </div>\n </label>\n <label class=\"prop-row\"><span>Order</span>\n <div class=\"prop-value\">\n <select [ngModel]=\"g.direction\" (ngModelChange)=\"setGroup('direction', $event)\">\n <option value=\"asc\">Ascending</option>\n <option value=\"desc\">Descending</option>\n </select>\n </div>\n </label>\n <button class=\"danger\" (click)=\"removeGroup(g.id)\">Remove group</button>\n </section>\n }\n @if (!b.groupId) {\n <button class=\"danger\" (click)=\"hide(b.id)\">Remove section</button>\n }\n <p class=\"hint\">Drag the bar under a band to resize it. Removed sections come back under Report → Sections. Aggregates in group bands cover the group's rows.</p>\n }\n `,\n})\nexport class BandPropsComponent {\n private readonly store = inject(DesignerStore);\n readonly bandId = input.required<string>();\n protected readonly labels = BAND_LABELS;\n\n protected readonly band = computed(() => this.store.report().bands.find((b) => b.id === this.bandId()));\n protected readonly group = computed(() => {\n const gid = this.band()?.groupId;\n return gid ? this.store.report().groups.find((g) => g.id === gid) : undefined;\n });\n\n protected setHeight(v: number | null): void {\n if (v == null || !Number.isFinite(v)) return;\n const id = this.bandId();\n this.store.update((r) => (r.bands.find((b) => b.id === id)!.height = Math.max(0, v)));\n }\n\n /** Removes the section from the report (kept hidden with its elements, so it can be shown again). */\n protected hide(id: string): void {\n this.store.update((r) => {\n const b = r.bands.find((x) => x.id === id);\n if (b) b.visible = false;\n });\n this.store.select({ elementIds: [], bandId: null });\n }\n\n protected setGroup(k: 'field' | 'direction', v: string): void {\n const gid = this.group()?.id;\n this.store.update((r) => {\n const g = r.groups.find((x) => x.id === gid);\n if (!g) return;\n if (k === 'field') g.field = v;\n else g.direction = v as 'asc' | 'desc';\n });\n }\n\n protected removeGroup(gid: string): void {\n this.store.update((r) => removeGroup(r, gid));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { DesignerStore, findElement } from '../designer.store';\nimport { ElementPropsComponent } from './element-props.component';\nimport { BandPropsComponent } from './band-props.component';\nimport { ReportPropsComponent } from './report-props.component';\n\n/** Right-hand panel: properties of the selected element(s), else the selected band, else the report. */\n@Component({\n selector: 'rpt-properties-panel',\n standalone: true,\n imports: [ElementPropsComponent, BandPropsComponent, ReportPropsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <aside class=\"panel right-panel\">\n <datalist id=\"field-names\">\n @for (f of store.data().fields; track f.name) {\n <option [value]=\"f.name\"></option>\n }\n </datalist>\n @if (first(); as f) {\n <rpt-element-props [el]=\"f.el\" [count]=\"store.selection().elementIds.length\" />\n } @else if (bandId()) {\n <rpt-band-props [bandId]=\"bandId()!\" />\n } @else {\n <rpt-report-props />\n }\n </aside>\n `,\n})\nexport class PropertiesPanelComponent {\n protected readonly store = inject(DesignerStore);\n protected readonly first = computed(() => {\n const ids = this.store.selection().elementIds;\n return ids.length ? findElement(this.store.report(), ids[0]) : null;\n });\n protected readonly bandId = computed(() => this.store.selection().bandId);\n}\n","import type { ReportDefinition } from '../model/types';\nimport { validateReport } from './designer.store';\n\n/**\n * Normalizes a report given as an object or a JSON string (Web Component attributes are strings).\n * Returns null when nothing usable was given.\n */\nexport function parseReport(v: ReportDefinition | string | null | undefined): ReportDefinition | null {\n if (v == null || v === '') return null;\n try {\n return validateReport(typeof v === 'string' ? JSON.parse(v) : structuredClone(v));\n } catch (e) {\n console.error('[myreport] invalid report:', (e as Error).message);\n return null;\n }\n}\n\n/** Parameter values as an object, a JSON string, or a query string (\"Country=Egypt&Year=2024\"). */\nexport function parseParams(v: Record<string, unknown> | string | null | undefined): Record<string, unknown> {\n if (v == null || v === '') return {};\n if (typeof v !== 'string') return { ...v };\n const s = v.trim();\n if (s.startsWith('{')) {\n try {\n return JSON.parse(s);\n } catch {\n console.error('[myreport] params is not valid JSON:', s);\n return {};\n }\n }\n const out: Record<string, unknown> = {};\n new URLSearchParams(s.replace(/^\\?/, '')).forEach((val, k) => (out[k.replace(/^(param|p)\\./i, '')] = val));\n return out;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n ViewEncapsulation,\n booleanAttribute,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport type { DataSourceType, ReportDefinition, ReportElement } from '../model/types';\nimport { receiptReport } from '../model/factories';\nimport { newReport, uid } from '../model/defaults';\nimport { DesignerStore, fetchReport, validateReport } from './designer.store';\nimport { CanvasComponent } from './designer/canvas.component';\nimport { LeftPanelComponent } from './designer/left-panel.component';\nimport { DataSourceDialogComponent } from './designer/data-source-dialog.component';\nimport { ViewerComponent } from './viewer/viewer.component';\nimport { BandedTableDialogComponent } from './designer/banded-table-dialog.component';\nimport { PropertiesPanelComponent } from './properties/properties-panel.component';\nimport { parseParams, parseReport } from './inputs';\n\n/**\n * The report designer.\n *\n * ```html\n * <myreport-designer path=\"/reports/sales.report.json\" (save)=\"store($event)\" />\n * ```\n */\n@Component({\n selector: 'myreport-designer',\n standalone: true,\n imports: [FormsModule, CanvasComponent, LeftPanelComponent, PropertiesPanelComponent, DataSourceDialogComponent, ViewerComponent, BandedTableDialogComponent],\n providers: [DesignerStore],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrl: './myreport.css',\n // A class binding (not a static host class) so classes the host page set on the element are kept.\n host: { '[class.myreport]': 'true' },\n template: `\n <div class=\"app\">\n <header class=\"toolbar\">\n <span class=\"brand\">{{ brand() }}</span>\n <select class=\"new-menu\" title=\"New report from a template\" [ngModel]=\"''\" (ngModelChange)=\"newFrom($event)\">\n <option value=\"\" disabled>New ▾</option>\n <option value=\"blank\">Blank report</option>\n <option value=\"receipt80\">Receipt — 80 mm roll</option>\n <option value=\"receipt58\">Receipt — 58 mm roll</option>\n </select>\n <button (click)=\"fileInput.click()\">Open…</button>\n <button (click)=\"saveReport()\">Save</button>\n <input #fileInput type=\"file\" accept=\".json,application/json\" hidden (change)=\"open($event)\" />\n <span class=\"sep\"></span>\n <button [disabled]=\"!store.canUndo()\" title=\"Undo (Ctrl+Z)\" (click)=\"store.undo()\">↶ Undo</button>\n <button [disabled]=\"!store.canRedo()\" title=\"Redo (Ctrl+Y)\" (click)=\"store.redo()\">↷ Redo</button>\n <span class=\"sep\"></span>\n <button (click)=\"showData.set(true)\">Data source…</button>\n <span class=\"sep\"></span>\n <label class=\"check\">\n <input type=\"checkbox\" [ngModel]=\"store.snap()\" (ngModelChange)=\"store.snap.set($event)\" /> Snap\n </label>\n <select title=\"Zoom\" [ngModel]=\"store.zoom()\" (ngModelChange)=\"store.zoom.set(+$event)\">\n @for (z of zooms; track z) {\n <option [value]=\"z\">{{ z * 100 }}%</option>\n }\n </select>\n <span class=\"spacer\"></span>\n @if (status()) {\n <span class=\"muted\" [class.error]=\"status()!.error\">{{ status()!.text }}</span>\n }\n @if (viewerUrl()) {\n <a class=\"btn-link\" [href]=\"viewerUrl()\" target=\"_blank\" title=\"Open the report in the full viewer (new tab)\">Viewer ↗</a>\n }\n <button class=\"primary\" (click)=\"showPreview.set(true)\">▶ Preview</button>\n </header>\n <main class=\"workspace\">\n <rpt-left-panel (openDataSource)=\"showData.set(true)\" (openBandedTable)=\"showBanded.set(true)\" />\n <rpt-canvas />\n <rpt-properties-panel />\n </main>\n </div>\n @if (showData()) {\n <rpt-data-source-dialog (closed)=\"showData.set(false)\" />\n }\n @if (showBanded()) {\n <rpt-banded-table-dialog (closed)=\"showBanded.set(false)\" />\n }\n @if (showPreview()) {\n <rpt-viewer [embedded]=\"true\" (closed)=\"showPreview.set(false)\" />\n }\n `,\n})\nexport class MyReportDesignerComponent {\n protected readonly store = inject(DesignerStore);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** URL of a .report.json to open. */\n readonly path = input<string | null | undefined>(null);\n /** A report definition to open (object or JSON string); used when `path` is empty. */\n readonly report = input<ReportDefinition | string | null | undefined>(null);\n /** Replaces the report's data source while designing: a URL, a JSON string, or the data itself. */\n readonly datasource = input<unknown>(null);\n /** How `datasource` is read: `json` (default) or `odata`. */\n readonly type = input<DataSourceType | null | undefined>('json');\n /** Parameter values (object, JSON string or query string `a=1&b=2`). */\n readonly params = input<Record<string, unknown> | string | null | undefined>(null);\n /** localStorage key to autosave the report to (and restore from when no path/report is given). */\n readonly persistKey = input<string | null | undefined>(null);\n /** Shows a \"Viewer ↗\" link in the toolbar pointing at this URL. */\n readonly viewerUrl = input<string | null | undefined>(null);\n /** Save downloads a .report.json file (default true). The `save` event fires either way. */\n readonly download = input(true, { transform: booleanAttribute });\n /** Toolbar title. */\n readonly brand = input<string | null | undefined>('My Report');\n\n /** Fires with the report when the user clicks Save. */\n readonly save = output<ReportDefinition>();\n /** Fires with the report after every change. */\n readonly reportChange = output<ReportDefinition>();\n /** Fires with the report after it was loaded from `path`. */\n readonly loaded = output<ReportDefinition>();\n /** Fires with a message when `path` could not be loaded. */\n readonly loadError = output<string>();\n\n protected readonly status = signal<{ text: string; error?: boolean } | null>(null);\n protected readonly showData = signal(false);\n protected readonly showPreview = signal(false);\n protected readonly showBanded = signal(false);\n protected readonly zooms = [0.5, 0.75, 1, 1.25, 1.5, 2];\n private clipboard: ReportElement[] = [];\n\n constructor() {\n // Open the report from `path`, else `report`, else the autosaved one, else a blank report.\n effect((onCleanup) => {\n const path = this.path()?.trim();\n const report = this.report();\n const key = this.persistKey()?.trim() || null;\n untracked(() => {\n this.store.persistKey.set(null);\n if (path) {\n const ac = new AbortController();\n onCleanup(() => ac.abort());\n this.status.set({ text: 'Loading report…' });\n fetchReport(path, ac.signal)\n .then((r) => {\n this.store.load(r);\n this.store.persistKey.set(key);\n this.status.set(null);\n this.loaded.emit(r);\n })\n .catch((e) => {\n if (ac.signal.aborted) return;\n const msg = `Could not load ${path}: ${(e as Error).message}`;\n this.status.set({ text: msg, error: true });\n this.loadError.emit(msg);\n });\n return;\n }\n this.status.set(null);\n const def = parseReport(report);\n if (def) {\n this.store.load(def);\n this.store.persistKey.set(key);\n } else if (!(key && this.store.restore(key))) {\n this.store.load(newReport());\n this.store.persistKey.set(key);\n }\n });\n });\n\n effect(() => this.store.dataOverride.set(this.datasource() == null || this.datasource() === '' ? null : { source: this.datasource(), type: this.type() === 'odata' ? 'odata' : 'json' }));\n effect(() => this.store.externalParams.set(parseParams(this.params())));\n\n // Report changes → (reportChange)\n let first = true;\n effect(() => {\n const r = this.store.report();\n if (first) {\n first = false;\n return;\n }\n untracked(() => this.reportChange.emit(r));\n });\n }\n\n /** Starts a new report from a template (the select resets itself to \"New ▾\"). */\n protected newFrom(kind: string): void {\n const make: Record<string, () => ReportDefinition> = {\n blank: newReport,\n receipt80: () => receiptReport(80),\n receipt58: () => receiptReport(58),\n };\n if (make[kind] && confirm('Start a new report? Unsaved changes to the current one are lost (Save first if needed).')) {\n this.store.load(make[kind]());\n }\n }\n\n protected saveReport(): void {\n const r = this.store.report();\n this.save.emit(r);\n if (!this.download()) return;\n const blob = new Blob([JSON.stringify(r, null, 2)], { type: 'application/json' });\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${r.name.replace(/[^\\w\\- ]+/g, '').trim() || 'report'}.report.json`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(a.href), 1000);\n }\n\n protected async open(e: Event): Promise<void> {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n input.value = '';\n if (!file) return;\n try {\n this.store.load(validateReport(JSON.parse(await file.text())));\n } catch (err) {\n alert('Could not open file: ' + (err as Error).message);\n }\n }\n\n /** Keys belong to the designer only when focus is inside it (or nowhere in particular). */\n private ownsKey(e: KeyboardEvent): boolean {\n const t = e.target as HTMLElement | null;\n return !t || t === document.body || t === document.documentElement || this.host.nativeElement.contains(t);\n }\n\n @HostListener('window:keydown', ['$event'])\n protected onKey(e: KeyboardEvent): void {\n const target = e.target as HTMLElement;\n if (!this.ownsKey(e)) return;\n if (this.showData() || this.showPreview() || this.showBanded() || target.closest?.('input, textarea, select, [contenteditable]')) return;\n const store = this.store;\n const sel = store.selection();\n const report = store.report();\n const ids = sel.elementIds;\n const ctrl = e.ctrlKey || e.metaKey;\n const key = e.key.toLowerCase();\n\n if (ctrl && key === 'z' && !e.shiftKey) {\n e.preventDefault();\n store.undo();\n return;\n }\n if (ctrl && (key === 'y' || (key === 'z' && e.shiftKey))) {\n e.preventDefault();\n store.redo();\n return;\n }\n if (ctrl && key === 'a' && sel.bandId) {\n e.preventDefault();\n const band = report.bands.find((b) => b.id === sel.bandId);\n if (band) store.select({ elementIds: band.elements.map((x) => x.id), bandId: band.id });\n return;\n }\n if (!ids.length && !(ctrl && key === 'v')) return;\n\n const selectedEls = () => report.bands.flatMap((b) => b.elements.filter((x) => ids.includes(x.id)));\n\n if (key === 'delete' || key === 'backspace') {\n e.preventDefault();\n store.update((r) => r.bands.forEach((b) => (b.elements = b.elements.filter((x) => !ids.includes(x.id)))));\n } else if (ctrl && key === 'c') {\n this.clipboard = structuredClone(selectedEls());\n } else if (ctrl && (key === 'v' || key === 'd')) {\n e.preventDefault();\n const source = key === 'd' ? selectedEls() : this.clipboard;\n if (!source.length) return;\n const bandId = sel.bandId ?? report.bands.find((b) => b.type === 'detail')?.id ?? report.bands[0].id;\n const copies = source.map((x) => ({ ...structuredClone(x), id: uid('el'), x: x.x + 8, y: x.y + 8 }));\n store.update((r) => r.bands.find((b) => b.id === bandId)!.elements.push(...copies));\n store.select({ elementIds: copies.map((c) => c.id), bandId });\n } else if (key.startsWith('arrow')) {\n e.preventDefault();\n const step = e.shiftKey ? 10 : store.snap() ? 8 : 1;\n const dx = key === 'arrowleft' ? -step : key === 'arrowright' ? step : 0;\n const dy = key === 'arrowup' ? -step : key === 'arrowdown' ? step : 0;\n store.update((r) =>\n r.bands.forEach((b) =>\n b.elements.forEach((x) => {\n if (!ids.includes(x.id)) return;\n x.x = Math.max(0, x.x + dx);\n x.y = Math.max(0, x.y + dy);\n }),\n ),\n );\n } else if (key === 'escape') {\n store.select({ elementIds: [], bandId: sel.bandId });\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, booleanAttribute, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport type { DataSourceType, ReportDefinition } from '../model/types';\nimport { newReport } from '../model/defaults';\nimport { DesignerStore, fetchReport, type DataState } from './designer.store';\nimport { ViewerComponent } from './viewer/viewer.component';\nimport { parseParams, parseReport } from './inputs';\n\n/**\n * The report viewer.\n *\n * ```html\n * <myreport-viewer path=\"/reports/sales.report.json\" datasource=\"/api/orders\" type=\"json\" />\n * <myreport-viewer path=\"/reports/orders.report.json\" datasource=\"https://host/odata/Orders\" type=\"odata\" />\n * ```\n */\n@Component({\n selector: 'myreport-viewer',\n standalone: true,\n imports: [ViewerComponent],\n providers: [DesignerStore],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrl: './myreport.css',\n // A class binding (not a static host class) so classes the host page set on the element are kept.\n host: { '[class.myreport]': 'true' },\n template: `\n @if (error()) {\n <div class=\"viewer-msg error\">{{ error() }}</div>\n }\n <rpt-viewer [designerUrl]=\"designerUrl()\" [allowOpen]=\"allowOpen()\" />\n `,\n})\nexport class MyReportViewerComponent {\n private readonly store = inject(DesignerStore);\n\n /** URL of the .report.json to show. */\n readonly path = input<string | null | undefined>(null);\n /** A report definition (object or JSON string); used when `path` is empty. */\n readonly report = input<ReportDefinition | string | null | undefined>(null);\n /**\n * The report's data, replacing its own data source: a URL (JSON file/API, or OData service / entity-set URL),\n * a JSON string, or (as a property) an array/object. Empty = use the report's data source.\n */\n readonly datasource = input<unknown>(null);\n /** How `datasource` is read: `json` (default) or `odata`. */\n readonly type = input<DataSourceType | null | undefined>('json');\n /** Parameter values: object, JSON string, or query string (`Country=Egypt&Year=2024`). */\n readonly params = input<Record<string, unknown> | string | null | undefined>(null);\n /** Shows a \"Designer\" link in the toolbar pointing at this URL. */\n readonly designerUrl = input<string | null | undefined>(null);\n /** Shows the toolbar's Open button for local .report.json files (default true). */\n readonly allowOpen = input(true, { transform: booleanAttribute });\n\n /** Fires with the report once it is loaded. */\n readonly loaded = output<ReportDefinition>();\n /** Fires with a message when the report or its data could not be loaded. */\n readonly loadError = output<string>();\n /** Fires with the rows once the data is loaded. */\n readonly dataLoaded = output<DataState['rows']>();\n\n protected readonly error = signal<string | null>(null);\n\n constructor() {\n effect((onCleanup) => {\n const path = this.path()?.trim();\n const report = this.report();\n untracked(() => {\n this.error.set(null);\n if (path) {\n const ac = new AbortController();\n onCleanup(() => ac.abort());\n fetchReport(path, ac.signal)\n .then((r) => {\n this.store.load(r);\n this.loaded.emit(r);\n })\n .catch((e) => {\n if (ac.signal.aborted) return;\n const msg = `Could not load ${path}: ${(e as Error).message}`;\n this.error.set(msg);\n this.loadError.emit(msg);\n });\n return;\n }\n const def = parseReport(report) ?? newReport();\n this.store.load(def);\n if (report) this.loaded.emit(def);\n });\n });\n\n effect(() => {\n const src = this.datasource();\n const type = this.type() === 'odata' ? 'odata' : 'json';\n this.store.dataOverride.set(src == null || src === '' ? null : { source: src, type });\n });\n effect(() => this.store.externalParams.set(parseParams(this.params())));\n\n // Data status → (dataLoaded) / (loadError)\n effect(() => {\n const d = this.store.data();\n untracked(() => {\n if (d.status === 'ready') this.dataLoaded.emit(d.rows);\n else if (d.status === 'error' && d.error) this.loadError.emit(d.error);\n });\n });\n }\n}\n","// Report definition model. This JSON shape is the contract between the\n// designer and any renderer (the browser preview here, or a server engine later).\n\nexport type BandType =\n | 'reportHeader'\n | 'pageHeader'\n | 'groupHeader'\n | 'detail'\n | 'groupFooter'\n | 'pageFooter'\n | 'reportFooter';\n\nexport type ElementKind = 'text' | 'field' | 'line' | 'rect' | 'image' | 'table' | 'chart' | 'barcode' | 'qrcode' | 'crosstab';\nexport type HAlign = 'left' | 'center' | 'right';\nexport type VAlign = 'top' | 'middle' | 'bottom';\n\nexport interface ElementStyle {\n fontFamily: string;\n fontSize: number;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n color: string;\n background: string; // css color or 'transparent'\n align: HAlign;\n vAlign: VAlign;\n borderWidth: number;\n borderColor: string;\n padding: number;\n}\n\nexport type FormatKind = 'none' | 'number' | 'currency' | 'percent' | 'date' | 'datetime' | 'time';\n\nexport interface FormatSpec {\n kind: FormatKind;\n decimals: number;\n currency: string;\n}\n\nexport interface ReportElement {\n id: string;\n kind: ElementKind;\n x: number;\n y: number;\n w: number;\n h: number;\n /** Template text. `{Field}`, `{sum(Amount)}`, `{PageNumber}`… For images: the URL (may contain {Field}). */\n text: string;\n format: FormatSpec;\n style: ElementStyle;\n /** Text/field grows taller to fit its content (pushing elements below down). Default true. */\n canGrow?: boolean;\n /** Only for kind 'table'. */\n table?: TableSpec;\n /** Only for kind 'chart'. */\n chart?: ChartSpec;\n /** Only for kind 'barcode' (the value is the `text` template). */\n barcode?: BarcodeSpec;\n /** Only for kind 'qrcode' (the value is the `text` template). */\n qr?: QrSpec;\n /** Only for kind 'crosstab'. */\n crosstab?: CrossTabSpec;\n /** Expression; the element is hidden when it evaluates to false, e.g. \"Amount > 100\". */\n visibleWhen?: string;\n /** Extra options for labels and fields. */\n fieldOptions?: FieldOptions;\n /** Lines and rectangles: stroke style. */\n dash?: 'solid' | 'dashed' | 'dotted';\n /** Images: how the picture fits its box. */\n imageFit?: 'contain' | 'cover' | 'fill';\n}\n\nexport interface FieldOptions {\n /** Shown when the text evaluates to empty. */\n nullText: string;\n /** In repeating bands, leave the box empty when the value equals the previous row's (per page). */\n hideDuplicates: boolean;\n /** Conditional formatting: first matching rule wins. */\n rules: StyleRule[];\n}\n\nexport interface StyleRule {\n /** Expression, e.g. \"Amount > 1000\". */\n when: string;\n color: string;\n /** '' = unchanged */\n background: string;\n bold: boolean;\n}\n\nexport interface TableColumn {\n id: string;\n header: string;\n /** Cell template evaluated per row, e.g. \"{Amount}\". */\n text: string;\n /** Optional footer (totals) template, e.g. \"{sum(Amount)}\". */\n footer: string;\n /** Relative width; columns share the table width in proportion. */\n width: number;\n align: HAlign;\n format: FormatSpec;\n}\n\n/**\n * A table lists the rows in its band's scope: all rows in Report Header/Footer, the group's\n * rows in Group Header/Footer, the current record in Detail. It flows across pages.\n */\nexport interface TableSpec {\n columns: TableColumn[];\n showHeader: boolean;\n repeatHeader: boolean;\n showFooter: boolean;\n headerHeight: number;\n rowHeight: number;\n headerBackground: string;\n headerColor: string;\n /** Alternate-row background or 'transparent'. */\n stripeBackground: string;\n /** Grid line color or 'transparent'. */\n gridColor: string;\n}\n\nexport interface Band {\n id: string;\n type: BandType;\n height: number;\n visible: boolean;\n groupId?: string;\n elements: ReportElement[];\n}\n\nexport interface Group {\n id: string;\n field: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface SortSpec {\n field: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface PageSettings {\n width: number; // px @ 96dpi\n height: number;\n marginTop: number;\n marginBottom: number;\n marginLeft: number;\n marginRight: number;\n /** Receipt roll: one page as long as its content, no page breaks; the page footer follows the content. */\n continuous?: boolean;\n}\n\nexport type DataSourceType = 'json' | 'odata';\n\nexport interface DataSourceDef {\n type: DataSourceType;\n /** JSON: file/API URL. OData: service root URL (or full entity-set URL). */\n url: string;\n /** JSON only: pasted JSON used instead of the URL when non-empty. */\n inline: string;\n /** JSON only: dot path to the array inside the response, e.g. \"data.items\". */\n dataPath: string;\n /** Extra request headers, one \"Name: value\" per line. */\n headers: string;\n // OData query options\n entitySet: string;\n select: string;\n filter: string;\n orderby: string;\n expand: string;\n top: number | null;\n /** Safety cap when following OData nextLink paging. */\n maxRows: number;\n}\n\nexport interface ReportDefinition {\n version: 1;\n name: string;\n page: PageSettings;\n dataSource: DataSourceDef;\n groups: Group[];\n sort: SortSpec[];\n bands: Band[];\n /** Values the user supplies at run time; used as @Name in formulas and {@Name} in the data source. */\n parameters?: ReportParameter[];\n /** Expression applied to every data row; rows where it is false are left out, e.g. \"Country == @Country\". */\n filter?: string;\n watermark?: Watermark;\n background?: PageBackground;\n}\n\nexport type ParameterType = 'string' | 'number' | 'date' | 'boolean';\n\nexport interface ReportParameter {\n name: string;\n label: string;\n type: ParameterType;\n defaultValue: string;\n /** Comma-separated choices; empty = free input. */\n options: string;\n}\n\nexport interface Watermark {\n enabled: boolean;\n kind: 'text' | 'image';\n text: string;\n /** URL or data: URL. */\n image: string;\n /** 0–1 */\n opacity: number;\n /** Degrees, e.g. -45. */\n angle: number;\n fontSize: number;\n color: string;\n bold: boolean;\n /** Image width as % of the page width. */\n imageScale: number;\n layer: 'behind' | 'front';\n pages: 'all' | 'first';\n}\n\nexport interface PageBackground {\n enabled: boolean;\n /** URL or data: URL. */\n image: string;\n fit: 'cover' | 'contain' | 'stretch' | 'center';\n pages: 'all' | 'first';\n}\n\nexport type AggregateKind = 'sum' | 'count' | 'avg' | 'min' | 'max';\nexport type ChartType = 'bar' | 'hbar' | 'line' | 'area' | 'pie' | 'doughnut';\n\n/** A chart over the rows in its band's scope, grouped by a category field. */\nexport interface ChartSpec {\n type: ChartType;\n title: string;\n categoryField: string;\n /** One series per value field (pie/doughnut use the first). */\n valueFields: string[];\n aggregate: AggregateKind;\n sort: 'none' | 'category' | 'valueDesc' | 'valueAsc';\n /** Extra categories fold into \"Other\". */\n maxCategories: number;\n showLegend: boolean;\n showValues: boolean;\n showGrid: boolean;\n valueFormat: FormatSpec;\n}\n\nexport type BarcodeSymbology = 'code128' | 'ean13';\n\nexport interface BarcodeSpec {\n symbology: BarcodeSymbology;\n showText: boolean;\n color: string;\n}\n\nexport interface QrSpec {\n errorCorrection: 'L' | 'M' | 'Q' | 'H';\n color: string;\n}\n\n/** Pivot: one row per rowField value, one column per columnField value, cells = aggregate(valueField). */\nexport interface CrossTabSpec {\n rowField: string;\n columnField: string;\n valueField: string;\n aggregate: AggregateKind;\n cornerText: string;\n showRowTotals: boolean;\n showColumnTotals: boolean;\n valueFormat: FormatSpec;\n headerHeight: number;\n rowHeight: number;\n headerBackground: string;\n headerColor: string;\n stripeBackground: string;\n gridColor: string;\n repeatHeader: boolean;\n}\n","/*\n * Public API of angular-my-report\n */\nexport { MyReportDesignerComponent } from './lib/ui/designer.component';\nexport { MyReportViewerComponent } from './lib/ui/viewer.component';\nexport { overrideDataSource, type DataOverride } from './lib/ui/designer.store';\n\n// Report model and engine helpers, for building or processing report definitions in code.\nexport * from './lib/model/types';\nexport { newReport, sampleReport, emptyDataSource } from './lib/model/defaults';\nexport { receiptReport } from './lib/model/factories';\nexport { loadData, detectDataSource, type LoadResult, type FieldInfo } from './lib/engine/dataSources';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["compare","AGGREGATES","GRID","JUSTIFY","ALIGN_ITEMS","FORMAT_KINDS"],"mappings":"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"}