react-design-editor
Version:
Design Editor Tools with React.js + ant.design + fabric.js
672 lines (671 loc) • 18.8 kB
TypeScript
/// <reference types="react" />
/// <reference types="animejs" />
import { fabric } from 'fabric';
import { AlignmentHandler, AnimationHandler, ChartHandler, ContextmenuHandler, CropHandler, CustomHandler, DrawingHandler, ElementHandler, EventHandler, GridHandler, GuidelineHandler, ImageHandler, InteractionHandler, LinkHandler, NodeHandler, PortHandler, ShortcutHandler, TooltipHandler, TransactionHandler, WorkareaHandler, ZoomHandler } from '.';
import { SvgObject } from '../objects/Svg';
import { CanvasOption, FabricCanvas, FabricGroup, FabricImage, FabricObject, FabricObjectOption, FabricObjects, GridOption, GuidelineOption, InteractionMode, KeyEvent, WorkareaObject, WorkareaOption } from '../utils';
import { TransactionEvent } from './TransactionHandler';
export interface HandlerCallback {
/**
* When has been added object in Canvas, Called function
*
*/
onAdd?: (object: FabricObject) => void;
/**
* Return contextmenu element
*
*/
onContext?: (el: HTMLDivElement, e: React.MouseEvent, target?: FabricObject) => Promise<any> | any;
/**
* Return tooltip element
*
*/
onTooltip?: (el: HTMLDivElement, target?: FabricObject) => Promise<any> | any;
/**
* When zoom, Called function
*/
onZoom?: (zoomRatio: number) => void;
/**
* When clicked object, Called function
*
*/
onClick?: (canvas: FabricCanvas, target: FabricObject) => void;
/**
* When double clicked object, Called function
*
*/
onDblClick?: (canvas: FabricCanvas, target: FabricObject) => void;
/**
* When modified object, Called function
*/
onModified?: (target: FabricObject) => void;
/**
* When select object, Called function
*
*/
onSelect?: (target: FabricObject) => void;
/**
* When has been removed object in Canvas, Called function
*
*/
onRemove?: (target: FabricObject) => void;
/**
* When has been undo or redo, Called function
*
*/
onTransaction?: (transaction: TransactionEvent) => void;
/**
* When has been changed interaction mode, Called function
*
*/
onInteraction?: (interactionMode: InteractionMode) => void;
/**
* When canvas has been loaded
*
*/
onLoad?: (handler: Handler, canvas?: fabric.Canvas) => void;
}
export interface HandlerOption {
/**
* Canvas id
* @type {string}
*/
id?: string;
/**
* Canvas object
* @type {FabricCanvas}
*/
canvas?: FabricCanvas;
/**
* Canvas parent element
* @type {HTMLDivElement}
*/
container?: HTMLDivElement;
/**
* Canvas editable
* @type {boolean}
*/
editable?: boolean;
/**
* Canvas interaction mode
* @type {InteractionMode}
*/
interactionMode?: InteractionMode;
/**
* Persist properties for object
* @type {string[]}
*/
propertiesToInclude?: string[];
/**
* Minimum zoom ratio
* @type {number}
*/
minZoom?: number;
/**
* Maximum zoom ratio
* @type {number}
*/
maxZoom?: number;
/**
* Zoom ratio step
* @type {number}
*/
zoomStep?: number;
/**
* Workarea option
* @type {WorkareaOption}
*/
workareaOption?: WorkareaOption;
/**
* Canvas option
* @type {CanvasOption}
*/
canvasOption?: CanvasOption;
/**
* Grid option
* @type {GridOption}
*/
gridOption?: GridOption;
/**
* Default option for Fabric Object
* @type {FabricObjectOption}
*/
objectOption?: FabricObjectOption;
/**
* Guideline option
* @type {GuidelineOption}
*/
guidelineOption?: GuidelineOption;
/**
* Whether to use zoom
* @type {boolean}
*/
zoomEnabled?: boolean;
/**
* ActiveSelection option
* @type {Partial<FabricObjectOption<fabric.ActiveSelection>>}
*/
activeSelectionOption?: Partial<FabricObjectOption<fabric.ActiveSelection>>;
/**
* Canvas width
* @type {number}
*/
width?: number;
/**
* Canvas height
* @type {number}
*/
height?: number;
/**
* Keyboard event in Canvas
* @type {KeyEvent}
*/
keyEvent?: KeyEvent;
/**
* Append custom objects
* @type {{ [key: string]: any }}
*/
fabricObjects?: FabricObjects;
handlers?: {
[key: string]: CustomHandler;
};
[key: string]: any;
}
export type HandlerOptions = HandlerOption & HandlerCallback;
/**
* Main handler for Canvas
* @class Handler
* @implements {HandlerOptions}
*/
declare class Handler implements HandlerOptions {
id: string;
canvas: FabricCanvas;
workarea: WorkareaObject;
container: HTMLDivElement;
editable: boolean;
interactionMode: InteractionMode;
minZoom: number;
maxZoom: number;
zoomStep: number;
propertiesToInclude?: string[];
workareaOption?: WorkareaOption;
canvasOption?: CanvasOption;
gridOption?: GridOption;
objectOption?: FabricObjectOption;
guidelineOption?: GuidelineOption;
keyEvent?: KeyEvent;
activeSelectionOption?: Partial<FabricObjectOption<fabric.ActiveSelection>>;
fabricObjects?: FabricObjects;
zoomEnabled?: boolean;
width?: number;
height?: number;
onAdd?: (object: FabricObject) => void;
onContext?: (el: HTMLDivElement, e: React.MouseEvent, target?: FabricObject) => Promise<any>;
onTooltip?: (el: HTMLDivElement, target?: FabricObject) => Promise<any>;
onZoom?: (zoomRatio: number) => void;
onClick?: (canvas: FabricCanvas, target: FabricObject) => void;
onDblClick?: (canvas: FabricCanvas, target: FabricObject) => void;
onModified?: (target: FabricObject) => void;
onSelect?: (target: FabricObject) => void;
onRemove?: (target: FabricObject) => void;
onTransaction?: (transaction: TransactionEvent) => void;
onInteraction?: (interactionMode: InteractionMode) => void;
onLoad?: (handler: Handler, canvas?: fabric.Canvas) => void;
imageHandler: ImageHandler;
chartHandler: ChartHandler;
elementHandler: ElementHandler;
cropHandler: CropHandler;
animationHandler: AnimationHandler;
contextmenuHandler: ContextmenuHandler;
tooltipHandler: TooltipHandler;
zoomHandler: ZoomHandler;
workareaHandler: WorkareaHandler;
interactionHandler: InteractionHandler;
transactionHandler: TransactionHandler;
gridHandler: GridHandler;
portHandler: PortHandler;
linkHandler: LinkHandler;
nodeHandler: NodeHandler;
alignmentHandler: AlignmentHandler;
guidelineHandler: GuidelineHandler;
eventHandler: EventHandler;
drawingHandler: DrawingHandler;
shortcutHandler: ShortcutHandler;
handlers: {
[key: string]: CustomHandler;
};
objectMap: Record<string, FabricObject>;
objects: FabricObject[];
activeLine?: any;
activeShape?: any;
zoom: number;
prevTarget?: FabricObject;
target?: FabricObject;
pointArray?: any[];
lineArray?: any[];
isCut: boolean;
private isRequsetAnimFrame;
private requestFrame;
/**
* Copied object
*
* @private
* @type {*}
*/
private clipboard;
constructor(options: HandlerOptions);
/**
* Initialize handler
*
* @author salgum1114
* @param {HandlerOptions} options
*/
initialize(options: HandlerOptions): void;
/**
* Init class fields
* @param {HandlerOptions} options
*/
initOption: (options: HandlerOptions) => void;
/**
* Initialize callback
* @param {HandlerOptions} options
*/
initCallback: (options: HandlerOptions) => void;
/**
* Initialize handlers
*
*/
initHandler: () => void;
/**
* Get primary object
* @returns {FabricObject[]}
*/
getObjects: () => FabricObject[];
/**
* Set key pair
* @param {keyof FabricObject} key
* @param {*} value
* @returns
*/
set: (key: keyof FabricObject, value: any) => void;
/**
* Set option
* @param {Partial<FabricObject>} option
* @returns
*/
setObject: (option: Partial<FabricObject>) => void;
/**
* Set key pair by object
* @param {FabricObject} obj
* @param {string} key
* @param {*} value
* @returns
*/
setByObject: (obj: any, key: string, value: any) => void;
/**
* Set key pair by id
* @param {string} id
* @param {string} key
* @param {*} value
*/
setById: (id: string, key: string, value: any) => void;
/**
* Set partial by object
* @param {FabricObject} obj
* @param {FabricObjectOption} option
* @returns
*/
setByPartial: (obj: FabricObject, option: FabricObjectOption) => void;
/**
* Set shadow
* @param {fabric.Shadow} option
* @returns
*/
setShadow: (option: fabric.IShadowOptions) => void;
/**
* Set the image
* @param {FabricImage} obj
* @param {(File | string)} [source]
* @param {boolean} [keepSize] Keep size of previous Image
* @param {fabric.IImageOptions} [options]
* @returns
*/
setImage: (obj: FabricImage, source?: File | string, keepSize?: boolean, options?: fabric.IImageOptions) => Promise<FabricImage>;
/**
* Set image by id
* @param {string} id
* @param {*} source
* @param {boolean} [keepSize] Keep size of previous Image
* @returns
*/
setImageById: (id: string, source: any, keepSize?: boolean) => Promise<fabric.Object & fabric.IObjectOptions & {
[key: string]: any;
id?: string;
parentId?: string;
originOpacity?: number;
originTop?: number;
originLeft?: number;
originScaleX?: number;
originScaleY?: number;
originAngle?: number;
originFill?: string | fabric.Pattern | fabric.Gradient;
originStroke?: string;
originRotation?: number;
editable?: boolean;
superType?: string;
description?: string;
animation?: import("../utils").AnimationProperty;
anime?: import("animejs").AnimeInstance;
tooltip?: import("../utils").TooltipProperty;
link?: import("../utils").LinkProperty;
animating?: boolean;
class?: string;
deletable?: boolean;
dblclick?: boolean;
cloneable?: boolean;
locked?: boolean;
rotation?: number;
clickable?: boolean;
} & fabric.Image & {
src?: string;
file?: File;
filters?: import("./ImageHandler").IFilter[];
_element?: any;
}>;
/**
* Set Svg
*
* @param {SvgObject} obj
* @param {(File | string)} [source]
* @param {boolean} [keepSize] Keep size of previous SVG
* @param {boolean} [xmlString] XML string
*/
setSvg: (obj: SvgObject, source?: File | string, keepSize?: boolean, xmlString?: boolean) => Promise<SvgObject>;
/**
* Set visible
* @param {boolean} [visible]
* @returns
*/
setVisible: (visible?: boolean) => void;
/**
* Set the position on Object
*
* @param {FabricObject} obj
* @param {boolean} [centered]
*/
centerObject: (obj: FabricObject, centered?: boolean) => void;
/**
* Add object
* @param {FabricObjectOption} obj
* @param {boolean} [centered=true]
* @param {boolean} [loaded=false]
* @param {boolean} [group=false]
* @returns
*/
add: (obj: FabricObjectOption, centered?: boolean, loaded?: boolean, group?: boolean) => FabricObject<fabric.Object>;
/**
* Add group object
*
* @param {FabricGroup} obj
* @param {boolean} [centered=true]
* @param {boolean} [loaded=false]
* @returns
*/
addGroup: (obj: FabricGroup) => FabricGroup;
/**
* Add iamge object
* @param {FabricImage} obj
* @returns
*/
addImage: (obj: FabricImage) => FabricImage;
/**
* Remove object
* @param {FabricObject} target
* @returns {any}
*/
remove: (target?: FabricObject) => void;
/**
* Remove object by id
* @param {string} id
*/
removeById: (id: string) => void;
/**
* Delete at origin object list
* @param {string} id
*/
removeOriginById: (id: string) => void;
/**
* Duplicate object
* @returns
*/
duplicate: () => void;
/**
* Duplicate object by id
* @param {string} id
* @returns
*/
duplicateById: (id: string) => boolean;
/**
* Cut object
*
*/
cut: () => void;
/**
* Copy to clipboard
*
* @param {*} value
*/
copyToClipboard: (value: any) => void;
/**
* Copy object
*
* @returns
*/
copy: () => boolean;
/**
* Paste object
*
* @returns
*/
paste: () => boolean;
/**
* Find object by object
* @param {FabricObject} obj
*/
find: (obj: FabricObject) => FabricObject<fabric.Object>;
/**
* Find object by id
* @param {string} id
* @returns {(FabricObject | null)}
*/
findById: (id: string) => FabricObject | null;
/**
* Find object in origin list
* @param {string} id
* @returns
*/
findOriginById: (id: string) => FabricObject<fabric.Object>;
/**
* Return origin object list
* @param {string} id
* @returns
*/
findOriginByIdWithIndex: (id: string) => {
object?: undefined;
index?: undefined;
} | {
object: undefined;
index: number;
};
/**
* Select object
* @param {FabricObject} obj
* @param {boolean} [find]
*/
select: (obj: FabricObject, find?: boolean) => void;
/**
* Select by id
* @param {string} id
*/
selectById: (id: string) => void;
/**
* Select all
* @returns
*/
selectAll: () => void;
/**
* Save origin width, height
* @param {FabricObject} obj
* @param {number} width
* @param {number} height
*/
originScaleToResize: (obj: FabricObject, width: number, height: number) => void;
/**
* When set the width, height, Adjust the size
* @param {number} width
* @param {number} height
*/
scaleToResize: (width: number, height: number) => void;
/**
* Import json
* @param {*} json
* @param {(canvas: FabricCanvas) => void} [callback]
*/
importJSON: (json: any, callback?: (canvas: FabricCanvas) => void) => Promise<FabricCanvas<fabric.Canvas>>;
/**
* Export json
*/
exportJSON: () => FabricObject<fabric.Object>[];
/**
* Active selection to group
* @returns
*/
toGroup: (target?: FabricObject) => FabricObject<fabric.Group>;
/**
* Group to active selection
* @returns
*/
toActiveSelection: (target?: FabricObject) => any;
/**
* Bring forward
*/
bringForward: () => void;
/**
* Bring to front
*/
bringToFront: () => void;
/**
* Send backwards
* @returns
*/
sendBackwards: () => void;
/**
* Send to back
*/
sendToBack: () => void;
/**
* Clear canvas
* @param {boolean} [includeWorkarea=false]
*/
clear: (includeWorkarea?: boolean) => void;
/**
* Start request animation frame
*/
startRequestAnimFrame: () => void;
/**
* Stop request animation frame
*/
stopRequestAnimFrame: () => void;
/**
* Save target object as image
* @param {FabricObject} targetObject
* @param {string} [option={ name: 'New Image', format: 'png', quality: 1 }]
*/
saveImage: (targetObject: FabricObject, option?: {
name: string;
format: string;
quality: number;
}) => void;
/**
* Save canvas as image
* @param {string} [option={ name: 'New Image', format: 'png', quality: 1 }]
*/
saveCanvasImage: (option?: {
name: string;
format: string;
quality: number;
}) => void;
/**
* Sets "angle" of an instance with centered rotation
*
* @param {number} angle
*/
rotate: (angle: number) => void;
/**
* Destroy canvas
*
*/
destroy: () => void;
/**
* Set canvas option
*
* @param {CanvasOption} canvasOption
*/
setCanvasOption: (canvasOption: CanvasOption) => void;
/**
* Set keyboard event
*
* @param {KeyEvent} keyEvent
*/
setKeyEvent: (keyEvent: KeyEvent) => void;
/**
* Set fabric objects
*
* @param {FabricObjects} fabricObjects
*/
setFabricObjects: (fabricObjects: FabricObjects) => void;
/**
* Set workarea option
*
* @param {WorkareaOption} workareaOption
*/
setWorkareaOption: (workareaOption: WorkareaOption) => void;
/**
* Set guideline option
*
* @param {GuidelineOption} guidelineOption
*/
setGuidelineOption: (guidelineOption: GuidelineOption) => void;
/**
* Set grid option
*
* @param {GridOption} gridOption
*/
setGridOption: (gridOption: GridOption) => void;
/**
* Set object option
*
* @param {FabricObjectOption} objectOption
*/
setObjectOption: (objectOption: FabricObjectOption) => void;
/**
* Set activeSelection option
*
* @param {Partial<FabricObjectOption<fabric.ActiveSelection>>} activeSelectionOption
*/
setActiveSelectionOption: (activeSelectionOption: Partial<FabricObjectOption<fabric.ActiveSelection>>) => void;
/**
* Set propertiesToInclude
*
* @param {string[]} propertiesToInclude
*/
setPropertiesToInclude: (propertiesToInclude: string[]) => void;
/**
* Register custom handler
*
* @param {string} name
* @param {typeof CustomHandler} handler
*/
registerHandler: (name: string, handler: typeof CustomHandler) => CustomHandler;
}
export default Handler;