From 4f79ae069237247497bb84a3c971b108cfc7108f Mon Sep 17 00:00:00 2001 From: kshitij katiyar <90389917+Kshitij-Katiyar@users.noreply.github.com> Date: Fri, 1 Sep 2023 11:42:09 +0530 Subject: [PATCH] [MI-3230]: Developed a modal which opens on click of view button in config table (#6) * [MI-3230]: Developed a modal which opens on click of view button in config table * Added form in modal to accept the action details * [MI-3230]: Added view Action modal * [MI-3230]: FIxed indentation in existingConfigTable * [MI-3230: Fixed indentation in existingConfigTable * [MI-3230]: fixed indentation in existingConfigTable * [MI-3230]: Fixed indentation in existingConfigTable * [MI-3230]: Removed unwanted files from webapp * [MI-3230]: Fixed indentation * [MI-3230]: Removed extra padding from existingConfigTable * [MI-3230]: Improved the name of variables * [MI-3230]: Added eod, use type instead of interface * [MI-3230]: Used fat arrow function instead of normal function * [MI-3230]: Improved name of variable in editActionModal * [MI-3230]: Fixed some review changes by Abhishek * [MI-3230]: Added div to in existingConfigTable * [MI-3230]: Added curly braces to css file * [MI-3241] : Added delete config modal to the webapp (#7) * [MI-3241]: Added delete config modal * [MI-3241]: fixed indent in table * [MI-3241]: Fixed indent in existingConfigtable * [MI-3241]: Removed extra files from webapp * [MI-3241]: Resolved import not found * [MI-3241]: removed extra empty lines * [MI-3241]: Added corejs as dependency * [MI-3241]: removed duplicate react-dom dependency * [MI-3242]: Improved variable name in modal * [MI-3241]: add eod to modal files * [MI-3241]: removed extra div wrappers * [MI-3241]: Used fat arrow function instead of normal function * [MI-3241]: Fixed a syntax error in existingConfigTable * [MI-3241]: Fixed CI in existingConfigTable * [MI-3241]: Added curly brace to css file * [MI-3255]: Added svg icon and Tooltip (#8) * [MI-3255]: Added svg icon as button and added tooltip * [MI-3254]: Added add/edit config modal and add config button * [MI-3254]: Added add config button in existing config table * [MI-3254]: Added config and action edit modal * [MI-3254]: Fixed css of config modal and existing config table * [MI-3254]: Added services and utils file for plugin * [MI-3254]: added service and util files * [MI-3255]: Fixed some indentation * [MI-3255]: Removed some extra lines * [MI-3254]: Removed extra files from webapp * [MI-3255]: removed extra files from webapp * [MI-3255]: Fixed indentation * [MI-3255]: Fixed indentation * [MI-3255]: Removed extra lines and updated variable names * [MI-3255]: added null to config variable * [MI-3255]: Improved variable name in DeleteModal * [MI-3255]: Improved base URL fetching * [MI-3255]: Improved variable name to increase understandability * [MI-3274]: Integrated config table, view action modal & delete config modal (#10) * [MI-3275]: Fixed indentation and other lint errors * [MI-3274]: Integrated config table, view action & delete config modal * [MI-3274]: Used camelcase in type * [MI-3274]: Resolved the import order issue * [MI-3274]: Resolved import order * [MI-3274]: Used types instead of interface * [MI-3274]: Fixed indentation for CI * [MI-3274]: Fixed lint CI * [MI-3274]: Fixed conflict resolution error * [MI-3274]: Fixed error in plugin.json * [MI-3275]: Integrated config modal (#11) * [MI-3275]: Integrated config modal * [MI-3275]: destructured props in modal * [MI-3275]: Fixed message in delete modal * [MI-3275]: Fixed import order in modal * [MI-3275]: Resolved missing closing tag errors * [MI-3275]: Fixed indent for CI * [MI-3275]: Fixed indentation errors in CI * [MI-3275]: Removed evtra variables * [MI-3317]: Added validations to forms and enhancements (#12) * [MI-3317]: Added validations to forms * [MI-3317]: added EOD to style.css * [MI-3316]: Fixed some css * [MI-3317]: Fixed grammar of validation messages * [MI-3317]: Fixed grammar of validation message in action modal * [MI-3317]: added classname to each modal * [MI-3316]: added css to make modals stationary * [MI-3316]: Removed some extra files * [MI-3317]: removed some extra files * [MI-3317]: reduced the icon size of svg icons * [MI-3317]: Fixed grammar in actionModal message * [MI-3317]: removed an extra comment * [MI-3317]: Improved grammar of statements in config modal * [MI-3317]: Fixed grammar of message * [MI-3317]: Fixed import order * [MI-3317]: Fixed redundant if conditions and removed extra empty lines * [MI-3317]: Used fat-arrow function instead of normal function * [MI-3317]: Removed camelcase from css * [MI-3317]: Resolved conflicts and fixed CI * [MI-3317]: Fixed indentation errors * [MI-3317]: Improved the name of variables * [MI-3317]: Removed else and used return with if * [MI-3317]: Fixed the variable name in table * [MI-3317]: Fixed CSS according to abhishek's review * [MI-3355]: Added dropdown to choose teams and channels (#14) * [MI-3355]: Removed extra types * [MI-3355]: Improved message of view action modal * [MI-3355]: removed extra packages * [MI-3355]: Added eod to files * [MI-3355]: Fixed adding action functionality * [MI-3355]: Fixed the jump in UI during validation warnings * [MI-3355]: fixed maximum nested callback in useEffect * [MI-3355]: Fixed validation warnings in Add action modal * [MI-3355]: Added ellipses to the tables * [MI-3355]: updated API to fetch data in batches * [MI-3355]: Removed comment and fixed empty lines * [MI-3355]: Fixed css of modal visibility * [MI-3355]: Added svg icons to different file * [MI-3355]: Improvised the folder structure * [MI-3355]: Improved the variable name in existingConfigTable * [MI-3355]: Fixed error in adding new action to config with index zero * [MI-3355]: Fixed import issue of .d.ts files * [MI-3355]: Used fat-arrow function instead of normal functions * [MI-3355]: Installed types and packages for js-cookie * [MI-3355]: Setup reduxstore * [MI-3355]: Disabled dropdown during loading state * [MI-3355]: Improved getBaseUrl method * [MI-3355]: Improved the API call * [MI-3355]: Added constants and used baseUrl from redux state * [MI-3355]: Fixed jump in UI in edit action modal * [MI-3355]: Joined array of string with comma for messages & disabled dropdown incase of API failure * [MI-3355]: Added type of onChange function * [MI-3355]: Removed extra variables * [MI-3355]: Improved the validation conditions * [MI-3355]: Fixed css according to reviews by abhishek * [MI-3355]: Improved visibility of action successfull message * [MI-3355]: Used scss instead of css * [MI-3355]: Fixed the CSS of channel-added-to content * [MI-3355]: Added semicolons to types in common.d.ts * Update webapp/src/components/modals/actionModal.tsx Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> * Update webapp/src/components/tables/existingConfigTable.tsx Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> * Update webapp/src/components/svgIcons/svg.tsx Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> * [MI-3355]: Used px instead of % in css * [MI-3355]: Fixed some minor css * [MI-3355]: Removed extra spaces from existingConfigTable --------- Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> --------- Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> --------- Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> --------- Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> --------- Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> --------- Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> --------- Co-authored-by: Abhishek Verma <72438220+avas27JTG@users.noreply.github.com> --- plugin.json | 6 +- server/configuration.go | 2 +- webapp/package-lock.json | 850 +++++++++++++----- webapp/package.json | 7 +- webapp/src/api/api_wrapper.ts | 20 + webapp/src/components/modals/actionModal.tsx | 163 ++++ webapp/src/components/modals/configModal.tsx | 760 ++++++++++++++++ webapp/src/components/modals/deleteModal.tsx | 62 ++ webapp/src/components/modals/styles.scss | 283 ++++++ webapp/src/components/svgIcons/svg.tsx | 72 ++ .../components/tables/existingConfigTable.tsx | 187 ++++ webapp/src/components/tables/styles.scss | 153 ++++ webapp/src/constants/apiConstants.ts | 7 + .../components/modals/attachmentMsgModal.tsx | 40 - .../containers/components/modals/styles.css | 3 - .../components/tables/existingConfigTable.tsx | 148 --- .../containers/components/tables/styles.css | 28 - webapp/src/index.tsx | 9 +- webapp/src/types/plugin/common.d.ts | 36 + webapp/src/utils/index.ts | 23 + webapp/webpack.config.js | 2 +- 21 files changed, 2415 insertions(+), 446 deletions(-) create mode 100644 webapp/src/api/api_wrapper.ts create mode 100644 webapp/src/components/modals/actionModal.tsx create mode 100644 webapp/src/components/modals/configModal.tsx create mode 100644 webapp/src/components/modals/deleteModal.tsx create mode 100644 webapp/src/components/modals/styles.scss create mode 100644 webapp/src/components/svgIcons/svg.tsx create mode 100644 webapp/src/components/tables/existingConfigTable.tsx create mode 100644 webapp/src/components/tables/styles.scss create mode 100644 webapp/src/constants/apiConstants.ts delete mode 100644 webapp/src/containers/components/modals/attachmentMsgModal.tsx delete mode 100644 webapp/src/containers/components/modals/styles.css delete mode 100644 webapp/src/containers/components/tables/existingConfigTable.tsx delete mode 100644 webapp/src/containers/components/tables/styles.css create mode 100644 webapp/src/utils/index.ts diff --git a/plugin.json b/plugin.json index 5cdc682ed..241836577 100644 --- a/plugin.json +++ b/plugin.json @@ -23,9 +23,9 @@ "header": "Configure this plugin directly in the config.json file. Learn more [in our documentation](https://github.com/mattermost/mattermost-plugin-welcomebot/blob/master/README.md).\n\n To report an issue, make a suggestion, or submit a contribution, [check the plugin repository](https://github.com/mattermost/mattermost-plugin-welcomebot).", "settings": [ { - "key": "ExistingConfigurationTable", - "display_name": "Existing Configurations:", - "type": "custom" + "key": "WelcomeMessages", + "type": "custom", + "default": [] } ] } diff --git a/server/configuration.go b/server/configuration.go index 2b8123323..0af393191 100644 --- a/server/configuration.go +++ b/server/configuration.go @@ -46,7 +46,7 @@ type ConfigMessage struct { // Configuration from config.json type Configuration struct { - WelcomeMessages []*ConfigMessage + WelcomeMessages []*ConfigMessage `json:"WelcomeMessages"` } // List of the welcome messages from the configuration diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 09b8fd158..319b38942 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -5,11 +5,16 @@ "packages": { "": { "dependencies": { + "@reduxjs/toolkit": "1.9.5", "core-js": "3.6.5", + "js-cookie": "3.0.5", "mattermost-redux": "5.27.0", "react": "18.2.0", "react-bootstrap": "2.8.0", "react-dom": "18.2.0", + "react-redux": "7.2.0", + "react-select": "5.7.4", + "redux": "4.0.5", "typescript": "5.1.6" }, "devDependencies": { @@ -113,7 +118,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "dev": true, "dependencies": { "@babel/highlight": "^7.22.5" }, @@ -122,9 +126,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -162,9 +166,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "dependencies": { "@babel/types": "^7.22.5", @@ -201,16 +205,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", + "@babel/compat-data": "^7.22.6", "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" }, "engines": { "node": ">=6.9.0" @@ -219,19 +223,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", - "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", + "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -241,8 +236,8 @@ "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "semver": "^6.3.0" + "@babel/helper-split-export-declaration": "^7.22.6", + "@nicolo-ribaudo/semver-v6": "^6.3.3" }, "engines": { "node": ">=6.9.0" @@ -251,24 +246,15 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", + "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "regexpu-core": "^5.3.1" }, "engines": { "node": ">=6.9.0" @@ -277,15 +263,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", @@ -336,7 +313,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -444,9 +420,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -459,7 +435,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -468,7 +443,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -498,13 +472,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.6", "@babel/types": "^7.22.5" }, "engines": { @@ -515,7 +489,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", @@ -526,9 +499,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -959,19 +932,19 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz", - "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1672,9 +1645,9 @@ } }, "node_modules/@babel/runtime-corejs2": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.22.5.tgz", - "integrity": "sha512-GdiGeK5z8VKeJhqSQBgZr3xCMjAdborh5Ppn/0jQ0gtzw11UiZZAwDFZi0ZKvZ76ULooLqJn/OlrfcGZv7Pmzg==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.22.6.tgz", + "integrity": "sha512-GTJVRjzQIHUBwRzuWxPII87XoWxXzILBJrQh5gqIV6q6m231Y0BBA9NKta5FV5Lbl8z5gS3+m6YSoKJp0KQJ4g==", "dev": true, "dependencies": { "core-js": "^2.6.12", @@ -1707,18 +1680,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", + "@babel/generator": "^7.22.7", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" @@ -1731,7 +1704,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -1763,6 +1735,24 @@ "node": ">=0.1.95" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, "node_modules/@emotion/babel-plugin-jsx-pragmatic": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-0.1.5.tgz", @@ -1775,6 +1765,94 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@emotion/babel-preset-css-prop": { "version": "10.0.27", "resolved": "https://registry.npmjs.org/@emotion/babel-preset-css-prop/-/babel-preset-css-prop-10.0.27.tgz", @@ -1901,6 +1979,99 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "dev": true }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/react/node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/react/node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/react/node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/react/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react/node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/react/node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/react/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/react/node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/react/node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@emotion/react/node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "node_modules/@emotion/serialize": { "version": "0.11.16", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", @@ -1932,6 +2103,14 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "dev": true }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@emotion/utils": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", @@ -1944,6 +2123,28 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==", "dev": true }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + }, "node_modules/@formatjs/ecma402-abstract": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", @@ -2867,6 +3068,15 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@popmotion/easing": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@popmotion/easing/-/easing-1.0.2.tgz", @@ -2914,6 +3124,37 @@ "react-native": ">=0.59" } }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/@restart/hooks": { "version": "0.4.9", "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.9.tgz", @@ -2946,9 +3187,9 @@ } }, "node_modules/@restart/ui/node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -3131,8 +3372,7 @@ "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -3216,7 +3456,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -3295,9 +3534,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3420,9 +3659,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3816,7 +4055,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -4700,6 +4938,16 @@ "node": ">=0.10.0" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -5008,7 +5256,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -5045,9 +5292,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001511", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001511.tgz", - "integrity": "sha512-NaWPJawcoedlghN4P7bDNeADD7K+rZaY6V8ZcME7PkEZo/nfOg+lnrUgRWiKbNxcQ4/toFKSxnS4WdbyPZnKkw==", + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", "dev": true, "funding": [ { @@ -5086,7 +5333,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -5315,9 +5561,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/collection-visit": { @@ -5337,7 +5583,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -5345,8 +5590,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -5437,8 +5681,7 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookiejar": { "version": "2.1.4", @@ -5481,12 +5724,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", - "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.9" }, "funding": { "type": "opencollective", @@ -5570,6 +5813,12 @@ "integrity": "sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg==", "dev": true }, + "node_modules/create-emotion/node_modules/stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==", + "dev": true + }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -6125,9 +6374,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.447", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.447.tgz", - "integrity": "sha512-sxX0LXh+uL41hSJsujAN86PjhrV/6c79XmpY0TvjZStV6VxIgarf8SRkUoUTuYmFcZQTemsoqo8qXOGw5npWfw==", + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", "dev": true }, "node_modules/elliptic": { @@ -6405,7 +6654,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -6517,7 +6765,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -6946,9 +7193,9 @@ } }, "node_modules/eslint/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7459,6 +7706,13 @@ "node": ">=8.9.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -7491,8 +7745,7 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" }, "node_modules/find-up": { "version": "4.1.0", @@ -7795,6 +8048,25 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, "node_modules/fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -7813,8 +8085,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -8245,7 +8516,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -8287,7 +8557,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -8466,7 +8735,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, "dependencies": { "react-is": "^16.7.0" } @@ -8777,11 +9045,19 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8797,7 +9073,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -9031,8 +9306,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -9109,7 +9383,6 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -9506,26 +9779,26 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.2" }, "engines": { "node": ">=6.9.0" @@ -10145,6 +10418,20 @@ "node": ">= 8" } }, + "node_modules/jest-haste-map/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/jest-jasmine2": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", @@ -11208,9 +11495,9 @@ "dev": true }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11582,6 +11869,14 @@ "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11658,9 +11953,9 @@ } }, "node_modules/jsdom/node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -11696,8 +11991,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -11868,8 +12162,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/linked-list": { "version": "0.1.0", @@ -12355,6 +12648,12 @@ "lodash-es": "^4.17.4" } }, + "node_modules/mattermost-webapp/node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "dev": true + }, "node_modules/mattermost-webapp/node_modules/mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", @@ -12512,6 +12811,41 @@ "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" } }, + "node_modules/mattermost-webapp/node_modules/react-select": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-2.4.4.tgz", + "integrity": "sha512-C4QPLgy9h42J/KkdrpVxNmkY6p4lb49fsrbDk/hRcZpX7JvZPNb6mGj+c5SzyEtBv1DmQ9oPH4NmhAFvCrg8Jw==", + "dev": true, + "dependencies": { + "classnames": "^2.2.5", + "emotion": "^9.1.2", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "raf": "^3.4.0", + "react-input-autosize": "^2.2.1", + "react-transition-group": "^2.2.1" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0", + "react-dom": "^15.3.0 || ^16.0.0" + } + }, + "node_modules/mattermost-webapp/node_modules/react-select/node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dev": true, + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, "node_modules/mattermost-webapp/node_modules/redux": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", @@ -12587,10 +12921,9 @@ } }, "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, "node_modules/memory-fs": { "version": "0.2.0", @@ -12891,9 +13224,9 @@ } }, "node_modules/mini-create-react-context/node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -13359,9 +13692,9 @@ } }, "node_modules/node-notifier/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "optional": true, "dependencies": { @@ -13392,9 +13725,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/node-sass": { @@ -13601,9 +13934,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/oauth-sign": { @@ -13914,7 +14247,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -13954,7 +14286,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14054,8 +14385,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "1.8.0", @@ -14076,7 +14406,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -14678,9 +15007,9 @@ } }, "node_modules/react-bootstrap/node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -14964,6 +15293,30 @@ "loose-envify": "^1.0.0" } }, + "node_modules/react-redux": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz", + "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "hoist-non-react-statics": "^3.3.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.9.0" + }, + "peerDependencies": { + "react": "^16.8.3", + "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-router": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.0.1.tgz", @@ -15032,47 +15385,81 @@ } }, "node_modules/react-select": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-2.4.4.tgz", - "integrity": "sha512-C4QPLgy9h42J/KkdrpVxNmkY6p4lb49fsrbDk/hRcZpX7JvZPNb6mGj+c5SzyEtBv1DmQ9oPH4NmhAFvCrg8Jw==", - "dev": true, - "dependencies": { - "classnames": "^2.2.5", - "emotion": "^9.1.2", - "memoize-one": "^5.0.0", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.4.tgz", + "integrity": "sha512-NhuE56X+p9QDFh4BgeygHFIvJJszO1i1KSkg/JPcIJrbovyRtI+GuOEa4XzFCEpZRAEoEI8u/cAHK+jG/PgUzQ==", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", "prop-types": "^15.6.0", - "raf": "^3.4.0", - "react-input-autosize": "^2.2.1", - "react-transition-group": "^2.2.1" + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0", - "react-dom": "^15.3.0 || ^16.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-select/node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dev": true, + "node_modules/react-select/node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { - "@babel/runtime": "^7.1.2" + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/react-select/node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, + "node_modules/react-select/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/react-select/node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/react-select/node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/react-select/node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/react-select/node_modules/react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "dev": true, + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "dependencies": { - "dom-helpers": "^3.4.0", + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" + "prop-types": "^15.6.2" }, "peerDependencies": { - "react": ">=15.0.0", - "react-dom": ">=15.0.0" + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, "node_modules/react-test-renderer": { @@ -15547,6 +15934,14 @@ "node-localstorage": "^1.3.0" } }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/reflect.ownkeys": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", @@ -15837,11 +16232,15 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -16531,9 +16930,9 @@ } }, "node_modules/sass-loader/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -17016,7 +17415,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17496,10 +17894,9 @@ } }, "node_modules/stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/stylis-rule-sheet": { "version": "0.0.10", @@ -17589,7 +17986,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -17635,7 +18031,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -17937,7 +18332,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -18627,6 +19021,19 @@ "node": ">=0.10.0" } }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -18870,6 +19277,20 @@ "node": ">=8" } }, + "node_modules/watchpack/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/watchpack/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -19837,7 +20258,6 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } diff --git a/webapp/package.json b/webapp/package.json index e52f8d2d1..7f69f2a23 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -61,11 +61,16 @@ "webpack-cli": "3.3.12" }, "dependencies": { + "@reduxjs/toolkit": "1.9.5", "core-js": "3.6.5", + "js-cookie": "3.0.5", "mattermost-redux": "5.27.0", "react": "18.2.0", - "react-dom": "18.2.0", "react-bootstrap": "2.8.0", + "react-dom": "18.2.0", + "react-redux": "7.2.0", + "react-select": "5.7.4", + "redux": "4.0.5", "typescript": "5.1.6" }, "jest": { diff --git a/webapp/src/api/api_wrapper.ts b/webapp/src/api/api_wrapper.ts new file mode 100644 index 000000000..5c3ba7a91 --- /dev/null +++ b/webapp/src/api/api_wrapper.ts @@ -0,0 +1,20 @@ +import Utils from 'utils'; + +export const fetchChannels = async (mmSiteUrl: string) => { + const url = Utils.getBaseUrls(mmSiteUrl).mattermostApiBaseUrl + '/channels?exclude_default_channels=true'; + const response = await fetch(url, { + method: 'GET', + headers: {Authentication: Utils.getAuthToken()}, + }); + return response.json(); +}; + +export const fetchTeams = async (mmSiteUrl: string) => { + const url = Utils.getBaseUrls(mmSiteUrl).mattermostApiBaseUrl + '/teams'; + const response = await fetch(url, { + method: 'GET', + headers: {Authentication: Utils.getAuthToken()}, + }); + return response.json(); +}; + diff --git a/webapp/src/components/modals/actionModal.tsx b/webapp/src/components/modals/actionModal.tsx new file mode 100644 index 000000000..95a54162c --- /dev/null +++ b/webapp/src/components/modals/actionModal.tsx @@ -0,0 +1,163 @@ +import React, {useEffect, useState} from 'react'; + +import Button from 'react-bootstrap/Button'; +import Modal from 'react-bootstrap/Modal'; +import Table from 'react-bootstrap/Table'; +import Form from 'react-bootstrap/Form'; +import {OverlayTrigger, Tooltip} from 'react-bootstrap'; + +import './styles.scss'; + +type Props = { + visibility: boolean; + setVisibility: React.Dispatch>; + config: Configs[]; + configIndex: number; +} + +const ActionModal = ({visibility, setVisibility, config, configIndex}: Props) => { + const [attachmentMessageAvailable, setAttachmentMessageAvailable] = useState(false); + + const actionsLength = config[configIndex]?.actions?.length; + + const checkAttachmentMessage = () => { + if (config[configIndex]?.attachmentMessage?.length) { + setAttachmentMessageAvailable(Boolean(config[configIndex]?.attachmentMessage?.[0])); + return; + } + + setAttachmentMessageAvailable(false); + }; + + useEffect(() => { + checkAttachmentMessage(); + }, []); + + const handleClose = () => setVisibility(false); + + return ( + + + {'Actions'} + + + + {attachmentMessageAvailable || (config[configIndex]?.actions && actionsLength) ? (<> + {attachmentMessageAvailable ? ( +
+ + {'Attachment Message'} + + +
+ ) : (

{'No attachment message configured'}

) + } + {config[configIndex]?.actions && actionsLength ? ( +
+
+ + {'Actions'} + +
+
+ + + + + + + + + + + + { + config[configIndex].actions?.map((val, i) => + ( + + + + + + + + ), + ) + } + +
{'Type'}{'Display Name'}{'Name'}{'Add to Channels'}{'Success Message'}
+ {val.actionType}} + > +

+ {val.actionType} +

+
+
+ {val.actionDisplayName}} + > +

+ {val.actionDisplayName} +

+
+
+ {val.actionName}} + > +

+ {val.actionName} +

+
+
+ {val.channelsAddedTo.join(', ')}} + > +

+ {val.channelsAddedTo.join(', ')} +

+
+
+ {val.actionSuccessfullMessage.join(',')}} + > +

+ {val.actionSuccessfullMessage.join(',')} +

+
+
+
+
+ ) : (

{'No action configured'}

) + } + ) : (

{'No attachment message or action configured'}

)} +
+ + + + +
+ ); +}; + +export default ActionModal; diff --git a/webapp/src/components/modals/configModal.tsx b/webapp/src/components/modals/configModal.tsx new file mode 100644 index 000000000..c7f05a437 --- /dev/null +++ b/webapp/src/components/modals/configModal.tsx @@ -0,0 +1,760 @@ +import React, {useEffect, useState} from 'react'; + +import Button from 'react-bootstrap/Button'; +import Modal from 'react-bootstrap/Modal'; +import Form from 'react-bootstrap/Form'; +import Table from 'react-bootstrap/Table'; +import ButtonGroup from 'react-bootstrap/ButtonGroup'; +import {OverlayTrigger, Tooltip, ToggleButton} from 'react-bootstrap'; + +import Select, {MultiValue, SingleValue} from 'react-select'; + +import {useSelector} from 'react-redux'; + +import {GlobalState} from 'mattermost-redux/types/store'; + +import {fetchChannels, fetchTeams} from 'api/api_wrapper'; + +import {DeleteSvg, EditSvg} from '../svgIcons/svg'; + +import './styles.scss'; + +type Props = { + visibility: boolean; + setVisibility: React.Dispatch>; + configIndex: number | null; + config: Configs[]; + onChange: (config: Configs[]) => void; + modalHeader: string; +} + +const ConfigModal = ({visibility, setVisibility, configIndex, config, onChange, modalHeader}: Props) => { + const guest = [ + {name: 'true', value: 'true'}, + {name: 'false', value: 'false'}, + ]; + const actionTypes = [ + {name: 'button', value: 'button'}, + {name: 'automatic', value: 'automatic'}, + ]; + + const actionElement: Actions = { + actionType: '', + actionName: '', + actionDisplayName: '', + channelsAddedTo: [''], + actionSuccessfullMessage: [''], + }; + + const newAction: Actions[] = []; + + const newConfig: Configs = { + teamName: '', + delayInSeconds: 0, + message: [''], + includeGuests: '', + attachmentMessage: [''], + actions: newAction, + }; + + const [show, setShow] = useState(true); + const [isConfigVisible, setIsConfigVisible] = useState(true); + const [isActionVisible, setIsActionVisible] = useState(false); + const [isDeleteVisible, setIsDeleteVisible] = useState(false); + + const [existingConfig, setExistingConfig] = useState(configIndex === null ? newConfig : config[configIndex]); + + const [teamName, setTeamName] = useState(existingConfig.teamName); + const [delay, setDelay] = useState(existingConfig.delayInSeconds); + const [message, setMessage] = useState(existingConfig.message); + const [attachmentMessage, setAttachmentMessage] = useState(existingConfig.attachmentMessage ?? ['']); + const [guestValue, setGuestValue] = useState(existingConfig.includeGuests); + + const [actionTypesValue, setActionTypesValue] = useState(''); + const [actionDisplayName, setActionDisplayName] = useState(''); + const [actionChannelsAddedTo, setActionChannelsAddedTo] = useState(['']); + const [actionSuccessfullMessage, setActionSuccessfullMessage] = useState(['']); + const [actionName, setActionName] = useState(''); + const [actionIndex, setActionIndex] = useState(0); + + const [teamNameValid, setTeamNameValid] = useState(false); + const [messageValid, setMessageValid] = useState(false); + const [delayValid, setDelayValid] = useState(false); + + const [actionTypesValueValid, setActionTypesValueValid] = useState(false); + const [actionDisplayNameValid, setActionDisplayNameValid] = useState(false); + const [actionChannelsAddedToValid, setActionChannelsAddedToValid] = useState(false); + const [actionSuccessfullMessageValid, setActionSuccessfullMessageValid] = useState(false); + const [actionNameValid, setActionNameValid] = useState(false); + + const [validated, setValidated] = useState(false); + + const [deleteAction, setDeleteAction] = useState(''); + + const [selectedTeam, setSelectedTeam] = useState(''); + + const [teamSelectionWarning, setTeamSelectionWarning] = useState(false); + + const [actionClicked, setActionClicked] = useState(false); + + const [teamOptionList, setTeamOptionList] = useState([]); + const [channelOptionList, setChannelOptionList] = useState([]); + + const [teamDropdownDisabled, setTeamDropdownDisabled] = useState(false); + const [teamApiCalled, setTeamApiCalled] = useState(true); + const [teamApiError, setTeamApiError] = useState(''); + + const [chanelDropdownDisabled, setChannelDropdownDisabled] = useState(false); + const [channelApiCalled, setChannelApiCalled] = useState(true); + const [channelApiError, setChannelApiError] = useState(''); + + const actionLength = existingConfig?.actions?.length ?? 0; + + const reduxState = useSelector((state: GlobalState) => state); + const mmSiteUrl = reduxState?.entities?.general?.config?.SiteURL as string; + + useEffect(() => { + setShow(visibility); + setIsConfigVisible(visibility); + }, [visibility]); + + useEffect(() => { + setExistingConfig(configIndex === null ? newConfig : config[configIndex]); + }, [config]); + + useEffect(() => { + getTeam(mmSiteUrl); + getChannel(mmSiteUrl); + if (configIndex !== null) { + setSelectedTeam(existingConfig.teamName); + setTeamName(existingConfig.teamName); + setDelay(existingConfig.delayInSeconds); + setMessage(existingConfig.message); + setGuestValue(existingConfig?.includeGuests ?? ''); + setAttachmentMessage(existingConfig?.attachmentMessage ?? []); + } + }, []); + + useEffect(() => { + preFillActions(); + }, [actionIndex]); + + useEffect(() => { + setTeamNameValid(Boolean(teamName.trim())); + + setTeamSelectionWarning(Boolean(teamName.trim())); + + if (message.length) { + setMessageValid(Boolean(message[0].trim())); + } else { + setMessageValid(false); + } + + setDelayValid(delay >= 0); + + setActionTypesValueValid(Boolean(actionTypesValue)); + + setActionDisplayNameValid(Boolean(actionDisplayName.trim())); + + setActionNameValid(Boolean(actionName.trim())); + + if (actionChannelsAddedTo.length) { + setActionChannelsAddedToValid(Boolean(actionChannelsAddedTo[0])); + } else { + setActionChannelsAddedToValid(false); + } + + if (actionSuccessfullMessage.length) { + setActionSuccessfullMessageValid(Boolean(actionSuccessfullMessage[0].trim())); + } else { + setActionSuccessfullMessageValid(false); + } + }, [teamName, delay, message, attachmentMessage, actionTypesValue, actionDisplayName, actionChannelsAddedTo, actionSuccessfullMessage, actionName]); + + const handlePrimary = () => { + if (isActionVisible) { + if (actionChannelsAddedToValid && actionDisplayNameValid && actionSuccessfullMessageValid && actionTypesValueValid && actionNameValid && channelApiError === '') { + if (configIndex !== null) { + if (actionIndex === null) { + actionElement.actionDisplayName = actionDisplayName; + actionElement.actionName = actionName; + actionElement.actionSuccessfullMessage = actionSuccessfullMessage; + actionElement.actionType = actionTypesValue; + actionElement.channelsAddedTo = actionChannelsAddedTo; + const actions = existingConfig?.actions; + if (actions) { + actions.push(actionElement); + existingConfig.actions = actions; + } + } else { + structureActions(); + } + } else if (configIndex === null) { + if (actionIndex === null) { + structureNewActions(); + } else { + structureActions(); + } + } + setIsActionVisible(false); + setIsConfigVisible(true); + setValidated(false); + onChange(config); + setActionClicked(false); + } else { + setValidated(true); + } + } + if (isConfigVisible) { + if (teamNameValid && messageValid && teamApiError === '') { + if (configIndex === null) { + structureNewConfig(); + config.push(existingConfig); + } else { + structureConfig(); + } + onChange(config); + setValidated(false); + handleSecondary(); + } else { + setValidated(true); + } + } + if (isDeleteVisible && actionIndex !== null) { + const l = existingConfig.actions?.splice(actionIndex, 1); + if (configIndex !== null) { + config[configIndex] = existingConfig; + onChange(config); + } + handleSecondary(); + } + }; + + const handleSecondary = () => { + if (isActionVisible) { + setValidated(false); + setIsActionVisible(false); + setIsConfigVisible(true); + setActionClicked(false); + return; + } else if (isDeleteVisible) { + setValidated(false); + setIsDeleteVisible(false); + setIsConfigVisible(true); + return; + } + + setValidated(false); + setShow(false); + setVisibility(false); + setTeamApiCalled(false); + }; + + const handleEditAction = (i: number) => { + setActionIndex(i); + setIsActionVisible(true); + setIsConfigVisible(false); + }; + + const handleAddActions = () => { + setActionClicked(true); + if (selectedTeam === '') { + setTeamSelectionWarning(false); + } else if (teamApiError === '') { + setTeamSelectionWarning(true); + setValidated(false); + resetActionElement(); + setActionIndex(null); + preFillActions(); + setIsActionVisible(true); + setIsConfigVisible(false); + } + }; + + const handleActionDelete = (index: number, action: string) => { + setDeleteAction(action); + setActionIndex(index); + setIsDeleteVisible(true); + setIsConfigVisible(false); + }; + const handleChannelSelect = (channels: MultiValue) => { + const selectedChannels = channels.map((option: OptionTypes) => option.value); + setActionChannelsAddedTo(selectedChannels); + }; + + const handleTeamSelect = (teams: SingleValue) => { + if (teams === null) { + setTeamName(''); + return; + } + + setTeamName(teams.value); + setSelectedTeam(teams.value); + }; + + const getTeam = async (SiteUrl: string) => { + try { + setTeamDropdownDisabled(true); + setTeamApiCalled(true); + const teamData = await fetchTeams(SiteUrl); + const TeamOptions = teamData.map((team: Teams) => ({ + value: team.display_name, + label: team.display_name, + })); + setTeamOptionList(TeamOptions); + } catch (error) { + setTeamApiError('Some error occured fetching the team list'); + } finally { + setTeamDropdownDisabled(false); + } + }; + + const getChannel = async (SiteUrl: string) => { + try { + setChannelDropdownDisabled(true); + setChannelApiCalled(true); + const channelData = await fetchChannels(SiteUrl); + const channelOptions = channelData.map((channel: Channels) => ({ + value: channel.display_name, + label: channel.display_name, + data: channel.team_name, + })); + setChannelOptionList(channelOptions); + } catch (error) { + setChannelApiError('Some error occured fetching the channel list'); + } finally { + setChannelDropdownDisabled(false); + } + }; + + const resetActionElement = () => { + actionElement.actionType = ''; + actionElement.actionName = ''; + actionElement.actionDisplayName = ''; + actionElement.channelsAddedTo = ['']; + actionElement.actionSuccessfullMessage = ['']; + }; + + const preFillActions = () => { + if (existingConfig?.actions && actionIndex !== null) { + const action = existingConfig?.actions?.[actionIndex] ?? actionElement; + setActionTypesValue(action.actionType); + setActionDisplayName(action.actionDisplayName); + setActionChannelsAddedTo(action.channelsAddedTo); + setActionSuccessfullMessage(action.actionSuccessfullMessage); + setActionName(action.actionName); + return; + } + + setActionTypesValue(actionElement.actionType); + setActionDisplayName(actionElement.actionDisplayName); + setActionChannelsAddedTo(actionElement.channelsAddedTo); + setActionSuccessfullMessage(actionElement.actionSuccessfullMessage); + setActionName(actionElement.actionName); + }; + + const structureConfig = () => { + if (configIndex !== null) { + config[configIndex].message = message; + config[configIndex].delayInSeconds = delay; + config[configIndex].includeGuests = guestValue; + config[configIndex].attachmentMessage = attachmentMessage; + config[configIndex].teamName = teamName; + } + }; + + const structureNewConfig = () => { + existingConfig.message = message; + existingConfig.delayInSeconds = delay; + existingConfig.includeGuests = guestValue; + existingConfig.attachmentMessage = attachmentMessage; + existingConfig.teamName = teamName; + }; + + const structureActions = () => { + const actions = existingConfig?.actions; + if (actions && actionIndex !== null) { + const action = actions[actionIndex]; + action.actionDisplayName = actionDisplayName; + action.actionName = actionName; + action.actionSuccessfullMessage = actionSuccessfullMessage; + action.actionType = actionTypesValue; + action.channelsAddedTo = actionChannelsAddedTo; + existingConfig.actions = [...actions]; + } + }; + const structureNewActions = () => { + actionElement.actionDisplayName = actionDisplayName; + actionElement.actionName = actionName; + actionElement.actionSuccessfullMessage = actionSuccessfullMessage; + actionElement.actionType = actionTypesValue; + actionElement.channelsAddedTo = actionChannelsAddedTo; + const _ = existingConfig.actions?.push(actionElement); + }; + + return ( +
+ + + + {modalHeader} + + + + {isConfigVisible &&
+
+
+ + {'TeamName*'} + channel.data === selectedTeam, + )} + value={channelOptionList.filter((option) => actionChannelsAddedTo.includes(option.value))} + /> + {((validated && !actionChannelsAddedToValid) || (channelApiCalled && channelApiError !== '')) && + + {channelApiError === '' ? 'Please provide at least one channel name' : channelApiError} + } + +
+
+ + {'Action Type*'} + + {actionTypes.map((radio, index) => ( + setActionTypesValue(e.currentTarget.value)} + > + {radio.name} + + ))} + + {validated && !actionTypesValueValid && + + {'Please select an action type'} + } + +
+
+ + {'Action Display Name*'} + setActionDisplayName(e.target.value)} + /> + {validated && !actionDisplayNameValid && + + {'Please provide the display name for your action'} + } + +
+
+ + {'Action Name*'} + setActionName(e.target.value)} + /> + {validated && !actionNameValid && + + {'Please provide a name for your action'} + } + +
+
+ + {'Action Successfull Message*'} + setActionSuccessfullMessage([e.target.value])} + /> + {validated && !actionSuccessfullMessageValid && + + {'Please provide a message'} + } + +
+
+
} + {!isDeleteVisible && !isActionVisible &&
+ +
} + {isDeleteVisible &&
+

{`Are you sure you would like to delete the action ${deleteAction}?`}

+
} +
+ + + + +
+
+ ); +}; + +export default ConfigModal; diff --git a/webapp/src/components/modals/deleteModal.tsx b/webapp/src/components/modals/deleteModal.tsx new file mode 100644 index 000000000..cace15d72 --- /dev/null +++ b/webapp/src/components/modals/deleteModal.tsx @@ -0,0 +1,62 @@ +import React, {useEffect, useState} from 'react'; + +import Button from 'react-bootstrap/Button'; +import Modal from 'react-bootstrap/Modal'; + +import './styles.scss'; + +type Props = { + visibility: boolean; + setVisibility: React.Dispatch>; + config: Configs[]; + configIndex: number; + onChange: (config: Configs[]) => void; +} + +const DeleteModal = ({visibility, setVisibility, config, configIndex, onChange}: Props) => { + const [show, setShow] = useState(false); + + useEffect(() => { + setShow(visibility); + }, [visibility]); + + const handleDelete: () => void = () => { + config.splice(configIndex, 1); + onChange(config); + handleClose(); + }; + + const handleClose = () => { + setShow(false); + setVisibility(false); + }; + + return ( + + + {'Delete Config'} + + + +

{`Are you sure you would like to delete the configs for team ${config[configIndex].teamName}?`}

+
+ + + + + +
+ ); +}; + +export default DeleteModal; diff --git a/webapp/src/components/modals/styles.scss b/webapp/src/components/modals/styles.scss new file mode 100644 index 000000000..38328008c --- /dev/null +++ b/webapp/src/components/modals/styles.scss @@ -0,0 +1,283 @@ +$color_1: #000000; +$color_2: #FF0000; +$border-color_1: transparent; + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.custom-modal.modal { + opacity: 1; + padding-top: 230px; +} + +.modal-open { + .modal { + overflow-x: hidden; + overflow-y: hidden; + } +} + +.modal-dialog { + .modal-header { + display: flex; + } + .modal-body { + display: flex; + flex-direction: column; + } + width: 615px; + max-width: 615px; +} + +.custom-modal-body { + height: 80%; + overflow-y: auto; +} + +.fade-enter { + opacity: 0; + animation: fade-in 300ms forwards; +} + +.fade-exit { + opacity: 1; + animation: fade-out 300ms forwards; +} + +.btn-group { + display: flex; + justify-content: space-between; + .btn.btn-default { + background: none; + border-color: $border-color_1; + border: transparent; + &:hover { + background: transparent; + color: $color_1; + } + &:focus { + background: transparent; + color: $color_1; + } + } +} + +.radio.btn-group { + justify-content: flex-start; +} + +.options { + .btn.btn-primary { + background: transparent; + } +} + +.radio { + margin-top: 0; + margin-bottom: 0; +} + +.radio-form { + margin-bottom: 0px; +} + +.add-actions { + margin-top: 15px; +} + +.validation-warning { + color: $color_2; + font-size: 12px; +} + +.config-form { + width: 100%; +} + +.add-action-button { + display: block; +} + +.guest-button.active { + box-shadow: none; + outline: transparent; +} + +.action-typeButton.active { + box-shadow: none; + outline: transparent; +} + +.warning { + margin-bottom: 27px; + color: $color_1; + .form-group { + position: relative; + } +} + +.gapping { + margin-bottom: 25px; +} + +.form-group { + position: relative; + margin-bottom: 10px; +} + +.warnings { + margin-bottom: 25px; + .form-group { + position: relative; + } +} + +.form-label { + color: $color_1; +} + +.type { + width: 87px; +} + +.successfull-message { + width: 110px; +} + +.successfull-message-content { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.channels-added { + width: 111px; + display: flex; + justify-content: center; +} + +.channels-added-content { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.action-name { + vertical-align: middle; + width: 87px; +} + +.action-name-content { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.display-name { + vertical-align: middle; + width: 87px; +} + +.display-name-content { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.type-action { + width: 87px; +} + +.success-message-action { + width: 111px; +} + +.channels-added-action { + width: 174px; + display: flex; + text-align: center; +} + +.name-action { + width: 87px; +} + +.display-name-action { + width: 122px; +} + +.option-buttons { + width: 100px; +} + +.list-table { + .table { + tbody { + tr { + td { + border: 1px solid #dddddd; + vertical-align: middle; + } + } + } + thead { + tr { + th { + border: 1px solid #dddddd; + vertical-align: middle; + td { + white-space: nowrap; + } + } + } + border: 1px solid #dddddd; + vertical-align: middle; + width: 100%; + } + td { + text-align: center; + vertical-align: middle; + } + th { + text-align: center; + vertical-align: bottom; + } + width: 100%; + margin-top: 0; + margin-bottom: 0; + table-layout: fixed; + tr { + display: flex; + width: 100%; + } + } + th { + text-align: center; + } +} + +.team-name-dropdown { + color: $color_1; +} + +.guest-button { + &:focus { + outline: none; + box-shadow: none; + } +} diff --git a/webapp/src/components/svgIcons/svg.tsx b/webapp/src/components/svgIcons/svg.tsx new file mode 100644 index 000000000..15626e932 --- /dev/null +++ b/webapp/src/components/svgIcons/svg.tsx @@ -0,0 +1,72 @@ +import React from 'react'; + +const EditSvg = () => ( + + + + +); + +const DeleteSvg = () => ( + + + + + + +); + +const ViewSvg = () => ( + + + + +); + +export {EditSvg, DeleteSvg, ViewSvg}; diff --git a/webapp/src/components/tables/existingConfigTable.tsx b/webapp/src/components/tables/existingConfigTable.tsx new file mode 100644 index 000000000..8017ecbcc --- /dev/null +++ b/webapp/src/components/tables/existingConfigTable.tsx @@ -0,0 +1,187 @@ +import React, {useState} from 'react'; + +import {FormGroup, Table, ButtonGroup, Button, OverlayTrigger, Tooltip} from 'react-bootstrap'; + +import ActionModal from '../modals/actionModal'; +import DeleteModal from '../modals/deleteModal'; +import ConfigModal from '../modals/configModal'; + +import {DeleteSvg, EditSvg, ViewSvg} from '../svgIcons/svg'; + +import './styles.scss'; + +type Props = { + onChange: (config: Configs[]) => void; + value: Configs[]; +} + +const ExistingConfigTable = ({value, onChange}: Props) => { + const [isviewVisible, setIsViewVisible] = useState(false); + const [isdeleteVisible, setIsDeleteVisible] = useState(false); + const [iseditVisible, setIsEditVisible] = useState(false); + const [isaddVisible, setIsAddVisible] = useState(false); + + const [configIndex, setConfigIndex] = useState(0); + + const handleView = (index: number) => { + setConfigIndex(index); + setIsViewVisible(true); + }; + + const handleDelete = (index: number) => { + setConfigIndex(index); + setIsDeleteVisible(true); + }; + + const handleEdit = (index: number) => { + setConfigIndex(index); + setIsEditVisible(true); + }; + + const handleAdd = () => setIsAddVisible(true); + + return ( +
+ { + isviewVisible && + + } + {isdeleteVisible && + + } + {iseditVisible && + + } + {isaddVisible && + + } + +
+ {'Existing Configs'} +
+
+ {value.length > 0 && + + + + + + + + + + + + { + value.map((val, i) => + ( + + + + + + + + ), + ) + } + +
{'Team Name'}{'Delay (in sec)'}{'Message'}{'Include Guests'}{'Options'}
+ {val.teamName}} + > +

+ {val.teamName} +

+
+
{val.delayInSeconds} + {val.message.join(',')}} + > +

+ {val.message.join(',')} +

+
+
{val.includeGuests ? val.includeGuests : '-'} +
+ + {'View actions'}} + > + + + {'Edit config'}} + > + + + {'Delete Config'}} + > + + + +
+
} + +
+
+
+ ); +}; + +export default ExistingConfigTable; diff --git a/webapp/src/components/tables/styles.scss b/webapp/src/components/tables/styles.scss new file mode 100644 index 000000000..b0ae3ea0e --- /dev/null +++ b/webapp/src/components/tables/styles.scss @@ -0,0 +1,153 @@ +$color_1: #000000; +$border-color_1: transparent; + +.existing-config-table.btn-group { + display: flex; + justify-content: space-between; + gap: 10px; + gap: 1px; + .btn.btn-default { + background: none; + border-color: $border-color_1; + border: transparent; + } +} + +.existing-config-table.table.table { + tbody { + tr { + td { + border: 2px solid #dddddd; + vertical-align: middle; + } + } + } + thead { + tr { + th { + border: 2px solid #dddddd; + vertical-align: middle; + } + } + border: 2px solid #dddddd; + vertical-align: middle; + } +} + +.existing-config-table.table { + td { + text-align: center; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + th { + text-align: center; + vertical-align: bottom; + } + width: 100%; + table-layout: fixed; + thead { + tr { + th { + td { + white-space: nowrap; + } + } + } + } + .messageValue { + text-align: left; + vertical-align: middle; + } +} + +.existing-config-table.table-body { + width: 100%; +} + +.existing-config-table { + .btn-group.btn.btn-default { + &:hover { + background: transparent; + color: $color_1; + } + } +} + +.btn-group { + .btn.btn-default { + &:focus { + background: transparent; + color: $color_1; + } + } +} + +.add-config-btn { + margin: 15px 0 0 0; +} + +.config { + .form-group { + margin-left: 0px; + } +} + +.name { + font-weight: 600; + font-size: 14px; + margin-bottom: 1em; +} + +.team-name { + max-width: 138px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.delay { + width: 110px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.message { + width: 413px; +} + +.include-guests { + width: 119px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.option { + width: 138px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.message-content { + text-align: left; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.svg-buttons { + &:focus { + outline: none; + box-shadow: none; + } + &:active { + outline: none; + box-shadow: none; + } +} diff --git a/webapp/src/constants/apiConstants.ts b/webapp/src/constants/apiConstants.ts new file mode 100644 index 000000000..fc10e26bd --- /dev/null +++ b/webapp/src/constants/apiConstants.ts @@ -0,0 +1,7 @@ +export const getChannel = '/channels?exclude_default_channels=true'; +export const getTeam = '/teams'; +export const apiVersion1 = '/api/v1'; +export const apiVersion4 = '/api/v4'; +export const plugins = '/plugins'; +export const mmAuthToken = 'MMAUTHTOKEN'; +export const bearer = 'Bearer '; diff --git a/webapp/src/containers/components/modals/attachmentMsgModal.tsx b/webapp/src/containers/components/modals/attachmentMsgModal.tsx deleted file mode 100644 index de5f0b657..000000000 --- a/webapp/src/containers/components/modals/attachmentMsgModal.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, {useState} from 'react'; -import Button from 'react-bootstrap/Button'; -import Modal from 'react-bootstrap/Modal'; - -import './styles.css'; - -const AttachmentMessageModal = () => { - const [show, setShow] = useState(false); - const handleClose = () => setShow(false); - - return ( - <> -
- - - {'Attachment Message'} - - - -

{'Attachment message body text goes here.'}

-
- - - - - -
-
- - ); -}; - -export default AttachmentMessageModal; diff --git a/webapp/src/containers/components/modals/styles.css b/webapp/src/containers/components/modals/styles.css deleted file mode 100644 index d5e7280e0..000000000 --- a/webapp/src/containers/components/modals/styles.css +++ /dev/null @@ -1,3 +0,0 @@ -.show { - position: initial; -} diff --git a/webapp/src/containers/components/tables/existingConfigTable.tsx b/webapp/src/containers/components/tables/existingConfigTable.tsx deleted file mode 100644 index ad2b0c454..000000000 --- a/webapp/src/containers/components/tables/existingConfigTable.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import React, {useState} from 'react'; - -import FormGroup from 'react-bootstrap/FormGroup'; -import Col from 'react-bootstrap/Col'; -import Table from 'react-bootstrap/Table'; -import ButtonGroup from 'react-bootstrap/ButtonGroup'; -import Button from 'react-bootstrap/Button'; - -import './styles.css'; - -type HelpText = { - key: string | null; - props: { - isMarkdown: boolean; - isTranslated: boolean; - text: string; - } -} - -type Props = { - id: string; - label: string; - value: string; - helpText: HelpText; -} - -const ExistingConfigTable = ({label, helpText}: Props) => { - const [visible, setVisible] = useState(false); - const handleView = () => setVisible(true); - - return ( - <> - - - {label} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{'Team Name'}{'Delay in seconds'}{'Message'}{'Attachment message'}{'Options'}
{'Standup'}{'4'} - {'Hello to standup group.'} - - - -
- - - - -
-
{'Overview'}{'5'}{'This group is to share overview'} - - -
- - - - -
-
{'Result'}{'2'}{'Share all your results here'} - - - <> - - - - - -
{'Deploy'}{'6'}{'Deployment details here'} - - - <> - - - - - -
-
- - {helpText?.props?.text} - -
- -
- - ); -}; - -export default ExistingConfigTable; diff --git a/webapp/src/containers/components/tables/styles.css b/webapp/src/containers/components/tables/styles.css deleted file mode 100644 index ad8c44050..000000000 --- a/webapp/src/containers/components/tables/styles.css +++ /dev/null @@ -1,28 +0,0 @@ -.btn-group { - display: flex; - justify-content: space-between; - gap: 10px; -} - -table.table tbody tr td, -table.table thead tr th, -table.table thead { - border: 2px solid #dddddd; -} - -.table td { - text-align: center; -} - -.table th { - text-align: center; - vertical-align: bottom; -} - -table { - width: 100%; -} - -.table thead tr th td{ - white-space: nowrap -} diff --git a/webapp/src/index.tsx b/webapp/src/index.tsx index b1f1878f4..d08df62ec 100644 --- a/webapp/src/index.tsx +++ b/webapp/src/index.tsx @@ -1,20 +1,17 @@ import {Store, Action} from 'redux'; import {GlobalState} from 'mattermost-redux/types/store'; -// eslint-disable-next-line import/no-unresolved + import {PluginRegistry} from 'types/mattermostWebapp'; -import ExistingConfigTable from 'containers/components/tables/existingConfigTable'; -import AttachmentMsgModal from 'containers/components/modals/attachmentMsgModal'; +import ExistingConfigTable from 'components/tables/existingConfigTable'; import {id} from './manifest'; export default class Plugin { // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function - public async initialize(registry: PluginRegistry, store: Store>>) { // @see https://developers.mattermost.com/extend/plugins/webapp/reference/ - registry.registerAdminConsoleCustomSetting('ExistingConfigurationTable', ExistingConfigTable); - registry.registerRootComponent(AttachmentMsgModal); + registry.registerAdminConsoleCustomSetting('WelcomeMessages', ExistingConfigTable); } } diff --git a/webapp/src/types/plugin/common.d.ts b/webapp/src/types/plugin/common.d.ts index e69de29bb..21fd2ec09 100644 --- a/webapp/src/types/plugin/common.d.ts +++ b/webapp/src/types/plugin/common.d.ts @@ -0,0 +1,36 @@ +type Actions = { + actionType: string, + actionName: string, + actionDisplayName: string, + channelsAddedTo: string[], + actionSuccessfullMessage: string[] +}; + +type Configs = { + teamName: string, + delayInSeconds: number, + message: string[], + includeGuests: string | null, + attachmentMessage: string[] | null, + actions: Actions[] | null +}; + +type GroupTypes = { + label: string; + value: string; +}; + +type OptionTypes = { + value: string; + label: string; + data: string; +}; + +type Teams = { + display_name: string; +}; + +type Channels = { + display_name: string; + team_name: string, +}; diff --git a/webapp/src/utils/index.ts b/webapp/src/utils/index.ts new file mode 100644 index 000000000..c1bfceb09 --- /dev/null +++ b/webapp/src/utils/index.ts @@ -0,0 +1,23 @@ +import Cookies from 'js-cookie'; + +import {plugins, apiVersion1, apiVersion4, bearer, mmAuthToken} from 'constants/apiConstants'; + +import {id} from 'manifest'; + +const getBaseUrls = (mmSiteUrl: string): {pluginApiBaseUrl: string; mattermostApiBaseUrl: string} => { + const pluginUrl = `${mmSiteUrl}${plugins}/${id}`; + const pluginApiBaseUrl = `${pluginUrl}${apiVersion1}`; + const mattermostApiBaseUrl = `${mmSiteUrl}${apiVersion4}`; + + return {pluginApiBaseUrl, mattermostApiBaseUrl}; +}; + +const getAuthToken = () => { + const authToken = bearer + Cookies.get(`${mmAuthToken}`) || ''; + return authToken; +}; + +export default { + getBaseUrls, + getAuthToken, +}; diff --git a/webapp/webpack.config.js b/webapp/webpack.config.js index b5ba948c6..44c6d8f41 100644 --- a/webapp/webpack.config.js +++ b/webapp/webpack.config.js @@ -44,7 +44,7 @@ module.exports = { 'node_modules', path.resolve(__dirname), ], - extensions: ['*', '.js', '.jsx', '.ts', '.tsx'], + extensions: ['*', '.js', '.jsx', '.ts', '.tsx', '.d.ts'], }, module: { rules: [