import { Event, EmitType, INotifyPropertyChanged } from '@syncfusion/ej2-base'; import { NotifyPropertyChanges, Property, addClass } from '@syncfusion/ej2-base'; import { SignatureBase, SignatureBeforeSaveEventArgs, SignatureChangeEventArgs } from '../common/signature-base'; import { SignatureModel } from './signature-model'; /** * The Signature component allows user to draw smooth signatures as vector outline of strokes using variable width bezier curve interpolation. * It allows to save signature as image. * You can use your finger, pen, or mouse on a tablet, touchscreen, etc., to draw your own signature on this Signature component. * Signature component is a user interface to draw the Signature or Text. * It provides supports for various Background color, Stroke color and Background Image. * ```html * * ``` * ```typescript * * ``` */ @NotifyPropertyChanges export class Signature extends SignatureBase implements INotifyPropertyChanged { /** * Gets or sets the background color of the component. * The background color of the component that accepts hex value, rgb and text (like 'red'). The default value is ''. * * @default '' */ @Property('') public backgroundColor: string; /** * Gets or sets the background image for the component. * An image that used to fill the background of the component. The default value is ''. * * @default '' */ @Property('') public backgroundImage: string; /** * Gets or sets whether to disable the signature component where the opacity is set to show disabled state. * True, if the signature component is disabled for user interaction. The default value is false. * * @default false */ @Property(false) public disabled: boolean; /** * Gets or sets whether to prevent the interaction in signature component. * True, if the signature component is read only state where the user interaction is prevented. The default value is false. * * @default false */ @Property(false) public isReadOnly: boolean; /** * Gets or sets whether to save the signature along with Background Color and background Image while saving. * True, if signature component to save with background. The default value is true. * * @default true */ @Property(true) public saveWithBackground: boolean; /** * Gets or sets the stroke color of the signature. * The color of the signature stroke that accepts hex value, rgb and text (like 'red'). The default value is "#000000". * * @default '#000000' */ @Property('#000000') public strokeColor: string; /** * Gets or sets the minimum stroke width for signature. * The signature component calculates stroke width based on Velocity, MinStrokeWidth and MaxStrokeWidth. * The minimum width of stroke. The default value is 0.5. * * @default 0.5 */ @Property(0.5) public minStrokeWidth: number; /** * Gets or sets the maximum stroke width for signature. * The signature component calculates stroke width based on Velocity, MinStrokeWidth and MaxStrokeWidth. * The maximum width of stroke. The default value is 2.0. * * @default 2 */ @Property(2) public maxStrokeWidth: number; /** * Gets or sets the velocity to calculate the stroke thickness based on the pressure of the contact on the digitizer surface. * The Signature component calculates stroke thickness based on Velocity, MinStrokeWidth and MaxStrokeWidth. * The default value is 0.7. * * @default 0.7 */ @Property(0.7) public velocity: number; /** * Overrides the global culture and localization value for this component. Default global culture is 'en-US'. * * @default 'en-US' * @private */ @Property('en-US') public locale: string; /** * Specifies the Signature in RTL mode that displays the content in the right-to-left direction. * * @default false * @private */ @Property(false) public enableRtl: boolean; /** * Gets or sets whether to persist component's state between page reloads. * True, if the component's state persistence is enabled. The default value is false. * Component's property will be stored in browser local storage to persist component's state when page reloads. * * @default false */ @Property(false) public enablePersistence: boolean; /** * Gets or sets an event callback that is raised while saving the signature. * The file name and the file type can be changed using SignatureBeforeSaveEventArgs and SignatureFileType. * The event callback is raised only for the keyboard action (Ctrl + S). * * @event beforeSave */ @Event() public beforeSave: EmitType; /** * Gets or sets an event callback that is raised for the actions like undo, redo, clear and while user complete signing on signature component. * * @event change */ @Event() public change: EmitType; /** * Triggers once the component rendering is completed. * * @event created */ @Event() public created: EmitType; /** * Constructor for creating the widget. * * @param {SignatureModel} options - Specifies the Signature model. * @param {string | HTMLCanvasElement} element - Specifies the element. * @private */ constructor(options?: SignatureModel, element?: string | HTMLCanvasElement) { super(options, element); } protected preRender(): void { // pre render code snippets } /** * To Initialize the component rendering * * @private * @returns {void} */ protected render(): void { this.initialize(); } public initialize(): void { this.element.setAttribute('role', 'img'); this.element.setAttribute('aria-label', 'signature'); addClass([this.element], 'e-' + this.getModuleName()); super.initialize(this.element); if (this.enablePersistence) { this.loadPersistedSignature(); } } /** * To get component name. * * @returns {string} - Module Name * @private */ protected getModuleName(): string { return super.getModuleName(); } /** * To get the properties to be maintained in the persisted state. * * @returns {string} - Persist data */ protected getPersistData(): string { return super.getPersistData(); } /** * Called internally if any of the property value changed. * * @param {SignatureModel} newProp - Specifies new properties * @param {SignatureModel} oldProp - Specifies old properties * @returns {void} * @private */ public onPropertyChanged(newProp: SignatureModel, oldProp: SignatureModel): void { for (const prop of Object.keys(newProp)) { switch (prop) { case 'backgroundColor': super.propertyChanged(prop, newProp.backgroundColor); break; case 'backgroundImage': super.propertyChanged(prop, newProp.backgroundImage); break; case 'strokeColor': if (newProp.strokeColor !== oldProp.strokeColor) { super.propertyChanged(prop, newProp.strokeColor); } break; case 'maxStrokeWidth': if (newProp.maxStrokeWidth !== oldProp.maxStrokeWidth) { super.propertyChanged(prop, newProp.maxStrokeWidth); } break; case 'minStrokeWidth': if (newProp.minStrokeWidth !== oldProp.minStrokeWidth) { super.propertyChanged(prop, newProp.minStrokeWidth); } break; case 'velocity': if (newProp.velocity !== oldProp.velocity) { super.propertyChanged(prop, newProp.velocity); } break; case 'saveWithBackground': super.propertyChanged(prop, newProp.saveWithBackground); break; case 'isReadOnly': super.propertyChanged(prop, newProp.isReadOnly); break; case 'disabled': super.propertyChanged(prop, newProp.disabled); break; } } } }