1 line
283 KiB
Plaintext
1 line
283 KiB
Plaintext
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/index.ts","webpack:///./src/Item.ts","webpack:///./src/lib/TypedEvent.ts","webpack:///./src/items/EventsHistory.ts","webpack:///./src/items/DonutGraph.ts","webpack:///./src/items/BarsGraph.ts","webpack:///./src/items/ModuleGraph.ts","webpack:///./src/items/StaticGraph.ts","webpack:///./src/items/Icon.ts","webpack:///./src/items/ColorCloud.ts","webpack:///./src/items/Group.ts","webpack:///./src/items/Clock/index.ts","webpack:///./src/items/Box.ts","webpack:///./src/items/Line.ts","webpack:///./src/items/Label.ts","webpack:///./src/items/SimpleValue.ts","webpack:///./node_modules/d3-path/src/path.js","webpack:///./node_modules/d3-shape/src/constant.js","webpack:///./node_modules/d3-shape/src/math.js","webpack:///./node_modules/d3-shape/src/arc.js","webpack:///./node_modules/d3-shape/src/curve/linear.js","webpack:///./node_modules/d3-shape/src/curve/radial.js","webpack:///./node_modules/d3-shape/src/array.js","webpack:///./node_modules/d3-shape/src/symbol/diamond.js","webpack:///./node_modules/d3-shape/src/symbol/circle.js","webpack:///./node_modules/d3-shape/src/symbol/star.js","webpack:///./node_modules/d3-shape/src/noop.js","webpack:///./node_modules/d3-shape/src/symbol/triangle.js","webpack:///./node_modules/d3-shape/src/symbol/wye.js","webpack:///./node_modules/d3-shape/src/curve/basis.js","webpack:///./node_modules/d3-shape/src/curve/basisClosed.js","webpack:///./node_modules/d3-shape/src/curve/basisOpen.js","webpack:///./node_modules/d3-shape/src/curve/bundle.js","webpack:///./node_modules/d3-shape/src/curve/cardinal.js","webpack:///./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack:///./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack:///./node_modules/d3-shape/src/curve/catmullRom.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack:///./node_modules/d3-shape/src/curve/linearClosed.js","webpack:///./node_modules/d3-shape/src/curve/monotone.js","webpack:///./node_modules/d3-shape/src/curve/natural.js","webpack:///./node_modules/d3-shape/src/curve/step.js","webpack:///./node_modules/d3-shape/src/order/descending.js","webpack:///./src/items/Percentile.ts","webpack:///./src/items/Service.ts","webpack:///./src/VisualConsole.ts","webpack:///./src/lib/AsyncTaskManager.ts","webpack:///./src/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","parseIntOr","defaultValue","length","isNaN","parseInt","parseFloatOr","parseFloat","stringIsEmpty","notEmptyStringOr","parseBoolean","leftPad","pad","diffLength","substr","Math","abs","substring","repeatTimes","floor","restLength","newPad","positionPropsDecoder","data","x","y","sizePropsDecoder","width","height","TypeError","modulePropsDecoder","__assign","moduleName","moduleDescription","agentProps","agentId","agent","agentName","agentAlias","agentDescription","agentAddress","metaconsoleId","agentPropsDecoder","linkedVCPropsDecoder","id","linkedLayoutId","linkedLayoutAgentId","linkedLayoutStatusProps","linkedLayoutStatusType","weight","linkedLayoutStatusTypeWeight","warningThreshold","linkedLayoutStatusTypeWarningThreshold","criticalThreshold","linkedLayoutStatusTypeCriticalThreshold","linkedLayoutBaseProps","itemMetaDecoder","receivedAt","Date","Number","getTime","error","Error","editMode","isFromCache","isFetching","isUpdating","prefixedCssRules","ruleName","ruleValue","rule","decodeBase64","input","decodeURIComponent","escape","window","atob","humanDate","date","locale","Intl","DateTimeFormat","day","month","year","format","getDate","getMonth","getFullYear","humanTime","getHours","getMinutes","getSeconds","replaceMacros","macros","text","reduce","acc","_a","macro","replace","throttle","delay","fn","last","args","_i","arguments","now","apply","debounce","timerRef","clearTimeout","setTimeout","getOffset","el","offsetLeft","offsetTop","scrollLeft","scrollTop","offsetParent","top","left","addMovementListener","element","onMoved","container","parentElement","isDraggable","draggable","lastX","lastY","lastMouseX","lastMouseY","mouseElementOffsetX","mouseElementOffsetY","containerBounds","getBoundingClientRect","containerOffset","containerTop","containerBottom","containerLeft","containerRight","elementBounds","borderWidth","getComputedStyle","borderFix","debouncedMovement","throttledMovement","handleMove","e","mouseX","pageX","mouseY","pageY","mouseDeltaX","mouseDeltaY","maxX","maxY","outOfBoundsLeft","outOfBoundsRight","outOfBoundsTop","outOfBoundsBottom","handleEnd","document","removeEventListener","body","style","userSelect","handleStart","stopPropagation","offsetX","offsetY","addEventListener","addResizementListener","onResized","resizeDraggable","createElement","className","appendChild","lastWidth","lastHeight","elementOffset","elementTop","elementLeft","debouncedResizement","throttledResizement","handleResize","remove","parseLabelPosition","labelPosition","itemBasePropsDecoder","type","label","_lib__WEBPACK_IMPORTED_MODULE_0__","isLinkEnabled","link","isOnTop","parentId","aclGroupId","VisualConsoleItem","props","metadata","_this","this","clickEventManager","_lib_TypedEvent__WEBPACK_IMPORTED_MODULE_1__","movedEventManager","resizedEventManager","removeEventManager","disposables","debouncedMovementSave","prevPosition","newPosition","positionChanged","move","emit","item","removeMovement","debouncedResizementSave","prevSize","newSize","sizeChanged","resize","removeResizement","itemProps","_metadata","elementRef","createContainerDomElement","labelElementRef","createLabelDomElement","childElementRef","createDomElement","append","resizeElement","changeLabelPosition","initMovementListener","moveElement","stopMovementListener","initResizementListener","labelWidth","labelHeight","stopResizementListener","box","href","zIndex","meta","preventDefault","nativeEvent","classList","add","getLabelWithMacrosReplaced","table","row","emptyRow1","emptyRow2","cell","innerHTML","textAlign","updateDomElement","newProps","prevProps","shouldBeUpdated","render","newMetadata","setMeta","prevMetadata","prevMeta","oldLabelHtml","newLabelHtml","attrs","attributes","nodeName","setAttributeNode","parentNode","replaceChild","forEach","disposable","dispose","ignored","position","flexDirection","tables","getElementsByTagName","onClick","listener","on","push","onRemove","__webpack_exports__","TypedEvent","listeners","listenersOncer","off","once","callbackIndex","indexOf","splice","event","pipe","te","eventsHistoryPropsDecoder","html","encodedHtml","_Item__WEBPACK_IMPORTED_MODULE_1__","maxTime","EventsHistory","_super","__extends","scripts","src","eval","trim","aux","donutGraphPropsDecoder","DonutGraph","barsGraphPropsDecoder","BarsGraph","moduleGraphPropsDecoder","ModuleGraph","legendP","margin","overviewGraphs","getElementsByClassName","parseShowLastValueTooltip","showLastValueTooltip","staticGraphPropsDecoder","imageSrc","Item","statusImageSrc","lib","lastValue","StaticGraph","imgSrc","background","backgroundSize","backgroundPosition","setAttribute","iconPropsDecoder","Icon_assign","Icon","Icon_extends","colorCloudPropsDecoder","color","ColorCloud_assign","ColorCloud_svgNS","ColorCloud","ColorCloud_extends","createSvgElement","gradientId","svg","createElementNS","defs","radialGradient","stop0","stop100","circle","groupPropsDecoder","groupId","showStatistics","extractHtml","Group_assign","Group","Group_extends","parseClockType","clockType","parseClockFormat","clockFormat","clockPropsDecoder","clockTimezone","Clock_assign","clockTimezoneOffset","showClockTimezone","items_Clock","Clock","intervalRef","startTick","createClock","TICK_INTERVAL","Clock_extends","stopTick","clearInterval","handler","interval","setInterval","getElementSize","newWidth","newHeight","createAnalogicClock","createDigitalClock","svgNS","colors","dateFontSize","baseTimeFontSize","div","clockFace","clockFaceBackground","city","getHumanTimezone","timezoneComplication","textContent","marksGroup","mainMarkGroup","mark1a","mark1b","mark","hourHand","hourHandA","hourHandB","minuteHand","minuteHandA","minuteHandB","minuteHandPin","secondHand","secondHandBar","secondHandPin","pin","getOriginDate","seconds","minutes","secAngle","minuteAngle","hourAngle","join","dateElem","fontSize","tzFontSizeMultiplier","timeFontSize","tzFontSize","min","timeElem","tzElem","initialDate","targetTZOffset","localTZOffset","getTimezoneOffset","utimestamp","timezone","_b","split","diameter","boxPropsDecoder","Box_assign","borderColor","fillColor","Box","Box_extends","boxSizing","backgroundColor","borderStyle","maxBorderWidth","linePropsDecoder","Line_assign","startPosition","startX","startY","endPosition","endX","endY","lineWidth","Line","extractBoxSizeAndPosition","Line_extends","toString","line","labelPropsDecoder","Label_assign","Label","Label_extends","parseValueType","valueType","parseProcessValue","processValue","simpleValuePropsDecoder","SimpleValue_assign","period","SimpleValue","SimpleValue_extends","img","pi","PI","tau","tauEpsilon","Path","_x0","_y0","_x1","_y1","_","path","constructor","moveTo","closePath","lineTo","quadraticCurveTo","x1","y1","bezierCurveTo","x2","y2","arcTo","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","sqrt","l01","tan","acos","t01","t21","arc","a0","a1","ccw","dx","cos","dy","sin","cw","da","rect","w","h","src_path","constant","atan2","max","math_epsilon","math_pi","halfPi","math_tau","asin","arcInnerRadius","innerRadius","arcOuterRadius","outerRadius","arcStartAngle","startAngle","arcEndAngle","endAngle","arcPadAngle","padAngle","cornerTangents","r1","rc","lo","ox","oy","x11","y11","x10","y10","x00","y00","d2","D","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","cx","cy","src_arc","cornerRadius","padRadius","context","buffer","r0","t0","t1","a01","a11","a00","a10","da0","da1","ap","rp","rc0","rc1","p0","p1","oc","x3","y3","x32","y32","intersect","ax","ay","bx","by","kc","lc","centroid","a","Linear","_context","areaStart","_line","areaEnd","NaN","lineStart","_point","lineEnd","point","linear","curveRadial","Radial","curve","_curve","radial","Array","slice","kr","noop","that","Basis","BasisClosed","_x2","_x3","_x4","_y2","_y3","_y4","BasisOpen","Bundle","beta","_basis","_beta","_x","_y","j","custom","bundle","cardinal_point","_k","Cardinal","tension","cardinal","CardinalClosed","_x5","_y5","CardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","b","_l23_2a","CatmullRom","alpha","_alpha","x23","y23","pow","catmullRom","CatmullRomClosed","CatmullRomOpen","LinearClosed","sign","slope3","h0","h1","s0","s1","slope2","monotone_point","MonotoneX","MonotoneY","ReflectContext","Natural","controlPoints","_t0","px","py","i0","i1","Step","_t","extractPercentileType","extractValueType","percentilePropsDecoder","Percentile_assign","percentileType","minValue","maxValue","labelColor","unit","Percentile_svgNS","Percentile","Percentile_extends","formatValue","progress","getProgress","NumberFormat","backgroundRect","progressRect","backgroundCircle","progressCircle","arcProps","trunc","servicePropsDecoder","encodedTitle","serviceId","Service_assign","Service","Service_extends","itemInstanceFrom","items_StaticGraph","items_SimpleValue","items_Percentile","items_Label","items_Icon","items_Service","items_Group","items_Box","items_Line","items_ColorCloud","VisualConsole","items","elementsById","elementIds","relations","handleElementClick","handleElementMovement","handleElementResizement","handleElementRemove","filter","clearRelations","containerRef","_props","backgroundURL","isFavorite","relationLineWidth","VisualConsole_assign","visualConsolePropsDecoder","sort","itemInstance","console","log","message","buildRelations","map","updateElements","itemIds","decodeProps","backgroundImage","elements","parent_1","child","addRelationLine","itemId","ids","childId","getRelationLine","identifier","parent","clientWidth","clientHeight","onItemClick","onItemMoved","onItemResized","enableEditMode","disableEditMode","AsyncTaskManager_AsyncTask","AsyncTask","taskInitiator","cancellable","cancel","_status","statusChangeEventManager","status","init","onStatusChange","AsyncTaskManager","tasks","asyncTask","task","ref","asyncPeriodic","src_VisualConsole","lib_AsyncTaskManager"],"mappings":"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","file":"vc.main.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","import {\n AnyObject,\n Position,\n Size,\n WithAgentProps,\n WithModuleProps,\n LinkedVisualConsoleProps,\n LinkedVisualConsolePropsStatus,\n UnknownObject,\n ItemMeta\n} from \"./types\";\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseIntOr<T>(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.length > 0 && !isNaN(parseInt(value)))\n return parseInt(value);\n else return defaultValue;\n}\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseFloatOr<T>(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (\n typeof value === \"string\" &&\n value.length > 0 &&\n !isNaN(parseFloat(value))\n )\n return parseFloat(value);\n else return defaultValue;\n}\n\n/**\n * Check if a string exists and it's not empty.\n * @param value Value to check.\n * @return The check result.\n */\nexport function stringIsEmpty(value?: string | null): boolean {\n return value == null || value.length === 0;\n}\n\n/**\n * Return a not empty string or a default value from a raw value.\n * @param value Raw value from which we will try to extract a non empty string.\n * @param defaultValue Default value to use if we cannot extract a non empty string.\n * @return A non empty string or the default value.\n */\nexport function notEmptyStringOr<T>(\n value: unknown,\n defaultValue: T\n): string | T {\n return typeof value === \"string\" && value.length > 0 ? value : defaultValue;\n}\n\n/**\n * Return a boolean from a raw value.\n * @param value Raw value from which we will try to extract the boolean.\n * @return A valid boolean value. false by default.\n */\nexport function parseBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n else if (typeof value === \"number\") return value > 0;\n else if (typeof value === \"string\") return value === \"1\" || value === \"true\";\n else return false;\n}\n\n/**\n * Return a valid date or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid date.\n * @param defaultValue Default value to use if we cannot extract a valid date.\n * @return A valid date or the default value.\n */\nexport function parseDateOr<T>(value: unknown, defaultValue: T): Date | T {\n if (value instanceof Date) return value;\n else if (typeof value === \"number\") return new Date(value * 1000);\n else if (\n typeof value === \"string\" &&\n !Number.isNaN(new Date(value).getTime())\n )\n return new Date(value);\n else return defaultValue;\n}\n\n/**\n * Pad the current string with another string (multiple times, if needed)\n * until the resulting string reaches the given length.\n * The padding is applied from the start (left) of the current string.\n * @param value Text that needs to be padded.\n * @param length Length of the returned text.\n * @param pad Text to add.\n * @return Padded text.\n */\nexport function leftPad(\n value: string | number,\n length: number,\n pad: string | number = \" \"\n): string {\n if (typeof value === \"number\") value = `${value}`;\n if (typeof pad === \"number\") pad = `${pad}`;\n\n const diffLength = length - value.length;\n if (diffLength === 0) return value;\n if (diffLength < 0) return value.substr(Math.abs(diffLength));\n\n if (diffLength === pad.length) return `${pad}${value}`;\n if (diffLength < pad.length) return `${pad.substring(0, diffLength)}${value}`;\n\n const repeatTimes = Math.floor(diffLength / pad.length);\n const restLength = diffLength - pad.length * repeatTimes;\n\n let newPad = \"\";\n for (let i = 0; i < repeatTimes; i++) newPad += pad;\n\n if (restLength === 0) return `${newPad}${value}`;\n return `${newPad}${pad.substring(0, restLength)}${value}`;\n}\n\n/* Decoders */\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the position.\n */\nexport function positionPropsDecoder(data: AnyObject): Position {\n return {\n x: parseIntOr(data.x, 0),\n y: parseIntOr(data.y, 0)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the size.\n * @throws Will throw a TypeError if the width and height are not valid numbers.\n */\nexport function sizePropsDecoder(data: AnyObject): Size | never {\n if (\n data.width == null ||\n isNaN(parseInt(data.width)) ||\n data.height == null ||\n isNaN(parseInt(data.height))\n ) {\n throw new TypeError(\"invalid size.\");\n }\n\n return {\n width: parseInt(data.width),\n height: parseInt(data.height)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the agent properties.\n */\nexport function agentPropsDecoder(data: AnyObject): WithAgentProps {\n const agentProps: WithAgentProps = {\n agentId: parseIntOr(data.agent, null),\n agentName: notEmptyStringOr(data.agentName, null),\n agentAlias: notEmptyStringOr(data.agentAlias, null),\n agentDescription: notEmptyStringOr(data.agentDescription, null),\n agentAddress: notEmptyStringOr(data.agentAddress, null)\n };\n\n return data.metaconsoleId != null\n ? {\n metaconsoleId: data.metaconsoleId,\n ...agentProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : agentProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the module and agent properties.\n */\nexport function modulePropsDecoder(data: AnyObject): WithModuleProps {\n return {\n moduleId: parseIntOr(data.moduleId, null),\n moduleName: notEmptyStringOr(data.moduleName, null),\n moduleDescription: notEmptyStringOr(data.moduleDescription, null),\n ...agentPropsDecoder(data) // Object spread: http://es6-features.org/#SpreadOperator\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the linked visual console properties.\n * @throws Will throw a TypeError if the status calculation properties are invalid.\n */\nexport function linkedVCPropsDecoder(\n data: AnyObject\n): LinkedVisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n metaconsoleId,\n linkedLayoutId: id,\n linkedLayoutAgentId: agentId\n } = data;\n\n let linkedLayoutStatusProps: LinkedVisualConsolePropsStatus = {\n linkedLayoutStatusType: \"default\"\n };\n switch (data.linkedLayoutStatusType) {\n case \"weight\": {\n const weight = parseIntOr(data.linkedLayoutStatusTypeWeight, null);\n if (weight == null)\n throw new TypeError(\"invalid status calculation properties.\");\n\n if (data.linkedLayoutStatusTypeWeight)\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"weight\",\n linkedLayoutStatusTypeWeight: weight\n };\n break;\n }\n case \"service\": {\n const warningThreshold = parseIntOr(\n data.linkedLayoutStatusTypeWarningThreshold,\n null\n );\n const criticalThreshold = parseIntOr(\n data.linkedLayoutStatusTypeCriticalThreshold,\n null\n );\n if (warningThreshold == null || criticalThreshold == null) {\n throw new TypeError(\"invalid status calculation properties.\");\n }\n\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"service\",\n linkedLayoutStatusTypeWarningThreshold: warningThreshold,\n linkedLayoutStatusTypeCriticalThreshold: criticalThreshold\n };\n break;\n }\n }\n\n const linkedLayoutBaseProps = {\n linkedLayoutId: parseIntOr(id, null),\n linkedLayoutAgentId: parseIntOr(agentId, null),\n ...linkedLayoutStatusProps // Object spread: http://es6-features.org/#SpreadOperator\n };\n\n return metaconsoleId != null\n ? {\n metaconsoleId,\n ...linkedLayoutBaseProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : linkedLayoutBaseProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the item's meta properties.\n */\nexport function itemMetaDecoder(data: UnknownObject): ItemMeta | never {\n const receivedAt = parseDateOr(data.receivedAt, null);\n if (receivedAt === null) throw new TypeError(\"invalid meta structure\");\n\n let error = null;\n if (data.error instanceof Error) error = data.error;\n else if (typeof data.error === \"string\") error = new Error(data.error);\n\n return {\n receivedAt,\n error,\n editMode: parseBoolean(data.editMode),\n isFromCache: parseBoolean(data.isFromCache),\n isFetching: false,\n isUpdating: false\n };\n}\n\n/**\n * To get a CSS rule with the most used prefixes.\n * @param ruleName Name of the CSS rule.\n * @param ruleValue Value of the CSS rule.\n * @return An array of rules with the prefixes applied.\n */\nexport function prefixedCssRules(\n ruleName: string,\n ruleValue: string\n): string[] {\n const rule = `${ruleName}: ${ruleValue};`;\n return [\n `-webkit-${rule}`,\n `-moz-${rule}`,\n `-ms-${rule}`,\n `-o-${rule}`,\n `${rule}`\n ];\n}\n\n/**\n * Decode a base64 string.\n * @param input Data encoded using base64.\n * @return Decoded data.\n */\nexport function decodeBase64(input: string): string {\n return decodeURIComponent(escape(window.atob(input)));\n}\n\n/**\n * Generate a date representation with the format 'd/m/Y'.\n * @param initialDate Date to be used instead of a generated one.\n * @param locale Locale to use if localization is required and available.\n * @example 24/02/2020.\n * @return Date representation.\n */\nexport function humanDate(date: Date, locale: string | null = null): string {\n if (locale && Intl && Intl.DateTimeFormat) {\n // Format using the user locale.\n const options: Intl.DateTimeFormatOptions = {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\"\n };\n return Intl.DateTimeFormat(locale, options).format(date);\n } else {\n // Use getDate, getDay returns the week day.\n const day = leftPad(date.getDate(), 2, 0);\n // The getMonth function returns the month starting by 0.\n const month = leftPad(date.getMonth() + 1, 2, 0);\n const year = leftPad(date.getFullYear(), 4, 0);\n\n // Format: 'd/m/Y'.\n return `${day}/${month}/${year}`;\n }\n}\n\n/**\n * Generate a time representation with the format 'hh:mm:ss'.\n * @param initialDate Date to be used instead of a generated one.\n * @example 01:34:09.\n * @return Time representation.\n */\nexport function humanTime(date: Date): string {\n const hours = leftPad(date.getHours(), 2, 0);\n const minutes = leftPad(date.getMinutes(), 2, 0);\n const seconds = leftPad(date.getSeconds(), 2, 0);\n\n return `${hours}:${minutes}:${seconds}`;\n}\n\ninterface Macro {\n macro: string | RegExp;\n value: string;\n}\n/**\n * Replace the macros of a text.\n * @param macros List of macros and their replacements.\n * @param text Text in which we need to replace the macros.\n */\nexport function replaceMacros(macros: Macro[], text: string): string {\n return macros.reduce(\n (acc, { macro, value }) => acc.replace(macro, value),\n text\n );\n}\n\n/**\n * Create a function which will limit the rate of execution of\n * the selected function to one time for the selected interval.\n * @param delay Interval.\n * @param fn Function to be executed at a limited rate.\n */\nexport function throttle<T, R>(delay: number, fn: (...args: T[]) => R) {\n let last = 0;\n return (...args: T[]) => {\n const now = Date.now();\n if (now - last < delay) return;\n last = now;\n return fn(...args);\n };\n}\n\n/**\n * Create a function which will call the selected function only\n * after the interval time has passed after its last execution.\n * @param delay Interval.\n * @param fn Function to be executed after the last call.\n */\nexport function debounce<T>(delay: number, fn: (...args: T[]) => void) {\n let timerRef: number | null = null;\n return (...args: T[]) => {\n if (timerRef !== null) window.clearTimeout(timerRef);\n timerRef = window.setTimeout(() => {\n fn(...args);\n timerRef = null;\n }, delay);\n };\n}\n\n/**\n * Retrieve the offset of an element relative to the page.\n * @param el Node used to calculate the offset.\n */\nfunction getOffset(el: HTMLElement | null) {\n let x = 0;\n let y = 0;\n while (el && !Number.isNaN(el.offsetLeft) && !Number.isNaN(el.offsetTop)) {\n x += el.offsetLeft - el.scrollLeft;\n y += el.offsetTop - el.scrollTop;\n el = el.offsetParent as HTMLElement | null;\n }\n return { top: y, left: x };\n}\n\n/**\n * Add the grab & move functionality to a certain element inside it's container.\n *\n * @param element Element to move.\n * @param onMoved Function to execute when the element moves.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addMovementListener(\n element: HTMLElement,\n onMoved: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastX: Position[\"x\"] = 0;\n let lastY: Position[\"y\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementBounds = element.getBoundingClientRect();\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth) * 2;\n\n // Will run onMoved 32ms after its last execution.\n const debouncedMovement = debounce(32, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n // Will run onMoved one time max every 16ms.\n const throttledMovement = throttle(16, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n\n const handleMove = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let x = 0;\n let y = 0;\n\n const mouseX = e.pageX;\n const mouseY = e.pageY;\n const mouseDeltaX = mouseX - lastMouseX;\n const mouseDeltaY = mouseY - lastMouseY;\n\n const minX = 0;\n const maxX = containerBounds.width - elementBounds.width + borderFix;\n const minY = 0;\n const maxY = containerBounds.height - elementBounds.height + borderFix;\n\n const outOfBoundsLeft =\n mouseX < containerLeft ||\n (lastX === 0 &&\n mouseDeltaX > 0 &&\n mouseX < containerLeft + mouseElementOffsetX);\n const outOfBoundsRight =\n mouseX > containerRight ||\n mouseDeltaX + lastX + elementBounds.width - borderFix >\n containerBounds.width ||\n (lastX === maxX &&\n mouseDeltaX < 0 &&\n mouseX > containerLeft + maxX + mouseElementOffsetX);\n const outOfBoundsTop =\n mouseY < containerTop ||\n (lastY === 0 &&\n mouseDeltaY > 0 &&\n mouseY < containerTop + mouseElementOffsetY);\n const outOfBoundsBottom =\n mouseY > containerBottom ||\n mouseDeltaY + lastY + elementBounds.height - borderFix >\n containerBounds.height ||\n (lastY === maxY &&\n mouseDeltaY < 0 &&\n mouseY > containerTop + maxY + mouseElementOffsetY);\n\n if (outOfBoundsLeft) x = minX;\n else if (outOfBoundsRight) x = maxX;\n else x = mouseDeltaX + lastX;\n\n if (outOfBoundsTop) y = minY;\n else if (outOfBoundsBottom) y = maxY;\n else y = mouseDeltaY + lastY;\n\n if (x < 0) x = minX;\n if (y < 0) y = minY;\n\n // Store the last mouse coordinates.\n lastMouseX = mouseX;\n lastMouseY = mouseY;\n\n if (x === lastX && y === lastY) return;\n\n // Run the movement events.\n throttledMovement(x, y);\n debouncedMovement(x, y);\n\n // Store the coordinates of the element.\n lastX = x;\n lastY = y;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastX = 0;\n lastY = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleMove);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n lastX = element.offsetLeft;\n lastY = element.offsetTop;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementBounds = element.getBoundingClientRect();\n borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n borderFix = Number.parseInt(borderWidth) * 2;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleMove);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n element.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n element.removeEventListener(\"mousedown\", handleStart);\n handleEnd();\n };\n}\n\n/**\n * Add the grab & resize functionality to a certain element.\n *\n * @param element Element to move.\n * @param onResized Function to execute when the element is resized.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addResizementListener(\n element: HTMLElement,\n onResized: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const minWidth = 15;\n const minHeight = 15;\n\n const resizeDraggable = document.createElement(\"div\");\n resizeDraggable.className = \"resize-draggable\";\n element.appendChild(resizeDraggable);\n\n // Container of the resizable element.\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastWidth: Size[\"width\"] = 0;\n let lastHeight: Size[\"height\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Init the bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementOffset = getOffset(element);\n let elementTop = elementOffset.top;\n let elementLeft = elementOffset.left;\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth);\n\n // Will run onResized 32ms after its last execution.\n const debouncedResizement = debounce(\n 32,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n // Will run onResized one time max every 16ms.\n const throttledResizement = throttle(\n 16,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n\n const handleResize = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let width = lastWidth + (e.pageX - lastMouseX);\n let height = lastHeight + (e.pageY - lastMouseY);\n\n if (width === lastWidth && height === lastHeight) return;\n\n if (\n width < lastWidth &&\n e.pageX > elementLeft + (lastWidth - mouseElementOffsetX)\n )\n return;\n\n if (width < minWidth) {\n // Minimum value.\n width = minWidth;\n } else if (width + elementLeft - borderFix / 2 >= containerRight) {\n // Limit the size to the container.\n width = containerRight - elementLeft;\n }\n if (height < minHeight) {\n // Minimum value.\n height = minHeight;\n } else if (height + elementTop - borderFix / 2 >= containerBottom) {\n // Limit the size to the container.\n height = containerBottom - elementTop;\n }\n\n // Run the movement events.\n throttledResizement(width, height);\n debouncedResizement(width, height);\n\n // Store the coordinates of the element.\n lastWidth = width;\n lastHeight = height;\n // Store the last mouse coordinates.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastWidth = 0;\n lastHeight = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n mouseElementOffsetX = 0;\n mouseElementOffsetY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleResize);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n const { width, height } = element.getBoundingClientRect();\n lastWidth = width;\n lastHeight = height;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementOffset = getOffset(element);\n elementTop = elementOffset.top;\n elementLeft = elementOffset.left;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleResize);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n resizeDraggable.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n resizeDraggable.remove();\n handleEnd();\n };\n}\n","import {\n Position,\n Size,\n AnyObject,\n WithModuleProps,\n ItemMeta\n} from \"./lib/types\";\nimport {\n sizePropsDecoder,\n positionPropsDecoder,\n parseIntOr,\n parseBoolean,\n notEmptyStringOr,\n replaceMacros,\n humanDate,\n humanTime,\n addMovementListener,\n debounce,\n addResizementListener\n} from \"./lib\";\nimport TypedEvent, { Listener, Disposable } from \"./lib/TypedEvent\";\n\n// Enum: https://www.typescriptlang.org/docs/handbook/enums.html.\nexport const enum ItemType {\n STATIC_GRAPH = 0,\n MODULE_GRAPH = 1,\n SIMPLE_VALUE = 2,\n PERCENTILE_BAR = 3,\n LABEL = 4,\n ICON = 5,\n SIMPLE_VALUE_MAX = 6,\n SIMPLE_VALUE_MIN = 7,\n SIMPLE_VALUE_AVG = 8,\n PERCENTILE_BUBBLE = 9,\n SERVICE = 10,\n GROUP_ITEM = 11,\n BOX_ITEM = 12,\n LINE_ITEM = 13,\n AUTO_SLA_GRAPH = 14,\n CIRCULAR_PROGRESS_BAR = 15,\n CIRCULAR_INTERIOR_PROGRESS_BAR = 16,\n DONUT_GRAPH = 17,\n BARS_GRAPH = 18,\n CLOCK = 19,\n COLOR_CLOUD = 20\n}\n\n// Base item properties. This interface should be extended by the item implementations.\nexport interface ItemProps extends Position, Size {\n readonly id: number;\n readonly type: ItemType;\n label: string | null;\n labelPosition: \"up\" | \"right\" | \"down\" | \"left\";\n isLinkEnabled: boolean;\n link: string | null;\n isOnTop: boolean;\n parentId: number | null;\n aclGroupId: number | null;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemClickEvent<Props extends ItemProps> {\n // data: Props;\n data: AnyObject;\n nativeEvent: Event;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemRemoveEvent<Props extends ItemProps> {\n // data: Props;\n data: AnyObject;\n}\n\nexport interface ItemMovedEvent {\n item: VisualConsoleItem<ItemProps>;\n prevPosition: Position;\n newPosition: Position;\n}\n\nexport interface ItemResizedEvent {\n item: VisualConsoleItem<ItemProps>;\n prevSize: Size;\n newSize: Size;\n}\n\n/**\n * Extract a valid enum value from a raw label positi9on value.\n * @param labelPosition Raw value.\n */\nconst parseLabelPosition = (\n labelPosition: unknown\n): ItemProps[\"labelPosition\"] => {\n switch (labelPosition) {\n case \"up\":\n case \"right\":\n case \"down\":\n case \"left\":\n return labelPosition;\n default:\n return \"down\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function itemBasePropsDecoder(data: AnyObject): ItemProps | never {\n if (data.id == null || isNaN(parseInt(data.id))) {\n throw new TypeError(\"invalid id.\");\n }\n if (data.type == null || isNaN(parseInt(data.type))) {\n throw new TypeError(\"invalid type.\");\n }\n\n return {\n id: parseInt(data.id),\n type: parseInt(data.type),\n label: notEmptyStringOr(data.label, null),\n labelPosition: parseLabelPosition(data.labelPosition),\n isLinkEnabled: parseBoolean(data.isLinkEnabled),\n link: notEmptyStringOr(data.link, null),\n isOnTop: parseBoolean(data.isOnTop),\n parentId: parseIntOr(data.parentId, null),\n aclGroupId: parseIntOr(data.aclGroupId, null),\n ...sizePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...positionPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\n/**\n * Base class of the visual console items. Should be extended to use its capabilities.\n */\nabstract class VisualConsoleItem<Props extends ItemProps> {\n // Properties of the item.\n private itemProps: Props;\n // Metadata of the item.\n private _metadata: ItemMeta;\n // Reference to the DOM element which will contain the item.\n public elementRef: HTMLElement;\n public readonly labelElementRef: HTMLElement;\n // Reference to the DOM element which will contain the view of the item which extends this class.\n protected readonly childElementRef: HTMLElement;\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent<ItemClickEvent<Props>>();\n // Event manager for moved events.\n private readonly movedEventManager = new TypedEvent<ItemMovedEvent>();\n // Event manager for resized events.\n private readonly resizedEventManager = new TypedEvent<ItemResizedEvent>();\n // Event manager for remove events.\n private readonly removeEventManager = new TypedEvent<\n ItemRemoveEvent<Props>\n >();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedMovementSave = debounce(\n 500, // ms.\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n const prevPosition = {\n x: this.props.x,\n y: this.props.y\n };\n const newPosition = {\n x: x,\n y: y\n };\n\n if (!this.positionChanged(prevPosition, newPosition)) return;\n\n // Save the new position to the props.\n this.move(x, y);\n // Emit the movement event.\n this.movedEventManager.emit({\n item: this,\n prevPosition: prevPosition,\n newPosition: newPosition\n });\n }\n );\n // This property will store the function\n // to clean the movement listener.\n private removeMovement: Function | null = null;\n\n /**\n * Start the movement funtionality.\n * @param element Element to move inside its container.\n */\n private initMovementListener(element: HTMLElement): void {\n this.removeMovement = addMovementListener(\n element,\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n // Move the DOM element.\n this.moveElement(x, y);\n // Run the save function.\n this.debouncedMovementSave(x, y);\n }\n );\n }\n /**\n * Stop the movement fun\n */\n private stopMovementListener(): void {\n if (this.removeMovement) {\n this.removeMovement();\n this.removeMovement = null;\n }\n }\n\n // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedResizementSave = debounce(\n 500, // ms.\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n const prevSize = {\n width: this.props.width,\n height: this.props.height\n };\n const newSize = {\n width: width,\n height: height\n };\n\n if (!this.sizeChanged(prevSize, newSize)) return;\n\n // Save the new position to the props.\n this.resize(width, height);\n // Emit the resizement event.\n this.resizedEventManager.emit({\n item: this,\n prevSize: prevSize,\n newSize: newSize\n });\n }\n );\n // This property will store the function\n // to clean the resizement listener.\n private removeResizement: Function | null = null;\n\n /**\n * Start the resizement funtionality.\n * @param element Element to move inside its container.\n */\n protected initResizementListener(element: HTMLElement): void {\n this.removeResizement = addResizementListener(\n element,\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n // The label it's outside the item's size, so we need\n // to get rid of its size to get the real size of the\n // item's content.\n if (this.props.label && this.props.label.length > 0) {\n const {\n width: labelWidth,\n height: labelHeight\n } = this.labelElementRef.getBoundingClientRect();\n\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n height -= labelHeight;\n break;\n case \"left\":\n case \"right\":\n width -= labelWidth;\n break;\n }\n }\n\n // Move the DOM element.\n this.resizeElement(width, height);\n // Run the save function.\n this.debouncedResizementSave(width, height);\n }\n );\n }\n /**\n * Stop the resizement functionality.\n */\n private stopResizementListener(): void {\n if (this.removeResizement) {\n this.removeResizement();\n this.removeResizement = null;\n }\n }\n\n /**\n * To create a new element which will be inside the item box.\n * @return Item.\n */\n protected abstract createDomElement(): HTMLElement;\n\n public constructor(props: Props, metadata: ItemMeta) {\n this.itemProps = props;\n this._metadata = metadata;\n\n /*\n * Get a HTMLElement which represents the container box\n * of the Visual Console item. This element will manage\n * all the common things like click events, show a border\n * when hovered, etc.\n */\n this.elementRef = this.createContainerDomElement();\n this.labelElementRef = this.createLabelDomElement();\n\n /*\n * Get a HTMLElement which represents the custom view\n * of the Visual Console item. This element will be\n * different depending on the item implementation.\n */\n this.childElementRef = this.createDomElement();\n\n // Insert the elements into the container.\n this.elementRef.append(this.childElementRef, this.labelElementRef);\n\n // Resize element.\n this.resizeElement(props.width, props.height);\n // Set label position.\n this.changeLabelPosition(props.labelPosition);\n }\n\n /**\n * To create a new box for the visual console item.\n * @return Item box.\n */\n private createContainerDomElement(): HTMLElement {\n let box;\n if (this.props.isLinkEnabled) {\n box = document.createElement(\"a\") as HTMLAnchorElement;\n if (this.props.link) box.href = this.props.link;\n } else {\n box = document.createElement(\"div\") as HTMLDivElement;\n }\n\n box.className = \"visual-console-item\";\n box.style.zIndex = this.props.isOnTop ? \"2\" : \"1\";\n box.style.left = `${this.props.x}px`;\n box.style.top = `${this.props.y}px`;\n // Init the click listener.\n box.addEventListener(\"click\", e => {\n if (this.meta.editMode) {\n e.preventDefault();\n e.stopPropagation();\n } else {\n this.clickEventManager.emit({ data: this.props, nativeEvent: e });\n }\n });\n\n // Metadata state.\n if (this.meta.editMode) {\n box.classList.add(\"is-editing\");\n // Init the movement listener.\n this.initMovementListener(box);\n // Init the resizement listener.\n this.initResizementListener(box);\n }\n if (this.meta.isFetching) {\n box.classList.add(\"is-fetching\");\n }\n if (this.meta.isUpdating) {\n box.classList.add(\"is-updating\");\n }\n\n return box;\n }\n\n /**\n * To create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Add the label if it exists.\n const label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n // Ugly table we need to use to replicate the legacy style.\n const table = document.createElement(\"table\");\n const row = document.createElement(\"tr\");\n const emptyRow1 = document.createElement(\"tr\");\n const emptyRow2 = document.createElement(\"tr\");\n const cell = document.createElement(\"td\");\n\n cell.innerHTML = label;\n row.append(cell);\n table.append(emptyRow1, row, emptyRow2);\n table.style.textAlign = \"center\";\n\n // Change the table size depending on its position.\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n\n // element.innerHTML = this.props.label;\n element.append(table);\n }\n\n return element;\n }\n\n /**\n * Return the label stored into the props with some macros replaced.\n */\n protected getLabelWithMacrosReplaced(): string {\n // We assert that the props may have some needed properties.\n const props = this.props as Partial<WithModuleProps>;\n\n return replaceMacros(\n [\n {\n macro: \"_date_\",\n value: humanDate(new Date())\n },\n {\n macro: \"_time_\",\n value: humanTime(new Date())\n },\n {\n macro: \"_agent_\",\n value: props.agentAlias != null ? props.agentAlias : \"\"\n },\n {\n macro: \"_agentdescription_\",\n value: props.agentDescription != null ? props.agentDescription : \"\"\n },\n {\n macro: \"_address_\",\n value: props.agentAddress != null ? props.agentAddress : \"\"\n },\n {\n macro: \"_module_\",\n value: props.moduleName != null ? props.moduleName : \"\"\n },\n {\n macro: \"_moduledescription_\",\n value: props.moduleDescription != null ? props.moduleDescription : \"\"\n }\n ],\n this.props.label || \"\"\n );\n }\n\n /**\n * To update the content element.\n * @return Item.\n */\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.createDomElement().innerHTML;\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): Props {\n return { ...this.itemProps }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: Props) {\n const prevProps = this.props;\n // Update the internal props.\n this.itemProps = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n if (this.shouldBeUpdated(prevProps, newProps))\n this.render(prevProps, this._metadata);\n }\n\n /**\n * Public accessor of the `meta` property.\n * @return Properties.\n */\n public get meta(): ItemMeta {\n return { ...this._metadata }; // Return a copy.\n }\n\n /**\n * Public setter of the `meta` property.\n * If the new meta are different enough than the\n * stored meta, a render would be fired.\n * @param newProps\n */\n public set meta(newMetadata: ItemMeta) {\n this.setMeta(newMetadata);\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n */\n protected setMeta(newMetadata: ItemMeta) {\n const prevMetadata = this._metadata;\n // Update the internal meta.\n this._metadata = newMetadata;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n // if (this.shouldBeUpdated(prevMetadata, newMetadata))\n this.render(this.itemProps, prevMetadata);\n }\n\n /**\n * To compare the previous and the new props and returns a boolean value\n * in case the difference is meaningfull enough to perform DOM changes.\n *\n * Here, the only comparision is done by reference.\n *\n * Override this function to perform a different comparision depending on the item needs.\n *\n * @param prevProps\n * @param newProps\n * @return Whether the difference is meaningful enough to perform DOM changes or not.\n */\n protected shouldBeUpdated(prevProps: Props, newProps: Props): boolean {\n return prevProps !== newProps;\n }\n\n /**\n * To recreate or update the HTMLElement which represents the item into the DOM.\n * @param prevProps If exists it will be used to only perform DOM updates instead of a full replace.\n */\n public render(\n prevProps: Props | null = null,\n prevMeta: ItemMeta | null = null\n ): void {\n this.updateDomElement(this.childElementRef);\n\n // Move box.\n if (!prevProps || this.positionChanged(prevProps, this.props)) {\n this.moveElement(this.props.x, this.props.y);\n }\n // Resize box.\n if (!prevProps || this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n // Change label.\n const oldLabelHtml = this.labelElementRef.innerHTML;\n const newLabelHtml = this.createLabelDomElement().innerHTML;\n if (oldLabelHtml !== newLabelHtml) {\n this.labelElementRef.innerHTML = newLabelHtml;\n }\n // Change label position.\n if (!prevProps || prevProps.labelPosition !== this.props.labelPosition) {\n this.changeLabelPosition(this.props.labelPosition);\n }\n // Change link.\n if (\n prevProps &&\n (prevProps.isLinkEnabled !== this.props.isLinkEnabled ||\n (this.props.isLinkEnabled && prevProps.link !== this.props.link))\n ) {\n const container = this.createContainerDomElement();\n // Add the children of the old element.\n container.innerHTML = this.elementRef.innerHTML;\n // Copy the attributes.\n const attrs = this.elementRef.attributes;\n for (let i = 0; i < attrs.length; i++) {\n if (attrs[i].nodeName !== \"id\") {\n container.setAttributeNode(attrs[i]);\n }\n }\n // Replace the reference.\n if (this.elementRef.parentNode !== null) {\n this.elementRef.parentNode.replaceChild(container, this.elementRef);\n }\n\n // Changed the reference to the main element. It's ugly, but needed.\n this.elementRef = container;\n }\n\n // Change metadata related things.\n if (!prevMeta || prevMeta.editMode !== this.meta.editMode) {\n if (this.meta.editMode) {\n this.elementRef.classList.add(\"is-editing\");\n this.initMovementListener(this.elementRef);\n this.initResizementListener(this.elementRef);\n } else {\n this.elementRef.classList.remove(\"is-editing\");\n this.stopMovementListener();\n this.stopResizementListener();\n }\n }\n if (!prevMeta || prevMeta.isFetching !== this.meta.isFetching) {\n if (this.meta.isFetching) {\n this.elementRef.classList.add(\"is-fetching\");\n } else {\n this.elementRef.classList.remove(\"is-fetching\");\n }\n }\n if (!prevMeta || prevMeta.isUpdating !== this.meta.isUpdating) {\n if (this.meta.isUpdating) {\n this.elementRef.classList.add(\"is-updating\");\n } else {\n this.elementRef.classList.remove(\"is-updating\");\n }\n }\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n // Call the remove event.\n this.removeEventManager.emit({ data: this.props });\n // Event listeners.\n this.disposables.forEach(disposable => {\n try {\n disposable.dispose();\n } catch (ignored) {} // eslint-disable-line no-empty\n });\n // VisualConsoleItem DOM element.\n this.elementRef.remove();\n }\n\n /**\n * Compare the previous and the new position and return\n * a boolean value in case the position changed.\n * @param prevPosition\n * @param newPosition\n * @return Whether the position changed or not.\n */\n protected positionChanged(\n prevPosition: Position,\n newPosition: Position\n ): boolean {\n return prevPosition.x !== newPosition.x || prevPosition.y !== newPosition.y;\n }\n\n /**\n * Move the label around the item content.\n * @param position Label position.\n */\n protected changeLabelPosition(position: Props[\"labelPosition\"]): void {\n switch (position) {\n case \"up\":\n this.elementRef.style.flexDirection = \"column-reverse\";\n break;\n case \"left\":\n this.elementRef.style.flexDirection = \"row-reverse\";\n break;\n case \"right\":\n this.elementRef.style.flexDirection = \"row\";\n break;\n case \"down\":\n default:\n this.elementRef.style.flexDirection = \"column\";\n break;\n }\n\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n // Change the table size depending on its position.\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n }\n }\n\n /**\n * Move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n protected moveElement(x: number, y: number): void {\n this.elementRef.style.left = `${x}px`;\n this.elementRef.style.top = `${y}px`;\n }\n\n /**\n * Update the position into the properties and move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n public move(x: number, y: number): void {\n this.moveElement(x, y);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n x,\n y\n };\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n protected sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n // The most valuable size is the content size.\n this.childElementRef.style.width = width > 0 ? `${width}px` : null;\n this.childElementRef.style.height = height > 0 ? `${height}px` : null;\n\n if (this.props.label && this.props.label.length > 0) {\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n table.style.width = width > 0 ? `${width}px` : null;\n break;\n case \"left\":\n case \"right\":\n table.style.height = height > 0 ? `${height}px` : null;\n break;\n }\n }\n }\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.resizeElement(width, height);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onClick(listener: Listener<ItemClickEvent<Props>>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the movement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onMoved(listener: Listener<ItemMovedEvent>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the resizement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onResized(listener: Listener<ItemResizedEvent>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.resizedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the removal of the item.\n * @param listener Function which is going to be executed when a item is removed.\n */\n public onRemove(listener: Listener<ItemRemoveEvent<Props>>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.removeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\nexport default VisualConsoleItem;\n","export interface Listener<T> {\n (event: T): void;\n}\n\nexport interface Disposable {\n dispose: () => void;\n}\n\n/** passes through events as they happen. You will not get events from before you start listening */\nexport default class TypedEvent<T> {\n private listeners: Listener<T>[] = [];\n private listenersOncer: Listener<T>[] = [];\n\n public on = (listener: Listener<T>): Disposable => {\n this.listeners.push(listener);\n return {\n dispose: () => this.off(listener)\n };\n };\n\n public once = (listener: Listener<T>): void => {\n this.listenersOncer.push(listener);\n };\n\n public off = (listener: Listener<T>): void => {\n const callbackIndex = this.listeners.indexOf(listener);\n if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);\n };\n\n public emit = (event: T): void => {\n /** Update any general listeners */\n this.listeners.forEach(listener => listener(event));\n\n /** Clear the `once` queue */\n this.listenersOncer.forEach(listener => listener(event));\n this.listenersOncer = [];\n };\n\n public pipe = (te: TypedEvent<T>): Disposable => this.on(e => te.emit(e));\n}\n","import { AnyObject, WithModuleProps } from \"../lib/types\";\nimport {\n modulePropsDecoder,\n parseIntOr,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type EventsHistoryProps = {\n type: ItemType.AUTO_SLA_GRAPH;\n maxTime: number | null;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the events history props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function eventsHistoryPropsDecoder(\n data: AnyObject\n): EventsHistoryProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.AUTO_SLA_GRAPH,\n maxTime: parseIntOr(data.maxTime, null),\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class EventsHistory extends Item<EventsHistoryProps> {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"events-history\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type DonutGraphProps = {\n type: ItemType.DONUT_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the donut graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function donutGraphPropsDecoder(\n data: AnyObject\n): DonutGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.DONUT_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class DonutGraph extends Item<DonutGraphProps> {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"donut-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import { AnyObject, WithModuleProps } from \"../lib/types\";\nimport { modulePropsDecoder, decodeBase64, stringIsEmpty } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type BarsGraphProps = {\n type: ItemType.BARS_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the bars graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function barsGraphPropsDecoder(data: AnyObject): BarsGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BARS_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class BarsGraph extends Item<BarsGraphProps> {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"bars-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ModuleGraphProps = {\n type: ItemType.MODULE_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the module graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function moduleGraphPropsDecoder(\n data: AnyObject\n): ModuleGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.MODULE_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class ModuleGraph extends Item<ModuleGraphProps> {\n /**\n * @override Item.resizeElement.\n * Resize the DOM content container.\n * We need to override the resize function cause this item's height\n * is larger than the configured and the graph is over the label.\n * @param width\n * @param height\n */\n protected resizeElement(width: number): void {\n super.resizeElement(width, 0);\n }\n\n /**\n * @override Item.initResizementListener. To disable the functionality.\n * Start the resizement funtionality.\n * @param element Element to move inside its container.\n */\n protected initResizementListener(): void {\n // No-Op. Disable the resizement functionality for this item.\n }\n\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"module-graph\";\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n AnyObject\n} from \"../lib/types\";\n\nimport {\n modulePropsDecoder,\n linkedVCPropsDecoder,\n notEmptyStringOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type StaticGraphProps = {\n type: ItemType.STATIC_GRAPH;\n imageSrc: string; // URL?\n showLastValueTooltip: \"default\" | \"enabled\" | \"disabled\";\n statusImageSrc: string | null; // URL?\n lastValue: string | null;\n} & ItemProps &\n (WithModuleProps | LinkedVisualConsoleProps);\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param showLastValueTooltip Raw value.\n */\nconst parseShowLastValueTooltip = (\n showLastValueTooltip: unknown\n): StaticGraphProps[\"showLastValueTooltip\"] => {\n switch (showLastValueTooltip) {\n case \"default\":\n case \"enabled\":\n case \"disabled\":\n return showLastValueTooltip;\n default:\n return \"default\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function staticGraphPropsDecoder(\n data: AnyObject\n): StaticGraphProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.STATIC_GRAPH,\n imageSrc: data.imageSrc,\n showLastValueTooltip: parseShowLastValueTooltip(data.showLastValueTooltip),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n lastValue: notEmptyStringOr(data.lastValue, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class StaticGraph extends Item<StaticGraphProps> {\n protected createDomElement(): HTMLElement {\n const imgSrc = this.props.statusImageSrc || this.props.imageSrc;\n const element = document.createElement(\"div\");\n element.className = \"static-graph\";\n element.style.background = `url(${imgSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n // Show last value in a tooltip.\n if (\n this.props.lastValue !== null &&\n this.props.showLastValueTooltip !== \"disabled\"\n ) {\n element.className = \"static-graph image forced_title\";\n element.setAttribute(\"data-use_title_for_force_title\", \"1\");\n element.setAttribute(\"data-title\", this.props.lastValue);\n }\n\n return element;\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type IconProps = {\n type: ItemType.ICON;\n imageSrc: string; // URL?\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the icon props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function iconPropsDecoder(data: AnyObject): IconProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.ICON,\n imageSrc: data.imageSrc,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Icon extends Item<IconProps> {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"icon\";\n element.style.background = `url(${this.props.imageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n return element;\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n AnyObject\n} from \"../lib/types\";\nimport { modulePropsDecoder, linkedVCPropsDecoder } from \"../lib\";\nimport Item, { itemBasePropsDecoder, ItemType, ItemProps } from \"../Item\";\n\nexport type ColorCloudProps = {\n type: ItemType.COLOR_CLOUD;\n color: string;\n // TODO: Add the rest of the color cloud values?\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function colorCloudPropsDecoder(\n data: AnyObject\n): ColorCloudProps | never {\n // TODO: Validate the color.\n if (typeof data.color !== \"string\" || data.color.length === 0) {\n throw new TypeError(\"invalid color.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.COLOR_CLOUD,\n color: data.color,\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class ColorCloud extends Item<ColorCloudProps> {\n protected createDomElement(): HTMLElement {\n const container: HTMLDivElement = document.createElement(\"div\");\n container.className = \"color-cloud\";\n\n // Add the SVG.\n container.append(this.createSvgElement());\n\n return container;\n }\n\n protected resizeElement(width: number): void {\n super.resizeElement(width, width);\n }\n\n public createSvgElement(): SVGSVGElement {\n const gradientId = `grad_${this.props.id}`;\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Defs.\n const defs = document.createElementNS(svgNS, \"defs\");\n // Radial gradient.\n const radialGradient = document.createElementNS(svgNS, \"radialGradient\");\n radialGradient.setAttribute(\"id\", gradientId);\n radialGradient.setAttribute(\"cx\", \"50%\");\n radialGradient.setAttribute(\"cy\", \"50%\");\n radialGradient.setAttribute(\"r\", \"50%\");\n radialGradient.setAttribute(\"fx\", \"50%\");\n radialGradient.setAttribute(\"fy\", \"50%\");\n // Stops.\n const stop0 = document.createElementNS(svgNS, \"stop\");\n stop0.setAttribute(\"offset\", \"0%\");\n stop0.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0.9`\n );\n const stop100 = document.createElementNS(svgNS, \"stop\");\n stop100.setAttribute(\"offset\", \"100%\");\n stop100.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0`\n );\n // Circle.\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"fill\", `url(#${gradientId})`);\n circle.setAttribute(\"cx\", \"50%\");\n circle.setAttribute(\"cy\", \"50%\");\n circle.setAttribute(\"r\", \"50%\");\n\n // Append elements.\n radialGradient.append(stop0, stop100);\n defs.append(radialGradient);\n svg.append(defs, circle);\n\n return svg;\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n stringIsEmpty,\n decodeBase64,\n parseBoolean\n} from \"../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../Item\";\n\nexport type GroupProps = {\n type: ItemType.GROUP_ITEM;\n groupId: number;\n imageSrc: string | null; // URL?\n statusImageSrc: string | null;\n showStatistics: boolean;\n html?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\nfunction extractHtml(data: AnyObject): string | null {\n if (!stringIsEmpty(data.html)) return data.html;\n if (!stringIsEmpty(data.encodedHtml)) return decodeBase64(data.encodedHtml);\n return null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the group props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function groupPropsDecoder(data: AnyObject): GroupProps | never {\n if (\n (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) &&\n data.encodedHtml === null\n ) {\n throw new TypeError(\"invalid image src.\");\n }\n if (parseIntOr(data.groupId, null) === null) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n const showStatistics = parseBoolean(data.showStatistics);\n const html = showStatistics ? extractHtml(data) : null;\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.GROUP_ITEM,\n groupId: parseInt(data.groupId),\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n showStatistics,\n html,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Group extends Item<GroupProps> {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"group\";\n\n if (!this.props.showStatistics && this.props.statusImageSrc !== null) {\n // Icon with status.\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.showStatistics && this.props.html != null) {\n // Stats table.\n element.innerHTML = this.props.html;\n }\n\n return element;\n }\n}\n","import \"./styles.css\";\n\nimport {\n LinkedVisualConsoleProps,\n AnyObject,\n Size,\n ItemMeta\n} from \"../../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n parseBoolean,\n prefixedCssRules,\n notEmptyStringOr,\n humanDate,\n humanTime\n} from \"../../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../../Item\";\n\nexport type ClockProps = {\n type: ItemType.CLOCK;\n clockType: \"analogic\" | \"digital\";\n clockFormat: \"datetime\" | \"time\";\n clockTimezone: string;\n clockTimezoneOffset: number; // Offset of the timezone to UTC in seconds.\n showClockTimezone: boolean;\n color?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockType Raw value.\n */\nconst parseClockType = (clockType: unknown): ClockProps[\"clockType\"] => {\n switch (clockType) {\n case \"analogic\":\n case \"digital\":\n return clockType;\n default:\n return \"analogic\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockFormat Raw value.\n */\nconst parseClockFormat = (clockFormat: unknown): ClockProps[\"clockFormat\"] => {\n switch (clockFormat) {\n case \"datetime\":\n case \"time\":\n return clockFormat;\n default:\n return \"datetime\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the clock props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function clockPropsDecoder(data: AnyObject): ClockProps | never {\n if (\n typeof data.clockTimezone !== \"string\" ||\n data.clockTimezone.length === 0\n ) {\n throw new TypeError(\"invalid timezone.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.CLOCK,\n clockType: parseClockType(data.clockType),\n clockFormat: parseClockFormat(data.clockFormat),\n clockTimezone: data.clockTimezone,\n clockTimezoneOffset: parseIntOr(data.clockTimezoneOffset, 0),\n showClockTimezone: parseBoolean(data.showClockTimezone),\n color: notEmptyStringOr(data.color, null),\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Clock extends Item<ClockProps> {\n public static readonly TICK_INTERVAL = 1000; // In ms.\n private intervalRef: number | null = null;\n\n public constructor(props: ClockProps, meta: ItemMeta) {\n // Call the superclass constructor.\n super(props, meta);\n\n /* The item is already loaded and inserted into the DOM.\n * The class properties are now initialized.\n * Now you can modify the item, add event handlers, timers, etc.\n */\n\n /* The use of the arrow function is important here. startTick will\n * use the function passed as an argument to call the global setInterval\n * function. The interval, timeout or event functions, among other, are\n * called into another execution loop and using a different context.\n * The arrow functions, unlike the classic functions, doesn't create\n * their own context (this), so their context at execution time will be\n * use the current context at the declaration time.\n * http://es6-features.org/#Lexicalthis\n */\n this.startTick(\n () => {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n },\n /* The analogic clock doesn't need to tick,\n * but it will be refreshed every 20 seconds\n * to avoid a desync caused by page freezes.\n */\n this.props.clockType === \"analogic\" ? 20000 : Clock.TICK_INTERVAL\n );\n }\n\n /**\n * Wrap a window.clearInterval call.\n */\n private stopTick(): void {\n if (this.intervalRef !== null) {\n window.clearInterval(this.intervalRef);\n this.intervalRef = null;\n }\n }\n\n /**\n * Wrap a window.setInterval call.\n * @param handler Function to be called every time the interval\n * timer is reached.\n * @param interval Number in milliseconds for the interval timer.\n */\n private startTick(\n handler: TimerHandler,\n interval: number = Clock.TICK_INTERVAL\n ): void {\n this.stopTick();\n this.intervalRef = window.setInterval(handler, interval);\n }\n\n /**\n * Create a element which contains the DOM representation of the item.\n * @return DOM Element.\n * @override\n */\n protected createDomElement(): HTMLElement | never {\n return this.createClock();\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n * @override\n */\n public remove(): void {\n // Clear the interval.\n this.stopTick();\n // Call to the parent clean function.\n super.remove();\n }\n\n /**\n * @override Item.resizeElement\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n const { width: newWidth, height: newHeight } = this.getElementSize(\n width,\n height\n ); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n super.resizeElement(newWidth, newHeight);\n // Re-render the item to force it calculate a new font size.\n if (this.props.clockType === \"digital\") {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n }\n }\n\n /**\n * Create a element which contains a representation of a clock.\n * It choose between the clock types.\n * @return DOM Element.\n * @throws Error.\n */\n private createClock(): HTMLElement | never {\n switch (this.props.clockType) {\n case \"analogic\":\n return this.createAnalogicClock();\n case \"digital\":\n return this.createDigitalClock();\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n\n /**\n * Create a element which contains a representation of an analogic clock.\n * @return DOM Element.\n */\n private createAnalogicClock(): HTMLElement {\n const svgNS = \"http://www.w3.org/2000/svg\";\n const colors = {\n watchFace: \"#FFFFF0\",\n watchFaceBorder: \"#242124\",\n mark: \"#242124\",\n handDark: \"#242124\",\n handLight: \"#525252\",\n secondHand: \"#DC143C\"\n };\n\n const { width, height } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n\n const div = document.createElement(\"div\");\n div.className = \"analogic-clock\";\n div.style.width = `${width}px`;\n div.style.height = `${height}px`;\n\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Clock face.\n const clockFace = document.createElementNS(svgNS, \"g\");\n clockFace.setAttribute(\"class\", \"clockface\");\n const clockFaceBackground = document.createElementNS(svgNS, \"circle\");\n clockFaceBackground.setAttribute(\"cx\", \"50\");\n clockFaceBackground.setAttribute(\"cy\", \"50\");\n clockFaceBackground.setAttribute(\"r\", \"48\");\n clockFaceBackground.setAttribute(\"fill\", colors.watchFace);\n clockFaceBackground.setAttribute(\"stroke\", colors.watchFaceBorder);\n clockFaceBackground.setAttribute(\"stroke-width\", \"2\");\n clockFaceBackground.setAttribute(\"stroke-linecap\", \"round\");\n // Insert the clockface background into the clockface group.\n clockFace.append(clockFaceBackground);\n\n // Timezone complication.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const timezoneComplication = document.createElementNS(svgNS, \"text\");\n timezoneComplication.setAttribute(\"text-anchor\", \"middle\");\n timezoneComplication.setAttribute(\"font-size\", \"8\");\n timezoneComplication.setAttribute(\n \"transform\",\n \"translate(30 50) rotate(90)\" // Rotate to counter the clock rotation.\n );\n timezoneComplication.setAttribute(\"fill\", colors.mark);\n timezoneComplication.textContent = city;\n clockFace.append(timezoneComplication);\n }\n\n // Marks group.\n const marksGroup = document.createElementNS(svgNS, \"g\");\n marksGroup.setAttribute(\"class\", \"marks\");\n // Build the 12 hours mark.\n const mainMarkGroup = document.createElementNS(svgNS, \"g\");\n mainMarkGroup.setAttribute(\"class\", \"mark\");\n mainMarkGroup.setAttribute(\"transform\", \"translate(50 50)\");\n const mark1a = document.createElementNS(svgNS, \"line\");\n mark1a.setAttribute(\"x1\", \"36\");\n mark1a.setAttribute(\"y1\", \"0\");\n mark1a.setAttribute(\"x2\", \"46\");\n mark1a.setAttribute(\"y2\", \"0\");\n mark1a.setAttribute(\"stroke\", colors.mark);\n mark1a.setAttribute(\"stroke-width\", \"5\");\n const mark1b = document.createElementNS(svgNS, \"line\");\n mark1b.setAttribute(\"x1\", \"36\");\n mark1b.setAttribute(\"y1\", \"0\");\n mark1b.setAttribute(\"x2\", \"46\");\n mark1b.setAttribute(\"y2\", \"0\");\n mark1b.setAttribute(\"stroke\", colors.watchFace);\n mark1b.setAttribute(\"stroke-width\", \"1\");\n // Insert the 12 mark lines into their group.\n mainMarkGroup.append(mark1a, mark1b);\n // Insert the main mark into the marks group.\n marksGroup.append(mainMarkGroup);\n // Build the rest of the marks.\n for (let i = 1; i < 60; i++) {\n const mark = document.createElementNS(svgNS, \"line\");\n mark.setAttribute(\"y1\", \"0\");\n mark.setAttribute(\"y2\", \"0\");\n mark.setAttribute(\"stroke\", colors.mark);\n mark.setAttribute(\"transform\", `translate(50 50) rotate(${i * 6})`);\n\n if (i % 5 === 0) {\n mark.setAttribute(\"x1\", \"38\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", i % 15 === 0 ? \"2\" : \"1\");\n } else {\n mark.setAttribute(\"x1\", \"42\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", \"0.5\");\n }\n\n // Insert the mark into the marks group.\n marksGroup.append(mark);\n }\n\n /* Clock hands */\n\n // Hour hand.\n const hourHand = document.createElementNS(svgNS, \"g\");\n hourHand.setAttribute(\"class\", \"hour-hand\");\n hourHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const hourHandA = document.createElementNS(svgNS, \"line\");\n hourHandA.setAttribute(\"class\", \"hour-hand-a\");\n hourHandA.setAttribute(\"x1\", \"0\");\n hourHandA.setAttribute(\"y1\", \"0\");\n hourHandA.setAttribute(\"x2\", \"30\");\n hourHandA.setAttribute(\"y2\", \"0\");\n hourHandA.setAttribute(\"stroke\", colors.handLight);\n hourHandA.setAttribute(\"stroke-width\", \"4\");\n hourHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const hourHandB = document.createElementNS(svgNS, \"line\");\n hourHandB.setAttribute(\"class\", \"hour-hand-b\");\n hourHandB.setAttribute(\"x1\", \"0\");\n hourHandB.setAttribute(\"y1\", \"0\");\n hourHandB.setAttribute(\"x2\", \"29.9\");\n hourHandB.setAttribute(\"y2\", \"0\");\n hourHandB.setAttribute(\"stroke\", colors.handDark);\n hourHandB.setAttribute(\"stroke-width\", \"3.1\");\n hourHandB.setAttribute(\"stroke-linecap\", \"round\");\n // Append the elements to finish the hour hand.\n hourHand.append(hourHandA, hourHandB);\n\n // Minute hand.\n const minuteHand = document.createElementNS(svgNS, \"g\");\n minuteHand.setAttribute(\"class\", \"minute-hand\");\n minuteHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const minuteHandA = document.createElementNS(svgNS, \"line\");\n minuteHandA.setAttribute(\"class\", \"minute-hand-a\");\n minuteHandA.setAttribute(\"x1\", \"0\");\n minuteHandA.setAttribute(\"y1\", \"0\");\n minuteHandA.setAttribute(\"x2\", \"40\");\n minuteHandA.setAttribute(\"y2\", \"0\");\n minuteHandA.setAttribute(\"stroke\", colors.handLight);\n minuteHandA.setAttribute(\"stroke-width\", \"2\");\n minuteHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const minuteHandB = document.createElementNS(svgNS, \"line\");\n minuteHandB.setAttribute(\"class\", \"minute-hand-b\");\n minuteHandB.setAttribute(\"x1\", \"0\");\n minuteHandB.setAttribute(\"y1\", \"0\");\n minuteHandB.setAttribute(\"x2\", \"39.9\");\n minuteHandB.setAttribute(\"y2\", \"0\");\n minuteHandB.setAttribute(\"stroke\", colors.handDark);\n minuteHandB.setAttribute(\"stroke-width\", \"1.5\");\n minuteHandB.setAttribute(\"stroke-linecap\", \"round\");\n const minuteHandPin = document.createElementNS(svgNS, \"circle\");\n minuteHandPin.setAttribute(\"r\", \"3\");\n minuteHandPin.setAttribute(\"fill\", colors.handDark);\n // Append the elements to finish the minute hand.\n minuteHand.append(minuteHandA, minuteHandB, minuteHandPin);\n\n // Second hand.\n const secondHand = document.createElementNS(svgNS, \"g\");\n secondHand.setAttribute(\"class\", \"second-hand\");\n secondHand.setAttribute(\"transform\", \"translate(50 50)\");\n const secondHandBar = document.createElementNS(svgNS, \"line\");\n secondHandBar.setAttribute(\"x1\", \"0\");\n secondHandBar.setAttribute(\"y1\", \"0\");\n secondHandBar.setAttribute(\"x2\", \"46\");\n secondHandBar.setAttribute(\"y2\", \"0\");\n secondHandBar.setAttribute(\"stroke\", colors.secondHand);\n secondHandBar.setAttribute(\"stroke-width\", \"1\");\n secondHandBar.setAttribute(\"stroke-linecap\", \"round\");\n const secondHandPin = document.createElementNS(svgNS, \"circle\");\n secondHandPin.setAttribute(\"r\", \"2\");\n secondHandPin.setAttribute(\"fill\", colors.secondHand);\n // Append the elements to finish the second hand.\n secondHand.append(secondHandBar, secondHandPin);\n\n // Pin.\n const pin = document.createElementNS(svgNS, \"circle\");\n pin.setAttribute(\"cx\", \"50\");\n pin.setAttribute(\"cy\", \"50\");\n pin.setAttribute(\"r\", \"0.3\");\n pin.setAttribute(\"fill\", colors.handDark);\n\n // Get the hand angles.\n const date = this.getOriginDate();\n const seconds = date.getSeconds();\n const minutes = date.getMinutes();\n const hours = date.getHours();\n const secAngle = (360 / 60) * seconds;\n const minuteAngle = (360 / 60) * minutes + (360 / 60) * (seconds / 60);\n const hourAngle = (360 / 12) * hours + (360 / 12) * (minutes / 60);\n // Set the clock time by moving the hands.\n hourHand.setAttribute(\"transform\", `translate(50 50) rotate(${hourAngle})`);\n minuteHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${minuteAngle})`\n );\n secondHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${secAngle})`\n );\n\n // Build the clock\n svg.append(clockFace, marksGroup, hourHand, minuteHand, secondHand, pin);\n // Rotate the clock to its normal position.\n svg.setAttribute(\"transform\", \"rotate(-90)\");\n\n /* Add the animation declaration to the container.\n * Since the animation keyframes need to know the\n * start angle, this angle is dynamic (current time),\n * and we can't edit keyframes through javascript\n * safely and with backwards compatibility, we need\n * to inject it.\n */\n div.innerHTML = `\n <style>\n @keyframes rotate-hour {\n from {\n ${prefixedCssRules(\n \"transform\",\n `translate(50px, 50px) rotate(${hourAngle}deg)`\n ).join(\"\\n\")}\n }\n to {\n ${prefixedCssRules(\n \"transform\",\n `translate(50px, 50px) rotate(${hourAngle + 360}deg)`\n ).join(\"\\n\")}\n }\n }\n @keyframes rotate-minute {\n from {\n ${prefixedCssRules(\n \"transform\",\n `translate(50px, 50px) rotate(${minuteAngle}deg)`\n ).join(\"\\n\")}\n }\n to {\n ${prefixedCssRules(\n \"transform\",\n `translate(50px, 50px) rotate(${minuteAngle + 360}deg)`\n ).join(\"\\n\")}\n }\n }\n @keyframes rotate-second {\n from {\n ${prefixedCssRules(\n \"transform\",\n `translate(50px, 50px) rotate(${secAngle}deg)`\n ).join(\"\\n\")}\n }\n to {\n ${prefixedCssRules(\n \"transform\",\n `translate(50px, 50px) rotate(${secAngle + 360}deg)`\n ).join(\"\\n\")}\n }\n }\n </style>\n `;\n // Add the clock to the container\n div.append(svg);\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n div.append(dateElem);\n }\n\n return div;\n }\n\n /**\n * Create a element which contains a representation of a digital clock.\n * @return DOM Element.\n */\n private createDigitalClock(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"digital-clock\";\n\n const { width } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const tzFontSizeMultiplier = 6 / this.props.clockTimezone.length;\n const timeFontSize = (baseTimeFontSize * width) / 100;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n const tzFontSize = Math.min(\n (baseTimeFontSize * tzFontSizeMultiplier * width) / 100,\n (width / 100) * 10\n );\n\n // Date calculated using the original timezone.\n const date = this.getOriginDate();\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n element.append(dateElem);\n }\n\n // Time.\n const timeElem: HTMLSpanElement = document.createElement(\"span\");\n timeElem.className = \"time\";\n timeElem.textContent = humanTime(date);\n timeElem.style.fontSize = `${timeFontSize}px`;\n if (this.props.color) timeElem.style.color = this.props.color;\n element.append(timeElem);\n\n // City name.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const tzElem: HTMLSpanElement = document.createElement(\"span\");\n tzElem.className = \"timezone\";\n tzElem.textContent = city;\n tzElem.style.fontSize = `${tzFontSize}px`;\n if (this.props.color) tzElem.style.color = this.props.color;\n element.append(tzElem);\n }\n\n return element;\n }\n\n /**\n * Generate the current date using the timezone offset stored into the properties.\n * @return The current date.\n */\n private getOriginDate(initialDate: Date | null = null): Date {\n const d = initialDate ? initialDate : new Date();\n const targetTZOffset = this.props.clockTimezoneOffset * 1000; // In ms.\n const localTZOffset = d.getTimezoneOffset() * 60 * 1000; // In ms.\n const utimestamp = d.getTime() + targetTZOffset + localTZOffset;\n\n return new Date(utimestamp);\n }\n\n /**\n * Extract a human readable city name from the timezone text.\n * @param timezone Timezone text.\n */\n public getHumanTimezone(timezone: string = this.props.clockTimezone): string {\n const [, city = \"\"] = timezone.split(\"/\");\n return city.replace(\"_\", \" \");\n }\n\n /**\n * Generate a element size using the current size and the default values.\n * @return The size.\n */\n private getElementSize(\n width: number = this.props.width,\n height: number = this.props.height\n ): Size {\n switch (this.props.clockType) {\n case \"analogic\": {\n let diameter = 100; // Default value.\n\n if (width > 0 && height > 0) {\n diameter = Math.min(width, height);\n } else if (width > 0) {\n diameter = width;\n } else if (height > 0) {\n diameter = height;\n }\n\n return {\n width: diameter,\n height: diameter\n };\n }\n case \"digital\": {\n if (width > 0 && height > 0) {\n // The proportion of the clock should be (width = height / 2) aproximately.\n height = width / 2 < height ? width / 2 : height;\n } else if (width > 0) {\n height = width / 2;\n } else if (height > 0) {\n // The proportion of the clock should be (height * 2 = width) aproximately.\n width = height * 2;\n } else {\n width = 100; // Default value.\n height = 50; // Default value.\n }\n\n return {\n width,\n height\n };\n }\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n}\n","import { AnyObject } from \"../lib/types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface BoxProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.BOX_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n borderWidth: number;\n borderColor: string | null;\n fillColor: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function boxPropsDecoder(data: AnyObject): BoxProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BOX_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Custom properties.\n borderWidth: parseIntOr(data.borderWidth, 0),\n borderColor: notEmptyStringOr(data.borderColor, null),\n fillColor: notEmptyStringOr(data.fillColor, null)\n };\n}\n\nexport default class Box extends Item<BoxProps> {\n protected createDomElement(): HTMLElement {\n const box: HTMLDivElement = document.createElement(\"div\");\n box.className = \"box\";\n // To prevent this item to expand beyond its parent.\n box.style.boxSizing = \"border-box\";\n\n if (this.props.fillColor) {\n box.style.backgroundColor = this.props.fillColor;\n }\n\n // Border.\n if (this.props.borderWidth > 0) {\n box.style.borderStyle = \"solid\";\n // Control the max width to prevent this item to expand beyond its parent.\n const maxBorderWidth = Math.min(this.props.width, this.props.height) / 2;\n const borderWidth = Math.min(this.props.borderWidth, maxBorderWidth);\n box.style.borderWidth = `${borderWidth}px`;\n\n if (this.props.borderColor) {\n box.style.borderColor = this.props.borderColor;\n }\n }\n\n return box;\n }\n}\n","import { AnyObject, Position, Size, ItemMeta } from \"../lib/types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface LineProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.LINE_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n startPosition: Position;\n endPosition: Position;\n lineWidth: number;\n color: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function linePropsDecoder(data: AnyObject): LineProps | never {\n const props: LineProps = {\n ...itemBasePropsDecoder({ ...data, width: 1, height: 1 }), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LINE_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Initialize Position & Size.\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n // Custom properties.\n startPosition: {\n x: parseIntOr(data.startX, 0),\n y: parseIntOr(data.startY, 0)\n },\n endPosition: {\n x: parseIntOr(data.endX, 0),\n y: parseIntOr(data.endY, 0)\n },\n lineWidth: parseIntOr(data.lineWidth || data.borderWidth, 1),\n color: notEmptyStringOr(data.borderColor || data.color, null)\n };\n\n /*\n * We need to enhance the props with the extracted size and position\n * of the box cause there are missing at the props update. A better\n * solution would be overriding the props setter to do it there, but\n * the language doesn't allow it while targetting ES5.\n * TODO: We need to figure out a more consistent solution.\n */\n\n return {\n ...props,\n // Enhance the props extracting the box size and position.\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n ...Line.extractBoxSizeAndPosition(props)\n };\n}\n\nexport default class Line extends Item<LineProps> {\n /**\n * @override\n */\n public constructor(props: LineProps, meta: ItemMeta) {\n /*\n * We need to override the constructor cause we need to obtain\n * the\n * box size and position from the start and finish points\n * of the line.\n */\n super(\n {\n ...props,\n ...Line.extractBoxSizeAndPosition(props)\n },\n {\n ...meta,\n editMode: false\n }\n );\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n * @override Item.setMeta\n */\n public setMeta(newMetadata: ItemMeta) {\n super.setMeta({\n ...newMetadata,\n editMode: false\n });\n }\n\n /**\n * @override\n * To create the item's DOM representation.\n * @return Item.\n */\n protected createDomElement(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"line\";\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Set SVG size.\n svg.setAttribute(\n \"width\",\n (this.props.width + this.props.lineWidth).toString()\n );\n svg.setAttribute(\n \"height\",\n (this.props.height + this.props.lineWidth).toString()\n );\n const line = document.createElementNS(svgNS, \"line\");\n line.setAttribute(\n \"x1\",\n `${this.props.startPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y1\",\n `${this.props.startPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"x2\",\n `${this.props.endPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y2\",\n `${this.props.endPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\"stroke\", this.props.color || \"black\");\n line.setAttribute(\"stroke-width\", this.props.lineWidth.toString());\n\n svg.append(line);\n element.append(svg);\n\n return element;\n }\n\n /**\n * Extract the size and position of the box from\n * the start and the finish of the line.\n * @param props Item properties.\n */\n public static extractBoxSizeAndPosition(props: LineProps): Size & Position {\n return {\n width: Math.abs(props.startPosition.x - props.endPosition.x),\n height: Math.abs(props.startPosition.y - props.endPosition.y),\n x: Math.min(props.startPosition.x, props.endPosition.x),\n y: Math.min(props.startPosition.y, props.endPosition.y)\n };\n }\n}\n","import { LinkedVisualConsoleProps, AnyObject } from \"../lib/types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type LabelProps = {\n type: ItemType.LABEL;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the label props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function labelPropsDecoder(data: AnyObject): LabelProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LABEL,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Label extends Item<LabelProps> {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"label\";\n element.innerHTML = this.getLabelWithMacrosReplaced();\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n public createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","import {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n modulePropsDecoder,\n replaceMacros\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type SimpleValueProps = {\n type: ItemType.SIMPLE_VALUE;\n valueType: \"string\" | \"image\";\n value: string;\n} & (\n | {\n processValue: \"none\";\n }\n | {\n processValue: \"avg\" | \"max\" | \"min\";\n period: number;\n }) &\n ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw value type.\n * @param valueType Raw value.\n */\nconst parseValueType = (valueType: unknown): SimpleValueProps[\"valueType\"] => {\n switch (valueType) {\n case \"string\":\n case \"image\":\n return valueType;\n default:\n return \"string\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw process value.\n * @param processValue Raw value.\n */\nconst parseProcessValue = (\n processValue: unknown\n): SimpleValueProps[\"processValue\"] => {\n switch (processValue) {\n case \"none\":\n case \"avg\":\n case \"max\":\n case \"min\":\n return processValue;\n default:\n return \"none\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the simple value props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function simpleValuePropsDecoder(\n data: AnyObject\n): SimpleValueProps | never {\n if (typeof data.value !== \"string\" || data.value.length === 0) {\n throw new TypeError(\"invalid value\");\n }\n\n const processValue = parseProcessValue(data.processValue);\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SIMPLE_VALUE,\n valueType: parseValueType(data.valueType),\n value: data.value,\n ...(processValue === \"none\"\n ? { processValue }\n : { processValue, period: parseIntOr(data.period, 0) }), // Object spread. It will merge the properties of the two objects.\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class SimpleValue extends Item<SimpleValueProps> {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"simple-value\";\n\n if (this.props.valueType === \"image\") {\n const img = document.createElement(\"img\");\n img.src = this.props.value;\n element.append(img);\n } else {\n // Add the value to the label and show it.\n let text = this.props.value;\n let label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n text = replaceMacros([{ macro: /\\(?_VALUE_\\)?/i, value: text }], label);\n }\n\n element.innerHTML = text;\n }\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","export var slice = Array.prototype.slice;\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default function() {}\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import noop from \"../noop\";\nimport {point} from \"./basis\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n","import {point} from \"./basis\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import noop from \"../noop\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","import ascending from \"./ascending\";\n\nexport default function(series) {\n return ascending(series).reverse();\n}\n","import { arc as arcFactory } from \"d3-shape\";\n\nimport {\n LinkedVisualConsoleProps,\n AnyObject,\n WithModuleProps\n} from \"../lib/types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n notEmptyStringOr,\n parseIntOr,\n parseFloatOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type PercentileProps = {\n type: ItemType.PERCENTILE_BAR;\n percentileType:\n | \"progress-bar\"\n | \"bubble\"\n | \"circular-progress-bar\"\n | \"circular-progress-bar-alt\";\n valueType: \"percent\" | \"value\";\n minValue: number | null;\n maxValue: number | null;\n color: string | null;\n labelColor: string | null;\n value: number | null;\n unit: string | null;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw type value.\n * @param type Raw value.\n */\nfunction extractPercentileType(\n type: unknown\n): PercentileProps[\"percentileType\"] {\n switch (type) {\n case \"progress-bar\":\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n return type;\n default:\n case ItemType.PERCENTILE_BAR:\n return \"progress-bar\";\n case ItemType.PERCENTILE_BUBBLE:\n return \"bubble\";\n case ItemType.CIRCULAR_PROGRESS_BAR:\n return \"circular-progress-bar\";\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return \"circular-progress-bar-alt\";\n }\n}\n\n/**\n * Extract a valid enum value from a raw value type value.\n * @param type Raw value.\n */\nfunction extractValueType(valueType: unknown): PercentileProps[\"valueType\"] {\n switch (valueType) {\n case \"percent\":\n case \"value\":\n return valueType;\n default:\n return \"percent\";\n }\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the percentile props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function percentilePropsDecoder(\n data: AnyObject\n): PercentileProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.PERCENTILE_BAR,\n percentileType: extractPercentileType(data.percentileType || data.type),\n valueType: extractValueType(data.valueType),\n minValue: parseIntOr(data.minValue, null),\n maxValue: parseIntOr(data.maxValue, null),\n color: notEmptyStringOr(data.color, null),\n labelColor: notEmptyStringOr(data.labelColor, null),\n value: parseFloatOr(data.value, null),\n unit: notEmptyStringOr(data.unit, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class Percentile extends Item<PercentileProps> {\n protected createDomElement(): HTMLElement {\n const colors = {\n background: \"#000000\",\n progress: this.props.color || \"#F0F0F0\",\n text: this.props.labelColor || \"#444444\"\n };\n // Progress.\n const progress = this.getProgress();\n // Main element.\n const element = document.createElement(\"div\");\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n\n var formatValue;\n if (this.props.value != null) {\n if (Intl) {\n formatValue = Intl.NumberFormat(\"en-EN\").format(this.props.value);\n } else {\n formatValue = this.props.value;\n }\n }\n\n switch (this.props.percentileType) {\n case \"progress-bar\":\n {\n const backgroundRect = document.createElementNS(svgNS, \"rect\");\n backgroundRect.setAttribute(\"fill\", colors.background);\n backgroundRect.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundRect.setAttribute(\"width\", \"100\");\n backgroundRect.setAttribute(\"height\", \"20\");\n backgroundRect.setAttribute(\"rx\", \"5\");\n backgroundRect.setAttribute(\"ry\", \"5\");\n const progressRect = document.createElementNS(svgNS, \"rect\");\n progressRect.setAttribute(\"fill\", colors.progress);\n progressRect.setAttribute(\"fill-opacity\", \"1\");\n progressRect.setAttribute(\"width\", `${progress}`);\n progressRect.setAttribute(\"height\", \"20\");\n progressRect.setAttribute(\"rx\", \"5\");\n progressRect.setAttribute(\"ry\", \"5\");\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"12\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"transform\", \"translate(50 11)\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\") {\n text.style.fontSize = \"6pt\";\n\n text.textContent = this.props.unit\n ? `${formatValue} ${this.props.unit}`\n : `${formatValue}`;\n } else {\n text.textContent = `${progress}%`;\n }\n\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 20\");\n svg.append(backgroundRect, progressRect, text);\n }\n break;\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n {\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n if (this.props.percentileType === \"bubble\") {\n // Create and append the circles.\n const backgroundCircle = document.createElementNS(svgNS, \"circle\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"r\", \"50\");\n const progressCircle = document.createElementNS(svgNS, \"circle\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\"r\", `${progress / 2}`);\n\n svg.append(backgroundCircle, progressCircle);\n } else {\n // Create and append the circles.\n const arcProps = {\n innerRadius:\n this.props.percentileType === \"circular-progress-bar\" ? 30 : 0,\n outerRadius: 50,\n startAngle: 0,\n endAngle: Math.PI * 2\n };\n const arc = arcFactory();\n\n const backgroundCircle = document.createElementNS(svgNS, \"path\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"d\", `${arc(arcProps)}`);\n const progressCircle = document.createElementNS(svgNS, \"path\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\n \"d\",\n `${arc({\n ...arcProps,\n endAngle: arcProps.endAngle * (progress / 100)\n })}`\n );\n\n svg.append(backgroundCircle, progressCircle);\n }\n\n // Create and append the text.\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"16\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\" && this.props.value != null) {\n // Show value and unit in 1 (no unit) or 2 lines.\n if (this.props.unit && this.props.unit.length > 0) {\n const value = document.createElementNS(svgNS, \"tspan\");\n value.setAttribute(\"x\", \"0\");\n value.setAttribute(\"dy\", \"1em\");\n value.textContent = `${formatValue}`;\n value.style.fontSize = \"8pt\";\n const unit = document.createElementNS(svgNS, \"tspan\");\n unit.setAttribute(\"x\", \"0\");\n unit.setAttribute(\"dy\", \"1em\");\n unit.textContent = `${this.props.unit}`;\n unit.style.fontSize = \"8pt\";\n text.append(value, unit);\n text.setAttribute(\"transform\", \"translate(50 33)\");\n } else {\n text.textContent = `${formatValue}`;\n text.style.fontSize = \"8pt\";\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n } else {\n // Percentage.\n text.textContent = `${progress}%`;\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n\n svg.append(text);\n }\n break;\n }\n\n element.append(svg);\n\n return element;\n }\n\n private getProgress(): number {\n const minValue = this.props.minValue || 0;\n const maxValue = this.props.maxValue || 100;\n const value = this.props.value == null ? 0 : this.props.value;\n\n if (value <= minValue) return 0;\n else if (value >= maxValue) return 100;\n else return Math.trunc(((value - minValue) / (maxValue - minValue)) * 100);\n }\n}\n","import { AnyObject } from \"../lib/types\";\nimport {\n stringIsEmpty,\n notEmptyStringOr,\n decodeBase64,\n parseIntOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ServiceProps = {\n type: ItemType.SERVICE;\n serviceId: number;\n imageSrc: string | null;\n statusImageSrc: string | null;\n encodedTitle: string | null;\n} & ItemProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the service props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function servicePropsDecoder(data: AnyObject): ServiceProps | never {\n if (data.imageSrc !== null) {\n if (\n typeof data.statusImageSrc !== \"string\" ||\n data.imageSrc.statusImageSrc === 0\n ) {\n throw new TypeError(\"invalid status image src.\");\n }\n } else {\n if (stringIsEmpty(data.encodedTitle)) {\n throw new TypeError(\"missing encode tittle content.\");\n }\n }\n\n if (parseIntOr(data.serviceId, null) === null) {\n throw new TypeError(\"invalid service id.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SERVICE,\n serviceId: data.serviceId,\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n encodedTitle: notEmptyStringOr(data.encodedTitle, null)\n };\n}\n\nexport default class Service extends Item<ServiceProps> {\n public createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"service\";\n\n if (this.props.statusImageSrc !== null) {\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.encodedTitle !== null) {\n element.innerHTML = decodeBase64(this.props.encodedTitle);\n }\n\n return element;\n }\n}\n","import { AnyObject, Size } from \"./lib/types\";\nimport {\n parseBoolean,\n sizePropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n itemMetaDecoder\n} from \"./lib\";\nimport Item, {\n ItemType,\n ItemProps,\n ItemClickEvent,\n ItemRemoveEvent,\n ItemMovedEvent,\n ItemResizedEvent\n} from \"./Item\";\nimport StaticGraph, { staticGraphPropsDecoder } from \"./items/StaticGraph\";\nimport Icon, { iconPropsDecoder } from \"./items/Icon\";\nimport ColorCloud, { colorCloudPropsDecoder } from \"./items/ColorCloud\";\nimport Group, { groupPropsDecoder } from \"./items/Group\";\nimport Clock, { clockPropsDecoder } from \"./items/Clock\";\nimport Box, { boxPropsDecoder } from \"./items/Box\";\nimport Line, { linePropsDecoder } from \"./items/Line\";\nimport Label, { labelPropsDecoder } from \"./items/Label\";\nimport SimpleValue, { simpleValuePropsDecoder } from \"./items/SimpleValue\";\nimport EventsHistory, {\n eventsHistoryPropsDecoder\n} from \"./items/EventsHistory\";\nimport Percentile, { percentilePropsDecoder } from \"./items/Percentile\";\nimport TypedEvent, { Disposable, Listener } from \"./lib/TypedEvent\";\nimport DonutGraph, { donutGraphPropsDecoder } from \"./items/DonutGraph\";\nimport BarsGraph, { barsGraphPropsDecoder } from \"./items/BarsGraph\";\nimport ModuleGraph, { moduleGraphPropsDecoder } from \"./items/ModuleGraph\";\nimport Service, { servicePropsDecoder } from \"./items/Service\";\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction itemInstanceFrom(data: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n const meta = itemMetaDecoder(data);\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return new StaticGraph(staticGraphPropsDecoder(data), meta);\n case ItemType.MODULE_GRAPH:\n return new ModuleGraph(moduleGraphPropsDecoder(data), meta);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return new SimpleValue(simpleValuePropsDecoder(data), meta);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return new Percentile(percentilePropsDecoder(data), meta);\n case ItemType.LABEL:\n return new Label(labelPropsDecoder(data), meta);\n case ItemType.ICON:\n return new Icon(iconPropsDecoder(data), meta);\n case ItemType.SERVICE:\n return new Service(servicePropsDecoder(data), meta);\n case ItemType.GROUP_ITEM:\n return new Group(groupPropsDecoder(data), meta);\n case ItemType.BOX_ITEM:\n return new Box(boxPropsDecoder(data), meta);\n case ItemType.LINE_ITEM:\n return new Line(linePropsDecoder(data), meta);\n case ItemType.AUTO_SLA_GRAPH:\n return new EventsHistory(eventsHistoryPropsDecoder(data), meta);\n case ItemType.DONUT_GRAPH:\n return new DonutGraph(donutGraphPropsDecoder(data), meta);\n case ItemType.BARS_GRAPH:\n return new BarsGraph(barsGraphPropsDecoder(data), meta);\n case ItemType.CLOCK:\n return new Clock(clockPropsDecoder(data), meta);\n case ItemType.COLOR_CLOUD:\n return new ColorCloud(colorCloudPropsDecoder(data), meta);\n default:\n throw new TypeError(\"item not found\");\n }\n}\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction decodeProps(data: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return staticGraphPropsDecoder(data);\n case ItemType.MODULE_GRAPH:\n return moduleGraphPropsDecoder(data);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return simpleValuePropsDecoder(data);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return percentilePropsDecoder(data);\n case ItemType.LABEL:\n return labelPropsDecoder(data);\n case ItemType.ICON:\n return iconPropsDecoder(data);\n case ItemType.SERVICE:\n return servicePropsDecoder(data);\n case ItemType.GROUP_ITEM:\n return groupPropsDecoder(data);\n case ItemType.BOX_ITEM:\n return boxPropsDecoder(data);\n case ItemType.LINE_ITEM:\n return linePropsDecoder(data);\n case ItemType.AUTO_SLA_GRAPH:\n return eventsHistoryPropsDecoder(data);\n case ItemType.DONUT_GRAPH:\n return donutGraphPropsDecoder(data);\n case ItemType.BARS_GRAPH:\n return barsGraphPropsDecoder(data);\n case ItemType.CLOCK:\n return clockPropsDecoder(data);\n case ItemType.COLOR_CLOUD:\n return colorCloudPropsDecoder(data);\n default:\n throw new TypeError(\"decoder not found\");\n }\n}\n\n// Base properties.\nexport interface VisualConsoleProps extends Size {\n readonly id: number;\n name: string;\n groupId: number;\n backgroundURL: string | null; // URL?\n backgroundColor: string | null;\n isFavorite: boolean;\n relationLineWidth: number;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the Visual Console props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function visualConsolePropsDecoder(\n data: AnyObject\n): VisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n id,\n name,\n groupId,\n backgroundURL,\n backgroundColor,\n isFavorite,\n relationLineWidth\n } = data;\n\n if (id == null || isNaN(parseInt(id))) {\n throw new TypeError(\"invalid Id.\");\n }\n if (typeof name !== \"string\" || name.length === 0) {\n throw new TypeError(\"invalid name.\");\n }\n if (groupId == null || isNaN(parseInt(groupId))) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n return {\n id: parseInt(id),\n name,\n groupId: parseInt(groupId),\n backgroundURL: notEmptyStringOr(backgroundURL, null),\n backgroundColor: notEmptyStringOr(backgroundColor, null),\n isFavorite: parseBoolean(isFavorite),\n relationLineWidth: parseIntOr(relationLineWidth, 0),\n ...sizePropsDecoder(data)\n };\n}\n\nexport default class VisualConsole {\n // Reference to the DOM element which will contain the items.\n private readonly containerRef: HTMLElement;\n // Properties.\n private _props: VisualConsoleProps;\n // Visual Console Item instances by their Id.\n private elementsById: {\n [key: number]: Item<ItemProps>;\n } = {};\n // Visual Console Item Ids.\n private elementIds: ItemProps[\"id\"][] = [];\n // Dictionary which store the created lines.\n private relations: {\n [key: string]: Line;\n } = {};\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent<\n ItemClickEvent<ItemProps>\n >();\n // Event manager for move events.\n private readonly movedEventManager = new TypedEvent<ItemMovedEvent>();\n // Event manager for resize events.\n private readonly resizedEventManager = new TypedEvent<ItemResizedEvent>();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n /**\n * React to a click on an element.\n * @param e Event object.\n */\n private handleElementClick: (e: ItemClickEvent<ItemProps>) => void = e => {\n this.clickEventManager.emit(e);\n // console.log(`Clicked element #${e.data.id}`, e);\n };\n\n /**\n * React to a movement on an element.\n * @param e Event object.\n */\n private handleElementMovement: (e: ItemMovedEvent) => void = e => {\n this.movedEventManager.emit(e);\n // console.log(`Moved element #${e.item.props.id}`, e);\n };\n\n /**\n * React to a resizement on an element.\n * @param e Event object.\n */\n private handleElementResizement: (e: ItemResizedEvent) => void = e => {\n this.resizedEventManager.emit(e);\n // console.log(`Resized element #${e.item.props.id}`, e);\n };\n\n /**\n * Clear some element references.\n * @param e Event object.\n */\n private handleElementRemove: (e: ItemRemoveEvent<ItemProps>) => void = e => {\n // Remove the element from the list and its relations.\n this.elementIds = this.elementIds.filter(id => id !== e.data.id);\n delete this.elementsById[e.data.id];\n this.clearRelations(e.data.id);\n };\n\n public constructor(\n container: HTMLElement,\n props: AnyObject,\n items: AnyObject[]\n ) {\n this.containerRef = container;\n this._props = visualConsolePropsDecoder(props);\n\n // Force the first render.\n this.render();\n\n // Sort by isOnTop, id ASC\n items = items.sort(function(a, b) {\n if (\n a.isOnTop == null ||\n b.isOnTop == null ||\n a.id == null ||\n b.id == null\n ) {\n return 0;\n }\n\n if (a.isOnTop && !b.isOnTop) return 1;\n else if (!a.isOnTop && b.isOnTop) return -1;\n else if (a.id > b.id) return 1;\n else return -1;\n });\n\n // Initialize the items.\n items.forEach(item => {\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n this.elementIds.push(itemInstance.props.id);\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onMoved(this.handleElementMovement);\n itemInstance.onResized(this.handleElementResizement);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n });\n\n // Create lines.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `elements` property.\n * @return Properties.\n */\n public get elements(): Item<ItemProps>[] {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n return this.elementIds\n .map(id => this.elementsById[id])\n .filter(_ => _ != null) as Item<ItemProps>[];\n }\n\n /**\n * Public setter of the `elements` property.\n * @param items.\n */\n public updateElements(items: AnyObject[]): void {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n const itemIds = items\n .map(item => item.id || null)\n .filter(id => id != null) as number[];\n // Get the elements we should delete.\n const deletedIds = this.elementIds.filter(id => itemIds.indexOf(id) < 0);\n // Delete the elements.\n deletedIds.forEach(id => {\n if (this.elementsById[id] != null) {\n this.elementsById[id].remove();\n delete this.elementsById[id];\n }\n });\n // Replace the element ids.\n this.elementIds = itemIds;\n\n // Initialize the items.\n items.forEach(item => {\n if (item.id) {\n if (this.elementsById[item.id] == null) {\n // New item.\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n } else {\n // Update item.\n try {\n this.elementsById[item.id].props = decodeProps(item);\n } catch (error) {\n console.log(\"Error updating an element:\", error.message);\n }\n }\n }\n });\n\n // Re-build relations.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): VisualConsoleProps {\n return { ...this._props }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: VisualConsoleProps) {\n const prevProps = this.props;\n // Update the internal props.\n this._props = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Re-render.\n this.render(prevProps);\n }\n\n /**\n * Recreate or update the HTMLElement which represents the Visual Console into the DOM.\n * @param prevProps If exists it will be used to only DOM updates instead of a full replace.\n */\n public render(prevProps: VisualConsoleProps | null = null): void {\n if (prevProps) {\n if (prevProps.backgroundURL !== this.props.backgroundURL) {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n }\n if (prevProps.backgroundColor !== this.props.backgroundColor) {\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n }\n if (this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n } else {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n this.resizeElement(this.props.width, this.props.height);\n }\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n public sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM container.\n * @param width\n * @param height\n */\n public resizeElement(width: number, height: number): void {\n this.containerRef.style.width = `${width}px`;\n this.containerRef.style.height = `${height}px`;\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.props = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n this.disposables.forEach(d => d.dispose()); // Arrow function.\n this.elements.forEach(e => e.remove()); // Arrow function.\n this.elementsById = {};\n this.elementIds = [];\n // Clear relations.\n this.clearRelations();\n // Clean container.\n this.containerRef.innerHTML = \"\";\n }\n\n /**\n * Create line elements which connect the elements with their parents.\n */\n private buildRelations(): void {\n // Clear relations.\n this.clearRelations();\n // Add relations.\n this.elements.forEach(item => {\n if (item.props.parentId !== null) {\n const parent = this.elementsById[item.props.parentId];\n const child = this.elementsById[item.props.id];\n if (parent && child) this.addRelationLine(parent, child);\n }\n });\n }\n\n /**\n * @param itemId Optional identifier of a parent or child item.\n * Remove the line elements which connect the elements with their parents.\n */\n private clearRelations(itemId?: number): void {\n if (itemId != null) {\n for (let key in this.relations) {\n const ids = key.split(\"|\");\n const parentId = Number.parseInt(ids[0]);\n const childId = Number.parseInt(ids[1]);\n\n if (itemId === parentId || itemId === childId) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n } else {\n for (let key in this.relations) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n }\n\n /**\n * Retrieve the line element which represent the relation between items.\n * @param parentId Identifier of the parent item.\n * @param childId Itentifier of the child item.\n * @return The line element or nothing.\n */\n private getRelationLine(parentId: number, childId: number): Line | null {\n const identifier = `${parentId}|${childId}`;\n return this.relations[identifier] || null;\n }\n\n /**\n * Add a new line item to represent a relation between the items.\n * @param parent Parent item.\n * @param child Child item.\n * @return Whether the line was added or not.\n */\n private addRelationLine(\n parent: Item<ItemProps>,\n child: Item<ItemProps>\n ): Line {\n const identifier = `${parent.props.id}|${child.props.id}`;\n if (this.relations[identifier] != null) {\n this.relations[identifier].remove();\n }\n\n // Get the items center.\n const startX = parent.props.x + parent.elementRef.clientWidth / 2;\n const startY =\n parent.props.y +\n (parent.elementRef.clientHeight - parent.labelElementRef.clientHeight) /\n 2;\n const endX = child.props.x + child.elementRef.clientWidth / 2;\n const endY =\n child.props.y +\n (child.elementRef.clientHeight - child.labelElementRef.clientHeight) / 2;\n\n const line = new Line(\n linePropsDecoder({\n id: 0,\n type: ItemType.LINE_ITEM,\n startX,\n startY,\n endX,\n endY,\n width: 0,\n height: 0,\n lineWidth: this.props.relationLineWidth,\n color: \"#CCCCCC\"\n }),\n itemMetaDecoder({\n receivedAt: new Date()\n })\n );\n // Save a reference to the line item.\n this.relations[identifier] = line;\n\n // Add the line to the DOM.\n line.elementRef.style.zIndex = \"0\";\n this.containerRef.append(line.elementRef);\n\n return line;\n }\n\n /**\n * Add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onItemClick(\n listener: Listener<ItemClickEvent<ItemProps>>\n ): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Add an event handler to the movement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemMoved(listener: Listener<ItemMovedEvent>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Add an event handler to the resizement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemResized(listener: Listener<ItemResizedEvent>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.resizedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Enable the edition mode.\n */\n public enableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: true };\n });\n this.containerRef.classList.add(\"is-editing\");\n }\n\n /**\n * Disable the edition mode.\n */\n public disableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: false };\n });\n this.containerRef.classList.remove(\"is-editing\");\n }\n}\n","import TypedEvent, { Disposable, Listener } from \"./TypedEvent\";\n\ninterface Cancellable {\n cancel(): void;\n}\n\ntype AsyncTaskStatus = \"waiting\" | \"started\" | \"cancelled\" | \"finished\";\ntype AsyncTaskInitiator = (done: () => void) => Cancellable;\n\n/**\n * Defines an async task which can be started and cancelled.\n * It's possible to observe the status changes of the task.\n */\nclass AsyncTask {\n private readonly taskInitiator: AsyncTaskInitiator;\n private cancellable: Cancellable = { cancel: () => {} };\n private _status: AsyncTaskStatus = \"waiting\";\n\n // Event manager for status change events.\n private readonly statusChangeEventManager = new TypedEvent<AsyncTaskStatus>();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n public constructor(taskInitiator: AsyncTaskInitiator) {\n this.taskInitiator = taskInitiator;\n }\n\n /**\n * Public setter of the `status` property.\n * @param status.\n */\n public set status(status: AsyncTaskStatus) {\n this._status = status;\n this.statusChangeEventManager.emit(status);\n }\n\n /**\n * Public accessor of the `status` property.\n * @return status.\n */\n public get status() {\n return this._status;\n }\n\n /**\n * Start the async task.\n */\n public init(): void {\n this.cancellable = this.taskInitiator(() => {\n this.status = \"finished\";\n });\n this.status = \"started\";\n }\n\n /**\n * Cancel the async task.\n */\n public cancel(): void {\n this.cancellable.cancel();\n this.status = \"cancelled\";\n }\n\n /**\n * Add an event handler to the status change.\n * @param listener Function which is going to be executed when the status changes.\n */\n public onStatusChange(listener: Listener<AsyncTaskStatus>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.statusChangeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\n/**\n * Wrap an async task into another which will execute that task indefinitely\n * every time the tash finnish and the chosen period ends.\n * Will last until cancellation.\n *\n * @param task Async task to execute.\n * @param period Time in milliseconds to wait until the next async esecution.\n *\n * @return A new async task.\n */\nfunction asyncPeriodic(task: AsyncTask, period: number): AsyncTask {\n return new AsyncTask(() => {\n let ref: number | null = null;\n\n task.onStatusChange(status => {\n if (status === \"finished\") {\n ref = window.setTimeout(() => {\n task.init();\n }, period);\n }\n });\n\n task.init();\n\n return {\n cancel: () => {\n if (ref) clearTimeout(ref);\n task.cancel();\n }\n };\n });\n}\n\n/**\n * Manages a list of async tasks.\n */\nexport default class AsyncTaskManager {\n private tasks: { [identifier: string]: AsyncTask } = {};\n\n /**\n * Adds an async task to the manager.\n *\n * @param identifier Unique identifier.\n * @param taskInitiator Function to initialize the async task.\n * Should return a structure to cancel the task.\n * @param period Optional period to repeat the task indefinitely.\n */\n public add(\n identifier: string,\n taskInitiator: AsyncTaskInitiator,\n period: number = 0\n ): AsyncTask {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n\n const asyncTask =\n period > 0\n ? asyncPeriodic(new AsyncTask(taskInitiator), period)\n : new AsyncTask(taskInitiator);\n\n this.tasks[identifier] = asyncTask;\n\n return this.tasks[identifier];\n }\n\n /**\n * Starts an async task.\n *\n * @param identifier Unique identifier.\n */\n public init(identifier: string) {\n if (\n this.tasks[identifier] &&\n (this.tasks[identifier].status === \"waiting\" ||\n this.tasks[identifier].status === \"cancelled\" ||\n this.tasks[identifier].status === \"finished\")\n ) {\n this.tasks[identifier].init();\n }\n }\n\n /**\n * Cancel a running async task.\n *\n * @param identifier Unique identifier.\n */\n public cancel(identifier: string) {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n }\n}\n","/*\n * Useful resources.\n * http://es6-features.org/\n * http://exploringjs.com/es6\n * https://www.typescriptlang.org/\n */\n\nimport \"./main.css\"; // CSS import.\nimport VisualConsole from \"./VisualConsole\";\nimport AsyncTaskManager from \"./lib/AsyncTaskManager\";\n\n// Export the VisualConsole class to the global object.\n// eslint-disable-next-line\n(window as any).VisualConsole = VisualConsole;\n\n// Export the AsyncTaskManager class to the global object.\n// eslint-disable-next-line\n(window as any).AsyncTaskManager = AsyncTaskManager;\n"],"sourceRoot":""} |