@pdfme/ui 6.1.2-dev.25 → 6.1.2-dev.27

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.
@@ -1,10 +1,14 @@
1
1
  import { Template, DesignerProps } from '@pdfme/common';
2
2
  import { BaseUIClass } from './class.js';
3
+ import { type DesignerSelectSchemasOptions, type DesignerSchemaSelectionTarget, type DesignerSelectedSchema, type DesignerSelection, type DesignerSelectionChangeCallback } from './designerSelection.js';
3
4
  declare class Designer extends BaseUIClass {
4
5
  private onSaveTemplateCallback?;
5
6
  private onChangeTemplateCallback?;
6
7
  private onPageChangeCallback?;
8
+ private onChangeSelectionCallback?;
7
9
  private pageCursor;
10
+ private selection;
11
+ private selectSchemasHandler;
8
12
  constructor(props: DesignerProps);
9
13
  saveTemplate(): void;
10
14
  updateTemplate(template: Template): void;
@@ -14,6 +18,10 @@ declare class Designer extends BaseUIClass {
14
18
  currentPage: number;
15
19
  totalPages: number;
16
20
  }) => void): void;
21
+ onChangeSelection(cb: DesignerSelectionChangeCallback): void;
22
+ getSelection(): DesignerSelection;
23
+ getSelectedSchemas(): DesignerSelectedSchema[];
24
+ selectSchemas(targets: DesignerSchemaSelectionTarget | DesignerSchemaSelectionTarget[], options?: DesignerSelectSchemasOptions): void;
17
25
  getPageCursor(): number;
18
26
  getTotalPages(): number;
19
27
  protected render(): void;
@@ -1,9 +1,12 @@
1
1
  import React from 'react';
2
2
  import { Template, DesignerProps, Size } from '@pdfme/common';
3
- declare const TemplateEditor: ({ template, size, onSaveTemplate, onChangeTemplate, onPageCursorChange, }: Omit<DesignerProps, "domContainer"> & {
3
+ import { type DesignerSelectSchemas, type DesignerSelection } from '../../designerSelection.js';
4
+ declare const TemplateEditor: ({ template, size, onSaveTemplate, onChangeTemplate, onPageCursorChange, onChangeSelection, onRegisterSchemaSelectionHandler, }: Omit<DesignerProps, "domContainer"> & {
4
5
  size: Size;
5
6
  onSaveTemplate: (t: Template) => void;
6
7
  onChangeTemplate: (t: Template) => void;
8
+ onChangeSelection?: (selection: DesignerSelection) => void;
9
+ onRegisterSchemaSelectionHandler?: (handler: DesignerSelectSchemas | null) => void;
7
10
  } & {
8
11
  onChangeTemplate: (t: Template) => void;
9
12
  onPageCursorChange: (newPageCursor: number, totalPages: number) => void;
@@ -0,0 +1,45 @@
1
+ import { type Schema, type SchemaForUI } from '@pdfme/common';
2
+ export type DesignerSelectionBounds = {
3
+ height: number;
4
+ width: number;
5
+ x: number;
6
+ y: number;
7
+ };
8
+ export type DesignerSelectedSchema = {
9
+ name: string;
10
+ pageIndex: number;
11
+ schema: Schema;
12
+ schemaId: string;
13
+ schemaIndex: number;
14
+ type: string;
15
+ };
16
+ export type DesignerSelection = {
17
+ bounds: DesignerSelectionBounds | null;
18
+ pageIndex: number;
19
+ schemas: DesignerSelectedSchema[];
20
+ };
21
+ export type DesignerSelectionChangeCallback = (selection: DesignerSelection) => void;
22
+ export type DesignerSchemaSelectionTarget = string | {
23
+ name?: string;
24
+ pageIndex?: number;
25
+ schemaId?: string;
26
+ schemaIndex?: number;
27
+ };
28
+ export type DesignerSelectSchemasOptions = {
29
+ pageIndex?: number;
30
+ scroll?: boolean;
31
+ };
32
+ export type DesignerSelectSchemas = (targets: DesignerSchemaSelectionTarget | DesignerSchemaSelectionTarget[], options?: DesignerSelectSchemasOptions) => void;
33
+ export declare const EMPTY_DESIGNER_SELECTION: DesignerSelection;
34
+ export declare const createDesignerSelection: ({ activeSchemaIds, pageIndex, schemasList, }: {
35
+ activeSchemaIds: string[];
36
+ pageIndex: number;
37
+ schemasList: SchemaForUI[][];
38
+ }) => DesignerSelection;
39
+ export declare const normalizeDesignerSchemaSelectionTargets: (targets: DesignerSchemaSelectionTarget | DesignerSchemaSelectionTarget[]) => DesignerSchemaSelectionTarget[];
40
+ export declare const getDesignerSelectionPageIndex: (targets: DesignerSchemaSelectionTarget[], fallbackPageIndex: number, options?: DesignerSelectSchemasOptions) => number;
41
+ export declare const getSelectedSchemaIds: ({ pageIndex, schemas, targets, }: {
42
+ pageIndex: number;
43
+ schemas: SchemaForUI[];
44
+ targets: DesignerSchemaSelectionTarget[];
45
+ }) => string[];
package/dist/index.d.ts CHANGED
@@ -2,3 +2,4 @@ import Designer from './Designer.js';
2
2
  import Form from './Form.js';
3
3
  import Viewer from './Viewer.js';
4
4
  export { Designer, Viewer, Form };
5
+ export type { DesignerSchemaSelectionTarget, DesignerSelectSchemas, DesignerSelectSchemasOptions, DesignerSelectedSchema, DesignerSelection, DesignerSelectionBounds, DesignerSelectionChangeCallback, } from './designerSelection.js';
package/dist/index.js CHANGED
@@ -235269,6 +235269,81 @@ var Canvas = (props, ref) => {
235269
235269
  };
235270
235270
  var Canvas_default = (0, import_react$9.forwardRef)(Canvas);
235271
235271
  //#endregion
235272
+ //#region src/designerSelection.ts
235273
+ var EMPTY_DESIGNER_SELECTION = {
235274
+ bounds: null,
235275
+ pageIndex: 0,
235276
+ schemas: []
235277
+ };
235278
+ var toPersistedSchema = (schema) => {
235279
+ const cloned = cloneDeep$1(schema);
235280
+ delete cloned.id;
235281
+ return cloned;
235282
+ };
235283
+ var getSelectionBounds = (schemas) => {
235284
+ if (schemas.length === 0) return null;
235285
+ const left = Math.min(...schemas.map(({ schema }) => schema.position.x));
235286
+ const top = Math.min(...schemas.map(({ schema }) => schema.position.y));
235287
+ const right = Math.max(...schemas.map(({ schema }) => schema.position.x + schema.width));
235288
+ return {
235289
+ height: Math.max(...schemas.map(({ schema }) => schema.position.y + schema.height)) - top,
235290
+ width: right - left,
235291
+ x: left,
235292
+ y: top
235293
+ };
235294
+ };
235295
+ var createDesignerSelection = ({ activeSchemaIds, pageIndex, schemasList }) => {
235296
+ const pageSchemas = schemasList[pageIndex] ?? [];
235297
+ const selectedSchemas = activeSchemaIds.flatMap((schemaId) => {
235298
+ const schemaIndex = pageSchemas.findIndex((schema) => schema.id === schemaId);
235299
+ const schema = pageSchemas[schemaIndex];
235300
+ if (schemaIndex === -1 || !schema) return [];
235301
+ return [{
235302
+ name: schema.name,
235303
+ pageIndex,
235304
+ schema: toPersistedSchema(schema),
235305
+ schemaId: schema.id,
235306
+ schemaIndex,
235307
+ type: schema.type
235308
+ }];
235309
+ });
235310
+ return {
235311
+ bounds: getSelectionBounds(selectedSchemas),
235312
+ pageIndex,
235313
+ schemas: selectedSchemas
235314
+ };
235315
+ };
235316
+ var normalizeDesignerSchemaSelectionTargets = (targets) => Array.isArray(targets) ? targets : [targets];
235317
+ var getDesignerSelectionPageIndex = (targets, fallbackPageIndex, options = {}) => {
235318
+ const optionPageIndex = options.pageIndex;
235319
+ if (Number.isInteger(optionPageIndex) && optionPageIndex !== void 0 && optionPageIndex >= 0) return optionPageIndex;
235320
+ const targetPageIndex = targets.find((target) => typeof target === "object" && target !== null)?.pageIndex;
235321
+ return Number.isInteger(targetPageIndex) && targetPageIndex !== void 0 && targetPageIndex >= 0 ? targetPageIndex : fallbackPageIndex;
235322
+ };
235323
+ var getSelectedSchemaIds = ({ pageIndex, schemas, targets }) => {
235324
+ const selectedIds = /* @__PURE__ */ new Set();
235325
+ targets.forEach((target) => {
235326
+ schemas.forEach((schema, schemaIndex) => {
235327
+ if (typeof target === "string") {
235328
+ if (schema.id === target || schema.name === target) selectedIds.add(schema.id);
235329
+ return;
235330
+ }
235331
+ if (Number.isInteger(target.pageIndex) && target.pageIndex !== void 0 && target.pageIndex !== pageIndex) return;
235332
+ if (!(target.schemaId !== void 0 || target.schemaIndex !== void 0 || target.name !== void 0)) return;
235333
+ if (target.schemaId !== void 0 && target.schemaId === schema.id) {
235334
+ selectedIds.add(schema.id);
235335
+ return;
235336
+ }
235337
+ if (target.schemaIndex !== void 0 && target.schemaIndex === schemaIndex) {
235338
+ selectedIds.add(schema.id);
235339
+ return;
235340
+ }
235341
+ if (target.name !== void 0 && target.name === schema.name) selectedIds.add(schema.id);
235342
+ });
235343
+ });
235344
+ return [...selectedIds];
235345
+ };
235346
+ //#endregion
235272
235347
  //#region src/components/Spinner.tsx
235273
235348
  var Spinner = () => {
235274
235349
  const { token } = theme_default.useToken();
@@ -235544,7 +235619,7 @@ var scaleDragPosAdjustment = (adjustment, scale) => {
235544
235619
  if (scale < 1) return adjustment * -(1 - scale);
235545
235620
  return 0;
235546
235621
  };
235547
- var TemplateEditor = ({ template, size, onSaveTemplate, onChangeTemplate, onPageCursorChange }) => {
235622
+ var TemplateEditor = ({ template, size, onSaveTemplate, onChangeTemplate, onPageCursorChange, onChangeSelection, onRegisterSchemaSelectionHandler }) => {
235548
235623
  const past = (0, import_react$9.useRef)([]);
235549
235624
  const future = (0, import_react$9.useRef)([]);
235550
235625
  const canvasRef = (0, import_react$9.useRef)(null);
@@ -235567,10 +235642,59 @@ var TemplateEditor = ({ template, size, onSaveTemplate, onChangeTemplate, onPage
235567
235642
  zoomLevel,
235568
235643
  maxZoom
235569
235644
  });
235645
+ const getElementsByIds = (ids) => ids.map((id) => document.getElementById(id)).filter((element) => element instanceof HTMLElement);
235570
235646
  const onEdit = (targets) => {
235571
235647
  setActiveElements(targets.filter((target) => target instanceof HTMLElement));
235572
235648
  setHoveringSchemaId(null);
235573
235649
  };
235650
+ const selectSchemas = (0, import_react$9.useCallback)((targets, options = {}) => {
235651
+ const normalizedTargets = normalizeDesignerSchemaSelectionTargets(targets);
235652
+ if (normalizedTargets.length === 0) {
235653
+ onEditEnd();
235654
+ return;
235655
+ }
235656
+ const targetPageIndex = getDesignerSelectionPageIndex(normalizedTargets, pageCursor, options);
235657
+ const selectedSchemaIds = getSelectedSchemaIds({
235658
+ pageIndex: targetPageIndex,
235659
+ schemas: schemasList[targetPageIndex] ?? [],
235660
+ targets: normalizedTargets
235661
+ });
235662
+ const editSelectedSchemas = () => onEdit(getElementsByIds(selectedSchemaIds));
235663
+ if (selectedSchemaIds.length === 0) {
235664
+ onEditEnd();
235665
+ return;
235666
+ }
235667
+ if (targetPageIndex !== pageCursor) {
235668
+ setPageCursor(targetPageIndex);
235669
+ onPageCursorChange(targetPageIndex, schemasList.length);
235670
+ if (options.scroll !== false && canvasRef.current) canvasRef.current.scrollTop = getPagesScrollTopByIndex(pageSizes, targetPageIndex, scale);
235671
+ setTimeout(editSelectedSchemas);
235672
+ return;
235673
+ }
235674
+ editSelectedSchemas();
235675
+ }, [
235676
+ pageCursor,
235677
+ pageSizes,
235678
+ scale,
235679
+ schemasList,
235680
+ onPageCursorChange
235681
+ ]);
235682
+ (0, import_react$9.useEffect)(() => {
235683
+ onRegisterSchemaSelectionHandler?.(selectSchemas);
235684
+ return () => onRegisterSchemaSelectionHandler?.(null);
235685
+ }, [onRegisterSchemaSelectionHandler, selectSchemas]);
235686
+ (0, import_react$9.useEffect)(() => {
235687
+ onChangeSelection?.(createDesignerSelection({
235688
+ activeSchemaIds: activeElements.map((element) => element.id),
235689
+ pageIndex: pageCursor,
235690
+ schemasList
235691
+ }));
235692
+ }, [
235693
+ activeElements,
235694
+ onChangeSelection,
235695
+ pageCursor,
235696
+ schemasList
235697
+ ]);
235574
235698
  const onEditEnd = () => {
235575
235699
  setActiveElements([]);
235576
235700
  setHoveringSchemaId(null);
@@ -235916,7 +236040,10 @@ var Designer = class extends BaseUIClass {
235916
236040
  _defineProperty$14(this, "onSaveTemplateCallback", void 0);
235917
236041
  _defineProperty$14(this, "onChangeTemplateCallback", void 0);
235918
236042
  _defineProperty$14(this, "onPageChangeCallback", void 0);
236043
+ _defineProperty$14(this, "onChangeSelectionCallback", void 0);
235919
236044
  _defineProperty$14(this, "pageCursor", 0);
236045
+ _defineProperty$14(this, "selection", EMPTY_DESIGNER_SELECTION);
236046
+ _defineProperty$14(this, "selectSchemasHandler", null);
235920
236047
  checkDesignerProps(props);
235921
236048
  }
235922
236049
  saveTemplate() {
@@ -235939,6 +236066,20 @@ var Designer = class extends BaseUIClass {
235939
236066
  onPageChange(cb) {
235940
236067
  this.onPageChangeCallback = cb;
235941
236068
  }
236069
+ onChangeSelection(cb) {
236070
+ this.onChangeSelectionCallback = cb;
236071
+ }
236072
+ getSelection() {
236073
+ if (!this.domContainer) throw Error(DESTROYED_ERR_MSG);
236074
+ return cloneDeep$1(this.selection);
236075
+ }
236076
+ getSelectedSchemas() {
236077
+ return this.getSelection().schemas;
236078
+ }
236079
+ selectSchemas(targets, options) {
236080
+ if (!this.domContainer) throw Error(DESTROYED_ERR_MSG);
236081
+ this.selectSchemasHandler?.(targets, options);
236082
+ }
235942
236083
  getPageCursor() {
235943
236084
  return this.pageCursor;
235944
236085
  }
@@ -235972,6 +236113,13 @@ var Designer = class extends BaseUIClass {
235972
236113
  totalPages
235973
236114
  });
235974
236115
  },
236116
+ onChangeSelection: (selection) => {
236117
+ this.selection = cloneDeep$1(selection);
236118
+ if (this.onChangeSelectionCallback) this.onChangeSelectionCallback(cloneDeep$1(selection));
236119
+ },
236120
+ onRegisterSchemaSelectionHandler: (handler) => {
236121
+ this.selectSchemasHandler = handler;
236122
+ },
235975
236123
  size: this.size
235976
236124
  })
235977
236125
  }));