diff --git a/.env b/.env index fbd00bd..90e15a7 100644 --- a/.env +++ b/.env @@ -2,6 +2,8 @@ REACT_APP_DATA_API=kDTQ7dXUWgRDc9rrbOuXq4ErfSt7PKraPhJGeyGEplbWKKt2scpFD3dQmlxNQ REACT_APP_DATA_URL=https://hwsrv-1060272.hostwindsdns.com:5000 REACT_APP_DATA_URL_2=https://dead-lime-barnacle-tie.cyclic.app REACT_APP_DATA_URL_LOCAL_2=https://mirage-mc-backend.onrender.com -REACT_APP_DATA_URL_LOCAL=http://localhost:5000 +REACT_APP_DATA_URL_LOCAL_3=http://localhost:5000 +REACT_APP_DATA_URL_LOCAL=https://hwsrv-1060272.hostwindsdns.com:5000 REACT_APP_DATA_URL_LOCAL_dev=https://hwsrv-1060272.hostwindsdns.com:5000 -REACT_APP_DATA_DOWNLOAD=https://texastechuniversity-my.sharepoint.com/:x:/g/personal/ngan_v_t_nguyen_ttu_edu/EWEu7l96MQ1Jgu8OBKspIR0BjmY1i0t6XlV6ROPCYcPkkA?download=1 \ No newline at end of file +REACT_APP_DATA_DOWNLOAD=https://texastechuniversity-my.sharepoint.com/:x:/g/personal/ngan_v_t_nguyen_ttu_edu/EWEu7l96MQ1Jgu8OBKspIR0BjmY1i0t6XlV6ROPCYcPkkA?download=1 +REACT_APP_DATA_APP_VERSION=0.1 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 947d6ff..e743986 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mirage-mc", - "version": "0.4.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mirage-mc", - "version": "0.4.0", + "version": "1.0.0", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", @@ -32,9 +32,11 @@ "intl": "^1.2.5", "lodash": "^4.17.21", "lp-react-virtualized-auto-sizer-react-18": "^1.0.7", + "lz-string": "^1.5.0", "material-react-table": "^2.0.1", "moment": "^2.29.4", "notistack": "^2.0.8", + "pako": "^2.1.0", "plotly.js": "^2.18.2", "react": "^18.2.0", "react-custom-scrollbars-2": "^4.5.0", @@ -53,6 +55,7 @@ "react-window": "^1.8.8", "redux": "^4.2.1", "redux-undo": "^1.0.1", + "shrink-string": "^3.1.9", "web-vitals": "^2.1.4" }, "devDependencies": { @@ -2524,6 +2527,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2554,6 +2572,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -5593,6 +5616,16 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "8.44.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", @@ -5646,6 +5679,16 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2" + } + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -5945,11 +5988,28 @@ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true, + "peer": true + }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -6087,6 +6147,13 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true, + "peer": true + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", @@ -6607,13 +6674,13 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { @@ -6637,34 +6704,6 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/almost-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", @@ -7160,6 +7199,34 @@ "webpack": ">=2" } }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -7337,6 +7404,17 @@ "babel-plugin-transform-react-remove-prop-types": "^0.4.24" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -7698,6 +7776,17 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/check-types": { "version": "11.2.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", @@ -7933,6 +8022,17 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -8322,21 +8422,6 @@ } } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -8348,11 +8433,6 @@ "ajv": "^8.8.2" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -9129,6 +9209,20 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "peer": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -9325,6 +9419,16 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -10312,21 +10416,6 @@ "webpack": "^5.0.0" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -10359,11 +10448,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -10396,6 +10480,21 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10490,6 +10589,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/eslint/node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10788,6 +10892,13 @@ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "peer": true + }, "node_modules/falafel": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", @@ -11208,6 +11319,29 @@ } } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -11290,6 +11424,11 @@ "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -12174,6 +12313,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "dev": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -12586,6 +12736,13 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "dev": true, + "peer": true + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -12900,6 +13057,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", + "dev": true, + "peer": true + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -15376,9 +15540,9 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -15413,6 +15577,36 @@ "node": ">=0.10.0" } }, + "node_modules/jss": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-rtl": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/jss-rtl/-/jss-rtl-0.3.0.tgz", + "integrity": "sha512-rg9jJmP1bAyhNOAp+BDZgOP/lMm4+oQ76qGueupDQ68Wq+G+6SGvCZvhIEg8OHSONRWOwFT6skCI+APGi8DgmA==", + "dev": true, + "peer": true, + "dependencies": { + "rtl-css-js": "^1.13.1" + }, + "peerDependencies": { + "jss": "^10.0.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -15647,9 +15841,9 @@ } }, "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "bin": { "lz-string": "bin/bin.js" } @@ -15803,13 +15997,89 @@ "node": ">=0.10.0" } }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/media-typer": { - "version": "0.3.0", + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dev": true, + "peer": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { @@ -15858,6 +16128,469 @@ "node": ">= 0.6" } }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true, + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "peer": true + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -15934,21 +16667,6 @@ "webpack": "^5.0.0" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -15960,11 +16678,6 @@ "ajv": "^8.8.2" } }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -16054,6 +16767,16 @@ "to-px": "^1.0.1" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -16261,6 +16984,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==", + "dev": true, + "peer": true + }, "node_modules/notistack": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/notistack/-/notistack-2.0.8.tgz", @@ -16603,6 +17333,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -18346,6 +19081,17 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/protobufjs": { "version": "6.11.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", @@ -18738,6 +19484,28 @@ "react-dom": ">= 16.3.0" } }, + "node_modules/react-easy-crop": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-4.7.5.tgz", + "integrity": "sha512-qKfI4PuhaH1jOLC3DQfQB0cE0z+3N7bfyPkPejQmylXNb8nstfPMH+oHj3gKgpBHLFUiQp/C1rY7sVCVgtjn3Q==", + "dev": true, + "peer": true, + "dependencies": { + "normalize-wheel": "^1.0.1", + "tslib": "2.0.1" + }, + "peerDependencies": { + "react": ">=16.4.0", + "react-dom": ">=16.4.0" + } + }, + "node_modules/react-easy-crop/node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "dev": true, + "peer": true + }, "node_modules/react-error-overlay": { "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", @@ -18851,6 +19619,45 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, + "peer": true + }, "node_modules/react-plotly.js": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", @@ -19373,6 +20180,39 @@ "node": ">= 0.10" } }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remove-accents": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", @@ -19633,6 +20473,16 @@ "node": ">=8" } }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -19660,6 +20510,19 @@ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "peer": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", @@ -19797,6 +20660,34 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -20013,6 +20904,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shrink-string": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/shrink-string/-/shrink-string-3.1.9.tgz", + "integrity": "sha512-fk1x3ovK1kaUotGCGO5Npv/7bKL8Qw7jkPUlqqPK/5U7vCr021SGkrkSu8BuBZxG0f/j4SqR2BN8gJcAtapfIg==", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -20128,6 +21027,17 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -20492,6 +21402,16 @@ "webpack": "^5.0.0" } }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dev": true, + "peer": true, + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -20996,6 +21916,13 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "dev": true, + "peer": true + }, "node_modules/tinycolor2": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.5.2.tgz", @@ -21145,6 +22072,17 @@ "node": ">=8" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -21157,6 +22095,17 @@ "node": ">=0.10.0" } }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -21351,6 +22300,19 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -21401,6 +22363,39 @@ "node": ">=4" } }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -21412,6 +22407,90 @@ "node": ">=8" } }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "dev": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -21585,6 +22664,35 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "peer": true, + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", @@ -21690,6 +22798,38 @@ "node": ">= 0.8" } }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", @@ -21842,21 +22982,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -21868,11 +22993,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -21949,21 +23069,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/webpack-dev-server/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -21975,11 +23080,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", @@ -22294,21 +23394,6 @@ "node": ">=10.0.0" } }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -22323,11 +23408,6 @@ "node": ">=10" } }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/workbox-build/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", diff --git a/package.json b/package.json index bc11c93..16a414c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mirage-mc", - "version": "0.4.0", + "version": "1.0.0", "private": true, "dependencies": { "@emotion/react": "^11.11.1", @@ -27,9 +27,11 @@ "intl": "^1.2.5", "lodash": "^4.17.21", "lp-react-virtualized-auto-sizer-react-18": "^1.0.7", + "lz-string": "^1.5.0", "material-react-table": "^2.0.1", "moment": "^2.29.4", "notistack": "^2.0.8", + "pako": "^2.1.0", "plotly.js": "^2.18.2", "react": "^18.2.0", "react-custom-scrollbars-2": "^4.5.0", @@ -48,6 +50,7 @@ "react-window": "^1.8.8", "redux": "^4.2.1", "redux-undo": "^1.0.1", + "shrink-string": "^3.1.9", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/src/Providers/Database/Provider.js b/src/Providers/Database/Provider.js index bfe3660..51b188e 100644 --- a/src/Providers/Database/Provider.js +++ b/src/Providers/Database/Provider.js @@ -5,9 +5,18 @@ import {isArray, uniq} from 'lodash'; import full_countries from './data/mirage-mc-v1.countries.json'; import full_location from './data/mirage-mc-v1.locs.json'; import axios from 'axios'; +import lzString from "lz-string"; +import {useDispatch,useSelector} from "react-redux"; +import { + setFilters, + selectFilters +} from "../../reducer/streamfilters"; +import {actionCreators} from "../../reducer/actions/selectedList"; +import exportVariable from './data/MIRAGE_exportvariables.csv'; const APIKey = process.env.REACT_APP_DATA_API; const APIUrl = ((process.env.NODE_ENV === 'production') ? process.env.REACT_APP_DATA_URL : process.env.REACT_APP_DATA_URL_LOCAL); +const HOMEURL = ((process.env.NODE_ENV === 'production') ? process.env.REACT_APP_DATA_HOMEPAGE : process.env.REACT_APP_DATA_HOMEPAGE_LOCAL); axios.defaults.headers.common = { "api-key": APIKey, @@ -43,6 +52,7 @@ const init = {fields: {value:{stationData:[], locs_full: {value:full_location}, countries_full: {value:full_countries}, events: {}, + event_export_list: {value:{}}, loading:false, error:false, isInit:false @@ -51,6 +61,9 @@ const init = {fields: {value:{stationData:[], const emptyFunc = ()=>{} const Provider = ({ children }) => { const [state, dispatch] = useReducer(reducer, init); + const filters = useSelector(selectFilters); + const eventSelectedData = useSelector(state => Array.from(state.seletedList.items.values( ) )); + const dispatchEvent = useDispatch(); useEffect(() => { const controllerS = new AbortController(); const controllerL = new AbortController(); @@ -62,6 +75,7 @@ const Provider = ({ children }) => { dispatch({type: 'LOADING_CHANGED', path: 'locs', isLoading: true}); dispatch({type: 'LOADING_CHANGED', path: 'countries', isLoading: true}); dispatch({type: 'LOADING_CHANGED', path: 'fields', isLoading: true}); + dispatch({type: 'LOADING_CHANGED', path: 'event_export_list', isLoading: true}); // for export // load data Promise.all([ axios.get(`${APIUrl}/station/city`,{ @@ -145,6 +159,15 @@ const Provider = ({ children }) => { // console.timeEnd('-filterdata-'); console.timeEnd('Load and process data'); }); + // load export list + d3csv(exportVariable,(data)=>{ + const event_export_list={}; + data.forEach(d=>{ + if (d["cut from export?"]==="N") + event_export_list[d["metadata variables"]]=true; + }); + dispatch({type: 'VALUE_CHANGE', path: 'event_export_list', value: event_export_list, isLoading: false}); + }); } catch (error) { dispatch({ type: "ERROR", @@ -195,9 +218,9 @@ const Provider = ({ children }) => { }, [state] ); - const searchByStream = (path,query)=>{ + const searchByStream = (path,query,cat='stream')=>{ dispatch({type: 'LOADING_CHANGED', path: `search-${path}`, isLoading: true}); - return axios.post(`${APIUrl}/stream/search`,{[path]:query}).then(({data})=> { + return axios.post(`${APIUrl}/${cat}/search`,{[path]:query}).then(({data})=> { dispatch({type: 'VALUE_CHANGE', path: `search-${path}`, value: data.map(d=>d._id), isLoading: false}); }).catch ((error)=> { dispatch({ @@ -216,9 +239,12 @@ const Provider = ({ children }) => { [state.events.value] ); const requestEvents = useCallback( - (filter,limit) => { + (filter,limit,isid) => { dispatch({type: 'LOADING_CHANGED', path: 'events', isLoading: true}); - axios.post(`${APIUrl}/meta/`, {filter}).then(({data})=> { + let query = {filter}; + if (isid) + query={id:filter}; + axios.post(`${APIUrl}/meta/`, query).then(({data})=> { dispatch({type: 'VALUE_CHANGE', path: 'events', value:data??[], isLoading: false}); }).catch(error=>{ dispatch({ @@ -289,10 +315,40 @@ const Provider = ({ children }) => { } } const getDownloadData = useCallback((listids)=>{ - return axios.post(`${APIUrl}/meta/`,{id:listids.map(d=>d._id)}).then(({data})=> { + return axios.post(`${APIUrl}/meta/`,{id:listids.map(d=>d._id),download:true}).then(({data})=> { return data; }) },[state]); + + const getShortenLink = useCallback(()=>{ + // get filter, ID and seleted event + const _data = {filters,ids:eventSelectedData.map(d=>d._id),id:getDetail()}; + const compressed = lzString.compressToEncodedURIComponent(JSON.stringify(_data)); + return axios.post(`${APIUrl}/url/`,{data:compressed}).then(({data})=> { + return HOMEURL+"?selected="+data._id; + }) + },[state,filters,eventSelectedData]); + + const getDataFromShortenLink = useCallback((id)=>{ + return axios.get(`${APIUrl}/url/${id}`).then(({data})=> { + if (data&&data.data){ + try{ + let _data = lzString.decompressFromEncodedURIComponent(data.data); + _data = JSON.parse(_data); + dispatchEvent(setFilters({value:_data.filters})); + if (_data.id) + requestDetail(_data.id); + requestEvents(_data.filters, 1000); + axios.post(`${APIUrl}/meta/`, {id:_data.ids}).then(({data})=> { + dispatchEvent(actionCreators.addsToBasket(data)); + }); + }catch(e){ + return null; + } + }else + return null; + }) + },[state]); const setFuncCollection = useCallback((path,func=emptyFunc)=>{ dispatch({type: 'VALUE_CHANGE', path, value: func, isLoading: false}); @@ -324,6 +380,8 @@ const Provider = ({ children }) => { requestDetail, getListError, getDownloadData, + getShortenLink, + getDataFromShortenLink, isLoading }}> {children} diff --git a/src/Providers/Database/data/MIRAGE_exportvariables.csv b/src/Providers/Database/data/MIRAGE_exportvariables.csv new file mode 100644 index 0000000..0152cc8 --- /dev/null +++ b/src/Providers/Database/data/MIRAGE_exportvariables.csv @@ -0,0 +1,85 @@ +metadata variables,cut from export? +apiVersion,N +city_id,N +latitude,N +longitude,N +city,N +country,N +utcOffset,N +station,N +station_id,N +url,N +station_name,N +station_description,N +station_genre,N +station_language,N +station_url,N +station_format,N +station_form,N +station_frequency,N +annotator,N +event_id,N +time_station,N +stream_title,N +stream_codec,N +stream_bitrate,N +stream_framerate,N +stream_channels,N +artist_name,N +artist_id,N +artist_followers,Y +artist_popularity,Y +artist_genres,Y +artist_image_url,Y +track_name,N +track_id,N +track_duration,Y +track_year_released,Y +track_popularity,Y +track_loudness,Y +track_tempo,Y +track_key,Y +track_mode,Y +track_beatsperbar,Y +track_danceability,Y +track_speechiness,Y +track_acousticness,Y +track_instrumentalness,Y +track_liveness,Y +track_energy,Y +track_valence,Y +metadata_editdist,N +artist_qid,N +wd_artist_name,N +artist_type,N +artist_description,N +wd_artist_genres,N +artist_startyear,N +artist_country,N +artist_coordinates,N +artist_members,N +artist_genders,N +artist_sexualorientations,N +artist_ethnicities,N +artist_instruments,N +artist_voicetypes,N +artist_website,N +artist_YouTubeID,N +artist_MusixmatchID,N +artist_AZlyricsID,N +artist_MusicBrainzID,N +track_qid,N +wd_track_name,N +track_description,N +track_opus,N +track_form,N +track_tonality,N +track_instrumentation,N +score_url,N +track_language,N +track_yearreleased,N +track_composers,N +track_lyricists,N +track_geniusID,N +track_MusicBrainzID,N +track_YouTubeID,N diff --git a/src/Providers/Database/data/mirage-mc-export.json b/src/Providers/Database/data/mirage-mc-export.json new file mode 100644 index 0000000..3be5ac3 --- /dev/null +++ b/src/Providers/Database/data/mirage-mc-export.json @@ -0,0 +1 @@ +[{"variable":"apiVersion","export":true},{"variable":"city_id","export":true},{"variable":"latitude","export":true},{"variable":"longitude","export":true},{"variable":"city","export":true},{"variable":"country","export":true},{"variable":"utcOffset","export":true},{"variable":"station","export":true},{"variable":"station_id","export":true},{"variable":"url","export":true},{"variable":"station_name","export":true},{"variable":"station_description","export":true},{"variable":"station_genre","export":true},{"variable":"station_language","export":true},{"variable":"station_url","export":true},{"variable":"station_format","export":true},{"variable":"station_form","export":true},{"variable":"station_frequency","export":true},{"variable":"annotator","export":true},{"variable":"event_id","export":true},{"variable":"time_station","export":true},{"variable":"stream_title","export":true},{"variable":"stream_codec","export":true},{"variable":"stream_bitrate","export":true},{"variable":"stream_framerate","export":true},{"variable":"stream_channels","export":true},{"variable":"artist_name","export":true},{"variable":"artist_id","export":true},{"variable":"artist_followers","export":false},{"variable":"artist_popularity","export":false},{"variable":"artist_genres","export":false},{"variable":"artist_image_url","export":false},{"variable":"track_name","export":true},{"variable":"track_id","export":true},{"variable":"track_duration","export":false},{"variable":"track_year_released","export":false},{"variable":"track_popularity","export":false},{"variable":"track_loudness","export":false},{"variable":"track_tempo","export":false},{"variable":"track_key","export":false},{"variable":"track_mode","export":false},{"variable":"track_beatsperbar","export":false},{"variable":"track_danceability","export":false},{"variable":"track_speechiness","export":false},{"variable":"track_acousticness","export":false},{"variable":"track_instrumentalness","export":false},{"variable":"track_liveness","export":false},{"variable":"track_energy","export":false},{"variable":"track_valence","export":false},{"variable":"metadata_editdist","export":true},{"variable":"artist_qid","export":true},{"variable":"wd_artist_name","export":true},{"variable":"artist_type","export":true},{"variable":"artist_description","export":true},{"variable":"wd_artist_genres","export":true},{"variable":"artist_startyear","export":true},{"variable":"artist_country","export":true},{"variable":"artist_coordinates","export":true},{"variable":"artist_members","export":true},{"variable":"artist_genders","export":true},{"variable":"artist_sexualorientations","export":true},{"variable":"artist_ethnicities","export":true},{"variable":"artist_instruments","export":true},{"variable":"artist_voicetypes","export":true},{"variable":"artist_website","export":true},{"variable":"artist_YouTubeID","export":true},{"variable":"artist_MusixmatchID","export":true},{"variable":"artist_AZlyricsID","export":true},{"variable":"artist_MusicBrainzID","export":true},{"variable":"track_qid","export":true},{"variable":"wd_track_name","export":true},{"variable":"track_description","export":true},{"variable":"track_opus","export":true},{"variable":"track_form","export":true},{"variable":"track_tonality","export":true},{"variable":"track_instrumentation","export":true},{"variable":"score_url","export":true},{"variable":"track_language","export":true},{"variable":"track_yearreleased","export":true},{"variable":"track_composers","export":true},{"variable":"track_lyricists","export":true},{"variable":"track_geniusID","export":true},{"variable":"track_MusicBrainzID","export":true},{"variable":"track_YouTubeID","export":true}] \ No newline at end of file diff --git a/src/Providers/Query/index.js b/src/Providers/Query/index.js index 1c0e7ed..fab5330 100644 --- a/src/Providers/Query/index.js +++ b/src/Providers/Query/index.js @@ -4,12 +4,18 @@ import {useMemo} from "react"; export default function useQuery() { const { search } = useLocation(); - const {requestDetail} = useDatabase(); + const {requestDetail, getDataFromShortenLink} = useDatabase(); return useMemo(() => { - const queryObject = new URLSearchParams(search); + const queryObject = new URLSearchParams(window.location.href.split('?')[1]); + if (queryObject.get("selected")) { + getDataFromShortenLink(queryObject.get("selected")); + + return queryObject; + } if (queryObject.get("id")) { requestDetail({_id: queryObject.get("id")}); return queryObject; } }, [search]); + } \ No newline at end of file diff --git a/src/assets/logo.png b/src/assets/logo.png index e90f72e..d83c255 100644 Binary files a/src/assets/logo.png and b/src/assets/logo.png differ diff --git a/src/assets/logo_mc.png b/src/assets/logo_mc.png new file mode 100644 index 0000000..e90f72e Binary files /dev/null and b/src/assets/logo_mc.png differ diff --git a/src/components/AppHeader/index.js b/src/components/AppHeader/index.js index 7a19ba4..7ff1e92 100644 --- a/src/components/AppHeader/index.js +++ b/src/components/AppHeader/index.js @@ -36,8 +36,10 @@ export default function ({layoutItems,layoutItemsOnChange=()=>{}}){ const handleCloseUserMenu = () => { setAnchorElUser(null); }; + return <> + v{process.env.REACT_APP_DATA_APP_VERSION} dispatch({ type: SET_MENU, opened: true })}> diff --git a/src/components/Earth/index.js b/src/components/Earth/index.js index 0de51cd..41a5965 100644 --- a/src/components/Earth/index.js +++ b/src/components/Earth/index.js @@ -63,7 +63,6 @@ const Earth3D = forwardRef(({locs,countries,width,height,onSelect,onSelectLegend },[]); function handleData({locs,countries}) { - console.log(locs,countries) const contriesMap = {}; const range = d3.extent(locs, d => d?.count); @@ -260,7 +259,7 @@ const Earth3D = forwardRef(({locs,countries,width,height,onSelect,onSelectLegend getSwitchView(!current); }} > - {getSwitchView()?'Full data':'Demo data'} + {getSwitchView()?'All Data':'Reviewed Data'} semicolor(theme.palette.background.paper)}}> - Song Info & Visualizations + Event Info & Visualizations {},onDownloadSelectedList=()=> - {onDownloadSearchList();handleClose();}}>Data from Search list - {onDownloadSelectedList();handleClose();}}>Data from Selected list + {onDownloadSearchList();handleClose();}}>Data from Search list + {onDownloadSelectedList();handleClose();}}>Data from Selected list MIRAGE-MetaCorpus Song List MIRAGE-MetaCorpus Station List diff --git a/src/components/EventTable/ShareButton.js b/src/components/EventTable/ShareButton.js new file mode 100644 index 0000000..2f4c9b0 --- /dev/null +++ b/src/components/EventTable/ShareButton.js @@ -0,0 +1,49 @@ +import {Button, TextField, Stack} from "@mui/material"; +import React, {Fragment, useState} from "react"; +import QuestionDialog from '../../components/Dialog'; + +export default function ShareButton({getUrl}){ + const [dialogOpen,setDialogOpen] = useState(false); + const [url,setUrl] = useState(''); + const [isProcessing, setIsProcessing] = useState(false) + + const closeDialog = () => { + setDialogOpen(false); + } + const openDialog = () => { + setIsProcessing(true); + getUrl().then(d=>{ + setUrl(d); + setDialogOpen(true); + setIsProcessing(false); + }).catch((e)=>{ + setUrl(''); + setIsProcessing(false); + }) + } + return + + + + + } + /> + +} \ No newline at end of file diff --git a/src/components/EventTable/fields.js b/src/components/EventTable/fields.js index 54e8a19..0841d5c 100644 --- a/src/components/EventTable/fields.js +++ b/src/components/EventTable/fields.js @@ -44,11 +44,12 @@ export const fields = [ { accessorKey: 'artist_name', header: 'Artist', + cat:'artist', dynamic:true, }, { accessorKey: 'track_name', - header: 'Song', + header: 'Event', dynamic:true, } // , @@ -61,4 +62,36 @@ export const fields = [ // } ]; export const fieldsWithoutSelected = fields.filter((d,i)=>i); -export const filterSearch = fields.filter(f=>!f.filterDisable); \ No newline at end of file +export const filterSearch = [ + ...fields.filter(f=>!f.filterDisable), + { + accessorKey: 'artist_country', + header: 'Artist Country ', + cat:'artist', + dynamic:true, + }, + { + accessorKey: 'artist_genres', + header: 'Artist Genre ', + cat:'artist', + dynamic:true, + }, + { + accessorKey: 'artist_genders', + header: 'Artist Gender', + cat:'artist', + dynamic:true, + }, + { + accessorKey: 'artist_sexualorientations', + header: 'Artist Sexualorientations ', + cat:'artist', + dynamic:true, + }, + { + accessorKey: 'artist_ethnicities', + header: 'Artist Ethnicities ', + cat:'artist', + dynamic:true, + }, +]; \ No newline at end of file diff --git a/src/components/EventTable/index.js b/src/components/EventTable/index.js index 2ca62d7..a96abb2 100644 --- a/src/components/EventTable/index.js +++ b/src/components/EventTable/index.js @@ -1,4 +1,4 @@ -import React, {useEffect, useMemo, useRef, useState} from 'react'; +import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; import {MaterialReactTable, MRT_ToolbarAlertBanner} from 'material-react-table'; import Scrollbar from "material-ui-shell/lib/components/Scrollbar"; // import {fields} from "./fields"; @@ -10,11 +10,12 @@ import SaveIcon from '@mui/icons-material/Save'; import {ExportToCsv} from 'export-to-csv'; import {useDatabase} from "../../Providers/Database"; import DownloadOption from "./DownloadOption"; - +import ShareButton from "./ShareButton"; const EventTable = ({ id = 'tableevent', columns, data, totalData, selectedData, disableAdding, - isLoadingData, onSelectRow, highlightId, onSendToList, onRemoveFromList + isLoadingData, onSelectRow, highlightId, onSendToList, onRemoveFromList, + mainurl }) => { const [rowSelection, setRowSelection] = useState({}); @@ -24,7 +25,8 @@ const EventTable = ({ // const [data, setData] = useState([]); const [isLoading, setIsLoading] = useState(false); const [sorting, setSorting] = useState([]); - const {getDownloadData} = useDatabase(); + const {getDownloadData,getShortenLink, getList} = useDatabase(); + const event_export_list = getList('event_export_list'); useEffect(() => { //scroll to the top of the table when the sorting changes @@ -42,14 +44,14 @@ const EventTable = ({ setIsLoading(true) getDownloadData(rows).then((datadownload) => { const csvOptions = { - fieldSeparator: ',', + fieldSeparator: '|', quoteStrings: '"', decimalSeparator: '.', showLabels: true, filename: `mirage-mc-${new Date().toDateString()}`, useBom: true, useKeysAsHeaders: true, - // headers: fields.map((c) => c.accessorKey), + headers: Object.keys(event_export_list), }; const csvExporter = new ExportToCsv(csvOptions); csvExporter.generateCsv(datadownload); @@ -96,6 +98,9 @@ const EventTable = ({ csvExporter.generateCsv(datadownload); setIsLoading(false) }; + const handleUrl = useCallback(async() => { + return getShortenLink(); + },[data,mainurl]) // console.log(data) return ( handleExportRows(totalData)} onDownloadSelectedList={() => handleExportRows(selectedData)} /> + ) }} diff --git a/src/components/EventTable/wrapper.js b/src/components/EventTable/wrapper.js index 0b5c049..a5516ed 100644 --- a/src/components/EventTable/wrapper.js +++ b/src/components/EventTable/wrapper.js @@ -6,7 +6,7 @@ import EventTable from "./index"; export default function ({data,isLoadingData,onTogleWin,onSelectRow,highlightId}) { return semicolor(theme.palette.background.paper),height:'100%',position:'relative'}}> - Song List + Event List {},...props}) { + const [input, setInput] = React.useState(''); + return { + setInput(newValue); + onInputChange(event,newValue,reason) + }} + onBlur={()=>{setInput('')}} + {...props} + /> +} \ No newline at end of file diff --git a/src/components/FilterPanel/SelectionWithOption.js b/src/components/FilterPanel/SelectionWithOption.js new file mode 100644 index 0000000..50a14e5 --- /dev/null +++ b/src/components/FilterPanel/SelectionWithOption.js @@ -0,0 +1,86 @@ +import React, { useEffect } from "react"; +import {Stack, MenuItem, Select,FormControl, TextField, IconButton} from "@mui/material"; +import CancelIcon from '@mui/icons-material/Cancel'; +import CusAutocomplete from "./CusAutocomplete"; +import ListboxComponent from "../ListboxComponent"; +import { useSelector, useDispatch } from "react-redux"; +import { + setFilter, + deleteFilter, + selectFilters +} from "../../reducer/streamfilters"; + +const emptyArray = []; +const emptyObj = {}; +const emptyFunc = ()=>{}; +export default function SelectionWithOption({options=emptyArray, + enabled=emptyObj, filterOptionsFunc, + cat='', + filterOptions,searchByStream, + getList, isLoading, logEvents}) { + const [f, setF] = React.useState({}); + const dispatch = useDispatch(); + const filters = useSelector(selectFilters); + + useEffect(()=>{ + if (cat!=='') + setF(options.find(d=>d.accessorKey===cat)); + },[cat]) + + const handleChange = (event) => { + dispatch(setFilter({key:event.target.value,value:[],prekey:cat})); + }; + + const onDelete = () =>{ + dispatch(deleteFilter({key:cat})); + } + return + + + + + d} + value={filters[f.accessorKey]??[]} + onChange={(event, value) => { + if (value!=='' && value && value.length) + logEvents('search',{'search_term':value,key:f.accessorKey,}) + dispatch(setFilter({key:f.accessorKey,value})); + }} + onInputChange={f.dynamic?((event, newInputValue) => { + if (newInputValue&&newInputValue!=='') + searchByStream(f.accessorKey,newInputValue,f.cat); + }):undefined} + renderInput={(params) => ( + + )} + /> + {(cat!=='')&& + + } + + +} \ No newline at end of file diff --git a/src/components/FilterPanel/index.js b/src/components/FilterPanel/index.js index 7d410d4..de28b08 100644 --- a/src/components/FilterPanel/index.js +++ b/src/components/FilterPanel/index.js @@ -1,16 +1,16 @@ -import React, {useEffect, useMemo, useState} from "react"; +import React, {useCallback, useEffect, useMemo, useState} from "react"; import { useSelector, useDispatch } from "react-redux"; import { setFilter, - setFilters, - selectFilters + selectFiltersList, + selectHasEmpty } from "../../reducer/streamfilters"; import { ActionCreators } from "redux-undo"; -import {Autocomplete, createFilterOptions, Stack, TextField} from "@mui/material"; +import {Button, createFilterOptions, Stack, TextField} from "@mui/material"; import {filterSearch} from "../EventTable/fields"; import {useDatabase} from "../../Providers/Database"; -import ListboxComponent from "../ListboxComponent"; import {useLog} from "../../Providers/Firebase"; +import SelectionWithOption from "./SelectionWithOption"; const OPTIONS_LIMIT = 50; const defaultFilterOptions = createFilterOptions(); @@ -21,12 +21,21 @@ const filterOptionsFunc = (options, state) => { export default function FilterPanel() { - const filters = useSelector(selectFilters); - const dispatch = useDispatch(); const [filterOptions,setFilterOptions] = useState({}); const {isLoading,searchByStream,getList} = useDatabase(); + const [categoryOption,setCategoryOption] = useState({}); + const categoryOptionList = useSelector(selectFiltersList); + const hasEmpty = useSelector(selectHasEmpty); + const dispatch = useDispatch(); const {logEvents} = useLog(); + useEffect(()=>{ + const obj = {}; + categoryOptionList.forEach(element => { + obj[element] = true; + }); + setCategoryOption(obj); + },[categoryOptionList]) // useEffect(()=>{ // if (!Object.keys(filters).length) { // // const newfilters = {}; @@ -42,9 +51,31 @@ export default function FilterPanel() { useEffect(()=>{ setFilterOptions({...fields}); },[fields]) - return - {filterSearch.map(f=>)} + {(categoryOptionList.length{ + debugger + dispatch(setFilter({key:''})); + }} + > + Add filter + } + {/* {filterSearch.map(f=> )} - />)} + />)} */} {/**/} -} - -function CusAutocomplete ({onInputChange=()=>{},...props}) { - const [input, setInput] = React.useState(''); - return { - setInput(newValue); - onInputChange(event,newValue,reason) - }} - onBlur={()=>{setInput('')}} - {...props} - /> } \ No newline at end of file diff --git a/src/components/FilterPanel/index_list.js b/src/components/FilterPanel/index_list.js new file mode 100644 index 0000000..7d410d4 --- /dev/null +++ b/src/components/FilterPanel/index_list.js @@ -0,0 +1,101 @@ +import React, {useEffect, useMemo, useState} from "react"; +import { useSelector, useDispatch } from "react-redux"; +import { + setFilter, + setFilters, + selectFilters +} from "../../reducer/streamfilters"; +import { ActionCreators } from "redux-undo"; +import {Autocomplete, createFilterOptions, Stack, TextField} from "@mui/material"; +import {filterSearch} from "../EventTable/fields"; +import {useDatabase} from "../../Providers/Database"; +import ListboxComponent from "../ListboxComponent"; +import {useLog} from "../../Providers/Firebase"; + +const OPTIONS_LIMIT = 50; +const defaultFilterOptions = createFilterOptions(); + +const filterOptionsFunc = (options, state) => { + return defaultFilterOptions(options, state).slice(0, OPTIONS_LIMIT); +}; + + +export default function FilterPanel() { + const filters = useSelector(selectFilters); + const dispatch = useDispatch(); + const [filterOptions,setFilterOptions] = useState({}); + const {isLoading,searchByStream,getList} = useDatabase(); + + const {logEvents} = useLog(); + // useEffect(()=>{ + // if (!Object.keys(filters).length) { + // // const newfilters = {}; + // // filterSearch.forEach(f=>{ + // // newfilters[f.accessorKey] = null; + // // }) + // // dispatch(setFilters({value: newfilters})); + // ActionCreators.clearHistory(); + // } + // },[]); + const fields = getList('fields'); + + useEffect(()=>{ + setFilterOptions({...fields}); + },[fields]) + + return + {filterSearch.map(f=> d} + value={filters[f.accessorKey]??[]} + onChange={(event, value) => { + if (value!=='' && value && value.length) + logEvents('search',{'search_term':value,key:f.accessorKey,}) + dispatch(setFilter({key:f.accessorKey,value})); + }} + onInputChange={f.dynamic?((event, newInputValue) => { + if (newInputValue&&newInputValue!=='') + searchByStream(f.accessorKey,newInputValue); + }):undefined} + renderInput={(params) => ( + + )} + />)} + {/* {*/} + {/* const val = {...(filters["time_station"] ?? {})};*/} + {/* if (value)*/} + {/* val[key] = value;*/} + {/* else*/} + {/* delete val[key];*/} + {/* dispatch(setFilter({key:"time_station",value:val}));*/} + {/* }}*/} + {/*/>*/} + +} + +function CusAutocomplete ({onInputChange=()=>{},...props}) { + const [input, setInput] = React.useState(''); + return { + setInput(newValue); + onInputChange(event,newValue,reason) + }} + onBlur={()=>{setInput('')}} + {...props} + /> +} \ No newline at end of file diff --git a/src/components/MenuHeader/MenuHeader.js b/src/components/MenuHeader/MenuHeader.js index 62c15b3..65869a4 100644 --- a/src/components/MenuHeader/MenuHeader.js +++ b/src/components/MenuHeader/MenuHeader.js @@ -45,7 +45,6 @@ const MenuHeader = () => { ...theme.mixins.toolbar, }, } - return ( { isOpen={dialogOpen} handleClose={closeDialog} isProcessing={isProcessing} - title={'About us'} + title={''} maxWidth={"md"} message={<> - Welcome to the Music Informatics for Radio Across the GlobE (MIRAGE) project! This online dashboard allows you to access, interact with, and export meta data and musicological features from the music found on internet radio. + Welcome to the Music Informatics for Radio Across the GlobE (MIRAGE) project! The first development release (v{process.env.REACT_APP_DATA_APP_VERSION}) of this online dashboard allows you to access, interact with, and export meta data and musicological features from the music found on internet radio. + + - The MIRAGE dashboard consists of meta data (e.g., artist name, song title, etc.) for one million songs or events that were streaming on the Radio Garden streaming service during the months October-January 2022-2023. Each of 86 meta data variables pertaining to the location, station, stream, artist, and track was obtained from the Radio Garden API, the Internet Radio Station Stream Encoder, Annotator review, or the Spotify or Wikidata APIs. + The MIRAGE dashboard (v{process.env.REACT_APP_DATA_APP_VERSION}) consists of meta data (e.g., artist name, event title, etc.) for one million songs or events that were streaming on the Radio Garden streaming service during the months October-January 2022-2023. Each of 86 meta data variables pertaining to the location, station, stream, artist, and track was obtained from either the Radio Garden API, the internet radio station stream encoder, review by human annotators, or the Spotify and Wikidata APIs. - If you plan to use any of the data or visualizations available on the MIRAGE dashboard, please cite the following publication: + If you are a copyright owner for any of the metadata that appears in MIRAGE and would like us to remove your metadata, please contact the developer team at the following email address: {""} - - Sears, David R. W., Goh, Ting Ting, Nguyen, Ngan V. T., and Tommy Dang. (2023). Developing corpora for musical traditions across the globe: Music analysis with the MIRAGE-MetaCorpus. Paper presented at the 46th annual meeting of the Society for Music Theory (SMT), Denver, CO, November 11. + + If you plan to use any of the data or visualizations available on the MIRAGE dashboard, please cite the following publication: - - The source code for the MIRAGE dashboard is also available on Github: https://github.com/iDataVisualizationLab/mirage-mc + + {""} { const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions()); const [layoutItems,setLayoutItems] = useState({ Earth:{key:"Earth View",val:true,disable:true}, - eventList:{key:"Song List",val:true}, - eventDetail:{key:"Song Details",val:true}, - eventMap:{key:"Song List Map",val:true}, + eventList:{key:"Event List",val:true}, + eventDetail:{key:"Event Details",val:true}, + eventMap:{key:"Event List Map",val:true}, mediaDetail:{key:"Listen",val:true}, - eventSelectedList:{key:"Selected Songs",val:true}, - eventListDetail:{key:"Song List Details",val:true}, + eventSelectedList:{key:"Selected Events",val:true}, + eventListDetail:{key:"Event List Details",val:true}, }); const toolbarRef = useRef(null); const layoutRef = useRef(null); @@ -77,6 +78,7 @@ const LandingPage = () => { const eventSelectedData = useSelector(state => Array.from(state.seletedList.items.values( ) )); const {setlocation, logEvents} = useLog(); const query = useQuery(); + const location = useLocation(); useEffect(()=>{ if (navigator.geolocation) { navigator.geolocation.getCurrentPosition((position)=>{ @@ -97,11 +99,18 @@ const LandingPage = () => { const isLoadingInit = isLoading('rawData'); const isLoadingEvent = isLoading('events'); const isLoadingLocs = isLoading('locs'); + const [firstLoad,setFirstLoad] = useState(true); useEffect(()=>{ if (!isLoadingInit) { - requestEvents(filters, 1000) + if (firstLoad){ + setFirstLoad(false); + if (!(query && query.get("selected"))) + requestEvents(filters, 1000); + } else{ + requestEvents(filters, 1000); } - },[isLoadingInit,filters]) + } + },[isLoadingInit,filters,firstLoad]) const onSelectStream = useCallback((data)=>{ requestDetail(data); },[getEvents]) @@ -179,25 +188,29 @@ const LandingPage = () => { children: [ {"type": "row", children: [ - { - type: "tabset", - weight: 50, + {"type": "row", children: [ { - type: "tab", - name: "Song List", - component: "eventList", - } - ] - }, - { - type: "tabset", - weight: 50, - children: [ + type: "tabset", + weight: 50, + children: [ + { + type: "tab", + name: "Event List", + component: "eventList", + } + ] + }, { - type: "tab", - name: "Selected Songs", - component: "eventSelectedList", + type: "tabset", + weight: 50, + children: [ + { + type: "tab", + name: "Selected Events", + component: "eventSelectedList", + } + ] } ] }, @@ -207,7 +220,7 @@ const LandingPage = () => { children: [ { type: "tab", - name: "Song Detail", + name: "Event Detail", component: "eventDetail", },{ type: "tab", @@ -215,17 +228,17 @@ const LandingPage = () => { component: "mediaDetail", },{ type: "tab", - name: "Song List Map", + name: "Event List Map", component: "eventMap", }, { type: "tab", - name: "Song List Detail", + name: "Event List Detail", component: "eventListDetail", } ] } - ] + ] } ] } @@ -255,6 +268,7 @@ const LandingPage = () => { onSendToList={(l)=>dispatch(actionCreators.addsToBasket(l))} onRemoveFromList={(l)=>dispatch(actionCreators.removeItems(l))} // onTogleWin={()=>onTogleWin("eventList")} + mainurl={location} />; case 'eventListDetail': return ; @@ -271,6 +285,7 @@ const LandingPage = () => { onSendToList={(l)=>dispatch(actionCreators.addsToBasket(l))} onRemoveFromList={(l)=>dispatch(actionCreators.removeItems(l))} // onTogleWin={()=>onTogleWin("eventList")} + mainurl={location} /> case 'eventMap': return { + state.orderList = state.orderList.filter(d=>d!==action.payload.key); + state.value[action.payload.key] = []; + }, setFilter: (state,action) =>{ - state.value[action.payload.key] = action.payload.value; - + let oindex = state.orderList.indexOf(action.payload.key); + if (action.payload.key!==''){ + // check if filter existed in list + if (oindex!=-1){ + state.value[action.payload.key] = action.payload.value; + }else{ + // check if need to replace + let preindex = state.orderList.indexOf(action.payload.prekey); + if (preindex!=-1){ + state.orderList[preindex] = action.payload.key; + if(action.payload.prekey !=='') + state.value[action.payload.prekey] = []; // remove oldfilter + }else{ + state.orderList.push(action.payload.key); + } + } + state.value[action.payload.key] = action.payload.value; + }else{ + if (oindex==-1){ + state.orderList.push(action.payload.key); + } + } + state.hasEmpty = state.orderList.indexOf('')!==-1; }, setFilters: (state,action) => { state.value = {...action.payload.value}; + state.orderList = Object.keys(action.payload.value); + state.hasEmpty = state.orderList.indexOf('')!==-1; } } }); -export const { setFilter, setFilters } = streamFilters.actions; +export const { deleteFilter, setFilter, setFilters } = streamFilters.actions; export const selectFilters = (state) => state.streamFilters.present.value; +export const selectFiltersList = (state) => state.streamFilters.present.orderList; +export const selectHasEmpty = (state) => state.streamFilters.present.hasEmpty; export default streamFilters.reducer \ No newline at end of file