UNPKG

basicprimitives

Version:

Basic Primitives Diagrams for JavaScript - data visualization components library that implements organizational chart and multi-parent dependency diagrams, contains implementations of JavaScript Controls and PDF rendering plugins.

1,429 lines (1,185 loc) 1.71 MB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["primitives"] = factory(); else root["primitives"] = factory(); })(this, () => { return /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./src/BaseControl.js": /*!****************************!*\ !*** ./src/BaseControl.js ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ BaseControl) /* harmony export */ }); /* harmony import */ var _graphics_structs_Point__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./graphics/structs/Point */ "./src/graphics/structs/Point.js"); /* harmony import */ var _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./graphics/structs/Rect */ "./src/graphics/structs/Rect.js"); /* harmony import */ var _enums__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enums */ "./src/enums.js"); /* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./common */ "./src/common/index.js"); /* harmony import */ var _graphics_createGraphics__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./graphics/createGraphics */ "./src/graphics/createGraphics.js"); /* harmony import */ var _graphics_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./graphics/dom */ "./src/graphics/dom.js"); /* harmony import */ var _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./common/jsonml-html */ "./src/common/jsonml-html.js"); /** * JavaScript Abstract Control * @class BaseControl */ function BaseControl(element, options, taskManagerFactory, eventArgsFactory, templates) { var _data = { name: "orgdiagram", options: options, tasks: null, graphics: null, mouse: null, layout: { element: element, controlPanel: null, frameMousePanel: null, framePlaceholder: null, titlesMousePanel: null, titlesPlaceholder: null, scrollPanel: null, mousePanel: null, placeholder: null, calloutPlaceholder: null, forceCenterOnCursor: true } }, _dragFrom, _scrollFrom, _scrollTo, _dragImage, _dragTimer, _debug = false, _timer = null; /** * Performs full redraw of the diagram contents via reevaluating all API options. This method has to be called explicitly * after all options are set in order to update controls contents. * * @param {UpdateMode} updateMode * @param {boolean} forceCenterOnCursor */ function update(updateMode, forceCenterOnCursor) { if (forceCenterOnCursor == null) { forceCenterOnCursor = true; } switch (updateMode) { case _enums__WEBPACK_IMPORTED_MODULE_0__.UpdateMode.Refresh: refresh(forceCenterOnCursor, _debug); break; case _enums__WEBPACK_IMPORTED_MODULE_0__.UpdateMode.PositonHighlight: positionHighlight(_debug); break; default: redraw(); break; } } /** * Removes all elements control added to DOM including event listeners. */ function destroy() { unbind(_data.layout); cleanLayout(_data.layout); _data.tasks = null; _data.graphics = null; } function redraw() { unbind(_data.layout); cleanLayout(_data.layout); createLayout(_data.layout, _data.name); bind(_data.layout); _data.tasks = taskManagerFactory(getOptions, getGraphics, getLayout, setLayout, templates); _data.graphics = (0,_graphics_createGraphics__WEBPACK_IMPORTED_MODULE_1__["default"])(_data.layout.element); _data.graphics.debug = _debug; refresh(true, _debug); } function refresh(forceCenterOnCursor, debug) { var centerOnCursorTask, placeholderOffset; //_data.layout.scrollPanel.css({ // "display": "none", // "-webkit-overflow-scrolling": "auto" //}); //this.graphics.begin(); _data.layout.forceCenterOnCursor = forceCenterOnCursor; _data.tasks.process('OptionsTask', null, debug); _data.graphics.end(); //_data.layout.scrollPanel.css({ // "display": "block" //}); if (forceCenterOnCursor) { /* scroll to offset */ centerOnCursorTask = _data.tasks.getTask("CenterOnCursorTask"); placeholderOffset = centerOnCursorTask.getPlaceholderOffset(); _data.layout.scrollPanel.scrollLeft = placeholderOffset.x; _data.layout.scrollPanel.scrollTop = placeholderOffset.y; } //_data.layout.scrollPanel.css({ // "-webkit-overflow-scrolling": "touch" //}); /* fix pixel alignment */ var pixelAlignmentFix = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getFixOfPixelAlignment)(_data.layout.element); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(_data.layout.scrollPanel, { "marginBottom": "0px", "marginRight": "0px", "marginLeft": pixelAlignmentFix.width + "px", /* fixes div pixel alignment */ "marginTop": pixelAlignmentFix.height + "px" }); } function positionHighlight(debug) { _data.layout.forceCenterOnCursor = false; _data.tasks.process('HighlightItemOptionTask', null, debug); _data.graphics.end(); } function redrawCurrentViewPort(debug) { _data.layout.forceCenterOnCursor = false; _data.tasks.process('LayoutOptionsTask', null, debug); _data.graphics.end(); } function onScroll(event) { if (_timer == null) { _timer = window.setTimeout(function () { redrawCurrentViewPort(_debug); window.clearTimeout(_timer); _timer = null; }, 200); } } /** * Call this method to update controls configuration. Control uses default Config instance to initialize itself, * so it sets only options provided in the options parameter. * * @param {object} options Options */ function setOptions(options) { for (var option in options) { if (options.hasOwnProperty(option)) { _data.options[option] = options[option]; } } } /** * This method returns current configuration object. * * @returns {object} Returns reference to current configuration object */ function getOptions() { return _data.options; } /** * This method returns configuration option by name. * * @param {*} option Option name */ function getOption(option) { return _data.options[option]; } /** * Sets configuration option of the control by name. * * @param {*} option Option name * @param {*} value Option value */ function setOption(option, value) { return _data.options[option] = value; } function getGraphics() { return _data.graphics; } function getLayout() { var layout = _data.layout, scrollPanelSize = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getInnerSize)(layout.controlPanel), placeholderOffset = new _graphics_structs_Point__WEBPACK_IMPORTED_MODULE_4__["default"](layout.scrollPanel.scrollLeft, layout.scrollPanel.scrollTop); return { forceCenterOnCursor: layout.forceCenterOnCursor, scrollPanelSize: scrollPanelSize, placeholderOffset: placeholderOffset }; } function setLayout(layoutOptions) { var layout = _data.layout, pixelAlignmentFix = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getFixOfPixelAlignment)(layout.element); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.controlPanel, { "marginLeft": pixelAlignmentFix.width + "px", /* fixes div pixel alignment */ "marginTop": pixelAlignmentFix.height + "px" }); /* set scroll panel position */ _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.scrollPanel, layoutOptions.scrollPanelRect.getCSS()); /* set scaled content panel for tracking mouse events without scaling */ _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.mousePanel, layoutOptions.mousePanelSize.getCSS()); /* set size and scale of content panel */ var scaleText = "scale(" + layoutOptions.scale + "," + layoutOptions.scale + ")"; var scaleProperties = { "transform-origin": "0 0", "transform": scaleText, "-ms-transform": scaleText, /* IE 9 */ "-webkit-transform": scaleText, /* Safari and Chrome */ "-o-transform": scaleText, /* Opera */ "-moz-transform": scaleText /* Firefox */ }; _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.placeholder, (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)(scaleProperties, layoutOptions.placeholderSize.getCSS())); if (layoutOptions.autoSize) { /* resize element to fit placeholder if control in auto size mode */ _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.element, layoutOptions.controlSize.getCSS()); } /* set titles panel scale and size */ _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.titlesMousePanel, layoutOptions.titlesMousePanelRect.getCSS()); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.titlesPlaceholder, (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)(scaleProperties, layoutOptions.titlesPlaceholderSize.getCSS())); /* set frame panel scale and size */ _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.frameMousePanel, layoutOptions.frameMousePanelRect.getCSS()); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].applyStyles(layout.framePlaceholder, (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)(scaleProperties, layoutOptions.framePlaceholderSize.getCSS())); layout.scrollPanel.setAttribute("class", layoutOptions.scrollPanelRect.left > 0 ? name : "bp-scrollframe " + name); } function createLayout(layout, name) { var viewportSize = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getInnerSize)(layout.element), viewportRect = new _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_6__["default"](0, 0, viewportSize.width, viewportSize.height), pixelAlignmentFix = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getFixOfPixelAlignment)(element); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].appendDOM(layout.element, _common_jsonml_html__WEBPACK_IMPORTED_MODULE_3__["default"].toHTML(["div", /* root control panel */ { "tabindex": 0, "style": { "position": "relative", "overflow": "hidden", "top": "0px", "left": "0px", "width": "100%", "height": "100%", "padding": "0px", "marginBottom": "0px", "marginRight": "0px", "marginLeft": pixelAlignmentFix.width + "px", /* fixes div pixel alignment */ "marginTop": pixelAlignmentFix.height + "px" }, "name": "controlPanel", "class": name, "$": function $(element) { layout.controlPanel = element; } }, ["div", /* frameMousePanel - frame mouse tracking events panel */ { "style": (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)({ position: "absolute", overflow: "hidden" }, viewportRect.getCSS()), "name": "frameMousePanel", "class": name, "$": function $(element) { layout.frameMousePanel = element; } }, ["div", /* frameplaceholder - contents scalable panel */ { "style": (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)({ position: "absolute", overflow: "hidden" }, viewportRect.getCSS()), "name": "framePlaceholder", "class": ["frameplaceholder", name], "$": function $(element) { layout.framePlaceholder = element; } }]], ["div", /* titlesMousePanel - titles mouse tracking events panel */ { "style": (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)({ position: "absolute", overflow: "hidden" }, viewportRect.getCSS()), "name": "titlesMousePanel", "class": ["bp-titles-frame", name], "$": function $(element) { layout.titlesMousePanel = element; } }, ["div", /* titlesplaceholder - contents scalable panel */ { "style": (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)({ position: "absolute", overflow: "hidden" }, viewportRect.getCSS()), "name": "titlesPlaceholder", "class": ["titlesplaceholder", name], "$": function $(element) { layout.titlesPlaceholder = element; } }]], ["div", /* scrollPanel - root scroll panel */ { "style": (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)({ position: "absolute", "overflow": "auto", "-webkit-overflow-scrolling": "touch", "top": "0px", "left": "0px", "width": viewportRect.width + "px", "height": viewportRect.height + "px" }, viewportRect.getCSS()), "name": "scrollPanel", "class": name, "$": function $(element) { layout.scrollPanel = element; } }, ["div", /* mousePanel - mouse tracking events panel */ { "style": (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)({ position: "absolute", overflow: "visible" }, viewportRect.getCSS()), "name": "mousePanel", "class": name, "$": function $(element) { layout.mousePanel = element; } }, ["div", /* placeholder - contents scalable panel */ { "style": (0,_common__WEBPACK_IMPORTED_MODULE_5__.mergeObjects)({ position: "absolute", overflow: "hidden" }, viewportRect.getCSS()), "name": "placeholder", "class": ["placeholder", name], "$": function $(element) { layout.placeholder = element; } }, ["div", /* calloutPlaceholder - callout panel */ { "style": { position: "absolute", overflow: "visible", top: "0px", left: "0px", width: "0px", height: "0px" }, "name": "calloutPlaceholder", "class": ["calloutplaceholder", name], "$": function $(element) { layout.calloutPlaceholder = element; } }]]]]])); } function cleanLayout() { var controlPanel = _data.layout.controlPanel; if (controlPanel != null) { var parent = controlPanel.parentNode; if (parent != null) { parent.removeChild(controlPanel); } } } function bind(layout) { layout.mousePanel.addEventListener('mousemove', onMouseMove); layout.mousePanel.addEventListener('click', onMouseClick); layout.mousePanel.addEventListener('dblclick', onMouseDblClick); layout.mousePanel.addEventListener('change', onCheckboxChange); layout.element.addEventListener('keydown', onKeyDown); layout.scrollPanel.addEventListener('scroll', onScroll); if (_data.options.enablePanning && (0,_graphics_createGraphics__WEBPACK_IMPORTED_MODULE_1__.isChrome)()) { layout.scrollPanel.draggable = true; layout.scrollPanel.addEventListener('dragstart', onDragStart); layout.scrollPanel.addEventListener('drag', onDragScroll); layout.scrollPanel.addEventListener('dragend', onDragScroll); layout.scrollPanel.addEventListener('dragover', onDragOver); } layout.frameMousePanel.addEventListener('mousemove', onFrameMouseMove); layout.frameMousePanel.addEventListener('click', onFrameMouseClick); } function unbind(layout) { if (layout.mousePanel != null) { layout.mousePanel.removeEventListener("mousemove", onMouseMove); layout.mousePanel.removeEventListener("click", onMouseClick); layout.mousePanel.removeEventListener("dblclick", onMouseDblClick); layout.mousePanel.removeEventListener("change", onCheckboxChange); } if (layout.element != null) { layout.element.removeEventListener("keydown", onKeyDown); } if (layout.scrollPanel != null) { layout.scrollPanel.removeEventListener("scroll", onScroll); layout.scrollPanel.removeEventListener('dragstart', onDragStart); layout.scrollPanel.removeEventListener('drag', onDragScroll); layout.scrollPanel.removeEventListener('dragend', onDragScroll); layout.scrollPanel.removeEventListener('dragover', onDragOver); } if (layout.frameMousePanel != null) { layout.frameMousePanel.removeEventListener('mousemove', onFrameMouseMove); layout.frameMousePanel.removeEventListener('click', onFrameMouseClick); } } function onFrameMouseMove(event) { var placeholderOffset = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getElementOffset)(_data.layout.frameMousePanel), x = event.pageX - placeholderOffset.left, y = event.pageY - placeholderOffset.top; var projectItemsToFrameTask = _data.tasks.getTask("ProjectItemsToFrameTask"), highlightItemOptionTask = _data.tasks.getTask("HighlightItemOptionTask"), itemId; if (highlightItemOptionTask.hasHighlightEnabled()) { itemId = projectItemsToFrameTask.getTreeItemForMousePosition(x, y, highlightItemOptionTask.getGravityRadius()); setHighlightItem(event, itemId); } } function onFrameMouseClick(event) { var placeholderOffset = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getElementOffset)(_data.layout.frameMousePanel), x = event.pageX - placeholderOffset.left, y = event.pageY - placeholderOffset.top, projectItemsToFrameTask = _data.tasks.getTask("ProjectItemsToFrameTask"), cursorItemOptionTask = _data.tasks.getTask("CursorItemOptionTask"), highlightItemOptionTask = _data.tasks.getTask("HighlightItemOptionTask"), newCursorItemId = projectItemsToFrameTask.getTreeItemForMousePosition(x, y, highlightItemOptionTask.getGravityRadius()), target, eventArgs; target = event.target; if (newCursorItemId !== null) { eventArgs = getEventArgs(null, newCursorItemId); trigger("onMouseClick", event, eventArgs); if (!eventArgs.cancel) { if (cursorItemOptionTask.hasCursorEnabled()) { setCursorItem(event, newCursorItemId); _data.layout.element.focus(); } } } } function onMouseMove(event) { var placeholderOffset = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getElementOffset)(_data.layout.mousePanel), x = event.pageX - placeholderOffset.left, y = event.pageY - placeholderOffset.top, createTransformTask = _data.tasks.getTask("CreateTransformTask"), highlightItemOptionTask = _data.tasks.getTask("HighlightItemOptionTask"), itemId; if (highlightItemOptionTask.hasHighlightEnabled()) { itemId = createTransformTask.getTreeItemForMousePosition(x, y, highlightItemOptionTask.getGravityRadius()); setHighlightItem(event, itemId); } } function onCheckboxChange(event) { var target = event.target; var selectedId = target.getAttribute("data-id"); if (selectedId != null) { var selectedItems = (_data.options.selectedItems || []).slice(); var eventArgs = getEventArgs(null, selectedId); var position = selectedItems.findIndex(function (itemid) { return selectedId == itemid; }); trigger("onSelectionChanging", event, eventArgs); if (!eventArgs.cancel) { if (position >= 0) { selectedItems.splice(position, 1); } else { selectedItems.push(selectedId); } _data.options.selectedItems = selectedItems; if (position < 0) { target.setAttribute("checked", "checked"); } else { target.removeAttribute("checked"); } //refresh(false, false); trigger("onSelectionChanged", event, eventArgs); } } } function onMouseClick(event) { var placeholderOffset = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getElementOffset)(_data.layout.mousePanel), x = event.pageX - placeholderOffset.left, y = event.pageY - placeholderOffset.top, createTransformTask = _data.tasks.getTask("CreateTransformTask"), cursorItemOptionTask = _data.tasks.getTask("CursorItemOptionTask"), highlightItemOptionTask = _data.tasks.getTask("HighlightItemOptionTask"), newCursorItemId = createTransformTask.getTreeItemForMousePosition(x, y, highlightItemOptionTask.getGravityRadius()), target, buttonName, eventArgs; target = event.target; if (newCursorItemId !== null) { var buttonName = target.getAttribute("data-buttonname"); if ((0,_common__WEBPACK_IMPORTED_MODULE_5__.isNullOrEmpty)(buttonName)) { buttonName = target.parentNode && target.parentNode.getAttribute("data-buttonname"); } ; if (!(0,_common__WEBPACK_IMPORTED_MODULE_5__.isNullOrEmpty)(buttonName)) { eventArgs = getEventArgs(null, newCursorItemId, buttonName); trigger("onButtonClick", event, eventArgs); } else if (target.getAttribute("name") === "checkbox" || target.getAttribute("name") === "selectiontext") {} else { eventArgs = getEventArgs(null, newCursorItemId); trigger("onMouseClick", event, eventArgs); if (!eventArgs.cancel) { if (cursorItemOptionTask.hasCursorEnabled()) { setCursorItem(event, newCursorItemId); _data.layout.element.focus(); } } } } } function onMouseDblClick(event) { var eventArgs, highlightItemTask = _data.tasks.getTask("HighlightItemTask"), highlightTreeItem = highlightItemTask.getHighlightTreeItem(); if (highlightTreeItem !== null) { eventArgs = getEventArgs(null, highlightTreeItem); trigger("onMouseDblClick", event, eventArgs); } } function onKeyDown(event) { var highlightItemTask = _data.tasks.getTask("HighlightItemTask"), highlightItemOptionTask = _data.tasks.getTask("HighlightItemOptionTask"), cursorItemTask = _data.tasks.getTask("CursorItemTask"), cursorItemOptionTask = _data.tasks.getTask("CursorItemOptionTask"), alignDiagramTask = _data.tasks.getTask('AlignDiagramTask'), createTransformTask = _data.tasks.getTask('CreateTransformTask'), transform = createTransformTask.getTransform(), navigationItem = null, newNavigationItem, direction = null, accepted, layout = _data.layout; if (highlightItemOptionTask.hasHighlightEnabled() && cursorItemOptionTask.hasCursorEnabled()) { navigationItem = highlightItemTask.getHighlightTreeItem(); if (navigationItem === null) { navigationItem = cursorItemTask.getCursorTreeItem(); } } else if (highlightItemOptionTask.hasHighlightEnabled()) { navigationItem = highlightItemTask.getHighlightTreeItem(); } else if (cursorItemOptionTask.hasCursorEnabled()) { navigationItem = cursorItemTask.getCursorTreeItem(); } if (navigationItem != null) { switch (event.which) { case 13: /*Enter*/ if (cursorItemOptionTask.hasCursorEnabled()) { setCursorItem(event, navigationItem); event.preventDefault(); layout.element.focus(); } break; case 40: /*Down*/ direction = _enums__WEBPACK_IMPORTED_MODULE_0__.OrientationType.Bottom; break; case 38: /*Up*/ direction = _enums__WEBPACK_IMPORTED_MODULE_0__.OrientationType.Top; break; case 37: /*Left*/ direction = _enums__WEBPACK_IMPORTED_MODULE_0__.OrientationType.Left; break; case 39: /*Right*/ direction = _enums__WEBPACK_IMPORTED_MODULE_0__.OrientationType.Right; break; } if (direction != null) { accepted = false; while (!accepted) { accepted = true; direction = transform.getOrientation(direction); newNavigationItem = alignDiagramTask.getNextItem(navigationItem, direction); if (newNavigationItem != null) { event.preventDefault(); if (highlightItemOptionTask.hasHighlightEnabled()) { setHighlightItem(event, newNavigationItem); } else if (cursorItemOptionTask.hasCursorEnabled()) { setCursorItem(event, newNavigationItem); } } } layout.element.focus(); } } } function onDragStart(event) { var scrollPanel = _data.layout.scrollPanel; _dragFrom = new _graphics_structs_Point__WEBPACK_IMPORTED_MODULE_4__["default"](event.clientX, event.clientY); _scrollFrom = new _graphics_structs_Point__WEBPACK_IMPORTED_MODULE_4__["default"](scrollPanel.scrollLeft, scrollPanel.scrollTop); _dragImage = _dragImage || new Image(); event.dataTransfer.setDragImage(_dragImage, 0, 0); } function onDragOver(event) { event.preventDefault(); event.dataTransfer.dropEffect = "move"; } function onDragScroll(event) { _scrollTo = new _graphics_structs_Point__WEBPACK_IMPORTED_MODULE_4__["default"](_scrollFrom.x - (event.clientX - _dragFrom.x), _scrollFrom.y - (event.clientY - _dragFrom.y)); if (_dragTimer == null) { _dragTimer = window.setTimeout(function () { var scrollPanel = _data.layout.scrollPanel; scrollPanel.scrollLeft = _scrollTo.x; scrollPanel.scrollTop = _scrollTo.y; window.clearTimeout(_dragTimer); _dragTimer = null; }, 50); } } function setHighlightItem(event, newHighlightItemId) { var result = true, eventArgs; if (newHighlightItemId !== null) { if (newHighlightItemId !== _data.options.highlightItem) { eventArgs = getEventArgs(_data.options.highlightItem, newHighlightItemId); _data.options.highlightItem = newHighlightItemId; trigger("onHighlightChanging", event, eventArgs); if (!eventArgs.cancel) { refresh(false, false); trigger("onHighlightChanged", event, eventArgs); } else { result = false; } } } else { if (_data.options.highlightItem !== null) { eventArgs = getEventArgs(_data.options.highlightItem, null); _data.options.highlightItem = null; trigger("onHighlightChanging", event, eventArgs); if (!eventArgs.cancel) { refresh(false, false); trigger("onHighlightChanged", event, eventArgs); } else { result = false; } } } return result; } function setCursorItem(event, newCursorItemId) { var eventArgs; if (newCursorItemId !== _data.options.cursorItem) { eventArgs = getEventArgs(_data.options.cursorItem, newCursorItemId); _data.options.cursorItem = newCursorItemId; trigger("onCursorChanging", event, eventArgs); if (!eventArgs.cancel) { refresh(true, _debug); trigger("onCursorChanged", event, eventArgs); } } } function getEventArgs(oldTreeItemId, newTreeItemId, name) { return eventArgsFactory(_data, oldTreeItemId, newTreeItemId, name); } /** * This method returns item position relative to the control's element. * * @returns {Rect} Returns item position */ function getItemPosition(itemId) { var combinedContextsTask = _data.tasks.getTask("CombinedContextsTask"), alignDiagramTask = _data.tasks.getTask("AlignDiagramTask"), itemConfig = combinedContextsTask.getConfig(itemId), itemPosition, result, offset, panelOffset; if (itemConfig && itemConfig.id != null) { panelOffset = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getElementOffset)(_data.layout.mousePanel); offset = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_2__.getElementOffset)(_data.layout.element); itemPosition = alignDiagramTask.getItemPosition(itemId); result = new _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_6__["default"](itemPosition.actualPosition).translate(panelOffset.left, panelOffset.top).translate(-offset.left, -offset.top); } return result; } ; function trigger(eventHandlerName, event, eventArgs) { var eventHandler = _data.options[eventHandlerName]; if (eventHandler != null) { eventHandler(event, eventArgs); } } update(); /* init control on create */ return { destroy: destroy, setOptions: setOptions, getOptions: getOptions, setOption: setOption, getOption: getOption, update: update, getItemPosition: getItemPosition }; } ; /***/ }), /***/ "./src/BasePdfkitPlugin.js": /*!*********************************!*\ !*** ./src/BasePdfkitPlugin.js ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ BasePdfkitPlugin) /* harmony export */ }); /* harmony import */ var _graphics_structs_Size__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./graphics/structs/Size */ "./src/graphics/structs/Size.js"); /* harmony import */ var _graphics_PdfGraphics__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./graphics/PdfGraphics */ "./src/graphics/PdfGraphics.js"); /* harmony import */ var _enums__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enums */ "./src/enums.js"); /** * Creates PDFKit Family Diagram Plugin * @class BasePdfkitPlugin * * @param {object} options Family Diagram Configuration object * * @returns {BasePdfkitPlugin} Returns reference to PDFKit Plugin instance. */ function BasePdfkitPlugin(options, createTaskManager, templates) { var _data = { doc: null, options: options, tasks: null, graphics: null, controlSize: null }, _debug = false; function getOptions() { return _data.options; } function getGraphics() { return _data.graphics; } function setLayout(options) { var graphics = _data.graphics, frameMousePanelRect = options.frameMousePanelRect, titlesMousePanelRect = options.titlesMousePanelRect, scrollPanelRect = options.scrollPanelRect, controlSize = options.controlSize; graphics.position("frameplaceholder", frameMousePanelRect.x, frameMousePanelRect.y, frameMousePanelRect.width, frameMousePanelRect.height); graphics.position("titlesplaceholder", titlesMousePanelRect.x, titlesMousePanelRect.y, titlesMousePanelRect.width, titlesMousePanelRect.height); graphics.position("placeholder", scrollPanelRect.x, scrollPanelRect.y, scrollPanelRect.width, scrollPanelRect.height); _data.controlSize = controlSize; } function _disableNotAvailableFunctionality() { /* disable functionality not available in PDF */ _data.options.scale = 1; _data.options.showFrame = false; _data.options.hasButtons = _enums__WEBPACK_IMPORTED_MODULE_0__.Enabled.False; _data.options.pageFitMode = _enums__WEBPACK_IMPORTED_MODULE_0__.PageFitMode.AutoSize; _data.options.autoSizeMinimum = new _graphics_structs_Size__WEBPACK_IMPORTED_MODULE_1__["default"](0, 0); _data.options.autoSizeMaximum = new _graphics_structs_Size__WEBPACK_IMPORTED_MODULE_1__["default"](1000000, 1000000); } /** * Calculates size of the diagram required to render all nodes without truncation. * * @param {object} doc PDFKit document * @param {number} positionX Diagram placement X coordinate * @param {number} positionY Diagram placement Y coordinate * @returns {Size} Returns size of the diagram */ function draw(doc, positionX, positionY) { _data.doc = doc; _data.tasks = createTaskManager(getOptions, getGraphics, setLayout, templates); _data.graphics = new _graphics_PdfGraphics__WEBPACK_IMPORTED_MODULE_2__["default"](_data.doc); _data.graphics.debug = _debug; _disableNotAvailableFunctionality(); _data.doc.save(); _data.doc.translate(positionX, positionY); _data.tasks.process('OptionsTask', null, _debug); _data.graphics.clean(); _data.doc.restore(); return new _graphics_structs_Size__WEBPACK_IMPORTED_MODULE_1__["default"](_data.controlSize); } /** * Calculates size of the diagram required to render all nodes without truncation. * * @returns {Size} Returns size of the diagram */ function getSize() { _data.tasks = createTaskManager(getOptions, getGraphics, setLayout, templates); _data.graphics = new _graphics_PdfGraphics__WEBPACK_IMPORTED_MODULE_2__["default"](_data.doc); _data.graphics.debug = _debug; _disableNotAvailableFunctionality(); _data.tasks.process('OptionsTask', 'ApplyLayoutChangesTask', _debug); _data.graphics.clean(); return new _graphics_structs_Size__WEBPACK_IMPORTED_MODULE_1__["default"](_data.controlSize); } return { draw: draw, getSize: getSize }; } ; /***/ }), /***/ "./src/CalloutAnnotationControl.js": /*!*****************************************!*\ !*** ./src/CalloutAnnotationControl.js ***! \*****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ CalloutAnnotationControl) /* harmony export */ }); /* harmony import */ var _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./graphics/structs/Rect */ "./src/graphics/structs/Rect.js"); /* harmony import */ var _graphics_createGraphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./graphics/createGraphics */ "./src/graphics/createGraphics.js"); /* harmony import */ var _graphics_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./graphics/dom */ "./src/graphics/dom.js"); /* harmony import */ var _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./common/jsonml-html */ "./src/common/jsonml-html.js"); /* harmony import */ var _graphics_shapes_Callout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./graphics/shapes/Callout */ "./src/graphics/shapes/Callout.js"); /** * Creates JavaScript Callout Annotation Control * * @class Control * @param {object} element Reference to placeholder `div` element in the DOM. The control renders its content * inside of that div element. * @param {CalloutAnnotationControlConfig} options Callout Annotation Configuration object * * @returns {CalloutAnnotationControl} Returns reference to callout annotation control. */ function CalloutAnnotationControl(element, options) { var _data = { name: "calloutcontrol", element: element, options: options, placeholder: null, panelSize: null, graphics: null, labelTemplate: null }; if (!element) { throw "Control's placeholder element is undefined"; } if (!options) { throw "Control's options argument is undefined"; } function createLayout() { var viewportSize = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getInnerSize)(_data.element); _data.panelSize = new _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_1__["default"](0, 0, viewportSize.width, viewportSize.height); var pixelAlignmentFix = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getFixOfPixelAlignment)(element); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__["default"].appendDOM(_data.element, _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__["default"].toHTML(["div", /* root control panel */ { "tabindex": 0, "style": { "position": "relative", "overflow": "hidden", "top": "0px", "left": "0px", "width": _data.panelSize.width, "height": _data.panelSize.height, "padding": "0px", "marginBottom": "0px", "marginRight": "0px", "marginLeft": pixelAlignmentFix.width + "px", /* fixes div pixel alignment */ "marginTop": pixelAlignmentFix.height + "px" }, "name": "placeholder", "class": _data.name, "$": function $(element) { _data.placeholder = element; } }])); _data.graphics = (0,_graphics_createGraphics__WEBPACK_IMPORTED_MODULE_3__["default"])(_data.element); } ; function cleanLayout() { if (_data.graphics !== null) { _data.graphics.clean(); } _data.graphics = null; var placeholder = _data.placeholder; if (placeholder != null) { var parent = placeholder.parentNode; if (parent != null) { parent.removeChild(placeholder); } } } function updateLayout() { var viewportSize = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getInnerSize)(_data.element), pixelAlignmentFix = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getFixOfPixelAlignment)(_data.element); _data.panelSize = new _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_1__["default"](0, 0, viewportSize.width, viewportSize.height); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__["default"].applyStyles(_data.placeholder, { "width": _data.panelSize.width, "height": _data.panelSize.height, "marginBottom": "0px", "marginRight": "0px", "marginLeft": pixelAlignmentFix.width + "px", /* fixes div pixel alignment */ "marginTop": pixelAlignmentFix.height + "px" }); } function update(recreate) { if (recreate) { cleanLayout(); createLayout(); redraw(); } else { updateLayout(); _data.graphics.resize("placeholder", _data.panelSize.width, _data.panelSize.height); _data.graphics.begin(); redraw(); _data.graphics.end(); } } function redraw() { var annotationConfig = _data.options, callout; _data.graphics.activate("placeholder"); if (annotationConfig.position != null) { callout = new _graphics_shapes_Callout__WEBPACK_IMPORTED_MODULE_4__["default"](_data.graphics); primitives.mergeObjects(callout, options); var position = annotationConfig.position; /* offset position */ position = new _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_1__["default"](annotationConfig.position).offset(annotationConfig.offset); callout.draw(annotationConfig.snapPoint, position); } } function destroy() { cleanLayout(); } ; /** * Call this method to update controls configuration. Control uses default Config instance to initialize itself, * so it sets only options provided in the options parameter. * * @param {object} options Options */ function setOptions(options) { for (var option in options) { if (options.hasOwnProperty(option)) { _data.options[option] = options[option]; } } } /** * This method returns current configuration object. * * @returns {object} Returns reference to current configuration object */ function getOptions() { return _data.options; } /** * This method returns configuration option by name. * * @param {*} option Option name */ function getOption(option) { return _data.options[option]; } /** * Sets configuration option of the control by name. * * @param {*} option Option name * @param {*} value Option value */ function setOption(option, value) { return _data.options[option] = value; } update(true); /* init control on create */ return { destroy: destroy, setOptions: setOptions, getOptions: getOptions, setOption: setOption, getOption: getOption, update: update }; } ; /***/ }), /***/ "./src/ConnectorAnnotationControl.js": /*!*******************************************!*\ !*** ./src/ConnectorAnnotationControl.js ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ ConnectorAnnotationControl) /* harmony export */ }); /* harmony import */ var _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./graphics/structs/Rect */ "./src/graphics/structs/Rect.js"); /* harmony import */ var _graphics_createGraphics__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./graphics/createGraphics */ "./src/graphics/createGraphics.js"); /* harmony import */ var _graphics_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./graphics/dom */ "./src/graphics/dom.js"); /* harmony import */ var _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./common/jsonml-html */ "./src/common/jsonml-html.js"); /* harmony import */ var _graphics_annotations_ConnectorAnnotation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./graphics/annotations/ConnectorAnnotation */ "./src/graphics/annotations/ConnectorAnnotation.js"); /* harmony import */ var _templates_html_AnnotationLabelTemplate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./templates/html/AnnotationLabelTemplate */ "./src/templates/html/AnnotationLabelTemplate.js"); /** * Creates JavaScript Connector Annotation Control * @class Control * @param {object} element Reference to placeholder `div` element in the DOM. The control renders its content * inside of that div element. * @param {ConnectorAnnotationControlConfig} options Connector Annotation Configuration object * * @returns {ConnectorAnnotationControl} Returns reference to connector annotation control. */ function ConnectorAnnotationControl(element, options) { var _data = { name: "connectorcontrol", element: element, options: options, placeholder: null, panelSize: null, graphics: null, labelTemplate: null, connector: null }; if (!element) { throw "Control's placeholder element is undefined"; } if (!options) { throw "Control's options argument is undefined"; } function createLayout() { var viewportSize = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getInnerSize)(_data.element); _data.panelSize = new _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_1__["default"](0, 0, viewportSize.width, viewportSize.height); var pixelAlignmentFix = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getFixOfPixelAlignment)(element); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__["default"].appendDOM(_data.element, _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__["default"].toHTML(["div", /* root control panel */ { "tabindex": 0, "style": { "position": "relative", "overflow": "hidden", "top": "0px", "left": "0px", "width": _data.panelSize.width, "height": _data.panelSize.height, "padding": "0px", "marginBottom": "0px", "marginRight": "0px", "marginLeft": pixelAlignmentFix.width + "px", /* fixes div pixel alignment */ "marginTop": pixelAlignmentFix.height + "px" }, "name": "placeholder", "class": _data.name, "$": function $(element) { _data.placeholder = element; } }])); _data.graphics = (0,_graphics_createGraphics__WEBPACK_IMPORTED_MODULE_3__["default"])(_data.element); _data.connector = new _graphics_annotations_ConnectorAnnotation__WEBPACK_IMPORTED_MODULE_4__["default"](); } ; function cleanLayout() { if (_data.graphics !== null) { _data.graphics.clean(); } _data.graphics = null; var placeholder = _data.placeholder; if (placeholder != null) { var parent = placeholder.parentNode; if (parent != null) { parent.removeChild(placeholder); } } } function updateLayout() { var viewportSize = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getInnerSize)(_data.element), pixelAlignmentFix = (0,_graphics_dom__WEBPACK_IMPORTED_MODULE_0__.getFixOfPixelAlignment)(_data.element); _data.panelSize = new _graphics_structs_Rect__WEBPACK_IMPORTED_MODULE_1__["default"](0, 0, viewportSize.width, viewportSize.height); _common_jsonml_html__WEBPACK_IMPORTED_MODULE_2__["default"].applyStyles(_data.placeholder, { "width": _data.panelSize.width, "height": _data.panelSize.height, "marginBottom": "0px", "marginRight": "0px", "marginLeft": pixelAlignmentFix.width + "px", /* fixes div pixel alignment */ "marginTop": pixelAlignmentFix.height + "px" }); } function update(recreate) { if (recreate) { _data.labelTemplate = (0,_templates_html_AnnotationLabelTemplate__WEBPACK_IMPORTED_MODULE_5__["default"])(_data.options); cleanLayout(); createLayout(); _data.graphics.begin(); _data.connector.draw(_data.options, _data.graphics, _data.panelSize, _data.labelTemplate); _data.graphics.end(); } else { updateLayout(); _data.graphics.resize("placeholder", _data.panelSize.width, _data.panelSize.height); _data.graphics.begin(); _data.connector.draw(_data.options, _data.graphics, _data.panelSize, _data.labelTemplate); _data.graphics.end(); } } function destroy() { cleanLayout(); } ; /** * Call this method to update controls configuration. Control uses default Config instance to initialize itself, * so it sets only options provided in the options parameter. * * @param {object} options Options */ function setOptions(options) { for (var option in options) { if (options.hasOwnProperty(option)) { _data.options[option] = options[option]; } } } /** * This method returns current configuration object. * * @returns {object} Returns reference to current configuration object */ function getOptions() { return _data.options; } /** * This method returns configuration option by name. * * @param {*} option Option name */ function getOption(option) { return _data.options[option]; } /** * Sets configuration option of the control by name. * * @param {*} option Option name * @param {*} value Option value */ function setOption(option, value) { return _data.options[option] = value; } update(true); /* init control on create */ return { destroy: destroy, setOptions: setOptions, getOptions: getOptions, setOption: setOption, getOption: getOption, update: update }; } ; /***/ }), /***/ "./src/FamDiagram.js": /*!***************************!*\ !*** ./src/FamDiagram.js ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ FamDiagram) /* harmony export */ }); /* harmony import */ var _templates_html_AnnotationLabelTemplate__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./templates/html/AnnotationLabelTemplate */ "./src/templates/html/AnnotationLabelTemplate.js"); /* harmony import */ var _templates_html_EndPointTemplate__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./templates/html/EndPointTemplate */ "./src/templates/html/EndPointTemplate.js"); /* harmony import */ var _templates_html_ButtonsTemplate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./templates/html/ButtonsTemplate */ "./src/templates/html/ButtonsTemplate.js"); /* harmony import */ var _templates_html_CustomRenderTemplate__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./templates/html/CustomRenderTemplate */ "./src/templates/html/CustomRenderTemplate.js"); /* harmony import */ var _templates_html_CheckBoxTemplate__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./templates/html/CheckBoxTemplate */ "./src/templates/html/CheckBoxTemplate.js"); /* harmony import */ var _templates_html_CursorTemplate__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./templates/html/CursorTemplate */ "./src/templates/html/CursorTemplate.js"); /* harmony import */ var _templates_html_DotHighlightTemplate__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./templates/html/DotHighlightTemplate */ "./src/templates/html/DotHighlightTemplate.js"); /* harmony import */ var _templates_html_GroupTitleTemplate__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./templates/html/GroupTitleTemplate */ "./src/templates/html/GroupTitleTemplate.js"); /* harmony import */ var _templates_html_HighlightTemplate__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./templates/html/HighlightTemplate */ "./src/templates/html/HighlightTemplate.js"); /* harmony import */ var _templates_html_ItemTemplate__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./templates/html/ItemTemplate */ "./src/templates/html/ItemTemplate.js"); /* harmony import */ var _templates_html_UserTemplate__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./templates/html/UserTemplate */ "./src/templates/html/UserTemplate.js"); /* harmony import */ var _templates_html_LevelTitleTemplate__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./templates/html/LevelTitleTemplate */ "./src/templates/html/