diff --git a/package-lock.json b/package-lock.json index 50e7cec87d..08406e8a65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1706,6 +1706,10 @@ "resolved": "packages/markdown-it-plugins", "link": true }, + "node_modules/@hpcc-js/marshaller": { + "resolved": "packages/marshaller", + "link": true + }, "node_modules/@hpcc-js/observablehq-compiler": { "resolved": "packages/observablehq-compiler", "link": true @@ -10953,9 +10957,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -21720,6 +21724,88 @@ "url": "https://dotenvx.com" } }, + "packages/marshaller": { + "name": "@hpcc-js/marshaller", + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@hpcc-js/chart": "^3.7.5", + "@hpcc-js/codemirror": "^3.7.5", + "@hpcc-js/common": "^3.7.6", + "@hpcc-js/comms": "^3.15.6", + "@hpcc-js/composite": "^3.5.6", + "@hpcc-js/ddl-shim": "^3.3.5", + "@hpcc-js/dgrid": "^3.7.6", + "@hpcc-js/form": "^3.4.5", + "@hpcc-js/graph": "^3.7.5", + "@hpcc-js/layout": "^3.5.11", + "@hpcc-js/map": "^3.5.5", + "@hpcc-js/other": "^3.5.5", + "@hpcc-js/phosphor": "^3.5.5", + "@hpcc-js/util": "^3.5.5" + }, + "devDependencies": { + "@hpcc-js/esbuild-plugins": "^1.8.7", + "d3-array": "^1", + "d3-collection": "^1", + "d3-dsv": "^1", + "d3-fetch": "^1", + "d3-selection": "^1" + } + }, + "packages/marshaller/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "packages/marshaller/node_modules/d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "packages/marshaller/node_modules/d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "d3-dsv": "1" + } + }, + "packages/marshaller/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "packages/observablehq-compiler": { "name": "@hpcc-js/observablehq-compiler", "version": "3.7.9", diff --git a/packages/marshaller/.vscode/launch.json b/packages/marshaller/.vscode/launch.json new file mode 100644 index 0000000000..f7aae05121 --- /dev/null +++ b/packages/marshaller/.vscode/launch.json @@ -0,0 +1,75 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "test-browser", + "type": "msedge", + "request": "launch", + "url": "http://localhost:63315", + "webRoot": "${workspaceFolder}", + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**" + ], + }, + { + "name": "test-node", + "type": "node", + "request": "launch", + "runtimeArgs": [ + "run-script", + "test-node" + ], + "runtimeExecutable": "npm", + "skipFiles": [ + "/**" + ], + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**" + ], + }, + { + "name": "index.html?mode=view", + "request": "launch", + "type": "msedge", + "url": "http://localhost:5520/index.html?mode=view", + "runtimeArgs": [ + "--disable-web-security" + ], + "webRoot": "${workspaceFolder}", + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**" + ] + }, + { + "name": "index.html?mode=edit", + "request": "launch", + "type": "msedge", + "url": "http://localhost:5520/index.html?mode=edit", + "runtimeArgs": [ + "--disable-web-security" + ], + "webRoot": "${workspaceFolder}", + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**" + ] + }, + { + "name": "index-preview.html", + "request": "launch", + "type": "msedge", + "url": "file://${workspaceFolder}/index-preview.html", + "runtimeArgs": [ + "--disable-web-security" + ], + "webRoot": "${workspaceFolder}", + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**" + ] + } + ] +} \ No newline at end of file diff --git a/packages/marshaller/.vscode/tasks.json b/packages/marshaller/.vscode/tasks.json new file mode 100644 index 0000000000..969d843acd --- /dev/null +++ b/packages/marshaller/.vscode/tasks.json @@ -0,0 +1,36 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "gen-types-watch", + "type": "npm", + "script": "gen-types-watch", + "problemMatcher": [ + "$tsc-watch" + ], + "presentation": { + "group": "group-build" + } + }, + { + "label": "bundle-serve", + "type": "npm", + "script": "bundle-serve", + "problemMatcher": [], + "presentation": { + "group": "group-build" + } + }, + { + "label": "build", + "dependsOn": [ + "gen-types-watch", + "bundle-serve", + ], + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} \ No newline at end of file diff --git a/packages/marshaller/CHANGELOG.md b/packages/marshaller/CHANGELOG.md new file mode 100644 index 0000000000..e2b6155f34 --- /dev/null +++ b/packages/marshaller/CHANGELOG.md @@ -0,0 +1,23428 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [2.28.11](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.10...marshaller-v2.28.11) (2026-04-08) + + +### Bug Fixes + +* update dependencies across multiple packages ([#4568](https://github.com/hpcc-systems/Visualization/issues/4568)) ([6862be8](https://github.com/hpcc-systems/Visualization/commit/6862be8f47defb49b541d857c99e7761e3b8685d)), closes [#4569](https://github.com/hpcc-systems/Visualization/issues/4569) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/chart bumped from ^2.86.5 to ^2.86.6 + * @hpcc-js/codemirror bumped from ^2.66.4 to ^2.66.5 + * @hpcc-js/common bumped from ^2.73.5 to ^2.73.6 + * @hpcc-js/comms bumped from ^2.102.4 to ^2.102.5 + * @hpcc-js/composite bumped from ^2.9.8 to ^2.9.9 + * @hpcc-js/dgrid bumped from ^2.34.6 to ^2.34.7 + * @hpcc-js/form bumped from ^2.12.6 to ^2.12.7 + * @hpcc-js/graph bumped from ^2.87.4 to ^2.87.5 + * @hpcc-js/layout bumped from ^2.51.6 to ^2.51.7 + * @hpcc-js/map bumped from ^2.79.6 to ^2.79.7 + * @hpcc-js/other bumped from ^2.17.6 to ^2.17.7 + * @hpcc-js/phosphor bumped from ^2.20.7 to ^2.20.8 + +## [2.28.10](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.9...marshaller-v2.28.10) (2026-03-25) + + +### Bug Fixes + +* bump inter dependencies ([#4553](https://github.com/hpcc-systems/Visualization/issues/4553)) ([c5abe63](https://github.com/hpcc-systems/Visualization/commit/c5abe63234fee5c1f61324f7a702fe5eb04cca2e)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/chart bumped from ^2.86.4 to ^2.86.5 + * @hpcc-js/codemirror bumped from ^2.66.3 to ^2.66.4 + * @hpcc-js/common bumped from ^2.73.4 to ^2.73.5 + * @hpcc-js/comms bumped from ^2.102.3 to ^2.102.4 + * @hpcc-js/composite bumped from ^2.9.7 to ^2.9.8 + * @hpcc-js/ddl-shim bumped from ^2.25.1 to ^2.25.2 + * @hpcc-js/dgrid bumped from ^2.34.5 to ^2.34.6 + * @hpcc-js/form bumped from ^2.12.5 to ^2.12.6 + * @hpcc-js/graph bumped from ^2.87.3 to ^2.87.4 + * @hpcc-js/layout bumped from ^2.51.5 to ^2.51.6 + * @hpcc-js/map bumped from ^2.79.5 to ^2.79.6 + * @hpcc-js/other bumped from ^2.17.5 to ^2.17.6 + * @hpcc-js/phosphor bumped from ^2.20.6 to ^2.20.7 + +## [2.28.9](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.8...marshaller-v2.28.9) (2026-03-24) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/chart bumped from ^2.86.3 to ^2.86.4 + * @hpcc-js/comms bumped from ^2.102.2 to ^2.102.3 + * @hpcc-js/composite bumped from ^2.9.6 to ^2.9.7 + * @hpcc-js/form bumped from ^2.12.4 to ^2.12.5 + * @hpcc-js/layout bumped from ^2.51.4 to ^2.51.5 + * @hpcc-js/map bumped from ^2.79.4 to ^2.79.5 + * @hpcc-js/other bumped from ^2.17.4 to ^2.17.5 + * @hpcc-js/phosphor bumped from ^2.20.5 to ^2.20.6 + +## [2.28.8](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.6...marshaller-v2.28.8) (2026-02-25) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/codemirror bumped from ^2.66.2 to ^2.66.3 + * @hpcc-js/common bumped from ^2.73.3 to ^2.73.4 + * @hpcc-js/composite bumped from ^2.9.5 to ^2.9.6 + * @hpcc-js/dgrid bumped from ^2.34.4 to ^2.34.5 + * @hpcc-js/form bumped from ^2.12.3 to ^2.12.4 + * @hpcc-js/layout bumped from ^2.51.3 to ^2.51.4 + * @hpcc-js/map bumped from ^2.79.3 to ^2.79.4 + * @hpcc-js/other bumped from ^2.17.3 to ^2.17.4 + * @hpcc-js/phosphor bumped from ^2.20.4 to ^2.20.5 + * @hpcc-js/util bumped from ^2.53.3 to ^2.53.2 + +## [2.28.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.8...@hpcc-js/marshaller@2.28.7) (2026-02-11) + + +### Bug Fixes + +* bump versions ([53ad9f2](https://github.com/hpcc-systems/Visualization/commit/53ad9f2445ff319ac817cea6abd20d01e3744315)) + + + +## 2.106.11 (2024-09-23) + + + + + + +## [2.28.6](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.5...marshaller-v2.28.6) (2025-10-23) + + +### Bug Fixes + +* bump versions ([53ad9f2](https://github.com/hpcc-systems/Visualization/commit/53ad9f2445ff319ac817cea6abd20d01e3744315)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/chart bumped from ^2.86.1 to ^2.86.2 + * @hpcc-js/codemirror bumped from ^2.66.0 to ^2.66.1 + * @hpcc-js/common bumped from ^2.73.1 to ^2.73.2 + * @hpcc-js/comms bumped from ^2.102.0 to ^2.102.1 + * @hpcc-js/composite bumped from ^2.9.3 to ^2.9.4 + * @hpcc-js/ddl-shim bumped from ^2.24.0 to ^2.25.0 + * @hpcc-js/dgrid bumped from ^2.34.2 to ^2.34.3 + * @hpcc-js/form bumped from ^2.12.1 to ^2.12.2 + * @hpcc-js/graph bumped from ^2.87.1 to ^2.87.2 + * @hpcc-js/layout bumped from ^2.51.1 to ^2.51.2 + * @hpcc-js/map bumped from ^2.79.1 to ^2.79.2 + * @hpcc-js/other bumped from ^2.17.1 to ^2.17.2 + * @hpcc-js/phosphor bumped from ^2.20.2 to ^2.20.3 + +## [2.28.5](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.4...marshaller-v2.28.5) (2025-07-18) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/codemirror bumped from ^2.65.1 to ^2.66.0 + * @hpcc-js/comms bumped from ^2.101.3 to ^2.102.0 + +## [2.28.4](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.3...marshaller-v2.28.4) (2025-06-19) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.101.2 to ^2.101.3 + * @hpcc-js/composite bumped from ^2.9.2 to ^2.9.3 + * @hpcc-js/dgrid bumped from ^2.34.1 to ^2.34.2 + +## [2.28.3](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.2...marshaller-v2.28.3) (2025-06-10) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.101.1 to ^2.101.2 + +## [2.28.2](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.1...marshaller-v2.28.2) (2025-06-09) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/chart bumped from ^2.86.0 to ^2.86.1 + * @hpcc-js/codemirror bumped from ^2.65.0 to ^2.65.1 + * @hpcc-js/common bumped from ^2.73.0 to ^2.73.1 + * @hpcc-js/comms bumped from ^2.101.0 to ^2.101.1 + * @hpcc-js/composite bumped from ^2.9.1 to ^2.9.2 + * @hpcc-js/dgrid bumped from ^2.34.0 to ^2.34.1 + * @hpcc-js/form bumped from ^2.12.0 to ^2.12.1 + * @hpcc-js/graph bumped from ^2.87.0 to ^2.87.1 + * @hpcc-js/layout bumped from ^2.51.0 to ^2.51.1 + * @hpcc-js/map bumped from ^2.79.0 to ^2.79.1 + * @hpcc-js/other bumped from ^2.17.0 to ^2.17.1 + * @hpcc-js/phosphor bumped from ^2.20.1 to ^2.20.2 + * @hpcc-js/util bumped from ^2.53.0 to ^2.53.1 + +## [2.28.1](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.28.0...marshaller-v2.28.1) (2025-06-09) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/composite bumped from ^2.9.0 to ^2.9.1 + * @hpcc-js/phosphor bumped from ^2.20.0 to ^2.20.1 + +## [2.28.0](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.8...marshaller-v2.28.0) (2025-05-13) + + +### Features + +* Add maxWeight to Heat chart ([046c67a](https://github.com/hpcc-systems/Visualization/commit/046c67a398f574e2200e844db5c27981ecf0d261)) +* Add maxWeight to Heat chart ([59ee802](https://github.com/hpcc-systems/Visualization/commit/59ee80246e45fa5464f6fed4ed7f488ee3fca0cb)) +* Rename "lint" to "lint-all" and revert "lint" to break on error. ([227ab65](https://github.com/hpcc-systems/Visualization/commit/227ab656f9ce64580a0c8a7015e53ac455b16be4)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.100.0 to ^2.101.0 + +## [2.27.8](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.7...marshaller-v2.27.8) (2025-05-07) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.99.5 to ^2.100.0 + +## [2.27.7](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.6...marshaller-v2.27.7) (2025-04-15) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.99.4 to ^2.99.5 + +## [2.27.6](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.5...marshaller-v2.27.6) (2025-04-14) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.99.3 to ^2.99.4 + +## [2.27.5](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.4...marshaller-v2.27.5) (2025-04-04) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.99.2 to ^2.99.3 + +## [2.27.4](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.3...marshaller-v2.27.4) (2025-04-03) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.99.1 to ^2.99.2 + +## [2.27.3](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.2...marshaller-v2.27.3) (2025-02-27) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.99.0 to ^2.99.1 + +## [2.27.2](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.1...marshaller-v2.27.2) (2025-02-07) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/codemirror bumped from ^2.64.0 to ^2.65.0 + +## [2.27.1](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.27.0...marshaller-v2.27.1) (2024-11-06) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/comms bumped from ^2.98.0 to ^2.99.0 + +## [2.27.0](https://github.com/hpcc-systems/Visualization/compare/marshaller-v2.26.8...marshaller-v2.27.0) (2024-10-23) + + +### Features + +* Add maxWeight to Heat chart ([59ee802](https://github.com/hpcc-systems/Visualization/commit/59ee80246e45fa5464f6fed4ed7f488ee3fca0cb)) +* Rename "lint" to "lint-all" and revert "lint" to break on error. ([227ab65](https://github.com/hpcc-systems/Visualization/commit/227ab656f9ce64580a0c8a7015e53ac455b16be4)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @hpcc-js/chart bumped from ^2.85.0 to ^2.86.0 + * @hpcc-js/codemirror bumped from ^2.63.0 to ^2.64.0 + * @hpcc-js/common bumped from ^2.72.0 to ^2.73.0 + * @hpcc-js/comms bumped from ^2.97.0 to ^2.98.0 + * @hpcc-js/composite bumped from ^2.8.2 to ^2.9.0 + * @hpcc-js/ddl-shim bumped from ^2.21.0 to ^2.22.0 + * @hpcc-js/dgrid bumped from ^2.33.0 to ^2.34.0 + * @hpcc-js/form bumped from ^2.11.2 to ^2.12.0 + * @hpcc-js/graph bumped from ^2.86.0 to ^2.87.0 + * @hpcc-js/layout bumped from ^2.50.2 to ^2.51.0 + * @hpcc-js/map bumped from ^2.78.2 to ^2.79.0 + * @hpcc-js/other bumped from ^2.16.2 to ^2.17.0 + * @hpcc-js/phosphor bumped from ^2.19.2 to ^2.20.0 + * @hpcc-js/util bumped from ^2.52.0 to ^2.53.0 + +## [2.26.8](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.7...@hpcc-js/marshaller@2.26.8) (2024-09-23) + + + +## 2.106.10 (2024-09-13) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.26.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.6...@hpcc-js/marshaller@2.26.7) (2024-09-13) + + + +## 2.106.9 (2024-09-12) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.26.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.5...@hpcc-js/marshaller@2.26.6) (2024-09-12) + + + +## 2.106.8 (2024-09-05) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.26.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.4...@hpcc-js/marshaller@2.26.5) (2024-09-05) + + + +## 2.106.7 (2024-08-29) + + + +## 2.106.5 (2024-08-29) + + + +## 2.106.4 (2024-08-22) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.26.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.3...@hpcc-js/marshaller@2.26.4) (2024-08-22) + + + +## 2.106.3 (2024-08-01) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.26.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.2...@hpcc-js/marshaller@2.26.3) (2024-08-01) + + + +## 2.106.2 (2024-07-29) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.26.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.1...@hpcc-js/marshaller@2.26.2) (2024-07-29) + + + +## 2.106.1 (2024-07-24) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.26.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.26.0...@hpcc-js/marshaller@2.26.1) (2024-07-24) + + + +# 2.106.0 (2024-07-23) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +# 2.26.0 (2024-07-23) + + +### Bug Fixes + +* Add extra references to assist the DDL2 schema generation ([5138367](https://github.com/hpcc-systems/Visualization/commit/5138367bf0e8909ffb35fee74c441644ee0af19d)) +* Add missing save method to dashy ([4c5228a](https://github.com/hpcc-systems/Visualization/commit/4c5228a3ed663b0591ed7954e0cad6f761437f34)) +* Add noDeserialize to computedFields ([5f1e10c](https://github.com/hpcc-systems/Visualization/commit/5f1e10c1dcbb1dc9b5ea95193d4a0eb87f68cab9)) +* **build:** Remove duplicate d3 packages from bundles ([b379f82](https://github.com/hpcc-systems/Visualization/commit/b379f8273e454c4b103e0ed1965c18542f125482)) +* **build:** Source map reference missing in index.min.js ([bf3bb07](https://github.com/hpcc-systems/Visualization/commit/bf3bb07379e59081c930d61485764e78c8a07a90)) +* **build:** Source maps not referencing TS files ([08c3cf3](https://github.com/hpcc-systems/Visualization/commit/08c3cf369d6d4081f0f5d9285bf3b1fd9b5b5999)) +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) +* **comms:** Query.attach should not return a promise. ([20cd947](https://github.com/hpcc-systems/Visualization/commit/20cd9476596548927c118ae303300792960f01f6)) +* **d3-event:** d3-event is a global instance. ([92760ad](https://github.com/hpcc-systems/Visualization/commit/92760ada4d7aad0ffe9ea5cf004b49ccec6710de)) +* Dashy calls render prior to the widget being added to the DOM ([351fd18](https://github.com/hpcc-systems/Visualization/commit/351fd183809939379d634b718c60a595626484ca)) +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) +* **dashy:** __lparam assigned wrong type ([4156b48](https://github.com/hpcc-systems/Visualization/commit/4156b484b392785c6e35f5a44f882234b60b064b)) +* **dashy:** Chart type was not visible ([e46f1f3](https://github.com/hpcc-systems/Visualization/commit/e46f1f3cc695481bc2f4f334056d23cc0d0e3236)) +* **dashy:** Databomb + Form field coercion ([3809e12](https://github.com/hpcc-systems/Visualization/commit/3809e1237d5ac5e254fa4adb10d0ee1eddf55480)) +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) +* **dashy:** Failed to load as it referenced a "shim". ([fec1aae](https://github.com/hpcc-systems/Visualization/commit/fec1aaeae848d92385aa2c5d30ee0ba3e6580aeb)) +* **dashy:** False positive error on initial load ([c354d12](https://github.com/hpcc-systems/Visualization/commit/c354d122997169607a17de0a7524f279b0814edd)) +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) +* **dashy:** Flyout icon not rendering consistently ([0278f1c](https://github.com/hpcc-systems/Visualization/commit/0278f1cb4475cb5dfd7466f958c26e5e49159e91)) +* **Dashy:** Flyout menu not rendering on initial load ([c57cc8e](https://github.com/hpcc-systems/Visualization/commit/c57cc8e5252d9ef52d4f3c44b4ffa1c285663e59)) +* **dashy:** Flyout not rendering in runtime dashboard ([ee9960f](https://github.com/hpcc-systems/Visualization/commit/ee9960fccfaafd1eab3e620e57ffa448ed5cc47e)) +* **Dashy:** Generated DDL for WUs + RoxieService Issue ([d2e97b4](https://github.com/hpcc-systems/Visualization/commit/d2e97b45e590c02adef067cb8a569030160e82b5)) +* **dashy:** Hide single tabs by default in Dashboard ([dddaae2](https://github.com/hpcc-systems/Visualization/commit/dddaae2806275a286de59298ebf291a1ba31b96d)) +* **dashy:** Hide title on cloned dashboard. ([de801a8](https://github.com/hpcc-systems/Visualization/commit/de801a862d825bae08721104eb061b717ff12d5b)) +* **dashy:** Improve clear + restore ([6299fb3](https://github.com/hpcc-systems/Visualization/commit/6299fb3f76c49f624a16adfca9fd06b3807e6711)) +* **dashy:** Improved Form support ([ddfe22e](https://github.com/hpcc-systems/Visualization/commit/ddfe22ea7b49101fff430aee5298da2935d6efce)), closes [#3334](https://github.com/hpcc-systems/Visualization/issues/3334) +* **dashy:** Mapped fields should include all children by default ([dfe50c0](https://github.com/hpcc-systems/Visualization/commit/dfe50c02c578ce82948fe551c3b3fa2f2799e7f2)) +* **dashy:** no data when responseField === "" ([81956c3](https://github.com/hpcc-systems/Visualization/commit/81956c30ceeae9e6d6c34f6205e20c02532cb3f3)) +* **dashy:** Pipeline graph not refreshing correctly ([f692d16](https://github.com/hpcc-systems/Visualization/commit/f692d164cd0fc9ce94ab33fd87f177b23552543c)) +* **dashy:** Remove Form default values ([3a30342](https://github.com/hpcc-systems/Visualization/commit/3a30342eba1634e8d0178a4263c6c39d751e3c42)) +* **Dashy:** Remove stray CSS ([7ce4a3e](https://github.com/hpcc-systems/Visualization/commit/7ce4a3e362c8e618b5f1738438634a591f76dcc6)) +* **dashy:** Selected highlight didn't highlight top of tab sheet ([0ed38a3](https://github.com/hpcc-systems/Visualization/commit/0ed38a327e10cd1d41a57e597a219bb8cb4e334f)), closes [#3010](https://github.com/hpcc-systems/Visualization/issues/3010) +* **dashy:** Selection state unpredictable ([8766fe1](https://github.com/hpcc-systems/Visualization/commit/8766fe144fc36ca4d48e2dea58622f40c5d37d57)) +* **Dashy:** Tweak Mappings mapped UI ([c09cad6](https://github.com/hpcc-systems/Visualization/commit/c09cad62272af06c291b258329c72f91b079eaf1)) +* DDL upgrade failing on SLIDER ([fbb355c](https://github.com/hpcc-systems/Visualization/commit/fbb355c25357dac25a1bab7b59fb373ee99d5aa6)), closes [#2579](https://github.com/hpcc-systems/Visualization/issues/2579) +* **DDL:** Include all known fields in datasource section ([163316e](https://github.com/hpcc-systems/Visualization/commit/163316e5600e1ca90779f2f6a15952676aa47023)), closes [#3315](https://github.com/hpcc-systems/Visualization/issues/3315) +* **ddl:** Incorrect input/output lists in the DDL ([38ca0ac](https://github.com/hpcc-systems/Visualization/commit/38ca0ac9b2ec6b4ff95b5184c36439e213f3e61a)) +* **dgrid:** Click regression (multi selection) ([19616d0](https://github.com/hpcc-systems/Visualization/commit/19616d06313b8c9670fbd8697db782140fefa26a)) +* Ensure all widgets can be re-targeted ([d1f02c2](https://github.com/hpcc-systems/Visualization/commit/d1f02c2c956601f3b4740917c4c35896f7f6c1c4)) +* **marshaller:** DataGraph should merge data by default ([a39da51](https://github.com/hpcc-systems/Visualization/commit/a39da51e42add8be09be702a07bd0fa83fef5895)) +* **marshaller:** Add DDL support to Form ([8c17bf9](https://github.com/hpcc-systems/Visualization/commit/8c17bf93c14c56ba64d1cf1ddc9fbd7ff40f59ca)) +* **marshaller:** Add min size constraints to contained widgets. ([29b2958](https://github.com/hpcc-systems/Visualization/commit/29b295837f593429d599f536639accba4182ae4c)) +* **marshaller:** Add missing "flyout" capability ([1f75e11](https://github.com/hpcc-systems/Visualization/commit/1f75e1182f9e79b97f60af9a9b6f5cb870888e79)) +* **marshaller:** Add missing visualizations ([0f65810](https://github.com/hpcc-systems/Visualization/commit/0f65810c6523327be718675fb22b92eb78988fdb)) +* **marshaller:** Debug "v1" + "v1->v2" not refreshing correctly ([24f45b4](https://github.com/hpcc-systems/Visualization/commit/24f45b4ae6292b108dc3371406906ba2ac7df4e8)) +* **marshaller:** Default to HipieResultRef ([a0fa67f](https://github.com/hpcc-systems/Visualization/commit/a0fa67f9eb23d335e6189fba616086ffea66cf69)) +* **marshaller:** Distinguish between RoxieResult and RoxieService ([81c16ed](https://github.com/hpcc-systems/Visualization/commit/81c16eda5f76608066a386c83e65d29a90e52dc8)) +* **marshaller:** Ensure Forms always have selection state. ([83ef052](https://github.com/hpcc-systems/Visualization/commit/83ef0520b462e7aeb592d77c568994e72784afcf)) +* **marshaller:** ESPResult sampling is duplicating data ([cb736a6](https://github.com/hpcc-systems/Visualization/commit/cb736a667fe812d815e380a2f827027982864886)) +* **marshaller:** Finish support for databombs dataset fields ([2e6ab95](https://github.com/hpcc-systems/Visualization/commit/2e6ab953fb4e1cf60113db22ce7c3a601d73917b)) +* **marshaller:** Multiselection not quite working ([056ad8e](https://github.com/hpcc-systems/Visualization/commit/056ad8e39ea763acf7ce2e76a11705f6e02c5d1a)) +* **marshaller:** Nested databombs fail to display correctly ([b81881b](https://github.com/hpcc-systems/Visualization/commit/b81881be5affb25d59db17127b3d9782cdd6938e)) +* **marshaller:** Nullable not working for "in" and "range" ([6b98594](https://github.com/hpcc-systems/Visualization/commit/6b98594be6febdbb73b382d15655d8f4732848f0)), closes [#3105](https://github.com/hpcc-systems/Visualization/issues/3105) +* **Marshaller:** Open new DDL should auto-select first element ([8228d2b](https://github.com/hpcc-systems/Visualization/commit/8228d2b690442ebcadb97f38ff776eca2d958507)), closes [#2940](https://github.com/hpcc-systems/Visualization/issues/2940) +* **marshaller:** Potential filter issue ([604bc48](https://github.com/hpcc-systems/Visualization/commit/604bc48c0d386a1ea768a6f580212a0f6bf71684)) +* **marshaller:** Preserve mappings when user changes visualization ([f39422d](https://github.com/hpcc-systems/Visualization/commit/f39422d9ec27d0cada31ddc725a6b679659cd1ea)) +* **marshaller:** Race condition ([2673d29](https://github.com/hpcc-systems/Visualization/commit/2673d290f88c6b860b6687852c6ae45fa79da13c)), closes [#3106](https://github.com/hpcc-systems/Visualization/issues/3106) +* **marshaller:** Rollback choropleth to non leaflet version ([7f07b5e](https://github.com/hpcc-systems/Visualization/commit/7f07b5eedc94729a8a6c78bff2c60c35abe49ef2)) +* **marshaller:** TS Code generation was over optimizing the datasource references. ([2928927](https://github.com/hpcc-systems/Visualization/commit/2928927cf7678abef6099a120e013aa04a65028a)) +* **marshaller:** Unnamed roxie results fail to display ([32078c2](https://github.com/hpcc-systems/Visualization/commit/32078c2baf3d0a497a03947993a7f2a77abe1d13)) +* **Marshaller:** Use public ID function ([c13bdaf](https://github.com/hpcc-systems/Visualization/commit/c13bdaf99823d8e83fa78d4cb824ff628591bda4)) +* **marshaller:** WU Results should share WU instances ([6ac6f4f](https://github.com/hpcc-systems/Visualization/commit/6ac6f4f5c419830e02635b9a134d75efe6ed8818)) +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) +* TS Form generation was invalid ([e8e0252](https://github.com/hpcc-systems/Visualization/commit/e8e0252dcf27e390825e37fdb1b57ed3a0b9d90c)) + + +### Features + +* Add maxWeight to Heat chart ([59ee802](https://github.com/hpcc-systems/Visualization/commit/59ee80246e45fa5464f6fed4ed7f488ee3fca0cb)) +* Add observable web component ([33fbe07](https://github.com/hpcc-systems/Visualization/commit/33fbe07eb8a5deeabd98467b1bce1fcda0d2dbab)) +* Add Collapsed publish param tag ([4b65e73](https://github.com/hpcc-systems/Visualization/commit/4b65e733fb06966baf37818ec82fcb23ea7ee940)) +* Add CSV/TSV Support to databomb datasource ([fd96de0](https://github.com/hpcc-systems/Visualization/commit/fd96de0985fb79a4a88f9dc2efd79341b6dff1b0)), closes [#2564](https://github.com/hpcc-systems/Visualization/issues/2564) +* Add intuitive closing logic for flyout ([e5cff53](https://github.com/hpcc-systems/Visualization/commit/e5cff5366ab32b2419c6770d55a8731f3089eb55)), closes [#3319](https://github.com/hpcc-systems/Visualization/issues/3319) +* Add lite serialize/deserialize ([799fa5f](https://github.com/hpcc-systems/Visualization/commit/799fa5ff09395a04ec362f52d67230a28ed935c5)) +* Add PopupManager.ts ([a8714a0](https://github.com/hpcc-systems/Visualization/commit/a8714a03b623d2f471ed59331eae999aec65af03)), closes [#3279](https://github.com/hpcc-systems/Visualization/issues/3279) +* **AdjacencyGraph:** Add PP for user assigned columns ([af6e031](https://github.com/hpcc-systems/Visualization/commit/af6e0314700642f69a42b575acf848647da87015)) +* **comms:** Export hookSend from marshaller ([f1d7145](https://github.com/hpcc-systems/Visualization/commit/f1d7145168641ee00b7107c4c8ee242dd9e4eb16)) +* **dashy:** Add independent datasource view ([b53c751](https://github.com/hpcc-systems/Visualization/commit/b53c7514830736ef7e2fdc813f5b08e42e921236)) +* **Dashy:** Add support for "set" HIPIE inputs ([42986b9](https://github.com/hpcc-systems/Visualization/commit/42986b943941715e61cfa7210be98cbad10bd0c4)) +* **dashy:** Better Error UI ([c1bf784](https://github.com/hpcc-systems/Visualization/commit/c1bf784231da8d0275f1d0093367f442078d4710)) +* **dashy:** Add @hpcc-js/chart input mapping meta ([fb9e523](https://github.com/hpcc-systems/Visualization/commit/fb9e523308675cd26698cdbc151be62c594ba004)) +* **dashy:** Add dermatology upgrade script to ddl-shim ([72f2a46](https://github.com/hpcc-systems/Visualization/commit/72f2a4675e56e268858b3ec5a17090fa357c20fc)) +* **Dashy:** Add PP to optionally disable activities in the pipeline. ([5f00645](https://github.com/hpcc-systems/Visualization/commit/5f00645e1367944203072500d511cd0908fa186f)), closes [#3356](https://github.com/hpcc-systems/Visualization/issues/3356) +* **dashy:** Add preliminary support for "object" field types ([a322fb0](https://github.com/hpcc-systems/Visualization/commit/a322fb031b877951a3f24f48a74927fef3c908a4)) +* **dashy:** Enable XYAxis range selection ([ec96d97](https://github.com/hpcc-systems/Visualization/commit/ec96d97d74818022b21f29919983c320957db78e)) +* **dashy:** Global override for sample sizes ([b0de844](https://github.com/hpcc-systems/Visualization/commit/b0de844a39c5fd42091b94c3bda8be4558a9c050)) +* **dashy:** Import DDL2 from address bar ([3ec2acc](https://github.com/hpcc-systems/Visualization/commit/3ec2accfc34a364c0c484dfd86a42d7ec9c424e2)) +* **Dashy:** Improved REST support ([ccc9abc](https://github.com/hpcc-systems/Visualization/commit/ccc9abceb2def98124aa57ff20a3ae0d770e24a9)) +* **dashy:** Improved UI ([f64569e](https://github.com/hpcc-systems/Visualization/commit/f64569e0f3bf05ad0276b2d060667a087356f692)) +* **dashy:** Minor usability tweaks ([9531690](https://github.com/hpcc-systems/Visualization/commit/9531690675d21cb54b0cca6909795e531aeaef5a)) +* **dashy:** Option to clone datasources ([facdb86](https://github.com/hpcc-systems/Visualization/commit/facdb86e92981b02b45e4b53618d048c4da9881e)) +* **dashy:** Preserve DDL fields on load. ([8dfee20](https://github.com/hpcc-systems/Visualization/commit/8dfee202ef75452691175058a885bb83ae4c24e8)) +* **dashy:** Support common datasources properly ([34d6fb7](https://github.com/hpcc-systems/Visualization/commit/34d6fb72fef0d3d25b777b174de0c28092f5c9b4)) +* **dashy:** Various datasource tweaks ([ebfa316](https://github.com/hpcc-systems/Visualization/commit/ebfa3165dc06960897c08e31144636f17fad9226)) +* **ddl:** Move layout string into DDL 2.0 ([f1f8eb4](https://github.com/hpcc-systems/Visualization/commit/f1f8eb42f8833b501f6d2ca1fb7591fb98e81046)), closes [#2641](https://github.com/hpcc-systems/Visualization/issues/2641) +* **DockPanel:** Optionally show close [x] button ([96018e4](https://github.com/hpcc-systems/Visualization/commit/96018e44d5f8f212d098a3d92dc2ba845a4272b3)) +* **EntityRect:** Add EntityRect and EntityRectList ([34cceb3](https://github.com/hpcc-systems/Visualization/commit/34cceb37e1822e501fb13b4884454c8a8d122a03)) +* **gallery:** Switch to jsdelivr from unpkg ([cb1d681](https://github.com/hpcc-systems/Visualization/commit/cb1d6819c6fd166f74e7385446dd477e8a1cdd01)) +* Graph support in the marshaller ([bcc2290](https://github.com/hpcc-systems/Visualization/commit/bcc229003d03a6fcd42faaa70156f12814a4dc33)), closes [#2559](https://github.com/hpcc-systems/Visualization/issues/2559) +* **Graph2:** Various Graph2 improvements: ([8482ff0](https://github.com/hpcc-systems/Visualization/commit/8482ff0c44e9945981c38e4d861536966089f88d)) +* **Graph2:** Various improvements for ECL Watch integration ([668c9b4](https://github.com/hpcc-systems/Visualization/commit/668c9b40f8f84b2ce62fd0a6f59f44c4b9aa4483)) +* Improve dashy experience ([6b5ed37](https://github.com/hpcc-systems/Visualization/commit/6b5ed3782db2e9c0ed54f6afa33e4ad080ee6e92)), closes [#2532](https://github.com/hpcc-systems/Visualization/issues/2532) [#2531](https://github.com/hpcc-systems/Visualization/issues/2531) [#2530](https://github.com/hpcc-systems/Visualization/issues/2530) +* Integrate Web Components ([ed1b14f](https://github.com/hpcc-systems/Visualization/commit/ed1b14f1cc8a82a4fbde1cf6767a0195bc16933b)) +* **loader:** Improved loader to manage specific versions ([cfcdfac](https://github.com/hpcc-systems/Visualization/commit/cfcdfacc1b162f1a5d02b06d434375424b7d225f)) +* **maps:** Add leaflet map support ([74d36d1](https://github.com/hpcc-systems/Visualization/commit/74d36d1cd34ddb236cc195535d564e9f52fbc1ad)) +* **marshaller:** Add "hookSend" to ElementContainer ([0741568](https://github.com/hpcc-systems/Visualization/commit/0741568a951e998cef366637b40867048d011881)), closes [#3181](https://github.com/hpcc-systems/Visualization/issues/3181) +* **marshaller:** Add Static Filter Option ([0515dc6](https://github.com/hpcc-systems/Visualization/commit/0515dc626b80b1e7daa7974607ff22f8c394e804)), closes [#3476](https://github.com/hpcc-systems/Visualization/issues/3476) +* **SVGWiget:** Add image download capability ([46f19dc](https://github.com/hpcc-systems/Visualization/commit/46f19dc4751e9106d7e5cba6b974d251793cbd19)), closes [#3186](https://github.com/hpcc-systems/Visualization/issues/3186) +* **toolbar:** Add selection group ([d6849ae](https://github.com/hpcc-systems/Visualization/commit/d6849aecf19c906994ae631bdc9ffe7f72cdfbf8)) +* **Widget:** Enhanced classed call to match d3 v4 call signature. ([f7e9141](https://github.com/hpcc-systems/Visualization/commit/f7e91418ff4a7660c2713f4635e2852765dd6497)), closes [#2933](https://github.com/hpcc-systems/Visualization/issues/2933) + + +### Reverts + +* Revert "chore(security): Bump versions" ([cfd8239](https://github.com/hpcc-systems/Visualization/commit/cfd8239224493eacb8805cf43c2ca2c7cedf915b)) +* Revert "chore: Rework shim inclusion" ([462d55c](https://github.com/hpcc-systems/Visualization/commit/462d55c0b89cb74c6f2aacc29ccafebaf5a2c46c)) + + + + + + +## [2.25.53](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.52...@hpcc-js/marshaller@2.25.53) (2024-07-10) + + + +## 2.105.13 (2024-07-09) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.52](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.51...@hpcc-js/marshaller@2.25.52) (2024-07-09) + + + +## 2.105.12 (2024-07-02) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.51](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.50...@hpcc-js/marshaller@2.25.51) (2024-07-02) + + + +## 2.105.11 (2024-06-25) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.50](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.49...@hpcc-js/marshaller@2.25.50) (2024-06-25) + + + +## 2.105.10 (2024-06-19) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.49](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.48...@hpcc-js/marshaller@2.25.49) (2024-06-19) + + + +## 2.105.9 (2024-05-24) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.48](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.47...@hpcc-js/marshaller@2.25.48) (2024-05-24) + + + +## 2.105.8 (2024-04-24) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.47](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.46...@hpcc-js/marshaller@2.25.47) (2024-04-24) + + + +## 2.105.7 (2024-04-22) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.46](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.45...@hpcc-js/marshaller@2.25.46) (2024-04-22) + + + +## 2.105.6 (2024-04-17) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.45](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.44...@hpcc-js/marshaller@2.25.45) (2024-04-17) + + + +## 2.105.5 (2024-03-28) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.44](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.43...@hpcc-js/marshaller@2.25.44) (2024-03-28) + + + +## 2.105.4 (2024-03-21) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.43](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.42...@hpcc-js/marshaller@2.25.43) (2024-03-21) + + + +## 2.105.3 (2024-03-19) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.42](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.41...@hpcc-js/marshaller@2.25.42) (2024-03-19) + + + +## 2.105.2 (2024-03-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.41](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.40...@hpcc-js/marshaller@2.25.41) (2024-03-15) + + + +## 2.105.1 (2024-03-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.40](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.39...@hpcc-js/marshaller@2.25.40) (2024-03-15) + + + +# 2.105.0 (2024-03-08) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.39](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.38...@hpcc-js/marshaller@2.25.39) (2024-03-08) + + + +## 2.104.42 (2024-02-28) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.38](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.37...@hpcc-js/marshaller@2.25.38) (2024-02-28) + + + +## 2.104.41 (2024-02-16) + + + +## 2.104.40 (2024-02-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.37](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.36...@hpcc-js/marshaller@2.25.37) (2024-02-15) + + + +## 2.104.39 (2024-02-06) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.36](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.35...@hpcc-js/marshaller@2.25.36) (2024-02-06) + + + +## 2.104.38 (2024-02-06) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.35](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.34...@hpcc-js/marshaller@2.25.35) (2024-02-06) + + + +## 2.104.37 (2024-01-25) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.34](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.33...@hpcc-js/marshaller@2.25.34) (2024-01-25) + + + +## 2.104.36 (2024-01-23) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.33](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.32...@hpcc-js/marshaller@2.25.33) (2024-01-23) + + + +## 2.104.35 (2024-01-18) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.32](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.31...@hpcc-js/marshaller@2.25.32) (2024-01-18) + + + +## 2.104.34 (2024-01-02) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.31](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.30...@hpcc-js/marshaller@2.25.31) (2024-01-02) + + + +## 2.104.33 (2023-11-16) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.30](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.29...@hpcc-js/marshaller@2.25.30) (2023-11-16) + + + +## 2.104.32 (2023-11-09) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.29](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.28...@hpcc-js/marshaller@2.25.29) (2023-11-09) + + + +## 2.104.31 (2023-11-03) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.28](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.27...@hpcc-js/marshaller@2.25.28) (2023-11-03) + + + +## 2.104.30 (2023-10-26) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.27](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.26...@hpcc-js/marshaller@2.25.27) (2023-10-26) + + + +## 2.104.29 (2023-09-18) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.26](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.25...@hpcc-js/marshaller@2.25.26) (2023-09-18) + + + +## 2.104.28 (2023-09-14) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.25](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.24...@hpcc-js/marshaller@2.25.25) (2023-09-14) + + + +## 2.104.27 (2023-09-14) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.24](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.23...@hpcc-js/marshaller@2.25.24) (2023-09-14) + + + +## 2.104.26 (2023-09-14) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.23](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.22...@hpcc-js/marshaller@2.25.23) (2023-09-14) + + + +## 2.104.25 (2023-07-17) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.22](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.21...@hpcc-js/marshaller@2.25.22) (2023-07-17) + + + +## 2.104.24 (2023-07-13) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.21](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.20...@hpcc-js/marshaller@2.25.21) (2023-07-13) + + + +## 2.104.23 (2023-06-28) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.20](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.19...@hpcc-js/marshaller@2.25.20) (2023-06-28) + + + +## 2.104.22 (2023-06-27) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.19](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.18...@hpcc-js/marshaller@2.25.19) (2023-06-27) + + + +## 2.104.21 (2023-06-14) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.18](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.17...@hpcc-js/marshaller@2.25.18) (2023-06-14) + + + +## 2.104.20 (2023-06-08) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.17](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.16...@hpcc-js/marshaller@2.25.17) (2023-06-08) + + + +## 2.104.19 (2023-03-14) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.16](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.15...@hpcc-js/marshaller@2.25.16) (2023-03-14) + + + +## 2.104.18 (2023-02-22) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.15](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.14...@hpcc-js/marshaller@2.25.15) (2023-02-22) + + + +## 2.104.17 (2023-01-20) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.14](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.13...@hpcc-js/marshaller@2.25.14) (2023-01-20) + + + +## 2.104.16 (2023-01-19) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.13](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.12...@hpcc-js/marshaller@2.25.13) (2023-01-19) + + + +## 2.104.15 (2022-11-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.12](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.11...@hpcc-js/marshaller@2.25.12) (2022-11-15) + + + +## 2.104.14 (2022-11-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.11](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.10...@hpcc-js/marshaller@2.25.11) (2022-11-11) + + + +## 2.104.13 (2022-11-09) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.10](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.9...@hpcc-js/marshaller@2.25.10) (2022-11-09) + + + +## 2.104.12 (2022-10-16) + + + +## 2.104.11 (2022-10-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.25.9](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.8...@hpcc-js/marshaller@2.25.9) (2022-10-11) + + + +## 2.104.10 (2022-10-04) + + + +## 2.104.9 (2022-10-03) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.8](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.7...@hpcc-js/marshaller@2.25.8) (2022-10-03) + + + +## 2.104.8 (2022-09-29) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.6...@hpcc-js/marshaller@2.25.7) (2022-09-29) + + + +## 2.104.7 (2022-09-28) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.5...@hpcc-js/marshaller@2.25.6) (2022-09-28) + + + +## 2.104.6 (2022-09-21) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.4...@hpcc-js/marshaller@2.25.5) (2022-09-15) + + + +## 2.104.4 (2022-09-08) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.3...@hpcc-js/marshaller@2.25.4) (2022-09-08) + + + +## 2.104.3 (2022-08-18) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.2...@hpcc-js/marshaller@2.25.3) (2022-08-18) + + + +## 2.104.2 (2022-08-17) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.1...@hpcc-js/marshaller@2.25.2) (2022-08-17) + + + +## 2.104.1 (2022-08-16) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.25.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.25.0...@hpcc-js/marshaller@2.25.1) (2022-08-16) + + + +# 2.104.0 (2022-07-26) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +# [2.25.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.16...@hpcc-js/marshaller@2.25.0) (2022-07-26) + + +### Features + +* Add observable web component ([33fbe07](https://github.com/hpcc-systems/Visualization/commit/33fbe07eb8a5deeabd98467b1bce1fcda0d2dbab)) + + + +## 2.103.6 (2022-06-27) + + + + + +## [2.24.16](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.15...@hpcc-js/marshaller@2.24.16) (2022-06-27) + + + +## 2.103.5 (2022-06-23) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.15](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.14...@hpcc-js/marshaller@2.24.15) (2022-06-23) + + + +## 2.103.4 (2022-05-31) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.14](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.13...@hpcc-js/marshaller@2.24.14) (2022-05-31) + + + +## 2.103.3 (2022-05-13) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.13](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.12...@hpcc-js/marshaller@2.24.13) (2022-05-13) + + + +## 2.103.2 (2022-04-27) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.12](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.11...@hpcc-js/marshaller@2.24.12) (2022-04-27) + + + +## 2.103.1 (2022-04-20) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.11](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.10...@hpcc-js/marshaller@2.24.11) (2022-04-20) + + + +# 2.103.0 (2022-04-07) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.10](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.9...@hpcc-js/marshaller@2.24.10) (2022-04-07) + + + +## 2.102.11 (2022-03-24) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.9](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.8...@hpcc-js/marshaller@2.24.9) (2022-03-24) + + + +## 2.102.10 (2022-03-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.8](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.7...@hpcc-js/marshaller@2.24.8) (2022-03-15) + + + +## 2.102.9 (2022-03-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.6...@hpcc-js/marshaller@2.24.7) (2022-03-15) + + + +## 2.102.8 (2022-03-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.5...@hpcc-js/marshaller@2.24.6) (2022-03-15) + + + +## 2.102.7 (2022-03-14) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.4...@hpcc-js/marshaller@2.24.5) (2022-03-14) + + + +## 2.102.6 (2022-03-11) + + + +## 2.102.5 (2022-03-11) + + + +## 2.102.4 (2022-03-10) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.3...@hpcc-js/marshaller@2.24.4) (2022-03-10) + + + +## 2.102.3 (2022-03-10) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.24.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.2...@hpcc-js/marshaller@2.24.3) (2022-03-10) + + + +## 2.102.2 (2022-03-08) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.1...@hpcc-js/marshaller@2.24.2) (2022-03-08) + + + +## 2.102.1 (2022-03-08) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.24.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.24.0...@hpcc-js/marshaller@2.24.1) (2022-03-08) + + + +# 2.102.0 (2022-03-07) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +# [2.24.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.109...@hpcc-js/marshaller@2.24.0) (2022-03-07) + + +### Features + +* Integrate Web Components ([ed1b14f](https://github.com/hpcc-systems/Visualization/commit/ed1b14f1cc8a82a4fbde1cf6767a0195bc16933b)) + + + +## 2.101.2 (2022-03-05) + + + + + +## [2.23.109](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.108...@hpcc-js/marshaller@2.23.109) (2022-03-05) + + + +## 2.101.1 (2022-03-04) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.108](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.107...@hpcc-js/marshaller@2.23.108) (2022-03-04) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.107](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.107) (2022-02-23) + + + +# 2.100.0 (2022-02-18) + + + +# 2.99.0 (2022-02-10) + + + +# 2.98.0 (2022-02-10) + + +### Reverts + +* Revert "chore(security): Bump versions" ([cfd8239](https://github.com/hpcc-systems/Visualization/commit/cfd8239224493eacb8805cf43c2ca2c7cedf915b)) + + + +# 2.97.0 (2022-02-09) + + +### Bug Fixes + +* **marshaller:** DataGraph should merge data by default ([a39da51](https://github.com/hpcc-systems/Visualization/commit/a39da51e42add8be09be702a07bd0fa83fef5895)) + + + +# 2.96.0 (2022-01-22) + + + +# 2.95.0 (2022-01-20) + + + +# 2.94.0 (2022-01-19) + + + +# 2.93.0 (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.106](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.106) (2022-02-18) + + + +# 2.99.0 (2022-02-10) + + + +# 2.98.0 (2022-02-10) + + +### Reverts + +* Revert "chore(security): Bump versions" ([cfd8239](https://github.com/hpcc-systems/Visualization/commit/cfd8239224493eacb8805cf43c2ca2c7cedf915b)) + + + +# 2.97.0 (2022-02-09) + + +### Bug Fixes + +* **marshaller:** DataGraph should merge data by default ([a39da51](https://github.com/hpcc-systems/Visualization/commit/a39da51e42add8be09be702a07bd0fa83fef5895)) + + + +# 2.96.0 (2022-01-22) + + + +# 2.95.0 (2022-01-20) + + + +# 2.94.0 (2022-01-19) + + + +# 2.93.0 (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.105](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.105) (2022-02-10) + + + +# 2.98.0 (2022-02-10) + + +### Reverts + +* Revert "chore(security): Bump versions" ([cfd8239](https://github.com/hpcc-systems/Visualization/commit/cfd8239224493eacb8805cf43c2ca2c7cedf915b)) + + + +# 2.97.0 (2022-02-09) + + +### Bug Fixes + +* **marshaller:** DataGraph should merge data by default ([a39da51](https://github.com/hpcc-systems/Visualization/commit/a39da51e42add8be09be702a07bd0fa83fef5895)) + + + +# 2.96.0 (2022-01-22) + + + +# 2.95.0 (2022-01-20) + + + +# 2.94.0 (2022-01-19) + + + +# 2.93.0 (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.104](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.104) (2022-02-10) + + +### Reverts + +* Revert "chore(security): Bump versions" ([cfd8239](https://github.com/hpcc-systems/Visualization/commit/cfd8239224493eacb8805cf43c2ca2c7cedf915b)) + + + +# 2.97.0 (2022-02-09) + + +### Bug Fixes + +* **marshaller:** DataGraph should merge data by default ([a39da51](https://github.com/hpcc-systems/Visualization/commit/a39da51e42add8be09be702a07bd0fa83fef5895)) + + + +# 2.96.0 (2022-01-22) + + + +# 2.95.0 (2022-01-20) + + + +# 2.94.0 (2022-01-19) + + + +# 2.93.0 (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.103](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.103) (2022-02-09) + + +### Bug Fixes + +* **marshaller:** DataGraph should merge data by default ([a39da51](https://github.com/hpcc-systems/Visualization/commit/a39da51e42add8be09be702a07bd0fa83fef5895)) + + + +# 2.96.0 (2022-01-22) + + + +# 2.95.0 (2022-01-20) + + + +# 2.94.0 (2022-01-19) + + + +# 2.93.0 (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.102](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.102) (2022-01-20) + + + +# 2.94.0 (2022-01-19) + + + +# 2.93.0 (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.101](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.101) (2022-01-19) + + + +# 2.93.0 (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.100](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.100) (2021-11-18) + + + +# 2.92.0 (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.99](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.99) (2021-11-08) + + + +# 2.91.0 (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.98](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.98) (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.97](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.97) (2021-10-15) + + + +# 2.89.0 (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.96](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.96) (2021-10-08) + + + +# 2.88.0 (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.95](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.95) (2021-10-03) + + + +# 2.87.0 (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.94](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.94) (2021-10-01) + + + +# 2.86.0 (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.93](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.93) (2021-09-28) + + + +# 2.85.0 (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.92](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.92) (2021-09-13) + + + +# 2.84.0 (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.91](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.91) (2021-09-13) + + + +# 2.83.0 (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.90](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.90) (2021-09-08) + + + +# 2.82.0 (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.89](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.89) (2021-08-25) + + + +# 2.81.0 (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.88](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.88) (2021-08-25) + + + +# 2.80.0 (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.87](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.87) (2021-08-16) + + + +# 2.79.0 (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.86](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.86) (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.85](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.85) (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.84](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.84) (2021-08-04) + + + +# 2.76.0 (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.83](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.83) (2021-07-28) + + + +# 2.75.0 (2021-07-21) + + + +# 2.74.0 (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.82](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.82) (2021-07-19) + + + +# 2.73.0 (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.81](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.81) (2021-07-16) + + + +# 2.72.0 (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.80](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.80) (2021-07-07) + + + +# 2.71.0 (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.79](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.79) (2021-07-02) + + +### Bug Fixes + +* **comms:** expose NodeGroup property for logical files ([84c44a4](https://github.com/hpcc-systems/Visualization/commit/84c44a461decf08bdb998a42545f17f03f68941d)) + + + +# 2.70.0 (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +# 2.52.0 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.78](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.78) (2021-06-23) + + + +# 2.69.0 (2021-06-23) + + + +# 2.68.0 (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.77](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.77) (2021-06-16) + + + +# 2.67.0 (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.76](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.76) (2021-06-15) + + + +# 2.66.0 (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.75](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.75) (2021-05-26) + + + +# 2.65.0 (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.74](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.74) (2021-05-19) + + + +# 2.64.0 (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.73](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.73) (2021-05-13) + + + +# 2.63.0 (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.72](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.72) (2021-05-08) + + + +# 2.62.0 (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.71](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.71) (2021-04-29) + + + +# 2.61.0 (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.70](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.70) (2021-04-06) + + + +# 2.60.0 (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.69](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.69) (2021-03-16) + + + +# 2.59.0 (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.68](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.68) (2021-02-24) + + + +# 2.58.0 (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.67](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.67) (2021-02-24) + + + +# 2.57.0 (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.66](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.66) (2021-02-22) + + + +# 2.56.0 (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.65](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.65) (2021-02-19) + + + +# 2.55.0 (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.64](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.64) (2021-02-12) + + + +# 2.54.0 (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.63](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.63) (2021-02-05) + + + +# 2.53.0 (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.62](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.62) (2021-02-02) + + + +## 3.0.1 (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.61](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.61) (2021-02-01) + + +### Bug Fixes + +* **security:** Incorrect suffix check ([2c786e6](https://github.com/hpcc-systems/Visualization/commit/2c786e623b16d41d39bade887eaa2e9d28eda401)) + + + +# 2.51.0 (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.60](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.60) (2020-12-15) + + + +# 2.50.0 (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.59](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.59) (2020-12-01) + + + +# 2.49.0 (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.58](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.58) (2020-11-10) + + + +# 2.48.0 (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.57](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.57) (2020-11-03) + + + +# 2.47.0 (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.56](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.56) (2020-10-28) + + + +# 2.46.0 (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.55](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.55) (2020-10-23) + + + +# 2.45.0 (2020-10-16) + + + +# 2.44.0 (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.54](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.54) (2020-10-09) + + + +# 2.43.0 (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.53](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.53) (2020-10-08) + + + +# 2.42.0 (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.52](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.52) (2020-09-24) + + + +# 2.41.0 (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.51](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.51) (2020-09-18) + + + +# 2.40.0 (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.50](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.50) (2020-09-15) + + + +# 2.39.0 (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.49](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.49) (2020-09-09) + + +### Bug Fixes + +* Potential replace issues ([da7e3ca](https://github.com/hpcc-systems/Visualization/commit/da7e3ca2d314623ff069a9246753b18532762168)) + + + +# 2.38.0 (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.48](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.48) (2020-09-03) + + + +# 2.37.0 (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.47](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.47) (2020-08-26) + + + +# 2.36.0 (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.46](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.46) (2020-08-25) + + + +# 2.35.0 (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.45](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.45) (2020-08-24) + + + +# 2.34.0 (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.44](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.44) (2020-08-22) + + + +# 2.33.0 (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.43](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.43) (2020-08-08) + + + +# 2.32.0 (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.42](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.42) (2020-08-05) + + + +# 2.31.0 (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.41](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.41) (2020-07-29) + + + +# 2.30.0 (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.40](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.40) (2020-07-29) + + + +# 2.29.0 (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.39](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.39) (2020-07-28) + + + +# 2.28.0 (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.38](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.38) (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.37](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.37) (2020-07-22) + + + +# 2.26.0 (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.36](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.36) (2020-06-26) + + + +# 2.25.0 (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + + +## [2.23.35](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.35) (2020-06-24) + + + +# 2.24.0 (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.34](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.34) (2020-06-23) + + + +# 2.23.0 (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.33](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.33) (2020-06-23) + + + +# 2.22.0 (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.32](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.32) (2020-06-17) + + + +# 2.21.0 (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.31](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.31) (2020-06-17) + + + +# 2.20.0 (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.30](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.30) (2020-06-17) + + +### Bug Fixes + +* **dashy:** Race condition ([52f90b3](https://github.com/hpcc-systems/Visualization/commit/52f90b3fb3c250b2beed346f83ed7813e0e6834c)) + + + +# 2.19.0 (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.29](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.29) (2020-06-15) + + + +# 2.18.0 (2020-06-02) + + + +# 2.17.0 (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.28](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.28) (2020-05-31) + + + +# 2.16.0 (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.27](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.27) (2020-05-21) + + + +## 2.15.21 (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.26](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.26) (2020-05-20) + + + +## 2.15.20 (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.25](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.25) (2020-05-20) + + + +## 2.15.19 (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.24](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.24) (2020-05-19) + + + +## 2.15.18 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.23](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.23) (2020-05-15) + + +### Bug Fixes + +* **Dashy:** DataGraph not clearing on new selection. ([0aed76b](https://github.com/hpcc-systems/Visualization/commit/0aed76b843f2539cbfb2b0dc553868248441d259)) + + + +## 2.15.17 (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.22](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.22) (2020-05-15) + + +### Bug Fixes + +* **Dashy:** Filter invalid edges ([a2d4a6b](https://github.com/hpcc-systems/Visualization/commit/a2d4a6b2ed751cd7178632054dfd531f67f4a319)) + + + +## 2.15.16 (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + + + + + +## [2.23.21](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.21) (2020-05-14) + + + +## 2.15.15 (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.20](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.20) (2020-05-12) + + + +## 2.15.14 (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.19](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.19) (2020-05-07) + + + +## 2.15.13 (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.18](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.18) (2020-04-24) + + + +## 2.15.12 (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.17](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.17) (2020-04-22) + + + +## 2.15.11 (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.16](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.16) (2020-04-21) + + + +## 2.15.10 (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.15](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.15) (2020-04-21) + + + +## 2.15.9 (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.14](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.14) (2020-04-17) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.13](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.13) (2020-04-11) + + + +## 2.15.7 (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.23.12](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.12) (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.11](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.10...@hpcc-js/marshaller@2.23.11) (2020-04-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.10](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.9...@hpcc-js/marshaller@2.23.10) (2020-04-09) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.9](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.8...@hpcc-js/marshaller@2.23.9) (2020-04-09) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.8](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.7...@hpcc-js/marshaller@2.23.8) (2020-04-09) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.6...@hpcc-js/marshaller@2.23.7) (2020-04-08) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.5...@hpcc-js/marshaller@2.23.6) (2020-04-03) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.4...@hpcc-js/marshaller@2.23.5) (2020-04-01) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.3...@hpcc-js/marshaller@2.23.4) (2020-03-30) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.2...@hpcc-js/marshaller@2.23.3) (2020-03-30) + + +### Bug Fixes + +* **Dashy:** Remove stray CSS ([7ce4a3e](https://github.com/hpcc-systems/Visualization/commit/7ce4a3e362c8e618b5f1738438634a591f76dcc6)) + + + + + + +## [2.23.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.1...@hpcc-js/marshaller@2.23.2) (2020-03-20) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.23.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.23.0...@hpcc-js/marshaller@2.23.1) (2020-03-12) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +# [2.23.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.22.0...@hpcc-js/marshaller@2.23.0) (2020-03-05) + + +### Features + +* **Dashy:** Add support for "set" HIPIE inputs ([42986b9](https://github.com/hpcc-systems/Visualization/commit/42986b943941715e61cfa7210be98cbad10bd0c4)) + + + + + +# [2.22.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.21.1...@hpcc-js/marshaller@2.22.0) (2020-03-02) + + +### Features + +* **Graph2:** Various improvements for ECL Watch integration ([668c9b4](https://github.com/hpcc-systems/Visualization/commit/668c9b40f8f84b2ce62fd0a6f59f44c4b9aa4483)) + + + + + +## [2.21.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.21.0...@hpcc-js/marshaller@2.21.1) (2020-02-14) + + +### Bug Fixes + +* **dgrid:** Click regression (multi selection) ([19616d0](https://github.com/hpcc-systems/Visualization/commit/19616d06313b8c9670fbd8697db782140fefa26a)) + + + + + +# [2.21.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.20.5...@hpcc-js/marshaller@2.21.0) (2020-02-13) + + +### Features + +* **Dashy:** Improved REST support ([ccc9abc](https://github.com/hpcc-systems/Visualization/commit/ccc9abceb2def98124aa57ff20a3ae0d770e24a9)) + + + + + +## [2.20.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.20.4...@hpcc-js/marshaller@2.20.5) (2020-02-07) + + +### Bug Fixes + +* **dashy:** no data when responseField === "" ([81956c3](https://github.com/hpcc-systems/Visualization/commit/81956c30ceeae9e6d6c34f6205e20c02532cb3f3)) + + + + + + +## [2.20.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.20.3...@hpcc-js/marshaller@2.20.4) (2020-02-07) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.20.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.20.2...@hpcc-js/marshaller@2.20.3) (2020-02-04) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.20.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.20.1...@hpcc-js/marshaller@2.20.2) (2020-01-29) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.20.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.20.0...@hpcc-js/marshaller@2.20.1) (2020-01-23) + + +### Bug Fixes + +* Add noDeserialize to computedFields ([5f1e10c](https://github.com/hpcc-systems/Visualization/commit/5f1e10c1dcbb1dc9b5ea95193d4a0eb87f68cab9)) + + + + + +# [2.20.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.19.4...@hpcc-js/marshaller@2.20.0) (2020-01-22) + + +### Features + +* **Graph2:** Various Graph2 improvements: ([8482ff0](https://github.com/hpcc-systems/Visualization/commit/8482ff0c44e9945981c38e4d861536966089f88d)) +* **marshaller:** Add Static Filter Option ([0515dc6](https://github.com/hpcc-systems/Visualization/commit/0515dc626b80b1e7daa7974607ff22f8c394e804)), closes [#3476](https://github.com/hpcc-systems/Visualization/issues/3476) + + + + + +## [2.19.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.19.3...@hpcc-js/marshaller@2.19.4) (2020-01-07) + + +### Bug Fixes + +* **Marshaller:** Use public ID function ([c13bdaf](https://github.com/hpcc-systems/Visualization/commit/c13bdaf99823d8e83fa78d4cb824ff628591bda4)) + + + + + + +## [2.19.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.19.2...@hpcc-js/marshaller@2.19.3) (2019-12-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.19.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.19.1...@hpcc-js/marshaller@2.19.2) (2019-10-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.19.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.19.0...@hpcc-js/marshaller@2.19.1) (2019-10-10) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +# [2.19.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.18.2...@hpcc-js/marshaller@2.19.0) (2019-10-08) + + +### Features + +* **AdjacencyGraph:** Add PP for user assigned columns ([af6e031](https://github.com/hpcc-systems/Visualization/commit/af6e031)) + + + + + +## [2.18.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.18.1...@hpcc-js/marshaller@2.18.2) (2019-10-01) + + +### Bug Fixes + +* **Dashy:** Generated DDL for WUs + RoxieService Issue ([d2e97b4](https://github.com/hpcc-systems/Visualization/commit/d2e97b4)) +* **Dashy:** Tweak Mappings mapped UI ([c09cad6](https://github.com/hpcc-systems/Visualization/commit/c09cad6)) + + + + + + +## [2.18.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.18.0...@hpcc-js/marshaller@2.18.1) (2019-09-27) + + +### Bug Fixes + +* **build:** Remove duplicate d3 packages from bundles ([b379f82](https://github.com/hpcc-systems/Visualization/commit/b379f82)) +* **marshaller:** ESPResult sampling is duplicating data ([cb736a6](https://github.com/hpcc-systems/Visualization/commit/cb736a6)) + + + + + +# [2.18.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.17.0...@hpcc-js/marshaller@2.18.0) (2019-09-26) + + +### Bug Fixes + +* **marshaller:** Finish support for databombs dataset fields ([2e6ab95](https://github.com/hpcc-systems/Visualization/commit/2e6ab95)) + + +### Features + +* **dashy:** Global override for sample sizes ([b0de844](https://github.com/hpcc-systems/Visualization/commit/b0de844)) + + + + + +# [2.17.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.16.2...@hpcc-js/marshaller@2.17.0) (2019-09-09) + + +### Bug Fixes + +* **dashy:** Flyout icon not rendering consistently ([0278f1c](https://github.com/hpcc-systems/Visualization/commit/0278f1c)) + + +### Features + +* Add intuitive closing logic for flyout ([e5cff53](https://github.com/hpcc-systems/Visualization/commit/e5cff53)), closes [#3319](https://github.com/hpcc-systems/Visualization/issues/3319) + + + + + +## [2.16.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.16.1...@hpcc-js/marshaller@2.16.2) (2019-08-30) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.16.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.16.0...@hpcc-js/marshaller@2.16.1) (2019-08-30) + + +### Bug Fixes + +* **dashy:** Databomb + Form field coercion ([3809e12](https://github.com/hpcc-systems/Visualization/commit/3809e12)) +* **dashy:** Remove Form default values ([3a30342](https://github.com/hpcc-systems/Visualization/commit/3a30342)) + + + + + +# [2.16.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.15.5...@hpcc-js/marshaller@2.16.0) (2019-08-13) + + +### Bug Fixes + +* **dashy:** Improved Form support ([ddfe22e](https://github.com/hpcc-systems/Visualization/commit/ddfe22e)), closes [#3334](https://github.com/hpcc-systems/Visualization/issues/3334) + + +### Features + +* **Dashy:** Add PP to optionally disable activities in the pipeline. ([5f00645](https://github.com/hpcc-systems/Visualization/commit/5f00645)), closes [#3356](https://github.com/hpcc-systems/Visualization/issues/3356) +* **gallery:** Switch to jsdelivr from unpkg ([cb1d681](https://github.com/hpcc-systems/Visualization/commit/cb1d681)) + + + + + +## [2.15.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.15.4...@hpcc-js/marshaller@2.15.5) (2019-08-07) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.15.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.15.3...@hpcc-js/marshaller@2.15.4) (2019-08-06) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.15.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.15.2...@hpcc-js/marshaller@2.15.3) (2019-08-01) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.15.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.15.1...@hpcc-js/marshaller@2.15.2) (2019-07-10) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.15.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.15.0...@hpcc-js/marshaller@2.15.1) (2019-07-04) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +# [2.15.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.14.4...@hpcc-js/marshaller@2.15.0) (2019-07-03) + + +### Bug Fixes + +* **Dashy:** Flyout menu not rendering on initial load ([c57cc8e](https://github.com/hpcc-systems/Visualization/commit/c57cc8e)) +* **DDL:** Include all known fields in datasource section ([163316e](https://github.com/hpcc-systems/Visualization/commit/163316e)), closes [#3315](https://github.com/hpcc-systems/Visualization/issues/3315) + + +### Features + +* Add PopupManager.ts ([a8714a0](https://github.com/hpcc-systems/Visualization/commit/a8714a0)), closes [#3279](https://github.com/hpcc-systems/Visualization/issues/3279) + + + + + +## [2.14.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.14.3...@hpcc-js/marshaller@2.14.4) (2019-06-27) + + +### Bug Fixes + +* **dashy:** __lparam assigned wrong type ([4156b48](https://github.com/hpcc-systems/Visualization/commit/4156b48)) + + + + + +## [2.14.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.14.2...@hpcc-js/marshaller@2.14.3) (2019-06-27) + + +### Bug Fixes + +* **dashy:** Failed to load as it referenced a "shim". ([fec1aae](https://github.com/hpcc-systems/Visualization/commit/fec1aae)) + + + + + +## [2.14.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.14.1...@hpcc-js/marshaller@2.14.2) (2019-06-27) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.14.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.14.0...@hpcc-js/marshaller@2.14.1) (2019-06-26) + + +### Bug Fixes + +* **build:** Source map reference missing in index.min.js ([bf3bb07](https://github.com/hpcc-systems/Visualization/commit/bf3bb07)) + + + + + + +# [2.14.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.10...@hpcc-js/marshaller@2.14.0) (2019-06-20) + + +### Bug Fixes + +* **build:** Source maps not referencing TS files ([08c3cf3](https://github.com/hpcc-systems/Visualization/commit/08c3cf3)) +* **dashy:** Flyout not rendering in runtime dashboard ([ee9960f](https://github.com/hpcc-systems/Visualization/commit/ee9960f)) +* **dashy:** Mapped fields should include all children by default ([dfe50c0](https://github.com/hpcc-systems/Visualization/commit/dfe50c0)) + + +### Features + +* **dashy:** Add dermatology upgrade script to ddl-shim ([72f2a46](https://github.com/hpcc-systems/Visualization/commit/72f2a46)) +* **dashy:** Preserve DDL fields on load. ([8dfee20](https://github.com/hpcc-systems/Visualization/commit/8dfee20)) + + + + + +## [2.13.10](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.9...@hpcc-js/marshaller@2.13.10) (2019-06-14) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.9](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.8...@hpcc-js/marshaller@2.13.9) (2019-05-23) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.8](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.7...@hpcc-js/marshaller@2.13.8) (2019-05-16) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.6...@hpcc-js/marshaller@2.13.7) (2019-04-27) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.2...@hpcc-js/marshaller@2.13.6) (2019-04-06) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.2...@hpcc-js/marshaller@2.13.4) (2019-04-05) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.2...@hpcc-js/marshaller@2.13.3) (2019-04-02) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.13.1...@hpcc-js/marshaller@2.13.2) (2019-04-02) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.13.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.11.0...@hpcc-js/marshaller@2.13.1) (2019-04-02) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +# [2.13.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.6...@hpcc-js/marshaller@2.13.0) (2019-04-02) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +# [2.12.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.6...@hpcc-js/marshaller@2.12.0) (2019-04-01) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +# [2.11.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.6...@hpcc-js/marshaller@2.11.0) (2019-03-29) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +# [2.10.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.6...@hpcc-js/marshaller@2.10.0) (2019-03-21) + + +### Features + +* **loader:** Improved loader to manage specific versions ([cfcdfac](https://github.com/hpcc-systems/Visualization/commit/cfcdfac)) +* **marshaller:** Add "hookSend" to ElementContainer ([0741568](https://github.com/hpcc-systems/Visualization/commit/0741568)), closes [#3181](https://github.com/hpcc-systems/Visualization/issues/3181) + + + + + + +## [2.9.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.5...@hpcc-js/marshaller@2.9.6) (2019-03-11) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + +## [2.9.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.4...@hpcc-js/marshaller@2.9.5) (2019-03-07) + + +### Bug Fixes + +* **marshaller:** Nested databombs fail to display correctly ([b81881b](https://github.com/hpcc-systems/Visualization/commit/b81881b)) + + + + + + +## [2.9.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.3...@hpcc-js/marshaller@2.9.4) (2019-03-06) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.9.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.2...@hpcc-js/marshaller@2.9.3) (2019-02-20) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.9.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.1...@hpcc-js/marshaller@2.9.2) (2019-02-19) + + +### Bug Fixes + +* **dashy:** Hide single tabs by default in Dashboard ([dddaae2](https://github.com/hpcc-systems/Visualization/commit/dddaae2)) +* **marshaller:** Add min size constraints to contained widgets. ([29b2958](https://github.com/hpcc-systems/Visualization/commit/29b2958)) +* **marshaller:** Add missing "flyout" capability ([1f75e11](https://github.com/hpcc-systems/Visualization/commit/1f75e11)) +* **marshaller:** Debug "v1" + "v1->v2" not refreshing correctly ([24f45b4](https://github.com/hpcc-systems/Visualization/commit/24f45b4)) +* **marshaller:** Ensure Forms always have selection state. ([83ef052](https://github.com/hpcc-systems/Visualization/commit/83ef052)) +* **marshaller:** Preserve mappings when user changes visualization ([f39422d](https://github.com/hpcc-systems/Visualization/commit/f39422d)) +* **marshaller:** Rollback choropleth to non leaflet version ([7f07b5e](https://github.com/hpcc-systems/Visualization/commit/7f07b5e)) +* Ensure all widgets can be re-targeted ([d1f02c2](https://github.com/hpcc-systems/Visualization/commit/d1f02c2)) + + + + + + +## [2.9.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.9.0...@hpcc-js/marshaller@2.9.1) (2019-01-29) + + +### Bug Fixes + +* **marshaller:** Nullable not working for "in" and "range" ([6b98594](https://github.com/hpcc-systems/Visualization/commit/6b98594)), closes [#3105](https://github.com/hpcc-systems/Visualization/issues/3105) +* **marshaller:** Race condition ([2673d29](https://github.com/hpcc-systems/Visualization/commit/2673d29)), closes [#3106](https://github.com/hpcc-systems/Visualization/issues/3106) + + + + + + +# [2.9.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.8.1...@hpcc-js/marshaller@2.9.0) (2019-01-08) + + +### Features + +* **maps:** Add leaflet map support ([74d36d1](https://github.com/hpcc-systems/Visualization/commit/74d36d1)) + + + + + + +## [2.8.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.8.0...@hpcc-js/marshaller@2.8.1) (2018-12-14) + + +### Bug Fixes + +* **marshaller:** Potential filter issue ([604bc48](https://github.com/hpcc-systems/Visualization/commit/604bc48)) + + + + + +# [2.8.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.7.0...@hpcc-js/marshaller@2.8.0) (2018-12-13) + + +### Bug Fixes + +* **dashy:** False positive error on initial load ([c354d12](https://github.com/hpcc-systems/Visualization/commit/c354d12)) +* **ddl:** Incorrect input/output lists in the DDL ([38ca0ac](https://github.com/hpcc-systems/Visualization/commit/38ca0ac)) +* **marshaller:** Unnamed roxie results fail to display ([32078c2](https://github.com/hpcc-systems/Visualization/commit/32078c2)) + + +### Features + +* **dashy:** Enable XYAxis range selection ([ec96d97](https://github.com/hpcc-systems/Visualization/commit/ec96d97)) + + + + + + +# [2.7.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.6.0...@hpcc-js/marshaller@2.7.0) (2018-12-06) + + +### Bug Fixes + +* **dashy:** Selected highlight didn't highlight top of tab sheet ([0ed38a3](https://github.com/hpcc-systems/Visualization/commit/0ed38a3)), closes [#3010](https://github.com/hpcc-systems/Visualization/issues/3010) + + +### Features + +* **dashy:** Minor usability tweaks ([9531690](https://github.com/hpcc-systems/Visualization/commit/9531690)) +* **dashy:** Option to clone datasources ([facdb86](https://github.com/hpcc-systems/Visualization/commit/facdb86)) +* **dashy:** Various datasource tweaks ([ebfa316](https://github.com/hpcc-systems/Visualization/commit/ebfa316)) + + + + + + +# [2.6.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.5.1...@hpcc-js/marshaller@2.6.0) (2018-12-04) + + +### Features + +* **dashy:** Better Error UI ([c1bf784](https://github.com/hpcc-systems/Visualization/commit/c1bf784)) + + + + + + +## [2.5.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.5.0...@hpcc-js/marshaller@2.5.1) (2018-11-27) + + +### Bug Fixes + +* **dashy:** Chart type was not visible ([e46f1f3](https://github.com/hpcc-systems/Visualization/commit/e46f1f3)) +* **dashy:** Hide title on cloned dashboard. ([de801a8](https://github.com/hpcc-systems/Visualization/commit/de801a8)) +* **dashy:** Improve clear + restore ([6299fb3](https://github.com/hpcc-systems/Visualization/commit/6299fb3)) +* **dashy:** Pipeline graph not refreshing correctly ([f692d16](https://github.com/hpcc-systems/Visualization/commit/f692d16)) + + + + + + + +# [2.5.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.4.1...@hpcc-js/marshaller@2.5.0) (2018-11-26) + + +### Bug Fixes + +* **marshaller:** WU Results should share WU instances ([6ac6f4f](https://github.com/hpcc-systems/Visualization/commit/6ac6f4f)) + + +### Features + +* **dashy:** Improved UI ([f64569e](https://github.com/hpcc-systems/Visualization/commit/f64569e)) +* **toolbar:** Add selection group ([d6849ae](https://github.com/hpcc-systems/Visualization/commit/d6849ae)) + + + + + + +## [2.4.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.4.0...@hpcc-js/marshaller@2.4.1) (2018-11-09) + + +### Bug Fixes + +* **dashy:** Selection state unpredictable ([8766fe1](https://github.com/hpcc-systems/Visualization/commit/8766fe1)) + + + + + + +# [2.4.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.3.0...@hpcc-js/marshaller@2.4.0) (2018-11-08) + + +### Features + +* **dashy:** Add independent datasource view ([b53c751](https://github.com/hpcc-systems/Visualization/commit/b53c751)) + + + + + + +# [2.3.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.2.4...@hpcc-js/marshaller@2.3.0) (2018-10-30) + + +### Bug Fixes + +* **Marshaller:** Open new DDL should auto-select first element ([8228d2b](https://github.com/hpcc-systems/Visualization/commit/8228d2b)), closes [#2940](https://github.com/hpcc-systems/Visualization/issues/2940) + + +### Features + +* **Widget:** Enhanced classed call to match d3 v4 call signature. ([f7e9141](https://github.com/hpcc-systems/Visualization/commit/f7e9141)), closes [#2933](https://github.com/hpcc-systems/Visualization/issues/2933) + + + + + + +## [2.2.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.2.3...@hpcc-js/marshaller@2.2.4) (2018-10-15) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.2.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.2.2...@hpcc-js/marshaller@2.2.3) (2018-10-05) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [2.2.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.2.1...@hpcc-js/marshaller@2.2.2) (2018-09-25) + + +### Bug Fixes + +* **marshaller:** Distinguish between RoxieResult and RoxieService ([81c16ed](https://github.com/hpcc-systems/Visualization/commit/81c16ed)) + + + + + + +## [2.2.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.2.0...@hpcc-js/marshaller@2.2.1) (2018-09-24) + + +### Bug Fixes + +* **marshaller:** Add DDL support to Form ([8c17bf9](https://github.com/hpcc-systems/Visualization/commit/8c17bf9)) +* **marshaller:** Add missing visualizations ([0f65810](https://github.com/hpcc-systems/Visualization/commit/0f65810)) +* **marshaller:** Default to HipieResultRef ([a0fa67f](https://github.com/hpcc-systems/Visualization/commit/a0fa67f)) + + + + + + +# [2.2.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.1.0...@hpcc-js/marshaller@2.2.0) (2018-09-10) + + +### Features + +* **dashy:** Support common datasources properly ([34d6fb7](https://github.com/hpcc-systems/Visualization/commit/34d6fb7)) + + + + + + +# [2.1.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@2.0.0...@hpcc-js/marshaller@2.1.0) (2018-09-01) + + +### Features + +* **DockPanel:** Optionally show close [x] button ([96018e4](https://github.com/hpcc-systems/Visualization/commit/96018e4)) + + + + + + +# [2.0.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.6.2...@hpcc-js/marshaller@2.0.0) (2018-08-24) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +# [2.0.0-rc.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.6.2...@hpcc-js/marshaller@2.0.0-rc.0) (2018-08-24) + +**Note:** Version bump only for package @hpcc-js/marshaller + + + + + + +## [0.6.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.6.1...@hpcc-js/marshaller@0.6.2) (2018-08-23) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.6.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.6.0...@hpcc-js/marshaller@0.6.1) (2018-08-15) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +# [0.6.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.5.3...@hpcc-js/marshaller@0.6.0) (2018-08-15) + + +### Features + +* **comms:** Export hookSend from marshaller ([f1d7145](https://github.com/hpcc-systems/Visualization/commit/f1d7145)) +* **dashy:** Import DDL2 from address bar ([3ec2acc](https://github.com/hpcc-systems/Visualization/commit/3ec2acc)) + + + + + +## [0.5.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.5.2...@hpcc-js/marshaller@0.5.3) (2018-08-14) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.5.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.5.1...@hpcc-js/marshaller@0.5.2) (2018-08-14) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.5.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.5.0...@hpcc-js/marshaller@0.5.1) (2018-08-12) + + +### Bug Fixes + +* **comms:** Query.attach should not return a promise. ([20cd947](https://github.com/hpcc-systems/Visualization/commit/20cd947)) + + + + + +# [0.5.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.15...@hpcc-js/marshaller@0.5.0) (2018-08-10) + + +### Features + +* **ddl:** Move layout string into DDL 2.0 ([f1f8eb4](https://github.com/hpcc-systems/Visualization/commit/f1f8eb4)), closes [#2641](https://github.com/hpcc-systems/Visualization/issues/2641) + + + + + +## [0.4.15](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.14...@hpcc-js/marshaller@0.4.15) (2018-08-07) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.14](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.13...@hpcc-js/marshaller@0.4.14) (2018-08-02) + + +### Bug Fixes + +* **d3-event:** d3-event is a global instance. ([92760ad](https://github.com/hpcc-systems/Visualization/commit/92760ad)) + + + + + +## [0.4.13](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.12...@hpcc-js/marshaller@0.4.13) (2018-07-30) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.12](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.11...@hpcc-js/marshaller@0.4.12) (2018-07-30) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.11](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.10...@hpcc-js/marshaller@0.4.11) (2018-07-29) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.10](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.9...@hpcc-js/marshaller@0.4.10) (2018-07-29) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.9](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.8...@hpcc-js/marshaller@0.4.9) (2018-07-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.8](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.7...@hpcc-js/marshaller@0.4.8) (2018-07-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.6...@hpcc-js/marshaller@0.4.7) (2018-07-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.5...@hpcc-js/marshaller@0.4.6) (2018-07-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.4...@hpcc-js/marshaller@0.4.5) (2018-07-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.3...@hpcc-js/marshaller@0.4.4) (2018-07-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.2...@hpcc-js/marshaller@0.4.3) (2018-07-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.4.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.1...@hpcc-js/marshaller@0.4.2) (2018-07-28) + + +### Bug Fixes + +* **marshaller:** TS Code generation was over optimizing the datasource references. ([2928927](https://github.com/hpcc-systems/Visualization/commit/2928927)) + + + + + +## [0.4.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.4.0...@hpcc-js/marshaller@0.4.1) (2018-07-27) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +# [0.4.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.3.2...@hpcc-js/marshaller@0.4.0) (2018-07-27) + + +### Features + +* Add Collapsed publish param tag ([4b65e73](https://github.com/hpcc-systems/Visualization/commit/4b65e73)) + + + + + +## [0.3.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.3.1...@hpcc-js/marshaller@0.3.2) (2018-07-02) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.3.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.3.0...@hpcc-js/marshaller@0.3.1) (2018-06-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +# [0.3.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.2.3...@hpcc-js/marshaller@0.3.0) (2018-06-22) + + +### Bug Fixes + +* **marshaller:** Multiselection not quite working ([056ad8e](https://github.com/hpcc-systems/Visualization/commit/056ad8e)) + + +### Features + +* **EntityRect:** Add EntityRect and EntityRectList ([34cceb3](https://github.com/hpcc-systems/Visualization/commit/34cceb3)) + + + + + +## [0.2.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.2.2...@hpcc-js/marshaller@0.2.3) (2018-06-20) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.2.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.2.1...@hpcc-js/marshaller@0.2.2) (2018-06-19) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.2.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.2.0...@hpcc-js/marshaller@0.2.1) (2018-06-19) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +# [0.2.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.12...@hpcc-js/marshaller@0.2.0) (2018-06-19) + + +### Bug Fixes + +* Add missing save method to dashy ([4c5228a](https://github.com/hpcc-systems/Visualization/commit/4c5228a)) + + +### Features + +* **dashy:** Add [@hpcc-js](https://github.com/hpcc-js)/chart input mapping meta ([fb9e523](https://github.com/hpcc-systems/Visualization/commit/fb9e523)) +* Add lite serialize/deserialize ([799fa5f](https://github.com/hpcc-systems/Visualization/commit/799fa5f)) + + + + + +## [0.1.12](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.11...@hpcc-js/marshaller@0.1.12) (2018-06-15) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.11](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.10...@hpcc-js/marshaller@0.1.11) (2018-06-14) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.10](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.9...@hpcc-js/marshaller@0.1.10) (2018-06-01) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.9](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.8...@hpcc-js/marshaller@0.1.9) (2018-05-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.8](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.7...@hpcc-js/marshaller@0.1.8) (2018-05-28) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.7](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.6...@hpcc-js/marshaller@0.1.7) (2018-05-28) + + +### Bug Fixes + +* Dashy calls render prior to the widget being added to the DOM ([351fd18](https://github.com/hpcc-systems/Visualization/commit/351fd18)) +* DDL upgrade failing on SLIDER ([fbb355c](https://github.com/hpcc-systems/Visualization/commit/fbb355c)), closes [#2579](https://github.com/hpcc-systems/Visualization/issues/2579) +* TS Form generation was invalid ([e8e0252](https://github.com/hpcc-systems/Visualization/commit/e8e0252)) + + + + + +## [0.1.6](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.5...@hpcc-js/marshaller@0.1.6) (2018-05-21) + + +### Bug Fixes + +* Add extra references to assist the DDL2 schema generation ([5138367](https://github.com/hpcc-systems/Visualization/commit/5138367)) + + + + + +## [0.1.5](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.4...@hpcc-js/marshaller@0.1.5) (2018-05-16) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.4](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.3...@hpcc-js/marshaller@0.1.4) (2018-05-16) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.3](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.2...@hpcc-js/marshaller@0.1.3) (2018-05-16) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.2](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.1...@hpcc-js/marshaller@0.1.2) (2018-05-16) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +## [0.1.1](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.1.0...@hpcc-js/marshaller@0.1.1) (2018-05-16) + + + + +**Note:** Version bump only for package @hpcc-js/marshaller + + +# [0.1.0](https://github.com/hpcc-systems/Visualization/compare/@hpcc-js/marshaller@0.0.91...@hpcc-js/marshaller@0.1.0) (2018-05-16) + + +### Features + +* Add CSV/TSV Support to databomb datasource ([fd96de0](https://github.com/hpcc-systems/Visualization/commit/fd96de0)), closes [#2564](https://github.com/hpcc-systems/Visualization/issues/2564) +* Graph support in the marshaller ([bcc2290](https://github.com/hpcc-systems/Visualization/commit/bcc2290)), closes [#2559](https://github.com/hpcc-systems/Visualization/issues/2559) +* Improve dashy experience ([6b5ed37](https://github.com/hpcc-systems/Visualization/commit/6b5ed37)), closes [#2532](https://github.com/hpcc-systems/Visualization/issues/2532) [#2531](https://github.com/hpcc-systems/Visualization/issues/2531) [#2530](https://github.com/hpcc-systems/Visualization/issues/2530) diff --git a/packages/marshaller/esbuild.js b/packages/marshaller/esbuild.js new file mode 100644 index 0000000000..67b91a9988 --- /dev/null +++ b/packages/marshaller/esbuild.js @@ -0,0 +1,29 @@ +import { browserTpl } from "@hpcc-js/esbuild-plugins"; +import pkg from "./package.json" with { type: "json" }; + +// config --- +await Promise.all([ + browserTpl("src/index.ts", "dist/index", { + keepNames: true, + alias: { + "d3-array": "@hpcc-js/common", + "d3-brush": "@hpcc-js/common", + "d3-collection": "@hpcc-js/common", + "d3-color": "@hpcc-js/common", + "d3-dispatch": "@hpcc-js/common", + "d3-drag": "@hpcc-js/common", + "d3-dsv": "@hpcc-js/common", + "d3-ease": "@hpcc-js/common", + "d3-format": "@hpcc-js/common", + "d3-interpolate": "@hpcc-js/common", + "d3-scale": "@hpcc-js/common", + "d3-selection": "@hpcc-js/common", + "d3-time-format": "@hpcc-js/common", + "d3-transition": "@hpcc-js/common", + "d3-zoom": "@hpcc-js/common" + }, + external: [ + ...Object.keys(pkg.dependencies), + ] + }) +]); diff --git a/packages/marshaller/index-preview.html b/packages/marshaller/index-preview.html new file mode 100644 index 0000000000..f9dc46d610 --- /dev/null +++ b/packages/marshaller/index-preview.html @@ -0,0 +1,65 @@ + + + + + @hpcc-js/marshaller + + + + + + +
+ + + + + \ No newline at end of file diff --git a/packages/marshaller/index.html b/packages/marshaller/index.html new file mode 100644 index 0000000000..7311747292 --- /dev/null +++ b/packages/marshaller/index.html @@ -0,0 +1,43 @@ + + + + + @hpcc-js/marshaller + + + + + +
+ + + + \ No newline at end of file diff --git a/packages/marshaller/package.json b/packages/marshaller/package.json new file mode 100644 index 0000000000..f716620c83 --- /dev/null +++ b/packages/marshaller/package.json @@ -0,0 +1,76 @@ +{ + "name": "@hpcc-js/marshaller", + "version": "3.0.0", + "description": "hpcc-js - Viz Marshaller", + "type": "module", + "main": "./dist/index.umd.cjs", + "module": "./dist/index.js", + "exports": { + ".": { + "types": "./types/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.umd.cjs" + }, + "./dist/*": "./dist/*" + }, + "browser": "./dist/index.umd.cjs", + "types": "./types/index.d.ts", + "files": [ + "dist/*", + "src/*", + "types/*" + ], + "scripts": { + "clean": "rimraf --glob lib* types dist *.tsbuildinfo .turbo", + "bundle": "vite build", + "bundle-watch": "vite build --watch", + "bundle-serve": "vite --port 5520", + "gen-types": "tsc --project tsconfig.json", + "gen-types-watch": "npm run gen-types -- --watch", + "build": "run-p gen-types bundle", + "watch": "run-p gen-types-watch bundle-watch", + "lint": "eslint ./src", + "lint-fix": "eslint --fix src/**/*.ts", + "docs": "typedoc --options tdoptions.json .", + "test-browser": "vitest run --project browser", + "test": "vitest run", + "coverage": "vitest run --coverage", + "update": "npx --yes npm-check-updates -u -t minor", + "update-major": "npx --yes npm-check-updates -u" + }, + "dependencies": { + "@hpcc-js/chart": "^3.7.5", + "@hpcc-js/codemirror": "^3.7.5", + "@hpcc-js/common": "^3.7.6", + "@hpcc-js/comms": "^3.15.6", + "@hpcc-js/composite": "^3.5.6", + "@hpcc-js/ddl-shim": "^3.3.5", + "@hpcc-js/dgrid": "^3.7.6", + "@hpcc-js/form": "^3.4.5", + "@hpcc-js/graph": "^3.7.5", + "@hpcc-js/layout": "^3.5.11", + "@hpcc-js/map": "^3.5.5", + "@hpcc-js/other": "^3.5.5", + "@hpcc-js/phosphor": "^3.5.5", + "@hpcc-js/util": "^3.5.5" + }, + "devDependencies": { + "@hpcc-js/esbuild-plugins": "^1.8.7", + "d3-array": "^1", + "d3-collection": "^1", + "d3-dsv": "^1", + "d3-fetch": "^1", + "d3-selection": "^1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hpcc-systems/Visualization.git" + }, + "author": "Gordon Smith ", + "contributors": [], + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/hpcc-systems/Visualization/issues" + }, + "homepage": "https://github.com/hpcc-systems/Visualization" +} \ No newline at end of file diff --git a/packages/marshaller/src/__package__.ts b/packages/marshaller/src/__package__.ts new file mode 100644 index 0000000000..3bc457cb28 --- /dev/null +++ b/packages/marshaller/src/__package__.ts @@ -0,0 +1,3 @@ +export const PKG_NAME = "__PACKAGE_NAME__"; +export const PKG_VERSION = "__PACKAGE_VERSION__"; +export const BUILD_VERSION = "__BUILD_VERSION__"; diff --git a/packages/marshaller/src/dashy.css b/packages/marshaller/src/dashy.css new file mode 100644 index 0000000000..c9056f4101 --- /dev/null +++ b/packages/marshaller/src/dashy.css @@ -0,0 +1,251 @@ +body { + padding:0px; + margin:8px; + overflow:hidden; +} + +#placeholderXXX { + width:100%; + height:100vh; +} + +.graph_Graph .graphVertex > .subgraph .title rect { + fill: #dcf1ff; + border-bottom-width:0px; +} + +.graph_Graph .graphVertex > .subgraph .title text { + fill: black; +} + +.graph_Graph .graphVertex > .subgraph rect { + fill: none; +} + +.graph_Graph .graphVertex > .subgraph.selected rect { + stroke:red !important; +} + +.graph_Graph .graphVertex .graph_Vertex.selected .common_Shape { + stroke:red !important; +} + +.graph_Graph .common_Surface .common_Menu { + visibility: hidden; +} + +.lm-MenuBar { + padding-left: 5px; + background: #FAFAFA; + color: rgba(0, 0, 0, 0.87); + border-bottom: 1px solid #DDDDDD; + font: 13px Helvetica, Arial, sans-serif; +} + +.lm-MenuBar-menu { + transform: translateY(-1px); +} + +.lm-MenuBar-item { + padding: 4px 8px; + border-left: 1px solid transparent; + border-right: 1px solid transparent; +} + + +.lm-MenuBar-item.lm-mod-active { + background: #E5E5E5; +} + + +.lm-MenuBar.lm-mod-active .lm-MenuBar-item.lm-mod-active { + z-index: 10001; + background: white; + border-left: 1px solid #C0C0C0; + border-right: 1px solid #C0C0C0; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); +} + +.lm-Menu { + padding: 3px 0px; + background: white; + color: rgba(0, 0, 0, 0.87); + border: 1px solid #C0C0C0; + font: 12px Helvetica, Arial, sans-serif; + box-shadow: 0px 1px 6px rgba(0, 0, 0, 0.2); +} + + +.lm-Menu-item.lm-mod-active { + background: #E5E5E5; +} + + +.lm-Menu-item.lm-mod-disabled { + color: rgba(0, 0, 0, 0.25); +} + + +.lm-Menu-itemIcon { + width: 21px; + padding: 4px 2px; +} + + +.lm-Menu-itemLabel { + padding: 4px 35px 4px 2px; +} + + +.lm-Menu-itemMnemonic { + text-decoration: underline; +} + + +.lm-Menu-itemShortcut { + padding: 4px 0px; +} + + +.lm-Menu-itemSubmenuIcon { + width: 16px; + padding: 4px 0px; +} + + +.lm-Menu-item[data-type='separator'] > div { + padding: 0; + height: 9px; +} + + +.lm-Menu-item[data-type='separator'] > div::after { + content: ''; + display: block; + position: relative; + top: 4px; + border-top: 1px solid #DDDDDD; +} + + +.lm-Menu-itemIcon::before, +.lm-Menu-itemSubmenuIcon::before { + font-family: FontAwesome; +} + + +.lm-Menu-item.lm-mod-toggled > .lm-Menu-itemIcon::before { + content: '\f00c'; +} + + +.lm-Menu-item[data-type='submenu'] > .lm-Menu-itemSubmenuIcon::before { + content: '\f0da'; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + + +.lm-CommandPalette { + font-family: sans-serif; + background: #F5F5F5; +} + + +.lm-CommandPalette-search { + padding: 8px; +} + + +.lm-CommandPalette-wrapper { + padding: 4px 6px; + background: white; + border: 1px solid #E0E0E0; +} + + +.lm-CommandPalette-input { + width: 100%; + border: none; + outline: none; + font-size: 16px; +} + + +.lm-CommandPalette-header { + padding: 4px; + color: #757575; + font-size: 12px; + font-weight: 600; + background: #E1E1E1; + cursor: pointer; +} + + +.lm-CommandPalette-header:hover::before { + content: '\2026'; /* ellipsis */ + float: right; + margin-right: 4px; +} + + +.lm-CommandPalette-header > mark { + background-color: transparent; + font-weight: bold; +} + + +.lm-CommandPalette-item { + padding: 4px 8px; + color: #757575; + font-size: 13px; + font-weight: 500; +} + + +.lm-CommandPalette-emptyMessage { + padding: 4px; + color: #757575; + font-size: 12px; + font-weight: 600; + text-align: center; +} + + +.lm-CommandPalette-item.lm-mod-disabled { + color: rgba(0, 0, 0, 0.25); +} + + +.lm-CommandPalette-item.lm-mod-active { + background: #7FDBFF; +} + + +.lm-CommandPalette-item:hover:not(.lm-mod-active):not(.lm-mod-disabled) { + background: #E5E5E5; +} + + +.lm-CommandPalette-itemLabel > mark { + background-color: transparent; + font-weight: bold; +} + + +.lm-CommandPalette-item.lm-mod-disabled mark { + color: rgba(0, 0, 0, 0.4); +} + + +.lm-CommandPalette-itemCaption { + color: #9E9E9E; + font-size: 11px; + font-weight: 400; +} \ No newline at end of file diff --git a/packages/marshaller/src/dashy.ts b/packages/marshaller/src/dashy.ts new file mode 100644 index 0000000000..9b00834b06 --- /dev/null +++ b/packages/marshaller/src/dashy.ts @@ -0,0 +1,524 @@ +import { JSEditor, JSONEditor } from "@hpcc-js/codemirror"; +import { Button, PropertyExt, Utility, Widget } from "@hpcc-js/common"; +import { DDL1, DDL2, ddl2Schema, isDDL2Schema, upgrade } from "@hpcc-js/ddl-shim"; +import { Graph } from "@hpcc-js/graph"; +import { ChartPanel } from "@hpcc-js/layout"; +import { CommandPalette, CommandRegistry, ContextMenu, SplitPanel, TabPanel, WidgetAdapter } from "@hpcc-js/phosphor"; +import { scopedLogger } from "@hpcc-js/util"; +import { Activity } from "./ddl2/activities/activity.ts"; +import { Databomb } from "./ddl2/activities/databomb.ts"; +import { DSPicker } from "./ddl2/activities/dspicker.ts"; +import { Dashboard } from "./ddl2/dashboard.ts"; +import { DSTable } from "./ddl2/dsTable.ts"; +import { DVTable } from "./ddl2/dvTable.ts"; +import { GraphAdapter, VertexData } from "./ddl2/graphadapter.ts"; +import { Element, ElementContainer, State } from "./ddl2/model/element.ts"; +import { Visualization } from "./ddl2/model/visualization.ts"; +import { VizChartPanel } from "./ddl2/model/vizChartPanel.ts"; +import { PipelineSplitPanel } from "./ddl2/pipelinePanel.ts"; + +const logger = scopedLogger("marshaller/dashy"); + +import "../src/dashy.css"; + +export type FocusType = Element | Activity | Visualization | VizChartPanel | State | undefined; + +class DDLPreview extends ChartPanel { + + private _save = new Button().faChar("fa-save").tooltip("Save") + .on("click", () => { + const obj = JSON.parse(this._jsonEditor.text()); + this._dashy.importDDL(obj); + this.updateToolbar(); + }); + + private _reset = new Button().faChar("fa-undo").tooltip("Reset") + .on("click", () => { + this._jsonEditor + .text(this._ddl) + .lazyRender() + ; + this.updateToolbar(); + }); + + private _jsonEditor = new JSONEditor() + .on("changes", (changes: object[]) => { + this.updateToolbar(); + }); + + constructor(private _dashy: Dashy) { + super(); + this._titleBar.buttons([this._save, this._reset]); + this.widget(this._jsonEditor); + } + + private _ddl; + ddl(_: DDL2.Schema): this { + this._ddl = JSON.stringify(_, undefined, 4); + return this; + } + + private _prevJson: string; + update(domNode, element) { + super.update(domNode, element); + if (this._prevJson !== this._ddl) { + this._prevJson = this._ddl; + this._jsonEditor.text(this._ddl); + } + this.updateToolbar(); + } + + updateToolbar() { + const editorJson = this._jsonEditor.text(); + this._save.enabled(this._ddl !== editorJson).lazyRender(); + this._reset.enabled(this._ddl !== editorJson).lazyRender(); + } +} + +export class Dashy extends SplitPanel { + + private _elementContainer: ElementContainer = new ElementContainer(); + + private _lhsSheet = new TabPanel(); + private _lhsDashboard: Dashboard = new Dashboard(this._elementContainer) + .on("vizActivation", (elem: Element, wa: WidgetAdapter) => { + this.focus(this._lhsDashboard, elem); + }) + .on("vizStateChanged", (elem: Element) => { + for (const filteredViz of this._elementContainer.filteredBy(elem.id())) { + if (this.focus() === filteredViz) { + this._rhsSplitView.refreshPreview(); + } + } + }) + ; + private _lhsDataviews: DVTable = new DVTable(this._elementContainer) + .on("click", (row: any, col: string, sel: boolean, ext: any) => { + this.focus(this._lhsDataviews, row.__lparam); + this._rhsSplitView.refreshPreview(); + }) + ; + private _lhsDatasources: DSTable = new DSTable(this._elementContainer) + .on("click", (row: any, col: string, sel: boolean, ext: any) => { + this.focus(this._lhsDatasources, row.__lparam); + this._rhsSplitView.refreshPreview(); + }) + ; + private _graphAdapter = new GraphAdapter(this._elementContainer); + private _lhsPipeline: Graph = new Graph() + .layout("Hierarchy") + .allowDragging(false) + .applyScaleOnLayout(true) + .on("vertex_click", (row: any, col: string, sel: boolean, ext: any) => { + const obj: VertexData = row.__lparam[0] || {}; + this.focus(this._lhsPipeline, obj.state || obj.chartPanel || obj.visualization || obj.activity || obj.view); + }) + .on("vertex_contextmenu", (row: any, col: string, sel: boolean, ext: any) => { + }) + ; + private _lhsDebugSheet = new TabPanel(); + private _lhsDebugDDLEditor = new DDLPreview(this); + private _lhsDebugDDLSchema = new JSONEditor().json(ddl2Schema); + private _lhsDebugJSEditor = new JSEditor(); + private _lhsDebugCloneEC: ElementContainer = new ElementContainer(); + private _lhsDebugClone: Dashboard = new Dashboard(this._lhsDebugCloneEC).hideSingleTabs(true).titleVisible(false); + private _lhsDebugDDLv1 = new JSONEditor(); + private _lhsDebugDDLv2 = new JSONEditor(); + + private _rhsSplitView = new PipelineSplitPanel(); + + private _fileOpen; + + static create(target: string, ddl?: DDL1.DDLSchema | DDL2.Schema, baseUrl?: string, wuid?: string): Promise { + return new Promise((resolve, reject) => { + const dashy = new Dashy() + .target(target) + .render((w: Dashy) => { + if (ddl) { + w.importDDL(ddl, baseUrl, wuid).then(() => { + resolve(dashy); + }); + } else { + resolve(dashy); + } + }); + }); + } + + constructor() { + super("horizontal"); + } + + elementContainer(): ElementContainer { + return this._elementContainer; + } + + clear(): Promise { + this._lhsDebugSheet.removeWidget(this._lhsDebugDDLv1); + this._lhsDebugSheet.removeWidget(this._lhsDebugDDLv2); + this._elementContainer.clear(); + this._graphAdapter.clear(); + this.focus(this._lhsDashboard, undefined); + return this.loadDashboard().then(() => { + return this._elementContainer.refresh(); + }).then(ec => { + return; + }); + } + + save(): DDL2.Schema { + return this._lhsDashboard.save(); + } + + restore(json: DDL2.Schema): Promise { + this._lhsSheet.active(this._lhsDashboard); + return this.clear().then(() => { + this._lhsDashboard.restore(json); + this._lhsDataviews.render(); + this._lhsDatasources.render(); + return this._lhsDashboard.renderPromise().then(() => { + const elements = this._elementContainer.elements(); + if (elements.length) { + this._lhsDashboard.activate(elements[0]); + } + return this._elementContainer.refresh(); + }).then(() => { + let hasError = false; + for (const error of this._elementContainer.validate()) { + hasError = true; + logger.warning(error.elementID + " (" + error.source + "): " + error.msg); + } + if (hasError) { + // Re-render to highlight errrors --- + this._lhsDashboard.renderPromise(); + } + }); + }); + } + + importDDL(ddl: DDL1.DDLSchema | DDL2.Schema, baseUrl?: string, wuid?: string, dermatologyJson: object = {}): Promise { + const ddl2: DDL2.Schema = isDDL2Schema(ddl) ? ddl : upgrade(ddl, baseUrl, wuid, true, dermatologyJson); + const retVal = this.restore(ddl2); + if (isDDL2Schema(ddl)) { + this._lhsDebugDDLv2.json(ddl2); + this._lhsDebugSheet + .addWidget(this._lhsDebugDDLv2, "orig v2") + ; + } else { + this._lhsDebugDDLv1.json(ddl); + this._lhsDebugDDLv2.json(ddl2); + this._lhsDebugSheet + .addWidget(this._lhsDebugDDLv1, "v1") + .addWidget(this._lhsDebugDDLv2, "v1 -> v2") + ; + } + return retVal; + } + + activeLHS(): Widget { + let retVal = this._lhsSheet.active(); + if (retVal === this._lhsDebugSheet) { + retVal = this._lhsDebugSheet.active(); + } + return retVal; + } + + activeRHS(): Widget { + return this._rhsSplitView; + } + + private _currSelection: { [sourceID: string]: FocusType } = {}; + + private focusAsElement(): Element | undefined { + const currSelection = this.focus(); + return currSelection instanceof Element ? currSelection : undefined; + } + + private focus(): FocusType; + private focus(source: Widget, item: FocusType): this; + private focus(source?: Widget, item?: FocusType): FocusType | this { + if (!arguments.length) return this._currSelection[this.activeLHS().id()]; + if (this._currSelection[source.id()] !== item) { + this._currSelection[source.id()] = item; + this.loadRHSSplit(); + } + return this; + } + + loadRHSSplit() { + this._rhsSplitView.loadDataProps(this.focus()); + } + + loadDataviews(): Promise { + if (this.activeLHS() === this._lhsDataviews) { + return this._lhsDataviews.renderPromise(); + } + return Promise.resolve(undefined); + } + + loadDatasources(): Promise { + if (this.activeLHS() === this._lhsDatasources) { + return this._lhsDatasources.renderPromise(); + } + return Promise.resolve(undefined); + } + + loadDashboard(): Promise { + if (this.activeLHS() === this._lhsDashboard) { + this._elementContainer.validate(); + return this._lhsDashboard.renderPromise(); + } + return Promise.resolve(undefined); + } + + loadGraph() { + this._lhsPipeline + .data({ ...this._graphAdapter.createGraph() }, true) + ; + if (this.activeLHS() === this._lhsPipeline) { + this._lhsPipeline + .lazyRender() + ; + } + } + + loadDDL() { + this._lhsDebugDDLEditor + .ddl(this._lhsDashboard.ddl()) + ; + if (this.activeLHS() === this._lhsDebugDDLEditor) { + this._lhsDebugDDLEditor + .lazyRender() + ; + } + } + + loadJavaScript() { + this._lhsDebugJSEditor + .javascript(this._lhsDashboard.javascript()) + ; + if (this.activeLHS() === this._lhsDebugJSEditor) { + this._lhsDebugJSEditor + .lazyRender() + ; + } + } + + loadClone() { + const json = this.save(); + this._lhsDebugCloneEC.clear(); + this._lhsDebugClone.renderPromise().then(() => { + this._lhsDebugClone.restore(json); + this._lhsDebugClone.renderPromise().then(() => { + return this._lhsDebugCloneEC.refresh(); + }).then(() => { + for (const error of this._lhsDebugCloneEC.validate()) { + logger.warning(error.elementID + " (" + error.source + "): " + error.msg); + } + }); + }); + } + + initMenu() { + const commands = new CommandRegistry(); + + // Dashboard Commands --- + commands.addCommand("dash_add", { + label: "Add View", + execute: () => { + const newElem = new Element(this._elementContainer); + this._elementContainer.append(newElem); + this.loadDashboard().then(() => { + newElem.refresh().then(() => { + this._lhsDashboard.activate(newElem); + }); + }); + } + }); + + commands.addCommand("dash_clear", { + label: "Clear", + execute: () => { + this.clear(); + } + }); + + commands.addCommand("dash_save", { + label: "Save", + execute: () => { + const text = JSON.stringify(this.save(), null, " "); + Utility.downloadString("JSON", text, "dashy"); + } + }); + + commands.addCommand("dash_load", { + label: "Open", + execute: () => { + this._fileOpen.property("accept", ".dashy,.json"); + this._fileOpen.node().click(); + } + }); + + // Model Commands --- + const palette = new CommandPalette({ commands }); + palette.addItem({ command: "addWUResult", category: "Notebook" }); + palette.addItem({ command: "addView", category: "Notebook" }); + palette.addItem({ command: "remove", category: "Notebook" }); + palette.id = "palette"; + + const contextMenu = new ContextMenu({ commands }); + + contextMenu.addItem({ command: "dash_add", selector: `#${this._lhsDashboard.id()}` }); + contextMenu.addItem({ command: "dash_clear", selector: `#${this._lhsDashboard.id()}` }); + contextMenu.addItem({ type: "separator", selector: `#${this._lhsDashboard.id()}` }); + + contextMenu.addItem({ command: "dash_load", selector: `#${this.id()}` }); + contextMenu.addItem({ command: "dash_save", selector: `#${this.id()}` }); + + document.addEventListener("contextmenu", (event: MouseEvent) => { + if (contextMenu.open(event)) { + event.preventDefault(); + } + }); + } + + addDatabomb(label: string, payload: string, format: "csv" | "tsv" | "json") { + const databomb = new Databomb().id(label).format(format).payload(payload); + this._elementContainer.appendDatasource(databomb); + const newElem = new Element(this._elementContainer); + const ds = newElem.hipiePipeline().datasource(); + if (ds instanceof DSPicker) { + ds.datasourceID(databomb.id()); + } + this._elementContainer.append(newElem); + this.loadDashboard().then(() => { + newElem.refresh().then(() => { + this._lhsDashboard.activate(newElem); + }); + }); + } + + enter(domNode, element) { + super.enter(domNode, element); + this + .addWidget(this._lhsSheet) + .addWidget(this._rhsSplitView) + ; + this._lhsSheet + .addWidget(this._lhsDashboard, "Dashboard") + .addWidget(this._lhsDataviews, "Dataviews") + .addWidget(this._lhsDatasources, "Datasources") + .addWidget(this._lhsPipeline, "Pipeline") + .addWidget(this._lhsDebugSheet, "Debug") + .on("childActivation", (w: Widget) => { + switch (w) { + case this._lhsDataviews: + this.loadRHSSplit(); + break; + case this._lhsDatasources: + this.loadRHSSplit(); + break; + case this._lhsDashboard: + this.loadRHSSplit(); + break; + case this._lhsPipeline: + this.loadRHSSplit(); + this.loadGraph(); + break; + case this._lhsDebugSheet: + this._lhsDebugSheet.childActivation(this._lhsDebugSheet.active()); + break; + } + }) + ; + this._lhsDebugSheet + .addWidget(this._lhsDebugDDLEditor, "v2") + .addWidget(this._lhsDebugDDLSchema, "Schema") + .addWidget(this._lhsDebugJSEditor, "TS") + .addWidget(this._lhsDebugClone, "Clone") + .on("childActivation", (w: Widget) => { + switch (w) { + case this._lhsDebugDDLEditor: + this.loadRHSSplit(); + this.loadDDL(); + break; + case this._lhsDebugJSEditor: + this.loadRHSSplit(); + this.loadJavaScript(); + break; + case this._lhsDebugClone: + this.loadClone(); + break; + } + }) + ; + + this.initMenu(); + this._rhsSplitView.on("propChanged", (id: string, newValue: any, oldValue: any, source: PropertyExt) => { + const currElement = this.focusAsElement(); + if (currElement) { + currElement.refresh().then(() => { + this._rhsSplitView.refreshPreview(); + }); + } else { + this._rhsSplitView.refreshPreview(); + } + switch (this.activeLHS()) { + case this._lhsDashboard: + this.loadDashboard(); + break; + case this._lhsDatasources: + this._elementContainer.refresh(); + break; + case this._lhsPipeline: + this.loadGraph(); + break; + case this._lhsDebugDDLEditor: + this.loadDDL(); + break; + case this._lhsDebugClone: + this.loadClone(); + break; + } + }); + + const context = this; + this._fileOpen = element.append("input") + .attr("type", "file") + .property("accept", ".dashy,.json") + .style("display", "none") + .on("change", function () { + let i = 0; + let f = this.files[i]; + while (f) { + const reader = new FileReader(); + reader.onload = (function (theFile) { + return function (e) { + try { + const result = Array.isArray(e.target.result) ? e.target.result[0] : e.target.result; + const json = JSON.parse(result); + context.importDDL(json); + } catch (ex) { + alert("ex when trying to parse json = " + ex); + } + }; + })(f); + reader.readAsText(f); + f = this.files[++i]; + break; + } + }) + ; + } + + update(domNode, element) { + super.update(domNode, element); + } +} +Dashy.prototype._class += " composite_Dashy"; + +export interface Dashy { + disableActivities(): string[]; + disableActivities(_: string[]): this; +} +Dashy.prototype.publishProxy("disableActivities", "_rhsSplitView"); \ No newline at end of file diff --git a/packages/marshaller/src/ddl1/DDLApi.ts b/packages/marshaller/src/ddl1/DDLApi.ts new file mode 100644 index 0000000000..8e5175da7f --- /dev/null +++ b/packages/marshaller/src/ddl1/DDLApi.ts @@ -0,0 +1,229 @@ +export type StringStringDict = { [key: string]: string; }; + +// Datasource =============================================================== +export interface IOutput { + id: string; + from: string; + filter?: string[]; + notify?: string[]; +} + +export interface IDatasource { + id: string; + databomb?: boolean; + WUID?: boolean; + URL?: string; + filter?: string[]; + outputs: IOutput[]; +} + +// Event ==================================================================== +export interface IEventUpdate { + visualization: string; + instance: string; + datasource: string; + col?: string; + merge: boolean; + mappings?: StringStringDict; +} + +export interface IEvent { + mappings: StringStringDict; + updates: IEventUpdate[]; +} + +// Mappings ================================================================= +export interface IPieMapping { + label: string; + weight: string; +} + +export interface ILineMapping { + x: string[]; + y: string[]; +} + +export interface ITableMapping { + value: string[]; +} + +export interface IChoroMapping { + weight: string | string[]; +} + +export interface IChoroUSStateMapping extends IChoroMapping { + state: string; +} + +export interface IChoroUSCountyMapping extends IChoroMapping { + county: string; +} + +export interface IChoroGeohashMapping extends IChoroMapping { + geohash: string; +} + +export interface IGraphMapping { + uid: string; + label: string; + weight: string; + flags: string; +} + +export interface IGraphLinkMapping { + uid: string; +} + +export interface IHeatMapMapping { + x: string; + y: string; + weight: string; +} + +// Source =================================================================== +export interface ISource { + id: string; + output: string; + sort?: string[]; + first?: number; + reverse?: boolean; + properties?: StringStringDict; // TODO Needed? +} + +export interface IPieSource extends ISource { + mappings: IPieMapping; +} + +export interface ILineSource extends ISource { + mappings: ILineMapping; +} + +export interface ITableSource extends ISource { + mappings: ITableMapping; +} + +export interface IGraphLink { + mappings: IGraphLinkMapping; + childfile: string; +} + +export interface IGraphSource extends ISource { + mappings: IGraphMapping; + link: IGraphLink; +} + +export interface IHeatMapSource extends ISource { + mappings: IHeatMapMapping; +} + +export interface IChoroSource extends ISource { + mappings: IAnyChoroMapping; +} + +// Visualization ============================================================ +export type VisualizationType = "PIE" | "LINE" | "BAR" | "TABLE" | "CHORO" | "GRAPH" | "HEAT_MAP" | "SLIDER" | "FORM" | "2DCHART" | "WORD_CLOUD" | "BUBBLE"; +export type VisualizationFieldType = "bool" | "boolean" | "integer" | "unsigned" | "float" | "double" | "date" | "time" | "geohash" | "dataset" | "visualization"; + +export interface IVisualizationField { + id: any; + label: string; + properties: { + type: VisualizationFieldType; + charttype: string; + label: string; + enumvals: string[]; + default: string; + localVisualizationID: string; + }; +} + +export interface IVisualization { + id: string; + title: string; + type: VisualizationType; + properties?: { + charttype: string, + + // TODO Split Known Properties --- + [key: string]: string + }; + events?: { [key: string]: IEvent }; + onSelect?: any; // legacy + + fields?: IVisualizationField[]; + color?: any; // legacy +} + +export type PieType = "PIE"; +export interface IPieVisualization extends IVisualization { + type: PieType; + source: IPieSource; +} + +export interface ILineVisualization extends IVisualization { + source: ILineSource; +} + +export type ChoroColor = "default" | "YlGn" | "YlGnBu" | "GnBu" | "BuGn" | "PuBuGn" | "PuBu" | "BuPu" | "RdPu" | "PuRd" | "OrRd" | "YlOrRd" | "YlOrBr" | "Purples" | "Blues" | "Greens" | "Oranges" | "Reds" | "Greys" | "PuOr" | "BrBG" | "PRGn" | "PiYG" | "RdBu" | "RdGy" | "RdYlBu" | "Spectral" | "RdYlGn" | "RdWhGr"; +export interface IChoroVisualization extends IVisualization { + source: IChoroSource; + + visualizations?: IChoroVisualization[]; + color?: ChoroColor; +} + +export interface ITableVisualization extends IVisualization { + label: string[]; + source: ITableSource; +} + +export interface ISliderVisualization extends IVisualization { + range?: number[]; +} + +export interface IVisualizationIcon { + faChar: string; + fieldid?: string; + valuemappings?: StringStringDict; +} + +export interface IGraphVisualization extends IVisualization { + source: IGraphSource; + + label: string[]; + icon: IVisualizationIcon; + flag: IVisualizationIcon[]; +} + +export interface IHeatMapVisualization extends IVisualization { + source: IHeatMapSource; +} + +// Dashboard ================================================================ +export interface IDashboard { + id: string; + title: string; + enable: string; + label: string; + primary: boolean; + visualizations: IAnyVisualization[]; + datasources: IDatasource[]; +} + +// DDL ====================================================================== +export type DDLSchema = IDashboard[]; + +// Helpers ================================================================== +export type IAnyChoroMapping = IChoroUSStateMapping | IChoroUSCountyMapping | IChoroGeohashMapping; +export function isUSStateMapping(mappings: IAnyChoroMapping) { + return (mappings as IChoroUSStateMapping).state !== undefined; +} +export function isUSCountyMapping(mappings: IAnyChoroMapping) { + return (mappings as IChoroUSCountyMapping).county !== undefined; +} +export function isGeohashMapping(mappings: IAnyChoroMapping) { + return (mappings as IChoroGeohashMapping).geohash !== undefined; +} +export type IAnyMapping = IPieMapping | ILineMapping | IGraphMapping | IAnyChoroMapping | ITableMapping | IHeatMapMapping; +export type IAnySource = IPieSource | ILineSource | ITableSource | IChoroSource | IGraphSource | IHeatMapSource; +export type IAnyVisualization = IPieVisualization | ILineVisualization | ITableVisualization | IChoroVisualization | IGraphVisualization | IHeatMapVisualization; diff --git a/packages/marshaller/src/ddl1/DDLSchema.json b/packages/marshaller/src/ddl1/DDLSchema.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/marshaller/src/ddl1/FlyoutButton.ts b/packages/marshaller/src/ddl1/FlyoutButton.ts new file mode 100644 index 0000000000..79047176a5 --- /dev/null +++ b/packages/marshaller/src/ddl1/FlyoutButton.ts @@ -0,0 +1,121 @@ +import { Widget } from "@hpcc-js/common"; +import { Button } from "@hpcc-js/form"; +import { Popup, Surface } from "@hpcc-js/layout"; + +export class FlyoutButton extends Button { + _popupSurface; + _popup; + _popupParentWidget; + + constructor() { + super(); + + this.value("^"); + + const context = this; + this._popupSurface = new Surface() + .surfaceBackgroundColor("rgb(234, 249, 255)") + .buttonAnnotations([ + { + id: "", + label: "\uf00d", + width: 20, + padding: "0px 5px", + class: "close", + font: "FontAwesome" + } + ]) + .on("click", function (ann) { + if (ann.class === "close") { + context._popup + .visible(false) + .popupState(false) + .render() + ; + } + }) + ; + this._popup = new Popup() + .size({ width: 400, height: 400 }) + .position("fixed") + .widget(this._popupSurface) + ; + } + + reference(obj) { + const retVal: any = new Button() + .value(this.value()) + ; + const context = this; + retVal.click = function () { + context.click(); + }; + return retVal; + } + + click(obj?) { + const context = this; + this._popup + .visible(true) + .popupState(true) + .render(function (w) { + const bbox = context._popupSurface.widget().getBBox(); + context._popupSurface.resize({ + width: bbox.width, + height: bbox.height + context._popupSurface.calcHeight(context._popupSurface.element().select(".surfaceTitle")) + 18 + }); + context._popup.render(); + }) + ; + } + + enter(domNode, element) { + super.enter(domNode, element); + let parentWidget: Widget = this; + while (parentWidget && ["marshaller_HTML", "marshaller_Graph", "composite_MegaChart"].indexOf(parentWidget.classID()) === -1) { + parentWidget = parentWidget.locateParentWidget(); + } + if (parentWidget) { + this._popupParentWidget = parentWidget; + this._popup + .target(parentWidget.node()) + ; + } + } + + render(callback?): this { + const context = this; + const isVisible = this._popup.popupState(); + Button.prototype.render.call(context, function (widget) { + const popupParentWidgetBBox = context._popupParentWidget.getBBox(); + const bbox = widget.getBBox(); + context._popup + .left(bbox.x - popupParentWidgetBBox.x + bbox.width - context._popup.width()) + .top(bbox.y - popupParentWidgetBBox.y + bbox.height) + .visible(isVisible && context.autoClose() ? false : isVisible) // hack: closes the form when submit is clicked --- + .popupState(isVisible && context.autoClose() ? false : isVisible) + .render() + ; + if (callback) { + callback(widget); + } + }); + return this; + } + +} +FlyoutButton.prototype._class += " marshaller_FlyoutButton"; + +export interface FlyoutButton { + title(): string; + title(_: string): this; + widget(): Widget; + widget(_: Widget): this; + autoClose(): boolean; + autoClose(_: boolean): this; + autoClose_exists: () => boolean; +} + +FlyoutButton.prototype.publishProxy("title", "_popupSurface"); +FlyoutButton.prototype.publishProxy("widget", "_popupSurface"); +FlyoutButton.prototype.publish("autoClose", true, "boolean", "Auto Close"); diff --git a/packages/marshaller/src/ddl1/Graph.ts b/packages/marshaller/src/ddl1/Graph.ts new file mode 100644 index 0000000000..0718375cc6 --- /dev/null +++ b/packages/marshaller/src/ddl1/Graph.ts @@ -0,0 +1,96 @@ +import { ResizeSurface } from "@hpcc-js/common"; +import { Edge, Graph as GraphWidget } from "@hpcc-js/graph"; +import { HipieDDLMixin } from "./HipieDDLMixin.ts"; + +export class Graph extends GraphWidget { + _design_mode; + _dashboards; + graphAttributes; + widgetAttributes; + _ddlVisualizations; + _ddlPopupVisualizations; + _ddlDashboards; + + constructor() { + super(); + HipieDDLMixin.call(this); + + this._design_mode = false; + this._dashboards = []; + this.graphAttributes = ["snapToGrid", "showEdges"]; + this.widgetAttributes = ["layout", "chartType", "palette", "title", "columns", "data"]; + this.layout("Hierarchy"); + this.applyScaleOnLayout(true); + this.content([]); + } + + populateContent() { + const vertices = []; + const edges = []; + this._ddlVisualizations.concat(this._ddlPopupVisualizations).forEach(function (viz) { + if (viz.widget) { + let newSurface = null; + if (viz.widget instanceof ResizeSurface) { + newSurface = viz.widget + .size({ width: 210, height: 210 }) + ; + } else { + const width = 280; + const height = 210; + newSurface = new ResizeSurface() + .showTitle(true) + .size({ width, height }) + .content(viz.widget) + ; + } + if (newSurface) { + viz.newWidgetSurface = newSurface; + } + vertices.push(newSurface); + } + viz.getInputVisualizations().forEach(() => { + }); + }, this); + this._ddlDashboards.forEach(dashboard => { + dashboard.visualizations.forEach(viz => { + viz.getInputVisualizations().forEach(inViz => { + edges.push(new Edge() + .sourceVertex(inViz.newWidgetSurface) + .targetVertex(viz.newWidgetSurface) + .targetMarker("arrowHead") + ); + }); + }); + }); + this.content(vertices); + this.data({ vertices, edges }); + } + + enter(domNode, element) { + GraphWidget.prototype.enter.apply(this, arguments); + element.classed("graph_Graph", true); + } + + render(callback) { + this._marshallerRender(GraphWidget.prototype, callback); + return this; + } + + commsError(source, error) { + alert("Comms Error:\n" + source + "\n" + error); + } + + // HipieDDLMixin --- + _marshallerRender: (BaseClass, callback) => this; +} +Graph.prototype.mixin(HipieDDLMixin); +Graph.prototype._class += " marshaller_Graph"; + +export interface Graph { + content(): any[]; + content(_: any[]): this; + content_exists: () => boolean; +} + +// TODO Still Needed?: Graph.prototype.publish("visualizeRoxie", false, "boolean", "Show Roxie Data Sources", null, { tags: ["Private"] }); +Graph.prototype.publish("content", [], "widgetArray", "widgets", null, { tags: ["Basic"] }); diff --git a/packages/marshaller/src/ddl1/HTML.ts b/packages/marshaller/src/ddl1/HTML.ts new file mode 100644 index 0000000000..7c2654331a --- /dev/null +++ b/packages/marshaller/src/ddl1/HTML.ts @@ -0,0 +1,77 @@ +import { Grid } from "@hpcc-js/layout"; +import { HipieDDLMixin } from "./HipieDDLMixin.ts"; + +export class HTML extends Grid { + _ddlDashboards: any[]; + surfacePadding_default: (n: number) => void; + _marshallerRender: (...args: any[]) => any; + + constructor() { + super(); + HipieDDLMixin.call(this); + + this.surfacePadding_default(0); + } + + populateContent() { + let cellRow = 0; + let cellCol = 0; + const cellDensity = 3; + this._ddlDashboards.forEach(dashboard => { + const maxCol = Math.floor(Math.sqrt(dashboard.visualizations.length)); + dashboard.visualizations.forEach(viz => { + if (viz.newWidgetSurface) { + while (this.getCell(cellRow * cellDensity, cellCol * cellDensity) !== null) { + cellCol++; + if (cellCol % maxCol === 0) { + cellRow++; + cellCol = 0; + } + } + this.setContent(cellRow * cellDensity, cellCol * cellDensity, viz.newWidgetSurface, "", cellDensity, cellDensity); + } + }); + }); + + const vizCellMap = {}; + this.content().forEach(function (cell) { + let widget: any = cell.widget(); + if (widget && widget.classID() === "layout_Surface") { + widget = widget.widget(); + } + if (widget) { + vizCellMap[widget.id()] = cell; + } + }); + + this._ddlDashboards.forEach(function (dashboard) { + dashboard.visualizations.forEach(function (viz, idx) { + if (viz.properties.flyout || viz.parentVisualization) { + return; + } + const targetVizs = viz.events.getUpdatesVisualizations(); + const targetIDs = targetVizs.filter(function (targetViz) { + return vizCellMap[targetViz.id]; + }).map(function (targetViz) { + return vizCellMap[targetViz.id].id(); + }); + vizCellMap[viz.id].indicateTheseIds(targetIDs); + }); + }, this); + } + + enter(domNode, element) { + super.enter(domNode, element); + } + + render(callback) { + this._marshallerRender(Grid.prototype, callback); + return this; + } + + commsError(source, error) { + alert("Comms Error:\n" + source + "\n" + error); + } +} +HTML.prototype.mixin(HipieDDLMixin); +HTML.prototype._class += " marshaller_HTML"; diff --git a/packages/marshaller/src/ddl1/HipieDDL.ts b/packages/marshaller/src/ddl1/HipieDDL.ts new file mode 100644 index 0000000000..ef5431aea7 --- /dev/null +++ b/packages/marshaller/src/ddl1/HipieDDL.ts @@ -0,0 +1,2441 @@ +import { Class, Database, Utility, Widget } from "@hpcc-js/common"; +import { MultiChart } from "@hpcc-js/composite"; +import { DDL1 } from "@hpcc-js/ddl-shim"; +import { Comms, Table } from "@hpcc-js/other"; +import { map as d3Map } from "d3-collection"; + +declare const require: any; + +const LOADING = "...loading..."; +const _CHANGED = "_changed"; + +function faCharFix(faChar) { + if (faChar) { + return String.fromCharCode(parseInt(faChar)); + } + return faChar; +} + +function hipieType2DBType(hipieType) { + switch (hipieType) { + case "bool": + case "boolean": + return "boolean"; + case "integer": + case "float": + case "double": + return "number"; + case "date": + case "time": + return "time"; + case "geohash": + return "geohash"; + case "dataset": + return "dataset"; + case "visualization": + return "widget"; + default: + if (hipieType) { + if (hipieType.indexOf("unsigned") === 0) { + return "number"; + } else if (hipieType.indexOf("integer") === 0) { + return "number"; + } else if (hipieType.indexOf("real") === 0) { + return "number"; + } else if (hipieType.indexOf("string") === 0) { + return "string"; + } + } + } + if ((window as any).__hpcc_debug) { + console.warn("unknown hipieType: " + hipieType); + } + return "string"; +} + +// Mappings --- +function SourceMappings(this: any, visualization, mappings) { + this.visualization = visualization; + const newMappings = {}; + for (const key in mappings) { + if (mappings[key] instanceof Array) { + mappings[key].forEach(function (mapingItem, idx) { + newMappings[idx === 0 ? key : key + "_" + idx] = mapingItem; + }); + } else { + newMappings[key] = mappings[key]; + } + } + this.mappings = newMappings; + this.hasMappings = false; + this.reverseMappings = {}; + this.columns = []; + this.columnsIdx = {}; + this.columnsRHS = []; + this.columnsRHSIdx = {}; +} + +SourceMappings.prototype.init = function () { + for (const key in this.mappings) { + this.reverseMappings[this.mappings[key]] = key; + if (this.columnsIdx[key] === undefined) { + this.columns.push(key); + this.columnsIdx[key] = this.columns.length - 1; + } + this.columnsRHS[this.columnsIdx[key]] = this.mappings[key]; + this.columnsRHSIdx[this.mappings[key]] = this.columnsIdx[key]; + this.hasMappings = true; + } +}; + +SourceMappings.prototype.init = function () { + for (const key in this.mappings) { + this.reverseMappings[this.mappings[key]] = key; + if (this.columnsIdx[key] === undefined) { + this.columns.push(key); + this.columnsIdx[key] = this.columns.length - 1; + } + this.columnsRHS[this.columnsIdx[key]] = this.mappings[key]; + this.columnsRHSIdx[this.mappings[key]] = this.columnsIdx[key]; + this.hasMappings = true; + } +}; + +SourceMappings.prototype.getFields = function () { + if (this.visualization.fields()) { + return Object.keys(this.mappings).map(key => { + const field = this.visualization.field(key); + if (!field) { + console.warn("Unknown mapping field: " + key); + } + return new Database.Field(field.id()) + .type(field.jsType()) + .label(this.reverseMappings[field.id()]) + ; + }); + } + return null; +}; + +SourceMappings.prototype.contains = function (key) { + return this.mappings[key] !== undefined; +}; + +SourceMappings.prototype.doMap = function (item) { + const retVal = []; + for (const key in this.mappings) { + const rhsKey = this.mappings[key]; + try { + let val = item[rhsKey]; + if (val === undefined) { + val = item[rhsKey.toLowerCase()]; + } + retVal[this.columnsIdx[key]] = val; + } catch (e) { + console.warn("Invalid Mapping: " + this.visualization.id + " [" + rhsKey + "->" + item + "]"); + } + } + return retVal; +}; + +SourceMappings.prototype.doReverseMap = function (item) { + const retVal = {}; + for (const key in this.mappings) { + const rhsKey = this.mappings[key]; + try { + let val = item[key]; + if (val === undefined) { + val = item[key.toLowerCase()]; + } + retVal[rhsKey] = val; + } catch (e) { + console.warn("Invalid Mapping: " + this.visualization.id + " [" + key + "->" + item + "]"); + } + } + return retVal; +}; + +SourceMappings.prototype.doMapAll = function (data) { + return data.hipieMappings(this.columnsRHS.map(col => { + return this.visualization.field(col); + }), this.visualization.dashboard.marshaller.missingDataString()); +}; + +SourceMappings.prototype.getMap = function (key) { + return this.mappings[key]; +}; + +SourceMappings.prototype.getReverseMap = function (key) { + return this.reverseMappings[key]; +}; + +SourceMappings.prototype.hipieMapSortArray = function (sort) { + return sort.map(sortField => { + let reverse = false; + if (sortField.indexOf("-") === 0) { + sortField = sortField.substring(1); + reverse = true; + } + const fieldIdx = this.columnsRHS.indexOf(sortField); + if (fieldIdx < 0) { + console.warn("SourceMappings.prototype.hipieMapSortArray: Invalid sort array - " + sortField); + } + return { + idx: fieldIdx, + reverse + }; + }).filter(function (d) { return d.idx >= 0; }); +}; + +function ChartMappings(this: any, visualization, mappings) { + SourceMappings.call(this, visualization, mappings); + this.columns = ["label", "weight"]; + this.columnsIdx = { label: 0, weight: 1 }; + this.init(); +} +ChartMappings.prototype = Object.create(SourceMappings.prototype); + +function ChoroMappings(this: any, visualization, mappings) { + SourceMappings.call(this, visualization, mappings); + if (mappings.state) { + this.columns = ["state", "weight"]; + this.columnsIdx = { state: 0, weight: 1 }; + } else if (mappings.county) { + this.columns = ["county", "weight"]; + this.columnsIdx = { county: 0, weight: 1 }; + } else if (mappings.geohash) { + this.columns = ["geohash", "weight"]; + this.columnsIdx = { geohash: 0, weight: 1 }; + } + this.init(); +} +ChoroMappings.prototype = Object.create(SourceMappings.prototype); + +function ChoroMappings2(this: any, visualization, mappings) { + SourceMappings.call(this, visualization, mappings); + if (mappings.state) { + this.columns = ["state"]; + this.columnsIdx = { state: 0 }; + } else if (mappings.county) { + this.columns = ["county"]; + this.columnsIdx = { county: 0 }; + } else if (mappings.geohash) { + this.columns = ["geohash", "label"]; + this.columnsIdx = { geohash: 0, label: 1 }; + } + const weightOffset = this.columns.length; + if (mappings.weight instanceof Array) { + mappings.weight.forEach((w, i) => { + this.columns.push(w); + this.columnsIdx[i === 0 ? "weight" : "weight_" + i] = i + weightOffset; + }); + } + this.init(); +} +ChoroMappings2.prototype = Object.create(SourceMappings.prototype); + +function HeatMapMappings(this: any, visualization, mappings) { + SourceMappings.call(this, visualization, mappings); + this.columns = ["x", "y", "weight"]; + this.columnsIdx = { x: 0, y: 1, weight: 2 }; + this.init(); +} +HeatMapMappings.prototype = Object.create(SourceMappings.prototype); + +function LineMappings(this: any, visualization, mappings) { + const newMappings = { + label: mappings.x[0] + }; + mappings.y.forEach(function (item, idx) { + newMappings[item] = item; + }); + SourceMappings.call(this, visualization, newMappings); + this.init(); +} +LineMappings.prototype = Object.create(SourceMappings.prototype); + +function TableMappings(this: any, visualization, mappings) { + const newMappings = {}; + for (const key in mappings) { + mappings[key].forEach(function (mapingItem, idx) { + newMappings[visualization.label[idx]] = mapingItem; + }); + } + SourceMappings.call(this, visualization, newMappings); + this.init(); +} +TableMappings.prototype = Object.create(SourceMappings.prototype); + +TableMappings.prototype.init = function () { + this.visualization.label.forEach((label, idx) => { + this.reverseMappings[this.mappings[label]] = label; + this.columns.push(label); + this.columnsIdx[label] = idx; + this.columnsRHS[idx] = this.mappings[label]; + this.columnsRHSIdx[this.mappings[label]] = idx; + this.hasMappings = true; + }); +}; + +TableMappings.prototype.doMapAll = function (data) { + let retVal = SourceMappings.prototype.doMapAll.apply(this, arguments); + if (retVal instanceof Array) { + const columnsRHSIdx = this.visualization.source.getColumnsRHSIdx(); + this.visualization.fields().forEach(field => { + const fieldType = field.jsType(); + const colIdx = columnsRHSIdx[field.id()]; + if (colIdx === undefined) { + console.warn("Invalid Mapping: " + field.id()); + } else { + retVal = retVal.map((row) => { + let cell = row[colIdx]; + if (cell && cell.Row) { + cell = cell.Row; + } + if (cell instanceof Array) { + switch (fieldType) { + case "dataset": + const columns = []; + const columnsIdx = {}; + const data2 = cell.map(function (row2, idx) { + const retVal2 = []; + retVal2.length = columns.length; + for (const key in row2) { + if (idx === 0) { + columnsIdx[key] = columns.length; + columns.push(key); + } + retVal2[columnsIdx[key]] = row2[key]; + } + return retVal2; + }); + const table = new Table() + .columns(columns) + .data(data2) + ; + row[colIdx] = table; + break; + case "widget": + const viz = this.visualization.vizDeclarations[field.localVisualizationID()]; + const output = viz.source.getOutput(); + const db = output.db; + output.setData(cell, []); + const widget = viz.widget; + const newWidget = new widget.constructor() + .showToolbar(false) + .chartType(widget.chartType()) + .chartTypeDefaults(widget.chartTypeDefaults()) + .columns(viz.source.getColumns()) + .data(viz.source.getData()) + ; + output.db = db; + row[colIdx] = newWidget; + break; + } + } + return row; + }); + } + }); + } + return retVal; +}; + +function GraphMappings(this: any, visualization, mappings, link) { + SourceMappings.call(this, visualization, mappings); + this.icon = visualization.icon || {}; + this.fields = visualization.fields(); + this.columns = ["uid", "label", "weight", "flags"]; + this.columnsIdx = { uid: 0, label: 1, weight: 2, flags: 3 }; + this.init(); + this.link = link; + this.linkMappings = new SourceMappings(visualization, this.link.mappings); + this.linkMappings.columns = ["uid"]; + this.linkMappings.columnsIdx = { uid: 0, label: 1 }; + this.visualization = visualization; +} +GraphMappings.prototype = Object.create(SourceMappings.prototype); + +GraphMappings.prototype.calcIconInfo = function (flag, origItem, forAnnotation) { + const retVal = {}; + function mapStruct(struct, retVal2) { + if (struct) { + for (const key in struct) { + switch (key) { + case "faChar": + retVal2.faChar = faCharFix(struct.faChar); + break; + default: + if (forAnnotation && key.indexOf("icon_") === 0) { // Backward compatability + console.warn("Deprecated flag property: " + key); + retVal2[key.split("icon_")[1]] = struct[key]; + } else { + retVal2[key] = struct[key]; + } + } + } + } + } + if (origItem && origItem[flag.fieldid] && flag.valuemappings) { + const annotationInfo = flag.valuemappings[origItem[flag.fieldid]]; + mapStruct(annotationInfo, retVal); + } + + for (const _key in retVal) { // jshint ignore:line + return retVal; + } + return null; +}; + +GraphMappings.prototype.doMapAll = function (db) { + const data = db.jsonObj(); + const context = this; + const vertexMap = {}; + const vertices = []; + const megaChart = this.visualization.widget; + const graph = megaChart.chart(); + function getVertex(item, origItem?) { + const id = "uid_" + item[0]; + let retVal = vertexMap[id]; + if (!retVal && origItem) { + retVal = new graph.Vertex() + .faChar((context.icon && context.icon.faChar ? faCharFix(context.icon.faChar) : "\uf128")) + .text(item[1] ? item[1] : "") + .data(item) + ; + retVal.__hpcc_uid = item[0]; + vertexMap[id] = retVal; + vertices.push(retVal); + + // Icon --- + const iconInfo = context.calcIconInfo(context.visualization.icon, origItem, false); + if (iconInfo) { + for (const key in iconInfo) { + if (retVal[key]) { + retVal[key](iconInfo[key]); + } + } + } + + // Annotations --- + const annotations = []; + context.visualization.flags.forEach(function (flag) { + const iconInfo2 = context.calcIconInfo(flag, origItem, true); + if (iconInfo2) { + annotations.push(iconInfo2); + } + }); + retVal.annotationIcons(annotations); + } + return retVal; + } + const edges = []; + data.forEach(function (item) { + const mappedItem = context.doMap(item); + getVertex(mappedItem, item); + }); + data.forEach(function (item) { + const mappedItem = context.doMap(item); + const vertex = getVertex(mappedItem, item); + if (item[context.link.childfile] && item[context.link.childfile] instanceof Array) { + const childItems = item[context.link.childfile]; + childItems.forEach(function (childItem, i) { + const childMappedItem = context.linkMappings.doMap(childItem); + const childVertex = getVertex(childMappedItem); + if (childVertex && vertex.id() !== childVertex.id()) { + const edge = new graph.Edge() + .sourceVertex(vertex) + .targetVertex(childVertex) + .sourceMarker("circle") + .targetMarker("arrow") + .text(childMappedItem[1] ? childMappedItem[1] : "") + .data(childMappedItem) + ; + const linkcolor = graph.linkcolor_default(); + if (linkcolor && linkcolor.fieldid) { + edge.strokeColor(childItem[linkcolor.fieldid]); + } + const linktooltip = graph.linkcolor_default(); + if (linktooltip && linktooltip.fieldid) { + edge.tooltip(childItem[linktooltip.fieldid]); + } + edges.push(edge); + } + }); + } + }); + return { vertices, edges, merge: false }; +}; + +// Viz Source --- +function Source(this: any, visualization, source) { + this.visualization = visualization; + if (source) { + this._id = source.id; + this._output = source.output; + this.mappings = null; + if (!source.mappings) { + console.warn("no mappings for:" + visualization.id + "->" + source.id); + } + switch (this.visualization.type) { + case "LINE": + this.mappings = new LineMappings(this.visualization, source.mappings); + break; + case "TABLE": + this.mappings = new TableMappings(this.visualization, source.mappings); + break; + case "GRAPH": + this.mappings = new GraphMappings(this.visualization, source.mappings, source.link); + break; + case "CHORO": + if (source.mappings.weight instanceof Array && source.mappings.weight.length) { + this.mappings = new ChoroMappings2(this.visualization, source.mappings); + if (source.mappings.weight.length > 1) { + this.visualization.type = "LINE"; + } + } else { + this.mappings = new ChoroMappings(this.visualization, source.mappings); + } + break; + case "HEAT_MAP": + this.mappings = new HeatMapMappings(this.visualization, source.mappings); + break; + default: + this.mappings = new ChartMappings(this.visualization, source.mappings); + break; + } + this.first = source.first; + this.reverse = source.reverse; + this.sort = source.sort; + this.properties = source.properties; + } +} + +Source.prototype.getQualifiedID = function () { + return this.visualization.getQualifiedID() + "." + this._id; +}; + +Source.prototype.exists = function () { + return this._id; +}; + +Source.prototype.getDatasource = function () { + return this.visualization.dashboard.getDatasource(this._id); +}; + +Source.prototype.getOutput = function () { + const datasource = this.getDatasource(); + if (datasource && datasource._outputs) { + return datasource._outputs[this._output]; + } + return null; +}; + +Source.prototype.hasData = function () { + return this.getOutput().db ? true : false; +}; + +Source.prototype.getFields = function () { + return this.mappings.getFields(); +}; + +Source.prototype.getColumnsRHS = function () { + return this.mappings.columnsRHS; +}; + +Source.prototype.getColumnsRHSIdx = function () { + return this.mappings.columnsRHSIdx; +}; + +Source.prototype.getColumns = function () { + return this.mappings && this.mappings.columns ? this.mappings.columns : []; +}; + +Source.prototype.getData = function () { + const db = this.getOutput().db; + const retVal = this.mappings.doMapAll(db); + if (retVal.length && this.sort) { + Utility.multiSort(retVal, this.mappings.hipieMapSortArray(this.sort)); + } + if (this.reverse) { + retVal.reverse(); + } + if (this.first && retVal.length > this.first) { + retVal.length = this.first; + } + return retVal; +}; + +Source.prototype.getXTitle = function () { + return this.mappings.columns[0]; +}; + +Source.prototype.getYTitle = function () { + return this.mappings.columns.filter(function (d, i) { return i > 0; }).join(" / "); +}; + +Source.prototype.getMap = function (col) { + return (this.mappings && this.mappings.hasMappings) ? this.mappings.getMap(col) : col; +}; + +Source.prototype.getReverseMap = function (col) { + return (this.mappings && this.mappings.hasMappings) ? this.mappings.getReverseMap(col) : col; +}; + +// Viz Events --- +function EventUpdate(this: any, event, update, defMappings) { + this.event = event; + this.dashboard = event.visualization.dashboard; + this._col = update.col; + this._visualization = update.visualization; + this._instance = update.instance; + this._datasource = update.datasource; + this._merge = update.merge; + this._mappings = update.mappings || defMappings; +} + +EventUpdate.prototype.getDatasource = function () { + return this.dashboard.getDatasource(this._datasource); +}; + +EventUpdate.prototype.getVisualization = function () { + return this.dashboard.getVisualization(this._visualization); +}; + +EventUpdate.prototype.mapData = function (row) { + const retVal = {}; + if (row) { + for (const key in this._mappings) { + const origKey = this.getReverseMap(key); + retVal[this._mappings[key]] = row[origKey]; + } + } + return retVal; +}; + +EventUpdate.prototype.getMap = function (col) { + return this.event.visualization.source.getMap(col); +}; + +EventUpdate.prototype.getReverseMap = function (col) { + return this.event.visualization.source.getReverseMap(col); +}; + +EventUpdate.prototype.selectedRow = function () { + if (this.event.visualization.hasSelection()) { + return this.event.visualization._widgetState.row; + } + return {}; +}; + +EventUpdate.prototype.mapSelected = function () { + return this.mapData(this.selectedRow()); +}; + +EventUpdate.prototype.calcRequestFor = function (visualization) { + const retVal = {}; + const updateVisualization = this.getVisualization(); + updateVisualization.getInputVisualizations().forEach(function (inViz, idx) { + // Calc request for each visualization to be updated --- + const changed = inViz === visualization; + inViz.getUpdatesForVisualization(updateVisualization).forEach(function (inVizUpdateObj) { + // Gather all contributing "input visualization events" for the visualization that is to be updated --- + const inVizRequest = inVizUpdateObj.mapSelected(); + for (const key in inVizRequest) { + if (retVal[key] && retVal[key] !== inVizRequest[key]) { + console.warn("Duplicate Filter with mismatched value (defaulting to 'first' or 'first changed' instance): " + key); + if (changed) { + retVal[key] = inVizRequest[key]; + retVal[key + _CHANGED] = changed; + } + } else { + retVal[key] = inVizRequest[key]; + retVal[key + _CHANGED] = changed; + } + } + }); + }); + return retVal; +}; + +function Event(this: any, visualization, eventID, event) { + this.visualization = visualization; + this.eventID = eventID; + this._updates = []; + this._mappings = event.mappings; + if (event) { + this._updates = event.updates.map(updateInfo => { + return new EventUpdate(this, updateInfo, event.mappings); + }); + } +} + +Event.prototype.exists = function () { + return this._updates.length; +}; + +Event.prototype.getUpdates = function () { + return this._updates.filter(updateInfo => { + if (!updateInfo._col) return true; + return updateInfo._col === updateInfo.getMap(this.visualization._widgetState.col); + }); +}; + +Event.prototype.getUpdatesDatasources = function () { + const dedup = {}; + const retVal = []; + this.getUpdatesVisualizations().forEach(function (item, idx) { + const datasource = item.source.getDatasource(); + if (datasource && !dedup[datasource.id]) { + dedup[datasource.id] = true; + retVal.push(datasource); + } + }, this); + return retVal; +}; + +Event.prototype.getUpdatesVisualizations = function () { + const dedup = {}; + const retVal = []; + this._updates.forEach(function (updateObj, idx) { + const visualization = updateObj.getVisualization(); + if (!dedup[visualization.id]) { + dedup[visualization.id] = true; + retVal.push(visualization); + } + }, this); + return retVal; +}; + +Event.prototype.fetchData = function () { + const fetchDataOptimizer = new VisualizationRequestOptimizer(); + this.getUpdates().forEach(updateObj => { + fetchDataOptimizer.appendRequest(updateObj.getDatasource(), updateObj.calcRequestFor(this.visualization), updateObj.getVisualization()); + }); + return fetchDataOptimizer.fetchData(); +}; + +function Events(this: any, visualization, events) { + this.visualization = visualization; + this.events = {}; + for (const key in events) { + this.events[key] = new Event(visualization, key, events[key]); + } +} + +Events.prototype.setWidget = function (widget) { + const context = this; + for (const key in this.events) { + if (widget["vertex_" + key]) { + widget["vertex_" + key] = function (row, col, selected) { + context.visualization.processEvent(key, context.events[key], row, col, selected); + }; + } + if (widget[key]) { + widget[key] = function (row, col, selected) { + context.visualization.processEvent(key, context.events[key], row, col, selected); + }; + } + } +}; + +Events.prototype.exists = function () { + return this._updates !== undefined; +}; + +Events.prototype.getUpdates = function () { + let retVal = []; + for (const key in this.events) { + retVal = retVal.concat(this.events[key].getUpdates()); + } + return retVal; +}; + +Events.prototype.getUpdatesDatasources = function () { + let retVal = []; + for (const key in this.events) { + retVal = retVal.concat(this.events[key].getUpdatesDatasources()); + } + return retVal; +}; + +Events.prototype.getUpdatesVisualizations = function () { + let retVal = []; + for (const key in this.events) { + retVal = retVal.concat(this.events[key].getUpdatesVisualizations()); + } + return retVal; +}; + +// Visualization Field--- +function Field(this: any, ddlField) { + this._id = ddlField.id; + this._label = ddlField.label; + this._properties = ddlField.properties || {}; +} +Field.prototype = Object.create(Class.prototype); +Field.prototype.constructor = Field; + +Field.prototype.id = function () { + return this._id; +}; + +Field.prototype.label = function () { + return this._properties.label || this._label; +}; + +Field.prototype.type = function () { + return this._properties.type || ""; +}; + +Field.prototype.jsType = function () { + return hipieType2DBType(this.type()); +}; + +Field.prototype.charttype = function (_) { + if (!arguments.length) return this._properties.charttype || ""; + this._properties.charttype = _; + return this; +}; + +Field.prototype.localVisualizationID = function () { + return this._properties.localVisualizationID || ""; +}; + +Field.prototype.enumvals = function () { + return this._properties.enumvals; // Return undefined if non existent +}; + +Field.prototype.hasDefault = function () { + return this.default() !== undefined; +}; + +Field.prototype.default = function () { + if (this.type() === "range") { + return this._properties.default || ["", ""]; + } + if (this._properties.default instanceof Array && this._properties.default.length) { + return this._properties.default[0]; + } + return this._properties.default || ""; +}; + +Field.prototype.hasFunction = function () { + return this.function() !== undefined; +}; + +Field.prototype.function = function () { + return this._properties.function; +}; + +Field.prototype.params = function () { + const retVal = []; + const params = this._properties.params || {}; + for (const key in params) { + retVal.push(params[key]); + } + return retVal; +}; + +Field.prototype.properties = function () { + return this._properties; +}; + +// Visualization --- +function requirePromise(this: any, packageID) { + return new Promise((resolve, reject) => { + if (require) { + require([packageID], Package => { + resolve.call(this, Package); + }); + } else { + reject("No require."); + } + }); +} + +function legacyRequire(this: any, packageArr, callback) { + const promises = packageArr.map(function (packageID) { + if (packageID.indexOf("../") === 0) { + const parts = packageID.split("/"); + return requirePromise("@hpcc-js/" + parts[1]).then(function (Package) { + return Package[parts[2]]; + }); + } + return requirePromise(packageID); + }); + Promise.all(promises).then(packages => { + callback.apply(this, packages); + }); +} + +export class Visualization extends Class { + protected dashboard; + parentVisualization; + protected type; + protected id; + protected label; + protected icon; + protected flags; + protected title; + protected _fields; + protected _fieldsMap; + properties; + protected source; + protected events; + protected layers; + protected hasVizDeclarations; + protected vizDeclarations; + widget; + protected _widgetState; + + constructor(dashboard, visualization, parentVisualization) { + super(); + + this.dashboard = dashboard; + this.parentVisualization = parentVisualization; + this.type = visualization.type; + this.id = visualization.id; + + switch (this.type) { + case "TABLE": + this.label = (visualization).label; + break; + case "GRAPH": + this.label = (visualization).label; + this.icon = (visualization).icon || { faChar: "\uf128" }; + this.flags = (visualization).flag || []; + break; + } + this.title = visualization.title || visualization.id; + this._fields = (visualization.fields || []).map(function (field) { + return new Field(field); + }); + this._fieldsMap = {}; + this._fields.forEach(field => { + this._fieldsMap[field.id()] = field; + }); + + this.properties = visualization.properties || (visualization.source ? visualization.source.properties : null) || {}; + this.source = new Source(this, visualization.source); + this.events = new Events(this, visualization.events); + this.layers = []; + this.hasVizDeclarations = false; + this.vizDeclarations = {}; + if (this.type === "CHORO") { + this.layers = (visualization.visualizations || []).map(innerViz => { + return dashboard.createVisualization(innerViz, this); + }); + } else { + (visualization.visualizations || []).forEach(innerViz => { + this.vizDeclarations[innerViz.id] = dashboard.createVisualization(innerViz, this); + this.hasVizDeclarations = true; + }); + } + const context = this; + switch (this.type) { + case "CHORO": + let chartType = visualization.properties && visualization.properties.charttype ? visualization.properties.charttype : ""; + if (parentVisualization) { + switch (chartType) { + case "MAP_PINS": + this.loadWidget("../map/Pins", function (widget) { + try { + widget + .id(visualization.id) + .columns(context.source.getColumns()) + .geohashColumn("geohash") + .tooltipColumn("label") + .fillColor(visualization.color ? visualization.color : null) + .projection("albersUsaPr") + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + } + } else { + chartType = chartType || "CHORO"; + if (chartType === "CHORO") { + if (this.source.mappings.contains("state")) { + chartType = "CHORO_USSTATES"; + } else if (this.source.mappings.contains("county")) { + chartType = "CHORO_USCOUNTIES"; + } else if (this.source.mappings.contains("country")) { + chartType = "CHORO_COUNTRIES"; + } + } + Promise.all(context.layers.map(function (layer) { return layer.loadedPromise(); })).then(function () { + context.loadWidget("../composite/MegaChart", function (widget) { + const layers = context.layers.map(function (layer) { return layer.widget; }); + try { + switch (widget.classID()) { + case "composite_MegaChart": + widget + .id(visualization.id) + .showChartSelect_default(false) + .chartType_default(chartType) + .chartTypeDefaults({ + autoScaleMode: layers.length ? "data" : "mesh" + }) + .chartTypeProperties({ + layers + }) + ; + break; + default: + widget + .id(visualization.id) + .autoScaleMode(layers.length ? "data" : "mesh") + .layers(layers) + ; + break; + } + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + }); + } + break; + case "2DCHART": + case "PIE": + case "BUBBLE": + case "BAR": + case "WORD_CLOUD": + this.loadWidget("../composite/MegaChart", function (widget) { + try { + widget + .id(visualization.id) + .chartType_default(context.properties.chartType || context.properties.charttype || context.type) + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + case "LINE": + this.loadWidget("../composite/MegaChart", function (widget) { + try { + widget + .id(visualization.id) + .chartType_default(context.properties.chartType || context.properties.charttype || context.type) + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + case "TABLE": + this.loadWidget("../composite/MegaChart", function (widget) { + try { + widget + .id(visualization.id) + .showChartSelect_default(false) + .chartType_default("TABLE") + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + case "SLIDER": + this.loadWidget("../form/Slider", function (widget) { + try { + widget + .id(visualization.id) + ; + if (visualization.range) { + let selectionLabel = ""; + if (Utility.exists("events.click.updates", visualization) && visualization.events.click.updates.length) { + for (const key in visualization.events.click.updates[0].mappings) { + selectionLabel = key; + break; + } + } + widget + .low_default(+visualization.range[0]) + .high_default(+visualization.range[1]) + .step_default(+visualization.range[2]) + .selectionLabel_default(selectionLabel) + .selectionLabel(selectionLabel) + ; + } + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + case "GRAPH": + this.loadWidget("../composite/MegaChart", function (widget) { + try { + widget + .id(visualization.id) + .showChartSelect_default(false) + .chartType_default("GRAPH") + .chartTypeDefaults({ + layout: "ForceDirected2", + applyScaleOnLayout: true + }) + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + case "FORM": + this.loadWidgets(["../form/Form", "../form/Input", "../form/Button", "../form/CheckBox", "../form/ColorInput", "../form/Radio", "../form/Range", "../form/Select", "../form/Slider", "../form/TextArea", "../form/InputRange"], function (widget, widgetClasses) { + const Input = widgetClasses[1]; + const CheckBox = widgetClasses[3]; + const Radio = widgetClasses[5]; + const Select = widgetClasses[7]; + const TextArea = widgetClasses[9]; + const InputRange = widgetClasses[10]; + + try { + widget + .id(visualization.id) + .inputs(context.fields().map(function (field) { + + const selectOptions = []; + let options = []; + let inp; + if (!field.charttype() && field.type() === "range") { + // TODO - Verify with @DL + field.charttype("RANGE"); + } + switch (field.charttype()) { + case "TEXT": + inp = new Input() + .type_default("text") + ; + break; + case "TEXTAREA": + inp = new TextArea(); + break; + case "CHECKBOX": + inp = new CheckBox(); + break; + case "RADIO": + inp = new Radio(); + break; + case "HIDDEN": + inp = new Input() + .type_default("hidden") + ; + break; + case "RANGE": + inp = new InputRange(); + break; + default: + if (field.enumvals()) { + inp = new Select(); + options = field.enumvals(); + for (const val in options) { + selectOptions.push([val, options[val]]); + } + } else { + inp = new Input() + .type_default("text") + ; + } + break; + } + + inp + .name_default(field.id()) + .label_default(field.label()) + .value_default(field.default()) // TODO Hippie support for multiple default values (checkbox only) + ; + + if (inp instanceof CheckBox || inp instanceof Radio) { // change this to instanceof? + const vals = Object.keys(field.enumvals()); + inp.selectOptions_default(vals); + } else if (selectOptions.length) { + inp.selectOptions_default(selectOptions); + } + + return inp; + })) + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + case "HEAT_MAP": + this.loadWidgets(["../other/HeatMap"], function (widget) { + try { + widget + .id(visualization.id) + .image_default(context.properties.imageUrl) + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + default: + this.loadWidget("../common/TextBox", function (widget) { + try { + widget + .id(visualization.id) + .text_default(context.id + "\n" + "TODO: " + context.type) + ; + } catch (e) { + console.warn("Unexpected widget type: " + widget.classID()); + } + }); + break; + } + } + + getQualifiedID() { + return this.id; + } + + fields() { + return this._fields; + } + + hasField(id) { + return this.field[id] !== undefined; + } + + field(id) { + return this._fieldsMap[id]; + } + + loadedPromise() { + const context = this; + return new Promise(function (resolve, reject) { + const intervalHandle = setInterval(function () { + if (context.isLoaded()) { + clearInterval(intervalHandle); + resolve(); + } + }, 100); + }); + } + + isLoading() { + return this.widget === null; + } + + isLoaded() { + return this.widget instanceof Widget; + } + + loadMegaChartWidget(widgetPath, callback) { + this.loadWidgets(["../composite/MegaChart", widgetPath], function (megaChart, widgets) { + const chart = new widgets[1](); + megaChart + .chartType_default(MultiChart.prototype._allChartTypesByClass[chart.classID()].id) + .chart(chart) + ; + if (callback) { + callback(megaChart, chart, widgets); + } + }); + } + + loadWidget(widgetPath, callback) { + this.loadWidgets([widgetPath], callback); + } + + loadWidgets(widgetPaths, callback) { + this.widget = null; + + const context = this; + legacyRequire(widgetPaths, function (WidgetClass) { + const existingWidget = context.dashboard.marshaller.getWidget(context.id); + if (existingWidget) { + if (WidgetClass.prototype._class !== existingWidget.classID()) { + console.warn("Unexpected persisted widget type (old persist string?)"); + } + context.setWidget(existingWidget); + } else { + context.setWidget(new WidgetClass()); + } + if (callback) { + callback(context.widget, arguments); + } + }); + } + + setWidget(widget) { + this.widget = widget; + this.events.setWidget(widget); + if (this.widget.columns) { + const columns = this.source.getColumns(); + this.widget.columns(columns, true); + } + for (const key in this.properties) { + switch (widget.classID()) { + case "chart_MultiChart": + case "composite_MegaChart": + if (widget[key + "_default"]) { + widget[key + "_default"](this.properties[key]); + } + widget.chartTypeDefaults()[key] = this.properties[key]; + break; + default: + if (this.widget[key + "_default"]) { + try { + this.widget[key + "_default"](this.properties[key]); + } catch (e) { + console.warn("Invalid Property:" + this.id + ".properties." + key); + } + } + } + } + return this.widget; + } + + accept(visitor) { + visitor.visit(this); + } + + getUpdates() { + return this.events.getUpdates(); + } + + getUpdatesForDatasource(otherDatasource) { + return this.events.getUpdates().filter(function (updateObj) { + return updateObj.getDatasource() === otherDatasource; + }); + } + + getUpdatesForVisualization(otherViz) { + return this.events.getUpdates().filter(function (updateObj) { + return updateObj.getVisualization() === otherViz; + }); + } + + getInputFields(mapped?): any { + const retVal = {}; + const updatedBy = this.getInputVisualizations(); + updatedBy.forEach(viz => { + if (viz.hasSelection()) { + viz.getUpdatesForVisualization(this).forEach(function (updateObj) { + const sel = mapped ? updateObj.mapSelected() : updateObj.selectedRow(); + for (const key in sel) { + retVal[key] = sel[key]; + } + }); + } + }); + return retVal; + } + + update(params?) { + let titleWidget = null; + if (!this.parentVisualization) { + titleWidget = this.widget; + while (titleWidget && !titleWidget.title) { + titleWidget = titleWidget.locateParentWidget(); + } + } + + if (!params) { + params = ""; + let titleFormatStr = ""; + if (titleWidget && titleWidget.ddlParamsFormat) { + titleFormatStr = titleWidget.ddlParamsFormat(); + } + + const dedupParams = {}; + if (titleFormatStr) { + params = Utility.template(titleFormatStr, this.getInputFields()); + } else { + const paramsArr = []; + const mappedData = this.getInputFields(true); + for (const key in mappedData) { + if (mappedData[key]) { + if (!dedupParams[key]) { + dedupParams[key] = true; + paramsArr.push(mappedData[key]); + } + } + } + params = paramsArr.join(", "); + } + } + + const context = this; + return new Promise(function (resolve, reject) { + if (titleWidget) { + const title = titleWidget.title(); + const titleParts = title.split(" ("); + titleWidget + .title(titleParts[0] + (params.trim() ? " (" + params + ")" : "")) + .render(function () { + resolve(); + }) + ; + } else { + let ddlViz = context; + while (ddlViz.parentVisualization) { + ddlViz = ddlViz.parentVisualization; + } + ddlViz.widget.render(function () { + resolve(); + }); + } + if (context.dashboard.marshaller.propogateClear()) { + context.events.getUpdatesVisualizations().forEach(function (updatedViz) { + updatedViz.update(); + }); + } + }); + } + + notify() { + if (this.widget) { + const data = this.source.hasData() ? this.source.getData() : []; + this.widget.data(data); + if (this.type === "GRAPH" && data.vertices) { + const ipFields = this.getInputFields(true); + data.vertices.filter(function (v) { + return v.__hpcc_uid === ipFields.treeuid; + }).forEach(function (v) { + v.centroid(true); + }); + } + return this.update(); + } + return Promise.resolve(); + } + + clear() { + this._widgetState = { + row: {}, + selected: false + }; + this.fields().forEach(field => { + if (field.hasDefault()) { + this._widgetState.row[field.id()] = field.default(); + this._widgetState.selected = true; + } + }); + if (this.widget && this.dashboard.marshaller.clearDataOnUpdate()) { + this.widget.data([]); + } + if (this.dashboard.marshaller.propogateClear()) { + this.events.getUpdatesVisualizations().forEach(function (updatedViz) { + updatedViz.clear(); + }); + } + } + + on(eventID, func) { + const context = this; + this.overrideMethod(eventID, function (origFunc, args) { + origFunc.apply(context, args); + setTimeout(function () { + func.apply(context, args); + }, 0); + }); + return this; + } + + calcRequestFor(visualization) { + let retVal = {}; + this.getUpdatesForVisualization(visualization).forEach(function (updatesObj) { + // TODO: When we support more than "click" this will need enhancment... + retVal = updatesObj.calcRequestFor(visualization); + }); + return retVal; + } + + processEvent(eventID, event, row, col, selected) { + this._widgetState = { + row, + col, + selected: selected === undefined ? true : selected + }; + const context = this; + setTimeout(function () { + event.fetchData().then(function (promises) { + context.dashboard.marshaller.vizEvent(context.widget, "post_" + eventID, row, col, selected); + }); + }, 0); + } + + hasSelection() { + return this._widgetState && this._widgetState.selected; + } + + selection() { + if (this.hasSelection()) { + return this._widgetState.row; + } + return null; + } + + reverseMappedSelection() { + if (this.hasSelection()) { + return this.source.mappings ? this.source.mappings.doReverseMap(this._widgetState.row) : this._widgetState.row; + } + return null; + } + + getInputVisualizations() { + return this.dashboard.marshaller.getVisualizationArray().filter(viz => { + const updates = viz.events.getUpdatesVisualizations(); + if (updates.indexOf(this) >= 0) { + return true; + } + return false; + }); + } + + serializeState() { + const state: any = { + widgetState: this._widgetState + }; + if (this.widget) { + if (this.widget.serializeState) { + state.widget = this.widget.serializeState(); + } else if (this.widget.data) { + state.widget = { + data: this.widget.data() + }; + } + } + return state; + } + + deserializeState(state) { + if (state) { + this._widgetState = state.widgetState; + if (this.widget && state.widget) { + if (this.widget.deserializeState) { + this.widget.deserializeState(state.widget); + } else if (this.widget.data && state.widget.data) { + this.widget.data(state.widget.data); + } + } + } + return this; + } +} + +// Output --- +function Filter(this: any, datasource, ddlFilter: string | DDL1.IFilter) { + this.datasource = datasource; + if (typeof ddlFilter === "string") { + ddlFilter = { + fieldid: ddlFilter, + nullable: true, + rule: "==" + }; + } + this.fieldid = ddlFilter.fieldid; + this.nullable = ddlFilter.nullable; + this.rule = ddlFilter.rule || "=="; + this.minid = ddlFilter.minid; + this.maxid = ddlFilter.maxid; + this.calcRequestFieldID(); +} + +Filter.prototype.calcRequestFieldID = function () { + this._requestFieldID = this.fieldid; + this._requestMinID = this.minid; + this._requestMaxID = this.maxid; + switch (this.rule) { + case "<": + case "<=": + if (Utility.endsWith(this.fieldid, "-max")) { + this._requestFieldID = this.fieldid.substring(0, this.fieldid.length - 4) + (this.datasource.isRoxie() ? "_max" : ""); + } + break; + case ">": + case ">=": + if (Utility.endsWith(this.fieldid, "-min")) { + this._requestFieldID = this.fieldid.substring(0, this.fieldid.length - 4) + (this.datasource.isRoxie() ? "_min" : ""); + } + break; + case "set": + if (Utility.endsWith(this.fieldid, "-set")) { + this._requestFieldID = this.fieldid.substring(0, this.fieldid.length - 4) + (this.datasource.isRoxie() ? "_set" : ""); + } + break; + case "range": + if (Utility.endsWith(this.minid, "-min")) { + this._requestMinID = this.minid.substring(0, this.minid.length - 4) + (this.datasource.isRoxie() ? "_min" : ""); + } + if (Utility.endsWith(this.maxid, "-max")) { + this._requestMaxID = this.maxid.substring(0, this.maxid.length - 4) + (this.datasource.isRoxie() ? "_max" : ""); + } + break; + } +}; + +Filter.prototype.isRange = function () { + return this.rule === "range"; +}; + +Filter.prototype.isSet = function () { + return this.rule === "set"; +}; + +Filter.prototype._calcRequest = function (filteredRequest, request, fieldid, requestFieldID, value) { + if (!this.datasource.isRoxie()) { + // Ignore requestFieldID, until filtering WU results + // Otherwise there are many fieldID collisions + requestFieldID = fieldid; + } + filteredRequest[requestFieldID + _CHANGED] = request[fieldid + _CHANGED] || false; + if (filteredRequest[requestFieldID] !== value) { + filteredRequest[requestFieldID] = value; + } +}; + +Filter.prototype.calcRequest = function (filteredRequest, request, fillInMissing) { + if (!fillInMissing && request[this.fieldid] === undefined) { + return; + } + const value = request[this.fieldid] === undefined ? null : request[this.fieldid]; + if (this.isRange()) { + if (value instanceof Array && value.length === 2) { + this._calcRequest(filteredRequest, request, this.minid, this._requestMinID, value[0]); + this._calcRequest(filteredRequest, request, this.maxid, this._requestMaxID, value[1]); + } + } else { + this._calcRequest(filteredRequest, request, this.fieldid, this._requestFieldID, value); + if (this.isSet() && this.datasource.isRoxie()) { + // TODO in the future the value should be an array --- + filteredRequest[this._requestFieldID + ".Item$"] = filteredRequest[this._requestFieldID]; + delete filteredRequest[this._requestFieldID]; + } + } +}; + +Filter.prototype.matches = function (row, value): boolean { + if (value === undefined || value === null || value === "") { + return this.nullable; + } + let rowValue = row[this._requestFieldID]; + if (rowValue === undefined) { + rowValue = row[this._requestFieldID.toLowerCase()]; + } + if (rowValue === undefined) { + console.warn("Empty cell value: '" + this._requestFieldID + "'"); + return false; + } + switch (this.rule) { + case "<": + if (rowValue.localeCompare) { + return rowValue.localeCompare(value) < 0; + } + return rowValue < value; + case ">": + if (rowValue.localeCompare) { + return rowValue.localeCompare(value) > 0; + } + return rowValue > value; + case "<=": + if (rowValue.localeCompare) { + return rowValue.localeCompare(value) <= 0; + } + return rowValue <= value; + case ">=": + if (rowValue.localeCompare) { + return rowValue.localeCompare(value) >= 0; + } + return rowValue >= value; + case "!=": + case "notequals": + // tslint:disable-next-line:triple-equals + return rowValue != value; // jshint ignore:line + case "set": + if (value instanceof Array) { + return value.indexOf(rowValue) >= 0; + } + // tslint:disable-next-line:triple-equals + return value == rowValue; // jshint ignore:line + case "==": + // tslint:disable-next-line:triple-equals + return value == rowValue; // jshint ignore:line + default: + console.warn("Unknown filter rule: '" + this.rule + "'"); + // tslint:disable-next-line:triple-equals + return value == rowValue; // jshint ignore:line + } +}; + +export class Output { + + datasource; + id; + from; + protected notify; + filters; + protected db; + + constructor(datasource, output) { + this.datasource = datasource; + this.id = output.id; + this.from = output.from; + this.notify = output.notify || []; + this.filters = (output.filter || []).map(filter => { + return new Filter(this.datasource, filter); + }); + } + + getQualifiedID() { + return this.datasource.getQualifiedID() + "." + this.id; + } + + getUpdatesVisualizations() { + const retVal = []; + this.notify.forEach(item => { + retVal.push(this.datasource.marshaller.getVisualization(item)); + }); + return retVal; + } + + accept(visitor) { + visitor.visit(this); + } + + vizNotify(updates) { + const promises = []; + this.notify.filter(function (item) { + return !updates || updates.indexOf(item) >= 0; + }).forEach(item => { + const viz = this.datasource.marshaller.getVisualization(item); + promises.push(viz.notify()); + }); + return Promise.all(promises); + } + + setData(data, updates) { + this.db = new Database.Grid().jsonObj(data); + return this.vizNotify(updates); + } +} + +// FetchData Optimizers --- +function DatasourceRequestOptimizer(this: any) { + this.datasourceRequests = { + }; +} + +DatasourceRequestOptimizer.prototype.appendRequest = function (updateDatasource, request, updateVisualization) { + const datasourceRequestID = updateDatasource.id + "(" + JSON.stringify(request) + ")"; + if (!this.datasourceRequests[datasourceRequestID]) { + this.datasourceRequests[datasourceRequestID] = { + updateDatasource, + request, + updates: [] + }; + } else if ((window as any).__hpcc_debug) { + console.warn("Optimized duplicate fetch: " + datasourceRequestID); + } + const datasourceOptimizedItem = this.datasourceRequests[datasourceRequestID]; + if (datasourceOptimizedItem.updates.indexOf(updateVisualization.id) < 0) { + datasourceOptimizedItem.updates.push(updateVisualization.id); + } +}; + +DatasourceRequestOptimizer.prototype.fetchData = function () { + const promises = []; + for (const key in this.datasourceRequests) { + const item = this.datasourceRequests[key]; + promises.push(item.updateDatasource.fetchData(item.request, item.updates)); + } + return Promise.all(promises); +}; + +function VisualizationRequestOptimizer(this: any, skipClear?) { + this.skipClear = skipClear; + this.visualizationRequests = { + }; +} + +VisualizationRequestOptimizer.prototype.appendRequest = function (updateDatasource, request, updateVisualization) { + if (updateDatasource && updateVisualization) { + const visualizationRequestID = updateVisualization.id + "(" + updateDatasource.id + ")"; + if (!this.visualizationRequests[visualizationRequestID]) { + this.visualizationRequests[visualizationRequestID] = { + updateVisualization, + updateDatasource, + request: {} + }; + } else if ((window as any).__hpcc_debug) { + console.warn("Optimized duplicate fetch: " + visualizationRequestID); + } + const visualizationOptimizedItem = this.visualizationRequests[visualizationRequestID]; + Utility.mixin(visualizationOptimizedItem.request, request); + } +}; + +VisualizationRequestOptimizer.prototype.fetchData = function () { + const datasourceRequestOptimizer = new DatasourceRequestOptimizer(); + for (const key in this.visualizationRequests) { + const item = this.visualizationRequests[key]; + if (!this.skipClear && item.updateVisualization.type !== "GRAPH") { + item.updateVisualization.clear(); + } + item.updateVisualization.update(LOADING); + datasourceRequestOptimizer.appendRequest(item.updateDatasource, item.request, item.updateVisualization); + } + return datasourceRequestOptimizer.fetchData(); +}; + +// Datasource --- +let transactionID = 0; +const transactionQueue = []; +export class Datasource { + + protected marshaller; + id; + protected WUID; + protected URL; + databomb; + protected filters; + protected _loadedCount; + protected _outputs; + protected _outputArray; + comms; + protected _loadedCount2; + protected _loadedCount3; + protected _loadedCount4; + + constructor(marshaller, datasource: DDL1.IAnyDatasource, proxyMappings, timeout) { + this.marshaller = marshaller; + this.id = datasource.id; + if (DDL1.isWorkunitDatasource(datasource)) { + this.WUID = datasource.WUID; + } else if (DDL1.isHipieDatasource(datasource)) { + this.URL = (marshaller.espUrl && marshaller.espUrl.url()) ? marshaller.espUrl.url() : datasource.URL; + } else if (DDL1.isDatabombDatasource(datasource)) { + this.databomb = datasource.databomb; + } + this.filters = (datasource.filter || []).map(filter => { + return new Filter(this, filter); + }); + this._loadedCount = 0; + + const context = this; + this._outputs = {}; + this._outputArray = []; + const hipieResults = []; + datasource.outputs.forEach(item => { + const output = new Output(context, item); + context._outputs[item.id] = output; + context._outputArray.push(output); + hipieResults.push({ + id: item.id, + from: item.from, + filters: output.filters || this.filters + }); + }); + + if (this.WUID) { + this.comms = new Comms.HIPIEWorkunit() + .url(this.URL) + .proxyMappings(proxyMappings) + .timeout(timeout) + .hipieResults(hipieResults) + ; + } else if (this.databomb) { + this.comms = new Comms.HIPIEDatabomb() + .hipieResults(hipieResults) + ; + } else if (DDL1.isHipieDatasource(datasource)) { + this.comms = new Comms.HIPIERoxie() + .url(datasource.URL) + .proxyMappings(proxyMappings) + .timeout(timeout) + .hipieResults(hipieResults) + ; + } + } + + isRoxie() { + return !this.WUID && !this.databomb; + } + + isWU() { + return !!this.WUID; + } + + isDatabomb() { + return !!this.databomb; + } + + getQualifiedID() { + return this.id; + } + + getOutputs() { + return this._outputs; + } + + getUpdatesVisualizations() { + const retVal = []; + for (const key in this._outputs) { + this._outputs[key].getUpdatesVisualizations().forEach(function (visualization) { + retVal.push(visualization); + }); + } + return retVal; + } + + accept(visitor) { + visitor.visit(this); + for (const key in this._outputs) { + this._outputs[key].accept(visitor); + } + } + + calcRequest(request, fillInMissing) { + const retVal = {}; + this.filters.forEach(function (item) { + item.calcRequest(retVal, request, fillInMissing); + }); + // TODO - Workaround HIPIE issue where it omits filters at datasource level --- + this._outputArray.forEach(function (output) { + output.filters.forEach(function (item) { + item.calcRequest(retVal, request, fillInMissing); + }); + }); + return retVal; + } + + fetchData(request, updates) { + const myTransactionID = ++transactionID; + transactionQueue.push(myTransactionID); + + let dsRequest = request; + dsRequest = this.calcRequest(request, this.isRoxie()); + dsRequest.refresh = request.refresh || false; + if ((window as any).__hpcc_debug) { + console.warn("fetchData: " + JSON.stringify(updates) + "(" + JSON.stringify(request) + ")"); + } + for (const key in dsRequest) { + if (dsRequest[key] === undefined) { + delete dsRequest[key]; + } + } + const now = Date.now(); + this.marshaller.commsEvent(this, "request", dsRequest); + const context = this; + return new Promise(function (resolve, reject) { + context.comms.call(dsRequest).then(function (_response) { + const response = JSON.parse(JSON.stringify(_response)); + const intervalHandle = setInterval(function () { + if (transactionQueue[0] === myTransactionID && Date.now() - now >= 500) { // 500 is to allow for all "clear" transitions to complete... + clearTimeout(intervalHandle); + context.processResponse(response, dsRequest, updates).then(function () { + transactionQueue.shift(); + resolve(response); + context.marshaller.commsEvent(context, "response", dsRequest, response); + ++context._loadedCount; + }); + } + }, 100); + }).catch(function (e) { + context.marshaller.commsEvent(context, "error", dsRequest, e); + reject(e); + }); + }); + } + + processResponse(response, request, updates) { + const lowerResponse = {}; + for (const responseKey in response) { + lowerResponse[responseKey.toLowerCase()] = response[responseKey]; + } + const promises = []; + for (const key in this._outputs) { + const from = this._outputs[key].id; + if (Utility.exists(from, response)) { + if (!Utility.exists(from + _CHANGED, response) || (Utility.exists(from + _CHANGED, response) && response[from + _CHANGED].length && response[from + _CHANGED][0][from + _CHANGED])) { + promises.push(this._outputs[key].setData(response[from], updates)); + } else { + // TODO - I Suspect there is a HIPIE/Roxie issue here (empty request) + promises.push(this._outputs[key].vizNotify(updates)); + } + } else if (Utility.exists(from, lowerResponse)) { + console.warn("DDL 'Datasource.From' case is Incorrect"); + if (!Utility.exists(from + _CHANGED, lowerResponse) || (Utility.exists(from + _CHANGED, lowerResponse) && response[from + _CHANGED].length && lowerResponse[from + _CHANGED][0][from + _CHANGED])) { + promises.push(this._outputs[key].setData(lowerResponse[from], updates)); + } else { + // TODO - I Suspect there is a HIPIE/Roxie issue here (empty request) + promises.push(this._outputs[key].vizNotify(updates)); + } + } else { + const responseItems = []; + for (const responseKey2 in response) { + responseItems.push(responseKey2); + } + console.warn("Unable to locate '" + from + "' in response {" + responseItems.join(", ") + "}"); + } + } + return Promise.all(promises); + } + + isLoaded() { + return this._loadedCount > 0; + } + + serializeState() { + return { + }; + } + + deserializeState(state) { + if (!state) return; + } +} + +// Dashboard --- +export function Dashboard(this: any, marshaller, dashboard, proxyMappings, timeout?) { + this.marshaller = marshaller; + this.id = dashboard.id; + this.title = dashboard.title; + + this._datasources = {}; + this._datasourceArray = []; + this._datasourceTotal = 0; + if (dashboard.datasources) { + dashboard.datasources.forEach(item => { + this.createDatasource(item, proxyMappings, timeout); + }); + } + this._datasourceTotal = this._datasourceArray.length; + + this._visualizations = {}; + this._visualizationArray = []; + dashboard.visualizations.forEach(item => { + this.createVisualization(item); + }); + this._visualizationTotal = this._visualizationArray.length; +} + +Dashboard.prototype.createDatasource = function (ddlDatasouce) { + let retVal = this._datasources[ddlDatasouce.id]; + if (!retVal) { + retVal = this.marshaller.createDatasource(ddlDatasouce); + this._datasources[ddlDatasouce.id] = retVal; + this._datasourceArray.push(retVal); + } + this._datasourceTotal = this._datasourceArray.length; + return retVal; +}; + +Dashboard.prototype.createVisualization = function (ddlVisualization, parentVisualization) { + const retVal = new Visualization(this, ddlVisualization, parentVisualization); + this._visualizations[ddlVisualization.id] = retVal; + this._visualizationArray.push(retVal); + this.marshaller.appendVisualization(retVal); + return retVal; +}; + +Dashboard.prototype.loadedPromise = function () { + return Promise.all(this._visualizationArray.map(function (visualization) { return visualization.loadedPromise(); })); +}; + +Dashboard.prototype.getQualifiedID = function () { + return this.id; +}; + +Dashboard.prototype.getDatasources = function () { + return this._datasources; +}; + +Dashboard.prototype.getDatasourceArray = function () { + return this._datasourceArray; +}; + +Dashboard.prototype.getDatasource = function (id) { + return this._datasources[id] || this.marshaller.getDatasource(id); +}; + +Dashboard.prototype.getDataSourceArray = function () { + return this._datasourceArray; +}; + +Dashboard.prototype.getVisualization = function (id) { + return this._visualizations[id] || this.marshaller.getVisualization(id); +}; + +Dashboard.prototype.getVisualizations = function () { + return this._visualizations; +}; + +Dashboard.prototype.getVisualizationArray = function () { + return this._visualizationArray; +}; + +Dashboard.prototype.getVisualizationTotal = function () { + return this._visualizationTotal; +}; + +Dashboard.prototype.accept = function (visitor) { + visitor.visit(this); + for (const key in this._datasources) { + this._datasources[key].accept(visitor); + } + this._visualizationArray.forEach(function (item) { + item.accept(visitor); + }, this); +}; + +Dashboard.prototype.primeData = function (state) { + const fetchDataOptimizer = new VisualizationRequestOptimizer(true); + this.getVisualizationArray().forEach(function (visualization) { + // Clear all charts back to their default values --- + visualization.clear(); + visualization.update(); + if (state && state[visualization.id]) { + if (Utility.exists("source.mappings.mappings", visualization)) { + for (const key in visualization.source.mappings.mappings) { + if (state[visualization.id][visualization.source.mappings.mappings[key]]) { + visualization._widgetState.row[key] = state[visualization.id][visualization.source.mappings.mappings[key]]; + visualization._widgetState.selected = true; + } + } + } + } + }); + this.getVisualizationArray().forEach(function (visualization) { + const inputVisualizations = visualization.getInputVisualizations(); + const datasource = visualization.source.getDatasource(); + let hasInputSelection = false; + inputVisualizations.forEach(function (inViz) { + if (inViz.hasSelection()) { + const request = inViz.calcRequestFor(visualization); + request.refresh = true; + fetchDataOptimizer.appendRequest(datasource, request, visualization); + hasInputSelection = true; + } + }); + if (!hasInputSelection && ((datasource && datasource.isRoxie()) || inputVisualizations.length === 0)) { + fetchDataOptimizer.appendRequest(datasource, { refresh: true }, visualization); + } + }); + return fetchDataOptimizer.fetchData(); +}; + +Dashboard.prototype.serializeState = function () { + const retVal = { + datasources: {}, + visualizations: {} + }; + for (const key in this._datasources) { + retVal.datasources[key] = this._datasources[key].serializeState(); + } + for (const vizKey in this._visualizations) { + retVal.visualizations[vizKey] = this._visualizations[vizKey].serializeState(); + } + return retVal; +}; + +Dashboard.prototype.deserializeState = function (state) { + if (!state) return; + for (const key in this._datasources) { + if (state.datasources[key]) { + this._datasources[key].deserializeState(state.datasources[key]); + } + } + for (const vizKey in this._visualizations) { + if (state.visualizations[vizKey]) { + this._visualizations[vizKey].deserializeState(state.visualizations[vizKey]); + } + } +}; + +// Marshaller --- +export function Marshaller(this: any) { + Class.call(this); + + this._proxyMappings = {}; + this._widgetMappings = d3Map(); + this._clearDataOnUpdate = true; + this._propogateClear = false; + this.id = "Marshaller"; + this._missingDataString = ""; + this.dashboards = {}; + this.dashboardArray = []; + + this._datasources = {}; + this._datasourceArray = []; + this._visualizations = {}; + this._visualizationArray = []; +} +Marshaller.prototype = Object.create(Class.prototype); +Marshaller.prototype.constructor = Marshaller; + +Marshaller.prototype.commsDataLoaded = function () { + for (let i = 0; i < this.dashboardArray.length; i++) { + for (const ds in this.dashboardArray[i].getDatasources()) { + if (!this.dashboardArray[i].getDatasource(ds).isLoaded()) { + return false; + } + } + } + return true; +}; + +Marshaller.prototype.accept = function (visitor) { + visitor.visit(this); + for (const key2 in this._datasources) { + this._datasources[key2].accept(visitor); + } + this.dashboardTotal = 0; + for (const key in this.dashboards) { + this.dashboards[key].accept(visitor); + ++this.dashboardTotal; + } +}; + +Marshaller.prototype.url = function (url, callback) { + this.espUrl = new Comms.ESPUrl() + .url(url) + ; + let transport = null; + let hipieResultName = "HIPIE_DDL"; + if (this.espUrl.isWorkunitResult()) { + hipieResultName = this.espUrl.param("ResultName"); + transport = new Comms.HIPIEWorkunit() + .url(url) + .proxyMappings(this._proxyMappings) + .timeout(this._timeout) + ; + } else { + transport = new Comms.HIPIERoxie() + .url(url) + .proxyMappings(this._proxyMappings) + .timeout(this._timeout) + ; + } + + const context = this; + transport.fetchResults().then(function (response) { + if (Utility.exists(hipieResultName, response)) { + return transport.fetchResult(hipieResultName).then(function (ddlResponse) { + const json = ddlResponse[0][hipieResultName]; + context.parse(json, function () { + callback(response); + }); + }).catch(function (e) { + context.commsEvent(context, "error", hipieResultName, e); + }); + } + }).catch(function (e) { + context.commsEvent(context, "error", "fetchResults", e); + }); +}; + +Marshaller.prototype.proxyMappings = function (_) { + if (!arguments.length) return this._proxyMappings; + this._proxyMappings = _; + return this; +}; + +Marshaller.prototype.timeout = function (_) { + if (!arguments.length) return this._timeout; + this._timeout = _; + return this; +}; + +Marshaller.prototype.widgetMappings = function (_) { + if (!arguments.length) return this._widgetMappings; + this._widgetMappings = _; + return this; +}; + +Marshaller.prototype.clearDataOnUpdate = function (_) { + if (!arguments.length) return this._clearDataOnUpdate; + this._clearDataOnUpdate = _; + return this; +}; + +Marshaller.prototype.propogateClear = function (_) { + if (!arguments.length) return this._propogateClear; + this._propogateClear = _; + return this; +}; + +Marshaller.prototype.missingDataString = function (_) { + if (!arguments.length) return this._missingDataString; + this._missingDataString = _; + return this; +}; + +Marshaller.prototype.parse = function (json, callback) { + const context = this; + this._json = json; + this._jsonParsed = JSON.parse(this._json); + + // Global Datasources --- + this._datasources = {}; + this._datasourceArray = []; + if (this._jsonParsed.datasources) { + this._jsonParsed.datasources.forEach(function (item) { + context.createDatasource(item); + }); + } + + this.dashboards = {}; + this.dashboardArray = []; + this._visualizations = {}; + this._visualizationArray = []; + const dashboards = this._jsonParsed.dashboards || this._jsonParsed; + dashboards.forEach(function (item) { + const newDashboard = new Dashboard(context, item, context._proxyMappings, context._timeout); + context.dashboards[item.id] = newDashboard; + context.dashboardArray.push(newDashboard); + }); + this.dashboardTotal = this.dashboardArray.length; + this._visualizationArray.forEach(function (ddlViz) { + ddlViz.on("processEvent", function (eventID, event, row, col, selected) { + context.vizEvent(ddlViz.widget, eventID, row, col, selected); + }); + }); + this._datasourceTotal = this._datasourceArray.length; + + this.ready(callback); + return this; +}; + +Marshaller.prototype.dashboardsLoaded = function () { + return Promise.all(this.dashboardArray.map(function (dashboard) { return dashboard.loadedPromise(); })); +}; + +Marshaller.prototype.createDatasource = function (ddlDatasouce: DDL1.IAnyDatasource) { + let retVal = this._datasources[ddlDatasouce.id]; + if (!retVal) { + retVal = new Datasource(this, ddlDatasouce, this._proxyMappings, this._timeout); + this._datasources[ddlDatasouce.id] = retVal; + this._datasourceArray.push(retVal); + } + this._datasourceTotal = this._datasourceArray.length; + return retVal; +}; + +Marshaller.prototype.getDatasource = function (id) { + return this._datasources[id]; +}; + +Marshaller.prototype.getDatasources = function () { + return this._datasources; +}; + +Marshaller.prototype.getDatasourceArray = function () { + return this._datasourceArray; +}; + +Marshaller.prototype.appendVisualization = function (visualization) { + this._visualizations[visualization.id] = visualization; + this._visualizationArray.push(visualization); +}; + +Marshaller.prototype.getVisualization = function (id) { + return this._visualizations[id]; +}; + +Marshaller.prototype.appendDataSource = function (datasource) { + this._datasources[datasource.id] = datasource; + this._datasourceArray.push(datasource); +}; + +Marshaller.prototype.getVisualizations = function () { + return this._visualizations; +}; + +Marshaller.prototype.getVisualizationArray = function () { + return this._visualizationArray; +}; + +Marshaller.prototype.getWidget = function (id) { + return this._widgetMappings.get(id); +}; + +Marshaller.prototype.on = function (eventID, func) { + const context = this; + this.overrideMethod(eventID, function (origFunc, args) { + const retVal = origFunc.apply(context, args); + return func.apply(context, args) || retVal; + }); + return this; +}; + +Marshaller.prototype.ready = function (callback) { + if (!callback) { + return; + } + this.dashboardsLoaded().then(function () { + callback(); + }); +}; + +Marshaller.prototype.vizEvent = function (sourceWidget, eventID, row, col, selected) { + console.warn("Marshaller.vizEvent: " + sourceWidget.id() + "-" + eventID); +}; + +Marshaller.prototype.commsEvent = function (ddlSource, eventID, request, response) { + switch (eventID) { + case "request": + if ((window as any).__hpcc_debug) { + console.warn("Marshaller.commsEvent: " + ddlSource.id + "-" + eventID + ": " + JSON.stringify(request)); + } + break; + case "response": + case "error": + if ((window as any).__hpcc_debug) { + console.warn("Marshaller.commsEvent: " + ddlSource.id + "-" + eventID + ": " + JSON.stringify(response)); + } + break; + default: + if ((window as any).__hpcc_debug) { + console.warn("Marshaller.commsEvent: " + JSON.stringify(arguments)); + } + break; + + } +}; + +Marshaller.prototype.createDatabomb = function () { + const retVal = {}; + this.dashboardArray.forEach(function (dashboard) { + for (const key in dashboard.getDatasources()) { + const comms = dashboard.getDatasource(key).comms; + retVal[key] = {}; + for (const key2 in comms._hipieResults) { + const hipieResult = comms._hipieResults[key2]; + retVal[key][key2] = comms._resultNameCache[hipieResult.from]; + } + } + }); + return retVal; +}; + +Marshaller.prototype.primeData = function (state) { + const promises = this.dashboardArray.map(function (dashboard) { + return dashboard.primeData(state); + }); + return Promise.all(promises); +}; + +Marshaller.prototype.serializeState = function () { + const retVal = {}; + this.dashboardArray.forEach(function (dashboard, idx) { + retVal[dashboard.id] = dashboard.serializeState(); + }); + return retVal; +}; + +Marshaller.prototype.deserializeState = function (state) { + if (!state) return; + this.dashboardArray.forEach(function (dashboard, idx) { + dashboard.deserializeState(state[dashboard.id]); + }); + return this; +}; diff --git a/packages/marshaller/src/ddl1/HipieDDLMixin.ts b/packages/marshaller/src/ddl1/HipieDDLMixin.ts new file mode 100644 index 0000000000..5f4e7fab4c --- /dev/null +++ b/packages/marshaller/src/ddl1/HipieDDLMixin.ts @@ -0,0 +1,391 @@ +import { Platform, PropertyExt, Utility } from "@hpcc-js/common"; +import { Modal, Surface } from "@hpcc-js/layout"; +import { Persist } from "@hpcc-js/other"; +import { map as d3Map } from "d3-collection"; +import { select as d3Select } from "d3-selection"; +import { FlyoutButton } from "./FlyoutButton.ts"; +import * as HipieDDL from "./HipieDDL.ts"; + +const tpl = + "" + + "" + + "" + + "" + + "
"; + +export class HipieDDLMixin extends PropertyExt { + _ddlDashboards; + _ddlVisualizations; + _ddlPopupVisualizations; + _ddlLayerVisualizations; + _ddlModalVisualizations; + _prev_ddlUrl; + _prev_databomb; + _marshaller; + _initialState; + + constructor() { + super(); + PropertyExt.call(this); + } + + _gatherDashboards(marshaller, databomb) { + if (databomb instanceof Object) { + } else if (databomb) { + databomb = JSON.parse(databomb); + } + this._ddlDashboards = []; + this._ddlVisualizations = []; + this._ddlPopupVisualizations = []; + this._ddlLayerVisualizations = []; + this._ddlModalVisualizations = []; + const context = this; + let curr = null; + marshaller.accept({ + visit: (item) => { + if (item instanceof HipieDDL.Dashboard) { + curr = { + dashboard: item, + visualizations: [], + popupVisualizations: [], + layerVisualizations: [], + modalVisualizations: [] + }; + context._ddlDashboards.push(curr); + } else if (item instanceof HipieDDL.Datasource) { + if (item.databomb && databomb[item.id]) { + item.comms.databomb(databomb[item.id]); + } + } else if (item instanceof HipieDDL.Output) { + if (item.datasource.databomb) { + item.datasource.comms.databombOutput(item.from, item.id); + } + } else if (item instanceof HipieDDL.Visualization) { + if (item.widget) { + if (item.properties.flyout) { + curr.popupVisualizations.push(item); + context._ddlPopupVisualizations.push(item); + } else if (item.parentVisualization) { + curr.layerVisualizations.push(item); + context._ddlLayerVisualizations.push(item); + } else if (item.properties.modalIfData && !context.disableModals()) { + curr.modalVisualizations.push(item); + context._ddlModalVisualizations.push(item); + } else { + curr.visualizations.push(item); + context._ddlVisualizations.push(item); + } + } + } + } + }); + } + + _marshallerRender(BaseClass, callback) { + if (this.ddlUrl() === "" || (this.ddlUrl() === this._prev_ddlUrl && this.databomb() === this._prev_databomb)) { + if (this._marshaller) { + this._marshaller + .proxyMappings(this.proxyMappings()) + .timeout(this.timeout()) + .clearDataOnUpdate(this.clearDataOnUpdate()) + .propogateClear(this.propogateClear()) + .missingDataString(this.missingDataString()) + ; + } + return BaseClass.render.call(this, function (widget) { + if (callback) { + callback(widget); + } + }); + } + if (this._prev_ddlUrl && this._prev_ddlUrl !== this.ddlUrl()) { + // DDL has actually changed (not just a deserialization) + this + .clearContent() + ; + } + this._prev_ddlUrl = this.ddlUrl(); + this._prev_databomb = this.databomb(); + + // Gather existing widgets for reuse --- + const widgetArr = []; + Persist.widgetArrayWalker(this.content(), function (w) { + widgetArr.push(w); + }); + const widgetMap = d3Map(widgetArr, function (d) { + return d.id(); + }); + const removedMap = d3Map(widgetArr.filter(function (d) { return d.id().indexOf(d._idSeed) !== 0 && d.id().indexOf("_pe") !== 0; }), function (d) { + return d.id(); + }); + + const context = this; + this._marshaller = new HipieDDL.Marshaller() + .proxyMappings(this.proxyMappings()) + .clearDataOnUpdate(this.clearDataOnUpdate()) + .propogateClear(this.propogateClear()) + .missingDataString(this.missingDataString()) + .widgetMappings(widgetMap) + .on("commsEvent", function (source, error) { + context.commsEvent.apply(context, arguments); + }) + .on("vizEvent", function () { + context.vizEvent.apply(context, arguments); + }) + ; + + // Parse DDL --- + if (this.ddlUrl()[0] === "[" || this.ddlUrl()[0] === "{") { + this._marshaller.parse(this.ddlUrl(), postParse); + } else { + this._marshaller.url(this.ddlUrl(), postParse); + } + + function postParse() { + context._gatherDashboards(context._marshaller, context.databomb()); + // Remove existing widgets not used and prime popups --- + context._ddlVisualizations.forEach(function (viz) { + removedMap.remove(viz.id); + if (!context._marshaller.widgetMappings().get(viz.id)) { + // New widget --- + viz.newWidgetSurface = null; + if (viz.widget instanceof Surface || viz.widget.classID() === "composite_MegaChart") { + viz.newWidgetSurface = viz.widget; + } else { + viz.newWidgetSurface = new Surface() + .widget(viz.widget) + ; + } + viz.newWidgetSurface.title(viz.title); + viz.widget.size({ width: 0, height: 0 }); + } + }); + context._ddlPopupVisualizations.forEach(function (viz) { + removedMap.remove(viz.id); + viz.widget.classed({ flyout: true }); + const targetVizs = viz.events.getUpdatesVisualizations(); + targetVizs.forEach(function (targetViz) { + switch (targetViz.widget.classID()) { + case "composite_MegaChart": + if (!viz._flyoutButton) { + viz._flyoutButton = new FlyoutButton() + .classed({ "composite_MegaChart-flyout": true }) + .title(viz.title) + .widget(viz.widget) + .autoClose(context.autoCloseFlyout()) + ; + targetViz.widget.toolbarWidgets().push(viz._flyoutButton); + } else { + targetViz.widget.toolbarWidgets().push(viz._flyoutButton.reference()); + } + break; + } + }); + }); + context._ddlModalVisualizations.forEach(function (viz) { + if (viz.widget.showCSV) { + viz.widget.showToolbar(true); + } else if (viz.widget.showToolbar) { + viz.widget.showToolbar(false); + } + viz._modalTarget = d3Select("body").append("div").node(); + viz._modal = new Modal().target(viz._modalTarget) + .overflowX("hidden") + .overflowY("hidden") + ; + viz._modal._widget = viz.widget; + const origRender = viz.widget.render; + viz.widget.render = function (callback) { + if (this.__inModal) { + return origRender.apply(this, arguments); + } + if (this.data().length) { + this.__inModal = true; + const widgetContext = this; + const modalTitle = viz.widget.title(); + if (viz.widget.showToolbar()) { + viz.widget.titleFontColor("transparent"); + } + viz._modal + .title(modalTitle) + .visible(true) + .fixedWidth("80%") + .fixedHeight("80%") + .render(function (w) { + if (callback) { + callback(widgetContext); + } + setTimeout(function () { + widgetContext.__inModal = false; + }, 300); // Must be longer than debounce timeout... + }); + } else { + if (callback) { + callback(this); + } + } + return this; + }; + }); + removedMap.each(function (key, value) { + context.clearContent(value); + }); + context.populateContent(); + if (context._initialState) { + context._marshaller.deserializeState(context._initialState.marshaller); + delete context._initialState; + BaseClass.render.call(context, callback); + } else { + BaseClass.render.call(context, function (widget) { + context._marshaller.primeData().then(function (response) { + if (callback) { + callback(widget); + } + }); + }); + } + } + } + + primeData(state) { + if (this._marshaller) { + return this._marshaller.primeData(state); + } + return Promise.resolve(); + } + + dashboards() { + const retVal = {}; + for (const key in this._marshaller.dashboards) { + retVal[key] = {}; + this._marshaller.dashboards[key].visualizations.forEach(function (ddlViz) { + retVal[key][ddlViz.id] = ddlViz.widget; + }, this); + } + return retVal; + } + + visualizations() { + return this._marshaller._visualizationArray.map(function (ddlViz) { + return ddlViz.newWidgetSurface || ddlViz.widget; + }); + } + + generateTestPage() { + if (this._marshaller) { + const context = this; + const state = Persist.serialize(context, function (widget, publishItem) { + if (publishItem.id === "databomb" || publishItem.id === "ddlUrl") { + return true; + } + return false; + }); + const databomb = this._marshaller.createDatabomb(); + const page = tpl + .replace("{VERSION}", Platform.version()) + .replace("{STATE}", state) + .replace("{DDL}", context._marshaller._json.replace("WUID", "databomb")) + .replace("{DATABOMB}", JSON.stringify(databomb)) + ; + Utility.downloadString("TEXT", page, "test"); + } + } + + vizEvent(sourceWidget, eventID, row, col, selected) { + } + + commsEvent(ddlSource, eventID, request, response) { + } + + state(_) { + if (!arguments.length) { + return this.serializeState(); + } + this.deserializeState(_); + return this; + } + + serializeState() { + return { + marshaller: this._marshaller ? this._marshaller.serializeState() : {} + }; + } + + deserializeState(state) { + if (this._marshaller) { + this._marshaller.deserializeState(state.marshaller); + } else { + this._initialState = state; + } + return this; + } + + serializeRequests() { + let retVal = null; + this._ddlPopupVisualizations.concat(this._ddlVisualizations).forEach(function (ddlViz) { + if (ddlViz.hasSelection()) { + if (!retVal) { + retVal = {}; + } + retVal[ddlViz.id] = ddlViz.reverseMappedSelection(); + } + }); + return retVal; + } + // HipieDDLMixin abstract methods --- + content: () => this; + populateContent: () => this; + clearContent: (value?) => this; +} +HipieDDLMixin.prototype.mixin(PropertyExt); +HipieDDLMixin.prototype._class += " marshaller_HipieDDLMixin"; + +export interface HipieDDLMixin { + ddlUrl(): string; + ddlUrl(_: string): this; + ddlUrl_exists(): boolean; + databomb(): string; + databomb(_: string): this; + databomb_exists(): boolean; + proxyMappings(): object; + proxyMappings(_: object): this; + proxyMappings_exists(): boolean; + timeout(): number; + timeout(_: number): this; + timeout_exists(): boolean; + clearDataOnUpdate(): boolean; + clearDataOnUpdate(_: boolean): this; + clearDataOnUpdate_exists(): boolean; + propogateClear(): boolean; + propogateClear(_: boolean): this; + propogateClear_exists(): boolean; + missingDataString(): string; + missingDataString(_: string): this; + missingDataString_exists(): boolean; + autoCloseFlyout(): boolean; + autoCloseFlyout(_: boolean): this; + autoCloseFlyout_exists(): boolean; + disableModals(): boolean; + disableModals(_: boolean): this; +} + +HipieDDLMixin.prototype.publish("ddlUrl", "", "string", "DDL URL", null, { tags: ["Private"] }); +HipieDDLMixin.prototype.publish("databomb", "", "string", "Data Bomb", null, { tags: ["Private"] }); +HipieDDLMixin.prototype.publish("proxyMappings", {}, "object", "Proxy Mappings", null, { tags: ["Private"] }); +HipieDDLMixin.prototype.publish("timeout", null, "number", "Timout (seconds)", null, { optional: true }); +HipieDDLMixin.prototype.publish("clearDataOnUpdate", true, "boolean", "Clear data prior to refresh", null); +HipieDDLMixin.prototype.publish("propogateClear", false, "boolean", "Propogate clear to dependent visualizations", null); +HipieDDLMixin.prototype.publish("missingDataString", "***MISSING***", "string", "Missing data display string"); +HipieDDLMixin.prototype.publish("autoCloseFlyout", true, "boolean", "Auto Close Flyout Filters"); +HipieDDLMixin.prototype.publish("disableModals", false, "boolean", "If true, widgets with 'modalIfData' will display as standard Grid widgets"); diff --git a/packages/marshaller/src/ddl1/Tabbed.ts b/packages/marshaller/src/ddl1/Tabbed.ts new file mode 100644 index 0000000000..d229f3a5a4 --- /dev/null +++ b/packages/marshaller/src/ddl1/Tabbed.ts @@ -0,0 +1,91 @@ +import { Grid, Tabbed as TabbedLayout } from "@hpcc-js/layout"; +import { HipieDDLMixin } from "./HipieDDLMixin.ts"; + +export class Tabbed extends TabbedLayout { + _ddlDashboards; + + constructor() { + super(); + HipieDDLMixin.call(this); + + this.surfacePadding_default(0); + } + + content() { + const retVal = []; + this.widgets().forEach(function (surface) { + const grid = surface.widget(); + grid.content().forEach(function (widget) { + retVal.push(widget); + }); + }); + return retVal; + } + + populateContent() { + const cellDensity = 3; + this._ddlDashboards.forEach(dashboard => { + const grid = new Grid().surfacePadding("0px"); + this.addTab(grid, dashboard.dashboard.title); + let cellRow = 0; + let cellCol = 0; + const maxCol = Math.floor(Math.sqrt(dashboard.visualizations.length)); + dashboard.visualizations.forEach(function (viz) { + if (viz.newWidgetSurface) { + while (grid.getCell(cellRow * cellDensity, cellCol * cellDensity) !== null) { + cellCol++; + if (cellCol % maxCol === 0) { + cellRow++; + cellCol = 0; + } + } + grid.setContent(cellRow * cellDensity, cellCol * cellDensity, viz.newWidgetSurface, "", cellDensity, cellDensity); + } + }, this); + }); + + const vizCellMap = {}; + this.content().forEach(function (cell) { + let widget = cell.widget(); + if (widget && widget.classID() === "layout_Surface") { + widget = widget.widget(); + } + if (widget) { + vizCellMap[widget.id()] = cell; + } + }); + + this._ddlDashboards.forEach(function (dashboard) { + dashboard.visualizations.forEach(function (viz, idx) { + if (viz.properties.flyout || viz.parentVisualization) { + return; + } + const targetVizs = viz.events.getUpdatesVisualizations(); + const targetIDs = targetVizs.filter(function (targetViz) { + return vizCellMap[targetViz.id]; + }).map(function (targetViz) { + return vizCellMap[targetViz.id].id(); + }); + vizCellMap[viz.id].indicateTheseIds(targetIDs); + }); + }, this); + } + + enter(domNode, element) { + super.enter(domNode, element); + } + + render(callback) { + this._marshallerRender(TabbedLayout.prototype, callback); + return this; + } + + commsError(source, error) { + alert("Comms Error:\n" + source + "\n" + error); + } + + // HipieDDLMixin --- + _marshallerRender: (BaseClass, callback) => this; +} +Tabbed.prototype.mixin(HipieDDLMixin); +Tabbed.prototype._class += " marshaller_Tabbed"; diff --git a/packages/marshaller/src/ddl1/TargetMarshaller.ts b/packages/marshaller/src/ddl1/TargetMarshaller.ts new file mode 100644 index 0000000000..7cb8ed39d6 --- /dev/null +++ b/packages/marshaller/src/ddl1/TargetMarshaller.ts @@ -0,0 +1,57 @@ +import { HTMLWidget } from "@hpcc-js/common"; +import { HipieDDLMixin } from "./HipieDDLMixin.ts"; + +export function TargetMarshaller(this: any) { + HTMLWidget.call(this); + HipieDDLMixin.call(this); + this._tag = "div"; +} +TargetMarshaller.prototype = Object.create(HTMLWidget.prototype); +TargetMarshaller.prototype.constructor = TargetMarshaller; +TargetMarshaller.prototype.mixin(HipieDDLMixin); +TargetMarshaller.prototype._class += " marshaller_TargetMarshaller"; + +TargetMarshaller.prototype.publish("configObject", {}, "object", "TargetMarshaller setup object", null, { tags: ["Basic"] }); + +TargetMarshaller.prototype.content = function () { + return []; +}; + +TargetMarshaller.prototype.populateContent = function () { + const _configObject = this.configObject(); + for (const key in this._ddlDashboards) { + this._ddlDashboards[key].visualizations.forEach(function (viz, idx) { + const widget_config = _configObject[viz.id]; + if (widget_config !== undefined) { + if (widget_config.target !== undefined) { + viz.newWidgetSurface.target(widget_config.target); + } else { + console.warn("Target not specified for the following:"); + console.warn("this._ddlDashboards[" + key + "].visualizations[" + idx + "].id = " + viz.id); + } + if (typeof widget_config.callback === "function") { + widget_config.callback(viz.widget, viz.newWidgetSurface); + } else { + console.warn("Callback not specified for the following:"); + console.warn("this._ddlDashboards[" + key + "].visualizations[" + idx + "].id = " + viz.id); + } + } else { + console.warn("Config not specified for the following:"); + console.warn("this._ddlDashboards[" + key + "].visualizations[" + idx + "].id = " + viz.id); + } + }, this); + } +}; + +TargetMarshaller.prototype.enter = function (domNode, element) { + HTMLWidget.prototype.enter.apply(this, arguments); +}; + +TargetMarshaller.prototype.render = function (callback) { + this.marshallerRender(HTMLWidget.prototype, callback); + return this; +}; + +TargetMarshaller.prototype.commsError = function (source, error) { + alert("Comms Error:\n" + source + "\n" + error); +}; diff --git a/packages/marshaller/src/ddl2/PopupManager.ts b/packages/marshaller/src/ddl2/PopupManager.ts new file mode 100644 index 0000000000..0582d14ec9 --- /dev/null +++ b/packages/marshaller/src/ddl2/PopupManager.ts @@ -0,0 +1,89 @@ +import { IMonitorHandle, Widget } from "@hpcc-js/common"; +import { compare } from "@hpcc-js/util"; +import { ElementContainer } from "./model/element.ts"; +import { IVizPopupPanelOwner, VizChartPanel, VizPopupPanel } from "./model/vizChartPanel.ts"; + +export class PopupManager extends Widget implements IVizPopupPanelOwner { + protected _ec: ElementContainer; + protected _popups: VizPopupPanel[] = []; + protected _popupIdx: { + [id: string]: { + panel: VizPopupPanel, + monitorHandle: IMonitorHandle + } + } = {}; + + popupPanels(): VizPopupPanel[] { + if (!this._popups) this._popups = []; + if (!this._popupIdx) this._popupIdx = {}; + return this._popups; + } + + popupChartPanels(): VizChartPanel[] { + return this.popupPanels().map(p => p.widget() as VizChartPanel); + } + + addPopup(cp: VizChartPanel) { + const elem = this._ec.element(cp); + const targetNode = this.element().node(); + const pp = new VizPopupPanel(this, elem) + .target(targetNode) + .widget(cp) + .relativeTargetId(this.id()) + .size({ + width: cp.minWidth(), + height: cp.minHeight() + }); + this._popups.push(pp); + this._popupIdx[cp.id()] = { + panel: pp, + monitorHandle: cp.monitor((id) => { + switch (id) { + case "minWidth": + case "minHeight": + pp + .resize({ width: cp.minWidth(), height: cp.minHeight() }) + .render() + ; + break; + } + }) + }; + this._ec.filteredBy(elem.id()).forEach(otherElem => { + otherElem.visualization().chartPanel().popup(pp); + }); + } + + removePopup(cp: VizChartPanel) { + const elem = this._ec.element(cp); + this._ec.filteredBy(elem.id()).forEach(otherElem => { + otherElem.visualization().chartPanel().popup(null); + }); + this._popupIdx[cp.id()].panel.target(null); + this._popupIdx[cp.id()].monitorHandle.remove(); + cp.target(null); + delete this._popupIdx[cp.id()]; + this._popups = this._popups.filter(p => p.widget() !== cp); + } + + syncPopups() { + const prevPopups = this.popupChartPanels(); + const diffPopups = compare(prevPopups, this._ec.elements() + .filter(e => e.visualization().visibility() === "flyout") + .map((elem: any) => elem.visualization().chartPanel())) + ; + + for (const w of diffPopups.exit) { + this.removePopup(w); + } + + for (const w of diffPopups.enter) { + this.addPopup(w); + } + + return this; + } + + vizActivation() { + } +} diff --git a/packages/marshaller/src/ddl2/activities/activity.ts b/packages/marshaller/src/ddl2/activities/activity.ts new file mode 100644 index 0000000000..5473f28e85 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/activity.ts @@ -0,0 +1,431 @@ +import { IMonitorHandle, PropertyExt } from "@hpcc-js/common"; +import { IField as WsEclField } from "@hpcc-js/comms"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { hashSum, update } from "@hpcc-js/util"; + +export function stringify(obj_from_json) { + if (Array.isArray(obj_from_json)) { + // not an object, stringify using native function + return "[" + obj_from_json.map(stringify).join(", ") + "]"; + } + if (typeof obj_from_json !== "object" || obj_from_json === null || obj_from_json === undefined) { + // not an object, stringify using native function + return JSON.stringify(obj_from_json); + } + // Implements recursive object serialization according to JSON spec + // but without quotes around the keys. + const props = Object + .keys(obj_from_json) + .map(key => `${key}: ${stringify(obj_from_json[key])}`) + .join(", "); + return `{ ${props} }`; +} + +export function schemaType2IFieldType(type): "boolean" | "number" | "number64" | "range" | "string" { + switch (type) { + case "boolean": + return "boolean"; + case "xs:byte": + case "xs:double": + case "xs:decimal": + case "xs:float": + case "xs:int": + case "xs:short": + case "xs:unsignedInt": + case "xs:unsignedShort": + case "xs:unsignedByte": + case "number": + return "number"; + case "xs:integer": + case "xs:long": + case "xs:negativeInteger": + case "xs:nonNegativeInteger": + case "xs:nonPositiveInteger": + case "xs:positiveInteger": + case "xs:unsignedLong": + return "number64"; + case "string": + return "string"; + case "range": + return "range"; + } + return "string"; +} + +export function schemaRow2IField(row: any): DDL2.IField { + if (row._children && row._children.length) { + return { + type: "dataset", + id: row.name, + children: row._children.map(schemaRow2IField) + }; + } else { + return { + id: row.name, + type: schemaType2IFieldType(row.type) + }; + } +} + +export function wsEclSchemaRow2IField(row: WsEclField): DDL2.IField { + return row; +} + +export type ReferencedFields = { + inputs: { [activityID: string]: string[] }, + outputs: { [activityID: string]: string[] } +}; + +export interface IActivityError { + source: string; + msg: string; + hint: string; +} + +/* +export const ROW_ID = "__##__"; // TODO: Should be Symbol +export function rowID(row: Readonly): undefined | number { + return row[ROW_ID] || row["__lparam"]; +} +*/ + +export abstract class Activity extends PropertyExt { + private _sourceActivity: Activity; + + fixInt64(data) { + if (!data || data.length === 0) return []; + const int64Fields = this.outFields().filter(field => { + switch (field.type) { + case "number": + // Test actual data for integer64 cases. + return typeof data[0][field.id] !== "number"; + case "number64": + return true; + } + return false; + }); + if (int64Fields.length) { + return data.map(row => { + for (const int64Field of int64Fields) { + row[int64Field.id] = +row[int64Field.id]; + } + return row; + }); + } + return data; + } + + sourceActivity(): Activity; + sourceActivity(_: Activity): this; + sourceActivity(_?: Activity): Activity | this { + if (!arguments.length) return this._sourceActivity; + this._sourceActivity = _; + return this; + } + + hash(more: object = {}): string { + return hashSum({ + ...more + }); + } + + refreshMeta(): Promise { + return this._sourceActivity ? this._sourceActivity.refreshMeta() : Promise.resolve(); + } + + exists(): boolean { + return true; + } + + validate(): IActivityError[] { + return []; + } + + label(): string { + return this.id(); + } + + updatedBy(): string[] { + return []; + } + + private _emptyFields: ReadonlyArray = []; + inFields(): ReadonlyArray { + return this._sourceActivity ? this._sourceActivity.outFields() : this._emptyFields; + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + return () => inFields; + } + + outFields(): ReadonlyArray { + return this.computeFields(this.inFields())(); + } + + localFields(): DDL2.IField[] { + const inFieldIDs = this.inFields().map(field => field.id); + return this.outFields().filter(field => inFieldIDs.indexOf(field.id) < 0); + } + + fieldOrigin(fieldID: string): Activity | null { + if (this.localFields().filter(field => field.id === fieldID).length) { + return this; + } else if (this.sourceActivity()) { + return this.sourceActivity().fieldOrigin(fieldID); + } + return null; + } + + resolveFields(refs: ReferencedFields, fieldIDs: string[]) { + for (const fieldID of fieldIDs) { + const fieldOrigin = this.fieldOrigin(fieldID); + if (fieldOrigin) { + if (!refs.outputs[fieldOrigin.id()]) { + refs.outputs[fieldOrigin.id()] = []; + } + if (refs.outputs[fieldOrigin.id()].indexOf(fieldID) < 0) { + refs.outputs[fieldOrigin.id()].push(fieldID); + } + } + } + } + + resolveInFields(refs: ReferencedFields, fieldIDs: string[]) { + return this._sourceActivity && this._sourceActivity.resolveFields(refs, fieldIDs); + } + + referencedFields(refs: ReferencedFields): void { + this._sourceActivity?.referencedFields(refs); + } + + exec(): Promise { + return this._sourceActivity ? this._sourceActivity.exec() : Promise.resolve(); + } + + _emptyData: ReadonlyArray = []; + inData(): ReadonlyArray { + return this._sourceActivity ? this._sourceActivity.outData() || this._emptyData : this._emptyData; + } + + computeData(): ReadonlyArray { + return this.inData(); + } + + private _prevDataHash: string = ""; + private _prevInData: ReadonlyArray = []; + private _prevData: ReadonlyArray = []; + private cachedComputeData(inData: ReadonlyArray): ReadonlyArray { + const hash = this.hash(); + if (this._prevDataHash !== hash || this._prevInData !== inData) { + this._prevDataHash = hash; + this._prevInData = inData; + this._prevData = update(this._prevData, this.computeData()); + } + return this._prevData; + } + + outData(): ReadonlyArray { + return this.cachedComputeData(this.inData()); + } +} + +export class ActivityArray extends Activity { + private _activities: Activity[] = []; + + activities(): Activity[]; + activities(_: Activity[]): this; + activities(_?: Activity[]): Activity[] | this { + if (!arguments.length) return this._activities; + this._activities = _; + return this; + } +} +ActivityArray.prototype._class += " ActivityArray"; + +export class ActivityPipeline extends ActivityArray { + + activities(): Activity[]; + activities(_: Activity[]): this; + activities(_?: Activity[]): Activity[] | this { + if (!arguments.length) return super.activities(); + super.activities(_); + let prevActivity: Activity; + for (const activity of _) { + if (prevActivity) { + activity.sourceActivity(prevActivity); + } + prevActivity = activity; + } + return this; + } + + first(): Activity { + const retVal = this.activities(); + return retVal[0]; + } + + last(): Activity | null { + const retVal = this.activities(); + return retVal[retVal.length - 1]; + } + + protected calcUpdatedGraph(activity: Activity): Array<{ from: string, to: Activity }> { + return activity.updatedBy().map(source => { + return { + from: source, + to: activity + }; + }); + } + + updatedByGraph(): Array<{ from: string, to: Activity }> { + let retVal: Array<{ from: string, to: Activity }> = []; + for (const activity of this.activities()) { + retVal = retVal.concat(this.calcUpdatedGraph(activity)); + } + return retVal; + } + + fetch(from: number = 0, count: number = Number.MAX_VALUE): Promise> { + return this.exec().then(() => { + const data = this.outData(); + if (from === 0 && data.length <= count) { + return data; + } + return data.slice(from, from + count); + }); + } + + // Activity overrides --- + hash(more: { [key: string]: any } = {}): string { + return hashSum({ + activities: [this.activities().map(activity => activity.hash())], + ...more + }); + } + + refreshMeta(): Promise { + return this.last().refreshMeta(); + } + + updatedBy(): string[] { + let retVal: string[] = []; + for (const activity of this.activities()) { + retVal = retVal.concat(activity.updatedBy()); + } + return retVal; + } + + inFields(): ReadonlyArray { + return this.first().inFields(); + } + + outFields(): ReadonlyArray { + return this.last().outFields(); + } + + localFields(): DDL2.IField[] { + return this.last().localFields(); + } + + fieldOrigin(fieldID: string): Activity | null { + return this.last().fieldOrigin(fieldID); + } + + referencedFields(refs: ReferencedFields) { + this.last().referencedFields(refs); + } + + resolveInFields(refs: ReferencedFields, fieldIDs: string[]) { + this.last().resolveInFields(refs, fieldIDs); + } + + resolveFields(refs: ReferencedFields, fieldIDs: string[]) { + this.last().resolveFields(refs, fieldIDs); + } + + exec(): Promise { + return this.last().exec(); + } + + outData(): ReadonlyArray { + return this.last().outData(); + } +} +ActivityPipeline.prototype._class += " ActivitySequence"; + +export class ActivitySelection extends ActivityArray { + private _selection: Activity; + private _monitorHandle: IMonitorHandle; + + selection(): Activity; + selection(_: Activity): this; + selection(_?: Activity): Activity | this { + if (_ === undefined) return this._selection; + if (this._monitorHandle) { + this._monitorHandle.remove(); + } + this._selection = _; + this._monitorHandle = _.monitor((id, newVal, oldVal) => { + this.broadcast(id, newVal, oldVal, _); + }); + return this; + } + + // Activity overrides --- + hash(more: { [key: string]: any } = {}): string { + return hashSum({ + selection: this.selection().hash(), + ...more + }); + } + + label(): string { + return this.selection().label(); + } + + refreshMeta(): Promise { + return this.selection().refreshMeta(); + } + + updatedBy(): string[] { + return this.selection().updatedBy(); + } + + inFields(): ReadonlyArray { + return this.selection().inFields(); + } + + outFields(): ReadonlyArray { + return this.selection().outFields(); + } + + localFields(): DDL2.IField[] { + return this.selection().localFields(); + } + + fieldOrigin(fieldID: string): Activity | null { + return this.selection().fieldOrigin(fieldID); + } + + referencedFields(refs: ReferencedFields) { + this.selection().referencedFields(refs); + } + + resolveInFields(refs: ReferencedFields, fieldIDs: string[]) { + this.selection().resolveInFields(refs, fieldIDs); + } + + resolveFields(refs: ReferencedFields, fieldIDs: string[]) { + this.selection().resolveFields(refs, fieldIDs); + } + + exec(): Promise { + return this.selection().exec(); + } + + outData(): ReadonlyArray { + return this.selection().outData(); + } +} +ActivitySelection.prototype._class += " ActivitySelection"; diff --git a/packages/marshaller/src/ddl2/activities/databomb.ts b/packages/marshaller/src/ddl2/activities/databomb.ts new file mode 100644 index 0000000000..772ee7d099 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/databomb.ts @@ -0,0 +1,237 @@ +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { IDatasource } from "@hpcc-js/dgrid"; +import { isArray } from "@hpcc-js/util"; +import { csvParse as d3CsvParse, tsvParse as d3TsvParse } from "d3-dsv"; +import { Activity } from "./activity.ts"; +import { Datasource } from "./datasource.ts"; +import { FormField } from "./form.ts"; + +function fieldType(field: any): DDL2.IFieldType { + if (isArray(field)) { + return "dataset"; + } + const type = typeof field; + switch (type) { + case "boolean": + case "number": + case "string": + case "object": + return type; + } + return "string"; +} + +export function rowToFields(row: object, _jsonData): DDL2.IField[] { + // TODO: This heuristic will fail if there are empty nested rows in the first row... + const retVal: DDL2.IField[] = []; + for (const key in row) { + const field = { + type: fieldType(row[key]), + id: key + } as DDL2.IField; + switch (field.type) { + case "object": + for (const row of _jsonData) { + let found = false; + for (const _childKey in row[key]) { + const rowFields = rowToFields(row[key], [row[key]]); + field.fields = {}; + if (rowFields.length) { + rowFields.forEach(rf => field.fields[rf.id] = rf); + found = true; + } + break; + } + if (found) break; + } + break; + case "dataset": + for (const row of _jsonData) { + if (row[key] && row[key].length) { + field.children = rowToFields(row[key][0], row[key]); + break; + } + } + break; + } + retVal.push(field); + } + return retVal; +} + +export class Databomb extends Datasource { + + private _jsonData: ReadonlyArray = []; + + constructor() { + super(); + } + + toDDL(skipPayload: boolean = false): DDL2.IDatabomb { + return { + type: "databomb", + id: this.id(), + format: this.format(), + payload: skipPayload ? undefined : this.payload(), + fields: this.validFields().map(f => f.toDDL()) + }; + } + + fromDDL(ddl: DDL2.IDatabomb, skipID = false): this { + (skipID ? this : this.id(ddl.id)) + .format(ddl.format) + .payload(ddl.payload) + .databombFields(ddl.fields.map(FormField.fromDDL)) + ; + return this; + } + + static fromDDL(ddl: DDL2.IDatabomb, skipID = false): Databomb { + return new Databomb().fromDDL(ddl, skipID); + } + + validFields(): FormField[] { + return this.databombFields().filter(f => f.valid()); + } + + updateJsonData() { + try { + switch (this.format()) { + case "csv": + this._jsonData = d3CsvParse(this.payload()); + break; + case "tsv": + this._jsonData = d3TsvParse(this.payload()); + break; + case "json": + default: + this._jsonData = JSON.parse(this.payload()); + break; + } + this.databombFields(this.preCalcFields().map(FormField.fromDDL)); + } catch (e) { + this.databombFields([]); + this._jsonData = []; + } + } + + hash(more: object): string { + return super.hash({ + ddl: this.toDDL(true), + ...more + }) + this.payload(); + } + + refreshMeta(): Promise { + return Promise.resolve(); + } + + label(): string { + return "Databomb"; + } + + private preCalcFields(): DDL2.IField[] { + if (this._jsonData.length === 0) return []; + return rowToFields(this._jsonData[0], this._jsonData); + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + return () => this.validFields().map(f => f.toDDL()); + } + + exec(): Promise { + return Promise.resolve(); + } + + computeData(): ReadonlyArray { + const coarceFuncMap = {}; + this.validFields().forEach(field => { + coarceFuncMap[field.fieldID()] = field.coerceFunc(); + }); + return this._jsonData.map(row => { + const retVal = {}; + for (const key in coarceFuncMap) { + retVal[key] = coarceFuncMap[key](row[key]); + } + return retVal; + }); + } + + // === + total(): number { + return this._jsonData.length; + } +} +Databomb.prototype._class += " Databomb"; + +export interface Databomb { + format(): "json" | "csv" | "tsv"; + format(_: "json" | "csv" | "tsv"): this; + payload(): string; + payload(_: string): this; + databombFields(): FormField[]; + databombFields(_: FormField[]): this; +} + +Databomb.prototype.publish("format", "json", "set", "Databomb Format", ["json", "csv", "tsv"]); +Databomb.prototype.publish("payload", "", "string", "Databomb array", null, { multiline: true }); +Databomb.prototype.publish("databombFields", [], "propertyArray", "Multi Fields", null, { autoExpand: FormField }); + +const payloadFormat = Databomb.prototype.format; +Databomb.prototype.format = function (this: Databomb, _?) { + const retVal = payloadFormat.apply(this, arguments); + if (arguments.length) { + this.updateJsonData(); + } + return retVal; +}; + +const databombPayloadOrig = Databomb.prototype.payload; +Databomb.prototype.payload = function (this: Databomb, _?) { + const retVal = databombPayloadOrig.apply(this, arguments); + if (arguments.length) { + this.updateJsonData(); + } + return retVal; +}; + +export const emptyDatabomb = new Databomb().id("Empty").payload("[]"); + +export class DatasourceAdapt implements IDatasource { + private _activity: Activity; + + constructor(activity: Activity) { + this._activity = activity || emptyDatabomb; + } + + exec(): Promise { + return this._activity.refreshMeta().then(() => { + return this._activity.exec(); + }); + } + + id(): string { + return this._activity.id(); + } + hash(more: { [key: string]: any } = {}): string { + return this._activity.hash(more); + } + label(): string { + return this._activity.label(); + } + outFields(): DDL2.IField[] { + return this._activity && this._activity.outFields ? this._activity.outFields() as DDL2.IField[] : []; + } + total(): number { + return this._activity ? this._activity.outData().length : 0; + } + fetch(from: number, count: number): Promise> { + return this.exec().then(() => { + const data = this._activity.outData(); + if (from === 0 && data.length <= count) { + return Promise.resolve(data); + } + return Promise.resolve(data.slice(from, from + count)); + }); + } +} diff --git a/packages/marshaller/src/ddl2/activities/datasource.ts b/packages/marshaller/src/ddl2/activities/datasource.ts new file mode 100644 index 0000000000..174117c5cc --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/datasource.ts @@ -0,0 +1,59 @@ +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { Activity } from "./activity.ts"; +import { Databomb } from "./databomb.ts"; +import { Form } from "./form.ts"; +import { LogicalFile } from "./logicalfile.ts"; +import { RestResult, RestService } from "./rest.ts"; +import { RoxieResult, RoxieService } from "./roxie.ts"; +import { WU, WUResult } from "./wuresult.ts"; + +let datasourceID = 0; +export class Datasource extends Activity { + + constructor() { + super(); + this._id = `ds_${++datasourceID}`; + } +} + +export type DatasourceRefType = Databomb | Form | LogicalFile | RoxieResult | WUResult | RestResult; +export type DatasourceType = Databomb | Form | LogicalFile | RoxieService | WU | RestService; + +export class DatasourceRef extends Activity { + _origDatasource; + declare _datasource: DatasourceRefType; + + constructor() { + super(); + } + + hash(more: { [key: string]: any } = {}): string { + return super.hash({ + datasource: this._datasource ? this._datasource.hash(more) : undefined, + ...more + }); + } + + toDDL(): DDL2.IDatabombRef { + return { + id: this.datasource().id() + }; + } +} +DatasourceRef.prototype._class += " DatasourceRef"; + +export interface DatasourceRef { + datasource(): DatasourceRefType; + datasource(_: DatasourceRefType): this; +} + +DatasourceRef.prototype.publish("datasource", null, "widget", "Datasource Reference", null, { internal: true }); + +DatasourceRef.prototype._origDatasource = DatasourceRef.prototype.datasource; +DatasourceRef.prototype.datasource = function (this: DatasourceRef, _?) { + const retVal = DatasourceRef.prototype._origDatasource.apply(this, arguments); + if (_ !== undefined) { + this.sourceActivity(_); + } + return retVal; +}; \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/dspicker.ts b/packages/marshaller/src/ddl2/activities/dspicker.ts new file mode 100644 index 0000000000..ac3e990264 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/dspicker.ts @@ -0,0 +1,115 @@ +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { ElementContainer } from "../model/element.ts"; +import { ActivitySelection, IActivityError } from "./activity.ts"; +import { Databomb, emptyDatabomb } from "./databomb.ts"; +import { DatasourceRef, DatasourceRefType } from "./datasource.ts"; +import { Form } from "./form.ts"; +import { LogicalFile } from "./logicalfile.ts"; +import { RestResult, RestResultRef } from "./rest.ts"; +import { HipieResultRef, RoxieResult, RoxieService } from "./roxie.ts"; +import { WUResult, WUResultRef } from "./wuresult.ts"; + +let dsPickerID = 0; +export class DSPicker extends ActivitySelection { + private _nullDatasource = emptyDatabomb; + + _origDatasourceID; + _origDatasourceRef; + + declare _datasourceID: string; // DDL2.IDatasourceType; + declare _datasourceRef: DatasourceRef; + + datasource(): DatasourceRefType { + return this.datasourceRef().datasource(); + } + + refreshRef(id: string) { + const ds: DatasourceRefType = this._ec.datasource(id); + if (ds instanceof Databomb) { + this.selection(new DatasourceRef().datasource(ds)); + } else if (ds instanceof Form) { + this.selection(new DatasourceRef().datasource(ds)); + } else if (ds instanceof LogicalFile) { + this.selection(new DatasourceRef().datasource(ds)); + } else if (ds instanceof RoxieService) { + this.selection(new DatasourceRef().datasource(ds)); + } else if (ds instanceof WUResult) { + this.selection(new WUResultRef().datasource(ds)); + } else if (ds instanceof RoxieResult) { + this.selection(new HipieResultRef(this._ec).datasource(ds)); + } else if (ds instanceof RestResult) { + this.selection(new RestResultRef(this._ec).datasource(ds)); + } + } + + selection(): DatasourceRef; + selection(_: DatasourceRef): this; + selection(_?: DatasourceRef): DatasourceRef | this { + const retVal = super.selection.apply(this, arguments); + if (!arguments.length) return retVal || this._nullDatasource; + if (this._datasourceID !== _.datasource().id()) { + this._datasourceID = _.datasource().id(); + } + return this; + } + + validate(): IActivityError[] { + return this.selection().validate(); + } + + constructor(private _ec: ElementContainer) { + super(); + this._id = `ds_${++dsPickerID}`; + const ds = this._ec.datasources()[0]; + this.datasourceID(ds.id()); + } + + toDDL(): DDL2.IDatasourceRef { + return { + ...this.datasourceRef().toDDL(), + id: this.datasourceID() + }; + } + + // Activity overrides --- + hash(more: { [key: string]: any } = {}): string { + return super.hash({ + ...more + }); + } + + datasourceIDs() { + return this._ec.datasources().map(ds => { + return { + value: ds.id(), + text: `${ds.label()} ${ds.id() !== ds.label() ? ` (${ds.id()})` : ""}` + }; + }); + } +} +DSPicker.prototype._class += " DSPicker"; + +export interface DSPicker { + datasourceID(): string; + datasourceID(_: string): this; + datasourceRef(): DatasourceRef; + datasourceRef(_: DatasourceRef): this; +} + +DSPicker.prototype.publish("datasourceID", "", "set", "Activity", function (this: DSPicker) { return this.datasourceIDs(); }, { optional: false }); +DSPicker.prototype.publish("datasourceRef", "", "widget", "Activity"); + +DSPicker.prototype._origDatasourceID = DSPicker.prototype.datasourceID; +DSPicker.prototype.datasourceID = function (this: DSPicker, _?) { + const prev = this._datasourceID; + const retVal = DSPicker.prototype._origDatasourceID.apply(this, arguments); + if (_ !== undefined && prev !== _) { + this.refreshRef(_); + } + return retVal; +}; + +DSPicker.prototype._origDatasourceRef = DSPicker.prototype.datasourceRef; +DSPicker.prototype.datasourceRef = function (this: DSPicker, _?) { + return ActivitySelection.prototype.selection.apply(this, arguments); +}; \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/filter.ts b/packages/marshaller/src/ddl2/activities/filter.ts new file mode 100644 index 0000000000..6342e65df8 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/filter.ts @@ -0,0 +1,565 @@ +import { PropertyExt } from "@hpcc-js/common"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { hashSum } from "@hpcc-js/util"; +import { Element, ElementContainer } from "../model/element.ts"; +import { Activity, IActivityError, ReferencedFields } from "./activity.ts"; + +function createFilter(condition: DDL2.IMappingConditionType, lf: string, val: string | number): (localRow: any) => boolean { + const isString = typeof val === "string"; + switch (condition) { + case "==": + return (localRow) => isString && typeof localRow[lf] === "string" ? localRow[lf].trim() === val : localRow[lf] === val; + case "!=": + return (localRow) => isString && typeof localRow[lf] === "string" ? localRow[lf].trim() !== val : localRow[lf] !== val; + case "<": + return (localRow) => localRow[lf] < val; + case "<=": + return (localRow) => localRow[lf] <= val; + case ">": + return (localRow) => localRow[lf] > val; + case ">=": + return (localRow) => localRow[lf] >= val; + default: + throw new Error(`Unknown filter condition: ${condition}`); + } +} + +export class ColumnMapping extends PropertyExt { + private _owner: RemoteFilter; + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.remoteField_valid()) { + retVal.push({ + source: `${prefix}.remoteField`, + msg: `Invalid remoteField: "${this.remoteField()}"`, + hint: `expected: ${JSON.stringify(this.sourceOutFields())}` + }); + } + if (!this.localField_valid()) { + retVal.push({ + source: `${prefix}.localField`, + msg: `Invalid localField: "${this.localField()}"`, + hint: `expected: ${JSON.stringify(this.localFields())}` + }); + } + return retVal; + } + + constructor() { + super(); + } + + owner(): RemoteFilter; + owner(_: RemoteFilter): this; + owner(_?: RemoteFilter): RemoteFilter | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return this.localField_exists() || this.remoteField_exists(); + } + + toDDL(): DDL2.IMapping { + return { + remoteFieldID: this.remoteField(), + localFieldID: this.localField(), + condition: this.condition(), + nullable: this.nullable() + }; + } + + fromDDL(ddl: DDL2.IMapping): this { + return this + .remoteField(ddl.remoteFieldID) + .localField(ddl.localFieldID) + .condition(ddl.condition) + .nullable(ddl.nullable) + ; + } + + static fromDDL(ddl: DDL2.IMapping): ColumnMapping { + return new ColumnMapping().fromDDL(ddl); + } + + hash() { + return hashSum({ + remoteField: this.remoteField(), + localField: this.localField(), + condition: this.condition(), + nullable: this.nullable() + }); + } + + localFields(): string[] { + return this._owner.inFields().map(field => field.id); + } + + sourceOutFields(): string[] { + return this._owner.sourceOutFields().map(field => field.id); + } + + remoteValues(filterSelection: any[]): Array { + const rf = this.remoteField(); + return filterSelection.map(sel => { + const retVal = sel[rf]; + if (typeof retVal === "string") { + return retVal.trim(); + } + return retVal; + }); + } + + createFilterDescription(filterSelection: any[]): string { + switch (this.condition()) { + case "in": + case "range": + return `${this.localField()} ${this.condition()} [${this.remoteValues(filterSelection).join(", ")}]`; + default: + return `${this.localField()} ${this.condition()} ${this.remoteValues(filterSelection)[0]}`; + } + } + + createFilter(filterSelection: any[]): (localRow: any) => boolean { + const lf = this.localField(); + const fsArr = this.remoteValues(filterSelection); + switch (this.condition()) { + case "range": + if (this.nullable() && (fsArr.length < 2 || fsArr[0] === fsArr[1])) { + return (localRow) => true; + } + return (localRow) => localRow[lf] >= fsArr[0] && localRow[lf] <= fsArr[1]; + case "in": + if (this.nullable() && fsArr.length === 0) { + return (localRow) => true; + } + return (localRow) => fsArr.some(fs => typeof localRow[lf] === "string" ? localRow[lf].trim() === fs : localRow[lf] === fs); + default: + const fs0 = fsArr[0]; + if (this.nullable() && (fs0 === undefined || fs0 === null || fs0 === "")) { + return (localRow) => true; + } + return createFilter(this.condition(), lf, fs0); + } + } +} +ColumnMapping.prototype._class += " ColumnMapping"; + +export interface ColumnMapping { + remoteField(): string; + remoteField(_: string): this; + remoteField_exists(): boolean; + remoteField_valid(): boolean; + localField(): string; + localField(_: string): this; + localField_exists(): boolean; + localField_valid(): boolean; + condition(): DDL2.IMappingConditionType; + condition(_: DDL2.IMappingConditionType): this; + nullable(): boolean; + nullable(_: boolean): this; +} + +export class RemoteFilter extends PropertyExt { + private _owner: Filters; + + validate(prefix: string): IActivityError[] { + let retVal: IActivityError[] = []; + if (!this.source_valid()) { + retVal.push({ + source: `${prefix}.source.${this.source()}`, + msg: `Invalid source: "${this.source()}"`, + hint: `expected: ${JSON.stringify(this.visualizationIDs())}` + }); + } + if (this.source_exists() && this.validMappings().length === 0) { + retVal.push({ + source: `${prefix}.source.${this.source()}`, + msg: `Invalid mappings: "${this.source()}"`, + hint: "expected minimum of 1 mapping" + }); + } + for (const mapping of this.validMappings()) { + retVal = retVal.concat(mapping.validate(`${prefix}.${this.source()}.mappings`)); + } + return retVal; + } + + constructor() { + super(); + } + + owner(): Filters; + owner(_: Filters): this; + owner(_?: Filters): Filters | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.source() && this.validMappings().length > 0; + } + + toDDL(): DDL2.IFilterCondition { + return { + viewID: this.source(), + mappings: this.ddlMappings() + }; + } + + fromDDL(ddl: DDL2.IFilterCondition): this { + return this + .source(ddl.viewID) + .ddlMappings(ddl.mappings) + ; + } + + static fromDDL(ddl: DDL2.IFilterCondition): RemoteFilter { + return new RemoteFilter().fromDDL(ddl); + } + + ddlMappings(): DDL2.IMapping[]; + ddlMappings(_: DDL2.IMapping[]): this; + ddlMappings(_?: DDL2.IMapping[]): DDL2.IMapping[] | this { + if (!arguments.length) return this.validMappings().map(mapping => mapping.toDDL()); + this.mappings(_.map(mapping => ColumnMapping.fromDDL(mapping))); + return this; + } + + visualizationIDs() { + return this._owner.visualizationIDs(); + } + + hash(): string { + return hashSum({ + source: this.source(), + mappings: this.validMappings().map(mapping => mapping.hash()), + selection: this.sourceSelection() + }); + } + + validMappings(): ColumnMapping[] { + return this.mappings().filter(mapping => mapping.valid()); + } + + appendMappings(mappings: Array<{ remoteField: string, localField: string, condition: DDL2.IMappingConditionType }>): this { + for (const mapping of mappings) { + this.mappings().push(new ColumnMapping() + .owner(this) + .remoteField(mapping.remoteField) + .localField(mapping.localField) + .condition(mapping.condition) + ); + } + return this; + } + + inFields(): ReadonlyArray { + return this._owner.inFields(); + } + + sourceViz(): Element { + return this._owner.visualization(this.source()); + } + + sourceOutFields(): ReadonlyArray { + return this.sourceViz().hipiePipeline().selectionFields(); + } + + sourceSelection(): any[] { + return this.sourceViz().selection(); + } + + createFilter(): (localRow: any) => boolean { + const selection = this.sourceSelection(); + const mappingFilters = this.validMappings().map(mapping => mapping.createFilter(selection)); + return (row: object): boolean => mappingFilters.every(mappingFilter => mappingFilter(row)); + } + + createFilterDescription(): string { + const selection = this.sourceSelection(); + const mappingFilterDescs = this.validMappings().map(mapping => mapping.createFilterDescription(selection)); + return mappingFilterDescs.join(", "); + } +} +RemoteFilter.prototype._class += " Filter"; + +export interface RemoteFilter { + source(): string; + source(_: string): this; + source_exists(): boolean; + source_valid(): boolean; + mappings(): ColumnMapping[]; + mappings(_: ColumnMapping[]): this; +} + +export class StaticFilter extends PropertyExt { + private _owner: Filters; + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.localField_valid()) { + retVal.push({ + source: `${prefix}.localField`, + msg: `Invalid localField: "${this.localField()}"`, + hint: `expected: ${JSON.stringify(this.localFields())}` + }); + } + return retVal; + } + + constructor() { + super(); + } + + owner(): Filters; + owner(_: Filters): this; + owner(_?: Filters): Filters | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + coerceValue(): string | number; + coerceValue(_: string | number): this; + coerceValue(_?: string | number): string | number | this { + if (arguments.length === 0) { + switch (this.valueType()) { + case "number": + return +this.value(); + case "string": + default: + return "" + this.value(); + } + } + this.value(_); + if (typeof _ === "number") { + this.valueType("number"); + } else { + this.valueType("string"); + } + return this; + } + + valid(): boolean { + return this.localField_exists() && this.value_exists(); + } + + toDDL(): DDL2.IFilterStaticCondition { + return { + localFieldID: this.localField(), + condition: this.condition(), + value: this.coerceValue() + }; + } + + fromDDL(ddl: DDL2.IFilterStaticCondition): this { + return this + .localField(ddl.localFieldID) + .condition(ddl.condition) + .coerceValue(ddl.value) + ; + } + + static fromDDL(ddl: DDL2.IFilterStaticCondition): StaticFilter { + return new StaticFilter().fromDDL(ddl); + } + + hash() { + return hashSum({ + localField: this.localField(), + condition: this.condition(), + value: this.value(), + valueType: this.valueType() + }); + } + + localFields(): string[] { + return this._owner.inFields().map(field => field.id); + } + + createFilterDescription(): string { + return `${this.localField()} ${this.condition()} ${this.coerceValue()}`; + } + + createFilter(): (localRow: any) => boolean { + return createFilter(this.condition(), this.localField(), this.coerceValue()); + } +} +StaticFilter.prototype._class += " StaticFilter"; + +export interface StaticFilter { + localField(): string; + localField(_: string): this; + localField_exists(): boolean; + localField_valid(): boolean; + condition(): DDL2.IMappingConditionType; + condition(_: DDL2.IMappingConditionType): this; + value(): string | number | boolean; + value(_: string | number | boolean): this; + value_exists(): boolean; + value_valid(): boolean; + valueType(): "number" | "string"; + valueType(_: "number" | "string"): this; +} + +type FilterT = RemoteFilter | StaticFilter; + +export class Filters extends Activity { + static Filter = RemoteFilter; + static Mapping = ColumnMapping; + + validate(): IActivityError[] { + let retVal: IActivityError[] = []; + for (const filter of this.validFilters()) { + retVal = retVal.concat(filter.validate("filter")); + } + return retVal; + } + + constructor(private _ec: ElementContainer) { + super(); + } + + toDDL(): DDL2.IFilter { + return { + type: "filter", + conditions: this.conditions() + }; + } + + fromDDL(ddl: DDL2.IFilter): this { + return this + .conditions(ddl.conditions) + ; + } + + static fromDDL(ec: ElementContainer, ddl: DDL2.IFilter): Filters { + return new Filters(ec).fromDDL(ddl); + } + + conditions(): DDL2.FilterCondition[]; + conditions(_: DDL2.FilterCondition[]): this; + conditions(_?: DDL2.FilterCondition[]): DDL2.FilterCondition[] | this { + if (!arguments.length) return this.validFilters().map(filter => filter.toDDL()); + const remoteFilters: RemoteFilter[] = []; + const staticFilters: StaticFilter[] = []; + _.forEach(fc => { + if (DDL2.isIFilterCondition(fc)) { + remoteFilters.push(RemoteFilter.fromDDL(fc)); + } else { + staticFilters.push(StaticFilter.fromDDL(fc)); + } + }); + this.remoteFilter(remoteFilters); + this.staticFilter(staticFilters); + return this; + } + + visualizationIDs(): string[] { + return this._ec.elementIDs(); + } + + visualization(sourceID: string | PropertyExt): Element { + return this._ec.element(sourceID); + } + + // Activity overrides --- + hash(): string { + return hashSum(this.validFilters().map(f => { + return { + filter: f.hash() + }; + })); + } + + exists(): boolean { + return this.validFilters().length > 0; + } + + updatedBy(): string[] { + return this.validRemoteFilters().map(filter => filter.source()); + } + + referencedFields(refs: ReferencedFields): void { + super.referencedFields(refs); + const localFieldIDs: string[] = []; + for (const filter of this.validRemoteFilters()) { + const filterSource = filter.sourceViz().hipiePipeline(); + const remoteFieldIDs: string[] = []; + for (const mapping of filter.validMappings()) { + localFieldIDs.push(mapping.localField()); + remoteFieldIDs.push(mapping.remoteField()); + } + filterSource.resolveFields(refs, remoteFieldIDs); + } + super.resolveInFields(refs, localFieldIDs); + } + + exec(): Promise { + return super.exec(); + } + + computeData(): ReadonlyArray { + const data = super.computeData(); + if (data.length === 0 || !this.exists()) return data; + const filters = this.validFilters().map(filter => filter.createFilter()); + return data.filter(row => { + return filters.every(filter => filter(row)); + }); + } + + // --- --- --- + validRemoteFilters(): RemoteFilter[] { + return this.remoteFilter().filter(filter => filter.valid()); + } + + validStaticFilters(): StaticFilter[] { + return this.staticFilter().filter(filter => filter.valid()); + } + + validFilters(): FilterT[] { + return [...this.validRemoteFilters(), ...this.validStaticFilters()]; + } +} +Filters.prototype._class += " Filters"; + +export interface Filters { + remoteFilter(): RemoteFilter[]; + remoteFilter(_: RemoteFilter[]): this; + staticFilter(): StaticFilter[]; + staticFilter(_: StaticFilter[]): this; +} + +ColumnMapping.prototype.publish("remoteField", null, "set", "Filter Fields", function (this: ColumnMapping) { return this.sourceOutFields(); }, { + optional: true, + disable: (w: ColumnMapping): boolean => !w["_owner"].source(), + validate: (w: ColumnMapping): boolean => w.sourceOutFields().indexOf(w.remoteField()) >= 0 +}); +ColumnMapping.prototype.publish("localField", null, "set", "Local Fields", function (this: ColumnMapping) { return this.localFields(); }, { + optional: true, + disable: (w: ColumnMapping): boolean => !w["_owner"].source(), + validate: (w: ColumnMapping): boolean => w.localFields().indexOf(w.localField()) >= 0 +}); +ColumnMapping.prototype.publish("condition", "==", "set", "Filter Fields", ["==", "!=", ">", ">=", "<", "<=", "range", "in"]); +ColumnMapping.prototype.publish("nullable", false, "boolean", "Ignore null filters"); + +RemoteFilter.prototype.publish("source", null, "set", "Activity", function (this: RemoteFilter) { return this.visualizationIDs(); }, { + optional: true, + validate: (w: RemoteFilter): boolean => w.visualizationIDs().indexOf(w.source()) >= 0 +}); +RemoteFilter.prototype.publish("mappings", [], "propertyArray", "Mappings", null, { autoExpand: ColumnMapping }); + +StaticFilter.prototype.publish("localField", null, "set", "Local Fields", function (this: ColumnMapping) { return this.localFields(); }, { + optional: true, + validate: (w: StaticFilter): boolean => w.localFields().indexOf(w.localField()) >= 0 +}); +StaticFilter.prototype.publish("condition", "==", "set", "Filter Fields", ["==", "!=", ">", ">=", "<", "<="]); +StaticFilter.prototype.publish("value", "", "any", "Static Value"); +StaticFilter.prototype.publish("valueType", "number", "set", "Static Value Type", ["number", "string"]); + +Filters.prototype.publish("remoteFilter", [], "propertyArray", "Remote Filter", null, { autoExpand: RemoteFilter }); +Filters.prototype.publish("staticFilter", [], "propertyArray", "Static Filter", null, { autoExpand: StaticFilter }); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/form.ts b/packages/marshaller/src/ddl2/activities/form.ts new file mode 100644 index 0000000000..aee4b85161 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/form.ts @@ -0,0 +1,162 @@ +import { PropertyExt } from "@hpcc-js/common"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { Datasource } from "./datasource.ts"; + +type IField = DDL2.IFieldBoolean | DDL2.IFieldNumber | DDL2.IFieldString | DDL2.IFieldDataset; + +export class FormField extends PropertyExt { + protected _owner: Form; + + disableChildField(): boolean { + return this.type() !== "dataset"; + } + + constructor() { + super(); + } + + toDDL(): IField { + return { + type: this.type(), + id: this.fieldID(), + default: this.default(), + children: this.type() === "dataset" ? this.childFields().map(cf => cf.toDDL()) : undefined + } as IField; + } + + fromDDL(ddl: IField): this { + return this + .type(ddl.type) + .fieldID(ddl.id) + .default(ddl.default) + .childFields(ddl.type === "dataset" && ddl.children ? ddl.children.map(FormField.fromDDL) : []) + ; + } + + static fromDDL(ddl: IField): FormField { + return new FormField().fromDDL(ddl); + } + + owner(): Form; + owner(_: Form): this; + owner(_?: Form): Form | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.type() && !!this.fieldID(); + } + + coerceFunc(): (cell: any) => boolean | number | string { + switch (this.type()) { + case "boolean": + return cell => !!cell; + case "number": + return cell => +cell; + case "string": + return cell => "" + cell; + } + return cell => cell; + } + + calcValue() { + return this.value_exists() ? this.value() : this.default(); + } +} + +export class Form extends Datasource { + + constructor() { + super(); + } + + toDDL(): DDL2.IForm { + return { + type: "form", + id: this.id(), + fields: this.validFields().map(f => f.toDDL()) + }; + } + + fromDDL(ddl: DDL2.IForm, skipID = false): this { + (skipID ? this : this.id(ddl.id)) + .formFields(ddl.fields.map(FormField.fromDDL)) + ; + return this; + } + + static fromDDL(ddl: DDL2.IForm, skipID = false): Form { + return new Form().fromDDL(ddl, skipID); + } + + validFields(): FormField[] { + return this.formFields().filter(f => f.valid()); + } + + hash(more: object = {}): string { + return super.hash({ + ddl: this.toDDL(), + ...more + }); + } + + refreshMeta(): Promise { + return Promise.resolve(); + } + + label(): string { + return "Form"; + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + const retVal: DDL2.IField[] = this.validFields().map(f => f.toDDL()); + return () => retVal; + } + + exec(): Promise { + return Promise.resolve(); + } + + computeData(): ReadonlyArray { + const retVal = {}; + this.validFields().forEach(f => { + retVal[f.fieldID()] = f.calcValue(); + }); + return [retVal]; + } + + // === + total(): number { + return 1; + } +} +Form.prototype._class += " Form"; + +export interface FormField { + type(): "boolean" | "number" | "string" | "dataset"; + type(_: "boolean" | "number" | "string" | "dataset"): this; + fieldID(): string; + fieldID(_: string): this; + default(): boolean | number | string | any[]; + default(_: boolean | number | string | any[]): this; + value(): boolean | number | string; + value(_: boolean | number | string): this; + value_exists(): boolean; + childFields(): FormField[]; + childFields(_: FormField[]): this; +} + +export interface Form { + formFields(): FormField[]; + formFields(_: FormField[]): this; +} + +FormField.prototype.publish("type", "string", "set", "FormField Type", ["boolean", "number", "string", "dataset"]); +FormField.prototype.publish("fieldID", "", "string", "FormField Label"); +FormField.prototype.publish("default", null, "any", "Default Value", null, { optional: true }); +FormField.prototype.publish("value", null, "any", "Default Value", null, { optional: true }); +FormField.prototype.publish("childFields", [], "propertyArray", "Child Fields", null, { autoExpand: FormField, disable: (w: FormField) => w.disableChildField() }); + +Form.prototype.publish("formFields", [], "propertyArray", "Multi Fields", null, { autoExpand: FormField }); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/groupby.ts b/packages/marshaller/src/ddl2/activities/groupby.ts new file mode 100644 index 0000000000..b4020fad33 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/groupby.ts @@ -0,0 +1,457 @@ +import { PropertyExt } from "@hpcc-js/common"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { hashSum } from "@hpcc-js/util"; +import { deviation as d3Deviation, max as d3Max, mean as d3Mean, median as d3Median, min as d3Min, sum as d3Sum, variance as d3Variance } from "d3-array"; +import { nest as d3Nest } from "d3-collection"; +import { Activity, IActivityError, ReferencedFields } from "./activity.ts"; + +export class GroupByColumn extends PropertyExt { + private _owner: GroupBy; + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.label_valid()) { + retVal.push({ + source: `${prefix}.label`, + msg: `Invalid label: "${this.label()}"`, + hint: `expected ${JSON.stringify(this.columns())}` + }); + } + return retVal; + } + + constructor() { + super(); + } + + owner(): GroupBy; + owner(_: GroupBy): this; + owner(_?: GroupBy): GroupBy | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.label(); + } + + toDDL(): string { + return this.label(); + } + + fromDDL(label: string): this { + return this + .label(label) + ; + } + + static fromDDL(label: string): GroupByColumn { + return new GroupByColumn().fromDDL(label); + } + + hash(): string { + return hashSum(this.label()); + } + + columns() { + return this._owner.inFieldIDs(); + } +} +GroupByColumn.prototype._class += " GroupByColumn"; + +export interface GroupByColumn { + label(): string; + label(_: string): this; + label_valid(): boolean; +} + +// =========================================================================== +export type AggrFuncCallback = (item: any) => number; +export type AggrFunc = (leaves: any[], callback: AggrFuncCallback) => number; +function localCount(leaves: any[], callback: AggrFuncCallback): number { + return leaves.length; +} + +const d3Aggr: { [key: string]: AggrFunc } = { + count: localCount, + min: d3Min, + max: d3Max, + mean: d3Mean, + median: d3Median, + variance: d3Variance, + deviation: d3Deviation, + sum: d3Sum +}; + +export type AggregateType = "count" | "min" | "max" | "sum" | "mean" | "median" | "variance" | "deviation"; +export class AggregateField extends PropertyExt { + private _owner: GroupBy; + + disableAggrColumn(): boolean { + return !this.fieldID() || !this.aggrType() || this.aggrType() === "count"; + } + + disableBaseCountColumn(): boolean { + return !this.fieldID() || !this.aggrType() || this.aggrType() !== "mean"; + } + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.aggrColumn_valid()) { + retVal.push({ + source: `${prefix}.${this.fieldID()}.aggrColumn`, + msg: `Invalid aggrColumn: "${this.aggrColumn()}"`, + hint: `expected ${JSON.stringify(this.columns())}` + }); + } + if (!this.baseCountColumn_valid()) { + retVal.push({ + source: `${prefix}.${this.fieldID()}.aggrColumn`, + msg: `Invalid baseCountColumn: "${this.baseCountColumn()}"`, + hint: `expected ${JSON.stringify(this.columns())}` + }); + } + return retVal; + } + + constructor() { + super(); + } + + owner(): GroupBy; + owner(_: GroupBy): this; + owner(_?: GroupBy): GroupBy | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.fieldID(); + } + + toDDL(): DDL2.IAggregate | DDL2.ICount { + if (this.aggrType() === "count") { + return { + fieldID: this.fieldID(), + type: "count" + }; + } + return { + fieldID: this.fieldID(), + type: this.aggrType() as DDL2.IAggregateType, + inFieldID: this.aggrColumn(), + baseCountFieldID: this.baseCountColumn() + }; + } + + fromDDL(ddl: DDL2.IAggregate | DDL2.ICount): this { + const retVal = this + .fieldID(ddl.fieldID) + .aggrType(ddl.type) + ; + if (ddl.type !== "count") { + retVal.aggrColumn(ddl.inFieldID); + retVal.baseCountColumn(ddl.baseCountFieldID); + } + return retVal; + } + + static fromDDL(ddl: DDL2.IAggregate | DDL2.ICount): AggregateField { + return new AggregateField().fromDDL(ddl); + } + + hash(): string { + return hashSum({ + label: this.fieldID(), + aggrType: this.aggrType(), + aggrColumn: this.aggrColumn() + }); + } + + columns() { + return this._owner.inFieldIDs(); + } + + hasColumn() { + return this.columns().length; + } + + aggregate(values: Array<{ [key: string]: any }>) { + return d3Aggr[this.aggrType() as string](values, leaf => +leaf[this.aggrColumn()]); + } + + aggrFunc(): (leaves: any[]) => number { + const aggrFunc = d3Aggr[this.aggrType() as string]; + const aggrColumn = this.aggrColumn(); + const baseCountColumn = this.baseCountColumn(); + if (baseCountColumn) { + return (values: any[]) => { + return aggrFunc(values, leaf => +leaf[aggrColumn] / +leaf[baseCountColumn]); + }; + } else { + return (values: any[]) => { + return aggrFunc(values, leaf => +leaf[aggrColumn]); + }; + } + } +} +AggregateField.prototype._class += " AggregateField"; + +export interface AggregateField { + fieldID(): string; + fieldID(_: string): this; + aggrType(): AggregateType; + aggrType(_: AggregateType): this; + aggrColumn(): string; + aggrColumn(_: string): this; + aggrColumn_valid(): boolean; + baseCountColumn(): string; + baseCountColumn(_: string): this; + baseCountColumn_valid(): boolean; +} + +// =========================================================================== +export class GroupBy extends Activity { + + validate(): IActivityError[] { + let retVal: IActivityError[] = []; + for (const gbColumn of this.validGroupBy()) { + retVal = retVal.concat(gbColumn.validate("GroupBy.column")); + } + for (const cfs of this.validComputedFields()) { + retVal = retVal.concat(cfs.validate("GroupBy.computedFields")); + } + return retVal; + } + + constructor() { + super(); + } + + toDDL(): DDL2.IGroupBy { + return { + type: "groupby", + groupByIDs: this.fieldIDs(), + aggregates: this.aggregates() + }; + } + + fromDDL(ddl: DDL2.IGroupBy): this { + return this + .fieldIDs(ddl.groupByIDs) + .aggregates(ddl.aggregates) + ; + } + + static fromDDL(ddl: DDL2.IGroupBy): GroupBy { + return new GroupBy().fromDDL(ddl); + } + + fieldIDs(): string[]; + fieldIDs(_: string[]): this; + fieldIDs(_?: string[]): string[] | this { + if (!arguments.length) return this.validGroupBy().map(gb => gb.toDDL()); + this.column(_.map(fieldID => GroupByColumn.fromDDL(fieldID))); + return this; + } + + aggregates(): DDL2.AggregateType[]; + aggregates(_: DDL2.AggregateType[]): this; + aggregates(_?: DDL2.AggregateType[]): DDL2.AggregateType[] | this { + if (!arguments.length) return this.validComputedFields().map(cf => cf.toDDL()); + this.computedFields(_.map(aggrType => AggregateField.fromDDL(aggrType))); + return this; + } + + // Activity + hash(): string { + return hashSum({ + groupBy: this.column().map(gb => gb.hash()), + computedFields: this.computedFields().map(cf => cf.hash()) + }); + } + + appendGroupBys(columns: [{ field: string }]): this { + for (const column of columns) { + this.column().push(new GroupByColumn() + .owner(this) + .label(column.field) + ); + } + return this; + } + + validGroupBy(): GroupByColumn[] { + return this.column().filter(groupBy => groupBy.valid()); + } + + exists(): boolean { + return this.validGroupBy().length > 0; + } + + inFieldIDs(): string[] { + return this.inFields().map(field => field.id); + } + + field(fieldID: string): DDL2.IField | null { + for (const field of this.inFields()) { + if (field.id === fieldID) { + return field; + } + } + return null; + } + + appendComputedFields(aggregateFields: [{ label: string, type: AggregateType, column?: string }]): this { + for (const aggregateField of aggregateFields) { + const aggrField = new AggregateField() + .owner(this) + .fieldID(aggregateField.label) + .aggrType(aggregateField.type) + ; + if (aggregateField.column !== void 0) { + aggrField.aggrColumn(aggregateField.column); + } + this.computedFields().push(aggrField); + } + return this; + } + + validComputedFields() { + return this.computedFields().filter(computedField => computedField.valid()); + } + + hasComputedFields(): boolean { + return this.validComputedFields().length > 0; + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + if (!this.exists()) return super.computeFields(inFields); + const retVal: DDL2.IField[] = []; + const groups: GroupByColumn[] = this.validGroupBy(); + for (const groupBy of groups) { + const groupByField = this.field(groupBy.label()); + const field = { + type: groupByField ? groupByField.type : "string", + id: groupBy.label() + } as DDL2.IField; + retVal.push(field); + } + for (const cf of this.computedFields()) { + if (cf.fieldID()) { + const computedField: DDL2.IField = { + id: cf.fieldID(), + type: "number" + }; + retVal.push(computedField); + } + } + if (this.details()) { + let detailsTarget: DDL2.IField[] = retVal; + if (this.exists()) { + const rows: DDL2.IField = { + id: "values", + type: "dataset", + children: [] + }; + retVal.push(rows); + detailsTarget = rows.children; + } + const columns = groups.map(groupBy => groupBy.label()); + detailsTarget.push(...this.inFields().filter(field => { + return this.fullDetails() || columns.indexOf(field.id) < 0; + })); + } + return () => retVal; + } + + referencedFields(refs: ReferencedFields): void { + super.referencedFields(refs); + const fieldIDs: string[] = []; + for (const gb of this.validGroupBy()) { + fieldIDs.push(gb.label()); + } + for (const cf of this.validComputedFields()) { + if (cf.aggrColumn()) { + fieldIDs.push(cf.aggrColumn()); + } + } + super.resolveInFields(refs, fieldIDs); + } + + computeData(): ReadonlyArray { + const data = super.computeData(); + if (data.length === 0 || !this.exists()) return data; + const columnLabels: string[] = this.validGroupBy().map(gb => gb.label()); + const computedFields = this.validComputedFields().map(cf => { + return { label: cf.fieldID(), aggrFunc: cf.aggrFunc() }; + }); + const retVal = d3Nest() + .key((row: { [key: string]: any }) => { + let key = ""; + for (const groupByLabel of columnLabels) { + key += ":" + row[groupByLabel]; + } + return key; + }) + .entries(data as object[]).map(_row => { + const row: { + [key: string]: any + } = _row; + delete row.key; + for (const groupByLabel of columnLabels) { + row[groupByLabel] = row.values[0][groupByLabel]; + } + for (const cf of computedFields) { + row[cf.label] = cf.aggrFunc(row.values); + } + return row; + }) + ; + const outFields = this.outFields(); + return retVal.map(row => { + const retVal = {}; + for (const field of outFields) { + retVal[field.id] = row[field.id]; + } + return retVal; + }); + } +} +GroupBy.prototype._class += " GroupBy"; + +export interface GroupBy { + column(): GroupByColumn[]; + column(_: GroupByColumn[]): this; + computedFields(): AggregateField[]; + computedFields(_: AggregateField[]): this; + details(): boolean; + details(_: boolean): this; + fullDetails(): boolean; + fullDetails(_: boolean): this; +} + +GroupByColumn.prototype.publish("label", undefined, "set", "Field", function (this: GroupByColumn) { return this.columns(); }, { + optional: true, + validate: (w: GroupByColumn): boolean => w.columns().indexOf(w.label()) >= 0 + }); + +AggregateField.prototype.publish("fieldID", null, "string", "new Field ID", null, { optional: true, disable: (w: AggregateField) => !w.hasColumn() }); +AggregateField.prototype.publish("aggrType", "count", "set", "Aggregation Type", ["count", "min", "max", "sum", "mean", "median", "variance", "deviation"], { optional: true, disable: (w: AggregateField) => !w.fieldID() }); +AggregateField.prototype.publish("aggrColumn", null, "set", "Aggregation Field", function (this: AggregateField) { return this.columns(); }, { + optional: true, + disable: (w: AggregateField) => w.disableAggrColumn(), + validate: (w: AggregateField): boolean => w.columns().indexOf(w.aggrColumn()) >= 0 + }); +AggregateField.prototype.publish("baseCountColumn", null, "set", "Base Count Field", function (this: AggregateField) { return this.columns(); }, { + optional: true, + disable: (w: AggregateField) => w.disableBaseCountColumn(), + validate: (w: AggregateField): boolean => w.columns().indexOf(w.baseCountColumn()) >= 0 + }); + +GroupBy.prototype.publish("column", [], "propertyArray", "Source Columns", null, { autoExpand: GroupByColumn }); +GroupBy.prototype.publish("computedFields", [], "propertyArray", "Computed Fields", null, { autoExpand: AggregateField }); +GroupBy.prototype.publish("details", false, "boolean", "Show details"); +GroupBy.prototype.publish("fullDetails", false, "boolean", "Show groupBy fileds in details"); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/hipiepipeline.ts b/packages/marshaller/src/ddl2/activities/hipiepipeline.ts new file mode 100644 index 0000000000..eb795a729f --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/hipiepipeline.ts @@ -0,0 +1,101 @@ +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { ElementContainer } from "../model/element.ts"; +import { Activity, ActivityPipeline } from "./activity.ts"; +import { DatasourceRefType } from "./datasource.ts"; +import { DSPicker } from "./dspicker.ts"; +import { Filters } from "./filter.ts"; +import { GroupBy } from "./groupby.ts"; +import { Limit } from "./limit.ts"; +import { Project } from "./project.ts"; +import { Sort } from "./sort.ts"; + +export class HipiePipeline extends ActivityPipeline { + + _origDatasource; + _origFilters; + _origProject; + _origGroupBy; + _origSort; + _origLimit; + + declare _datasource: DSPicker | DatasourceRefType; + declare _filters: Filters; + declare _project: Project; + declare _groupBy: GroupBy; + declare _sort: Sort; + declare _limit: Limit; + + constructor(private _ec: ElementContainer, viewID: string) { + super(); + this._id = viewID; + this._datasource = new DSPicker(this._ec); + this._filters = new Filters(this._ec); + this._project = new Project(); + this._groupBy = new GroupBy(); + this._sort = new Sort(); + this._limit = new Limit(); + this.updateSequence(); + } + + activities(): Activity[]; + activities(_: Activity[]): this; + activities(_?: Activity[]): Activity[] | this { + const retVal = super.activities.apply(this, arguments); + return retVal; + } + + private updateSequence() { + this.activities([ + this.datasource() as Activity, + this.filters(), + this.project(), + this.groupBy(), + this.sort(), + this.limit() + ]); + } + + selectionFields(): ReadonlyArray { + return this.last().outFields(); + } +} + +export interface HipiePipeline { + datasource(): DSPicker | DatasourceRefType; + datasource(_: DSPicker | DatasourceRefType): this; + filters(): Filters; + filters(_: Filters): this; + project(): Project; + project(_: Project): this; + groupBy(): GroupBy; + groupBy(_: GroupBy): this; + sort(): Sort; + sort(_: Sort): this; + limit(): Limit; + limit(_: Limit): this; +} + +HipiePipeline.prototype.publish("datasource", null, "widget", "Data Source 2"); +HipiePipeline.prototype.publish("filters", null, "widget", "Client Filters"); +HipiePipeline.prototype.publish("project", null, "widget", "Project"); +HipiePipeline.prototype.publish("groupBy", null, "widget", "Group By"); +HipiePipeline.prototype.publish("sort", null, "widget", "Sort"); +HipiePipeline.prototype.publish("limit", null, "widget", "Limit output"); + +function wrapHipiePipelineProperty(prop: string) { + const origKey = `_orig${prop.charAt(0).toUpperCase() + prop.slice(1)}`; + HipiePipeline.prototype[origKey] = HipiePipeline.prototype[prop]; + HipiePipeline.prototype[prop] = function (_?) { + const retVal = HipiePipeline.prototype[origKey].apply(this, arguments); + if (_ !== undefined) { + this.updateSequence(); + } + return retVal; + }; +} +wrapHipiePipelineProperty("datasource"); +wrapHipiePipelineProperty("filters"); +wrapHipiePipelineProperty("project"); +wrapHipiePipelineProperty("groupBy"); +wrapHipiePipelineProperty("sort"); +wrapHipiePipelineProperty("limit"); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/limit.ts b/packages/marshaller/src/ddl2/activities/limit.ts new file mode 100644 index 0000000000..b39b7e0e95 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/limit.ts @@ -0,0 +1,51 @@ +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { hashSum } from "@hpcc-js/util"; +import { Activity } from "./activity.ts"; + +export class Limit extends Activity { + + constructor() { + super(); + } + + toDDL(): DDL2.ILimit { + return { + type: "limit", + limit: this.rows() + }; + } + + fromDDL(ddl: DDL2.ILimit): this { + return this + .rows(ddl.limit) + ; + } + + static fromDDL(ddl: DDL2.ILimit): Limit { + return new Limit().fromDDL(ddl); + } + + hash(): string { + return hashSum({ + limit: this.rows() + }); + } + + exists(): boolean { + return this.rows_exists() && this.rows() > 0; + } + + computeData(): ReadonlyArray { + const data = super.computeData(); + if (data.length === 0 || !this.exists()) return data; + return data.slice(0, Math.min(this.rows(), data.length)); + } +} +Limit.prototype._class += " Limit"; + +export interface Limit { + rows(): number | undefined; + rows(_: number | undefined): this; + rows_exists(): boolean; +} +Limit.prototype.publish("rows", undefined, "number", "Limit output"); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/logicalfile.ts b/packages/marshaller/src/ddl2/activities/logicalfile.ts new file mode 100644 index 0000000000..ce78bb98e8 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/logicalfile.ts @@ -0,0 +1,66 @@ +import { Result } from "@hpcc-js/comms"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { ElementContainer } from "../model/element.ts"; +import { ESPResult } from "./wuresult.ts"; + +export class LogicalFile extends ESPResult { + + constructor(_ec: ElementContainer) { + super(_ec); + } + + toDDL(): DDL2.ILogicalFile { + return { + type: "logicalfile", + id: this.id(), + url: this.url(), + logicalFile: this.logicalFile(), + fields: this.responseFields() + }; + } + + fromDDL(ddl: DDL2.ILogicalFile, skipID = false): this { + (skipID ? this : this.id(ddl.id)) + .url(ddl.url) + .logicalFile(ddl.logicalFile) + ; + return this; + } + + static fromDDL(ec: ElementContainer, ddl: DDL2.ILogicalFile, skipID = false): LogicalFile { + return new LogicalFile(ec).fromDDL(ddl, skipID); + } + + _createResult(): Result { + return Result.attachLogicalFile({ baseUrl: this.url(), hookSend: this._ec.hookSend() }, this.nodeGroup(), this.logicalFile()); + } + + sourceHash(): string { + return super.hash({ + logicalFile: this.logicalFile() + }); + } + + hash(more: object): string { + return super.hash({ + ddl: this.toDDL() + }); + } + + label(): string { + return `${this.logicalFile()}`; + } +} +LogicalFile.prototype._class += " LogicalFile"; + +export interface LogicalFile { + url(): string; + url(_: string): this; + nodeGroup(): string; + nodeGroup(_: string): this; + logicalFile(): string; + logicalFile(_: string): this; +} +LogicalFile.prototype.publish("url", "", "string", "ESP Url (http://x.x.x.x:8010)"); +LogicalFile.prototype.publish("nodeGroup", "", "string", "Node Group"); +LogicalFile.prototype.publish("logicalFile", "", "string", "Logical File Name"); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/nullview.ts b/packages/marshaller/src/ddl2/activities/nullview.ts new file mode 100644 index 0000000000..b189a6bf81 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/nullview.ts @@ -0,0 +1,12 @@ +import { HipiePipeline } from "./hipiepipeline.ts"; + +export class NullView extends HipiePipeline { + hash(): string { + return super.hash(); + } + + _fetch(from: number, count: number): Promise { + return Promise.resolve([]); + } +} +NullView.prototype._class += " NullView"; diff --git a/packages/marshaller/src/ddl2/activities/project.ts b/packages/marshaller/src/ddl2/activities/project.ts new file mode 100644 index 0000000000..473f077303 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/project.ts @@ -0,0 +1,792 @@ +import { PropertyExt, Utility } from "@hpcc-js/common"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { hashSum, isArray } from "@hpcc-js/util"; +import { Activity, IActivityError, ReferencedFields } from "./activity.ts"; + +export class ComputedMapping extends PropertyExt { + protected _owner: ComputedField; + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.value_valid()) { + retVal.push({ + source: `${prefix}.value`, + msg: `Invalid value: "${this.value()}"`, + hint: 'expected: "any"' + }); + } + if (!this.newValue_valid()) { + retVal.push({ + source: `${prefix}.newValue`, + msg: `Invalid value: "${this.newValue()}"`, + hint: 'expected: "any"' + }); + } + return retVal; + } + + constructor() { + super(); + } + + owner(): ComputedField; + owner(_: ComputedField): this; + owner(_?: ComputedField): ComputedField | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.value() && !!this.newValue(); + } + + toDDL(): DDL2.IMapMapping { + return { + value: this.value(), + newValue: this.newValue() + }; + } + + fromDDL(ddl: DDL2.IMapMapping): this { + return this + .value(ddl.value) + .newValue(ddl.newValue) + ; + } + + static fromDDL(ddl: DDL2.IMapMapping): ComputedMapping { + return new ComputedMapping().fromDDL(ddl); + } +} +ComputedMapping.prototype._class += " ComputedMapping"; + +export interface ComputedMapping { + value(): any; + value(_: any): this; + value_valid(): boolean; + newValue(): any; + newValue(_: any): this; + newValue_valid(): boolean; +} + +export type ComputedType = "=" | "*" | "/" | "+" | "-" | "scale" | "template" | "map"; + +export interface IComputedFieldOwner extends PropertyExt { + fieldIDs(): string[]; + field(fieldID: string): DDL2.IField | null; +} + +export class ComputedField extends PropertyExt { + private _owner: IComputedFieldOwner; + + disableColumn1(): boolean { + return !this.label() || ["=", "*", "/", "+", "-", "scale", "map"].indexOf(this.type()) < 0; + } + + disableColumn2(): boolean { + return !this.label() || ["*", "/", "+", "-"].indexOf(this.type()) < 0; + } + + disableMapping(): boolean { + return !this.label() || ["map"].indexOf(this.type()) < 0; + } + + disableChildField(): boolean { + return !this.hasChildren(); + } + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.column1_valid()) { + retVal.push({ + source: `${prefix}.${this.label()}`, + msg: `Invalid column1: "${this.column1()}"`, + hint: `expected: ${JSON.stringify(this.columns())}` + }); + } + if (!this.column2_valid()) { + retVal.push({ + source: `${prefix}.${this.label()}`, + msg: `Invalid column2: "${this.column2()}"`, + hint: `expected: ${JSON.stringify(this.columns())}` + }); + } + if (!this.disableMapping()) { + this.validComputedMappings().forEach(cm => cm.validate(`${prefix}.mapping`)); + } + if (!this.disableChildField()) { + this.validChildFields().forEach(cf => cf.validate(`${prefix}.childField`)); + } + return retVal; + } + + hasChildren() { + if (!this.label()) return false; + if (this.type() !== "=") return false; + if (!this.column1()) return false; + const field = (this._owner as ProjectBase).field(this.column1()); + if (field && field.type === "dataset" && field.children) { + return true; + } + return false; + } + + children(): DDL2.IField[] { + const field = (this._owner as ProjectBase).field(this.column1()); + if (field && field.type === "dataset") { + return field.children; + } + return []; + } + + constructor() { + super(); + } + + owner(): IComputedFieldOwner; + owner(_: IComputedFieldOwner): this; + owner(_?: IComputedFieldOwner): IComputedFieldOwner | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.label(); + } + + validComputedMappings(): ComputedMapping[] { + return this.mapping().filter(cf => cf.valid()); + } + + validChildFields() { + return this.childField().filter(cf => cf.valid()); + } + + hasChildFields() { + return this.validChildFields().length; + } + + toDDL(): DDL2.MultiTransformationType { + switch (this.type()) { + case "scale": + return { + fieldID: this.label(), + type: "scale", + sourceFieldID: this.column1(), + factor: this.constValue() + }; + case "template": + return { + fieldID: this.label(), + type: "template", + template: this.template() + }; + case "=": + const transformations = this.validChildFields().map(cf => cf.toDDL()); + return { + fieldID: this.label(), + type: "=", + sourceFieldID: this.column1(), + transformations: transformations.length ? transformations : undefined + }; + case "map": + return { + fieldID: this.label(), + type: "map", + sourceFieldID: this.column1(), + default: this.default(), + mappings: this.validComputedMappings().map(cm => cm.toDDL()) + }; + default: + return { + fieldID: this.label(), + type: this.type() as DDL2.ICalculatedType, + sourceFieldID1: this.column1(), + sourceFieldID2: this.column2() + }; + } + } + + fromDDL(ddl: DDL2.MultiTransformationType): this { + const retVal = this + .label(ddl.fieldID) + .type(ddl.type) + ; + switch (ddl.type) { + case "scale": + retVal + .column1(ddl.sourceFieldID) + .constValue(ddl.factor) + ; + break; + case "template": + retVal + .template(ddl.template) + ; + break; + case "=": + retVal + .column1(ddl.sourceFieldID) + .childField(ddl.transformations ? ddl.transformations.map(transformation => ComputedField.fromDDL(transformation)) : []) + ; + break; + case "map": + retVal + .column1(ddl.sourceFieldID) + .default(ddl.default) + .mapping(ddl.mappings ? ddl.mappings.map(mapping => ComputedMapping.fromDDL(mapping)) : []) + ; + break; + default: + retVal + .column1(ddl.sourceFieldID1) + .column2(ddl.sourceFieldID2) + ; + } + return retVal; + } + + static fromDDL(ddl: DDL2.MultiTransformationType): ComputedField { + return new ComputedField().fromDDL(ddl); + } + + hash(): string { + return hashSum(this.toDDL()); + } + + columns(): string[] { + return this._owner.fieldIDs(); + } + + computedField(): DDL2.IField { + switch (this.type()) { + case "=": + let validChildFields = this.validChildFields(); + if (validChildFields.length === 0 && this.hasChildren()) { + // Has children but no mappings - include all children by default... + validChildFields = this.children().map((child: DDL2.IField) => { + return new ComputedField() + .owner(this) + .label(child.id) + .type("=") + .column1(child.id) + ; + }); + } + return { + ...this._owner.field(this.column1()), + id: this.label(), + children: validChildFields.length ? validChildFields.map(cf => cf.computedField()) : undefined + } as DDL2.IField; + case "*": + case "/": + case "+": + case "-": + case "scale": + return { id: this.label(), type: "number" }; + case "template": + return { id: this.label(), type: "string" }; + case "map": + return { id: this.label(), type: "object" } as DDL2.IFieldObject; + } + return { id: this.label(), type: "string" }; + } + + projection(trim: boolean): (row: object) => object { + const hasComputedFields = this.hasChildFields(); + const computedFields = this.validChildFields().map(cf => { + return { + label: cf.label(), + func: cf.computeFunc(trim) + }; + }); + return (row: object) => { + const retVal = trim && hasComputedFields ? {} : { ...row }; + for (const cf of computedFields) { + retVal[cf.label] = cf.func(row); + } + if (trim && hasComputedFields) { + retVal["__lparam"] = row; + } + return retVal; + }; + } + + computeFunc(trim: boolean): (row: any) => any { + const column1 = this.column1(); + const column2 = this.column2(); + switch (this.type()) { + case "=": + if (this.hasChildFields()) { + return (row: object) => { + // TODO Move to function factory --- + const r = row[column1].Row && isArray(row[column1].Row) ? row[column1].Row : row[column1]; + return r.map(this.projection(trim)); + }; + } + return (row: object) => { + return row[column1]; + }; + case "*": + return (row: any) => { + return +row[column1] * +row[column2]; + }; + case "/": + return (row: any) => { + return +row[column1] / +row[column2]; + }; + case "+": + return (row: any) => { + return +row[column1] + +row[column2]; + }; + case "-": + return (row: any) => { + return +row[column1] - +row[column2]; + }; + case "scale": + const constValue = this.constValue(); + return (row: any) => { + return +row[column1] * constValue; + }; + case "template": + const template = this.template(); + return (row: any) => { + return Utility.template(template, row); + }; + case "map": + const defValue = this.default(); + const mappings = {}; + for (const mapping of this.mapping()) { + mappings[mapping.value()] = mapping.newValue(); + } + return (row: any) => { + return mappings[row[column1]] || defValue; + }; + default: + return (row: any) => { + return row[column1]; + }; + } + } + + // IComputedFieldOwner --- + fieldIDs(): string[] { + const field = (this._owner as ProjectBase).field(this.column1()); + if (field) { + switch (field.type) { + case "dataset": + return field.children.map(field => field.id); + case "object": + return Object.keys(field.fields); + } + } + return []; + } + + field(fieldID: string): DDL2.IField | undefined { + const field = (this._owner as ProjectBase).field(this.column1()); + if (field) { + switch (field.type) { + case "dataset": + for (const f of field.children) { + if (f.id === fieldID) { + return f; + } + } + break; + case "object": + return field.fields[fieldID]; + } + } + return undefined; + } +} +ComputedField.prototype._class += " ComputedField"; + +export interface ComputedField { + label(): string; + label(_: string): this; + type(): ComputedType; + type(_: ComputedType): this; + column1(): string; + column1(_: string): this; + column1_valid(): boolean; + column2(): string; + column2(_: string): this; + column2_valid(): boolean; + constValue(): number; + constValue(_: number): this; + template(): string; + template(_: string): this; + default(): any; + default(_: any): this; + mapping(): ComputedMapping[]; + mapping(_: ComputedMapping[]): this; + childField(): ComputedField[]; + childField(_: ComputedField[]): this; +} + +// =========================================================================== +export class MultiField extends PropertyExt implements IComputedFieldOwner { + private _owner: IComputedFieldOwner; + + constructor() { + super(); + } + + hash() { + return hashSum(this.toDDL()); + } + + owner(): IComputedFieldOwner; + owner(_: IComputedFieldOwner): this; + owner(_?: IComputedFieldOwner): IComputedFieldOwner | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.label() && this.validMultiFields().length > 0; + } + + validate(prefix: string): IActivityError[] { + let retVal: IActivityError[] = []; + for (const cf of this.validMultiFields()) { + retVal = retVal.concat(cf.validate(`${prefix}.computedFields`)); + } + return retVal; + } + + toDDL(): DDL2.IMulti { + return { + fieldID: this.label(), + type: "multi", + transformations: this.transformations() + }; + } + + fromDDL(ddl: DDL2.IMulti): this { + return this + .label(ddl.fieldID) + .transformations(ddl.transformations) + ; + } + + static fromDDL(ddl: DDL2.IMulti): MultiField { + return new MultiField().fromDDL(ddl); + } + + validMultiFields(): ComputedField[] { + return this.multiFields().filter(computedField => computedField.valid()); + } + + transformations(): DDL2.MultiTransformationType[]; + transformations(_: DDL2.MultiTransformationType[]): this; + transformations(_?: DDL2.MultiTransformationType[]): DDL2.MultiTransformationType[] | this { + if (!arguments.length) return this.validMultiFields().map(cf => cf.toDDL()); + this.multiFields(_.map(transformation => ComputedField.fromDDL(transformation))); + return this; + } + + // IComputedFieldOwner --- + fieldIDs(): string[] { + return this._owner.fieldIDs(); + } + + field(fieldID: string): DDL2.IField | null { + return this._owner.field(fieldID); + } +} +MultiField.prototype._class += " MultiField"; + +export interface MultiField { + label(): string; + label(_: string): this; + multiFields(): ComputedField[]; + multiFields(_: ComputedField[]): this; +} + +// =========================================================================== +export class ProjectBase extends Activity { + static ComputedField = ComputedField; + + _includeLParam = false; + _trim = false; + + validate(): IActivityError[] { + let retVal: IActivityError[] = []; + for (const cf of this.validComputedFields()) { + retVal = retVal.concat(cf.validate(`${this.classID()}.computedFields`)); + } + return retVal; + } + + constructor() { + super(); + } + + transformations(): DDL2.ProjectTransformationType[]; + transformations(_: DDL2.ProjectTransformationType[]): this; + transformations(_?: DDL2.ProjectTransformationType[]): DDL2.ProjectTransformationType[] | this { + if (!arguments.length) return this.validComputedFields().map(cf => cf.toDDL()); + this.computedFields(_.map(transformation => { + switch (transformation.type) { + case "multi": + return MultiField.fromDDL(transformation); + default: + return ComputedField.fromDDL(transformation); + } + })); + return this; + } + + exists(): boolean { + return this.validComputedFields().length > 0; + } + + // IComputedFieldOwner --- + fieldIDs(): string[] { + return this.inFields().map(field => field.id); + } + + field(fieldID: string): DDL2.IField | null { + for (const field of this.inFields()) { + if (field.id === fieldID) { + return field; + } + } + return null; + } + // --- + + clearComputedFields() { + this.computedFields([]); + } + + appendComputedFields(computedFields: [{ label: string, type: ComputedType, column?: string }]): this { + for (const aggregateField of computedFields) { + const aggrField = new ComputedField() + .owner(this) + .label(aggregateField.label) + .type(aggregateField.type) + ; + if (aggregateField.column !== void 0) { + aggrField.column1(aggregateField.column); + } + this.computedFields().push(aggrField); + } + return this; + } + + validComputedFields() { + return this.computedFields().filter(computedField => computedField.valid()); + } + + hasComputedFields() { + return this.validComputedFields().length; + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + if (!this.exists()) return super.computeFields(inFields); + let retVal: DDL2.IField[] = []; + const retValMap: { [key: string]: boolean } = {}; + for (const cf of this.validComputedFields()) { + if (cf instanceof MultiField) { + for (const cf2 of cf.validMultiFields()) { + const computedField = cf2.computedField(); + retVal.push(computedField); + retValMap[computedField.id] = true; + } + } else { + const computedField = cf.computedField(); + retVal.push(computedField); + retValMap[computedField.id] = true; + } + } + if (this._trim && this.hasComputedFields()) { + if (this._includeLParam) { + const computedField = { + id: "__lparam", + type: "object" + } as DDL2.IField; + retVal.push(computedField); + retValMap[computedField.id] = true; + } + } else { + retVal = retVal.concat(inFields.filter(field => !retValMap[field.id])); + } + return () => retVal; + } + + referencedFields(refs: ReferencedFields): void { + super.referencedFields(refs); + const fieldIDs: string[] = []; + for (const cf of this.validComputedFields()) { + if (cf instanceof MultiField) { + for (const cf2 of cf.validMultiFields()) { + fieldIDs.push(cf2.column1()); + if (cf2.column2()) { + fieldIDs.push(cf2.column2()); + } + } + } else { + if (cf.type() === "template") { + for (const fieldID of Utility.templateFields(cf.template())) { + fieldIDs.push(fieldID); + } + } else { + fieldIDs.push(cf.column1()); + if (cf.column2()) { + fieldIDs.push(cf.column2()); + } + } + } + } + super.resolveInFields(refs, fieldIDs); + } + + projection(): (row: object) => object { + const trim = this._trim; + const hasComputedFields = this.hasComputedFields(); + const computedFields = []; + for (const cf of this.validComputedFields()) { + if (cf instanceof MultiField) { + for (const cf2 of cf.validMultiFields()) { + computedFields.push({ + label: cf2.label(), + func: cf2.computeFunc(trim) + }); + } + } else { + computedFields.push({ + label: cf.label(), + func: cf.computeFunc(trim) + }); + } + } + return (row: object) => { + const retVal = trim && hasComputedFields ? {} : { ...row }; + for (const cf of computedFields) { + retVal[cf.label] = cf.func(row); + } + if (trim && hasComputedFields) { + if (this._includeLParam) { + retVal["__lparam"] = row; + } + } + return retVal; + }; + } + + computeData(): ReadonlyArray { + const data = super.computeData(); + if (data.length === 0 || !this.exists()) return data; + return data.map(this.projection()); + } +} + +export class Project extends ProjectBase { + + toDDL(): DDL2.IProject { + return { + type: "project", + transformations: this.transformations() + }; + } + + fromDDL(ddl: DDL2.IProject): this { + return this.transformations(ddl.transformations); + } + + static fromDDL(ddl: DDL2.IProject): Project { + return new Project().fromDDL(ddl); + } + + hash(more: object = {}): string { + return super.hash({ + ddl: this.toDDL(), + ...more + }); + } +} +Project.prototype._class += " Project"; + +export class Mappings extends ProjectBase { + + constructor() { + super(); + this._trim = true; + this._includeLParam = true; + } + + toDDL(): DDL2.IMappings { + return { + type: "mappings", + transformations: this.transformations() + }; + } + + fromDDL(_ddl: DDL2.IMappings): this { + const ddl = _ddl || { transformations: [] }; + return this + .transformations(ddl.transformations) + ; + } + + static fromDDL(ddl: DDL2.IMappings): Mappings { + return new Mappings().fromDDL(ddl); + } + + hash(more: object = {}): string { + return super.hash({ + ddl: this.toDDL(), + ...more + }); + } + + referencedFields(refs: ReferencedFields): void { + if (this.hasComputedFields()) { + return super.referencedFields(refs); + } + this.resolveInFields(refs, this.inFields().filter(f => f.id !== "__lparam").map(f => f.id)); + } +} +Mappings.prototype._class += " Mappings"; + +ComputedMapping.prototype.publish("value", null, "any", "Compare Value", undefined, { + validate: (w: ComputedMapping): boolean => (!w.value() && !w.newValue()) || (!!w.value() && !!w.newValue()) +}); +ComputedMapping.prototype.publish("newValue", null, "any", "New Value", undefined, { + validate: (w: ComputedMapping): boolean => (!w.value() && !w.newValue()) || (!!w.value() && !!w.newValue()) +}); + +ComputedField.prototype.publish("label", null, "string", "Label", null, { optional: true }); +ComputedField.prototype.publish("type", "mapping", "set", "Project type", ["=", "*", "/", "+", "-", "scale", "template", "map"], { optional: true, disable: w => !w.label() }); +ComputedField.prototype.publish("column1", null, "set", "Param 1", function (this: ComputedField) { return this.columns(); }, { + optional: true, + disable: (w: ComputedField) => w.disableColumn1(), + validate: (w: ComputedField): boolean => w.columns().indexOf(w.column1()) >= 0 +}); +ComputedField.prototype.publish("column2", null, "set", "Param 2", function (this: ComputedField) { return this.columns(); }, { + optional: true, + disable: (w: ComputedField) => w.disableColumn2(), + validate: (w: ComputedField): boolean => w.columns().indexOf(w.column2()) >= 0 +}); +ComputedField.prototype.publish("constValue", null, "number", "Const value", null, { optional: true, disable: (w: ComputedField) => !w.label() || ["scale"].indexOf(w.type()) < 0 }); +ComputedField.prototype.publish("template", null, "string", "template", null, { optional: true, disable: (w: ComputedField) => !w.label() || ["template"].indexOf(w.type()) < 0 }); +ComputedField.prototype.publish("default", null, "any", "Default Value", null, { optional: true, disable: (w: ComputedField) => !w.label() || ["map"].indexOf(w.type()) < 0 }); +ComputedField.prototype.publish("mapping", [], "propertyArray", "Mapped Values", null, { autoExpand: ComputedMapping, disable: (w: ComputedField) => w.disableMapping() }); +ComputedField.prototype.publish("childField", [], "propertyArray", "Child Fields", null, { autoExpand: ComputedField, disable: (w: ComputedField) => w.disableChildField() }); + +MultiField.prototype.publish("label", "", "string", "Label"); +MultiField.prototype.publish("multiFields", [], "propertyArray", "Multi Fields", null, { autoExpand: ComputedField }); + +export interface ProjectBase { + computedFields(): Array; + computedFields(_: Array): this; +} + +ProjectBase.prototype.publish("computedFields", [], "propertyArray", "Computed Fields", null, { autoExpand: ComputedField }); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/rest.ts b/packages/marshaller/src/ddl2/activities/rest.ts new file mode 100644 index 0000000000..2cbef31d31 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/rest.ts @@ -0,0 +1,593 @@ +import { PropertyExt } from "@hpcc-js/common"; +import { createConnection } from "@hpcc-js/comms"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { AsyncOrderedQueue, compare, hashSum } from "@hpcc-js/util"; +import { Element, ElementContainer } from "../model/element.ts"; +import { IActivityError, ReferencedFields } from "./activity.ts"; +import { rowToFields } from "./databomb.ts"; +import { Datasource, DatasourceRef } from "./datasource.ts"; + +export class RestField extends PropertyExt { + protected _owner: RestService; + + constructor() { + super(); + } + + toDDL(): DDL2.IFieldString { + return { + type: "string", + id: this.fieldID() + }; + } + + fromDDL(ddl: DDL2.IFieldString): this { + return this + .fieldID(ddl.id) + ; + } + + static fromDDL(ddl: DDL2.IFieldString): RestField { + return new RestField().fromDDL(ddl); + } + + owner(): RestService; + owner(_: RestService): this; + owner(_?: RestService): RestService | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.fieldID(); + } +} + +export class RestService extends Datasource { + + private _responseFields: { [outputID: string]: DDL2.IField[] } = {}; + + constructor(readonly _ec: ElementContainer) { + super(); + } + + toDDL(): DDL2.IRestService { + return { + type: "rest", + id: this.id(), + url: this.url(), + action: this.action(), + mode: this.mode(), + inputs: this.validRequestFields().map(rf => rf.toDDL()), + outputs: this.outputDDL() + }; + } + + fromDDL(ddl: DDL2.IRestService, skipID = false): this { + (skipID ? this : this.id(ddl.id)) + .url(ddl.url) + .action(ddl.action) + .mode(ddl.mode || "get") + .requestFields(ddl.inputs.map(RestField.fromDDL)) + ; + for (const key in ddl.outputs) { + this.responseFields(key, ddl.outputs[key].fields); + } + return this; + } + + static fromDDL(ec: ElementContainer, ddl: DDL2.IRestService, skipID = false): RestService { + return new RestService(ec).fromDDL(ddl, skipID); + } + + hash(more: object = {}): string { + return hashSum({ + url: this.url(), + action: this.action(), + mode: this.mode(), + ...more + }); + } + + label(): string { + return this.action(); + } + + responseFields(resultName: string): DDL2.IField[]; + responseFields(resultName: string, _: DDL2.IField[]): this; + responseFields(resultName: string, _?: DDL2.IField[]): DDL2.IField[] | this { + if (arguments.length === 1) return this._responseFields[resultName] || []; + this._responseFields[resultName] = _; + return this; + } + + validRequestFields(): RestField[] { + return this.requestFields().filter(f => f.valid()); + } + + private _prevRequestHash; + private _prevPromise; + private _submitQ = new AsyncOrderedQueue(); + submit(request: { [key: string]: any }): Promise<{ [key: string]: any }> { + const requestHash = hashSum(request); + if (!this._prevPromise || this._prevRequestHash !== requestHash) { + this._prevRequestHash = requestHash; + const conn = createConnection({ baseUrl: this.url(), type: this.mode() }); + this._prevPromise = this._submitQ.push(conn.send(this.action(), request)); + } + return this._prevPromise; + } + + resultNames(): string[] { + const retVal: string[] = []; + for (const key in this._responseFields) { + retVal.push(key); + } + return retVal; + } + + outputDDL(): DDL2.OutputDict { + const retVal: DDL2.OutputDict = {}; + this.resultNames().forEach(resultName => { + retVal[resultName] = { + fields: this._responseFields[resultName] + }; + }); + return retVal; + } +} +RestService.prototype._class += " RestService"; + +export class RestResult extends Datasource { + + _origService; + + declare _service: RestService; + + constructor(private _ec: ElementContainer) { + super(); + this._service = new RestService(this._ec); + } + + validRequestFields(): RestField[] { + return this.service().validRequestFields(); + } + + toDDL(): DDL2.IRestService { + return this.service().toDDL(); + } + + fromDDL(ddl: DDL2.IRestService): this { + this.service().fromDDL(ddl); + return this; + } + + static fromDDL(ec: ElementContainer, rs: RestService, resultName: string): RestResult { + return new RestResult(ec) + .id(`${rs.id()}_${resultName}`) + .service(rs) + .resultName(resultName) + ; + } + + serviceID(): string { + return `${this.service().url()}/${this.service().action()}}`; + } + + sourceHash(): string { + return this.service().hash(); + } + + requestFields(): DDL2.IField[] { + return this.service().requestFields().map(rf => rf.toDDL()); + } + + responseFields(): DDL2.IField[]; + responseFields(_: DDL2.IField[]): this; + responseFields(_?: DDL2.IField[]): this | DDL2.IField[] { + if (!arguments.length) return this.service().responseFields(this.resultName()); + this.service().responseFields(this.resultName(), _); + return this; + } + + hash(more: object = {}): string { + return hashSum({ + source: this.sourceHash(), + resultName: this.resultName(), + ...more + }); + } + + label(): string { + return `${this.service().label()}\n${this.resultName()}`; + } + + private _jsonData: object[] = []; + private jsonDataFields(): DDL2.IField[] { + if (!this._jsonData || !this._jsonData.length) return []; + const retVal = rowToFields(this._jsonData[0], this._jsonData); + this.responseFields(retVal); + return retVal; + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + return () => this.jsonDataFields(); + } + + computeData(): ReadonlyArray { + return this._jsonData; + } + + submit(request: { [key: string]: any }): Promise<{ [key: string]: any }> { + return this.service().submit(request).then(response => { + const resultName = this.resultName(); + const resultFields = resultName ? resultName.split(".") : []; + for (const field of resultFields) { + response = (response || {})[field]; + } + this._jsonData = response as object[]; + return response; + }); + } + + formatRequest() { + const request = {}; + this.service().validRequestFields().forEach(f => { + request[f.fieldID()] = ""; + }); + return request; + } + + exec(): Promise { + return this.submit(this.formatRequest()).then(response => { }); + } +} +RestResult.prototype._class += " RestResult"; + +export class Param extends PropertyExt { + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.source_valid()) { + retVal.push({ + source: `${prefix}.source.${this.source()}`, + msg: `Invalid source: "${this.source()}"`, + hint: `expected: ${JSON.stringify(this.visualizationIDs())}` + }); + } + if (!this.remoteField_valid()) { + retVal.push({ + source: `${prefix}.remoteField`, + msg: `Invalid remoteField: "${this.remoteField()}"`, + hint: `expected: ${JSON.stringify(this.sourceOutFields())}` + }); + } + if (!this.value_valid()) { + retVal.push({ + source: `${prefix}.value`, + msg: `Invalid value: "${this.value()}"`, + hint: "expected: any value." + }); + } + return retVal; + } + + constructor(private _ec: ElementContainer) { + super(); + } + + toDDL(): DDL2.IRequestField { + return { + source: this.source(), + remoteFieldID: this.remoteField(), + localFieldID: this.localField(), + value: this.value() + }; + } + + fromDDL(ddl: DDL2.IRequestField): this { + return this + .source(ddl.source) + .remoteField(ddl.remoteFieldID) + .localField(ddl.localFieldID) + .value(ddl.value) + ; + } + + static fromDDL(ec: ElementContainer, ddl: DDL2.IRequestField): Param { + return new Param(ec).fromDDL(ddl); + } + + hash() { + return hashSum({ + label: this.localField(), + source: this.source(), + sourceField: this.remoteField() + }); + } + + visualizationIDs() { + return this._ec.elementIDs(); + } + + sourceFields() { + return this.sourceOutFields().map(field => field.id); + } + + sourceViz(): Element { + return this._ec.element(this.source()); + } + + sourceOutFields(): ReadonlyArray { + return this.sourceViz().hipiePipeline().selectionFields(); + } + + sourceSelection(): any[] { + return this.sourceViz().selection(); + } + + calcValue(): Array { + if (this.source_exists() && this.remoteField_exists()) { + const sourceSelection = this.sourceSelection(); + return sourceSelection.map(row => row[this.remoteField()]); + } else if (this.value_exists()) { + return [this.value()]; + } + return [""]; + } + + exists(): boolean { + return this.localField_exists() && ((this.source_exists() && this.remoteField_exists()) || this.value_exists()); + } +} +Param.prototype._class += " Param"; + +export class RestResultRef extends DatasourceRef { + + serviceID(): string { + return this.datasource().serviceID(); + } + + private _data: ReadonlyArray = []; + + datasource(): RestResult; + datasource(_: RestResult): this; + datasource(_?: RestResult): this | RestResult { + return super.datasource.apply(this, arguments); + } + + url(): string { + return this.datasource().service().url(); + } + + action(): string { + return this.datasource().service().action(); + } + + resultName(): string { + return this.datasource().resultName(); + } + + validate(): IActivityError[] { + let retVal: IActivityError[] = []; + for (const filter of this.validParams()) { + retVal = retVal.concat(filter.validate("request")); + } + return retVal; + } + + constructor(private _ec: ElementContainer) { + super(); + } + + toDDL(): DDL2.IRoxieServiceRef { + return { + id: this.datasource().service().id(), + output: this.resultName(), + request: this.validParams().map((vp): DDL2.IRequestField => { + return { + source: vp.source(), + remoteFieldID: vp.remoteField(), + localFieldID: vp.localField(), + value: vp.value() + }; + }) + }; + } + + sourceHash(): string { + return this.datasource().hash(); + } + + requestFieldRefs(): DDL2.IRequestField[]; + requestFieldRefs(_: DDL2.IRequestField[]): this; + requestFieldRefs(_?: DDL2.IRequestField[]): DDL2.IRequestField[] | this { + if (!arguments.length) return this.validParams().map(param => param.toDDL()); + this.request(_.map(fc => Param.fromDDL(this._ec, fc))); + return this; + } + + requestFields(): DDL2.IField[] { + return this.datasource().requestFields(); + } + + responseFields(): DDL2.IField[] { + return this.datasource().responseFields(); + } + + hash(): string { + return this.datasource().hash({ + resultName: this.resultName(), + request: this.formatRequest() + }); + } + + label(): string { + return `${this.datasource().label()}\n${this.datasource().resultName()}`; + } + + elementIDs() { + return this._ec.elementIDs(); + } + + element(source) { + return this._ec.element(source); + } + + referencedFields(refs: ReferencedFields): void { + super.referencedFields(refs); + const localFieldIDs: string[] = []; + for (const param of this.validParams()) { + const filterSource = param.sourceViz().hipiePipeline(); + if (!refs.inputs[this.id()]) { + refs.inputs[this.id()] = []; + } + refs.inputs[this.id()].push(param.localField()); + filterSource.resolveFields(refs, [param.remoteField()]); + } + super.resolveFields(refs, localFieldIDs); + } + + validParams() { + return this.request().filter(param => param.exists()); + } + + refreshMeta(): Promise { + return this.datasource().refreshMeta().then(() => { + const oldParams = this.request(); + const diffs = compare(oldParams.map(p => p.localField()), this.datasource().validRequestFields().map(ff => ff.fieldID())); + const newParams = oldParams.filter(op => diffs.update.indexOf(op.localField()) >= 0); + this.request(newParams.concat(diffs.enter.map(label => new Param(this._ec).localField(label)))); + }); + } + + updatedBy(): string[] { + return this.validParams().map(param => param.source()); + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + return this.datasource().computeFields(inFields); + } + + formatRequest(): { [key: string]: any } { + const request = this.datasource().formatRequest(); + this.request().forEach(f => { + if (request[f.localField()] !== undefined) { + request[f.localField()] = f.calcValue() || request[f.localField()]; + } + }); + return request; + } + + private _prevRequestHash; + private _prevRequestPromise; + exec(): Promise { + const request = this.formatRequest(); + const requestHash = hashSum({ hash: this.hash(), request }); + if (this._prevRequestHash !== requestHash) { + this._prevRequestHash = requestHash; + this._prevRequestPromise = this.datasource().submit(request).then((response: { [key: string]: any }) => { + this._data = this.fixInt64(response); + return this._data; + }); + } + return this._prevRequestPromise; + } + + inData(): ReadonlyArray { + return this._data; + } + + computeData(): ReadonlyArray { + return this._data; + } +} +RestResultRef.prototype._class += " RestResultRef"; + +export interface RestField { + fieldID(): string; + fieldID(_: string): this; +} + +RestField.prototype.publish("fieldID", "", "string", "RestField Label"); + +export interface RestService { + url(): string; + url(_: string): this; + action(): string; + action(_: string): this; + mode(): "get" | "post"; + mode(_: "get" | "post"): this; + requestFields(): RestField[]; + requestFields(_: RestField[]): this; +} + +RestService.prototype.publish("url", "", "string", "REST Url"); +RestService.prototype.publish("action", "", "string", "Query Set"); +RestService.prototype.publish("mode", "get", "set", "Request mode", ["get", "post"]); +RestService.prototype.publish("requestFields", [], "propertyArray", "Multi Fields", null, { autoExpand: RestField }); + +export interface RestResult { + service(): RestService; + service(_: RestService): this; + resultName(): string; + resultName(_: string): this; +} + +RestResult.prototype.publish("service", null, "widget", "Rest service"); +RestResult.prototype.publish("resultName", "", "string", "Result Name"); + +RestResult.prototype._origService = RestResult.prototype.service; +RestResult.prototype.service = function (this: RestResult, _?) { + const retVal = RestResult.prototype._origService.apply(this, arguments); + if (_ !== undefined) { + this._service.refreshMeta(); + } + return retVal; +}; + +export interface Param { + localField(): string; + localField(_: string): this; + localField_exists(): boolean; + source(): string; + source(_: string): this; + source_exists(): boolean; + source_valid(): boolean; + source_disabled(): boolean; + remoteField(): string; + remoteField(_: string): this; + remoteField_exists(): boolean; + remoteField_valid(): boolean; + remoteField_disabled(): boolean; + value(): string; + value(_: string): this; + value_exists(): boolean; + value_valid(): boolean; + value_disabled(): boolean; +} + +Param.prototype.publish("localField", null, "string", "Label"); +Param.prototype.publish("source", null, "set", "Activity", function (this: Param) { return this.visualizationIDs(); }, { + optional: true, + disable: (w: Param): boolean => w.value_exists(), + validate: (w: Param): boolean => w.source_disabled() || w.visualizationIDs().indexOf(w.source()) >= 0 +}); +Param.prototype.publish("remoteField", null, "set", "Source Field", function (this: Param) { return this.sourceFields(); }, { + optional: true, + disable: (w: Param): boolean => !w.source_exists() || w.value_exists(), + validate: (w: Param): boolean => w.remoteField_disabled() || w.sourceFields().indexOf(w.remoteField()) >= 0 +}); +Param.prototype.publish("value", null, "string", "Static Value", null, { + optional: true, + disable: (w: Param): boolean => w.source_exists(), + validate: (w: Param): boolean => w.value_disabled() || w.value_exists() +}); + +export interface RestResultRef { + request(): Param[]; + request(_: Param[]): this; +} + +RestResultRef.prototype.publish("request", [], "propertyArray", "Request Fields"); diff --git a/packages/marshaller/src/ddl2/activities/roxie.ts b/packages/marshaller/src/ddl2/activities/roxie.ts new file mode 100644 index 0000000000..156a4ac214 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/roxie.ts @@ -0,0 +1,504 @@ +import { Query as CommsQuery } from "@hpcc-js/comms"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { AsyncOrderedQueue, compare, hashSum } from "@hpcc-js/util"; +import { ElementContainer } from "../model/element.ts"; +import { IActivityError, ReferencedFields } from "./activity.ts"; +import { Datasource, DatasourceRef } from "./datasource.ts"; +import { Param } from "./rest.ts"; + +function parseUrl(_: string): { url: string, querySet: string, queryID: string } { + // "http://10.241.100.157:8002/WsEcl/submit/query/roxie/carmigjx_govbisgsavi.Ins4621360_Service_00000006/json", + const parts = _.split("/WsEcl/submit/query/"); + if (parts.length < 2) throw new Error(`Invalid roxie URL: ${_}`); + const urlParts = parts[0].split(":"); + if (urlParts.length < 3) throw new Error(`Invalid roxie URL: ${_}`); + const roxieParts = parts[1].split("/"); + if (roxieParts.length < 2) throw new Error(`Invalid roxie URL: ${_}`); + return { + url: `${urlParts[0]}:${urlParts[1]}:${urlParts[2] === "18002" ? "18010" : "8010"}`, + querySet: roxieParts[0], + queryID: roxieParts[1] + }; +} + +function isHipieRequest(requestField: string): boolean { + return requestField.length >= 8 && requestField.indexOf("_changed") === requestField.length - 8; +} + +function isHipieResponse(resultName: string): boolean { + return (resultName.length >= 8 && resultName.indexOf("_changed") === resultName.length - 8) || + (["HIPIE_DDL", "HIPIE_DDLGLOBALS", "hipieversion"].indexOf(resultName) >= 0) + ; +} + +export class RoxieService extends Datasource { + private _query: CommsQuery; + private _requestFields: DDL2.IField[]; + private _responseFields: { [outputID: string]: DDL2.IField[] } = {}; + private _type: "roxie" | "hipie" = "roxie"; + + constructor(private _ec: ElementContainer) { + super(); + } + + toDDL(): DDL2.IRoxieService | DDL2.IHipieService { + return { + type: this._type, + id: this.id(), + url: this.url(), + querySet: this.querySet(), + queryID: this.queryID(), + inputs: this.requestFields(), + outputs: this.outputDDL() + }; + } + + fromDDL(ddl: DDL2.IRoxieService | DDL2.IHipieService, skipID = false): this { + this._type = ddl.type; + (skipID ? this : this.id(ddl.id)) + .url(ddl.url) + .querySet(ddl.querySet) + .queryID(ddl.queryID) + ; + if (ddl.inputs && ddl.inputs.length) { + this.requestFields(ddl.inputs); + } + for (const key in ddl.outputs) { + this.responseFields(key, ddl.outputs[key].fields); + } + return this; + } + + static fromDDL(ec: ElementContainer, ddl: DDL2.IRoxieService | DDL2.IHipieService, skipID = false): RoxieService { + return new RoxieService(ec).fromDDL(ddl, skipID); + } + + hash(more: object = {}): string { + return hashSum({ + url: this.url(), + querySet: this.querySet(), + queryId: this.queryID(), + ignoreHipieRequest: this.ignoreHipieRequest(), + ignoreHipieResponse: this.ignoreHipieResponse(), + ...more + }); + } + + label(): string { + return this.queryID(); + } + + private _prevSourceHash: string; + private refreshMetaPromise: Promise; + refreshMeta(): Promise { + if (this._prevSourceHash !== this.hash()) { + this._prevSourceHash = this.hash(); + delete this.refreshMetaPromise; + } + if (!this.refreshMetaPromise) { + const hasMeta = !!this._requestFields; + this.refreshMetaPromise = new Promise((resolve, reject) => { + const query = CommsQuery.attach({ baseUrl: this.url(), hookSend: this._ec.hookSend() }, this.querySet(), this.queryID()); + if (!hasMeta || this.ignoreHipieRequest() || this.ignoreHipieResponse()) { + resolve(query.refresh()); + } + resolve(query); + }).then((query) => { + this._query = query; + if (!hasMeta || this.ignoreHipieRequest()) { + this._requestFields = query.requestFields().filter(row => this._type === "roxie" || !isHipieRequest(row.id)); + } + if (!hasMeta || this.ignoreHipieResponse()) { + query.resultNames().filter(resultName => this._type === "roxie" || !isHipieResponse(resultName)).forEach(resultName => { + this._responseFields[resultName] = query.resultFields(resultName); + }); + } + }); + } + return this.refreshMetaPromise; + } + + requestFields(): DDL2.IField[]; + requestFields(_: DDL2.IField[]): this; + requestFields(_?: DDL2.IField[]): DDL2.IField[] | this { + if (!arguments.length) return this._requestFields || []; + this._requestFields = _; + return this; + } + + responseFields(resultName: string): DDL2.IField[]; + responseFields(resultName: string, _: DDL2.IField[]): this; + responseFields(resultName: string, _?: DDL2.IField[]): DDL2.IField[] | this { + if (arguments.length === 1) return this._responseFields[resultName] || []; + this._responseFields[resultName] = _; + return this; + } + + private _prevRequestHash; + private _prevPromise; + private _submitQ = new AsyncOrderedQueue(); + submit(request: { [key: string]: any }): Promise<{ [key: string]: any }> { + const requestHash = hashSum(request); + if (!this._prevPromise || this._prevRequestHash !== requestHash) { + this._prevRequestHash = requestHash; + this._prevPromise = this._submitQ.push(this._query.submit(request)); + } + return this._prevPromise; + } + + resultNames(): string[] { + const retVal: string[] = []; + for (const key in this._responseFields) { + retVal.push(key); + } + return retVal; + } + + outputDDL(): DDL2.OutputDict { + const retVal: DDL2.OutputDict = {}; + this.resultNames().forEach(resultName => { + retVal[resultName] = { + fields: this._responseFields[resultName] + }; + }); + return retVal; + } +} +RoxieService.prototype._class += " RoxieService"; + +export interface RoxieService { + url(): string; + url(_: string): this; + querySet(): string; + querySet(_: string): this; + queryID(): string; + queryID(_: string): this; + ignoreHipieRequest(): boolean; + ignoreHipieRequest(_: boolean): this; + ignoreHipieResponse(): boolean; + ignoreHipieResponse(_: boolean): this; +} + +RoxieService.prototype.publish("url", "", "string", "ESP Url (http://x.x.x.x:8002)"); +RoxieService.prototype.publish("querySet", "", "string", "Query Set"); +RoxieService.prototype.publish("queryID", "", "string", "Query ID"); +RoxieService.prototype.publish("ignoreHipieRequest", false, "boolean", "Ignore provided DDL request"); +RoxieService.prototype.publish("ignoreHipieResponse", false, "boolean", "Ignore provided DDL response"); + +export class RoxieResult extends Datasource { + + _origService; + + declare _service: RoxieService; + + constructor(private _ec: ElementContainer) { + super(); + this._service = new RoxieService(this._ec); + } + + toDDL(): DDL2.IRoxieService | DDL2.IHipieService { + return this.service().toDDL(); + } + + fromDDL(ddl: DDL2.IRoxieService): this { + this.service().fromDDL(ddl); + return this; + } + + static fromDDL(ec: ElementContainer, rs: RoxieService, resultName: string): RoxieResult { + return new RoxieResult(ec) + .id(`${rs.id()}_${resultName}`) + .service(rs) + .resultName(resultName) + ; + } + + serviceID(): string { + return `${this.service().url()}/${this.service().querySet()}/${this.service().queryID()}`; + } + + sourceHash(): string { + return this.service().hash(); + } + + requestFields(): DDL2.IField[] { + return this.service().requestFields(); + } + + responseFields(): DDL2.IField[]; + responseFields(_: DDL2.IField[]): this; + responseFields(_?: DDL2.IField[]): this | DDL2.IField[] { + if (!arguments.length) return this.service().responseFields(this.resultName()); + this.service().responseFields(this.resultName(), _); + return this; + } + + hash(more: object = {}): string { + return hashSum({ + source: this.sourceHash(), + resultName: this.resultName(), + ...more + }); + } + + label(): string { + return `${this.service().label()}\n${this.resultName()}`; + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + return () => this.service().responseFields(this.resultName()); + } + + refreshMeta(): Promise { + return this.service().refreshMeta(); + } + + submit(request: { [key: string]: any }): Promise<{ [key: string]: any }> { + return this.service().submit(request); + } +} +RoxieResult.prototype._class += " RoxieResult"; + +export interface RoxieResult { + service(): RoxieService; + service(_: RoxieService): this; + resultName(): string; + resultName(_: string): this; +} + +RoxieResult.prototype.publish("service", null, "widget", "Roxie service"); +RoxieResult.prototype.publish("resultName", "", "set", "Result Name", function (this: RoxieResult): string[] { + return this._service !== undefined ? this._service.resultNames() : []; +}); + +RoxieResult.prototype._origService = RoxieResult.prototype.service; +RoxieResult.prototype.service = function (this: RoxieResult, _?) { + const retVal = RoxieResult.prototype._origService.apply(this, arguments); + if (_ !== undefined) { + this._service.refreshMeta(); + } + return retVal; +}; + +export class RoxieResultRef extends DatasourceRef { + + serviceID(): string { + return this.datasource().serviceID(); + } + + private _data: ReadonlyArray = []; + + datasource(): RoxieResult; + datasource(_: RoxieResult): this; + datasource(_?: RoxieResult): this | RoxieResult { + return super.datasource.apply(this, arguments); + } + + url(): string { + return this.datasource().service().url(); + } + + querySet(): string { + return this.datasource().service().querySet(); + } + + queryID(): string { + return this.datasource().service().queryID(); + } + + resultName(): string { + return this.datasource().resultName(); + } + + validate(): IActivityError[] { + let retVal: IActivityError[] = []; + for (const filter of this.validParams()) { + retVal = retVal.concat(filter.validate("request")); + } + return retVal; + } + + constructor(private _ec: ElementContainer) { + super(); + } + + toDDL(): DDL2.IRoxieServiceRef { + return { + id: this.datasource().service().id(), + output: this.resultName(), + request: this.validParams().map((vp): DDL2.IRequestField => { + return { + source: vp.source(), + remoteFieldID: vp.remoteField(), + localFieldID: vp.localField(), + value: vp.value() + }; + }) + }; + } + + sourceHash(): string { + return this.datasource().hash(); + } + + requestFieldRefs(): DDL2.IRequestField[]; + requestFieldRefs(_: DDL2.IRequestField[]): this; + requestFieldRefs(_?: DDL2.IRequestField[]): DDL2.IRequestField[] | this { + if (!arguments.length) return this.validParams().map(param => param.toDDL()); + this.request(_.map(fc => Param.fromDDL(this._ec, fc))); + return this; + } + + requestFields(): DDL2.IField[] { + return this.datasource().requestFields(); + } + + responseFields(): DDL2.IField[] { + return this.datasource().responseFields(); + } + + hash(): string { + return this.datasource().hash({ + resultName: this.resultName(), + params: this.request().map(param => param.hash()), + request: this.formatRequest() + }); + } + + label(): string { + return `${this.datasource().label()}\n${this.datasource().resultName()}`; + } + + elementIDs() { + return this._ec.elementIDs(); + } + + element(source) { + return this._ec.element(source); + } + + referencedFields(refs: ReferencedFields): void { + super.referencedFields(refs); + const localFieldIDs: string[] = []; + for (const param of this.validParams()) { + localFieldIDs.push(param.localField()); + const filterSource = param.sourceViz().hipiePipeline(); + if (!refs.inputs[this.id()]) { + refs.inputs[this.id()] = []; + } + refs.inputs[this.id()].push(param.localField()); + filterSource.resolveFields(refs, [param.remoteField()]); + } + super.resolveFields(refs, localFieldIDs); + } + + validParams() { + return this.request().filter(param => param.exists()); + } + + refreshMeta(): Promise { + return this.datasource().refreshMeta().then(() => { + const oldParams = this.request(); + const diffs = compare(oldParams.map(p => p.localField()), this.datasource().requestFields().map(ff => ff.id)); + const newParams = oldParams.filter(op => diffs.update.indexOf(op.localField()) >= 0); + this.request(newParams.concat(diffs.enter.map(label => new Param(this._ec).localField(label)))); + }); + } + + updatedBy(): string[] { + return this.validParams().map(param => param.source()); + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + return () => this.datasource().responseFields(); + } + + formatRequest(): { [key: string]: any } { + const request: { [key: string]: any } = {}; + let hasRequest = false; + const fields = this.datasource().requestFields(); + for (const param of this.validParams()) { + const _value = param.calcValue(); + const field = fields.filter(row => row.id === param.localField())[0]; + let value; + if (field.type === "set") { + value = { + Item: _value + }; + } else { + value = _value[0]; + } + if (value !== undefined) { + request[param.localField()] = value; + } + hasRequest = true; + } + if (!hasRequest) { + request.refresh = true; + } + return request; + } + + private _prevRequestHash; + private _prevRequestPromise; + exec(): Promise { + return super.exec().then(() => { + const request = this.formatRequest(); + const requestHash = hashSum({ hash: this.hash(), request }); + if (this._prevRequestHash !== requestHash) { + this._prevRequestHash = requestHash; + this._prevRequestPromise = this.datasource().submit(request).then((response: { [key: string]: any }) => { + const resultName = this.datasource().resultName(); + let result = response[resultName]; + if (!result) { + // See: https://track.hpccsystems.com/browse/HPCC-21176 --- + // "Result 1" => "result_1" + result = response[resultName.toLowerCase().replace(/ /g, "_")]; + } + return this.fixInt64(result); + }); + } + return this._prevRequestPromise; + }).then(data => { + this._data = data; + }); + } + + inData(): ReadonlyArray { + return this._data; + } + + computeData(): ReadonlyArray { + return this._data; + } +} +RoxieResultRef.prototype._class += " RoxieResultRef"; + +export interface RoxieResultRef { + request(): Param[]; + request(_: Param[]): this; +} + +RoxieResultRef.prototype.publish("request", [], "propertyArray", "Request Fields"); + +export class HipieResultRef extends RoxieResultRef { + + fullUrl(_: string): this { + const info = parseUrl(_); + this.datasource().service().url(info.url); + this.datasource().service().querySet(info.querySet); + this.datasource().service().queryID(info.queryID); + return this; + } + + formatRequest(): { [key: string]: any } { + const _request = super.formatRequest(); + const request: { [key: string]: any } = {}; + for (const key in _request) { + request[key] = _request[key]; + request[`${key}_changed`] = true; + } + return request; + } +} +HipieResultRef.prototype._class += " HipieResultRef"; \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/sampledata.json b/packages/marshaller/src/ddl2/activities/sampledata.json new file mode 100644 index 0000000000..9466d72a86 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/sampledata.json @@ -0,0 +1,16265 @@ +[ + { + "State": "CT", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "6372", + "Submission Date": "2010-07-27T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "27" + }, + { + "State": "SC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2850", + "Submission Date": "2010-04-22T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "22" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4083", + "Submission Date": "2010-05-25T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "25" + }, + { + "State": "OH", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1200", + "Submission Date": "2010-07-23T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1907", + "Submission Date": "2010-08-09T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "967", + "Submission Date": "2010-09-24T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "11000", + "Submission Date": "2010-10-01T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8200", + "Submission Date": "2010-11-30T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "30" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-12-21T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "21" + }, + { + "State": "SC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2717", + "Submission Date": "2011-04-12T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "700", + "Submission Date": "2011-07-22T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2000", + "Submission Date": "2011-12-09T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2012-04-12T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "12" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2012-04-16T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1655", + "Submission Date": "2012-05-04T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "IA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3000", + "Submission Date": "2012-05-11T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "13074", + "Submission Date": "2012-10-08T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "8" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2012-10-29T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "29" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1100", + "Submission Date": "2012-11-29T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1483", + "Submission Date": "2013-01-08T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "LA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "16988", + "Submission Date": "2013-01-31T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "31" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "189489", + "Submission Date": "2013-05-07T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "750", + "Submission Date": "2013-05-07T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1586", + "Submission Date": "2013-10-04T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "606", + "Submission Date": "2013-10-14T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "FL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "603", + "Submission Date": "2013-10-29T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "29" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3534", + "Submission Date": "2014-03-04T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "4" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1376", + "Submission Date": "2014-08-26T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "26" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1778", + "Submission Date": "2014-11-25T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "25" + }, + { + "State": "MS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "19000", + "Submission Date": "2015-02-04T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "4" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5000", + "Submission Date": "2015-02-05T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1430", + "Submission Date": "2010-04-28T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2011-06-09T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "OK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1950", + "Submission Date": "2010-11-29T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "29" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "49714", + "Submission Date": "2014-08-15T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "17300", + "Submission Date": "2013-04-30T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "30" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "727", + "Submission Date": "2014-10-22T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6800", + "Submission Date": "2010-04-05T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "716", + "Submission Date": "2010-11-02T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "2" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1215", + "Submission Date": "2011-04-14T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1192", + "Submission Date": "2011-06-10T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "518", + "Submission Date": "2011-09-23T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6831", + "Submission Date": "2012-04-06T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "TN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1102", + "Submission Date": "2012-05-31T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "31" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6262", + "Submission Date": "2012-11-07T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "14829", + "Submission Date": "2013-04-29T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "29" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4718", + "Submission Date": "2013-07-10T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1674", + "Submission Date": "2013-12-20T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13074", + "Submission Date": "2014-02-12T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "12" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "979", + "Submission Date": "2014-04-09T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "9" + }, + { + "State": "CT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "527", + "Submission Date": "2014-04-09T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "9" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "617", + "Submission Date": "2014-04-18T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1845", + "Submission Date": "2014-04-29T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "29" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "605", + "Submission Date": "2014-08-06T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "WY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1607", + "Submission Date": "2014-12-01T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "1" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "680", + "Submission Date": "2015-02-09T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "955", + "Submission Date": "2015-02-09T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4668", + "Submission Date": "2015-03-03T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "650", + "Submission Date": "2015-03-20T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2473", + "Submission Date": "2015-03-20T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "627", + "Submission Date": "2015-03-24T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2584", + "Submission Date": "2015-04-23T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "23" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "864", + "Submission Date": "2015-04-28T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1138", + "Submission Date": "2015-05-01T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1339", + "Submission Date": "2015-05-06T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "UT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2600", + "Submission Date": "2013-03-22T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8000", + "Submission Date": "2010-04-02T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "2" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "657", + "Submission Date": "2010-08-05T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10000", + "Submission Date": "2014-08-15T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "83000", + "Submission Date": "2009-12-08T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2009", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "RI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "528", + "Submission Date": "2010-02-16T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "16" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3800", + "Submission Date": "2010-03-17T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "17" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "660", + "Submission Date": "2010-04-09T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2628", + "Submission Date": "2010-05-20T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "MN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "16291", + "Submission Date": "2010-06-04T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-06-29T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "29" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2047", + "Submission Date": "2010-07-08T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "8" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1097", + "Submission Date": "2010-07-17T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Sat", + "Submission Day": "17" + }, + { + "State": "SC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1270", + "Submission Date": "2010-09-20T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "20" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2900", + "Submission Date": "2011-12-07T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "11081", + "Submission Date": "2011-12-17T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Sat", + "Submission Day": "17" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1700", + "Submission Date": "2012-01-13T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "11646", + "Submission Date": "2012-01-19T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "MN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "6678", + "Submission Date": "2012-02-01T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "1" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1366", + "Submission Date": "2012-02-08T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1182", + "Submission Date": "2012-03-06T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "6" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3482", + "Submission Date": "2012-03-23T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "AR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2863", + "Submission Date": "2012-12-20T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "566", + "Submission Date": "2013-02-13T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "13" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "187533", + "Submission Date": "2013-07-01T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "1" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "8331", + "Submission Date": "2013-07-02T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "2" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3133", + "Submission Date": "2013-07-08T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "8" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1033", + "Submission Date": "2013-08-16T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "16" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1471", + "Submission Date": "2013-08-22T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "22" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1015", + "Submission Date": "2013-10-03T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "6284", + "Submission Date": "2013-11-01T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "17350", + "Submission Date": "2013-12-06T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2826", + "Submission Date": "2013-12-21T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Sat", + "Submission Day": "21" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1683", + "Submission Date": "2013-12-23T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "MI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3000", + "Submission Date": "2014-01-06T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "6" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "836", + "Submission Date": "2014-04-04T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "NV", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4744", + "Submission Date": "2014-05-10T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Sat", + "Submission Day": "10" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "160000", + "Submission Date": "2014-12-15T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1368", + "Submission Date": "2013-02-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "ND", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2013-11-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1444", + "Submission Date": "2012-01-23T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "IL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "754", + "Submission Date": "2012-08-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "21" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "64846", + "Submission Date": "2012-09-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "WA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3104", + "Submission Date": "2014-02-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "11" + }, + { + "State": "RI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2082", + "Submission Date": "2013-03-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2009-10-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2009", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "DC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3400", + "Submission Date": "2010-01-08T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "MD", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "15000", + "Submission Date": "2010-01-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "11" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1907", + "Submission Date": "2010-02-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "17" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "605", + "Submission Date": "2010-02-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "17" + }, + { + "State": "TN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3900", + "Submission Date": "2010-02-19T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "19" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2010-02-25T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "25" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "554", + "Submission Date": "2010-03-03T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "RI", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "12000", + "Submission Date": "2010-04-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "649", + "Submission Date": "2010-05-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "568", + "Submission Date": "2010-05-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2631", + "Submission Date": "2010-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1590", + "Submission Date": "2010-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "24750", + "Submission Date": "2010-08-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "507", + "Submission Date": "2010-09-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "RI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1361", + "Submission Date": "2010-09-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "33000", + "Submission Date": "2010-09-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "17" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2200", + "Submission Date": "2010-10-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "5" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1500", + "Submission Date": "2010-11-16T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "16" + }, + { + "State": "MD", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "800", + "Submission Date": "2010-12-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "546", + "Submission Date": "2011-02-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "7" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3100", + "Submission Date": "2011-02-09T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "9" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "566", + "Submission Date": "2011-04-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1388", + "Submission Date": "2011-05-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "550", + "Submission Date": "2011-05-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "PR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6006", + "Submission Date": "2011-05-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7500", + "Submission Date": "2011-07-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "IL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "501", + "Submission Date": "2011-07-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "28" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1800", + "Submission Date": "2011-09-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "PR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2011-09-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2541", + "Submission Date": "2011-09-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "14" + }, + { + "State": "MS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1797", + "Submission Date": "2011-09-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "20" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2600", + "Submission Date": "2011-09-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "26" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "731", + "Submission Date": "2011-09-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2200", + "Submission Date": "2011-10-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "25" + }, + { + "State": "MI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1100", + "Submission Date": "2011-10-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "NM", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1537", + "Submission Date": "2011-11-13T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Sun", + "Submission Day": "13" + }, + { + "State": "NE", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "611", + "Submission Date": "2011-12-09T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "NH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "771", + "Submission Date": "2012-01-16T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1287", + "Submission Date": "2012-02-13T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "13" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1431", + "Submission Date": "2012-03-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "12" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "875", + "Submission Date": "2012-03-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "14" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "712", + "Submission Date": "2012-03-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "502", + "Submission Date": "2012-04-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "4" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "750", + "Submission Date": "2012-04-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "550", + "Submission Date": "2012-04-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "750", + "Submission Date": "2012-05-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "WV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2905", + "Submission Date": "2012-05-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "745", + "Submission Date": "2012-05-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1409", + "Submission Date": "2012-06-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1500", + "Submission Date": "2012-07-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "12" + }, + { + "State": "IA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1298", + "Submission Date": "2012-07-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1240", + "Submission Date": "2012-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "30" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "638", + "Submission Date": "2012-10-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "23" + }, + { + "State": "RI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "955", + "Submission Date": "2012-10-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "26" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "508", + "Submission Date": "2012-11-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "2" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1306", + "Submission Date": "2012-11-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "27" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4907", + "Submission Date": "2012-12-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "35488", + "Submission Date": "2012-12-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1771", + "Submission Date": "2013-01-02T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "2" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "725", + "Submission Date": "2013-01-22T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "22" + }, + { + "State": "WI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2400", + "Submission Date": "2013-01-25T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "686", + "Submission Date": "2013-02-25T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "OH", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2261", + "Submission Date": "2013-03-01T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "527", + "Submission Date": "2013-03-04T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "554", + "Submission Date": "2013-04-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "589", + "Submission Date": "2013-04-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "11" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1093", + "Submission Date": "2013-06-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5200", + "Submission Date": "2013-06-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "24" + }, + { + "State": "AZ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4305", + "Submission Date": "2013-07-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "2" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2203", + "Submission Date": "2013-07-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2764", + "Submission Date": "2013-07-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2350", + "Submission Date": "2013-10-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "25513", + "Submission Date": "2014-01-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "858", + "Submission Date": "2014-01-16T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "MT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "543", + "Submission Date": "2014-03-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "24" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "75026", + "Submission Date": "2014-04-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "629", + "Submission Date": "2014-04-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5696", + "Submission Date": "2014-04-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "30" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2589", + "Submission Date": "2014-07-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "661", + "Submission Date": "2014-07-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "16" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "522", + "Submission Date": "2014-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "30" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2014-08-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "18" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2350", + "Submission Date": "2014-08-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "566", + "Submission Date": "2014-09-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "4" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "800", + "Submission Date": "2014-09-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "20000", + "Submission Date": "2014-10-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1740", + "Submission Date": "2014-10-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2691", + "Submission Date": "2014-11-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "860", + "Submission Date": "2014-11-19T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "19" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4920", + "Submission Date": "2015-01-16T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "16" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1342", + "Submission Date": "2015-03-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "MI", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3903", + "Submission Date": "2015-03-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "17" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "826", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "880", + "Submission Date": "2015-04-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "654", + "Submission Date": "2011-05-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "579", + "Submission Date": "2011-09-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "700", + "Submission Date": "2011-10-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1423", + "Submission Date": "2012-01-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1087", + "Submission Date": "2014-03-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2523", + "Submission Date": "2014-04-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2828", + "Submission Date": "2014-05-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "568", + "Submission Date": "2014-10-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "845", + "Submission Date": "2010-11-12T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "771", + "Submission Date": "2010-11-25T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "25" + }, + { + "State": "MI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "9475", + "Submission Date": "2010-12-03T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "AZ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4500", + "Submission Date": "2011-03-01T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "1" + }, + { + "State": "MD", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "765", + "Submission Date": "2011-03-18T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "WV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1470", + "Submission Date": "2011-03-30T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "30" + }, + { + "State": "AL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "13412", + "Submission Date": "2011-05-25T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "WV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "950", + "Submission Date": "2011-06-16T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "694", + "Submission Date": "2011-06-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "880", + "Submission Date": "2011-07-08T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4573", + "Submission Date": "2011-07-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "UT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1378", + "Submission Date": "2011-07-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1500", + "Submission Date": "2011-07-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "WA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3950", + "Submission Date": "2011-08-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "TN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1770", + "Submission Date": "2011-11-28T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "28" + }, + { + "State": "DC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1549", + "Submission Date": "2012-02-15T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "MI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "555", + "Submission Date": "2012-04-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1370", + "Submission Date": "2012-11-29T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "OH", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "635", + "Submission Date": "2013-01-08T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "AZ", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "852", + "Submission Date": "2013-01-08T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3667", + "Submission Date": "2013-02-19T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "697", + "Submission Date": "2013-03-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2400", + "Submission Date": "2013-03-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3794", + "Submission Date": "2013-04-05T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "959", + "Submission Date": "2013-06-14T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "MO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1357", + "Submission Date": "2013-08-13T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "MO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "25461", + "Submission Date": "2013-09-20T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4330", + "Submission Date": "2013-10-04T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "NC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "687", + "Submission Date": "2013-11-07T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "7" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "13336", + "Submission Date": "2013-11-08T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "OH", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1420", + "Submission Date": "2014-01-27T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "FL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "580", + "Submission Date": "2014-03-31T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "31" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1144", + "Submission Date": "2014-04-14T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "DC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2200", + "Submission Date": "2014-04-24T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "24" + }, + { + "State": "IA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "862", + "Submission Date": "2014-04-25T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "PR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "11531", + "Submission Date": "2014-05-18T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Sun", + "Submission Day": "18" + }, + { + "State": "PR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "56853", + "Submission Date": "2014-05-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "592", + "Submission Date": "2014-07-04T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "63325", + "Submission Date": "2014-07-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "9" + }, + { + "State": "MN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "500", + "Submission Date": "2014-07-17T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "802", + "Submission Date": "2014-08-27T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "27" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10000", + "Submission Date": "2014-09-04T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "4" + }, + { + "State": "IN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1464", + "Submission Date": "2014-09-08T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "8" + }, + { + "State": "SC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3637", + "Submission Date": "2014-09-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1866", + "Submission Date": "2014-09-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2657", + "Submission Date": "2014-09-18T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1667", + "Submission Date": "2014-10-07T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4000", + "Submission Date": "2014-10-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1872", + "Submission Date": "2014-10-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10058", + "Submission Date": "2014-10-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4469", + "Submission Date": "2014-11-25T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "25" + }, + { + "State": "MD", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "630", + "Submission Date": "2015-01-29T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "63325", + "Submission Date": "2015-02-27T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2207", + "Submission Date": "2015-03-05T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1406", + "Submission Date": "2015-03-20T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "508", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "TN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "862", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "GA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "958", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "838", + "Submission Date": "2015-04-06T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "6" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2984", + "Submission Date": "2015-04-13T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "13" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2015-04-27T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "GA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "6166", + "Submission Date": "2015-05-15T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8300", + "Submission Date": "2015-05-21T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "21" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3403", + "Submission Date": "2015-05-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "WA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2700", + "Submission Date": "2011-06-08T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1288", + "Submission Date": "2011-06-23T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "23" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "551", + "Submission Date": "2011-10-28T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1300", + "Submission Date": "2010-01-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "28" + }, + { + "State": "MN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "735", + "Submission Date": "2010-04-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "27" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8000", + "Submission Date": "2011-05-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5000", + "Submission Date": "2011-11-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2345", + "Submission Date": "2015-06-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7448", + "Submission Date": "2015-03-11T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2015-06-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Paper/Films", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3800", + "Submission Date": "2010-01-18T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "18" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1711", + "Submission Date": "2010-08-16T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1200", + "Submission Date": "2010-08-27T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "PA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "808", + "Submission Date": "2010-12-30T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "30" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "16200", + "Submission Date": "2011-01-18T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "18" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2291", + "Submission Date": "2011-02-21T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "21" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2777", + "Submission Date": "2011-02-23T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4000", + "Submission Date": "2011-09-22T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "22" + }, + { + "State": "CT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1631", + "Submission Date": "2011-10-03T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "3" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "29000", + "Submission Date": "2010-07-06T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "6" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "24600", + "Submission Date": "2010-12-29T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9922", + "Submission Date": "2011-02-13T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Sun", + "Submission Day": "13" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1986", + "Submission Date": "2011-06-02T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "11440", + "Submission Date": "2010-08-05T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "AK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "501", + "Submission Date": "2009-10-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2009", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "15500", + "Submission Date": "2010-01-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "21000", + "Submission Date": "2010-03-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5148", + "Submission Date": "2010-04-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "26" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "180111", + "Submission Date": "2010-04-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "800", + "Submission Date": "2010-07-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-08-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "956", + "Submission Date": "2010-08-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "AK", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2000", + "Submission Date": "2010-09-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1474", + "Submission Date": "2010-09-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "23" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1474", + "Submission Date": "2010-09-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "23" + }, + { + "State": "AR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-10-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "18" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1250", + "Submission Date": "2010-12-22T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2010-12-30T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "30" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12009", + "Submission Date": "2011-01-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8241", + "Submission Date": "2011-01-25T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "25" + }, + { + "State": "FL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2700", + "Submission Date": "2011-02-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "635", + "Submission Date": "2011-03-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "31" + }, + { + "State": "", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10000", + "Submission Date": "2011-04-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "OR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "17000", + "Submission Date": "2011-06-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "SC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1280", + "Submission Date": "2011-06-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1105", + "Submission Date": "2011-06-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "17" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "8795", + "Submission Date": "2011-08-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "8" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "63425", + "Submission Date": "2011-08-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "32008", + "Submission Date": "2011-08-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2059", + "Submission Date": "2011-09-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "8" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2200", + "Submission Date": "2011-10-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "567", + "Submission Date": "2011-10-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "31" + }, + { + "State": "CA", + "Covered Entity Type": "", + "Individuals Affected": "2761", + "Submission Date": "2011-11-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "115000", + "Submission Date": "2010-11-09T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2015-01-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2260", + "Submission Date": "2014-03-17T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "17" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "857", + "Submission Date": "2010-09-07T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "IA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "19222", + "Submission Date": "2010-09-11T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Sat", + "Submission Day": "11" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "878", + "Submission Date": "2011-11-23T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2088", + "Submission Date": "2012-02-20T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "20" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9565", + "Submission Date": "2012-04-09T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3900", + "Submission Date": "2012-05-14T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "824", + "Submission Date": "2012-06-04T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2917", + "Submission Date": "2012-07-17T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "17" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2264", + "Submission Date": "2012-08-17T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "17" + }, + { + "State": "NV", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5713", + "Submission Date": "2012-09-14T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5748", + "Submission Date": "2012-11-16T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "16" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1846", + "Submission Date": "2012-11-30T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "6332", + "Submission Date": "2013-03-06T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "537", + "Submission Date": "2013-05-06T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "6" + }, + { + "State": "NE", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2125", + "Submission Date": "2013-06-26T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2700", + "Submission Date": "2013-07-20T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Sat", + "Submission Day": "20" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "610", + "Submission Date": "2013-10-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "21" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1167", + "Submission Date": "2013-11-01T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2279", + "Submission Date": "2013-11-13T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "13" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1039", + "Submission Date": "2013-11-19T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "49000", + "Submission Date": "2013-11-22T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "9642", + "Submission Date": "2013-12-12T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "12" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2172", + "Submission Date": "2014-01-22T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "WI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "41437", + "Submission Date": "2014-01-30T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "30" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3598", + "Submission Date": "2014-01-31T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "31" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "586", + "Submission Date": "2014-03-24T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "24" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "793", + "Submission Date": "2014-04-14T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "914", + "Submission Date": "2014-09-09T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "507", + "Submission Date": "2014-10-28T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5534", + "Submission Date": "2014-03-27T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "27" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3200", + "Submission Date": "2013-08-19T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "19" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "33702", + "Submission Date": "2014-06-13T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2533", + "Submission Date": "2012-07-13T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10000", + "Submission Date": "2009-12-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2009", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2773", + "Submission Date": "2010-04-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "1" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2563", + "Submission Date": "2010-07-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "669", + "Submission Date": "2010-07-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "15" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3630", + "Submission Date": "2010-08-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "638", + "Submission Date": "2011-08-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1219", + "Submission Date": "2012-01-30T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "30" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1972", + "Submission Date": "2012-03-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "16" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2557", + "Submission Date": "2012-06-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "55000", + "Submission Date": "2012-08-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4873", + "Submission Date": "2012-09-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2376", + "Submission Date": "2012-10-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "14511", + "Submission Date": "2012-11-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "716", + "Submission Date": "2013-02-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "28187", + "Submission Date": "2013-03-01T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3800", + "Submission Date": "2013-05-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "1" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "22000", + "Submission Date": "2013-05-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "WI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9328", + "Submission Date": "2013-11-18T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "18" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "535", + "Submission Date": "2013-12-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4676", + "Submission Date": "2014-02-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5499", + "Submission Date": "2014-03-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "MI", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2595", + "Submission Date": "2014-04-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7911", + "Submission Date": "2014-04-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "ID", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6900", + "Submission Date": "2014-04-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "KY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2962", + "Submission Date": "2014-05-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10993", + "Submission Date": "2014-08-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "843", + "Submission Date": "2014-09-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5117", + "Submission Date": "2015-01-23T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "56694", + "Submission Date": "2015-02-02T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "2" + }, + { + "State": "IN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "38351", + "Submission Date": "2015-03-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "940", + "Submission Date": "2013-08-05T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1700", + "Submission Date": "2014-01-21T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "21" + }, + { + "State": "KY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4077", + "Submission Date": "2014-09-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "22" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "835", + "Submission Date": "2014-10-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "616", + "Submission Date": "2014-12-12T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "874", + "Submission Date": "2015-04-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Portable Electronic Device", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "660", + "Submission Date": "2012-02-14T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "14" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1290", + "Submission Date": "2013-09-06T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "FL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1831", + "Submission Date": "2014-06-12T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "12" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "151626", + "Submission Date": "2015-03-18T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "18" + }, + { + "State": "MT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7038", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "11000", + "Submission Date": "2014-06-19T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2011-04-28T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "28" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1031", + "Submission Date": "2011-05-19T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5388", + "Submission Date": "2013-05-20T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "20" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "277014", + "Submission Date": "2013-07-11T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "11" + }, + { + "State": "SC", + "Covered Entity Type": "Healthcare Clearing House", + "Individuals Affected": "4204", + "Submission Date": "2013-09-13T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3529", + "Submission Date": "2014-07-25T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "28300", + "Submission Date": "2014-08-12T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "720", + "Submission Date": "2014-08-28T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "28" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1674", + "Submission Date": "2014-08-13T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "13" + }, + { + "State": "", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5220", + "Submission Date": "2010-05-24T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "24" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "14000", + "Submission Date": "2010-06-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "21" + }, + { + "State": "", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1073", + "Submission Date": "2010-07-30T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "ID", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5500", + "Submission Date": "2010-08-10T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1055489", + "Submission Date": "2011-10-07T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "AR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1472", + "Submission Date": "2011-10-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4900000", + "Submission Date": "2011-11-04T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "772", + "Submission Date": "2011-12-01T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "1" + }, + { + "State": "OK", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "844", + "Submission Date": "2012-01-20T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "RI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "14004", + "Submission Date": "2012-11-05T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1184", + "Submission Date": "2013-01-18T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4268", + "Submission Date": "2013-09-13T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "36400", + "Submission Date": "2014-08-07T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "7" + }, + { + "State": "SD", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "620", + "Submission Date": "2014-07-15T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "IA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7335", + "Submission Date": "2013-06-26T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "83945", + "Submission Date": "2010-04-05T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "WI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "600", + "Submission Date": "2010-04-16T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "16" + }, + { + "State": "PA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "560", + "Submission Date": "2010-08-03T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "MD", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "692", + "Submission Date": "2010-10-06T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1700", + "Submission Date": "2012-02-08T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "FL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "9497", + "Submission Date": "2012-04-13T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "18000", + "Submission Date": "2012-11-17T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Sat", + "Submission Day": "17" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2575", + "Submission Date": "2012-11-26T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "26" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1386", + "Submission Date": "2013-05-24T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7300", + "Submission Date": "2013-11-08T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "AL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1085", + "Submission Date": "2014-01-24T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "600", + "Submission Date": "2014-02-28T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "55207", + "Submission Date": "2014-03-05T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "WI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1400", + "Submission Date": "2014-04-18T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "15265", + "Submission Date": "2014-04-29T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "29" + }, + { + "State": "TN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1717", + "Submission Date": "2014-08-29T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "8845", + "Submission Date": "2014-02-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "CO", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "11551", + "Submission Date": "2014-08-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "315000", + "Submission Date": "2012-04-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "18" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "596", + "Submission Date": "2009-12-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2009", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1076", + "Submission Date": "2010-01-08T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "ID", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2562", + "Submission Date": "2010-01-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10000", + "Submission Date": "2010-01-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "689", + "Submission Date": "2010-01-25T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "UT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5700", + "Submission Date": "2010-02-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "344579", + "Submission Date": "2010-04-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "14" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1874", + "Submission Date": "2010-04-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "27" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "130495", + "Submission Date": "2010-06-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2500", + "Submission Date": "2010-10-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "26" + }, + { + "State": "TN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1023209", + "Submission Date": "2010-11-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "1" + }, + { + "State": "MO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4800", + "Submission Date": "2011-01-18T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "18" + }, + { + "State": "CT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "93500", + "Submission Date": "2011-04-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "5" + }, + { + "State": "CO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3589", + "Submission Date": "2011-06-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5848", + "Submission Date": "2011-08-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "PR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2209", + "Submission Date": "2011-09-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "CT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3994", + "Submission Date": "2011-10-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "11" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3150", + "Submission Date": "2011-10-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2011-10-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "17" + }, + { + "State": "MO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7059", + "Submission Date": "2011-10-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Sat", + "Submission Day": "22" + }, + { + "State": "KS", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "8275", + "Submission Date": "2011-11-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10705", + "Submission Date": "2011-12-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4693", + "Submission Date": "2011-12-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "15" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "703", + "Submission Date": "2012-02-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2559", + "Submission Date": "2012-03-02T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "2" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2000", + "Submission Date": "2012-04-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1900", + "Submission Date": "2012-05-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2012-05-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Sat", + "Submission Day": "26" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1504", + "Submission Date": "2012-07-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "702", + "Submission Date": "2012-07-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "31" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3440", + "Submission Date": "2012-10-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2500", + "Submission Date": "2013-05-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5497", + "Submission Date": "2013-08-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "AZ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1456", + "Submission Date": "2013-11-13T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "13" + }, + { + "State": "OH", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1139", + "Submission Date": "2014-02-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5000", + "Submission Date": "2014-03-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "PR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "5795", + "Submission Date": "2014-04-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "2" + }, + { + "State": "PR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "17776", + "Submission Date": "2014-04-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "MS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3750", + "Submission Date": "2014-04-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "16" + }, + { + "State": "MA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "8830", + "Submission Date": "2014-04-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "24" + }, + { + "State": "FL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "9255", + "Submission Date": "2014-06-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1863", + "Submission Date": "2014-10-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "14100", + "Submission Date": "2015-01-30T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2500", + "Submission Date": "2015-03-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1787", + "Submission Date": "2015-04-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2259", + "Submission Date": "2015-05-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "NC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "20512", + "Submission Date": "2015-05-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "AR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1900", + "Submission Date": "2013-05-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "23" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "585", + "Submission Date": "2010-12-27T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2250", + "Submission Date": "2011-02-11T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "MO", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "935", + "Submission Date": "2011-04-08T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "675", + "Submission Date": "2011-04-19T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "MO", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "850", + "Submission Date": "2011-05-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "FL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3463", + "Submission Date": "2011-06-17T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "17" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "19651", + "Submission Date": "2011-08-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "29" + }, + { + "State": "MT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2700", + "Submission Date": "2012-01-11T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "MD", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "632", + "Submission Date": "2012-02-28T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1370", + "Submission Date": "2012-03-23T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "AR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7121", + "Submission Date": "2012-04-20T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "MN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "19100", + "Submission Date": "2012-05-18T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "591", + "Submission Date": "2012-05-18T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "OH", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "15000", + "Submission Date": "2012-05-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "22" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "28187", + "Submission Date": "2012-12-21T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2643", + "Submission Date": "2012-12-23T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Sun", + "Submission Day": "23" + }, + { + "State": "WI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "43549", + "Submission Date": "2013-02-12T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "500", + "Submission Date": "2013-03-01T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3131", + "Submission Date": "2013-04-12T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "UT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "857", + "Submission Date": "2013-04-26T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "26" + }, + { + "State": "MO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4560", + "Submission Date": "2013-07-15T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1361", + "Submission Date": "2013-07-28T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Sun", + "Submission Day": "28" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1315", + "Submission Date": "2013-11-08T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "44000", + "Submission Date": "2013-12-06T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "NC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "48752", + "Submission Date": "2014-01-06T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "6" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1000", + "Submission Date": "2014-03-31T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "31" + }, + { + "State": "MO", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2546", + "Submission Date": "2014-04-11T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "MD", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "5000", + "Submission Date": "2014-04-15T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "17914", + "Submission Date": "2014-05-19T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "19" + }, + { + "State": "MD", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "620", + "Submission Date": "2014-06-19T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "697", + "Submission Date": "2014-09-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "MI", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "6302", + "Submission Date": "2014-10-01T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "1" + }, + { + "State": "AZ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "15380", + "Submission Date": "2014-10-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12621", + "Submission Date": "2014-12-12T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "TN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "79000", + "Submission Date": "2015-01-13T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3000", + "Submission Date": "2015-02-18T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "18" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "8700", + "Submission Date": "2015-02-20T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8700", + "Submission Date": "2015-03-20T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1458", + "Submission Date": "2015-03-31T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "31" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "503", + "Submission Date": "2015-06-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Other", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "FL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "7366", + "Submission Date": "2011-03-03T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1900000", + "Submission Date": "2011-04-14T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "915", + "Submission Date": "2013-09-16T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "953", + "Submission Date": "2014-01-13T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Other", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "13" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6871", + "Submission Date": "2015-06-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6601", + "Submission Date": "2012-12-10T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "10" + }, + { + "State": "WY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "9023", + "Submission Date": "2010-03-02T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "2" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "957", + "Submission Date": "2010-03-26T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "26" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "708", + "Submission Date": "2010-06-01T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "1" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "27000", + "Submission Date": "2010-07-23T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "IN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "31700", + "Submission Date": "2010-07-30T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9493", + "Submission Date": "2010-10-15T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "NH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "231400", + "Submission Date": "2011-01-10T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "10" + }, + { + "State": "KY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "18871", + "Submission Date": "2011-02-07T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "7" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6000", + "Submission Date": "2011-04-21T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "21" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5000", + "Submission Date": "2011-07-11T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "11" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2021", + "Submission Date": "2011-07-19T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "AR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3116", + "Submission Date": "2011-09-07T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "UT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "780000", + "Submission Date": "2012-04-11T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3000", + "Submission Date": "2012-05-03T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2365", + "Submission Date": "2012-09-12T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "12" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2900", + "Submission Date": "2012-10-23T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "23" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4343", + "Submission Date": "2012-12-28T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4125", + "Submission Date": "2013-01-07T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "7" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7250", + "Submission Date": "2013-01-10T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4100", + "Submission Date": "2013-01-10T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "6400", + "Submission Date": "2013-03-12T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8727", + "Submission Date": "2013-03-20T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "20" + }, + { + "State": "NC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "9988", + "Submission Date": "2013-05-08T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "NC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1924", + "Submission Date": "2013-05-10T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7803", + "Submission Date": "2013-05-20T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "20" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2029", + "Submission Date": "2013-09-13T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "998", + "Submission Date": "2013-09-13T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7120", + "Submission Date": "2013-10-09T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "9" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3947", + "Submission Date": "2013-10-11T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "59000", + "Submission Date": "2013-12-10T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "MS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1489", + "Submission Date": "2014-01-10T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "405000", + "Submission Date": "2014-02-05T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3300", + "Submission Date": "2014-03-05T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "AL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1179", + "Submission Date": "2014-03-10T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5178", + "Submission Date": "2014-04-02T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "2" + }, + { + "State": "UT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "9800", + "Submission Date": "2014-04-24T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "24" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1361", + "Submission Date": "2014-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "MT", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1062509", + "Submission Date": "2014-07-07T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "7" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4487", + "Submission Date": "2014-07-31T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "31" + }, + { + "State": "UT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "31677", + "Submission Date": "2014-08-07T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "7" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10104", + "Submission Date": "2014-08-08T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "60582", + "Submission Date": "2014-08-08T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1251", + "Submission Date": "2014-08-12T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6073", + "Submission Date": "2014-08-15T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4500", + "Submission Date": "2014-10-10T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7029", + "Submission Date": "2015-01-07T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "570", + "Submission Date": "2015-03-02T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "2" + }, + { + "State": "GA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "557779", + "Submission Date": "2015-03-02T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "2" + }, + { + "State": "GA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "355127", + "Submission Date": "2015-03-02T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "2" + }, + { + "State": "VA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "697586", + "Submission Date": "2015-03-12T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "12" + }, + { + "State": "IN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "78800000", + "Submission Date": "2015-03-13T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "WA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "11000000", + "Submission Date": "2015-03-17T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "17" + }, + { + "State": "IL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2743", + "Submission Date": "2015-03-19T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "50000", + "Submission Date": "2015-03-23T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "43068", + "Submission Date": "2015-03-24T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "IL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "880", + "Submission Date": "2015-03-24T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1688", + "Submission Date": "2015-03-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "SC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "550", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "IL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "782", + "Submission Date": "2015-04-03T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "MN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "10946", + "Submission Date": "2015-04-03T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "FL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3074", + "Submission Date": "2015-04-07T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "KY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "5440", + "Submission Date": "2015-04-09T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "MO", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "12500", + "Submission Date": "2015-04-16T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "880", + "Submission Date": "2015-04-27T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3321", + "Submission Date": "2015-05-01T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "1" + }, + { + "State": "MD", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1100000", + "Submission Date": "2015-05-20T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "20" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "520", + "Submission Date": "2014-08-14T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4354", + "Submission Date": "2012-07-16T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "27800", + "Submission Date": "2012-12-27T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "27" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13000", + "Submission Date": "2012-10-15T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "475000", + "Submission Date": "2010-11-04T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "4" + }, + { + "State": "MI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "11387", + "Submission Date": "2011-05-26T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1300", + "Submission Date": "2011-09-20T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "20" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "42000", + "Submission Date": "2012-05-01T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "1" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7000", + "Submission Date": "2012-05-08T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "800", + "Submission Date": "2012-09-05T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "MD", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10766", + "Submission Date": "2014-04-17T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "55000", + "Submission Date": "2011-11-02T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "2" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "74944", + "Submission Date": "2014-11-10T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "10" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "22642", + "Submission Date": "2010-09-07T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "750", + "Submission Date": "2012-03-23T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7067", + "Submission Date": "2012-07-25T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "AL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "50918", + "Submission Date": "2014-07-11T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3334", + "Submission Date": "2014-07-23T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "14519", + "Submission Date": "2013-04-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2009-10-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2009", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3500", + "Submission Date": "2010-02-23T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "23" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "40000", + "Submission Date": "2010-05-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "600", + "Submission Date": "2010-06-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "21" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7526", + "Submission Date": "2010-06-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "22" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "25000", + "Submission Date": "2010-08-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6800", + "Submission Date": "2010-09-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1744", + "Submission Date": "2010-11-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "24" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "156000", + "Submission Date": "2011-01-03T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "3" + }, + { + "State": "OK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "84000", + "Submission Date": "2011-04-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "757", + "Submission Date": "2011-10-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "25" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2900", + "Submission Date": "2011-10-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "31" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10480", + "Submission Date": "2012-02-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "961", + "Submission Date": "2012-04-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4800", + "Submission Date": "2012-07-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1017", + "Submission Date": "2012-11-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "1" + }, + { + "State": "VA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2360", + "Submission Date": "2013-04-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "4" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "32000", + "Submission Date": "2013-08-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5000", + "Submission Date": "2013-09-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8000", + "Submission Date": "2013-09-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "517", + "Submission Date": "2013-09-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "30" + }, + { + "State": "OH", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "4230", + "Submission Date": "2014-01-13T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "13" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5370", + "Submission Date": "2014-01-16T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "398000", + "Submission Date": "2014-01-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12000", + "Submission Date": "2014-07-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Sat", + "Submission Day": "12" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4500000", + "Submission Date": "2014-08-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "20" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6141", + "Submission Date": "2014-08-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3500", + "Submission Date": "2014-10-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "76258", + "Submission Date": "2014-11-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13177", + "Submission Date": "2014-11-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "30000", + "Submission Date": "2014-11-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Sat", + "Submission Day": "15" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "47683", + "Submission Date": "2014-11-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "AL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "25764", + "Submission Date": "2014-11-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3224", + "Submission Date": "2015-02-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7700", + "Submission Date": "2015-03-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1678", + "Submission Date": "2013-03-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "532", + "Submission Date": "2013-07-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "31" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "8000", + "Submission Date": "2014-01-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "CT", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2345", + "Submission Date": "2010-11-07T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Sun", + "Submission Day": "7" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1085", + "Submission Date": "2010-12-15T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "WV", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3655", + "Submission Date": "2011-02-16T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "16" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "25330", + "Submission Date": "2011-07-21T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "21" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7226", + "Submission Date": "2011-12-09T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "500", + "Submission Date": "2012-11-29T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "18000", + "Submission Date": "2013-02-18T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "18" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1382", + "Submission Date": "2013-03-08T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "NV", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "32151", + "Submission Date": "2013-08-08T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "8" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "37000", + "Submission Date": "2013-10-25T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Clearing House", + "Individuals Affected": "2300", + "Submission Date": "2013-10-31T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "31" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2080", + "Submission Date": "2013-11-29T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1499", + "Submission Date": "2013-12-16T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "WY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "11935", + "Submission Date": "2013-12-16T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "593", + "Submission Date": "2014-02-13T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10024", + "Submission Date": "2014-02-21T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "520", + "Submission Date": "2014-02-21T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4786", + "Submission Date": "2014-02-21T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1511", + "Submission Date": "2014-02-25T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "25" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1746", + "Submission Date": "2014-03-18T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "18" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "680", + "Submission Date": "2014-07-23T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4000", + "Submission Date": "2014-07-28T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "28" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7016", + "Submission Date": "2014-08-07T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "7" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "307528", + "Submission Date": "2014-10-03T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "585", + "Submission Date": "2014-10-06T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "6" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "35357", + "Submission Date": "2014-10-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "843", + "Submission Date": "2015-06-09T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Network Server", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1200", + "Submission Date": "2010-09-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Sun", + "Submission Day": "19" + }, + { + "State": "OK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "132940", + "Submission Date": "2011-04-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "11" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3553", + "Submission Date": "2013-10-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8294", + "Submission Date": "2013-11-22T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "507", + "Submission Date": "2011-09-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5370", + "Submission Date": "2013-04-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "4" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1432", + "Submission Date": "2011-08-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "25" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "789", + "Submission Date": "2014-09-09T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2185", + "Submission Date": "2011-12-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10000", + "Submission Date": "2012-03-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "12" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7606", + "Submission Date": "2012-03-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "15" + }, + { + "State": "MT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "708", + "Submission Date": "2012-06-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4211", + "Submission Date": "2012-07-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5827", + "Submission Date": "2012-09-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2600", + "Submission Date": "2013-08-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "595", + "Submission Date": "2014-08-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "26" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "999", + "Submission Date": "2014-11-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "17" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2772", + "Submission Date": "2015-02-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "707", + "Submission Date": "2014-09-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "26" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4700", + "Submission Date": "2010-10-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "5" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "850", + "Submission Date": "2012-12-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "DC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3800", + "Submission Date": "2009-11-17T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "17" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1745", + "Submission Date": "2010-06-08T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2013-02-11T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "11" + }, + { + "State": "MS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2013-03-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "21" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9577", + "Submission Date": "2013-05-20T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "20" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4879", + "Submission Date": "2013-12-10T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1233", + "Submission Date": "2015-03-06T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "563", + "Submission Date": "2015-04-10T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "WV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12563", + "Submission Date": "2011-11-08T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "17000", + "Submission Date": "2012-05-18T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "596", + "Submission Date": "2013-08-28T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1891", + "Submission Date": "2013-12-06T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "548", + "Submission Date": "2014-02-26T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5700", + "Submission Date": "2012-05-26T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Sat", + "Submission Day": "26" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1309", + "Submission Date": "2010-08-03T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4100", + "Submission Date": "2012-12-23T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Sun", + "Submission Day": "23" + }, + { + "State": "DE", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1883", + "Submission Date": "2014-01-31T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "31" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "11500", + "Submission Date": "2013-11-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "5" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "6475", + "Submission Date": "2014-02-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "12" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5900", + "Submission Date": "2009-11-23T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "943", + "Submission Date": "2009-11-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "6400", + "Submission Date": "2009-11-25T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "900", + "Submission Date": "2010-01-19T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "812", + "Submission Date": "2010-01-22T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7300", + "Submission Date": "2010-01-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "27" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1100", + "Submission Date": "2010-02-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12580", + "Submission Date": "2010-03-01T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "1" + }, + { + "State": "WI", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "9500", + "Submission Date": "2010-03-03T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "625", + "Submission Date": "2010-03-09T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5080", + "Submission Date": "2010-03-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2600", + "Submission Date": "2010-03-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "23" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2465", + "Submission Date": "2010-03-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Sat", + "Submission Day": "27" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "955", + "Submission Date": "2010-04-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "54165", + "Submission Date": "2010-04-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "19" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3594", + "Submission Date": "2010-04-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "20" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5450", + "Submission Date": "2010-04-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Sat", + "Submission Day": "24" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4200", + "Submission Date": "2010-05-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "11" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "656", + "Submission Date": "2010-05-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "SC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "653", + "Submission Date": "2010-05-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "NE", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "800", + "Submission Date": "2010-05-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-05-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "60998", + "Submission Date": "2010-06-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "1" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1105", + "Submission Date": "2010-06-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "1" + }, + { + "State": "FL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1220000", + "Submission Date": "2010-06-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "3" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2300", + "Submission Date": "2010-06-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10515", + "Submission Date": "2010-06-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "9" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2027", + "Submission Date": "2010-06-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "18" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5893", + "Submission Date": "2010-06-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "28" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3830", + "Submission Date": "2010-07-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "8" + }, + { + "State": "DC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "540", + "Submission Date": "2010-07-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1646", + "Submission Date": "2010-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "694", + "Submission Date": "2010-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13867", + "Submission Date": "2010-08-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2089", + "Submission Date": "2010-08-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "21000", + "Submission Date": "2010-08-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-08-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "18" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7081", + "Submission Date": "2010-08-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2739", + "Submission Date": "2010-09-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1199", + "Submission Date": "2010-09-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "23" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "578", + "Submission Date": "2010-10-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "5" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "585", + "Submission Date": "2010-10-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12000", + "Submission Date": "2010-11-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "11" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "535", + "Submission Date": "2010-11-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1400", + "Submission Date": "2010-11-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3700", + "Submission Date": "2010-11-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "WI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3288", + "Submission Date": "2010-12-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "20" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "757", + "Submission Date": "2010-12-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3159", + "Submission Date": "2010-12-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2200", + "Submission Date": "2011-01-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "11" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "11982", + "Submission Date": "2011-01-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "12" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4486", + "Submission Date": "2011-01-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "24" + }, + { + "State": "MT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "37000", + "Submission Date": "2011-02-08T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8845", + "Submission Date": "2011-03-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "667", + "Submission Date": "2011-03-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "30" + }, + { + "State": "AK", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1700", + "Submission Date": "2011-03-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "31" + }, + { + "State": "NH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5960", + "Submission Date": "2011-05-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "2" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1500", + "Submission Date": "2011-05-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "563", + "Submission Date": "2011-05-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "22001", + "Submission Date": "2011-05-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "620", + "Submission Date": "2011-05-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "17" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "810", + "Submission Date": "2011-06-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "705", + "Submission Date": "2011-06-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "OH", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "78042", + "Submission Date": "2011-06-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "712", + "Submission Date": "2011-07-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3604", + "Submission Date": "2011-07-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "28" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1870", + "Submission Date": "2011-07-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "28" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10345", + "Submission Date": "2011-08-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "17" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1696", + "Submission Date": "2011-09-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "863", + "Submission Date": "2011-09-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "15" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1259", + "Submission Date": "2011-09-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3266", + "Submission Date": "2011-10-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "4" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "599", + "Submission Date": "2011-10-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "11" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "927", + "Submission Date": "2011-10-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "27" + }, + { + "State": "ND", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "650", + "Submission Date": "2011-11-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "17000", + "Submission Date": "2011-12-13T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "WA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "7581", + "Submission Date": "2011-12-23T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "870", + "Submission Date": "2011-12-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2988", + "Submission Date": "2011-12-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1300", + "Submission Date": "2012-01-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7757", + "Submission Date": "2012-01-19T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "549", + "Submission Date": "2012-01-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2012-02-01T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "1" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "14000", + "Submission Date": "2012-02-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "6" + }, + { + "State": "WI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "698", + "Submission Date": "2012-02-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "14" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "728", + "Submission Date": "2012-02-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "NM", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7000", + "Submission Date": "2012-02-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7706", + "Submission Date": "2012-02-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "20000", + "Submission Date": "2012-03-09T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4645", + "Submission Date": "2012-03-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "12" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "577", + "Submission Date": "2012-03-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7923", + "Submission Date": "2012-03-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "513", + "Submission Date": "2012-03-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "15" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4000", + "Submission Date": "2012-05-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "NE", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "3000", + "Submission Date": "2012-05-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "21" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2159", + "Submission Date": "2012-05-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "22" + }, + { + "State": "MD", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1444", + "Submission Date": "2012-06-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4490", + "Submission Date": "2012-06-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "824", + "Submission Date": "2012-06-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "585", + "Submission Date": "2012-07-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3900", + "Submission Date": "2012-07-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "7461", + "Submission Date": "2012-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "30" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "66601", + "Submission Date": "2012-08-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3183", + "Submission Date": "2012-08-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "17" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2012-08-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4000", + "Submission Date": "2012-08-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "31" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "942", + "Submission Date": "2012-09-07T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13000", + "Submission Date": "2012-09-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "65700", + "Submission Date": "2012-10-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "27799", + "Submission Date": "2012-10-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "17" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "116506", + "Submission Date": "2012-10-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "540", + "Submission Date": "2012-11-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "613", + "Submission Date": "2012-11-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "RI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "683", + "Submission Date": "2012-11-30T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "28893", + "Submission Date": "2012-12-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "KY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1090", + "Submission Date": "2012-12-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "56820", + "Submission Date": "2012-12-31T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "31" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1400", + "Submission Date": "2013-01-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "19178", + "Submission Date": "2013-01-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1105", + "Submission Date": "2013-01-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3230", + "Submission Date": "2013-01-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "29021", + "Submission Date": "2013-01-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "24" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1103", + "Submission Date": "2013-02-04T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5822", + "Submission Date": "2013-02-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4027", + "Submission Date": "2013-02-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1819", + "Submission Date": "2013-02-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "778", + "Submission Date": "2013-02-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Sun", + "Submission Day": "17" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "501", + "Submission Date": "2013-02-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "21" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3000", + "Submission Date": "2013-02-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "27" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "18162", + "Submission Date": "2013-03-04T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12299", + "Submission Date": "2013-03-09T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Sat", + "Submission Day": "9" + }, + { + "State": "WA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "629", + "Submission Date": "2013-03-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "SC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7405", + "Submission Date": "2013-04-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1076", + "Submission Date": "2013-04-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "11" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10350", + "Submission Date": "2013-05-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "13" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3164", + "Submission Date": "2013-05-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2434", + "Submission Date": "2013-05-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12900", + "Submission Date": "2013-06-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1955", + "Submission Date": "2013-06-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "PR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "679", + "Submission Date": "2013-06-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "900", + "Submission Date": "2013-07-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1837", + "Submission Date": "2013-08-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "2" + }, + { + "State": "AR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1911", + "Submission Date": "2013-08-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2045", + "Submission Date": "2013-08-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "12" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5690", + "Submission Date": "2013-08-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "15" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1500", + "Submission Date": "2013-09-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2182", + "Submission Date": "2013-09-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1360", + "Submission Date": "2013-09-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "579", + "Submission Date": "2013-09-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "CO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3512", + "Submission Date": "2013-09-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Sat", + "Submission Day": "28" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6932", + "Submission Date": "2013-09-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "30" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2810", + "Submission Date": "2013-10-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "566", + "Submission Date": "2013-10-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "VT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "550", + "Submission Date": "2013-10-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5500", + "Submission Date": "2013-10-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3833", + "Submission Date": "2013-10-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "WI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "631", + "Submission Date": "2013-10-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "729000", + "Submission Date": "2013-10-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1100", + "Submission Date": "2013-11-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "5" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4837", + "Submission Date": "2013-11-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "14" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1300", + "Submission Date": "2013-11-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "950", + "Submission Date": "2013-11-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "26" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4500", + "Submission Date": "2013-12-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "SC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3432", + "Submission Date": "2013-12-18T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "18" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2777", + "Submission Date": "2013-12-19T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12354", + "Submission Date": "2013-12-31T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "31" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "839711", + "Submission Date": "2014-01-03T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "NY", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2500", + "Submission Date": "2014-01-08T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9602", + "Submission Date": "2014-01-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "611", + "Submission Date": "2014-01-24T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3026", + "Submission Date": "2014-02-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "841", + "Submission Date": "2014-02-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1142", + "Submission Date": "2014-02-18T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "18" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3458", + "Submission Date": "2014-02-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1706", + "Submission Date": "2014-03-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Sun", + "Submission Day": "16" + }, + { + "State": "WA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1079", + "Submission Date": "2014-03-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "24" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2014-05-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Sat", + "Submission Day": "10" + }, + { + "State": "OK", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3814", + "Submission Date": "2014-05-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "872", + "Submission Date": "2014-06-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "750", + "Submission Date": "2014-06-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "563", + "Submission Date": "2014-06-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "42713", + "Submission Date": "2014-06-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "SC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "38906", + "Submission Date": "2014-07-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "982", + "Submission Date": "2014-07-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "30" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13646", + "Submission Date": "2014-08-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "33136", + "Submission Date": "2014-09-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "523", + "Submission Date": "2014-09-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "26" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2588", + "Submission Date": "2014-09-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "30" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10793", + "Submission Date": "2014-10-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1320", + "Submission Date": "2014-10-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "6" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3397", + "Submission Date": "2014-10-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2014-10-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13907", + "Submission Date": "2014-10-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "31" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "542", + "Submission Date": "2014-11-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "UT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "623", + "Submission Date": "2014-12-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4500", + "Submission Date": "2014-12-09T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "43890", + "Submission Date": "2015-01-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7925", + "Submission Date": "2015-01-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "678", + "Submission Date": "2015-01-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2153", + "Submission Date": "2015-02-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "600", + "Submission Date": "2015-03-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "19" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3000", + "Submission Date": "2015-04-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4725", + "Submission Date": "2015-05-18T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "18" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "506", + "Submission Date": "2015-05-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "20" + }, + { + "State": "OR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "14000", + "Submission Date": "2015-06-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "1" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "995", + "Submission Date": "2015-06-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "OR", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2300", + "Submission Date": "2012-02-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2012", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "20" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2365", + "Submission Date": "2014-04-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "815", + "Submission Date": "2011-08-18T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Laptop", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10680", + "Submission Date": "2013-10-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Laptop", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "29" + }, + { + "State": "MD", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "214000", + "Submission Date": "2014-04-01T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Laptop", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "1" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1801", + "Submission Date": "2014-06-06T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "DC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2416", + "Submission Date": "2010-05-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2010", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "568", + "Submission Date": "2012-06-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6307", + "Submission Date": "2014-06-25T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "25" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1848", + "Submission Date": "2011-01-12T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "12" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "13877", + "Submission Date": "2014-07-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "29" + }, + { + "State": "NC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "50000", + "Submission Date": "2012-01-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4000", + "Submission Date": "2015-01-07T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "7" + }, + { + "State": "IA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2042", + "Submission Date": "2014-03-10T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "10" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2500", + "Submission Date": "2014-01-03T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "342197", + "Submission Date": "2014-05-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "22" + }, + { + "State": "AL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "768", + "Submission Date": "2010-03-30T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2010", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "30" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5600", + "Submission Date": "2012-12-07T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2269", + "Submission Date": "2014-02-14T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1256", + "Submission Date": "2014-03-31T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "31" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12286", + "Submission Date": "2014-04-22T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "22" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1253", + "Submission Date": "2014-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2308", + "Submission Date": "2014-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1981", + "Submission Date": "2014-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2742", + "Submission Date": "2014-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1326", + "Submission Date": "2014-10-08T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "DC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "18000", + "Submission Date": "2015-02-24T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3952", + "Submission Date": "2015-03-05T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "14177", + "Submission Date": "2015-03-16T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "756", + "Submission Date": "2015-04-10T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "10" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "24967", + "Submission Date": "2015-04-24T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "39000", + "Submission Date": "2015-04-24T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "24" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "306789", + "Submission Date": "2015-05-22T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3200", + "Submission Date": "2012-01-27T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "502", + "Submission Date": "2014-05-19T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "19" + }, + { + "State": "MO", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1127", + "Submission Date": "2013-06-17T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "17" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "610", + "Submission Date": "2009-12-15T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2009", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1001", + "Submission Date": "2010-06-14T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "937", + "Submission Date": "2010-06-24T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "24" + }, + { + "State": "ME", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1920", + "Submission Date": "2013-03-04T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "818", + "Submission Date": "2013-04-25T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "25" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10000", + "Submission Date": "2013-05-14T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "14" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "609", + "Submission Date": "2013-07-05T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "654", + "Submission Date": "2013-08-30T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "30" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1310", + "Submission Date": "2013-10-04T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "NE", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3857", + "Submission Date": "2013-12-11T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "22511", + "Submission Date": "2014-01-11T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Sat", + "Submission Day": "11" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2992", + "Submission Date": "2014-03-28T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8300", + "Submission Date": "2014-03-28T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "IN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1008", + "Submission Date": "2014-05-06T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "6" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1304", + "Submission Date": "2014-06-05T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1175", + "Submission Date": "2014-06-09T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "767", + "Submission Date": "2014-09-17T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "17" + }, + { + "State": "AZ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1296", + "Submission Date": "2014-11-14T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "31980", + "Submission Date": "2014-11-20T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2477", + "Submission Date": "2014-12-08T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "8" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2928", + "Submission Date": "2010-12-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1167", + "Submission Date": "2013-06-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "3" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10228", + "Submission Date": "2013-09-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "GA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "5232", + "Submission Date": "2013-10-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "2" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7606", + "Submission Date": "2013-11-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "12" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1573", + "Submission Date": "2013-12-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7800", + "Submission Date": "2014-03-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "12" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "642", + "Submission Date": "2012-04-03T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "MI", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1229", + "Submission Date": "2012-04-06T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2012-04-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "10" + }, + { + "State": "SC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "228435", + "Submission Date": "2012-04-24T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "MO", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1134", + "Submission Date": "2012-05-11T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "KY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2500", + "Submission Date": "2012-09-19T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "19" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1180", + "Submission Date": "2013-05-07T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "4479", + "Submission Date": "2013-07-05T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3100", + "Submission Date": "2013-10-07T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "7" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1067", + "Submission Date": "2013-10-14T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "AK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1556", + "Submission Date": "2013-10-16T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "16" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "832", + "Submission Date": "2013-12-23T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "CO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1918", + "Submission Date": "2014-01-02T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "657", + "Submission Date": "2014-03-27T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "27" + }, + { + "State": "UT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "643", + "Submission Date": "2014-03-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Sat", + "Submission Day": "29" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "4830", + "Submission Date": "2014-04-24T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "24" + }, + { + "State": "KS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9640", + "Submission Date": "2014-06-05T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "MI", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "2289", + "Submission Date": "2014-06-16T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "16" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "14121", + "Submission Date": "2014-06-24T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "OK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6000", + "Submission Date": "2014-08-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1782", + "Submission Date": "2014-10-30T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "30" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1488", + "Submission Date": "2014-12-12T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1859", + "Submission Date": "2015-01-05T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1285", + "Submission Date": "2015-01-28T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "600", + "Submission Date": "2015-02-12T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "12" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "845", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "873", + "Submission Date": "2015-04-03T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1447", + "Submission Date": "2015-04-17T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "17" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3334", + "Submission Date": "2015-04-28T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "90060", + "Submission Date": "2015-04-28T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3957", + "Submission Date": "2015-06-01T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Email", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "1" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1263", + "Submission Date": "2011-06-09T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Email", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "9" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12937", + "Submission Date": "2012-05-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "24" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2875", + "Submission Date": "2012-08-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2464", + "Submission Date": "2011-11-17T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2387", + "Submission Date": "2014-05-05T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "PA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "800000", + "Submission Date": "2010-07-19T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "19" + }, + { + "State": "MA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1860", + "Submission Date": "2010-01-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "7" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1700000", + "Submission Date": "2011-02-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "16446", + "Submission Date": "2014-02-10T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "10" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2318", + "Submission Date": "2014-07-31T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "31" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1562", + "Submission Date": "2011-07-08T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "8" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "594", + "Submission Date": "2014-05-28T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12000", + "Submission Date": "2015-06-10T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2600", + "Submission Date": "2011-10-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "11" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3936", + "Submission Date": "2014-11-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "7" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "504", + "Submission Date": "2014-02-26T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "26" + }, + { + "State": "KY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2014-03-20T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "MN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1740", + "Submission Date": "2010-09-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "105646", + "Submission Date": "2012-08-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2560", + "Submission Date": "2012-11-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1025", + "Submission Date": "2013-04-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "2" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12542", + "Submission Date": "2013-04-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "3" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5764", + "Submission Date": "2013-05-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2014-06-24T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "24" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1200", + "Submission Date": "2014-06-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "26" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10271", + "Submission Date": "2012-11-05T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "5" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5875", + "Submission Date": "2013-05-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "30" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "651", + "Submission Date": "2013-11-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Sat", + "Submission Day": "2" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3861", + "Submission Date": "2014-01-16T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "FL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "82601", + "Submission Date": "2014-09-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "9" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "12784", + "Submission Date": "2011-10-13T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2462", + "Submission Date": "2012-07-05T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "5" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "678", + "Submission Date": "2013-01-22T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "22" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "834", + "Submission Date": "2013-03-02T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Sat", + "Submission Day": "2" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2864", + "Submission Date": "2013-07-11T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "11" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1396", + "Submission Date": "2013-08-12T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "12" + }, + { + "State": "OR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "647", + "Submission Date": "2013-09-03T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1009", + "Submission Date": "2013-09-20T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "IA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1825", + "Submission Date": "2013-10-02T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "2" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1279", + "Submission Date": "2013-11-27T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "27" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2874", + "Submission Date": "2014-06-13T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "675", + "Submission Date": "2014-09-12T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1449", + "Submission Date": "2014-11-20T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "845", + "Submission Date": "2015-01-23T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "NV", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8791", + "Submission Date": "2015-04-03T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "567", + "Submission Date": "2015-05-28T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "28" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "654", + "Submission Date": "2011-03-23T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Electronic Medical Record", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "23" + }, + { + "State": "UT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1298", + "Submission Date": "2010-10-13T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "13" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1537", + "Submission Date": "2010-07-02T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "2" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "628", + "Submission Date": "2013-03-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "937", + "Submission Date": "2014-01-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "21" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "540", + "Submission Date": "2014-06-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "81463", + "Submission Date": "2015-04-02T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "2" + }, + { + "State": "OK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "600", + "Submission Date": "2011-03-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "16" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "97000", + "Submission Date": "2014-06-20T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "756", + "Submission Date": "2012-05-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "29" + }, + { + "State": "ND", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "10000", + "Submission Date": "2013-08-21T04:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3206", + "Submission Date": "2014-08-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "20744", + "Submission Date": "2011-03-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "28" + }, + { + "State": "MD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-12-13T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "13" + }, + { + "State": "OK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4000", + "Submission Date": "2015-03-13T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "800", + "Submission Date": "2013-07-18T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "10190", + "Submission Date": "2011-07-04T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "4" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2011-08-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "29" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1670", + "Submission Date": "2012-01-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6745", + "Submission Date": "2012-04-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "12" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10000", + "Submission Date": "2013-09-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "3" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7888", + "Submission Date": "2014-11-03T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "3" + }, + { + "State": "CA", + "Covered Entity Type": "", + "Individuals Affected": "1342", + "Submission Date": "2015-05-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4328", + "Submission Date": "2010-08-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "MN", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "27839", + "Submission Date": "2014-03-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "796", + "Submission Date": "2014-03-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1699", + "Submission Date": "2014-03-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "MN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "715", + "Submission Date": "2014-03-21T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "CA", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "30000", + "Submission Date": "2014-12-12T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "PR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1000", + "Submission Date": "2010-12-13T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "13" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2015-01-15T05:00:00.000Z", + "Type of Breach": "Improper Disposal", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "15" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5415", + "Submission Date": "2014-03-14T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "646", + "Submission Date": "2009-12-15T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2009", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "15" + }, + { + "State": "VA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2010-04-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2010-09-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "501", + "Submission Date": "2011-01-04T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "4" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "656", + "Submission Date": "2011-01-18T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "18" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2367", + "Submission Date": "2011-09-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6000", + "Submission Date": "2014-07-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "8" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2000000", + "Submission Date": "2014-09-10T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "10" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "845", + "Submission Date": "2011-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "686", + "Submission Date": "2011-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "AZ", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "9393", + "Submission Date": "2011-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "532", + "Submission Date": "2011-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1070", + "Submission Date": "2011-04-25T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "NY", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1020", + "Submission Date": "2010-06-14T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "14" + }, + { + "State": "MT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1900", + "Submission Date": "2013-12-17T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "17" + }, + { + "State": "NC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "2000", + "Submission Date": "2009-12-11T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2009", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "11" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3000", + "Submission Date": "2015-06-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "15" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6909", + "Submission Date": "2015-03-01T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Sun", + "Submission Day": "1" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9626", + "Submission Date": "2013-06-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "17" + }, + { + "State": "FL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "500", + "Submission Date": "2015-03-27T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "NJ", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3000", + "Submission Date": "2011-08-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Sun", + "Submission Day": "28" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2000", + "Submission Date": "2011-06-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4885", + "Submission Date": "2015-04-28T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "28" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2100", + "Submission Date": "2012-04-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "13" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3269", + "Submission Date": "2013-03-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "686", + "Submission Date": "2015-02-27T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2300", + "Submission Date": "2010-08-09T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "OK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "19200", + "Submission Date": "2010-09-27T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "27" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "800", + "Submission Date": "2011-02-10T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "10" + }, + { + "State": "WI", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "3000", + "Submission Date": "2011-09-13T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "13" + }, + { + "State": "HI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "674", + "Submission Date": "2012-11-20T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "20" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2988", + "Submission Date": "2012-12-31T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "31" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2723", + "Submission Date": "2013-05-21T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "21" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1670", + "Submission Date": "2013-06-05T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "5" + }, + { + "State": "CO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "921", + "Submission Date": "2013-08-27T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "27" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "76183", + "Submission Date": "2013-11-27T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "27" + }, + { + "State": "AL", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "1100", + "Submission Date": "2014-07-07T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "7" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1600", + "Submission Date": "2015-01-23T05:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "981", + "Submission Date": "2015-05-15T04:00:00.000Z", + "Type of Breach": "Hacking/IT Incident", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6989", + "Submission Date": "2014-01-03T05:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "TX", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "6672", + "Submission Date": "2011-10-24T04:00:00.000Z", + "Type of Breach": "Loss", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "24" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "532", + "Submission Date": "2010-02-21T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Sun", + "Submission Day": "21" + }, + { + "State": "NM", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1900", + "Submission Date": "2010-02-23T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "23" + }, + { + "State": "TN", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "539", + "Submission Date": "2013-05-08T04:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "GA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5000", + "Submission Date": "2013-12-06T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5257", + "Submission Date": "2009-11-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "857", + "Submission Date": "2009-11-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6145", + "Submission Date": "2009-11-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "952", + "Submission Date": "2009-11-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5166", + "Submission Date": "2009-11-20T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2009", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "MO", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9309", + "Submission Date": "2010-01-19T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8000", + "Submission Date": "2010-02-18T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "18" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "22012", + "Submission Date": "2010-04-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "CO", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "105470", + "Submission Date": "2010-07-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "9" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "16820", + "Submission Date": "2010-07-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "23753", + "Submission Date": "2010-07-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6873", + "Submission Date": "2010-07-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2698", + "Submission Date": "2010-08-11T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "11" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9000", + "Submission Date": "2010-09-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "21" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "928", + "Submission Date": "2010-09-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "29" + }, + { + "State": "MS", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1104", + "Submission Date": "2010-11-08T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "8" + }, + { + "State": "NE", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1550", + "Submission Date": "2010-11-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "12" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "613", + "Submission Date": "2010-11-30T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "30" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "542", + "Submission Date": "2010-11-30T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "30" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "800", + "Submission Date": "2010-12-07T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "7" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "556", + "Submission Date": "2010-12-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2010", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "17" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Clearing House", + "Individuals Affected": "1250", + "Submission Date": "2011-01-13T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "13" + }, + { + "State": "SC", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "5596", + "Submission Date": "2011-01-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "TN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "500", + "Submission Date": "2011-01-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "670", + "Submission Date": "2011-03-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "28" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "514330", + "Submission Date": "2011-03-30T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "30" + }, + { + "State": "WY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "15000", + "Submission Date": "2011-04-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "20" + }, + { + "State": "PR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "32390", + "Submission Date": "2011-05-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "PR", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "24361", + "Submission Date": "2011-05-09T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "400000", + "Submission Date": "2011-05-27T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "15677", + "Submission Date": "2011-06-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Thu", + "Submission Day": "16" + }, + { + "State": "PR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2800", + "Submission Date": "2011-07-13T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "13" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1200", + "Submission Date": "2011-07-29T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "MI", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "520", + "Submission Date": "2011-10-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "3" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "14750", + "Submission Date": "2011-10-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "20" + }, + { + "State": "CT", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1089", + "Submission Date": "2011-10-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "28" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "943434", + "Submission Date": "2011-11-17T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "WA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3100", + "Submission Date": "2012-01-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "27" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4400", + "Submission Date": "2012-04-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "925", + "Submission Date": "2012-05-25T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "25" + }, + { + "State": "OR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "11136", + "Submission Date": "2012-06-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8488", + "Submission Date": "2012-07-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2300", + "Submission Date": "2012-08-03T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "3" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "603", + "Submission Date": "2012-08-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "15" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3031", + "Submission Date": "2012-09-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "17" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "980", + "Submission Date": "2012-10-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "22" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "615", + "Submission Date": "2012-11-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "26" + }, + { + "State": "CT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1749", + "Submission Date": "2012-11-28T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "28" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Clearing House", + "Individuals Affected": "10000", + "Submission Date": "2012-11-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4929", + "Submission Date": "2012-12-14T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Fri", + "Submission Day": "14" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "532", + "Submission Date": "2013-01-04T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "4" + }, + { + "State": "IL", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "8911", + "Submission Date": "2013-01-30T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "30" + }, + { + "State": "AL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2400", + "Submission Date": "2013-02-02T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Sat", + "Submission Day": "2" + }, + { + "State": "NC", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1000", + "Submission Date": "2013-02-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "SD", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "8500", + "Submission Date": "2013-02-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "21" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "109000", + "Submission Date": "2013-02-22T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "22" + }, + { + "State": "OH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1200", + "Submission Date": "2013-03-06T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "6" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1416", + "Submission Date": "2013-04-17T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "17" + }, + { + "State": "UT", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "700", + "Submission Date": "2013-04-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "26" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1580", + "Submission Date": "2013-05-01T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "1" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "710", + "Submission Date": "2013-07-19T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "19" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4029530", + "Submission Date": "2013-08-23T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "949", + "Submission Date": "2013-10-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "22" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5840", + "Submission Date": "2013-10-28T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "28" + }, + { + "State": "IN", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1500", + "Submission Date": "2013-11-26T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Tue", + "Submission Day": "26" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1400", + "Submission Date": "2013-12-23T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "NJ", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1411", + "Submission Date": "2014-02-21T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Fri", + "Submission Day": "21" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "7500", + "Submission Date": "2014-02-27T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Thu", + "Submission Day": "27" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9861", + "Submission Date": "2014-03-12T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Wed", + "Submission Day": "12" + }, + { + "State": "NH", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1208", + "Submission Date": "2014-05-21T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "21" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5845", + "Submission Date": "2014-06-06T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "6" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "5471", + "Submission Date": "2014-06-20T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "20" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2780", + "Submission Date": "2014-07-16T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Wed", + "Submission Day": "16" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "948", + "Submission Date": "2014-08-26T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "26" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "3780", + "Submission Date": "2014-09-05T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "9", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "5" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "810", + "Submission Date": "2014-10-08T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Wed", + "Submission Day": "8" + }, + { + "State": "CA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1030", + "Submission Date": "2015-01-12T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "1", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "12" + }, + { + "State": "", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "500", + "Submission Date": "2015-04-22T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "4", + "Submission Quarter": "2", + "Submission DOW": "Wed", + "Submission Day": "22" + }, + { + "State": "PA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "1551", + "Submission Date": "2015-05-15T04:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "15" + }, + { + "State": "CA", + "Covered Entity Type": "Business Associate", + "Individuals Affected": "1500", + "Submission Date": "2012-11-29T05:00:00.000Z", + "Type of Breach": "Theft", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "11", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "29" + }, + { + "State": "MA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "942", + "Submission Date": "2011-03-07T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Mon", + "Submission Day": "7" + }, + { + "State": "AK", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2743", + "Submission Date": "2012-03-03T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "3", + "Submission Quarter": "1", + "Submission DOW": "Sat", + "Submission Day": "3" + }, + { + "State": "NC", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "9953", + "Submission Date": "2012-06-25T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2012", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Mon", + "Submission Day": "25" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "877", + "Submission Date": "2013-06-11T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "6", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "11" + }, + { + "State": "TX", + "Covered Entity Type": "Health Plan", + "Individuals Affected": "21000", + "Submission Date": "2013-07-16T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Tue", + "Submission Day": "16" + }, + { + "State": "LA", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "6994", + "Submission Date": "2013-07-22T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "7", + "Submission Quarter": "3", + "Submission DOW": "Mon", + "Submission Day": "22" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "960", + "Submission Date": "2013-10-17T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "10", + "Submission Quarter": "4", + "Submission DOW": "Thu", + "Submission Day": "17" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "4400", + "Submission Date": "2013-12-09T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "9" + }, + { + "State": "FL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2354", + "Submission Date": "2013-12-23T05:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2013", + "Submission Month": "12", + "Submission Quarter": "4", + "Submission DOW": "Mon", + "Submission Day": "23" + }, + { + "State": "NY", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "26162", + "Submission Date": "2014-05-23T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Fri", + "Submission Day": "23" + }, + { + "State": "TX", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "10604", + "Submission Date": "2014-08-29T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2014", + "Submission Month": "8", + "Submission Quarter": "3", + "Submission DOW": "Fri", + "Submission Day": "29" + }, + { + "State": "IL", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "632", + "Submission Date": "2015-05-19T04:00:00.000Z", + "Type of Breach": "Unauthorized Access/Disclosure", + "Location of Information": "Desktop Computer", + "Submission Year": "2015", + "Submission Month": "5", + "Submission Quarter": "2", + "Submission DOW": "Tue", + "Submission Day": "19" + }, + { + "State": "PR", + "Covered Entity Type": "Healthcare Provider", + "Individuals Affected": "2621", + "Submission Date": "2011-02-22T05:00:00.000Z", + "Type of Breach": "Other", + "Location of Information": "Desktop Computer", + "Submission Year": "2011", + "Submission Month": "2", + "Submission Quarter": "1", + "Submission DOW": "Tue", + "Submission Day": "22" + } +] \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/sort.ts b/packages/marshaller/src/ddl2/activities/sort.ts new file mode 100644 index 0000000000..007460cb02 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/sort.ts @@ -0,0 +1,185 @@ +import { PropertyExt } from "@hpcc-js/common"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { hashSum } from "@hpcc-js/util"; +import { ascending as d3Ascending, descending as d3Descending } from "d3-array"; +import { Activity, IActivityError, ReferencedFields } from "./activity.ts"; + +export class SortColumn extends PropertyExt { + private _owner: Sort; + + validate(prefix: string): IActivityError[] { + const retVal: IActivityError[] = []; + if (!this.fieldID_valid()) { + retVal.push({ + source: `${prefix}.fieldID`, + msg: `Invalid fieldID: ${this.fieldID()}`, + hint: `expected ${JSON.stringify(this.fieldIDs())}` + }); + } + return retVal; + } + + constructor() { + super(); + } + + owner(): Sort; + owner(_: Sort): this; + owner(_?: Sort): Sort | this { + if (!arguments.length) return this._owner; + this._owner = _; + return this; + } + + valid(): boolean { + return !!this.fieldID(); + } + + toDDL(): DDL2.ISortCondition { + return { + fieldID: this.fieldID(), + descending: this.descending() + }; + } + + fromDDL(ddl: DDL2.ISortCondition): this { + return this + .fieldID(ddl.fieldID) + .descending(ddl.descending) + ; + } + + static fromDDL(ddl: DDL2.ISortCondition): SortColumn { + return new SortColumn().fromDDL(ddl); + } + + hash(): string { + return hashSum({ + sortColumn: this.fieldID(), + descending: this.descending() + }); + } + + fieldIDs() { + return this._owner.fieldIDs(); + } + + field(id: string): DDL2.IField | undefined { + return this._owner.inFields().filter(field => + field.id === id + )[0]; + } +} +SortColumn.prototype._class += " SortColumn"; + +export interface SortColumn { + fieldID(): string; + fieldID(_: string): this; + fieldID_valid(): boolean; + descending(): boolean; + descending(_: boolean): this; +} + +// =========================================================================== +export class Sort extends Activity { + static Column = SortColumn; + + validate(): IActivityError[] { + let retVal: IActivityError[] = []; + for (const sb of this.validSortBy()) { + retVal = retVal.concat(sb.validate("Sort.column")); + } + return retVal; + } + + constructor() { + super(); + } + + toDDL(): DDL2.ISort { + return { + type: "sort", + conditions: this.conditions() + }; + } + + fromDDL(ddl: DDL2.ISort): this { + this.conditions(ddl.conditions); + return this; + } + + static fromDDL(ddl: DDL2.ISort) { + return new Sort().fromDDL(ddl); + } + + conditions(): DDL2.ISortCondition[]; + conditions(_: DDL2.ISortCondition[]): this; + conditions(_?: DDL2.ISortCondition[]): DDL2.ISortCondition[] | this { + if (!arguments.length) return this.validSortBy().map(column => column.toDDL()); + this.column(_.map(condition => SortColumn.fromDDL(condition))); + return this; + } + + // Activitiy --- + hash(): string { + return hashSum({ + Sort: this.column().map(sb => sb.hash()) + }); + } + + referencedFields(refs: ReferencedFields): void { + super.referencedFields(refs); + super.resolveInFields(refs, this.validSortBy().map(sortBy => sortBy.fieldID())); + } + + validSortBy(): SortColumn[] { + return this.column().filter(sortBy => sortBy.fieldID()); + } + + exists(): boolean { + return this.validSortBy().length > 0; + } + + fieldIDs(): string[] { + return this.inFields().map(field => field.id); + } + + computeData(): ReadonlyArray { + const data = super.computeData(); + const sortByArr: Array<{ compare: (l, r) => number, id: string }> = []; + for (const sortBy of this.validSortBy()) { + sortByArr.push({ + compare: sortBy.descending() ? d3Descending : d3Ascending, + id: sortBy.fieldID() + }); + } + + if (sortByArr.length) { + return [...data].sort((l: any, r: any) => { + for (const item of sortByArr) { + const retVal2 = item.compare(l[item.id], r[item.id]); + if (retVal2 !== 0) { + return retVal2; + } + } + return 0; + }); + + } + return data; + } +} +Sort.prototype._class += " Sort"; + +export interface Sort { + column(): SortColumn[]; + column(_: SortColumn[]): this; +} + +SortColumn.prototype.publish("fieldID", null, "set", "Sort Field", function (this: SortColumn) { return this.fieldIDs(); }, { + optional: true, + validate: (w: SortColumn): boolean => w.fieldIDs().indexOf(w.fieldID()) >= 0 + }); +SortColumn.prototype.publish("descending", false, "boolean", "Sort Field"); + +Sort.prototype.publish("column", [], "propertyArray", "Source Columns", null, { autoExpand: SortColumn }); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/activities/wuresult.ts b/packages/marshaller/src/ddl2/activities/wuresult.ts new file mode 100644 index 0000000000..6156c98955 --- /dev/null +++ b/packages/marshaller/src/ddl2/activities/wuresult.ts @@ -0,0 +1,419 @@ +import { Result, Workunit, XSDXMLNode } from "@hpcc-js/comms"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { AsyncOrderedQueue, debounce, hashSum } from "@hpcc-js/util"; +import { ElementContainer } from "../model/element.ts"; +import { schemaRow2IField } from "./activity.ts"; +import { Datasource, DatasourceRef } from "./datasource.ts"; + +export abstract class ESPResult extends Datasource { + protected _result: Result; + protected _schema: XSDXMLNode[] = []; + protected _meta: DDL2.IField[] = []; + protected _total: number; + private _data: ReadonlyArray = []; + + constructor(protected _ec: ElementContainer) { + super(); + this + .samples(this._ec.samples()) + .sampleSize(this._ec.sampleSize()) + ; + } + + hash(more: object = {}): string { + return hashSum({ + samples: this.samples(), + sampleSize: this.sampleSize(), + ...more + }); + } + + abstract _createResult(): Result; + + _prevMetaHash: string; + refreshMetaPromise: Promise; + refreshMeta(): Promise { + if (this._prevMetaHash !== this.hash()) { + this._prevMetaHash = this.hash(); + delete this.refreshMetaPromise; + } + if (!this.refreshMetaPromise) { + this.refreshMetaPromise = super.refreshMeta().then(() => { + this._result = this._createResult(); + if (this._result) { + return this._result.refresh(); + } + throw new Error("No valid result"); + }).then(result => { + this._total = result.Total; + this._schema = result.fields(); + this._meta = this._meta && this._meta.length ? this._meta : this._schema.map(schemaRow2IField); + }).catch(e => { + this._total = 0; + this._schema = []; + this._meta = []; + }); + } + return this.refreshMetaPromise; + } + + responseFields(): DDL2.IField[]; + responseFields(_: DDL2.IField[]): this; + responseFields(_?: DDL2.IField[]): ReadonlyArray | this { + if (!arguments.length) return this._meta; + this._meta = _; + this.refreshMeta(); + return this; + } + + computeFields(inFields: ReadonlyArray): () => ReadonlyArray { + return () => this.responseFields(); + } + + exec(): Promise { + return this._exec(); + } + + private _prevExecHash: string; + private _exec = debounce((): Promise => { + if (this._prevExecHash !== this.hash()) { + this._prevExecHash = this.hash(); + return super.exec().then(() => { + return this.sample(); + }).then(response => { + this._data = this.fixInt64(response); + }).catch(e => { + this._data = []; + }); + } else { + return Promise.resolve(); + } + }); + + inData(): ReadonlyArray { + return this._data; + } + + computeData(): ReadonlyArray { + return this._data; + } + + total(): number { + return this._total; + } + + // --- + async fetch(from: number, count: number): Promise { + if (count > this.samples() * this.sampleSize()) { + return this.sample(); + } + return this._fetch(from, count); + } + + private _fetchQ = new AsyncOrderedQueue(); + private _fetch(from: number, count: number): Promise { + return this._fetchQ.push( + this._result ? this._result + .fetchRows(from, count) + .catch(e => { + return []; + }) : + Promise.resolve([]) + ); + } + + private sample = debounce((samples: number = this.samples(), sampleSize: number = this.sampleSize()): Promise => { + const pages: Array> = []; + if (samples * sampleSize >= this.total()) { + pages.push(this._fetch(0, this.total())); + } else { + const lastPage = this.total() - sampleSize; + for (let i = 0; i < samples; ++i) { + pages.push(this._fetch(Math.floor(i * lastPage / samples), sampleSize)); + } + } + return Promise.all(pages).then(responses => { + let retVal2: any[] = []; + for (const response of responses) { + retVal2 = retVal2.concat(response); + } + return retVal2; + }); + }); +} +ESPResult.prototype._class += " ESPResult"; + +export interface ESPResult { + samples(): number; + samples(_: number): this; + sampleSize(): number; + sampleSize(_: number): this; +} + +export class WUResult extends ESPResult { + + _origWu; + _origResultName; + + declare _wu: WU; + declare _resultName: string; + + constructor(_ec: ElementContainer) { + super(_ec); + this._wu = new WU(this._ec); + } + + url(): string { + return this._wu.url(); + } + + wuid(): string { + return this._wu.wuid(); + } + + toDDL(): DDL2.IWUResult { + return { + type: "wuresult", + id: this.id(), + url: this._wu.url(), + wuid: this.wuid(), + outputs: { + [this.resultName()]: { + fields: this.responseFields() + } + } + }; + } + + fromDDL(ddl: DDL2.IWUResult, skipID = false): this { + if (ddl.outputs[this.resultName()]) { + return this.responseFields(ddl.outputs[this.resultName()].fields); + } + return this; + } + + static fromDDL(ec: ElementContainer, ddl: DDL2.IWUResult, wu: WU, resultName: string, skipID = false): WUResult { + return new WUResult(ec) + .wu(wu) + .resultName(resultName) + .fromDDL(ddl) + ; + } + + _createResult(): Result { + if (this._wu.url() && this.wuid() && this.resultName()) { + return Result.attach({ baseUrl: this._wu.url(), hookSend: this._ec.hookSend() }, this.wuid(), this.resultName()); + } + return undefined; + } + + sourceHash(): string { + return super.hash({ + wuid: this.wuid() + }); + } + + hash(more: object): string { + return super.hash({ + ddl: this.toDDL() + }); + } + + label(): string { + return `${this.wuid()}\n${this.resultName()}`; + } +} +WUResult.prototype._class += " WUResult"; + +export interface WUResult { + wu(): WU; + wu(_: WU): this; + resultName(): string; + resultName(_: string): this; +} + +export class WU extends Datasource { + _origUrl; + _origWuid; + + protected _workunit: Workunit; + protected _outputs: { [id: string]: WUResult } = {}; + + constructor(private _ec: ElementContainer) { + super(); + } + + toDDL(): DDL2.IWUResult { + const ddlOutputs: DDL2.OutputDict = {}; + for (const resultName in this._outputs) { + ddlOutputs[resultName] = { + fields: this._outputs[resultName].responseFields() + }; + } + return { + type: "wuresult", + id: this.id(), + url: this.url(), + wuid: this.wuid(), + outputs: ddlOutputs + }; + } + + fromDDL(ddl: DDL2.IWUResult, skipID = false): this { + (skipID ? this : this.id(ddl.id)) + .url(ddl.url) + .wuid(ddl.wuid) + ; + const wuResults: { [id: string]: WUResult } = {}; + for (const resultName in ddl.outputs) { + wuResults[resultName] = WUResult.fromDDL(this._ec, ddl, this, resultName); + } + this._outputs = wuResults; + return this; + } + + static fromDDL(elementContainer: ElementContainer, ddl: DDL2.IWUResult, skipID = false): WU { + return new WU(elementContainer).fromDDL(ddl, skipID); + } + + hash(): string { + return hashSum({ + url: this.url(), + wuid: this.wuid() + }); + } + + label(): string { + return this.wuid(); + } + + outputs(): WUResult[] { + const retVal = []; + for (const resultName in this._outputs) { + retVal.push(this._outputs[resultName]); + } + return retVal; + } + + outputDDL(): DDL2.OutputDict { + const retVal: DDL2.OutputDict = {}; + for (const resultName in this._outputs) { + retVal[resultName] = { + fields: this._outputs[resultName].outFields() as DDL2.IField[] + }; + } + return retVal; + } + + output(id: string): WUResult { + return this._outputs[id]; + } + + private _prevSourceHash: string; + private refreshMetaPromise: Promise; + private _resultNames: string[] = []; + refreshMeta(): Promise { + if (!this.url() || !this.wuid()) { + return Promise.resolve(); + } + if (this._prevSourceHash !== this.hash()) { + this._prevSourceHash = this.hash(); + delete this.refreshMetaPromise; + } + if (!this.refreshMetaPromise) { + this.refreshMetaPromise = super.refreshMeta().then(() => { + this._workunit = Workunit.attach({ baseUrl: this.url(), hookSend: this._ec.hookSend() }, this.wuid()); + return this._workunit.fetchResults(); + }).then(results => { + this._resultNames = results.map(r => r.Name); + }).catch(e => { + }); + } + return this.refreshMetaPromise; + } + + resultNames(): string[] { + return this._resultNames; + } +} +WU.prototype._class += " WU"; + +export interface WU { + url(): string; + url(_: string): this; + wuid(): string; + wuid(_: string): this; +} + +export class WUResultRef extends DatasourceRef { + + datasource(): WUResult; + datasource(_: WUResult): this; + datasource(_?: WUResult): this | WUResult { + return super.datasource.apply(this, arguments); + } + + resultName(): string; + resultName(_: string): this; + resultName(_?: string): string | this { + if (!arguments.length) return this.datasource().resultName(); + this.datasource().resultName(_); + return this; + } + + toDDL(): DDL2.IWUResultRef { + return { + id: this.datasource().wu().id(), + output: this.resultName() + }; + } +} +WUResultRef.prototype._class += " WUResultRef"; + +ESPResult.prototype.publish("samples", 10, "number", "Number of samples"); +ESPResult.prototype.publish("sampleSize", 100, "number", "Sample size"); + +WUResult.prototype.publish("wu", null, "widget", "Workunit"); +WUResult.prototype.publish("resultName", "", "set", "Result Name", function (this: WUResult): string[] { + return this._wu !== undefined ? this._wu.resultNames() : []; +}); + +WUResult.prototype._origWu = WUResult.prototype.wu; +WUResult.prototype.wu = function (this: WUResult, _?) { + const retVal = WUResult.prototype._origWu.apply(this, arguments); + if (_ !== undefined) { + this._wu.refreshMeta(); + } + return retVal; +}; + +WUResult.prototype._origResultName = WUResult.prototype.resultName; +WUResult.prototype.resultName = function (this: WUResult, _?) { + const prev = this._resultName; + const retVal = WUResult.prototype._origResultName.apply(this, arguments); + if (_ !== undefined && prev !== _) { + this.responseFields([]); + } + return retVal; +}; + +WU.prototype.publish("url", "", "string", "ESP Url (http://x.x.x.x:8010)"); +WU.prototype.publish("wuid", "", "string", "Workunit ID"); + +WU.prototype._origUrl = WU.prototype.url; +WU.prototype.url = function (this: WU, _?) { + const retVal = WU.prototype._origUrl.apply(this, arguments); + if (_ !== undefined) { + this.refreshMeta(); + } + return retVal; +}; + +WU.prototype._origWuid = WU.prototype.wuid; +WU.prototype.wuid = function (this: WU, _?) { + const retVal = WU.prototype._origWuid.apply(this, arguments); + if (_ !== undefined) { + this.refreshMeta(); + } + return retVal; +}; \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/dashboard.css b/packages/marshaller/src/ddl2/dashboard.css new file mode 100644 index 0000000000..0bd8042188 --- /dev/null +++ b/packages/marshaller/src/ddl2/dashboard.css @@ -0,0 +1,13 @@ +.lm-Widget.phosphor_WidgetAdapter.lm-DockPanel-widget.active { + border-color: #5589FF; + box-shadow: 0px -1px 0px rgba(85, 137, 255, 1), 1px 1px 2px rgba(0, 0, 0, 0.2); +} + +.lm-TabBar-tab.lm-mod-current.active { + border-color: #5589FF; +} + +.lm-TabBar-tab.lm-mod-current.error { + background: rgb(255, 0, 0); + background: linear-gradient(180deg, rgba(255, 0, 0, 0.5) 0%, rgba(255, 255, 255, 1) 100%); +} \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/dashboard.ts b/packages/marshaller/src/ddl2/dashboard.ts new file mode 100644 index 0000000000..93d79bd8ca --- /dev/null +++ b/packages/marshaller/src/ddl2/dashboard.ts @@ -0,0 +1,330 @@ +import { Button, Spacer, ToggleButton, Widget } from "@hpcc-js/common"; +import { DDL1, DDL2, isDDL2Schema, upgrade } from "@hpcc-js/ddl-shim"; +import { ChartPanel } from "@hpcc-js/layout"; +import { text as d3Text } from "d3-fetch"; +import { Activity } from "./activities/activity.ts"; +import { Databomb } from "./activities/databomb.ts"; +import { DSPicker } from "./activities/dspicker.ts"; +import { Filters } from "./activities/filter.ts"; +import { Form, FormField } from "./activities/form.ts"; +import { GroupBy } from "./activities/groupby.ts"; +import { Limit } from "./activities/limit.ts"; +import { Project } from "./activities/project.ts"; +import { Sort } from "./activities/sort.ts"; +import { DashboardDockPanel } from "./dashboardDockPanel.ts"; +import { DashboardGrid } from "./dashboardGrid.ts"; +import { DDLAdapter } from "./ddl.ts"; +import { JavaScriptAdapter } from "./javascriptadapter.ts"; +import { Element, ElementContainer } from "./model/element.ts"; + +import "../../src/ddl2/dashboard.css"; + +export interface IDockPanel { + layoutObj(_: object | null): this; + layout(); + widgets(); + activate(element: Element); + hideSingleTabs(bool?: boolean); + syncWidgets(); + syncPopups(); +} + +export class Dashboard extends ChartPanel { + + private _dockPanel: IDockPanel; + + private _designModeButton = new ToggleButton().faChar("fa-object-group").tooltip("Design Mode...") + .selected(true) + .on("click", () => { + if (this._dockPanel instanceof DashboardGrid) { + this._dockPanel + .designMode(this._designModeButton.selected()) + .lazyRender() + ; + } + }); + + private _addButton = new Button().faChar("fa-plus").tooltip("Add...") + .on("click", () => { + const newElem = new Element(this._ec); + this._ec.append(newElem); + this.renderPromise().then(() => { + newElem.refresh().then(() => { + this.activate(newElem); + }); + }); + }); + + private _removeButton = new Button().faChar("fa-minus").tooltip("Remove...") + .enabled(false) + .on("click", () => { + const elem = this._prevActive; + if (elem && window.confirm(`Remove Widget "${elem.id()}"?`)) { + this._ec.clear(elem.id()); + this.renderPromise().then(() => { + this.vizActivation(undefined); + }); + } + }); + + private _reloadButton = new Button().faChar("fa-refresh").tooltip("Reload...") + .on("click", () => { + const json = this.save(); + this._ec.clear(); + this.vizActivation(undefined); + this.renderPromise().then(() => { + this.restore(json); + this.renderPromise().then(() => { + this._ec.refresh().then(() => { + }); + }); + }); + }); + + private _addSamples = new Button().faChar("fa-database").tooltip("Add Samples") + .on("click", () => { + Promise.all([ + d3Text("https://raw.githubusercontent.com/hpcc-systems/Visualization/candidate-2.x.x/utils/data/data/airports.csv"), + d3Text("https://raw.githubusercontent.com/hpcc-systems/Visualization/candidate-2.x.x/utils/data/data/carriers.csv"), + d3Text("https://raw.githubusercontent.com/hpcc-systems/Visualization/candidate-2.x.x/utils/data/data/stats.csv") + ]).then(([airports, carriers, stats]) => { + const popupElement = this.addForm("popup", { + type: "form", + id: "global_filter", + fields: [{ + type: "string", + id: "Airport" + }, { + type: "string", + id: "Airline" + }] + }); + popupElement.visualization() + .title("Global Filter") + .visibility("flyout") + .chartType("FieldForm") + ; + const airportsElement = this.addDatabomb("airports", airports, "csv", + [ + new FormField().fieldID("code").type("string"), + new FormField().fieldID("name").type("string"), + new FormField().fieldID("count").type("number") + ], + new Filters(this._ec).remoteFilter([ + new Filters.Filter().source(popupElement.id()).mappings([new Filters.Mapping().remoteField("Airport").localField("code").nullable(true)]) + ]), + new Sort().column([new Sort.Column().fieldID("count").descending(true)]) + ); + airportsElement.chartPanel().title("Airports"); + const carrierElement = this.addDatabomb("carriers", carriers, "csv", + [ + new FormField().fieldID("code").type("string"), + new FormField().fieldID("name").type("string"), + new FormField().fieldID("count").type("number") + ], + new Filters(this._ec).remoteFilter([ + new Filters.Filter().source(popupElement.id()).mappings([new Filters.Mapping().remoteField("Airline").localField("code").nullable(true)]) + ]), + new Sort().column([new Sort.Column().fieldID("count").descending(true)]) + ); + carrierElement.chartPanel().title("Airlines"); + const statsElement = this.addDatabomb("stats", stats, "csv", + [], + new Filters(this._ec).remoteFilter([ + new Filters.Filter().source(airportsElement.id()).mappings([new Filters.Mapping().remoteField("code").localField("airport")]), + new Filters.Filter().source(carrierElement.id()).mappings([new Filters.Mapping().remoteField("code").localField("carrier").nullable(true)]) + ])); + statsElement.chartPanel().title("Stats"); + return Promise.all([ + popupElement.refresh(), + airportsElement.refresh(), + carrierElement.refresh(), + statsElement.refresh() + ]); + }).then(() => { + this.render(); + }); + }); + + addDatabomb(label: string, payload: string, format: "csv" | "tsv" | "json" = "csv", databombFields: FormField[], ...activities: Activity[]): Element { + const databomb = new Databomb().id(label).format(format).payload(payload); + if (databombFields.length > 0) { + databomb.databombFields(databombFields); + } + this._ec.appendDatasource(databomb); + const newElem = new Element(this._ec); + const ds = newElem.hipiePipeline().datasource(); + if (ds instanceof DSPicker) { + ds.datasourceID(databomb.id()); + } + for (const activity of activities) { + if (activity instanceof Filters) { + newElem.hipiePipeline().filters(activity); + } else if (activity instanceof Project) { + newElem.hipiePipeline().project(activity); + } else if (activity instanceof GroupBy) { + newElem.hipiePipeline().groupBy(activity); + } else if (activity instanceof Sort) { + newElem.hipiePipeline().sort(activity); + } else if (activity instanceof Limit) { + newElem.hipiePipeline().limit(activity); + } + } + this._ec.append(newElem); + return newElem; + } + + addForm(label: string, ddl: DDL2.IForm): Element { + const databomb = new Form().id(label).fromDDL(ddl); + this._ec.appendDatasource(databomb); + const newElem = new Element(this._ec); + const ds = newElem.hipiePipeline().datasource(); + if (ds instanceof DSPicker) { + ds.datasourceID(databomb.id()); + } + this._ec.append(newElem); + return newElem; + } + + static create(target: string, ddl: DDL2.Schema): Promise { + return new Promise((resolve, reject) => { + const ec = new ElementContainer(); + const dashboard = new Dashboard(ec) + .target(target) + .hideSingleTabs(true) + .titleVisible(false) + .restore(ddl) + .render(w => { + ec.refresh().then(() => { + resolve(dashboard); + }); + }); + }); + } + + constructor(private _ec: ElementContainer) { + super(); + this._ec.on("vizStateChanged", (viz) => { + this.vizStateChanged(viz); + }); + this.buttons([this._designModeButton, new Spacer(), this._addButton, this._removeButton, new Spacer(), this._reloadButton, new Spacer(), this._addSamples]); + this.ensureDockPanel("dock"); + } + + ensureDockPanel(mode: "dock" | "grid" = "dock") { + if ((mode === "dock" && !(this._dockPanel instanceof DashboardDockPanel)) || (mode === "grid" && !(this._dockPanel instanceof DashboardGrid))) { + this._dockPanel = (mode === "dock" ? new DashboardDockPanel(this._ec) : new DashboardGrid(this._ec).designMode(this.titleVisible())) + .on("vizActivation", (elem: Element) => { + this.vizActivation(elem); + }) + ; + this.widget(this._dockPanel as any); + } + } + + elementContainer(): ElementContainer { + return this._ec; + } + + private _hipieProps; + hipieProps(): DDL2.IProperties; + hipieProps(_: DDL2.IProperties): this; + hipieProps(_?: DDL2.IProperties): DDL2.IProperties | this { + if (!arguments.length) return this._hipieProps; + this._hipieProps = _; + return this; + } + + ddl(): DDL2.Schema; + ddl(_: DDL2.Schema): this; + ddl(_?: DDL2.Schema): DDL2.Schema | this { + const ddlAdapter = new DDLAdapter(this); + if (!arguments.length) return ddlAdapter.write(); + this._ec.clear(); + ddlAdapter.read(_); + return this; + } + + // Used to delay load a layout after a render... + layoutObj(_: object | null): this { + this._dockPanel.layoutObj(_); + return this; + } + + save(): DDL2.Schema { + const ddlAdapter = new DDLAdapter(this); + return ddlAdapter.write(); + } + + restore(_: DDL2.Schema, render: boolean = false): this { + this.ensureDockPanel(_ && _.properties && _.properties.layout instanceof Array ? "grid" : "dock"); + const ddlAdapter = new DDLAdapter(this); + ddlAdapter.read(_); + if (render) { + this.renderPromise().then(() => { + this._ec.refresh(); + }); + } + return this; + } + + importDDL(ddl: DDL1.DDLSchema | DDL2.Schema, baseUrl?: string, wuid?: string, dermatologyJson: object = {}): this { + const ddl2: DDL2.Schema = isDDL2Schema(ddl) ? ddl : upgrade(ddl, baseUrl, wuid, true, dermatologyJson); + return this.restore(ddl2, true); + } + + javascript(): string { + const jsAdapter = new JavaScriptAdapter(this); + return jsAdapter.createJavaScript(); + } + + layout() { + return this._dockPanel.layout(); + } + + widgets(): Widget[] { + return this._dockPanel.widgets(); + } + + activate(element: Element) { + this._dockPanel.activate(element); + } + + hideSingleTabs(): boolean; + hideSingleTabs(_: boolean): this; + hideSingleTabs(_?: boolean): boolean | this { + if (!arguments.length) return this._dockPanel.hideSingleTabs(); + this._dockPanel.hideSingleTabs(_); + return this; + } + + updateButtonState() { + this._designModeButton.enabled(this._dockPanel instanceof DashboardGrid).render(); + this._removeButton.enabled(this._prevActive !== undefined).render(); + } + + update(domNode: HTMLElement, element) { + this._dockPanel.syncWidgets(); + super.update(domNode, element); + this.updateButtonState(); + } + + private _prevActive: Element; + vizActivation(viz: Element) { + this._prevActive = viz; + this._removeButton.enabled(viz !== undefined).render(); + } + + vizStateChanged(viz: Element) { + } + + render(callback?): this { + this._dockPanel.syncPopups(); + return super.render(w => { + if (callback) { + callback(w); + } + }); + } +} +Dashboard.prototype._class += " dashboard_dashboard"; diff --git a/packages/marshaller/src/ddl2/dashboardDockPanel.ts b/packages/marshaller/src/ddl2/dashboardDockPanel.ts new file mode 100644 index 0000000000..07434590ef --- /dev/null +++ b/packages/marshaller/src/ddl2/dashboardDockPanel.ts @@ -0,0 +1,123 @@ +import { Widget } from "@hpcc-js/common"; +import { DockPanel, IClosable, WidgetAdapter } from "@hpcc-js/phosphor"; +import { compare } from "@hpcc-js/util"; +import { select as d3Select } from "d3-selection"; +import { Element, ElementContainer } from "./model/element.ts"; +import { IVizPopupPanelOwner } from "./model/vizChartPanel.ts"; +import { PopupManager } from "./PopupManager.ts"; + +export class DashboardDockPanel extends DockPanel implements IClosable, IVizPopupPanelOwner { + + constructor(private _ec: ElementContainer) { + super(); + + } + + tabTitle(element: Element): string { + if (this.hideSingleTabs()) { + return element.visualization().title ? element.visualization().title() : element.visualization().id(); + } + return element.id(); + } + + titleClassed(wa: WidgetAdapter, classID: string, include: boolean) { + let classes = wa.title.className.split(" "); + if (include && classes.indexOf(classID) < 0) { + classes.push(classID); + } else if (!include && classes.indexOf(classID) > 0) { + classes = classes.filter(c => c !== classID); + } + wa.title.className = classes.join(" "); + } + + updateTitle(w: Widget) { + const wa: WidgetAdapter = this.getWidgetAdapter(w); + const element: Element = this._ec.element(w); + const errors = element.validate(); + wa.title.label = this.tabTitle(element); + this.titleClassed(wa, "error", errors.length > 0); + wa.title.caption = errors.map(err => `${err.source}: ${err.msg}`).join("\n"); + } + + activate(element: Element) { + const wa = this.getWidgetAdapter(element.visualization().chartPanel()); + if (wa) { + wa.activate(); + } + } + + syncMinSize(w: any): boolean { + if (w.minWidth_exists() || w.minHeight_exists()) { + const wa = this.getWidgetAdapter(w); + d3Select(wa.node) + .style("min-width", `${w.minWidth()}px`) + .style("min-height", `${w.minHeight()}px`) + ; + return true; + } + return false; + } + + syncWidgets() { + const prevWidgets = this.widgets(); + const diffWidgets = compare(prevWidgets, this._ec.elements().filter(e => e.visualization().visibility() === "normal").map(viz => viz.visualization().chartPanel())); + + let refit = false; + for (const w of diffWidgets.exit) { + this.removeWidget(w); + } + + for (const w of diffWidgets.enter) { + const element: Element = this._ec.element(w); + this.addWidget(w, this.tabTitle(element), "split-bottom", undefined, this.hideSingleTabs() ? undefined : this); + refit = this.syncMinSize(w) || refit; // ensure syncMinSize is called + } + + for (const w of diffWidgets.update) { + this.updateTitle(w); + refit = this.syncMinSize(w) || refit; // ensure syncMinSize is called + } + + if (refit) { + this.refit(); + } + + return this; + } + + // Events --- + childActivation(w: Widget, wa: WidgetAdapter) { + super.childActivation(w, wa); + this.vizActivation(this._ec.element(w)); + for (const wa2 of this.widgetAdapters()) { + if (wa2 === wa) { + wa2.addClass("active"); + this.titleClassed(wa2, "active", true); + wa2.title.iconClass = "active"; + } else { + wa2.removeClass("active"); + this.titleClassed(wa2, "active", false); + wa2.title.iconClass = ""; + } + } + } + + vizActivation(viz: Element) { + } + + // IClosable --- + canClose(w: Widget, wa: WidgetAdapter): boolean { + const id = this._ec.element(w).id(); + const retVal = window.confirm(`Remove Widget "${id}"?`); + if (retVal) { + this._ec.clear(id); + this.syncWidgets(); + this.vizActivation(undefined); + } + return retVal; + } + + syncPopups() { } +} +DashboardDockPanel.prototype._class += " marshaller_DashboardDockPanel"; +DashboardDockPanel.prototype.mixin(PopupManager); diff --git a/packages/marshaller/src/ddl2/dashboardGrid.ts b/packages/marshaller/src/ddl2/dashboardGrid.ts new file mode 100644 index 0000000000..0f594e6789 --- /dev/null +++ b/packages/marshaller/src/ddl2/dashboardGrid.ts @@ -0,0 +1,202 @@ +import { Widget } from "@hpcc-js/common"; +import { Cell, Grid } from "@hpcc-js/layout"; +import { IClosable, WidgetAdapter } from "@hpcc-js/phosphor"; +import { compare } from "@hpcc-js/util"; +import { IDockPanel } from "./dashboard.ts"; +import { Element, ElementContainer } from "./model/element.ts"; +import { IVizPopupPanelOwner } from "./model/vizChartPanel.ts"; +import { PopupManager } from "./PopupManager.ts"; + +export class DashboardGrid extends Grid implements IClosable, IVizPopupPanelOwner, IDockPanel { + private _layoutCache = []; + constructor(private _ec: ElementContainer) { + super(); + + this.designMode(false); + this.surfacePadding("0"); + this.surfaceBorderWidth(0); + } + updateGrid(resize, transitionDuration: number = 0, _noRender: boolean = false) { + super.updateGrid(resize, transitionDuration, _noRender); + this._layoutCache = this.content().map(cellWidget => { + return { + id: cellWidget.widget().id(), + position: [ + cellWidget.gridCol(), + cellWidget.gridRow(), + cellWidget.gridColSpan(), + cellWidget.gridRowSpan() + ] + }; + }); + } + layoutObj(_: object | null): this { + if (_) { + if ((_ as any).main) { + const convertedLayout = ddl2_layout(_, 10, 10); + this._layoutCache = convertedLayout; + } else if (_ instanceof Array) { + this._layoutCache = _; + } + } + return this; + + function ddl2_layout(layoutObject, rows, cols) { + const ret = []; + dive(layoutObject.main, 0, 0, rows, cols); + return ret; + function dive(o, x, y, w, h) { + if (o.children) { + if (o.type === "split-area") { + if (o.orientation === "horizontal") { + o.children.forEach((child, i) => { + const _w = o.sizes[i] * w; + const _h = h; + const _x = i === 0 ? x : x + o.sizes[0] * w; + const _y = y; + dive(o.children[i], _x, _y, _w, _h); + }); + } else if (o.orientation === "vertical") { + o.children.forEach((child, i) => { + const _w = w; + const _h = o.sizes[i] * h; + const _x = x; + const _y = i === 0 ? y : y + o.sizes[0] * h; + dive(o.children[i], _x, _y, _w, _h); + }); + } else { + console.error("wtf"); + } + } else if (o.type === "tab-area") { + o.children.forEach((child, i) => { + const _w = w; + const _h = o.sizes[i] * h; + const _x = x; + const _y = i === 0 ? y : y + o.sizes[0] * h; + dive(o.children[i], _x, _y, _w, _h); + }); + } + } else { + ret.push([x, y, w, h].map(Math.round)); + } + } + } + } + layout() { + return this._layoutCache; + } + widgets() { + return this.content().map(c => c.widget()); + } + hideSingleTabs() { + return true; + } + getWidgetAdapter() { + } + + tabTitle(element: Element): string { + if (this.hideSingleTabs()) { + return element.visualization().title ? element.visualization().title() : element.visualization().id(); + } + return element.id(); + } + + updateTitle(w: Widget) { + const cell: Cell = this.getWidgetCell(w.id()); + const element: Element = this._ec.element(w); + const tabTitle = this.tabTitle(element); + (cell.widget() as any) + .title(tabTitle) + ; + } + + activate(element: Element) { + } + + removeWidget(w: Widget) { + const cell = this.getWidgetCell(w.id()); + this.clearContent(cell); + } + + syncMinSize(w: any): boolean { + if (w.minWidth_exists() || w.minHeight_exists()) { + const cell: Cell = this.getWidgetCell(w.id()); + cell.element() + .style("min-width", `${w.minWidth()}px`) + .style("min-height", `${w.minHeight()}px`) + ; + return true; + } + return false; + } + + syncWidgets() { + const prevWidgets = this.widgets(); + const diffWidgets = compare(prevWidgets, this._ec.elements().filter(e => e.visualization().visibility() === "normal").map(viz => viz.visualization().chartPanel())); + + for (const w of diffWidgets.exit) { + this.removeWidget(w); + } + let maxX = 0; + let maxY = 0; + const no_layout_added = []; + for (const widget of diffWidgets.enter) { + const element: Element = this._ec.element(widget); + const i = this.content().length; + if (this._layoutCache && this._layoutCache[i]) { + const layout = (this._layoutCache as any).find(n => n.id === widget.id()); + if (layout) { + const [x, y, w, h] = layout.position; + this.setContent(y, x, element.visualization().chartPanel(), "", h, w); + if (x + w > maxX) maxX = x + w; + if (y + h > maxY) maxY = y + h; + } else { + no_layout_added.push(element.visualization().chartPanel()); + } + } else { + no_layout_added.push(element.visualization().chartPanel()); + } + } + let freeRow = this.content().reduce((prev, curr) => Math.max(prev, curr.gridRow() + curr.gridRowSpan()), 0); + no_layout_added.forEach(cp => { + this.setContent(freeRow, 0, cp, "", 3, 3); + freeRow += 3; + }); + for (const w of diffWidgets.update) { + this.updateTitle(w); + } + return this; + } + + // Events --- + childActivation(w: Widget, wa?: WidgetAdapter) { + this.vizActivation(this._ec.element(w)); + } + + postSelectionChange() { + super.postSelectionChange(); + const selected = this._selectionBag.get(); + if (selected.length > 0) { + this.childActivation(selected[0].widget.widget()); + } + } + + vizActivation(viz: Element) { + } + + // IClosable --- + canClose(w: Widget, wa: WidgetAdapter): boolean { + const id = this._ec.element(w).id(); + const retVal = window.confirm(`Remove Widget "${id}"?`); + if (retVal) { + this._ec.clear(id); + this.syncWidgets(); + this.vizActivation(undefined); + } + return retVal; + } + + syncPopups() { } +} +DashboardGrid.prototype._class += " marshaller_DashboardGrid"; +DashboardGrid.prototype.mixin(PopupManager); diff --git a/packages/marshaller/src/ddl2/ddl.ts b/packages/marshaller/src/ddl2/ddl.ts new file mode 100644 index 0000000000..4a9d51e8fe --- /dev/null +++ b/packages/marshaller/src/ddl2/ddl.ts @@ -0,0 +1,408 @@ +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { scopedLogger } from "@hpcc-js/util"; +import { BUILD_VERSION, PKG_NAME, PKG_VERSION } from "../__package__.ts"; +import { ActivityPipeline, ReferencedFields } from "./activities/activity.ts"; +import { Databomb } from "./activities/databomb.ts"; +import { DatasourceRef, DatasourceRefType, DatasourceType } from "./activities/datasource.ts"; +import { DSPicker } from "./activities/dspicker.ts"; +import { Filters } from "./activities/filter.ts"; +import { Form } from "./activities/form.ts"; +import { GroupBy } from "./activities/groupby.ts"; +import { Limit } from "./activities/limit.ts"; +import { LogicalFile } from "./activities/logicalfile.ts"; +import { Mappings, Project } from "./activities/project.ts"; +import { Param, RestResult, RestResultRef, RestService } from "./activities/rest.ts"; +import { HipieResultRef, RoxieResult, RoxieResultRef, RoxieService } from "./activities/roxie.ts"; +import { Sort } from "./activities/sort.ts"; +import { WU, WUResult, WUResultRef } from "./activities/wuresult.ts"; +import { Dashboard } from "./dashboard.ts"; +import { Element, ElementContainer } from "./model/element.ts"; +import { Visualization } from "./model/visualization.ts"; + +const logger = scopedLogger("marshaller/ddl2/ddl"); + +type DatasourceRefTypeMap = { [key: string]: { refType: DatasourceRefType, ref: DatasourceRef } }; +type ServerRefTypeMap = { [key: string]: { ds: DatasourceType, result: DatasourceRefTypeMap } }; + +class DDLDatasourceAdapter { + private _dsDedup: ServerRefTypeMap; + + constructor() { + } + + clear() { + this._dsDedup = {}; + } + + id(dsT: DatasourceType): string { + if (dsT instanceof WU) { + return `${dsT.url()}/${dsT.wuid()}`; + } else if (dsT instanceof RoxieService) { + return `${dsT.url()}/${dsT.querySet()}/${dsT.queryID()}`; + } else if (dsT instanceof RestService) { + return `${dsT.url()}/${dsT.action()}`; + } + return dsT.id(); + } + + _resolveID(dsT: DatasourceType): string { + return this._dsDedup[this.id(dsT)].ds.id(); + } + + resolveID(dsRef: DatasourceRef): string | undefined { + if (dsRef instanceof WUResultRef) { + return this._resolveID(dsRef.datasource().wu()); + } else if (dsRef instanceof RoxieResultRef) { + return this._resolveID(dsRef.datasource().service()); + } else if (dsRef instanceof HipieResultRef) { + return this._resolveID(dsRef.datasource().service()); + } else if (dsRef instanceof RestResultRef) { + return this._resolveID(dsRef.datasource().service()); + } + } + + append(pDS: DSPicker | DatasourceRefType) { + const refType: DatasourceRefType = pDS instanceof DSPicker ? pDS.datasource() : pDS; + const ref: DatasourceRef = pDS instanceof DSPicker ? pDS.datasourceRef() : undefined; + const dsTID = refType.id(); + const ds: DatasourceType = refType instanceof WUResult ? refType.wu() : refType instanceof RoxieResult ? refType.service() : refType instanceof RestResult ? refType.service() : refType; + const dsID = this.id(ds); + if (!this._dsDedup[dsID]) { + this._dsDedup[dsID] = { + ds, + result: {} + }; + } + if (!this._dsDedup[dsID].result[dsTID]) { + this._dsDedup[dsID].result[dsTID] = { + refType, + ref + }; + } + } + + getAll(): DDL2.DatasourceType[] { + const retVal: DDL2.DatasourceType[] = []; + for (const key in this._dsDedup) { + const ddl = this._dsDedup[key].ds.toDDL(); + + // Inputs --- + if (ddl.type === "roxie" || ddl.type === "hipie" || ddl.type === "rest") { + const inputs: { [fieldID: string]: DDL2.IField } = {}; + for (const key2 in this._dsDedup[key].result) { + const ddl2 = this._dsDedup[key].result[key2].refType.toDDL(); + const refs: ReferencedFields = { + inputs: {}, + outputs: {} + }; + this._dsDedup[key].result[key2].ref.referencedFields(refs); + for (const inElementID in refs.inputs) { + refs.inputs[inElementID].forEach(fieldID => { + inputs[fieldID] = (ddl2 as any).inputs.filter(row => row.id === fieldID)[0]; + }); + } + } + ddl.inputs = []; + for (const key in inputs) { + ddl.inputs.push(inputs[key]); + } + } + + // Outputs --- + if (ddl.type === "wuresult" || ddl.type === "roxie" || ddl.type === "hipie" || ddl.type === "rest") { + const outputs: { [fieldID: string]: DDL2.IOutput } = {}; + for (const key2 in this._dsDedup[key].result) { + const ddl2 = this._dsDedup[key].result[key2].refType.toDDL(); + if (ddl2.type === "wuresult" || ddl2.type === "roxie" || ddl2.type === "hipie" || ddl2.type === "rest") { + for (const outputID in ddl2.outputs) { + outputs[outputID] = ddl2.outputs[outputID]; + } + } + } + ddl.outputs = {}; + for (const key in outputs) { + ddl.outputs[key] = outputs[key]; + } + } + retVal.push(ddl); + } + return retVal; + } +} + +export class DDLAdapter { + private _dashboard: Dashboard; + private _ec: ElementContainer; + private _dsWriteDedup: DDLDatasourceAdapter = new DDLDatasourceAdapter(); + private _dsReadDedup: { [id: string]: WU | RoxieService | RestService } = {}; + + constructor(dashboard: Dashboard) { + this._dashboard = dashboard; + this._ec = this._dashboard.elementContainer(); + } + + writeDatasources(): DDL2.DatasourceType[] { + for (const viz of this._ec.elements()) { + this._dsWriteDedup.append(viz.hipiePipeline().datasource()); + } + return this._dsWriteDedup.getAll(); + } + + writeFilters(filters: Filters): DDL2.IFilter { + if (!filters.exists()) return undefined; + return filters.toDDL(); + } + + readFilters(ddlFilter: DDL2.IFilter, ec: ElementContainer): Filters { + return Filters.fromDDL(ec, ddlFilter); + } + + writeProject(project: Project): DDL2.IProject { + if (!project.exists()) return undefined; + return project.toDDL(); + } + + readProject(ddlProject: DDL2.IProject): Project { + return Project.fromDDL(ddlProject); + } + + writeMappings(mappings: Mappings): DDL2.IMappings { + if (!mappings.exists()) return { type: "mappings", transformations: [] }; + return mappings.toDDL(); + } + + readMappings(ddlProject: DDL2.IMappings): Mappings { + return Mappings.fromDDL(ddlProject); + } + + writeGroupBy(gb: GroupBy): DDL2.IGroupBy { + if (!gb.exists()) return undefined; + return gb.toDDL(); + } + + readGroupBy(ddlGB: DDL2.IGroupBy): GroupBy { + return GroupBy.fromDDL(ddlGB); + } + + writeSort(sort: Sort): DDL2.ISort { + if (!sort.exists()) return undefined; + return sort.toDDL(); + } + + readSort(ddlSort: DDL2.ISort): Sort { + return Sort.fromDDL(ddlSort); + } + + writeLimit(limit: Limit): DDL2.ILimit { + if (!limit.exists()) return undefined; + return limit.toDDL(); + } + + readLimit(ddlLimit: DDL2.ILimit): Limit { + return Limit.fromDDL(ddlLimit); + } + + readDatasourceRef(ddlDSRef: DDL2.IDatasourceRef, dsPicker: DSPicker, elementContainer: ElementContainer): this { + if (DDL2.isWUResultRef(ddlDSRef)) { + const wu = this._dsReadDedup[ddlDSRef.id] as WU; + dsPicker.datasourceID(wu.output(ddlDSRef.output).id()); + } else if (DDL2.isRoxieServiceRef(ddlDSRef)) { + dsPicker.datasourceID(`${ddlDSRef.id}_${ddlDSRef.output}`); + const dsRef = dsPicker.datasourceRef() as RoxieResultRef | RestResultRef; + dsRef + .request(ddlDSRef.request.map(rf => { + return Param.fromDDL(this._ec, rf); + })) + ; + } else { + dsPicker.datasourceID(ddlDSRef.id); + } + return this; + } + + writeActivities(view: ActivityPipeline): DDL2.ActivityType[] { + return view.activities().map(activity => { + if (activity instanceof Filters) { + return this.writeFilters(activity); + } else if (activity instanceof Project) { + return this.writeProject(activity); + } else if (activity instanceof GroupBy) { + return this.writeGroupBy(activity); + } else if (activity instanceof Sort) { + return this.writeSort(activity); + } else if (activity instanceof Limit) { + return this.writeLimit(activity); + } else if (activity instanceof Mappings) { + return this.writeMappings(activity); + } else if (activity instanceof DSPicker) { + // Fall through --- + } else { + logger.warning(`Unknown activity type: ${activity.classID()}`); + } + }).filter(activity => !!activity); + } + + writeVisualization(visualization: Visualization): DDL2.IVisualization { + return { + id: visualization.chartPanel().id(), + title: visualization.title(), + description: visualization.description(), + visibility: visualization.visibility(), + chartType: visualization.chartType(), + __class: visualization.chartPanel().widget().classID(), + mappings: this.writeMappings(visualization.mappings()), + properties: visualization.properties() + }; + } + + readVisualization(ddlViz: DDL2.IVisualization, visualization: Visualization): this { + const mappings = this.readMappings(ddlViz.mappings); + visualization.chartPanel().id(ddlViz.id); + visualization + .title(ddlViz.title) + .description(ddlViz.description) + .visibility(ddlViz.visibility) + .chartType(ddlViz.chartType as any) + .properties(ddlViz.properties) + .mappings(mappings) + ; + return this; + } + + writeViewDatasource(dsRef: DatasourceRef) { + const retVal = dsRef.toDDL(); + retVal.id = this._dsWriteDedup.resolveID(dsRef) || retVal.id; + return retVal; + } + + writeDDLViews(): DDL2.IView[] { + // Gather referenced fields --- + const refFields: ReferencedFields = { inputs: {}, outputs: {} }; + for (const element of this._ec.elements()) { + element.visualization().mappings().referencedFields(refFields); + } + + return this._ec.elements().map(element => { + const view = element.hipiePipeline(); + const dsPicker = view.datasource(); + if (dsPicker instanceof DSPicker) { + const dsRef = dsPicker.datasourceRef(); + const retVal = { + id: element.id(), + datasource: this.writeViewDatasource(dsRef), + activities: this.writeActivities(view), + visualization: this.writeVisualization(element.visualization()) + }; + return retVal; + } + throw new Error("Missing DSPicker?"); + }); + } + + writeProperties(): DDL2.IProperties { + return { + name: PKG_NAME, + version: PKG_VERSION, + buildVersion: BUILD_VERSION, + layout: this._dashboard.layout() as any + }; + } + + readDDLViews(ddlViews: DDL2.IView[]) { + for (const ddlView of ddlViews) { + const element = new Element(this._ec).id(ddlView.id); + this._ec.append(element); + const hipiePipeline = element.hipiePipeline(); + this.readDatasourceRef(ddlView.datasource, hipiePipeline.datasource() as DSPicker, this._ec); + for (const activity of ddlView.activities) { + if (DDL2.isProjectActivity(activity)) { + const project = this.readProject(activity); + hipiePipeline.project(project); + } + if (DDL2.isFilterActivity(activity)) { + const filters = this.readFilters(activity, this._ec); + hipiePipeline.filters(filters); + } + if (DDL2.isGroupByActivity(activity)) { + const groupBy = this.readGroupBy(activity); + hipiePipeline.groupBy(groupBy); + } + if (DDL2.isSortActivity(activity)) { + const sort = this.readSort(activity); + hipiePipeline.sort(sort); + } + if (DDL2.isLimitActivity(activity)) { + const limit = this.readLimit(activity); + hipiePipeline.limit(limit); + } + } + this.readVisualization(ddlView.visualization, element.visualization()); + } + } + + readProperties(properties: DDL2.IProperties) { + if (properties && properties.layout) { + this._dashboard.layoutObj(properties.layout as object); + } + } + + write(): DDL2.Schema { + this._dsWriteDedup.clear(); + const retVal: DDL2.Schema = { + version: "2.2.1", + createdBy: { + name: PKG_NAME, + version: PKG_VERSION + }, + datasources: this.writeDatasources(), + dataviews: this.writeDDLViews(), + properties: this.writeProperties(), + hipieProperties: this._dashboard.hipieProps() + }; + return retVal; + } + + read(ddl: DDL2.Schema) { + this._dsWriteDedup.clear(); + for (const ddlDS of ddl.datasources) { + switch (ddlDS.type) { + case "databomb": + this._ec.appendDatasource(Databomb.fromDDL(ddlDS)); + break; + case "form": + this._ec.appendDatasource(Form.fromDDL(ddlDS)); + break; + case "logicalfile": + this._ec.appendDatasource(LogicalFile.fromDDL(this._ec, ddlDS)); + break; + case "wuresult": + const wu = WU.fromDDL(this._ec, ddlDS); + this._dsReadDedup[wu.id()] = wu; + for (const resultName in ddlDS.outputs) { + this._ec.appendDatasource(wu.output(resultName)); + } + break; + case "roxie": + case "hipie": + const rs = RoxieService.fromDDL(this._ec, ddlDS); + this._dsReadDedup[rs.id()] = rs; + for (const resultName in ddlDS.outputs) { + this._ec.appendDatasource(RoxieResult.fromDDL(this._ec, rs, resultName)); + } + break; + case "rest": + const rs2 = RestService.fromDDL(this._ec, ddlDS); + this._dsReadDedup[rs2.id()] = rs2; + for (const resultName in ddlDS.outputs) { + this._ec.appendDatasource(RestResult.fromDDL(this._ec, rs2, resultName)); + } + break; + default: + logger.warning(`Unknown ddl datasource type: ${(ddlDS as any).type} `); + } + } + this.readDDLViews(ddl.dataviews); + this.readProperties(ddl.properties); + this._dashboard.hipieProps(ddl.hipieProperties); + } +} diff --git a/packages/marshaller/src/ddl2/ddleditor.css b/packages/marshaller/src/ddl2/ddleditor.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/marshaller/src/ddl2/ddleditor.ts b/packages/marshaller/src/ddl2/ddleditor.ts new file mode 100644 index 0000000000..a546a33a72 --- /dev/null +++ b/packages/marshaller/src/ddl2/ddleditor.ts @@ -0,0 +1,60 @@ +import { JSONEditor } from "@hpcc-js/codemirror"; +import { DDL2, validate2 } from "@hpcc-js/ddl-shim"; +import { Table } from "@hpcc-js/dgrid"; +import { SplitPanel } from "@hpcc-js/phosphor"; + +import "../../src/ddl2/ddleditor.css"; + +export class DDLEditor extends SplitPanel { + summary: string = "0 Errors"; + _ddlEditor = new JSONEditor().on("changes", (changes) => { + this.checkSyntax(); + }); + _errorTable = new Table() + .columns(["dataPath", "keyword", "message", "params"]) + ; + + ddl(): object; + ddl(_: object): this; + ddl(_?: object): object | this { + if (!arguments.length) return this._ddlEditor.json(); + this._ddlEditor.json(_); + this.checkSyntax(); + return this; + } + + checkSyntax() { + try { + const json = this.ddl(); + try { + const { success, errors } = validate2(json as DDL2.Schema); + if (success) { + this._errorTable.data([]); + } else { + this._errorTable.data(errors.map(error => [error.dataPath, error.keyword, error.message, JSON.stringify(error.params)])); + } + } catch (e) { + this._errorTable.data([["", "Validation Failed", "", ""]]); + } + } catch (e) { + this._errorTable.data([["ALL", "Invalid JSON", "", ""]]); + } + if (this._renderCount) { + this._errorTable.lazyRender(); + } + } + + enter(domNode, element) { + super.enter(domNode, element); + this + .addWidget(this._ddlEditor) + .addWidget(this._errorTable) + ; + } + + update(domNode, _element) { + super.update(domNode, _element); + } + +} +DDLEditor.prototype._class += " codemirror_DDLEditor"; diff --git a/packages/marshaller/src/ddl2/dsTable.ts b/packages/marshaller/src/ddl2/dsTable.ts new file mode 100644 index 0000000000..becfc19c27 --- /dev/null +++ b/packages/marshaller/src/ddl2/dsTable.ts @@ -0,0 +1,242 @@ +import { Button, Spacer } from "@hpcc-js/common"; +import { Table } from "@hpcc-js/dgrid"; +import { ChartPanel } from "@hpcc-js/layout"; +import { CommandRegistry, ContextMenu } from "@hpcc-js/phosphor"; +import { text as d3Text } from "d3-fetch"; +import { Databomb } from "./activities/databomb.ts"; +import { DatasourceRefType } from "./activities/datasource.ts"; +import { DSPicker } from "./activities/dspicker.ts"; +import { Form, FormField } from "./activities/form.ts"; +import { LogicalFile } from "./activities/logicalfile.ts"; +import { RestField, RestResult, RestService } from "./activities/rest.ts"; +import { RoxieResult, RoxieService } from "./activities/roxie.ts"; +import { WU, WUResult } from "./activities/wuresult.ts"; +import { ElementContainer } from "./model/element.ts"; + +export class DSTable extends ChartPanel { + + private _addButton = new Button().faChar("fa-plus").tooltip("Add...") + .on("click", () => { + const node = this._addButton.element().node(); + const rect = node.getBoundingClientRect(); + if (this._contextMenu.open({ + target: node, + currentTarget: node, + clientX: rect.left, + clientY: rect.bottom + })) { + } + }); + + private _removeButton = new Button().faChar("fa-minus").tooltip("Remove...") + .enabled(false) + .on("click", () => { + this.remove(); + }); + + private _cloneButton = new Button().faChar("fa-clone").tooltip("Clone...") + .enabled(false) + .on("click", () => { + if (this._selectedDS2) { + if (this._selectedDS2 instanceof Databomb) { + this.add(Databomb.fromDDL(this._selectedDS2.toDDL(), true)); + } else if (this._selectedDS2 instanceof Form) { + this.add(Form.fromDDL(this._selectedDS2.toDDL(), true)); + } else if (this._selectedDS2 instanceof LogicalFile) { + this.add(LogicalFile.fromDDL(this._ec, this._selectedDS2.toDDL(), true)); + } else if (this._selectedDS2 instanceof RestResult) { + this.add(new RestResult(this._ec) + .service(RestService.fromDDL(this._ec, this._selectedDS2.service().toDDL(), true)) + .resultName(this._selectedDS2.resultName()) + ); + } else if (this._selectedDS2 instanceof WUResult) { + this.add(new WUResult(this._ec) + .wu(WU.fromDDL(this._ec, this._selectedDS2.wu().toDDL(), true)) + .resultName(this._selectedDS2.resultName()) + ); + } else if (this._selectedDS2 instanceof RoxieResult) { + this.add(new RoxieResult(this._ec) + .service(RoxieService.fromDDL(this._ec, this._selectedDS2.service().toDDL(), true)) + .resultName(this._selectedDS2.resultName()) + ); + } else { + console.warn("Unknown datasoure type"); + } + } + }); + + private _addSamples = new Button().faChar("fa-database").tooltip("Add Samples") + .on("click", () => { + d3Text("https://raw.githubusercontent.com/hpcc-systems/Visualization/candidate-2.x.x/utils/data/data/airports.csv").then(csv => { + this.add(new Databomb().format("csv").payload(csv)); + }); + d3Text("https://raw.githubusercontent.com/hpcc-systems/Visualization/candidate-2.x.x/utils/data/data/carriers.csv").then(csv => { + this.add(new Databomb().format("csv").payload(csv)); + }); + d3Text("https://raw.githubusercontent.com/hpcc-systems/Visualization/candidate-2.x.x/utils/data/data/stats.csv").then(csv => { + this.add(new Databomb().format("csv").payload(csv)); + }); + this.add(new RestResult(this._ec) + .service(new RestService(this._ec) + .url("https://cmsapi.pulselive.com/") + .action("rugby/rankings/mru") + .requestFields([ + new RestField().fieldID("xxx"), + new RestField().fieldID("date") + ])) + .resultName("entries") + ); + this.add(new WUResult(this._ec) + .wu(new WU(this._ec).url("http://localhost:8010").wuid("W20190802-112509")) + .resultName("Result 1") + ); + this.add(new LogicalFile(this._ec) + .url("http://localhost:8010") + .logicalFile("progguide::exampledata::peopleaccts") + ); + this.add(new LogicalFile(this._ec) + .url("http://localhost:8010") + .logicalFile("progguide::exampledata::people") + ); + const vmRoxie = new RoxieService(this._ec) + .url("http://localhost:8002") + .querySet("roxie") + .queryID("peopleaccounts") + ; + this.add(new RoxieResult(this._ec) + .service(vmRoxie) + .resultName("Accounts") + ); + this.add(new Form() + .formFields([ + new FormField().type("number").fieldID("id").value(8), + new FormField().fieldID("first_name").value("John"), + new FormField().fieldID("last_name").value("Doe"), + new FormField().fieldID("gender").default("M"), + new FormField().type("number").fieldID("age") + ]) + ); + this.render(); + }); + + private _dstable = new Table(); + private _selectedDS; + private _selectedDS2; + + private _contextMenu; + + constructor(private _ec: ElementContainer) { + super(); + this + .buttons([this._addButton, this._removeButton, new Spacer(), this._cloneButton, new Spacer(), this._addSamples]) + .widget(this._dstable) + .columns(["ID", "Type", "References"]) + .on("click", (row, col, sel) => { + this._selectedDS2 = row.__lparam; + if (sel && row.References === 0 && row.ID !== "Empty") { + this._selectedDS = row.__lparam; + } else { + delete this._selectedDS; + } + this._removeButton.enabled(this._selectedDS !== undefined).render(); + this._cloneButton.enabled(this._selectedDS2 !== undefined).render(); + }) + ; + + this.initMenu(); + } + + initMenu() { + const commands = new CommandRegistry(); + + // Dashboard Commands --- + commands.addCommand("add_wu_result", { + label: "Workunit Result", + execute: () => { + this.add(new WUResult(this._ec)); + } + }); + + commands.addCommand("add_logicalfile", { + label: "Logical File", + execute: () => { + this.add(new LogicalFile(this._ec)); + } + }); + + commands.addCommand("add_roxie", { + label: "Roxie Service", + execute: () => { + this.add(new RoxieResult(this._ec)); + } + }); + + commands.addCommand("add_rest", { + label: "Rest", + execute: () => { + this.add(new RestResult(this._ec)); + } + }); + + commands.addCommand("add_databomb", { + label: "Databomb", + execute: () => { + this.add(new Databomb()); + } + }); + + commands.addCommand("add_form", { + label: "Form", + execute: () => { + this.add(new Form()); + } + }); + + this._contextMenu = new ContextMenu({ commands }); + this._contextMenu.addItem({ command: "add_wu_result", selector: ".common_Button" }); + this._contextMenu.addItem({ command: "add_logicalfile", selector: ".common_Button" }); + this._contextMenu.addItem({ command: "add_roxie", selector: ".common_Button" }); + this._contextMenu.addItem({ command: "add_rest", selector: ".common_Button" }); + this._contextMenu.addItem({ command: "add_databomb", selector: ".common_Button" }); + this._contextMenu.addItem({ command: "add_form", selector: ".common_Button" }); + } + + add(ds: DatasourceRefType) { + this._ec.appendDatasource(ds); + this.render(); + } + + remove() { + if (this._selectedDS) { + this._ec.removeDatasource(this._selectedDS); + this.render(); + } + } + + private _prevDataID; + render(callback?) { + const refs = {}; + this._ec.elements().forEach(e => { + let ds = e.hipiePipeline().datasource(); + if (ds instanceof DSPicker) { + ds = ds.datasource(); + } + if (refs[ds.id()] === undefined) { + refs[ds.id()] = 0; + } + refs[ds.id()]++; + }); + const data = this._ec.datasources().filter(ds => ds.id() !== "Empty").map(ds => { + if (refs[ds.id()] === undefined) { + refs[ds.id()] = 0; + } + return [ds.id(), ds.classID(), refs[ds.id()] || 0, ds]; + }); + const dataID = JSON.stringify(refs); + if (this._prevDataID !== dataID) { + this._prevDataID = dataID; + this.data(data); + } + return super.render(callback); + } +} diff --git a/packages/marshaller/src/ddl2/dvTable.ts b/packages/marshaller/src/ddl2/dvTable.ts new file mode 100644 index 0000000000..0800c103d7 --- /dev/null +++ b/packages/marshaller/src/ddl2/dvTable.ts @@ -0,0 +1,31 @@ +import { Table } from "@hpcc-js/dgrid"; +import { ChartPanel } from "@hpcc-js/layout"; +import { hashSum } from "@hpcc-js/util"; +import { ElementContainer } from "./model/element.ts"; + +export class DVTable extends ChartPanel { + + private _dvtable = new Table(); + + constructor(private _ec: ElementContainer) { + super(); + this + .titleVisible(false) + .widget(this._dvtable) + .columns(["ID", "Title"]) + ; + } + + private _prevDataID; + render(callback?) { + const data = this._ec.elements().map(elem => { + return [elem.id(), elem.visualization().title(), elem]; + }); + const dataID = hashSum(data.map(row => row[0])); + if (this._prevDataID !== dataID) { + this._prevDataID = dataID; + this.data(data); + } + return super.render(callback); + } +} diff --git a/packages/marshaller/src/ddl2/graphadapter.ts b/packages/marshaller/src/ddl2/graphadapter.ts new file mode 100644 index 0000000000..76a3400ee0 --- /dev/null +++ b/packages/marshaller/src/ddl2/graphadapter.ts @@ -0,0 +1,297 @@ +import { Widget } from "@hpcc-js/common"; +import { Edge, IGraphData, Lineage, Subgraph, Vertex } from "@hpcc-js/graph"; +import { Activity } from "./activities/activity.ts"; +import { Databomb } from "./activities/databomb.ts"; +import { DSPicker } from "./activities/dspicker.ts"; +import { Form } from "./activities/form.ts"; +import { LogicalFile } from "./activities/logicalfile.ts"; +import { RestResult, RestResultRef } from "./activities/rest.ts"; +import { RoxieResult, RoxieResultRef } from "./activities/roxie.ts"; +import { WUResult } from "./activities/wuresult.ts"; +import { Element, ElementContainer, State } from "./model/element.ts"; +import { Visualization } from "./model/visualization.ts"; +import { VizChartPanel } from "./model/vizChartPanel.ts"; + +export interface VertexData { + view?: Element; + activity?: Activity; + visualization?: Visualization; + chartPanel?: VizChartPanel; + state?: State; +} + +export class GraphAdapter { + private subgraphMap: { [key: string]: Subgraph } = {}; + private vertexMap: { [key: string]: Vertex } = {}; + private edgeMap: { [key: string]: Edge } = {}; + private hierarchy: Lineage[] = []; + private vertices: Widget[] = []; + private edges: Edge[] = []; + + constructor(private _ec: ElementContainer) { + } + + clear() { + this.subgraphMap = {}; + this.vertexMap = {}; + this.edgeMap = {}; + + this.hierarchy = []; + this.vertices = []; + this.edges = []; + } + + createSubgraph(id: string, label: string, data?: VertexData): Subgraph { + let retVal: Subgraph = this.subgraphMap[id]; + if (!retVal) { + retVal = new Subgraph() + // .classed({ subgraph: true }) + // .showIcon(false) + .columns(["DS"]) + .data([[data]]) + ; + this.subgraphMap[id] = retVal; + } + this.vertices.push(retVal); + retVal.title(`${label}`); + retVal.getBBox(true); + return retVal; + } + + createVertex(id: string, label: string, data?: VertexData, tooltip: string = "", fillColor: string = "#dcf1ff"): Vertex { + let retVal: Vertex = this.vertexMap[id]; + if (!retVal) { + retVal = new Vertex() + .columns(["DS"]) + .data([[data]]) + .icon_diameter(0) + ; + this.vertexMap[id] = retVal; + } + this.vertices.push(retVal); + retVal + .textbox_shape_colorFill(fillColor) + .text(tooltip ? `${label}\n${tooltip}` : `${label}`) + .tooltip(tooltip) + ; + retVal.getBBox(true); + return retVal; + } + + createEdge(sourceID: string, targetID: string) { + const edgeID = `${sourceID}->${targetID}`; + let retVal = this.edgeMap[edgeID]; + if (!retVal) { + retVal = new Edge() + .sourceVertex(this.vertexMap[sourceID]) + .targetVertex(this.vertexMap[targetID]) + ; + this.edgeMap[edgeID] = retVal; + } + this.edges.push(retVal); + return retVal; + } + + createDatasource(dsDetails: Activity): string { + if (dsDetails instanceof DSPicker) { + dsDetails = dsDetails.selection().datasource(); + } + if (dsDetails instanceof WUResult) { + const serverID = `${dsDetails.url()}`; + const server: Subgraph = this.createSubgraph(serverID, `${serverID}`); + const wuID = `${dsDetails.url()}/${dsDetails.wuid()}`; + const wu: Subgraph = this.createSubgraph(wuID, `${dsDetails.wuid()}`); + this.hierarchy.push({ parent: server, child: wu }); + const resultID = `${wuID}/${dsDetails.resultName()}`; + const result: Vertex = this.createVertex(resultID, dsDetails.resultName(), { activity: dsDetails }); + this.hierarchy.push({ parent: wu, child: result }); + return resultID; + } else if (dsDetails instanceof LogicalFile) { + const serverID = `${dsDetails.url()}`; + const server: Subgraph = this.createSubgraph(serverID, `${serverID}`); + const lfID = `${serverID}/${dsDetails.logicalFile()}`; + const lf: Vertex = this.createVertex(lfID, dsDetails.logicalFile(), { activity: dsDetails }); + this.hierarchy.push({ parent: server, child: lf }); + return lfID; + } else if (dsDetails instanceof RoxieResultRef) { + const serverID = `${dsDetails.url()}`; + const server: Subgraph = this.createSubgraph(serverID, `${serverID}`); + const surfaceID = dsDetails.serviceID(); // `${dsDetails.url()}/${dsDetails.querySet()}`; + const surface: Subgraph = this.createSubgraph(surfaceID, dsDetails.querySet()); + this.hierarchy.push({ parent: server, child: surface }); + const roxieID = surfaceID; + this.hierarchy.push({ + parent: surface, + child: this.createVertex(roxieID, dsDetails.queryID()) + }); + const roxieResultID = `${surfaceID}/${dsDetails.resultName()}`; + this.hierarchy.push({ + parent: surface, + child: this.createVertex(roxieResultID, dsDetails.resultName(), { activity: dsDetails }) + }); + this.createEdge(roxieID, roxieResultID); + return roxieResultID; + } else if (dsDetails instanceof RoxieResult) { + const serverID = `${dsDetails.service().url()}`; + const server: Subgraph = this.createSubgraph(serverID, `${serverID}`); + const querySetID = dsDetails.serviceID(); + const querySet: Subgraph = this.createSubgraph(querySetID, dsDetails.service().querySet()); + this.hierarchy.push({ parent: server, child: querySet }); + const queryID = `${querySetID}/${dsDetails.service().queryID()}`; + const query: Subgraph = this.createSubgraph(queryID, dsDetails.service().queryID()); + this.hierarchy.push({ parent: querySet, child: query }); + const resultID = `${queryID}/${dsDetails.resultName()}`; + this.hierarchy.push({ + parent: query, + child: this.createVertex(resultID, dsDetails.resultName(), { activity: dsDetails }) + }); + this.createEdge(queryID, resultID); + return resultID; + } else if (dsDetails instanceof RestResultRef) { + const serverID = `${dsDetails.url()}`; + const server: Subgraph = this.createSubgraph(serverID, `${serverID}`); + const surfaceID = dsDetails.serviceID(); + const surface: Subgraph = this.createSubgraph(surfaceID, dsDetails.action()); + this.hierarchy.push({ parent: server, child: surface }); + const roxieID = surfaceID; + this.hierarchy.push({ + parent: surface, + child: this.createVertex(roxieID, dsDetails.action()) + }); + const roxieResultID = `${surfaceID}/${dsDetails.resultName()}`; + this.hierarchy.push({ + parent: surface, + child: this.createVertex(roxieResultID, dsDetails.resultName(), { activity: dsDetails }) + }); + this.createEdge(roxieID, roxieResultID); + return roxieResultID; + } else if (dsDetails instanceof RestResult) { + const serverID = `${dsDetails.service().url()}`; + const server: Subgraph = this.createSubgraph(serverID, `${serverID}`); + const serviceID = dsDetails.serviceID(); + const actionID = `${serverID}/${dsDetails.service().action()}`; + const action: Subgraph = this.createSubgraph(serviceID, dsDetails.service().action()); + this.hierarchy.push({ parent: server, child: action }); + const resultID = `${actionID}/${dsDetails.resultName()}`; + this.hierarchy.push({ + parent: action, + child: this.createVertex(resultID, dsDetails.resultName(), { activity: dsDetails }) + }); + this.createEdge(actionID, resultID); + return resultID; + } else if (dsDetails instanceof Form) { + const id = dsDetails.hash(); + this.createVertex(id, dsDetails.label(), { activity: dsDetails }); + return id; + } else if (dsDetails instanceof Databomb) { + const id = dsDetails.id(); + this.createVertex(id, dsDetails.label(), { activity: dsDetails }); + return id; + } else { + const id = dsDetails.hash(); + this.createVertex(id, dsDetails.label(), { activity: dsDetails }); + return id; + } + } + + createActivity(sourceID: string, view: Element, activity: Activity, label?: string): string { + const surface: Subgraph = this.createSubgraph(view.id(), `${view.id()}`, { view }); + let fillColor = null; + let tooltip = ""; + if (activity.exists()) { + const errors = activity.validate(); + if (errors.length) { + fillColor = "pink"; + tooltip = errors.map(error => `${error.source}: ${error.msg}`).join("\n"); + } + } else { + fillColor = "lightgrey"; + } + const vertex: Vertex = this.createVertex(activity.id(), label || `${activity.classID()}`, { view, activity }, tooltip, fillColor); + if (sourceID) { + this.createEdge(sourceID, activity.id()); + } + this.hierarchy.push({ parent: surface, child: vertex }); + return activity.id(); + } + + createGraph(): IGraphData { + this.hierarchy = []; + this.vertices = []; + this.edges = []; + + this._ec.elements().forEach(e => { + this.createDatasource(e.hipiePipeline().datasource()); + }); + + const lastID: { [key: string]: string } = {}; + for (const view of this._ec.elements()) { + const pipeline = view.hipiePipeline(); + let prevID = this.createDatasource(pipeline.datasource()); + for (const activity of pipeline.activities()) { + prevID = this.createActivity(prevID, view, activity); + } + const visualization = view.visualization(); + const mappings = visualization.mappings(); + const mappingVertexID = this.createActivity(prevID, view, mappings, "Mappings"); + const vizSubgraphID = `${visualization.id()}-sg`; + const surface: Subgraph = this.createSubgraph(vizSubgraphID, "Visualization", { visualization }); + this.hierarchy.push({ + parent: this.subgraphMap[view.id()], + child: surface + }); + this.hierarchy.push({ + parent: surface, + child: this.vertexMap[mappings.id()] + }); + const vizVertexID = `${visualization.id()}-viz`; + const widgetVertex: Vertex = this.createVertex(vizVertexID, visualization.chartPanel().widget().classID(), { view, chartPanel: visualization.chartPanel() }); + this.createEdge(mappingVertexID, vizVertexID); + this.hierarchy.push({ + parent: surface, + child: widgetVertex + }); + const stateVertexID = `${visualization.id()}-state`; + const stateVertex: Vertex = this.createVertex(stateVertexID, "Selection", { view, state: view.state() }); + this.createEdge(vizVertexID, stateVertexID) + .weight(10) + .strokeDasharray("1,5") + .text("updates") + ; + this.createEdge(prevID, stateVertexID); + this.hierarchy.push({ + parent: this.subgraphMap[view.id()], + child: stateVertex + }); + prevID = stateVertexID; + lastID[pipeline.id()] = prevID; + } + + // Mapping Secondary Sources --- + for (const view of this._ec.elements()) { + const visualization = view.visualization(); + const secondaryElement = this._ec.element(visualization.secondaryDataviewID()); + if (secondaryElement) { + const mappings = secondaryElement.visualization().mappings(); + this.createEdge(mappings.id(), `${visualization.id()}-viz`); + } + } + + for (const viz of this._ec.elements()) { + const view = viz.hipiePipeline(); + for (const updateInfo of view.updatedByGraph()) { + this.createEdge(lastID[this._ec.element(updateInfo.from).hipiePipeline().id()], updateInfo.to.id()) + .weight(10) + .strokeDasharray("1,5") + .text("updates") + ; + } + } + + return { + vertices: this.vertices, + edges: this.edges, + hierarchy: this.hierarchy + }; + } +} diff --git a/packages/marshaller/src/ddl2/javascriptadapter.ts b/packages/marshaller/src/ddl2/javascriptadapter.ts new file mode 100644 index 0000000000..aa309e461c --- /dev/null +++ b/packages/marshaller/src/ddl2/javascriptadapter.ts @@ -0,0 +1,354 @@ +import { PropertyExt } from "@hpcc-js/common"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { classID2Meta, ClassMeta, isArray } from "@hpcc-js/util"; +import { Activity, stringify } from "./activities/activity.ts"; +import { Dashboard } from "./dashboard.ts"; +import { DDLAdapter } from "./ddl.ts"; +import { ElementContainer } from "./model/element.ts"; + +type WidgetImport = { [moduleID: string]: { [classID: string]: boolean } }; + +class Imports { + _moduleMap: WidgetImport = {}; + + append(widgetMeta: ClassMeta) { + if (!this._moduleMap[widgetMeta.module]) { + this._moduleMap[widgetMeta.module] = {}; + } + this._moduleMap[widgetMeta.module][widgetMeta.class] = true; + } + + write(): string { + const importJS: string[] = []; + for (const moduleID in this._moduleMap) { + const classIDs: string[] = []; + for (const classID in this._moduleMap[moduleID]) { + classIDs.push(classID); + } + classIDs.sort(); + importJS.push(`import { ${classIDs.join(", ")} } from "${moduleID}";`); + } + return importJS.join("\n"); + } +} + +export function createProps(pe: PropertyExt): { [key: string]: any } { + const retVal: { [key: string]: any } = {}; + for (const meta of pe.publishedProperties()) { + if (pe[meta.id + "_modified"]() && meta.id !== "fields") { + const val = pe[meta.id](); + switch (meta.type) { + case "propertyArray": + const serialization = val.map(createProps); + if (serialization) { + retVal[meta.id] = serialization; + } + break; + default: + retVal[meta.id] = val; + } + } + } + return retVal; +} + +export class JavaScriptAdapter { + private _dashboard: Dashboard; + private _ec: ElementContainer; + private _ddlAdapter: DDLAdapter; + private _ddlSchema: DDL2.Schema; + + constructor(dashboard: Dashboard) { + this._dashboard = dashboard; + this._ec = this._dashboard.elementContainer(); + this._ddlAdapter = new DDLAdapter(this._dashboard); + this._ddlSchema = this._ddlAdapter.write(); + } + + createProps(prefix: string, pe: PropertyExt, postfix: string = ""): string[] { + let retVal: string[] = []; + for (const meta of pe.publishedProperties()) { + if ((pe as any)[meta.id + "_exists"]()) { + switch (meta.type) { + case "string": + case "set": + retVal.push(`${prefix}.${meta.id}("${(pe as any)[meta.id]()}")${postfix};`); + break; + case "number": + case "boolean": + retVal.push(`${prefix}.${meta.id}(${(pe as any)[meta.id]()})${postfix};`); + break; + case "widget": + retVal = retVal.concat(this.createProps(`${prefix}.${meta.id}()`, (pe as any)[meta.id]())); + break; + case "propertyArray": + if (meta.ext) + retVal.push(`${prefix}.${meta.id}([${(pe as any)[meta.id]()}])${postfix};`); + break; + default: + break; + } + } + } + return retVal; + } + + writeMeta(dsDetails: Activity) { + return ""; + } + + private safeID(id: string): string { + if (!id) return id; + return id.replace(/ /g, "_").replace(/\./g, "_"); + } + + private datasourceRefID(view: DDL2.IView): string { + const datasourceRef = view.datasource; + if (DDL2.isRoxieServiceRef(datasourceRef)) { + return `${this.safeID(datasourceRef.id)}_${this.safeID(datasourceRef.output)}_${this.safeID(view.id)}`; + } else if (DDL2.isWUResultRef(datasourceRef)) { + return `${this.safeID(datasourceRef.id)}_${this.safeID(datasourceRef.output)}`; + } + return `${this.safeID(datasourceRef.id)}`; + } + + _dedup: { [key: string]: boolean } = {}; + private writeDatasource(view: DDL2.IView): string[] { + const datasourceRef = view.datasource; + const retVal: string[] = []; + const datasource = this._ddlSchema.datasources.filter(ds => ds.id === datasourceRef.id)[0]; + const outputID = (datasourceRef as any).output; + const id = this.datasourceRefID(view); + if (!this._dedup[id]) { + this._dedup[id] = true; + switch (datasource.type) { + case "wuresult": + const wuID = this.safeID(view.datasource.id); + if (!this._dedup[wuID]) { + this._dedup[wuID] = true; + retVal.push(` export const ${wuID} = new marshaller.WU() + .url("${datasource.url}") + .wuid("${datasource.wuid}") + ;`); + } + retVal.push(` export const ${id} = new marshaller.WUResult() + .wu(${wuID}) + .resultName("${outputID}") + .responseFields(${stringify(datasource.outputs[outputID].fields)}) + ;`); + break; + case "logicalfile": + retVal.push(` export const ${id} = new marshaller.LogicalFile() + .url("${datasource.url}") + .logicalFile("${datasource.logicalFile}") + .responseFields(${stringify(datasource.fields)}) + ;`); + break; + case "hipie": + case "roxie": + const serviceID = this.safeID(view.datasource.id); + if (!this._dedup[serviceID]) { + this._dedup[serviceID] = true; + retVal.push(` export const ${serviceID} = new marshaller.RoxieService(ec) + .url("${datasource.url}") + .querySet("${datasource.querySet}") + .queryID("${datasource.queryID}") + .requestFields(${stringify(datasource.inputs)}) + ;`); + } + const resultID = serviceID + "_" + this.safeID(outputID); + if (!this._dedup[resultID]) { + this._dedup[resultID] = true; + retVal.push(` export const ${resultID} = new marshaller.RoxieResult(ec) + .service(${serviceID}) + .resultName("${outputID}") + .responseFields(${stringify(datasource.outputs[outputID].fields)}) + ;`); + } + retVal.push(` export const ${id} = new marshaller.HipieResultRef(ec) + .datasource(${resultID}) + .requestFieldRefs(${stringify((datasourceRef as DDL2.IRoxieServiceRef).request)}) + ;`); + break; + case "databomb": + { + retVal.push(` export const ${id} = new marshaller.Databomb() + .format("${datasource.format}") + .payload(${JSON.stringify(datasource.payload)}) + ;`); + } + break; + case "form": + { + const fromFields: string[] = []; + for (const field of datasource.fields) { + fromFields.push(`new marshaller.FormField().fieldID("${field.id}").default("${field.default || ""}")`); + } + retVal.push(` export const ${id} = new marshaller.Form() + .formFields([ + ${fromFields.join(",\n ")} + ]) + ;`); + } + break; + } + } + return retVal; + } + + private writeActivity(activity: DDL2.ActivityType): string { + switch (activity.type) { + case "filter": + return `new marshaller.Filters(ec).conditions(${stringify(activity.conditions)})`; + case "project": + return `new marshaller.Project().transformations(${stringify(activity.transformations)})`; + case "groupby": + return `new marshaller.GroupBy().fieldIDs(${JSON.stringify(activity.groupByIDs)}).aggregates(${stringify(activity.aggregates)})`; + case "sort": + return `new marshaller.Sort().conditions(${stringify(activity.conditions)})`; + case "limit": + return `new marshaller.Limit().rows(${activity.limit})`; + case "mappings": + return `new marshaller.Mappings().transformations(${stringify(activity.transformations)})`; + } + } + + writeWidgetProps(pe: PropertyExt): string[] { + const retVal: string[] = []; + for (const meta of pe.publishedProperties()) { + if ((pe as any)[meta.id + "_modified"]() && meta.id !== "fields") { + retVal.push(`.${meta.id}(${JSON.stringify((pe as any)[meta.id]())})`); + } + } + return retVal; + } + + private joinWithPrefix(props: DDL2.IWidgetProperties, imports: Imports, joinStr: string, postFix: string): string { + let retVal: string = ""; + let meta: ClassMeta; + if (props.__class) { + meta = classID2Meta(props.__class); + imports.append(meta); + retVal += `new ${meta.class}()`; + } + for (const prop in props) { + if (prop === "__class") { + } else if (isArray(props[prop])) { + const arr = `${(props[prop] as any[]).map(item => this.joinWithPrefix(item, imports, joinStr + " ", "")).join(`,${joinStr} `)}`; + if (arr) { + retVal += `${joinStr} .${prop}([${joinStr} ${arr}${joinStr} ])${postFix}`; + } + } else { + retVal += `${joinStr} .${prop}(${JSON.stringify(props[prop])})${postFix}`; + } + } + return retVal; + } + + private writeWidget(dataview: DDL2.IView, imports: Imports): string { + return ` export const ${dataview.visualization.id} = new marshaller.VizChartPanel() + .id("${dataview.visualization.id}") + .title("${dataview.visualization.title}") + .widget(${this.joinWithPrefix(dataview.visualization.properties["widget"] as any, imports, "\n ", "")}) + ;`; + } + + private writeElement(dataview: DDL2.IView) { + const activities: string[] = [`data.${this.datasourceRefID(dataview)}`]; + for (const activity of dataview.activities) { + activities.push(this.writeActivity(activity)); + } + const updates: string[] = []; + for (const filteredViz of this._ec.filteredBy(dataview.id)) { + updates.push(`${filteredViz.id()}.refresh();`); + } + return ` +const ${dataview.id} = new marshaller.Element(ec) + .id("${dataview.id}") + .pipeline([ + ${activities.join(",\n ")} + ]) + .mappings(new marshaller.Mappings().transformations(${stringify(dataview.visualization.mappings.transformations)})) + .chartPanel(viz.${dataview.visualization.id}) + .on("selectionChanged", () => { + ${updates.join("\n ")} + }, true) + ; +${dataview.id}.visualization() + .visibility("${dataview.visualization.visibility}") + .secondaryDataviewID("${dataview.visualization.secondaryDataviewID || ""}") + ; +ec.append(${dataview.id}); +`; + } + + private writeDatasources(): string[] { + let retVal: string[] = []; + for (const dataview of this._ddlSchema.dataviews) { + retVal = retVal.concat(this.writeDatasource(dataview)); + } + return retVal; + } + + private writeWidgets(): { widgetImports: string, widgetDefs: string } { + const jsDef: string[] = []; + const imports = new Imports(); + for (const dataview of this._ddlSchema.dataviews) { + jsDef.push(this.writeWidget(dataview, imports)); + } + return { + widgetImports: imports.write(), + widgetDefs: jsDef.join("\n\n") + }; + } + + private writeElements(): string { + let retVal = ""; + for (const dataview of this._ddlSchema.dataviews) { + retVal += this.writeElement(dataview); + } + return retVal; + } + + createJavaScript(): string { + const widgets = this.writeWidgets(); + + return `\ +${widgets.widgetImports} +import * as marshaller from "@hpcc-js/marshaller"; + +// Dashboard Element Container (Model) --- +const ec = new marshaller.ElementContainer(); + +namespace data { +${this.writeDatasources().join("\n")} +} + +namespace viz { +${widgets.widgetDefs} +} + +// Dashboard Elements (Controller) --- +${this.writeElements().trim()} + +ec.refresh(); + +// Optional --- +const errors = ec.validate(); +for (const error of errors) { + console.error(error.elementID + " (" + error.source + "): " + error.msg); +} + +export const dashboard = new marshaller.Dashboard(ec) + .target("placeholder") + .titleVisible(false) + .hideSingleTabs(true) + .layoutObj(${stringify(this._dashboard.layout())}) + .render() + ; + +// @ts-ignore +const ddl = ${JSON.stringify(this._ddlSchema)}; +`; + } +} diff --git a/packages/marshaller/src/ddl2/model/element.ts b/packages/marshaller/src/ddl2/model/element.ts new file mode 100644 index 0000000000..9e3247f7da --- /dev/null +++ b/packages/marshaller/src/ddl2/model/element.ts @@ -0,0 +1,412 @@ +import { PropertyExt, Widget } from "@hpcc-js/common"; +import { IOptionsSend } from "@hpcc-js/comms"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { find, hashSum, isArray } from "@hpcc-js/util"; +import { Activity, IActivityError } from "../activities/activity.ts"; +import { emptyDatabomb } from "../activities/databomb.ts"; +import { DatasourceRefType } from "../activities/datasource.ts"; +import { HipiePipeline } from "../activities/hipiepipeline.ts"; +import { Mappings } from "../activities/project.ts"; +import { Visualization } from "./visualization.ts"; +import { VizChartPanel } from "./vizChartPanel.ts"; + +export class State extends PropertyExt { + + constructor() { + super(); + this.selection([]); + } + + set(_: Array<{ [key: string]: any }>): boolean { + const currSelHash = hashSum(this.selection()); + const newSelHash = hashSum(_); + if (currSelHash !== newSelHash) { + this.selection(_); + return true; + } + return false; + } + + removeInvalid(data: ReadonlyArray): boolean { + const currSelection = this.selection(); + const newSelection: object[] = []; + for (const selRow of currSelection) { + if (find(data, (row: { [key: string]: any }, index): boolean => { + for (const column in selRow) { + if (selRow[column] !== row[column]) { + return false; + } + } + return true; + })) { + newSelection.push(selRow); + } + } + if (newSelection.length !== currSelection.length) { + this.selection(newSelection); + return true; + } + return false; + } +} +State.prototype._class += " State"; +export interface State { + selection(): Array<{ [key: string]: any }>; + selection(_: Array<{ [key: string]: any }>): this; +} +State.prototype.publish("selection", [], "array", "State"); + +let vizID = 0; +export class Element extends PropertyExt { + private _vizChartPanel: Visualization; + + _origVisualization; + + declare _visualization: Visualization; + + constructor(private _ec: ElementContainer) { + super(); + while (true) { + vizID++; + this._id = `e_${vizID}`; + if (!this._ec.elementExists(this._id)) { + break; + } + } + const view = new HipiePipeline(this._ec, this._id); + this.hipiePipeline(view); + this._vizChartPanel = new Visualization(this._ec, this.hipiePipeline()) + .id(`viz_${vizID}`) + .title(`Element ${vizID}`) + ; + this._vizChartPanel.chartPanel().id(`cp_${vizID}`); + this.visualization(this._vizChartPanel); + this.state(new State()); + } + + id(): string; + id(_: string): this; + id(_?: string): string | this { + const retVal = super.id.apply(this, arguments); + if (arguments.length) { + this._vizChartPanel.id(_); + } + return retVal; + } + + chartType(): string { + return this._vizChartPanel.chartType(); + } + + chartPanel(): VizChartPanel; + chartPanel(_: VizChartPanel): this; + chartPanel(_?: VizChartPanel): VizChartPanel | this { + if (!arguments.length) return this._vizChartPanel.chartPanel(); + this._vizChartPanel.chartPanel(_); + return this; + } + + chart(): Widget { + return this._vizChartPanel.chartPanel().widget(); + } + + mappings(): Mappings; + mappings(_: Mappings): this; + mappings(_?: Mappings): Mappings | this { + if (!arguments.length) return this._vizChartPanel.mappings(); + this._vizChartPanel.mappings(_); + return this; + } + + pipeline(activities: Activity[]): this { + this.hipiePipeline() + .activities(activities) + ; + return this; + } + + updatedBy(): string[] { + const retVal = this.hipiePipeline().updatedBy(); + if (this.visualization().secondaryDataviewID_exists()) { + retVal.push(this.visualization().secondaryDataviewID()); + } + return retVal; + } + + dataProps(): PropertyExt { + return this.hipiePipeline(); + } + + vizProps(): Widget { + return this.visualization().chartPanel(); + } + + stateProps(): PropertyExt { + return this.state(); + } + + private _errors: IElementError[] = []; + errors(): IElementError[] { + return this._errors; + } + + validate(): IElementError[] { + if (!this._initialized) { + return []; + } + this._errors = []; + const pipeline = this.hipiePipeline(); + for (const activity of [...pipeline.activities(), this.mappings()]) { + for (const error of activity.validate()) { + this._errors.push({ + elementID: this.id(), + ...error + }); + } + } + return this._errors; + } + + private _initialized = false; + refresh(): Promise { + const filters = this.hipiePipeline().filters().validFilters(); + const desc: string[] = filters.map(f => f.createFilterDescription()); + this.visualization().chartPanel().description(desc.join(", ")); + return this.visualization().refresh().then(() => { + this._initialized = true; + const data = this.hipiePipeline().outData(); + if (this.visualization().chartType() === "FieldForm") { + if (this.state().set([...data])) { + this.selectionChanged(); + } + } else { + if (this.state().removeInvalid(data)) { + this.selectionChanged(); + } + } + }); + } + + // Selection --- + selection(): object[]; + selection(_: object[]): this; + selection(_?: object[]): object[] | this { + if (!arguments.length) return this.state().selection(); + this.state().selection(_); + this.selectionChanged(); + return this; + } + + // Events --- + selectionChanged() { + const promises: Array> = []; + for (const filteredViz of this._ec.filteredBy(this.id())) { + promises.push(filteredViz.refresh()); + } + Promise.all(promises).then(() => { + this._ec.vizStateChanged(this); + }); + } + + monitor(func: (id: string, newVal: any, oldVal: any, source: PropertyExt) => void): { remove: () => void; } { + return this.hipiePipeline().monitor(func); + } +} +Element.prototype._class += " Viz"; + +export interface Element { + hipiePipeline(): HipiePipeline; + hipiePipeline(_: HipiePipeline): this; + visualization(): Visualization; + visualization(_: Visualization): this; + state(): State; + state(_: State): this; +} + +Element.prototype.publish("hipiePipeline", null, "widget", "Data View"); +Element.prototype.publish("visualization", null, "widget", "Visualization"); +Element.prototype.publish("state", null, "widget", "State"); + +Element.prototype._origVisualization = Element.prototype.visualization; +Element.prototype.visualization = function (this: Element, _?) { + const retVal = Element.prototype._origVisualization.apply(this, arguments); + if (_ !== undefined) { + this._visualization + .on("click", (_row: object | object[], col: string, sel: boolean, more?) => { + if (more && more.selection) { + this.selection(sel ? more.selection.map(r => r.__lparam || r) : []); + } else { + const row: any[] = isArray(_row) ? _row : [_row]; + this.selection(sel ? row.map(r => r.__lparam || r) : []); + } + }) + .on("vertex_click", (_row: object | object[], col: string, sel: boolean) => { + const row: any[] = isArray(_row) ? _row : [_row]; + this.selection(sel ? row.map(r => r.__lparam || r) : []); + }) + ; + } + return retVal; +}; + +export interface IPersist { + ddl: DDL2.Schema; + layout: any; +} + +export interface IElementError extends IActivityError { + elementID: string; +} + +export class ElementContainer extends PropertyExt { + + private _nullElement; + + private _datasources: DatasourceRefType[] = [emptyDatabomb]; + private _elements: Element[] = []; + + constructor() { + super(); + this.clear(); + this._nullElement = new Element(this); + } + + clear(eid?: string) { + this._datasources = eid === undefined ? [emptyDatabomb] : this._datasources; + this._elements = eid === undefined ? [] : this._elements.filter(d => d.id() !== eid); + } + + private _hookSend: IOptionsSend; + hookSend(): IOptionsSend; + hookSend(_: IOptionsSend): this; + hookSend(_?: IOptionsSend): IOptionsSend | this { + if (!arguments.length) return this._hookSend; + this._hookSend = _; + return this; + } + + datasources(): DatasourceRefType[]; + datasources(_: DatasourceRefType[]): this; + datasources(_?: DatasourceRefType[]): DatasourceRefType[] | this { + if (!arguments.length) return this._datasources; + this._datasources = _; + return this; + } + + datasource(id): DatasourceRefType { + return this._datasources.filter(ds => ds.id() === id)[0]; + } + + appendDatasource(ds: DatasourceRefType): this { + this._datasources.push(ds); + return this; + } + + removeDatasource(ds: DatasourceRefType): this { + this._datasources = this._datasources.filter(row => row !== ds); + return this; + } + + elements(): Element[] { + return [...this._elements]; + } + + element(w: string | PropertyExt | VizChartPanel): Element { + let retVal: Element[]; + if (typeof w === "string") { + retVal = this._elements.filter(viz => viz.id() === w); + } else if (w instanceof VizChartPanel) { + retVal = this._elements.filter(v => v.chartPanel() === w); + } else { + retVal = this._elements.filter(v => v.vizProps() === w); + } + if (retVal.length) { + return retVal[0]; + } + return this._nullElement; + } + + elementExists(w: string | PropertyExt): boolean { + return this.element(w) !== this._nullElement; + } + + elementIDs() { + return this._elements.map(viz => viz.id()); + } + + append(element: Element): this { + this._elements.push(element); + return this; + } + + filteredBy(elemID: string): Element[] { + return this._elements.filter(otherViz => { + const filterIDs = otherViz.updatedBy(); + return filterIDs.indexOf(elemID) >= 0; + }); + } + + views(): HipiePipeline[] { + return this._elements.map(viz => viz.hipiePipeline()); + } + + view(id: string): HipiePipeline | undefined { + return this.views().filter(view => view.id() === id)[0]; + } + + normalizePersist(seri: any): { [key: string]: { [key: string]: any } } { + const ret = {}; + seri.__properties.content.map((n) => { + const _is_MegaChart = !!n.__properties.widget.__properties.chart; + const _cell = n; + const _panel = n.__properties.widget; + const _widget = _is_MegaChart ? n.__properties.widget.__properties.chart : n.__properties.widget.__properties.widget; + const _id = n.__properties.widget.__id ? n.__properties.widget.__id : n.__properties.widget.__properties.widget.__id; + ret[_id] = { + id: _id, + package: _widget.__class.split("_")[0], + object: _widget.__class.split("_")[1], + cell: _get_params(_cell, ["chart", "widget", "fields"]), + panel: _get_params(_panel, ["chart", "widget", "fields"]), + widget: _get_params(_widget, ["fields"]) + }; + }); + return ret; + function _get_params(_o, exclude_list) { + const ret = {}; + Object.keys(_o.__properties) + .filter(n => exclude_list.indexOf(n) === -1) + .forEach(n => ret[n] = _o.__properties[n]); + return ret; + } + } + + validate(): IElementError[] { + let retVal: IElementError[] = []; + this._elements.forEach(elem => { + retVal = retVal.concat(elem.validate()); + }); + return retVal; + } + + refresh(): Promise { + return Promise.all(this.elements().map(element => element.refresh())).then(() => { + return this; + }); + } + + // Events --- + vizStateChanged(viz: Element) { + } +} +ElementContainer.prototype._class += " dashboard_ElementContainer"; + +export interface ElementContainer { + samples(): number; + samples(_: number): this; + sampleSize(): number; + sampleSize(_: number): this; +} + +ElementContainer.prototype.publish("samples", 10, "number", "Number of samples"); +ElementContainer.prototype.publish("sampleSize", 100, "number", "Sample size"); \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/model/visualization.ts b/packages/marshaller/src/ddl2/model/visualization.ts new file mode 100644 index 0000000000..3562cc0c06 --- /dev/null +++ b/packages/marshaller/src/ddl2/model/visualization.ts @@ -0,0 +1,373 @@ +import { Area, Bar, Bubble, Column, Contour, HexBin, Line, Pie, Radar, RadialBar, Scatter, Step, WordCloud } from "@hpcc-js/chart"; +import { Database, EntityRectList, InputField, PropertyExt, Widget } from "@hpcc-js/common"; +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { Table } from "@hpcc-js/dgrid"; +import { FieldForm } from "@hpcc-js/form"; +import { AdjacencyGraph, DataGraph } from "@hpcc-js/graph"; +import { ChoroplethCounties, ChoroplethStates, Leaflet } from "@hpcc-js/map"; +import { isArray } from "@hpcc-js/util"; +import { HipiePipeline } from "../activities/hipiepipeline.ts"; +import { ComputedField, Mappings, MultiField } from "../activities/project.ts"; +import { ElementContainer } from "./element.ts"; +import { VizChartPanel } from "./vizChartPanel.ts"; + +export type VizType = "Table" | "FieldForm" | + "Area" | "Bubble" | "Bar" | "Column" | "Contour" | "HexBin" | "Line" | "Pie" | "WordCloud" | "Radar" | "RadialBar" | "Scatter" | "Step" | + "USCountiesChoropleth" | "USStatesChoropleth" | "ClusterPins" | + "EntityRectList" | "AdjacencyGraph" | "DataGraph"; +const VizTypeMap: { [key: string]: new (...args: any[]) => object } = { + Table, FieldForm, + Area, Bubble, Bar, Column, Contour, HexBin, Line, Pie, Radar, RadialBar, Scatter, Step, WordCloud, + USCountiesChoropleth: ChoroplethCounties, USStatesChoropleth: ChoroplethStates, ClusterPins: Leaflet.ClusterPins, + EntityRectList, AdjacencyGraph, DataGraph +}; +export const VizTypeSet = []; +for (const key in VizTypeMap) { + VizTypeSet.push(key); +} + +function typeClass(type: VizType): any { + const retVal = VizTypeMap[type]; + return retVal || Table; +} + +function typeNew(type: VizType): Widget { + const ChartClass = VizTypeMap[type]; + const retVal = new (ChartClass || Table)() as Widget; + + // Override default properties as needed --- + if (retVal instanceof FieldForm) { + retVal + .validate(false) + .allowEmptyRequest(true) + ; + } else if (retVal instanceof AdjacencyGraph) { + retVal + .uidColumn("uid") + .labelColumn("label") + .iconColumn("icon") + .linksColumn("links") + .linkUidColumn("uid") + .linkLabelColumn("label") + ; + } + return retVal; +} + +function typeInputs(type: VizType): InputField[] { + return typeClass(type).__inputs || []; +} + +export class Visualization extends PropertyExt { + + _origVisibility; + _origChartType; + _origChartPanel; + + declare _visibility: DDL2.VisibilityType; + declare _chartType: VizType; + declare _chartPanel: VizChartPanel; + + protected _hipiePipeline: HipiePipeline; + constructor(protected _ec: ElementContainer, hipiePipeline: HipiePipeline) { + super(); + this._hipiePipeline = hipiePipeline; + this.mappings(new Mappings()); + this.chartPanel(new VizChartPanel()); + this.typeChanged(); + } + + visualizationIDs(): string[] { + return this._ec.elementIDs().filter(id => id !== this.id()); + } + + _prevChartType; + typeChanged() { + if (this._prevChartType !== this._chartType) { + this._prevChartType = this._chartType; + this.refreshMappings(); + const chart = typeNew(this._chartType); + this.chartPanel().widget(chart); + } + } + + properties(): DDL2.IWidgetProperties; + properties(_: DDL2.IWidgetProperties): this; + properties(_?: DDL2.IWidgetProperties): DDL2.IWidgetProperties | this { + if (!arguments.length) return this.chartPanel().serialize(); + this.chartPanel().deserialize(_); + + return this; + } + + refreshMappings(): this { + const mappings = this.mappings(); + mappings.sourceActivity(this._hipiePipeline); + const cfs = mappings.validComputedFields(); + const inFields = mappings.inFields(); + const taken = {}; + mappings.computedFields(typeInputs(this._chartType).map((input, idx) => { + let retVal: MultiField | ComputedField = cfs[idx]; + if (retVal) { + if (retVal instanceof MultiField) { + } else { + retVal.label(input.id); + } + } else { + if (input.multi) { + retVal = new MultiField() + .owner(mappings) + .label(input.id) + ; + const computedFields: ComputedField[] = []; + for (const inField of inFields) { + if ((input.type === "any" || input.type === inField.type) && !taken[inField.id]) { + taken[inField.id] = true; + computedFields.push(new ComputedField() + .label(inField.id) + .type("=") + .column1(inField.id) + ); + } + } + retVal.multiFields(computedFields); + } else { + retVal = new ComputedField() + .owner(mappings) + .label(input.id) + .type("=") + ; + for (const inField of inFields) { + if ((input.type === "any" || input.type === inField.type) && !taken[inField.id]) { + taken[inField.id] = true; + retVal.column1(inField.id); + break; + } + } + } + } + return retVal; + })); + return this; + } + + _prevFields: ReadonlyArray = []; + _prevLinkFields: ReadonlyArray = []; + _prevData: ReadonlyArray = []; + refreshData(): Promise { + const mappings = this.mappings(); + + const fields = mappings.outFields(); + const dbFields = this.toDBFields(fields); + let linkFields: ReadonlyArray; + let dbLinkFields = []; + const se = this._ec.element(this.secondaryDataviewID()); + if (se) { + linkFields = se.mappings().outFields(); + dbLinkFields = this.toDBFields(linkFields); + } + + const fieldsChanged = this._prevFields !== fields || this._prevLinkFields !== linkFields; + if (fieldsChanged) { + this._prevFields = fields; + if (this.chartType() === "DataGraph") { + const dataGraph = this.chartPanel().widget() as DataGraph; + dataGraph.vertexColumns(dbFields.map(f => f.label())); + dataGraph.edgeColumns(dbLinkFields.map(f => f.label())); + } else { + this.chartPanel().fields(dbFields.filter(f => f.id() !== "__lparam")); + } + } else { + console.warn(`***${this.id()} Immutable Fields***`); + } + + const data = mappings.outData(); + const dataChanged = this._prevData !== data; + if (dataChanged) { + this._prevData = data; + const mappedData = this.toDBData(dbFields, data); + if (this.chartType() === "DataGraph") { + const dataGraph = this.chartPanel().widget() as DataGraph; + dataGraph.vertices(mappedData); + if (se) { + const linkData = se.mappings().outData(); + const mappedLinkData = this.toDBData(dbLinkFields, linkData); + dataGraph.edges(mappedLinkData); + } + } else { + this.chartPanel().data(mappedData); + } + } else { + console.warn(`${this.id()} Immutable Data!`); + } + + if (fieldsChanged || dataChanged) { + return this.chartPanel().renderPromise().then(() => { }); + } + return Promise.resolve(); + } + + private fieldTypeTodbFieldType(type: DDL2.IFieldType): Database.FieldType { + switch (type) { + case "dataset": + return "nested"; + case "boolean": + return "boolean"; + case "number": + return "number"; + case "string": + default: + return "string"; + } + } + + toDBFields(fields: ReadonlyArray): Database.Field[] { + const retVal: Database.Field[] = []; + for (const field of fields || []) { + const f = new Database.Field() + .type(this.fieldTypeTodbFieldType(field.type)) + .id(field.id) + .label(field.id) + ; + switch (field.type) { + case "dataset": + f.children(this.toDBFields(field.children)); + break; + case "object": + // TODO: For __lparam we should do nothing - not 100% if that is correct for "real" data (we don't really support "object" anyway)? + break; + } + retVal.push(f); + } + return retVal; + } + + toDBData(fields: Database.Field[], data: ReadonlyArray | Readonly) { + const _data: ReadonlyArray = isArray(data) ? data : [data]; + return _data.map((row: any) => { + const retVal = []; + for (const field of fields) { + if (field.type() === "nested") { + retVal.push(this.toDBData(field.children() as Database.Field[], row[field.id()].Row || row[field.id()])); + } else { + retVal.push(row[field.label()]); + } + } + return retVal; + }); + } + + exec(): Promise { + const promises = []; + if (this.secondaryDataviewID_exists()) { + const secondaryElementID = this.secondaryDataviewID(); + const secondaryElement = this._ec.element(secondaryElementID); + if (secondaryElement) { + promises.push(secondaryElement.visualization().exec()); + } + } + + const mappings = this.mappings(); + mappings.sourceActivity(this._hipiePipeline); + promises.push(mappings.refreshMeta().then(() => { + return mappings.exec(); + })); + + return Promise.all(promises); + } + + refresh(): Promise { + if (this.chartPanel().startProgress) { + this.chartPanel().startProgress(); + } + return this.exec().then(() => { + if (this.chartPanel().finishProgress) { + this.chartPanel().finishProgress(); + } + return this.refreshData(); + }); + } + + // Events --- + click(row: any, col: string, sel: boolean, more?) { + } + + vertex_click(row: any, col: string, sel: boolean) { + } +} +Visualization.prototype._class += " Visualization"; + +export interface Visualization { + title(): string; + title(_: string): this; + description(): string; + description(_: string): this; + visibility(): DDL2.VisibilityType; + visibility(_: DDL2.VisibilityType): this; + chartType(): VizType; + chartType(_: VizType, props?: { [prop: string]: any }): this; + secondaryDataviewID(): string; + secondaryDataviewID(_: string): this; + secondaryDataviewID_exists(): boolean; + secondaryDataviewID_valid(): boolean; + mappings(): Mappings; + mappings(_: Mappings): this; + chartPanel(): VizChartPanel; + chartPanel(_: VizChartPanel): this; +} + +Visualization.prototype.publishProxy("title", "_chartPanel"); +Visualization.prototype.publishProxy("description", "_chartPanel"); +Visualization.prototype.publish("visibility", DDL2.VisibilitySet[0], "set", "Type", DDL2.VisibilitySet); +Visualization.prototype.publish("chartType", "Table", "set", "Type", VizTypeSet); +Visualization.prototype.publish("secondaryDataviewID", null, "set", "Secondary Data View (e.g. graph edges)", function (this: Visualization) { return this.visualizationIDs(); }, { optional: true }); +Visualization.prototype.publish("mappings", null, "widget", "Mappings", undefined, { render: false, internal: true }); +Visualization.prototype.publish("chartPanel", [], "widget", "Widget"); + +Visualization.prototype._origVisibility = Visualization.prototype.visibility; +Visualization.prototype.visibility = function (this: Visualization, _?) { + const prev = this._visibility; + const retVal = Visualization.prototype._origVisibility.apply(this, arguments); + if (_ !== undefined && prev !== _) { + this.chartPanel().target(null); + } + return retVal; +}; + +Visualization.prototype._origChartType = Visualization.prototype.chartType; +Visualization.prototype.chartType = function (this: Visualization, _?, props?) { + if (_ !== undefined && VizTypeSet.indexOf(_) === -1) { + _ = "Table"; + } + const retVal = Visualization.prototype._origChartType.call(this, _); + if (_ !== undefined) { + this.typeChanged(); + if (props) { + const widget = this.chartPanel().widget(); + for (const prop in props) { + if (typeof widget[prop] === "function") { + widget[prop](props[prop]); + } + } + } + } + return retVal; +}; + +Visualization.prototype._origChartPanel = Visualization.prototype.chartPanel; +Visualization.prototype.chartPanel = function (this: Visualization, _?) { + const retVal = Visualization.prototype._origChartPanel.apply(this, arguments); + if (_ !== undefined) { + this._chartPanel + .on("click", (row: any, col: string, sel: boolean, more) => this.click(row, col, sel, more)) + .on("vertex_click", (row: any, col: string, sel: boolean) => this.vertex_click(row, col, sel)) + ; + for (const key in VizTypeMap) { + if (this._chartPanel.widget() instanceof VizTypeMap[key]) { + this._chartType = key as VizType; + break; + } + } + } + return retVal; +}; \ No newline at end of file diff --git a/packages/marshaller/src/ddl2/model/vizChartPanel.ts b/packages/marshaller/src/ddl2/model/vizChartPanel.ts new file mode 100644 index 0000000000..f33fbf5e03 --- /dev/null +++ b/packages/marshaller/src/ddl2/model/vizChartPanel.ts @@ -0,0 +1,149 @@ +import { Spacer, ToggleButton, Widget } from "@hpcc-js/common"; +import { ChartPanel, Modal } from "@hpcc-js/layout"; + +export interface IVizPopupPanelOwner { + vizActivation(viz); +} + +export class VizPopupPanel extends Modal { + + private _owner: IVizPopupPanelOwner; + private _ownerLParam; + + constructor(owner: IVizPopupPanelOwner, ownerLParam) { + super(); + this._owner = owner; + this._ownerLParam = ownerLParam; + this._drawStartPos = "origin"; + this.visible(false); + this.minHeight_default("240px"); + this.minWidth_default("320px"); + this.overflowY_default("hidden"); + } + + private _host: VizChartPanel; + host(_?: VizChartPanel): VizChartPanel | this { + if (!arguments.length) return this._host; + if (this._host && this._host !== _) { + this._host._togglePopup + .selected(false) + .render() + ; + } + this._host = _; + this._owner.vizActivation(this._ownerLParam); + return this; + } + + enter(domNode, element) { + domNode.parentElement.style.position = "absolute"; + const widgetTitle = (this.widget() as ChartPanel).title(); + if (widgetTitle) { + this.title(widgetTitle); + (this.widget() as ChartPanel).titleVisible(false); + } + super.enter(domNode, element); + } + + update(domNode, element) { + this.fixedTop(this._pos.y + "px"); + this.fixedLeft(this._pos.x + "px"); + super.update(domNode, element); + } + + exit(domNode, element) { + super.exit(domNode, element); + const widgetTitle = (this.widget() as ChartPanel).title(); + if (widgetTitle) { + (this.widget() as ChartPanel).titleVisible(true); + } + } + + closeModal() { + super.closeModal(); + if (this._host) { + this._host._togglePopup + .selected(false) + .render() + ; + } + } +} +VizPopupPanel.prototype._class += " marshaller_VizPopupPanel"; + +export interface VizPopupPanel { + widget(_: Widget): this; + widget(): Widget; + widget_exists(): boolean; + minHeight_default(_: string); + minWidth_default(_: string); + overflowY_default(_: string); +} + +// =========================================================================== + +export interface VizChartPanel { +} + +export class VizChartPanel extends ChartPanel { + + private _popup: VizPopupPanel; + _togglePopup = new ToggleButton().faChar("fa-filter").tooltip("Filter") + .on("click", () => { + this._popup.host(this); + const dp = this.locateClosestAncestor(["marshaller_DashboardDockPanel", "marshaller_DashboardGrid"]); + const dpBBox = dp.getBBox(true); + const cp = this._popup.widget() as VizChartPanel; + const tbBBox = this._togglePopup.getBBox(); + this._popup + .pos({ + x: -dpBBox.x + tbBBox.x + tbBBox.width - cp.minWidth(), + y: -dpBBox.y + tbBBox.y + tbBBox.height + }) + .resize({ width: cp.minWidth(), height: cp.minHeight() }) + .visible(this._togglePopup.selected()) + .render((popup: any) => { + const widgetSelector = "#" + popup.id() + " .layout_Carousel .common_Widget"; + const node = popup.element().node(); + if (node) { + const { height, width } = node.querySelector(widgetSelector).getBoundingClientRect(); + popup.resizeBodySync(width, height); + } + }) + ; + }); + + private _origButtons: Widget[]; + private _filterButtons: Widget[]; + + constructor() { + super(); + + this._origButtons = this.buttons(); + this._filterButtons = [this._togglePopup, new Spacer(), ...this._origButtons]; + } + + popup(_?: VizPopupPanel): VizPopupPanel | this { + if (!arguments.length) return this._popup; + this._popup = _; + if (!this._popup) { + this._togglePopup.selected(false); + } + this.buttons(this._popup ? this._filterButtons : this._origButtons); + return this; + } +} +VizChartPanel.prototype._class += " marshaller_VizChartPanel"; + +export interface VizChartPanel { + minWidth(): number; + minWidth(_: number): this; + minWidth(_: number): this; + minWidth_exists(): boolean; + minHeight(): number; + minHeight(_: number): this; + minHeight_exists(): boolean; +} +VizChartPanel.prototype.publish("descriptionTemplate", "", "string"); +VizChartPanel.prototype.publish("minWidth", 320, "number", "Min Width"); +VizChartPanel.prototype.publish("minHeight", 240, "number", "Min Height"); diff --git a/packages/marshaller/src/ddl2/pipelinePanel.css b/packages/marshaller/src/ddl2/pipelinePanel.css new file mode 100644 index 0000000000..c9b292435a --- /dev/null +++ b/packages/marshaller/src/ddl2/pipelinePanel.css @@ -0,0 +1,4 @@ +.common_SelectionButton.error { + background: rgb(255,0,0); + background: linear-gradient(180deg, rgba(255,0,0,0.5) 0%, rgba(255,255,255,0) 80%); +} diff --git a/packages/marshaller/src/ddl2/pipelinePanel.ts b/packages/marshaller/src/ddl2/pipelinePanel.ts new file mode 100644 index 0000000000..821478bfdf --- /dev/null +++ b/packages/marshaller/src/ddl2/pipelinePanel.ts @@ -0,0 +1,473 @@ +import { JSONEditor } from "@hpcc-js/codemirror"; +import { Button, PropertyExt, SelectionBar, SelectionButton, Spacer } from "@hpcc-js/common"; +import { DatasourceTable } from "@hpcc-js/dgrid"; +import { ChartPanel } from "@hpcc-js/layout"; +import { PropertyEditor } from "@hpcc-js/other"; +import { SplitPanel, TabPanel } from "@hpcc-js/phosphor"; +import { Activity } from "./activities/activity.ts"; +import { DatasourceAdapt } from "./activities/databomb.ts"; +import { Datasource } from "./activities/datasource.ts"; +import { DSPicker } from "./activities/dspicker.ts"; +import { Filters } from "./activities/filter.ts"; +import { GroupBy } from "./activities/groupby.ts"; +import { Limit } from "./activities/limit.ts"; +import { Mappings, Project } from "./activities/project.ts"; +import { Sort } from "./activities/sort.ts"; +import { Element as ModelElement, IElementError, State } from "./model/element.ts"; +import { Visualization } from "./model/visualization.ts"; + +import "../../src/ddl2/pipelinePanel.css"; + +class PipelineSelectionButton extends SelectionButton { + + _label: string; + label(): string; + label(_: string): this; + label(_?: string): string | this { + if (!arguments.length) return this._label; + this._label = _; + this.tooltip(_); + return this; + } + + _elementErrors: IElementError[] = []; + errors(): IElementError[]; + errors(_: IElementError[]): this; + errors(_?: IElementError[]): IElementError[] | this { + if (!arguments.length) return this._elementErrors; + this._elementErrors = _; + this.classed("error", _.length > 0); + // this.element().classed("error", _.length > 0); + if (_.length) { + this.tooltip(_.map(err => { + const errSourceParts = err.source.split("."); + errSourceParts.splice(0, 1); + return `${errSourceParts.join(".")}: ${err.msg}`; + }).join("\n")); + } else { + this.tooltip(this._label); + } + this.render(); + return this; + } +} + +class PipelinePanel extends ChartPanel { + _owner: PipelineSplitPanel; + + datasource = new PipelineSelectionButton().faChar("fa-database").label("Datasource").selected(true); + filter = new PipelineSelectionButton().faChar("fa-filter").label("Filter"); + project = new PipelineSelectionButton().faChar("fa-random").label("Project"); + groupBy = new PipelineSelectionButton().faChar("fa-object-group").label("Group By"); + sort = new PipelineSelectionButton().faChar("fa-sort-alpha-asc").label("Sort"); + limit = new PipelineSelectionButton().faChar("fa-list-ol").label("Limit"); + mappings = new PipelineSelectionButton().faChar("fa-random").label("Mappings"); + chartPanel = new PipelineSelectionButton().faChar("fa-area-chart").label("Visualization"); + state = new PipelineSelectionButton().faChar("fa-check-square-o").label("State"); + debug = new PipelineSelectionButton().faChar("fa-bug").label("Debug"); + all = new PipelineSelectionButton().faChar("fa-list").label("All"); + + _propEditor: PropertyEditor = new PropertyEditor() + .show_header(false) + .show_settings(false) + .showFields(false) + ; + + private _buttons = [ + this.datasource, + this.filter, + this.project, + this.groupBy, + this.sort, + this.limit, + new Spacer(), + this.mappings, + this.chartPanel, + new Spacer(), + this.state, + this.debug, + new Spacer(), + this.all + ]; + _pipelineButton: PipelineSelectionButton = this.datasource; + private _pipelineSelection = new SelectionBar() + .buttons(this._buttons).on("selected", sb => { + this._pipelineButton = sb; + this.title(sb.label()).render(); + }); + + constructor(owner: PipelineSplitPanel) { + super(); + this._owner = owner; + this.buttons([this._pipelineSelection]); + this.title(this.datasource.label()); + super.widget(this._propEditor); + this._propEditor.monitor((id: string, newValue: any, oldValue: any, source: PropertyExt) => { + if (source !== this._propEditor) { + this.propChanged(id, newValue, oldValue, source); + this.updateState(); + } + }); + } + + selectionButtons(): PipelineSelectionButton[] { + return this._pipelineSelection.buttons().filter(b => b instanceof PipelineSelectionButton) as PipelineSelectionButton[]; + } + + private _propExt: PropertyExt; + propExt(): PropertyExt; + propExt(_: PropertyExt): this; + propExt(_?: PropertyExt): PropertyExt | this { + if (!arguments.length) return this._propExt; + this._propExt = _; + return this; + } + + private peAsDatasource(): Datasource { + if (this._propExt instanceof Datasource) { + return this._propExt; + } else if (this._propExt instanceof DSPicker) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.hipiePipeline().datasource(); + } + } + + private peAsFilter(): Filters { + if (this._propExt instanceof Filters) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.hipiePipeline().filters(); + } + } + + private peAsProject(): Project { + if (this._propExt instanceof Project) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.hipiePipeline().project(); + } + } + + private peAsGroupBy(): GroupBy { + if (this._propExt instanceof GroupBy) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.hipiePipeline().groupBy(); + } + } + + private peAsSort(): Sort { + if (this._propExt instanceof Sort) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.hipiePipeline().sort(); + } + } + + private peAsLimit(): Limit { + if (this._propExt instanceof Limit) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.hipiePipeline().limit(); + } + } + + private peAsMappings(): Mappings { + if (this._propExt instanceof Mappings) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.visualization().mappings(); + } else if (this._propExt instanceof Visualization) { + return this._propExt.mappings(); + } + } + + private peAsChartPanel(): ChartPanel | Visualization { + if (this._propExt instanceof ChartPanel) { + return this._propExt; + } else if (this._propExt instanceof Visualization) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.visualization(); + } + } + + private peAsState(): State { + if (this._propExt instanceof State) { + return this._propExt; + } else if (this._propExt instanceof ModelElement) { + return this._propExt.state(); + } + } + + selectionButton(): PipelineSelectionButton { + if (this._pipelineButton && this._pipelineButton.enabled()) { + return this._pipelineButton; + } + for (const pb of this.selectionButtons()) { + if (pb.enabled()) { + pb.selected(true); + return pb; + } + } + return undefined; + } + + _prevPropExt: PropertyExt; + _prevPipelineButton: SelectionButton; + update(domNode, element) { + super.update(domNode, element); + this.updateState(); + const pipelineButton = this.selectionButton(); + if (this._prevPropExt !== this._propExt || this._prevPipelineButton !== pipelineButton) { + this._prevPropExt = this._propExt; + this._prevPipelineButton = pipelineButton; + if (this._propExt && pipelineButton) { + switch (pipelineButton) { + case this.datasource: + this._propEditor.widget(this.peAsDatasource()); + break; + case this.filter: + this._propEditor.widget(this.peAsFilter()); + break; + case this.project: + this._propEditor.widget(this.peAsProject()); + break; + case this.groupBy: + this._propEditor.widget(this.peAsGroupBy()); + break; + case this.sort: + this._propEditor.widget(this.peAsSort()); + break; + case this.limit: + this._propEditor.widget(this.peAsLimit()); + break; + case this.mappings: + this._propEditor.widget(this.peAsMappings()); + break; + case this.chartPanel: + this._propEditor.widget(this.peAsChartPanel()); + break; + case this.state: + this._propEditor.widget(this.peAsState()); + break; + case this.all: + this._propEditor.widget(this._propExt); + break; + } + } else { + this._propEditor.widget(undefined); + } + this._owner.loadPreview(this._propEditor.widget()); + } + } + + updateButtonState(pe, sb) { + sb.enabled(!!pe); + sb.errors(!!pe && pe.validate() || []); + } + + updateState() { + this.selectionButtons().forEach(sb => { + if (sb instanceof PipelineSelectionButton) { + if (this.disableActivities().indexOf(sb.label()) >= 0) { + this.updateButtonState(undefined, sb); + return; + } + } + + switch (sb) { + case this.datasource: + this.updateButtonState(this.peAsDatasource(), sb); + break; + case this.filter: + this.updateButtonState(this.peAsFilter(), sb); + break; + case this.project: + this.updateButtonState(this.peAsProject(), sb); + break; + case this.groupBy: + this.updateButtonState(this.peAsGroupBy(), sb); + break; + case this.sort: + this.updateButtonState(this.peAsSort(), sb); + break; + case this.limit: + this.updateButtonState(this.peAsLimit(), sb); + break; + case this.mappings: + this.updateButtonState(this.peAsMappings(), sb); + break; + case this.chartPanel: + const cp = this.peAsChartPanel(); + sb.enabled(!!cp); + break; + case this.state: + const st = this.peAsState(); + sb.enabled(!!st); + break; + case this.debug: + sb.enabled(false); + break; + case this.all: + sb.enabled(!!this._propExt); + break; + } + if (sb.selected()) { + this.title(sb.enabled() ? sb.label() : ""); + } + }); + } + + // Events --- + propChanged(id: string, newValue: any, oldValue: any, source: PropertyExt) { + } +} +PipelinePanel.prototype._class += " marshaller_PipelinePanel"; + +interface PipelinePanel { + disableActivities(): string[]; + disableActivities(_: string[]): this; +} + +class DDLPreview extends ChartPanel { + + private _save = new Button().faChar("fa-save").tooltip("Save") + .on("click", () => { + const activity = this.activity(); + if (activity && (activity as any).fromDDL) { + (activity as any).fromDDL(this._jsonEditor.json()); + } + this.updateToolbar(); + }); + + private _reset = new Button().faChar("fa-undo").tooltip("Reset") + .on("click", () => { + this._jsonEditor + .text(this.jsonText()) + .lazyRender() + ; + this.updateToolbar(); + }); + + private _jsonEditor = new JSONEditor() + .on("changes", (changes: object[]) => { + this.updateToolbar(); + }); + + constructor() { + super(); + this._titleBar.buttons([this._save, this._reset]); + this.widget(this._jsonEditor); + } + + private _activity: PropertyExt; + activity(_: PropertyExt): this; + activity(): PropertyExt; + activity(_?: PropertyExt): PropertyExt | this { + if (_ === void 0) return this._activity; + if (this._activity !== _) { + this._activity = _; + delete this._prevJson; + } + return this; + } + + jsonText(): string { + const activity = this.activity(); + return activity && (activity as any).toDDL ? JSON.stringify((activity as any).toDDL(), undefined, 4) : ""; + } + + private _prevJson: string; + update(domNode, element) { + super.update(domNode, element); + const json = this.jsonText(); + const editorJson = this._jsonEditor.text(); + if ((this._prevJson === undefined || this._prevJson === editorJson) && this._prevJson !== json) { + this._prevJson = json; + this._jsonEditor.text(json); + } + this.updateToolbar(); + } + + updateToolbar() { + const activity = this.activity() as any; + const json = this.jsonText(); + const editorJson = this._jsonEditor.text(); + this._save.enabled(activity && activity.fromDDL && json !== editorJson).lazyRender(); + this._reset.enabled(json !== editorJson).lazyRender(); + } +} + +export class PipelineSplitPanel extends SplitPanel { + private _rhsPropsPanel = new PipelinePanel(this).on("propChanged", (id: string, newValue: any, oldValue: any, source: PropertyExt) => { + this.propChanged(id, newValue, oldValue, source); + }); + private _previewPanel = new TabPanel(); + private _rhsDDLPreview = new DDLPreview(); + private _rhsDataPreview = new DatasourceTable().pagination(true); + + constructor() { + super(); + this._previewPanel + .addWidget(this._rhsDataPreview, "Data") + .addWidget(this._rhsDDLPreview, "DDL") + ; + this + .addWidget(this._rhsPropsPanel) + .addWidget(this._previewPanel) + ; + } + + loadDataProps(pe: PropertyExt) { + this._rhsPropsPanel + .propExt(pe) + .render() + ; + } + + loadPreview(activity: undefined | PropertyExt) { + activity = activity instanceof Visualization ? activity.mappings() : activity; + this._rhsDataPreview + .datasource(new DatasourceAdapt(activity instanceof Activity ? activity : undefined)) + .lazyRender() + ; + this._rhsDDLPreview + .activity(activity) // instanceof DSPicker ? activity.datasourceRef() : activity) + .lazyRender() + ; + } + + refreshPreview() { + const ds = this._rhsDataPreview.datasource() as DatasourceAdapt; + if (ds) { + ds.exec().then(() => { + this._rhsDataPreview + .invalidate() + .lazyRender() + ; + this._rhsDDLPreview + .lazyRender() + ; + }); + } else { + this._rhsDDLPreview + .lazyRender() + ; + } + } + + // Events --- + propChanged(id: string, newValue: any, oldValue: any, source: PropertyExt) { + } +} + +export interface PipelineSplitPanel { + disableActivities(): string[]; + disableActivities(_: string[]): this; +} + +PipelinePanel.prototype.publish("disableActivities", [], "array", "Disabled pipeline items"); + +PipelineSplitPanel.prototype.publishProxy("disableActivities", "_rhsPropsPanel"); \ No newline at end of file diff --git a/packages/marshaller/src/index.ts b/packages/marshaller/src/index.ts new file mode 100644 index 0000000000..8c88ad77cb --- /dev/null +++ b/packages/marshaller/src/index.ts @@ -0,0 +1,26 @@ +export * from "./__package__.ts"; +export { hookSend } from "@hpcc-js/comms"; +export * from "./ddl2/activities/activity.ts"; +export * from "./ddl2/activities/databomb.ts"; +export * from "./ddl2/activities/datasource.ts"; +export * from "./ddl2/activities/dspicker.ts"; +export * from "./ddl2/activities/filter.ts"; +export * from "./ddl2/activities/form.ts"; +export * from "./ddl2/activities/groupby.ts"; +export * from "./ddl2/activities/hipiepipeline.ts"; +export * from "./ddl2/activities/limit.ts"; +export * from "./ddl2/activities/logicalfile.ts"; +export * from "./ddl2/activities/nullview.ts"; +export * from "./ddl2/activities/project.ts"; +export * from "./ddl2/activities/roxie.ts"; +export * from "./ddl2/activities/sort.ts"; +export * from "./ddl2/activities/wuresult.ts"; +export * from "./ddl2/model/element.ts"; +export * from "./ddl2/model/visualization.ts"; +export * from "./ddl2/model/vizChartPanel.ts"; +export * from "./ddl2/dashboard.ts"; +export * from "./ddl2/ddl.ts"; +export * from "./ddl2/ddleditor.ts"; +export * from "./ddl2/graphadapter.ts"; +export * from "./ddl2/javascriptadapter.ts"; +export * from "./dashy.ts"; diff --git a/packages/marshaller/tdoptions.json b/packages/marshaller/tdoptions.json new file mode 100644 index 0000000000..988d7c01b0 --- /dev/null +++ b/packages/marshaller/tdoptions.json @@ -0,0 +1,11 @@ +{ + "excludeNotExported": true, + "mode": "file", + "out": "../../docs/api/collections", + "baseUrl": ".", + "paths": { + "@hpcc-js/*": [ + "node_modules/@hpcc-js/*" + ] + } +} \ No newline at end of file diff --git a/packages/marshaller/tests/index.ts b/packages/marshaller/tests/index.ts new file mode 100644 index 0000000000..304649f3fe --- /dev/null +++ b/packages/marshaller/tests/index.ts @@ -0,0 +1,240 @@ +import { DDL2 } from "@hpcc-js/ddl-shim"; +import { Dashboard, Dashy, ElementContainer } from "../src/index.ts"; + +window.addEventListener("resize", doResize); + +let widget: Dashy | Dashboard; + +function doResize() { + let myWidth; + let myHeight; + if (typeof (window.innerWidth) === "number") { + myWidth = window.innerWidth; + myHeight = window.innerHeight; + } else { + if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { + myWidth = document.documentElement.clientWidth; + myHeight = document.documentElement.clientHeight; + } else { + if (document.body && (document.body.clientWidth || document.body.clientHeight)) { + myWidth = document.body.clientWidth; + myHeight = document.body.clientHeight; + } + } + } + if (widget && myWidth && myHeight) { + widget + .resize({ width: myWidth - 16, height: myHeight - 16 }) + .lazyRender(); + } +} + +export function edit(target: string) { + widget = new Dashy() + .target(target) + .render() + ; + widget.importDDL(sample2); + doResize(); + return widget; +} + +export function view(target: string) { + const ec = new ElementContainer(); + widget = new Dashboard(ec); + widget + .target(target) + .titleVisible(false) + .hideSingleTabs(true) + .restore(sample2) + .render(() => { + ec.refresh(); + }) + ; + doResize(); + return widget; +} + +const payload = [ + { "id": "1", "firstname": "Bugs", "lastname": "Bunny", "email": "bugs.bunny@looneytunes.com", "gender": "Male", "ipaddress": "10.0.0.1", "ssn": "000-00-0001", "dob": "1940-07-27" }, + { "id": "2", "firstname": "Daffy", "lastname": "Duck", "email": "daffy.duck@looneytunes.com", "gender": "Male", "ipaddress": "10.0.0.2", "ssn": "000-00-0002", "dob": "1937-04-17" }, + { "id": "3", "firstname": "Wilma", "lastname": "Flintstone", "email": "wilma.f@bedrock.com", "gender": "Female", "ipaddress": "10.0.0.3", "ssn": "000-00-0003", "dob": "1960-09-30" }, + { "id": "4", "firstname": "Betty", "lastname": "Rubble", "email": "betty.rubble@bedrock.com", "gender": "Female", "ipaddress": "10.0.0.4", "ssn": "000-00-0004", "dob": "1960-09-30" }, + { "id": "5", "firstname": "Scooby", "lastname": "Doo", "email": "scooby.doo@mysterymachine.com", "gender": "Male", "ipaddress": "10.0.0.5", "ssn": "000-00-0005", "dob": "1969-09-13" } +]; + +const sample2: DDL2.Schema = { + "createdBy": { + "name": "@hpcc-js/marshaller", + "version": "2.28.11" + }, + "datasources": [ + { + "fields": [ + { + "id": "id", + "type": "number" + }, + { + "id": "firstname", + "type": "string" + }, + { + "id": "lastname", + "type": "string" + }, + { + "id": "email", + "type": "string" + }, + { + "id": "gender", + "type": "string" + }, + { + "id": "ipaddress", + "type": "string" + }, + { + "id": "ssn", + "type": "string" + }, + { + "id": "dob", + "type": "string" + } + ], + "format": "json", + "id": "Ins002_dsOutput1", + "payload": JSON.stringify(payload), + "type": "databomb" + } + ], + "dataviews": [ + { + "activities": [ + { + "conditions": [ + { + "mappings": [ + { + "condition": "==", + "localFieldID": "gender", + "nullable": false, + "remoteFieldID": "gender" + } + ], + "viewID": "e_11" + } + ], + "type": "filter" + } + ], + "datasource": { + "id": "Ins002_dsOutput1" + }, + "id": "e_10", + "visualization": { + "__class": "chart_Pie", + "chartType": "Pie", + "description": "gender == Female", + "id": "cp_10", + "mappings": { + "transformations": [ + { + "fieldID": "label", + "sourceFieldID": "firstname", + "type": "=" + }, + { + "fieldID": "value", + "sourceFieldID": "id", + "type": "=" + } + ], + "type": "mappings" + }, + "properties": { + "__class": "marshaller_VizChartPanel", + "description": "gender == Female", + "title": "Element 10", + "widget": { + "__class": "chart_Pie" + } + }, + "title": "Element 10", + "visibility": "normal" + } + }, + { + "activities": [ + { + "aggregates": [], + "groupByIDs": [ + "gender" + ], + "type": "groupby" + } + ], + "datasource": { + "id": "Ins002_dsOutput1" + }, + "id": "e_11", + "visualization": { + "__class": "dgrid_Table", + "chartType": "Table", + "id": "cp_11", + "mappings": { + "transformations": [], + "type": "mappings" + }, + "properties": { + "__class": "marshaller_VizChartPanel", + "title": "Element 11", + "widget": { + "__class": "dgrid_Table", + "columnFormats": [] + } + }, + "title": "Element 11", + "visibility": "normal" + } + } + ], + "properties": { + "buildVersion": "2.108.11", + "layout": { + "main": { + "children": [ + { + "currentIndex": 0, + "type": "tab-area", + "widgets": [ + { + "__id": "cp_10" + } + ] + }, + { + "currentIndex": 0, + "type": "tab-area", + "widgets": [ + { + "__id": "cp_11" + } + ] + } + ], + "orientation": "vertical", + "sizes": [ + 0.5755627009646301, + 0.42443729903536975 + ], + "type": "split-area" + } + }, + "name": "@hpcc-js/marshaller", + "version": "2.28.11" + }, + "version": "2.2.1" +}; \ No newline at end of file diff --git a/packages/marshaller/tests/marshaller.browser.spec.ts b/packages/marshaller/tests/marshaller.browser.spec.ts new file mode 100644 index 0000000000..2e6427146a --- /dev/null +++ b/packages/marshaller/tests/marshaller.browser.spec.ts @@ -0,0 +1,309 @@ +import * as marshaller from "../src/index.ts"; +import { Class, HTMLWidget, SVGWidget } from "@hpcc-js/common"; +import { Dashboard, Dashy, DDLEditor, DDLAdapter, GraphAdapter, JavaScriptAdapter, ElementContainer } from "../src/index.ts"; +import { Databomb, DatasourceAdapt } from "../src/index.ts"; +import { Limit } from "../src/index.ts"; +import { Sort, SortColumn } from "../src/index.ts"; +import { GroupBy, GroupByColumn, AggregateField } from "../src/index.ts"; +import { Project, ComputedField, Mappings } from "../src/index.ts"; +import { Filters, ColumnMapping } from "../src/index.ts"; +import { Form, FormField } from "../src/index.ts"; +import { HipiePipeline, NullView } from "../src/index.ts"; +import { Element, State, Visualization, VizChartPanel } from "../src/index.ts"; +import { Activity, ActivityPipeline, ActivitySelection, stringify, schemaType2IFieldType } from "../src/index.ts"; +import { describe, it, expect } from "vitest"; + +const urlSearch: string = ""; + +// Classes that require constructor arguments or are not constructable --- +const skipNew = new Set([ + "Dashboard", "Element", "ElementContainer", "Visualization", "VizChartPanel", + "Filters", "HipiePipeline", "NullView", "DatasourceAdapt", "DSPicker", + "ESPResult", "LogicalFile", "WUResult", + "DDLAdapter", "JavaScriptAdapter", + "createProps", "hookSend", "rowToFields", "schemaRow2IField", "schemaType2IFieldType", + "stringify", "wsEclSchemaRow2IField" +]); + +describe("@hpcc-js/marshaller", () => { + for (const key in marshaller) { + const item = (marshaller as any)[key]; + if (item?.prototype?.constructor) { + if (!urlSearch || urlSearch === item.prototype.constructor.name) { + describe(`${item.prototype.constructor.name}`, () => { + if (!skipNew.has(key)) { + it("Simple", () => { + const instance = new item(); + expect(instance).to.be.an.instanceof(item); + }); + } else { + it("Simple", () => { + expect(item).to.be.a("function"); + }); + } + }); + } + } + } + + describe("Activity basics", () => { + it("stringify", () => { + expect(stringify({ a: 1, b: "hello" })).to.be.a("string"); + expect(stringify({ a: 1, b: "hello" })).to.include("a:"); + expect(stringify({ a: 1, b: "hello" })).to.include("b:"); + }); + + it("schemaType2IFieldType", () => { + expect(schemaType2IFieldType("boolean")).to.equal("boolean"); + expect(schemaType2IFieldType("xs:double")).to.equal("number"); + expect(schemaType2IFieldType("xs:string")).to.equal("string"); + expect(schemaType2IFieldType("xs:integer")).to.equal("number64"); + expect(schemaType2IFieldType("unknown")).to.equal("string"); + }); + }); + + describe("Databomb", () => { + it("create with payload", () => { + const db = new Databomb(); + expect(db).to.be.instanceOf(Databomb); + }); + + it("toDDL", () => { + const db = new Databomb(); + db.id("test"); + const ddl = db.toDDL(); + expect(ddl).to.have.property("type", "databomb"); + }); + }); + + describe("Limit", () => { + it("create", () => { + const limit = new Limit(); + expect(limit).to.be.instanceOf(Limit); + }); + + it("toDDL", () => { + const limit = new Limit(); + const ddl = limit.toDDL(); + expect(ddl).to.have.property("type", "limit"); + }); + + it("fromDDL", () => { + const limit = Limit.fromDDL({ type: "limit", limit: 100 }); + expect(limit.rows()).to.equal(100); + }); + + it("hash", () => { + const limit = new Limit(); + const h = limit.hash(); + expect(h).to.be.a("string"); + }); + }); + + describe("Sort", () => { + it("create", () => { + const sort = new Sort(); + expect(sort).to.be.instanceOf(Sort); + }); + + it("toDDL", () => { + const sort = new Sort(); + const ddl = sort.toDDL(); + expect(ddl).to.have.property("type", "sort"); + }); + + it("SortColumn create", () => { + const col = new SortColumn(); + expect(col).to.be.instanceOf(SortColumn); + }); + }); + + describe("GroupBy", () => { + it("create", () => { + const gb = new GroupBy(); + expect(gb).to.be.instanceOf(GroupBy); + }); + + it("toDDL", () => { + const gb = new GroupBy(); + const ddl = gb.toDDL(); + expect(ddl).to.have.property("type", "groupby"); + }); + + it("GroupByColumn create", () => { + const col = new GroupByColumn(); + expect(col).to.be.instanceOf(GroupByColumn); + }); + + it("AggregateField create", () => { + const af = new AggregateField(); + expect(af).to.be.instanceOf(AggregateField); + }); + }); + + describe("Filters", () => { + it("create", () => { + const ec = new ElementContainer(); + const filters = new Filters(ec); + expect(filters).to.be.instanceOf(Filters); + }); + + it("toDDL", () => { + const ec = new ElementContainer(); + const filters = new Filters(ec); + const ddl = filters.toDDL(); + expect(ddl).to.have.property("type", "filter"); + expect(ddl).to.have.property("conditions"); + }); + + it("ColumnMapping create", () => { + const cm = new ColumnMapping(); + expect(cm).to.be.instanceOf(ColumnMapping); + }); + }); + + describe("Form", () => { + it("create", () => { + const form = new Form(); + expect(form).to.be.instanceOf(Form); + }); + + it("toDDL", () => { + const form = new Form(); + const ddl = form.toDDL(); + expect(ddl).to.have.property("type", "form"); + }); + + it("FormField create", () => { + const ff = new FormField(); + expect(ff).to.be.instanceOf(FormField); + }); + }); + + describe("Project", () => { + it("create", () => { + const project = new Project(); + expect(project).to.be.instanceOf(Project); + }); + + it("toDDL", () => { + const project = new Project(); + const ddl = project.toDDL(); + expect(ddl).to.have.property("type", "project"); + }); + + it("ComputedField create", () => { + const cf = new ComputedField(); + expect(cf).to.be.instanceOf(ComputedField); + }); + }); + + describe("DDLAdapter", () => { + it("create", () => { + const ec = new ElementContainer(); + const dashboard = new Dashboard(ec); + const adapter = new DDLAdapter(dashboard); + expect(adapter).to.be.instanceOf(DDLAdapter); + }); + + it("write empty DDL", () => { + const ec = new ElementContainer(); + const dashboard = new Dashboard(ec); + const adapter = new DDLAdapter(dashboard); + const ddl = adapter.write(); + expect(ddl).to.have.property("version"); + expect(ddl).to.have.property("datasources"); + expect(ddl).to.have.property("dataviews"); + }); + }); + + describe("GraphAdapter", () => { + it("create", () => { + const ec = new ElementContainer(); + const adapter = new GraphAdapter(ec); + expect(adapter).to.be.instanceOf(GraphAdapter); + }); + }); + + describe("ElementContainer", () => { + it("create", () => { + const ec = new ElementContainer(); + expect(ec).to.be.instanceOf(ElementContainer); + }); + + it("elements returns array", () => { + const ec = new ElementContainer(); + expect(ec.elements()).to.be.an("array"); + }); + + it("elementIDs returns array", () => { + const ec = new ElementContainer(); + expect(ec.elementIDs()).to.be.an("array"); + }); + }); + + describe("Element", () => { + it("create", () => { + const ec = new ElementContainer(); + const elem = new Element(ec); + expect(elem).to.be.instanceOf(Element); + }); + }); + + describe("State", () => { + it("create", () => { + const state = new State(); + expect(state).to.be.instanceOf(State); + }); + }); + + describe("Visualization", () => { + it("create", () => { + const ec = new ElementContainer(); + const pipeline = new HipiePipeline(ec, "test_viz"); + const viz = new Visualization(pipeline); + expect(viz).to.be.instanceOf(Visualization); + }); + }); + + describe("Dashboard", () => { + it("create", () => { + const ec = new ElementContainer(); + const dashboard = new Dashboard(ec); + expect(dashboard).to.be.instanceOf(Dashboard); + }); + + it("render", () => { + return new Promise((done) => { + const div = document.createElement("DIV"); + div.style.width = "640px"; + div.style.height = "480px"; + document.body.appendChild(div); + const ec = new ElementContainer(); + const dashboard = new Dashboard(ec) + .target(div) + ; + dashboard.render(() => { + dashboard.target(null); + div.parentNode!.removeChild(div); + done(); + }); + }); + }); + }); + + describe("DDLEditor", () => { + it("create", () => { + const editor = new DDLEditor(); + expect(editor).to.be.instanceOf(DDLEditor); + }); + + it("set and get DDL", () => { + const editor = new DDLEditor(); + const sampleDDL = { version: "2.2.1", datasources: [], dataviews: [] }; + editor.ddl(sampleDDL); + const result = editor.ddl(); + expect(result).to.have.property("version"); + }); + }); +}); diff --git a/packages/marshaller/tsconfig.json b/packages/marshaller/tsconfig.json new file mode 100644 index 0000000000..af9950c011 --- /dev/null +++ b/packages/marshaller/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "declarationDir": "types", + "strict": false, + "noImplicitAny": false, + "strictNullChecks": false + }, + "include": [ + "./src/index.ts", + "../global.d.ts" + ] +} \ No newline at end of file diff --git a/packages/marshaller/tsconfig.tests.json b/packages/marshaller/tsconfig.tests.json new file mode 100644 index 0000000000..05ef7dd027 --- /dev/null +++ b/packages/marshaller/tsconfig.tests.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "noEmit": true + }, + "include": [ + "./tests/**/*.spec.ts" + ] +} diff --git a/packages/marshaller/vite.config.ts b/packages/marshaller/vite.config.ts new file mode 100644 index 0000000000..bf8dc3e38e --- /dev/null +++ b/packages/marshaller/vite.config.ts @@ -0,0 +1,4 @@ +import { createHpccViteConfig } from "@hpcc-js/esbuild-plugins"; +import pkg from "./package.json" with { type: "json" }; + +export default createHpccViteConfig(pkg); diff --git a/packages/phosphor/src/SplitPanel.ts b/packages/phosphor/src/SplitPanel.ts index 81589e444e..1ddb3e8f3b 100644 --- a/packages/phosphor/src/SplitPanel.ts +++ b/packages/phosphor/src/SplitPanel.ts @@ -1,6 +1,6 @@ import { HTMLWidget, SVGWidget, Widget } from "@hpcc-js/common"; -import { SplitPanel as PSplitPanel, Widget as PWidget } from "./phosphor-shim.ts"; -import { WidgetAdapter, WidgetAdapterArray } from "./WidgetAdapter.ts"; +import { Message, SplitPanel as PSplitPanel, Widget as PWidget } from "./phosphor-shim.ts"; +import { Msg, WidgetAdapter, WidgetAdapterArray } from "./WidgetAdapter.ts"; import "../src/DockPanel.css"; @@ -66,5 +66,22 @@ export class SplitPanel extends HTMLWidget { this._split.update(); }); } + + private _prevActive: Widget; + processMessage(msg: Message): void { + switch (msg.type) { + case "wa-activate-request": + const widget = (msg as Msg.WAActivateRequest).wa.widget; + if (this._prevActive !== widget) { + this._prevActive = widget; + this.childActivation(widget); + } + break; + } + } + + // Events --- + childActivation(w: Widget) { + } } SplitPanel.prototype._class += " phosphor_SplitPanel";