diff --git a/package-lock.json b/package-lock.json index 0a306d5cc..dfd3b767f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,8 +31,11 @@ "@fortawesome/free-solid-svg-icons": "5.8.2", "@ngx-translate/core": "13.0.0", "@ngx-translate/http-loader": "^6.0.0", + "@swimlane/ngx-graph": "^8.0.2", "chart.js": "3.0.0-alpha", "core-js": "2.5.0", + "d3": "^7.6.1", + "dagre": "^0.8.5", "font-awesome": "^4.7.0", "install": "^0.13.0", "lodash": "4.17.21", @@ -48,6 +51,10 @@ "@angular/language-service": "12.2.16", "@biesbjerg/ngx-translate-extract": "^7.0.4", "@ngx-rocket/scripts": "3.0.3", + "@types/d3-dispatch": "^3.0.1", + "@types/d3-drag": "^3.0.1", + "@types/d3-shape": "^3.1.0", + "@types/d3-timer": "^3.0.0", "@types/jasmine": "3.3.13", "@types/jasminewd2": "2.0.6", "@types/lodash": "4.14.132", @@ -3142,6 +3149,106 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/@swimlane/ngx-graph": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-graph/-/ngx-graph-8.0.2.tgz", + "integrity": "sha512-TRQFbkD4dRhASIjmgFohd+zuBhNWnWaIV/K7rHxhC1OmDQR7BIcsUoik5MJNza2xNoWir6vHQ3ZT3Q0ojZ+LDA==", + "dependencies": { + "d3-dispatch": "^1.0.3", + "d3-ease": "^1.0.5", + "d3-force": "^1.1.0", + "d3-selection": "^1.2.0", + "d3-shape": "^1.2.0", + "d3-timer": "^1.0.7", + "d3-transition": "^1.1.1", + "dagre": "^0.8.4", + "transformation-matrix": "^1.15.3", + "tslib": "^2.0.0", + "webcola": "^3.3.8" + }, + "peerDependencies": { + "@angular/animations": "10.x || 11.x || 12.x || 13.x || 14.x", + "@angular/cdk": "10.x || 11.x || 12.x || 13.x || 14.x", + "@angular/common": "10.x || 11.x || 12.x || 13.x || 14.x", + "@angular/core": "10.x || 11.x || 12.x || 13.x || 14.x", + "rxjs": "6.x || 7.x" + } + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "dependencies": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "node_modules/@swimlane/ngx-graph/node_modules/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "dependencies": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3178,6 +3285,48 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.3.tgz", + "integrity": "sha512-Mw5cf6nlW1MlefpD9zrshZ+DAWL4IQ5LnWfRheW6xwsdaWOb6IRRu2H7XPAQcyXEx1D7XQWgdoKR83ui1/HlEA==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-jYIYxFFA9vrJ8Hd4Se83YI6XF+gzDL1aC5DCsldai4XYYiVNdhtpGbA/GM6iyQ8ayhSp3a148LY34hy7A4TxZA==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, "node_modules/@types/eslint": { "version": "8.4.3", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", @@ -6464,17 +6613,16 @@ "dev": true }, "node_modules/d3": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.5.0.tgz", - "integrity": "sha512-b0hUpzWOI99VOek1VpmARF67izlrvd6C83wAAP+Wm7c3Prx7080W26ETt51XTiUn5HDdgVytjrz1UX/0P48VdQ==", - "dev": true, + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.6.1.tgz", + "integrity": "sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==", "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", - "d3-contour": "3", + "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", @@ -6505,10 +6653,9 @@ } }, "node_modules/d3-array": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", - "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", - "dev": true, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", + "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", "dependencies": { "internmap": "1 - 2" }, @@ -6520,7 +6667,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true, "engines": { "node": ">=12" } @@ -6529,7 +6675,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6545,7 +6690,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, "dependencies": { "d3-path": "1 - 3" }, @@ -6556,25 +6700,22 @@ "node_modules/d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", - "dev": true + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true, "engines": { "node": ">=12" } }, "node_modules/d3-contour": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.1.0.tgz", - "integrity": "sha512-vV3xtwrYK5p1J4vyukr70m57mtFTEQYqoaDC1ylBfht/hkdUF0nfWZ1b3V2EPBUVkUkoqq5/fbRoBImBWJgOsg==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz", + "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==", "dependencies": { - "d3-array": "2 - 3" + "d3-array": "^3.2.0" }, "engines": { "node": ">=12" @@ -6584,7 +6725,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", - "dev": true, "dependencies": { "delaunator": "5" }, @@ -6596,7 +6736,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true, "engines": { "node": ">=12" } @@ -6605,7 +6744,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -6618,7 +6756,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -6643,7 +6780,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, "engines": { "node": ">= 10" } @@ -6652,7 +6788,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true, "engines": { "node": ">=12" } @@ -6661,7 +6796,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, "dependencies": { "d3-dsv": "1 - 3" }, @@ -6673,7 +6807,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -6687,7 +6820,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "dev": true, "engines": { "node": ">=12" } @@ -6696,7 +6828,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "dev": true, "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -6708,7 +6839,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true, "engines": { "node": ">=12" } @@ -6717,7 +6847,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, "dependencies": { "d3-color": "1 - 3" }, @@ -6729,7 +6858,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", - "dev": true, "engines": { "node": ">=12" } @@ -6738,7 +6866,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true, "engines": { "node": ">=12" } @@ -6747,7 +6874,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true, "engines": { "node": ">=12" } @@ -6756,7 +6882,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true, "engines": { "node": ">=12" } @@ -6765,7 +6890,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -6781,7 +6905,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dev": true, "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -6794,7 +6917,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true, "engines": { "node": ">=12" } @@ -6803,7 +6925,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "dev": true, "dependencies": { "d3-path": "1 - 3" }, @@ -6815,7 +6936,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "dev": true, "dependencies": { "d3-array": "2 - 3" }, @@ -6827,7 +6947,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, "dependencies": { "d3-time": "1 - 3" }, @@ -6839,7 +6958,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true, "engines": { "node": ">=12" } @@ -6848,7 +6966,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -6873,7 +6990,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6889,7 +7005,6 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dev": true, "dependencies": { "graphlib": "^2.1.8", "lodash": "^4.17.15" @@ -7463,7 +7578,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dev": true, "dependencies": { "robust-predicates": "^3.0.0" } @@ -9396,7 +9510,6 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dev": true, "dependencies": { "lodash": "^4.17.15" } @@ -10215,7 +10328,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10590,7 +10702,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true, "engines": { "node": ">=12" } @@ -17823,8 +17934,7 @@ "node_modules/robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", - "dev": true + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" }, "node_modules/run-async": { "version": "2.4.1", @@ -17861,8 +17971,7 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/rxjs": { "version": "6.6.2", @@ -17897,8 +18006,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { "version": "1.36.0", @@ -20428,6 +20536,11 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/transformation-matrix": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.3.tgz", + "integrity": "sha512-ThJH58GNFKhCw3gIoOtwf3tNwuYjbyEeiGdeq4mNMYWdJctnI896KUqn6PVt7jmNVepqa1bcKQtnMB1HtjsDMA==" + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -21186,6 +21299,54 @@ "defaults": "^1.0.3" } }, + "node_modules/webcola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.4.0.tgz", + "integrity": "sha512-4BiLXjXw3SJHo3Xd+rF+7fyClT6n7I+AR6TkBqyQ4kTsePSAMDLRCXY1f3B/kXJeP9tYn4G1TblxTO+jAt0gaw==", + "dependencies": { + "d3-dispatch": "^1.0.3", + "d3-drag": "^1.0.4", + "d3-shape": "^1.3.5", + "d3-timer": "^1.0.5" + } + }, + "node_modules/webcola/node_modules/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "node_modules/webcola/node_modules/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "dependencies": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "node_modules/webcola/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/webcola/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/webcola/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/webcola/node_modules/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, "node_modules/webdriver-js-extender": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", @@ -24922,6 +25083,101 @@ } } }, + "@swimlane/ngx-graph": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-graph/-/ngx-graph-8.0.2.tgz", + "integrity": "sha512-TRQFbkD4dRhASIjmgFohd+zuBhNWnWaIV/K7rHxhC1OmDQR7BIcsUoik5MJNza2xNoWir6vHQ3ZT3Q0ojZ+LDA==", + "requires": { + "d3-dispatch": "^1.0.3", + "d3-ease": "^1.0.5", + "d3-force": "^1.1.0", + "d3-selection": "^1.2.0", + "d3-shape": "^1.2.0", + "d3-timer": "^1.0.7", + "d3-transition": "^1.1.1", + "dagre": "^0.8.4", + "transformation-matrix": "^1.15.3", + "tslib": "^2.0.0", + "webcola": "^3.3.8" + }, + "dependencies": { + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + } + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -24952,6 +25208,48 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "@types/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-NhxMn3bAkqhjoxabVJWKryhnZXXYYVQxaBnbANu0O94+O/nX9qSjrA1P1jbAQJxJf+VC72TxDX/YJcKue5bRqw==", + "dev": true + }, + "@types/d3-drag": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.1.tgz", + "integrity": "sha512-o1Va7bLwwk6h03+nSM8dpaGEYnoIG19P0lKqlic8Un36ymh9NSkNFX1yiXMKNMx8rJ0Kfnn2eovuFaL6Jvj0zA==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "@types/d3-selection": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.3.tgz", + "integrity": "sha512-Mw5cf6nlW1MlefpD9zrshZ+DAWL4IQ5LnWfRheW6xwsdaWOb6IRRu2H7XPAQcyXEx1D7XQWgdoKR83ui1/HlEA==", + "dev": true + }, + "@types/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-jYIYxFFA9vrJ8Hd4Se83YI6XF+gzDL1aC5DCsldai4XYYiVNdhtpGbA/GM6iyQ8ayhSp3a148LY34hy7A4TxZA==", + "dev": true, + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, "@types/eslint": { "version": "8.4.3", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", @@ -27539,17 +27837,16 @@ "dev": true }, "d3": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.5.0.tgz", - "integrity": "sha512-b0hUpzWOI99VOek1VpmARF67izlrvd6C83wAAP+Wm7c3Prx7080W26ETt51XTiUn5HDdgVytjrz1UX/0P48VdQ==", - "dev": true, + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.6.1.tgz", + "integrity": "sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==", "requires": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", - "d3-contour": "3", + "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", @@ -27577,10 +27874,9 @@ } }, "d3-array": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.6.tgz", - "integrity": "sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA==", - "dev": true, + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", + "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", "requires": { "internmap": "1 - 2" } @@ -27588,14 +27884,12 @@ "d3-axis": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" }, "d3-brush": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, "requires": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -27608,7 +27902,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, "requires": { "d3-path": "1 - 3" } @@ -27616,29 +27909,25 @@ "d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", - "dev": true + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" }, "d3-contour": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.1.0.tgz", - "integrity": "sha512-vV3xtwrYK5p1J4vyukr70m57mtFTEQYqoaDC1ylBfht/hkdUF0nfWZ1b3V2EPBUVkUkoqq5/fbRoBImBWJgOsg==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz", + "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==", "requires": { - "d3-array": "2 - 3" + "d3-array": "^3.2.0" } }, "d3-delaunay": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", - "dev": true, "requires": { "delaunator": "5" } @@ -27646,14 +27935,12 @@ "d3-dispatch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" }, "d3-drag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, "requires": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -27663,7 +27950,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, "requires": { "commander": "7", "iconv-lite": "0.6", @@ -27673,22 +27959,19 @@ "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" } } }, "d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" }, "d3-fetch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, "requires": { "d3-dsv": "1 - 3" } @@ -27697,7 +27980,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, "requires": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -27707,14 +27989,12 @@ "d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "dev": true + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" }, "d3-geo": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "dev": true, "requires": { "d3-array": "2.5.0 - 3" } @@ -27722,14 +28002,12 @@ "d3-hierarchy": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" }, "d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, "requires": { "d3-color": "1 - 3" } @@ -27737,32 +28015,27 @@ "d3-path": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==", - "dev": true + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" }, "d3-polygon": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" }, "d3-quadtree": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" }, "d3-random": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" }, "d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, "requires": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -27775,7 +28048,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dev": true, "requires": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -27784,14 +28056,12 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-shape": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", - "dev": true, "requires": { "d3-path": "1 - 3" } @@ -27800,7 +28070,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", - "dev": true, "requires": { "d3-array": "2 - 3" } @@ -27809,7 +28078,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, "requires": { "d3-time": "1 - 3" } @@ -27817,14 +28085,12 @@ "d3-timer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" }, "d3-transition": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, "requires": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -27843,7 +28109,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, "requires": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -27856,7 +28121,6 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dev": true, "requires": { "graphlib": "^2.1.8", "lodash": "^4.17.15" @@ -28362,7 +28626,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dev": true, "requires": { "robust-predicates": "^3.0.0" } @@ -29838,7 +30101,6 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dev": true, "requires": { "lodash": "^4.17.15" } @@ -30542,7 +30804,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -30811,8 +31072,7 @@ "internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" }, "ip": { "version": "1.1.8", @@ -36285,8 +36545,7 @@ "robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", - "dev": true + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" }, "run-async": { "version": "2.4.1", @@ -36306,8 +36565,7 @@ "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "rxjs": { "version": "6.6.2", @@ -36341,8 +36599,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { "version": "1.36.0", @@ -38357,6 +38614,11 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "transformation-matrix": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.3.tgz", + "integrity": "sha512-ThJH58GNFKhCw3gIoOtwf3tNwuYjbyEeiGdeq4mNMYWdJctnI896KUqn6PVt7jmNVepqa1bcKQtnMB1HtjsDMA==" + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -38958,6 +39220,56 @@ "defaults": "^1.0.3" } }, + "webcola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.4.0.tgz", + "integrity": "sha512-4BiLXjXw3SJHo3Xd+rF+7fyClT6n7I+AR6TkBqyQ4kTsePSAMDLRCXY1f3B/kXJeP9tYn4G1TblxTO+jAt0gaw==", + "requires": { + "d3-dispatch": "^1.0.3", + "d3-drag": "^1.0.4", + "d3-shape": "^1.3.5", + "d3-timer": "^1.0.5" + }, + "dependencies": { + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + } + } + }, "webdriver-js-extender": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", diff --git a/package.json b/package.json index af7e9ca8b..cf065e26e 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,11 @@ "@fortawesome/free-solid-svg-icons": "5.8.2", "@ngx-translate/core": "13.0.0", "@ngx-translate/http-loader": "^6.0.0", + "@swimlane/ngx-graph": "^8.0.2", "chart.js": "3.0.0-alpha", "core-js": "2.5.0", + "d3": "^7.6.1", + "dagre": "^0.8.5", "font-awesome": "^4.7.0", "install": "^0.13.0", "lodash": "4.17.21", @@ -67,6 +70,10 @@ "@biesbjerg/ngx-translate-extract": "^7.0.4", "@cypress/schematic": "^1.7.0", "@ngx-rocket/scripts": "3.0.3", + "@types/d3-dispatch": "^3.0.1", + "@types/d3-drag": "^3.0.1", + "@types/d3-shape": "^3.1.0", + "@types/d3-timer": "^3.0.0", "@types/jasmine": "3.3.13", "@types/jasminewd2": "2.0.6", "@types/lodash": "4.14.132", diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 1ec8ed3a7..6ab186a1f 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -5,7 +5,6 @@ import { RouteReuseStrategy, RouterModule } from '@angular/router'; /** Translation Imports */ import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; -import { TranslateHttpLoader } from '@ngx-translate/http-loader'; /** Custom Services */ import { AuthenticationService } from './authentication/authentication.service'; @@ -38,8 +37,6 @@ import { SidenavComponent } from './shell/sidenav/sidenav.component'; import { ToolbarComponent } from './shell/toolbar/toolbar.component'; import { BreadcrumbComponent } from './shell/breadcrumb/breadcrumb.component'; import { ContentComponent } from './shell/content/content.component'; -import { InjectionToken } from '@angular/core'; -import { APP_BASE_HREF, LocationStrategy } from '@angular/common'; /** diff --git a/src/app/pipes/datetime-format.pipe.spec.ts b/src/app/pipes/datetime-format.pipe.spec.ts new file mode 100644 index 000000000..81469c9cc --- /dev/null +++ b/src/app/pipes/datetime-format.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DatetimeFormatPipe } from './datetime-format.pipe'; + +describe('DatetimeFormatPipe', () => { + it('create an instance', () => { + const pipe = new DatetimeFormatPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/pipes/datetime-format.pipe.ts b/src/app/pipes/datetime-format.pipe.ts new file mode 100644 index 000000000..5f40894f4 --- /dev/null +++ b/src/app/pipes/datetime-format.pipe.ts @@ -0,0 +1,29 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { SettingsService } from 'app/settings/settings.service'; +import * as moment from 'moment'; + +@Pipe({ + name: 'datetimeFormat' +}) +export class DatetimeFormatPipe implements PipeTransform { + + constructor(private settingsService: SettingsService) { + } + + transform(value: any, datetimeFormat: string): any { + const defaultDateFormat = this.settingsService.dateFormat.replace('dd', 'DD'); + if (typeof value === 'undefined') { + return ''; + } + let dateVal; + if (value instanceof Array) { + dateVal = moment(value.join('-'), 'YYYY-MM-DD HH:mm:ss'); + } else { + dateVal = moment(value); + } + if (datetimeFormat == null) { + return dateVal.format(defaultDateFormat + ' HH:mm:ss'); + } + return dateVal.format(datetimeFormat); + } +} diff --git a/src/app/pipes/pipes.module.ts b/src/app/pipes/pipes.module.ts index 454a88542..87a8fa818 100644 --- a/src/app/pipes/pipes.module.ts +++ b/src/app/pipes/pipes.module.ts @@ -7,13 +7,14 @@ import { ChargesPenaltyFilterPipe } from './charges-penalty-filter.pipe'; import { FindPipe } from './find.pipe'; import { UrlToStringPipe } from './url-to-string.pipe'; import { DateFormatPipe } from './date-format.pipe'; +import { DatetimeFormatPipe } from './datetime-format.pipe'; @NgModule({ imports: [ CommonModule ], - declarations: [StatusLookupPipe, AccountsFilterPipe, ChargesFilterPipe, ChargesPenaltyFilterPipe, FindPipe, UrlToStringPipe, DateFormatPipe], - providers: [StatusLookupPipe, AccountsFilterPipe, ChargesFilterPipe, ChargesPenaltyFilterPipe, FindPipe, UrlToStringPipe, DateFormatPipe], - exports: [StatusLookupPipe, AccountsFilterPipe, ChargesFilterPipe, ChargesPenaltyFilterPipe, FindPipe, UrlToStringPipe, DateFormatPipe] + declarations: [StatusLookupPipe, AccountsFilterPipe, ChargesFilterPipe, ChargesPenaltyFilterPipe, FindPipe, UrlToStringPipe, DateFormatPipe, DatetimeFormatPipe], + providers: [StatusLookupPipe, AccountsFilterPipe, ChargesFilterPipe, ChargesPenaltyFilterPipe, FindPipe, UrlToStringPipe, DateFormatPipe, DatetimeFormatPipe], + exports: [StatusLookupPipe, AccountsFilterPipe, ChargesFilterPipe, ChargesPenaltyFilterPipe, FindPipe, UrlToStringPipe, DateFormatPipe, DatetimeFormatPipe] }) export class PipesModule { } diff --git a/src/app/system/manage-jobs/manage-jobs.component.html b/src/app/system/manage-jobs/manage-jobs.component.html new file mode 100644 index 000000000..a66989dbb --- /dev/null +++ b/src/app/system/manage-jobs/manage-jobs.component.html @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/app/system/manage-jobs/manage-jobs.component.scss b/src/app/system/manage-jobs/manage-jobs.component.scss new file mode 100644 index 000000000..824716ae9 --- /dev/null +++ b/src/app/system/manage-jobs/manage-jobs.component.scss @@ -0,0 +1,27 @@ +.container-card { + margin: 0 auto; + max-width: 80rem; + width: 90%; + padding: 0; + padding-bottom: 50px; + min-height: 500px; + .header { + padding: 1%; + .header-title-group { + .client-card-title { + margin-top: 1.4rem; + color: white; + width: 90%; + p { + color: white; + } + } + } + } + .navigation-tabs { + overflow: auto; + } + i:hover { + cursor: pointer; + } +} diff --git a/src/app/system/manage-jobs/manage-jobs.component.spec.ts b/src/app/system/manage-jobs/manage-jobs.component.spec.ts new file mode 100644 index 000000000..3dd232386 --- /dev/null +++ b/src/app/system/manage-jobs/manage-jobs.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ManageJobsComponent } from './manage-jobs.component'; + +describe('ManageJobsComponent', () => { + let component: ManageJobsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ManageJobsComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ManageJobsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-jobs/manage-jobs.component.ts b/src/app/system/manage-jobs/manage-jobs.component.ts new file mode 100644 index 000000000..6742719da --- /dev/null +++ b/src/app/system/manage-jobs/manage-jobs.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'mifosx-manage-jobs', + templateUrl: './manage-jobs.component.html', + styleUrls: ['./manage-jobs.component.scss'] +}) +export class ManageJobsComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.html b/src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.html similarity index 100% rename from src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.html rename to src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.html diff --git a/src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.scss b/src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.scss similarity index 100% rename from src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.scss rename to src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.scss diff --git a/src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.spec.ts b/src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.spec.ts similarity index 100% rename from src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.spec.ts rename to src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.spec.ts diff --git a/src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.ts b/src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.ts similarity index 100% rename from src/app/system/manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.ts rename to src/app/system/manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component.ts diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-job.resolver.ts b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-job.resolver.ts similarity index 93% rename from src/app/system/manage-scheduler-jobs/manage-scheduler-job.resolver.ts rename to src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-job.resolver.ts index 2a20fa335..e2cf0f95b 100644 --- a/src/app/system/manage-scheduler-jobs/manage-scheduler-job.resolver.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-job.resolver.ts @@ -6,7 +6,7 @@ import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; import { Observable} from 'rxjs'; /** Custom Services */ -import { SystemService } from '../system.service'; +import { SystemService } from '../../system.service'; /** * Edit Scheduler Job data resolver. diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.html b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.html similarity index 80% rename from src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.html rename to src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.html index deffd58b6..c0bc1b438 100644 --- a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.html +++ b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.html @@ -22,21 +22,26 @@ -
+
+ +
+ +
@@ -53,15 +58,18 @@ - + @@ -70,7 +78,8 @@ @@ -78,8 +87,10 @@ diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.scss b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.scss similarity index 100% rename from src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.scss rename to src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.scss diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.spec.ts b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.spec.ts similarity index 100% rename from src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.spec.ts rename to src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.spec.ts diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.ts b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts similarity index 95% rename from src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.ts rename to src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts index 3312ef2c4..6bca856e3 100644 --- a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.component.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.component.ts @@ -9,14 +9,14 @@ import { MatDialog } from '@angular/material/dialog'; /** rxjs Imports */ import { of } from 'rxjs'; -import { SystemService } from '../system.service'; +import { SystemService } from '../../system.service'; /** Custom Services */ -import { PopoverService } from '../../configuration-wizard/popover/popover.service'; -import { ConfigurationWizardService } from '../../configuration-wizard/configuration-wizard.service'; +import { PopoverService } from '../../../configuration-wizard/popover/popover.service'; +import { ConfigurationWizardService } from '../../../configuration-wizard/configuration-wizard.service'; /** Custom Dialog Component */ -import { NextStepDialogComponent } from '../../configuration-wizard/next-step-dialog/next-step-dialog.component'; +import { NextStepDialogComponent } from '../../../configuration-wizard/next-step-dialog/next-step-dialog.component'; /** * Manage scheduler jobs component. diff --git a/src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.resolver.ts b/src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.resolver.ts similarity index 100% rename from src/app/system/manage-scheduler-jobs/manage-scheduler-jobs.resolver.ts rename to src/app/system/manage-jobs/scheduler-jobs/manage-scheduler-jobs.resolver.ts diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html similarity index 80% rename from src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html rename to src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html index 817ef3bfd..a4bd8b655 100644 --- a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html +++ b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.html @@ -17,6 +17,16 @@ + + + + + + + + + +
- + - + Previous Run {{ job.lastRunHistory.jobRunStartTime }}{{ job.lastRunHistory.jobRunStartTime + }} Previous Run Status
- - + +
Currently Running
- +
Error Log - {{ jobHistoryData.version }} Start time {{ jobHistoryData.jobRunStartTime | datetimeFormat }} End time {{ jobHistoryData.jobRunEndTime | datetimeFormat }} Status diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.scss b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.scss similarity index 100% rename from src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.scss rename to src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.scss diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts similarity index 100% rename from src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts rename to src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.spec.ts diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts similarity index 96% rename from src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts rename to src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts index 9738773fd..ba355502c 100644 --- a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component.ts @@ -17,7 +17,7 @@ export class ViewHistorySchedulerJobComponent implements OnInit { /** Job History data. */ jobHistoryData: any; /** Columns to be displayed in Scheduler Job History. */ - displayedColumns: string[] = ['version', 'run_start_time', 'status', 'run_type', 'error_log']; + displayedColumns: string[] = ['version', 'run_start_time', 'run_end_time', 'status', 'run_type', 'error_log']; /** Data source for Scheduler Job History table. */ dataSource: MatTableDataSource; diff --git a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts similarity index 92% rename from src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts rename to src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts index e9be23685..7d2baa8c4 100644 --- a/src/app/system/manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver.ts @@ -6,7 +6,7 @@ import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; import { Observable, forkJoin } from 'rxjs'; /** Custom Services */ -import { SystemService } from '../../system.service'; +import { SystemService } from '../../../system.service'; /** * View History Scheduler Jobs data resolver. diff --git a/src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.html b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.html similarity index 100% rename from src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.html rename to src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.html diff --git a/src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.scss b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.scss similarity index 100% rename from src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.scss rename to src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.scss diff --git a/src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.spec.ts b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.spec.ts similarity index 100% rename from src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.spec.ts rename to src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.spec.ts diff --git a/src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts similarity index 100% rename from src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts rename to src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component.ts diff --git a/src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts similarity index 87% rename from src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts rename to src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts index 288d7105c..abccf8b8a 100644 --- a/src/app/system/manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts +++ b/src/app/system/manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver.ts @@ -3,10 +3,10 @@ import { Injectable } from '@angular/core'; import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; /** rxjs Imports */ -import { Observable, forkJoin } from 'rxjs'; +import { Observable } from 'rxjs'; /** Custom Services */ -import { SystemService } from '../../system.service'; +import { SystemService } from '../../../system.service'; /** * Selected Scheduler Jobs data resolver. diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.html b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.html new file mode 100644 index 000000000..6a426d57e --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + {{ link.label }} + + + + + + {{ link.data.linkText }} + + + + diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.scss b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.scss new file mode 100644 index 000000000..225b6ed13 --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.scss @@ -0,0 +1,40 @@ +:host ::ng-deep { + display: block; + height: inherit; + width: inherit; + + .card-container { + height: 100; + min-width: 150; + display: block; + fill: #d7dada; + border: #000; + + .name { + font-size: 12px; + } + + label { + display: block; + text-align: center; + font-size: 20px; + margin-top: 4px; + margin-bottom: 8px; + } + } + + .link-midpoint { + ellipse { + fill: white; + stroke: black; + stroke-width: 1; + } + + text { + stroke: transparent; + fill: black; + text-anchor: middle; + font-size: 8px; + } + } +} diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.spec.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.spec.ts new file mode 100644 index 000000000..6a513551f --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WorkflowDiagramComponent } from './workflow-diagram.component'; + +describe('WorkflowDiagramComponent', () => { + let component: WorkflowDiagramComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ WorkflowDiagramComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(WorkflowDiagramComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.ts new file mode 100644 index 000000000..74d7d4278 --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component.ts @@ -0,0 +1,74 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { DagreNodesOnlyLayout, Edge, Layout, Node } from '@swimlane/ngx-graph'; +import * as shape from 'd3-shape'; +import { Subject } from 'rxjs'; + + +export class JobStep { + id: number; + stepName: string; + order: number; +} + +@Component({ + selector: 'mifosx-workflow-diagram', + templateUrl: './workflow-diagram.component.html', + styleUrls: ['./workflow-diagram.component.scss'] +}) +export class WorkflowDiagramComponent implements OnInit { + @Input() jobStepsData: JobStep[] = []; + + diagramSize: [number, number] = [1024, 300]; + public nodes: Node[] = []; + public links: Edge[] = []; + public layoutSettings = { + orientation: 'LR' + }; + public curve: any = shape.curveLinear; + public layout: Layout = new DagreNodesOnlyLayout(); + colorScheme = { + domain: ['#5AA454', '#A10A28', '#C7B42C'] + }; + center$ = new Subject(); + + constructor() { } + + ngOnInit(): void { + let nodeCounter = 0; + for (const jobStep of this.jobStepsData) { + const currentNode = `node_${jobStep.order}`; + const node: Node = { + id: currentNode, + label: jobStep.stepName, + data: { + name: jobStep.stepName, + order: jobStep.order + } + }; + this.nodes.push(node); + + if (nodeCounter > 0) { + const edge: Edge = { + id: `link_${(jobStep.id)}`, + source: `node_${(jobStep.order - 1)}`, + target: currentNode, + label: '', + data: { + linkText: 'Precedes of' + } + }; + + this.links.push(edge); + } + + nodeCounter++; + } + // trigger center + this.center$.next(); + } + + public getStyles(node: Node): any { + return 'node_odd'; + } + +} diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.html b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.html new file mode 100644 index 000000000..1cef23d26 --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.html @@ -0,0 +1,62 @@ +
+ + + Job Name + + + {{ job }} + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + +
Step Name {{ jobStep.stepName }} Order {{ jobStep.order }} Actions + +
+
+ +
+ + +
+ +
+ +
+ +
diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.scss b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.scss new file mode 100644 index 000000000..764f8780a --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.scss @@ -0,0 +1,35 @@ +.container { + margin: auto !important; +} + +.workflow-graph { + min-height: 400px; +} + +.space-top { + margin-top: 20px !important; +} + +.space-bottom { + margin-bottom: 20px !important; +} + +.cdk-drag-preview { + box-sizing: border-box; + border-radius: 4px; + box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), + 0 8px 10px 1px rgba(0, 0, 0, 0.14), + 0 3px 14px 2px rgba(0, 0, 0, 0.12); +} + +.cdk-drag-placeholder { + opacity: 0; +} + +.cdk-drag-animating { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); +} + +.cdk-drop-list-dragging .mat-row:not(.cdk-drag-placeholder) { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); +} diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.spec.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.spec.ts new file mode 100644 index 000000000..0d313a02e --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WorkflowJobsComponent } from './workflow-job.component'; + +describe('WorkflowJobsComponent', () => { + let component: WorkflowJobsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ WorkflowJobsComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(WorkflowJobsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.ts new file mode 100644 index 000000000..3e2c13412 --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.component.ts @@ -0,0 +1,97 @@ +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormControl, Validators } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { MatTable } from '@angular/material/table'; +import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component'; +import { SystemService } from 'app/system/system.service'; +import { JobStep } from './workflow-diagram/workflow-diagram.component'; + +@Component({ + selector: 'mifosx-workflow-jobs', + templateUrl: './workflow-jobs.component.html', + styleUrls: ['./workflow-jobs.component.scss'] +}) +export class WorkflowJobsComponent implements OnInit { + stepOrderHasChanged = false; + + jobNameOptions: any = []; + jobStepsData: any = []; + jobStepsDataBase: any = []; + jobStepName: String = null; + + jobName = new FormControl('', Validators.required); + + @ViewChild('table') table: MatTable; + + /** Columns to be displayed in the table. */ + displayedColumns: string[] = ['stepName', 'stepOrder', 'actions']; + + constructor(private systemService: SystemService, + public dialog: MatDialog) {} + + ngOnInit(): void { + this.systemService.getWorkflowJobNames().toPromise() + .then(jobNames => { + this.jobNameOptions = jobNames; + }); + } + + /** + * Get the Workflow Job steps data + * @param {string} jobName Value to Workflow Job name. + */ + getWorkflowJobSteps(jobName: string) { + this.systemService.getWorkflowJobSteps(jobName).toPromise() + .then(data => { + this.jobStepName = jobName; + this.jobStepsData = data.businessSteps.sort(function (a: JobStep, b: JobStep) { + return a.order - b.order; + }); + this.jobStepsDataBase = this.jobStepsData; + }); + } + + dropTable(event: CdkDragDrop) { + const prevIndex = this.jobStepsData.findIndex((d: JobStep) => d === event.item.data); + moveItemInArray(this.jobStepsData, prevIndex, event.currentIndex); + this.jobStepsData = [...this.jobStepsData]; + this.table.renderRows(); + this.stepOrderHasChanged = true; + } + + /** + * Delete particular Job Step from Workflow Job + */ + removeJobStep(index: number) { + const dialogRef = this.dialog.open(DeleteDialogComponent, { + data: { deleteContext: `this` } + }); + dialogRef.afterClosed().subscribe((response: any) => { + if (response.delete) { + this.jobStepsData.splice(index, 1); + this.jobStepsData = this.jobStepsData.concat([]); + this.jobStepsData = [...this.jobStepsData]; + this.stepOrderHasChanged = true; + } + }); + } + + saveChanges() { + // Set the new Order + let stepOrder = 1; + this.jobStepsData.forEach((jobStep: JobStep) => { + jobStep.order = stepOrder++; + }); + + const payload = { + 'businessSteps': this.jobStepsData + }; + + this.systemService.putWorkflowJobSteps(this.jobStepName, payload).toPromise() + .then(data => { + this.stepOrderHasChanged = false; + }); + } + +} diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.spec.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.spec.ts new file mode 100644 index 000000000..38999fa1f --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { WorkflowJobResolver } from './workflow-jobs.resolver'; + +describe('WorkflowJobResolver', () => { + let resolver: WorkflowJobResolver; + + beforeEach(() => { + TestBed.configureTestingModule({}); + resolver = TestBed.inject(WorkflowJobResolver); + }); + + it('should be created', () => { + expect(resolver).toBeTruthy(); + }); +}); diff --git a/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.ts b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.ts new file mode 100644 index 000000000..bc4320d9f --- /dev/null +++ b/src/app/system/manage-jobs/workflow-jobs/workflow-jobs.resolver.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; +import { SystemService } from 'app/system/system.service'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class WorkflowJobResolver implements Resolve { + + /** + * @param {SystemService} systemService System service. + */ + constructor(private systemService: SystemService) {} + + /** + * Returns the Configuration data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + return this.systemService.getWorkflowJobNames(); + } + +} diff --git a/src/app/system/system-routing.module.ts b/src/app/system/system-routing.module.ts index 3f3257af2..56571f8a2 100644 --- a/src/app/system/system-routing.module.ts +++ b/src/app/system/system-routing.module.ts @@ -26,7 +26,6 @@ import { ManageSurveysComponent } from './manage-surveys/manage-surveys.componen import { CreateSurveyComponent } from './manage-surveys/create-survey/create-survey.component'; import { ViewSurveyComponent } from './manage-surveys/view-survey/view-survey.component'; import { EditSurveyComponent } from './manage-surveys/edit-survey/edit-survey.component'; -import { ManageSchedulerJobsComponent } from './manage-scheduler-jobs/manage-scheduler-jobs.component'; import { AmazonS3Component } from './external-services/amazon-s3/amazon-s3.component'; import { EmailComponent } from './external-services/email/email.component'; import { SMSComponent } from './external-services/sms/sms.component'; @@ -60,7 +59,6 @@ import { HookResolver } from './manage-hooks/view-hook/hook.resolver'; import { HooksTemplateResolver } from './manage-hooks/hooks-template.resolver'; import { RolesAndPermissionsResolver } from './roles-and-permissions/roles-and-permissions.resolver'; import { ManageSurveysResolver } from './manage-surveys/manage-surveys.resolver'; -import { ManageSchedulerJobsResolver } from './manage-scheduler-jobs/manage-scheduler-jobs.resolver'; import { GlobalConfigurationsResolver } from './configurations/global-configurations-tab/global-configurations.resolver'; import { AmazonS3ConfigurationResolver } from './external-services/amazon-s3/amazon-s3.resolver'; import { EmailConfigurationResolver } from './external-services/email/email.resolver'; @@ -75,19 +73,20 @@ import { ReportsResolver } from './manage-reports/reports.resolver'; import { ReportResolver } from './manage-reports/report.resolver'; import { SurveyResolver } from './manage-surveys/survey.resolver'; import { ReportTemplateResolver } from './manage-reports/report-template.resolver'; -import { ViewSchedulerJobComponent } from './manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component'; -import { ViewSchedulerJobResolver } from './manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver'; -import { EditSchedulerJobComponent } from './manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component'; -import { ManageSchedulerJobResolver } from './manage-scheduler-jobs/manage-scheduler-job.resolver'; +import { ViewSchedulerJobComponent } from './manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component'; +import { ViewSchedulerJobResolver } from './manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.resolver'; +import { EditSchedulerJobComponent } from './manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component'; +import { ManageSchedulerJobResolver } from './manage-jobs/scheduler-jobs/manage-scheduler-job.resolver'; import { ViewRoleResolver } from './roles-and-permissions/view-role/view-role.resolver'; import { EntityToEntityMappingResolver } from './entity-to-entity-mapping/entity-to-entity-mapping.resolver'; import { ConfigureMakerCheckerTasksComponent } from './configure-maker-checker-tasks/configure-maker-checker-tasks.component'; import { MakerCheckerTasksResolver } from './configure-maker-checker-tasks/configure-maker-checker-tasks.resolver'; -import { ViewHistorySchedulerJobComponent } from './manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component'; -import { ViewHistorySchedulerJobsResolver } from './manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver'; +import { ViewHistorySchedulerJobComponent } from './manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component'; +import { ViewHistorySchedulerJobsResolver } from './manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.resolver'; import { ConfigurationsComponent } from './configurations/configurations.component'; import { GlobalConfigurationResolver } from './configurations/global-configurations-tab/global-configuration.resolver'; import { EditConfigurationComponent } from './configurations/global-configurations-tab/edit-configuration/edit-configuration.component'; +import { ManageJobsComponent } from './manage-jobs/manage-jobs.component'; const routes: Routes = [ Route.withShell([ @@ -416,12 +415,12 @@ const routes: Routes = [ ] }, { - path: 'scheduler-jobs', - data: { title: extract('Manage Scheduler Jobs'), breadcrumb: 'Manage Scheduler Jobs' }, + path: 'manage-jobs', + data: { title: extract('Manage Scheduler and COB Jobs'), breadcrumb: 'Manage Scheduler and COB Jobs' }, children: [ { path: '', - component: ManageSchedulerJobsComponent, + component: ManageJobsComponent, resolve: {}, }, { @@ -601,7 +600,6 @@ const routes: Routes = [ RolesAndPermissionsResolver, ManageSurveysResolver, SurveyResolver, - ManageSchedulerJobsResolver, GlobalConfigurationsResolver, GlobalConfigurationResolver, AmazonS3ConfigurationResolver, diff --git a/src/app/system/system.component.html b/src/app/system/system.component.html index 4a3e04595..e2da772fc 100644 --- a/src/app/system/system.component.html +++ b/src/app/system/system.component.html @@ -88,27 +88,22 @@

Audit logs of all the activities, such as create client, disburse loans etc

-
- - - - -

Manage Reports

-

Add new report and classify reports

-
-
+ + + + +

Manage Reports

+

Add new report and classify reports

+
-
- - - - -

Scheduler Jobs

-

Schedule a job, modify or delete jobs

-
-
+ + + + +

Manage Jobs

+

Manage Schedule and Workflow jobs, modify jobs or view history and logs

+
-
@@ -116,8 +111,6 @@

Configurations

Global configurations, Cache and Business Date settings

-
- diff --git a/src/app/system/system.module.ts b/src/app/system/system.module.ts index 0fd35f842..a61e0de8b 100644 --- a/src/app/system/system.module.ts +++ b/src/app/system/system.module.ts @@ -22,7 +22,6 @@ import { AddRoleComponent } from './roles-and-permissions/add-role/add-role.comp import { ManageSurveysComponent } from './manage-surveys/manage-surveys.component'; import { ViewSurveyComponent } from './manage-surveys/view-survey/view-survey.component'; import { CreateSurveyComponent } from './manage-surveys/create-survey/create-survey.component'; -import { ManageSchedulerJobsComponent } from './manage-scheduler-jobs/manage-scheduler-jobs.component'; import { EditConfigurationComponent } from './configurations/global-configurations-tab/edit-configuration/edit-configuration.component'; import { AmazonS3Component } from './external-services/amazon-s3/amazon-s3.component'; import { EmailComponent } from './external-services/email/email.component'; @@ -45,7 +44,7 @@ import { EditReportComponent } from './manage-reports/edit-report/edit-report.co import { AuditTrailsComponent } from './audit-trails/audit-trails.component'; import { ViewAuditComponent } from './audit-trails/view-audit/view-audit.component'; import { ColumnDialogComponent } from './manage-data-tables/column-dialog/column-dialog.component'; -import { ViewHistorySchedulerJobComponent } from './manage-scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component'; +import { ViewHistorySchedulerJobComponent } from './manage-jobs/scheduler-jobs/view-history-scheduler-job/view-history-scheduler-job.component'; import { EditHookComponent } from './manage-hooks/edit-hook/edit-hook.component'; import { ViewHookComponent } from './manage-hooks/view-hook/view-hook.component'; import { CreateHookComponent } from './manage-hooks/create-hook/create-hook.component'; @@ -56,19 +55,29 @@ import { EntityToEntityMappingComponent } from './entity-to-entity-mapping/entit /** Dialog Component Imports */ import { ReportParameterDialogComponent } from './manage-reports/report-parameter-dialog/report-parameter-dialog.component'; import { AddEventDialogComponent } from './manage-hooks/add-event-dialog/add-event-dialog.component'; -import { ViewSchedulerJobComponent } from './manage-scheduler-jobs/view-scheduler-job/view-scheduler-job.component'; -import { EditSchedulerJobComponent } from './manage-scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component'; +import { ViewSchedulerJobComponent } from './manage-jobs/scheduler-jobs/view-scheduler-job/view-scheduler-job.component'; +import { EditSchedulerJobComponent } from './manage-jobs/scheduler-jobs/edit-scheduler-job/edit-scheduler-job.component'; import { ConfigureMakerCheckerTasksComponent } from './configure-maker-checker-tasks/configure-maker-checker-tasks.component'; import { EditSurveyComponent } from './manage-surveys/edit-survey/edit-survey.component'; import { BusinessDateTabComponent } from './configurations/business-date-tab/business-date-tab.component'; import { ConfigurationsComponent } from './configurations/configurations.component'; import { GlobalConfigurationsTabComponent } from './configurations/global-configurations-tab/global-configurations-tab.component'; +import { ManageJobsComponent } from './manage-jobs/manage-jobs.component'; +import { ManageSchedulerJobsComponent } from './manage-jobs/scheduler-jobs/manage-scheduler-jobs.component'; +import { WorkflowDiagramComponent } from './manage-jobs/workflow-jobs/workflow-diagram/workflow-diagram.component'; +import { NgxGraphModule } from '@swimlane/ngx-graph'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { WorkflowJobsComponent } from './manage-jobs/workflow-jobs/workflow-jobs.component'; +import { DragDropModule } from '@angular/cdk/drag-drop'; @NgModule({ imports: [ SystemRoutingModule, SharedModule, PipesModule, + NgxGraphModule, + BrowserAnimationsModule, + DragDropModule, DirectivesModule ], declarations: [ @@ -85,7 +94,6 @@ import { GlobalConfigurationsTabComponent } from './configurations/global-config ManageHooksComponent, RolesAndPermissionsComponent, ManageSurveysComponent, - ManageSchedulerJobsComponent, EditConfigurationComponent, AmazonS3Component, EmailComponent, @@ -125,7 +133,11 @@ import { GlobalConfigurationsTabComponent } from './configurations/global-config EditSurveyComponent, BusinessDateTabComponent, ConfigurationsComponent, - GlobalConfigurationsTabComponent + GlobalConfigurationsTabComponent, + ManageJobsComponent, + ManageSchedulerJobsComponent, + WorkflowJobsComponent, + WorkflowDiagramComponent ], }) export class SystemModule { } diff --git a/src/app/system/system.service.ts b/src/app/system/system.service.ts index dff1f1734..4282f9852 100644 --- a/src/app/system/system.service.ts +++ b/src/app/system/system.service.ts @@ -247,6 +247,27 @@ export class SystemService { return this.http.get('/jobs'); } + /** + * @returns {Observable} Fetches Jobs. + */ + getWorkflowJobNames(): Observable { + return this.http.get('/jobs/names'); + } + + /** + * @returns {Observable} Fetches Jobs. + */ + getWorkflowJobSteps(jobName: String): Observable { + return this.http.get(`/jobs/${jobName}/steps`); + } + + /** + * @returns {Observable} Fetches Jobs. + */ + putWorkflowJobSteps(jobName: String, payload: any): Observable { + return this.http.put(`/jobs/${jobName}/steps`, payload); + } + /** * @returns {Observable} Fetches Scheduler. */