ngx-diagrams
Version:
> Light Weight, Modular, Typed Diagram Engine for Angular
128 lines • 16.5 kB
JavaScript
// eslint-disable no-bitwise
import SVGPath from 'paths-js/path';
import { distinctUntilChanged, shareReplay, takeUntil, tap } from 'rxjs/operators';
import { ROUTING_SCALING_FACTOR } from '../plugins/smart-routing.plugin';
export var LOG_LEVEL;
(function (LOG_LEVEL) {
LOG_LEVEL[LOG_LEVEL["LOG"] = 0] = "LOG";
LOG_LEVEL[LOG_LEVEL["ERROR"] = 1] = "ERROR";
})(LOG_LEVEL || (LOG_LEVEL = {}));
// @internal
export let __DEV__ = true;
// @internal
export let __LOG__ = LOG_LEVEL.ERROR;
export function enableDiagramProdMode() {
__DEV__ = false;
}
// @internal
export function setLogLevel(level) {
__LOG__ = level;
}
// @internal
export function isDev() {
return __DEV__;
}
// @internal
export function log(message, level = LOG_LEVEL.LOG, ...args) {
if (isDev() && __LOG__ === level) {
if (__LOG__ === LOG_LEVEL.ERROR) {
console.error(message, ...args);
}
console.log(message, ...args);
}
}
/**
* rxjs log operator
* @internal
*/
export function withLog(message, level = LOG_LEVEL.LOG, ...args) {
return (source) => isDev()
? source.pipe(tap((val) => log(message, level, val, ...args)))
: source;
}
/**
* rxjs entity properties operator
* @internal
*/
export function entityProperty(destroyedNotifier, replayBy = 1, logMessage = '') {
return (source) => source.pipe(distinctUntilChanged((a, b) => a instanceof Map || b instanceof Map ? false : a === b), shareReplay(replayBy), withLog(logMessage), takeUntil(destroyedNotifier));
}
/**
* Generates a unique ID
*/
export function UID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (Math.random() * 16) | 0;
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
export function isArray(val) {
return Array.isArray(val);
}
export function isString(val) {
return typeof val === 'string';
}
export function isFunction(val) {
return typeof val === 'function';
}
// @internal
export function isNil(v) {
return v === null || v === undefined;
}
export function coerceArray(value) {
if (isNil(value)) {
return [];
}
return Array.isArray(value) ? value : [value];
}
export function isEmptyArray(arr) {
return !arr || !isArray(arr) || arr.length === 0;
}
export function mapToArray(map) {
const result = [];
for (const key in map) {
if (!isNil(map[key])) {
result.push(map[key]);
}
}
return result;
}
export function mapToEntries(map) {
const result = [];
for (const key in map) {
result.push([key, map[key]]);
}
return result;
}
export function unique(arr) {
return [...new Set(arr)];
}
export function arrayToMap(arr) {
const result = {};
for (const val of arr) {
if (!isNil(val)) {
result[val.id] = val;
}
}
return result;
}
export function generateLinePath(firstPoint, lastPoint) {
return `M${firstPoint.x$},${firstPoint.y} L ${lastPoint.x$},${lastPoint.y}`;
}
export function generateCurvePath(firstPoint, lastPoint, curvy = 0) {
const isHorizontal = Math.abs(firstPoint.x - lastPoint.x) > Math.abs(firstPoint.y - lastPoint.y);
const curvyX = isHorizontal ? curvy : 0;
const curvyY = isHorizontal ? 0 : curvy;
return `M${firstPoint.x},${firstPoint.y} C ${firstPoint.x + curvyX},${firstPoint.y + curvyY}
${lastPoint.x - curvyX},${lastPoint.y - curvyY} ${lastPoint.x},${lastPoint.y}`;
}
export function generateDynamicPath(pathCoords) {
let path = SVGPath();
path = path.moveto(pathCoords[0][0] * ROUTING_SCALING_FACTOR, pathCoords[0][1] * ROUTING_SCALING_FACTOR);
pathCoords.slice(1).forEach((coords) => {
path = path.lineto(coords[0] * ROUTING_SCALING_FACTOR, coords[1] * ROUTING_SCALING_FACTOR);
});
return path.print();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1raXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvdXRpbHMvdG9vbC1raXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2QkFBNkI7QUFDN0IsT0FBTyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBS3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5GLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR3pFLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsdUNBQUssQ0FBQTtJQUNMLDJDQUFPLENBQUE7QUFDVCxDQUFDLEVBSFcsU0FBUyxLQUFULFNBQVMsUUFHcEI7QUFFRCxZQUFZO0FBQ1osTUFBTSxDQUFDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztBQUMxQixZQUFZO0FBQ1osTUFBTSxDQUFDLElBQUksT0FBTyxHQUFjLFNBQVMsQ0FBQyxLQUFLLENBQUM7QUFFaEQsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxZQUFZO0FBQ1osTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFnQjtJQUMxQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxZQUFZO0FBQ1osTUFBTSxVQUFVLEtBQUs7SUFDbkIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFlBQVk7QUFDWixNQUFNLFVBQVUsR0FBRyxDQUNqQixPQUFlLEVBQ2YsUUFBbUIsU0FBUyxDQUFDLEdBQUcsRUFDaEMsR0FBRyxJQUFXO0lBRWQsSUFBSSxLQUFLLEVBQUUsSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFO1FBQ2hDLElBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQyxLQUFL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Q0FBQztJQUNGLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsRUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLHNCQUFzQixDQUNuQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUgIG5vLWJpdHdpc2VcbmltcG9ydCBTVkdQYXRoIGZyb20gJ3BhdGhzLWpzL3BhdGgnO1xuLyoqXG4gKiBVdGlsaXR5IHBhdGhpbmcgYW5kIHJvdXRpbmcgc2VydmljZVxuICovXG5pbXBvcnQgeyBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzaGFyZVJlcGxheSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29yZHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3Jkcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUk9VVElOR19TQ0FMSU5HX0ZBQ1RPUiB9IGZyb20gJy4uL3BsdWdpbnMvc21hcnQtcm91dGluZy5wbHVnaW4nO1xuaW1wb3J0IHsgRW50cmllcywgSGFzaE1hcCB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZW51bSBMT0dfTEVWRUwge1xuICAnTE9HJyxcbiAgJ0VSUk9SJyxcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgbGV0IF9fREVWX18gPSB0cnVlO1xuLy8gQGludGVybmFsXG5leHBvcnQgbGV0IF9fTE9HX186IExPR19MRVZFTCA9IExPR19MRVZFTC5FUlJPUjtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZURpYWdyYW1Qcm9kTW9kZSgpOiB2b2lkIHtcbiAgX19ERVZfXyA9IGZhbHNlO1xufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dMZXZlbChsZXZlbDogTE9HX0xFVkVMKTogdm9pZCB7XG4gIF9fTE9HX18gPSBsZXZlbDtcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gaXNEZXYoKTogYm9vbGVhbiB7XG4gIHJldHVybiBfX0RFVl9fO1xufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBsb2coXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbGV2ZWw6IExPR19MRVZFTCA9IExPR19MRVZFTC5MT0csXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiB2b2lkIHtcbiAgaWYgKGlzRGV2KCkgJiYgX19MT0dfXyA9PT0gbGV2ZWwpIHtcbiAgICBpZiAoX19MT0dfXyA9PT0gTE9HX0xFVkVMLkVSUk9SKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxufVxuXG4vKipcbiAqIHJ4anMgbG9nIG9wZXJhdG9yXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhMb2coXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbGV2ZWw6IExPR19MRVZFTCA9IExPR19MRVZFTC5MT0csXG4gIC4uLmFyZ3M6IGFueVxuKSB7XG4gIHJldHVybiA8VD4oc291cmNlOiBPYnNlcnZhYmxlPFQ+KSA9PlxuICAgIGlzRGV2KClcbiAgICAgID8gc291cmNlLnBpcGUodGFwKCh2YWwpID0+IGxvZyhtZXNzYWdlLCBsZXZlbCwgdmFsLCAuLi5hcmdzKSkpXG4gICAgICA6IHNvdXJjZTtcbn1cblxuLyoqXG4gKiByeGpzIGVudGl0eSBwcm9wZXJ0aWVzIG9wZXJhdG9yXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudGl0eVByb3BlcnR5PFQ+KFxuICBkZXN0cm95ZWROb3RpZmllcjogT2JzZXJ2YWJsZTxhbnk+LFxuICByZXBsYXlCeSA9IDEsXG4gIGxvZ01lc3NhZ2UgPSAnJ1xuKTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+IHtcbiAgcmV0dXJuIDxUPihzb3VyY2U6IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+ID0+XG4gICAgc291cmNlLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT5cbiAgICAgICAgYSBpbnN0YW5jZW9mIE1hcCB8fCBiIGluc3RhbmNlb2YgTWFwID8gZmFsc2UgOiBhID09PSBiXG4gICAgICApLFxuICAgICAgc2hhcmVSZXBsYXkocmVwbGF5QnkpLFxuICAgICAgd2l0aExvZyhsb2dNZXNzYWdlKSxcbiAgICAgIHRha2VVbnRpbChkZXN0cm95ZWROb3RpZmllcilcbiAgICApO1xufVxuXG5leHBvcnQgdHlwZSBJRCA9IHN0cmluZztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVJRCgpOiBJRCB7XG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheTxUPih2YWw6IGFueSk6IHZhbCBpcyBUW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsOiBhbnkpOiB2YWwgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWw6IGFueSk6IHZhbCBpcyAoLi4uYXJnczogYW55KSA9PiBhbnkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodjogYW55KSB7XG4gIHJldHVybiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUFycmF5PFQ+KHZhbHVlOiBUIHwgVFtdKTogVFtdIHtcbiAgaWYgKGlzTmlsKHZhbHVlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5QXJyYXk8VD4oYXJyOiBUW10pOiBib29sZWFuIHtcbiAgcmV0dXJuICFhcnIgfHwgIWlzQXJyYXkoYXJyKSB8fCBhcnIubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9BcnJheTxUPihtYXA6IEhhc2hNYXA8VD4pOiBUW10ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgaWYgKCFpc05pbChtYXBba2V5XSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG1hcFtrZXldKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9FbnRyaWVzPFQ+KG1hcDogSGFzaE1hcDxUPik6IEVudHJpZXM8VD4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgcmVzdWx0LnB1c2goW2tleSwgbWFwW2tleV1dKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oYXJyOiBUW10pOiBUW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQ8VD4oYXJyKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVRvTWFwPFQ+KGFycjogQXJyYXk8eyBpZDogSUQgfSAmIFQ+KTogSGFzaE1hcDxUPiB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IHZhbCBvZiBhcnIpIHtcbiAgICBpZiAoIWlzTmlsKHZhbCkpIHtcbiAgICAgIHJlc3VsdFt2YWwuaWRdID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUxpbmVQYXRoKGZpcnN0UG9pbnQ6IGFueSwgbGFzdFBvaW50OiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gYE0ke2ZpcnN0UG9pbnQueCR9LCR7Zmlyc3RQb2ludC55fSBMICR7bGFzdFBvaW50LngkfSwke2xhc3RQb2ludC55fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUN1cnZlUGF0aChcbiAgZmlyc3RQb2ludDogQ29vcmRzLFxuICBsYXN0UG9pbnQ6IENvb3JkcyxcbiAgY3VydnkgPSAwXG4pOiBzdHJpbmcge1xuICBjb25zdCBpc0hvcml6b250YWwgPVxuICAgIE1hdGguYWJzKGZpcnN0UG9pbnQueCAtIGxhc3RQb2ludC54KSA+IE1hdGguYWJzKGZpcnN0UG9pbnQueSAtIGxhc3RQb2ludC55KTtcbiAgY29uc3QgY3VydnlYID0gaXNIb3Jpem9udGFsID8gY3VydnkgOiAwO1xuICBjb25zdCBjdXJ2eVkgPSBpc0hvcml6b250YWwgPyAwIDogY3Vydnk7XG5cbiAgcmV0dXJuIGBNJHtmaXJzdFBvaW50Lnh9LCR7Zmlyc3RQb2ludC55fSBDICR7Zmlyc3RQb2ludC54ICsgY3VydnlYfSwke1xuICAgIGZpcnN0UG9pbnQueSArIGN1cnZ5WVxuICB9XG4gICAgJHtsYXN0UG9pbnQueCAtIGN1cnZ5WH0sJHtsYXN0UG9pbnQueSAtIGN1cnZ5WX0gJHtsYXN0UG9pbnQueH0sJHtcbiAgICBsYXN0UG9pbnQueVxuICB9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRHluYW1pY1BhdGgocGF0aENvb3JkczogbnVtYmVyW11bXSkge1xuICBsZXQgcGF0aCA9IFNWR1BhdGgoKTtcbiAgcGF0aCA9IHBhdGgubW92ZXRvKFxuICAgIHBhdGhDb29yZHNbMF1bMF0gKiBST1VUSU5HX1NDQUxJTkdfRkFDVE9SLFxuICAgIHBhdGhDb29yZHNbMF1bMV0gKiBST1VUSU5HX1NDQUxJTkdfRkFDVE9SXG4gICk7XG4gIHBhdGhDb29yZHMuc2xpY2UoMSkuZm9yRWFjaCgoY29vcmRzKSA9PiB7XG4gICAgcGF0aCA9IHBhdGgubGluZXRvKFxuICAgICAgY29vcmRzWzBdICogUk9VVElOR19TQ0FMSU5HX0ZBQ1RPUixcbiAgICAgIGNvb3Jkc1sxXSAqIFJPVVRJTkdfU0NBTElOR19GQUNUT1JcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIHBhdGgucHJpbnQoKTtcbn1cbiJdfQ==