From cd8c00dc27aecdf48c32b7b54562c602cba92c74 Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Wed, 27 Mar 2024 17:17:47 +0700 Subject: [PATCH 01/14] revise --- .env | 6 +- package-lock.json | 1408 +++++++++++++++++++--- package.json | 2 +- src/assets/logo.png | Bin 27947 -> 30193 bytes src/assets/logo_mc.png | Bin 0 -> 27947 bytes src/components/AppHeader/index.js | 1 + src/components/Earth/index.js | 2 +- src/components/FilterPanel/index_list.js | 101 ++ src/components/MenuHeader/MenuHeader.js | 2 +- src/pages/LandingPage/LandingPage.js | 38 +- 10 files changed, 1366 insertions(+), 194 deletions(-) create mode 100644 src/assets/logo_mc.png create mode 100644 src/components/FilterPanel/index_list.js diff --git a/.env b/.env index fbd00bd..4369978 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 +APP_VERSION=$npm_package_version \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 947d6ff..5415d57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2524,6 +2524,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 +2569,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 +5613,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 +5676,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 +5985,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 +6144,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 +6671,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 +6701,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 +7196,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 +7401,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 +7773,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 +8019,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 +8419,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 +8430,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 +9206,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 +9416,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 +10413,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 +10445,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 +10477,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 +10586,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 +10889,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 +11316,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 +11421,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 +12310,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 +12733,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 +13054,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 +15537,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 +15574,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", @@ -15803,17 +15994,93 @@ "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/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": { - "node": ">= 0.6" + "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/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": { + "node": ">= 0.6" } }, "node_modules/memfs": { @@ -15858,6 +16125,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 +16664,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 +16675,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 +16764,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 +16981,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", @@ -18341,11 +19068,22 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "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 +19476,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 +19611,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 +20172,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 +20465,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 +20502,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 +20652,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", @@ -20128,6 +21011,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 +21386,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 +21900,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 +22056,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 +22079,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 +22284,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 +22347,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 +22391,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 +22648,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 +22782,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 +22966,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 +22977,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 +23053,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 +23064,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 +23378,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 +23392,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..8ae5fc1 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", diff --git a/src/assets/logo.png b/src/assets/logo.png index e90f72e6c35e4dea189aa17fadeb61bfccbec18b..d83c255aad7cf7a285bdce01af4a1cae1af14541 100644 GIT binary patch literal 30193 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 literal 27947 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 }; return <> + {process.env.REACT_APP_VERSION} dispatch({ type: SET_MENU, opened: true })}> diff --git a/src/components/Earth/index.js b/src/components/Earth/index.js index 0de51cd..131e595 100644 --- a/src/components/Earth/index.js +++ b/src/components/Earth/index.js @@ -260,7 +260,7 @@ const Earth3D = forwardRef(({locs,countries,width,height,onSelect,onSelectLegend getSwitchView(!current); }} > - {getSwitchView()?'Full data':'Demo data'} + {getSwitchView()?'All Data':'Reviewed Data'} { + 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..21363ed 100644 --- a/src/components/MenuHeader/MenuHeader.js +++ b/src/components/MenuHeader/MenuHeader.js @@ -45,7 +45,6 @@ const MenuHeader = () => { ...theme.mixins.toolbar, }, } - return ( { + {process.env.npm_package_version} { toggleThisTheme('isDarkMode') diff --git a/src/pages/LandingPage/LandingPage.js b/src/pages/LandingPage/LandingPage.js index 969a80d..aee9cfe 100644 --- a/src/pages/LandingPage/LandingPage.js +++ b/src/pages/LandingPage/LandingPage.js @@ -179,25 +179,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: "Song List", + component: "eventList", + } + ] + }, { - type: "tab", - name: "Selected Songs", - component: "eventSelectedList", + type: "tabset", + weight: 50, + children: [ + { + type: "tab", + name: "Selected Songs", + component: "eventSelectedList", + } + ] } ] }, @@ -225,7 +229,7 @@ const LandingPage = () => { } ] } - ] + ] } ] } From 304a64d6eba036ba278617dd3b67cd9e67c23b2d Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Wed, 27 Mar 2024 18:21:22 +0700 Subject: [PATCH 02/14] update --- .env | 2 +- src/components/AppHeader/index.js | 3 ++- src/components/MenuHeader/MenuHeader.js | 1 - src/pages/About/index.js | 20 ++++++++++---------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.env b/.env index 4369978..90e15a7 100644 --- a/.env +++ b/.env @@ -6,4 +6,4 @@ 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 -APP_VERSION=$npm_package_version \ No newline at end of file +REACT_APP_DATA_APP_VERSION=0.1 \ No newline at end of file diff --git a/src/components/AppHeader/index.js b/src/components/AppHeader/index.js index d33df56..7ff1e92 100644 --- a/src/components/AppHeader/index.js +++ b/src/components/AppHeader/index.js @@ -36,9 +36,10 @@ export default function ({layoutItems,layoutItemsOnChange=()=>{}}){ const handleCloseUserMenu = () => { setAnchorElUser(null); }; + return <> - {process.env.REACT_APP_VERSION} + v{process.env.REACT_APP_DATA_APP_VERSION} dispatch({ type: SET_MENU, opened: true })}> diff --git a/src/components/MenuHeader/MenuHeader.js b/src/components/MenuHeader/MenuHeader.js index 21363ed..65869a4 100644 --- a/src/components/MenuHeader/MenuHeader.js +++ b/src/components/MenuHeader/MenuHeader.js @@ -69,7 +69,6 @@ const MenuHeader = () => { - {process.env.npm_package_version} { toggleThisTheme('isDarkMode') diff --git a/src/pages/About/index.js b/src/pages/About/index.js index 10e4a93..c0e62d9 100644 --- a/src/pages/About/index.js +++ b/src/pages/About/index.js @@ -23,25 +23,25 @@ const AboutDialog = ({ children }) => { 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, 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 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 + + {""} Date: Wed, 27 Mar 2024 21:51:52 +0700 Subject: [PATCH 03/14] just prepare for Filter not done yet --- .../FilterPanel/SelectionWithOption.js | 16 ++++++++++++++++ src/components/FilterPanel/index.js | 4 ++++ 2 files changed, 20 insertions(+) create mode 100644 src/components/FilterPanel/SelectionWithOption.js diff --git a/src/components/FilterPanel/SelectionWithOption.js b/src/components/FilterPanel/SelectionWithOption.js new file mode 100644 index 0000000..f6b2263 --- /dev/null +++ b/src/components/FilterPanel/SelectionWithOption.js @@ -0,0 +1,16 @@ +import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; + +export default function SelectionWithOption() { + return + + +} \ No newline at end of file diff --git a/src/components/FilterPanel/index.js b/src/components/FilterPanel/index.js index 7d410d4..ee83f3d 100644 --- a/src/components/FilterPanel/index.js +++ b/src/components/FilterPanel/index.js @@ -7,10 +7,12 @@ import { } from "../../reducer/streamfilters"; import { ActionCreators } from "redux-undo"; import {Autocomplete, createFilterOptions, Stack, TextField} from "@mui/material"; +import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; 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(); @@ -25,6 +27,7 @@ export default function FilterPanel() { const dispatch = useDispatch(); const [filterOptions,setFilterOptions] = useState({}); const {isLoading,searchByStream,getList} = useDatabase(); + const [categoryOption,setCategoryOption] = useState({}); const {logEvents} = useLog(); // useEffect(()=>{ @@ -44,6 +47,7 @@ export default function FilterPanel() { },[fields]) return + {filterSearch.map(f=> Date: Thu, 28 Mar 2024 19:31:04 +0700 Subject: [PATCH 04/14] update filter --- src/components/FilterPanel/CusAutocomplete.js | 14 ++++ .../FilterPanel/SelectionWithOption.js | 84 ++++++++++++++++--- src/components/FilterPanel/index.js | 60 ++++++++----- 3 files changed, 125 insertions(+), 33 deletions(-) create mode 100644 src/components/FilterPanel/CusAutocomplete.js diff --git a/src/components/FilterPanel/CusAutocomplete.js b/src/components/FilterPanel/CusAutocomplete.js new file mode 100644 index 0000000..0182b49 --- /dev/null +++ b/src/components/FilterPanel/CusAutocomplete.js @@ -0,0 +1,14 @@ +import React from "react"; +import {Autocomplete} from "@mui/material"; +export default 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/SelectionWithOption.js b/src/components/FilterPanel/SelectionWithOption.js index f6b2263..611b35a 100644 --- a/src/components/FilterPanel/SelectionWithOption.js +++ b/src/components/FilterPanel/SelectionWithOption.js @@ -1,16 +1,76 @@ -import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; +import React from "react"; +import {Stack, MenuItem, Select,FormControl, TextField} from "@mui/material"; +import CusAutocomplete from "./CusAutocomplete"; +import ListboxComponent from "../ListboxComponent"; +import { useSelector, useDispatch } from "react-redux"; +import { + setFilter, + setFilters, + selectFilters +} from "../../reducer/streamfilters"; -export default function SelectionWithOption() { - return - } + {/* {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 From b4b35a3d49e58023e66f102b6dc266b0640890a6 Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Thu, 28 Mar 2024 21:14:45 +0700 Subject: [PATCH 05/14] update filter --- .../FilterPanel/SelectionWithOption.js | 35 ++++++++++++++----- src/components/FilterPanel/index.js | 21 +++++++---- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/components/FilterPanel/SelectionWithOption.js b/src/components/FilterPanel/SelectionWithOption.js index 611b35a..3b3e7cd 100644 --- a/src/components/FilterPanel/SelectionWithOption.js +++ b/src/components/FilterPanel/SelectionWithOption.js @@ -1,5 +1,6 @@ -import React from "react"; -import {Stack, MenuItem, Select,FormControl, TextField} from "@mui/material"; +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"; @@ -15,23 +16,37 @@ const emptyFunc = ()=>{}; export default function SelectionWithOption({options=emptyArray, enabled=emptyObj, onChangeCat=emptyFunc, filterOptionsFunc, order=0, + cat='', filterOptions,searchByStream, getList, isLoading, logEvents}) { - const [cat, setCat] = React.useState(''); 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) => { - onChangeCat(cat,event.target.value); - setF(options.find(d=>d.accessorKey===event.target.value)); - setCat(event.target.value); + onChangeCat(cat,event.target.value,order); + // setF(options.find(d=>d.accessorKey===event.target.value)); // reset filter - dispatch(setFilter({key:cat,value:[]})); + if (cat!=="") + dispatch(setFilter({key:cat,value:[]})); }; + + const onDelete = () =>{ + debugger + // have something to filter + if (filters[f.accessorKey]&& filters[f.accessorKey].length){ + dispatch(setFilter({key:cat,value:[]})); + } + onChangeCat(cat,'',order); // delete + } return - + { if (newInputValue&&newInputValue!=='') - searchByStream(f.accessorKey,newInputValue); + searchByStream(f.accessorKey,newInputValue,f.cat); }):undefined} renderInput={(params) => ( )} /> - + {(cat!=='')&& - + } } \ No newline at end of file diff --git a/src/reducer/streamfilters.js b/src/reducer/streamfilters.js index 0bd0f22..7b1f06c 100644 --- a/src/reducer/streamfilters.js +++ b/src/reducer/streamfilters.js @@ -13,7 +13,6 @@ const streamFilters = createSlice({ state.value[action.payload.key] = []; }, setFilter: (state,action) =>{ - debugger let oindex = state.orderList.indexOf(action.payload.key); if (action.payload.key!==''){ // check if filter existed in list From 0dc7f098de80a9014bd12264d2c979548d5aa549 Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Tue, 9 Apr 2024 19:18:54 +0700 Subject: [PATCH 09/14] update share button --- package-lock.json | 22 ++++++++++++-- package.json | 3 ++ src/components/EventTable/ShareButton.js | 38 ++++++++++++++++++++++++ src/components/EventTable/index.js | 24 +++++++++++++-- src/pages/LandingPage/LandingPage.js | 4 +++ 5 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 src/components/EventTable/ShareButton.js diff --git a/package-lock.json b/package-lock.json index e56920f..e743986 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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": { @@ -15838,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" } @@ -17330,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", @@ -20896,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", diff --git a/package.json b/package.json index 8ae5fc1..16a414c 100644 --- a/package.json +++ b/package.json @@ -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/components/EventTable/ShareButton.js b/src/components/EventTable/ShareButton.js new file mode 100644 index 0000000..ff6cb4d --- /dev/null +++ b/src/components/EventTable/ShareButton.js @@ -0,0 +1,38 @@ +import {Button, TextField} from "@mui/material"; +import React, {Fragment, useState} from "react"; +import QuestionDialog from '../../components/Dialog'; +import {SET_MENU} from "../../reducer/actions/setting"; + +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 = () => { + setUrl(getUrl()); + setDialogOpen(true); + } + return + + + + } + /> + +} \ No newline at end of file diff --git a/src/components/EventTable/index.js b/src/components/EventTable/index.js index 2ca62d7..ddcfc9d 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,14 @@ 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"; +import axios from "axios"; +import lzString from "lz-string"; const EventTable = ({ id = 'tableevent', columns, data, totalData, selectedData, disableAdding, - isLoadingData, onSelectRow, highlightId, onSendToList, onRemoveFromList + isLoadingData, onSelectRow, highlightId, onSendToList, onRemoveFromList, + mainurl }) => { const [rowSelection, setRowSelection] = useState({}); @@ -96,6 +99,20 @@ const EventTable = ({ csvExporter.generateCsv(datadownload); setIsLoading(false) }; + const handleUrl = useCallback(async() => { + const compressed = lzString.compressToEncodedURIComponent(JSON.stringify(data.map(d=>d._id))); + debugger + const url = window.location.href+"selected="+compressed + try { + const res = await axios( + `https://api.shrtco.de/v2/shorten?url=${url}` + ) + return (res.data.result.full_short_link); + } catch (e) { + alert("Can't get short url"); + return url; + } + },[data,mainurl]) // console.log(data) return ( handleExportRows(totalData)} onDownloadSelectedList={() => handleExportRows(selectedData)} /> + ) }} diff --git a/src/pages/LandingPage/LandingPage.js b/src/pages/LandingPage/LandingPage.js index aee9cfe..5e798e5 100644 --- a/src/pages/LandingPage/LandingPage.js +++ b/src/pages/LandingPage/LandingPage.js @@ -41,6 +41,7 @@ import {actionCreators} from "../../reducer/actions/selectedList"; import {fields, fieldsWithoutSelected} from "../../components/EventTable/fields"; import SongListDetail from "../../components/SongListDetail"; import {useLog} from "../../Providers/Firebase"; +import {useLocation} from "react-router-dom"; function getWindowDimensions() { const { innerWidth: width, innerHeight: height } = window; @@ -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)=>{ @@ -259,6 +261,7 @@ const LandingPage = () => { onSendToList={(l)=>dispatch(actionCreators.addsToBasket(l))} onRemoveFromList={(l)=>dispatch(actionCreators.removeItems(l))} // onTogleWin={()=>onTogleWin("eventList")} + mainurl={location} />; case 'eventListDetail': return ; @@ -275,6 +278,7 @@ const LandingPage = () => { onSendToList={(l)=>dispatch(actionCreators.addsToBasket(l))} onRemoveFromList={(l)=>dispatch(actionCreators.removeItems(l))} // onTogleWin={()=>onTogleWin("eventList")} + mainurl={location} /> case 'eventMap': return Date: Tue, 9 Apr 2024 20:03:37 +0700 Subject: [PATCH 10/14] update url --- src/Providers/Database/Provider.js | 14 +++++++++++++ src/components/EventTable/ShareButton.js | 25 +++++++++++++++++------- src/components/EventTable/index.js | 14 ++----------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/Providers/Database/Provider.js b/src/Providers/Database/Provider.js index 24d8972..914bbc3 100644 --- a/src/Providers/Database/Provider.js +++ b/src/Providers/Database/Provider.js @@ -293,6 +293,18 @@ const Provider = ({ children }) => { return data; }) },[state]); + + const getShortenLink = useCallback((data)=>{ + return axios.post(`${APIUrl}/url/`,{data}).then(({data})=> { + return window.location.href+"selected="+data._id; + }) + },[state]); + + const getDataFromShortenLink = useCallback((id)=>{ + return axios.get(`${APIUrl}/url/${id}`).then(({data})=> { + return data; + }) + },[state]); const setFuncCollection = useCallback((path,func=emptyFunc)=>{ dispatch({type: 'VALUE_CHANGE', path, value: func, isLoading: false}); @@ -324,6 +336,8 @@ const Provider = ({ children }) => { requestDetail, getListError, getDownloadData, + getShortenLink, + getDataFromShortenLink, isLoading }}> {children} diff --git a/src/components/EventTable/ShareButton.js b/src/components/EventTable/ShareButton.js index ff6cb4d..2f4c9b0 100644 --- a/src/components/EventTable/ShareButton.js +++ b/src/components/EventTable/ShareButton.js @@ -1,7 +1,6 @@ -import {Button, TextField} from "@mui/material"; +import {Button, TextField, Stack} from "@mui/material"; import React, {Fragment, useState} from "react"; import QuestionDialog from '../../components/Dialog'; -import {SET_MENU} from "../../reducer/actions/setting"; export default function ShareButton({getUrl}){ const [dialogOpen,setDialogOpen] = useState(false); @@ -12,8 +11,15 @@ export default function ShareButton({getUrl}){ setDialogOpen(false); } const openDialog = () => { - setUrl(getUrl()); - setDialogOpen(true); + setIsProcessing(true); + getUrl().then(d=>{ + setUrl(d); + setDialogOpen(true); + setIsProcessing(false); + }).catch((e)=>{ + setUrl(''); + setIsProcessing(false); + }) } return @@ -23,16 +29,21 @@ export default function ShareButton({getUrl}){ isProcessing={isProcessing} title={'Share URL'} maxWidth={"md"} - message={<> + message={ - } + + } /> } \ No newline at end of file diff --git a/src/components/EventTable/index.js b/src/components/EventTable/index.js index ddcfc9d..02b8ff8 100644 --- a/src/components/EventTable/index.js +++ b/src/components/EventTable/index.js @@ -27,7 +27,7 @@ const EventTable = ({ // const [data, setData] = useState([]); const [isLoading, setIsLoading] = useState(false); const [sorting, setSorting] = useState([]); - const {getDownloadData} = useDatabase(); + const {getDownloadData,getShortenLink,getDatafromShortenLink} = useDatabase(); useEffect(() => { //scroll to the top of the table when the sorting changes @@ -101,17 +101,7 @@ const EventTable = ({ }; const handleUrl = useCallback(async() => { const compressed = lzString.compressToEncodedURIComponent(JSON.stringify(data.map(d=>d._id))); - debugger - const url = window.location.href+"selected="+compressed - try { - const res = await axios( - `https://api.shrtco.de/v2/shorten?url=${url}` - ) - return (res.data.result.full_short_link); - } catch (e) { - alert("Can't get short url"); - return url; - } + return getShortenLink(compressed); },[data,mainurl]) // console.log(data) return ( From ac95c9dbd8db52f59ca0fbdd57d6aa7042efef82 Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Tue, 14 May 2024 15:11:40 +0700 Subject: [PATCH 11/14] update url + export --- src/Providers/Database/Provider.js | 22 ++++++++++++++++++---- src/Providers/Query/index.js | 10 ++++++++-- src/components/EventTable/index.js | 4 ++-- src/pages/LandingPage/LandingPage.js | 13 +++++++++++-- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Providers/Database/Provider.js b/src/Providers/Database/Provider.js index 914bbc3..19be43c 100644 --- a/src/Providers/Database/Provider.js +++ b/src/Providers/Database/Provider.js @@ -5,9 +5,11 @@ 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"; 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, @@ -216,9 +218,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({ @@ -296,13 +301,22 @@ const Provider = ({ children }) => { const getShortenLink = useCallback((data)=>{ return axios.post(`${APIUrl}/url/`,{data}).then(({data})=> { - return window.location.href+"selected="+data._id; + return HOMEURL+"?selected="+data._id; }) },[state]); const getDataFromShortenLink = useCallback((id)=>{ return axios.get(`${APIUrl}/url/${id}`).then(({data})=> { - return data; + if (data&&data.data){ + try{ + let ids = lzString.decompressFromEncodedURIComponent(data.data); + ids = JSON.parse(ids); + requestEvents(ids,1000,true) + }catch(e){ + return null; + } + }else + return null; }) },[state]); 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/components/EventTable/index.js b/src/components/EventTable/index.js index 02b8ff8..866d712 100644 --- a/src/components/EventTable/index.js +++ b/src/components/EventTable/index.js @@ -27,7 +27,7 @@ const EventTable = ({ // const [data, setData] = useState([]); const [isLoading, setIsLoading] = useState(false); const [sorting, setSorting] = useState([]); - const {getDownloadData,getShortenLink,getDatafromShortenLink} = useDatabase(); + const {getDownloadData,getShortenLink} = useDatabase(); useEffect(() => { //scroll to the top of the table when the sorting changes @@ -45,7 +45,7 @@ const EventTable = ({ setIsLoading(true) getDownloadData(rows).then((datadownload) => { const csvOptions = { - fieldSeparator: ',', + fieldSeparator: '|', quoteStrings: '"', decimalSeparator: '.', showLabels: true, diff --git a/src/pages/LandingPage/LandingPage.js b/src/pages/LandingPage/LandingPage.js index 5e798e5..d6a3465 100644 --- a/src/pages/LandingPage/LandingPage.js +++ b/src/pages/LandingPage/LandingPage.js @@ -58,7 +58,7 @@ const LandingPage = () => { // const {openDialog,closeDialog, setProcessing} = useQuestions() const filters = useSelector(selectFilters); // const { appConfig } = useConfig() - const {getList,isLoading,getEvents,requestEvents,requestDetail,getDetail,setFuncCollection} = useDatabase(); + const {getList,isLoading,getEvents,requestEvents,requestDetail,getDetail,setFuncCollection,getDataFromShortenLink} = useDatabase(); const [zoomLoc,setZoomLoc] = useState(); const [isFullView,setIsFullView] = useState(true); const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions()); @@ -99,9 +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); + debugger + if (!(query && query.get("selected"))) + requestEvents(filters, 1000); + } else{ + debugger + requestEvents(filters, 1000); + } } },[isLoadingInit,filters]) const onSelectStream = useCallback((data)=>{ From 7bafd49f5679037b196b68c13ba653944c603cf9 Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Tue, 21 May 2024 15:41:59 +0700 Subject: [PATCH 12/14] update url --- src/Providers/Database/Provider.js | 30 ++++++++++++++++++++++------ src/components/Earth/index.js | 1 - src/components/EventTable/index.js | 5 +---- src/pages/LandingPage/LandingPage.js | 6 ++---- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/Providers/Database/Provider.js b/src/Providers/Database/Provider.js index 19be43c..4e814f5 100644 --- a/src/Providers/Database/Provider.js +++ b/src/Providers/Database/Provider.js @@ -6,6 +6,12 @@ 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"; 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); @@ -53,6 +59,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(); @@ -299,19 +308,28 @@ const Provider = ({ children }) => { }) },[state]); - const getShortenLink = useCallback((data)=>{ - return axios.post(`${APIUrl}/url/`,{data}).then(({data})=> { + const getShortenLink = useCallback(()=>{ + // get filter, ID and seleted song + 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]); + },[state,filters,eventSelectedData]); const getDataFromShortenLink = useCallback((id)=>{ return axios.get(`${APIUrl}/url/${id}`).then(({data})=> { if (data&&data.data){ try{ - let ids = lzString.decompressFromEncodedURIComponent(data.data); - ids = JSON.parse(ids); - requestEvents(ids,1000,true) + 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; } diff --git a/src/components/Earth/index.js b/src/components/Earth/index.js index 131e595..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); diff --git a/src/components/EventTable/index.js b/src/components/EventTable/index.js index 866d712..5a75bf1 100644 --- a/src/components/EventTable/index.js +++ b/src/components/EventTable/index.js @@ -11,8 +11,6 @@ import {ExportToCsv} from 'export-to-csv'; import {useDatabase} from "../../Providers/Database"; import DownloadOption from "./DownloadOption"; import ShareButton from "./ShareButton"; -import axios from "axios"; -import lzString from "lz-string"; const EventTable = ({ id = 'tableevent', columns, data, totalData, selectedData, disableAdding, @@ -100,8 +98,7 @@ const EventTable = ({ setIsLoading(false) }; const handleUrl = useCallback(async() => { - const compressed = lzString.compressToEncodedURIComponent(JSON.stringify(data.map(d=>d._id))); - return getShortenLink(compressed); + return getShortenLink(); },[data,mainurl]) // console.log(data) return ( diff --git a/src/pages/LandingPage/LandingPage.js b/src/pages/LandingPage/LandingPage.js index d6a3465..964f29b 100644 --- a/src/pages/LandingPage/LandingPage.js +++ b/src/pages/LandingPage/LandingPage.js @@ -58,7 +58,7 @@ const LandingPage = () => { // const {openDialog,closeDialog, setProcessing} = useQuestions() const filters = useSelector(selectFilters); // const { appConfig } = useConfig() - const {getList,isLoading,getEvents,requestEvents,requestDetail,getDetail,setFuncCollection,getDataFromShortenLink} = useDatabase(); + const {getList,isLoading,getEvents,requestEvents,requestDetail,getDetail,setFuncCollection} = useDatabase(); const [zoomLoc,setZoomLoc] = useState(); const [isFullView,setIsFullView] = useState(true); const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions()); @@ -104,15 +104,13 @@ const LandingPage = () => { if (!isLoadingInit) { if (firstLoad){ setFirstLoad(false); - debugger if (!(query && query.get("selected"))) requestEvents(filters, 1000); } else{ - debugger requestEvents(filters, 1000); } } - },[isLoadingInit,filters]) + },[isLoadingInit,filters,firstLoad]) const onSelectStream = useCallback((data)=>{ requestDetail(data); },[getEvents]) From 6a663d8c2627b7c72d71fe1c9d3de2a1967152c1 Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Mon, 15 Jul 2024 11:04:29 +0700 Subject: [PATCH 13/14] update export list --- src/Providers/Database/Provider.js | 12 +++ .../Database/data/MIRAGE_exportvariables.csv | 85 +++++++++++++++++++ src/components/EventTable/index.js | 5 +- 3 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 src/Providers/Database/data/MIRAGE_exportvariables.csv diff --git a/src/Providers/Database/Provider.js b/src/Providers/Database/Provider.js index 4e814f5..9406182 100644 --- a/src/Providers/Database/Provider.js +++ b/src/Providers/Database/Provider.js @@ -12,6 +12,7 @@ import { 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); @@ -51,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 @@ -73,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`,{ @@ -156,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", 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/components/EventTable/index.js b/src/components/EventTable/index.js index 5a75bf1..a96abb2 100644 --- a/src/components/EventTable/index.js +++ b/src/components/EventTable/index.js @@ -25,7 +25,8 @@ const EventTable = ({ // const [data, setData] = useState([]); const [isLoading, setIsLoading] = useState(false); const [sorting, setSorting] = useState([]); - const {getDownloadData,getShortenLink} = 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 @@ -50,7 +51,7 @@ const EventTable = ({ 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); From f2ebb728054223e7dc398a28eacb743c853077c8 Mon Sep 17 00:00:00 2001 From: Zipexpo Date: Mon, 15 Jul 2024 11:29:12 +0700 Subject: [PATCH 14/14] change song->event --- src/Providers/Database/Provider.js | 2 +- src/components/EventDetail/wrapper.js | 2 +- src/components/EventTable/fields.js | 2 +- src/components/EventTable/wrapper.js | 2 +- src/pages/About/index.js | 2 +- src/pages/LandingPage/LandingPage.js | 20 ++++++++++---------- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Providers/Database/Provider.js b/src/Providers/Database/Provider.js index 9406182..51b188e 100644 --- a/src/Providers/Database/Provider.js +++ b/src/Providers/Database/Provider.js @@ -321,7 +321,7 @@ const Provider = ({ children }) => { },[state]); const getShortenLink = useCallback(()=>{ - // get filter, ID and seleted song + // 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})=> { diff --git a/src/components/EventDetail/wrapper.js b/src/components/EventDetail/wrapper.js index 5caacd6..3be03f3 100644 --- a/src/components/EventDetail/wrapper.js +++ b/src/components/EventDetail/wrapper.js @@ -86,7 +86,7 @@ export default function ({currentDetail,onTogleWin,locs, events,onSelect,sx={}}) return (<> semicolor(theme.palette.background.paper)}}> - Song Info & Visualizations + Event Info & Visualizations semicolor(theme.palette.background.paper),height:'100%',position:'relative'}}> - Song List + Event List { - The MIRAGE dashboard (v{process.env.REACT_APP_DATA_APP_VERSION}) 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 either the Radio Garden API, the internet radio station stream encoder, review by human annotators, or the Spotify and 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 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: {""} diff --git a/src/pages/LandingPage/LandingPage.js b/src/pages/LandingPage/LandingPage.js index 964f29b..739f31c 100644 --- a/src/pages/LandingPage/LandingPage.js +++ b/src/pages/LandingPage/LandingPage.js @@ -64,12 +64,12 @@ const LandingPage = () => { 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); @@ -196,7 +196,7 @@ const LandingPage = () => { children: [ { type: "tab", - name: "Song List", + name: "Event List", component: "eventList", } ] @@ -207,7 +207,7 @@ const LandingPage = () => { children: [ { type: "tab", - name: "Selected Songs", + name: "Selected Events", component: "eventSelectedList", } ] @@ -220,7 +220,7 @@ const LandingPage = () => { children: [ { type: "tab", - name: "Song Detail", + name: "Event Detail", component: "eventDetail", },{ type: "tab", @@ -228,12 +228,12 @@ 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", } ]