customized-fabric 1.9.2 → 1.9.4
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.
- package/lib/QRCodeObject/constants.d.ts +9 -0
- package/lib/QRCodeObject/constants.js +12 -0
- package/lib/QRCodeObject/index.d.ts +41 -0
- package/lib/QRCodeObject/index.js +137 -0
- package/lib/QRCodeObject/interfaces.d.ts +20 -0
- package/lib/QRCodeObject/interfaces.js +2 -0
- package/lib/TextInputObject/index.js +1 -1
- package/lib/constants.d.ts +1 -0
- package/lib/constants.js +4 -2
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -1
- package/lib/utils/index.d.ts +3 -2
- package/lib/utils/index.js +21 -0
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QR_CODE_OBJECT_ATTRIBUTES = void 0;
|
|
4
|
+
exports.QR_CODE_OBJECT_ATTRIBUTES = {
|
|
5
|
+
name: "QR code",
|
|
6
|
+
type: "QR_CODE",
|
|
7
|
+
stroke: {
|
|
8
|
+
stroke: "#333",
|
|
9
|
+
strokeDashArray: [5, 5],
|
|
10
|
+
strokeWidth: 1,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { fabric } from "fabric";
|
|
2
|
+
import { QRCodeSettings, IQRCodeOptions } from "./interfaces";
|
|
3
|
+
import { ObjectId } from "../utils/objectId";
|
|
4
|
+
export declare const toQRCodeObject: (object: QRCode) => {
|
|
5
|
+
_id: ObjectId | undefined;
|
|
6
|
+
id: ObjectId | undefined;
|
|
7
|
+
personalizeId: number | undefined;
|
|
8
|
+
layerId: number | undefined;
|
|
9
|
+
name: string | undefined;
|
|
10
|
+
locked: boolean | undefined;
|
|
11
|
+
isAdditional: boolean | undefined;
|
|
12
|
+
layoutGroupId: string | undefined;
|
|
13
|
+
layoutGroupName: string | undefined;
|
|
14
|
+
qrCodeSettings: QRCodeSettings | undefined;
|
|
15
|
+
};
|
|
16
|
+
export default class QRCode extends fabric.Group {
|
|
17
|
+
_id?: ObjectId;
|
|
18
|
+
layerId?: number;
|
|
19
|
+
locked?: boolean;
|
|
20
|
+
imageFile?: File;
|
|
21
|
+
isAdditional?: boolean;
|
|
22
|
+
imageObject?: fabric.Image;
|
|
23
|
+
layoutGroupId?: string;
|
|
24
|
+
layoutGroupName?: string;
|
|
25
|
+
qrCodeData?: string;
|
|
26
|
+
qrCodeMargin?: number;
|
|
27
|
+
qrCodeEyeShape?: string;
|
|
28
|
+
qrCodeDataShape?: string;
|
|
29
|
+
qrCodeBackgroundColor?: string;
|
|
30
|
+
qrCodeDataColor?: string;
|
|
31
|
+
qrCodeEffectRatio?: number;
|
|
32
|
+
getSettings?: (attribute: string) => any;
|
|
33
|
+
setSizes?: (options: {
|
|
34
|
+
width?: number;
|
|
35
|
+
height?: number;
|
|
36
|
+
}) => void;
|
|
37
|
+
loadImage?: (imageInput: File | string) => Promise<void>;
|
|
38
|
+
fitImage?: (image: fabric.Image, cover?: boolean) => void;
|
|
39
|
+
getQRCodeAttributes?: () => QRCodeSettings;
|
|
40
|
+
constructor(options?: IQRCodeOptions);
|
|
41
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toQRCodeObject = void 0;
|
|
4
|
+
const fabric_1 = require("fabric");
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const objectId_1 = require("../utils/objectId");
|
|
8
|
+
const QRCodeClass = fabric_1.fabric.util.createClass(fabric_1.fabric.Group, {
|
|
9
|
+
initialize: async function (options) {
|
|
10
|
+
this.rectObject = new fabric_1.fabric.Rect({
|
|
11
|
+
width: options?.width,
|
|
12
|
+
height: options?.height,
|
|
13
|
+
fill: undefined,
|
|
14
|
+
originX: "center",
|
|
15
|
+
originY: "center",
|
|
16
|
+
objectCaching: false,
|
|
17
|
+
...constants_1.QR_CODE_OBJECT_ATTRIBUTES.stroke,
|
|
18
|
+
});
|
|
19
|
+
const group = new fabric_1.fabric.Group([this.rectObject]);
|
|
20
|
+
this.set(group);
|
|
21
|
+
this.on("scaling", () => {
|
|
22
|
+
let width = this.width * this.scaleX;
|
|
23
|
+
let height = this.height * this.scaleY;
|
|
24
|
+
this.setSizes({ width, height });
|
|
25
|
+
this.canvas?.renderAll();
|
|
26
|
+
});
|
|
27
|
+
const qrCodeSettings = { ...(options?.qrCodeSettings ?? {}) };
|
|
28
|
+
Object.keys(qrCodeSettings).map((key) => {
|
|
29
|
+
const newKey = `qrCode${key.charAt(0).toUpperCase() + key.slice(1)}`;
|
|
30
|
+
qrCodeSettings[newKey] = qrCodeSettings[key];
|
|
31
|
+
delete qrCodeSettings[key];
|
|
32
|
+
});
|
|
33
|
+
this.set({
|
|
34
|
+
_id: new objectId_1.ObjectId().toString(),
|
|
35
|
+
name: constants_1.QR_CODE_OBJECT_ATTRIBUTES.name,
|
|
36
|
+
type: constants_1.QR_CODE_OBJECT_ATTRIBUTES.type,
|
|
37
|
+
...options,
|
|
38
|
+
layerId: options?.personalizeId ?? options?.layerId,
|
|
39
|
+
...qrCodeSettings,
|
|
40
|
+
});
|
|
41
|
+
if (options?.isOriginal) {
|
|
42
|
+
this.rectObject?.set({ strokeWidth: 0 });
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (options?.hideStroke) {
|
|
46
|
+
this.rectObject?.set({ strokeWidth: 0 });
|
|
47
|
+
}
|
|
48
|
+
if (options?.imageFile) {
|
|
49
|
+
this.loadImage(options?.imageFile);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
this.fire("scaling");
|
|
53
|
+
},
|
|
54
|
+
loadImage: async function (image) {
|
|
55
|
+
const loadedImage = await (0, utils_1.loadImage)(image);
|
|
56
|
+
if (loadedImage?.width && loadedImage?.height) {
|
|
57
|
+
loadedImage.set({
|
|
58
|
+
originX: "center",
|
|
59
|
+
originY: "center",
|
|
60
|
+
});
|
|
61
|
+
this.remove(this.imageObject);
|
|
62
|
+
this.imageObject = loadedImage;
|
|
63
|
+
this.add(this.imageObject);
|
|
64
|
+
this.fitImage(this.imageObject);
|
|
65
|
+
this.canvas?.renderAll();
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
setSizes: function (options) {
|
|
69
|
+
const { width, height } = options;
|
|
70
|
+
const attributes = {
|
|
71
|
+
scaleX: 1,
|
|
72
|
+
scaleY: 1,
|
|
73
|
+
};
|
|
74
|
+
if (width) {
|
|
75
|
+
attributes.width = width;
|
|
76
|
+
}
|
|
77
|
+
if (height) {
|
|
78
|
+
attributes.height = height;
|
|
79
|
+
}
|
|
80
|
+
this.set(attributes);
|
|
81
|
+
this.rectObject?.set(attributes);
|
|
82
|
+
this.fitImage(this.imageObject);
|
|
83
|
+
this.canvas?.renderAll?.();
|
|
84
|
+
},
|
|
85
|
+
fitImage: function (image, cover = false) {
|
|
86
|
+
if (image) {
|
|
87
|
+
const imageScaleX = this.width / (image?.width ?? 1);
|
|
88
|
+
const imageScaleY = this.height / (image?.height ?? 1);
|
|
89
|
+
if (cover) {
|
|
90
|
+
imageScaleX < imageScaleY
|
|
91
|
+
? image.set({ scaleX: imageScaleY, scaleY: imageScaleY })
|
|
92
|
+
: image.set({ scaleX: imageScaleX, scaleY: imageScaleX });
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
imageScaleX > imageScaleY
|
|
96
|
+
? image.set({ scaleX: imageScaleY, scaleY: imageScaleY })
|
|
97
|
+
: image.set({ scaleX: imageScaleX, scaleY: imageScaleX });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
getSettings: function (attribute) {
|
|
102
|
+
return this.get(attribute);
|
|
103
|
+
},
|
|
104
|
+
getQRCodeAttributes: function () {
|
|
105
|
+
return {
|
|
106
|
+
data: this?.qrCodeData,
|
|
107
|
+
margin: this?.qrCodeMargin,
|
|
108
|
+
eyeShape: this?.qrCodeEyeShape,
|
|
109
|
+
dataShape: this?.qrCodeDataShape,
|
|
110
|
+
backgroundColor: this?.qrCodeBackgroundColor,
|
|
111
|
+
dataColor: this?.qrCodeDataColor,
|
|
112
|
+
effectRatio: this?.qrCodeEffectRatio,
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
const toQRCodeObject = (object) => {
|
|
117
|
+
return {
|
|
118
|
+
_id: object?._id,
|
|
119
|
+
id: object?._id,
|
|
120
|
+
personalizeId: object?.layerId,
|
|
121
|
+
layerId: object?.layerId,
|
|
122
|
+
name: object?.name,
|
|
123
|
+
locked: object?.locked,
|
|
124
|
+
isAdditional: object?.isAdditional,
|
|
125
|
+
layoutGroupId: object?.layoutGroupId,
|
|
126
|
+
layoutGroupName: object?.layoutGroupName,
|
|
127
|
+
qrCodeSettings: object.getQRCodeAttributes?.(),
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
exports.toQRCodeObject = toQRCodeObject;
|
|
131
|
+
class QRCode extends fabric_1.fabric.Group {
|
|
132
|
+
constructor(options) {
|
|
133
|
+
super();
|
|
134
|
+
return new QRCodeClass(options);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.default = QRCode;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ObjectId } from "../utils/objectId";
|
|
2
|
+
export interface QRCodeSettings {
|
|
3
|
+
data?: string;
|
|
4
|
+
margin?: string;
|
|
5
|
+
eyeShape?: string;
|
|
6
|
+
dataShape?: string;
|
|
7
|
+
backgroundColor?: string;
|
|
8
|
+
dataColor?: string;
|
|
9
|
+
effectRatio?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface IQRCodeOptions extends fabric.IGroupOptions {
|
|
12
|
+
_id?: ObjectId;
|
|
13
|
+
personalizeId?: number;
|
|
14
|
+
layerId: number;
|
|
15
|
+
imageFile?: File;
|
|
16
|
+
isOriginal?: boolean;
|
|
17
|
+
isAdditional?: boolean;
|
|
18
|
+
hideStroke?: boolean;
|
|
19
|
+
qrCodeSettings?: QRCodeSettings;
|
|
20
|
+
}
|
|
@@ -69,7 +69,7 @@ const TextInputClass = fabric_1.fabric.util.createClass(fabric_1.fabric.Group, {
|
|
|
69
69
|
},
|
|
70
70
|
autoChangeFontSize: function (changeSpeed) {
|
|
71
71
|
let maxLineWidth = Math.max(...this.textObject.__lineWidths);
|
|
72
|
-
let fontSize = this.textObject.fontSize;
|
|
72
|
+
let fontSize = this.textObject.fontSize ?? 0;
|
|
73
73
|
while (this.width - fontSize / 4 < maxLineWidth ||
|
|
74
74
|
this.height < this.textObject.height) {
|
|
75
75
|
fontSize -= changeSpeed;
|
package/lib/constants.d.ts
CHANGED
package/lib/constants.js
CHANGED
|
@@ -6,14 +6,16 @@ const constants_2 = require("./ClipartObject/constants");
|
|
|
6
6
|
const constants_3 = require("./CurvedTextObject/constants");
|
|
7
7
|
const constants_4 = require("./ImagePlaceholderObject/constants");
|
|
8
8
|
const constants_5 = require("./LayoutGroupObject/constants");
|
|
9
|
-
const constants_6 = require("./
|
|
9
|
+
const constants_6 = require("./QRCodeObject/constants");
|
|
10
|
+
const constants_7 = require("./TextInputObject/constants");
|
|
10
11
|
exports.OBJECT_TYPES = {
|
|
11
|
-
textInput:
|
|
12
|
+
textInput: constants_7.TEXT_INPUT_OBJECT_ATTRIBUTES.type,
|
|
12
13
|
curvedText: constants_3.CURVED_TEXT_OBJECT_ATTRIBUTES.type,
|
|
13
14
|
clipart: constants_2.CLIPART_OBJECT_ATTRIBUTES.type,
|
|
14
15
|
imagePlaceHolder: constants_4.IMAGE_PLACEHOLDER_OBJECT_ATTRIBUTES.type,
|
|
15
16
|
activeSelection: "activeSelection",
|
|
16
17
|
layoutGroup: constants_5.LAYOUT_GROUP_OBJECT_ATTRIBUTES.type,
|
|
17
18
|
calendar: constants_1.CALENDAR_OBJECT_ATTRIBUTES.type,
|
|
19
|
+
qrCode: constants_6.QR_CODE_OBJECT_ATTRIBUTES.type,
|
|
18
20
|
};
|
|
19
21
|
exports.MAX_TEXTURE_SIZE = 20000;
|
package/lib/index.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ import Clipart from "./ClipartObject";
|
|
|
4
4
|
import ImagePlaceholder from "./ImagePlaceholderObject";
|
|
5
5
|
import LayoutGroup from "./LayoutGroupObject";
|
|
6
6
|
import Calendar from "./CalendarObject";
|
|
7
|
+
import QRCode from "./QRCodeObject";
|
|
7
8
|
import fabric, { lockObject, lockAllObjects, loadImageFromFile, loadImageFromUrl, getObject, asyncGetObject } from "./utils";
|
|
8
9
|
import { OBJECT_TYPES } from "./constants";
|
|
9
10
|
import { IMAGE_FILTER_TYPES } from "./ImagePlaceholderObject/constants";
|
|
10
|
-
export { fabric, TextInput, Clipart, ImagePlaceholder, LayoutGroup, CurvedText, Calendar, lockObject, lockAllObjects, loadImageFromFile, loadImageFromUrl, getObject, asyncGetObject, OBJECT_TYPES, IMAGE_FILTER_TYPES, };
|
|
11
|
+
export { fabric, TextInput, Clipart, ImagePlaceholder, LayoutGroup, CurvedText, Calendar, QRCode, lockObject, lockAllObjects, loadImageFromFile, loadImageFromUrl, getObject, asyncGetObject, OBJECT_TYPES, IMAGE_FILTER_TYPES, };
|
package/lib/index.js
CHANGED
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.IMAGE_FILTER_TYPES = exports.OBJECT_TYPES = exports.asyncGetObject = exports.getObject = exports.loadImageFromUrl = exports.loadImageFromFile = exports.lockAllObjects = exports.lockObject = exports.Calendar = exports.CurvedText = exports.LayoutGroup = exports.ImagePlaceholder = exports.Clipart = exports.TextInput = exports.fabric = void 0;
|
|
29
|
+
exports.IMAGE_FILTER_TYPES = exports.OBJECT_TYPES = exports.asyncGetObject = exports.getObject = exports.loadImageFromUrl = exports.loadImageFromFile = exports.lockAllObjects = exports.lockObject = exports.QRCode = exports.Calendar = exports.CurvedText = exports.LayoutGroup = exports.ImagePlaceholder = exports.Clipart = exports.TextInput = exports.fabric = void 0;
|
|
30
30
|
const TextInputObject_1 = __importDefault(require("./TextInputObject"));
|
|
31
31
|
exports.TextInput = TextInputObject_1.default;
|
|
32
32
|
const CurvedTextObject_1 = __importDefault(require("./CurvedTextObject"));
|
|
@@ -39,6 +39,8 @@ const LayoutGroupObject_1 = __importDefault(require("./LayoutGroupObject"));
|
|
|
39
39
|
exports.LayoutGroup = LayoutGroupObject_1.default;
|
|
40
40
|
const CalendarObject_1 = __importDefault(require("./CalendarObject"));
|
|
41
41
|
exports.Calendar = CalendarObject_1.default;
|
|
42
|
+
const QRCodeObject_1 = __importDefault(require("./QRCodeObject"));
|
|
43
|
+
exports.QRCode = QRCodeObject_1.default;
|
|
42
44
|
const utils_1 = __importStar(require("./utils"));
|
|
43
45
|
exports.fabric = utils_1.default;
|
|
44
46
|
Object.defineProperty(exports, "lockObject", { enumerable: true, get: function () { return utils_1.lockObject; } });
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { ImageFilterType } from "../ImagePlaceholderObject/interfaces";
|
|
|
6
6
|
import CurvedText from "../CurvedTextObject";
|
|
7
7
|
import "./control.util";
|
|
8
8
|
import Calendar from "../CalendarObject";
|
|
9
|
+
import QRCode from "../QRCodeObject";
|
|
9
10
|
export declare const loadFontFromUrl: (url: string, name: string) => Promise<void>;
|
|
10
11
|
export declare const isFontLoaded: (name: string) => boolean;
|
|
11
12
|
export declare const loadImageFromFile: (image: File) => Promise<fabric.Image>;
|
|
@@ -19,8 +20,8 @@ export declare const lockAllObjects: (canvas: fabric.Canvas, locked: boolean, se
|
|
|
19
20
|
export declare const getObject: (object: any, options?: {
|
|
20
21
|
isOriginal?: boolean;
|
|
21
22
|
hideStroke?: boolean;
|
|
22
|
-
}) => Clipart | ImagePlaceholder | CurvedText | Calendar | TextInput | undefined;
|
|
23
|
+
}) => Clipart | ImagePlaceholder | CurvedText | Calendar | QRCode | TextInput | undefined;
|
|
23
24
|
export declare const asyncGetObject: (object: any, options?: {
|
|
24
25
|
isOriginal?: boolean;
|
|
25
|
-
}) => Promise<Clipart | ImagePlaceholder | CurvedText | Calendar | TextInput | undefined>;
|
|
26
|
+
}) => Promise<Clipart | ImagePlaceholder | CurvedText | Calendar | QRCode | TextInput | undefined>;
|
|
26
27
|
export default fabric;
|
package/lib/utils/index.js
CHANGED
|
@@ -32,6 +32,7 @@ const TextInputObject_1 = __importStar(require("../TextInputObject"));
|
|
|
32
32
|
const CurvedTextObject_1 = __importStar(require("../CurvedTextObject"));
|
|
33
33
|
require("./control.util");
|
|
34
34
|
const CalendarObject_1 = __importStar(require("../CalendarObject"));
|
|
35
|
+
const QRCodeObject_1 = __importStar(require("../QRCodeObject"));
|
|
35
36
|
const loadFontFromUrl = async (url, name) => {
|
|
36
37
|
if (!name || !url)
|
|
37
38
|
return;
|
|
@@ -166,6 +167,13 @@ const getObject = (object, options) => {
|
|
|
166
167
|
});
|
|
167
168
|
return calendarObject;
|
|
168
169
|
}
|
|
170
|
+
case constants_1.OBJECT_TYPES.qrCode: {
|
|
171
|
+
const qrCodeObject = new QRCodeObject_1.default({
|
|
172
|
+
...object,
|
|
173
|
+
...options,
|
|
174
|
+
});
|
|
175
|
+
return qrCodeObject;
|
|
176
|
+
}
|
|
169
177
|
default:
|
|
170
178
|
return;
|
|
171
179
|
}
|
|
@@ -220,6 +228,16 @@ const asyncGetObject = async (object, options) => {
|
|
|
220
228
|
}
|
|
221
229
|
return calendarObject;
|
|
222
230
|
}
|
|
231
|
+
case constants_1.OBJECT_TYPES.qrCode: {
|
|
232
|
+
const qrCodeObject = new QRCodeObject_1.default({
|
|
233
|
+
...object,
|
|
234
|
+
isOriginal: options?.isOriginal,
|
|
235
|
+
});
|
|
236
|
+
if (object?.qrCodeSettings?.url) {
|
|
237
|
+
await qrCodeObject?.loadImage?.(object?.calendarSettings?.url);
|
|
238
|
+
}
|
|
239
|
+
return qrCodeObject;
|
|
240
|
+
}
|
|
223
241
|
default:
|
|
224
242
|
return;
|
|
225
243
|
}
|
|
@@ -243,6 +261,9 @@ fabric_1.fabric.Object.prototype.toObject = (function (toObject) {
|
|
|
243
261
|
case constants_1.OBJECT_TYPES.calendar: {
|
|
244
262
|
return fabric_1.fabric.util.object.extend(toObject.call(this), (0, CalendarObject_1.toCalendarObject)(this));
|
|
245
263
|
}
|
|
264
|
+
case constants_1.OBJECT_TYPES.qrCode: {
|
|
265
|
+
return fabric_1.fabric.util.object.extend(toObject.call(this), (0, QRCodeObject_1.toQRCodeObject)(this));
|
|
266
|
+
}
|
|
246
267
|
default: {
|
|
247
268
|
return {};
|
|
248
269
|
}
|