diff --git a/.github/workflows/build-and-publish-debug.yml b/.github/workflows/build-and-publish-debug.yml index e50caded83d..a1ac896aab7 100644 --- a/.github/workflows/build-and-publish-debug.yml +++ b/.github/workflows/build-and-publish-debug.yml @@ -22,7 +22,7 @@ jobs: run: | sudo rm -rf /usr/local/lib/android - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build uses: ./dockerfiles with: diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index b7bcaf6757c..020ccca1efe 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -22,7 +22,7 @@ jobs: run: | sudo rm -rf /usr/local/lib/android - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build uses: ./dockerfiles with: @@ -48,7 +48,7 @@ jobs: run: | sudo rm -rf /usr/local/lib/android - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build uses: ./dockerfiles with: diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index caa945a6c9b..12234bf816a 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -70,14 +70,14 @@ jobs: echo "${{ toJSON(steps.vars.outputs) }})" - name: Release HPCC-Platform - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: allowUpdates: true generateReleaseNotes: false prerelease: ${{ contains(github.ref, '-rc') }} - name: Release LN - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: allowUpdates: true generateReleaseNotes: false @@ -150,15 +150,15 @@ jobs: df -h - name: Checkout HPCC-Platform - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ needs.preamble.outputs.community_ref }} submodules: recursive path: ${{ needs.preamble.outputs.folder_platform }} - name: Checkout LN - if: ${{ matrix.ln || matrix.ee }} - uses: actions/checkout@v3 + if: ${{ matrix.ln }} + uses: actions/checkout@v4 with: repository: ${{ github.repository_owner }}/LN token: ${{ secrets.LNB_TOKEN }} @@ -184,16 +184,16 @@ jobs: - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Create Build Image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: builder: ${{ steps.buildx.outputs.name }} file: ${{ needs.preamble.outputs.folder_platform }}/dockerfiles/vcpkg/${{ matrix.os }}.dockerfile @@ -266,7 +266,7 @@ jobs: - name: Upload Assets (community) if: ${{ !matrix.ln && !matrix.ee }} - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: allowUpdates: true generateReleaseNotes: false @@ -283,7 +283,7 @@ jobs: echo "$k8s_pkg_file" - name: Create Docker Image (community) - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 if: ${{ !matrix.ln && !matrix.ee && matrix.container && !matrix.documentation }} with: builder: ${{ steps.buildx.outputs.name }} @@ -301,7 +301,7 @@ jobs: # Internal Build --- - name: Login to JFrog (internal) if: ${{ matrix.ln && matrix.container && github.repository_owner == 'hpcc-systems' }} - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ${{ secrets.JFROG_REGISTRY }} username: ${{ secrets.JFROG_USERNAME }} @@ -348,7 +348,7 @@ jobs: - name: Upload Assets (internal) if: ${{ matrix.ln }} - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: allowUpdates: true generateReleaseNotes: false @@ -424,7 +424,7 @@ jobs: - name: Upload error logs if: ${{ failure() || cancelled() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.os }}-${{ matrix.ln }}-${{ matrix.container }}-${{ matrix.documentation }}-logs path: ${{ needs.preamble.outputs.folder_build }}/**/*.log @@ -469,14 +469,14 @@ jobs: ${{ matrix.sudo }} rm -rf "$VCPKG_INSTALLATION_ROOT" - name: Checkout HPCC-Platform - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ needs.preamble.outputs.community_ref }} submodules: recursive path: ./HPCC-Platform - name: Checkout LN - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ${{ github.repository_owner }}/LN token: ${{ secrets.LNB_TOKEN }} @@ -536,7 +536,7 @@ jobs: compression-level: 0 - name: Upload Assets - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: allowUpdates: true generateReleaseNotes: false @@ -559,7 +559,7 @@ jobs: C:\"Program Files (x86)"\"Microsoft SDKs"\ClickOnce\SignTool\signtool.exe sign /debug /f ../sign/hpcc_code_signing.pfx /p ${{ secrets.SIGNING_CERTIFICATE_PASSPHRASE }} /t http://timestamp.digicert.com /fd SHA256 hpccsystems-clienttools*.exe - name: Upload LN Assets - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 with: allowUpdates: true generateReleaseNotes: false @@ -572,7 +572,7 @@ jobs: - name: Upload error logs if: ${{ failure() || cancelled() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.os }}-logs path: ./build/**/*.log @@ -588,14 +588,14 @@ jobs: echo "${{ toJSON(needs.preamble.outputs) }})" - name: Checkout HPCC-Platform - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: ${{ needs.preamble.outputs.community_ref }} submodules: recursive path: ./HPCC-Platform - name: Checkout ECLIDE - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ${{ github.repository_owner }}/ECLIDE ref: ${{ needs.preamble.outputs.eclide_ref }} diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index cef3b61a380..7c5090750b6 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -86,14 +86,14 @@ jobs: df -h - name: Checkout HPCC-Platform - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive path: ${{ github.workspace }}/HPCC-Platform - name: Checkout LN if: ${{ inputs.ln == true }} - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ${{ github.repository_owner }}/LN token: ${{ secrets.LNB_TOKEN }} diff --git a/.github/workflows/build-gh_runner.yml b/.github/workflows/build-gh_runner.yml index 2b352e2cb99..fbd791f9115 100644 --- a/.github/workflows/build-gh_runner.yml +++ b/.github/workflows/build-gh_runner.yml @@ -135,14 +135,14 @@ jobs: ${{ !contains(inputs.os, 'windows') && 'sudo' || '' }} rm -rf "$VCPKG_INSTALLATION_ROOT" - name: Checkout HPCC-Platform - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive path: ${{ github.workspace }}/HPCC-Platform - name: Checkout LN if: ${{ inputs.ln == true }} - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: ${{ github.repository_owner }}/LN token: ${{ secrets.LNB_TOKEN }} diff --git a/.github/workflows/build-test-eclwatch.yml b/.github/workflows/build-test-eclwatch.yml index 9b11256a0a9..1fe1b19c5fb 100644 --- a/.github/workflows/build-test-eclwatch.yml +++ b/.github/workflows/build-test-eclwatch.yml @@ -32,10 +32,10 @@ jobs: if: ${{ needs.pre_job.outputs.eclwatch }} runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: submodules: "recursive" - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} - name: Install Dependencies diff --git a/.github/workflows/codeql-eclwatch.yml b/.github/workflows/codeql-eclwatch.yml index 14a0635f3d4..2b34ca1ae87 100644 --- a/.github/workflows/codeql-eclwatch.yml +++ b/.github/workflows/codeql-eclwatch.yml @@ -51,11 +51,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -80,4 +80,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index f5a8dfd8bf9..96e5050710c 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -14,10 +14,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 16 diff --git a/.github/workflows/jirabot.yml b/.github/workflows/jirabot.yml index 7ee726192de..c561bcca098 100644 --- a/.github/workflows/jirabot.yml +++ b/.github/workflows/jirabot.yml @@ -14,7 +14,7 @@ jobs: jirabot: runs-on: ubuntu-20.04 steps: - - uses: "actions/setup-python@v2" + - uses: "actions/setup-python@v5" with: python-version: "3.8" - name: "Install dependencies" diff --git a/.github/workflows/nightly-publish.yml b/.github/workflows/nightly-publish.yml index 3aab3451a45..859b9d82f74 100644 --- a/.github/workflows/nightly-publish.yml +++ b/.github/workflows/nightly-publish.yml @@ -14,7 +14,7 @@ jobs: run: | echo "::set-output name=date::$(date +'%Y-%m-%d')" - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Build uses: ./dockerfiles with: diff --git a/.github/workflows/test-eclhelper.yml b/.github/workflows/test-eclhelper.yml index e6e9106ff8a..6e89251d06c 100644 --- a/.github/workflows/test-eclhelper.yml +++ b/.github/workflows/test-eclhelper.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout pr - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 1 - name: Fetch base diff --git a/.github/workflows/test-helm.yml b/.github/workflows/test-helm.yml index f25bb5c33db..b0cc9d8f556 100644 --- a/.github/workflows/test-helm.yml +++ b/.github/workflows/test-helm.yml @@ -40,7 +40,7 @@ jobs: needs: pre_job if: ${{ github.repository == 'hpcc-systems/HPCC-Platform' && needs.pre_job.outputs.helm }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: submodules: false - uses: azure/setup-helm@v3 diff --git a/.github/workflows/test-regression-suite-k8s.yml b/.github/workflows/test-regression-suite-k8s.yml index 1d86e1033ac..0802aa137a2 100644 --- a/.github/workflows/test-regression-suite-k8s.yml +++ b/.github/workflows/test-regression-suite-k8s.yml @@ -32,7 +32,7 @@ jobs: runs-on: ${{ inputs.os }} steps: - name: Checkout PR - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive path: ./HPCC-Platform diff --git a/esp/src/CMakeLists.txt b/esp/src/CMakeLists.txt index e53f58d64d5..ec67a55e5ed 100644 --- a/esp/src/CMakeLists.txt +++ b/esp/src/CMakeLists.txt @@ -249,7 +249,6 @@ set ( SRCS ${CMAKE_CURRENT_BINARY_DIR}/src/ESPActivity.ts ${CMAKE_CURRENT_BINARY_DIR}/src/ESPBase.ts ${CMAKE_CURRENT_BINARY_DIR}/src/ESPDFUWorkunit.ts - ${CMAKE_CURRENT_BINARY_DIR}/src/ESPGraph.ts ${CMAKE_CURRENT_BINARY_DIR}/src/ESPLogicalFile.ts ${CMAKE_CURRENT_BINARY_DIR}/src/ESPPackageProcess.ts ${CMAKE_CURRENT_BINARY_DIR}/src/ESPPreflight.ts diff --git a/esp/src/eclwatch/JSGraphWidget.js b/esp/src/eclwatch/JSGraphWidget.js index 2898989eb35..b5d1ace9798 100755 --- a/esp/src/eclwatch/JSGraphWidget.js +++ b/esp/src/eclwatch/JSGraphWidget.js @@ -6,17 +6,17 @@ define([ "dojo/Evented", "@hpcc-js/common", + "@hpcc-js/comms", "@hpcc-js/graph", "@hpcc-js/layout", "hpcc/GraphWidget", - "src/ESPGraph", "src/Utility", "css!font-awesome/css/font-awesome.css" ], function (declare, lang, nlsHPCCMod, arrayUtil, Evented, - hpccCommon, hpccGraph, hpccLayout, - GraphWidget, ESPGraph, Utility) { + hpccCommon, hpccComms, hpccGraph, hpccLayout, + GraphWidget, Utility) { var nlsHPCC = nlsHPCCMod.default; var faCharFactory = function (kind) { @@ -69,7 +69,7 @@ define([ KeyState_Menu: 4, constructor: function (domNode) { - this.graphData = new ESPGraph.Graph(); + this.graphData = new hpccComms.QueryGraph(); this.graphWidget = new hpccGraph.Graph() .allowDragging(false) .showToolbar(false) @@ -471,7 +471,7 @@ define([ return declare("JSGraphWidget", [GraphWidget], { baseClass: "JSGraphWidget", constructor: function () { - this.graphData = new ESPGraph.Graph(); + this.graphData = new hpccComms.QueryGraph(); }, hasOptions: function (key, val) { diff --git a/esp/src/package-lock.json b/esp/src/package-lock.json index 8d842746ad2..db159efad02 100644 --- a/esp/src/package-lock.json +++ b/esp/src/package-lock.json @@ -9,18 +9,18 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@fluentui/react": "8.115.1", - "@fluentui/react-components": "9.46.0", - "@fluentui/react-experiments": "8.14.128", + "@fluentui/react": "8.115.6", + "@fluentui/react-components": "9.46.4", + "@fluentui/react-experiments": "8.14.133", "@fluentui/react-hooks": "8.6.36", - "@fluentui/react-icons-mdl2": "1.3.56", - "@fluentui/react-migration-v8-v9": "9.5.4", + "@fluentui/react-icons-mdl2": "1.3.57", + "@fluentui/react-migration-v8-v9": "9.5.8", "@hpcc-js/chart": "2.81.10", "@hpcc-js/codemirror": "2.61.2", "@hpcc-js/common": "2.71.15", - "@hpcc-js/comms": "2.89.0", + "@hpcc-js/comms": "2.90.0", "@hpcc-js/dataflow": "8.1.6", - "@hpcc-js/eclwatch": "2.73.36", + "@hpcc-js/eclwatch": "2.73.37", "@hpcc-js/graph": "2.85.11", "@hpcc-js/html": "2.42.16", "@hpcc-js/layout": "2.49.15", @@ -46,9 +46,9 @@ "query-string": "7.1.3", "react": "17.0.2", "react-dom": "17.0.2", - "react-hook-form": "7.49.3", + "react-hook-form": "7.50.1", "react-hot-toast": "2.4.1", - "react-reflex": "4.2.1", + "react-reflex": "4.2.5", "react-sizeme": "3.0.2", "universal-router": "9.2.0", "xstyle": "0.3.3" @@ -58,10 +58,10 @@ "@types/dojo": "1.9.48", "@types/react": "17.0.75", "@types/react-dom": "17.0.25", - "@typescript-eslint/eslint-plugin": "6.19.1", - "@typescript-eslint/parser": "6.19.1", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "copyfiles": "2.4.1", - "css-loader": "6.9.1", + "css-loader": "6.10.0", "dojo-webpack-plugin": "3.0.6", "eslint": "8.56.0", "eslint-plugin-eclwatch": "file:./eslint", @@ -76,7 +76,7 @@ "tslib": "2.6.2", "typescript": "5.3.3", "url-loader": "4.1.1", - "webpack": "5.90.0", + "webpack": "5.90.1", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1" } @@ -271,33 +271,6 @@ "tslib": "^2.1.0" } }, - "node_modules/@fluentui/fluent2-theme/node_modules/@fluentui/react": { - "version": "8.115.5", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.115.5.tgz", - "integrity": "sha512-/Dmtf52r1pd2tbJ6NqbC65Zs+V/lOharui2uTtc0GxaMr3QREUWUkojtxKFwLVHqCrO1NzcIZm6siqR4z6ucRw==", - "dependencies": { - "@fluentui/date-time-utilities": "^8.5.16", - "@fluentui/font-icons-mdl2": "^8.5.32", - "@fluentui/foundation-legacy": "^8.2.52", - "@fluentui/merge-styles": "^8.5.15", - "@fluentui/react-focus": "^8.8.40", - "@fluentui/react-hooks": "^8.6.36", - "@fluentui/react-portal-compat-context": "^9.0.11", - "@fluentui/react-window-provider": "^2.2.18", - "@fluentui/set-version": "^8.2.14", - "@fluentui/style-utilities": "^8.10.3", - "@fluentui/theme": "^2.6.41", - "@fluentui/utilities": "^8.13.24", - "@microsoft/load-themed-styles": "^1.10.26", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@types/react": ">=16.8.0 <19.0.0", - "@types/react-dom": ">=16.8.0 <19.0.0", - "react": ">=16.8.0 <19.0.0", - "react-dom": ">=16.8.0 <19.0.0" - } - }, "node_modules/@fluentui/font-icons-mdl2": { "version": "8.5.32", "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.32.tgz", @@ -359,20 +332,20 @@ } }, "node_modules/@fluentui/react": { - "version": "8.115.1", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.115.1.tgz", - "integrity": "sha512-ffDEOTmP60Rwpf9Lyw7jUXDZSGWqQsR2DPhmDlBzgrOLoNgr/0QP+EZb2lOiUl62k6VQl0NO3YeNFSptIvYM2A==", + "version": "8.115.6", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.115.6.tgz", + "integrity": "sha512-lao6u6AfA9uE+jWsmmRriCYXlQ9IU3W2jlapJiOJGyQvF9JGdVCyKDi2w4dIvsJyhA4ucfcKqg+9EgyrgbWcNg==", "dependencies": { "@fluentui/date-time-utilities": "^8.5.16", - "@fluentui/font-icons-mdl2": "^8.5.31", - "@fluentui/foundation-legacy": "^8.2.51", + "@fluentui/font-icons-mdl2": "^8.5.32", + "@fluentui/foundation-legacy": "^8.2.52", "@fluentui/merge-styles": "^8.5.15", - "@fluentui/react-focus": "^8.8.39", + "@fluentui/react-focus": "^8.8.40", "@fluentui/react-hooks": "^8.6.36", "@fluentui/react-portal-compat-context": "^9.0.11", "@fluentui/react-window-provider": "^2.2.18", "@fluentui/set-version": "^8.2.14", - "@fluentui/style-utilities": "^8.10.2", + "@fluentui/style-utilities": "^8.10.3", "@fluentui/theme": "^2.6.41", "@fluentui/utilities": "^8.13.24", "@microsoft/load-themed-styles": "^1.10.26", @@ -410,17 +383,17 @@ } }, "node_modules/@fluentui/react-alert": { - "version": "9.0.0-beta.105", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.105.tgz", - "integrity": "sha512-poLnP41rjBu2nA14GUlj2MslNhF/Wyc1+LUUCcqSDgrF61uqSRe8QkHih2beRZ/kMg1ArnafFS0k7wSLO27zkg==", + "version": "9.0.0-beta.109", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.109.tgz", + "integrity": "sha512-Cy+ZIukM0E/JEjMHGwZJd0t/SnN/o8hvofogedzKkPedFzhT1Enb5gQp9kZZKPHu/aY7CIHdeDN/V4bPvECh/w==", "dependencies": { - "@fluentui/react-avatar": "^9.6.10", - "@fluentui/react-button": "^9.3.66", + "@fluentui/react-avatar": "^9.6.14", + "@fluentui/react-button": "^9.3.68", "@fluentui/react-icons": "^2.0.224", - "@fluentui/react-jsx-runtime": "^9.0.28", - "@fluentui/react-tabster": "^9.17.4", + "@fluentui/react-jsx-runtime": "^9.0.29", + "@fluentui/react-tabster": "^9.19.0", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-utilities": "^9.17.0", + "@fluentui/react-utilities": "^9.18.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -614,60 +587,60 @@ } }, "node_modules/@fluentui/react-components": { - "version": "9.46.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.46.0.tgz", - "integrity": "sha512-n8hftI4+zIrg3uE/oGUpG/jdNUZNeUAm+8CUtKtaU3e6/A4yBWBQkO0IAYuoo4anl5AmSa2RLHoQwEr4neQScw==", - "dependencies": { - "@fluentui/react-accordion": "^9.3.39", - "@fluentui/react-alert": "9.0.0-beta.105", - "@fluentui/react-aria": "^9.8.0", - "@fluentui/react-avatar": "^9.6.10", - "@fluentui/react-badge": "^9.2.23", - "@fluentui/react-breadcrumb": "^9.0.12", - "@fluentui/react-button": "^9.3.66", - "@fluentui/react-card": "^9.0.65", - "@fluentui/react-checkbox": "^9.2.9", - "@fluentui/react-combobox": "^9.7.1", - "@fluentui/react-dialog": "^9.9.8", - "@fluentui/react-divider": "^9.2.59", - "@fluentui/react-drawer": "^9.1.2", - "@fluentui/react-field": "^9.1.51", - "@fluentui/react-image": "^9.1.56", - "@fluentui/react-infobutton": "9.0.0-beta.89", - "@fluentui/react-infolabel": "^9.0.17", - "@fluentui/react-input": "^9.4.61", - "@fluentui/react-label": "^9.1.59", - "@fluentui/react-link": "^9.2.8", - "@fluentui/react-menu": "^9.12.46", - "@fluentui/react-message-bar": "^9.0.17", - "@fluentui/react-overflow": "^9.1.9", - "@fluentui/react-persona": "^9.2.69", - "@fluentui/react-popover": "^9.8.34", - "@fluentui/react-portal": "^9.4.11", - "@fluentui/react-positioning": "^9.12.5", - "@fluentui/react-progress": "^9.1.61", - "@fluentui/react-provider": "^9.13.9", - "@fluentui/react-radio": "^9.2.4", - "@fluentui/react-select": "^9.1.61", + "version": "9.46.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.46.4.tgz", + "integrity": "sha512-NSJsPaOKOzcbyn4v+AkSsNMoTvAv+9cmi6UuvTy070Vd2NXQQ3UOHSNHUH1RF0Y0bhPNSXrSqRP1lefyCU05qA==", + "dependencies": { + "@fluentui/react-accordion": "^9.3.41", + "@fluentui/react-alert": "9.0.0-beta.109", + "@fluentui/react-aria": "^9.8.2", + "@fluentui/react-avatar": "^9.6.14", + "@fluentui/react-badge": "^9.2.24", + "@fluentui/react-breadcrumb": "^9.0.14", + "@fluentui/react-button": "^9.3.68", + "@fluentui/react-card": "^9.0.67", + "@fluentui/react-checkbox": "^9.2.12", + "@fluentui/react-combobox": "^9.7.5", + "@fluentui/react-dialog": "^9.9.10", + "@fluentui/react-divider": "^9.2.60", + "@fluentui/react-drawer": "^9.1.4", + "@fluentui/react-field": "^9.1.53", + "@fluentui/react-image": "^9.1.57", + "@fluentui/react-infobutton": "9.0.0-beta.93", + "@fluentui/react-infolabel": "^9.0.21", + "@fluentui/react-input": "^9.4.63", + "@fluentui/react-label": "^9.1.61", + "@fluentui/react-link": "^9.2.10", + "@fluentui/react-menu": "^9.12.50", + "@fluentui/react-message-bar": "^9.0.19", + "@fluentui/react-overflow": "^9.1.10", + "@fluentui/react-persona": "^9.2.73", + "@fluentui/react-popover": "^9.8.38", + "@fluentui/react-portal": "^9.4.13", + "@fluentui/react-positioning": "^9.13.3", + "@fluentui/react-progress": "^9.1.63", + "@fluentui/react-provider": "^9.13.11", + "@fluentui/react-radio": "^9.2.7", + "@fluentui/react-select": "^9.1.63", "@fluentui/react-shared-contexts": "^9.14.0", - "@fluentui/react-skeleton": "^9.0.49", - "@fluentui/react-slider": "^9.1.66", - "@fluentui/react-spinbutton": "^9.2.61", - "@fluentui/react-spinner": "^9.3.39", - "@fluentui/react-switch": "^9.1.66", - "@fluentui/react-table": "^9.11.6", - "@fluentui/react-tabs": "^9.4.7", - "@fluentui/react-tabster": "^9.17.4", - "@fluentui/react-tags": "^9.0.23", - "@fluentui/react-text": "^9.4.8", - "@fluentui/react-textarea": "^9.3.61", + "@fluentui/react-skeleton": "^9.0.51", + "@fluentui/react-slider": "^9.1.69", + "@fluentui/react-spinbutton": "^9.2.63", + "@fluentui/react-spinner": "^9.3.41", + "@fluentui/react-switch": "^9.1.69", + "@fluentui/react-table": "^9.11.10", + "@fluentui/react-tabs": "^9.4.9", + "@fluentui/react-tabster": "^9.19.0", + "@fluentui/react-tags": "^9.0.27", + "@fluentui/react-text": "^9.4.9", + "@fluentui/react-textarea": "^9.3.63", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-toast": "^9.3.28", - "@fluentui/react-toolbar": "^9.1.67", - "@fluentui/react-tooltip": "^9.4.12", - "@fluentui/react-tree": "^9.4.26", - "@fluentui/react-utilities": "^9.17.0", - "@fluentui/react-virtualizer": "9.0.0-alpha.67", + "@fluentui/react-toast": "^9.3.30", + "@fluentui/react-toolbar": "^9.1.70", + "@fluentui/react-tooltip": "^9.4.16", + "@fluentui/react-tree": "^9.4.30", + "@fluentui/react-utilities": "^9.18.0", + "@fluentui/react-virtualizer": "9.0.0-alpha.68", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -763,18 +736,18 @@ } }, "node_modules/@fluentui/react-experiments": { - "version": "8.14.128", - "resolved": "https://registry.npmjs.org/@fluentui/react-experiments/-/react-experiments-8.14.128.tgz", - "integrity": "sha512-aqfDEpohDhgfM48aGoikpf2F6wbI3r9sF1cmSdZTn9HG3pJbyOMvP4qWM/VYhTmZCzy1ZDe+6qy4YdMsrLAgnw==", + "version": "8.14.133", + "resolved": "https://registry.npmjs.org/@fluentui/react-experiments/-/react-experiments-8.14.133.tgz", + "integrity": "sha512-lom4QeR1EMQ6+Vp74VuC8cBsg1NW7BzIEPQ0Xz1QfeTlZET/t6IVtYBXG5GdFwrkEol8xDau6HCx0B2fBoupNQ==", "dependencies": { "@fluentui/example-data": "^8.4.15", - "@fluentui/font-icons-mdl2": "^8.5.31", - "@fluentui/foundation-legacy": "^8.2.51", + "@fluentui/font-icons-mdl2": "^8.5.32", + "@fluentui/foundation-legacy": "^8.2.52", "@fluentui/merge-styles": "^8.5.15", - "@fluentui/react": "^8.115.1", + "@fluentui/react": "^8.115.6", "@fluentui/react-hooks": "^8.6.36", "@fluentui/set-version": "^8.2.14", - "@fluentui/style-utilities": "^8.10.2", + "@fluentui/style-utilities": "^8.10.3", "@fluentui/theme": "^2.6.41", "@fluentui/utilities": "^8.13.24", "@microsoft/load-themed-styles": "^1.10.26", @@ -855,11 +828,11 @@ } }, "node_modules/@fluentui/react-icons-mdl2": { - "version": "1.3.56", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.56.tgz", - "integrity": "sha512-3tjyfyS2qSeto0uQYGq/C6IRzSAaDkyfuVqlJ+e/B5o7qpgHEIE3kcX+Nl6aYIZyeR+fFdzrcXe97A9uFK+aaA==", + "version": "1.3.57", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.57.tgz", + "integrity": "sha512-wbIXof+Ll1QMIBq5cZ0HOslXw7ie257FdXVnzaYVWcCt6vqVObdaPlGDKtV53xIFaS/wmKbZB+TqF75vQIQ4lw==", "dependencies": { - "@fluentui/react-icon-provider": "^1.3.52", + "@fluentui/react-icon-provider": "^1.3.53", "@fluentui/set-version": "^8.2.14", "@fluentui/utilities": "^8.13.24", "@microsoft/load-themed-styles": "^1.10.26", @@ -905,17 +878,17 @@ } }, "node_modules/@fluentui/react-infobutton": { - "version": "9.0.0-beta.89", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.89.tgz", - "integrity": "sha512-EKe1wwW/vL23Xj9CViSZdqT4Ywjfg90iA7JXYeRw0qP351+XV+J6WLuMUpGjsF7cURP/XVaH8ekXRv6QyQ+pBw==", + "version": "9.0.0-beta.93", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.93.tgz", + "integrity": "sha512-tlE/M5p//lMpHGhXL9LRq5diEuw+rBtmy53QvM3r6NPevRl525MlxVZOMfTBh1Q+GXOS7kdvjCzlLxyXPVcA9w==", "dependencies": { "@fluentui/react-icons": "^2.0.224", - "@fluentui/react-jsx-runtime": "^9.0.28", - "@fluentui/react-label": "^9.1.59", - "@fluentui/react-popover": "^9.8.34", - "@fluentui/react-tabster": "^9.17.4", + "@fluentui/react-jsx-runtime": "^9.0.29", + "@fluentui/react-label": "^9.1.61", + "@fluentui/react-popover": "^9.8.38", + "@fluentui/react-tabster": "^9.19.0", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-utilities": "^9.17.0", + "@fluentui/react-utilities": "^9.18.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1077,18 +1050,18 @@ } }, "node_modules/@fluentui/react-migration-v8-v9": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-migration-v8-v9/-/react-migration-v8-v9-9.5.4.tgz", - "integrity": "sha512-ygPjiMdrTfnpeP4ORYg688GfxNlaFl0V8NW/+TszvzbNtvxsxVqYfJjFqKjyLc8FYgd6MSqL4f+iOPuwOdd4fg==", + "version": "9.5.8", + "resolved": "https://registry.npmjs.org/@fluentui/react-migration-v8-v9/-/react-migration-v8-v9-9.5.8.tgz", + "integrity": "sha512-w7OvXJvTPaN+/vj7JJdZft8oRKYtRnYgTJAXyqOdCdPrX59muLfQe3eVxUnE5XbG73jGeXiu/7ChakRQX0eNBQ==", "dependencies": { "@ctrl/tinycolor": "3.3.4", - "@fluentui/fluent2-theme": "^8.107.59", - "@fluentui/react": "^8.115.0", - "@fluentui/react-components": "^9.46.0", + "@fluentui/fluent2-theme": "^8.107.63", + "@fluentui/react": "^8.115.4", + "@fluentui/react-components": "^9.46.4", "@fluentui/react-hooks": "^8.6.36", "@fluentui/react-icons": "^2.0.224", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-utilities": "^9.17.0", + "@fluentui/react-utilities": "^9.18.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1697,13 +1670,13 @@ } }, "node_modules/@fluentui/react-virtualizer": { - "version": "9.0.0-alpha.67", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.67.tgz", - "integrity": "sha512-R/zxdlVymbRtZ/yHvd5cO4i9PZAc9u3hvMouJ8DrcTZeuudjEnPfH5svKZgW1h5XY5Oz8LzyWMmISP1oGkYeEw==", + "version": "9.0.0-alpha.68", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.68.tgz", + "integrity": "sha512-01sTPBW1W1FyaJwb1JlV7wyCBBLo+y9NQzPET3LQDJSQ7py1XEd7RL6XPMa/IJ+XbeR8hEPhHEHdtehylliMVw==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.28", + "@fluentui/react-jsx-runtime": "^9.0.29", "@fluentui/react-shared-contexts": "^9.14.0", - "@fluentui/react-utilities": "^9.17.0", + "@fluentui/react-utilities": "^9.18.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, @@ -1869,9 +1842,9 @@ } }, "node_modules/@hpcc-js/comms": { - "version": "2.89.0", - "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.89.0.tgz", - "integrity": "sha512-psnZiZSDMkj2eVbJeq0J+FDlCp4EqvV3bQ9gucXcWm+Qfd1ufitSxzsNnvWrPNn1mdn9UbGAi2OXC19iRYdGyg==", + "version": "2.90.0", + "resolved": "https://registry.npmjs.org/@hpcc-js/comms/-/comms-2.90.0.tgz", + "integrity": "sha512-4t1T/khn4CEwrKmeD39QW3BKT0Np8XjvG/7U8kvP+UlYM+GhlCQUVwG6dnfqZG2xqc284YlA6pjenSb4d3hJng==", "dependencies": { "@hpcc-js/ddl-shim": "^2.20.6", "@hpcc-js/util": "^2.50.6", @@ -1946,13 +1919,13 @@ } }, "node_modules/@hpcc-js/eclwatch": { - "version": "2.73.36", - "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.73.36.tgz", - "integrity": "sha512-0cozElrVMGFKuHRniCb12nYy84+LC4vKqTx8v1+BenTrIOo1WPSEclT8e6OrMqFGNro8/zasbc5JCKS4xMtEhw==", + "version": "2.73.37", + "resolved": "https://registry.npmjs.org/@hpcc-js/eclwatch/-/eclwatch-2.73.37.tgz", + "integrity": "sha512-ukZmP2ILDsUUIWskSrstl8/zsHd6qunOlKT7YNr9a/UGc5wG9f1ffQTRMBII9z8LfkXA4cyXAl+onWWHKmkNnQ==", "dependencies": { "@hpcc-js/codemirror": "^2.61.2", "@hpcc-js/common": "^2.71.15", - "@hpcc-js/comms": "^2.89.0", + "@hpcc-js/comms": "^2.90.0", "@hpcc-js/dgrid": "^2.32.16", "@hpcc-js/graph": "^2.85.11", "@hpcc-js/layout": "^2.49.15", @@ -3190,9 +3163,9 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, "node_modules/@types/send": { @@ -3248,16 +3221,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz", - "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/type-utils": "6.19.1", - "@typescript-eslint/utils": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3283,15 +3256,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz", - "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -3311,13 +3284,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz", - "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3328,13 +3301,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz", - "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.1", - "@typescript-eslint/utils": "6.19.1", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3355,9 +3328,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz", - "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3368,13 +3341,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz", - "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/visitor-keys": "6.19.1", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3420,17 +3393,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz", - "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.19.1", - "@typescript-eslint/types": "6.19.1", - "@typescript-eslint/typescript-estree": "6.19.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -3445,12 +3418,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz", - "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.19.1", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4769,9 +4742,9 @@ "peer": true }, "node_modules/css-loader": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", - "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", @@ -4791,7 +4764,16 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/cssesc": { @@ -9301,12 +9283,11 @@ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, "node_modules/react-hook-form": { - "version": "7.49.3", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.3.tgz", - "integrity": "sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ==", + "version": "7.50.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.50.1.tgz", + "integrity": "sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ==", "engines": { - "node": ">=18", - "pnpm": "8" + "node": ">=12.22.0" }, "funding": { "type": "opencollective", @@ -9337,9 +9318,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-reflex": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/react-reflex/-/react-reflex-4.2.1.tgz", - "integrity": "sha512-6Dqap3po7mni4pDDy2MIJ3+qpHZK9fDqOCJhozZaiRIAI0aIX9912fhwZJxikAR3P35YbNwJkyY7L5Xnr9JUcw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/react-reflex/-/react-reflex-4.2.5.tgz", + "integrity": "sha512-Plehgp8CcF2XXuD7DjLFZJEuuV2A63D9JOEfB5cIlh4p1oo+WPGpui/0q6qLFPyJfDpGh6QeV00WY1ziCd/+AQ==", "dependencies": { "@babel/runtime": "^7.0.0", "lodash.throttle": "^4.1.1", @@ -11330,9 +11311,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.90.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", - "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", + "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", diff --git a/esp/src/package.json b/esp/src/package.json index 76fb676b12c..63b7a7e44cc 100644 --- a/esp/src/package.json +++ b/esp/src/package.json @@ -35,18 +35,18 @@ }, "main": "src/stub.js", "dependencies": { - "@fluentui/react": "8.115.1", - "@fluentui/react-components": "9.46.0", - "@fluentui/react-experiments": "8.14.128", + "@fluentui/react": "8.115.6", + "@fluentui/react-components": "9.46.4", + "@fluentui/react-experiments": "8.14.133", "@fluentui/react-hooks": "8.6.36", - "@fluentui/react-icons-mdl2": "1.3.56", - "@fluentui/react-migration-v8-v9": "9.5.4", + "@fluentui/react-icons-mdl2": "1.3.57", + "@fluentui/react-migration-v8-v9": "9.5.8", "@hpcc-js/chart": "2.81.10", "@hpcc-js/codemirror": "2.61.2", "@hpcc-js/common": "2.71.15", - "@hpcc-js/comms": "2.89.0", + "@hpcc-js/comms": "2.90.0", "@hpcc-js/dataflow": "8.1.6", - "@hpcc-js/eclwatch": "2.73.36", + "@hpcc-js/eclwatch": "2.73.37", "@hpcc-js/graph": "2.85.11", "@hpcc-js/html": "2.42.16", "@hpcc-js/layout": "2.49.15", @@ -72,9 +72,9 @@ "octokit": "3.1.2", "react": "17.0.2", "react-dom": "17.0.2", - "react-hook-form": "7.49.3", + "react-hook-form": "7.50.1", "react-hot-toast": "2.4.1", - "react-reflex": "4.2.1", + "react-reflex": "4.2.5", "react-sizeme": "3.0.2", "universal-router": "9.2.0", "xstyle": "0.3.3" @@ -84,10 +84,10 @@ "@types/dojo": "1.9.48", "@types/react": "17.0.75", "@types/react-dom": "17.0.25", - "@typescript-eslint/eslint-plugin": "6.19.1", - "@typescript-eslint/parser": "6.19.1", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", "copyfiles": "2.4.1", - "css-loader": "6.9.1", + "css-loader": "6.10.0", "dojo-webpack-plugin": "3.0.6", "eslint": "8.56.0", "eslint-plugin-eclwatch": "file:./eslint", @@ -102,7 +102,7 @@ "tslib": "2.6.2", "typescript": "5.3.3", "url-loader": "4.1.1", - "webpack": "5.90.0", + "webpack": "5.90.1", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1" }, diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index c63fba07376..cfb5286a2a0 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -11,7 +11,7 @@ import { compare, scopedLogger } from "@hpcc-js/util"; import nlsHPCC from "src/nlsHPCC"; import { WUTimelinePatched } from "src/Timings"; import * as Utility from "src/Utility"; -import { FetchStatus, useMetricsOptions, useWorkunitMetrics, MetricsOptions as MetricsOptionsT } from "../hooks/metrics"; +import { FetchStatus, useMetricsOptions, useWUQueryMetrics, MetricsOptions as MetricsOptionsT } from "../hooks/metrics"; import { HolyGrail } from "../layouts/HolyGrail"; import { AutosizeComponent, AutosizeHpccJSComponent } from "../layouts/HpccJSAdapter"; import { DockPanel, DockPanelItem, ResetableDockPanel } from "../layouts/DockPanel"; @@ -131,12 +131,16 @@ class TableEx extends Table { interface MetricsProps { wuid: string; + querySet?: string; + queryId?: string; parentUrl?: string; selection?: string; } export const Metrics: React.FunctionComponent = ({ wuid, + querySet = "", + queryId = "", parentUrl = `/workunits/${wuid}/metrics`, selection }) => { @@ -145,7 +149,7 @@ export const Metrics: React.FunctionComponent = ({ const [selectedMetricsSource, setSelectedMetricsSource] = React.useState<"" | "scopesTable" | "metricGraphWidget" | "hotspot" | "reset">(""); const [selectedMetrics, setSelectedMetrics] = React.useState([]); const [selectedMetricsPtr, setSelectedMetricsPtr] = React.useState(-1); - const [metrics, columns, _activities, _properties, _measures, _scopeTypes, fetchStatus, refresh] = useWorkunitMetrics(wuid); + const [metrics, columns, _activities, _properties, _measures, _scopeTypes, fetchStatus, refresh] = useWUQueryMetrics(wuid, querySet, queryId); const [showMetricOptions, setShowMetricOptions] = React.useState(false); const [options, setOptions, saveOptions] = useMetricsOptions(); const [dockpanel, setDockpanel] = React.useState(); @@ -184,8 +188,8 @@ export const Metrics: React.FunctionComponent = ({ const onHotspot = React.useCallback(() => { setSelectedMetricsSource("hotspot"); - pushUrl(`/workunits/${wuid}/metrics/${selection}`); - }, [wuid, selection]); + pushUrl(`${parentUrl}/${selection}`); + }, [parentUrl, selection]); // Timeline --- const timeline = useConst(() => new WUTimelinePatched() diff --git a/esp/src/src-react/components/QueryDetails.tsx b/esp/src/src-react/components/QueryDetails.tsx index 40b7b97061d..af9ef819876 100644 --- a/esp/src/src-react/components/QueryDetails.tsx +++ b/esp/src/src-react/components/QueryDetails.tsx @@ -18,19 +18,18 @@ interface QueryDetailsProps { querySet: string; queryId: string; tab?: string; - metricsTab?: string; - metricsState?: string; - testTab?: string; + state?: { metricsTab?: string, metricsState?: string, testTab?: string }; + queryParams?: { metricsSelection?: string }; } export const QueryDetails: React.FunctionComponent = ({ querySet, queryId, tab = "summary", - metricsTab, - metricsState, - testTab = "form" + state = {}, + queryParams = {} }) => { + state.testTab = state.testTab ?? "Form"; const [query, setQuery] = React.useState(); const [wuid, setWuid] = React.useState(""); @@ -54,13 +53,13 @@ export const QueryDetails: React.FunctionComponent = ({ const onTabSelect = React.useCallback((tab: TabInfo) => { switch (tab.id) { case "testPages": - pushUrl(tab.__state ?? `/queries/${querySet}/${queryId}/testPages/${testTab}`); + pushUrl(tab.__state ?? `/queries/${querySet}/${queryId}/testPages/${state.testTab}`); break; default: pushUrl(tab.__state ?? `/queries/${querySet}/${queryId}/${tab.id}`); break; } - }, [queryId, querySet, testTab]); + }, [queryId, querySet, state.testTab]); const tabs = React.useMemo((): TabInfo[] => { return [{ @@ -119,13 +118,13 @@ export const QueryDetails: React.FunctionComponent = ({ - + - + }; diff --git a/esp/src/src-react/components/QueryMetrics.tsx b/esp/src/src-react/components/QueryMetrics.tsx index 6ff47102061..24d3cb8e784 100644 --- a/esp/src/src-react/components/QueryMetrics.tsx +++ b/esp/src/src-react/components/QueryMetrics.tsx @@ -1,11 +1,10 @@ import * as React from "react"; -import { Pivot, PivotItem } from "@fluentui/react"; import { SizeMe } from "react-sizeme"; import nlsHPCC from "src/nlsHPCC"; import { useQuerySnapshots } from "../hooks/query"; -import { pivotItemStyle } from "../layouts/pivot"; import { pushUrl } from "../util/history"; import { Metrics } from "./Metrics"; +import { DelayLoadedPanel, OverflowTabList, TabInfo } from "./controls/TabbedPanes/index"; interface QueryMetricsProps { wuid: string; @@ -19,34 +18,43 @@ export const QueryMetrics: React.FunctionComponent = ({ wuid, querySet, queryId, - tab = wuid, + tab = "statistics", selection }) => { const [snapshots, _refresh] = useQuerySnapshots(querySet, queryId); + const onTabSelect = React.useCallback((tab: TabInfo) => { + pushUrl(tab.__state ?? `/queries/${querySet}/${queryId}/metrics/${tab.id}`); + }, [queryId, querySet]); + + const tabs = React.useMemo((): TabInfo[] => { + const retVal = [{ + id: "statistics", + label: nlsHPCC.Statistics, + }]; + snapshots?.filter(snapshot => snapshot.Wuid !== wuid).forEach(snapshot => { + retVal.push({ + id: snapshot.Wuid, + label: snapshot.Wuid + }); + }); + return retVal; + }, [snapshots, wuid]); + return {({ size }) => - { - pushUrl(`/queries/${querySet}/${queryId}/metrics/${evt.props.itemKey}`); - }}> - { - (wuid && snapshots) ? - - - : - undefined - } +
+ + + + { - (wuid && snapshots) ? - snapshots?.filter(snapshot => snapshot.Wuid !== wuid).map(snapshot => { - return - - ; - }) : - undefined + snapshots?.filter(snapshot => snapshot.Wuid !== wuid).map(snapshot => { + return + + ; + }) } - +
}
; }; \ No newline at end of file diff --git a/esp/src/src-react/hooks/metrics.ts b/esp/src/src-react/hooks/metrics.ts index 1611b21896e..10f6d8b44b4 100644 --- a/esp/src/src-react/hooks/metrics.ts +++ b/esp/src/src-react/hooks/metrics.ts @@ -1,10 +1,11 @@ import * as React from "react"; import { useConst, useForceUpdate } from "@fluentui/react-hooks"; import { WUDetails, WUDetailsMeta, WorkunitsService, IScope } from "@hpcc-js/comms"; +import { scopedLogger } from "@hpcc-js/util"; import { userKeyValStore } from "src/KeyValStore"; import { useWorkunit } from "./workunit"; +import { useQuery } from "./query"; import { useCounter } from "./util"; -import { scopedLogger } from "@hpcc-js/util"; const logger = scopedLogger("src-react\hooks\metrics.ts"); @@ -170,3 +171,76 @@ export function useWorkunitMetrics( return [data, columns, activities, properties, measures, scopeTypes, status, increment]; } + +export function useQueryMetrics( + querySet: string, + queryId: string, + scopeFilter: WUDetails.RequestNS.ScopeFilter = scopeFilterDefault, + nestedFilter: WUDetails.RequestNS.NestedFilter = nestedFilterDefault +): [IScope[], { [id: string]: any }, WUDetailsMeta.Activity[], WUDetailsMeta.Property[], string[], string[], FetchStatus, () => void] { + + const [query, state, _refresh] = useQuery(querySet, queryId); + const [data, setData] = React.useState([]); + const [columns, setColumns] = React.useState<{ [id: string]: any }>([]); + const [activities, setActivities] = React.useState([]); + const [properties, setProperties] = React.useState([]); + const [measures, setMeasures] = React.useState([]); + const [scopeTypes, setScopeTypes] = React.useState([]); + const [status, setStatus] = React.useState(FetchStatus.COMPLETE); + const [count, increment] = useCounter(); + + React.useEffect(() => { + setStatus(FetchStatus.STARTED); + query?.fetchDetailsNormalized({ + ScopeFilter: scopeFilter, + NestedFilter: nestedFilter, + PropertiesToReturn: { + AllScopes: true, + AllAttributes: true, + AllProperties: true, + AllNotes: true, + AllStatistics: true, + AllHints: true + }, + ScopeOptions: { + IncludeId: true, + IncludeScope: true, + IncludeScopeType: true, + IncludeMatchedScopesInResults: true + }, + PropertyOptions: { + IncludeName: true, + IncludeRawValue: true, + IncludeFormatted: true, + IncludeMeasure: true, + IncludeCreator: false, + IncludeCreatorType: false + } + }).then(response => { + setData(response?.data); + setColumns(response?.columns); + setActivities(response?.meta?.Activities?.Activity || []); + setProperties(response?.meta?.Properties?.Property || []); + setMeasures(response?.meta?.Measures?.Measure || []); + setScopeTypes(response?.meta?.ScopeTypes?.ScopeType || []); + }).catch(e => { + logger.error(e); + }).finally(() => { + setStatus(FetchStatus.COMPLETE); + }); + }, [query, state, count, scopeFilter, nestedFilter]); + + return [data, columns, activities, properties, measures, scopeTypes, status, increment]; +} + +export function useWUQueryMetrics( + wuid: string, + querySet: string, + queryId: string, + scopeFilter: WUDetails.RequestNS.ScopeFilter = scopeFilterDefault, + nestedFilter: WUDetails.RequestNS.NestedFilter = nestedFilterDefault +): [IScope[], { [id: string]: any }, WUDetailsMeta.Activity[], WUDetailsMeta.Property[], string[], string[], FetchStatus, () => void] { + const wuMetrics = useWorkunitMetrics(wuid, scopeFilter, nestedFilter); + const queryMetrics = useQueryMetrics(querySet, queryId, scopeFilter, nestedFilter); + return querySet && queryId ? [...queryMetrics] : [...wuMetrics]; +} diff --git a/esp/src/src-react/hooks/query.ts b/esp/src/src-react/hooks/query.ts index 2b43f23028e..7d1444bcacc 100644 --- a/esp/src/src-react/hooks/query.ts +++ b/esp/src/src-react/hooks/query.ts @@ -13,7 +13,7 @@ export function useQuery(querySet: string, queryId: string): UseQueryResponse { const [retVal, setRetVal] = React.useState([undefined, Date.now(), () => Promise.resolve(undefined)]); React.useEffect(() => { - if (querySet === undefined || querySet === null || queryId === undefined || queryId === null) { + if (!querySet || !queryId) { setRetVal([undefined, Date.now(), () => Promise.resolve(undefined)]); return; } diff --git a/esp/src/src-react/routes.tsx b/esp/src/src-react/routes.tsx index 5344fdfcb2b..d5e36af6746 100644 --- a/esp/src/src-react/routes.tsx +++ b/esp/src/src-react/routes.tsx @@ -220,13 +220,13 @@ export const routes: RoutesEx = [ }) }, { - path: "/:QuerySetId/:Id/metrics/:Wuid", action: (ctx, params) => import("./components/QueryDetails").then(_ => { - return <_.QueryDetails querySet={params.QuerySetId as string} queryId={params.Id as string} tab="metrics" metricsTab={params.Wuid as string} />; + path: "/:QuerySetId/:Id/metrics/:MetricsTab", action: (ctx, params) => import("./components/QueryDetails").then(_ => { + return <_.QueryDetails querySet={params.QuerySetId as string} queryId={params.Id as string} tab="metrics" state={{ metricsTab: params.MetricsTab as string }} />; }) }, { - path: "/:QuerySetId/:Id/metrics/:Wuid/:State", action: (ctx, params) => import("./components/QueryDetails").then(_ => { - return <_.QueryDetails querySet={params.QuerySetId as string} queryId={params.Id as string} tab="metrics" metricsTab={params.Wuid as string} metricsState={params.State as string} />; + path: "/:QuerySetId/:Id/metrics/:MetricsTab/:Selection", action: (ctx, params) => import("./components/QueryDetails").then(_ => { + return <_.QueryDetails querySet={params.QuerySetId as string} queryId={params.Id as string} tab="metrics" state={{ metricsTab: params.MetricsTab as string }} queryParams={{ metricsSelection: params.Selection as string }} />; }) }, { @@ -236,7 +236,7 @@ export const routes: RoutesEx = [ }, { path: "/:QuerySetId/:Id/testPages/:Tab", action: (ctx, params) => import("./components/QueryDetails").then(_ => { - return <_.QueryDetails querySet={params.QuerySetId as string} queryId={params.Id as string} tab="testPages" testTab={params.Tab as string} />; + return <_.QueryDetails querySet={params.QuerySetId as string} queryId={params.Id as string} tab="testPages" state={{ testTab: params.Tab as string }} queryParams={{ [params.Tab as string]: parseSearch(ctx.search) as any }} />; }) }, ] diff --git a/esp/src/src/ESPGraph.ts b/esp/src/src/ESPGraph.ts deleted file mode 100644 index c7c4a36404b..00000000000 --- a/esp/src/src/ESPGraph.ts +++ /dev/null @@ -1,684 +0,0 @@ -import * as arrayUtil from "dojo/_base/array"; -import * as declare from "dojo/_base/declare"; - -import * as parser from "dojox/xml/parser"; - -import * as Utility from "./Utility"; - -const GRAPH_TYPE = { - UNKNOWN: 0, - GRAPH: 1, - SUBGRAPH: 2, - VERTEX: 3, - EDGE: 4, - LAST: 5 -}; - -const GRAPH_TYPE_STRING = { - UNKNOWN: "Unknown", - GRAPH: "Graph", - SUBGRAPH: "Cluster", - VERTEX: "Vertex", - EDGE: "Edge", - LAST: "Last" -}; - -const LocalisedXGMMLWriter = declare([], { - constructor(graph) { - this.graph = graph; - - this.m_xgmml = ""; - this.m_visibleSubgraphs = {}; - this.m_visibleVertices = {}; - this.m_semiVisibleVertices = {}; - this.m_visibleEdges = {}; - }, - - calcVisibility(items, localisationDepth, localisationDistance, noSpills) { - this.noSpills = noSpills; - arrayUtil.forEach(items, function (item) { - switch (this.graph.getGlobalType(item)) { - case GRAPH_TYPE.VERTEX: - this.calcInVertexVisibility(item, localisationDistance); - this.calcOutVertexVisibility(item, localisationDistance); - break; - case GRAPH_TYPE.EDGE: - this.calcInVertexVisibility(item.getSource(), localisationDistance - 1); - this.calcOutVertexVisibility(item.getTarget(), localisationDistance - 1); - break; - case GRAPH_TYPE.SUBGRAPH: - this.m_visibleSubgraphs[item.__hpcc_id] = item; - this.calcSubgraphVisibility(item, localisationDepth - 1); - break; - } - }, this); - this.calcVisibility2(); - }, - - calcInVertexVisibility(vertex, localisationDistance) { - if (this.noSpills && vertex.isSpill()) { - localisationDistance++; - } - this.m_visibleVertices[vertex.__hpcc_id] = vertex; - if (localisationDistance > 0) { - arrayUtil.forEach(vertex.getInEdges(), function (edge, idx) { - this.calcInVertexVisibility(edge.getSource(), localisationDistance - 1); - }, this); - } - }, - - calcOutVertexVisibility(vertex, localisationDistance) { - if (this.noSpills && vertex.isSpill()) { - localisationDistance++; - } - this.m_visibleVertices[vertex.__hpcc_id] = vertex; - if (localisationDistance > 0) { - arrayUtil.forEach(vertex.getOutEdges(), function (edge, idx) { - this.calcOutVertexVisibility(edge.getTarget(), localisationDistance - 1); - }, this); - } - }, - - calcSubgraphVisibility(subgraph, localisationDepth) { - if (localisationDepth < 0) { - return; - } - - if (localisationDepth > 0) { - arrayUtil.forEach(subgraph.__hpcc_subgraphs, function (subgraph, idx) { - this.calcSubgraphVisibility(subgraph, localisationDepth - 1); - }, this); - } - - arrayUtil.forEach(subgraph.__hpcc_subgraphs, function (subgraph, idx) { - this.m_visibleSubgraphs[subgraph.__hpcc_id] = subgraph; - }, this); - arrayUtil.forEach(subgraph.__hpcc_vertices, function (vertex, idx) { - this.m_visibleVertices[vertex.__hpcc_id] = vertex; - }, this); - - // Calculate edges that pass through the subgraph --- - const dedupEdges = {}; - arrayUtil.forEach(this.graph.edges, function (edge, idx) { - if (edge.getSource().__hpcc_parent !== edge.getTarget().__hpcc_parent && subgraph === this.getCommonAncestor(edge)) { - // Only include one unique edge between subgraphs --- - if (!dedupEdges[edge.getSource().__hpcc_parent.__hpcc_id + "::" + edge.getTarget().__hpcc_parent.__hpcc_id]) { - dedupEdges[edge.getSource().__hpcc_parent.__hpcc_id + "::" + edge.getTarget().__hpcc_parent.__hpcc_id] = true; - this.m_visibleEdges[edge.__hpcc_id] = edge; - } - } - }, this); - }, - - buildVertexString(vertex, isPoint) { - let attrStr = ""; - let propsStr = ""; - const props = vertex.getProperties(); - for (const key in props) { - if (isPoint && key.indexOf("_kind") >= 0) { - propsStr += ""; - } else if (key === "id" || key === "label") { - attrStr += " " + key + "=\"" + Utility.xmlEncode(props[key]) + "\""; - } else { - propsStr += ""; - } - } - return "" + propsStr + ""; - }, - - buildEdgeString(edge) { - let attrStr = ""; - let propsStr = ""; - const props = edge.getProperties(); - for (const key in props) { - if (key.toLowerCase() === "id" || - key.toLowerCase() === "label" || - key.toLowerCase() === "source" || - key.toLowerCase() === "target") { - attrStr += " " + key + "=\"" + Utility.xmlEncode(props[key]) + "\""; - } else { - propsStr += ""; - } - } - return "" + propsStr + ""; - }, - - getAncestors(v, ancestors) { - let parent = v.__hpcc_parent; - while (parent) { - ancestors.push(parent); - parent = parent.__hpcc_parent; - } - }, - - getCommonAncestorV(v1, v2) { - const v1_ancestors = []; - const v2_ancestors = []; - this.getAncestors(v1, v1_ancestors); - this.getAncestors(v2, v2_ancestors); - let finger1 = v1_ancestors.length - 1; - let finger2 = v2_ancestors.length - 1; - let retVal = null; - while (finger1 >= 0 && finger2 >= 0 && v1_ancestors[finger1] === v2_ancestors[finger2]) { - retVal = v1_ancestors[finger1]; - --finger1; - --finger2; - } - return retVal; - }, - - getCommonAncestor(e) { - return this.getCommonAncestorV(e.getSource(), e.getTarget()); - }, - - calcAncestorVisibility(vertex) { - const ancestors = []; - this.getAncestors(vertex, ancestors); - arrayUtil.forEach(ancestors, function (item, idx) { - this.m_visibleSubgraphs[item.__hpcc_id] = item; - }, this); - }, - - calcVisibility2() { - for (const key in this.m_visibleVertices) { - const vertex = this.m_visibleVertices[key]; - arrayUtil.forEach(vertex.getInEdges(), function (edge, idx) { - this.m_visibleEdges[edge.__hpcc_id] = edge; - }, this); - arrayUtil.forEach(vertex.getOutEdges(), function (edge, idx) { - this.m_visibleEdges[edge.__hpcc_id] = edge; - }, this); - this.calcAncestorVisibility(vertex); - } - this.calcSemiVisibleVertices(); - }, - - addSemiVisibleEdge(edge) { - if (edge && !this.m_visibleEdges[edge.__hpcc_id]) { - this.m_visibleEdges[edge.__hpcc_id] = edge; - } - }, - - addSemiVisibleVertex(vertex) { - if (!this.m_visibleVertices[vertex.__hpcc_id]) { - this.m_semiVisibleVertices[vertex.__hpcc_id] = vertex; - this.calcAncestorVisibility(vertex); - } - }, - - calcSemiVisibleVertices() { - for (const key in this.m_visibleEdges) { - const edge = this.m_visibleEdges[key]; - let source = edge.getSource(); - this.addSemiVisibleVertex(source); - while (this.noSpills && source.isSpill()) { - const inEdges = source.getInEdges(); - if (inEdges.length) { - this.addSemiVisibleEdge(inEdges[0]); - source = inEdges[0].getSource(); - this.addSemiVisibleVertex(source); - } else { - break; - } - } - let target = edge.getTarget(); - this.addSemiVisibleVertex(target); - while (this.noSpills && target.isSpill()) { - const outEdges = target.getOutEdges(); - if (outEdges.length) { - this.addSemiVisibleEdge(outEdges[0]); - target = outEdges[0].getTarget(); - this.addSemiVisibleVertex(target); - } else { - break; - } - } - } - }, - - writeXgmml() { - this.subgraphVisited(this.graph.subgraphs[0], true); - arrayUtil.forEach(this.graph.edges, function (edge, idx) { - this.edgeVisited(edge); - }, this); - }, - - subgraphVisited(subgraph, root) { - if (this.m_visibleSubgraphs[subgraph.__hpcc_id]) { - let propsStr = ""; - this.m_xgmml += root ? "" : ""; - const xgmmlLen = this.m_xgmml.length; - subgraph.walkSubgraphs(this); - subgraph.walkVertices(this); - if (xgmmlLen === this.m_xgmml.length) { - // Add at least one child otherwise subgraphs will render as a vertex --- - const vertex = subgraph.__hpcc_vertices[0]; - if (vertex) { - this.m_xgmml += this.buildVertexString(vertex, true); - } - } - - const props = subgraph.getProperties(); - for (const key in props) { - propsStr += ""; - } - this.m_xgmml += root ? "" : "" + propsStr + ""; - } - return false; - }, - - vertexVisited(vertex) { - if (this.m_visibleVertices[vertex.__hpcc_id]) { - this.m_xgmml += this.buildVertexString(vertex, false); - } else if (this.m_semiVisibleVertices[vertex.__hpcc_id]) { - this.m_xgmml += this.buildVertexString(vertex, true); - } - }, - - edgeVisited(edge) { - if (this.m_visibleEdges[edge.__hpcc_id]) { - this.m_xgmml += this.buildEdgeString(edge); - } - } -}); - -const GraphItem = declare([], { - constructor(graph, id) { - this.__hpcc_graph = graph; - this.__hpcc_id = id; - this._globalID = id; - }, - getProperties() { - const retVal = {}; - for (const key in this) { - if (key.indexOf("__") !== 0 && this.hasOwnProperty(key)) { - retVal[key] = this[key]; - } - } - return retVal; - } -}); - -const Subgraph = declare([GraphItem], { - constructor(graph, id) { - this._globalType = id === "0" ? "Graph" : "Cluster"; - this.__hpcc_subgraphs = []; - this.__hpcc_vertices = []; - this.__hpcc_edges = []; - this.id = id; - }, - - addSubgraph(subgraph) { - subgraph.__hpcc_parent = this; - if (!arrayUtil.some(this.__hpcc_subgraphs, function (subgraph2) { - return subgraph === subgraph2; - })) { - this.__hpcc_subgraphs.push(subgraph); - } - }, - - addVertex(vertex) { - vertex.__hpcc_parent = this; - if (!arrayUtil.some(this.__hpcc_vertices, function (vertex2) { - return vertex === vertex2; - })) { - this.__hpcc_vertices.push(vertex); - } - }, - - removeVertex(vertex) { - this.__hpcc_vertices = arrayUtil.filter(this.__hpcc_vertices, function (vertex2) { - return vertex !== vertex2; - }, this); - }, - - addEdge(edge) { - edge.__hpcc_parent = this; - if (!arrayUtil.some(this.__hpcc_edges, function (edge2) { - return edge === edge2; - })) { - this.__hpcc_edges.push(edge); - } - }, - - removeEdge(edge) { - this.__hpcc_edges = arrayUtil.filter(this.__hpcc_edges, function (edge2) { - return edge !== edge2; - }, this); - }, - - remove() { - arrayUtil.forEach(this.__hpcc_subgraphs, function (subgraph) { - subgraph.__hpcc_parent = this.__hpcc_parent; - }, this); - arrayUtil.forEach(this.__hpcc_vertices, function (vertex) { - vertex.__hpcc_parent = this.__hpcc_parent; - }, this); - arrayUtil.forEach(this.__hpcc_edges, function (edge) { - edge.__hpcc_parent = this.__hpcc_parent; - }, this); - delete this.__hpcc_parent; - this.__hpcc_graph.removeItem(this); - }, - - walkSubgraphs(visitor) { - arrayUtil.forEach(this.__hpcc_subgraphs, function (subgraph, idx) { - if (visitor.subgraphVisited(subgraph)) { - subgraph.walkSubgraphs(visitor); - } - }, this); - }, - - walkVertices(visitor) { - arrayUtil.forEach(this.__hpcc_vertices, function (vertex, idx) { - visitor.vertexVisited(vertex); - }, this); - } -}); - -const Vertex = declare([GraphItem], { - constructor() { - this._globalType = "Vertex"; - }, - - isSpill() { - return this._isSpill; - }, - - remove() { - const inVertices = this.getInVertices(); - if (inVertices.length <= 1) { - console.log(this.__hpcc_id + ": remove only supports single or zero inputs activities..."); - } - arrayUtil.forEach(this.getInEdges(), function (edge) { - edge.remove(); - }, this); - arrayUtil.forEach(this.getOutEdges(), function (edge) { - edge.setSource(inVertices[0]); - }, this); - arrayUtil.forEach(this.subgraphs, function (subgraph) { - subgraph.removeVertex(subgraph); - }, this); - this.__hpcc_graph.removeItem(this); - }, - - getInVertices() { - return arrayUtil.map(this.getInEdges(), function (edge) { - return edge.getSource(); - }, this); - }, - - getInEdges() { - return arrayUtil.filter(this.__hpcc_graph.edges, function (edge) { - return edge.getTarget() === this; - }, this); - }, - - getOutVertices() { - return arrayUtil.map(this.getOutEdges(), function (edge) { - return edge.getTarget(); - }, this); - }, - - getOutEdges() { - return arrayUtil.filter(this.__hpcc_graph.edges, function (edge) { - return edge.getSource() === this; - }, this); - } -}); - -const Edge = declare([GraphItem], { - constructor(graph, id) { - this._globalType = "Edge"; - }, - - remove() { - arrayUtil.forEach(this.__hpcc_graph.subgraphs, function (subgraph) { - subgraph.removeEdge(this); - }, this); - this.__hpcc_graph.removeItem(this); - }, - - getSource() { - return this.__hpcc_graph.idx[this._sourceActivity || this.source]; - }, - - setSource(source) { - if (this._sourceActivity) { - this._sourceActivity = source.__hpcc_id; - } else if (this.source) { - this.source = source.__hpcc_id; - } - if (this.__widget) { - this.__widget.setSource(this.getSource().__widget); - } - }, - - getTarget() { - return this.__hpcc_graph.idx[this._targetActivity || this.target]; - } -}); - -export const Graph = declare([], { - constructor() { - this.clear(); - }, - - clear() { - this.xgmml = ""; - - this.idx = {}; - this.subgraphs = []; - this.vertices = []; - this.edges = []; - }, - - load(xgmml) { - this.clear(); - this.merge(xgmml); - }, - - merge(xgmml) { - this.xgmml = xgmml; - const dom = parser.parse(xgmml); - this.walkDocument(dom.documentElement, "0"); - }, - - getGlobalType(item) { - if (item instanceof Vertex) { - return GRAPH_TYPE.VERTEX; - } else if (item instanceof Edge) { - return GRAPH_TYPE.EDGE; - } else if (item instanceof Subgraph) { - return GRAPH_TYPE.SUBGRAPH; - } else if (item instanceof Graph) { - return GRAPH_TYPE.GRAPH; - } - return GRAPH_TYPE.UNKNOWN; - }, - - getGlobalTypeString(item) { - if (item instanceof Vertex) { - return GRAPH_TYPE_STRING.VERTEX; - } else if (item instanceof Edge) { - return GRAPH_TYPE_STRING.EDGE; - } else if (item instanceof Subgraph) { - return GRAPH_TYPE_STRING.SUBGRAPH; - } else if (item instanceof Graph) { - return GRAPH_TYPE_STRING.GRAPH; - } - return GRAPH_TYPE_STRING.UNKNOWN; - }, - - getItem(docNode, id) { - if (!this.idx[id]) { - switch (docNode.tagName) { - case "graph": - const subgraph = new Subgraph(this, id); - this.subgraphs.push(subgraph); - this.idx[id] = subgraph; - break; - case "node": - const vertex = new Vertex(this, id); - this.vertices.push(vertex); - this.idx[id] = vertex; - break; - case "edge": - const edge = new Edge(this, id); - this.edges.push(edge); - this.idx[id] = edge; - break; - default: - console.log("Graph.getItem - Unknown Node Type!"); - break; - } - } - const retVal = this.idx[id]; - arrayUtil.forEach(docNode.attributes, function (attr, idx) { - retVal[attr.name] = attr.value; - }, this); - return retVal; - }, - - removeItem(item) { - delete this.idx[item.__hpcc_id]; - if (item instanceof Subgraph) { - this.subgraphs = arrayUtil.filter(this.subgraphs, function (subgraph) { - return item !== subgraph; - }, this); - } else if (item instanceof Vertex) { - this.vertices = arrayUtil.filter(this.vertices, function (vertex) { - return item !== vertex; - }, this); - } else if (item instanceof Edge) { - this.edges = arrayUtil.filter(this.edges, function (edge) { - return item !== edge; - }, this); - } - }, - - getChildByTagName(docNode, tagName) { - let retVal = null; - arrayUtil.some(docNode.childNodes, function (childNode, idx) { - if (childNode.tagName === tagName) { - retVal = childNode; - return true; - } - }, this); - return retVal; - }, - - walkDocument(docNode, id) { - const retVal = this.getItem(docNode, id); - arrayUtil.forEach(docNode.childNodes, function (childNode, idx) { - switch (childNode.nodeType) { - case 1: // ELEMENT_NODE - switch (childNode.tagName) { - case "graph": - break; - case "node": - let isSubgraph = false; - const attNode = this.getChildByTagName(childNode, "att"); - if (attNode) { - const graphNode = this.getChildByTagName(attNode, "graph"); - if (graphNode) { - isSubgraph = true; - const subgraph = this.walkDocument(graphNode, childNode.getAttribute("id")); - retVal.addSubgraph(subgraph); - } - } - if (!isSubgraph) { - const vertex = this.walkDocument(childNode, childNode.getAttribute("id")); - retVal.addVertex(vertex); - } - break; - case "att": - const name = childNode.getAttribute("name"); - const value = childNode.getAttribute("value"); - if (name.indexOf("Time") === 0) { - retVal["_" + name] = value; - retVal[name] = "" + Utility.espTime2Seconds(value); - } else if (name.indexOf("Size") === 0) { - retVal["_" + name] = value; - retVal[name] = "" + Utility.espSize2Bytes(value); - } else if (name.indexOf("Skew") === 0) { - retVal["_" + name] = value; - retVal[name] = "" + Utility.espSkew2Number(value); - } else { - retVal[name] = value; - } - break; - case "edge": - const edge = this.walkDocument(childNode, childNode.getAttribute("id")); - if (edge.NumRowsProcessed !== undefined) { - edge._eclwatchCount = edge.NumRowsProcessed.replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } else if (edge.Count !== undefined) { - edge._eclwatchCount = edge.Count.replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } else if (edge.count !== undefined) { - edge._eclwatchCount = edge.count.replace(/\B(?=(\d{3})+(?!\d))/g, ","); - } - if (edge.inputProgress) { - edge._eclwatchInputProgress = "[" + edge.inputProgress.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + "]"; - } - if (edge.SkewMaxRowsProcessed && edge.SkewMinRowsProcessed) { - edge._eclwatchSkew = "+" + edge.SkewMaxRowsProcessed + ", " + edge.SkewMinRowsProcessed; - } - if (edge._dependsOn) { - } else if (edge._childGraph) { - } else if (edge._sourceActivity || edge._targetActivity) { - edge._isSpill = true; - const source = edge.getSource(); - source._isSpill = true; - const target = edge.getTarget(); - target._isSpill = true; - } - retVal.addEdge(edge); - break; - default: - break; - } - break; - case 2: // ATTRIBUTE_NODE - case 3: // TEXT_NODE - case 4: // CDATA_SECTION_NODE - case 5: // ENTITY_REFERENCE_NODE - case 6: // ENTITY_NODE - case 7: // PROCESSING_INSTRUCTION_NODE - case 8: // COMMENT_NODE - case 9: // DOCUMENT_NODE - case 10: // DOCUMENT_TYPE_NODE - case 11: // DOCUMENT_FRAGMENT_NODE - case 12: // NOTATION_NODE - break; - default: - break; - } - }, this); - return retVal; - }, - - removeSubgraphs() { - const subgraphs = arrayUtil.map(this.subgraphs, function (subgraph) { return subgraph; }); - arrayUtil.forEach(subgraphs, function (subgraph) { - if (subgraph.__hpcc_parent instanceof Subgraph) { - subgraph.remove(); - } - }, this); - }, - - removeSpillVertices() { - const vertices = arrayUtil.map(this.vertices, function (vertex) { return vertex; }); - arrayUtil.forEach(vertices, function (vertex) { - if (vertex.isSpill()) { - vertex.remove(); - } - }, this); - }, - - getLocalisedXGMML(items, localisationDepth, localisationDistance, noSpills) { - const xgmmlWriter = new LocalisedXGMMLWriter(this); - xgmmlWriter.calcVisibility(items, localisationDepth, localisationDistance, noSpills); - xgmmlWriter.writeXgmml(); - return "" + xgmmlWriter.m_xgmml + ""; - } -}) as any; diff --git a/esp/src/src/nls/hpcc.ts b/esp/src/src/nls/hpcc.ts index 13bcce618df..cfb38f32e89 100644 --- a/esp/src/src/nls/hpcc.ts +++ b/esp/src/src/nls/hpcc.ts @@ -916,6 +916,7 @@ export = { SuspendedByFirstNode: "Suspended By First Node", SuspendedByUser: "Suspended By User", SuspendedReason: "Suspended Reason", + Statistics: "Statistics", SVGSource: "SVG Source", SyncSelection: "Sync To Selection", SystemServers: "System Servers", diff --git a/esp/src/src/store/Memory.ts b/esp/src/src/store/Memory.ts index 1bec0fee3e6..e3c4b136db7 100644 --- a/esp/src/src/store/Memory.ts +++ b/esp/src/src/store/Memory.ts @@ -70,6 +70,9 @@ export class Memory extends BaseStore { } protected fetchData(request: QueryRequest, options: QueryOptions = {}): ThenableResponse { + if (!options) { + options = {}; + } options.alphanumColumns = this.alphanumSort; const data = this.queryEngine(request, options)(this.data); data.total = this.data.length;