angular-my-report 0.0.0-stage → 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 (45) hide show
  1. package/README.md +183 -2
  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 +34 -3
  45. package/public-api.d.ts +7 -0
@@ -0,0 +1,34 @@
1
+ import type { BandType, PageSettings, ReportDefinition } from '../../model/types';
2
+ import * as i0 from "@angular/core";
3
+ export declare function removeGroup(r: ReportDefinition, gid: string): void;
4
+ type PageKey = Exclude<keyof PageSettings, 'continuous'>;
5
+ export declare class ReportPropsComponent {
6
+ private readonly store;
7
+ protected readonly report: import("@angular/core").WritableSignal<ReportDefinition>;
8
+ protected readonly labels: Record<BandType, string>;
9
+ protected readonly optionalBands: BandType[];
10
+ protected readonly sizeNames: string[];
11
+ protected readonly pageFields: {
12
+ key: PageKey;
13
+ label: string;
14
+ min: number;
15
+ }[];
16
+ protected readonly landscape: import("@angular/core").Signal<boolean>;
17
+ protected readonly sizeName: import("@angular/core").Signal<string>;
18
+ protected setName(v: string): void;
19
+ protected setSize(name: string): void;
20
+ protected setContinuous(on: boolean): void;
21
+ protected setOrientation(v: string): void;
22
+ protected setPage(k: PageKey, min: number, v: number | null): void;
23
+ protected isVisible(t: BandType): boolean;
24
+ protected setVisible(t: BandType, on: boolean): void;
25
+ protected setGroupField(gid: string, v: string): void;
26
+ protected deleteGroup(gid: string): void;
27
+ protected addGroup(): void;
28
+ protected setSort(i: number, k: 'field' | 'direction', v: string): void;
29
+ protected removeSort(i: number): void;
30
+ protected addSort(): void;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportPropsComponent, never>;
32
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReportPropsComponent, "rpt-report-props", never, {}, {}, never, never, true, never>;
33
+ }
34
+ export {};
@@ -0,0 +1,31 @@
1
+ import type { FormatKind, HAlign, ReportElement, TableColumn, TableSpec } from '../../model/types';
2
+ import * as i0 from "@angular/core";
3
+ type ColorKey = 'headerBackground' | 'stripeBackground' | 'gridColor' | 'headerColor';
4
+ export declare class TablePropsComponent {
5
+ private readonly store;
6
+ readonly el: import("@angular/core").InputSignal<ReportElement>;
7
+ protected readonly formatKinds: FormatKind[];
8
+ protected readonly spec: import("@angular/core").Signal<TableSpec>;
9
+ protected readonly widths: import("@angular/core").Signal<number[]>;
10
+ /** Edits the table and keeps the element height in sync with its header/row/footer heights. */
11
+ protected set(fn: (t: TableSpec, e: ReportElement) => void): void;
12
+ protected col(i: number, fn: (c: TableColumn) => void): void;
13
+ protected colorValue(v: string): string;
14
+ protected flag: (k: "showHeader" | "repeatHeader" | "showFooter", v: boolean) => (t: TableSpec) => boolean;
15
+ protected color: (k: ColorKey, v: string) => (t: TableSpec) => string;
16
+ protected rowFill: (v: string) => (_: TableSpec, e: ReportElement) => string;
17
+ protected setHeader: (v: string) => (c: TableColumn) => string;
18
+ protected setCell: (v: string) => (c: TableColumn) => string;
19
+ protected setFooter: (v: string) => (c: TableColumn) => string;
20
+ protected setAlign: (v: HAlign) => (c: TableColumn) => HAlign;
21
+ protected setFormat: (v: FormatKind) => (c: TableColumn) => FormatKind;
22
+ protected height(k: 'headerHeight' | 'rowHeight', v: number | null): void;
23
+ protected colWidth(i: number, v: number | null): void;
24
+ protected colDecimals(i: number, v: number | null): void;
25
+ protected moveColumn(i: number, d: number): void;
26
+ protected removeColumn(i: number): void;
27
+ protected addColumn(): void;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<TablePropsComponent, never>;
29
+ static ɵcmp: i0.ɵɵComponentDeclaration<TablePropsComponent, "rpt-table-props", never, { "el": { "alias": "el"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
30
+ }
31
+ export {};
@@ -0,0 +1,17 @@
1
+ import type { PageBackground, PageSettings, Watermark } from '../../model/types';
2
+ import type { ViewPage } from './render';
3
+ import * as i0 from "@angular/core";
4
+ /** One printed page: background, watermark, bands and their elements. */
5
+ export declare class PageViewComponent {
6
+ readonly page: import("@angular/core").InputSignal<ViewPage>;
7
+ readonly settings: import("@angular/core").InputSignal<PageSettings>;
8
+ readonly watermark: import("@angular/core").InputSignal<Watermark>;
9
+ readonly background: import("@angular/core").InputSignal<PageBackground>;
10
+ readonly watermarkText: import("@angular/core").InputSignal<string>;
11
+ readonly highlights: import("@angular/core").InputSignal<ReadonlySet<string>>;
12
+ readonly active: import("@angular/core").InputSignal<string | null>;
13
+ protected readonly contentWidth: import("@angular/core").Signal<number>;
14
+ protected readonly fit: import("@angular/core").Signal<"none" | "contain" | "cover" | "fill">;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<PageViewComponent, never>;
16
+ static ɵcmp: i0.ɵɵComponentDeclaration<PageViewComponent, "rpt-page-view", never, { "page": { "alias": "page"; "required": true; "isSignal": true; }; "settings": { "alias": "settings"; "required": true; "isSignal": true; }; "watermark": { "alias": "watermark"; "required": true; "isSignal": true; }; "background": { "alias": "background"; "required": true; "isSignal": true; }; "watermarkText": { "alias": "watermarkText"; "required": false; "isSignal": true; }; "highlights": { "alias": "highlights"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
17
+ }
@@ -0,0 +1,43 @@
1
+ import type { ReportDefinition, ReportElement } from '../../model/types';
2
+ import { type Row } from '../../engine/expressions';
3
+ import type { TableRenderData } from '../../engine/table';
4
+ import type { ParamValues } from '../../engine/parameters';
5
+ export interface ViewItem {
6
+ /** Unique within the document: page:band:element. Used for find highlights. */
7
+ key: string;
8
+ el: ReportElement;
9
+ rows?: Row[];
10
+ top: number;
11
+ height: number;
12
+ content: string;
13
+ tableData?: TableRenderData;
14
+ /** Plain text of the item (content or table cells), for Find. */
15
+ text: string;
16
+ }
17
+ export interface ViewBand {
18
+ top: number;
19
+ height: number;
20
+ items: ViewItem[];
21
+ }
22
+ export interface ViewPage {
23
+ index: number;
24
+ height: number;
25
+ background: boolean;
26
+ watermark: boolean;
27
+ bands: ViewBand[];
28
+ }
29
+ /** Group headers as a navigable tree. */
30
+ export interface Bookmark {
31
+ label: string;
32
+ page: number;
33
+ top: number;
34
+ children: Bookmark[];
35
+ }
36
+ export interface ViewDocument {
37
+ pages: ViewPage[];
38
+ bookmarks: Bookmark[];
39
+ rowCount: number;
40
+ watermarkText: string;
41
+ }
42
+ /** Lays out and evaluates the whole report into ready-to-draw pages, plus group bookmarks. */
43
+ export declare function buildDocument(report: ReportDefinition, rows: Row[], params: ParamValues, root: unknown): ViewDocument;
@@ -0,0 +1,99 @@
1
+ import type { ReportParameter } from '../../model/types';
2
+ import { DesignerStore } from '../designer.store';
3
+ import { type Bookmark } from './render';
4
+ import * as i0 from "@angular/core";
5
+ type ViewMode = 'continuous' | 'single' | 'two';
6
+ type ZoomMode = 'width' | 'page' | number;
7
+ /**
8
+ * Report viewer: paged view with navigation, zoom, view modes, find, bookmarks, thumbnails,
9
+ * parameters, print and export. Used standalone (/viewer) and as the designer's preview.
10
+ */
11
+ export declare class ViewerComponent {
12
+ protected readonly store: DesignerStore;
13
+ /** Inside the designer (shows Close) vs. the standalone /viewer page. */
14
+ readonly embedded: import("@angular/core").InputSignal<boolean>;
15
+ /** Standalone viewer: shows a "Designer" link to this URL. */
16
+ readonly designerUrl: import("@angular/core").InputSignal<string | null | undefined>;
17
+ /** Standalone viewer: shows the Open button for local .report.json files. */
18
+ readonly allowOpen: import("@angular/core").InputSignal<boolean>;
19
+ private readonly host;
20
+ readonly closed: import("@angular/core").OutputEmitterRef<void>;
21
+ private readonly root;
22
+ private readonly scroll;
23
+ private readonly findBox;
24
+ protected readonly zoomSteps: number[];
25
+ protected readonly mode: import("@angular/core").WritableSignal<ViewMode>;
26
+ protected readonly zoomMode: import("@angular/core").WritableSignal<ZoomMode>;
27
+ protected readonly current: import("@angular/core").WritableSignal<number>;
28
+ protected readonly sidebar: import("@angular/core").WritableSignal<boolean>;
29
+ protected readonly sideTab: import("@angular/core").WritableSignal<"bookmarks" | "pages">;
30
+ protected readonly findOpen: import("@angular/core").WritableSignal<boolean>;
31
+ protected readonly query: import("@angular/core").WritableSignal<string>;
32
+ protected readonly matchIndex: import("@angular/core").WritableSignal<number>;
33
+ protected readonly paramsOpen: import("@angular/core").WritableSignal<boolean>;
34
+ private readonly viewport;
35
+ protected readonly settings: import("@angular/core").Signal<import("angular-my-report").PageSettings>;
36
+ protected readonly watermark: import("@angular/core").Signal<{
37
+ enabled: boolean;
38
+ kind: "text" | "image";
39
+ text: string;
40
+ image: string;
41
+ opacity: number;
42
+ angle: number;
43
+ fontSize: number;
44
+ color: string;
45
+ bold: boolean;
46
+ imageScale: number;
47
+ layer: "behind" | "front";
48
+ pages: "all" | "first";
49
+ }>;
50
+ protected readonly background: import("@angular/core").Signal<{
51
+ enabled: boolean;
52
+ image: string;
53
+ fit: "cover" | "contain" | "stretch" | "center";
54
+ pages: "all" | "first";
55
+ }>;
56
+ protected readonly parameters: import("@angular/core").Signal<ReportParameter[]>;
57
+ protected readonly doc: import("@angular/core").Signal<import("./render").ViewDocument>;
58
+ protected readonly pageCount: import("@angular/core").Signal<number>;
59
+ protected readonly shownPages: import("@angular/core").Signal<import("./render").ViewPage[]>;
60
+ /** Effective zoom factor (fit modes depend on the viewport and the page size). */
61
+ protected readonly zoom: import("@angular/core").Signal<number>;
62
+ protected readonly zoomKey: import("@angular/core").Signal<string>;
63
+ protected readonly thumbScale: import("@angular/core").Signal<number>;
64
+ protected readonly matches: import("@angular/core").Signal<{
65
+ key: string;
66
+ page: number;
67
+ }[]>;
68
+ protected readonly highlightSet: import("@angular/core").Signal<ReadonlySet<string>>;
69
+ protected readonly activeKey: import("@angular/core").Signal<string>;
70
+ protected readonly draft: import("@angular/core").WritableSignal<Record<string, string>>;
71
+ constructor();
72
+ protected choices(p: ReportParameter): string[];
73
+ protected setDraft(name: string, value: unknown): void;
74
+ protected applyParams(): void;
75
+ protected asBookmarks(v: unknown): Bookmark[];
76
+ protected goTo(index: number, top?: number): void;
77
+ protected goToBookmark(b: Bookmark): void;
78
+ /** Continuous modes: the current page is the one at the top third of the viewport. */
79
+ protected onScroll(): void;
80
+ protected setMode(m: ViewMode): void;
81
+ protected setZoom(v: string): void;
82
+ protected zoomStep(dir: 1 | -1): void;
83
+ protected toggleFind(): void;
84
+ protected setQuery(q: string): void;
85
+ protected findStep(dir: 1 | -1): void;
86
+ private revealMatch;
87
+ /** Runs `fn` with every page rendered at 100% (single-page mode would otherwise print one page). */
88
+ private withAllPages;
89
+ protected print(): void;
90
+ protected save(kind: string): void;
91
+ /** The report's data rows (after the report filter) as CSV. */
92
+ private csv;
93
+ protected fullscreen(): void;
94
+ protected openFile(e: Event): Promise<void>;
95
+ protected onKey(e: KeyboardEvent): void;
96
+ static ɵfac: i0.ɵɵFactoryDeclaration<ViewerComponent, never>;
97
+ static ɵcmp: i0.ɵɵComponentDeclaration<ViewerComponent, "rpt-viewer", never, { "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; "designerUrl": { "alias": "designerUrl"; "required": false; "isSignal": true; }; "allowOpen": { "alias": "allowOpen"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, never, true, never>;
98
+ }
99
+ export {};
@@ -0,0 +1,40 @@
1
+ import type { DataSourceType, ReportDefinition } from '../model/types';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * The report viewer.
5
+ *
6
+ * ```html
7
+ * <myreport-viewer path="/reports/sales.report.json" datasource="/api/orders" type="json" />
8
+ * <myreport-viewer path="/reports/orders.report.json" datasource="https://host/odata/Orders" type="odata" />
9
+ * ```
10
+ */
11
+ export declare class MyReportViewerComponent {
12
+ private readonly store;
13
+ /** URL of the .report.json to show. */
14
+ readonly path: import("@angular/core").InputSignal<string | null | undefined>;
15
+ /** A report definition (object or JSON string); used when `path` is empty. */
16
+ readonly report: import("@angular/core").InputSignal<string | ReportDefinition | null | undefined>;
17
+ /**
18
+ * The report's data, replacing its own data source: a URL (JSON file/API, or OData service / entity-set URL),
19
+ * a JSON string, or (as a property) an array/object. Empty = use the report's data source.
20
+ */
21
+ readonly datasource: import("@angular/core").InputSignal<unknown>;
22
+ /** How `datasource` is read: `json` (default) or `odata`. */
23
+ readonly type: import("@angular/core").InputSignal<DataSourceType | null | undefined>;
24
+ /** Parameter values: object, JSON string, or query string (`Country=Egypt&Year=2024`). */
25
+ readonly params: import("@angular/core").InputSignal<string | Record<string, unknown> | null | undefined>;
26
+ /** Shows a "Designer" link in the toolbar pointing at this URL. */
27
+ readonly designerUrl: import("@angular/core").InputSignal<string | null | undefined>;
28
+ /** Shows the toolbar's Open button for local .report.json files (default true). */
29
+ readonly allowOpen: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
30
+ /** Fires with the report once it is loaded. */
31
+ readonly loaded: import("@angular/core").OutputEmitterRef<ReportDefinition>;
32
+ /** Fires with a message when the report or its data could not be loaded. */
33
+ readonly loadError: import("@angular/core").OutputEmitterRef<string>;
34
+ /** Fires with the rows once the data is loaded. */
35
+ readonly dataLoaded: import("@angular/core").OutputEmitterRef<import("../engine/expressions").Row[]>;
36
+ protected readonly error: import("@angular/core").WritableSignal<string | null>;
37
+ constructor();
38
+ static ɵfac: i0.ɵɵFactoryDeclaration<MyReportViewerComponent, never>;
39
+ static ɵcmp: i0.ɵɵComponentDeclaration<MyReportViewerComponent, "myreport-viewer", never, { "path": { "alias": "path"; "required": false; "isSignal": true; }; "report": { "alias": "report"; "required": false; "isSignal": true; }; "datasource": { "alias": "datasource"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "params": { "alias": "params"; "required": false; "isSignal": true; }; "designerUrl": { "alias": "designerUrl"; "required": false; "isSignal": true; }; "allowOpen": { "alias": "allowOpen"; "required": false; "isSignal": true; }; }, { "loaded": "loaded"; "loadError": "loadError"; "dataLoaded": "dataLoaded"; }, never, never, true, never>;
40
+ }
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "angular-my-report",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "MyReport banded report designer and viewer for Angular: <myreport-designer> and <myreport-viewer>.",
5
+ "keywords": [
6
+ "angular",
7
+ "report",
8
+ "report-designer",
9
+ "report-viewer",
10
+ "odata",
11
+ "json",
12
+ "pdf",
13
+ "print"
14
+ ],
15
+ "license": "MIT",
16
+ "peerDependencies": {
17
+ "@angular/common": ">=18.1.0 <23.0.0",
18
+ "@angular/core": ">=18.1.0 <23.0.0",
19
+ "@angular/forms": ">=18.1.0 <23.0.0"
20
+ },
21
+ "dependencies": {
22
+ "qrcode-generator": "^1.4.4",
23
+ "tslib": "^2.3.0"
24
+ },
25
+ "sideEffects": false,
26
+ "module": "fesm2022/angular-my-report.mjs",
27
+ "typings": "index.d.ts",
28
+ "exports": {
29
+ "./package.json": {
30
+ "default": "./package.json"
31
+ },
32
+ ".": {
33
+ "types": "./index.d.ts",
34
+ "default": "./fesm2022/angular-my-report.mjs"
35
+ }
36
+ }
6
37
  }
@@ -0,0 +1,7 @@
1
+ export { MyReportDesignerComponent } from './lib/ui/designer.component';
2
+ export { MyReportViewerComponent } from './lib/ui/viewer.component';
3
+ export { overrideDataSource, type DataOverride } from './lib/ui/designer.store';
4
+ export * from './lib/model/types';
5
+ export { newReport, sampleReport, emptyDataSource } from './lib/model/defaults';
6
+ export { receiptReport } from './lib/model/factories';
7
+ export { loadData, detectDataSource, type LoadResult, type FieldInfo } from './lib/engine/dataSources';