UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

83 lines 14.8 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import qrcodegen from './qrcodegen'; export const ERROR_LEVEL_MAP = { L: qrcodegen.QrCode.Ecc.LOW, M: qrcodegen.QrCode.Ecc.MEDIUM, Q: qrcodegen.QrCode.Ecc.QUARTILE, H: qrcodegen.QrCode.Ecc.HIGH }; const DEFAULT_SIZE = 160; const DEFAULT_SCALE = 10; const DEFAULT_PADDING = 10; const DEFAULT_COLOR = '#000000'; const DEFAULT_BACKGROUND_COLOR = '#FFFFFF'; const DEFAULT_ICONSIZE = 40; const DEFAULT_LEVEL = 'M'; export const plotQRCodeData = (value, level = DEFAULT_LEVEL) => { if (!value) { return null; } return qrcodegen.QrCode.encodeText(value, ERROR_LEVEL_MAP[level]); }; export function drawCanvas(canvas, value, size = DEFAULT_SIZE, scale = DEFAULT_SCALE, padding = DEFAULT_PADDING, color = DEFAULT_COLOR, backgroundColor = DEFAULT_BACKGROUND_COLOR, iconSize = DEFAULT_ICONSIZE, icon) { const ctx = canvas.getContext('2d'); const formattedPadding = formatPadding(padding); canvas.style.width = `${size}px`; canvas.style.height = `${size}px`; if (!value) { ctx.fillStyle = 'rgba(0, 0, 0, 0)'; ctx.fillRect(0, 0, canvas.width, canvas.height); return; } canvas.width = value.size * scale + formattedPadding[1] + formattedPadding[3]; canvas.height = value.size * scale + formattedPadding[0] + formattedPadding[2]; if (!icon) { drawCanvasBackground(ctx, canvas.width, canvas.height, scale, backgroundColor); drawCanvasColor(ctx, value, scale, formattedPadding, backgroundColor, color); } else { const iconImg = new Image(); iconImg.src = icon; iconImg.crossOrigin = 'anonymous'; iconImg.width = iconSize * (canvas.width / size); iconImg.height = iconSize * (canvas.width / size); iconImg.onload = () => { drawCanvasBackground(ctx, canvas.width, canvas.height, scale, backgroundColor); drawCanvasColor(ctx, value, scale, formattedPadding, backgroundColor, color); const iconCoordinate = canvas.width / 2 - (iconSize * (canvas.width / size)) / 2; ctx.fillRect(iconCoordinate, iconCoordinate, iconSize * (canvas.width / size), iconSize * (canvas.width / size)); ctx.drawImage(iconImg, iconCoordinate, iconCoordinate, iconSize * (canvas.width / size), iconSize * (canvas.width / size)); }; iconImg.onerror = () => { drawCanvasBackground(ctx, canvas.width, canvas.height, scale, backgroundColor); drawCanvasColor(ctx, value, scale, formattedPadding, backgroundColor, color); }; } } export function drawCanvasColor(ctx, value, scale, padding, backgroundColor, color) { for (let y = 0; y < value.size; y++) { for (let x = 0; x < value.size; x++) { ctx.fillStyle = value.getModule(x, y) ? color : backgroundColor; ctx.fillRect(padding[3] + x * scale, padding[0] + y * scale, scale, scale); } } } export function drawCanvasBackground(ctx, width, height, scale, backgroundColor) { ctx.fillStyle = backgroundColor; ctx.fillRect(0, 0, width * scale, height * scale); } export function formatPadding(padding) { if (Array.isArray(padding)) { // Build an array of 4 elements and repeat values from padding as necessary to set the value of the array return Array(4) .fill(0) .map((_, index) => padding[index % padding.length]); } else { return [padding, padding, padding, padding]; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXJjb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9xci1jb2RlL3FyY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFFcEMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUErRDtJQUN6RixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRztJQUMzQixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTTtJQUM5QixDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUTtJQUNoQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSTtDQUNwQixDQUFDO0FBRVgsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ3pCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQ2hDLE1BQU0sd0JBQXdCLEdBQUcsU0FBUyxDQUFDO0FBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sYUFBYSxHQUFpQyxHQUFHLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQzVCLEtBQWEsRUFDYixRQUFzQyxhQUFhLEVBQzFCLEVBQUU7SUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsTUFBeUIsRUFDekIsS0FB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RUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxHQUE2QixFQUM3QixLQUFhLEVBQ2IsTUFBYyxFQUNkLEtBQWEsRUFDYixlQUF1QjtJQUV2QixHQUFHLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztJQUNoQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBMEI7SUFDdEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0IseUdBQXlHO1FBQ3pHLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNaLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHFyY29kZWdlbiBmcm9tICcuL3FyY29kZWdlbic7XG5cbmV4cG9ydCBjb25zdCBFUlJPUl9MRVZFTF9NQVA6IHsgW2luZGV4IGluICdMJyB8ICdNJyB8ICdRJyB8ICdIJ106IHFyY29kZWdlbi5RckNvZGUuRWNjIH0gPSB7XG4gIEw6IHFyY29kZWdlbi5RckNvZGUuRWNjLkxPVyxcbiAgTTogcXJjb2RlZ2VuLlFyQ29kZS5FY2MuTUVESVVNLFxuICBROiBxcmNvZGVnZW4uUXJDb2RlLkVjYy5RVUFSVElMRSxcbiAgSDogcXJjb2RlZ2VuLlFyQ29kZS5FY2MuSElHSFxufSBhcyBjb25zdDtcblxuY29uc3QgREVGQVVMVF9TSVpFID0gMTYwO1xuY29uc3QgREVGQVVMVF9TQ0FMRSA9IDEwO1xuY29uc3QgREVGQVVMVF9QQURESU5HID0gMTA7XG5jb25zdCBERUZBVUxUX0NPTE9SID0gJyMwMDAwMDAnO1xuY29uc3QgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SID0gJyNGRkZGRkYnO1xuY29uc3QgREVGQVVMVF9JQ09OU0laRSA9IDQwO1xuY29uc3QgREVGQVVMVF9MRVZFTDoga2V5b2YgdHlwZW9mIEVSUk9SX0xFVkVMX01BUCA9ICdNJztcblxuZXhwb3J0IGNvbnN0IHBsb3RRUkNvZGVEYXRhID0gKFxuICB2YWx1ZTogc3RyaW5nLFxuICBsZXZlbDoga2V5b2YgdHlwZW9mIEVSUk9SX0xFVkVMX01BUCA9IERFRkFVTFRfTEVWRUxcbik6IHFyY29kZWdlbi5RckNvZGUgfCBudWxsID0+IHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBxcmNvZGVnZW4uUXJDb2RlLmVuY29kZVRleHQodmFsdWUsIEVSUk9SX0xFVkVMX01BUFtsZXZlbF0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdDYW52YXMoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gIHZhbHVlOiBxcmNvZGVnZW4uUXJDb2RlIHwgbnVsbCxcbiAgc2l6ZSA9IERFRkFVTFRfU0laRSxcbiAgc2NhbGUgPSBERUZBVUxUX1NDQUxFLFxuICBwYWRkaW5nOiBudW1iZXIgfCBudW1iZXJbXSA9IERFRkFVTFRfUEFERElORyxcbiAgY29sb3IgPSBERUZBVUxUX0NPTE9SLFxuICBiYWNrZ3JvdW5kQ29sb3IgPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IsXG4gIGljb25TaXplID0gREVGQVVMVF9JQ09OU0laRSxcbiAgaWNvbj86IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgY29uc3QgZm9ybWF0dGVkUGFkZGluZyA9IGZvcm1hdFBhZGRpbmcocGFkZGluZyk7XG4gIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3NpemV9cHhgO1xuICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7c2l6ZX1weGA7XG4gIGlmICghdmFsdWUpIHtcbiAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoMCwgMCwgMCwgMCknO1xuICAgIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgIHJldHVybjtcbiAgfVxuICBjYW52YXMud2lkdGggPSB2YWx1ZS5zaXplICogc2NhbGUgKyBmb3JtYXR0ZWRQYWRkaW5nWzFdICsgZm9ybWF0dGVkUGFkZGluZ1szXTtcbiAgY2FudmFzLmhlaWdodCA9IHZhbHVlLnNpemUgKiBzY2FsZSArIGZvcm1hdHRlZFBhZGRpbmdbMF0gKyBmb3JtYXR0ZWRQYWRkaW5nWzJdO1xuICBpZiAoIWljb24pIHtcbiAgICBkcmF3Q2FudmFzQmFja2dyb3VuZChjdHgsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCwgc2NhbGUsIGJhY2tncm91bmRDb2xvcik7XG4gICAgZHJhd0NhbnZhc0NvbG9yKGN0eCwgdmFsdWUsIHNjYWxlLCBmb3JtYXR0ZWRQYWRkaW5nLCBiYWNrZ3JvdW5kQ29sb3IsIGNvbG9yKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpY29uSW1nID0gbmV3IEltYWdlKCk7XG4gICAgaWNvbkltZy5zcmMgPSBpY29uO1xuICAgIGljb25JbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICBpY29uSW1nLndpZHRoID0gaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSk7XG4gICAgaWNvbkltZy5oZWlnaHQgPSBpY29uU2l6ZSAqIChjYW52YXMud2lkdGggLyBzaXplKTtcbiAgICBpY29uSW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGRyYXdDYW52YXNCYWNrZ3JvdW5kKGN0eCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0LCBzY2FsZSwgYmFja2dyb3VuZENvbG9yKTtcbiAgICAgIGRyYXdDYW52YXNDb2xvcihjdHgsIHZhbHVlLCBzY2FsZSwgZm9ybWF0dGVkUGFkZGluZywgYmFja2dyb3VuZENvbG9yLCBjb2xvcik7XG4gICAgICBjb25zdCBpY29uQ29vcmRpbmF0ZSA9IGNhbnZhcy53aWR0aCAvIDIgLSAoaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSkpIC8gMjtcblxuICAgICAgY3R4LmZpbGxSZWN0KGljb25Db29yZGluYXRlLCBpY29uQ29vcmRpbmF0ZSwgaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSksIGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoXG4gICAgICAgIGljb25JbWcsXG4gICAgICAgIGljb25Db29yZGluYXRlLFxuICAgICAgICBpY29uQ29vcmRpbmF0ZSxcbiAgICAgICAgaWNvblNpemUgKiAoY2FudmFzLndpZHRoIC8gc2l6ZSksXG4gICAgICAgIGljb25TaXplICogKGNhbnZhcy53aWR0aCAvIHNpemUpXG4gICAgICApO1xuICAgIH07XG4gICAgaWNvbkltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgZHJhd0NhbnZhc0JhY2tncm91bmQoY3R4LCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQsIHNjYWxlLCBiYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgZHJhd0NhbnZhc0NvbG9yKGN0eCwgdmFsdWUsIHNjYWxlLCBmb3JtYXR0ZWRQYWRkaW5nLCBiYWNrZ3JvdW5kQ29sb3IsIGNvbG9yKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Q2FudmFzQ29sb3IoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICB2YWx1ZTogcXJjb2RlZ2VuLlFyQ29kZSxcbiAgc2NhbGU6IG51bWJlcixcbiAgcGFkZGluZzogbnVtYmVyW10sXG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nLFxuICBjb2xvcjogc3RyaW5nXG4pOiB2b2lkIHtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCB2YWx1ZS5zaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHZhbHVlLnNpemU7IHgrKykge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IHZhbHVlLmdldE1vZHVsZSh4LCB5KSA/IGNvbG9yIDogYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KHBhZGRpbmdbM10gKyB4ICogc2NhbGUsIHBhZGRpbmdbMF0gKyB5ICogc2NhbGUsIHNjYWxlLCBzY2FsZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Q2FudmFzQmFja2dyb3VuZChcbiAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gIGN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCAqIHNjYWxlLCBoZWlnaHQgKiBzY2FsZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYWRkaW5nKHBhZGRpbmc6IG51bWJlciB8IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYWRkaW5nKSkge1xuICAgIC8vIEJ1aWxkIGFuIGFycmF5IG9mIDQgZWxlbWVudHMgYW5kIHJlcGVhdCB2YWx1ZXMgZnJvbSBwYWRkaW5nIGFzIG5lY2Vzc2FyeSB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBhcnJheVxuICAgIHJldHVybiBBcnJheSg0KVxuICAgICAgLmZpbGwoMClcbiAgICAgIC5tYXAoKF8sIGluZGV4KSA9PiBwYWRkaW5nW2luZGV4ICUgcGFkZGluZy5sZW5ndGhdKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW3BhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmddO1xuICB9XG59XG4iXX0=