diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..b512c09d476623ff4bf8d0d63c29b784925dbdf8 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index bfb6fbe13759988ff367c2faea5cc97844fc7c48..d463b1af434adc17f24ef1ccf9bee0270c49378b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,12 +1,14 @@ module.exports = { parser: '@typescript-eslint/parser', // Specifies the ESLint parser extends: [ + 'eslint:recommended', 'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react + 'plugin:react-hooks/recommended', 'plugin:@typescript-eslint/eslint-recommended', // Uses the recommended rules from @typescript-eslint/eslint-plugin 'prettier', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier 'plugin:prettier/recommended', // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. - 'plugin:react-hooks/recommended', ], + plugins: ['@typescript-eslint'], parserOptions: { ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features sourceType: 'module', // Allows for the use of imports @@ -17,11 +19,24 @@ module.exports = { rules: { // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs '@typescript-eslint/explicit-function-return-type': 'off', + // Note: you must disable the base rule as it can report incorrect errors + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + + 'no-case-declarations': 'warn', + camelcase: 'warn', 'react/prop-types': 'warn', + 'no-console': 'off', + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/prefer-optional-chain': 'warn', }, settings: { react: { version: 'detect', // Tells eslint-plugin-react to automatically detect the version of React to use }, }, + env: { + browser: true, + node: true, + }, } diff --git a/.gitignore b/.gitignore index 5917c13d05e815e3e477c50fc10aa7ed09630e0d..e6fb68796bfcfb3f3ba053c98ca1192e326e4863 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ scripts/AAAA* scripts/config.js scripts/data/ .token.json +AAAA* # Report public/report.html diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4d46400d68689b5e59d89423aea806f358080f3f..f74d36cebe49621d32be934985bf6ca3189ff34d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,8 @@ default: services: - name: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:20.10.9-dind alias: docker + tags: + - build-push-to-registry stages: - buildenv @@ -67,11 +69,12 @@ build-dev: - git config --global user.email "$GIT_USER" - git config --global user.password "$GIT_PWD" - git config user.email "$GIT_USER" - - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/llle_project/ecolyo.git + - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git - git config --global credential.helper store - yarn deploy-dev only: - dev + - tags build: stage: build @@ -85,7 +88,7 @@ build: - git config --global user.email "$GIT_USER" - git config --global user.password "$GIT_PWD" - git config user.email "$GIT_USER" - - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/llle_project/ecolyo.git + - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git - git config --global credential.helper store - yarn deploy only: @@ -172,7 +175,7 @@ sonarqube-mr: deploy_demo: stage: deploy tags: - - deploy + - deploy-alpha script: - cd /root/ecolyo-infra-scripts/cicid_scripts - './update_ecolyo_dev.sh' @@ -182,7 +185,7 @@ deploy_demo: deploy_alpha: stage: deploy tags: - - deploy + - deploy-alpha script: - cd /root/ecolyo-infra-scripts/cicid_scripts - './update_all_ecolyo_dev.sh' diff --git a/.gitlab/issue_templates/Konnector.md b/.gitlab/issue_templates/Konnector.md deleted file mode 100644 index a065e1ee6d593ad5e690f59c761d4f52f7cd2814..0000000000000000000000000000000000000000 --- a/.gitlab/issue_templates/Konnector.md +++ /dev/null @@ -1,20 +0,0 @@ -/title [Konnecteur] Description - -### Résumé du problème - -_Donnez une briève description du problème._ - -### Les étapes pour reproduire le bug - -_Listez les étapes qui vous permettent de reproduire ce bug, cette étape est très importante._ - -### Décrivez le comportement du _bug_ ? - -### Quel serez le comportement _attendu_ ? - -### Logs et/ou screenshots - -### Possible fixes - -/label ~"type::bug" -/label ~"type::konnector" diff --git a/.gitlab/issue_templates/Ecolyo.md b/.gitlab/issue_templates/[Bug] Ecolyo.md similarity index 94% rename from .gitlab/issue_templates/Ecolyo.md rename to .gitlab/issue_templates/[Bug] Ecolyo.md index 1eb07eec3f924249c5118cfcd910f29c985d0012..eff6a9f7c4f51fe3150244ba2b636478fbb18ab7 100644 --- a/.gitlab/issue_templates/Ecolyo.md +++ b/.gitlab/issue_templates/[Bug] Ecolyo.md @@ -34,5 +34,4 @@ _Listez les étapes qui vous permettent de reproduire ce bug, cette étape est t ### Possible fixes -/label ~"type::bug" -/label ~"type::ecolyo" +/label ~"bug" diff --git a/.gitlab/issue_templates/default.md b/.gitlab/issue_templates/default.md index 8b588b917da97eafcd21c2b8f3f54082e7833c72..4aae33250ce27a1f6de52971220c13ffed9f4930 100644 --- a/.gitlab/issue_templates/default.md +++ b/.gitlab/issue_templates/default.md @@ -1,19 +1,9 @@ -/title [Scope] Description +[[_TOC_]] -### Résumé du problème +## Contexte -_Donnez une description briève du problème._ +## Objectif -### Les étapes pour reproduire le bug +## Ressources -_Listez les étapes qui vous permettent de reproduire ce bug, cette étape est très importante._ - -### Décrivez le comportement du _bug_ ? - -### Quel serez le comportement _attendu_ ? - -### Logs et/ou screenshots - -### Possible fixes - -/label ~"type::bug" +## Tâches diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md index 08706332819a222a9cd57bf3c1bd869015b4be89..ba37698f819a73a0116bfccc7fc032e8bc9fb66e 100644 --- a/.gitlab/merge_request_templates/default.md +++ b/.gitlab/merge_request_templates/default.md @@ -28,38 +28,28 @@ More reading on checklists can be found in the "Checklist Manifesto": http://atu ---> -### Quality +### Quality [](https://sonarqube.forge.grandlyon.com/dashboard?id=ecolyo-mr) - [](https://sonarqube.forge.grandlyon.com/dashboard?id=ecolyo-mr) -* [ ] Confirmed - -1. For the code that this change impacts, I believe that the automated tests validate functionality that is highly important to users. If the existing automated tests do not cover this functionality, I have added the necessary additional tests or I have added an issue to describe the automation testing gap and linked it to this MR. -1. I have made sure that the sonar quality coverage is up to standards. -1. I have considered the impact of this change on the front-end, back-end, and database portions of the system where appropriate and applied. -1. I have tested this MR in all supported browsers or determined that this testing is not needed. -1. I have confirmed that this change is backwards compatible across updates (migrate up needs a migrate down), or I have decided that this does not apply. +- For the code that this change impacts, I believe that the **automated tests validate functionality** that is **highly important to users**. If the existing automated tests do not cover this functionality, I have **added the necessary additional tests** or I have added an issue to describe the automation testing gap and linked it to this MR. +- I have made sure that the **sonar quality coverage is up to standards**. +- I have **considered the impact** of this change on the **front-end**, **back-end**, and **database** portions of the system where appropriate and applied. +- I have tested this MR in **all supported browsers** or determined that this testing is not needed. +- I have confirmed that this change is **backwards compatible** across updates (migrate up needs a migrate down), or I have decided that this does not apply. ### Performance, reliability and availability -* [ ] Confirmed - -1. I am confident that this MR does not harm performance, or I have asked a reviewer to help assess the performance impact. -1. I have considered the scalability risk based on future predicted growth. +- I am confident that this MR **does not harm performance**, or I have asked a reviewer to help assess the performance impact. +- I have considered the **scalability risk** based on future predicted growth. ### Documentation -* [ ] Confirmed - -1. The MR is named after the desired squash commit to feed the changelog linked to the current milestone. -1. I have added/updated documentation (also updated if the changes feature a deprecation) or I have decided that documentation changes are not needed for this MR. +- The MR is named after the **desired squash commit** to feed the changelog linked to the current milestone. +- I have **added/updated documentation** (also updated if the changes feature a deprecation) or I have decided that documentation changes are not needed for this MR. -### Security +### Security [](https://sonarqube.forge.grandlyon.com/dashboard?id=ecolyo-mr) -* [ ] Confirmed - -1. I have confirmed that if this MR does not contains any sensitive informations hidden in the changes. +- I have confirmed that if this MR **does not contains any sensitive informations** hidden in the changes. ### Deployment -* [ ] Confirmed - -1. When featured on a self-data project release, i have made sure my app version in the manifest and package.json is incremented and any relative changes to the permissions are clearly written and transmitted to Cozy. +- When featured on a self-data project release, I have made sure my **app version** in the manifest and package.json is **incremented** and any relative **changes to the permissions are clearly written and transmitted to Cozy**. diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 6a50941bbfee46167b6d79f21c98bcff405b8035..62e78fc20f4b8284eaf94de21135d48f6cfc6e9f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,6 +6,8 @@ "sonarsource.sonarlint-vscode", "formulahendry.auto-rename-tag", "dbaeumer.vscode-eslint", - "andrejunges.handlebars" + "andrejunges.handlebars", + "streetsidesoftware.code-spell-checker", + "streetsidesoftware.code-spell-checker-french" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 6c8a184c183b867ca543309a8e2fadf6bf498eca..ce5597bb6c78fa4bf35605a1c3a43cc9609bae17 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,24 +22,65 @@ "javascript", "javascriptreact", "typescript", - "typescriptreact", + "typescriptreact" ], "gitlab.instanceUrl": "https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo", "gitlab.ignoreCertificateErrors": true, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": true, + "source.fixAll": true, + "source.organizeImports": true }, "gitlab.showPipelineUpdateNotifications": true, "sonarlint.connectedMode.project": { "projectKey": "ecolyo" }, + "cSpell.language": "fr,en", "cSpell.words": [ + "authform", + "backoffice", + "barchart", "CONSO", + "cozycloud", + "dacc", + "Datachart", "Dataload", + "Dataloads", + "defi", + "depense", + "doctypes", + "ecogesture", + "Ecogesture", + "ecogestures", + "ecolyo", + "Ecolyo", + "eglgrandlyon", + "elec", + "enedis", + "Enedis", + "ENEDIS", + "enedissgegrandlyon", + "fluidchart", + "fluidchartslide", + "fluidtype", + "Gazpar", + "grandlyon", + "grdf", + "GRDF", + "grdfgrandlyon", + "Konnected", + "konnector", + "konnectors", + "luxon", + "matomo", + "Matomo", + "MEGAUNIT", + "monthlyanalysis", "MULTIFLUID", "Picto", - "barchart", - "elec", - "luxon" + "PROFILETYPE", + "Reinit", + "splashscreen", + "testid" ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e31107b90bf28e75c0dbc77a6177403b0117f14..dc7f494cf4fdbdf0f85b34f53dfbe2866f2a15e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,93 +2,149 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. -### [1.10.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.10.1...v1.10.2) (2022-08-02) +### [2.0.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.0.1...v2.0.2) (2022-12-12) ### Bug Fixes -* cross icon on fluidButton for multifluid ([d2f381a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d2f381a99c27d70ce25f1a34c609be25791fe36f)) -* yarn lock version ([4311517](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4311517794475c0756f57c3e50b6d7bdb4778594)) - -### [1.10.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.10.0...v1.10.1) (2022-07-20) +* retours canary 2.0.1 ([7cc6bb4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7cc6bb4282ad092d85d5bd7116ca83081b0780a6)) +### [2.0.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.0.0...v2.0.1) (2022-12-08) ### Features -* reduced gifs size up to 50% ([edc35b5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/edc35b5cca4d756806d806963359c712adbda2e9)) - +- add sentry ([0d8c67b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0d8c67b95cd03d492b507c2d434573037827f759)) +- **conso:** half hour shifted minus 30 minutes to match enedis data ([255afaf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/255afaf56d00b89800366452eda8e5502a82550b)) +- new feedback system (SAU) ([dce71f9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dce71f92a0e32ba5f4d486f23d5e63cde235f49c)) +- new loader ([cdf9e80](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cdf9e80d0f73f9d317784145566636333e1c7df9)) +- optional redirection after migration release notes ([c616a2a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c616a2a202df6d3afedc0bcdc98074db34a65f58)) +- **SGE:** SGE onboarding + screens adjustments ([d6e1c1a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d6e1c1a5fc0afc5eb7250cca75b9527133b2f335)) +- update logos (splash, mails) ([ba8130d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ba8130d6560671410341c0111d636666e8f80a64)) +- updated terms ([4cc62d9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4cc62d99e6e3aba70cf54d62bd94db4b0e047628)) ### Bug Fixes -* Display blue border on ecogesture ([b82bb59](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b82bb590b761f42562f86d821a4ca65e134c9332)) +- accord "astuces" ([4967326](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4967326f858932010f2bc719eb6b3bc9a22fbc8b)) +- deploy script ([fd8acf0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fd8acf00d5d120876825e0dda41405e8381f6ce7)) +- desktop view when finishing profile ([fa254d6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fa254d6241742253bdb32a5aac887eb7b9ff6401)) +- **email:** blurry feedback icon ([4b57f40](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4b57f402d9d108f37e7e7d6e89c6dce97d629fd1)) +- **export:** handle abnormal null dates ([822b7bf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/822b7bf07abc075e6bf152d2ae02aa9fc4498a16)) +- **loader:** remove old loaders ([a44fb2e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a44fb2e407ddaba7805a5c9dcabc1759235b730c)) +- **matomo:** disable outlinks ([158952b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/158952b42eb2dc1fc8672fd8794171790b823ebc)) +- **matomo:** disabled heatmap recording ([c70c0c2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c70c0c2aed5c016f80d48b81f727a5ea11e91514)) +- options view ([df468b3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/df468b38e53a845279bda8542ce6a22f852bf983)) +- partners logo in-app ([97b05c6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/97b05c669eaa8e9ca233b70c5e0a338cce2d8d48)) +- pipelines ([6d2452e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6d2452ecefe0b64a73eaf7d2c072a9733ba01e9f)) +- quality gate ([f0d6459](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f0d64591a0d81359980917463c79805ce9b9c1f5)) +- **technical:** update ecolyo scripts to match the new repository address ([0106723](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0106723d7bb04da0324c153541a9763b262d8e1c)) + +## [2.0.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.12.1...v2.0.0) (2022-10-24) + +### ⚠BREAKING CHANGES + +- **Enedis SGE:** new electricity konnector +- removed dataconnect konnector +- **design:** upated logo and loading animation +- **misc:** updated remote doctypes for the new backoffice [d0afeb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/d0afebe06d4ecbb1a8a0026574325dc6c12bf1d1) -## [1.10.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.9.4...v1.10.0) (2022-07-07) +### [1.12.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.12.0...v1.12.1) (2022-10-11) +### Bug Fixes + +- retours review ([5fca202](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5fca202151514e3124a1b69d0f7dff01adda72ca)) + +## [1.12.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.10.2...v1.12.0) (2022-10-07) ### Features -* **cgu:** update cgu, legal terms & consent ([f68d3d7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f68d3d768557f918450535d71c2957311accf54d)) -* **dacc v2:** dacc v2 ([d43817c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d43817c7a96c5d779669fb6c50f8bbfbd2185297)) -* **dev:** point to new docker image hosted by grandlyon for local dev ([0157477](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0157477a79ae0eeab7b0d7e1b7af50b5e9f432b4)) -* **duel:** final duel perf view ([f71e523](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f71e523d858dad4cb89a7dfe9051fed4160cc16c)) -* **matomo:** tacking + opt out in settings ([79fa859](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/79fa859805108f96848c71c0afb97402abe31c46)) -* **newsletter:** info field is now optional ([1b73f8b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1b73f8b279fdf459834fc65098e65e91c69a4182)) +- **analysis:** improve average consumption ([b1cd612](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b1cd6123c9289d184fbf2697ce1208d40fa3c7b8)) +- **analysis:** Improve enedis analysis display and fix consent expired case ([5fc610b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5fc610b23ca3b9ca2660b3bcdac4c1b0fdd0875c)) +- custom alert ([0e39b82](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0e39b82c140a7942d045c3d3b7aca9038fce77a2)) +- custom popup outdated ([3c3c21d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3c3c21de9a8fc6b18946b2d01e9477b361dcba67)) +- **init:** Improve splash loading time ([568b692](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/568b692eb3e8ecc7383ac65aec978100c87b21e6)) +- renamed ecogestures into tips ([9092c94](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9092c942ca9dd473608363318e56ed4bae7578a5)) +- **sge:** Add consent reset feature and change konnector slug ([8a27091](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8a27091fecc862dde8359142ce7122c3c5e4e5df)) +- **sge:** replace half hour ([f7d4428](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f7d44288e6329fae5f2a603170e0f95504ac8674)) +- updated welcome modal ([78be88e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/78be88eb19004a21359575829ac4b52eef8aafe5)) +### Bug Fixes + +- **alert:** fix water consumption alert ([07f732d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/07f732de3dc49308ac370fbfad35501ed56a27cb)) +- bugs before release ([39a1071](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/39a10713fb320ebf6ea51c5feaa48f627291aef8)) +- challenges alignment on desktop ([bf3aad2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bf3aad2e4a2630a8eea1eccd54629d3e28891523)) +- change PDL image for a clearer version ([c3da82a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c3da82a64bf2e3dcfba142bb6c308af12af1b46c)) +- css adjustments ([21fe3c2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21fe3c207677ad0d2b3b933862fb9886bc507f92)) +- css challenges done ([cf32860](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cf3286089352fcaddca377f8a97385d8fe60c43b)) +- **deps:** Update cozy-scripts to last stable version and remove unused dependencies ([2fc9c2e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2fc9c2e8d7b3ba5419dbd9d710a334308a5d0803)) +- **deps:** update dependency cozy-bar to v8.9.2 ([491629d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/491629d65653e4cf462bd547d8eaad9ad40279c9)) +- **deps:** update dependency cozy-client to v33 ([b151129](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b1511296c4407a11dd27c50407cbe7adfec7f0a3)) +- **deps:** update dependency cozy-harvest-lib to v9.26.14 ([66270ac](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/66270ac86e2eed190ed1bf35aed74a9052f92ee7)) +- **deps:** update dependency cozy-realtime to v4.2.5 ([1bd3d32](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1bd3d3213956789a8b664c19844039cbf877a002)) +- **deps:** update dependency cozy-realtime to v4.2.8 ([560ca4d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/560ca4d015353da8c81459cabd1bc7da95ac751e)) +- **deps:** update dependency cozy-scripts to v6 ([6b23617](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6b236173390354b89a6a083323e1017a0afba9a5)) +- **deps:** update dependency cozy-ui to v75 ([4f543ed](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4f543edd38becf2a8d2f04785949ab935c088b86)) +- **deps:** update dependency d3 to v6 ([cbf2860](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cbf2860dcf3fb378ac1f4f7f2eb8529965202e25)) +- **local:** improve import scripts for sge data ([8f28303](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8f28303410380444098edcf0c5edad0e5405b52e)) +- message for 1/2h data elec ([b9ea1c2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b9ea1c2133de88e51a88e578caf35295f00740e0)) +- prevent unavailable backoffice to crash the app ([da28f53](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/da28f531cf1bdd47eeebc8772824dc4de87e74ba)) +- profile navigation and buttons style ([6097e8e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6097e8e449e90bc4e39b955fe3030dfae6c5354b)) +- **types:** Fix wrong types in style composants ([52a7a54](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/52a7a5492d964505597896fe9cfdbe12bb058666)) + +## 1.11.0 (2022-09-19) + +### Features + +- **export data:** export data to xlsx ([80efd8a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/80efd8a5f9f63fb664dc4d9b41fc5230959b32fa)) +- **sge:** Add Sge onboarding ([a799fe2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a799fe2c0e9fe243ea585e16039434fc86de6f22)) ### Bug Fixes -* **analysis:** Fix navigation issue in monthly analysis ([d45e4f3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d45e4f39e64e181886ebefa92d56f93a4f3fa72e)) -* **dacc:** Remove temp code for recalculation ([e5a68cf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e5a68cfc5ce0fb98f9eb87d1f25cf5aefc8cabaa)) -* **deps:** update dependency @material-ui/core to ~4.12.0 ([78eb34c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/78eb34c64e0d2f87ea809e7de6985fc4ef41d565)) -* **deps:** update dependency axios to ^0.27.0 ([c03bf96](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c03bf96763d5ef56a60ebe0f1587c95031d4e8a0)) -* **deps:** update dependency cozy-bar to v8 ([6c0810a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6c0810a7890b7eef211bd69a4ac3abe5e03b042f)) -* **deps:** update dependency cozy-client to v32.1.1 ([53a45e8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/53a45e8cd1ac5cc172e88e9011cf2d5496ec2b84)) -* **deps:** update dependency cozy-client to v32.2.0 ([5d4f3bd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5d4f3bdb9aff879983b452cc540ea42b551d9bbe)) -* **deps:** update dependency cozy-client to v32.2.1 ([1e0eb54](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1e0eb54af0f64ff89524672a2139397128da4c2c)) -* **deps:** update dependency cozy-harvest-lib to v9.15.4 ([e97d16e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e97d16e076e686b02013353409cdfd5b326a6d9f)) -* **deps:** update dependency cozy-harvest-lib to v9.16.0 ([eaa03ff](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/eaa03ffe85ce6472c835737305ab76c097452a36)) -* **deps:** update dependency cozy-harvest-lib to v9.18.0 ([42e023e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/42e023e143d1cd4cfda5cea6b49bdbca4865d132)) -* **deps:** update dependency cozy-harvest-lib to v9.18.1 ([37ed6a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/37ed6a4695ab002ec08797506a15c1e1e3b72ebd)) -* **deps:** update dependency cozy-ui to v68.9.1 ([596c045](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/596c0451879c265ed1aa20b7f6ede01d22fb5377)) -* **deps:** update dependency eslint-config-cozy-app to v1.6.0 ([d9bc3f0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9bc3f032f962e7aa680cce5e39268c78cf251c0)) -* **deps:** update dependency luxon to v2 ([cb6e59c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cb6e59c26718204c78503e909d3fd157a90175fb)) -* **deps:** update dependency object-hash to v3 ([213a0e1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/213a0e19d6b05e04a3ec4fd4faa948fdab202b69)) -* **deps:** update dependency react-router-dom to v5.3.3 ([b76925f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b76925f33a8453da4f4db49013e5396334a326f0)) -* **deps:** update dependency react-swipeable-views to v0.14.0 ([b2a651b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b2a651b4c411d54afeccd62c91c244caeb5fd52b)) -* **deps:** update dependency to husky v8 ([a0bf48c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a0bf48c5f43f09a6e1dfd360c38a8649d4837b06)) -* **ecogesture:** Reload on single ecogesture won't make the app crash anymore ([be0baa7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/be0baa7b7ab4d4c773e1328f055b3dadba44a175)) -* **lint:** fix format ([a3f22fe](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a3f22fec453ab6b25c25363ab68872e9cb1aed37)) -* **oauth:** add old way to declare token and domain ([8d9ef95](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8d9ef9542b7befe8dee12b664cafc5ec76eb2518)) -* **oauth:** update cozy dependencies version ([5a05443](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5a054431df7ed7d98e800a95356c9584feec9a13)) -* Remove deprecated modal parameters from material ui ([2f4bfd9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2f4bfd9e3ca1e6a4766dc891cdbc3638f0e21a6f)) -* Resolve "[DACC] - Les variations de consommation sont inversées" ([635ec6b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/635ec6b0437205482209b30c28dc1751da97dbe0)) -* Update cozy-ui lib and adapt deprecated components ([d50f7cd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d50f7cded95c4380d0125851a881a51825231f1c)) -* update yarn lock ([498fd40](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/498fd40b281da482b3218dcfc452dd410b334fc0)) - -### [1.9.4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.9.3...v1.9.4) (2022-05-18) +- **performance:** issue on sign color and handle 0 consumption variation ([e404138](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e404138c7dabda3180c80d0fcf511246ee257971)) +- retours review ([9d660f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9d660f7843707714636ef002d56a32d6de610f64)) +## [1.11.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.10.2...v1.11.0) (2022-09-19) ### Features -* **profileType:** invert month and year fields ([be836f9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/be836f9d5e4ff07e5c56175d932aa753515a0c1b)) +- **export data:** export data to xlsx ([80efd8a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/80efd8a5f9f63fb664dc4d9b41fc5230959b32fa)) +- **sge:** Add Sge onboarding ([a799fe2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a799fe2c0e9fe243ea585e16039434fc86de6f22)) + +### Bug Fixes + +- **performance:** issue on sign color and handle 0 consumption variation ([e404138](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e404138c7dabda3180c80d0fcf511246ee257971)) +- retours review ([9d660f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9d660f7843707714636ef002d56a32d6de610f64)) +### [1.10.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.10.1...v1.10.2) (2022-08-02) ### Bug Fixes -* **ecogestures:** Update ecogesture profile and profiletype properly ([5f2d053](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5f2d0535ee5103c5b76a0446c11f399e1c9a682e)) +- cross icon on fluidButton for multifluid ([d2f381a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d2f381a99c27d70ce25f1a34c609be25791fe36f)) +- yarn lock version ([4311517](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4311517794475c0756f57c3e50b6d7bdb4778594)) -### [1.9.3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.9.2...v1.9.3) (2022-05-10) +### [1.10.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.10.0...v1.10.1) (2022-07-20) +### Features + +- reduced gifs size up to 50% ([edc35b5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/edc35b5cca4d756806d806963359c712adbda2e9)) ### Bug Fixes -* **ecogestures:** Update ecogesture profile and profiletype properly ([5f2d053](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5f2d0535ee5103c5b76a0446c11f399e1c9a682e)) +- Display blue border on ecogesture ([b82bb59](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b82bb590b761f42562f86d821a4ca65e134c9332)) + +## [1.10.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.9.4...v1.10.0) (2022-07-07) + +### Features -### [1.9.3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.9.2...v1.9.3) (2022-05-10) +- **cgu:** update cgu, legal terms & consent ([f68d3d7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f68d3d768557f918450535d71c2957311accf54d)) +- **dacc v2:** dacc v2 ([d43817c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d43817c7a96c5d779669fb6c50f8bbfbd2185297)) +- **dev:** point to new docker image hosted by grandlyon for local dev ([0157477](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0157477a79ae0eeab7b0d7e1b7af50b5e9f432b4)) +- **duel:** final duel perf view ([f71e523](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f71e523d858dad4cb89a7dfe9051fed4160cc16c)) +- **matomo:** tacking + opt out in settings ([79fa859](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/79fa859805108f96848c71c0afb97402abe31c46)) +- **newsletter:** info field is now optional ([1b73f8b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1b73f8b279fdf459834fc65098e65e91c69a4182)) ### Bug Fixes -- **accounts:** Prevent account doctype index to crash the first konnector init ([a8fd313](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a8fd31320a8a49cf35af29d87c2498188ef302a6)) +- **ecogestures:** Update ecogesture profile and profiletype properly ([5f2d053](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5f2d0535ee5103c5b76a0446c11f399e1c9a682e)) ### [1.9.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.9.1...v1.9.2) (2022-05-09) @@ -102,371 +158,371 @@ All notable changes to this project will be documented in this file. See [standa - **matomo:** Add Matomo for data tracking ([8781e06](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8781e065296166646582210b187467a0c84ee3d1)) -### [1.9.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.8.3...v1.9.1) (2022-05-06) +### [1.9.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.8.3...v1.9.1) (2022-05-06) ### Features -- **challenge:** remove banner ([ef371eb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ef371ebd0f1c12dc1131e7fbd26fec13017a6133)) -- **dacc:** Add new indicator "uninitialized-konnector-attempts-monthly" ([bd62c3c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bd62c3c41f0a8a170bbb359dd704410e050546b2)) -- **dacc:** Add recalculation for 2 indicators since january ([ff051d1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ff051d17843521dc5d29c744d268ce5f3d636f06)) -- **dacc:** 0 monthly connections are now reported ([a9e7a6f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/a9e7a6fc512cd20688c937a37ee0d0ccbf539039)) -- **ecogesture:** Allow users to reset ecogesture selection and change form flow ([7556c49](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7556c498877e01348b1e4c988493e921c00adc94)) -- **equipments:** Equipments selection added in big profile ([a370e9e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/a370e9edd8f418cbf31f2e9d9509af83f9b2f6e4)) -- **water alert:** Consumption details for water alert ([0f78cf8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/0f78cf8823fe555206b2610af97fcdcc74304e86)) -- **units:** Gas and elec units are now displayed in kWh in analysis page ([3d76e29](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/3d76e29d0847587e55b6b689ace4c0c0cf4f6ea0)) +- **challenge:** remove banner ([ef371eb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ef371ebd0f1c12dc1131e7fbd26fec13017a6133)) +- **dacc:** Add new indicator "uninitialized-konnector-attempts-monthly" ([bd62c3c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bd62c3c41f0a8a170bbb359dd704410e050546b2)) +- **dacc:** Add recalculation for 2 indicators since january ([ff051d1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ff051d17843521dc5d29c744d268ce5f3d636f06)) +- **dacc:** 0 monthly connections are now reported ([a9e7a6f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/a9e7a6fc512cd20688c937a37ee0d0ccbf539039)) +- **ecogesture:** Allow users to reset ecogesture selection and change form flow ([7556c49](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7556c498877e01348b1e4c988493e921c00adc94)) +- **equipments:** Equipments selection added in big profile ([a370e9e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/a370e9edd8f418cbf31f2e9d9509af83f9b2f6e4)) +- **water alert:** Consumption details for water alert ([0f78cf8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/0f78cf8823fe555206b2610af97fcdcc74304e86)) +- **units:** Gas and elec units are now displayed in kWh in analysis page ([3d76e29](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/3d76e29d0847587e55b6b689ace4c0c0cf4f6ea0)) ### Bug Fixes -- **cicd:** restore sonar conf and small code correction for quality quate status ([126eb10](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/126eb10ac38c562afc6b675bcb60fcbf91eb1e1a)) -- **indicator:** Fix variation dacc indicator ([fda1bcc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fda1bccc9747c6ea43253801baa334bcde40b9a8)) -- **konnector:** Handle Login failed error for oauth konnectors ([94ae4dc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/94ae4dc7be22978f13e8705566f5c7bba14d8069)) -- **margin challenge card:** alignment ecogesture button for tablet ([67b7b23](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/67b7b23d022ffcab045baff948d594fa08afe390)) -- **analysis:** Mega units were not displayed ([05a54e7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/05a54e7858bd5d94520b16a10c4ecccbce753fa8)) -- **challenge cards:** Better responsive for challenge cards with small heights ([a1672f3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/a1672f3bd9c3909d173084372d945924342979ad)) -- **loading bar:** Design adjustment ([773dd8d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/773dd8dd686bc2c63ad1522e8ffe5cffdffe68dd)) -- **PWA status bar color:** PWA status bar is now at Ecolyo colors for IOS pwa ([c8af717](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/c8af7178833d91dcf7ade68a8c4aea4d68cde5fa)) +- **cicd:** restore sonar conf and small code correction for quality quate status ([126eb10](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/126eb10ac38c562afc6b675bcb60fcbf91eb1e1a)) +- **indicator:** Fix variation dacc indicator ([fda1bcc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fda1bccc9747c6ea43253801baa334bcde40b9a8)) +- **konnector:** Handle Login failed error for oauth konnectors ([94ae4dc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/94ae4dc7be22978f13e8705566f5c7bba14d8069)) +- **margin challenge card:** alignment ecogesture button for tablet ([67b7b23](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/67b7b23d022ffcab045baff948d594fa08afe390)) +- **analysis:** Mega units were not displayed ([05a54e7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/05a54e7858bd5d94520b16a10c4ecccbce753fa8)) +- **challenge cards:** Better responsive for challenge cards with small heights ([a1672f3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/a1672f3bd9c3909d173084372d945924342979ad)) +- **loading bar:** Design adjustment ([773dd8d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/773dd8dd686bc2c63ad1522e8ffe5cffdffe68dd)) +- **PWA status bar color:** PWA status bar is now at Ecolyo colors for IOS pwa ([c8af717](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/c8af7178833d91dcf7ade68a8c4aea4d68cde5fa)) -### [1.8.3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.8.2...v1.8.3) (2022-03-22) +### [1.8.3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.8.2...v1.8.3) (2022-03-22) -### [1.8.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.8.1...v1.8.2) (2022-03-16) +### [1.8.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.8.1...v1.8.2) (2022-03-16) ### Bug Fixes -- **challenges:** Handle case user finished all challenges ([0421e57](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0421e57d5eaead2ceac3635184c360f6771c8172)) +- **challenges:** Handle case user finished all challenges ([0421e57](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0421e57d5eaead2ceac3635184c360f6771c8172)) -### [1.8.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.8.0...v1.8.1) (2022-03-09) +### [1.8.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.8.0...v1.8.1) (2022-03-09) ### Features -- **prices:** Add new price managment with remote doctype ([e516949](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e5169492eff2579c758429ed636b2177faf94c06)) +- **prices:** Add new price managment with remote doctype ([e516949](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e5169492eff2579c758429ed636b2177faf94c06)) ### Bug Fixes -- **consumption:** display € and color correctly in consumption visualizer ([12789b6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/12789b6c8e24bb856f24badfcbce5f348f27ef33)) -- **consumption:** handle missing data at begining/end of month or year ([67a0f51](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/67a0f51d83f6197a3b1fc620d2b6772baf95cab8)) -- **konnector:** display loader when delete konnector ([350a928](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/350a928677de67fa7057fcb4182460772c34768c)) -- **splash:** change unkown error message on the splash screen ([7cec99d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7cec99d10207e0ced2b6590f748426fddfcf27a6)) +- **consumption:** display € and color correctly in consumption visualizer ([12789b6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/12789b6c8e24bb856f24badfcbce5f348f27ef33)) +- **consumption:** handle missing data at begining/end of month or year ([67a0f51](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/67a0f51d83f6197a3b1fc620d2b6772baf95cab8)) +- **konnector:** display loader when delete konnector ([350a928](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/350a928677de67fa7057fcb4182460772c34768c)) +- **splash:** change unkown error message on the splash screen ([7cec99d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7cec99d10207e0ced2b6590f748426fddfcf27a6)) -## [1.8.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.7.4...v1.8.0) (2022-03-03) +## [1.8.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.7.4...v1.8.0) (2022-03-03) ### Features -- **connection:** handle correclty several accounts on a konnector ([429352f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/429352fa12b173cc15b778fb7014a49705ea9005)) -- **connexion:** Add possibility to inform user when consent is outdated and refresh consent ([74a7659](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/74a76592fadb025a4b1089ec62f357167c2e078f)) -- **consumption:** refacto of dataload visualizer ([921a1b7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/921a1b7913766fea3a6265648d5b9d9815d8f8db)) -- **ecogesture:** update equipment ([57cff15](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/57cff151e88e44d5a478f964be728ee8ab9e2c1c)) -- enhance information in the half an hour consent display ([ad78d5b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ad78d5bdd8c2326cf00043716a88d21de6ad8662)) -- **newsletter:** retrieve newsletter object from the backoffice ([fc6e050](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fc6e0504844dd3f809b1bf5e94a4de34a4c93a79)) -- **splash:** Displays progess bar and better error managment ([19e44c8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/19e44c8c54f7297e04c0ab90397c9ea679eda86e)) +- **connection:** handle correclty several accounts on a konnector ([429352f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/429352fa12b173cc15b778fb7014a49705ea9005)) +- **connexion:** Add possibility to inform user when consent is outdated and refresh consent ([74a7659](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/74a76592fadb025a4b1089ec62f357167c2e078f)) +- **consumption:** refacto of dataload visualizer ([921a1b7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/921a1b7913766fea3a6265648d5b9d9815d8f8db)) +- **ecogesture:** update equipment ([57cff15](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/57cff151e88e44d5a478f964be728ee8ab9e2c1c)) +- enhance information in the half an hour consent display ([ad78d5b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ad78d5bdd8c2326cf00043716a88d21de6ad8662)) +- **newsletter:** retrieve newsletter object from the backoffice ([fc6e050](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fc6e0504844dd3f809b1bf5e94a4de34a4c93a79)) +- **splash:** Displays progess bar and better error managment ([19e44c8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/19e44c8c54f7297e04c0ab90397c9ea679eda86e)) ### Bug Fixes -- **connection:** handle correctly the loginSuccess step in order to prevent infinite loading on connection modal ([d626b90](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d626b901d37e6a26e910ce921f3af465929452f0)) -- **conso:** Now recent data without fluidprice are taken into account in the total consumption ([4e91f35](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4e91f357f6a3065773ef77a006ecdb92fbefa690)) -- **conso:** Prevent today button to set current hour ([367cb7f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/367cb7fb6c06aa6184455ad9f9ad331f71d67c3c)) -- **consumptionAlert:** Display empty field instead of 0 by default ([f9733a2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f9733a2808bd8f8e0196470228b03ab4c3fab66e)) -- day alert in water consumption limit email ([3e4f298](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3e4f29844613b353c296847472d9cf9ed571254c)) -- **enedisAnalysis:** Prevent service to launch if no data ([feb09ee](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/feb09ee166954254d949ff60f51cabb91875a137)) -- **newsletter:** new image format ([4d19de7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4d19de734fa42535666de3e27d12ee053ce72d56)) -- **newsletter:** new image format ([02ff2b3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/02ff2b37aea3e96e5a76cede796a1ad5bbc9ea7d)) +- **connection:** handle correctly the loginSuccess step in order to prevent infinite loading on connection modal ([d626b90](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d626b901d37e6a26e910ce921f3af465929452f0)) +- **conso:** Now recent data without fluidprice are taken into account in the total consumption ([4e91f35](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4e91f357f6a3065773ef77a006ecdb92fbefa690)) +- **conso:** Prevent today button to set current hour ([367cb7f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/367cb7fb6c06aa6184455ad9f9ad331f71d67c3c)) +- **consumptionAlert:** Display empty field instead of 0 by default ([f9733a2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f9733a2808bd8f8e0196470228b03ab4c3fab66e)) +- day alert in water consumption limit email ([3e4f298](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3e4f29844613b353c296847472d9cf9ed571254c)) +- **enedisAnalysis:** Prevent service to launch if no data ([feb09ee](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/feb09ee166954254d949ff60f51cabb91875a137)) +- **newsletter:** new image format ([4d19de7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4d19de734fa42535666de3e27d12ee053ce72d56)) +- **newsletter:** new image format ([02ff2b3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/02ff2b37aea3e96e5a76cede796a1ad5bbc9ea7d)) -### [1.7.4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.7.3...v1.7.4) (2022-02-07) +### [1.7.4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.7.3...v1.7.4) (2022-02-07) ### Bug Fixes -- **migration:** Prevent deprecated migration to launch ([169d843](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/169d843e0ce9dca38d6c263385023910c86e6886)) +- **migration:** Prevent deprecated migration to launch ([169d843](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/169d843e0ce9dca38d6c263385023910c86e6886)) -### [1.7.3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.7.2...v1.7.3) (2022-02-02) +### [1.7.3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.7.2...v1.7.3) (2022-02-02) ### Features -- **fluidPrice:** Add new elec fluid price (1 feb 2022) ([0a82a61](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0a82a61d2a9793b019dc123ad393d5b03e60725d)) -- **fluidPrices:** Replaced migration system with hash system ([669ecaa](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/669ecaa8767ed1ba3ac1a5d9877400665eca247b)) +- **fluidPrice:** Add new elec fluid price (1 feb 2022) ([0a82a61](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0a82a61d2a9793b019dc123ad393d5b03e60725d)) +- **fluidPrices:** Replaced migration system with hash system ([669ecaa](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/669ecaa8767ed1ba3ac1a5d9877400665eca247b)) ### Bug Fixes -- **manifest:** Change text for backoffice remote doctype description ([21f6c2d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/21f6c2d8655c63677cb3d37085a76aaad3babf02)) -- **modal:** Sort prices by fluid so it displays in the right order ([dc1db27](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dc1db276c209b188b25b0c0ff85542a1047d8ef3)) -- **connection:** Fix account duplication in connection flow ([917218f4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/917218f48f1fb8b1362279208751d75160e84e62)) +- **manifest:** Change text for backoffice remote doctype description ([21f6c2d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21f6c2d8655c63677cb3d37085a76aaad3babf02)) +- **modal:** Sort prices by fluid so it displays in the right order ([dc1db27](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dc1db276c209b188b25b0c0ff85542a1047d8ef3)) +- **connection:** Fix account duplication in connection flow ([917218f4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/917218f48f1fb8b1362279208751d75160e84e62)) -### [1.7.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.7.1...v1.7.2) (2022-01-28) +### [1.7.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.7.1...v1.7.2) (2022-01-28) ### Features -- **enedisAnalysis:** New calculation for minimum consumption ([292a95d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/292a95dee13fde8b8b220f81e77ca5c74bae7fc4)) -- **newsletter:** Added new image and styles ([4dabbc5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4dabbc58e4cf6bccd37164a7d96ecb0c3b3b92c6)) +- **enedisAnalysis:** New calculation for minimum consumption ([292a95d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/292a95dee13fde8b8b220f81e77ca5c74bae7fc4)) +- **newsletter:** Added new image and styles ([4dabbc5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4dabbc58e4cf6bccd37164a7d96ecb0c3b3b92c6)) ### Bug Fixes -- **ecogesture:** Fix focus buttons on IOS ([ed3dfb0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ed3dfb0c0aa4a78985acebaa3e6568a41f6136f0)) -- **Migration:** Resolve "Bloqué sur écran chargement Ecolyo" ([630a690](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/630a690dcd3d54a3590f9ac9cf4f749c14f0adde)) -- **profileType:** Remove data from previous profileType when the question is not asked again ([00e53fd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/00e53fdef9d79f1ba30ebcc4c656fb56a90055a5)) +- **ecogesture:** Fix focus buttons on IOS ([ed3dfb0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ed3dfb0c0aa4a78985acebaa3e6568a41f6136f0)) +- **Migration:** Resolve "Bloqué sur écran chargement Ecolyo" ([630a690](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/630a690dcd3d54a3590f9ac9cf4f749c14f0adde)) +- **profileType:** Remove data from previous profileType when the question is not asked again ([00e53fd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/00e53fdef9d79f1ba30ebcc4c656fb56a90055a5)) -### [1.7.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.7.0...v1.7.1) (2022-01-26) +### [1.7.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.7.0...v1.7.1) (2022-01-26) ### Features -- **newsletter:** Added feedback image for newsletter ([7cded54](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7cded54362ed5511602c60d7e26c1505a5bedbdb)) +- **newsletter:** Added feedback image for newsletter ([7cded54](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7cded54362ed5511602c60d7e26c1505a5bedbdb)) ### Bug Fixes -- Change text in next button in profile type form in third step ([febb74a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/febb74a1e6a2d5a954e074a911f430022373e407)) -- **conso:** Resolve issue data doesn't refresh between conso tabs ([74c76c4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/74c76c4ae7d31443deb69a210763795c82c23e52)) -- **ecogesture:** optimise design, correct text, and fix focus on button ([11945e6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/11945e614d05db25efb7fb64a08955cce64ef4ee)) -- **faq:** typo ([8e545fa](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8e545fac7b637e28ee91314be6a35424dacd4974)) -- **waterAlert:** Fix issue unable to activate alert (we already double check in service) ([6b310f7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6b310f775a5c8df09420309506f66ee981b5138b)) +- Change text in next button in profile type form in third step ([febb74a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/febb74a1e6a2d5a954e074a911f430022373e407)) +- **conso:** Resolve issue data doesn't refresh between conso tabs ([74c76c4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/74c76c4ae7d31443deb69a210763795c82c23e52)) +- **ecogesture:** optimise design, correct text, and fix focus on button ([11945e6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/11945e614d05db25efb7fb64a08955cce64ef4ee)) +- **faq:** typo ([8e545fa](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8e545fac7b637e28ee91314be6a35424dacd4974)) +- **waterAlert:** Fix issue unable to activate alert (we already double check in service) ([6b310f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6b310f775a5c8df09420309506f66ee981b5138b)) -## [1.7.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.5.0...v1.7.0) (2022-01-21) +## [1.7.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.5.0...v1.7.0) (2022-01-21) ### Features -- add migration to delete price on month and year ([b961103](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b961103bff0a6840ae7f7f254e91b079f8b8850e)) -- **analysis:** Add info modal for special elec card ([931a7e7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/931a7e7ab1ac0b9e42f453cd8c18298f8d2eb173)) -- **Analysis:** Inform user when analysis cannot be processed ([f001b4d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f001b4d28152c8529f0e811bb3c39c3b2197c594)) -- **ecogesture:** Add visualisation by ecogesture status + navigation ([f82835e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f82835ec0fea7c99544f4d9eb3d9f599353094b6)) -- **ecogestures:** Add ecogesture selection tunnel ([41d3716](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/41d371602e3926082d25d74ca2b6a218b5520345)) -- **ecogestures:** Create ecogesture form ([c062e48](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c062e48a88f5445c872832255a47be0deb78c08d)) -- **Feedback:** user can more easily consult the FAQ before sending its feedback ([994651a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/994651aaf80a7b17fabff3421da3f5566fa87540)) -- **fluidPrices:** Dynamic prices for EGL fluid ([f02c8a9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f02c8a968b74b5540d06a0b0766f1d7325e7bf34)) +- add migration to delete price on month and year ([b961103](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b961103bff0a6840ae7f7f254e91b079f8b8850e)) +- **analysis:** Add info modal for special elec card ([931a7e7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/931a7e7ab1ac0b9e42f453cd8c18298f8d2eb173)) +- **Analysis:** Inform user when analysis cannot be processed ([f001b4d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f001b4d28152c8529f0e811bb3c39c3b2197c594)) +- **ecogesture:** Add visualisation by ecogesture status + navigation ([f82835e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f82835ec0fea7c99544f4d9eb3d9f599353094b6)) +- **ecogestures:** Add ecogesture selection tunnel ([41d3716](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/41d371602e3926082d25d74ca2b6a218b5520345)) +- **ecogestures:** Create ecogesture form ([c062e48](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c062e48a88f5445c872832255a47be0deb78c08d)) +- **Feedback:** user can more easily consult the FAQ before sending its feedback ([994651a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/994651aaf80a7b17fabff3421da3f5566fa87540)) +- **fluidPrices:** Dynamic prices for EGL fluid ([f02c8a9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f02c8a968b74b5540d06a0b0766f1d7325e7bf34)) ### Bug Fixes -- add space in FAQ content ([ddcb262](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ddcb2620384dfc153694823d85f0cd640c90d8b8)) -- adjust height of content on desktop view ([684fbc1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/684fbc175dc3af5cf1f19c643e8b091cd1642623)) -- **alpha:** Fix alpha issue with oauth konnectors ([c5ffee2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c5ffee2c1e554a4fc76d0906517314f1d7fa91ff)) -- change invisible char by space and add a translation ([49ce0b8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/49ce0b847e8c07b1d1ec19b290d0b19d4bfaf4f1)) -- change the global content height ([d0678b0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d0678b0474c16e59b0ff1f7463078bbea9dd7317)) -- prevent duplicate konnector jobs ([21615d2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/21615d241334faaa02f5b6b17e336a89e80cb070)) -- **profile:** display correctly the navigation in the profile type form for iphone 11 and above ([9d3d180](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9d3d1809821b7c868be5bafa5ff5802b41b1bf7c)) -- update date processing for fluidPrice service ([0a7bbf1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0a7bbf1d8348f40f0baa14a1157ae3d7e8a29cc6)) +- add space in FAQ content ([ddcb262](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ddcb2620384dfc153694823d85f0cd640c90d8b8)) +- adjust height of content on desktop view ([684fbc1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/684fbc175dc3af5cf1f19c643e8b091cd1642623)) +- **alpha:** Fix alpha issue with oauth konnectors ([c5ffee2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c5ffee2c1e554a4fc76d0906517314f1d7fa91ff)) +- change invisible char by space and add a translation ([49ce0b8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/49ce0b847e8c07b1d1ec19b290d0b19d4bfaf4f1)) +- change the global content height ([d0678b0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d0678b0474c16e59b0ff1f7463078bbea9dd7317)) +- prevent duplicate konnector jobs ([21615d2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21615d241334faaa02f5b6b17e336a89e80cb070)) +- **profile:** display correctly the navigation in the profile type form for iphone 11 and above ([9d3d180](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9d3d1809821b7c868be5bafa5ff5802b41b1bf7c)) +- update date processing for fluidPrice service ([0a7bbf1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0a7bbf1d8348f40f0baa14a1157ae3d7e8a29cc6)) -### [1.6.5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.5.0...v1.6.5) (2022-01-13) +### [1.6.5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.5.0...v1.6.5) (2022-01-13) ### Bug Fixes -- adjust height of content on desktop view ([684fbc1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/684fbc175dc3af5cf1f19c643e8b091cd1642623)) -- **assets:** ecogesture 34 has now a square image ([3a993d4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3a993d4fe180901a2aa5687ecf189163d4f7bdf4) -- **profileType:** display correctly the navigation in the profile type form for iphone 11 and above ([9d3d180](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9d3d1809821b7c868be5bafa5ff5802b41b1bf7c)) -- **profileType:** init correctly the date selection in profile type form ([264830c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/264830c40e90bf898dbc91784fe337b525fe5901)) -- **profileType:** issue with previous/next button in the profile type form ([cf957db](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cf957db5f3759544fe8bac45a6ebdb771d19315e)) +- adjust height of content on desktop view ([684fbc1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/684fbc175dc3af5cf1f19c643e8b091cd1642623)) +- **assets:** ecogesture 34 has now a square image ([3a993d4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3a993d4fe180901a2aa5687ecf189163d4f7bdf4) +- **profileType:** display correctly the navigation in the profile type form for iphone 11 and above ([9d3d180](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9d3d1809821b7c868be5bafa5ff5802b41b1bf7c)) +- **profileType:** init correctly the date selection in profile type form ([264830c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/264830c40e90bf898dbc91784fe337b525fe5901)) +- **profileType:** issue with previous/next button in the profile type form ([cf957db](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cf957db5f3759544fe8bac45a6ebdb771d19315e)) -### [1.6.4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.5.0...v1.6.4) (2022-01-11) +### [1.6.4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.5.0...v1.6.4) (2022-01-11) ### Bug Fixes -- increase nb of data to handle for enedis and grdf ([42b1779](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/42b17793d2255048be62270579fbb7e9db176912)) +- increase nb of data to handle for enedis and grdf ([42b1779](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/42b17793d2255048be62270579fbb7e9db176912)) -### [1.6.3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.5.0...v1.6.3) (2022-01-11) +### [1.6.3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.5.0...v1.6.3) (2022-01-11) ### Bug Fixes -- handle correctly the migration schema version ([f89d57e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f89d57e17a540ef907b11a79ba6c8681874d465c)) +- handle correctly the migration schema version ([f89d57e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f89d57e17a540ef907b11a79ba6c8681874d465c)) -### [1.6.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.5.0...v1.6.2) (2022-01-11) +### [1.6.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.5.0...v1.6.2) (2022-01-11) ### Bug Fixes -- remove wrong price from enedis and grdf month and year doctype ([b961103](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b961103bff0a6840ae7f7f254e91b079f8b8850e)) +- remove wrong price from enedis and grdf month and year doctype ([b961103](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b961103bff0a6840ae7f7f254e91b079f8b8850e)) -### [1.6.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.5.0...v1.6.1) (2022-01-11) +### [1.6.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.5.0...v1.6.1) (2022-01-11) ### Features -- **analysis:** Add info modal for special elec card ([931a7e7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/931a7e7ab1ac0b9e42f453cd8c18298f8d2eb173)) -- **Feedback:** user can more easily consult the FAQ before sending its feedback ([994651a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/994651aaf80a7b17fabff3421da3f5566fa87540)) -- **FAQ:** Update FAQ content ([263b7bdf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/commit/263b7bdfc509b3233d9fcd3bdea5a04b237a683e)) +- **analysis:** Add info modal for special elec card ([931a7e7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/931a7e7ab1ac0b9e42f453cd8c18298f8d2eb173)) +- **Feedback:** user can more easily consult the FAQ before sending its feedback ([994651a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/994651aaf80a7b17fabff3421da3f5566fa87540)) +- **FAQ:** Update FAQ content ([263b7bdf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/-/commit/263b7bdfc509b3233d9fcd3bdea5a04b237a683e)) ### Bug Fixes -- add space in FAQ content ([ddcb262](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ddcb2620384dfc153694823d85f0cd640c90d8b8)) -- adjust height of content on desktop view ([684fbc1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/684fbc175dc3af5cf1f19c643e8b091cd1642623)) -- **analysis:** Now displays the correct elec analysis for the first month of a year ([fc6d30c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fc6d30c07d46a577a2d365b9b40e5daf6a5484d1)) -- change invisible char by space and add a translation ([49ce0b8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/49ce0b847e8c07b1d1ec19b290d0b19d4bfaf4f1)) -- **consumption** correct ismulti indicator on the home ([51b2884](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/51b2884323bba258085ff69f46089d3397b0f16e)) -- prevent duplicate konnector jobs ([21615d2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/21615d241334faaa02f5b6b17e336a89e80cb070)) -- **routes:** Refacto route to avoid forcing ([f747cb0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f747cb0e154fdb6b6cd48d68c8c0fb6d05525a7b)) -- **routes:** Refacto route to avoid forcing ([de5e1de](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/de5e1def2ebc2f00a0315c14f298a1ddd35b692f)) +- add space in FAQ content ([ddcb262](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ddcb2620384dfc153694823d85f0cd640c90d8b8)) +- adjust height of content on desktop view ([684fbc1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/684fbc175dc3af5cf1f19c643e8b091cd1642623)) +- **analysis:** Now displays the correct elec analysis for the first month of a year ([fc6d30c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fc6d30c07d46a577a2d365b9b40e5daf6a5484d1)) +- change invisible char by space and add a translation ([49ce0b8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/49ce0b847e8c07b1d1ec19b290d0b19d4bfaf4f1)) +- **consumption** correct ismulti indicator on the home ([51b2884](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/51b2884323bba258085ff69f46089d3397b0f16e)) +- prevent duplicate konnector jobs ([21615d2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21615d241334faaa02f5b6b17e336a89e80cb070)) +- **routes:** Refacto route to avoid forcing ([f747cb0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f747cb0e154fdb6b6cd48d68c8c0fb6d05525a7b)) +- **routes:** Refacto route to avoid forcing ([de5e1de](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/de5e1def2ebc2f00a0315c14f298a1ddd35b692f)) -## [1.6.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.5.0...v1.6.0) (2021-12-21) +## [1.6.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.5.0...v1.6.0) (2021-12-21) ### Features -- add **IS_ALPHA** env in webpack config ([8f60b37](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8f60b376c672e4fea41e70569c198ea90edbec57)) -- **analysis:** Add electricity consumption profile in analysis ([e6b7435](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e6b743553b45b5b4348bbe74e4239afcd28c904a)) -- **ci:** use dependency check ([25024bc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/25024bc0f19ae018147e77f9e912d2a83ec10a7e)) -- **conso:** add price history. A new service running at night is processing fluid data to index the right price on it. ([6fbddff](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6fbddffd65299e26a6d639f5d475df78a3a3dfc0)) -- create partners connection modals ([1dfd4cf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1dfd4cf70ee2e8e5fd4c11965681205b0404715b)) -- **konnectors:** Fix display when konnector is not installed and prevent water consumption alert to be sent in this case ([0e8538b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0e8538b28352bf529871d00f3f5b98a321534a13)) -- **onboarding:** onboarding popup ([9decadc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9decadcbf461692f2b10c392fb71e6e475ab313e)) -- **Partners:** Add partners check modal ([5e1279f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5e1279f4989ed0664dbc96cf0c71f1e5a70dfca3)) -- **Terms:** Add Minor version upgrade support ([c8048e4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c8048e47bfe5e5f5a140eefaa35af07bc6ed6679)) +- add **IS_ALPHA** env in webpack config ([8f60b37](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8f60b376c672e4fea41e70569c198ea90edbec57)) +- **analysis:** Add electricity consumption profile in analysis ([e6b7435](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e6b743553b45b5b4348bbe74e4239afcd28c904a)) +- **ci:** use dependency check ([25024bc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/25024bc0f19ae018147e77f9e912d2a83ec10a7e)) +- **conso:** add price history. A new service running at night is processing fluid data to index the right price on it. ([6fbddff](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6fbddffd65299e26a6d639f5d475df78a3a3dfc0)) +- create partners connection modals ([1dfd4cf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1dfd4cf70ee2e8e5fd4c11965681205b0404715b)) +- **konnectors:** Fix display when konnector is not installed and prevent water consumption alert to be sent in this case ([0e8538b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0e8538b28352bf529871d00f3f5b98a321534a13)) +- **onboarding:** onboarding popup ([9decadc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9decadcbf461692f2b10c392fb71e6e475ab313e)) +- **Partners:** Add partners check modal ([5e1279f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5e1279f4989ed0664dbc96cf0c71f1e5a70dfca3)) +- **Terms:** Add Minor version upgrade support ([c8048e4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c8048e47bfe5e5f5a140eefaa35af07bc6ed6679)) ### Bug Fixes -- **alpha:** Fix alpha issue with oauth konnectors ([c5ffee2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c5ffee2c1e554a4fc76d0906517314f1d7fa91ff)) -- **analysis:** fix previous month display ([b6c82a3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b6c82a3470090d30a56af7d895616754ace58de5)) -- **analysis:** fix setview loop bug ([0ec71a6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0ec71a66e4fd0e2b6d48eff79126b4d8ec385c31)) -- **analysis:** Show no data if no enedis analysis ([2467583](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/24675834e854c480e41fd6b2faa3ddb17bbf81a6)) -- **ci:** delete unused variables ([53c7562](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/53c7562bf8720c4a6e917e65cead62048db2f02a)) -- **ci:** update DOCKER_HOST ([3855c1d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3855c1dc7754bc52f94843f5668b5eb0a0f357e8)) -- **conso:** Fix data offset delay issue and edit number of day displayed when outdated ([fa415ad](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fa415ad6f20f6db16c00d7b1f9c18cfc4a717f45)) -- **design:** Design fixs 1.5.1 konnector modal message + css after completing profile ([3790817](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/379081718f8a302ceb18ea37dca517bd4aa6345b)) -- **newsletter:** Fix month display + symbol revert ([b625561](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b625561b8dd0ad275e2476d72f95e17403e396c1)) -- **newsletter:** Fix month display + symbol revert ([c6e5ad0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c6e5ad0b7b90205fd7e506b817e047be5aec00b3)) -- **PartnersIssue:** Now refresh konnector state when connect konnector and partner issue active ([c3b7412](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c3b74122717c7c8a8674c24b5eca9e8c26db612c)) -- **Quiz:** Jean-Jacques Ruisseau's quiz is no longer stuck in loading ([c1412a3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c1412a3a535adcc150175f794d45ab6c222580b9)) -- review texts for partners connection modals ([0d1b31a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0d1b31ab4e2619f638bd79270d132451ba83f9ec)) -- update date processing for fluidPrice service ([0a7bbf1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0a7bbf1d8348f40f0baa14a1157ae3d7e8a29cc6)) - -### [1.5.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.4.4...v1.5.1) (2021-11-29) +- **alpha:** Fix alpha issue with oauth konnectors ([c5ffee2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c5ffee2c1e554a4fc76d0906517314f1d7fa91ff)) +- **analysis:** fix previous month display ([b6c82a3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b6c82a3470090d30a56af7d895616754ace58de5)) +- **analysis:** fix setview loop bug ([0ec71a6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0ec71a66e4fd0e2b6d48eff79126b4d8ec385c31)) +- **analysis:** Show no data if no enedis analysis ([2467583](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/24675834e854c480e41fd6b2faa3ddb17bbf81a6)) +- **ci:** delete unused variables ([53c7562](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/53c7562bf8720c4a6e917e65cead62048db2f02a)) +- **ci:** update DOCKER_HOST ([3855c1d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3855c1dc7754bc52f94843f5668b5eb0a0f357e8)) +- **conso:** Fix data offset delay issue and edit number of day displayed when outdated ([fa415ad](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fa415ad6f20f6db16c00d7b1f9c18cfc4a717f45)) +- **design:** Design fixs 1.5.1 konnector modal message + css after completing profile ([3790817](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/379081718f8a302ceb18ea37dca517bd4aa6345b)) +- **newsletter:** Fix month display + symbol revert ([b625561](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b625561b8dd0ad275e2476d72f95e17403e396c1)) +- **newsletter:** Fix month display + symbol revert ([c6e5ad0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c6e5ad0b7b90205fd7e506b817e047be5aec00b3)) +- **PartnersIssue:** Now refresh konnector state when connect konnector and partner issue active ([c3b7412](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c3b74122717c7c8a8674c24b5eca9e8c26db612c)) +- **Quiz:** Jean-Jacques Ruisseau's quiz is no longer stuck in loading ([c1412a3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c1412a3a535adcc150175f794d45ab6c222580b9)) +- review texts for partners connection modals ([0d1b31a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0d1b31ab4e2619f638bd79270d132451ba83f9ec)) +- update date processing for fluidPrice service ([0a7bbf1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0a7bbf1d8348f40f0baa14a1157ae3d7e8a29cc6)) + +### [1.5.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.4.4...v1.5.1) (2021-11-29) ### Features -- **Analysis:** Add max day consumption card by fluid ([e0f15b0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e0f15b000b25cf974ffdbef8f523659259dfb36d)) -- **Analysis:** add scroll position save for analysis view ([e1b9a9f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e1b9a9f7364a9bac57df09c6eadf0ce34f114643)) -- **challenge:** Add isBuilding banner to main challenge view ([5371740](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/537174086871abdcc302d7a3028441ab2c58b03e)) -- **conso:** add cursor pointer on areas ([0202811](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0202811189011af0e394f130f100e364d20eaeb7)) -- **ProfileType:** Handling profileTypes modifications over time ([f6e9bec](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f6e9bec60486632d798b2fbd8d2e145a0b066cfc)) -- **water-alert:** new design for water threshold notification ([107455c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/107455cead293b19031ea07a3a406b1fdac3475e)) +- **Analysis:** Add max day consumption card by fluid ([e0f15b0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e0f15b000b25cf974ffdbef8f523659259dfb36d)) +- **Analysis:** add scroll position save for analysis view ([e1b9a9f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e1b9a9f7364a9bac57df09c6eadf0ce34f114643)) +- **challenge:** Add isBuilding banner to main challenge view ([5371740](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/537174086871abdcc302d7a3028441ab2c58b03e)) +- **conso:** add cursor pointer on areas ([0202811](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0202811189011af0e394f130f100e364d20eaeb7)) +- **ProfileType:** Handling profileTypes modifications over time ([f6e9bec](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f6e9bec60486632d798b2fbd8d2e145a0b066cfc)) +- **water-alert:** new design for water threshold notification ([107455c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/107455cead293b19031ea07a3a406b1fdac3475e)) ### Bug Fixes -- **analysis:** alignment fluid name maxcons card when no fluid ([a538eaf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a538eaf5e7fe8d78952a7c9a717bf5c211fd74ef)) -- **Analysis:** fix css overflow issue and prevent display of total analysis when only one fluid ([5900e3b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5900e3b566cef4e27cc4405a7f517a16e48718ca)) -- **analysis:** fix no data display on maxcons card + price alignment ([6916544](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6916544cdfaf4d33865d5f2edc5ba94aa70e0aa5)) -- **Analysis:** fix total consumption card display ([3f9923b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3f9923bd1f8b4759c75c1d51673cdc7b71eca9bb)) -- **Analysis:** z-index to allow click on link ([a2e449d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a2e449d30ef5559317653278cf985a5ba090616f)) -- **Challenge:** fix challenge title and banner display, it was overflowing on header. ([2ad925a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2ad925af32694214b64a8dde10512c32bf547744)) -- **conso:** Disable half hour check if fluid different from elec ([743e29f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/743e29f235d0c856e2983a84cd6906271599d907)) -- **conso:** Display full price for multifluid if > 1000€ ([6f9cc7e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6f9cc7eefc6f27ee13fa47b5456d1473b63d4846)) -- **conso:** Fix message shuffling in konnector modal ([2680d10](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2680d10978ab6e74a741f1c1b567d7c29eb0b0a2)) -- **design:** Design fixs 1.5.1 konnector modal message + css after completing profile ([3790817](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/379081718f8a302ceb18ea37dca517bd4aa6345b)) -- **design:** fix global design issue + design improvements on analysis and consumption ([2218079](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2218079da0635432426c355378b7e863e2731b4a)) -- **Design:** text color and alignement on profil analysis card ([f5fd8f9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f5fd8f9803ca162ff71d4a6a2c1b0197d111f068)) -- **design:** various design return ([1532b2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1532b2f2590fa69d40226feeaf6c2ea63e0a7f32)) -- **Desing:** background color ([8d2d975](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8d2d975d7a8b56284a11dfdd6c94674e66072ee3)) -- **Ecogesture:** add equipment type for ecogesture 52 ([d9b8249](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9b82494549b9cd5e95dccb5c43663973e5a596f)) -- **form:** Add autofocus ([5a09943](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5a09943ac2119f1ae09b415a0d92bcba85318696)) -- **Mail:** fix month query for newsletter, we had one month offset that is no longer required ([c837ad7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c837ad75f4b9449b28f8616b95da1a7066744fe9)) -- price estimation pop-up fluid order ([f516e89](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f516e89ca58309ca72a826d9eff061923beee16a)) -- Scroll to top on every page navigation ([b718bc7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b718bc7d2538f252c744cbeb435aad0f050be9de)) -- tu ([7faa1c1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7faa1c13f226a92ff5f79fd9269f669010fe4a50)) - -## [1.5.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.4.4...v1.5.0) (2021-11-29) +- **analysis:** alignment fluid name maxcons card when no fluid ([a538eaf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a538eaf5e7fe8d78952a7c9a717bf5c211fd74ef)) +- **Analysis:** fix css overflow issue and prevent display of total analysis when only one fluid ([5900e3b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5900e3b566cef4e27cc4405a7f517a16e48718ca)) +- **analysis:** fix no data display on maxcons card + price alignment ([6916544](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6916544cdfaf4d33865d5f2edc5ba94aa70e0aa5)) +- **Analysis:** fix total consumption card display ([3f9923b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3f9923bd1f8b4759c75c1d51673cdc7b71eca9bb)) +- **Analysis:** z-index to allow click on link ([a2e449d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a2e449d30ef5559317653278cf985a5ba090616f)) +- **Challenge:** fix challenge title and banner display, it was overflowing on header. ([2ad925a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2ad925af32694214b64a8dde10512c32bf547744)) +- **conso:** Disable half hour check if fluid different from elec ([743e29f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/743e29f235d0c856e2983a84cd6906271599d907)) +- **conso:** Display full price for multifluid if > 1000€ ([6f9cc7e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6f9cc7eefc6f27ee13fa47b5456d1473b63d4846)) +- **conso:** Fix message shuffling in konnector modal ([2680d10](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2680d10978ab6e74a741f1c1b567d7c29eb0b0a2)) +- **design:** Design fixs 1.5.1 konnector modal message + css after completing profile ([3790817](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/379081718f8a302ceb18ea37dca517bd4aa6345b)) +- **design:** fix global design issue + design improvements on analysis and consumption ([2218079](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2218079da0635432426c355378b7e863e2731b4a)) +- **Design:** text color and alignement on profil analysis card ([f5fd8f9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f5fd8f9803ca162ff71d4a6a2c1b0197d111f068)) +- **design:** various design return ([1532b2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1532b2f2590fa69d40226feeaf6c2ea63e0a7f32)) +- **Desing:** background color ([8d2d975](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8d2d975d7a8b56284a11dfdd6c94674e66072ee3)) +- **Ecogesture:** add equipment type for ecogesture 52 ([d9b8249](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d9b82494549b9cd5e95dccb5c43663973e5a596f)) +- **form:** Add autofocus ([5a09943](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5a09943ac2119f1ae09b415a0d92bcba85318696)) +- **Mail:** fix month query for newsletter, we had one month offset that is no longer required ([c837ad7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c837ad75f4b9449b28f8616b95da1a7066744fe9)) +- price estimation pop-up fluid order ([f516e89](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f516e89ca58309ca72a826d9eff061923beee16a)) +- Scroll to top on every page navigation ([b718bc7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b718bc7d2538f252c744cbeb435aad0f050be9de)) +- tu ([7faa1c1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7faa1c13f226a92ff5f79fd9269f669010fe4a50)) + +## [1.5.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.4.4...v1.5.0) (2021-11-29) ### Features -- **Analysis:** Add max day consumption card by fluid ([e0f15b0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e0f15b000b25cf974ffdbef8f523659259dfb36d)) -- **Analysis:** add scroll position save for analysis view ([e1b9a9f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e1b9a9f7364a9bac57df09c6eadf0ce34f114643)) -- **Challenge:** Add isBuilding banner to main challenge view ([5371740](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/537174086871abdcc302d7a3028441ab2c58b03e)) -- **Conso:** add cursor pointer on areas ([0202811](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0202811189011af0e394f130f100e364d20eaeb7)) -- **ProfileType:** Handling profileTypes modifications over time ([f6e9bec](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f6e9bec60486632d798b2fbd8d2e145a0b066cfc)) -- **Water-alert:** new design for water threshold notification ([107455c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/107455cead293b19031ea07a3a406b1fdac3475e)) +- **Analysis:** Add max day consumption card by fluid ([e0f15b0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e0f15b000b25cf974ffdbef8f523659259dfb36d)) +- **Analysis:** add scroll position save for analysis view ([e1b9a9f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e1b9a9f7364a9bac57df09c6eadf0ce34f114643)) +- **Challenge:** Add isBuilding banner to main challenge view ([5371740](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/537174086871abdcc302d7a3028441ab2c58b03e)) +- **Conso:** add cursor pointer on areas ([0202811](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0202811189011af0e394f130f100e364d20eaeb7)) +- **ProfileType:** Handling profileTypes modifications over time ([f6e9bec](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f6e9bec60486632d798b2fbd8d2e145a0b066cfc)) +- **Water-alert:** new design for water threshold notification ([107455c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/107455cead293b19031ea07a3a406b1fdac3475e)) ### Bug Fixes -- **Analysis:** alignment fluid name maxcons card when no fluid ([a538eaf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a538eaf5e7fe8d78952a7c9a717bf5c211fd74ef)) -- **Analysis:** fix css overflow issue and prevent display of total analysis when only one fluid ([5900e3b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5900e3b566cef4e27cc4405a7f517a16e48718ca)) -- **Analysis:** fix no data display on maxcons card + price alignment ([6916544](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6916544cdfaf4d33865d5f2edc5ba94aa70e0aa5)) -- **Analysis:** fix total consumption card display ([3f9923b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3f9923bd1f8b4759c75c1d51673cdc7b71eca9bb)) -- **Analysis:** z-index to allow click on link ([a2e449d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a2e449d30ef5559317653278cf985a5ba090616f)) -- **Challenge:** fix challenge title and banner display, it was overflowing on header. ([2ad925a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2ad925af32694214b64a8dde10512c32bf547744)) -- **Conso:** Disable half hour check if fluid different from elec ([743e29f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/743e29f235d0c856e2983a84cd6906271599d907)) -- **Conso:** Display full price for multifluid if > 1000€ ([6f9cc7e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6f9cc7eefc6f27ee13fa47b5456d1473b63d4846)) -- **Conso:** Fix message shuffling in konnector modal ([2680d10](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2680d10978ab6e74a741f1c1b567d7c29eb0b0a2)) -- **Design:** fix global design issue + design improvements on analysis and consumption ([2218079](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2218079da0635432426c355378b7e863e2731b4a)) -- **Design:** text color and alignement on profil analysis card ([f5fd8f9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f5fd8f9803ca162ff71d4a6a2c1b0197d111f068)) -- **Design:** various design return ([1532b2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1532b2f2590fa69d40226feeaf6c2ea63e0a7f32)) -- **Desing:** background color ([8d2d975](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8d2d975d7a8b56284a11dfdd6c94674e66072ee3)) -- **Ecogesture:** add equipment type for ecogesture 52 ([d9b8249](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9b82494549b9cd5e95dccb5c43663973e5a596f)) -- **Form:** Add autofocus ([5a09943](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5a09943ac2119f1ae09b415a0d92bcba85318696)) -- **Mail:** fix month query for newsletter, we had one month offset that is no longer required ([c837ad7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c837ad75f4b9449b28f8616b95da1a7066744fe9)) -- price estimation pop-up fluid order ([f516e89](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f516e89ca58309ca72a826d9eff061923beee16a)) -- Scroll to top on every page navigation ([b718bc7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b718bc7d2538f252c744cbeb435aad0f050be9de)) - -### [1.4.4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.4.3...v1.4.4) (2021-11-10) +- **Analysis:** alignment fluid name maxcons card when no fluid ([a538eaf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a538eaf5e7fe8d78952a7c9a717bf5c211fd74ef)) +- **Analysis:** fix css overflow issue and prevent display of total analysis when only one fluid ([5900e3b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5900e3b566cef4e27cc4405a7f517a16e48718ca)) +- **Analysis:** fix no data display on maxcons card + price alignment ([6916544](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6916544cdfaf4d33865d5f2edc5ba94aa70e0aa5)) +- **Analysis:** fix total consumption card display ([3f9923b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3f9923bd1f8b4759c75c1d51673cdc7b71eca9bb)) +- **Analysis:** z-index to allow click on link ([a2e449d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a2e449d30ef5559317653278cf985a5ba090616f)) +- **Challenge:** fix challenge title and banner display, it was overflowing on header. ([2ad925a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2ad925af32694214b64a8dde10512c32bf547744)) +- **Conso:** Disable half hour check if fluid different from elec ([743e29f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/743e29f235d0c856e2983a84cd6906271599d907)) +- **Conso:** Display full price for multifluid if > 1000€ ([6f9cc7e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6f9cc7eefc6f27ee13fa47b5456d1473b63d4846)) +- **Conso:** Fix message shuffling in konnector modal ([2680d10](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2680d10978ab6e74a741f1c1b567d7c29eb0b0a2)) +- **Design:** fix global design issue + design improvements on analysis and consumption ([2218079](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2218079da0635432426c355378b7e863e2731b4a)) +- **Design:** text color and alignement on profil analysis card ([f5fd8f9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f5fd8f9803ca162ff71d4a6a2c1b0197d111f068)) +- **Design:** various design return ([1532b2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1532b2f2590fa69d40226feeaf6c2ea63e0a7f32)) +- **Desing:** background color ([8d2d975](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8d2d975d7a8b56284a11dfdd6c94674e66072ee3)) +- **Ecogesture:** add equipment type for ecogesture 52 ([d9b8249](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d9b82494549b9cd5e95dccb5c43663973e5a596f)) +- **Form:** Add autofocus ([5a09943](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5a09943ac2119f1ae09b415a0d92bcba85318696)) +- **Mail:** fix month query for newsletter, we had one month offset that is no longer required ([c837ad7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c837ad75f4b9449b28f8616b95da1a7066744fe9)) +- price estimation pop-up fluid order ([f516e89](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f516e89ca58309ca72a826d9eff061923beee16a)) +- Scroll to top on every page navigation ([b718bc7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b718bc7d2538f252c744cbeb435aad0f050be9de)) + +### [1.4.4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.4.3...v1.4.4) (2021-11-10) ### Features -- **analysis:** Add new pie chart section ([20ecfec](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/20ecfec1877039bd0723c30b49cdc1f2ff410c39)) -- **Analysis:** update analysis card ([234109e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/234109ef12255768521ea3b848cc0692602b6620)) -- **faq:** Add 2 more answers about data questions ([3af8f80](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3af8f808348610148811821e91d396f71f3c4bb6)) -- **HalfHour:** Edited text related to half hour harvest activation ([46dd6f2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/46dd6f28175c262d1f6f83c81a203f181c60b707)) -- **profileType:** Now user can choose fuel or wood as warming type ([82457f9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/82457f9864c70632d2daca180c2d5e9dd8848803)) -- scaffolding for new analysis page ([8842ba7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8842ba74d51aeac8e57679f92c92f35bd0f8c808)) +- **analysis:** Add new pie chart section ([20ecfec](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/20ecfec1877039bd0723c30b49cdc1f2ff410c39)) +- **Analysis:** update analysis card ([234109e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/234109ef12255768521ea3b848cc0692602b6620)) +- **faq:** Add 2 more answers about data questions ([3af8f80](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3af8f808348610148811821e91d396f71f3c4bb6)) +- **HalfHour:** Edited text related to half hour harvest activation ([46dd6f2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/46dd6f28175c262d1f6f83c81a203f181c60b707)) +- **profileType:** Now user can choose fuel or wood as warming type ([82457f9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/82457f9864c70632d2daca180c2d5e9dd8848803)) +- scaffolding for new analysis page ([8842ba7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8842ba74d51aeac8e57679f92c92f35bd0f8c808)) ### Bug Fixes -- **analysis:** error-modal-horizontal-scroll ([8713da4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8713da476bc378954dcee4d8c007ae1e194b6d29)) -- **Cicd:** rollback dependency proxy due to 403 issue when pulling images ([38607cf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/38607cf29034ba4cfed78d3d50e606ad7c0c5508)) -- **conso:** update konnector card if refresh data ([1fdf29d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1fdf29dbd1c3692ac28c22a32845e60029da2d41)) -- **design:** update small design issues ([15c5ab5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/15c5ab5c28577ff46d2deca2321f1bbbb34efd30)) -- **Email:** update consumptionAlert link ([8317107](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8317107c4c01aa73853b350453f8d5ccb0b4e6ef)) -- **tests:** release notes store tests ([a2b8650](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a2b86503de5cac6dc488a04234c2127a62fd79ad)) +- **analysis:** error-modal-horizontal-scroll ([8713da4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8713da476bc378954dcee4d8c007ae1e194b6d29)) +- **Cicd:** rollback dependency proxy due to 403 issue when pulling images ([38607cf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/38607cf29034ba4cfed78d3d50e606ad7c0c5508)) +- **conso:** update konnector card if refresh data ([1fdf29d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1fdf29dbd1c3692ac28c22a32845e60029da2d41)) +- **design:** update small design issues ([15c5ab5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/15c5ab5c28577ff46d2deca2321f1bbbb34efd30)) +- **Email:** update consumptionAlert link ([8317107](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8317107c4c01aa73853b350453f8d5ccb0b4e6ef)) +- **tests:** release notes store tests ([a2b8650](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a2b86503de5cac6dc488a04234c2127a62fd79ad)) -### [1.4.3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.4.2...v1.4.3) (2021-11-09) +### [1.4.3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.4.2...v1.4.3) (2021-11-09) ### Features -- **ReleaseNotes:** Added a release note modal to show user new functional evolution after updating ([8df5cce](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8df5cce304873b91fae59dbb463134b2acd2687f)) +- **ReleaseNotes:** Added a release note modal to show user new functional evolution after updating ([8df5cce](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8df5cce304873b91fae59dbb463134b2acd2687f)) ### Bug Fixes -- **dacc:** bad indicator format ([2a5fd27](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2a5fd278262920d8568e4a2442d08ef936c812e8)) -- **Faq:** fix faq html links ([21d7c2e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/21d7c2e34a2e6775dfbc40db36d5b3c91ed02824)) +- **dacc:** bad indicator format ([2a5fd27](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2a5fd278262920d8568e4a2442d08ef936c812e8)) +- **Faq:** fix faq html links ([21d7c2e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21d7c2e34a2e6775dfbc40db36d5b3c91ed02824)) -### [1.4.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.4.0...v1.4.2) (2021-11-03) +### [1.4.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.4.0...v1.4.2) (2021-11-03) ### Features -- **conso:** Comparison graph now scales on comparison data if no actual data instead of default scale ([18c12b7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/18c12b718c476381c1044fc1cfa1e729290660f1)) -- **conso:** Display timestep names in timeStepSelector except for very small screens ([8660adc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8660adc6010642b6307b2578b7602b1a91d82038)) -- **ProfileType:** First profileType created by user acts as default ([6d41cb2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6d41cb247bf677b0136aafb3385763db5be859ec)) +- **conso:** Comparison graph now scales on comparison data if no actual data instead of default scale ([18c12b7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/18c12b718c476381c1044fc1cfa1e729290660f1)) +- **conso:** Display timestep names in timeStepSelector except for very small screens ([8660adc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8660adc6010642b6307b2578b7602b1a91d82038)) +- **ProfileType:** First profileType created by user acts as default ([6d41cb2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6d41cb247bf677b0136aafb3385763db5be859ec)) ### Bug Fixes -- **Analysis:** Fix analysis navigation and bad month issue ([fe9f212](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fe9f21237950bc3e4ac1462b1ee1eaf5baaf71ff)) -- **analysis:** Prevent user to quit the app if he has no fluid connected and open analysis page without navigate in the app before ([5f6b30b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5f6b30bbbaa64623eccb985d5746d5c7412cf9fc)) -- **conso:** Refresh fluidButtons state when konnector update ([44ff1a0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/44ff1a0bd2c8753d04b0915b96cf675d5ddef940)) -- **conso:** remove lastdatadate check from multifluid ([a735e14](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a735e14df3465e684205a7f4879b76fbd665acc6)) -- **conso:** Replace png error picto with svg and display it in konnector card if outdated data ([2e4f959](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2e4f959a70edc303b3ec305274b7349bce606cc3)) -- **energyPrices:** Fixed price updated date from 06 to 08 ([683f003](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/683f00303b97532a1fbf9541292394fe82ef1253)) -- **konnector:** prevent modal to show success message when login success event and show form in background while loading data ([7818e59](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7818e59d03e77f2883e362762edf123e54fefa59)) +- **Analysis:** Fix analysis navigation and bad month issue ([fe9f212](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fe9f21237950bc3e4ac1462b1ee1eaf5baaf71ff)) +- **analysis:** Prevent user to quit the app if he has no fluid connected and open analysis page without navigate in the app before ([5f6b30b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5f6b30bbbaa64623eccb985d5746d5c7412cf9fc)) +- **conso:** Refresh fluidButtons state when konnector update ([44ff1a0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/44ff1a0bd2c8753d04b0915b96cf675d5ddef940)) +- **conso:** remove lastdatadate check from multifluid ([a735e14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a735e14df3465e684205a7f4879b76fbd665acc6)) +- **conso:** Replace png error picto with svg and display it in konnector card if outdated data ([2e4f959](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e4f959a70edc303b3ec305274b7349bce606cc3)) +- **energyPrices:** Fixed price updated date from 06 to 08 ([683f003](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/683f00303b97532a1fbf9541292394fe82ef1253)) +- **konnector:** prevent modal to show success message when login success event and show form in background while loading data ([7818e59](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7818e59d03e77f2883e362762edf123e54fefa59)) -### [1.4.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.4.0...v1.4.2) (2021-11-03) +### [1.4.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.4.0...v1.4.2) (2021-11-03) ### Features -- **Conso:** Comparison graph now scales on comparison data if no actual data instead of default scale ([18c12b7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/18c12b718c476381c1044fc1cfa1e729290660f1)) -- **Conso:** Display timestep names in timeStepSelector except for very small screens ([8660adc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8660adc6010642b6307b2578b7602b1a91d82038)) -- **ProfileType:** First profileType created by user acts as default ([6d41cb2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6d41cb247bf677b0136aafb3385763db5be859ec)) +- **Conso:** Comparison graph now scales on comparison data if no actual data instead of default scale ([18c12b7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/18c12b718c476381c1044fc1cfa1e729290660f1)) +- **Conso:** Display timestep names in timeStepSelector except for very small screens ([8660adc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8660adc6010642b6307b2578b7602b1a91d82038)) +- **ProfileType:** First profileType created by user acts as default ([6d41cb2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6d41cb247bf677b0136aafb3385763db5be859ec)) ### Bug Fixes -- **Analysis:** Fix analysis navigation and bad month issue ([fe9f212](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fe9f21237950bc3e4ac1462b1ee1eaf5baaf71ff)) -- **Analysis:** Prevent user to quit the app if he has no fluid connected and open analysis page without navigate in the app before ([5f6b30b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5f6b30bbbaa64623eccb985d5746d5c7412cf9fc)) -- **Conso:** Refresh fluidButtons state when konnector update ([44ff1a0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/44ff1a0bd2c8753d04b0915b96cf675d5ddef940)) -- **Conso:** remove lastdatadate check from multifluid ([a735e14](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a735e14df3465e684205a7f4879b76fbd665acc6)) -- **Conso:** Replace png error picto with svg and display it in konnector card if outdated data ([2e4f959](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2e4f959a70edc303b3ec305274b7349bce606cc3)) -- **EnergyPrices:** Fixed price updated date from 06 to 08 ([683f003](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/683f00303b97532a1fbf9541292394fe82ef1253)) -- **Konnector:** prevent modal to show success message when login success event and show form in background while loading data ([7818e59](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7818e59d03e77f2883e362762edf123e54fefa59)) +- **Analysis:** Fix analysis navigation and bad month issue ([fe9f212](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fe9f21237950bc3e4ac1462b1ee1eaf5baaf71ff)) +- **Analysis:** Prevent user to quit the app if he has no fluid connected and open analysis page without navigate in the app before ([5f6b30b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5f6b30bbbaa64623eccb985d5746d5c7412cf9fc)) +- **Conso:** Refresh fluidButtons state when konnector update ([44ff1a0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/44ff1a0bd2c8753d04b0915b96cf675d5ddef940)) +- **Conso:** remove lastdatadate check from multifluid ([a735e14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a735e14df3465e684205a7f4879b76fbd665acc6)) +- **Conso:** Replace png error picto with svg and display it in konnector card if outdated data ([2e4f959](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e4f959a70edc303b3ec305274b7349bce606cc3)) +- **EnergyPrices:** Fixed price updated date from 06 to 08 ([683f003](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/683f00303b97532a1fbf9541292394fe82ef1253)) +- **Konnector:** prevent modal to show success message when login success event and show form in background while loading data ([7818e59](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7818e59d03e77f2883e362762edf123e54fefa59)) -### [1.4.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.4.0...v1.4.1) (2021-10-29) +### [1.4.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.4.0...v1.4.1) (2021-10-29) ### Features -- **Conso:** Comparison graph now scales on comparison data if no actual data instead of default scale ([18c12b7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/18c12b718c476381c1044fc1cfa1e729290660f1)) -- **Conso:** Display timestep names in timeStepSelector except for very small screens ([8660adc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8660adc6010642b6307b2578b7602b1a91d82038)) -- **ProfileType:** First profileType created by user acts now as default ([6d41cb2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6d41cb247bf677b0136aafb3385763db5be859ec)) +- **Conso:** Comparison graph now scales on comparison data if no actual data instead of default scale ([18c12b7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/18c12b718c476381c1044fc1cfa1e729290660f1)) +- **Conso:** Display timestep names in timeStepSelector except for very small screens ([8660adc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8660adc6010642b6307b2578b7602b1a91d82038)) +- **ProfileType:** First profileType created by user acts now as default ([6d41cb2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6d41cb247bf677b0136aafb3385763db5be859ec)) ### Bug Fixes -- **Analysis:** Fix analysis navigation and bad month issue ([fe9f212](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fe9f21237950bc3e4ac1462b1ee1eaf5baaf71ff)) -- **Conso:** remove lastdatadate check from multifluid ([a735e14](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a735e14df3465e684205a7f4879b76fbd665acc6)) -- **Conso:** Replace png error picto with svg and display it in konnector card if outdated data ([2e4f959](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2e4f959a70edc303b3ec305274b7349bce606cc3)) -- **Konnector:** prevent modal to show success message when login success event and show form in background while loading data ([7818e59](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7818e59d03e77f2883e362762edf123e54fefa59)) +- **Analysis:** Fix analysis navigation and bad month issue ([fe9f212](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fe9f21237950bc3e4ac1462b1ee1eaf5baaf71ff)) +- **Conso:** remove lastdatadate check from multifluid ([a735e14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a735e14df3465e684205a7f4879b76fbd665acc6)) +- **Conso:** Replace png error picto with svg and display it in konnector card if outdated data ([2e4f959](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e4f959a70edc303b3ec305274b7349bce606cc3)) +- **Konnector:** prevent modal to show success message when login success event and show form in background while loading data ([7818e59](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7818e59d03e77f2883e362762edf123e54fefa59)) -## [1.4.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.3.0...v1.4.0) (2021-10-26) +## [1.4.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.3.0...v1.4.0) (2021-10-26) ### ⚠BREAKING CHANGES @@ -475,96 +531,96 @@ All notable changes to this project will be documented in this file. See [standa ### Features -- add multifluid compare ([ac73962](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ac73962f4f49aba0c34f3850c213b1471a0d5649)) -- **BarChart:** new striped chart bars when data is missing ([e0d19f4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e0d19f477f912a73c1a1329345681cd72607e3bc)) -- **Chart:** Delay gas data display in charts by 1 more day (J+3) ([9af1aec](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9af1aecd40a590d540cdf3b3b767a3093a81497a)) -- **Conso:** Add new display rules for missing data in the consumption visualizer and in konnector cards ([28ea281](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/28ea2817f317792afa71e2be68715435aff69aa6)) -- **Conso:** Add price estimation modal for multifluid screen ([810507e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/810507e5e8b3ffe1a8b39e7ee8cd34bfca5d4974)) -- **Conso:** Add today button ([b0244ee](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b0244ee370806992d0b63ddaed7e2d4dc7b06997)) -- **Conso:** Delete double navigation arrows ([228969f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/228969fb7fecd8b98ce182fe4c704d49f902fc64)) -- **Conso:** Display missing data text if not data and redirects to konnector update on click ([ca9a55f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ca9a55fa9af9f1ba400d99fad6aa7e88c642c761)) -- **Conso:** Rework fluid navigation ([a63b2de](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a63b2de45f9af41b5089467390760221f8797599)) -- **Conso**: last valid date not displayed for old values ([d685ca6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d685ca60091587d71a071a743fbfa48c0a38867a)) -- **Egl-login-form:** Changed rules to limit to 7 digits ([bccdef8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bccdef8ff1c24886585a2ce1a80979de87b93474)) -- **Energy-prices:** edited new energy prices ([aae16d5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/aae16d5e437c8b9f38cc73e758dec41c2dbec259)) +- add multifluid compare ([ac73962](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ac73962f4f49aba0c34f3850c213b1471a0d5649)) +- **BarChart:** new striped chart bars when data is missing ([e0d19f4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e0d19f477f912a73c1a1329345681cd72607e3bc)) +- **Chart:** Delay gas data display in charts by 1 more day (J+3) ([9af1aec](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9af1aecd40a590d540cdf3b3b767a3093a81497a)) +- **Conso:** Add new display rules for missing data in the consumption visualizer and in konnector cards ([28ea281](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/28ea2817f317792afa71e2be68715435aff69aa6)) +- **Conso:** Add price estimation modal for multifluid screen ([810507e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/810507e5e8b3ffe1a8b39e7ee8cd34bfca5d4974)) +- **Conso:** Add today button ([b0244ee](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b0244ee370806992d0b63ddaed7e2d4dc7b06997)) +- **Conso:** Delete double navigation arrows ([228969f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/228969fb7fecd8b98ce182fe4c704d49f902fc64)) +- **Conso:** Display missing data text if not data and redirects to konnector update on click ([ca9a55f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ca9a55fa9af9f1ba400d99fad6aa7e88c642c761)) +- **Conso:** Rework fluid navigation ([a63b2de](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a63b2de45f9af41b5089467390760221f8797599)) +- **Conso**: last valid date not displayed for old values ([d685ca6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d685ca60091587d71a071a743fbfa48c0a38867a)) +- **Egl-login-form:** Changed rules to limit to 7 digits ([bccdef8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bccdef8ff1c24886585a2ce1a80979de87b93474)) +- **Energy-prices:** edited new energy prices ([aae16d5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/aae16d5e437c8b9f38cc73e758dec41c2dbec259)) ### Bug Fixes -- change estimation pop-up text ([ebf1534](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ebf1534b4ea4c9fe8a40620ccfd4de114f50e93a)) -- **Chart:** Show Comparison if no current dataload but there is comparison data ([d0b396b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d0b396b26dbfd985a2e6c485dc14ac895abf65d7)) -- **Chart:** Show Comparison if no current dataload but there is comparison data ([b042b79](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b042b795400964e1e128f014b8fa69b523579ca5)) -- **Conso:** Change display when datahole in multifluid ([17c9e32](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/17c9e32dd04fc1f997042f941af021fc1953a896)) -- date display issue on last valid date ([068581b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/068581bee024f970ab8c41231eb0faf3192ca0ee)) -- design issues on multifluid view for compare ([16f48d8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/16f48d8d0c996aaa5538d3c8c8c2b1bd6a9f5294)) -- load has to be over zero too ([e106f5b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e106f5bc04d0dcc73448f07f0c4abb31a03928b4)) -- **LoadConverter:** Loads below 0.01cts now equal 0.01cts ([b0b3cb9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b0b3cb9a2073103a5ae8a0d728a3e84f237228cd)) -- **Options:** Change section and button spacing ([e7fa061](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e7fa061ea948936e90dfb2a4789d5840f2d777c5)) -- **TimePeriod:** Test + use config dataOffset value ([8dbca9d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8dbca9dfc4a7bca10991d618f6b318d9e8b08181)) +- change estimation pop-up text ([ebf1534](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ebf1534b4ea4c9fe8a40620ccfd4de114f50e93a)) +- **Chart:** Show Comparison if no current dataload but there is comparison data ([d0b396b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d0b396b26dbfd985a2e6c485dc14ac895abf65d7)) +- **Chart:** Show Comparison if no current dataload but there is comparison data ([b042b79](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b042b795400964e1e128f014b8fa69b523579ca5)) +- **Conso:** Change display when datahole in multifluid ([17c9e32](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/17c9e32dd04fc1f997042f941af021fc1953a896)) +- date display issue on last valid date ([068581b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/068581bee024f970ab8c41231eb0faf3192ca0ee)) +- design issues on multifluid view for compare ([16f48d8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/16f48d8d0c996aaa5538d3c8c8c2b1bd6a9f5294)) +- load has to be over zero too ([e106f5b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e106f5bc04d0dcc73448f07f0c4abb31a03928b4)) +- **LoadConverter:** Loads below 0.01cts now equal 0.01cts ([b0b3cb9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b0b3cb9a2073103a5ae8a0d728a3e84f237228cd)) +- **Options:** Change section and button spacing ([e7fa061](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e7fa061ea948936e90dfb2a4789d5840f2d777c5)) +- **TimePeriod:** Test + use config dataOffset value ([8dbca9d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8dbca9dfc4a7bca10991d618f6b318d9e8b08181)) -## [1.3.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.2.4...v1.3.0) (2021-10-26) +## [1.3.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.2.4...v1.3.0) (2021-10-26) ### Features -- add ecogestures season display ([31bda81](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/31bda8173ff4b14598df0248f467e253348392aa)) -- **Alert-consumption:** water consumption alert notification ([4362589](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4362589ba70b86732f17db01d54a323913affcb7)) -- **Assets:** Added Dockerfile to convert and bundle assets in a container for Ecolyo Agent ([15fe04c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/15fe04c0f2dd49728b86322716624bc671174243)) -- **CICD:** update image repo to work with proxy ([e067ea1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e067ea1e09f687f48635907a4fb4a953e95aa22e)) -- **Ecogestures:** new designs and texts for ecogestures ([923f451](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/923f451abf8e05acc01c8dd0c63fc4af4019a65f)) -- **Email:** add new templating with ejs and mjml. ([2402c40](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2402c4063e3089e4a9a428a2f220e5c545f69999)) -- migration stack added ([ac71930](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ac71930be8013182c767c5309cdd503daceb5491)) +- add ecogestures season display ([31bda81](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/31bda8173ff4b14598df0248f467e253348392aa)) +- **Alert-consumption:** water consumption alert notification ([4362589](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4362589ba70b86732f17db01d54a323913affcb7)) +- **Assets:** Added Dockerfile to convert and bundle assets in a container for Ecolyo Agent ([15fe04c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/15fe04c0f2dd49728b86322716624bc671174243)) +- **CICD:** update image repo to work with proxy ([e067ea1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e067ea1e09f687f48635907a4fb4a953e95aa22e)) +- **Ecogestures:** new designs and texts for ecogestures ([923f451](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/923f451abf8e05acc01c8dd0c63fc4af4019a65f)) +- **Email:** add new templating with ejs and mjml. ([2402c40](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2402c4063e3089e4a9a428a2f220e5c545f69999)) +- migration stack added ([ac71930](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ac71930be8013182c767c5309cdd503daceb5491)) ### Bug Fixes -- **Assets:** changed assets file tree in Dockerfile ([7609bc4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7609bc4b3a04db7929c5ce34e0f6ecf4f0bd538d)) -- **Challenge:** Improve challenge cards display for small screens ([39e1fa0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/39e1fa005881393bbec3af2a8e371b4def36536d)) -- Change ecogesture card size for desktop ([8b17302](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8b17302b330bef87ab55a6fffa7f7c7bfb3fe6e4)) -- **CICD:** add proxy config ([e01545c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e01545c6d1d2835efc4dbf31388baf1674f7e6a5)) -- **Conso:** Change text for annual comparison ([e313f1e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e313f1e8622d7c0ee43522b51c0e1347bb796326)) -- **Conso:** Change text for annual comparison ([766e55d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/766e55ddadd77f1f5a0c418d76691ad8c0781b12)) -- **DACC:** issue on event-duration event, group3 was not defined ([6e67ca6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6e67ca60626e469b222ae6ea8bb32416482eb6d9)) -- **Ecogesture:** ecogestures with no season are now on top when season is fall or spring ([a6a5a7e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a6a5a7ef0f674c6151769259366afdba8fabe754)) -- **Ecogestures:** fix default displayed text + broken display ([ac687f4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ac687f4b368953a95eca7ddb2c00dbc5aa290a89)) -- **Email:** change assets from .svg to .png and update mail titles and content ([e090b34](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e090b34d5e015c47c11a878974c9e128e3066878)) -- **Email:** link with image alignment ([229ff09](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/229ff09db2bcd22e9a6e6ae8365d91e8bd61c6c6)) -- **Email:** missing assets for email rendering + switch link to remote doctype ([215a327](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/215a3279f4373cdb211ed035fb22e82fc6ee5720)) -- **Email:** small design issues ([566888a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/566888a4bacdf935c7c3c963d9e7101915c3e26b)) -- **Email:** update font handling + issue on title ([c8f3465](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c8f346506ea8ae0613a5c80a4c4dcd5e9967b7b6)) -- **Email:** update mail title ([254dde1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/254dde13edc73778bc9cc45d4d22ee84a102fd20)) -- **Email:** update typo handling ([477adce](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/477adcef971561ba422c7c2c0bb992685078aa55)) -- **CICD:** remove unused image ([10335ad](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/10335adcdedd65e8f565db148b28225578bfc502)) -- half-hour consumption display had wrong format. Update format for better handling. Ref [#143](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/issues/143) ([04a96d3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/04a96d319294bd5d1ea34725c93e39f0d3ffbe28)) -- **Mail:** add font for email ([3590170](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/35901700e6fc7bc8305cf2a87828b8fe4c4780fd)) -- **Mail:** change text for consumption and alert email ([2abb667](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2abb66757378edd74cf5dec793dd4b55fd986777)) -- **Migrations:** docTypes migrations ([97becec](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/97bececf3d363fa99caa87d340818bd5df6696e7)) +- **Assets:** changed assets file tree in Dockerfile ([7609bc4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7609bc4b3a04db7929c5ce34e0f6ecf4f0bd538d)) +- **Challenge:** Improve challenge cards display for small screens ([39e1fa0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/39e1fa005881393bbec3af2a8e371b4def36536d)) +- Change ecogesture card size for desktop ([8b17302](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8b17302b330bef87ab55a6fffa7f7c7bfb3fe6e4)) +- **CICD:** add proxy config ([e01545c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e01545c6d1d2835efc4dbf31388baf1674f7e6a5)) +- **Conso:** Change text for annual comparison ([e313f1e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e313f1e8622d7c0ee43522b51c0e1347bb796326)) +- **Conso:** Change text for annual comparison ([766e55d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/766e55ddadd77f1f5a0c418d76691ad8c0781b12)) +- **DACC:** issue on event-duration event, group3 was not defined ([6e67ca6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6e67ca60626e469b222ae6ea8bb32416482eb6d9)) +- **Ecogesture:** ecogestures with no season are now on top when season is fall or spring ([a6a5a7e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a6a5a7ef0f674c6151769259366afdba8fabe754)) +- **Ecogestures:** fix default displayed text + broken display ([ac687f4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ac687f4b368953a95eca7ddb2c00dbc5aa290a89)) +- **Email:** change assets from .svg to .png and update mail titles and content ([e090b34](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e090b34d5e015c47c11a878974c9e128e3066878)) +- **Email:** link with image alignment ([229ff09](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/229ff09db2bcd22e9a6e6ae8365d91e8bd61c6c6)) +- **Email:** missing assets for email rendering + switch link to remote doctype ([215a327](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/215a3279f4373cdb211ed035fb22e82fc6ee5720)) +- **Email:** small design issues ([566888a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/566888a4bacdf935c7c3c963d9e7101915c3e26b)) +- **Email:** update font handling + issue on title ([c8f3465](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c8f346506ea8ae0613a5c80a4c4dcd5e9967b7b6)) +- **Email:** update mail title ([254dde1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/254dde13edc73778bc9cc45d4d22ee84a102fd20)) +- **Email:** update typo handling ([477adce](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/477adcef971561ba422c7c2c0bb992685078aa55)) +- **CICD:** remove unused image ([10335ad](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/10335adcdedd65e8f565db148b28225578bfc502)) +- half-hour consumption display had wrong format. Update format for better handling. Ref [#143](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/issues/143) ([04a96d3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/04a96d319294bd5d1ea34725c93e39f0d3ffbe28)) +- **Mail:** add font for email ([3590170](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/35901700e6fc7bc8305cf2a87828b8fe4c4780fd)) +- **Mail:** change text for consumption and alert email ([2abb667](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2abb66757378edd74cf5dec793dd4b55fd986777)) +- **Migrations:** docTypes migrations ([97becec](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/97bececf3d363fa99caa87d340818bd5df6696e7)) - getProfile now returns default json profileType when no userProfileType can be found - **Default profileType is never stored in database** - Migrations check docToUpdate array before assessing if an operation is possible (no doctype = NOOP) - Migrations can now use cozy.client to query more doctypes when preparing for an operation - Migration sorts array of profileType to make sure the oldest profileType is deleted. - UserChallenge quiz is checked to make sure no quiz result are overflowing (> 5) -- **ProfileTypeData.json:** changed initializing template ([1a2cfc9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1a2cfc9dd8c0cb67e0e72f7d5ede92027a45b7dc)) -- **ProfileType:** save new updateDate when updating profileType ([3464515](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/34645158a7163c8cf6215bbb5817354bdc816bd3)) -- **ScrollTopTop:** scrollbar now goes back to top of th page ([5a70468](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5a70468366ac07a0619c70183b302291fdf673cb)) -- **Tests:** Mock getSeason in action service tests ([8418842](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8418842666627aa05c56f558327c313b5383f3fa)) -- **Warnings:** Remove unused imports and complete dependencies useEffect's arrays ([4b955e2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4b955e2b5ce0d551865a78ff0a792a72178c334c)) +- **ProfileTypeData.json:** changed initializing template ([1a2cfc9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1a2cfc9dd8c0cb67e0e72f7d5ede92027a45b7dc)) +- **ProfileType:** save new updateDate when updating profileType ([3464515](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/34645158a7163c8cf6215bbb5817354bdc816bd3)) +- **ScrollTopTop:** scrollbar now goes back to top of th page ([5a70468](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5a70468366ac07a0619c70183b302291fdf673cb)) +- **Tests:** Mock getSeason in action service tests ([8418842](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8418842666627aa05c56f558327c313b5383f3fa)) +- **Warnings:** Remove unused imports and complete dependencies useEffect's arrays ([4b955e2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4b955e2b5ce0d551865a78ff0a792a72178c334c)) -### [1.2.4-beta.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.2.4...v1.2.4-beta.1) (2021-09-21) +### [1.2.4-beta.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.2.4...v1.2.4-beta.1) (2021-09-21) -## [1.2.4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.2.2...v1.3.0) (2021-09-20) +## [1.2.4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.2.2...v1.3.0) (2021-09-20) ### Features -- **git:** ignore cozy doctypes project link (used for local purpose) ([5765956](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5765956e0556c9bba946523810b8eeca9abfefb0)) -- **report:** enable monthly analysis notification by default ([fa88c87](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fa88c8747ed48f0aeaa042634a2f3f99bc82f205)) +- **git:** ignore cozy doctypes project link (used for local purpose) ([5765956](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5765956e0556c9bba946523810b8eeca9abfefb0)) +- **report:** enable monthly analysis notification by default ([fa88c87](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fa88c8747ed48f0aeaa042634a2f3f99bc82f205)) -### [1.2.3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.2.2...v1.2.3) (2021-09-17) +### [1.2.3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.2.2...v1.2.3) (2021-09-17) ### Bug Fixes -- **cicd:** deploy job for master branch was failing ([9ee5550](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9ee5550f645194c1b973ad467c823b0ef8bea15a)) +- **cicd:** deploy job for master branch was failing ([9ee5550](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9ee5550f645194c1b973ad467c823b0ef8bea15a)) - **cgu:** bug fix on displayed text for first cozy connection. -### [1.2.2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.2.0...v1.2.2) (2021-09-17) +### [1.2.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v1.2.0...v1.2.2) (2021-09-17) ### ⚠BREAKING CHANGES @@ -572,901 +628,901 @@ All notable changes to this project will be documented in this file. See [standa ### Features -- add dju processing in order to retrive a more accurate value in the app ([1efe692](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1efe69231dea16c3268c5d85c3c9a57d90cb5b76)) -- Add new consent validation system for data share CGU, and legal notice. ([630a57c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/630a57cfeac756557fa3d4ef8f03b3f80cd11181)) -- change feedback email prefix if email is sent from dev env ([9437f44](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9437f442089e3898c812f0d67d736491c432ebc8)) -- **cicd:** add new sonar project for merge requests ([4193572](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/41935729ae12faae594f898365f5aa1afa23fba6)) -- **cicd:** update deploy alpha on tag ([b378a39](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b378a39aa60174dc0e09084f807ae84d1bd5abff)) -- **cicd:** update docker-compose and gitlabci ([7b2d240](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7b2d24032b51ffbb3a413c41f11f76b47da3d0f8)) -- **cozy-stack:** upgrade ([3d0db83](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3d0db83e0c8e6be385134aad7d15f3a8fa0cc551)) -- **dacc:** add better error handling ([a02a8b8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a02a8b8802bc31c1697d4d24d62297aec7c296ee)) -- **dacc:** add indicators sending to cozy dacc. ([02cfc70](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/02cfc70424e0647570928ba51b9748ace8315ccb)) -- **dacc:** add new monthly indicator for half-hour ([a2dea9d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a2dea9de13d2ceea364edc4c9e5df904d2cb0dc7)) -- **dacc:** add protection on dacc sending. Data is sent only in case of user consent. ([d5466d0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d5466d0f5f89f990842085efc7c2e29085b296b9)) -- **dacc:** increase log and fix issue on group key ([e46d76d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e46d76d682401dec383e9a44d9f470430ead93dc)) -- **profile:** Now keeps records of previous profileTypes. ([e7d507c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e7d507c479c52a673ed2f44beabe42d41c5dd467)) -- sonar analysis quality gate fail is now making failing pipeline job ([f608215](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f6082151a21b31a9b74db6e878759774f53c854e)) +- add dju processing in order to retrive a more accurate value in the app ([1efe692](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1efe69231dea16c3268c5d85c3c9a57d90cb5b76)) +- Add new consent validation system for data share CGU, and legal notice. ([630a57c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/630a57cfeac756557fa3d4ef8f03b3f80cd11181)) +- change feedback email prefix if email is sent from dev env ([9437f44](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9437f442089e3898c812f0d67d736491c432ebc8)) +- **cicd:** add new sonar project for merge requests ([4193572](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/41935729ae12faae594f898365f5aa1afa23fba6)) +- **cicd:** update deploy alpha on tag ([b378a39](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b378a39aa60174dc0e09084f807ae84d1bd5abff)) +- **cicd:** update docker-compose and gitlabci ([7b2d240](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7b2d24032b51ffbb3a413c41f11f76b47da3d0f8)) +- **cozy-stack:** upgrade ([3d0db83](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3d0db83e0c8e6be385134aad7d15f3a8fa0cc551)) +- **dacc:** add better error handling ([a02a8b8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a02a8b8802bc31c1697d4d24d62297aec7c296ee)) +- **dacc:** add indicators sending to cozy dacc. ([02cfc70](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/02cfc70424e0647570928ba51b9748ace8315ccb)) +- **dacc:** add new monthly indicator for half-hour ([a2dea9d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a2dea9de13d2ceea364edc4c9e5df904d2cb0dc7)) +- **dacc:** add protection on dacc sending. Data is sent only in case of user consent. ([d5466d0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d5466d0f5f89f990842085efc7c2e29085b296b9)) +- **dacc:** increase log and fix issue on group key ([e46d76d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e46d76d682401dec383e9a44d9f470430ead93dc)) +- **profile:** Now keeps records of previous profileTypes. ([e7d507c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e7d507c479c52a673ed2f44beabe42d41c5dd467)) +- sonar analysis quality gate fail is now making failing pipeline job ([f608215](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f6082151a21b31a9b74db6e878759774f53c854e)) ### Bug Fixes -- **cicd:** deploy job was borken ([e766d05](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e766d05e720ae755122c1d3626721dc74d269c1a)) -- **cicd:** update script path for deploy ([581c29d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/581c29da4bde4bb2e81d3810698991b6428fa02e)) -- **dacc:** indicator sending format for profil_completed ([1bbe89e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1bbe89e796bcde7a127c53a9155ac37a5bfb228e)) -- **docker:** cozy-stack for dev was crashing after reboot ([f9f443e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f9f443e95aa3e28eaaac64747352d4c2c3689ab0)) -- **docker:** revert to cozy.tools because upgrade had side effects on scripts ([72ce577](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/72ce577ad3bbe988c8e4b8540ea33984004129e1)) -- **docker:** uninstall old konnectors with domain flag ([dbdcbb8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dbdcbb892ff32b12472ed3d3d5d85a59f1e62977)) -- **ecogesture:** pop-up design text display ([d3c3670](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d3c3670f94fd42ad7e88059d62c8fd9e064528c6)) -- **konnectors:** invalid id for egl was creating bug allowing user to start a challenge ([2e5870e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2e5870e55b63211261872c83ffe28c99a2352c87)) -- single fluid view was not properly rendering after cgu verification upgrade ([124e0db](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/124e0db7b5456d731a519ee7f4fad59edd82388e)) -- unitary test on feedbackModal ([6126bd5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6126bd5b335ba55cc35180152d9505a3fa7dfefc)) -- update remote doctype description for dju and dacc ([def5c6f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/def5c6f70b1e4318a8a65fd8a31197c677be3446)) +- **cicd:** deploy job was borken ([e766d05](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e766d05e720ae755122c1d3626721dc74d269c1a)) +- **cicd:** update script path for deploy ([581c29d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/581c29da4bde4bb2e81d3810698991b6428fa02e)) +- **dacc:** indicator sending format for profil_completed ([1bbe89e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1bbe89e796bcde7a127c53a9155ac37a5bfb228e)) +- **docker:** cozy-stack for dev was crashing after reboot ([f9f443e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f9f443e95aa3e28eaaac64747352d4c2c3689ab0)) +- **docker:** revert to cozy.tools because upgrade had side effects on scripts ([72ce577](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/72ce577ad3bbe988c8e4b8540ea33984004129e1)) +- **docker:** uninstall old konnectors with domain flag ([dbdcbb8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dbdcbb892ff32b12472ed3d3d5d85a59f1e62977)) +- **ecogesture:** pop-up design text display ([d3c3670](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d3c3670f94fd42ad7e88059d62c8fd9e064528c6)) +- **konnectors:** invalid id for egl was creating bug allowing user to start a challenge ([2e5870e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e5870e55b63211261872c83ffe28c99a2352c87)) +- single fluid view was not properly rendering after cgu verification upgrade ([124e0db](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/124e0db7b5456d731a519ee7f4fad59edd82388e)) +- unitary test on feedbackModal ([6126bd5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6126bd5b335ba55cc35180152d9505a3fa7dfefc)) +- update remote doctype description for dju and dacc ([def5c6f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/def5c6f70b1e4318a8a65fd8a31197c677be3446)) ## 1.2.0 (2021-07-15) ### Features -- 4 weeks challenge + fix level + fix badge error + fully locked challenge ([6e6a031](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6e6a031c1dbd081e4669c55f704483516812695c)) -- add \_id to UsageEventEntity ([9113ed0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9113ed0bb195cddce6bac94f40ff477dcb69acff)) -- add 'en' translations for permissions ([b888462](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b888462071093baadba45f2c08b4ae467b175021)) -- add @types/redux-mock-store dev dependency ([616cef1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/616cef1014cd90ba4bfb1d165a6fe372804ee611)) -- add accessibility for forms ([97c9745](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/97c9745f8932100f6420af01360434e7ca760e36)) -- add aggregated boolean to usageEvent ([0829d06](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0829d066d7d56e9ea8e1b77262540877f1300c84)) -- add aria-labels on DateNavigator ([32085eb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/32085eba7bf3e80bc327669af9f1d3a76317ed16)) -- add autofocus on FeedbackModal ([90d5780](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/90d5780a3da1b91be3205ca7164452207b543594)) -- add babel-polyfill for tests ([582d3bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/582d3bbd4046d54155e0433d512c7a73e73635d1)) -- add black spinner ([3077a3d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3077a3d874ecff6a9c54d171db29b799b4da739c)) -- add black spinner ([a9406a3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a9406a32e38d6083bf6a2d4bf616219bcf21e71b)) -- add card ajust profile ([328c244](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/328c244e7c068fd7c824986af26f79fad83a29d5)) -- add challenge information to report ([6cb368f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6cb368fd8ce0ae36b2b95489d22f2c17d9b8324e)) -- add chart actions to store ([6667969](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6667969570adee25c6eea547084a37adefe5eb5d)) -- add cold water in profile options ([9ffbafd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9ffbafd6927ea309db2b411543663bfd25415b99)) -- add cold water to profileType ([253f7a9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/253f7a9901145cf4a98273e01f628c78be1f0526)) -- add complementary description to exploration ([52be32c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/52be32c3c4017d2d90bb36e5d409d710c25ac76d)) -- add condition if name undefined ([7f03afa](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7f03afac2d7f856dbd35705fb8c0478b37487fea)) -- add config for cozy bar tests ([27f3df2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/27f3df201cb76fd5cba3793f5c07df4133109dd9)) -- add config for snapshot tests ([0421b43](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0421b436b7199446009148e4f9cbf5e7cd1902b5)) -- add connection information to fluidStatus ([f8150a1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f8150a1901fcdc5d2c393a138e435f5bc327fac2)) -- add consistency to profile type ([37897df](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/37897df9dd91ac9be17181cc74d369a3b9bc273c)) -- add data for futher season ([1ce54db](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1ce54db02d459b2f5b82f53f0b74ac9d6d073e68)) -- add date on header ([59e0c35](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/59e0c3592c7f85d0216ad4ec68859d96e2d6062b)) -- add dateselector for report ([c6a90ef](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c6a90efed75bf07a72d074626574a3b6eb55f2c9)) -- add declaration to withClient to avoid error ([dc6c44e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dc6c44e3443ac21a6cb2a58ec7048c55af6ebe8a)) -- add doctype and models for usage events ([732680d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/732680d6a6cdae0231c375693a5ccfd09ef37068)) -- add duel result modal ([8cef75a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8cef75aab58b677f0d46fe6e197629e82029afd4)) -- add ecogesture info modal ([bd596d5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bd596d5a00773c371182ac8682c39173009bfbbf)) -- add ecs constants ([3b9d0c4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3b9d0c4c9fa68d8cee005995335f07edf2ebd1ad)) -- add enzyme type ([771d11f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/771d11fdd49032872495426ead68e244e77f9dee)) -- add error messages ([739ef4e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/739ef4e2d3a2dd5f5484948795853994936a68d3)) -- add error msg on graph ([ae413b4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ae413b41ab21ea469322d389171a465d8c37a1a7)) -- add eslint-plugin-react-hooks ([ebfe45e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ebfe45ea9f3dbe96848a88ea2590ad856a7cf066)) -- add feedbacks icon in cozy-bar and header ([709648c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/709648c2f9e03a85525b936b58d2803dca85deb0)) -- add filtered ecogested on second tab ([60ab071](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/60ab07107d9364fc4d0c3b1082dff192be65fffb)) -- add finish profile type screen ([c8fdc97](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c8fdc97794ea648ae826c06795e8e067dcff4cad)) -- add fluidStatus to context ([2c4204b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2c4204b6b1a54c6aeea7fe5a716717d091911d4f)) -- add focus background color ([67ead44](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/67ead44b7726a0827344ca476211a6500b00912e)) -- add gcu components ([55fecfa](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/55fecfaff8fa7735873ec2304ac7f193d147aeea)) -- add GCU link in options ([4b5c8fb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4b5c8fb8e3e283e5d57cc5957db43bddd4c9174e)) -- add getData function to index.tsx ([af5a299](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/af5a299d877666ddc1bab5ed531f4654d962bb25)) -- add hook dependency ([e5deeea](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e5deeeaf16638c7483b5976005b9a2dfc691192b)) -- add limitby in boss service ([d1c51be](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d1c51be0391584082db5892b69977da0fbd69272)) -- add link for account creation ([fb25637](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fb2563701c1366ed3a18d4fee883fd12a6e3bed8)) -- add loading screen on konnector view ([7d27347](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7d27347ba6ae199a490a6449d4ce64a2c35aa2a5)) -- add location into feedback mail ([dd8cb10](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dd8cb100c1dcb2d15cabdc5cb6cb4255963f7e95)) -- add models and enums for profileType ([1ef7cb9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1ef7cb90d1a213c07b69abc78e156caef712d04a)) -- add new icon ecogesture ([8daf187](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8daf1879b4fdb49a13f5b827029a4a61510ce52f)) -- add new question ([58a2e3f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/58a2e3fe5c43e6308ccad87e58d4161e16be4aa4)) -- add new waiting texts ([6580864](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/658086423253021eb8166e86076efbe1f740f223)) -- add new waiting texts ([46479bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/46479bbd1df939e3ae132c568d857c6965588cb3)) -- add no data for comparison ([3f6f399](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3f6f399f02538b3df4429cde539a83e34be15872)) -- add notification for season ([f603b43](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f603b430e1f9829fc9eb8b06674695c347b4311e)) -- add ntif handling in navbar for challenge ([f503d93](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f503d935325a18361d1372b0560f1b195d83b457)) -- add number of page in session indicator ([df01f12](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/df01f1214735cc94c2ba7939e142979e16cf2442)) -- add padding for text filter ([a15c9e0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a15c9e0f1b107f8733bef3e05fdca31b286d8c88)) -- add profile and global store ([f7d4071](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f7d4071b101761ce221d20ad0d4d493e45cf73a4)) -- add progress and boss launching ([e44ebc2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e44ebc2a196672703ceaa6080819f53e8bef056d)) -- add question and aswers ([c9fa0d7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c9fa0d7b491a8b265843eb357f6c9d726adee055)) -- add redirectSlug for OAuthWindow ([9afd787](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9afd78728f6bd8486f62a4a43a6beaed9fe319e2)) -- add season & boss hash to profile ([429486b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/429486b51975b1aa4b4deb2ca1d1ae9fdc50b0d6)) -- add season reducer to main reducer ([f07b827](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f07b827a7a19dd2dce8b79b2c27b11fba1331f1d)) -- add send mail for test purpose ([64b52b7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/64b52b7a63b4729c0f964a69e20f6807d7e4d777)) -- add service to filter ecogesture ([b2af4b8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b2af4b835198b8e2b131980ee47b03f730767c9d)) -- add session calculation ([e61b9a6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e61b9a6c2e769436102a632118272fef866dfd05)) -- add setSeasonConsumption in season reducer ([6ca162c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6ca162c5a7447f057d04afd44e15b8ea67ae5114)) -- add single choice screen ([654a7f6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/654a7f6918549e0bd3184f9f7110a53695781cf7)) -- add single fluid flag for custom question ([ea16e20](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ea16e208451fd78072d7cdfebbc18b4aa7971aeb)) -- add some Indicators to aggregatorUsageEvents ([2c15a0e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2c15a0edb9192ce54cf29d508f1c6eeff5a63aad)) -- add spinner for custom question ([8c722fe](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8c722fe5477d6394095e5c5ce19b06d8f57be72c)) -- add startDate to quiz ([33a8c86](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/33a8c86e53d15fcc2bab7dc6debecfbca769e9d7)) -- add store tests ([f03eb0b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f03eb0b64b119e12fed1f9fad5b903eec6973a16)) -- add style for selected feedback type ([d16f46b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d16f46bb0795b1cdec828c47fa9ca759ff2d79b5)) -- add test for chart reducer ([23e736f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/23e736f532acfbdad29a718d0d6d41f7e22c845b)) -- add test for Duel components ([ae26afe](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ae26afee4f40272158880e4f2a5f460d2552ee33)) -- add test for duel ongoing ([9cfb6ef](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9cfb6ef2cbbc5cc3adb8b078c997799408eb4a3a)) -- add test on options components ([fa179e6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fa179e698cb9ef78544620b889a649cf9bba3374)) -- add toogleBackgroundScroll to feedback modal ([ca930a9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ca930a9e127851d0fe987ef9534d5e025dae296f)) -- add TutorialWelcome to App component ([5b6e5e0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5b6e5e0735dee9464d74647246ddde569c2e56db)) -- add type to connection and account service ([7665439](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/76654396aa0b0836afb5328b320b0fb3d20bd965)) -- add updateAccount service ([d193bca](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d193bca0a2ce7d98f92d68d454ec251ec397873b)) -- add url into mail ([ed50dd3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ed50dd3ce901fed50a0a663238d83a64a95dce81)) -- add usage event for consumption ([f626ce7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f626ce7dead5247174b630a19fec3e10a4c09210)) -- add version into feedback email ([d17f055](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d17f055e69807e9598fb904c0816573a8f972943)) -- add webpack config fix for windows ([ec5d164](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ec5d1648377b756a02cfbfea4e94ddea555e152a)) -- add yellow border for feedback modal ([a9acde1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a9acde1420bc21d20a99630ad86e6f8995e42048)) -- adjust margin right to chart ([8dcc5f1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8dcc5f1bb3243344e2c677522f9f62cc4dc828a2)) -- adjust nwh modale style ([b073c81](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b073c812059e724d2a7a5f137d9e3f71abc987c9)) -- adjust styles ([dca03df](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dca03df6d21c1eefe0f3be0867a086a4c025c71d)) -- align ecogesture texts ([00a7000](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/00a700019a08a90f4ca9ae4fde4065cd8ae57cf1)) -- block navigation when last index is reached ([6fc4a92](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6fc4a92c194be06bbc91c624ebfdbb25b7c9d7dc)) -- calcul the end of a season boss ([d463772](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d4637720ec73ce04e599ada90eaf4703d2df107c)) -- calculate properly the threshold ([8f01235](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8f01235eb59519196608f57bf85c930d2a16d455)) -- calculate threshold when going to duel view ([0776333](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/07763331d1e59c5d4c2ef72c6f143c7bedf76992)) -- center ecogesture icon and name ([6f91fc1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6f91fc1955292085442ef3fe5853c2823c99440e)) -- change accordion for ExpansionPanel ([1714364](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1714364602eee64bfdc94da886b3e257592e1cab)) -- change accordion to ExpansionPanel ([21045d0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/21045d06570403e4ec990176af8e0b09e90bb438)) -- change action of card for accessibility ([127249c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/127249ce7b114ea6d6cc10005686dfd74854d83e)) -- change ActionModal ([f91267e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f91267ec2297c3130408b903695e28f38674bef0)) -- change AnalysisErrorModal ([9d84681](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9d8468102f04db29590e1d0fa9c866b2247ba663)) -- change asset boss to duel ([7bcfa9a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7bcfa9ae4cdfafeb0779b780e66aefe34f80a3be)) -- change boss to duel ([a2f2655](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a2f2655fc60789c6748a596ccb53203bb3bea3c6)) -- change calculation for handleScroll ([a230a81](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a230a811ddf2d810e6579f798346c439328d08e7)) -- change call for trigger ([8052363](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/805236364acf25072e8a30d3751996a05604289d)) -- change call to model ([2d165cd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2d165cde734c78566647927cb20aa10c2d0a4469)) -- change ChallengeNoFluidModal ([5d4f3ed](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5d4f3ed5c60ce44b03e4f9df812ebaaf3ccf7525)) -- change chartduel to duelchart ([a8b93f0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a8b93f06cc67b98ec4d71d6584a6a90b0c821ca4)) -- change comparison on badge ([61ac80d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/61ac80d7a33b86410c0947684394ffe6e8ceb6b5)) -- change comparisonPeriod for month period ([ff654d3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ff654d3fb197fcca6f720958ff2f8dcf88656163)) -- change component season to challenge ([cdf4a6a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cdf4a6a3377490e142acd161d126e53b5dfb44a5)) -- change config model name ([632ea96](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/632ea965988779a43e0b70f98916e454c9ec840e)) -- change creation way for entities init ([d3b7e37](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d3b7e377d6b83d9b6b09f574f470268346135ba7)) -- change css for navigation accessibility ([7708cd0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7708cd02ac126bf0724d14de1546288672bb8559)) -- change date to UTC ([815674e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/815674e5dedde9380dd74713d431133116dcad11)) -- change db and assets season from challenge ([c7bde28](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c7bde28c170942ffd93ccca9269210435410c6a5)) -- change design of error & sucess feedback ([920762c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/920762c360f7b579355c7e6774cd645f60e0971f)) -- change display for day chart ([0d0e2bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0d0e2bbdfa491bb7d2caa7899b56cee0866e0852)) -- change display of axis bottom for day ([a3e6c8f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a3e6c8f805b087a0e722518fba3ec5f2c905d620)) -- change doctype season to challenge ([213d601](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/213d6012e0afc3bfdd64cbbf0684bb2f1f0ffa56)) -- change DuelEmptyValueModal ([947a003](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/947a00352bd43ac6a3adb25522caf2929c8f4973)) -- change DuelResultModal ([4da31d5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4da31d59a59636036d8edb2a388b03f8b56afd1d)) -- change ecogesture modal ([44f8cdb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/44f8cdb007ee43fdc09861a2b376b14c81f67d6a)) -- change ecogesture service name ([14004d9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/14004d9a1d8e546abaa27dd67d44d66227d884e2)) -- change EcogestureInfoModal ([125286c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/125286c9039f2117e0612bf4e2f7829d2cc562ff)) -- change email for test purpose ([7c5a51b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7c5a51bb014c2d2bcdd83c60a406b5e129bde17c)) -- change enedis link ([7f870c9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7f870c9ee74852cd1e3bc5323d6e4e1f80205480)) -- change error display on login form ([16f1431](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/16f1431ebfd192f4f8532eb3220924aa586d3339)) -- change faq content and use MuiExpansionPanel ([21448af](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/21448af9fdfb380d04bf8cab448a4f9ad87bca4f)) -- change filter for service ([3a7077a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3a7077a4449e49d28ba8ce70dd7344780393aaae)) -- change flag for firstConnection event ([a9e1ce4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a9e1ce460033280c7d23e0a0a7470c718bce0c1b)) -- change fluid class name ([074b15f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/074b15fc483c28d2122024187c707e62b464fb30)) -- change fluidState atom to redux ([6161854](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6161854a1b6a2c14c4ecf6220a4044553fa21bd5)) -- change grdf konnector to Oauth ([2805cdf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2805cdf0173ad018f7b77ecad6d4edb7841ff285)) -- change GRDF modal ([543824b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/543824b96f5293076ad4351a256cb2c07b4401b4)) -- change GRDF modal ([8c0736d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8c0736d7ee4056c8fccb6ad6a1a824874b65eac6)) -- change height of ecogesture card ([cabfabd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cabfabdd98090046560bb062b77daedb15f8fd89)) -- change icon congratulation from quiz modal ([606b331](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/606b3314e733af6e8bbca8e1f2f455c7750fc7a8)) -- change icon for report in navbar ([abbf703](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/abbf703e71f0c85566aa8a88662048cf0ef19ce6)) -- change indicators in aggregatorUsageEvents ([4fb6f34](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4fb6f34f1d9303404f2c1c4eff5112e0f502a100)) -- change info for ConsumptionEvents ([54fefac](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/54fefacc21e4ae43c86925aa4c4c657a3cb6eb73)) -- change is challenge is over ([aa72c4b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/aa72c4bada07ad487d2ef6a4f1561b4209b32b84)) -- change KonnectorModal ([447039d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/447039d4352a30556782a76141a77964b440ade6)) -- change log for mail service ([e50d0ed](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e50d0ed150538d172ad9a4a5221ea96b87b0cb46)) -- change mock files data ([33c0134](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/33c0134f94e0d00b3bfb1f12c56af5cff55af5f3)) -- change modal atom to redux ([e431a2c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e431a2c1d362e601d5cb0ab77550f82b222923c8)) -- change model and enum season to challenge ([c82e3e4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c82e3e4ff1f718b7cd0dfdde1aebad74def6c932)) -- change Oauth form display ([7f4d1ec](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7f4d1ecd827effbed9d4d7447357de177d20b365)) -- change offline page for PWA ([4c55b83](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4c55b838ffbefc87f1582bb3f246dc4696bce492)) -- change OldFluiddataModal ([17bc3bd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/17bc3bdee1313f8e8a6329ee697c79fdf2556459)) -- change path to service into manifest ([1facaaf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1facaaffbf2038682e1625d803129ac53cd6e25e)) -- change performance display ([19264bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/19264bbabcb18e49d363ba8315e685a1f80d9397)) -- change period used to calculate maxEnergy ([9e6ef55](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9e6ef5571b453fb2aae0965f8bdf4b95aa9eb678)) -- change pile svg to coins svg ([47cbf3b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/47cbf3bc3c8d8ab3cced28ee1f73ff51f419977f)) -- change position of version info ([dd932e5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dd932e514fefba76d2a08c13568b5107cf559286)) -- change profile type service ([87c2908](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/87c290800ace404fba1151f83cf8c5bd24be5097)) -- change QuizExplanationModal ([0fa1491](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0fa1491583c0daa136cb3ed9df3ce756b149aec5)) -- change resetInputs ([06d591d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/06d591df2375bc6733cbee995764659642613997)) -- change seasonEntityHash to seasonHash ([1d9856a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1d9856aedd31f2242391a68e35f9f43568acee08)) -- change service to monthlyReportNotification ([1ce9979](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1ce99796becdac0f45bf69385dbed8df27e09541)) -- change serviceworker to serviceWorker ([3471bc6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3471bc630b72b7ae0afd86b2334ec04d25ca41f8)) -- change splash screen ([b9222c8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b9222c8bfaecf82f0df2df44bd4a08492da15019)) -- change start challenge label ([99eea22](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/99eea2296bbc4bc19eb28998d94437c765436022)) -- change store & service season to challenge ([697ab63](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/697ab639cdda23cfd2e56692f98438d0960c7f79)) -- change style of konnector result ([f614060](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f614060e935d6d1b4ac8fbd4be0bf38e5ad4a50c)) -- change switch case render exploration ([98f4dfd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/98f4dfd859dd4b63fe56fa62d9add6d2bd51918c)) -- change switch case render exploration ([10fdb63](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/10fdb63de4c3fed877bc041c95b3064649f6344c)) -- change target to lowercase for NavigationEvent ([b88be63](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b88be63b917215c8e808f64047204781f4b2879c)) -- change tests ([ca34c61](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ca34c61806a7454df89433d82299165eb6658de7)) -- change text for welcome mail ([7788581](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/778858114578b34538292ef40357d0cd42d2b702)) -- change timePeriod for indicator ([c92dff6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c92dff6e5c771e07049dd61f14b5bc3627fa5e5b)) -- change timestep label ([c586556](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c586556118bb98f3d417d457a2ad361f398bf91e)) -- change translation for ecogesture modal ([a6dda42](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a6dda4226e705a2ebf46f8c7b68f454b49d99b44)) -- change type for maxLoadsState ([3fffd77](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3fffd77e18902912294f25592d69d6fc67db5bfc)) -- change way to load maxload information ([ea13a11](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ea13a119d08d93b78faa7562aa70589a8f7f86e5)) -- change welcome and feedback modal ([60a93d0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/60a93d0fb5d1f1aca5cc7f11f436e05db693bc91)) -- change welcome modal by tutorial welcome ([2ec8842](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2ec88424c42bfa5ae68cf5c6f5594432bdabbf85)) -- change wrong custom answer generation ([f02d56d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f02d56d658579f055680d95286293305ab2d1bff)) -- change yarn.lock ([771aa9b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/771aa9bb5ccf54eb343b88cb06fd186ab2f14a8b)) -- check if report is enable in user profil ([5482b31](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5482b317be1c859889dd4e57f5c57fee6b916f5e)) -- chge text color & translate type in feedback ([42a6bbc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/42a6bbcf4e6373a67d32322fc495b4154251f0e6)) -- clean app config services ([090d17b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/090d17b063eb99c9bef844cc3f8ef3fc5215bc66)) -- clean code ([05899ea](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/05899eae3715c2b27c38b1290390f99e87a9bcab)) -- clean code ([fd26955](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fd26955f2ef54bccbaefe34ac4264a9438c52977)) -- clean comments ([60ab319](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/60ab3194d1f2b52971389e022e0a40245e045a05)) -- clean console logs ([ebba772](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ebba772643e1ad10b1a184d504b58ec8e7c080ec)) -- clean docTypes ([3dd7496](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3dd74969da2522de991faa09de1b2adc67fedf27)) -- clean handleDetailClick function ([6e98e6e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6e98e6e99eb2428ac7e9b9ac282d83b7918ffa76)) -- clean konnector components ([0a993e5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0a993e5df9549de8a01f8248b4ac78d66e938595)) -- clean recoil state ([ce4d921](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ce4d92129f48e5e34cb8112f175ae8b98554aa5b)) -- clean test ([e7c1ce8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e7c1ce80cce61123502e5e4fb2d48c07d60a17a5)) -- clean userprofile ([dfc1724](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dfc1724411fbbb45fb0f852cb045f9be6d18bbc1)) -- close dropdown when filter is selected ([4c51e33](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4c51e33910b1fe8ad564ac238b4c344bddd5419c)) -- complete konnectors tests ([3077bd4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3077bd4a04aa4c0c7ff6f03011c3853b83d63a4b)) -- complete mail service tests ([c718987](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c718987104dc37e46793b791a413549550c8fc95)) -- complete query runner tests ([2576cf8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2576cf8088c2966525ab5aefb04c401049b44630)) -- conversion kwh to mwh and l to m3 ([48c8f55](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/48c8f55a13ff241a9f4dbbf0cec9730423bd94fb)) -- convert barchart load to euro and add fluid condition ([2a8258b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2a8258bddd64166ddb5e60f0089bc896e8138fb9)) -- convert chart atom to redux ([d097a14](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d097a145d0c6086f3a869811f98fb1a91886e03b)) -- correct konnector modal closure ([5058298](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5058298c3dc9a26723e01a24d6502547f91dac57)) -- correct name function ([21cb8a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/21cb8a47187fba8827fe142f0a7e163df5dc44d5)) -- create analysis consumption graph ([fd44bd8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fd44bd8863201eb1317a7ae83fd8d1d1160cf0a6)) -- create challenge Item ([3e6fb17](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3e6fb17e83c6f36feefdba317f9f5b78f1eeb490)) -- create chart in report ([609bfad](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/609bfad67fe77d79e86836f1ac2666af7eb557d6)) -- create cold water method ([77e3657](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/77e3657a0365b6e77d84226a4a06bdefdab33e91)) -- create connection indicator in service ([2703567](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2703567f08c401a00f802873dd2ac7ccfb3f49bd)) -- create date navigator component ([66af7a2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/66af7a266e12136c831c1f65f5dff1e625a42711)) -- create elec specific method ([5ce1d61](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5ce1d61ce0effed53cf399d5442fb18cfae6d267)) -- create exploration finished view ([2914956](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/29149565efd6617a0267c7ea79fb15eda115a56f)) -- create feedback form ([e702156](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e702156bf93d75a915b05eaceed620fa617fe3e5)) -- create get ecs consumption method ([46a9a77](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/46a9a77aaba2c37798ec8cf7b8051ea14be42a2d)) -- create getCookingConsumption method ([7a74b87](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7a74b87c7c78b746ec2b3ed8a15a232f48cbbf25)) -- create getEvents method in UsageEventService ([333f99d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/333f99d4aef6fe005bd270915ded60c86b89c4b2)) -- create interface for monthly report service ([8a75917](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8a75917622c6f8d97083b99f56246ef1531d63e2)) -- create main component for profile Type ([f48ba56](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f48ba56364f823469da1703a6b9a2c199153b6a5)) -- create mission model and enums ([399016a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/399016a6806be31da560a18e2ac2d054c1c588e6)) -- create mission view ([1ca76c4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1ca76c407f12272d328d7a584cc11ab7c290f4a9)) -- create mixins buttons ([3bb5eb4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3bb5eb4196222e8efe737a7b07599bc056d65d37)) -- create mock data for test ([8292bf5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8292bf52d71c25cdc78a9cd81b0ca002df9c092e)) -- create mock for client ([bc0b9a7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bc0b9a702b193b86ffdf4e1be3607da9a1b2e62c)) -- create monthly report component ([b2e058b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b2e058b6550af94601d9c45e327cda2176b26612)) -- create nav form component ([716a2ba](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/716a2ba6cd63d2d8c54c9616a7abf8aff1671cf6)) -- create OAuthKonnector functionnality ([7ae7799](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7ae7799b5aef42da1bc9675c62d77e16d463c58a)) -- create profileType model ([250700b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/250700b900775b48018d37b4615fefaa11064196)) -- create profileType option view ([4951a39](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4951a390b0d8053b1f09bb2b28212f5e30847d35)) -- create question view ([6f8b8c4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6f8b8c452d1112562a89aad2d7f71d25240a649a)) -- create questions system ([d0d4bc6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d0d4bc6ddf329deea949dfd14c347393d355dfeb)) -- create report attributes ([c1342f9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c1342f9de7a4b914bb8e3e356721c224fe66c136)) -- create report view ([b473b2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b473b2fab1b6df2da85d09573fe41d0e27bcabd1)) -- create season store ([71c42a9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/71c42a9cbb679fa6ceec8c1f1f509190761c3055)) -- create TimeStepSelector component ([63104e2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/63104e246d53d77cda1b680fe1e8955ac6f1a138)) -- create types for cozy logger ([ebc1c16](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ebc1c16f3a52badf8a72e82146b1532123cd1eb2)) -- create updateUsageEventsAggregated method ([4228df7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4228df7e2598f36017d1e3360eeec7f7a71bcc89)) -- create UsageEvent service ([9ac6233](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9ac62336566fb282472b822d23e8ad6c38ab6f7d)) -- creation of component KonnectorNotFound ([5c964cc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5c964ccee6d86be60714442cfa3002c488ec899c)) -- design for login form ([7c78238](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7c782388d4a278e337069ae1d37ef79ea341905c)) -- design konnector loading ([0e4eb60](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0e4eb605295b7692c352ddeeba9e0ea341d41b87)) -- disable cron task for service aggregatorUsageEvents ([4bef95b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4bef95bc00c634942527abdbd92ab74292de5593)) -- disable focus on the main scrollable div ([ee485e6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ee485e6946376bc3927a1ec89fa5560bef342c14)) -- disable resize of textarea ([fad2c76](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fad2c761fc685c13dd5ab281c99cf99bad56c821)) -- display error on login failed ([f97e06f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f97e06fa3a553601c137b9c6475c933372916fa7)) -- display modal border for unlocked ecogesture ([73fb60b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/73fb60bee6093f8427425f9bca36931e74cf7dac)) -- display only mondays for duel > 2 weeks ([80a299c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/80a299cb9fedf28dca1b4636e9a089fbceacd189)) -- display version in parameter screen ([894fdab](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/894fdabcee9296974952eef66abc659377886825)) -- display waiting text under actual text ([7a744d3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7a744d307f92f7c4a881ec0821c656e789a70b11)) -- do not compare on year time step ([a8435ee](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a8435ee7a3283cc57c2abd72ffeee1af5545e59b)) -- duel design ([595b379](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/595b379c80c3b8bbf41c0362df254333ea076900)) -- enhance aggregatorUsageEvents ([781d239](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/781d23913cb03dba472b90f734f6948483a658d5)) -- enhance aggregatorUsageEvents ([439437c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/439437c0105a5a31f344accedc69d0eb36d400ab)) -- enhance isChallengeDone ([97ef0bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/97ef0bb66c59b9d884e5498a73ed822a51c2331a)) -- enhance the error handling test ([24528d7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/24528d7b6bc1d8e4aa80a8023d9b76b93cdbff9f)) -- enhance the userseason attributes ([015bcfc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/015bcfc2a6bc0dee95b6259800c39b19c3dab73f)) -- fix bug buttons style ([0ed4dd6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0ed4dd6468bc218d9990bd6f382db2edb4ed690d)) -- fix challenge card done icon ([629abcd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/629abcd58ea1385145b00a4269bb7bfd859a9fa6)) -- fix compare bar display ([1e8b5d2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1e8b5d2af388744c2e1076d7bc704dfd298324ef)) -- fix dipatch on profile Type ([65fc27f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/65fc27fcf47609e0f324fc10483bb811b723fd4c)) -- fix hooks issues ([e070c16](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e070c160480f7b56ac4ae977117c33ab10a15e4d)) -- fix issue on boss initilialization ([5827524](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5827524d4f154e2aa31e908cafb6a571f9be47ca)) -- fix issue on expanded panel ([2f6e3b3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2f6e3b3e9b22b9d817ac3868df0798fa4f002f0d)) -- fix position when no text in header ([c2c9773](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c2c977359048f93a41970ee98fe7b015be85daf3)) -- fix query runner tests ([2eaf0ac](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2eaf0acb13e4c40961c0bc9af46daa341d5d53cc)) -- fix style for konnector status ([d79523f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d79523f2468a327b57008121750b0a7e57437e01)) -- fix test ecogestureView and hash ([ed9ef0b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ed9ef0bcde642f538f6685766a8d16795d93b9cd)) -- fix test for usageEvent service ([9aebe9d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9aebe9d20e9b462908600ea6c6e30ccb989c2217)) -- fix tests ([c5302bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c5302bbf3ba15de27e512e49d663cbdf102b702b)) -- fix timePeriod service ([fd37812](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fd378121bc3a07e25a9821712968699b163bf00b)) -- fix translations ([5924396](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5924396ac7553de5747a721aa96c691702ef2d9a)) -- generation of the first mail version ([b4a3218](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b4a32184b5a048393cbfdf03153b648a37e2b594)) -- global & season state on konnector actions ([3436225](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/343622507629ef03d7ed9681eab2f7822ec3bbc8)) -- handle analysis when no fluid connected ([e9adc29](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e9adc299b175fca7e6746a1269e8a1a7fc7ff8e6)) -- handle challenge is over ([ca83748](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ca83748b96390f3223f39eb5f1a488d3ae474356)) -- handle ConnectionEvent ([7438e2a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7438e2acdac3af839cada3e3ce45a23ae9924a44)) -- handle end of connection ([8fca4ab](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8fca4abf25507814c37b27e7488930dd94e4effd)) -- handle error on KonnectorLaunch ([d26cc3b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d26cc3bdadc40c5894a4580bd1aaa18a7498a0eb)) -- handle form number ([48954b3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/48954b35fb4d4334e0eb00bae870f32a567bfba1)) -- handle LOGIN_FAILED case ([abde7f4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/abde7f409c05899e79cd0b3dac42c91b855e6565)) -- handle multi choice form ([ca17436](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ca17436bb4c9f653d4484393af90d898b024e939)) -- handle multichoice from ([abeb54c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/abeb54c44c0c76e2ca3f12b31173c7f21874dd21)) -- handle notification for new report ([039e24f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/039e24f63d05b5d76116be1e7613ba1da12d7723)) -- handle resfresh of global store ([9b0f21c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9b0f21c3ad0a7dd8b7193f300279a1ad354bdee0)) -- handle specific chart case ([d902fbb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d902fbbb7e1c0009471113c282d4637b21c37649)) -- hide no data when changing conso index ([26779c0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/26779c025f730c8285a7b723fb1a64a62549af1c)) -- implement duel screens ([4adc820](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4adc820e71b354a206dff3a97bd5b7bd30524896)) -- implement duel screens ([c76e3bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c76e3bbd4213319e8114a77edc104b936fb2775e)) -- implement feedbacks modal logic ([6b02139](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6b02139dea5a0bb27fb709b2e30b0a552c7191d8)) -- implement from number selection ([df80006](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/df80006a18893a53fc785a0a2f37abcef33dea0f)) -- implement mail ([6d06d5a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6d06d5ae34b7e974149040d72a0f59f6b2e2e831)) -- implement refreshFluidStatus function ([993db07](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/993db0709ab4971037377e356c37ce4b85b369ce)) -- implement single choice for profile type ([95a7c18](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/95a7c184d9a303f03445bbed4c3c9f31d3148bb0)) -- implement sroll to top into Content ([2827c78](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2827c786728223c4a32e4eeacb7eb2cfa8f23cc2)) -- implement the season launching ([b36f0c9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b36f0c9f775e9ec7e8f0ef05af24e80c2daf3188)) -- init aggregatorUsageEvents service ([005eee5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/005eee5bd5759bbafe962212722ef60b8902e1aa)) -- init correctly dataload ([0ba05ba](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0ba05bad58d9ab75cb7655c25c51825fdbcdd003)) -- init quiz ([822b929](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/822b92987d9f64dcafcab91dcec440d9a292c85c)) -- init selectedDate of chart with lastDataDate ([90cd504](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/90cd504f3b0cb5308ba29213305f0a472697d38e)) -- init test for dateChart service ([da3445d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/da3445d8f96739113d916a198e0cc5f0bdda0b98)) -- initialization of report information ([f7a1cf6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f7a1cf6770706e9ecfe2ed5987cb4a6129e5ffc9)) -- integration custom question ([33528fd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/33528fdbf572f6ed1766e2ad95f7cb2c65eef5bf)) -- integration of new icons ([19fb376](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/19fb376e5995e45f67c7285dc6509eacdc5aee03)) -- lead user to the right date & timestep ([a117ab4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a117ab4d05cd847ccce7b8a7b128b8000156713b)) -- logic to end season and unlock the next one ([325c496](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/325c4961adc428d0dbba18f32771ec4637a1875a)) -- manage feedback modal opening ([391ce30](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/391ce30463a940d1bffdb91e1490194fe06166d9)) -- map new ecogestures icons ([28f9d7f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/28f9d7f4aec1404b95675ed20eb7ad6d38dc5eff)) -- map through hot water equipment ([f603bd4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f603bd4c5409da5e324d2b0cfbded24ff941b06a)) -- merge FirstConnectionEvent with ConnectionEvent ([2e351db](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2e351db2973c60243944fb192a5f4e6e008c2427)) -- merge IFluidconfig with fluidService ([b851d12](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b851d12b56d37e0af41a33a9f2d0780e5647a888)) -- merge text for connection waiting ([36115c0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/36115c043b0c612b007b04e53e707ad9dafec684)) -- mock Q from cozy-client ([4b307bd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4b307bdd8582bc464b47dca42b46ea1f915d361d)) -- mock TriggerMutation from harvest lib ([eff3193](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/eff31931fee4c71988db436ba3cfd98aaaefb40e)) -- modify ecogesture id from exploration entity ([904c0c4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/904c0c4d513894020fd0478a037bed277b20ed8d)) -- modify exploration view ([2f7f9dc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2f7f9dcf4e3909758fd1a141280a6e29931fcb64)) -- modify id mission entitiy ([3b79ad5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3b79ad5283a8c1de1cd3dd5628dd51010c89332c)) -- modify integration ([300c67f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/300c67f5bb141555c74a84dd884b5f7e583ca283)) -- modify style and change questions ([f35d513](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f35d513d2e874dbbe832ec9a4cf4d8084c9aaeea)) -- modify switch button style ([bd2fc61](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bd2fc61adda6183a3447546d7f1dcbd00f021da4)) -- modify text case label ([fd210ce](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fd210ce1d153c047f1e359365d1572dc79e8f71f)) -- move all constants to a folder ([cf19423](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cf1942370ca3a9998b1702ed4f36ef882666784e)) -- move cozy bar config ([2479694](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2479694dc887f3e945d7624b08815a6e126cc439)) -- move custom question loader ([e2ccab4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e2ccab4fbd5c844ea9754b5ed947c1c61259b6a8)) -- move date utils to a specific file ([f3bdfc6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f3bdfc62cc6d01a62d06dea9a0c56cba1bd66ee6)) -- move faq constants ([654ada7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/654ada7734559164974a3fe57583944c3ec5d52c)) -- move getLagDays to utils ([1d8ab85](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1d8ab85bbf96409a3cd86b3c770a1ec135704fff)) -- move mockRecoil to mock test folder ([73d6104](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/73d61042b77d03f25961c7bf438032972b1d41f7)) -- move old fluid data modal ([b54d0e2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b54d0e23b0cb72822a0f7fad1f6f98b605a0b1a2)) -- move scripts ([546e3a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/546e3a4251dd29bef9c75e830ea2f1defc89066b)) -- optimize number of queries ([312b5c7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/312b5c75680b76461c3c7dd708a021cc74c51fd4)) -- optimize number of queries ([23157d5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/23157d5533017952c774bb2def2c3ee4516e268e)) -- override config for dev environment ([25a943d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/25a943dfcad1fb3f0b3b58d8624525fbfff6c3bb)) -- parse haveSeenOldFluidModal to DateTime ([cdd19a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cdd19a4aded0a48fa524c10493473be32cfe3d23)) -- pass client to service ([7155d8c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7155d8cf269ffb243843d4da92075b60208c8935)) -- prevent state icon to move ([a1fbf2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a1fbf2f213ee729527554a049a290e11dd2f7512)) -- prevent wrong rerender of bar ([eb4db94](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/eb4db946df41e9b3a97cecc1e78fb5388aa8a843)) -- progress bar for profile type ([05f0327](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/05f0327a5988aa1a28d2e47c598e9d5a7c432da5)) -- quit quizz and result ([87dba47](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/87dba47e8755deb6e31fd659cf167cd2944fb32b)) -- random ecogestures by pack + options icons ([60b27b9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/60b27b936a4c3e71bbbf5a1cb152744e8db67d43)) -- redirect to right konnector discover screen ([ba2de1b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ba2de1b298f419c38957b1230f4b16230999fddc)) -- redirect user to previous screen ([a0cec14](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a0cec14d98e601189c071b1b1c64e53b04646d42)) -- refac typography scss ([86cdd17](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/86cdd175a0ce2e0862a214e7e967918171390b7d)) -- refacto aggregatorUsageEvents ([e08dc8d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e08dc8decda056a34109d0ad10a4f16da2c0faab)) -- refacto aggregatorUsageEvents ([e7e293b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e7e293b3b65d1dcdba1b7685227b53fd763ebd91)) -- refacto aggregatorUsageEvents ([e75e39d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e75e39d8cf50135d060648da8e628508e010eb28)) -- refacto aggregatorUsageEvents ([b8e026d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b8e026d0113021f682b0aec5875441f158f27e38)) -- refacto analysis consumption ([d988906](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d988906772ed5da3ea3ce87148f1cbfefc685123)) -- removal of unused usage events ([d80c2a3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d80c2a3ab6170bf5ba72648da8daf98b2e37a4a6)) -- removal of unused usage events ([b5b726d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b5b726d18d33154cf6e3fd1cc25cd79169ef6873)) -- remove await for sendmail ([d87135e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d87135e94fffb765b86b5f88eefaafe7a64cc6da)) -- remove break if no comparison ([7876a92](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7876a92c88fd6927a81b2d9e9e960792d22adf7f)) -- remove button used for tests ([8d8fd24](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8d8fd24915993fd2a498eed4cbecf49386ccb99a)) -- remove buttons components folder ([3a86d5e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3a86d5e9d174ba17cd25bd95bb82b9ba8fe96e53)) -- remove challenge from date utils ([633a6f5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/633a6f5a469efffe29cd77289459f6bf4172a525)) -- remove change done on loading konnector ([b2005f1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b2005f100403bd2d0e990fb3118388c46a75ed45)) -- remove commented lines ([d9e4540](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9e4540509ffc26d1e36b251f1dde00176b7584e)) -- remove console log ([181bf51](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/181bf5147733e8ea2e8e6716671c2663ca82bf34)) -- remove console.log ([e52d1cc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e52d1cc9bf6c8194eb2f29352a9da09c8dcba912)) -- remove console.log ([8af2b70](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8af2b702c014bbf3184aafa9e2d8fbaf2bdd94b0)) -- remove console.log ([e3a98c4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e3a98c4f04371d66944d898e05b97aea59b3784f)) -- remove cozy-doctypes folder ([5a80070](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5a80070b06d24f77bda3b50e9a9e05c3c3703134)) -- remove duplicate function ([36cda02](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/36cda02375050b24916df515c38c68bb85ebb9e8)) -- remove duplicate typography import ([c8949c8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c8949c8f21a8180fda8fe65d9dd67cd91db692c9)) -- remove endTextAction from ecogesture json ([0cc6ed9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0cc6ed9bc084357c53338731735802abe62b6648)) -- remove error from Version component call ([ec25cd2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ec25cd2f0aefb2768327eb625808d4cf3f442963)) -- remove favoriteModal ([c884c47](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c884c47a816bd71a3ba4d18e85b07c4b5b6bef1b)) -- remove GRDF_HOUR_DOCTYPE ([69029bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/69029bb99cdf36c8a9867b2a3de79a694823e8f4)) -- remove Hash for challenge ([5ccbb1b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5ccbb1b9a6438335335cd8e38f1480e245bc1c22)) -- remove host in start script ([ba40612](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ba406121ec5228eb53216752d3d105222899777b)) -- remove loading at the end of connection ([16f0fab](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/16f0fab9aec466cafc718f48cb36e28d8316a0ee)) -- remove max load from chart store ([e938bb8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e938bb832827c3515437ce96065817130cd27361)) -- remove max load from chart store ([7fa7811](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7fa7811e57f4e9524aab5fb9dcf6599fb38dcc01)) -- remove old files ([adacdf6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/adacdf6a5c4cfb0700c19c7fedc765a37d7ac45f)) -- remove old Modal ([90a1c5a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/90a1c5a2e015e1de8a1c7f9083011c6da83d593c)) -- remove old service file ([5fa6762](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5fa67622ca58b66f0458bad152241797c297758d)) -- remove old tests ([b27373d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b27373d6c81934d9d0ccc1898b0978b80f205cf4)) -- remove react fragment on modal ([070890b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/070890b57c86326b80c7fd42ff1d91e7e8345dc6)) -- remove recoil dependency ([e3ee3bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e3ee3bb9d0c9a98da4b69068515496b0c86e5d27)) -- remove sorting and change color konnectors title ([4c5837e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4c5837e80bd5bc1ec754f54d47aab98a92579c57)) -- remove Test component ([c8df5ed](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c8df5edb0b6d69248a85f2e33b50ea902e482572)) -- remove unlock state on ecogestures ([6abd5bc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6abd5bc9d8ceb80f01935982541e8643951239e9)) -- remove unused components ([7073598](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/70735987c7a29cefb90b2fbd5b7b8a16372c4ab1)) -- remove unused console.log ([8f6ed04](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8f6ed04289d7b4604522b1f74cb058a35efb0351)) -- remove unused files ([ab09503](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ab095035c6e180bff6f945b2743cae81cb4bfbeb)) -- remove unused files ([7fa3008](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7fa3008ea932c04ec11b65b4ed22cfc331062929)) -- remove unused import ([2414cf0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2414cf01a8507b3c9ba0f5a973f669e01b103ef0)) -- remove unused script ([56e41c7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/56e41c7de5c82153a5c1a66593f9b714857b0727)) -- remove unused services ([0767fbf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0767fbf250ca6fb657fbacacaad5b67dc5019b47)) -- remove unused style ([b4bcf03](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b4bcf031ac300abfdb5f593c8c8a48d58a5feb40)) -- remove unused translation ([8e6331c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8e6331c92acf1d21732bad2c23e07791d8b66bae)) -- remove useless modification ([06fa58a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/06fa58ab2b420d4b609d828e9731c2aa35c9e8f2)) -- remove usuned function from Ecogesture ([3d4fab1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3d4fab155c2e21efdebce9151fb50f2f93d92d52)) -- remove wrong comments ([57149d7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/57149d75d4d4b590b841ad3a2482e9188ebbcfde)) -- rename date chart service ([c6e1daf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c6e1daf854fe79823403724c683a9b05a3d63e4c)) -- rename ecogestures icon ([d35ea59](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d35ea593e403eda4d06b22abf2966bc074faf7af)) -- rename fluid and konnector service file ([7da04a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7da04a4a3aef35bb54a8195145cc84fb4b7c3e83)) -- rename getKonnectorTriggerStatus function ([e583153](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e5831532a02dadc0b3a3d6079c4e97a7a16f3852)) -- rename id ecogesture ([b99706f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b99706feed2269261b362eaff8456b1704fa591d)) -- rename konnector status service ([0a08a81](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0a08a819a6dc273932e09406c83e52893a56c493)) -- rename query runner service ([2b5a6aa](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2b5a6aa757beeb6bc3adc6824618101cb9123f70)) -- rename report model reportDate and getActualReportDate ([17ebb99](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/17ebb993028deef16ced54fddd043176ff667bd7)) -- rename reportNotification and initReport ([15b3acd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/15b3acd99593e06b0e13ba26a5704cf45806e363)) -- rename sendReportNotification ([7f22aba](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7f22aba066478ed916604bf2e35c679ca0f99fd5)) -- replace context from header ([50804a6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/50804a6f8a0a2749cde4f9c1037082a6f06852cf)) -- replace ecogestureData json ([9912506](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9912506b837c7d39b1b46f73d44631392221c627)) -- replace haveSeenLastReport to haveSeenLastAnalysis ([2dc2257](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2dc2257731bdd80f263ff08013ac327a04adbc29)) -- replace montlyReportDate to monthlyAnalysisDate ([f0571d1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f0571d1c50d3b0a5f7645dbc6602109dfd045ef0)) -- replace nwh by efficiency ([779cf29](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/779cf293d32e7e5f7baf413b15cbefc61d78b696)) -- replace report component by analysis ([0796ab7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0796ab759d1757aa068394396dc76fcf345c9a93)) -- replace report option by analysis option ([e1eb433](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e1eb433718dafc54d476151b9372eeae3c5c036d)) -- replace toogleBackgroundScroll by disable ([729cce7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/729cce7a9413ac05cb897fb33829e47b5bbe39ca)) -- resolve conflict ([724583b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/724583b1ca56bb4d6a8e1bfe0e9e4581ec7e4782)) -- retrieve index on number selection form ([637c217](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/637c217368e634b847218a7a69c3dc443f8249aa)) -- retrieve trigger status ([d7305ad](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d7305adf755fcd34757e49d48c0ebc0bff007659)) -- retrieve version from manifest ([4bd29e6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4bd29e610460c6437f379327c3f39f3684b1a2f7)) -- return null return for ecogesture service ([fbd49bd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fbd49bdd8021c2fa1572d1d60b22a557c6ab22e4)) -- review ([f6cbde8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f6cbde8f37980800a38da394682505aa3adaa53e)) -- review account service test ([5ece0f7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5ece0f7ed1dbe40ec3850696434e84d99c91f0af)) -- review account service test ([11f9925](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/11f9925cef16a40d03f3b7c367c29cb6efa8750e)) -- review activateHalfHour component ([8625461](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8625461f1336c0b2abc2dd2cf1f18169ef733777)) -- review challenge details views ([1b13272](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1b132720d687b7a277358e4582569859ce38f6b4)) -- review challenge service ([344265c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/344265c142b36b4494122c59fddff3ba82a2602a)) -- review ChallengeCardDone ([27a2178](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/27a2178bf6a385e75a34b1b33148215485294489)) -- review challenges ([390327b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/390327bfca4bf229a72e9276617601489f367e71)) -- review charts ([92d2e01](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/92d2e0191c090c26d998afb6b0e0e37c64351613)) -- review config service ([62ebe8e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/62ebe8e219ffdef71ea5754003f416b3ab8f0094)) -- review consumption service ([7193757](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7193757c75635da5a20b418c0a3269019cd8b291)) -- review converter service ([2d41527](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2d41527c8a33ee114ba5ee63351d4f6fd6cb2f58)) -- review converter service ([30a462b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/30a462bd74a621824d5344c628aabdadd14a294f)) -- review date chart service ([01c10a8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/01c10a8d325e9e16e7e76bb9ec9a4e25802435cd)) -- review date utils tests ([835b258](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/835b258211a7488f71f395320dd5b4140522d651)) -- review defineDetailedTimeStep function ([12982fe](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/12982fea4c274ea811ed73241da5538c4d404847)) -- review doctype and index creation ([dc8d394](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dc8d394dfed3d2daf5dee8f6ce5af12435371fe2)) -- review Ecogesture card & modal ([7dccd74](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7dccd744858f25f48a5b9938d006bca16f9b8c29)) -- review Ecogesture context ([b514ee6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b514ee692dd780a4b5a328812f0c042c0255d9a8)) -- review ecogesture service ([88d7a00](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/88d7a0041d324d0fd8398369a54a56c632d90d34)) -- review Ecogesture service & model ([927bf7d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/927bf7dab3d1282eb445f7bbecba0cbb3a738039)) -- review exploration ([7bfdbe6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7bfdbe6894809dd2fd6369787cde6c59a0c2311a)) -- review FAQ and Options ([6cfb86e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6cfb86e894c070f38c043cd4fde962fb31948d50)) -- review faq style ([04fe5d5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/04fe5d599ae5246c54656d4028280f0850591f18)) -- review fluid chart ([f4ee18b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f4ee18bd09314e69afaf93442091d7f44f14e5b5)) -- review fluid service tests ([32eb67a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/32eb67aa765b2813fffa73166bf5d9c7d18b6f72)) -- review fluid status model ([9e40110](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9e40110cee7d041b3d3bab9537d233d4938dd09e)) -- review fluidConfig service ([0488d9b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0488d9b81b454fd141424b030f27e8d8681dbabc)) -- review hooks dependencies ([1a12a2e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1a12a2e2656c34c348e8b43df1a4ea238b94b81c)) -- review init data service ([5d4de17](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5d4de170d09794644127579296224ce9a619d430)) -- review initialization service test ([de2aeb2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/de2aeb2653851eb5bcafbc11299ccb0beea9bdc4)) -- review konnector ([113fff5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/113fff545729f0f59b2ce63b41e329fce32d7c7e)) -- review konnector tests ([df5c09d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/df5c09dbe65e4bf9decd572903da59cc41162c14)) -- review konnector tests ([87e88d5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/87e88d5026d944a04a192ba02a4237ceab89c4be)) -- review Modal ([7fedb13](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7fedb13a64e609e568d475a6ff07beccf23225f1)) -- review models ([8a64ce1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8a64ce133003e6d3e2f9a4d74224426fabb362be)) -- review Navbar context ([b6857a6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b6857a606379a79ebffc0050160ae057444f17c3)) -- review of code ([63361e3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/63361e39868184d860755a701055d60dc51467fd)) -- review of code ([b3dbf09](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b3dbf09941b2318e178424790b62fd383d8eead2)) -- review of connection flow ([6d38b04](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6d38b04a9933bf52926da3ceae5ea7362b5fdea0)) -- review of design ([4840825](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4840825d4e39f0cfbe4e884d16e20a39e333db56)) -- review of design for login form ([13ed69b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/13ed69b041ef7521154842d1dc8fee69b4de539a)) -- review of init service ([d1a65df](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d1a65df3989c5998da6b9b767cf69b88b7ecdbd1)) -- review of MR ([df67be4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/df67be4d0cac2049958fb1bb3d3b872f7e05a8ab)) -- review of MR ([cd2568c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cd2568c4b37ff9b8cc8e452d22ecaea1f795e0d4)) -- review of service for cancelChallenge ([ee73c6e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ee73c6e8954c8de55fda18708738c563aaa4c16f)) -- review of StyledIconBorderedButton ([5873a2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5873a2f3e0f7496aa128ba690547a26c3a84e9d1)) -- review of type for usageEvent creation ([b72a12e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b72a12e0998a57a00fe8d84ae3abb80f13b10b3a)) -- review oldFluidModal call ([170a1e5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/170a1e5d7f7e566cf569450da478445da1366719)) -- review Options context ([f41042d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f41042dff60b86b0f7822d7b4967529fb8894746)) -- review performance indicator service ([128b347](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/128b347907dcb56a8c7053b24637f9b8d80f6ee7)) -- review season service and doctypes ([b1bc3af](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b1bc3afa3c75c8208b413840d00d8f3f33f93918)) -- review style ([06feed7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/06feed7c22070b9801609d80018d76aec44c3a88)) -- review style for view ([b3ca307](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b3ca30795e223bb2acaefdf38bc3657853b52d9b)) -- review style of button for GCU ([cf0c448](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cf0c44814cc1c40cd8e158cb3e1a3e30a7c9d899)) -- review style of TimeStepSelector ([ccec11e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ccec11e59b3429a10b8accfe5bbf9fe5f0ec9391)) -- review styles ([5cbf134](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5cbf1342642f0ed03bc7793186bb7e1e69d28069)) -- review test before merge ([76b7ef9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/76b7ef984c41533d6e9b93cb7972be9dabb98e32)) -- review tests ([c03bc00](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c03bc0005081d42f59cdaa6a3a4ce299a8b2572c)) -- review tests ([1e43eb4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1e43eb485137e34d9a01146e3148b27b6e984ae2)) -- review tests ([8331b8c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8331b8c80386701929ff6fe1e084385135fcb781)) -- review tests ([6cd7b36](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6cd7b3694becd41a3978dc9ba5659ebf184b8ad2)) -- review tests ([192e26a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/192e26a0075b80f7d58710102f290217d1794ec3)) -- review tests ([236e304](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/236e304cc6ebc87e23cff3ce680376e138e348cc)) -- review tests ([befb1ca](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/befb1ca39cdf97b021c64a596ae3b6667b6bfb2a)) -- review texts ([93891c8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/93891c8647396542dceaaa2bdaa5dac319f0aa83)) -- review time period model ([a2f9f1d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a2f9f1ded21422efdbcad8cb5b94a7075df6ff09)) -- review time period service ([4490ff4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4490ff4776ea412c9c12522ef2cb952f2c9621dd)) -- review trigger, konnector , connection ([dba38e6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dba38e6e567f6016b8ccdff1baf1eeed365811c4)) -- review type for updateProfile ([48d22ab](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/48d22ab23ae7a719d1c6c7634d07226ccf0c3c93)) -- review userProfile service tests ([d2b7817](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d2b7817f064053e872c9c5adceea4e602701b5ad)) -- review Version component test ([ed59cec](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ed59cec30dd44c3e7ec638baeedb5e2b8c40208c)) -- rework account service ([892be60](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/892be6038e071b657a303812dd0e57d76457056c)) -- rework oauth konnector flow ([4573359](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4573359f6de4b0c78b887027aa5a1eb2ac46529c)) -- rework of konnector status service ([a007049](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a0070499b03a22886296d79111b5962bb81be983)) -- rework of konnectors ([d9af00d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9af00d3833302072fbf592f0a2bb4d2b07af453)) -- round correctly the threshold & consumption ([3d04255](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3d04255df333406707ffd8d5af6c3812551abe06)) -- script for accounts & triggers creation ([fbda124](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fbda1243f0caa6b3fb81ee06fa1d69330e45d694)) -- select item menu in ecogesture list ([7d289b6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7d289b69cdb96335089a7e1a9d93e84862f8683d)) -- select item menu in ecogesture list ([a409533](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a4095334649542110a343d1009e321b5ec56ffc3)) -- send compare event only when comparison is activated ([2730b08](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2730b080db919147d0857b31ca67590b05d20b3b)) -- send firstConnection event ([d3b38cf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d3b38cfd4b0a2b89e379db80e2c3824f33ebf8a0)) -- set aria-label ([57747c8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/57747c899dfb66d2635f4394d740d787010b3ed9)) -- set color for link ([b614382](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b614382cc4b8372493fa69fa68e7a7847081c5b8)) -- set color for nav link visited ([2c7c58b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2c7c58bae33e282814946c75147a05576dda6517)) -- set correct constrast on cozy bar menu ([3563d4d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3563d4da1dee6d8e36867d15b8d86cb846041b9c)) -- set correctly shouldLaunchKonnector in store ([6c977cc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6c977cc88ba79752e1c8891b8d30be18bdcc443c)) -- set cron for aggregatorUsageEvents ([b4fbf49](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b4fbf49e0725f5c7f0b6680c120d4dedce6b1141)) -- set cron using config file ([b213151](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b2131512ce918082960dc1a655b4002865c6066a)) -- set data into report mail ([e95d263](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e95d263393c9e9672ad6f5cf93cd4089149c9ec4)) -- set dataloads when launching the boss ([e8c5448](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e8c54486395a7e7823b82650d3e42fad717af3be)) -- set default ecogesture icon ([487f5e5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/487f5e5eb61bfeb02be50399bd38b3aebca827b2)) -- set loading only when changing fluid type ([56880ae](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/56880ae3671ed035027d2715b5f9e19b5e021384)) -- set locale for feedbacks ([660ad28](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/660ad28ee0b29e2efedd342520524f7a2649bfeb)) -- set luxon dates to utc ([804f128](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/804f1284070e85ff5566fcb261228ca9205b22fd)) -- set mobile or desktop for ConnectionEvent ([279cb4f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/279cb4f5545f895f22b56d3831329f2d412fc62c)) -- set notification on init ([de04f0b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/de04f0b849e3a424dc1d5fe4a7260333904d8a54)) -- set only in the ([06811bf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/06811bf5820e28f22a4301a4ec8710724f8896ee)) -- set profile between step ([eb17803](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/eb1780331fbf004008438ed162fb8560e1aa5573)) -- set startDate to QuizEndEvent ([1e1ad99](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1e1ad990fb7f6b9a95c08714db01394421d400aa)) -- set style for cv-button ([ddeb533](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ddeb5331d7bf91f30b609c631bd008d96f2d38f0)) -- set the button clickable ([1138e1a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1138e1aded4ba9a71d81a799a44ba4d0cf7c2029)) -- set userSeasonList on init ([bcee4ce](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bcee4ce2ebe28537486bd6eb4941a38e9bac40dd)) -- shuffle waiting texts ([26dd0b3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/26dd0b3bb4a8b3086bbd0316fabae713fdce7e53)) -- sort KonnectorViewerCard ([e7e72eb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e7e72ebf9da55b073efd6bdd17626d6c8b6e928f)) -- split ecolyo and cozy store ([0e5883c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0e5883c1e16730bc192afcb7440e94af271f0eae)) -- split layout styles into rights components ([2728ebc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2728ebcaa44ce7e268e38cc86a21c97b34b0930f)) -- split utils ([d6db9a8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d6db9a89dbbc284324ade991b70fd48c856e4d0e)) -- split waiting text to remove duplicates ([621edb5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/621edb5c28083fc4e0d8c11cd275d0c86398baa9)) -- split waiting text to remove duplicates ([985aa93](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/985aa9305c1927e12fac6cf0a59561354ce98c5f)) -- start implementation of recoil ([6da0f02](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6da0f02ceedf3c596786ec0dc4b42a3ede939d39)) -- style containe question component ([35e8606](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/35e86069a6221709b58b6eebd18be0b0c9428e39)) -- suppress mail field from feedback form ([96dddce](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/96dddce6aae9476685b5585c9b88b16b3599b257)) -- test account service ([41b9312](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/41b93120ab0576e1c54043baaef8e0bec84b04c2)) -- test analysisConsumption component ([2ad090c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2ad090c9fb4ab2d354184c0d9f46bf938ed0ef7b)) -- test defineTimePeriod from dateChart service ([33dc027](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/33dc02724753bd47ad38cafab119bcb9dc183809)) -- test exploration finished ([3edbf98](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3edbf98336b53592de4ccde3cc157c751ce9f41e)) -- test exploration view ([963a646](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/963a646052a5722259b9b6e0cbc19c781f14aca2)) -- test for connection service ([87d98d7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/87d98d744120f58757162912cc8ef5656a0edd88)) -- test for konnectorStatus service ([c622260](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c622260d140e89238c9b70629690021f4707c571)) -- test for Navbar component ([446cd05](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/446cd05632eda24e23a209410fb526f30a51b975)) -- test for OptionsView component ([a247b1e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a247b1ed16e1d7ecccf4aa13ccc3f650fbd3b65e)) -- test for SingleFluidView component ([7f3eb55](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7f3eb5560399d44473e5c02df96bbb86f2244591)) -- test for Version component ([41e006e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/41e006e81b3679a74b30607ff5d27eca68b45bef)) -- test of ReportOptions component ([28ec9b6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/28ec9b6ddeec58d1d1ba04ec61255dc797f43fd4)) -- test of ReportOptions component ([af44729](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/af44729ebfcbf1e4b5c28c2a4cd5d2f8fc9c3dcf)) -- test profileTypeOptions ([ff53d41](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ff53d41ca6d7a05e042dbfbbcc958cda2c364fa2)) -- test quiz begin finish and view ([0d348a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0d348a47c728b0192b24adc4f23a33805e3105f7)) -- test quiz questions components ([401ef83](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/401ef83bd983bbbea0f703b0f5de988c33bebdd0)) -- test trigger service ([f8ea673](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f8ea6734d12e90546998ca72c0d5593a397db88b)) -- test WelcomeModal component ([1ca25d4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1ca25d4f42eafc17879ba729012ed09de7d99d0e)) -- tests ecogesture service ([29b0f36](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/29b0f3633991805014967cecfce89117177d2084)) -- tests fluid service ([2fc3866](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2fc386695c5de1d86016e3036722cde50b921c7f)) -- tests for converter service ([39190d0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/39190d01a97921b88c67911114ecbdca4071524d)) -- tests for Cozybar component ([7d170d4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7d170d4c9cba46861d30971aa1004dcf3006b7c1)) -- tests for dateChart service ([145e496](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/145e4965bd6816549421117c539e2376e53323cc)) -- tests for initialization service ([b668c85](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b668c8580270ea0a9dddfc2fc4c9223a83efc361)) -- tests for initialization service ([07a07f9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/07a07f9d57e777e6021e6ba187ccf0c597366f90)) -- tests for LegalNotice components ([507111c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/507111c4af413a56556212435e719138c3e711d2)) -- tests for mail service ([583ce95](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/583ce95a6f3cf6cd4ee9fac34210dfe6c350a3b8)) -- tests for Navbar component ([137df0a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/137df0a1a7829ecef3a37b40ab752da376d97fdf)) -- tests for query runner ([cb51ec0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cb51ec048504e47a6102c32d827ee0208e8a241e)) -- tests for query runner service ([90009ea](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/90009ea4c88bee6b10aefda608d3b779127794e8)) -- track loding success for userprofile on init ([1ebcf5b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1ebcf5b5fb928bddc5011443762117d7d893b6ee)) -- transform stopButton to mui button on ecogesture modal ([5f80a36](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5f80a3611ab993689f8b2eec0f47b10c4566f28c)) -- transform StyledAuthButton to MuiButton ([3925d5d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3925d5d3780b5a5dcc072c74c290b26c21223add)) -- transform StyledButton to mui button ([305d75b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/305d75ba5b736d21e3a33336403dc07cd47c5f3a)) -- transform StyledButtonValid to MuiButton ([0c6f7a6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0c6f7a66a56ba1ae18f5445daca0fabef0f93735)) -- transform StyledStopButton to MuiButton ([b87fee1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b87fee1b818411c7fb21671f86658c5d8df2f562)) -- type constant ([b9e9b60](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b9e9b60384498fbd6c5ca230ce272c3ef95a219c)) -- type index.tsx ([14f3aef](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/14f3aef98cec1029ed3fcf5f567c072ffec48481)) -- type of Trigger ([f57d26c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f57d26c93308b009f5871a9b9a5c90b96fe6266e)) -- unlock ecogesture for on going challenge ([dd50320](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dd50320a01376d213625d6bb1582ddaf98eb3099)) -- update ActivateHalfHourLoad ([cce3194](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cce319492e85c62cd9e7b61a02331b5e15173b1c)) -- update aggregatorUsageEvents service ([1bf5533](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1bf5533b8c7e07be6e327d4ac8a55ae4919cc8af)) -- update analysis for disconnected fluid ([adb8bba](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/adb8bba71a5445b167da4198f7e615c67ebeb843)) -- update AnalysisConsumption ([0d259cd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0d259cd8ccc979d812975f86700be2a7c4668938)) -- update Bar component tests ([5cfd6de](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5cfd6de88808028b813014562c37498caaf39307)) -- update boss mock data ([05e4dd8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/05e4dd88e3a5579126ad5ce36ea8169401968d2d)) -- update buttons for Analysis ([d01f9ea](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d01f9ea3c3e892a7ebacd501a051d1af591e6d95)) -- update challenge content ([bd9cc43](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bd9cc4325786f38f9bee25d9ca6522ce6e114e4b)) -- update ChallengeCardUnlocked button ([4695ccb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4695ccbf5c61c3827a48cfe642092d709aaf9010)) -- update chart size when data is loaded ([a451a73](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a451a7342b0d7a50c8f7b960c3d0f99a3d30e195)) -- update chart store ([8199c8e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8199c8ef5d5ec5230482f2317c1e95d506354dcc)) -- update chart store ([aa08f68](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/aa08f68c9ded2db8fcee8765298c2a1e9a8fbed9)) -- update chart store ([a4ac5a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a4ac5a40ca0a90efe44349b4415c85aaa4c15cac)) -- update Connection buttons ([84a0935](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/84a093542b1e98a4f1bb90c71f0ae30eb19595d6)) -- update conso components ([c51796c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c51796c72f0b4488865016dbcc99b411e03f8ef7)) -- update consumptionFormatter service ([a0c3f88](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a0c3f88df847ff8b01ba2464d72f80862960d229)) -- update consumptionValidator service ([ee6b02d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ee6b02de97b1a8fda1b9ad311c5b13ef1a1f6cf6)) -- update cozy-script to last version 4.3.2 ([7e23d64](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7e23d641284af123e48a9ab933b5262bd8de753f)) -- update cozy-scripts to version 4 ([414745d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/414745dc068ae9af0c156931a8bc49ca3543125d)) -- update custom question service ([8a5f504](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8a5f504ab716d12f364f29e8c9e2b868709d503a)) -- update custom questions ([7bc2ff3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7bc2ff31bbbeccc58a25ff40843a7cb5eede3f40)) -- update data for custom question ([2034248](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2034248ad8d54db55d14f990ce23e89ada5be683)) -- update date utils ([dc6ee1b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dc6ee1b8c5d352538ac77569133e49594af0743d)) -- update date utils ([597c1a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/597c1a4caf0b347b5ca9d31430cb344b415f1409)) -- update dateChart service ([eac23e0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/eac23e011177ae9bfe9e159f4e734036e96c6302)) -- update dateChart service ([5bd7d8f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5bd7d8f925c2051d58018a566cef5306db284c9c)) -- update dateChart service ([fcdce5d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fcdce5d935d0c296bf69e3b3b34b9fa5069d6f73)) -- update DateNavigator component ([c3531d7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c3531d78e57672f6a99c57c7a8d9e53b8816b275)) -- update DateNavigatorFormat component ([d8f20d2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d8f20d2cf5f99d168c79831ac235f82cd3cb6dc8)) -- update Duel buttons ([e2052d9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e2052d92b841f0f2635847a812463d831fadd223)) -- update Ecogesture buttons ([de57bf7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/de57bf71af280b92af6c180783897925c7e96610)) -- update ecogesture id ([cb29174](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cb29174e77a7566e6a4e1fa84e850b8ff963afda)) -- update ecogesture json ([af931c7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/af931c7f72d7eef9e92544d32834525e4153436b)) -- update ecogesture service ([f7e812e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f7e812ee2340c1d6bc8854a1b2490fa6f4220f95)) -- update ecogesture service ([3229423](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/322942398c35adf46353e20189b6ea81c014748a)) -- update enum for exploration ([8e2fefd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8e2fefd01f97f5a3447f9c71c259cc5cd19d3b39)) -- update explo description and change order ([029cec0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/029cec0af0cc40be2e8ed9ddfaf93f2d9a67546d)) -- update Exploration buttons ([765d1f3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/765d1f367b278d785d7c6020d4a501f02dee3106)) -- update faq style ([34f411d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/34f411d81d76b831ca8169f9a56e2782dd674714)) -- update faq style ([d5b730f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d5b730f3fef7e3f2393a2e2a4bfd14c0c81b4d52)) -- update GCU content ([793fc03](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/793fc03892d351b462c49e073c0ef159f2531176)) -- update global state on connection ([3f04dfc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3f04dfc18220e75035902570801b8cd74087d3f5)) -- update icon challenge ([d922f2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d922f2f81034a1ec07a1fe09b99f6ab65c175bb0)) -- update icon challenge locked analysis and answer quiz ([d9e0ecb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9e0ecb62c3dbccb28763327177cddd60c622429)) -- update initialization service ([1f8f0a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1f8f0a46ab3356ff5a49e6245f64ff3622b2f4fa)) -- update konnector labels and aria-labels ([686ff63](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/686ff6351c96758ac5c373ac3d831da99e000af3)) -- update local for "fr" ([1780dad](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1780dada489dabc67cd07be65d2cb2ad20196978)) -- update logos ([6a65068](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6a65068d767eb89d12c6d2eace037449e29abe5e)) -- update mail and replace input report option to switch ([49b044b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/49b044b4155daf0f66877a9ed07b10047f41219f)) -- update manifest ([ddaadfc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ddaadfc541346315e2045e449edecb06c8407886)) -- update mock data for season tests ([198c450](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/198c450f29e9d7fed81ab6420d65dbeba3789266)) -- update model and mock ([3019e8d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3019e8d307e0bdd2acde154a2ee6d158ce1c7c84)) -- update model json and mock ecogestures ([a9ab684](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a9ab6845b280b47c9582a5196ca48b5050a67a0c)) -- update model mock and json ([b3ecb24](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b3ecb246b96ed866f31f3e989360a251670cf407)) -- update new logos ([cb10eed](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cb10eed3d97cad539b50da9147a4ccc9ec57c09f)) -- update of dateChar service ([15800e4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/15800e4971ee8b5f61e5af902439708de6477db7)) -- update of packages ([5db3f0f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5db3f0f6c4a4868a776a54a138d6a7ea2f2ea382)) -- update permission translations ([09ae4d8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/09ae4d821e7b6411dff890c173255fe0047ba361)) -- update permission translations in manifest ([f986a3d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f986a3d6ea1dd64c76c51a70926e282c597de128)) -- update Profile buttons ([10cf37c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/10cf37c86bdf2314b8d432fe04d6b6ec2ddd84d4)) -- update profile data ([c7e1a7f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c7e1a7f4675d46ce525f5172c03d7e29161ae312)) -- update profileType model ([85a1f3a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/85a1f3ae89f49045c701ac05b55b2e9af3887529)) -- update pwa settings and add service worker ([b6f261d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b6f261d1824d6ac2d1017c9f485a3adc951a2359)) -- update queryRunner service ([c3af689](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c3af6898fe941f678533bc2aed0a1682919fd27d)) -- update Quiz buttons ([faa29ab](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/faa29ab4d784f709b2f1cd95b4c5503a8e4f5c74)) -- update snapshot for FAQView ([2ae3452](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2ae345230be189c265a8bf32e7f1a5cd67e5bd82)) -- update snapshot for FeedbackModal tests ([c4845b1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c4845b173b5c354a14bcf8e6ec2291a8955f0b50)) -- update SplashScreen buttons ([9791508](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/979150846f4904cb6bf56ab77935c8e3c6043b39)) -- update styles ([499250c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/499250c7a49214e75c42aed1d2e67374e4cd058d)) -- update svg for quiz wrong answer ([fdce9de](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fdce9dec7f09e5ada8430c140934c8da0c887266)) -- update test ([f4e205f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f4e205fb6d789e2db9dccb363c490580e61fbc9b)) -- update test date ([830a3c2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/830a3c29a5f9554a7e30ee0cf97c8f91207c841a)) -- update test for Headers components ([a97f7b0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a97f7b0551888e841e7e644bf6d6040a5fa58a4e)) -- update test for initialization service ([5b30ae8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5b30ae876c3d87a1d222d62e56b7edd28cf8f34e)) -- update test for Report and SingleFluid Views ([d16f90f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d16f90f56d404b4f0ed68f4c53cf7e38e3a17d7c)) -- update test for seasons ([fa58de9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fa58de97eab7af4c8f25026466a6d9623a5d877b)) -- update test on season and boss ([f692069](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f692069536012596999c9903ba89d719f9a7391e)) -- update test with profileType ([1baf26a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1baf26ac21822349340d89a3e37cab372910c453)) -- update tests ([2f53fc6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2f53fc657198fe886adbb2fcfcab5167923b22b8)) -- update tests ([613b31a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/613b31ad0599148877961de3198cdaaeeb5370d8)) -- update tests ([99c7bdd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/99c7bddd315e76dfee76f598d7dcb430617a3d5d)) -- update tests ([45bafd8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/45bafd80800edc1a99da6825a1815d548ec501c7)) -- update tests ([d5b30f7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d5b30f78c2de6192cb9343233faf9ee8765b0340)) -- update tests ([f89d73f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f89d73fa6326dfcece9c0ae6c1e18aac2dd13293)) -- update tests ([e06fd14](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e06fd140b9f2c69a928c2361adbf2348cea1d3bf)) -- update tests ([7f91342](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7f91342af0c97ccc495ea7db2ba803b11b0c72eb)) -- update tests ([991d0c5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/991d0c553371d0027c95084c6699844269d16969)) -- update tests ([58d4235](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/58d423504aaa48c617b089e1e83de421ab41133b)) -- update tests for Duel components ([741aa00](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/741aa000c3fe9b7907c3446de420a0b6569fb7d4)) -- update tests for seasons ([2512729](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2512729af6f25137c6e5254bce69f07139d89e2f)) -- update text explo and quiz ([923350c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/923350cad4f39ec90df4ba2c5fb14b797a91f727)) -- update timePeriod service ([027a047](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/027a0477e187bd9119f8d9772438810cf90a8f8a)) -- update TimeStepSelector buttons ([1f54a2a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1f54a2a9b3be0a0dbb21a4320e06e4a67c9622c2)) -- update TimeStepSelector component ([c6d5d78](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c6d5d786cc60ac4fdfc597f8aa7c38139d398546)) -- update translations ([33cc2c8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/33cc2c83073d4202c06d1fe5fb675381667b63a5)) -- update translations ([cb3154a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cb3154a5b5bec100e85acd3422914025c3d74f34)) -- update translations ([91a95e4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/91a95e4eeb56034adf6ae85dacb37ee964f84d02)) -- update TriggerState interface ([328bb4b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/328bb4b0298ddb5c7345dc99f8b7bc060417e60e)) -- update userchallenge data ([7d6d5da](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7d6d5dad8c19eb3474ae3f5c2fe99dd4d1325dd7)) -- update waiting texts ([81efc20](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/81efc2017c26b4eba2adcd1bc733e307df177fe2)) -- update WelcomeModal buttons ([7ba4103](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7ba4103e370d4cb8d86ab586fa984ba5c1c89a42)) -- update yarn lock ([4a71992](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4a71992f153cc90fe795447912b7b03836b1aa46)) -- updates tests ([d623b85](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d623b8579e5e75a9c61c1d20d79ba1f54c209b3c)) -- updates tests ([8ffdc22](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8ffdc22d2532be93c4237541e55492486a8df38d)) -- updates translation for permissions ([0c41760](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0c41760f4555adc98e3888825fd9c0fb9d66a869)) -- upgrade of harvest-lib ([849f525](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/849f525fa7536c6e30f05ed11791b69d9ec50858)) -- use ceil on diffDays ([4437f1f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4437f1fdd96a05d5052e1bd5c6c01fee8158d01c)) -- use client and translation hooks ([c15fa45](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c15fa45ef62b5a64331c560cb413c028ad1aef66)) -- use config service ([73c0f92](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/73c0f92890a5f41dfa88b43f590c65293d999198)) -- use context for welcome modale ([b2a1b76](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b2a1b769aa5b1cb95084248fa554d9bbe988ce5f)) -- use eventDate as sort ([9463b5d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9463b5da27dc739117bf421e075ec0d42ef293ef)) -- use fluidConfig service ([b955dff](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b955dffd1eedc0be75ffe2cf531bf2fee9277ac7)) -- use of multifluid fluidtype ([515262d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/515262d8f1f358edf9f60ce089e7ab58f8aff1b9)) -- use of promise all during init ([2a6c149](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2a6c149232a8effbb9f064e565243e1e6cf0555a)) -- use of promise all for entities init ([ffc0c10](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ffc0c100f62bd135c66d0ac85e5b12f5583c3199)) -- use of StyledSwitch ([ea3c241](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ea3c241dfaaf40780d613c1a597cdb3982015021)) -- use selector fluidTypes from fluidStatus ([9c98b18](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9c98b1812a10c51414274eefc57f40eac217a025)) -- use updateAccount ([6da3813](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6da381331873c9e0563e4cc8c893f4bbdc0a753e)) -- useMemo for shuffled waiting text ([39aecbe](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/39aecbe081ea58b5226d951bc2279d16cb49ad9e)) -- userProfileService ([75b45d0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/75b45d04293306c323a9070d50d83fe3299bc24d)) -- vertical center text exploration card ([a9f2a12](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a9f2a12982a58e5ae9609b54057637654142fbf0)) +- 4 weeks challenge + fix level + fix badge error + fully locked challenge ([6e6a031](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6e6a031c1dbd081e4669c55f704483516812695c)) +- add \_id to UsageEventEntity ([9113ed0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9113ed0bb195cddce6bac94f40ff477dcb69acff)) +- add 'en' translations for permissions ([b888462](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b888462071093baadba45f2c08b4ae467b175021)) +- add @types/redux-mock-store dev dependency ([616cef1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/616cef1014cd90ba4bfb1d165a6fe372804ee611)) +- add accessibility for forms ([97c9745](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/97c9745f8932100f6420af01360434e7ca760e36)) +- add aggregated boolean to usageEvent ([0829d06](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0829d066d7d56e9ea8e1b77262540877f1300c84)) +- add aria-labels on DateNavigator ([32085eb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/32085eba7bf3e80bc327669af9f1d3a76317ed16)) +- add autofocus on FeedbackModal ([90d5780](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/90d5780a3da1b91be3205ca7164452207b543594)) +- add babel-polyfill for tests ([582d3bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/582d3bbd4046d54155e0433d512c7a73e73635d1)) +- add black spinner ([3077a3d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3077a3d874ecff6a9c54d171db29b799b4da739c)) +- add black spinner ([a9406a3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a9406a32e38d6083bf6a2d4bf616219bcf21e71b)) +- add card ajust profile ([328c244](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/328c244e7c068fd7c824986af26f79fad83a29d5)) +- add challenge information to report ([6cb368f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6cb368fd8ce0ae36b2b95489d22f2c17d9b8324e)) +- add chart actions to store ([6667969](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6667969570adee25c6eea547084a37adefe5eb5d)) +- add cold water in profile options ([9ffbafd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9ffbafd6927ea309db2b411543663bfd25415b99)) +- add cold water to profileType ([253f7a9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/253f7a9901145cf4a98273e01f628c78be1f0526)) +- add complementary description to exploration ([52be32c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/52be32c3c4017d2d90bb36e5d409d710c25ac76d)) +- add condition if name undefined ([7f03afa](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7f03afac2d7f856dbd35705fb8c0478b37487fea)) +- add config for cozy bar tests ([27f3df2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/27f3df201cb76fd5cba3793f5c07df4133109dd9)) +- add config for snapshot tests ([0421b43](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0421b436b7199446009148e4f9cbf5e7cd1902b5)) +- add connection information to fluidStatus ([f8150a1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f8150a1901fcdc5d2c393a138e435f5bc327fac2)) +- add consistency to profile type ([37897df](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/37897df9dd91ac9be17181cc74d369a3b9bc273c)) +- add data for futher season ([1ce54db](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1ce54db02d459b2f5b82f53f0b74ac9d6d073e68)) +- add date on header ([59e0c35](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/59e0c3592c7f85d0216ad4ec68859d96e2d6062b)) +- add dateselector for report ([c6a90ef](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c6a90efed75bf07a72d074626574a3b6eb55f2c9)) +- add declaration to withClient to avoid error ([dc6c44e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dc6c44e3443ac21a6cb2a58ec7048c55af6ebe8a)) +- add doctype and models for usage events ([732680d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/732680d6a6cdae0231c375693a5ccfd09ef37068)) +- add duel result modal ([8cef75a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8cef75aab58b677f0d46fe6e197629e82029afd4)) +- add ecogesture info modal ([bd596d5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bd596d5a00773c371182ac8682c39173009bfbbf)) +- add ecs constants ([3b9d0c4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3b9d0c4c9fa68d8cee005995335f07edf2ebd1ad)) +- add enzyme type ([771d11f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/771d11fdd49032872495426ead68e244e77f9dee)) +- add error messages ([739ef4e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/739ef4e2d3a2dd5f5484948795853994936a68d3)) +- add error msg on graph ([ae413b4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ae413b41ab21ea469322d389171a465d8c37a1a7)) +- add eslint-plugin-react-hooks ([ebfe45e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ebfe45ea9f3dbe96848a88ea2590ad856a7cf066)) +- add feedbacks icon in cozy-bar and header ([709648c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/709648c2f9e03a85525b936b58d2803dca85deb0)) +- add filtered ecogested on second tab ([60ab071](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/60ab07107d9364fc4d0c3b1082dff192be65fffb)) +- add finish profile type screen ([c8fdc97](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c8fdc97794ea648ae826c06795e8e067dcff4cad)) +- add fluidStatus to context ([2c4204b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2c4204b6b1a54c6aeea7fe5a716717d091911d4f)) +- add focus background color ([67ead44](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/67ead44b7726a0827344ca476211a6500b00912e)) +- add gcu components ([55fecfa](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/55fecfaff8fa7735873ec2304ac7f193d147aeea)) +- add GCU link in options ([4b5c8fb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4b5c8fb8e3e283e5d57cc5957db43bddd4c9174e)) +- add getData function to index.tsx ([af5a299](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/af5a299d877666ddc1bab5ed531f4654d962bb25)) +- add hook dependency ([e5deeea](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e5deeeaf16638c7483b5976005b9a2dfc691192b)) +- add limitby in boss service ([d1c51be](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d1c51be0391584082db5892b69977da0fbd69272)) +- add link for account creation ([fb25637](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fb2563701c1366ed3a18d4fee883fd12a6e3bed8)) +- add loading screen on konnector view ([7d27347](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7d27347ba6ae199a490a6449d4ce64a2c35aa2a5)) +- add location into feedback mail ([dd8cb10](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dd8cb100c1dcb2d15cabdc5cb6cb4255963f7e95)) +- add models and enums for profileType ([1ef7cb9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1ef7cb90d1a213c07b69abc78e156caef712d04a)) +- add new icon ecogesture ([8daf187](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8daf1879b4fdb49a13f5b827029a4a61510ce52f)) +- add new question ([58a2e3f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/58a2e3fe5c43e6308ccad87e58d4161e16be4aa4)) +- add new waiting texts ([6580864](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/658086423253021eb8166e86076efbe1f740f223)) +- add new waiting texts ([46479bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/46479bbd1df939e3ae132c568d857c6965588cb3)) +- add no data for comparison ([3f6f399](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3f6f399f02538b3df4429cde539a83e34be15872)) +- add notification for season ([f603b43](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f603b430e1f9829fc9eb8b06674695c347b4311e)) +- add ntif handling in navbar for challenge ([f503d93](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f503d935325a18361d1372b0560f1b195d83b457)) +- add number of page in session indicator ([df01f12](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/df01f1214735cc94c2ba7939e142979e16cf2442)) +- add padding for text filter ([a15c9e0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a15c9e0f1b107f8733bef3e05fdca31b286d8c88)) +- add profile and global store ([f7d4071](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f7d4071b101761ce221d20ad0d4d493e45cf73a4)) +- add progress and boss launching ([e44ebc2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e44ebc2a196672703ceaa6080819f53e8bef056d)) +- add question and aswers ([c9fa0d7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c9fa0d7b491a8b265843eb357f6c9d726adee055)) +- add redirectSlug for OAuthWindow ([9afd787](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9afd78728f6bd8486f62a4a43a6beaed9fe319e2)) +- add season & boss hash to profile ([429486b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/429486b51975b1aa4b4deb2ca1d1ae9fdc50b0d6)) +- add season reducer to main reducer ([f07b827](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f07b827a7a19dd2dce8b79b2c27b11fba1331f1d)) +- add send mail for test purpose ([64b52b7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/64b52b7a63b4729c0f964a69e20f6807d7e4d777)) +- add service to filter ecogesture ([b2af4b8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b2af4b835198b8e2b131980ee47b03f730767c9d)) +- add session calculation ([e61b9a6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e61b9a6c2e769436102a632118272fef866dfd05)) +- add setSeasonConsumption in season reducer ([6ca162c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6ca162c5a7447f057d04afd44e15b8ea67ae5114)) +- add single choice screen ([654a7f6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/654a7f6918549e0bd3184f9f7110a53695781cf7)) +- add single fluid flag for custom question ([ea16e20](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ea16e208451fd78072d7cdfebbc18b4aa7971aeb)) +- add some Indicators to aggregatorUsageEvents ([2c15a0e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2c15a0edb9192ce54cf29d508f1c6eeff5a63aad)) +- add spinner for custom question ([8c722fe](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8c722fe5477d6394095e5c5ce19b06d8f57be72c)) +- add startDate to quiz ([33a8c86](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/33a8c86e53d15fcc2bab7dc6debecfbca769e9d7)) +- add store tests ([f03eb0b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f03eb0b64b119e12fed1f9fad5b903eec6973a16)) +- add style for selected feedback type ([d16f46b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d16f46bb0795b1cdec828c47fa9ca759ff2d79b5)) +- add test for chart reducer ([23e736f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/23e736f532acfbdad29a718d0d6d41f7e22c845b)) +- add test for Duel components ([ae26afe](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ae26afee4f40272158880e4f2a5f460d2552ee33)) +- add test for duel ongoing ([9cfb6ef](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9cfb6ef2cbbc5cc3adb8b078c997799408eb4a3a)) +- add test on options components ([fa179e6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fa179e698cb9ef78544620b889a649cf9bba3374)) +- add toogleBackgroundScroll to feedback modal ([ca930a9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ca930a9e127851d0fe987ef9534d5e025dae296f)) +- add TutorialWelcome to App component ([5b6e5e0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5b6e5e0735dee9464d74647246ddde569c2e56db)) +- add type to connection and account service ([7665439](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/76654396aa0b0836afb5328b320b0fb3d20bd965)) +- add updateAccount service ([d193bca](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d193bca0a2ce7d98f92d68d454ec251ec397873b)) +- add url into mail ([ed50dd3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ed50dd3ce901fed50a0a663238d83a64a95dce81)) +- add usage event for consumption ([f626ce7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f626ce7dead5247174b630a19fec3e10a4c09210)) +- add version into feedback email ([d17f055](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d17f055e69807e9598fb904c0816573a8f972943)) +- add webpack config fix for windows ([ec5d164](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ec5d1648377b756a02cfbfea4e94ddea555e152a)) +- add yellow border for feedback modal ([a9acde1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a9acde1420bc21d20a99630ad86e6f8995e42048)) +- adjust margin right to chart ([8dcc5f1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8dcc5f1bb3243344e2c677522f9f62cc4dc828a2)) +- adjust nwh modale style ([b073c81](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b073c812059e724d2a7a5f137d9e3f71abc987c9)) +- adjust styles ([dca03df](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dca03df6d21c1eefe0f3be0867a086a4c025c71d)) +- align ecogesture texts ([00a7000](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/00a700019a08a90f4ca9ae4fde4065cd8ae57cf1)) +- block navigation when last index is reached ([6fc4a92](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6fc4a92c194be06bbc91c624ebfdbb25b7c9d7dc)) +- calcul the end of a season boss ([d463772](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d4637720ec73ce04e599ada90eaf4703d2df107c)) +- calculate properly the threshold ([8f01235](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8f01235eb59519196608f57bf85c930d2a16d455)) +- calculate threshold when going to duel view ([0776333](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/07763331d1e59c5d4c2ef72c6f143c7bedf76992)) +- center ecogesture icon and name ([6f91fc1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6f91fc1955292085442ef3fe5853c2823c99440e)) +- change accordion for ExpansionPanel ([1714364](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1714364602eee64bfdc94da886b3e257592e1cab)) +- change accordion to ExpansionPanel ([21045d0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21045d06570403e4ec990176af8e0b09e90bb438)) +- change action of card for accessibility ([127249c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/127249ce7b114ea6d6cc10005686dfd74854d83e)) +- change ActionModal ([f91267e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f91267ec2297c3130408b903695e28f38674bef0)) +- change AnalysisErrorModal ([9d84681](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9d8468102f04db29590e1d0fa9c866b2247ba663)) +- change asset boss to duel ([7bcfa9a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7bcfa9ae4cdfafeb0779b780e66aefe34f80a3be)) +- change boss to duel ([a2f2655](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a2f2655fc60789c6748a596ccb53203bb3bea3c6)) +- change calculation for handleScroll ([a230a81](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a230a811ddf2d810e6579f798346c439328d08e7)) +- change call for trigger ([8052363](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/805236364acf25072e8a30d3751996a05604289d)) +- change call to model ([2d165cd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2d165cde734c78566647927cb20aa10c2d0a4469)) +- change ChallengeNoFluidModal ([5d4f3ed](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5d4f3ed5c60ce44b03e4f9df812ebaaf3ccf7525)) +- change chartduel to duelchart ([a8b93f0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a8b93f06cc67b98ec4d71d6584a6a90b0c821ca4)) +- change comparison on badge ([61ac80d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/61ac80d7a33b86410c0947684394ffe6e8ceb6b5)) +- change comparisonPeriod for month period ([ff654d3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ff654d3fb197fcca6f720958ff2f8dcf88656163)) +- change component season to challenge ([cdf4a6a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cdf4a6a3377490e142acd161d126e53b5dfb44a5)) +- change config model name ([632ea96](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/632ea965988779a43e0b70f98916e454c9ec840e)) +- change creation way for entities init ([d3b7e37](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d3b7e377d6b83d9b6b09f574f470268346135ba7)) +- change css for navigation accessibility ([7708cd0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7708cd02ac126bf0724d14de1546288672bb8559)) +- change date to UTC ([815674e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/815674e5dedde9380dd74713d431133116dcad11)) +- change db and assets season from challenge ([c7bde28](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c7bde28c170942ffd93ccca9269210435410c6a5)) +- change design of error & sucess feedback ([920762c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/920762c360f7b579355c7e6774cd645f60e0971f)) +- change display for day chart ([0d0e2bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0d0e2bbdfa491bb7d2caa7899b56cee0866e0852)) +- change display of axis bottom for day ([a3e6c8f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a3e6c8f805b087a0e722518fba3ec5f2c905d620)) +- change doctype season to challenge ([213d601](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/213d6012e0afc3bfdd64cbbf0684bb2f1f0ffa56)) +- change DuelEmptyValueModal ([947a003](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/947a00352bd43ac6a3adb25522caf2929c8f4973)) +- change DuelResultModal ([4da31d5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4da31d59a59636036d8edb2a388b03f8b56afd1d)) +- change ecogesture modal ([44f8cdb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/44f8cdb007ee43fdc09861a2b376b14c81f67d6a)) +- change ecogesture service name ([14004d9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/14004d9a1d8e546abaa27dd67d44d66227d884e2)) +- change EcogestureInfoModal ([125286c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/125286c9039f2117e0612bf4e2f7829d2cc562ff)) +- change email for test purpose ([7c5a51b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7c5a51bb014c2d2bcdd83c60a406b5e129bde17c)) +- change enedis link ([7f870c9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7f870c9ee74852cd1e3bc5323d6e4e1f80205480)) +- change error display on login form ([16f1431](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/16f1431ebfd192f4f8532eb3220924aa586d3339)) +- change faq content and use MuiExpansionPanel ([21448af](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21448af9fdfb380d04bf8cab448a4f9ad87bca4f)) +- change filter for service ([3a7077a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3a7077a4449e49d28ba8ce70dd7344780393aaae)) +- change flag for firstConnection event ([a9e1ce4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a9e1ce460033280c7d23e0a0a7470c718bce0c1b)) +- change fluid class name ([074b15f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/074b15fc483c28d2122024187c707e62b464fb30)) +- change fluidState atom to redux ([6161854](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6161854a1b6a2c14c4ecf6220a4044553fa21bd5)) +- change grdf konnector to Oauth ([2805cdf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2805cdf0173ad018f7b77ecad6d4edb7841ff285)) +- change GRDF modal ([543824b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/543824b96f5293076ad4351a256cb2c07b4401b4)) +- change GRDF modal ([8c0736d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8c0736d7ee4056c8fccb6ad6a1a824874b65eac6)) +- change height of ecogesture card ([cabfabd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cabfabdd98090046560bb062b77daedb15f8fd89)) +- change icon congratulation from quiz modal ([606b331](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/606b3314e733af6e8bbca8e1f2f455c7750fc7a8)) +- change icon for report in navbar ([abbf703](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/abbf703e71f0c85566aa8a88662048cf0ef19ce6)) +- change indicators in aggregatorUsageEvents ([4fb6f34](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4fb6f34f1d9303404f2c1c4eff5112e0f502a100)) +- change info for ConsumptionEvents ([54fefac](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/54fefacc21e4ae43c86925aa4c4c657a3cb6eb73)) +- change is challenge is over ([aa72c4b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/aa72c4bada07ad487d2ef6a4f1561b4209b32b84)) +- change KonnectorModal ([447039d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/447039d4352a30556782a76141a77964b440ade6)) +- change log for mail service ([e50d0ed](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e50d0ed150538d172ad9a4a5221ea96b87b0cb46)) +- change mock files data ([33c0134](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/33c0134f94e0d00b3bfb1f12c56af5cff55af5f3)) +- change modal atom to redux ([e431a2c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e431a2c1d362e601d5cb0ab77550f82b222923c8)) +- change model and enum season to challenge ([c82e3e4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c82e3e4ff1f718b7cd0dfdde1aebad74def6c932)) +- change Oauth form display ([7f4d1ec](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7f4d1ecd827effbed9d4d7447357de177d20b365)) +- change offline page for PWA ([4c55b83](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4c55b838ffbefc87f1582bb3f246dc4696bce492)) +- change OldFluiddataModal ([17bc3bd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/17bc3bdee1313f8e8a6329ee697c79fdf2556459)) +- change path to service into manifest ([1facaaf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1facaaffbf2038682e1625d803129ac53cd6e25e)) +- change performance display ([19264bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/19264bbabcb18e49d363ba8315e685a1f80d9397)) +- change period used to calculate maxEnergy ([9e6ef55](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9e6ef5571b453fb2aae0965f8bdf4b95aa9eb678)) +- change pile svg to coins svg ([47cbf3b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/47cbf3bc3c8d8ab3cced28ee1f73ff51f419977f)) +- change position of version info ([dd932e5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dd932e514fefba76d2a08c13568b5107cf559286)) +- change profile type service ([87c2908](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/87c290800ace404fba1151f83cf8c5bd24be5097)) +- change QuizExplanationModal ([0fa1491](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0fa1491583c0daa136cb3ed9df3ce756b149aec5)) +- change resetInputs ([06d591d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/06d591df2375bc6733cbee995764659642613997)) +- change seasonEntityHash to seasonHash ([1d9856a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1d9856aedd31f2242391a68e35f9f43568acee08)) +- change service to monthlyReportNotification ([1ce9979](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1ce99796becdac0f45bf69385dbed8df27e09541)) +- change serviceworker to serviceWorker ([3471bc6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3471bc630b72b7ae0afd86b2334ec04d25ca41f8)) +- change splash screen ([b9222c8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b9222c8bfaecf82f0df2df44bd4a08492da15019)) +- change start challenge label ([99eea22](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/99eea2296bbc4bc19eb28998d94437c765436022)) +- change store & service season to challenge ([697ab63](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/697ab639cdda23cfd2e56692f98438d0960c7f79)) +- change style of konnector result ([f614060](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f614060e935d6d1b4ac8fbd4be0bf38e5ad4a50c)) +- change switch case render exploration ([98f4dfd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/98f4dfd859dd4b63fe56fa62d9add6d2bd51918c)) +- change switch case render exploration ([10fdb63](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/10fdb63de4c3fed877bc041c95b3064649f6344c)) +- change target to lowercase for NavigationEvent ([b88be63](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b88be63b917215c8e808f64047204781f4b2879c)) +- change tests ([ca34c61](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ca34c61806a7454df89433d82299165eb6658de7)) +- change text for welcome mail ([7788581](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/778858114578b34538292ef40357d0cd42d2b702)) +- change timePeriod for indicator ([c92dff6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c92dff6e5c771e07049dd61f14b5bc3627fa5e5b)) +- change timestep label ([c586556](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c586556118bb98f3d417d457a2ad361f398bf91e)) +- change translation for ecogesture modal ([a6dda42](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a6dda4226e705a2ebf46f8c7b68f454b49d99b44)) +- change type for maxLoadsState ([3fffd77](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3fffd77e18902912294f25592d69d6fc67db5bfc)) +- change way to load maxload information ([ea13a11](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ea13a119d08d93b78faa7562aa70589a8f7f86e5)) +- change welcome and feedback modal ([60a93d0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/60a93d0fb5d1f1aca5cc7f11f436e05db693bc91)) +- change welcome modal by tutorial welcome ([2ec8842](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2ec88424c42bfa5ae68cf5c6f5594432bdabbf85)) +- change wrong custom answer generation ([f02d56d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f02d56d658579f055680d95286293305ab2d1bff)) +- change yarn.lock ([771aa9b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/771aa9bb5ccf54eb343b88cb06fd186ab2f14a8b)) +- check if report is enable in user profil ([5482b31](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5482b317be1c859889dd4e57f5c57fee6b916f5e)) +- chge text color & translate type in feedback ([42a6bbc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/42a6bbcf4e6373a67d32322fc495b4154251f0e6)) +- clean app config services ([090d17b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/090d17b063eb99c9bef844cc3f8ef3fc5215bc66)) +- clean code ([05899ea](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/05899eae3715c2b27c38b1290390f99e87a9bcab)) +- clean code ([fd26955](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fd26955f2ef54bccbaefe34ac4264a9438c52977)) +- clean comments ([60ab319](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/60ab3194d1f2b52971389e022e0a40245e045a05)) +- clean console logs ([ebba772](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ebba772643e1ad10b1a184d504b58ec8e7c080ec)) +- clean docTypes ([3dd7496](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3dd74969da2522de991faa09de1b2adc67fedf27)) +- clean handleDetailClick function ([6e98e6e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6e98e6e99eb2428ac7e9b9ac282d83b7918ffa76)) +- clean konnector components ([0a993e5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0a993e5df9549de8a01f8248b4ac78d66e938595)) +- clean recoil state ([ce4d921](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ce4d92129f48e5e34cb8112f175ae8b98554aa5b)) +- clean test ([e7c1ce8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e7c1ce80cce61123502e5e4fb2d48c07d60a17a5)) +- clean userprofile ([dfc1724](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dfc1724411fbbb45fb0f852cb045f9be6d18bbc1)) +- close dropdown when filter is selected ([4c51e33](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4c51e33910b1fe8ad564ac238b4c344bddd5419c)) +- complete konnectors tests ([3077bd4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3077bd4a04aa4c0c7ff6f03011c3853b83d63a4b)) +- complete mail service tests ([c718987](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c718987104dc37e46793b791a413549550c8fc95)) +- complete query runner tests ([2576cf8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2576cf8088c2966525ab5aefb04c401049b44630)) +- conversion kwh to mwh and l to m3 ([48c8f55](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/48c8f55a13ff241a9f4dbbf0cec9730423bd94fb)) +- convert barchart load to euro and add fluid condition ([2a8258b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2a8258bddd64166ddb5e60f0089bc896e8138fb9)) +- convert chart atom to redux ([d097a14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d097a145d0c6086f3a869811f98fb1a91886e03b)) +- correct konnector modal closure ([5058298](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5058298c3dc9a26723e01a24d6502547f91dac57)) +- correct name function ([21cb8a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/21cb8a47187fba8827fe142f0a7e163df5dc44d5)) +- create analysis consumption graph ([fd44bd8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fd44bd8863201eb1317a7ae83fd8d1d1160cf0a6)) +- create challenge Item ([3e6fb17](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3e6fb17e83c6f36feefdba317f9f5b78f1eeb490)) +- create chart in report ([609bfad](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/609bfad67fe77d79e86836f1ac2666af7eb557d6)) +- create cold water method ([77e3657](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/77e3657a0365b6e77d84226a4a06bdefdab33e91)) +- create connection indicator in service ([2703567](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2703567f08c401a00f802873dd2ac7ccfb3f49bd)) +- create date navigator component ([66af7a2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/66af7a266e12136c831c1f65f5dff1e625a42711)) +- create elec specific method ([5ce1d61](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5ce1d61ce0effed53cf399d5442fb18cfae6d267)) +- create exploration finished view ([2914956](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/29149565efd6617a0267c7ea79fb15eda115a56f)) +- create feedback form ([e702156](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e702156bf93d75a915b05eaceed620fa617fe3e5)) +- create get ecs consumption method ([46a9a77](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/46a9a77aaba2c37798ec8cf7b8051ea14be42a2d)) +- create getCookingConsumption method ([7a74b87](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7a74b87c7c78b746ec2b3ed8a15a232f48cbbf25)) +- create getEvents method in UsageEventService ([333f99d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/333f99d4aef6fe005bd270915ded60c86b89c4b2)) +- create interface for monthly report service ([8a75917](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8a75917622c6f8d97083b99f56246ef1531d63e2)) +- create main component for profile Type ([f48ba56](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f48ba56364f823469da1703a6b9a2c199153b6a5)) +- create mission model and enums ([399016a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/399016a6806be31da560a18e2ac2d054c1c588e6)) +- create mission view ([1ca76c4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1ca76c407f12272d328d7a584cc11ab7c290f4a9)) +- create mixins buttons ([3bb5eb4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3bb5eb4196222e8efe737a7b07599bc056d65d37)) +- create mock data for test ([8292bf5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8292bf52d71c25cdc78a9cd81b0ca002df9c092e)) +- create mock for client ([bc0b9a7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bc0b9a702b193b86ffdf4e1be3607da9a1b2e62c)) +- create monthly report component ([b2e058b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b2e058b6550af94601d9c45e327cda2176b26612)) +- create nav form component ([716a2ba](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/716a2ba6cd63d2d8c54c9616a7abf8aff1671cf6)) +- create OAuthKonnector functionnality ([7ae7799](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7ae7799b5aef42da1bc9675c62d77e16d463c58a)) +- create profileType model ([250700b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/250700b900775b48018d37b4615fefaa11064196)) +- create profileType option view ([4951a39](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4951a390b0d8053b1f09bb2b28212f5e30847d35)) +- create question view ([6f8b8c4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6f8b8c452d1112562a89aad2d7f71d25240a649a)) +- create questions system ([d0d4bc6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d0d4bc6ddf329deea949dfd14c347393d355dfeb)) +- create report attributes ([c1342f9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c1342f9de7a4b914bb8e3e356721c224fe66c136)) +- create report view ([b473b2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b473b2fab1b6df2da85d09573fe41d0e27bcabd1)) +- create season store ([71c42a9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/71c42a9cbb679fa6ceec8c1f1f509190761c3055)) +- create TimeStepSelector component ([63104e2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/63104e246d53d77cda1b680fe1e8955ac6f1a138)) +- create types for cozy logger ([ebc1c16](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ebc1c16f3a52badf8a72e82146b1532123cd1eb2)) +- create updateUsageEventsAggregated method ([4228df7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4228df7e2598f36017d1e3360eeec7f7a71bcc89)) +- create UsageEvent service ([9ac6233](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9ac62336566fb282472b822d23e8ad6c38ab6f7d)) +- creation of component KonnectorNotFound ([5c964cc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5c964ccee6d86be60714442cfa3002c488ec899c)) +- design for login form ([7c78238](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7c782388d4a278e337069ae1d37ef79ea341905c)) +- design konnector loading ([0e4eb60](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0e4eb605295b7692c352ddeeba9e0ea341d41b87)) +- disable cron task for service aggregatorUsageEvents ([4bef95b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4bef95bc00c634942527abdbd92ab74292de5593)) +- disable focus on the main scrollable div ([ee485e6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ee485e6946376bc3927a1ec89fa5560bef342c14)) +- disable resize of textarea ([fad2c76](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fad2c761fc685c13dd5ab281c99cf99bad56c821)) +- display error on login failed ([f97e06f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f97e06fa3a553601c137b9c6475c933372916fa7)) +- display modal border for unlocked ecogesture ([73fb60b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/73fb60bee6093f8427425f9bca36931e74cf7dac)) +- display only mondays for duel > 2 weeks ([80a299c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/80a299cb9fedf28dca1b4636e9a089fbceacd189)) +- display version in parameter screen ([894fdab](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/894fdabcee9296974952eef66abc659377886825)) +- display waiting text under actual text ([7a744d3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7a744d307f92f7c4a881ec0821c656e789a70b11)) +- do not compare on year time step ([a8435ee](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a8435ee7a3283cc57c2abd72ffeee1af5545e59b)) +- duel design ([595b379](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/595b379c80c3b8bbf41c0362df254333ea076900)) +- enhance aggregatorUsageEvents ([781d239](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/781d23913cb03dba472b90f734f6948483a658d5)) +- enhance aggregatorUsageEvents ([439437c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/439437c0105a5a31f344accedc69d0eb36d400ab)) +- enhance isChallengeDone ([97ef0bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/97ef0bb66c59b9d884e5498a73ed822a51c2331a)) +- enhance the error handling test ([24528d7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/24528d7b6bc1d8e4aa80a8023d9b76b93cdbff9f)) +- enhance the userseason attributes ([015bcfc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/015bcfc2a6bc0dee95b6259800c39b19c3dab73f)) +- fix bug buttons style ([0ed4dd6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0ed4dd6468bc218d9990bd6f382db2edb4ed690d)) +- fix challenge card done icon ([629abcd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/629abcd58ea1385145b00a4269bb7bfd859a9fa6)) +- fix compare bar display ([1e8b5d2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1e8b5d2af388744c2e1076d7bc704dfd298324ef)) +- fix dipatch on profile Type ([65fc27f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/65fc27fcf47609e0f324fc10483bb811b723fd4c)) +- fix hooks issues ([e070c16](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e070c160480f7b56ac4ae977117c33ab10a15e4d)) +- fix issue on boss initilialization ([5827524](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5827524d4f154e2aa31e908cafb6a571f9be47ca)) +- fix issue on expanded panel ([2f6e3b3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2f6e3b3e9b22b9d817ac3868df0798fa4f002f0d)) +- fix position when no text in header ([c2c9773](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c2c977359048f93a41970ee98fe7b015be85daf3)) +- fix query runner tests ([2eaf0ac](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2eaf0acb13e4c40961c0bc9af46daa341d5d53cc)) +- fix style for konnector status ([d79523f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d79523f2468a327b57008121750b0a7e57437e01)) +- fix test ecogestureView and hash ([ed9ef0b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ed9ef0bcde642f538f6685766a8d16795d93b9cd)) +- fix test for usageEvent service ([9aebe9d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9aebe9d20e9b462908600ea6c6e30ccb989c2217)) +- fix tests ([c5302bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c5302bbf3ba15de27e512e49d663cbdf102b702b)) +- fix timePeriod service ([fd37812](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fd378121bc3a07e25a9821712968699b163bf00b)) +- fix translations ([5924396](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5924396ac7553de5747a721aa96c691702ef2d9a)) +- generation of the first mail version ([b4a3218](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b4a32184b5a048393cbfdf03153b648a37e2b594)) +- global & season state on konnector actions ([3436225](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/343622507629ef03d7ed9681eab2f7822ec3bbc8)) +- handle analysis when no fluid connected ([e9adc29](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e9adc299b175fca7e6746a1269e8a1a7fc7ff8e6)) +- handle challenge is over ([ca83748](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ca83748b96390f3223f39eb5f1a488d3ae474356)) +- handle ConnectionEvent ([7438e2a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7438e2acdac3af839cada3e3ce45a23ae9924a44)) +- handle end of connection ([8fca4ab](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8fca4abf25507814c37b27e7488930dd94e4effd)) +- handle error on KonnectorLaunch ([d26cc3b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d26cc3bdadc40c5894a4580bd1aaa18a7498a0eb)) +- handle form number ([48954b3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/48954b35fb4d4334e0eb00bae870f32a567bfba1)) +- handle LOGIN_FAILED case ([abde7f4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/abde7f409c05899e79cd0b3dac42c91b855e6565)) +- handle multi choice form ([ca17436](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ca17436bb4c9f653d4484393af90d898b024e939)) +- handle multichoice from ([abeb54c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/abeb54c44c0c76e2ca3f12b31173c7f21874dd21)) +- handle notification for new report ([039e24f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/039e24f63d05b5d76116be1e7613ba1da12d7723)) +- handle resfresh of global store ([9b0f21c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9b0f21c3ad0a7dd8b7193f300279a1ad354bdee0)) +- handle specific chart case ([d902fbb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d902fbbb7e1c0009471113c282d4637b21c37649)) +- hide no data when changing conso index ([26779c0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/26779c025f730c8285a7b723fb1a64a62549af1c)) +- implement duel screens ([4adc820](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4adc820e71b354a206dff3a97bd5b7bd30524896)) +- implement duel screens ([c76e3bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c76e3bbd4213319e8114a77edc104b936fb2775e)) +- implement feedbacks modal logic ([6b02139](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6b02139dea5a0bb27fb709b2e30b0a552c7191d8)) +- implement from number selection ([df80006](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/df80006a18893a53fc785a0a2f37abcef33dea0f)) +- implement mail ([6d06d5a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6d06d5ae34b7e974149040d72a0f59f6b2e2e831)) +- implement refreshFluidStatus function ([993db07](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/993db0709ab4971037377e356c37ce4b85b369ce)) +- implement single choice for profile type ([95a7c18](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/95a7c184d9a303f03445bbed4c3c9f31d3148bb0)) +- implement sroll to top into Content ([2827c78](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2827c786728223c4a32e4eeacb7eb2cfa8f23cc2)) +- implement the season launching ([b36f0c9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b36f0c9f775e9ec7e8f0ef05af24e80c2daf3188)) +- init aggregatorUsageEvents service ([005eee5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/005eee5bd5759bbafe962212722ef60b8902e1aa)) +- init correctly dataload ([0ba05ba](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0ba05bad58d9ab75cb7655c25c51825fdbcdd003)) +- init quiz ([822b929](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/822b92987d9f64dcafcab91dcec440d9a292c85c)) +- init selectedDate of chart with lastDataDate ([90cd504](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/90cd504f3b0cb5308ba29213305f0a472697d38e)) +- init test for dateChart service ([da3445d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/da3445d8f96739113d916a198e0cc5f0bdda0b98)) +- initialization of report information ([f7a1cf6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f7a1cf6770706e9ecfe2ed5987cb4a6129e5ffc9)) +- integration custom question ([33528fd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/33528fdbf572f6ed1766e2ad95f7cb2c65eef5bf)) +- integration of new icons ([19fb376](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/19fb376e5995e45f67c7285dc6509eacdc5aee03)) +- lead user to the right date & timestep ([a117ab4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a117ab4d05cd847ccce7b8a7b128b8000156713b)) +- logic to end season and unlock the next one ([325c496](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/325c4961adc428d0dbba18f32771ec4637a1875a)) +- manage feedback modal opening ([391ce30](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/391ce30463a940d1bffdb91e1490194fe06166d9)) +- map new ecogestures icons ([28f9d7f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/28f9d7f4aec1404b95675ed20eb7ad6d38dc5eff)) +- map through hot water equipment ([f603bd4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f603bd4c5409da5e324d2b0cfbded24ff941b06a)) +- merge FirstConnectionEvent with ConnectionEvent ([2e351db](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e351db2973c60243944fb192a5f4e6e008c2427)) +- merge IFluidconfig with fluidService ([b851d12](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b851d12b56d37e0af41a33a9f2d0780e5647a888)) +- merge text for connection waiting ([36115c0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/36115c043b0c612b007b04e53e707ad9dafec684)) +- mock Q from cozy-client ([4b307bd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4b307bdd8582bc464b47dca42b46ea1f915d361d)) +- mock TriggerMutation from harvest lib ([eff3193](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/eff31931fee4c71988db436ba3cfd98aaaefb40e)) +- modify ecogesture id from exploration entity ([904c0c4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/904c0c4d513894020fd0478a037bed277b20ed8d)) +- modify exploration view ([2f7f9dc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2f7f9dcf4e3909758fd1a141280a6e29931fcb64)) +- modify id mission entitiy ([3b79ad5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3b79ad5283a8c1de1cd3dd5628dd51010c89332c)) +- modify integration ([300c67f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/300c67f5bb141555c74a84dd884b5f7e583ca283)) +- modify style and change questions ([f35d513](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f35d513d2e874dbbe832ec9a4cf4d8084c9aaeea)) +- modify switch button style ([bd2fc61](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bd2fc61adda6183a3447546d7f1dcbd00f021da4)) +- modify text case label ([fd210ce](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fd210ce1d153c047f1e359365d1572dc79e8f71f)) +- move all constants to a folder ([cf19423](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cf1942370ca3a9998b1702ed4f36ef882666784e)) +- move cozy bar config ([2479694](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2479694dc887f3e945d7624b08815a6e126cc439)) +- move custom question loader ([e2ccab4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e2ccab4fbd5c844ea9754b5ed947c1c61259b6a8)) +- move date utils to a specific file ([f3bdfc6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f3bdfc62cc6d01a62d06dea9a0c56cba1bd66ee6)) +- move faq constants ([654ada7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/654ada7734559164974a3fe57583944c3ec5d52c)) +- move getLagDays to utils ([1d8ab85](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1d8ab85bbf96409a3cd86b3c770a1ec135704fff)) +- move mockRecoil to mock test folder ([73d6104](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/73d61042b77d03f25961c7bf438032972b1d41f7)) +- move old fluid data modal ([b54d0e2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b54d0e23b0cb72822a0f7fad1f6f98b605a0b1a2)) +- move scripts ([546e3a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/546e3a4251dd29bef9c75e830ea2f1defc89066b)) +- optimize number of queries ([312b5c7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/312b5c75680b76461c3c7dd708a021cc74c51fd4)) +- optimize number of queries ([23157d5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/23157d5533017952c774bb2def2c3ee4516e268e)) +- override config for dev environment ([25a943d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/25a943dfcad1fb3f0b3b58d8624525fbfff6c3bb)) +- parse haveSeenOldFluidModal to DateTime ([cdd19a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cdd19a4aded0a48fa524c10493473be32cfe3d23)) +- pass client to service ([7155d8c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7155d8cf269ffb243843d4da92075b60208c8935)) +- prevent state icon to move ([a1fbf2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a1fbf2f213ee729527554a049a290e11dd2f7512)) +- prevent wrong rerender of bar ([eb4db94](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/eb4db946df41e9b3a97cecc1e78fb5388aa8a843)) +- progress bar for profile type ([05f0327](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/05f0327a5988aa1a28d2e47c598e9d5a7c432da5)) +- quit quizz and result ([87dba47](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/87dba47e8755deb6e31fd659cf167cd2944fb32b)) +- random ecogestures by pack + options icons ([60b27b9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/60b27b936a4c3e71bbbf5a1cb152744e8db67d43)) +- redirect to right konnector discover screen ([ba2de1b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ba2de1b298f419c38957b1230f4b16230999fddc)) +- redirect user to previous screen ([a0cec14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a0cec14d98e601189c071b1b1c64e53b04646d42)) +- refac typography scss ([86cdd17](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/86cdd175a0ce2e0862a214e7e967918171390b7d)) +- refacto aggregatorUsageEvents ([e08dc8d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e08dc8decda056a34109d0ad10a4f16da2c0faab)) +- refacto aggregatorUsageEvents ([e7e293b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e7e293b3b65d1dcdba1b7685227b53fd763ebd91)) +- refacto aggregatorUsageEvents ([e75e39d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e75e39d8cf50135d060648da8e628508e010eb28)) +- refacto aggregatorUsageEvents ([b8e026d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b8e026d0113021f682b0aec5875441f158f27e38)) +- refacto analysis consumption ([d988906](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d988906772ed5da3ea3ce87148f1cbfefc685123)) +- removal of unused usage events ([d80c2a3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d80c2a3ab6170bf5ba72648da8daf98b2e37a4a6)) +- removal of unused usage events ([b5b726d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b5b726d18d33154cf6e3fd1cc25cd79169ef6873)) +- remove await for sendmail ([d87135e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d87135e94fffb765b86b5f88eefaafe7a64cc6da)) +- remove break if no comparison ([7876a92](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7876a92c88fd6927a81b2d9e9e960792d22adf7f)) +- remove button used for tests ([8d8fd24](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8d8fd24915993fd2a498eed4cbecf49386ccb99a)) +- remove buttons components folder ([3a86d5e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3a86d5e9d174ba17cd25bd95bb82b9ba8fe96e53)) +- remove challenge from date utils ([633a6f5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/633a6f5a469efffe29cd77289459f6bf4172a525)) +- remove change done on loading konnector ([b2005f1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b2005f100403bd2d0e990fb3118388c46a75ed45)) +- remove commented lines ([d9e4540](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d9e4540509ffc26d1e36b251f1dde00176b7584e)) +- remove console log ([181bf51](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/181bf5147733e8ea2e8e6716671c2663ca82bf34)) +- remove console.log ([e52d1cc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e52d1cc9bf6c8194eb2f29352a9da09c8dcba912)) +- remove console.log ([8af2b70](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8af2b702c014bbf3184aafa9e2d8fbaf2bdd94b0)) +- remove console.log ([e3a98c4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e3a98c4f04371d66944d898e05b97aea59b3784f)) +- remove cozy-doctypes folder ([5a80070](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5a80070b06d24f77bda3b50e9a9e05c3c3703134)) +- remove duplicate function ([36cda02](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/36cda02375050b24916df515c38c68bb85ebb9e8)) +- remove duplicate typography import ([c8949c8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c8949c8f21a8180fda8fe65d9dd67cd91db692c9)) +- remove endTextAction from ecogesture json ([0cc6ed9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0cc6ed9bc084357c53338731735802abe62b6648)) +- remove error from Version component call ([ec25cd2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ec25cd2f0aefb2768327eb625808d4cf3f442963)) +- remove favoriteModal ([c884c47](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c884c47a816bd71a3ba4d18e85b07c4b5b6bef1b)) +- remove GRDF_HOUR_DOCTYPE ([69029bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/69029bb99cdf36c8a9867b2a3de79a694823e8f4)) +- remove Hash for challenge ([5ccbb1b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5ccbb1b9a6438335335cd8e38f1480e245bc1c22)) +- remove host in start script ([ba40612](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ba406121ec5228eb53216752d3d105222899777b)) +- remove loading at the end of connection ([16f0fab](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/16f0fab9aec466cafc718f48cb36e28d8316a0ee)) +- remove max load from chart store ([e938bb8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e938bb832827c3515437ce96065817130cd27361)) +- remove max load from chart store ([7fa7811](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7fa7811e57f4e9524aab5fb9dcf6599fb38dcc01)) +- remove old files ([adacdf6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/adacdf6a5c4cfb0700c19c7fedc765a37d7ac45f)) +- remove old Modal ([90a1c5a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/90a1c5a2e015e1de8a1c7f9083011c6da83d593c)) +- remove old service file ([5fa6762](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5fa67622ca58b66f0458bad152241797c297758d)) +- remove old tests ([b27373d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b27373d6c81934d9d0ccc1898b0978b80f205cf4)) +- remove react fragment on modal ([070890b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/070890b57c86326b80c7fd42ff1d91e7e8345dc6)) +- remove recoil dependency ([e3ee3bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e3ee3bb9d0c9a98da4b69068515496b0c86e5d27)) +- remove sorting and change color konnectors title ([4c5837e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4c5837e80bd5bc1ec754f54d47aab98a92579c57)) +- remove Test component ([c8df5ed](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c8df5edb0b6d69248a85f2e33b50ea902e482572)) +- remove unlock state on ecogestures ([6abd5bc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6abd5bc9d8ceb80f01935982541e8643951239e9)) +- remove unused components ([7073598](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/70735987c7a29cefb90b2fbd5b7b8a16372c4ab1)) +- remove unused console.log ([8f6ed04](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8f6ed04289d7b4604522b1f74cb058a35efb0351)) +- remove unused files ([ab09503](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ab095035c6e180bff6f945b2743cae81cb4bfbeb)) +- remove unused files ([7fa3008](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7fa3008ea932c04ec11b65b4ed22cfc331062929)) +- remove unused import ([2414cf0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2414cf01a8507b3c9ba0f5a973f669e01b103ef0)) +- remove unused script ([56e41c7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/56e41c7de5c82153a5c1a66593f9b714857b0727)) +- remove unused services ([0767fbf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0767fbf250ca6fb657fbacacaad5b67dc5019b47)) +- remove unused style ([b4bcf03](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b4bcf031ac300abfdb5f593c8c8a48d58a5feb40)) +- remove unused translation ([8e6331c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8e6331c92acf1d21732bad2c23e07791d8b66bae)) +- remove useless modification ([06fa58a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/06fa58ab2b420d4b609d828e9731c2aa35c9e8f2)) +- remove usuned function from Ecogesture ([3d4fab1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3d4fab155c2e21efdebce9151fb50f2f93d92d52)) +- remove wrong comments ([57149d7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/57149d75d4d4b590b841ad3a2482e9188ebbcfde)) +- rename date chart service ([c6e1daf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c6e1daf854fe79823403724c683a9b05a3d63e4c)) +- rename ecogestures icon ([d35ea59](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d35ea593e403eda4d06b22abf2966bc074faf7af)) +- rename fluid and konnector service file ([7da04a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7da04a4a3aef35bb54a8195145cc84fb4b7c3e83)) +- rename getKonnectorTriggerStatus function ([e583153](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e5831532a02dadc0b3a3d6079c4e97a7a16f3852)) +- rename id ecogesture ([b99706f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b99706feed2269261b362eaff8456b1704fa591d)) +- rename konnector status service ([0a08a81](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0a08a819a6dc273932e09406c83e52893a56c493)) +- rename query runner service ([2b5a6aa](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2b5a6aa757beeb6bc3adc6824618101cb9123f70)) +- rename report model reportDate and getActualReportDate ([17ebb99](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/17ebb993028deef16ced54fddd043176ff667bd7)) +- rename reportNotification and initReport ([15b3acd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/15b3acd99593e06b0e13ba26a5704cf45806e363)) +- rename sendReportNotification ([7f22aba](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7f22aba066478ed916604bf2e35c679ca0f99fd5)) +- replace context from header ([50804a6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/50804a6f8a0a2749cde4f9c1037082a6f06852cf)) +- replace ecogestureData json ([9912506](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9912506b837c7d39b1b46f73d44631392221c627)) +- replace haveSeenLastReport to haveSeenLastAnalysis ([2dc2257](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2dc2257731bdd80f263ff08013ac327a04adbc29)) +- replace montlyReportDate to monthlyAnalysisDate ([f0571d1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f0571d1c50d3b0a5f7645dbc6602109dfd045ef0)) +- replace nwh by efficiency ([779cf29](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/779cf293d32e7e5f7baf413b15cbefc61d78b696)) +- replace report component by analysis ([0796ab7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0796ab759d1757aa068394396dc76fcf345c9a93)) +- replace report option by analysis option ([e1eb433](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e1eb433718dafc54d476151b9372eeae3c5c036d)) +- replace toogleBackgroundScroll by disable ([729cce7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/729cce7a9413ac05cb897fb33829e47b5bbe39ca)) +- resolve conflict ([724583b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/724583b1ca56bb4d6a8e1bfe0e9e4581ec7e4782)) +- retrieve index on number selection form ([637c217](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/637c217368e634b847218a7a69c3dc443f8249aa)) +- retrieve trigger status ([d7305ad](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d7305adf755fcd34757e49d48c0ebc0bff007659)) +- retrieve version from manifest ([4bd29e6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4bd29e610460c6437f379327c3f39f3684b1a2f7)) +- return null return for ecogesture service ([fbd49bd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fbd49bdd8021c2fa1572d1d60b22a557c6ab22e4)) +- review ([f6cbde8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f6cbde8f37980800a38da394682505aa3adaa53e)) +- review account service test ([5ece0f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5ece0f7ed1dbe40ec3850696434e84d99c91f0af)) +- review account service test ([11f9925](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/11f9925cef16a40d03f3b7c367c29cb6efa8750e)) +- review activateHalfHour component ([8625461](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8625461f1336c0b2abc2dd2cf1f18169ef733777)) +- review challenge details views ([1b13272](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1b132720d687b7a277358e4582569859ce38f6b4)) +- review challenge service ([344265c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/344265c142b36b4494122c59fddff3ba82a2602a)) +- review ChallengeCardDone ([27a2178](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/27a2178bf6a385e75a34b1b33148215485294489)) +- review challenges ([390327b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/390327bfca4bf229a72e9276617601489f367e71)) +- review charts ([92d2e01](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/92d2e0191c090c26d998afb6b0e0e37c64351613)) +- review config service ([62ebe8e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/62ebe8e219ffdef71ea5754003f416b3ab8f0094)) +- review consumption service ([7193757](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7193757c75635da5a20b418c0a3269019cd8b291)) +- review converter service ([2d41527](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2d41527c8a33ee114ba5ee63351d4f6fd6cb2f58)) +- review converter service ([30a462b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/30a462bd74a621824d5344c628aabdadd14a294f)) +- review date chart service ([01c10a8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/01c10a8d325e9e16e7e76bb9ec9a4e25802435cd)) +- review date utils tests ([835b258](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/835b258211a7488f71f395320dd5b4140522d651)) +- review defineDetailedTimeStep function ([12982fe](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/12982fea4c274ea811ed73241da5538c4d404847)) +- review doctype and index creation ([dc8d394](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dc8d394dfed3d2daf5dee8f6ce5af12435371fe2)) +- review Ecogesture card & modal ([7dccd74](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7dccd744858f25f48a5b9938d006bca16f9b8c29)) +- review Ecogesture context ([b514ee6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b514ee692dd780a4b5a328812f0c042c0255d9a8)) +- review ecogesture service ([88d7a00](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/88d7a0041d324d0fd8398369a54a56c632d90d34)) +- review Ecogesture service & model ([927bf7d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/927bf7dab3d1282eb445f7bbecba0cbb3a738039)) +- review exploration ([7bfdbe6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7bfdbe6894809dd2fd6369787cde6c59a0c2311a)) +- review FAQ and Options ([6cfb86e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6cfb86e894c070f38c043cd4fde962fb31948d50)) +- review faq style ([04fe5d5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/04fe5d599ae5246c54656d4028280f0850591f18)) +- review fluid chart ([f4ee18b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f4ee18bd09314e69afaf93442091d7f44f14e5b5)) +- review fluid service tests ([32eb67a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/32eb67aa765b2813fffa73166bf5d9c7d18b6f72)) +- review fluid status model ([9e40110](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9e40110cee7d041b3d3bab9537d233d4938dd09e)) +- review fluidConfig service ([0488d9b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0488d9b81b454fd141424b030f27e8d8681dbabc)) +- review hooks dependencies ([1a12a2e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1a12a2e2656c34c348e8b43df1a4ea238b94b81c)) +- review init data service ([5d4de17](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5d4de170d09794644127579296224ce9a619d430)) +- review initialization service test ([de2aeb2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/de2aeb2653851eb5bcafbc11299ccb0beea9bdc4)) +- review konnector ([113fff5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/113fff545729f0f59b2ce63b41e329fce32d7c7e)) +- review konnector tests ([df5c09d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/df5c09dbe65e4bf9decd572903da59cc41162c14)) +- review konnector tests ([87e88d5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/87e88d5026d944a04a192ba02a4237ceab89c4be)) +- review Modal ([7fedb13](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7fedb13a64e609e568d475a6ff07beccf23225f1)) +- review models ([8a64ce1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8a64ce133003e6d3e2f9a4d74224426fabb362be)) +- review Navbar context ([b6857a6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b6857a606379a79ebffc0050160ae057444f17c3)) +- review of code ([63361e3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/63361e39868184d860755a701055d60dc51467fd)) +- review of code ([b3dbf09](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b3dbf09941b2318e178424790b62fd383d8eead2)) +- review of connection flow ([6d38b04](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6d38b04a9933bf52926da3ceae5ea7362b5fdea0)) +- review of design ([4840825](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4840825d4e39f0cfbe4e884d16e20a39e333db56)) +- review of design for login form ([13ed69b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/13ed69b041ef7521154842d1dc8fee69b4de539a)) +- review of init service ([d1a65df](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d1a65df3989c5998da6b9b767cf69b88b7ecdbd1)) +- review of MR ([df67be4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/df67be4d0cac2049958fb1bb3d3b872f7e05a8ab)) +- review of MR ([cd2568c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cd2568c4b37ff9b8cc8e452d22ecaea1f795e0d4)) +- review of service for cancelChallenge ([ee73c6e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ee73c6e8954c8de55fda18708738c563aaa4c16f)) +- review of StyledIconBorderedButton ([5873a2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5873a2f3e0f7496aa128ba690547a26c3a84e9d1)) +- review of type for usageEvent creation ([b72a12e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b72a12e0998a57a00fe8d84ae3abb80f13b10b3a)) +- review oldFluidModal call ([170a1e5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/170a1e5d7f7e566cf569450da478445da1366719)) +- review Options context ([f41042d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f41042dff60b86b0f7822d7b4967529fb8894746)) +- review performance indicator service ([128b347](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/128b347907dcb56a8c7053b24637f9b8d80f6ee7)) +- review season service and doctypes ([b1bc3af](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b1bc3afa3c75c8208b413840d00d8f3f33f93918)) +- review style ([06feed7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/06feed7c22070b9801609d80018d76aec44c3a88)) +- review style for view ([b3ca307](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b3ca30795e223bb2acaefdf38bc3657853b52d9b)) +- review style of button for GCU ([cf0c448](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cf0c44814cc1c40cd8e158cb3e1a3e30a7c9d899)) +- review style of TimeStepSelector ([ccec11e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ccec11e59b3429a10b8accfe5bbf9fe5f0ec9391)) +- review styles ([5cbf134](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5cbf1342642f0ed03bc7793186bb7e1e69d28069)) +- review test before merge ([76b7ef9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/76b7ef984c41533d6e9b93cb7972be9dabb98e32)) +- review tests ([c03bc00](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c03bc0005081d42f59cdaa6a3a4ce299a8b2572c)) +- review tests ([1e43eb4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1e43eb485137e34d9a01146e3148b27b6e984ae2)) +- review tests ([8331b8c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8331b8c80386701929ff6fe1e084385135fcb781)) +- review tests ([6cd7b36](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6cd7b3694becd41a3978dc9ba5659ebf184b8ad2)) +- review tests ([192e26a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/192e26a0075b80f7d58710102f290217d1794ec3)) +- review tests ([236e304](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/236e304cc6ebc87e23cff3ce680376e138e348cc)) +- review tests ([befb1ca](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/befb1ca39cdf97b021c64a596ae3b6667b6bfb2a)) +- review texts ([93891c8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/93891c8647396542dceaaa2bdaa5dac319f0aa83)) +- review time period model ([a2f9f1d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a2f9f1ded21422efdbcad8cb5b94a7075df6ff09)) +- review time period service ([4490ff4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4490ff4776ea412c9c12522ef2cb952f2c9621dd)) +- review trigger, konnector , connection ([dba38e6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dba38e6e567f6016b8ccdff1baf1eeed365811c4)) +- review type for updateProfile ([48d22ab](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/48d22ab23ae7a719d1c6c7634d07226ccf0c3c93)) +- review userProfile service tests ([d2b7817](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d2b7817f064053e872c9c5adceea4e602701b5ad)) +- review Version component test ([ed59cec](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ed59cec30dd44c3e7ec638baeedb5e2b8c40208c)) +- rework account service ([892be60](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/892be6038e071b657a303812dd0e57d76457056c)) +- rework oauth konnector flow ([4573359](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4573359f6de4b0c78b887027aa5a1eb2ac46529c)) +- rework of konnector status service ([a007049](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a0070499b03a22886296d79111b5962bb81be983)) +- rework of konnectors ([d9af00d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d9af00d3833302072fbf592f0a2bb4d2b07af453)) +- round correctly the threshold & consumption ([3d04255](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3d04255df333406707ffd8d5af6c3812551abe06)) +- script for accounts & triggers creation ([fbda124](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fbda1243f0caa6b3fb81ee06fa1d69330e45d694)) +- select item menu in ecogesture list ([7d289b6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7d289b69cdb96335089a7e1a9d93e84862f8683d)) +- select item menu in ecogesture list ([a409533](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a4095334649542110a343d1009e321b5ec56ffc3)) +- send compare event only when comparison is activated ([2730b08](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2730b080db919147d0857b31ca67590b05d20b3b)) +- send firstConnection event ([d3b38cf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d3b38cfd4b0a2b89e379db80e2c3824f33ebf8a0)) +- set aria-label ([57747c8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/57747c899dfb66d2635f4394d740d787010b3ed9)) +- set color for link ([b614382](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b614382cc4b8372493fa69fa68e7a7847081c5b8)) +- set color for nav link visited ([2c7c58b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2c7c58bae33e282814946c75147a05576dda6517)) +- set correct constrast on cozy bar menu ([3563d4d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3563d4da1dee6d8e36867d15b8d86cb846041b9c)) +- set correctly shouldLaunchKonnector in store ([6c977cc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6c977cc88ba79752e1c8891b8d30be18bdcc443c)) +- set cron for aggregatorUsageEvents ([b4fbf49](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b4fbf49e0725f5c7f0b6680c120d4dedce6b1141)) +- set cron using config file ([b213151](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b2131512ce918082960dc1a655b4002865c6066a)) +- set data into report mail ([e95d263](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e95d263393c9e9672ad6f5cf93cd4089149c9ec4)) +- set dataloads when launching the boss ([e8c5448](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e8c54486395a7e7823b82650d3e42fad717af3be)) +- set default ecogesture icon ([487f5e5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/487f5e5eb61bfeb02be50399bd38b3aebca827b2)) +- set loading only when changing fluid type ([56880ae](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/56880ae3671ed035027d2715b5f9e19b5e021384)) +- set locale for feedbacks ([660ad28](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/660ad28ee0b29e2efedd342520524f7a2649bfeb)) +- set luxon dates to utc ([804f128](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/804f1284070e85ff5566fcb261228ca9205b22fd)) +- set mobile or desktop for ConnectionEvent ([279cb4f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/279cb4f5545f895f22b56d3831329f2d412fc62c)) +- set notification on init ([de04f0b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/de04f0b849e3a424dc1d5fe4a7260333904d8a54)) +- set only in the ([06811bf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/06811bf5820e28f22a4301a4ec8710724f8896ee)) +- set profile between step ([eb17803](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/eb1780331fbf004008438ed162fb8560e1aa5573)) +- set startDate to QuizEndEvent ([1e1ad99](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1e1ad990fb7f6b9a95c08714db01394421d400aa)) +- set style for cv-button ([ddeb533](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ddeb5331d7bf91f30b609c631bd008d96f2d38f0)) +- set the button clickable ([1138e1a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1138e1aded4ba9a71d81a799a44ba4d0cf7c2029)) +- set userSeasonList on init ([bcee4ce](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bcee4ce2ebe28537486bd6eb4941a38e9bac40dd)) +- shuffle waiting texts ([26dd0b3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/26dd0b3bb4a8b3086bbd0316fabae713fdce7e53)) +- sort KonnectorViewerCard ([e7e72eb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e7e72ebf9da55b073efd6bdd17626d6c8b6e928f)) +- split ecolyo and cozy store ([0e5883c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0e5883c1e16730bc192afcb7440e94af271f0eae)) +- split layout styles into rights components ([2728ebc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2728ebcaa44ce7e268e38cc86a21c97b34b0930f)) +- split utils ([d6db9a8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d6db9a89dbbc284324ade991b70fd48c856e4d0e)) +- split waiting text to remove duplicates ([621edb5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/621edb5c28083fc4e0d8c11cd275d0c86398baa9)) +- split waiting text to remove duplicates ([985aa93](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/985aa9305c1927e12fac6cf0a59561354ce98c5f)) +- start implementation of recoil ([6da0f02](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6da0f02ceedf3c596786ec0dc4b42a3ede939d39)) +- style containe question component ([35e8606](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/35e86069a6221709b58b6eebd18be0b0c9428e39)) +- suppress mail field from feedback form ([96dddce](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/96dddce6aae9476685b5585c9b88b16b3599b257)) +- test account service ([41b9312](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/41b93120ab0576e1c54043baaef8e0bec84b04c2)) +- test analysisConsumption component ([2ad090c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2ad090c9fb4ab2d354184c0d9f46bf938ed0ef7b)) +- test defineTimePeriod from dateChart service ([33dc027](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/33dc02724753bd47ad38cafab119bcb9dc183809)) +- test exploration finished ([3edbf98](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3edbf98336b53592de4ccde3cc157c751ce9f41e)) +- test exploration view ([963a646](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/963a646052a5722259b9b6e0cbc19c781f14aca2)) +- test for connection service ([87d98d7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/87d98d744120f58757162912cc8ef5656a0edd88)) +- test for konnectorStatus service ([c622260](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c622260d140e89238c9b70629690021f4707c571)) +- test for Navbar component ([446cd05](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/446cd05632eda24e23a209410fb526f30a51b975)) +- test for OptionsView component ([a247b1e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a247b1ed16e1d7ecccf4aa13ccc3f650fbd3b65e)) +- test for SingleFluidView component ([7f3eb55](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7f3eb5560399d44473e5c02df96bbb86f2244591)) +- test for Version component ([41e006e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/41e006e81b3679a74b30607ff5d27eca68b45bef)) +- test of ReportOptions component ([28ec9b6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/28ec9b6ddeec58d1d1ba04ec61255dc797f43fd4)) +- test of ReportOptions component ([af44729](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/af44729ebfcbf1e4b5c28c2a4cd5d2f8fc9c3dcf)) +- test profileTypeOptions ([ff53d41](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ff53d41ca6d7a05e042dbfbbcc958cda2c364fa2)) +- test quiz begin finish and view ([0d348a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0d348a47c728b0192b24adc4f23a33805e3105f7)) +- test quiz questions components ([401ef83](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/401ef83bd983bbbea0f703b0f5de988c33bebdd0)) +- test trigger service ([f8ea673](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f8ea6734d12e90546998ca72c0d5593a397db88b)) +- test WelcomeModal component ([1ca25d4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1ca25d4f42eafc17879ba729012ed09de7d99d0e)) +- tests ecogesture service ([29b0f36](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/29b0f3633991805014967cecfce89117177d2084)) +- tests fluid service ([2fc3866](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2fc386695c5de1d86016e3036722cde50b921c7f)) +- tests for converter service ([39190d0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/39190d01a97921b88c67911114ecbdca4071524d)) +- tests for Cozybar component ([7d170d4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7d170d4c9cba46861d30971aa1004dcf3006b7c1)) +- tests for dateChart service ([145e496](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/145e4965bd6816549421117c539e2376e53323cc)) +- tests for initialization service ([b668c85](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b668c8580270ea0a9dddfc2fc4c9223a83efc361)) +- tests for initialization service ([07a07f9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/07a07f9d57e777e6021e6ba187ccf0c597366f90)) +- tests for LegalNotice components ([507111c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/507111c4af413a56556212435e719138c3e711d2)) +- tests for mail service ([583ce95](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/583ce95a6f3cf6cd4ee9fac34210dfe6c350a3b8)) +- tests for Navbar component ([137df0a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/137df0a1a7829ecef3a37b40ab752da376d97fdf)) +- tests for query runner ([cb51ec0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cb51ec048504e47a6102c32d827ee0208e8a241e)) +- tests for query runner service ([90009ea](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/90009ea4c88bee6b10aefda608d3b779127794e8)) +- track loding success for userprofile on init ([1ebcf5b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1ebcf5b5fb928bddc5011443762117d7d893b6ee)) +- transform stopButton to mui button on ecogesture modal ([5f80a36](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5f80a3611ab993689f8b2eec0f47b10c4566f28c)) +- transform StyledAuthButton to MuiButton ([3925d5d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3925d5d3780b5a5dcc072c74c290b26c21223add)) +- transform StyledButton to mui button ([305d75b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/305d75ba5b736d21e3a33336403dc07cd47c5f3a)) +- transform StyledButtonValid to MuiButton ([0c6f7a6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0c6f7a66a56ba1ae18f5445daca0fabef0f93735)) +- transform StyledStopButton to MuiButton ([b87fee1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b87fee1b818411c7fb21671f86658c5d8df2f562)) +- type constant ([b9e9b60](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b9e9b60384498fbd6c5ca230ce272c3ef95a219c)) +- type index.tsx ([14f3aef](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/14f3aef98cec1029ed3fcf5f567c072ffec48481)) +- type of Trigger ([f57d26c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f57d26c93308b009f5871a9b9a5c90b96fe6266e)) +- unlock ecogesture for on going challenge ([dd50320](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dd50320a01376d213625d6bb1582ddaf98eb3099)) +- update ActivateHalfHourLoad ([cce3194](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cce319492e85c62cd9e7b61a02331b5e15173b1c)) +- update aggregatorUsageEvents service ([1bf5533](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1bf5533b8c7e07be6e327d4ac8a55ae4919cc8af)) +- update analysis for disconnected fluid ([adb8bba](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/adb8bba71a5445b167da4198f7e615c67ebeb843)) +- update AnalysisConsumption ([0d259cd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0d259cd8ccc979d812975f86700be2a7c4668938)) +- update Bar component tests ([5cfd6de](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5cfd6de88808028b813014562c37498caaf39307)) +- update boss mock data ([05e4dd8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/05e4dd88e3a5579126ad5ce36ea8169401968d2d)) +- update buttons for Analysis ([d01f9ea](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d01f9ea3c3e892a7ebacd501a051d1af591e6d95)) +- update challenge content ([bd9cc43](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bd9cc4325786f38f9bee25d9ca6522ce6e114e4b)) +- update ChallengeCardUnlocked button ([4695ccb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4695ccbf5c61c3827a48cfe642092d709aaf9010)) +- update chart size when data is loaded ([a451a73](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a451a7342b0d7a50c8f7b960c3d0f99a3d30e195)) +- update chart store ([8199c8e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8199c8ef5d5ec5230482f2317c1e95d506354dcc)) +- update chart store ([aa08f68](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/aa08f68c9ded2db8fcee8765298c2a1e9a8fbed9)) +- update chart store ([a4ac5a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a4ac5a40ca0a90efe44349b4415c85aaa4c15cac)) +- update Connection buttons ([84a0935](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/84a093542b1e98a4f1bb90c71f0ae30eb19595d6)) +- update conso components ([c51796c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c51796c72f0b4488865016dbcc99b411e03f8ef7)) +- update consumptionFormatter service ([a0c3f88](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a0c3f88df847ff8b01ba2464d72f80862960d229)) +- update consumptionValidator service ([ee6b02d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ee6b02de97b1a8fda1b9ad311c5b13ef1a1f6cf6)) +- update cozy-script to last version 4.3.2 ([7e23d64](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7e23d641284af123e48a9ab933b5262bd8de753f)) +- update cozy-scripts to version 4 ([414745d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/414745dc068ae9af0c156931a8bc49ca3543125d)) +- update custom question service ([8a5f504](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8a5f504ab716d12f364f29e8c9e2b868709d503a)) +- update custom questions ([7bc2ff3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7bc2ff31bbbeccc58a25ff40843a7cb5eede3f40)) +- update data for custom question ([2034248](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2034248ad8d54db55d14f990ce23e89ada5be683)) +- update date utils ([dc6ee1b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dc6ee1b8c5d352538ac77569133e49594af0743d)) +- update date utils ([597c1a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/597c1a4caf0b347b5ca9d31430cb344b415f1409)) +- update dateChart service ([eac23e0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/eac23e011177ae9bfe9e159f4e734036e96c6302)) +- update dateChart service ([5bd7d8f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5bd7d8f925c2051d58018a566cef5306db284c9c)) +- update dateChart service ([fcdce5d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fcdce5d935d0c296bf69e3b3b34b9fa5069d6f73)) +- update DateNavigator component ([c3531d7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c3531d78e57672f6a99c57c7a8d9e53b8816b275)) +- update DateNavigatorFormat component ([d8f20d2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d8f20d2cf5f99d168c79831ac235f82cd3cb6dc8)) +- update Duel buttons ([e2052d9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e2052d92b841f0f2635847a812463d831fadd223)) +- update Ecogesture buttons ([de57bf7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/de57bf71af280b92af6c180783897925c7e96610)) +- update ecogesture id ([cb29174](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cb29174e77a7566e6a4e1fa84e850b8ff963afda)) +- update ecogesture json ([af931c7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/af931c7f72d7eef9e92544d32834525e4153436b)) +- update ecogesture service ([f7e812e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f7e812ee2340c1d6bc8854a1b2490fa6f4220f95)) +- update ecogesture service ([3229423](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/322942398c35adf46353e20189b6ea81c014748a)) +- update enum for exploration ([8e2fefd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8e2fefd01f97f5a3447f9c71c259cc5cd19d3b39)) +- update explo description and change order ([029cec0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/029cec0af0cc40be2e8ed9ddfaf93f2d9a67546d)) +- update Exploration buttons ([765d1f3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/765d1f367b278d785d7c6020d4a501f02dee3106)) +- update faq style ([34f411d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/34f411d81d76b831ca8169f9a56e2782dd674714)) +- update faq style ([d5b730f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d5b730f3fef7e3f2393a2e2a4bfd14c0c81b4d52)) +- update GCU content ([793fc03](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/793fc03892d351b462c49e073c0ef159f2531176)) +- update global state on connection ([3f04dfc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3f04dfc18220e75035902570801b8cd74087d3f5)) +- update icon challenge ([d922f2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d922f2f81034a1ec07a1fe09b99f6ab65c175bb0)) +- update icon challenge locked analysis and answer quiz ([d9e0ecb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d9e0ecb62c3dbccb28763327177cddd60c622429)) +- update initialization service ([1f8f0a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1f8f0a46ab3356ff5a49e6245f64ff3622b2f4fa)) +- update konnector labels and aria-labels ([686ff63](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/686ff6351c96758ac5c373ac3d831da99e000af3)) +- update local for "fr" ([1780dad](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1780dada489dabc67cd07be65d2cb2ad20196978)) +- update logos ([6a65068](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6a65068d767eb89d12c6d2eace037449e29abe5e)) +- update mail and replace input report option to switch ([49b044b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/49b044b4155daf0f66877a9ed07b10047f41219f)) +- update manifest ([ddaadfc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ddaadfc541346315e2045e449edecb06c8407886)) +- update mock data for season tests ([198c450](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/198c450f29e9d7fed81ab6420d65dbeba3789266)) +- update model and mock ([3019e8d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3019e8d307e0bdd2acde154a2ee6d158ce1c7c84)) +- update model json and mock ecogestures ([a9ab684](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a9ab6845b280b47c9582a5196ca48b5050a67a0c)) +- update model mock and json ([b3ecb24](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b3ecb246b96ed866f31f3e989360a251670cf407)) +- update new logos ([cb10eed](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cb10eed3d97cad539b50da9147a4ccc9ec57c09f)) +- update of dateChar service ([15800e4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/15800e4971ee8b5f61e5af902439708de6477db7)) +- update of packages ([5db3f0f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5db3f0f6c4a4868a776a54a138d6a7ea2f2ea382)) +- update permission translations ([09ae4d8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/09ae4d821e7b6411dff890c173255fe0047ba361)) +- update permission translations in manifest ([f986a3d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f986a3d6ea1dd64c76c51a70926e282c597de128)) +- update Profile buttons ([10cf37c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/10cf37c86bdf2314b8d432fe04d6b6ec2ddd84d4)) +- update profile data ([c7e1a7f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c7e1a7f4675d46ce525f5172c03d7e29161ae312)) +- update profileType model ([85a1f3a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/85a1f3ae89f49045c701ac05b55b2e9af3887529)) +- update pwa settings and add service worker ([b6f261d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b6f261d1824d6ac2d1017c9f485a3adc951a2359)) +- update queryRunner service ([c3af689](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c3af6898fe941f678533bc2aed0a1682919fd27d)) +- update Quiz buttons ([faa29ab](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/faa29ab4d784f709b2f1cd95b4c5503a8e4f5c74)) +- update snapshot for FAQView ([2ae3452](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2ae345230be189c265a8bf32e7f1a5cd67e5bd82)) +- update snapshot for FeedbackModal tests ([c4845b1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c4845b173b5c354a14bcf8e6ec2291a8955f0b50)) +- update SplashScreen buttons ([9791508](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/979150846f4904cb6bf56ab77935c8e3c6043b39)) +- update styles ([499250c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/499250c7a49214e75c42aed1d2e67374e4cd058d)) +- update svg for quiz wrong answer ([fdce9de](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fdce9dec7f09e5ada8430c140934c8da0c887266)) +- update test ([f4e205f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f4e205fb6d789e2db9dccb363c490580e61fbc9b)) +- update test date ([830a3c2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/830a3c29a5f9554a7e30ee0cf97c8f91207c841a)) +- update test for Headers components ([a97f7b0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a97f7b0551888e841e7e644bf6d6040a5fa58a4e)) +- update test for initialization service ([5b30ae8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5b30ae876c3d87a1d222d62e56b7edd28cf8f34e)) +- update test for Report and SingleFluid Views ([d16f90f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d16f90f56d404b4f0ed68f4c53cf7e38e3a17d7c)) +- update test for seasons ([fa58de9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fa58de97eab7af4c8f25026466a6d9623a5d877b)) +- update test on season and boss ([f692069](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f692069536012596999c9903ba89d719f9a7391e)) +- update test with profileType ([1baf26a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1baf26ac21822349340d89a3e37cab372910c453)) +- update tests ([2f53fc6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2f53fc657198fe886adbb2fcfcab5167923b22b8)) +- update tests ([613b31a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/613b31ad0599148877961de3198cdaaeeb5370d8)) +- update tests ([99c7bdd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/99c7bddd315e76dfee76f598d7dcb430617a3d5d)) +- update tests ([45bafd8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/45bafd80800edc1a99da6825a1815d548ec501c7)) +- update tests ([d5b30f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d5b30f78c2de6192cb9343233faf9ee8765b0340)) +- update tests ([f89d73f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f89d73fa6326dfcece9c0ae6c1e18aac2dd13293)) +- update tests ([e06fd14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e06fd140b9f2c69a928c2361adbf2348cea1d3bf)) +- update tests ([7f91342](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7f91342af0c97ccc495ea7db2ba803b11b0c72eb)) +- update tests ([991d0c5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/991d0c553371d0027c95084c6699844269d16969)) +- update tests ([58d4235](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/58d423504aaa48c617b089e1e83de421ab41133b)) +- update tests for Duel components ([741aa00](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/741aa000c3fe9b7907c3446de420a0b6569fb7d4)) +- update tests for seasons ([2512729](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2512729af6f25137c6e5254bce69f07139d89e2f)) +- update text explo and quiz ([923350c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/923350cad4f39ec90df4ba2c5fb14b797a91f727)) +- update timePeriod service ([027a047](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/027a0477e187bd9119f8d9772438810cf90a8f8a)) +- update TimeStepSelector buttons ([1f54a2a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1f54a2a9b3be0a0dbb21a4320e06e4a67c9622c2)) +- update TimeStepSelector component ([c6d5d78](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c6d5d786cc60ac4fdfc597f8aa7c38139d398546)) +- update translations ([33cc2c8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/33cc2c83073d4202c06d1fe5fb675381667b63a5)) +- update translations ([cb3154a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cb3154a5b5bec100e85acd3422914025c3d74f34)) +- update translations ([91a95e4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/91a95e4eeb56034adf6ae85dacb37ee964f84d02)) +- update TriggerState interface ([328bb4b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/328bb4b0298ddb5c7345dc99f8b7bc060417e60e)) +- update userchallenge data ([7d6d5da](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7d6d5dad8c19eb3474ae3f5c2fe99dd4d1325dd7)) +- update waiting texts ([81efc20](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/81efc2017c26b4eba2adcd1bc733e307df177fe2)) +- update WelcomeModal buttons ([7ba4103](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7ba4103e370d4cb8d86ab586fa984ba5c1c89a42)) +- update yarn lock ([4a71992](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4a71992f153cc90fe795447912b7b03836b1aa46)) +- updates tests ([d623b85](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d623b8579e5e75a9c61c1d20d79ba1f54c209b3c)) +- updates tests ([8ffdc22](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8ffdc22d2532be93c4237541e55492486a8df38d)) +- updates translation for permissions ([0c41760](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0c41760f4555adc98e3888825fd9c0fb9d66a869)) +- upgrade of harvest-lib ([849f525](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/849f525fa7536c6e30f05ed11791b69d9ec50858)) +- use ceil on diffDays ([4437f1f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4437f1fdd96a05d5052e1bd5c6c01fee8158d01c)) +- use client and translation hooks ([c15fa45](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c15fa45ef62b5a64331c560cb413c028ad1aef66)) +- use config service ([73c0f92](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/73c0f92890a5f41dfa88b43f590c65293d999198)) +- use context for welcome modale ([b2a1b76](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b2a1b769aa5b1cb95084248fa554d9bbe988ce5f)) +- use eventDate as sort ([9463b5d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9463b5da27dc739117bf421e075ec0d42ef293ef)) +- use fluidConfig service ([b955dff](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b955dffd1eedc0be75ffe2cf531bf2fee9277ac7)) +- use of multifluid fluidtype ([515262d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/515262d8f1f358edf9f60ce089e7ab58f8aff1b9)) +- use of promise all during init ([2a6c149](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2a6c149232a8effbb9f064e565243e1e6cf0555a)) +- use of promise all for entities init ([ffc0c10](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ffc0c100f62bd135c66d0ac85e5b12f5583c3199)) +- use of StyledSwitch ([ea3c241](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ea3c241dfaaf40780d613c1a597cdb3982015021)) +- use selector fluidTypes from fluidStatus ([9c98b18](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9c98b1812a10c51414274eefc57f40eac217a025)) +- use updateAccount ([6da3813](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6da381331873c9e0563e4cc8c893f4bbdc0a753e)) +- useMemo for shuffled waiting text ([39aecbe](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/39aecbe081ea58b5226d951bc2279d16cb49ad9e)) +- userProfileService ([75b45d0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/75b45d04293306c323a9070d50d83fe3299bc24d)) +- vertical center text exploration card ([a9f2a12](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a9f2a12982a58e5ae9609b54057637654142fbf0)) ### Bug Fixes -- margin for order-container into ecogesture ([f3c8e63](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f3c8e63d8845aab1701eb0c59532f11a8d0652e6)) -- € data on home graph ([0c0f7f9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0c0f7f951719c6c3aab8b1bfa075e9068f2db32b)) -- 0 value in graph ([20371fe](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/20371fe5987c7c5c6d3178490c5449261f80fc63)) -- 500 error on konnector index ([4efea47](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4efea47567e329371823921fc3a7ef8c3b6dbdeb)) -- add && on challenge.fluidTypes ([042c273](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/042c27300fcd67f23cfcf40a1c5225d4aee1f6b7)) -- add filter on FluidStatus for getValidPeriod ([14a45a5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/14a45a578c8915f01c5df646868a45eaf60d3387)) -- add hald an hour data in scripts ([d29acd2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d29acd265ad52ca2dd1e539dc8510309b85722e4)) -- add message succes field ([ccc95c6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ccc95c6613f0eaff7cff4c9e973deea717155796)) -- add missing translation ([eeb7351](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/eeb735116762cfeba17e2d8879fb3dd3615f9f30)) -- add subscribed on async useEffect ([aa958e3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/aa958e3b0a535b4556c91d566aba88500115d719)) -- add vendors config webpack ([2d33812](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2d33812d884ea6d506d01b4ca4d9e6462df8f3e2)) -- align center on date navigator ([e6915c2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e6915c2e1ee24ef7620eb108417e6e1b61e8614a)) -- align left switch ([a9a7be3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a9a7be3a4ed042508a8ca2ae4db99fdebc789015)) -- background no scroll when modal open ([2dce526](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2dce52660e235200edc6396f24202bd7e8bb8ac6)) -- badge available ([7bdc683](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7bdc6836e4b5a5fcd61e3cefa93c9d7e903c8d3f)) -- border opacity 0.4 ([789fe69](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/789fe69c78af8c53a39e7b37816308328ccc1837)) -- bug duplicate component legal notice ([d593f7c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d593f7c38959a6438d12953bde3427e3104b39ab)) -- center line on graph ([8fcc85a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8fcc85ad5b7afe9f092f2123a9f5e60273f5de90)) -- center pile ([b3c396f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b3c396f775cfb659988fb86034f7ed6cf047ed3f)) -- change account method from harvest-lib ([6de796a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6de796a0ab2f64dc411aa896baee1e2620b3fd5b)) -- change aria-label by aria-labelledby ([ee42e9c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ee42e9c2b9a2c56c322565f8ced0a2e70830196c)) -- change cron schedule to 10.30 am ([2c65a21](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2c65a219baeba4c07d4af3d2b4929dc82e5a9d33)) -- change description of Ecolyo Royal challenge ([322245f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/322245fb07813fbe57722c56ffc3d7627ccaab26)) -- change image for test ci ([80ec2a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/80ec2a4b68e152a8b8baeb2f5c03f6b1a6ab7c39)) -- change loop await way for initialisation ([7ad203c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7ad203cdff8204c142b9b3c480539a9ce7026f62)) -- change max value for analysis chart display ([d9e0306](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9e0306859a2be890a63db916bf69b0172beb678)) -- change order label collective and individual ([aea2faa](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/aea2faa640c108e9f223af2732c2a736e8855671)) -- change slug name ([06a2fe0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/06a2fe0562ada8a581ac27e8a19538d2ecfe71d1)) -- change slug name ([855750b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/855750becc9a0adbfa17e54ff6837d2ff431ac47)) -- change Symbale by Cymbale ([45d8866](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/45d8866f6a6bcb979d9bf5d610e9e3c9946adec7)) -- change timeStep + half hour method ([d398ea8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d398ea8d38509041fe863fedf7305858bbbb16fb)) -- change timeStep + half hour method ([e3230b5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e3230b54c3cc120b0262308cbaa9e2dcd3907500)) -- change trigger cron params ([d128b2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d128b2f1153c39903bd97c289da6eb0afdd6d485)) -- change welcome mail content ([8bed326](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8bed3260cfb0ff397b633b227d2a0a0ac103d3be)) -- check data before retrieve max data ([c5dfba7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c5dfba7e0673eace869fd4c2d90923bc5a319c9c)) -- color button create account ([bbffed8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bbffed8d92248bb92fb599838bb5c9e6b5513a58)) -- color button when update ([047a312](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/047a31259faf102d33d6038d0fa7fd1b4ad16074)) -- comments MR + start of month ([08fe45d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/08fe45d3551e11cfe2157c5c3b11cdf68d69fd91)) -- conflict merge ([b3d25d4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b3d25d45d5ecd15abf20dbc9ef004cf8a2b9e67a)) -- convert logo png to svg ([bf96096](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bf96096af88116b2bee761460b54e360e46a8d47)) -- correct build ([af5df9f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/af5df9fb7bd3c8dc9c5d35a2ed34c06d58856512)) -- correct time period for half an hour ([a5e19a4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a5e19a4e32f504af80053b3bfead8ff3bd2bd1ab)) -- correction on locale ([bc0cefa](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bc0cefad14831b6c41e85c4c05fbccfcaf6e84a2)) -- create a decore function ([8851a16](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8851a16b6888d6a80a3ea111710e01241f7f6bf7)) -- cursor for ecogesture filter list ([c5476df](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c5476df194bee686bbd6037ad21b6cd947f05035)) -- date utils tests ([8c908ef](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8c908ef2264b007c9c3b357ebbc600fe356db56a)) -- deleted scss ([830f8dc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/830f8dcf10e2f9a97fb344219d5a4533ba70996f)) -- display close button modal ([037e3e8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/037e3e8cd5749e4dfab37de2b3aea906478140a4)) -- display of badge for challenge into report ([29a4fa9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/29a4fa933201c0ee5917d00e89f01912c2eeed5c)) -- do not display mega unit for multi fluid ([8a2ed2f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8a2ed2f3c87da063fd474d1829a844182027e52d)) -- **docker:** cozy-stack build ([3abed20](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3abed20afdb0d5e0adbc6a82bc56b81fda80e6bd)) -- don't display error if data is coming ([3ea369a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3ea369ae7291c4c1f9a081ff5834543990fa5876)) -- duel chart ([6740306](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6740306ad7aed87e6ffd5c8ab41fa72752070ab3)) -- ecogesture icon on finished challenge ([cd66cd7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cd66cd7dc9247f0ad6a8594fd2dbdb699dae634e)) -- ecogestures import ([4fca615](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4fca615410d652334102ef8b0c930ec61f2b0adf)) -- ecogestures import ([3ba7a00](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3ba7a00b7eb0e625be11f7c1dc98c034f30519c7)) -- ecogestures import ([8304c89](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8304c8941db60d8c20b6a4678385901330865978)) -- end of duel ([a927618](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a9276181ed940ac71430c44cdadfaff924cae177)) -- end of duel ([4d86540](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4d86540ee5be64b135f96ab8c5061891f111ac2e)) -- error 500 on account index creation ([25cf2d5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/25cf2d5f2ca729c7ceed41aacbbca45cdce673c6)) -- error git cache ([041f804](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/041f8045e96108e064a10080ca2aaa7824d26a31)) -- error handle for deleteAll ([633ebb4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/633ebb4ce440cce90e00325b5c33c7d14d211a72)) -- errors in konnector launch ([138d281](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/138d281c3f19034be4d0e343a7b7bcb27b8d20cf)) -- favmodal only when welcome modal is seen ([fdce3cc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fdce3cc2c374f396f238403cd65b7effed9f0a07)) -- feedback design ([e62767b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e62767ba5fe3c14a2d3dd773295e9d196ff32ade)) -- feedback design + rename ([6a1b021](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6a1b0218c79a6b9b27bc1c1aed4e026457008c3b)) -- finished challenge badge ([a3aea29](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a3aea29822dd13a4435d9ac6ea97d70988a05c2c)) -- fix bug ios safari compatibility ([34bdf62](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/34bdf6202d17434e42a84ea59bf90351db911d2c)) -- fix mock function bug ([f20935a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f20935a683e364d83c84249a3aacfee63e0f5258)) -- fix MR ([f185c1f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f185c1fd997b7397b237454c95f68a21e1f3f508)) -- fix review ([610c47b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/610c47b53718c79e88149ff2b219489bce68220d)) -- fix test quizCustomContent and DuelUnlocked ([d62c208](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d62c20872b76f405bcf6fac196068ce707920094)) -- fr.json ([ce0b89e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ce0b89efb067b94843e018ca3cdbea265c83901a)) -- go to top of screen for ecogesture list ([a7d2578](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a7d25782b04b22bd54e742b1fc9a3e2acdcd4e07)) -- grey locked / space between button + color ([b9c12ca](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b9c12caab4cae643a21b854afe3699d4c31cf522)) -- half hour enum ([1efdb03](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1efdb03916ef5f6b4faa811ffd7f42047c35c433)) -- half hour warning ([2f727a5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2f727a5f1fc126b90dc09c745c702e3eae7a6325)) -- half hour warning ([6cd710a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/6cd710a7360aa960cecee32f99c480013edbc178)) -- handle activate half hour load correctly ([a035cc4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a035cc4e41215f376f12b14ac60ca53806c97e15)) -- handle correctly index for half an hour ([fea5f5e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fea5f5e608d7108b8037b0d2704c2718b114a418)) -- hash on next week ([a588708](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a58870810b35d284dcbfb749fbaf3419801b2472)) -- hash on next week ([ad7653c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ad7653cd4d6205628b6bc900f1d1cd856204315e)) -- height quizQuestion and margin analysis form ([1b3cbc7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1b3cbc704a464147911b93cc04a105e3e6768e16)) -- HomeIndicators tests ([ba6330d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ba6330d3ef5ba610f8a1fa42105a0a2b99bc9bd3)) -- icons ([b9dc827](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b9dc827ca2390dc61ff7c937135d8ccd76f5a3ff)) -- ID ecogesture & async functions ([9010e62](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9010e62afde37ff8fc3fa4bd0a4d5cc01eb2c9b2)) -- input focus display ([c315442](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c3154421db8acc43bfe1883387e5e9d8ffe8dd5a)) -- keep timestep on fluid change ([761a425](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/761a425fc3814e4cd0b0f8f3dee7dcbd25117895)) -- konnector error ([7c8cb85](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7c8cb85f7413b48df48149999d31afdd0a57f109)) -- last data valid message ([b9ecdd1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b9ecdd1c6c46f739ac1458c71ccd01f57e1644b9)) -- last update success ([3984631](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/39846312ab12051d1164183e3659e401e27c086a)) -- loader/graph scroll ([4e9352c](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4e9352c2dc1b7c0f0a78d20d3420b64d52b0f6da)) -- loader/graph scroll ([c14a0c7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c14a0c7d6222dafc49dcf4d27c94115be647a5a5)) -- loading chart + scale if 0 ([b3bef1d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b3bef1d7e49a48b1507627652a2bc02f38094927)) -- loading state for konnector ([7800aaf](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7800aaf6567c8bc7b973282e6675d7a623713bd3)) -- manifest ([99431ac](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/99431acd135ad1ab06abaabaa3af34c165fef2a3)) -- modal visibility ([a6dfb17](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a6dfb1700148777d980066bf7887f43cb8d56a9c)) -- modal visibility ([3b5605d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3b5605df8cf8a4e7b8fc72c3dc9b66bfadcd4762)) -- modal visibility ([a1b24f1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a1b24f1ffc78df61012420c136522f0948df7369)) -- modal visibility ([8a81d77](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8a81d77242bb54066e7d63b49951ce8c54605bb6)) -- modify message_success field ([dde73b9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dde73b9d918fc71e33d966b7545b1d4e6c6258e8)) -- modify style button from oldfluidmodal ([cec4e84](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cec4e84f6d43d917e270dd55c40e039c5e4abfac)) -- move graph dekstop + hash month challenge ([09b2e9f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/09b2e9f6d49845f50629d5cfc75dc25a00ed2032)) -- new fluidtypes in challenge ([d9be3fe](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d9be3feb95aa5d6d393d5140a5f81f0c050073ef)) -- new splash ([a09d5b5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/a09d5b559d0fc504f03f5d286f2585d1e81862f9)) -- no analysis notification on first connection ([ff73ad3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ff73ad36660ec93a9aa0b85a9c9775e936c0a299)) -- no stop on achievment ([2703557](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/27035577c722a8a030316f55bf34c2429c2fcff8)) -- no value in graph + font size home + underline FAQ ([3806b29](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3806b298d1b03ef5640c9f5ad04338f60d6d392d)) -- optimize updateUserDuelThreshold method ([b89126d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b89126d01a49d8e05dad9a16d7846600ef4e10a6)) -- Optimize updateUserDuelThreshold method ([bb3d7fb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bb3d7fb5100a13fc5fb8d20f5fd478c9803f1172)) -- order ecogesture button ([8e52326](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8e52326beb907cdefdb1bc56f52661071da097af)) -- order of konnectors ([f7f0c3a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f7f0c3a2ae1e14e7f8083e546572b4c7646ffc6c)) -- pile alignment + new badge + picto on modal from challenge ([c7547ee](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c7547ee855f270ae7183252d653af056b1ae16b8)) -- pile alignment + new badge + picto on modal from challenge ([003ec6b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/003ec6bcb18cb2c68c6d78e04ff9abad4dc89fab)) -- position button ([ed411b5](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ed411b5c808c166b9777704c75bb3db87de588d7)) -- prevent serviceWorker registration for safari ([c0081b8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c0081b879f8aa7c08b22cf4a182ec83b65032098)) -- removal of html to react lib ([190f020](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/190f020e6f2bc9adec2137c749cc6fee05bf4893)) -- remove await and then ([3454bd6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3454bd6391c34c59c0afd5e3cbc0cf40c7029f05)) -- remove border for konnector modal ([19308ce](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/19308ce3a70bdbc1f3481d172fc2a339e24cd421)) -- remove challenge title from challenge card ([62b1d2b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/62b1d2b21f0009aed12bf7ae41029b42ed806790)) -- remove cozy doctype folder ([162d3e1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/162d3e15eb568c0905fd1e98cb7a64dfa81de8bc)) -- remove duplicate margin ([e160a21](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e160a21ef5915160c5faf60758a58424a2e6fd33)) -- remove height header ([18d1723](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/18d172303a9c2fd6d90f2eb02658f48eea3e5224)) -- remove isEmpty for isChallengeDone method ([9143ac3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9143ac394da6785fb5ceebca2855698088fcb87a)) -- remove LOGIN_SUCCESS_EVENT during connection ([8fa84d2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8fa84d254b716f167694fd4b7e585220282384ae)) -- remove old console log ([9bacb51](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/9bacb512926ffa745180bde0bd4e7fa1389bcb58)) -- remove unused import ([246e71d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/246e71da026b116f1d5a17e8f07335662133ae9c)) -- remove useless files ([60d2817](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/60d2817063de5c9bf860a8e3f690d5dca2af57d0)) -- report display when no challenge ([e735ed8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e735ed84e5f4a79334e04fb25c07af8abac7349e)) -- review ChallengeCardUnlocked test ([23ffd2e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/23ffd2e6b7c3f9c47d982453bf91b3c42d024de2)) -- review ChallengeCardUnlocked test ([f9f271e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f9f271e99efe628cbb1026db673d44a4d2ef046b)) -- review design of mail button ([8c0b399](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/8c0b399e67ee7943c0573570ddbccbe92f068c68)) -- review design of welcome mail ([c589969](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c589969d75c088593d4f4d505a3281446e07cca9)) -- review design of welcome mail ([490a391](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/490a391cb22c0a22ab00b2d9b78605cdb5657074)) -- review design of welcome mail ([fc19fd1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fc19fd1212c3dbe5be23cab181d8a26c7c7d8c1f)) -- review duel Error ([7ad5fbc](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7ad5fbcf5d209698d4d127c3d72eb8d96488f549)) -- review DuelOngoing & QuizFinish act tests ([56b9edb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/56b9edb281cd24efe096bfe031985f65ef09b9a4)) -- review DuelUnlocked tests ([bd12e9a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bd12e9a6861ddc49a2946f5c50a5e213ed40fd15)) -- review fluid service tests ([5bf98d7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5bf98d78664843e8accc49d8bfbeba81e8dd3619)) -- review initialization tests ([4c61955](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4c619551890704aec577d44e7dd6e1cf5ddfe71a)) -- review initialization tests ([d88eab1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d88eab12004cc2fd00f7f83a71906637bf7faa12)) -- review initilization services tests ([4c08b42](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4c08b429ed803da8255e18c05fbcb98fe06778d6)) -- **scripts:** data folder wasn't created on createDayDataFiles script ([2e86cd9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/2e86cd9300d212a8d2c13b6be7542f295229cae3)) -- scroll on modal ([f1c12d6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f1c12d61ba6a3b25a043e550d0ad087f973f7412)) -- set date as UTC in tests ([5d86208](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/5d862082ef30b6ba9739fbd6e506a5bcddbf1900)) -- set relationship when starting new challenge ([710c2a7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/710c2a74fac376dc0affb684892e34ce1dd64227)) -- set selectedDate when konnector has been ran ([c343df7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/c343df754068c7d5133085f72eb408eb4f6811cb)) -- show hash only on timestep day ([dfd1d6b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/dfd1d6bb9b1a04958b33e59866fb7cbffb33f259)) -- slug in config ([af1a1bb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/af1a1bbd51fb8ce2df52ffd9adf18c898c914c5f)) -- split permissions until wildcard ([b16bc2a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b16bc2a5c1027dcbf5ab1bbfa0370dcc6ae9b8b9)) -- state issue ([510258f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/510258fef1fcba1579a5d7d88cea39b45be5613b)) -- state issue on ChallengeCardOnGoing ([d4ecb87](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d4ecb8757be57191e932b16bf8c977b070e96867)) -- style bug and modify quiz question content ([fafb9ac](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fafb9acc776db88380266e6e263c75476040fcfe)) -- style for report options ([fdd09f8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fdd09f89bd688f8441cd62d397f0d508b23047fd)) -- superposition + no scroll when modal ([29911bd](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/29911bdec520bc58459b2c0d10bb8b03801edf2f)) -- tests mock window.navigator ([1f6a82d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1f6a82d54198b1f91648528336af078a705d6fbe)) -- title header + responsive modal ([03e166e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/03e166e27ad291c634188d6667fa82b597f279cd)) -- update konnector deletion ([cb707f8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/cb707f8d5c00e2cb6e2368e7e66519d0fc9d6d0d)) -- update oldfluidmodal snapshot ([68f71ad](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/68f71add6e8a90d67dfd91c44ddfde9289775857)) -- update profile type options ([4d06a04](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4d06a04e7a26ef61421ab2572854a85337a773bc)) -- update snapshot ([0e1f05e](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0e1f05e2fdb9aad18d1aca4abe37ec4d3f14dca7)) -- update snapshot ([3d7eb44](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3d7eb44f114c6b95ced47587e2031a56f5ee2255)) -- update snapshot ([e422a93](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e422a93b2cb188635b20ceb62c9bce760f63ea35)) -- update snapshots ([bdbeceb](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/bdbecebaac47810477e85f61eb16ee7befc21250)) -- update test snapshots ([0b1de40](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/0b1de4005f5bcb16e7c769d446269f970e278780)) -- update tests ([61f2d05](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/61f2d05167caf27004b304a2a58aa40eba48289c)) -- update tests ([08c3b82](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/08c3b823cf88ea6d60f4577a82a815c1c4d98a18)) -- update tests ([144fec8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/144fec861fe53ee528f8f1e6bbec24e4432a9fb0)) -- use es6 destructuring ([b799cf9](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/b799cf91759d07a76116d9b2f9fa29afc3de33a5)) -- use utc for tests ([fb64782](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fb64782769ba9db7b46b48755a05a07f766d5be8)) -- use utc for tests ([d5443df](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d5443df5b6a99c5fe6426078dc9ba33744a1ebc1)) -- use utc for tests ([314d279](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/314d27932aeefd8eaa023d8aa6008b64b001843a)) -- use viewport for gcu accept button ([40fe28a](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/40fe28a274fb6f28fc1761e9df81a93c465f0287)) -- userInstanceSettings with right name ([1b0cb94](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/1b0cb948a045cd1e6b08b69d6fa7af8a0823765c)) -- visualizer for multifluid when only one fluid ([f9437b2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f9437b20255b87b3712c2d34b2a664cd3a620cd9)) -- weekly timeline follow + halfhour timestep change + ecogestures size ([944a702](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/944a702e59d188bbf76210616ec67b1494dfad47)) +- margin for order-container into ecogesture ([f3c8e63](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f3c8e63d8845aab1701eb0c59532f11a8d0652e6)) +- € data on home graph ([0c0f7f9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0c0f7f951719c6c3aab8b1bfa075e9068f2db32b)) +- 0 value in graph ([20371fe](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/20371fe5987c7c5c6d3178490c5449261f80fc63)) +- 500 error on konnector index ([4efea47](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4efea47567e329371823921fc3a7ef8c3b6dbdeb)) +- add && on challenge.fluidTypes ([042c273](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/042c27300fcd67f23cfcf40a1c5225d4aee1f6b7)) +- add filter on FluidStatus for getValidPeriod ([14a45a5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/14a45a578c8915f01c5df646868a45eaf60d3387)) +- add hald an hour data in scripts ([d29acd2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d29acd265ad52ca2dd1e539dc8510309b85722e4)) +- add message succes field ([ccc95c6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ccc95c6613f0eaff7cff4c9e973deea717155796)) +- add missing translation ([eeb7351](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/eeb735116762cfeba17e2d8879fb3dd3615f9f30)) +- add subscribed on async useEffect ([aa958e3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/aa958e3b0a535b4556c91d566aba88500115d719)) +- add vendors config webpack ([2d33812](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2d33812d884ea6d506d01b4ca4d9e6462df8f3e2)) +- align center on date navigator ([e6915c2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e6915c2e1ee24ef7620eb108417e6e1b61e8614a)) +- align left switch ([a9a7be3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a9a7be3a4ed042508a8ca2ae4db99fdebc789015)) +- background no scroll when modal open ([2dce526](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2dce52660e235200edc6396f24202bd7e8bb8ac6)) +- badge available ([7bdc683](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7bdc6836e4b5a5fcd61e3cefa93c9d7e903c8d3f)) +- border opacity 0.4 ([789fe69](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/789fe69c78af8c53a39e7b37816308328ccc1837)) +- bug duplicate component legal notice ([d593f7c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d593f7c38959a6438d12953bde3427e3104b39ab)) +- center line on graph ([8fcc85a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8fcc85ad5b7afe9f092f2123a9f5e60273f5de90)) +- center pile ([b3c396f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b3c396f775cfb659988fb86034f7ed6cf047ed3f)) +- change account method from harvest-lib ([6de796a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6de796a0ab2f64dc411aa896baee1e2620b3fd5b)) +- change aria-label by aria-labelledby ([ee42e9c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ee42e9c2b9a2c56c322565f8ced0a2e70830196c)) +- change cron schedule to 10.30 am ([2c65a21](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2c65a219baeba4c07d4af3d2b4929dc82e5a9d33)) +- change description of Ecolyo Royal challenge ([322245f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/322245fb07813fbe57722c56ffc3d7627ccaab26)) +- change image for test ci ([80ec2a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/80ec2a4b68e152a8b8baeb2f5c03f6b1a6ab7c39)) +- change loop await way for initialisation ([7ad203c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7ad203cdff8204c142b9b3c480539a9ce7026f62)) +- change max value for analysis chart display ([d9e0306](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d9e0306859a2be890a63db916bf69b0172beb678)) +- change order label collective and individual ([aea2faa](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/aea2faa640c108e9f223af2732c2a736e8855671)) +- change slug name ([06a2fe0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/06a2fe0562ada8a581ac27e8a19538d2ecfe71d1)) +- change slug name ([855750b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/855750becc9a0adbfa17e54ff6837d2ff431ac47)) +- change Symbale by Cymbale ([45d8866](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/45d8866f6a6bcb979d9bf5d610e9e3c9946adec7)) +- change timeStep + half hour method ([d398ea8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d398ea8d38509041fe863fedf7305858bbbb16fb)) +- change timeStep + half hour method ([e3230b5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e3230b54c3cc120b0262308cbaa9e2dcd3907500)) +- change trigger cron params ([d128b2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d128b2f1153c39903bd97c289da6eb0afdd6d485)) +- change welcome mail content ([8bed326](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8bed3260cfb0ff397b633b227d2a0a0ac103d3be)) +- check data before retrieve max data ([c5dfba7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c5dfba7e0673eace869fd4c2d90923bc5a319c9c)) +- color button create account ([bbffed8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bbffed8d92248bb92fb599838bb5c9e6b5513a58)) +- color button when update ([047a312](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/047a31259faf102d33d6038d0fa7fd1b4ad16074)) +- comments MR + start of month ([08fe45d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/08fe45d3551e11cfe2157c5c3b11cdf68d69fd91)) +- conflict merge ([b3d25d4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b3d25d45d5ecd15abf20dbc9ef004cf8a2b9e67a)) +- convert logo png to svg ([bf96096](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bf96096af88116b2bee761460b54e360e46a8d47)) +- correct build ([af5df9f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/af5df9fb7bd3c8dc9c5d35a2ed34c06d58856512)) +- correct time period for half an hour ([a5e19a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a5e19a4e32f504af80053b3bfead8ff3bd2bd1ab)) +- correction on locale ([bc0cefa](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bc0cefad14831b6c41e85c4c05fbccfcaf6e84a2)) +- create a decore function ([8851a16](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8851a16b6888d6a80a3ea111710e01241f7f6bf7)) +- cursor for ecogesture filter list ([c5476df](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c5476df194bee686bbd6037ad21b6cd947f05035)) +- date utils tests ([8c908ef](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8c908ef2264b007c9c3b357ebbc600fe356db56a)) +- deleted scss ([830f8dc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/830f8dcf10e2f9a97fb344219d5a4533ba70996f)) +- display close button modal ([037e3e8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/037e3e8cd5749e4dfab37de2b3aea906478140a4)) +- display of badge for challenge into report ([29a4fa9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/29a4fa933201c0ee5917d00e89f01912c2eeed5c)) +- do not display mega unit for multi fluid ([8a2ed2f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8a2ed2f3c87da063fd474d1829a844182027e52d)) +- **docker:** cozy-stack build ([3abed20](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3abed20afdb0d5e0adbc6a82bc56b81fda80e6bd)) +- don't display error if data is coming ([3ea369a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3ea369ae7291c4c1f9a081ff5834543990fa5876)) +- duel chart ([6740306](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6740306ad7aed87e6ffd5c8ab41fa72752070ab3)) +- ecogesture icon on finished challenge ([cd66cd7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cd66cd7dc9247f0ad6a8594fd2dbdb699dae634e)) +- ecogestures import ([4fca615](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4fca615410d652334102ef8b0c930ec61f2b0adf)) +- ecogestures import ([3ba7a00](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3ba7a00b7eb0e625be11f7c1dc98c034f30519c7)) +- ecogestures import ([8304c89](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8304c8941db60d8c20b6a4678385901330865978)) +- end of duel ([a927618](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a9276181ed940ac71430c44cdadfaff924cae177)) +- end of duel ([4d86540](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4d86540ee5be64b135f96ab8c5061891f111ac2e)) +- error 500 on account index creation ([25cf2d5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/25cf2d5f2ca729c7ceed41aacbbca45cdce673c6)) +- error git cache ([041f804](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/041f8045e96108e064a10080ca2aaa7824d26a31)) +- error handle for deleteAll ([633ebb4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/633ebb4ce440cce90e00325b5c33c7d14d211a72)) +- errors in konnector launch ([138d281](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/138d281c3f19034be4d0e343a7b7bcb27b8d20cf)) +- favmodal only when welcome modal is seen ([fdce3cc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fdce3cc2c374f396f238403cd65b7effed9f0a07)) +- feedback design ([e62767b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e62767ba5fe3c14a2d3dd773295e9d196ff32ade)) +- feedback design + rename ([6a1b021](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6a1b0218c79a6b9b27bc1c1aed4e026457008c3b)) +- finished challenge badge ([a3aea29](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a3aea29822dd13a4435d9ac6ea97d70988a05c2c)) +- fix bug ios safari compatibility ([34bdf62](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/34bdf6202d17434e42a84ea59bf90351db911d2c)) +- fix mock function bug ([f20935a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f20935a683e364d83c84249a3aacfee63e0f5258)) +- fix MR ([f185c1f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f185c1fd997b7397b237454c95f68a21e1f3f508)) +- fix review ([610c47b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/610c47b53718c79e88149ff2b219489bce68220d)) +- fix test quizCustomContent and DuelUnlocked ([d62c208](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d62c20872b76f405bcf6fac196068ce707920094)) +- fr.json ([ce0b89e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ce0b89efb067b94843e018ca3cdbea265c83901a)) +- go to top of screen for ecogesture list ([a7d2578](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a7d25782b04b22bd54e742b1fc9a3e2acdcd4e07)) +- grey locked / space between button + color ([b9c12ca](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b9c12caab4cae643a21b854afe3699d4c31cf522)) +- half hour enum ([1efdb03](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1efdb03916ef5f6b4faa811ffd7f42047c35c433)) +- half hour warning ([2f727a5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2f727a5f1fc126b90dc09c745c702e3eae7a6325)) +- half hour warning ([6cd710a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6cd710a7360aa960cecee32f99c480013edbc178)) +- handle activate half hour load correctly ([a035cc4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a035cc4e41215f376f12b14ac60ca53806c97e15)) +- handle correctly index for half an hour ([fea5f5e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fea5f5e608d7108b8037b0d2704c2718b114a418)) +- hash on next week ([a588708](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a58870810b35d284dcbfb749fbaf3419801b2472)) +- hash on next week ([ad7653c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ad7653cd4d6205628b6bc900f1d1cd856204315e)) +- height quizQuestion and margin analysis form ([1b3cbc7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1b3cbc704a464147911b93cc04a105e3e6768e16)) +- HomeIndicators tests ([ba6330d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ba6330d3ef5ba610f8a1fa42105a0a2b99bc9bd3)) +- icons ([b9dc827](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b9dc827ca2390dc61ff7c937135d8ccd76f5a3ff)) +- ID ecogesture & async functions ([9010e62](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9010e62afde37ff8fc3fa4bd0a4d5cc01eb2c9b2)) +- input focus display ([c315442](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c3154421db8acc43bfe1883387e5e9d8ffe8dd5a)) +- keep timestep on fluid change ([761a425](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/761a425fc3814e4cd0b0f8f3dee7dcbd25117895)) +- konnector error ([7c8cb85](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7c8cb85f7413b48df48149999d31afdd0a57f109)) +- last data valid message ([b9ecdd1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b9ecdd1c6c46f739ac1458c71ccd01f57e1644b9)) +- last update success ([3984631](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/39846312ab12051d1164183e3659e401e27c086a)) +- loader/graph scroll ([4e9352c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4e9352c2dc1b7c0f0a78d20d3420b64d52b0f6da)) +- loader/graph scroll ([c14a0c7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c14a0c7d6222dafc49dcf4d27c94115be647a5a5)) +- loading chart + scale if 0 ([b3bef1d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b3bef1d7e49a48b1507627652a2bc02f38094927)) +- loading state for konnector ([7800aaf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7800aaf6567c8bc7b973282e6675d7a623713bd3)) +- manifest ([99431ac](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/99431acd135ad1ab06abaabaa3af34c165fef2a3)) +- modal visibility ([a6dfb17](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a6dfb1700148777d980066bf7887f43cb8d56a9c)) +- modal visibility ([3b5605d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3b5605df8cf8a4e7b8fc72c3dc9b66bfadcd4762)) +- modal visibility ([a1b24f1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a1b24f1ffc78df61012420c136522f0948df7369)) +- modal visibility ([8a81d77](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8a81d77242bb54066e7d63b49951ce8c54605bb6)) +- modify message_success field ([dde73b9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dde73b9d918fc71e33d966b7545b1d4e6c6258e8)) +- modify style button from oldfluidmodal ([cec4e84](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cec4e84f6d43d917e270dd55c40e039c5e4abfac)) +- move graph dekstop + hash month challenge ([09b2e9f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/09b2e9f6d49845f50629d5cfc75dc25a00ed2032)) +- new fluidtypes in challenge ([d9be3fe](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d9be3feb95aa5d6d393d5140a5f81f0c050073ef)) +- new splash ([a09d5b5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a09d5b559d0fc504f03f5d286f2585d1e81862f9)) +- no analysis notification on first connection ([ff73ad3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ff73ad36660ec93a9aa0b85a9c9775e936c0a299)) +- no stop on achievment ([2703557](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/27035577c722a8a030316f55bf34c2429c2fcff8)) +- no value in graph + font size home + underline FAQ ([3806b29](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3806b298d1b03ef5640c9f5ad04338f60d6d392d)) +- optimize updateUserDuelThreshold method ([b89126d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b89126d01a49d8e05dad9a16d7846600ef4e10a6)) +- Optimize updateUserDuelThreshold method ([bb3d7fb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bb3d7fb5100a13fc5fb8d20f5fd478c9803f1172)) +- order ecogesture button ([8e52326](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8e52326beb907cdefdb1bc56f52661071da097af)) +- order of konnectors ([f7f0c3a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f7f0c3a2ae1e14e7f8083e546572b4c7646ffc6c)) +- pile alignment + new badge + picto on modal from challenge ([c7547ee](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c7547ee855f270ae7183252d653af056b1ae16b8)) +- pile alignment + new badge + picto on modal from challenge ([003ec6b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/003ec6bcb18cb2c68c6d78e04ff9abad4dc89fab)) +- position button ([ed411b5](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ed411b5c808c166b9777704c75bb3db87de588d7)) +- prevent serviceWorker registration for safari ([c0081b8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c0081b879f8aa7c08b22cf4a182ec83b65032098)) +- removal of html to react lib ([190f020](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/190f020e6f2bc9adec2137c749cc6fee05bf4893)) +- remove await and then ([3454bd6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3454bd6391c34c59c0afd5e3cbc0cf40c7029f05)) +- remove border for konnector modal ([19308ce](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/19308ce3a70bdbc1f3481d172fc2a339e24cd421)) +- remove challenge title from challenge card ([62b1d2b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/62b1d2b21f0009aed12bf7ae41029b42ed806790)) +- remove cozy doctype folder ([162d3e1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/162d3e15eb568c0905fd1e98cb7a64dfa81de8bc)) +- remove duplicate margin ([e160a21](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e160a21ef5915160c5faf60758a58424a2e6fd33)) +- remove height header ([18d1723](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/18d172303a9c2fd6d90f2eb02658f48eea3e5224)) +- remove isEmpty for isChallengeDone method ([9143ac3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9143ac394da6785fb5ceebca2855698088fcb87a)) +- remove LOGIN_SUCCESS_EVENT during connection ([8fa84d2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8fa84d254b716f167694fd4b7e585220282384ae)) +- remove old console log ([9bacb51](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9bacb512926ffa745180bde0bd4e7fa1389bcb58)) +- remove unused import ([246e71d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/246e71da026b116f1d5a17e8f07335662133ae9c)) +- remove useless files ([60d2817](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/60d2817063de5c9bf860a8e3f690d5dca2af57d0)) +- report display when no challenge ([e735ed8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e735ed84e5f4a79334e04fb25c07af8abac7349e)) +- review ChallengeCardUnlocked test ([23ffd2e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/23ffd2e6b7c3f9c47d982453bf91b3c42d024de2)) +- review ChallengeCardUnlocked test ([f9f271e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f9f271e99efe628cbb1026db673d44a4d2ef046b)) +- review design of mail button ([8c0b399](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/8c0b399e67ee7943c0573570ddbccbe92f068c68)) +- review design of welcome mail ([c589969](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c589969d75c088593d4f4d505a3281446e07cca9)) +- review design of welcome mail ([490a391](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/490a391cb22c0a22ab00b2d9b78605cdb5657074)) +- review design of welcome mail ([fc19fd1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fc19fd1212c3dbe5be23cab181d8a26c7c7d8c1f)) +- review duel Error ([7ad5fbc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7ad5fbcf5d209698d4d127c3d72eb8d96488f549)) +- review DuelOngoing & QuizFinish act tests ([56b9edb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/56b9edb281cd24efe096bfe031985f65ef09b9a4)) +- review DuelUnlocked tests ([bd12e9a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bd12e9a6861ddc49a2946f5c50a5e213ed40fd15)) +- review fluid service tests ([5bf98d7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5bf98d78664843e8accc49d8bfbeba81e8dd3619)) +- review initialization tests ([4c61955](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4c619551890704aec577d44e7dd6e1cf5ddfe71a)) +- review initialization tests ([d88eab1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d88eab12004cc2fd00f7f83a71906637bf7faa12)) +- review initilization services tests ([4c08b42](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4c08b429ed803da8255e18c05fbcb98fe06778d6)) +- **scripts:** data folder wasn't created on createDayDataFiles script ([2e86cd9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e86cd9300d212a8d2c13b6be7542f295229cae3)) +- scroll on modal ([f1c12d6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f1c12d61ba6a3b25a043e550d0ad087f973f7412)) +- set date as UTC in tests ([5d86208](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5d862082ef30b6ba9739fbd6e506a5bcddbf1900)) +- set relationship when starting new challenge ([710c2a7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/710c2a74fac376dc0affb684892e34ce1dd64227)) +- set selectedDate when konnector has been ran ([c343df7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c343df754068c7d5133085f72eb408eb4f6811cb)) +- show hash only on timestep day ([dfd1d6b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dfd1d6bb9b1a04958b33e59866fb7cbffb33f259)) +- slug in config ([af1a1bb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/af1a1bbd51fb8ce2df52ffd9adf18c898c914c5f)) +- split permissions until wildcard ([b16bc2a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b16bc2a5c1027dcbf5ab1bbfa0370dcc6ae9b8b9)) +- state issue ([510258f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/510258fef1fcba1579a5d7d88cea39b45be5613b)) +- state issue on ChallengeCardOnGoing ([d4ecb87](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d4ecb8757be57191e932b16bf8c977b070e96867)) +- style bug and modify quiz question content ([fafb9ac](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fafb9acc776db88380266e6e263c75476040fcfe)) +- style for report options ([fdd09f8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fdd09f89bd688f8441cd62d397f0d508b23047fd)) +- superposition + no scroll when modal ([29911bd](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/29911bdec520bc58459b2c0d10bb8b03801edf2f)) +- tests mock window.navigator ([1f6a82d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1f6a82d54198b1f91648528336af078a705d6fbe)) +- title header + responsive modal ([03e166e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/03e166e27ad291c634188d6667fa82b597f279cd)) +- update konnector deletion ([cb707f8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cb707f8d5c00e2cb6e2368e7e66519d0fc9d6d0d)) +- update oldfluidmodal snapshot ([68f71ad](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/68f71add6e8a90d67dfd91c44ddfde9289775857)) +- update profile type options ([4d06a04](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4d06a04e7a26ef61421ab2572854a85337a773bc)) +- update snapshot ([0e1f05e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0e1f05e2fdb9aad18d1aca4abe37ec4d3f14dca7)) +- update snapshot ([3d7eb44](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3d7eb44f114c6b95ced47587e2031a56f5ee2255)) +- update snapshot ([e422a93](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e422a93b2cb188635b20ceb62c9bce760f63ea35)) +- update snapshots ([bdbeceb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bdbecebaac47810477e85f61eb16ee7befc21250)) +- update test snapshots ([0b1de40](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0b1de4005f5bcb16e7c769d446269f970e278780)) +- update tests ([61f2d05](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/61f2d05167caf27004b304a2a58aa40eba48289c)) +- update tests ([08c3b82](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/08c3b823cf88ea6d60f4577a82a815c1c4d98a18)) +- update tests ([144fec8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/144fec861fe53ee528f8f1e6bbec24e4432a9fb0)) +- use es6 destructuring ([b799cf9](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b799cf91759d07a76116d9b2f9fa29afc3de33a5)) +- use utc for tests ([fb64782](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/fb64782769ba9db7b46b48755a05a07f766d5be8)) +- use utc for tests ([d5443df](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/d5443df5b6a99c5fe6426078dc9ba33744a1ebc1)) +- use utc for tests ([314d279](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/314d27932aeefd8eaa023d8aa6008b64b001843a)) +- use viewport for gcu accept button ([40fe28a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/40fe28a274fb6f28fc1761e9df81a93c465f0287)) +- userInstanceSettings with right name ([1b0cb94](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/1b0cb948a045cd1e6b08b69d6fa7af8a0823765c)) +- visualizer for multifluid when only one fluid ([f9437b2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f9437b20255b87b3712c2d34b2a664cd3a620cd9)) +- weekly timeline follow + halfhour timestep change + ecogestures size ([944a702](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/944a702e59d188bbf76210616ec67b1494dfad47)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8cae6bb662b2335cc127ef5fabfb2f9e65825c68..a3ac1dc63445e76c34c4ceeef16e91f65bb77154 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,14 +2,12 @@ Thank you for your interest in contributing to this Cozy application! There are many ways to contribute, and we appreciate all of them. - ## Security Issues If you discover a security issue, please bring it to our attention right away! Please **DO NOT** file a public issue, instead send your report privately to security AT cozycloud DOT cc. Security reports are greatly appreciated and we will publicly thank you for it. We currently do not offer a paid security bounty program, but are not ruling it out in the future. - ## Bug Reports While bugs are unfortunate, they're a reality in software. We can't fix what we don't know about, so please report liberally. If you're not sure if something is a bug or not, feel free to file a bug anyway. @@ -22,7 +20,6 @@ Opening an issue is as easy as following [this link][issues] and filling out the - What did happen instead? - What is the version of the LyonLivingLabEnergy app? - ## Pull Requests Please keep in mind that: @@ -34,7 +31,6 @@ Please keep in mind that: - you do _not_ need to build app to submit a PR - you should update the Transifex source locale file if you modify it for your feature needs (see [Localization section in README][localization]) - ### Workflow Pull requests are the primary mechanism we use to change Cozy. GitHub itself has some [great documentation][pr] on using the Pull Request feature. We use the _fork and pull_ model described there. @@ -44,7 +40,7 @@ Pull requests are the primary mechanism we use to change Cozy. GitHub itself has Fork the project on GitHub and [check out your copy locally][forking]. ``` -$ git clone https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo.git +$ git clone https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git $ cd ecolyo $ git remote add fork git://github.com/yourusername/ecolyo.git ``` @@ -101,30 +97,25 @@ $ git pull-request -b master -m "My PR message" -o Pull requests are usually reviewed within a few days. If there are comments to address, apply your changes in a separate commit and push that to your branch. Post a comment in the pull request afterwards; GitHub doesn't send out notifications when you add commits. - ## Writing documentation Documentation improvements are very welcome. We try to keep a good documentation in the `/docs` folder. But, you know, we are developers, we can forget to document important stuff that look obvious to us. And documentation can always be improved. - ## Translations The LyonLivingLabEnergy is translated on a platform called [Transifex][tx]. [This tutorial][tx-start] can help you to learn how to make your first steps here. If you have any question, don't hesitate to ask us! - ## Community You can help us by making our community even more vibrant. For example, you can write a blog post, take some videos, answer the questions on [the forum][forum], organize new meetups, and speak about what you like in Cozy! - - [conventional-commits]: https://conventionalcommits.org -[issues]: https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/issues/new +[issues]: https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/issues/new [pr]: https://help.github.com/categories/collaborating-with-issues-and-pull-requests/ [forking]: http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html [stdjs]: http://standardjs.com/ [commitmsg]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html -[localization]: https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/blob/master/README.md#localization +[localization]: https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/blob/master/README.md#localization [hub]: https://hub.github.com/ [tx]: https://www.transifex.com/cozy/ [tx-start]: http://docs.transifex.com/getting-started/translators/ diff --git a/README.md b/README.md index 345e1b2624638e39efab6cac6ce7bd0aec360f48..801cb647fb94e972a4af07903b6fbf010ae78946 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ -# Ecolyo +#  Ecolyo ## What's Ecolyo? Ecolyo is a mobile-first app allowing citizen to visualise easily their energy consumption (electricity, gas, water ...). The app allow simple and more advanced data visualisation -but give also some tips on how to reduce energy consumption. - +but give also some tips on how to reduce energy consumption. ## Hack @@ -17,7 +16,7 @@ Hacking the Cozy Ecolyo app requires you to [setup a dev environment][setup]. You can then clone the app repository and install dependencies: ```sh -$ git clone https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo.git +$ git clone https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git $ cd ecolyo $ yarn install ``` @@ -26,10 +25,10 @@ $ yarn install Cozy's apps use a standard set of _npm scripts_ to run common tasks, like watch, lint, test, build… - ### Run it inside a default Cozy using Docker First of all get cozy dev image : + ```sh $ docker pull cozy/cozy-app-dev ``` @@ -45,6 +44,7 @@ $ yarn start After the build and the stack launched, your app is now available at http://ecolyo.cozy.tools:8080. ### Run it inside custom Docker + For the project we have created our own docker container. For more information on how to use it, please refer to wiki section. ### Tests @@ -58,7 +58,6 @@ $ yarn test :pushpin: Don't forget to update / create new tests when you contribute to code to keep the app the consistent. - ## Models The Cozy datastore stores documents, which can be seen as JSON objects. A `doctype` is simply a declaration of the fields in a given JSON object, to store similar objects in an homogeneous fashion. @@ -70,7 +69,6 @@ Whenever your app needs to use a given `doctype`, you should: - Check if this is a standard `doctype` defined in Cozy itself. If this is the case, you should add a model declaration in your app containing at least the fields listed in the [main fields list for this `doctype`][doctypes]. Note that you can extend the Cozy-provided `doctype` with your own customs fields. This is typically what is done in [Konnectors] for the [Bill `doctype`][bill-doctype]. - If no standards `doctypes` fit your needs, you should define your own `doctype` in your app. In this case, you do not have to put any field you want in your model, but you should crosscheck other cozy apps to try to homogeneize the names of your fields, so that your `doctype` data could be reused by other apps. This is typically the case for the [Konnector `doctype`][konnector-doctype] in [Konnectors]. - ### Open a Pull-Request If you want to work on Ecolyo and submit code modifications, feel free to open pull-requests! See the [contributing guide][contribute] for more information about how to properly open pull-requests. @@ -79,7 +77,6 @@ If you want to work on Ecolyo and submit code modifications, feel free to open p You must follow these rules to write your commit messages : [Conventional Commits Specification][conventional-commits] - ## Community ### What's Cozy? @@ -91,7 +88,7 @@ You must follow these rules to write your commit messages : [Conventional Commit </div> </br> -[Cozy] is a platform that brings all your web services in the same private space. With it, your webapps and your devices can share data easily, providing you with a new experience. You can install Cozy on your own hardware where no one's tracking you. +[Cozy] is a platform that brings all your web services in the same private space. With it, your webapps and your devices can share data easily, providing you with a new experience. You can install Cozy on your own hardware where no one's tracking you. ### Localization @@ -101,12 +98,10 @@ As a _translator_, you can login to [Transifex][tx-signin] (using your Github ac As a _developer_, you must [configure the transifex client][tx-client], and claim an access as _maintainer_ to the [app repository][tx-app]. Then please **only update** the source locale file (usually `en.json` in client and/or server parts), and push it to Transifex repository using the `tx push -s` command. - ### Maintainer The lead maintainer for Ecolyo is [hsubtil](https://forge.grandlyon.com/ext.sopra.husubtil), send him/her a :beers: to say hello! - ### Get in touch You can reach the Cozy Community by: @@ -116,17 +111,14 @@ You can reach the Cozy Community by: - Posting issues on the [Github repos][github] - Say Hi! on [Twitter][twitter] - ## License Ecolyo is developed by "La métropole de Lyon" and distributed under the [AGPL v3 license][agpl-3.0]. - - [conventional-commits]: https://conventionalcommits.org [standard-version]: https://github.com/conventional-changelog/standard-version -[cozy]: https://cozy.io "Cozy Cloud" -[setup]: https://dev.cozy.io/#set-up-the-development-environment "Cozy dev docs: Set up the Development Environment" +[cozy]: https://cozy.io 'Cozy Cloud' +[setup]: https://dev.cozy.io/#set-up-the-development-environment 'Cozy dev docs: Set up the Development Environment' [yarn]: https://yarnpkg.com/ [yarn-install]: https://yarnpkg.com/en/docs/install [cozy-ui]: https://github.com/cozy/cozy-ui diff --git a/app.config.environment.alpha.js b/app.config.environment.alpha.js index e0c4b0b3eef2dc34174673b70fb38d0e48f04934..346a1c982aca46a5971ea7cfa8d91eceb0b32876 100644 --- a/app.config.environment.alpha.js +++ b/app.config.environment.alpha.js @@ -19,6 +19,15 @@ module.exports = { __STACK_ASSETS__: target !== 'mobile', __PIWIK_TRACKER_URL__: JSON.stringify('https://statweb.grandlyon.com/'), __PIWIK_SITEID__: 117, + __SENTRY_DSN__: JSON.stringify( + 'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6' + ), + __SAU_LINK__: JSON.stringify( + 'https://portail-citoyen-sau.guichet-recette.grandlyon.com/ecolyo/' + ), + __SAU_IDEA_DIRECT_LINK__: JSON.stringify( + 'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-une-idee/' + ), }), ], optimization: { diff --git a/app.config.environment.dev.js b/app.config.environment.dev.js index 31cbe4a8ce3c192dae0a38450fa5cfafbb4af6aa..8cb7804264915ccc335702a63d7e3a7f60c1786b 100644 --- a/app.config.environment.dev.js +++ b/app.config.environment.dev.js @@ -23,6 +23,15 @@ const stackProvidedLibsConfig = { __STACK_ASSETS__: true, __PIWIK_TRACKER_URL__: JSON.stringify('http://localhost:9800/'), __PIWIK_SITEID__: 1, + __SAU_LINK__: JSON.stringify( + 'https://portail-citoyen-sau.guichet-recette.grandlyon.com/ecolyo/' + ), + __SAU_IDEA_DIRECT_LINK__: JSON.stringify( + 'https://demarches-sau.guichet-recette.grandlyon.com/retour-ecolyo/ecolyo-une-idee/' + ), + __SENTRY_DSN__: JSON.stringify( + 'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6' + ), }), ], module: { diff --git a/app.config.environment.prod.js b/app.config.environment.prod.js index 7dc15dbcfe681d98d64c73b52327f5c51f27a5f1..6688983f2ee64a0289d0d71c5b218a6b26440948 100644 --- a/app.config.environment.prod.js +++ b/app.config.environment.prod.js @@ -19,6 +19,13 @@ module.exports = { __STACK_ASSETS__: target !== 'mobile', __PIWIK_TRACKER_URL__: JSON.stringify('https://statweb.grandlyon.com/'), __PIWIK_SITEID__: 118, + __SAU_LINK__: JSON.stringify('https://support.grandlyon.com/ecolyo/'), + __SAU_IDEA_DIRECT_LINK__: JSON.stringify( + 'https://demarches-support.grandlyon.com/retour-ecolyo/ecolyo-une-idee/' + ), + __SENTRY_DSN__: JSON.stringify( + 'https://c868f6010f3f431d95be8f70d7f37666@grandlyon.errors.cozycloud.cc/6' + ), }), ], optimization: { diff --git a/docker-compose.yml b/docker-compose.yml index 1dfd3d0fb4c4753495af545554e191970768d242..b881ad1c7cfa3e099ff859bb8077f7aa746990e5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.7' services: stack: - image: registry.forge.grandlyon.com/web-et-numerique/llle_project/cozy-stack:1.5.7 + image: registry.forge.grandlyon.com/web-et-numerique/factory/llle_project/cozy-stack:1.5.7 container_name: cozy-stack depends_on: - cozy-db diff --git a/docker/cozy-app-dev-with-app.sh b/docker/cozy-app-dev-with-app.sh index e53fc8881b7018f837bf9de7c815b75298fe17d8..c2e87befa8ac900e79952d44fe435ed494cf4dbb 100755 --- a/docker/cozy-app-dev-with-app.sh +++ b/docker/cozy-app-dev-with-app.sh @@ -211,9 +211,13 @@ do_install_app() { echo "App succesfully installed" echo "Installing konnectors" - if cozy-stack konnectors ls | grep 'enedisgrandlyon'; then - echo "Removing konnector enedisgrandlyon..." - cozy-stack konnectors uninstall --domain cozy.tools:8080 enedisgrandlyon + # if cozy-stack konnectors ls | grep 'enedisgrandlyon'; then + # echo "Removing konnector enedisgrandlyon..." + # cozy-stack konnectors uninstall --domain cozy.tools:8080 enedisgrandlyon + # fi + if cozy-stack konnectors ls | grep 'enedissgegrandlyon'; then + echo "Removing konnector enedissgegrandlyon..." + cozy-stack konnectors uninstall --domain cozy.tools:8080 enedissgegrandlyon fi if cozy-stack konnectors ls | grep 'grdfgrandlyon'; then echo "Removing konnector grdfgrandlyon..." @@ -223,9 +227,10 @@ do_install_app() { echo "Removing konnector eglgrandlyon..." cozy-stack konnectors uninstall --domain cozy.tools:8080 eglgrandlyon fi - cozy-stack konnectors install --domain cozy.tools:8080 enedisgrandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/enedis-konnector.git#build - cozy-stack konnectors install --domain cozy.tools:8080 grdfgrandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/grdf-konnector.git#build - cozy-stack konnectors install --domain cozy.tools:8080 eglgrandlyon git://forge.grandlyon.com/web-et-numerique/llle_project/egl-konnector.git#build + # cozy-stack konnectors install --domain cozy.tools:8080 enedisgrandlyon git://forge.grandlyon.com/web-et-numerique/factory/llle_project/enedis-konnector.git#build + cozy-stack konnectors install --domain cozy.tools:8080 enedissgegrandlyon git://forge.grandlyon.com/web-et-numerique/factory/llle_project/enedis-sge-konnector.git#build + cozy-stack konnectors install --domain cozy.tools:8080 grdfgrandlyon git://forge.grandlyon.com/web-et-numerique/factory/llle_project/grdf-konnector.git#build + cozy-stack konnectors install --domain cozy.tools:8080 eglgrandlyon git://forge.grandlyon.com/web-et-numerique/factory/llle_project/egl-konnector.git#build } wait_for() { diff --git a/docker/cozy.yaml b/docker/cozy.yaml index 525c2f3142f3f876108665b2286b42c04ba0a977..93fc6acde705ae6e934ecb9420b005877d9394bc 100644 --- a/docker/cozy.yaml +++ b/docker/cozy.yaml @@ -4,5 +4,8 @@ # You will ALWAYS have CSPs working on a real Cozy # so your final application must work with them on disable_csp: true +log: + # logger level (debug, info, warning, panic, fatal) - flags: --log-level + level: debug # You can find a complete example of the cozy-stack config file here: # https://github.com/cozy/cozy-stack/blob/master/cozy.example.yaml diff --git a/jest.config.js b/jest.config.js index b6a027a5b05f2f8316ff6f26570db8a860f997be..fa3e2586f69e2a0ee6608cfffed34b95f8c210f8 100644 --- a/jest.config.js +++ b/jest.config.js @@ -19,6 +19,10 @@ module.exports = { __ALLOW_HTTP__: false, __TARGET__: 'browser', __PIWIK_TRACKER_URL__: 'http://localhost:9800/', + __SAU_LINK__: + 'https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/issues', + __SAU_IDEA_DIRECT_LINK__: + 'https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/-/issues', cozy: {}, }, } diff --git a/manifest.webapp b/manifest.webapp index 71e708acefa871d382cf04a3007b88eec5ce1ef7..103480a1aa2258c0d9a8496d7b0a81cb98a33a7c 100644 --- a/manifest.webapp +++ b/manifest.webapp @@ -3,7 +3,7 @@ "slug": "ecolyo", "icon": "icon.svg", "categories": ["energy"], - "version": "1.10.2", + "version": "2.0.2", "licence": "AGPL-3.0", "editor": "Métropole de Lyon", "default_locale": "fr", @@ -13,7 +13,7 @@ "long_description": "Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer afin de vous accompagner dans la gestion quotidienne de ces consommations et ce, de façon ludique en vous lançant des défis personnalisés.", "permissions": { "ecolyo": { - "description": "Requises pour le fonctionnement des différentes parties de l’application (Analyse, liste d’écogestes personnalisée, …)." + "description": "Requises pour le fonctionnement des différentes parties de l’application (Analyse, liste d’astuces personnalisée, …)." }, "enedis": { "description": "Requises pour l’affichage et l’analyse de vos consommations électriques dans Ecolyo. Issues du connecteur Enedis." @@ -54,23 +54,29 @@ "dacc": { "description": "Requis pour envoyer des statistiques d'utilisation anonymisées." }, + "backoffice-prod": { + "description": "Requis pour la récupération des données de la newsletter." + }, "backoffice-rec": { "description": "Requis pour la récupération des données de la newsletter dans un environment de test." }, - "backoffice": { - "description": "Requis pour la récupération des données de la newsletter." + "backoffice-custom-popup": { + "description": "Requis pour la récupération des alertes personnalisées." }, - "backoffice-partners-info-rec": { - "description": "Requis pour la récupération du status des services partenaires dans un environment de test." + "backoffice-custom-popup-rec": { + "description": "Requis pour la récupération des alertes personnalisées dans un environment de test." }, "backoffice-partners-info": { "description": "Requis pour la récupération du status des services partenaires" }, - "backoffice-prices-rec": { - "description": "Requis pour la récupération du prix des fluides dans un environnement de test." + "backoffice-partners-info-rec": { + "description": "Requis pour la récupération du status des services partenaires dans un environment de test." }, "backoffice-prices": { "description": "Requis pour la récupération du prix des fluides." + }, + "backoffice-prices-rec": { + "description": "Requis pour la récupération du prix des fluides dans un environnement de test." } } }, @@ -120,23 +126,32 @@ "dacc": { "description": "Required for sending cozy anonymized stats." }, + "agent": { + "description": "Required for retrieving informations from our partners." + }, + "backoffice-prod": { + "description": "Required for retrieving newsletter informations from backoffice prod." + }, "backoffice-rec": { "description": "Required for retrieving newsletter informations from backoffice rec." }, - "backoffice": { - "description": "Required for retrieving newsletter informations from backoffice prod." + "backoffice-custom-popup": { + "description": "Required for retrieving custom alerts." }, - "backoffice-partners-info-rec": { - "description": "Required for getting the status of partners' services in test environment." + "backoffice-custom-popup-rec": { + "description": "Required for retrieving custom alerts in test environment." }, "backoffice-partners-info": { "description": "Required for getting the status of partners' services" }, - "backoffice-prices-rec": { - "description": "Required for getting fluid prices form backoffice rec." + "backoffice-partners-info-rec": { + "description": "Required for getting the status of partners' services in test environment." }, "backoffice-prices": { "description": "Required for getting fluid prices form backoffice prod" + }, + "backoffice-prices-rec": { + "description": "Required for getting fluid prices form backoffice rec." } } } @@ -193,6 +208,9 @@ "egl": { "type": "com.grandlyon.egl.*" }, + "agent": { + "type": "org.ecolyo.agent.*" + }, "konnectors": { "type": "io.cozy.konnectors" }, @@ -228,28 +246,36 @@ "type": "cc.cozycloud.dacc.dev_v2", "verbs": ["ALL"] }, + "backoffice-prod": { + "type": "org.ecolyo.agent", + "verbs": ["ALL"] + }, "backoffice-rec": { - "type": "org.ecolyo.backoffice.rec", + "type": "org.ecolyo.agent.rec", "verbs": ["ALL"] }, - "backoffice-prod": { - "type": "org.ecolyo.backoffice", + "backoffice-custom-popup": { + "type": "org.ecolyo.agent.custom.popup", "verbs": ["ALL"] }, - "backoffice-partners-info-rec": { - "type": "org.ecolyo.backoffice.partners.info.rec", + "backoffice-custom-popup-rec": { + "type": "org.ecolyo.agent.custom.popup.rec", "verbs": ["ALL"] }, "backoffice-partners-info": { - "type": "org.ecolyo.backoffice.partners.info", + "type": "org.ecolyo.agent.partners.info", "verbs": ["ALL"] }, - "backoffice-prices-rec": { - "type": "org.ecolyo.backoffice.prices.rec", + "backoffice-partners-info-rec": { + "type": "org.ecolyo.agent.partners.info.rec", "verbs": ["ALL"] }, "backoffice-prices": { - "type": "org.ecolyo.backoffice.prices", + "type": "org.ecolyo.agent.prices", + "verbs": ["ALL"] + }, + "backoffice-prices-rec": { + "type": "org.ecolyo.agent.prices.rec", "verbs": ["ALL"] } } diff --git a/package.json b/package.json index 779c5cc390fbb4b610d031a63ccc83e817eefe7b..ef91af9f545863efce386720f1bf35bb7522fc0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ecolyo", - "version": "1.10.2", + "version": "2.0.2", "scripts": { "build": "yarn run build:css && yarn run build:browser", "build:browser": "cs build --browser ", @@ -13,7 +13,7 @@ "cozyPublish": "git fetch origin ${DEPLOY_BRANCH:-build}:${DEPLOY_BRANCH:-build} && cs publish --token $REGISTRY_TOKEN --build-commit $(git rev-parse ${DEPLOY_BRANCH:-build})", "deploy": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build}", "deploy-dev": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-dev}", - "deploy-test": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-test} --repo=${DEPLOY_REPOSITORY:-https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo.git}", + "deploy-test": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-test} --repo=${DEPLOY_REPOSITORY:-https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git}", "lint": "yarn lint:js", "lint:js": "cs lint {src,test}/**/*.{js,jsx,ts,tsx} --fix", "load-data": "cd test && importData.bat", @@ -31,63 +31,66 @@ }, "repository": { "type": "git", - "url": "git+https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo.git" + "url": "git+https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git" }, "author": "", "contributors": [], "license": "AGPL-3.0", "bugs": { - "url": "https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/issues" + "url": "https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/issues" }, - "homepage": "https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo#readme", + "homepage": "https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo#readme", "dependencies": { "@babel/plugin-transform-modules-commonjs": "^7.7.5", "@babel/plugin-transform-runtime": "^7.8.3", "@cozy/minilog": "^1.0.0", "@material-ui/core": "~4.12.0", "@material-ui/styles": "^4.11.3", + "@sentry/react": "^7.21.1", + "@sentry/tracing": "^7.21.1", "@simbathesailor/use-what-changed": "^2.0.0", "axios": "^0.27.0", - "cozy-bar": "8.7.5", - "cozy-client": "32.2.1", + "cozy-bar": "8.9.2", + "cozy-client": "33.2.0", "cozy-device-helper": ">=2.1.0", "cozy-flags": ">2.8.6", - "cozy-harvest-lib": "9.18.1", + "cozy-harvest-lib": "9.26.14", "cozy-intent": ">=1.14.1", "cozy-keys-lib": ">=4.1.9", "cozy-logger": ">1.7.0", - "cozy-realtime": "4.2.1", - "cozy-scripts": "5.13.0", - "cozy-ui": "68.9.1", - "d3": "^5.15.0", + "cozy-realtime": "4.2.8", + "cozy-scripts": "6.3.10", + "cozy-ui": "75.4.1", + "d3": "^6.0.0", "detect-browser": "^5.1.1", - "eslint-config-cozy-app": "4.2.0", + "eslint-config-cozy-app": "5.1.0", + "file-saver": "^2.0.5", "global": "^4.4.0", "handlebars": "^4.7.7", "handlebars-loader": "^1.7.1", - "htmlparser2": "^8.0.1", "lodash": "^4.17.15", "mjml-browser": "^4.10.2", "null-loader": "^4.0.1", "object-hash": "^3.0.0", "react": "16.14.0", "react-dom": "16.14.0", - "react-lottie": "^1.2.3", "react-redux": "^7.2.2", "react-router-dom": "5.3.3", "react-swipeable-views": "0.14.0", - "redux-devtools-extension": "^2.13.8" + "redux-devtools-extension": "^2.13.8", + "xlsx": "^0.18.5" }, "devDependencies": { "@babel/preset-typescript": "^7.7.4", "@testing-library/react-hooks": "^8.0.0", "@types/classnames": "^2.2.10", - "@types/d3": "^5.7.2", + "@types/d3": "^6.0.0", "@types/enzyme": "^3.10.8", + "@types/file-saver": "^2.0.5", "@types/history": "^4.7.5", - "@types/jest": "^28.0.0", + "@types/jest": "^29.0.0", "@types/lodash": "^4.14.149", - "@types/luxon": "^2.0.0", + "@types/luxon": "^3.0.0", "@types/node-fetch": "^2.5.7", "@types/object-hash": "^2.0.0", "@types/react": "^16.9.15", @@ -96,12 +99,12 @@ "@types/react-redux": "^7.1.11", "@types/react-router-dom": "^5.1.3", "@types/redux-mock-store": "^1.0.2", - "@typescript-eslint/eslint-plugin": "^5.30.0", - "@typescript-eslint/parser": "^5.30.0", + "@typescript-eslint/eslint-plugin": "^5.37.0", + "@typescript-eslint/parser": "^5.37.0", "babel-polyfill": "^6.26.0", - "babel-preset-cozy-app": "2.0.2", + "babel-preset-cozy-app": "2.0.3", "copy-webpack-plugin": "6.4.1", - "cozy-app-publish": "^0.30.0", + "cozy-app-publish": "^0.31.0", "cozy-jobs-cli": "^1.13.6", "enzyme": "3.11.0", "enzyme-adapter-react-16": "1.15.6", @@ -109,7 +112,7 @@ "eslint": "^8.18.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "7.30.1", + "eslint-plugin-react": "7.31.8", "eslint-plugin-react-hooks": "^4.2.0", "git-directory-deploy": "1.5.1", "husky": "^8.0.1", @@ -117,7 +120,7 @@ "jest-junit": "^14.0.0", "lint-staged": ">=8", "loglevel": "^1.6.6", - "luxon": "^2.0.0", + "luxon": "^3.0.0", "mjml": "^4.10.2", "mjml-web": "^4.10.0", "npm-run-all": "^4.1.5", @@ -130,7 +133,7 @@ "standard-version": "^9.3.1", "typescript": "^4.0.0", "uglifyjs-webpack-plugin": "^2.2.0", - "webextension-polyfill": "^0.9.0" + "webextension-polyfill": "^0.10.0" }, "husky": { "hooks": { @@ -142,9 +145,5 @@ "eslint --fix", "git add" ] - }, - "resolutions": { - "cheerio": "1.0.0-rc.10", - "parse5-htmlparser2-tree-adapter": "^6.0.0" } } diff --git a/renovate.json b/renovate.json index 6e459e2d781bc967d75e83fbf5b8af4d8b04b4b4..b112c41fe0a6199b90b6ed222afb403f00c0964c 100644 --- a/renovate.json +++ b/renovate.json @@ -2,5 +2,6 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "local>systemes-dinformation/renovate/renovate-config" - ] + ], + "labels": ["dependencies"] } diff --git a/scripts/config.template.js b/scripts/config.template.js index bf9b3f0e829110b68cfdf9f8eed33a1c11eaa227..cabc3165ec669ac7323634e921f51a0ce79f28c9 100644 --- a/scripts/config.template.js +++ b/scripts/config.template.js @@ -6,11 +6,14 @@ const authorization = const cookie = 'cozysessid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -const startingdate = DateTime.local() - .plus({ days: -120 }) - .startOf('day') -const endingDate = DateTime.local() - .plus({ days: -1 }) - .startOf('day') +const startingdate = DateTime.local().plus({ days: -120 }).startOf('day') +const endingDate = DateTime.local().plus({ days: -1 }).startOf('day') +const halfHourStartingdate = DateTime.local().plus({ days: -15 }).startOf('day') -module.exports = { authorization, cookie, startingdate, endingDate } +module.exports = { + authorization, + cookie, + startingdate, + endingDate, + halfHourStartingdate, +} diff --git a/scripts/createConnections.js b/scripts/createConnections.js index ab05e05b460318901ea5bdfbcc80ec71749b65c3..c857d3f6fac014027eb3f1af41151dd75c7a3e41 100644 --- a/scripts/createConnections.js +++ b/scripts/createConnections.js @@ -1,5 +1,4 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -/* eslint-disable @typescript-eslint/camelcase */ +/* eslint-disable camelcase */ const axios = require('axios') const config = require('./config') @@ -11,21 +10,23 @@ const headers = { } const dataEnedisAccount = JSON.stringify({ - account_type: 'enedisgrandlyon', + account_type: 'enedissgegrandlyon', name: '', - oauth: { - access_token: '', - expires_at: '2020-10-09T08:00:00.285910671+02:00', - refresh_token: '', - token_type: 'Bearer', + auth: { + address: '6 Rue Vaillant Couturier', + city: 'Vénissieux', + firstname: 'Jane', + lastname: 'Doe', + pointId: '19170766804121', + postalCode: '69200', }, - oauth_callback_results: { - issued_at: '1592232569642', - refresh_token_issued_at: '1592232569642', - scope: - '/v4/metering_data/production_load_curve.GET /v3/customers/usage_points/addresses.GET /v4/metering_data/consumption_load_curve.GET /v3/customers/usage_points/contracts.GET /v4/metering_data/daily_production.GET /v4/metering_data/daily_consumption.GET /v4/metering_data/daily_consumption_max_power.GET /v3/customers/identity.GET', - usage_points_id: '', + data: { + consentId: 43, + expirationDate: '2023-09-26', }, + id: '70e68b8450cee09fe2f077610901094d', + identifier: 'address', + state: null, }) const dataGrdfAccount = JSON.stringify({ @@ -64,8 +65,8 @@ const dataEnedisTrigger = JSON.stringify({ debounce: '', options: null, message: { - account: '88e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + account: '70e68b8450cee09fe2f077610901094d', + konnector: 'enedissgegrandlyon', }, cozyMetadata: { doctypeVersion: '1', @@ -134,7 +135,7 @@ async function launch() { // Enedis await axios({ method: 'put', - url: 'http://cozy.tools:8080/data/io.cozy.accounts/88e68b8450cee09fe2f077610901094d', + url: 'http://cozy.tools:8080/data/io.cozy.accounts/70e68b8450cee09fe2f077610901094d', headers: headers, data: dataEnedisAccount, }) diff --git a/scripts/createDayDataFiles.js b/scripts/createDayDataFiles.js index a6130c3350a4ad73613639ba77e1b3ee886ef377..d5abc98edde52c87860876cb53a4f3298855bf3b 100644 --- a/scripts/createDayDataFiles.js +++ b/scripts/createDayDataFiles.js @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ /* * Create dummy data files for each fluid. * Hourly data is not generated @@ -229,9 +228,10 @@ if (!fs.existsSync(dir)) { const startingdate = config.startingdate const endingDate = config.endingDate +const halfHourStartingdate = config.halfHourStartingdate const Elec = generateHalfAnHourData( - startingdate, + halfHourStartingdate, endingDate.endOf('day'), 0.12, 0.36 @@ -246,7 +246,7 @@ const dumpElec = { 'com.grandlyon.enedis.year': Elec.yearlyLoad, } const dumpStringElec = JSON.stringify(dumpElec) -fs.writeFile('data/dayData-elec.json', dumpStringElec, function(err) { +fs.writeFile('data/dayData-elec.json', dumpStringElec, function (err) { if (err) console.log('error', err) }) @@ -256,7 +256,7 @@ const dumpGas = { 'com.grandlyon.grdf.year': Gaz.yearlyLoad, } const dumpStringGas = JSON.stringify(dumpGas) -fs.writeFile('data/dayData-gas.json', dumpStringGas, function(err) { +fs.writeFile('data/dayData-gas.json', dumpStringGas, function (err) { if (err) console.log('error', err) }) @@ -266,7 +266,7 @@ const dumpWater = { 'com.grandlyon.egl.year': Eau.yearlyLoad, } const dumpStringWater = JSON.stringify(dumpWater) -fs.writeFile('data/dayData-water.json', dumpStringWater, function(err) { +fs.writeFile('data/dayData-water.json', dumpStringWater, function (err) { if (err) console.log('error', err) }) @@ -287,6 +287,6 @@ const dump = { const dumpString = JSON.stringify(dump) -fs.writeFile('data/dayData.json', dumpString, function(err) { +fs.writeFile('data/dayData.json', dumpString, function (err) { if (err) console.log('error', err) }) diff --git a/scripts/importData.sh b/scripts/importData.sh new file mode 100755 index 0000000000000000000000000000000000000000..3c3f3fb341b55d4748d25e419056189d09f2bb60 --- /dev/null +++ b/scripts/importData.sh @@ -0,0 +1,4 @@ +cozyssid="" +read -p "Please provide Cozyssid (can be found after connection in browser dev tool): " cozyssid +ACH -t cozyssid -u http://cozy.tools:8080 import ./data/dayData.json +rm cozyssid \ No newline at end of file diff --git a/src/assets/anims/bounceloading.json b/src/assets/anims/bounceloading.json deleted file mode 100644 index bd3f30f70142d71bb6d4e1ba94e7565622a5ded8..0000000000000000000000000000000000000000 --- a/src/assets/anims/bounceloading.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.5.8","fr":30,"ip":0,"op":60,"w":128,"h":128,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[102.5,114,0],"ix":2},"a":{"a":0,"k":[0,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.665,"y":1},"o":{"x":0.088,"y":0},"t":0,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,-8.75],[10,45],[5,50],[-5,50],[-10,45],[-10,-8.75],[-5,-13.75],[5,-13.75]],"c":true}]},{"i":{"x":0.888,"y":0.992},"o":{"x":0.315,"y":0},"t":15,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,-29.5],[10,45],[5,50],[-5,50],[-10,45],[-10,-29.5],[-5,-34.5],[5,-34.5]],"c":true}]},{"i":{"x":0.777,"y":1},"o":{"x":0.117,"y":0.013},"t":30,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,-8.75],[10,45],[5,50],[-5,50],[-10,45],[-10,-8.75],[-5,-13.75],[5,-13.75]],"c":true}]},{"i":{"x":0.853,"y":1},"o":{"x":0.098,"y":0},"t":46,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,18.75],[10,45],[5,50],[-5,50],[-10,45],[-10,18.75],[-5,13.75],[5,13.75]],"c":true}]},{"t":60,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,-8.75],[10,45],[5,50],[-5,50],[-10,45],[-10,-8.75],[-5,-13.75],[5,-13.75]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8901960784313725,0.7215686274509804,0.16470588235294117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[62.5,114,0],"ix":2},"a":{"a":0,"k":[0,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.631,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,-33],[10,45],[5,50],[-5,50],[-10,45],[-10,-33],[-5,-38],[5,-38]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.391,"y":0},"t":13.846,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,4],[10,45],[5,50],[-5,50],[-10,45],[-10,4],[-5,-1],[5,-1]],"c":true}]},{"i":{"x":0.88,"y":1},"o":{"x":0.093,"y":0},"t":27,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,-33],[10,45],[5,50],[-5,50],[-10,45],[-10,-33],[-5,-38],[5,-38]],"c":true}]},{"i":{"x":0.873,"y":1},"o":{"x":0.165,"y":0},"t":45,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,11.875],[10,45],[5,50],[-5,50],[-10,45],[-10,11.875],[-5,6.875],[5,6.875]],"c":true}]},{"t":60,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,-33],[10,45],[5,50],[-5,50],[-10,45],[-10,-33],[-5,-38],[5,-38]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8901960784313725,0.7215686274509804,0.16470588235294117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22.5,114,0],"ix":2},"a":{"a":0,"k":[0,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.562,"y":1},"o":{"x":0.46,"y":0},"t":0,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,29.25],[10,45],[5,50],[-5,50],[-10,45],[-10,29.25],[-5,24.25],[5,24.25]],"c":true}]},{"i":{"x":0.505,"y":1},"o":{"x":0.402,"y":0},"t":15,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,13],[10,45],[5,50],[-5,50],[-10,45],[-10,13],[-5,8],[5,8]],"c":true}]},{"i":{"x":0.407,"y":1},"o":{"x":0.167,"y":0},"t":32,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,29.25],[10,45],[5,50],[-5,50],[-10,45],[-10,29.25],[-5,24.25],[5,24.25]],"c":true}]},{"i":{"x":0.599,"y":1},"o":{"x":0.526,"y":0},"t":47,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,3],[10,45],[5,50],[-5,50],[-10,45],[-10,3],[-5,-2],[5,-2]],"c":true}]},{"t":60,"s":[{"i":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],"o":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],"v":[[10,29.25],[10,45],[5,50],[-5,50],[-10,45],[-10,29.25],[-5,24.25],[5,24.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8901960784313725,0.7215686274509804,0.16470588235294117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":61,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/assets/anims/doneloading.json b/src/assets/anims/doneloading.json deleted file mode 100644 index 3d3a11d7034550944ab801e3f778c9a60726ae24..0000000000000000000000000000000000000000 --- a/src/assets/anims/doneloading.json +++ /dev/null @@ -1,2369 +0,0 @@ -{ - "v": "5.6.3", - "fr": 29.9700012207031, - "ip": 0, - "op": 47.0000019143492, - "w": 1920, - "h": 1080, - "nm": "Successful", - "ddd": 0, - "assets": [], - "fonts": { - "list": [ - { - "fName": "SFUIDisplay-Bold", - "fFamily": "SF UI Display", - "fStyle": "Bold", - "ascent": 73.828125 - } - ] - }, - "layers": [ - { - "ddd": 0, - "ind": 1, - "ty": 5, - "nm": "Payment Successful", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "t": 27, - "s": [0] - }, - { "t": 37.0000015070409, "s": [100] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [664.641, 864, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } - }, - "ao": 0, - "t": { - "d": { - "k": [ - { - "s": { - "s": 64, - "f": "SFUIDisplay-Bold", - "t": "", - "j": 0, - "tr": 0, - "lh": 76.8, - "ls": 0, - "fc": [0, 1, 0.592] - }, - "t": 0 - } - ] - }, - "p": {}, - "m": { "g": 1, "a": { "a": 0, "k": [0, 0], "ix": 2 } }, - "a": [] - }, - "ip": 0, - "op": 47.0000019143492, - "st": 0, - "bm": 0 - }, - { - "ddd": 0, - "ind": 2, - "ty": 4, - "nm": "check", - "sr": 1, - "ks": { - "o": { "a": 0, "k": 100, "ix": 11 }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [961.141, 540, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { "a": 0, "k": [376.304, 376.304, 100], "ix": 6 } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [-23, -3.5], - [-7.5, 12], - [20.5, -16] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "st", - "c": { - "a": 0, - "k": [ - 0.10588235294117647, - 0.10980392156862745, - 0.13333333333333333, - 1 - ], - "ix": 3 - }, - "o": { "a": 0, "k": 100, "ix": 4 }, - "w": { "a": 0, "k": 12, "ix": 5 }, - "lc": 2, - "lj": 1, - "ml": 4, - "bm": 0, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Shape 1", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "tm", - "s": { "a": 0, "k": 0, "ix": 1 }, - "e": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 14, - "s": [0] - }, - { "t": 27.0000010997325, "s": [100] } - ], - "ix": 2 - }, - "o": { "a": 0, "k": 0, "ix": 3 }, - "m": 1, - "ix": 2, - "nm": "Trim Paths 1", - "mn": "ADBE Vector Filter - Trim", - "hd": false - } - ], - "ip": 0, - "op": 47.0000019143492, - "st": 0, - "bm": 0 - }, - { - "ddd": 0, - "ind": 3, - "ty": 4, - "nm": "elipse bold", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 0, - "s": [0] - }, - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 14, - "s": [81] - }, - { "t": 27.0000010997325, "s": [100] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [960, 535.5, 0], "ix": 2 }, - "a": { "a": 0, "k": [-62, -4.5, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 0, - "s": [41.25, 41.25, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 14, - "s": [532.5, 532.5, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 21, - "s": [413.25, 413.25, 100] - }, - { "t": 27.0000010997325, "s": [508.75, 508.75, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [80, 80], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-62, -4.5], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 0, - "op": 47.0000019143492, - "st": 0, - "bm": 0 - }, - { - "ddd": 0, - "ind": 4, - "ty": 4, - "nm": "elipse light", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 0, - "s": [0] - }, - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 14, - "s": [80] - }, - { "t": 27.0000010997325, "s": [0] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [960, 535.5, 0], "ix": 2 }, - "a": { "a": 0, "k": [-60.75, -4.5, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 0, - "s": [100, 100, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 14, - "s": [530, 530, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 21, - "s": [431, 431, 100] - }, - { "t": 27.0000010997325, "s": [535, 535, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [122.5, 122.5], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8392156862745098, - 0.7490196078431373, - 0.4392156862745098, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-60.75, -4.25], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 0, - "op": 47.0000019143492, - "st": 0, - "bm": 0 - }, - { - "ddd": 0, - "ind": 5, - "ty": 4, - "nm": "stars", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 9, - "s": [0] - }, - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 21, - "s": [100] - }, - { "t": 33.0000013441176, "s": [0] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [960, 540, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 9, - "s": [89.979, 89.979, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 21, - "s": [440.397, 440.397, 100] - }, - { "t": 33.0000013441176, "s": [554.944, 554.944, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ty": "sr", - "sy": 1, - "d": 1, - "pt": { "a": 0, "k": 5, "ix": 3 }, - "p": { "a": 0, "k": [0, 0], "ix": 4 }, - "r": { "a": 0, "k": 0, "ix": 5 }, - "ir": { "a": 0, "k": 4.301, "ix": 6 }, - "is": { "a": 0, "k": 0, "ix": 8 }, - "or": { "a": 0, "k": 8.602, "ix": 7 }, - "os": { "a": 0, "k": 0, "ix": 9 }, - "ix": 1, - "nm": "Polystar Path 1", - "mn": "ADBE Vector Shape - Star", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [2.5, 81], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Polystar 7", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ty": "sr", - "sy": 1, - "d": 1, - "pt": { "a": 0, "k": 5, "ix": 3 }, - "p": { "a": 0, "k": [0, 0], "ix": 4 }, - "r": { "a": 0, "k": 0, "ix": 5 }, - "ir": { "a": 0, "k": 2.761, "ix": 6 }, - "is": { "a": 0, "k": 0, "ix": 8 }, - "or": { "a": 0, "k": 5.523, "ix": 7 }, - "os": { "a": 0, "k": 0, "ix": 9 }, - "ix": 1, - "nm": "Polystar Path 1", - "mn": "ADBE Vector Shape - Star", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-3.5, -91.75], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Polystar 6", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ty": "sr", - "sy": 1, - "d": 1, - "pt": { "a": 0, "k": 5, "ix": 3 }, - "p": { "a": 0, "k": [0, 0], "ix": 4 }, - "r": { "a": 0, "k": 0, "ix": 5 }, - "ir": { "a": 0, "k": 4.301, "ix": 6 }, - "is": { "a": 0, "k": 0, "ix": 8 }, - "or": { "a": 0, "k": 8.602, "ix": 7 }, - "os": { "a": 0, "k": 0, "ix": 9 }, - "ix": 1, - "nm": "Polystar Path 1", - "mn": "ADBE Vector Shape - Star", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-82, -12], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Polystar 4", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 3, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ty": "sr", - "sy": 1, - "d": 1, - "pt": { "a": 0, "k": 5, "ix": 3 }, - "p": { "a": 0, "k": [0, 0], "ix": 4 }, - "r": { "a": 0, "k": 0, "ix": 5 }, - "ir": { "a": 0, "k": 3.64, "ix": 6 }, - "is": { "a": 0, "k": 0, "ix": 8 }, - "or": { "a": 0, "k": 7.28, "ix": 7 }, - "os": { "a": 0, "k": 0, "ix": 9 }, - "ix": 1, - "nm": "Polystar Path 1", - "mn": "ADBE Vector Shape - Star", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [89.5, -14.5], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Polystar 2", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 4, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 0, - "op": 47.0000019143492, - "st": 0, - "bm": 0 - }, - { - "ddd": 0, - "ind": 6, - "ty": 4, - "nm": "circle", - "sr": 1, - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 9, - "s": [0] - }, - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "t": 21, - "s": [100] - }, - { "t": 33.0000013441176, "s": [0] } - ], - "ix": 11 - }, - "r": { "a": 0, "k": 0, "ix": 10 }, - "p": { "a": 0, "k": [960, 540, 0], "ix": 2 }, - "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 9, - "s": [139.752, 139.752, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, - "t": 21, - "s": [535.117, 535.117, 100] - }, - { "t": 33.0000013441176, "s": [785.336, 785.336, 100] } - ], - "ix": 6 - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [7.5, 7.5], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-0.25, 58.75], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 8", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [6.5, 6.5], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-4.25, -61.75], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 7", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [7, 7], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [55, -14], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 6", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 3, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [6, 6], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-56.5, 9.5], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 5", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 4, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [11.5, 11.5], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [54.25, 32.75], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 4", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 5, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [14.5, 14.5], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-50.25, 41.25], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 3", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 6, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [12.5, 12.5], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-46.75, -50.25], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 7, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [15.5, 15.5], "ix": 2 }, - "p": { "a": 0, "k": [0, 0], "ix": 3 }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse", - "hd": false - }, - { - "ty": "fl", - "c": { - "a": 0, - "k": [ - 0.8901960784313725, - 0.7215686274509804, - 0.16470588235294117, - 1 - ], - "ix": 4 - }, - "o": { "a": 0, "k": 100, "ix": 5 }, - "r": 1, - "bm": 0, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill", - "hd": false - }, - { - "ty": "tr", - "p": { "a": 0, "k": [45.25, -60.75], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 8, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 0, - "op": 47.0000019143492, - "st": 0, - "bm": 0 - } - ], - "markers": [], - "chars": [ - { - "ch": "P", - "size": 64, - "style": "Bold", - "w": 62.5, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 14.453], - [14.453, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [14.844, 0], - [0, -14.502], - [0, 0] - ], - "v": [ - [5.859, -70.459], - [5.859, 0], - [20.605, 0], - [20.605, -22.217], - [34.521, -22.217], - [59.668, -46.338], - [35.254, -70.459] - ], - "c": true - }, - "ix": 2 - }, - "nm": "P", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, -8.008], - [8.447, 0], - [0, 0] - ], - "o": [ - [0, 0], - [8.447, 0], - [0, 8.057], - [0, 0], - [0, 0] - ], - "v": [ - [20.605, -58.789], - [31.348, -58.789], - [44.678, -46.289], - [31.299, -33.74], - [20.605, -33.74] - ], - "c": true - }, - "ix": 2 - }, - "nm": "P", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "P", - "np": 5, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "a", - "size": 64, - "style": "Bold", - "w": 56.01, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [6.592, 0], - [0, 3.955], - [-5.957, 0.391], - [0, 0], - [0, 0] - ], - "o": [ - [-5.176, 0], - [0, -3.955], - [0, 0], - [0, 0], - [0, 5.859] - ], - "v": [ - [25.391, -9.766], - [16.846, -16.211], - [25.977, -22.9], - [37.256, -23.682], - [37.256, -19.727] - ], - "c": true - }, - "ix": 2 - }, - "nm": "a", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [-10.352, 0], - [-2.93, 5.615], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [13.818, 0], - [0.391, -10.254], - [0, 0], - [-5.176, 0], - [0, -5.176], - [0, 0], - [0, 0], - [0, -9.766] - ], - "o": [ - [6.885, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, -10.742], - [-13.428, 0], - [0, 0], - [0.684, -3.906], - [5.859, 0], - [0, 0], - [0, 0], - [-13.721, 0.83], - [0, 9.619] - ], - "v": [ - [20.752, 0.635], - [37.207, -8.301], - [37.5, -8.301], - [37.5, 0], - [51.27, 0], - [51.27, -36.865], - [28.418, -54.688], - [5.322, -37.354], - [18.359, -37.354], - [27.832, -43.994], - [37.256, -35.986], - [37.256, -32.422], - [23.828, -31.592], - [2.637, -15.479] - ], - "c": true - }, - "ix": 2 - }, - "nm": "a", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "a", - "np": 5, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "y", - "size": 64, - "style": "Bold", - "w": 56.2, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [-0.537, 0], - [-4.59, 13.721], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [5.322, 0], - [0.488, 0.098], - [0, 0] - ], - "o": [ - [13.428, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [-1.123, 4.297], - [-0.586, 0], - [0, 0], - [0.537, 0.098] - ], - "v": [ - [11.67, 19.629], - [36.279, 1.074], - [54.883, -53.76], - [39.844, -53.76], - [28.174, -11.572], - [27.881, -11.572], - [16.26, -53.76], - [0.635, -53.76], - [19.482, 0.342], - [18.994, 2.393], - [9.473, 8.545], - [6.25, 8.398], - [6.25, 19.434] - ], - "c": true - }, - "ix": 2 - }, - "nm": "y", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "y", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "m", - "size": 64, - "style": "Bold", - "w": 88.43, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [-5.615, 0], - [0, -5.762], - [0, 0], - [0, 0], - [0, 0], - [-5.615, 0], - [0, -6.299], - [0, 0], - [0, 0], - [0, 0], - [10.547, 0], - [2.441, -6.738], - [0, 0], - [7.715, 0], - [2.295, -6.494], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, -6.104], - [5.518, 0], - [0, 0], - [0, 0], - [0, 0], - [0, -6.104], - [5.811, 0], - [0, 0], - [0, 0], - [0, 0], - [0, -10.84], - [-7.813, 0], - [0, 0], - [-1.807, -7.031], - [-7.178, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [4.834, 0], - [19.092, 0], - [19.092, -32.324], - [28.613, -42.725], - [37.451, -33.496], - [37.451, 0], - [51.221, 0], - [51.221, -32.52], - [60.596, -42.725], - [69.58, -32.959], - [69.58, 0], - [83.838, 0], - [83.838, -36.523], - [66.211, -54.541], - [49.512, -43.555], - [49.219, -43.555], - [34.229, -54.541], - [18.896, -43.994], - [18.604, -43.994], - [18.604, -53.76], - [4.834, -53.76] - ], - "c": true - }, - "ix": 2 - }, - "nm": "m", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "m", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "e", - "size": 64, - "style": "Bold", - "w": 56.84, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [-6.494, 0], - [-0.244, -7.031], - [0, 0] - ], - "o": [ - [6.592, 0], - [0, 0], - [0.488, -6.885] - ], - "v": [ - [28.809, -44.043], - [40.234, -32.422], - [17.041, -32.422] - ], - "c": true - }, - "ix": 2 - }, - "nm": "e", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ind": 1, - "ty": "sh", - "ix": 2, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [5.371, 0], - [0, 7.764], - [0, 0], - [0, 0], - [0, 0], - [15.479, 0], - [0, -17.09], - [-16.357, 0], - [-1.563, 10.4] - ], - "o": [ - [-1.367, 4.15], - [-7.52, 0], - [0, 0], - [0, 0], - [0, 0], - [0, -16.357], - [-15.771, 0], - [0, 17.09], - [13.086, 0], - [0, 0] - ], - "v": [ - [40.43, -16.406], - [29.443, -9.717], - [16.895, -22.705], - [16.895, -23.584], - [54.004, -23.584], - [54.004, -27.979], - [28.662, -54.688], - [2.832, -26.66], - [29.199, 0.928], - [53.564, -16.406] - ], - "c": true - }, - "ix": 2 - }, - "nm": "e", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "e", - "np": 5, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "n", - "size": 64, - "style": "Bold", - "w": 58.94, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [-6.836, 0], - [0, -7.129], - [0, 0], - [0, 0], - [0, 0], - [11.914, 0], - [3.076, -6.787], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, -7.129], - [6.738, 0], - [0, 0], - [0, 0], - [0, 0], - [0, -12.549], - [-8.252, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [4.834, 0], - [19.092, 0], - [19.092, -30.664], - [30.029, -42.676], - [40.088, -31.494], - [40.088, 0], - [54.346, 0], - [54.346, -34.473], - [35.693, -54.541], - [18.896, -44.141], - [18.604, -44.141], - [18.604, -53.76], - [4.834, -53.76] - ], - "c": true - }, - "ix": 2 - }, - "nm": "n", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "n", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "t", - "size": 64, - "style": "Bold", - "w": 36.18, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [-12.451, 0], - [-1.465, 0.293], - [0, 0], - [1.27, 0], - [0, 4.15], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 10.498], - [2.881, 0], - [0, 0], - [-0.879, 0.146], - [-4.346, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [8.643, -65.723], - [8.643, -53.76], - [1.367, -53.76], - [1.367, -42.969], - [8.643, -42.969], - [8.643, -14.502], - [25.977, 0.195], - [32.861, -0.391], - [32.861, -10.938], - [29.297, -10.693], - [22.9, -16.846], - [22.9, -42.969], - [32.861, -42.969], - [32.861, -53.76], - [22.9, -53.76], - [22.9, -65.723] - ], - "c": true - }, - "ix": 2 - }, - "nm": "t", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "t", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": " ", - "size": 64, - "style": "Bold", - "w": 21.48, - "data": {}, - "fFamily": "SF UI Display" - }, - { - "ch": "S", - "size": 64, - "style": "Bold", - "w": 63.13, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [-16.943, 0], - [0, 13.672], - [14.111, 3.027], - [0, 0], - [0, 4.346], - [-7.275, 0], - [-0.488, -5.957], - [0, 0], - [16.406, 0], - [0, -12.988], - [-12.988, -2.783], - [0, 0], - [0, -4.59], - [7.861, 0], - [0.684, 5.811] - ], - "o": [ - [0.439, 13.232], - [17.48, 0], - [0, -10.742], - [0, 0], - [-8.105, -1.855], - [0, -5.225], - [7.373, 0], - [0, 0], - [-0.244, -12.744], - [-15.723, 0], - [0, 10.303], - [0, 0], - [8.496, 1.904], - [0, 5.176], - [-7.813, 0], - [0, 0] - ], - "v": [ - [3.223, -20.068], - [31.396, 1.221], - [59.961, -21.094], - [39.697, -40.918], - [31.152, -42.725], - [19.629, -51.367], - [31.787, -60.059], - [44.873, -50.488], - [58.691, -50.488], - [31.738, -71.68], - [4.785, -50.098], - [24.17, -30.42], - [33.35, -28.418], - [45.215, -19.385], - [31.982, -10.449], - [17.432, -20.068] - ], - "c": true - }, - "ix": 2 - }, - "nm": "S", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "S", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "u", - "size": 64, - "style": "Bold", - "w": 58.94, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [6.641, 0], - [0, 7.275], - [0, 0], - [0, 0], - [0, 0], - [-11.621, 0], - [-2.734, 6.738], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 7.275], - [-6.592, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 12.5], - [8.154, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [54.102, -53.76], - [39.844, -53.76], - [39.844, -23.145], - [29.053, -11.084], - [18.848, -22.266], - [18.848, -53.76], - [4.59, -53.76], - [4.59, -19.287], - [23.877, 0.781], - [40.039, -9.717], - [40.332, -9.717], - [40.332, 0], - [54.102, 0] - ], - "c": true - }, - "ix": 2 - }, - "nm": "u", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "u", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "c", - "size": 64, - "style": "Bold", - "w": 55.76, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [14.453, 0], - [0, -17.041], - [-16.064, 0], - [-0.83, 12.5], - [0, 0], - [6.006, 0], - [0, 10.498], - [-7.324, 0], - [-0.781, -5.566] - ], - "o": [ - [-0.684, -11.963], - [-15.967, 0], - [0, 17.285], - [14.111, 0], - [0, 0], - [-0.928, 5.908], - [-7.373, 0], - [0, -10.303], - [6.201, 0], - [0, 0] - ], - "v": [ - [53.418, -33.936], - [29.053, -54.688], - [2.832, -26.904], - [29.15, 0.928], - [53.467, -19.531], - [40.186, -19.531], - [29.297, -10.352], - [17.285, -26.904], - [29.248, -43.457], - [40.137, -33.936] - ], - "c": true - }, - "ix": 2 - }, - "nm": "c", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "c", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "s", - "size": 64, - "style": "Bold", - "w": 52.64, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, -10.107], - [-10.107, -2.295], - [0, 0], - [0, -2.783], - [5.664, 0], - [0.684, 4.541], - [0, 0], - [-14.16, 0], - [0, 10.449], - [10.791, 2.441], - [0, 0], - [0, 2.686], - [-5.127, 0], - [-0.293, -4.248], - [0, 0], - [13.281, 0] - ], - "o": [ - [0, 7.861], - [0, 0], - [4.883, 1.172], - [0, 3.516], - [-5.908, 0], - [0, 0], - [0.732, 10.352], - [14.063, 0], - [0, -8.008], - [0, 0], - [-4.834, -1.123], - [0, -3.467], - [5.469, 0], - [0, 0], - [-0.195, -10.254], - [-13.623, 0] - ], - "v": [ - [3.906, -37.939], - [19.238, -22.559], - [29.15, -20.313], - [35.889, -14.893], - [26.758, -9.18], - [16.504, -16.26], - [2.588, -16.26], - [26.367, 0.928], - [50.049, -16.406], - [34.961, -31.006], - [24.854, -33.203], - [17.676, -38.818], - [26.221, -44.58], - [35.547, -37.646], - [48.73, -37.646], - [26.416, -54.688] - ], - "c": true - }, - "ix": 2 - }, - "nm": "s", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "s", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "f", - "size": 64, - "style": "Bold", - "w": 35.84, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [-4.297, 0], - [-1.025, -0.195], - [0, 0], - [2.441, 0], - [0, -10.352], - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0.049, -3.76], - [1.563, 0], - [0, 0], - [-1.953, -0.293], - [-12.451, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [8.643, 0], - [22.9, 0], - [22.9, -42.969], - [32.666, -42.969], - [32.666, -53.76], - [22.607, -53.76], - [22.607, -57.715], - [28.711, -63.086], - [32.617, -62.744], - [32.617, -72.656], - [26.025, -73.145], - [8.643, -58.545], - [8.643, -53.76], - [1.367, -53.76], - [1.367, -42.969], - [8.643, -42.969] - ], - "c": true - }, - "ix": 2 - }, - "nm": "f", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "f", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - }, - { - "ch": "l", - "size": 64, - "style": "Bold", - "w": 24.66, - "data": { - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0], - [0, 0], - [0, 0] - ], - "v": [ - [5.225, 0], - [19.482, 0], - [19.482, -73.828], - [5.225, -73.828] - ], - "c": true - }, - "ix": 2 - }, - "nm": "l", - "mn": "ADBE Vector Shape - Group", - "hd": false - } - ], - "nm": "l", - "np": 3, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ] - }, - "fFamily": "SF UI Display" - } - ] -} diff --git a/src/assets/anims/errorloading.json b/src/assets/anims/errorloading.json deleted file mode 100644 index c6198158d356259d31d61d3fc7d1edfa411ec2f6..0000000000000000000000000000000000000000 --- a/src/assets/anims/errorloading.json +++ /dev/null @@ -1,2098 +0,0 @@ -{ - "v": "4.6.3", - "fr": 24, - "ip": 0, - "op": 21, - "w": 320, - "h": 320, - "nm": "checklist", - "ddd": 0, - "assets": [], - "layers": [ - { - "ddd": 0, - "ind": 2, - "ty": 4, - "nm": "Shape Layer 13", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 300 }, - "p": { "a": 0, "k": [160, 159.5, 0] }, - "a": { "a": 0, "k": [0, -34, 0] }, - "s": { "a": 0, "k": [100, 100, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667], "y": [1, 1] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p667_1_0p167_0p167", "0p667_1_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 17 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.667, "y": 1 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p667_1_0p167_0p167", - "t": 6, - "s": [-8.142, -92.147], - "e": [-7.675, -162.544], - "to": [0.07779947668314, -11.7327470779419], - "ti": [-0.07779947668314, 11.7327470779419] - }, - { "t": 17 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [83.981, 100], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p667_1_0p167_0p167"], - "t": 6, - "s": [20.367], - "e": [6.367] - }, - { "t": 17 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.833, 0.833], "y": [0.833, 0.833] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p833_0p833_0p167_0p167", "0p833_0p833_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 21 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.833, "y": 0.833 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p833_0p833_0p167_0p167", - "t": 6, - "s": [16.585, -99.759], - "e": [28.521, -187.495], - "to": [1.9892578125, -14.6227216720581], - "ti": [-1.9892578125, 14.6227216720581] - }, - { "t": 21 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [97.419, 116], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p833_0p833_0p167_0p167"], - "t": 6, - "s": [14.733], - "e": [8.733] - }, - { "t": 21 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 2, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 3, - "ty": 4, - "nm": "Shape Layer 12", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 250 }, - "p": { "a": 0, "k": [160, 159.5, 0] }, - "a": { "a": 0, "k": [0, -34, 0] }, - "s": { "a": 0, "k": [100, 100, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667], "y": [1, 1] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p667_1_0p167_0p167", "0p667_1_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 17 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.667, "y": 1 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p667_1_0p167_0p167", - "t": 6, - "s": [-8.142, -92.147], - "e": [-7.675, -162.544], - "to": [0.07779947668314, -11.7327470779419], - "ti": [-0.07779947668314, 11.7327470779419] - }, - { "t": 17 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [83.981, 100], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p667_1_0p167_0p167"], - "t": 6, - "s": [20.367], - "e": [6.367] - }, - { "t": 17 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.833, 0.833], "y": [0.833, 0.833] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p833_0p833_0p167_0p167", "0p833_0p833_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 21 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.833, "y": 0.833 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p833_0p833_0p167_0p167", - "t": 6, - "s": [16.585, -99.759], - "e": [28.521, -187.495], - "to": [1.9892578125, -14.6227216720581], - "ti": [-1.9892578125, 14.6227216720581] - }, - { "t": 21 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [97.419, 116], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p833_0p833_0p167_0p167"], - "t": 6, - "s": [14.733], - "e": [8.733] - }, - { "t": 21 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 2, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 4, - "ty": 4, - "nm": "Shape Layer 11", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 200 }, - "p": { "a": 0, "k": [160, 159.5, 0] }, - "a": { "a": 0, "k": [0, -34, 0] }, - "s": { "a": 0, "k": [100, 100, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667], "y": [1, 1] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p667_1_0p167_0p167", "0p667_1_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 17 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.667, "y": 1 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p667_1_0p167_0p167", - "t": 6, - "s": [-8.142, -92.147], - "e": [-7.675, -162.544], - "to": [0.07779947668314, -11.7327470779419], - "ti": [-0.07779947668314, 11.7327470779419] - }, - { "t": 17 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [83.981, 100], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p667_1_0p167_0p167"], - "t": 6, - "s": [20.367], - "e": [6.367] - }, - { "t": 17 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.833, 0.833], "y": [0.833, 0.833] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p833_0p833_0p167_0p167", "0p833_0p833_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 21 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.833, "y": 0.833 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p833_0p833_0p167_0p167", - "t": 6, - "s": [16.585, -99.759], - "e": [28.521, -187.495], - "to": [1.9892578125, -14.6227216720581], - "ti": [-1.9892578125, 14.6227216720581] - }, - { "t": 21 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [97.419, 116], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p833_0p833_0p167_0p167"], - "t": 6, - "s": [14.733], - "e": [8.733] - }, - { "t": 21 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 2, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 5, - "ty": 4, - "nm": "Shape Layer 10", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 150 }, - "p": { "a": 0, "k": [160, 159.5, 0] }, - "a": { "a": 0, "k": [0, -34, 0] }, - "s": { "a": 0, "k": [100, 100, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667], "y": [1, 1] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p667_1_0p167_0p167", "0p667_1_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 17 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.667, "y": 1 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p667_1_0p167_0p167", - "t": 6, - "s": [-8.142, -92.147], - "e": [-7.675, -162.544], - "to": [0.07779947668314, -11.7327470779419], - "ti": [-0.07779947668314, 11.7327470779419] - }, - { "t": 17 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [83.981, 100], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p667_1_0p167_0p167"], - "t": 6, - "s": [20.367], - "e": [6.367] - }, - { "t": 17 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.833, 0.833], "y": [0.833, 0.833] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p833_0p833_0p167_0p167", "0p833_0p833_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 21 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.833, "y": 0.833 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p833_0p833_0p167_0p167", - "t": 6, - "s": [16.585, -99.759], - "e": [28.521, -187.495], - "to": [1.9892578125, -14.6227216720581], - "ti": [-1.9892578125, 14.6227216720581] - }, - { "t": 21 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [97.419, 116], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p833_0p833_0p167_0p167"], - "t": 6, - "s": [14.733], - "e": [8.733] - }, - { "t": 21 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 2, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 6, - "ty": 4, - "nm": "Shape Layer 9", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 100 }, - "p": { "a": 0, "k": [160, 159.5, 0] }, - "a": { "a": 0, "k": [0, -34, 0] }, - "s": { "a": 0, "k": [100, 100, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667], "y": [1, 1] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p667_1_0p167_0p167", "0p667_1_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 17 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.667, "y": 1 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p667_1_0p167_0p167", - "t": 6, - "s": [-8.142, -92.147], - "e": [-7.675, -162.544], - "to": [0.07779947668314, -11.7327470779419], - "ti": [-0.07779947668314, 11.7327470779419] - }, - { "t": 17 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [83.981, 100], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p667_1_0p167_0p167"], - "t": 6, - "s": [20.367], - "e": [6.367] - }, - { "t": 17 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.833, 0.833], "y": [0.833, 0.833] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p833_0p833_0p167_0p167", "0p833_0p833_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 21 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.833, "y": 0.833 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p833_0p833_0p167_0p167", - "t": 6, - "s": [16.585, -99.759], - "e": [28.521, -187.495], - "to": [1.9892578125, -14.6227216720581], - "ti": [-1.9892578125, 14.6227216720581] - }, - { "t": 21 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [97.419, 116], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p833_0p833_0p167_0p167"], - "t": 6, - "s": [14.733], - "e": [8.733] - }, - { "t": 21 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 2, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 7, - "ty": 4, - "nm": "Shape Layer 8", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 50 }, - "p": { "a": 0, "k": [160, 159.5, 0] }, - "a": { "a": 0, "k": [0, -34, 0] }, - "s": { "a": 0, "k": [100, 100, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667], "y": [1, 1] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p667_1_0p167_0p167", "0p667_1_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 17 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.667, "y": 1 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p667_1_0p167_0p167", - "t": 6, - "s": [-8.142, -92.147], - "e": [-7.675, -162.544], - "to": [0.07779947668314, -11.7327470779419], - "ti": [-0.07779947668314, 11.7327470779419] - }, - { "t": 17 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [83.981, 100], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p667_1_0p167_0p167"], - "t": 6, - "s": [20.367], - "e": [6.367] - }, - { "t": 17 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.833, 0.833], "y": [0.833, 0.833] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p833_0p833_0p167_0p167", "0p833_0p833_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 21 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.833, "y": 0.833 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p833_0p833_0p167_0p167", - "t": 6, - "s": [16.585, -99.759], - "e": [28.521, -187.495], - "to": [1.9892578125, -14.6227216720581], - "ti": [-1.9892578125, 14.6227216720581] - }, - { "t": 21 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [97.419, 116], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p833_0p833_0p167_0p167"], - "t": 6, - "s": [14.733], - "e": [8.733] - }, - { "t": 21 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 2, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 8, - "ty": 4, - "nm": "Shape Layer 7", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 0 }, - "p": { "a": 0, "k": [160, 159.5, 0] }, - "a": { "a": 0, "k": [0, -34, 0] }, - "s": { "a": 0, "k": [100, 100, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667], "y": [1, 1] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p667_1_0p167_0p167", "0p667_1_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 17 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.667, "y": 1 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p667_1_0p167_0p167", - "t": 6, - "s": [-8.142, -92.147], - "e": [-7.675, -162.544], - "to": [0.07779947668314, -11.7327470779419], - "ti": [-0.07779947668314, 11.7327470779419] - }, - { "t": 17 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [83.981, 100], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p667_1_0p167_0p167"], - "t": 6, - "s": [20.367], - "e": [6.367] - }, - { "t": 17 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - }, - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.833, 0.833], "y": [0.833, 0.833] }, - "o": { "x": [0.167, 0.167], "y": [0.167, 0.167] }, - "n": ["0p833_0p833_0p167_0p167", "0p833_0p833_0p167_0p167"], - "t": 6, - "s": [15.021, 15.021], - "e": [0, 0] - }, - { "t": 21 } - ] - }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 17 } - ] - }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { - "a": 1, - "k": [ - { - "i": { "x": 0.833, "y": 0.833 }, - "o": { "x": 0.167, "y": 0.167 }, - "n": "0p833_0p833_0p167_0p167", - "t": 6, - "s": [16.585, -99.759], - "e": [28.521, -187.495], - "to": [1.9892578125, -14.6227216720581], - "ti": [-1.9892578125, 14.6227216720581] - }, - { "t": 21 } - ], - "ix": 2 - }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [97.419, 116], "ix": 3 }, - "r": { - "a": 1, - "k": [ - { - "i": { "x": [0.833], "y": [0.833] }, - "o": { "x": [0.167], "y": [0.167] }, - "n": ["0p833_0p833_0p167_0p167"], - "t": 6, - "s": [14.733], - "e": [8.733] - }, - { "t": 21 } - ], - "ix": 6 - }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 2, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 9, - "ty": 4, - "nm": "Shape Layer 5", - "parent": 11, - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 0 }, - "p": { "a": 0, "k": [0.8, -0.641, 0] }, - "a": { "a": 0, "k": [0, 0, 0] }, - "s": { "a": 0, "k": [7.39, 7.39, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0] - ], - "v": [ - [-6.977, 7], - [6.973, -7] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "gr", - "it": [ - { - "ind": 0, - "ty": "sh", - "ix": 1, - "ks": { - "a": 0, - "k": { - "i": [ - [0, 0], - [0, 0] - ], - "o": [ - [0, 0], - [0, 0] - ], - "v": [ - [-6.977, 7], - [6.973, -7] - ], - "c": false - }, - "ix": 2 - }, - "nm": "Path 1", - "mn": "ADBE Vector Shape - Group", - "hd": false - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [0, 0], - "ix": 2 - }, - "a": { - "a": 0, - "k": [0, 0], - "ix": 1 - }, - "s": { - "a": 0, - "k": [100, 100], - "ix": 3 - }, - "r": { - "a": 0, - "k": -90, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform" - } - ], - "nm": "Group 1", - "np": 1, - "cix": 2, - "bm": 0, - "ix": 2, - "mn": "ADBE Vector Group", - "hd": false - }, - { - "ty": "mm", - "mm": 2, - "nm": "Merge Paths 1", - "mn": "ADBE Vector Filter - Merge", - "hd": false - }, - { - "ty": "st", - "c": { - "a": 0, - "k": [1, 1, 1, 1], - "ix": 3 - }, - "o": { - "a": 0, - "k": 100, - "ix": 4 - }, - "w": { - "a": 0, - "k": 4, - "ix": 5 - }, - "lc": 2, - "lj": 2, - "bm": 0, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke", - "hd": false - }, - { - "ty": "tr", - "p": { - "a": 0, - "k": [0, 0], - "ix": 2 - }, - "a": { - "a": 0, - "k": [0, 0], - "ix": 1 - }, - "s": { - "a": 0, - "k": [200, 200], - "ix": 3 - }, - "r": { - "a": 0, - "k": 0, - "ix": 6 - }, - "o": { - "a": 0, - "k": 100, - "ix": 7 - }, - "sk": { - "a": 0, - "k": 0, - "ix": 4 - }, - "sa": { - "a": 0, - "k": 0, - "ix": 5 - }, - "nm": "Transform" - } - ], - "nm": "Combined Shape", - "np": 4, - "cix": 2, - "bm": 0, - "ix": 1, - "mn": "ADBE Vector Group", - "hd": false - } - ], - "ip": 7, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 10, - "ty": 4, - "nm": "Shape Layer 6", - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 4, - "s": [50], - "e": [0] - }, - { "t": 14 } - ] - }, - "r": { "a": 0, "k": 0 }, - "p": { "a": 0, "k": [160, 160, 0] }, - "a": { "a": 0, "k": [0, 0, 0] }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 0.667] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0.333] }, - "n": [ - "0p667_1_0p333_0", - "0p667_1_0p333_0", - "0p667_0p667_0p333_0p333" - ], - "t": 4, - "s": [100, 100, 100], - "e": [1085, 1085, 100] - }, - { "t": 14 } - ] - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [19.779, 19.779] }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { "a": 0, "k": [0.8274509, 0.1843137, 0.1843137, 1] }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-0.068, 0.036], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - } - ], - "ip": 4, - "op": 22, - "st": -23, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 11, - "ty": 4, - "nm": "Shape Layer 4", - "ks": { - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 6, - "s": [30], - "e": [100] - }, - { "t": 9 } - ] - }, - "r": { "a": 0, "k": 0 }, - "p": { "a": 0, "k": [160.312, 161.188, 0] }, - "a": { "a": 0, "k": [0.812, -0.562, 0] }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 0.667] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0.333] }, - "n": [ - "0p667_1_0p333_0", - "0p667_1_0p333_0", - "0p667_0p667_0p333_0p333" - ], - "t": 6, - "s": [100, 100, 100], - "e": [1087, 1087, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 0.667] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0.333] }, - "n": [ - "0p667_1_0p333_0", - "0p667_1_0p333_0", - "0p667_0p667_0p333_0p333" - ], - "t": 11, - "s": [1087, 1087, 100], - "e": [866, 866, 100] - }, - { - "i": { "x": [0.833, 0.833, 0.833], "y": [0.833, 0.833, 0.833] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0.333] }, - "n": [ - "0p833_0p833_0p333_0", - "0p833_0p833_0p333_0", - "0p833_0p833_0p333_0p333" - ], - "t": 13, - "s": [866, 866, 100], - "e": [878, 878, 100] - }, - { "t": 16 } - ] - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [10.068, 10.068] }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "fl", - "c": { "a": 0, "k": [0.8274509, 0.1843137, 0.1843137, 1] }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { "a": 0, "k": [0.784, -0.716], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - } - ], - "ip": 6, - "op": 22, - "st": -19, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 12, - "ty": 4, - "nm": "Shape Layer 3", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 0 }, - "p": { "a": 0, "k": [161, 160, 0] }, - "a": { "a": 0, "k": [0, 0, 0] }, - "s": { - "a": 1, - "k": [ - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 0.667] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0.333] }, - "n": [ - "0p667_1_0p333_0", - "0p667_1_0p333_0", - "0p667_0p667_0p333_0p333" - ], - "t": 3, - "s": [100, 100, 100], - "e": [224, 224, 100] - }, - { - "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 0.667] }, - "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0.333] }, - "n": [ - "0p667_1_0p333_0", - "0p667_1_0p333_0", - "0p667_0p667_0p333_0p333" - ], - "t": 4, - "s": [224, 224, 100], - "e": [476, 476, 100] - }, - { "t": 8 } - ] - } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [6.009, 6.009] }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "st", - "c": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 4, - "s": [0.8274509, 0.1843137, 0.1843137, 1], - "e": [0.8274509, 0.1843137, 0.1843137, 1] - }, - { "t": 8 } - ] - }, - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 4, - "s": [0], - "e": [100] - }, - { "t": 5 } - ] - }, - "w": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 4, - "s": [3], - "e": [0] - }, - { "t": 8 } - ] - }, - "lc": 1, - "lj": 1, - "ml": 4, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke" - }, - { - "ty": "fl", - "c": { "a": 0, "k": [0.8274509, 0.1843137, 0.1843137, 1] }, - "o": { - "a": 1, - "k": [ - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 3, - "s": [100], - "e": [99] - }, - { - "i": { "x": [0.667], "y": [1] }, - "o": { "x": [0.333], "y": [0] }, - "n": ["0p667_1_0p333_0"], - "t": 4, - "s": [99], - "e": [0] - }, - { "t": 5 } - ] - }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-0.338, 0.065], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [649.112, 649.112], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 2", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - } - ], - "ip": 3, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - }, - { - "ddd": 0, - "ind": 13, - "ty": 4, - "nm": "Shape Layer 2", - "ks": { - "o": { "a": 0, "k": 100 }, - "r": { "a": 0, "k": 0 }, - "p": { "a": 0, "k": [160.142, 159.987, 0] }, - "a": { "a": 0, "k": [0, 0, 0] }, - "s": { "a": 0, "k": [377.603, 377.603, 100] } - }, - "ao": 0, - "shapes": [ - { - "ty": "gr", - "it": [ - { - "d": 1, - "ty": "el", - "s": { "a": 0, "k": [22.315, 22.315] }, - "p": { "a": 0, "k": [0, 0] }, - "nm": "Ellipse Path 1", - "mn": "ADBE Vector Shape - Ellipse" - }, - { - "ty": "st", - "c": { "a": 0, "k": [0.8352941, 0.8352941, 0.8352941, 1] }, - "o": { "a": 0, "k": 100 }, - "w": { "a": 0, "k": 1 }, - "lc": 1, - "lj": 1, - "ml": 4, - "nm": "Stroke 1", - "mn": "ADBE Vector Graphic - Stroke" - }, - { - "ty": "fl", - "c": { "a": 0, "k": [1, 1, 1, 1] }, - "o": { "a": 0, "k": 100 }, - "r": 1, - "nm": "Fill 1", - "mn": "ADBE Vector Graphic - Fill" - }, - { - "ty": "tr", - "p": { "a": 0, "k": [-0.038, 0.003], "ix": 2 }, - "a": { "a": 0, "k": [0, 0], "ix": 1 }, - "s": { "a": 0, "k": [100, 100], "ix": 3 }, - "r": { "a": 0, "k": 0, "ix": 6 }, - "o": { "a": 0, "k": 100, "ix": 7 }, - "sk": { "a": 0, "k": 0, "ix": 4 }, - "sa": { "a": 0, "k": 0, "ix": 5 }, - "nm": "Transform" - } - ], - "nm": "Ellipse 1", - "np": 3, - "cix": 2, - "ix": 1, - "mn": "ADBE Vector Group" - } - ], - "ip": -21, - "op": 22, - "st": -21, - "bm": 0, - "sr": 1 - } - ] -} diff --git a/src/assets/anims/logoLoading.gif b/src/assets/anims/logoLoading.gif new file mode 100644 index 0000000000000000000000000000000000000000..eef674b27f93f8bec7064318e5c03a016574c611 Binary files /dev/null and b/src/assets/anims/logoLoading.gif differ diff --git a/src/assets/anims/splash.json b/src/assets/anims/splash.json deleted file mode 100644 index 11b681c085fc2a43d17a66e323fcfbe865009f24..0000000000000000000000000000000000000000 --- a/src/assets/anims/splash.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":25,"ip":0,"op":13,"w":500,"h":500,"nm":"splash illu","ddd":0,"assets":[{"id":"image_0","w":250,"h":250,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAIaElEQVR4Xu3VsZEdVRRF0fdJgBBQGkgGEAGEoBAgA8hAIUAEEIKskUsIkIEw5ehTJQuLUZWezpnXd8me+qd73d5wW/4RIHB5gdvl39ALEiCwhO4jIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ848ud6xfub9e2H336/3t5erD8/147f/XQBoX+64ahfuL9Zz9Z9/bjWernW+vI/L//3WuvVerd+vX233o5COeBlhX7AkZ7SI94f1l9rra/+55l+uz3/8B8B/56QgNCf0DGe+qPcH9YPa63fH3nOf9a79cz/1Z/WNYX+tO7xpJ/m/rD+WGt9/xEP+dPt+Xr1EX/nT0ICQg9BX2Hm/rBer7W+efRd7uuX24v186N/5w9iAkKPUZ8/JPRzbyj0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JPf36yX6/169ujwF+v17ev1+tG/8wcxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGewL9Mt+j7O/D7zgAAAABJRU5ErkJggg==","e":1},{"id":"image_1","w":250,"h":250,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAWBUlEQVR4Xu2dDXBcxX3A/3f6tCR/q/gLYzlYNoYABkKoxyZ20jIkMAEnBZpCiuWQkJkydTRJmCFDZOQWpqnbtG4yaRnCxIY0CaTtYDeljUsZ2xNsTSBQuxmSgmss2RhbkWzpsCXbsu5eZ59ORBb33r3dW51W9343w0wb7f7f7u+/P+++fV8J4QcBCJQ8gUTJ95AOQgACgugMAgjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIHrMxcOKH8vmZd8uTMet27LuL6DEZAt4eWSYJ2dx9QBp6D/udbmpskV0x6X7su4noJT4EvJ0yTSqlWRLyiOpq9wHp6D0sC/xue7K9PCNNC1ult8QxxL57iF7CQ8Brk9XiyVaRrNijRR/qe0oS0tr4ddlcwihi3zVEL8Eh4LVJg3i+uLeP7t4FM/qFf9wvIs0s50twQIgIopdQXkcv03N1LUT0oeKebB/MSPPSVmkvITSx7wqil8gQ8PZIqySkWUSmhnUpr+jZyp7IU+m0tCJ8aQwQRJ/gefTapEk8aR15Hm5D9OEYCD/BB0i2+Yg+AfPoL9GrpEmdU0cVfLibb+1PpjLdmdBZPxcShJ+AA2VEkxF9AuXP32TLSFOUJXqubu3eV9P/Z1tn1NzUcEruuDJl1nNPtqvr8WzameEbr1qIPl7kNY6bvUymZvC1GtXeK9qdKut/6In6mp++Uvve/7Zo5oD86YpuuXrOWZOQqk6HEr58ULZyHd4UYfHqIXrxWGsdKXuJbI3J8nz4QOfOJ859Z9u0qr/5p+mBx/74klOy7roemTV5UKt9IwurZX1SZNuiFtlmHISKY0oA0ccUr17w9+RO+BtsV+vVvrD01h1Tzm16ZkbVu33JSGHUUn7dh3q82spMIWMi5YlsQ/pIyItaqJCkFrWhpXow/x50kTWSlDWFyq0YPfezuoFNz8yoPNJVro2srjIjd1yVkjuvTBUqvDp2SjzZpcRPZ2QXl+m002G1AqJbxZk/WPZ8W8m9Ovuf9g54rqMUIvjoeJaFHw6/3xPZp+RH/PzjxHYJRLdNNBvPX4aLfyuqklr9p/7/VTYPd3YgMfCD/5pS+eTzU8VkBo/SFhvn8AHHUdv++0Rkl+dJeyIh7eVp2cfGXpSs6JdB9IjM/CV2UqaNKq4udymB1c3EQ2InZJqNJXhYs7p6y85+Z/u06h/vmixRz8EjdjOw2MqGPvnEktOyoqGv0FBR6u8eQir7PBl6sm7k/z0cwEtK7+KH/X8s+OUhgOghgLLL7J2ujKIXX6s5/6MXJ1eMvExW7LbNnjwoapa/ZcmpzEV1g9F2+orTyI9ybT8YNKKHiT50/7j/HPd4/d58u3Lghy9Orizm7B21r2qWX7mwXz6ysC9TU5EZV+k9T9Yt3uA/kssvBwFEd1D0Ybl3vFw7Zufetm1wQPqNjS3+Pf/8EF1vDGSfCBvzGb3/XGLwZ/9TU77jlRppe33ShJE7iOayuWdk2dyzcmNDn1w6c0APunlpRA9hx4w+DjO62kx77UB1dduvqn2xX2+vNB/ejtdUl+qU+IvqB+SauWcKueU2X08RHdHzjZHcf/f2+i9PLOiS2MF3Ks7839HKSUpmJfbbv6mY8DO2Gc3f1lL32S+qPydqY0/JP2/K+YH62nRh/9p5sr1xg6hbhvmxdNcbA2GiHzpWcborVVadyUh5qq/svVn5V+2VkupPIrQear+0+gegrirt/wOg/lO/xuz/lkzI4Lwp5wdn1KSrA0Lvbmzxb0Lih+h6YyBM9Ds3zvGX3fyKR6DpQz3SdF1P0AERnaW72WBEdDNuY1VLXb9/aHUXohsAZjMuBJq3V7ygPzOjG4y2AquoTb3NnzwWFCXV2PK+OxcLPGLpVEd0Q9GXP3BJ7DfViq1BHtGlsYW3GgflBNENRb/4rg8Ue5zH/niIbj4EED2AXfYFjIE7P4huPuhMa6qd+GfuHvpwXK4fM3owWUQPEn3oc0aBD7QguqmuhdXb9cW3wgLwYEsAHUQ3ED3Vl0xdsa7BygsjChv28auN6GY5R3QD0duPV3SsXD9/6Iuk/IpKANHNcCN6kOh7/dspn8v1Z0Q3G2w2av3zZzs662vTswJisXRn6a43zMKeXEN0PZY2S//gM0c65k09H7Sa4sEWRNcbbmGi73iltvO+v5oVNKvoHYjSWgSe+IOjvYvrz41+pddwDERHdK3xJGGib/mPqR0tW2Zyjq6H1EppRDfDyDl60Dl6yGukEN1ssNmo9djNnZ0rGvqCVlPM6MzoesMs7IEWRNdjabP0+hUnOj79wVTQaoon2BBdb7iFif7o92eeffwnU4Oei9Y7EKW1CNx3/clzf3xtb1VAJURHdK3xJDyiqserWKV5Jt2MNOfoQefoIa+R4hFVs8Fmoxaim1FE9CDR2/zvhOX8oimimw02G7XyPMHG0p2lu94w46UTeryKVZpHVc1IM6MHL915u4zZmBrTWohuhhfRDUS/fF1D0T5uaJbW0q2F6Ga5RXQD0XkW3Wyw2aiF6GYUER3RzUbOONVCdDPwiI7oZiNnnGrxOikz8IiO6GYjZxxrhb18gvfG5U4MoiP6OCprdmhE1+eG6IiuP2rGuQai6ycA0XMw89qkQTw5FISTXXf9gWazRpjo5WmZvrBVem0erxRiITqiT7hxHCb6YFoWLm2V9gnXqTFuMKKzdB/jIWY/PEt3faaIjuj6o2acayC6fgIQHdH1R80410B0/QQgOqLrj5pxrFFXmZF/Wxd8Cs519NzJQXREH0dt9Q/NLbD6zFQNREd0s5EzTrUQ3Qw8ohuIvvyBS+RIV7kZcWoVRADRzfAhuoHovErKbLDZqIXoZhQRPVj0XSKyKtefEd1ssNmo9fElp+Sh1V1BoXhnXAAZRDcQ/TN/PqfvpV9OqrUxcImhR4D3uuvxGi6N6Aai86UWs8FmoxZfajGjiOjBom8WkS/l+jOimw02G7U2f/JY97K5Z+oDYvHtNZbuesMs7Guqba/X/PrOjbOX6kWktA0CT//h4aOXTBuch+h6NJnRg2b0NmkST7bk+nP78YqOlevn89lkvbFmpfRPmtpTk6syU3MF8zxZt3iDbLVyoBILgujBoq8WT3bm+vNgOtHf8EcLa0psLEyI7oTd5y4iH21sEXW1hN8oAogeLDovn3BMl0UzB+TJO94ObBXPogcnDNFDBjOfZXLL9JUNffLozZ2BjeKBFkQ3GrFeyIcWW75Xf2TLT6fMNwpMJSMCf7L8ROddV6VmBVTmZpkQqszo4TP6NhG5PVeRf/957a/v/+Ysdt6NlDWrtOXOI50LZ5zPKbon8tTiFmkyi1z6tRA9TPQ90ioJeSRXkSNdZQeXP7Dg0tIfIu708IXPHzpbUeZVB7SIa+jM6GaD1WuTwJ13FZG3wZpxNamV7wst7LiHU2VGD5vRd8o0qZKeoCLc826irFmdWy87debBVV2TgmqzEYfoZiMrWytsQ+77L0x542vfrV9S0AGoHInAX9xy/Mjy+f1Bm5/7G1tkWaRAMS3EjJ4n8d5e/06rtbmKnTxVduSq+xaw814EeV74wqEzFUkv54yeEPm7RS3SXIRmTNhDIHp+0deIyHNBxS5f1yDv9iUn7ACYCA3P97KJhMinFrWIukLCL4AAoucTPc95OtfTx96tB1d1dd962amgJ9aE8/P8OUD0/Iwk7Dydy2wRABZY5Pl17T21lZnpOcN4sr1xg6hVF78QAogeYXh4e/3zv78NKsrLIiNANCyS77ZXnliLBhbRI3DK93VVdt8jQDQs8q3b3jl+1Zyzs4Oq8/XUaGARPRqn0OX72YFE56LPLgy6BzviESg2mkDem2RYtkceNIgeEZUX8iIKFYJNuYggNYrleYhFfX2E3faIPBE9IihvaPddffQr59tNuKYeEWTEYuoba8+t7Qi8di4iHY0t0hAxXOyLIbrGEAi7eUaFueexOZ27909iCa/BNKjo/TecTN29rDfnP6rZOjzEosEZ0TVg5duUS/Un269oamCW0WCaq6iazbet7egvT3qBr+tiE04PMqLr8RJvr38HVs5n1FWojU/NfOO7z0/l/ndNriOLP3ZzZ+eKhr7AlRHPnuvDRXRNZvkeXU1n5PSV9zXUcVusJths8XzvhVPFeDecPltE12emZvXA77KpcP/5as2+z/3lbJ6mMmD743sOd19UNxh4uyuzuQFUvo9uBi3fuTobc2ZcI2zApcrT0rCwVXrNjhDfWszohrnPtwM/cD5xbNn9C+awhI8GOMqSXW2BNLZIa7SIlBpJANENx0O+6+oq7P6D1a/c+rW51xseIjbV1C77s/ccDn5wZYgE180LGBGIXgC8fA+7qNCP/ePM//6Hf516TQGHKfmq+e5nzwLgKywFjARELwCeqppvY06Vuf3heW++eqBqcYGHKsnq+W5zVZ3mDTKFpx7RC2SY3ZjbF3RrrAqf8eTUrQ/NS/zyUFVdgYcrqer5XviY7ez+8rSsZgOusNQjemH8/NreXv/FB4Gvm1Jl+gYSb374iwtmp/qSUywccsKHWPWBvv6NN3Xm/VCll5RrFj8s6h9SfgUQQPQC4I2smm8XHtl/S2tx/bnTj3/6qCQTErrC4aUSlgYn19HtgfRn9pBvtQ0fKe4ze2TJ+cSS1cHJjG4RZ5RLbnGe2dU5+Vc+0pXON5OrK5O8p93iwGRGtwvTn9X3yDJJ+LfIhj1i6Z+z3/XI3Mn7D1bNsd8K9yLedvmpE1++sWtmhJax+RYBkm4RZnRdYhHK53vwZTiE58m7a74+73ipX3rL97rmEUi5xTXC+DIpgugm1CLUyffqqZEh/vrZ6Xs2/8v0FRHCTqgi6o63TbccO3L5rHNRvmaT8pKymh32sUkxoo8NVz+qjuy/eKP6hTUtcz+cb8k/hs21Glptum2+7di5mopMlOU6klul//5giD7GgHVkV+ftn/jqxem3jlcsHeNmjWn4e6/teedz1/fMjXiQ/V5SmpjJI9IyLIbohuB0qkXdoPNXAZ68++1t036+6UczbtI5hgtl1VL97z/19tFLpg3Oi9geNt4igiq0GKIXSjBifR3ZVcjOnrI9v/fl+Zf09iWjnN9GbMXYFfvYpae7Hv5YV01Z0quNdBRPtpdnpIlbWyPRKrgQoheMMHoA/zp7tewST66OUmsizO7qIwubbnlHZxbnIZUoybdcBtEtA80XLntTzeagb67nqn+6v+zVe78xS17+3+rr8sUv5t/XrzjRseaK1MwIN8AMNyvledK8eIP/zXl+RSSA6EWEPfJQUZ5lH900tTPf9I3Zl433cl4t07+6qjsZcUd9uBtsuo3TWFOHRfRxhJ89b1evj14QtRlqOf/Mzrq2Bx+/6HeLfSnu2nln+r5yY3f3vKnnI7dX9Uu90LEiLc2cj0fNsv1yiG6fqVbE7FJevQftSzoVM54ceeL5Ka89+nT96rEWXl0Tf+T3f3NCV3ARSSVEmha1+O/C5zeOBBB9HOGPWsqrZ9rVubvWbDmWwivB1684efCDs89E2jy8ACW76o6MrKFmILpD6TCd3VUXbApvukTPouxIiDQzizs0sBDdrWQMt8Z/KEbN7hEvw43shRJ+20t1r274Xv11upt26gmzu5ed7J09OX2pIZmN5WnZzLm4Ib0xrMaMPoZwCw2d3ZlX5++hj7wGHCf1izeqX37w8d+ZcuBoxQ1BbVF3s911dergHVempmnuoo8MuXswLU1LW/3PSvNzkACiO5iUC87dh77Lrr1ZNzJGz+myXd98drq3dceUa4f/0VDn31+44WTn9RefMZ291SH2i0hzY4v//D0/hwkgusPJuUD4NmkQzxd+rWmT1bJ+z56qN2tSg4unVqcLubW2w/OklRtfTDNR/HqIXnzmBR0x+3ppdWfZKpNA3Qeko/ew3s7+iOMguAl0B+ogugNJMGlC9i02TbozvKHoCG6SJIfqILpDyTBpSnaGj7yk1xR9d0JkM5fKTDLjVh1Edysfxq3xhc9IkySkOWyXPoro6pbVhMhWNtmM0+FcRUR3LiWFNSj7KOya7Mbd++6yCxE9pa7dD6ZlK5fJCsuBi7UR3cWsWGpTrvP4HKLv9jzZyg66JeiOhkF0RxNjs1nZW2vVxl1z9wGR3sN+9K3M3jYpux0L0d3Oj/XWnXxaVs64V16yHpiAThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQL/Dwaci1WTPknFAAAAAElFTkSuQmCC","e":1},{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":2,"nm":"barre finale.ai","cl":"ai","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-5,130,0],"to":[0,-5.167,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[-5,99,0],"to":[0,0,0],"ti":[0,-5.167,0]},{"t":24,"s":[-5,130,0]}],"ix":2},"a":{"a":0,"k":[125,125,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"ip":0,"op":24,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"barre finale.ai","cl":"ai","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[25,111.918,0],"to":[0,-2.153,0],"ti":[0,-3.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[25,99,0],"to":[0,3.151,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[25,130,0],"to":[0,0,0],"ti":[0,7.793,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[25,114.5,0],"to":[0,-6.763,0],"ti":[0,1.911,0]},{"t":30,"s":[40.75,99,0]}],"ix":2},"a":{"a":0,"k":[125,125,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"ip":0,"op":24,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"barre finale.ai","cl":"ai","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[55,99,0],"to":[0,5.167,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[55,130,0],"to":[0,0,0],"ti":[0,5.167,0]},{"t":24,"s":[55,99,0]}],"ix":2},"a":{"a":0,"k":[125,125,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"ip":0,"op":24,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"Lato-Regular","fFamily":"Lato","fStyle":"Regular","ascent":73.699951171875}]},"layers":[{"ddd":0,"ind":1,"ty":5,"nm":"Ecolyo","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[254,417.75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[501,112.5],"ps":[-255.5,-56.25],"s":77,"f":"Lato-Regular","t":"Ecolyo","j":2,"tr":0,"lh":92.4,"ls":0,"fc":[0.922,0.922,0.922]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":13,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"compo barre","refId":"comp_0","sr":0.55,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,224.5,0],"ix":2},"a":{"a":0,"k":[60,70,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[139.039,-41],[-18,-41],[-18,85.184],[139.039,85.184]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Masque 1"}],"w":120,"h":140,"ip":0,"op":13.2,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"bouclier","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[125,125,0],"ix":1},"s":{"a":0,"k":[150,150,100],"ix":6}},"ao":0,"ip":0,"op":13,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"E","size":77,"style":"Regular","w":58.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.7,-71.65],[8.7,0],[52.85,0],[52.85,-7.9],[18.45,-7.9],[18.45,-32.35],[46.3,-32.35],[46.3,-39.95],[18.45,-39.95],[18.45,-63.75],[52.85,-63.75],[52.85,-71.65]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"E","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"c","size":77,"style":"Regular","w":46.7,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.733,1.15],[3.533,0],[2.966,-1.3],[2.016,-2.316],[1.05,-3.2],[0,-3.766],[-1.15,-3.233],[-2,-2.216],[-2.717,-1.166],[-3.167,0],[-3.3,1.25],[-2.2,2.7],[0,0],[0.766,0],[0.6,-0.516],[0.933,-0.633],[1.4,-0.516],[2.166,0],[1.816,0.85],[1.266,1.617],[0.7,2.384],[0,3.067],[-0.65,2.367],[-1.284,1.667],[-1.9,0.884],[-2.467,0],[-1.284,-0.416],[-0.9,-0.5],[-0.584,-0.416],[-0.5,0],[-0.267,0.2],[-0.267,0.367]],"o":[[-2.1,-2.1],[-2.734,-1.15],[-3.834,0],[-2.967,1.3],[-2.017,2.317],[-1.05,3.2],[0,4.134],[1.15,3.234],[2,2.217],[2.716,1.166],[3.666,0],[3.3,-1.25],[0,0],[-0.367,-0.566],[-0.6,0],[-0.6,0.517],[-0.934,0.634],[-1.4,0.517],[-2.267,0],[-1.817,-0.85],[-1.267,-1.616],[-0.7,-2.383],[0,-2.933],[0.65,-2.366],[1.283,-1.666],[1.9,-0.883],[1.866,0],[1.283,0.417],[0.9,0.5],[0.583,0.417],[0.5,0],[0.266,-0.2],[0,0]],"v":[[44.2,-44.85],[36.95,-49.725],[27.55,-51.45],[17.35,-49.5],[9.875,-44.075],[5.275,-35.8],[3.7,-25.35],[5.425,-14.3],[10.15,-6.125],[17.225,-1.05],[26.05,0.7],[36.5,-1.175],[44.75,-7.1],[42.25,-10.35],[40.55,-11.2],[38.75,-10.425],[36.45,-8.7],[32.95,-6.975],[27.6,-6.2],[21.475,-7.475],[16.85,-11.175],[13.9,-17.175],[12.85,-25.35],[13.825,-33.3],[16.725,-39.35],[21.5,-43.175],[28.05,-44.5],[32.775,-43.875],[36.05,-42.5],[38.275,-41.125],[39.9,-40.5],[41.05,-40.8],[41.85,-41.65]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"o","size":77,"style":"Regular","w":55.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.983,-1.233],[2.1,-2.266],[1.133,-3.216],[0,-3.966],[-1.134,-3.2],[-2.1,-2.266],[-2.984,-1.216],[-3.7,0],[-2.984,1.216],[-2.084,2.267],[-1.117,3.2],[0,4],[1.116,3.217],[2.083,2.267],[2.983,1.234],[3.7,0]],"o":[[-2.984,1.234],[-2.1,2.267],[-1.134,3.217],[0,4],[1.133,3.2],[2.1,2.267],[2.983,1.216],[3.7,0],[2.983,-1.216],[2.083,-2.266],[1.116,-3.2],[0,-3.966],[-1.117,-3.216],[-2.084,-2.266],[-2.984,-1.233],[-3.7,0]],"v":[[17.775,-49.6],[10.15,-44.35],[5.3,-36.125],[3.6,-25.35],[5.3,-14.55],[10.15,-6.35],[17.775,-1.125],[27.8,0.7],[37.825,-1.125],[45.425,-6.35],[50.225,-14.55],[51.9,-25.35],[50.225,-36.125],[45.425,-44.35],[37.825,-49.6],[27.8,-51.45]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.866,0.867],[1.25,1.617],[0.616,2.367],[0,3],[-0.617,2.384],[-1.25,1.634],[-1.867,0.867],[-2.534,0],[-2.467,-3.366],[0,-6.033],[2.466,-3.35],[5,0]],"o":[[-1.867,-0.866],[-1.25,-1.616],[-0.617,-2.366],[0,-3],[0.616,-2.383],[1.25,-1.633],[1.866,-0.866],[5,0],[2.466,3.367],[0,6],[-2.467,3.35],[-2.534,0]],"v":[[21.2,-7.55],[16.525,-11.275],[13.725,-17.25],[12.8,-25.3],[13.725,-33.375],[16.525,-39.4],[21.2,-43.15],[27.8,-44.45],[39,-39.4],[42.7,-25.3],[39,-11.275],[27.8,-6.25]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"l","size":77,"style":"Regular","w":25.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.3,-73.65],[8.3,0],[17.2,0],[17.2,-73.65]],"c":true},"ix":2},"nm":"l","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"l","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"y","size":77,"style":"Regular","w":51.2,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.483,-0.35],[0.2,-0.533],[0,0],[0.233,-0.733],[0.233,-0.766],[0.216,0.734],[0.3,0.734],[0,0],[0.433,0.384],[0.766,0],[0,0],[0,0],[0,0],[0,0],[-0.45,0.4],[-0.3,0.666]],"o":[[0,0],[-0.567,0],[-0.484,0.35],[0,0],[-0.3,0.767],[-0.234,0.734],[-0.167,-0.766],[-0.217,-0.733],[0,0],[-0.2,-0.466],[-0.434,-0.383],[0,0],[0,0],[0,0],[0,0],[0.933,0],[0.45,-0.4],[0,0]],"v":[[50.4,-50.65],[43.3,-50.65],[41.725,-50.125],[40.7,-48.8],[27.55,-16.95],[26.75,-14.7],[26.05,-12.45],[25.475,-14.7],[24.7,-16.9],[11.15,-48.8],[10.2,-50.075],[8.4,-50.65],[0.7,-50.65],[21.6,-2.95],[12.35,17.15],[18.95,17.15],[21.025,16.55],[22.15,14.95]],"c":true},"ix":2},"nm":"y","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"y","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"}]} \ No newline at end of file diff --git a/src/assets/icons/email/ecolyo-icon.png b/src/assets/icons/email/ecolyo-icon.png index 4fb77f93d5cb171a9870955cc4144809d08d8948..3bea8b789e55546af7891a99764dd79fa2c8cf95 100644 Binary files a/src/assets/icons/email/ecolyo-icon.png and b/src/assets/icons/email/ecolyo-icon.png differ diff --git a/src/assets/icons/email/ecolyoPhone.svg b/src/assets/icons/email/ecolyoPhone.svg index ee686cba55e118dba2b59278c42df2905e86d290..c3b711a79077326256adeda1468ca3f49ecceb9e 100644 --- a/src/assets/icons/email/ecolyoPhone.svg +++ b/src/assets/icons/email/ecolyoPhone.svg @@ -1,8 +1,29 @@ <svg width="92" height="53" viewBox="0 0 92 53" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M16.7369 44.2337C33.063 37.6318 31.7942 28.246 30.9483 14.2469C25.7036 14.0082 21.051 12.3379 16.7369 9.55396C12.4227 12.3379 7.77017 14.0082 2.5255 14.2469C1.67958 28.246 0.410707 37.6318 16.7369 44.2337Z" fill="#1B1C22"/> -<path d="M16.7369 7L15.6309 7.71373C11.5862 10.3238 7.27889 11.8606 2.43376 12.081L0.55506 12.1665L0.437561 14.111C0.402669 14.6884 0.366401 15.2629 0.330341 15.8341C-0.0576808 21.9803 -0.421614 27.745 1.21133 32.7126C3.09394 38.4397 7.46133 42.8092 15.9763 46.2524L16.7369 46.56V44.2333C1.05085 37.8902 1.60717 28.9773 2.42518 15.8719C2.45856 15.3371 2.49238 14.7953 2.52554 14.2464C7.77022 14.0078 12.4228 12.3375 16.7369 9.55353V7Z" fill="#FFC600"/> -<path d="M16.737 7L17.843 7.71373C21.8877 10.3238 26.195 11.8606 31.0401 12.081L32.9188 12.1665L33.0363 14.111C33.0712 14.6884 33.1075 15.2629 33.1435 15.8341C33.5316 21.9803 33.8955 27.745 32.2625 32.7126C30.3799 38.4397 26.0125 42.8092 17.4976 46.2524L16.737 46.56V44.2333C32.423 37.8902 31.8667 28.9773 31.0487 15.8719C31.0153 15.3371 30.9815 14.7953 30.9483 14.2464C25.7037 14.0078 21.0511 12.3375 16.737 9.55353V7Z" fill="#DB8300"/> -<path d="M11.5779 20.6339H12.3201C12.6165 20.6339 12.9008 20.7545 13.1104 20.9691C13.32 21.1837 13.4377 21.4748 13.4377 21.7784V33.396H10.4603V21.7784C10.4603 21.4748 10.578 21.1837 10.7876 20.9691C10.9972 20.7545 11.2815 20.6339 11.5779 20.6339ZM16.7347 26.2909H17.4769C17.7733 26.2909 18.0576 26.4115 18.2672 26.6261C18.4768 26.8408 18.5945 27.1319 18.5945 27.4354V33.396H15.6171V27.4354C15.6171 27.1319 15.7348 26.8408 15.9444 26.6261C16.154 26.4115 16.4383 26.2909 16.7347 26.2909ZM22.1989 24.1026H22.9411C23.2375 24.1026 23.5218 24.2232 23.7314 24.4378C23.941 24.6525 24.0587 24.9435 24.0587 25.2471V33.396H21.0813V25.2471C21.0813 24.9435 21.199 24.6525 21.4086 24.4378C21.6182 24.2232 21.9025 24.1026 22.1989 24.1026Z" fill="#FFC600"/> +<path d="M23.2028 46.8446C23.7055 47.0518 24.294 47.0518 24.7967 46.8446C45.4833 38.317 44.6423 26.3723 43.5325 8.88859C43.4611 7.76437 42.5698 6.87892 41.4694 6.7743C35.5462 6.21116 30.1765 4.30662 25.1521 1.31745C24.4406 0.894182 23.5589 0.894182 22.8474 1.31745C17.823 4.30662 12.4533 6.21116 6.53014 6.7743C5.42969 6.87892 4.53842 7.76437 4.46706 8.88859C3.35724 26.3723 2.5162 38.317 23.2028 46.8446Z" fill="url(#paint0_radial_857_46679)"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M41.9349 8.85059C42.5223 17.9516 42.9002 24.8217 40.8054 30.5523C38.8095 36.0126 34.3644 40.8436 24 45.0793C13.6355 40.8436 9.19041 36.0126 7.1945 30.5523C5.09978 24.8217 5.47762 17.9516 6.06501 8.85059C12.5845 8.18583 18.501 6.11668 24 2.94366C29.499 6.11668 35.4155 8.18583 41.9349 8.85059ZM24.8476 47.8378C24.313 48.0541 23.687 48.0541 23.1523 47.8378C1.23463 38.9739 2.03731 26.572 3.21062 8.44348L3.22433 8.23157C3.30023 7.05847 4.24822 6.13453 5.4187 6.02536C11.7188 5.43773 17.4301 3.45038 22.7743 0.331256C23.5311 -0.110419 24.4689 -0.110419 25.2256 0.331256C30.5698 3.45038 36.2812 5.43773 42.5812 6.02536C43.7517 6.13453 44.6997 7.05847 44.7756 8.23157L44.7893 8.44347C45.9626 26.572 46.7653 38.9739 24.8476 47.8378Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M41.9349 8.85059C42.5223 17.9516 42.9002 24.8217 40.8054 30.5523C38.8095 36.0126 34.3644 40.8436 24 45.0793C13.6355 40.8436 9.19041 36.0126 7.1945 30.5523C5.09978 24.8217 5.47762 17.9516 6.06501 8.85059C12.5845 8.18583 18.501 6.11668 24 2.94366C29.499 6.11668 35.4155 8.18583 41.9349 8.85059ZM24.8476 47.8378C24.313 48.0541 23.687 48.0541 23.1523 47.8378C1.23463 38.9739 2.03731 26.572 3.21062 8.44348L3.22433 8.23157C3.30023 7.05847 4.24822 6.13453 5.4187 6.02536C11.7188 5.43773 17.4301 3.45038 22.7743 0.331256C23.5311 -0.110419 24.4689 -0.110419 25.2256 0.331256C30.5698 3.45038 36.2812 5.43773 42.5812 6.02536C43.7517 6.13453 44.6997 7.05847 44.7756 8.23157L44.7893 8.44347C45.9626 26.572 46.7653 38.9739 24.8476 47.8378Z" fill="url(#paint1_linear_857_46679)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M24.0003 48C24.2903 47.9999 24.5802 47.9459 24.8474 47.8378C46.7651 38.9739 45.9624 26.572 44.7891 8.44349L44.7754 8.23157C44.6995 7.05847 43.7515 6.13453 42.581 6.02535C36.2809 5.43773 30.5696 3.45038 25.2254 0.331256C24.8472 0.110524 24.4238 0.000105701 24.0003 8.42224e-08V2.94401C29.4992 6.11684 35.4155 8.18585 41.9347 8.85059C42.5221 17.9516 42.8999 24.8217 40.8052 30.5523C38.8093 36.0125 34.3644 40.8434 24.0003 45.079V48Z" fill="#DB8300"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M24.0003 48C24.2903 47.9999 24.5802 47.9459 24.8474 47.8378C46.7651 38.9739 45.9624 26.572 44.7891 8.44349L44.7754 8.23157C44.6995 7.05847 43.7515 6.13453 42.581 6.02535C36.2809 5.43773 30.5696 3.45038 25.2254 0.331256C24.8472 0.110524 24.4238 0.000105701 24.0003 8.42224e-08V2.94401C29.4992 6.11684 35.4155 8.18585 41.9347 8.85059C42.5221 17.9516 42.8999 24.8217 40.8052 30.5523C38.8093 36.0125 34.3644 40.8434 24.0003 45.079V48Z" fill="url(#paint2_linear_857_46679)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M14.9998 15.3467C14.9998 14.2357 15.9005 13.335 17.0115 13.335C18.1226 13.335 19.0233 14.2357 19.0233 15.3467V29.4415C19.0233 29.7521 18.7715 30.0038 18.4609 30.0038H15.5621C15.2515 30.0038 14.9998 29.7521 14.9998 29.4415V15.3467ZM22.1845 22.5327C22.1845 21.4217 23.0852 20.521 24.1963 20.521C25.3074 20.521 26.2081 21.4217 26.2081 22.5327V29.4426C26.2081 29.7532 25.9563 30.005 25.6457 30.005H22.7469C22.4363 30.005 22.1845 29.7532 22.1845 29.4426V22.5327ZM31.3824 17.6463C30.2714 17.6463 29.3707 18.547 29.3707 19.6581V29.4419C29.3707 29.7525 29.6224 30.0043 29.933 30.0043H32.8318C33.1424 30.0043 33.3942 29.7525 33.3942 29.4419V19.6581C33.3942 18.547 32.4935 17.6463 31.3824 17.6463Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M14.9998 15.3467C14.9998 14.2357 15.9005 13.335 17.0115 13.335C18.1226 13.335 19.0233 14.2357 19.0233 15.3467V29.4415C19.0233 29.7521 18.7715 30.0038 18.4609 30.0038H15.5621C15.2515 30.0038 14.9998 29.7521 14.9998 29.4415V15.3467ZM22.1845 22.5327C22.1845 21.4217 23.0852 20.521 24.1963 20.521C25.3074 20.521 26.2081 21.4217 26.2081 22.5327V29.4426C26.2081 29.7532 25.9563 30.005 25.6457 30.005H22.7469C22.4363 30.005 22.1845 29.7532 22.1845 29.4426V22.5327ZM31.3824 17.6463C30.2714 17.6463 29.3707 18.547 29.3707 19.6581V29.4419C29.3707 29.7525 29.6224 30.0043 29.933 30.0043H32.8318C33.1424 30.0043 33.3942 29.7525 33.3942 29.4419V19.6581C33.3942 18.547 32.4935 17.6463 31.3824 17.6463Z" fill="url(#paint3_linear_857_46679)"/> +<defs> +<radialGradient id="paint0_radial_857_46679" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(13.8646 6.53228) rotate(72.8884) scale(34.4459 35.4696)"> +<stop stop-color="#2B2D37"/> +<stop offset="1" stop-color="#15161B"/> +</radialGradient> +<linearGradient id="paint1_linear_857_46679" x1="23.1376" y1="46.4496" x2="7.758" y2="5.62908" gradientUnits="userSpaceOnUse"> +<stop stop-color="#CB6E00"/> +<stop offset="1" stop-color="#FFC600" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint2_linear_857_46679" x1="37.2236" y1="46.5934" x2="23.9997" y2="2.61089" gradientUnits="userSpaceOnUse"> +<stop stop-color="#793A00"/> +<stop offset="1" stop-color="#DB8300" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint3_linear_857_46679" x1="33.3942" y1="29.4302" x2="15.8619" y2="13.335" gradientUnits="userSpaceOnUse"> +<stop stop-color="#DB8300"/> +<stop offset="1" stop-color="#FFC600"/> +</linearGradient> +</defs> <rect x="61" y="0.590149" width="31" height="51.9286" rx="5" fill="white"/> <rect x="64" y="7.86017" width="25" height="37.3886" fill="#FFC600"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M60.7164 27.9228C61.4382 27.1534 61.4382 25.9556 60.7164 25.1861L51.9586 15.8505C50.7184 14.5284 48.5 15.406 48.5 17.2188V22.4002H44C42.8954 22.4002 42 23.2956 42 24.4002V28.7088C42 29.8133 42.8954 30.7088 44 30.7088H48.5V35.8901C48.5 37.7029 50.7184 38.5806 51.9586 37.2585L60.7164 27.9228Z" fill="#FFC600"/> diff --git a/src/assets/icons/email/feedback.png b/src/assets/icons/email/feedback.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff4045b26edadccd52d1600922dd0ffec723d00 Binary files /dev/null and b/src/assets/icons/email/feedback.png differ diff --git a/src/assets/icons/email/feedback.svg b/src/assets/icons/email/feedback.svg deleted file mode 100644 index 8da7af00dc35761c0d7594c0e10092f5131b3014..0000000000000000000000000000000000000000 --- a/src/assets/icons/email/feedback.svg +++ /dev/null @@ -1,13 +0,0 @@ -<svg width="54" height="53" viewBox="0 0 54 53" fill="none" xmlns="http://www.w3.org/2000/svg"> -<rect x="0.53418" width="52.9315" height="52.9315" rx="5.29315" fill="#E3B82A"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M19.4246 36.5928C18.6244 38.8906 16.9914 41.4597 13.9325 43.668C19.3905 43.668 23.6562 41.0197 26.5632 38.1261C26.9446 38.1448 27.3292 38.1542 27.7167 38.1542C37.6134 38.1542 45.6362 31.9828 45.6362 24.37C45.6362 16.7572 37.6134 10.5858 27.7167 10.5858C17.8201 10.5858 9.79723 16.7572 9.79722 24.37C9.79722 29.6814 13.7024 34.2911 19.4246 36.5928Z" fill="url(#paint0_radial_12097_71860)"/> -<rect x="36.9365" y="23.1191" width="3.68026" height="3.68026" transform="rotate(90 36.9365 23.1191)" fill="#E3B82A"/> -<rect x="29.5762" y="23.1191" width="3.68026" height="3.68026" transform="rotate(90 29.5762 23.1191)" fill="#E3B82A"/> -<rect x="22.2153" y="23.1191" width="3.68026" height="3.68026" transform="rotate(90 22.2153 23.1191)" fill="#E3B82A"/> -<defs> -<radialGradient id="paint0_radial_12097_71860" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(27.7167 42.6341) rotate(-90) scale(10.1314 21.7354)"> -<stop stop-color="#2A2B30"/> -<stop offset="1" stop-color="#1B1C22"/> -</radialGradient> -</defs> -</svg> diff --git a/src/assets/icons/email/logo-gouv.png b/src/assets/icons/email/logo-gouv.png index e0c30f0a63c0c2d029c53f9ded130b51ec061642..3c50043c1500194a3fd5373f1536c1c7c3098b2f 100644 Binary files a/src/assets/icons/email/logo-gouv.png and b/src/assets/icons/email/logo-gouv.png differ diff --git a/src/assets/icons/email/logo-grandlyon.png b/src/assets/icons/email/logo-grandlyon.png index f79d2c358bfee1ad6cc36578b106608a9c6bb7d1..8aeb027ecfb3cae26bbb4b9e6fcf7405dfe8159c 100644 Binary files a/src/assets/icons/email/logo-grandlyon.png and b/src/assets/icons/email/logo-grandlyon.png differ diff --git a/src/assets/icons/email/logo-territoire.png b/src/assets/icons/email/logo-territoire.png index ae966023cd75ff542d8b9882ff48371de936dbbe..311cd6871d977ad8020378692970c6e50a351b88 100644 Binary files a/src/assets/icons/email/logo-territoire.png and b/src/assets/icons/email/logo-territoire.png differ diff --git a/src/assets/icons/email/logo-tiga-white.png b/src/assets/icons/email/logo-tiga-white.png index 50cba7a078385f2a88dbbb4850d5d0d154e84937..6e6cfed03e2884e875e7eaa20dc387579739e561 100644 Binary files a/src/assets/icons/email/logo-tiga-white.png and b/src/assets/icons/email/logo-tiga-white.png differ diff --git a/src/assets/icons/ico/bill.svg b/src/assets/icons/ico/bill.svg new file mode 100644 index 0000000000000000000000000000000000000000..d1a3cb9d7f3e96c134239a1fc450c7d48227530c --- /dev/null +++ b/src/assets/icons/ico/bill.svg @@ -0,0 +1,7 @@ +<svg width="48" height="62" viewBox="0 0 48 62" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M0 11V62H48V0H11L0 11Z" fill="#B2C0CA"/> +<path d="M11 11H0L11 0V11Z" fill="#8DA1B0"/> +<rect x="5" y="20" width="21" height="19" fill="#EFF2F4"/> +<rect x="9" y="23" width="13" height="3" fill="#8DA1B0"/> +<path d="M16.9902 10V7.13672H18.9219V7.47461H17.3691V8.36133H18.7129V8.69922H17.3691V10H16.9902ZM18.8789 10L19.9785 7.13672H20.3867L21.5586 10H21.127L20.793 9.13281H19.5957L19.2812 10H18.8789ZM19.7051 8.82422H20.6758L20.377 8.03125C20.2858 7.79036 20.2181 7.59245 20.1738 7.4375C20.1374 7.62109 20.0859 7.80339 20.0195 7.98438L19.7051 8.82422ZM23.9043 8.99609L24.2832 9.0918C24.2038 9.40299 24.0605 9.64062 23.8535 9.80469C23.6478 9.96745 23.3958 10.0488 23.0977 10.0488C22.7891 10.0488 22.5378 9.98633 22.3438 9.86133C22.151 9.73503 22.0039 9.55273 21.9023 9.31445C21.8021 9.07617 21.752 8.82031 21.752 8.54688C21.752 8.2487 21.8086 7.98893 21.9219 7.76758C22.0365 7.54492 22.1986 7.3763 22.4082 7.26172C22.6191 7.14583 22.8509 7.08789 23.1035 7.08789C23.39 7.08789 23.6309 7.16081 23.8262 7.30664C24.0215 7.45247 24.1576 7.65755 24.2344 7.92188L23.8613 8.00977C23.7949 7.80143 23.6986 7.64974 23.5723 7.55469C23.446 7.45964 23.2871 7.41211 23.0957 7.41211C22.8757 7.41211 22.6914 7.46484 22.543 7.57031C22.3958 7.67578 22.2923 7.81771 22.2324 7.99609C22.1725 8.17318 22.1426 8.35612 22.1426 8.54492C22.1426 8.78841 22.1777 9.0013 22.248 9.18359C22.3197 9.36458 22.4303 9.5 22.5801 9.58984C22.7298 9.67969 22.8919 9.72461 23.0664 9.72461C23.2786 9.72461 23.4583 9.66341 23.6055 9.54102C23.7526 9.41862 23.8522 9.23698 23.9043 8.99609ZM25.4805 10V7.47461H24.5371V7.13672H26.8066V7.47461H25.8594V10H25.4805ZM29.0762 7.13672H29.4551V8.79102C29.4551 9.07878 29.4225 9.30729 29.3574 9.47656C29.2923 9.64583 29.1745 9.78385 29.0039 9.89062C28.8346 9.99609 28.612 10.0488 28.3359 10.0488C28.0677 10.0488 27.8483 10.0026 27.6777 9.91016C27.5072 9.81771 27.3854 9.68424 27.3125 9.50977C27.2396 9.33398 27.2031 9.0944 27.2031 8.79102V7.13672H27.582V8.78906C27.582 9.03776 27.6048 9.22135 27.6504 9.33984C27.6973 9.45703 27.7767 9.54753 27.8887 9.61133C28.002 9.67513 28.14 9.70703 28.3027 9.70703C28.5814 9.70703 28.7799 9.64388 28.8984 9.51758C29.0169 9.39128 29.0762 9.14844 29.0762 8.78906V7.13672ZM30.0938 10V7.13672H31.3633C31.6185 7.13672 31.8125 7.16276 31.9453 7.21484C32.0781 7.26562 32.1842 7.35612 32.2637 7.48633C32.3431 7.61654 32.3828 7.76042 32.3828 7.91797C32.3828 8.12109 32.3171 8.29232 32.1855 8.43164C32.054 8.57096 31.8509 8.65951 31.5762 8.69727C31.6764 8.74544 31.7526 8.79297 31.8047 8.83984C31.9154 8.94141 32.0202 9.06836 32.1191 9.2207L32.6172 10H32.1406L31.7617 9.4043C31.651 9.23242 31.5599 9.10091 31.4883 9.00977C31.4167 8.91862 31.3522 8.85482 31.2949 8.81836C31.2389 8.7819 31.1816 8.75651 31.123 8.74219C31.0801 8.73307 31.0098 8.72852 30.9121 8.72852H30.4727V10H30.0938ZM30.4727 8.40039H31.2871C31.4603 8.40039 31.5957 8.38281 31.6934 8.34766C31.791 8.3112 31.8652 8.25391 31.916 8.17578C31.9668 8.09635 31.9922 8.01042 31.9922 7.91797C31.9922 7.78255 31.9427 7.67122 31.8438 7.58398C31.7461 7.49674 31.5911 7.45312 31.3789 7.45312H30.4727V8.40039ZM32.9863 10V7.13672H35.0566V7.47461H33.3652V8.35156H34.9492V8.6875H33.3652V9.66211H35.123V10H32.9863ZM11.4082 15V12.1367H12.3945C12.6172 12.1367 12.7871 12.1504 12.9043 12.1777C13.0684 12.2155 13.2083 12.2839 13.3242 12.3828C13.4753 12.5104 13.5879 12.6738 13.6621 12.873C13.7376 13.071 13.7754 13.2975 13.7754 13.5527C13.7754 13.7702 13.75 13.9629 13.6992 14.1309C13.6484 14.2988 13.5833 14.4382 13.5039 14.5488C13.4245 14.6582 13.3372 14.7448 13.2422 14.8086C13.1484 14.8711 13.0345 14.9186 12.9004 14.9512C12.7676 14.9837 12.6146 15 12.4414 15H11.4082ZM11.7871 14.6621H12.3984C12.5872 14.6621 12.735 14.6445 12.8418 14.6094C12.9499 14.5742 13.0358 14.5247 13.0996 14.4609C13.1895 14.3711 13.2591 14.2507 13.3086 14.0996C13.3594 13.9473 13.3848 13.763 13.3848 13.5469C13.3848 13.2474 13.3353 13.0176 13.2363 12.8574C13.1387 12.696 13.0195 12.5879 12.8789 12.5332C12.7773 12.4941 12.6139 12.4746 12.3887 12.4746H11.7871V14.6621ZM14.2324 12.5156V12.1074H14.6094V12.4297C14.6094 12.6042 14.5892 12.7298 14.5488 12.8066C14.4928 12.9121 14.4056 12.9915 14.2871 13.0449L14.2012 12.9062C14.2715 12.8776 14.3236 12.8327 14.3574 12.7715C14.3926 12.709 14.4121 12.6237 14.416 12.5156H14.2324ZM15.1973 15V12.1367H17.2676V12.4746H15.5762V13.3516H17.1602V13.6875H15.5762V14.6621H17.334V15H15.1973ZM15.9785 11.9609L16.2383 11.4141H16.6992L16.2695 11.9609H15.9785ZM17.8418 15V12.1367H18.2207V14.6621H19.6309V15H17.8418ZM20.0918 15V12.1367H22.1621V12.4746H20.4707V13.3516H22.0547V13.6875H20.4707V14.6621H22.2285V15H20.0918ZM24.7949 13.9961L25.1738 14.0918C25.0944 14.403 24.9512 14.6406 24.7441 14.8047C24.5384 14.9674 24.2865 15.0488 23.9883 15.0488C23.6797 15.0488 23.4284 14.9863 23.2344 14.8613C23.0417 14.735 22.8945 14.5527 22.793 14.3145C22.6927 14.0762 22.6426 13.8203 22.6426 13.5469C22.6426 13.2487 22.6992 12.9889 22.8125 12.7676C22.9271 12.5449 23.0892 12.3763 23.2988 12.2617C23.5098 12.1458 23.7415 12.0879 23.9941 12.0879C24.2806 12.0879 24.5215 12.1608 24.7168 12.3066C24.9121 12.4525 25.0482 12.6576 25.125 12.9219L24.752 13.0098C24.6855 12.8014 24.5892 12.6497 24.4629 12.5547C24.3366 12.4596 24.1777 12.4121 23.9863 12.4121C23.7663 12.4121 23.582 12.4648 23.4336 12.5703C23.2865 12.6758 23.1829 12.8177 23.123 12.9961C23.0632 13.1732 23.0332 13.3561 23.0332 13.5449C23.0332 13.7884 23.0684 14.0013 23.1387 14.1836C23.2103 14.3646 23.321 14.5 23.4707 14.5898C23.6204 14.6797 23.7826 14.7246 23.957 14.7246C24.1693 14.7246 24.349 14.6634 24.4961 14.541C24.6432 14.4186 24.7428 14.237 24.7949 13.9961ZM26.3711 15V12.4746H25.4277V12.1367H27.6973V12.4746H26.75V15H26.3711ZM28.0938 15V12.1367H29.3633C29.6185 12.1367 29.8125 12.1628 29.9453 12.2148C30.0781 12.2656 30.1842 12.3561 30.2637 12.4863C30.3431 12.6165 30.3828 12.7604 30.3828 12.918C30.3828 13.1211 30.3171 13.2923 30.1855 13.4316C30.054 13.571 29.8509 13.6595 29.5762 13.6973C29.6764 13.7454 29.7526 13.793 29.8047 13.8398C29.9154 13.9414 30.0202 14.0684 30.1191 14.2207L30.6172 15H30.1406L29.7617 14.4043C29.651 14.2324 29.5599 14.1009 29.4883 14.0098C29.4167 13.9186 29.3522 13.8548 29.2949 13.8184C29.2389 13.7819 29.1816 13.7565 29.123 13.7422C29.0801 13.7331 29.0098 13.7285 28.9121 13.7285H28.4727V15H28.0938ZM28.4727 13.4004H29.2871C29.4603 13.4004 29.5957 13.3828 29.6934 13.3477C29.791 13.3112 29.8652 13.2539 29.916 13.1758C29.9668 13.0964 29.9922 13.0104 29.9922 12.918C29.9922 12.7826 29.9427 12.6712 29.8438 12.584C29.7461 12.4967 29.5911 12.4531 29.3789 12.4531H28.4727V13.4004ZM31.043 15V12.1367H31.4219V15H31.043ZM34.1348 13.9961L34.5137 14.0918C34.4342 14.403 34.291 14.6406 34.084 14.8047C33.8783 14.9674 33.6263 15.0488 33.3281 15.0488C33.0195 15.0488 32.7682 14.9863 32.5742 14.8613C32.3815 14.735 32.2344 14.5527 32.1328 14.3145C32.0326 14.0762 31.9824 13.8203 31.9824 13.5469C31.9824 13.2487 32.0391 12.9889 32.1523 12.7676C32.2669 12.5449 32.429 12.3763 32.6387 12.2617C32.8496 12.1458 33.0814 12.0879 33.334 12.0879C33.6204 12.0879 33.8613 12.1608 34.0566 12.3066C34.252 12.4525 34.388 12.6576 34.4648 12.9219L34.0918 13.0098C34.0254 12.8014 33.929 12.6497 33.8027 12.5547C33.6764 12.4596 33.5176 12.4121 33.3262 12.4121C33.1061 12.4121 32.9219 12.4648 32.7734 12.5703C32.6263 12.6758 32.5228 12.8177 32.4629 12.9961C32.403 13.1732 32.373 13.3561 32.373 13.5449C32.373 13.7884 32.4082 14.0013 32.4785 14.1836C32.5501 14.3646 32.6608 14.5 32.8105 14.5898C32.9603 14.6797 33.1224 14.7246 33.2969 14.7246C33.5091 14.7246 33.6888 14.6634 33.8359 14.541C33.9831 14.4186 34.0827 14.237 34.1348 13.9961ZM35.0469 15V12.1367H35.4258V15H35.0469ZM36.8242 15V12.4746H35.8809V12.1367H38.1504V12.4746H37.2031V15H36.8242ZM38.5488 15V12.1367H40.6191V12.4746H38.9277V13.3516H40.5117V13.6875H38.9277V14.6621H40.6855V15H38.5488ZM39.3301 11.9609L39.5898 11.4141H40.0508L39.6211 11.9609H39.3301Z" fill="white"/> +</svg> diff --git a/src/assets/icons/ico/chevron-down.svg b/src/assets/icons/ico/chevron-down.svg index 24377e7c56e222361a98518bf03d9ba0692acc82..12b11fa40f039ed7614740e37500334be4e3e628 100644 --- a/src/assets/icons/ico/chevron-down.svg +++ b/src/assets/icons/ico/chevron-down.svg @@ -1,3 +1,3 @@ <svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M2.5 0L7 5L11.5 0L14 0L7 8L0 0L2.5 0Z" fill="white"/> +<path d="M2.5 0L7 5L11.5 0L14 0L7 8L0 0L2.5 0Z" fill="currentColor"/> </svg> diff --git a/src/assets/icons/ico/chevron-up.svg b/src/assets/icons/ico/chevron-up.svg index 1bcc77f4b6b3753ab28665c4266651cc7def33d3..281bb1a04c300c79582e62f85763eae90b16c50a 100644 --- a/src/assets/icons/ico/chevron-up.svg +++ b/src/assets/icons/ico/chevron-up.svg @@ -1,3 +1,3 @@ <svg width="14" height="9" viewBox="0 0 14 9" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M11.5 8.87979L7 3.89345L2.5 8.87979L9.53674e-07 8.87979L7 0.901652L14 8.87979L11.5 8.87979Z" fill="white"/> +<path d="M11.5 8.87979L7 3.89345L2.5 8.87979L9.53674e-07 8.87979L7 0.901652L14 8.87979L11.5 8.87979Z" fill="currentColor"/> </svg> diff --git a/src/assets/icons/ico/download.svg b/src/assets/icons/ico/download.svg new file mode 100644 index 0000000000000000000000000000000000000000..a2e8377d3d872781cec36c50a0db8695f5d4347c --- /dev/null +++ b/src/assets/icons/ico/download.svg @@ -0,0 +1,5 @@ +<svg width="49" height="48" viewBox="0 0 49 48" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M11.5 24.5791L24.5 36.0002L37.5 24.5791" stroke="#E3B82A" stroke-width="6"/> +<path d="M24.5 36V7.5" stroke="#E3B82A" stroke-width="6"/> +<path d="M10.5 45L38.5 45" stroke="#E3B82A" stroke-width="3"/> +</svg> diff --git a/src/assets/icons/ico/ecolyo.svg b/src/assets/icons/ico/ecolyo.svg new file mode 100644 index 0000000000000000000000000000000000000000..edc5b46e670f918b0e793c70dfb64a89942b24be --- /dev/null +++ b/src/assets/icons/ico/ecolyo.svg @@ -0,0 +1,27 @@ +<svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M86.9716 175.419C88.8818 176.194 91.1182 176.194 93.0284 175.419C171.638 143.533 168.442 98.8702 164.224 33.4965C163.953 29.2929 160.566 25.9821 156.385 25.5909C133.876 23.4852 113.472 16.3639 94.3788 5.187C91.6752 3.60433 88.3248 3.60433 85.6212 5.187C66.5282 16.3639 46.1235 23.4852 23.6155 25.5909C19.4338 25.9821 16.0469 29.2929 15.7757 33.4965C11.5585 98.8702 8.36248 143.533 86.9716 175.419Z" fill="url(#paint0_radial_14017_3979)"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M157.256 33.1897C159.459 67.3186 160.876 93.0814 153.021 114.571C145.536 135.047 128.867 153.163 90.0001 169.047C51.1334 153.163 34.4642 135.047 26.9796 114.571C19.1243 93.0814 20.5412 67.3186 22.744 33.1897C47.1919 30.6969 69.3788 22.9376 90.0001 11.0387C110.621 22.9376 132.808 30.6969 157.256 33.1897ZM93.1788 179.392C91.1738 180.203 88.8264 180.203 86.8214 179.392C4.63003 146.152 7.64008 99.6449 12.04 31.663L12.0914 30.8684C12.3761 26.4693 15.931 23.0045 20.3203 22.5951C43.9456 20.3915 65.3632 12.9389 85.4039 1.24221C88.2417 -0.41407 91.7585 -0.41407 94.5963 1.24221C114.637 12.9389 136.055 20.3915 159.68 22.5951C164.069 23.0045 167.624 26.4693 167.909 30.8684L167.96 31.663C172.36 99.6449 175.37 146.152 93.1788 179.392Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M157.256 33.1897C159.459 67.3186 160.876 93.0814 153.021 114.571C145.536 135.047 128.867 153.163 90.0001 169.047C51.1334 153.163 34.4642 135.047 26.9796 114.571C19.1243 93.0814 20.5412 67.3186 22.744 33.1897C47.1919 30.6969 69.3788 22.9376 90.0001 11.0387C110.621 22.9376 132.808 30.6969 157.256 33.1897ZM93.1788 179.392C91.1738 180.203 88.8264 180.203 86.8214 179.392C4.63003 146.152 7.64008 99.6449 12.04 31.663L12.0914 30.8684C12.3761 26.4693 15.931 23.0045 20.3203 22.5951C43.9456 20.3915 65.3632 12.9389 85.4039 1.24221C88.2417 -0.41407 91.7585 -0.41407 94.5963 1.24221C114.637 12.9389 136.055 20.3915 159.68 22.5951C164.069 23.0045 167.624 26.4693 167.909 30.8684L167.96 31.663C172.36 99.6449 175.37 146.152 93.1788 179.392Z" fill="url(#paint1_linear_14017_3979)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M90.002 180C91.0892 180 92.1763 179.797 93.178 179.392C175.369 146.152 172.359 99.6449 167.959 31.6631L167.908 30.8684C167.623 26.4693 164.068 23.0045 159.679 22.5951C136.054 20.3915 114.636 12.9389 94.5955 1.24221C93.1774 0.414524 91.5897 0.000453903 90.002 0V11.0402C110.623 22.9382 132.809 30.697 157.255 33.1897C159.458 67.3186 160.875 93.0814 153.02 114.571C145.535 135.047 128.867 153.163 90.002 169.046V180Z" fill="#DB8300"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M90.002 180C91.0892 180 92.1763 179.797 93.178 179.392C175.369 146.152 172.359 99.6449 167.959 31.6631L167.908 30.8684C167.623 26.4693 164.068 23.0045 159.679 22.5951C136.054 20.3915 114.636 12.9389 94.5955 1.24221C93.1774 0.414524 91.5897 0.000453903 90.002 0V11.0402C110.623 22.9382 132.809 30.697 157.255 33.1897C159.458 67.3186 160.875 93.0814 153.02 114.571C145.535 135.047 128.867 153.163 90.002 169.046V180Z" fill="url(#paint2_linear_14017_3979)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M56 57.5462C56 53.3785 59.3786 50 63.5462 50C67.7139 50 71.0924 53.3785 71.0924 57.5462V110.416C71.0924 111.581 70.148 112.526 68.983 112.526H58.1094C56.9444 112.526 56 111.581 56 110.416V57.5462ZM82.9505 84.5012C82.9505 80.3336 86.329 76.955 90.4967 76.955C94.6643 76.955 98.0429 80.3336 98.0429 84.5012V110.421C98.0429 111.586 97.0985 112.53 95.9335 112.53H85.0599C83.8949 112.53 82.9505 111.586 82.9505 110.421V84.5012ZM117.452 66.1721C113.285 66.1721 109.906 69.5507 109.906 73.7183V110.418C109.906 111.583 110.85 112.527 112.015 112.527H122.889C124.054 112.527 124.998 111.583 124.998 110.418V73.7183C124.998 69.5507 121.62 66.1721 117.452 66.1721Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M56 57.5462C56 53.3785 59.3786 50 63.5462 50C67.7139 50 71.0924 53.3785 71.0924 57.5462V110.416C71.0924 111.581 70.148 112.526 68.983 112.526H58.1094C56.9444 112.526 56 111.581 56 110.416V57.5462ZM82.9505 84.5012C82.9505 80.3336 86.329 76.955 90.4967 76.955C94.6643 76.955 98.0429 80.3336 98.0429 84.5012V110.421C98.0429 111.586 97.0985 112.53 95.9335 112.53H85.0599C83.8949 112.53 82.9505 111.586 82.9505 110.421V84.5012ZM117.452 66.1721C113.285 66.1721 109.906 69.5507 109.906 73.7183V110.418C109.906 111.583 110.85 112.527 112.015 112.527H122.889C124.054 112.527 124.998 111.583 124.998 110.418V73.7183C124.998 69.5507 121.62 66.1721 117.452 66.1721Z" fill="url(#paint3_linear_14017_3979)"/> +<defs> +<radialGradient id="paint0_radial_14017_3979" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(51.4865 24.6859) rotate(72.6265) scale(128.981 134.594)"> +<stop stop-color="#2B2D37"/> +<stop offset="1" stop-color="#15161B"/> +</radialGradient> +<linearGradient id="paint1_linear_14017_3979" x1="86.7661" y1="174.186" x2="29.0927" y2="21.109" gradientUnits="userSpaceOnUse"> +<stop stop-color="#CB6E00"/> +<stop offset="1" stop-color="#FFC600" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint2_linear_14017_3979" x1="139.589" y1="174.725" x2="89.9987" y2="9.79094" gradientUnits="userSpaceOnUse"> +<stop stop-color="#793A00"/> +<stop offset="1" stop-color="#DB8300" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint3_linear_14017_3979" x1="124.998" y1="110.374" x2="59.2341" y2="50.0002" gradientUnits="userSpaceOnUse"> +<stop stop-color="#DB8300"/> +<stop offset="1" stop-color="#FFC600"/> +</linearGradient> +</defs> +</svg> diff --git a/src/assets/icons/ico/export.svg b/src/assets/icons/ico/export.svg new file mode 100644 index 0000000000000000000000000000000000000000..36d80fec554362ed245149e9d40e7b5983f80152 --- /dev/null +++ b/src/assets/icons/ico/export.svg @@ -0,0 +1,6 @@ +<svg width="38" height="38" viewBox="0 0 38 38" fill="none" xmlns="http://www.w3.org/2000/svg"> +<circle cx="18.5" cy="18.5" r="18" stroke="white"/> +<path d="M16.5 26L16.5 27.5L19.5 27.5L19.5 26L16.5 26ZM19.5 10C19.5 9.17157 18.8284 8.5 18 8.5C17.1716 8.5 16.5 9.17157 16.5 10L19.5 10ZM19.5 26L19.5 10L16.5 10L16.5 26L19.5 26Z" fill="white"/> +<path d="M10.5 26L10.5 27.5L13.5 27.5L13.5 26L10.5 26ZM13.5 18C13.5 17.1716 12.8284 16.5 12 16.5C11.1716 16.5 10.5 17.1716 10.5 18L13.5 18ZM13.5 26L13.5 18L10.5 18L10.5 26L13.5 26Z" fill="white"/> +<path d="M22.5 26L22.5 27.5L25.5 27.5L25.5 26L22.5 26ZM25.5 14C25.5 13.1716 24.8284 12.5 24 12.5C23.1716 12.5 22.5 13.1716 22.5 14L25.5 14ZM25.5 26L25.5 14L22.5 14L22.5 26L25.5 26Z" fill="white"/> +</svg> diff --git a/src/assets/icons/ico/exportDone.svg b/src/assets/icons/ico/exportDone.svg new file mode 100644 index 0000000000000000000000000000000000000000..c32d4672690710b74414f435414696c1e83327ab --- /dev/null +++ b/src/assets/icons/ico/exportDone.svg @@ -0,0 +1,3 @@ +<svg width="49" height="48" viewBox="0 0 49 48" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4.5 26.4774L17.1633 37.1307L44.5 11" stroke="#E3B82A" stroke-width="6"/> +</svg> diff --git a/src/assets/icons/ico/feedback.svg b/src/assets/icons/ico/feedback.svg new file mode 100644 index 0000000000000000000000000000000000000000..0f29f2d778e5b4a6b64d8ec24f0d5e2584a948b7 --- /dev/null +++ b/src/assets/icons/ico/feedback.svg @@ -0,0 +1,4 @@ +<svg width="38" height="38" viewBox="0 0 38 38" fill="none" xmlns="http://www.w3.org/2000/svg"> +<circle cx="18.5" cy="18.5" r="18" stroke="white"/> +<path d="M14.4691 13.1925C14.7071 12.9825 14.9661 12.783 15.2461 12.594C15.5331 12.405 15.8411 12.2405 16.1701 12.1005C16.4991 11.9605 16.8561 11.852 17.2411 11.775C17.6261 11.691 18.0426 11.649 18.4906 11.649C19.0996 11.649 19.6526 11.733 20.1496 11.901C20.6536 12.069 21.0841 12.3105 21.4411 12.6255C21.7981 12.9335 22.0746 13.308 22.2706 13.749C22.4666 14.19 22.5646 14.6835 22.5646 15.2295C22.5646 15.7615 22.4876 16.2235 22.3336 16.6155C22.1796 17.0005 21.9836 17.3365 21.7456 17.6235C21.5146 17.9105 21.2626 18.159 20.9896 18.369C20.7166 18.579 20.4576 18.7785 20.2126 18.9675C19.9676 19.1495 19.7541 19.3315 19.5721 19.5135C19.3971 19.6885 19.2921 19.888 19.2571 20.112L19.0156 21.645H17.2411L17.0626 19.9335C17.0556 19.8985 17.0521 19.8705 17.0521 19.8495C17.0521 19.8215 17.0521 19.79 17.0521 19.755C17.0521 19.447 17.1291 19.181 17.2831 18.957C17.4371 18.726 17.6296 18.5125 17.8606 18.3165C18.0916 18.1135 18.3401 17.9175 18.6061 17.7285C18.8721 17.5395 19.1206 17.3365 19.3516 17.1195C19.5826 16.8955 19.7751 16.6435 19.9291 16.3635C20.0831 16.0835 20.1601 15.7545 20.1601 15.3765C20.1601 15.1245 20.1111 14.9005 20.0131 14.7045C19.9221 14.5015 19.7926 14.33 19.6246 14.19C19.4566 14.043 19.2536 13.931 19.0156 13.854C18.7846 13.777 18.5326 13.7385 18.2596 13.7385C17.8606 13.7385 17.5211 13.784 17.2411 13.875C16.9681 13.959 16.7336 14.057 16.5376 14.169C16.3486 14.274 16.1876 14.372 16.0546 14.463C15.9216 14.547 15.8026 14.589 15.6976 14.589C15.4456 14.589 15.2636 14.484 15.1516 14.274L14.4691 13.1925ZM16.4536 25.572C16.4536 25.355 16.4921 25.1485 16.5691 24.9525C16.6531 24.7565 16.7651 24.5885 16.9051 24.4485C17.0521 24.3085 17.2236 24.1965 17.4196 24.1125C17.6156 24.0285 17.8256 23.9865 18.0496 23.9865C18.2666 23.9865 18.4731 24.0285 18.6691 24.1125C18.8651 24.1965 19.0331 24.3085 19.1731 24.4485C19.3131 24.5885 19.4251 24.7565 19.5091 24.9525C19.5931 25.1485 19.6351 25.355 19.6351 25.572C19.6351 25.796 19.5931 26.006 19.5091 26.202C19.4251 26.391 19.3131 26.5555 19.1731 26.6955C19.0331 26.8355 18.8651 26.944 18.6691 27.021C18.4731 27.105 18.2666 27.147 18.0496 27.147C17.8256 27.147 17.6156 27.105 17.4196 27.021C17.2236 26.944 17.0521 26.8355 16.9051 26.6955C16.7651 26.5555 16.6531 26.391 16.5691 26.202C16.4921 26.006 16.4536 25.796 16.4536 25.572Z" fill="white"/> +</svg> diff --git a/src/assets/icons/ico/feedbacks.svg b/src/assets/icons/ico/feedbacks.svg deleted file mode 100644 index 0fb3cc501600908046de752323123bd30a6ee5b9..0000000000000000000000000000000000000000 --- a/src/assets/icons/ico/feedbacks.svg +++ /dev/null @@ -1,13 +0,0 @@ -<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> -<rect width="40" height="40" rx="4" fill="#E3B82A"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M14.2754 27.6534C13.6706 29.3898 12.4366 31.3312 10.125 33C14.2496 33 17.4731 30.9987 19.6699 28.8121C19.9581 28.8262 20.2488 28.8333 20.5416 28.8333C28.0205 28.8333 34.0833 24.1696 34.0833 18.4167C34.0833 12.6637 28.0205 8 20.5416 8C13.0628 8 6.99998 12.6637 6.99998 18.4167C6.99998 22.4304 9.95113 25.914 14.2754 27.6534Z" fill="url(#paint0_radial)"/> -<rect x="27.509" y="17.4715" width="2.78115" height="2.78115" transform="rotate(90 27.509 17.4715)" fill="#E3B82A"/> -<rect x="21.9468" y="17.4715" width="2.78115" height="2.78115" transform="rotate(90 21.9468 17.4715)" fill="#E3B82A"/> -<rect x="16.3845" y="17.4715" width="2.78115" height="2.78115" transform="rotate(90 16.3845 17.4715)" fill="#E3B82A"/> -<defs> -<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(20.5416 32.2187) rotate(-90) scale(7.65625 16.4253)"> -<stop stop-color="#2A2B30"/> -<stop offset="1" stop-color="#1B1C22"/> -</radialGradient> -</defs> -</svg> diff --git a/src/assets/icons/ico/hammer-left.svg b/src/assets/icons/ico/hammer-left.svg deleted file mode 100644 index 51f73a92e31dc8a6aefc4459201e19c3513f0383..0000000000000000000000000000000000000000 --- a/src/assets/icons/ico/hammer-left.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M17.8438 6.0625C18.0938 6.29167 18.0938 6.53125 17.8438 6.78125L15.0312 9.59375C14.8021 9.82292 14.5625 9.82292 14.3125 9.59375L13.625 8.875C13.375 8.64583 13.375 8.41667 13.625 8.1875L13.9688 7.8125L13.0625 6.9375C12.3125 7.125 11.6667 6.94792 11.125 6.40625L9.59375 4.875C9.19792 4.47917 9 4.01042 9 3.46875V2.875L6.1875 1.46875C7.16667 0.489583 8.34375 0 9.71875 0C11.0938 0 12.2708 0.489583 13.25 1.46875L14.6562 2.875C15.1979 3.41667 15.375 4.0625 15.1875 4.8125L16.0938 5.71875L16.4375 5.34375C16.6667 5.11458 16.9062 5.11458 17.1562 5.34375L17.8438 6.0625ZM8.90625 5.59375L10.4375 7.125C10.5208 7.20833 10.6354 7.30208 10.7812 7.40625L3.34375 15.375C2.96875 15.7917 2.51042 16 1.96875 16C1.42708 16 0.958333 15.8021 0.5625 15.4062C0.1875 15.0312 0 14.5729 0 14.0312C0 13.4896 0.208333 13.0312 0.625 12.6562L8.59375 5.21875C8.69792 5.36458 8.80208 5.48958 8.90625 5.59375Z" fill="#E2A70D"/> -</svg> diff --git a/src/assets/icons/ico/hammer-right.svg b/src/assets/icons/ico/hammer-right.svg deleted file mode 100644 index 27ba34f5c28ffd3a75bc5be198b0f8498ddea2dc..0000000000000000000000000000000000000000 --- a/src/assets/icons/ico/hammer-right.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M0.1875 6.0625C-0.0625 6.29167 -0.0625 6.53125 0.1875 6.78125L3 9.59375C3.22917 9.82292 3.46875 9.82292 3.71875 9.59375L4.40625 8.875C4.65625 8.64583 4.65625 8.41667 4.40625 8.1875L4.0625 7.8125L4.96875 6.9375C5.71875 7.125 6.36458 6.94792 6.90625 6.40625L8.4375 4.875C8.83333 4.47917 9.03125 4.01042 9.03125 3.46875V2.875L11.8438 1.46875C10.8646 0.489583 9.6875 0 8.3125 0C6.9375 0 5.76042 0.489583 4.78125 1.46875L3.375 2.875C2.83333 3.41667 2.65625 4.0625 2.84375 4.8125L1.9375 5.71875L1.59375 5.34375C1.36458 5.11458 1.125 5.11458 0.875 5.34375L0.1875 6.0625ZM9.125 5.59375L7.59375 7.125C7.51042 7.20833 7.39583 7.30208 7.25 7.40625L14.6875 15.375C15.0625 15.7917 15.5208 16 16.0625 16C16.6042 16 17.0729 15.8021 17.4688 15.4062C17.8438 15.0312 18.0312 14.5729 18.0312 14.0312C18.0312 13.4896 17.8229 13.0312 17.4062 12.6562L9.4375 5.21875C9.33333 5.36458 9.22917 5.48958 9.125 5.59375Z" fill="#E2A70D"/> -</svg> diff --git a/src/assets/icons/ico/prm.svg b/src/assets/icons/ico/prm.svg new file mode 100644 index 0000000000000000000000000000000000000000..249dcf0b28e50c0e35c06ca74f6b71db78f989d2 --- /dev/null +++ b/src/assets/icons/ico/prm.svg @@ -0,0 +1,106 @@ +<svg width="205" height="134" viewBox="0 0 205 134" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g filter="url(#filter0_ii_115_37752)"> +<rect width="205" height="102" fill="#C8EA40"/> +<rect x="37" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="45" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="45" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 45 27)" fill="#696C55"/> +<rect x="45" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 45 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 43.5355 35.25)" fill="#696C55"/> +<rect x="37" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="45" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="49" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="57" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="57" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 57 27)" fill="#696C55"/> +<rect x="57" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 57 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 55.5355 35.25)" fill="#696C55"/> +<rect x="49" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="57" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="61" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="69" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="69" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 69 27)" fill="#696C55"/> +<rect x="69" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 69 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 67.5355 35.25)" fill="#696C55"/> +<rect x="61" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="69" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="73" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="81" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="81" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 81 27)" fill="#696C55"/> +<rect x="81" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 81 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 79.5355 35.25)" fill="#696C55"/> +<rect x="73" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="81" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="85" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="93" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="93" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 93 27)" fill="#696C55"/> +<rect x="93" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 93 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 91.5355 35.25)" fill="#696C55"/> +<rect x="85" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="93" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="97" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="105" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="105" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 105 27)" fill="#696C55"/> +<rect x="105" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 105 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 103.536 35.25)" fill="#696C55"/> +<rect x="97" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="105" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="109" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="117" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="117" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 117 27)" fill="#696C55"/> +<rect x="117" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 117 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 115.536 35.25)" fill="#696C55"/> +<rect x="109" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="117" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="121" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="129" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="129" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 129 27)" fill="#696C55"/> +<rect x="129" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 129 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 127.536 35.25)" fill="#696C55"/> +<rect x="121" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="129" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="133" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="141" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="141" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 141 27)" fill="#696C55"/> +<rect x="141" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 141 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 139.536 35.25)" fill="#696C55"/> +<rect x="133" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="141" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="145" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="153" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="153" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 153 27)" fill="#696C55"/> +<rect x="153" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 153 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 151.536 35.25)" fill="#696C55"/> +<rect x="145" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="153" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="157" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="165" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="165" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 165 27)" fill="#696C55"/> +<rect x="165" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 165 47.167)" fill="#696C55"/> +<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 163.536 35.25)" fill="#696C55"/> +<rect x="157" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<rect x="165" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> +<path d="M43.1207 69C43.0107 69 42.9257 68.97 42.8657 68.91C42.8057 68.84 42.7757 68.755 42.7757 68.655V58.86C42.7757 58.75 42.8057 58.665 42.8657 58.605C42.9257 58.535 43.0107 58.5 43.1207 58.5H43.8107C43.9307 58.5 44.0207 58.53 44.0807 58.59C44.1407 58.64 44.1757 58.68 44.1857 58.71L49.1657 66.36V58.86C49.1657 58.75 49.1957 58.665 49.2557 58.605C49.3157 58.535 49.4007 58.5 49.5107 58.5H50.2307C50.3407 58.5 50.4257 58.535 50.4857 58.605C50.5557 58.665 50.5907 58.75 50.5907 58.86V68.64C50.5907 68.74 50.5557 68.825 50.4857 68.895C50.4257 68.965 50.3457 69 50.2457 69H49.5257C49.4157 69 49.3307 68.97 49.2707 68.91C49.2207 68.85 49.1857 68.81 49.1657 68.79L44.2007 61.215V68.655C44.2007 68.755 44.1657 68.84 44.0957 68.91C44.0357 68.97 43.9507 69 43.8407 69H43.1207ZM57.1507 69.15C56.3107 69.15 55.5857 69 54.9757 68.7C54.3757 68.4 53.9107 67.945 53.5807 67.335C53.2607 66.715 53.1007 65.92 53.1007 64.95V58.86C53.1007 58.75 53.1307 58.665 53.1907 58.605C53.2507 58.535 53.3357 58.5 53.4457 58.5H54.2107C54.3207 58.5 54.4057 58.535 54.4657 58.605C54.5357 58.665 54.5707 58.75 54.5707 58.86V64.98C54.5707 65.96 54.8007 66.685 55.2607 67.155C55.7207 67.625 56.3507 67.86 57.1507 67.86C57.9407 67.86 58.5657 67.625 59.0257 67.155C59.4957 66.685 59.7307 65.96 59.7307 64.98V58.86C59.7307 58.75 59.7607 58.665 59.8207 58.605C59.8907 58.535 59.9757 58.5 60.0757 58.5H60.8557C60.9557 58.5 61.0357 58.535 61.0957 58.605C61.1657 58.665 61.2007 58.75 61.2007 58.86V64.95C61.2007 65.92 61.0357 66.715 60.7057 67.335C60.3857 67.945 59.9257 68.4 59.3257 68.7C58.7257 69 58.0007 69.15 57.1507 69.15ZM64.0533 69C63.9533 69 63.8683 68.97 63.7983 68.91C63.7383 68.84 63.7083 68.755 63.7083 68.655V58.86C63.7083 58.75 63.7383 58.665 63.7983 58.605C63.8683 58.535 63.9533 58.5 64.0533 58.5H64.8033C64.9233 58.5 65.0133 58.53 65.0733 58.59C65.1333 58.65 65.1683 58.7 65.1783 58.74L68.3583 64.8L71.5533 58.74C71.5733 58.7 71.6083 58.65 71.6583 58.59C71.7183 58.53 71.8083 58.5 71.9283 58.5H72.6633C72.7733 58.5 72.8583 58.535 72.9183 58.605C72.9883 58.665 73.0233 58.75 73.0233 58.86V68.655C73.0233 68.755 72.9883 68.84 72.9183 68.91C72.8583 68.97 72.7733 69 72.6633 69H71.9283C71.8283 69 71.7433 68.97 71.6733 68.91C71.6133 68.84 71.5833 68.755 71.5833 68.655V61.275L69.0783 66.165C69.0383 66.265 68.9783 66.345 68.8983 66.405C68.8183 66.455 68.7183 66.48 68.5983 66.48H68.1333C68.0033 66.48 67.8983 66.455 67.8183 66.405C67.7483 66.345 67.6883 66.265 67.6383 66.165L65.1333 61.275V68.655C65.1333 68.755 65.0983 68.84 65.0283 68.91C64.9683 68.97 64.8883 69 64.7883 69H64.0533ZM75.9625 69C75.8525 69 75.7675 68.97 75.7075 68.91C75.6475 68.84 75.6175 68.755 75.6175 68.655V58.86C75.6175 58.75 75.6475 58.665 75.7075 58.605C75.7675 58.535 75.8525 58.5 75.9625 58.5H82.1575C82.2675 58.5 82.3525 58.535 82.4125 58.605C82.4725 58.665 82.5025 58.75 82.5025 58.86V59.43C82.5025 59.54 82.4725 59.625 82.4125 59.685C82.3525 59.745 82.2675 59.775 82.1575 59.775H77.0575V63.06H81.8275C81.9375 63.06 82.0225 63.095 82.0825 63.165C82.1425 63.225 82.1725 63.31 82.1725 63.42V63.975C82.1725 64.075 82.1425 64.16 82.0825 64.23C82.0225 64.29 81.9375 64.32 81.8275 64.32H77.0575V67.725H82.2775C82.3875 67.725 82.4725 67.755 82.5325 67.815C82.5925 67.875 82.6225 67.96 82.6225 68.07V68.655C82.6225 68.755 82.5925 68.84 82.5325 68.91C82.4725 68.97 82.3875 69 82.2775 69H75.9625ZM78.4525 57.75C78.2925 57.75 78.2125 57.67 78.2125 57.51C78.2125 57.43 78.2375 57.365 78.2875 57.315L79.4125 55.965C79.5025 55.855 79.5825 55.785 79.6525 55.755C79.7225 55.715 79.8275 55.695 79.9675 55.695H81.0775C81.2675 55.695 81.3625 55.79 81.3625 55.98C81.3625 56.05 81.3375 56.11 81.2875 56.16L79.5475 57.585C79.4675 57.655 79.3925 57.7 79.3225 57.72C79.2525 57.74 79.1625 57.75 79.0525 57.75H78.4525ZM85.0592 69C84.9492 69 84.8642 68.97 84.8042 68.91C84.7442 68.84 84.7142 68.755 84.7142 68.655V58.86C84.7142 58.75 84.7442 58.665 84.8042 58.605C84.8642 58.535 84.9492 58.5 85.0592 58.5H88.7192C89.8492 58.5 90.7442 58.765 91.4042 59.295C92.0642 59.825 92.3942 60.61 92.3942 61.65C92.3942 62.42 92.1992 63.05 91.8092 63.54C91.4292 64.02 90.9092 64.355 90.2492 64.545L92.5592 68.535C92.5892 68.595 92.6042 68.65 92.6042 68.7C92.6042 68.78 92.5692 68.85 92.4992 68.91C92.4392 68.97 92.3692 69 92.2892 69H91.5692C91.3992 69 91.2742 68.955 91.1942 68.865C91.1142 68.775 91.0442 68.685 90.9842 68.595L88.8092 64.785H86.1842V68.655C86.1842 68.755 86.1492 68.84 86.0792 68.91C86.0192 68.97 85.9342 69 85.8242 69H85.0592ZM86.1842 63.51H88.6592C89.4092 63.51 89.9692 63.355 90.3392 63.045C90.7092 62.725 90.8942 62.255 90.8942 61.635C90.8942 61.025 90.7092 60.56 90.3392 60.24C89.9792 59.92 89.4192 59.76 88.6592 59.76H86.1842V63.51ZM98.2936 69.15C97.4436 69.15 96.7136 69.005 96.1036 68.715C95.4936 68.415 95.0236 67.96 94.6936 67.35C94.3636 66.73 94.1786 65.955 94.1386 65.025C94.1286 64.585 94.1236 64.165 94.1236 63.765C94.1236 63.355 94.1286 62.93 94.1386 62.49C94.1786 61.57 94.3686 60.805 94.7086 60.195C95.0586 59.575 95.5386 59.115 96.1486 58.815C96.7686 58.505 97.4836 58.35 98.2936 58.35C99.1136 58.35 99.8286 58.505 100.439 58.815C101.059 59.115 101.544 59.575 101.894 60.195C102.244 60.805 102.434 61.57 102.464 62.49C102.484 62.93 102.494 63.355 102.494 63.765C102.494 64.165 102.484 64.585 102.464 65.025C102.434 65.955 102.249 66.73 101.909 67.35C101.579 67.96 101.109 68.415 100.499 68.715C99.8886 69.005 99.1536 69.15 98.2936 69.15ZM98.2936 67.875C99.0636 67.875 99.6886 67.645 100.169 67.185C100.659 66.725 100.924 65.98 100.964 64.95C100.984 64.5 100.994 64.1 100.994 63.75C100.994 63.39 100.984 62.99 100.964 62.55C100.944 61.86 100.814 61.3 100.574 60.87C100.344 60.44 100.034 60.125 99.6436 59.925C99.2536 59.725 98.8036 59.625 98.2936 59.625C97.8036 59.625 97.3636 59.725 96.9736 59.925C96.5836 60.125 96.2686 60.44 96.0286 60.87C95.7986 61.3 95.6686 61.86 95.6386 62.55C95.6286 62.99 95.6236 63.39 95.6236 63.75C95.6236 64.1 95.6286 64.5 95.6386 64.95C95.6786 65.98 95.9436 66.725 96.4336 67.185C96.9236 67.645 97.5436 67.875 98.2936 67.875ZM108.702 69C108.592 69 108.507 68.97 108.447 68.91C108.387 68.84 108.357 68.755 108.357 68.655V58.86C108.357 58.75 108.387 58.665 108.447 58.605C108.507 58.535 108.592 58.5 108.702 58.5H112.107C113.137 58.5 113.967 58.655 114.597 58.965C115.227 59.275 115.687 59.735 115.977 60.345C116.267 60.945 116.417 61.685 116.427 62.565C116.437 63.015 116.442 63.41 116.442 63.75C116.442 64.09 116.437 64.48 116.427 64.92C116.407 65.84 116.252 66.605 115.962 67.215C115.682 67.815 115.232 68.265 114.612 68.565C114.002 68.855 113.192 69 112.182 69H108.702ZM109.827 67.725H112.107C112.797 67.725 113.347 67.63 113.757 67.44C114.167 67.25 114.462 66.945 114.642 66.525C114.832 66.105 114.932 65.55 114.942 64.86C114.962 64.56 114.972 64.3 114.972 64.08C114.972 63.85 114.972 63.625 114.972 63.405C114.972 63.175 114.962 62.915 114.942 62.625C114.922 61.655 114.692 60.94 114.252 60.48C113.812 60.01 113.072 59.775 112.032 59.775H109.827V67.725ZM119.044 69C118.934 69 118.849 68.97 118.789 68.91C118.729 68.84 118.699 68.755 118.699 68.655V58.86C118.699 58.75 118.729 58.665 118.789 58.605C118.849 58.535 118.934 58.5 119.044 58.5H125.239C125.349 58.5 125.434 58.535 125.494 58.605C125.554 58.665 125.584 58.75 125.584 58.86V59.43C125.584 59.54 125.554 59.625 125.494 59.685C125.434 59.745 125.349 59.775 125.239 59.775H120.139V63.06H124.909C125.019 63.06 125.104 63.095 125.164 63.165C125.224 63.225 125.254 63.31 125.254 63.42V63.975C125.254 64.075 125.224 64.16 125.164 64.23C125.104 64.29 125.019 64.32 124.909 64.32H120.139V67.725H125.359C125.469 67.725 125.554 67.755 125.614 67.815C125.674 67.875 125.704 67.96 125.704 68.07V68.655C125.704 68.755 125.674 68.84 125.614 68.91C125.554 68.97 125.469 69 125.359 69H119.044ZM131.817 69C131.707 69 131.622 68.97 131.562 68.91C131.502 68.84 131.472 68.755 131.472 68.655V58.86C131.472 58.75 131.502 58.665 131.562 58.605C131.622 58.535 131.707 58.5 131.817 58.5H135.627C136.367 58.5 137.007 58.62 137.547 58.86C138.097 59.1 138.522 59.46 138.822 59.94C139.122 60.41 139.272 61 139.272 61.71C139.272 62.42 139.122 63.01 138.822 63.48C138.522 63.95 138.097 64.305 137.547 64.545C137.007 64.785 136.367 64.905 135.627 64.905H132.972V68.655C132.972 68.755 132.937 68.84 132.867 68.91C132.807 68.97 132.722 69 132.612 69H131.817ZM132.957 63.645H135.552C136.292 63.645 136.847 63.48 137.217 63.15C137.587 62.82 137.772 62.34 137.772 61.71C137.772 61.09 137.592 60.61 137.232 60.27C136.872 59.93 136.312 59.76 135.552 59.76H132.957V63.645ZM141.441 69C141.331 69 141.246 68.97 141.186 68.91C141.126 68.84 141.096 68.755 141.096 68.655V58.86C141.096 58.75 141.126 58.665 141.186 58.605C141.246 58.535 141.331 58.5 141.441 58.5H145.101C146.231 58.5 147.126 58.765 147.786 59.295C148.446 59.825 148.776 60.61 148.776 61.65C148.776 62.42 148.581 63.05 148.191 63.54C147.811 64.02 147.291 64.355 146.631 64.545L148.941 68.535C148.971 68.595 148.986 68.65 148.986 68.7C148.986 68.78 148.951 68.85 148.881 68.91C148.821 68.97 148.751 69 148.671 69H147.951C147.781 69 147.656 68.955 147.576 68.865C147.496 68.775 147.426 68.685 147.366 68.595L145.191 64.785H142.566V68.655C142.566 68.755 142.531 68.84 142.461 68.91C142.401 68.97 142.316 69 142.206 69H141.441ZM142.566 63.51H145.041C145.791 63.51 146.351 63.355 146.721 63.045C147.091 62.725 147.276 62.255 147.276 61.635C147.276 61.025 147.091 60.56 146.721 60.24C146.361 59.92 145.801 59.76 145.041 59.76H142.566V63.51ZM151.27 69C151.17 69 151.085 68.97 151.015 68.91C150.955 68.84 150.925 68.755 150.925 68.655V58.86C150.925 58.75 150.955 58.665 151.015 58.605C151.085 58.535 151.17 58.5 151.27 58.5H152.02C152.14 58.5 152.23 58.53 152.29 58.59C152.35 58.65 152.385 58.7 152.395 58.74L155.575 64.8L158.77 58.74C158.79 58.7 158.825 58.65 158.875 58.59C158.935 58.53 159.025 58.5 159.145 58.5H159.88C159.99 58.5 160.075 58.535 160.135 58.605C160.205 58.665 160.24 58.75 160.24 58.86V68.655C160.24 68.755 160.205 68.84 160.135 68.91C160.075 68.97 159.99 69 159.88 69H159.145C159.045 69 158.96 68.97 158.89 68.91C158.83 68.84 158.8 68.755 158.8 68.655V61.275L156.295 66.165C156.255 66.265 156.195 66.345 156.115 66.405C156.035 66.455 155.935 66.48 155.815 66.48H155.35C155.22 66.48 155.115 66.455 155.035 66.405C154.965 66.345 154.905 66.265 154.855 66.165L152.35 61.275V68.655C152.35 68.755 152.315 68.84 152.245 68.91C152.185 68.97 152.105 69 152.005 69H151.27Z" fill="#696C55"/> +</g> +<rect width="93" height="29" transform="translate(0 104.5)" fill="#DADADA"/> +<rect x="39.5" y="116.5" width="14" height="5" fill="#8A8A8A"/> +<rect x="95" y="104" width="15" height="30" fill="#DADADA"/> +<rect width="93" height="30" transform="translate(112 104)" fill="#DADADA"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M161 116.5V112H156V116.5H151.5V121.5H156V126H161V121.5H165.5V116.5H161Z" fill="#8A8A8A"/> +<defs> +<filter id="filter0_ii_115_37752" x="-4" y="-1" width="210" height="107" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset dx="-4" dy="4"/> +<feGaussianBlur stdDeviation="3"/> +<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.35 0"/> +<feBlend mode="normal" in2="shape" result="effect1_innerShadow_115_37752"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset dx="1" dy="-1"/> +<feGaussianBlur stdDeviation="2"/> +<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/> +<feBlend mode="normal" in2="effect1_innerShadow_115_37752" result="effect2_innerShadow_115_37752"/> +</filter> +</defs> +</svg> diff --git a/src/assets/icons/ico/profile.svg b/src/assets/icons/ico/profile.svg index aff18fe54813cc5f5777ce35bf1ecfb93fc533a7..a61d6c5778b01e1eca1dbf6fd1bfadf4c4c15199 100644 --- a/src/assets/icons/ico/profile.svg +++ b/src/assets/icons/ico/profile.svg @@ -1,4 +1,4 @@ -<svg width="42" height="42" viewBox="0 0 42 42" fill="none" xmlns="http://www.w3.org/2000/svg"> +<svg width="38" height="38" viewBox="0 0 38 38" fill="none" xmlns="http://www.w3.org/2000/svg"> <circle cx="18.5" cy="18.5" r="18" stroke="white"/> <circle cx="18.5" cy="13.5" r="5.5" fill="white"/> <path d="M8 26C8 22.4735 9.60771 19.4852 13 19C14.3163 20.1296 16.5 21 18.5 21C22 21 22.5 20 24 19C27.3923 19.4852 29 22.4735 29 26V27C29 27 25 28 18.5 28C12 28 8 27 8 27V26Z" fill="white"/> diff --git a/src/assets/icons/ico/question-mark.svg b/src/assets/icons/ico/question-mark.svg deleted file mode 100644 index f703ce3c3a0ba16c2d0bce26c4c98c89971549c4..0000000000000000000000000000000000000000 --- a/src/assets/icons/ico/question-mark.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="42" height="42" viewBox="0 0 42 42" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M16.5299 15.2345C16.7609 15.0245 17.0129 14.8285 17.2859 14.6465C17.5589 14.4645 17.8529 14.3035 18.1679 14.1635C18.4899 14.0235 18.8364 13.915 19.2074 13.838C19.5854 13.754 19.9914 13.712 20.4254 13.712C21.0064 13.712 21.5384 13.796 22.0214 13.964C22.5114 14.125 22.9314 14.3595 23.2814 14.6675C23.6384 14.9685 23.9149 15.336 24.1109 15.77C24.3069 16.197 24.4049 16.6765 24.4049 17.2085C24.4049 17.7405 24.3279 18.2025 24.1739 18.5945C24.0199 18.9795 23.8239 19.3155 23.5859 19.6025C23.3479 19.8895 23.0889 20.1415 22.8089 20.3585C22.5289 20.5685 22.2629 20.768 22.0109 20.957C21.7659 21.139 21.5524 21.3245 21.3704 21.5135C21.1954 21.6955 21.0904 21.8985 21.0554 22.1225L20.8349 23.6975H19.3019L19.1444 21.965C19.1094 21.636 19.1619 21.3525 19.3019 21.1145C19.4419 20.8765 19.6274 20.6525 19.8584 20.4425C20.0964 20.2325 20.3554 20.033 20.6354 19.844C20.9224 19.648 21.1884 19.431 21.4334 19.193C21.6784 18.955 21.8849 18.689 22.0529 18.395C22.2209 18.101 22.3049 17.7475 22.3049 17.3345C22.3049 17.0615 22.2524 16.8165 22.1474 16.5995C22.0424 16.3755 21.8954 16.1865 21.7064 16.0325C21.5174 15.8785 21.2969 15.7595 21.0449 15.6755C20.7929 15.5915 20.5199 15.5495 20.2259 15.5495C19.8129 15.5495 19.4629 15.5985 19.1759 15.6965C18.8889 15.7945 18.6439 15.903 18.4409 16.022C18.2379 16.134 18.0699 16.239 17.9369 16.337C17.8039 16.428 17.6919 16.4735 17.6009 16.4735C17.3839 16.4735 17.2229 16.379 17.1179 16.19L16.5299 15.2345ZM18.5459 27.698C18.5459 27.495 18.5809 27.306 18.6509 27.131C18.7279 26.949 18.8294 26.7915 18.9554 26.6585C19.0884 26.5255 19.2424 26.4205 19.4174 26.3435C19.5994 26.2665 19.7919 26.228 19.9949 26.228C20.1979 26.228 20.3869 26.2665 20.5619 26.3435C20.7439 26.4205 20.9014 26.5255 21.0344 26.6585C21.1674 26.7915 21.2724 26.949 21.3494 27.131C21.4264 27.306 21.4649 27.495 21.4649 27.698C21.4649 27.908 21.4264 28.1005 21.3494 28.2755C21.2724 28.4505 21.1674 28.6045 21.0344 28.7375C20.9014 28.8705 20.7439 28.972 20.5619 29.042C20.3869 29.119 20.1979 29.1575 19.9949 29.1575C19.7919 29.1575 19.5994 29.119 19.4174 29.042C19.2424 28.972 19.0884 28.8705 18.9554 28.7375C18.8294 28.6045 18.7279 28.4505 18.6509 28.2755C18.5809 28.1005 18.5459 27.908 18.5459 27.698Z" fill="white"/> -<circle cx="20.5" cy="20.5" r="18" stroke="white"/> -</svg> diff --git a/src/assets/icons/ico/questionMark.svg b/src/assets/icons/ico/questionMark.svg index b633290c9775786a543936c2b65803b7203a755e..0f29f2d778e5b4a6b64d8ec24f0d5e2584a948b7 100644 --- a/src/assets/icons/ico/questionMark.svg +++ b/src/assets/icons/ico/questionMark.svg @@ -1,3 +1,4 @@ -<svg width="21" height="41" viewBox="0 0 21 41" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M0 4.09723C0.637168 3.5251 1.31859 2.98987 2.04425 2.49156C2.78761 1.99325 3.58407 1.55953 4.43362 1.19041C5.30088 0.821293 6.23008 0.535225 7.22124 0.33221C8.23008 0.110737 9.30974 0 10.4602 0C12.0531 0 13.4956 0.230701 14.7876 0.692102C16.0797 1.13505 17.1858 1.781 18.1062 2.62998C19.0266 3.4605 19.7345 4.46635 20.2301 5.64754C20.7434 6.82872 21 8.14833 21 9.60635C21 11.009 20.8053 12.2271 20.4159 13.2606C20.0443 14.2757 19.5664 15.1616 18.9823 15.9183C18.4159 16.675 17.7876 17.3302 17.0973 17.8839C16.4071 18.4375 15.7522 18.9543 15.1327 19.4342C14.5133 19.914 13.9734 20.3939 13.5133 20.8737C13.0708 21.3351 12.7965 21.8519 12.6903 22.424L12.0266 26.3829H7.00885L6.50442 21.898C6.38053 21.0122 6.48673 20.2462 6.82301 19.6003C7.15929 18.9359 7.61062 18.336 8.17699 17.8008C8.74337 17.2471 9.37169 16.7211 10.062 16.2228C10.7699 15.7061 11.4248 15.1616 12.0266 14.5895C12.646 13.9989 13.1593 13.3437 13.5664 12.6239C13.9912 11.8857 14.2035 11.0182 14.2035 10.0216C14.2035 8.80351 13.7965 7.83457 12.9823 7.11479C12.1858 6.395 11.1239 6.03511 9.79646 6.03511C8.82301 6.03511 8 6.14585 7.32744 6.36732C6.67257 6.58879 6.10619 6.83795 5.62832 7.11479C5.15044 7.37317 4.74336 7.6131 4.40708 7.83457C4.07079 8.05604 3.75222 8.16678 3.45133 8.16678C2.77876 8.16678 2.27434 7.86226 1.93805 7.25321L0 4.09723ZM4.96461 36.5982C4.96461 35.9892 5.07079 35.4171 5.28318 34.8818C5.51327 34.3282 5.82302 33.8575 6.2124 33.47C6.60178 33.0639 7.05309 32.7502 7.56637 32.5287C8.09734 32.2888 8.67256 32.1688 9.29203 32.1688C9.8938 32.1688 10.4602 32.2888 10.9912 32.5287C11.5221 32.7502 11.9823 33.0639 12.3717 33.47C12.7611 33.8575 13.0619 34.3282 13.2743 34.8818C13.5044 35.4171 13.6195 35.9892 13.6195 36.5982C13.6195 37.2257 13.5044 37.8071 13.2743 38.3423C13.0619 38.8776 12.7611 39.3482 12.3717 39.7542C11.9823 40.1418 11.5221 40.4463 10.9912 40.6678C10.4602 40.8893 9.8938 41 9.29203 41C8.67256 41 8.09734 40.8893 7.56637 40.6678C7.05309 40.4463 6.60178 40.1418 6.2124 39.7542C5.82302 39.3482 5.51327 38.8776 5.28318 38.3423C5.07079 37.8071 4.96461 37.2257 4.96461 36.5982Z" fill="#E3B82A"/> +<svg width="38" height="38" viewBox="0 0 38 38" fill="none" xmlns="http://www.w3.org/2000/svg"> +<circle cx="18.5" cy="18.5" r="18" stroke="white"/> +<path d="M14.4691 13.1925C14.7071 12.9825 14.9661 12.783 15.2461 12.594C15.5331 12.405 15.8411 12.2405 16.1701 12.1005C16.4991 11.9605 16.8561 11.852 17.2411 11.775C17.6261 11.691 18.0426 11.649 18.4906 11.649C19.0996 11.649 19.6526 11.733 20.1496 11.901C20.6536 12.069 21.0841 12.3105 21.4411 12.6255C21.7981 12.9335 22.0746 13.308 22.2706 13.749C22.4666 14.19 22.5646 14.6835 22.5646 15.2295C22.5646 15.7615 22.4876 16.2235 22.3336 16.6155C22.1796 17.0005 21.9836 17.3365 21.7456 17.6235C21.5146 17.9105 21.2626 18.159 20.9896 18.369C20.7166 18.579 20.4576 18.7785 20.2126 18.9675C19.9676 19.1495 19.7541 19.3315 19.5721 19.5135C19.3971 19.6885 19.2921 19.888 19.2571 20.112L19.0156 21.645H17.2411L17.0626 19.9335C17.0556 19.8985 17.0521 19.8705 17.0521 19.8495C17.0521 19.8215 17.0521 19.79 17.0521 19.755C17.0521 19.447 17.1291 19.181 17.2831 18.957C17.4371 18.726 17.6296 18.5125 17.8606 18.3165C18.0916 18.1135 18.3401 17.9175 18.6061 17.7285C18.8721 17.5395 19.1206 17.3365 19.3516 17.1195C19.5826 16.8955 19.7751 16.6435 19.9291 16.3635C20.0831 16.0835 20.1601 15.7545 20.1601 15.3765C20.1601 15.1245 20.1111 14.9005 20.0131 14.7045C19.9221 14.5015 19.7926 14.33 19.6246 14.19C19.4566 14.043 19.2536 13.931 19.0156 13.854C18.7846 13.777 18.5326 13.7385 18.2596 13.7385C17.8606 13.7385 17.5211 13.784 17.2411 13.875C16.9681 13.959 16.7336 14.057 16.5376 14.169C16.3486 14.274 16.1876 14.372 16.0546 14.463C15.9216 14.547 15.8026 14.589 15.6976 14.589C15.4456 14.589 15.2636 14.484 15.1516 14.274L14.4691 13.1925ZM16.4536 25.572C16.4536 25.355 16.4921 25.1485 16.5691 24.9525C16.6531 24.7565 16.7651 24.5885 16.9051 24.4485C17.0521 24.3085 17.2236 24.1965 17.4196 24.1125C17.6156 24.0285 17.8256 23.9865 18.0496 23.9865C18.2666 23.9865 18.4731 24.0285 18.6691 24.1125C18.8651 24.1965 19.0331 24.3085 19.1731 24.4485C19.3131 24.5885 19.4251 24.7565 19.5091 24.9525C19.5931 25.1485 19.6351 25.355 19.6351 25.572C19.6351 25.796 19.5931 26.006 19.5091 26.202C19.4251 26.391 19.3131 26.5555 19.1731 26.6955C19.0331 26.8355 18.8651 26.944 18.6691 27.021C18.4731 27.105 18.2666 27.147 18.0496 27.147C17.8256 27.147 17.6156 27.105 17.4196 27.021C17.2236 26.944 17.0521 26.8355 16.9051 26.6955C16.7651 26.5555 16.6531 26.391 16.5691 26.202C16.4921 26.006 16.4536 25.796 16.4536 25.572Z" fill="white"/> </svg> diff --git a/src/assets/icons/ico/speaker.svg b/src/assets/icons/ico/speaker.svg new file mode 100644 index 0000000000000000000000000000000000000000..f9bdb824845c1b4d4089db53c4992e272c2614d2 --- /dev/null +++ b/src/assets/icons/ico/speaker.svg @@ -0,0 +1,60 @@ +<svg width="101" height="100" viewBox="0 0 101 100" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M51.0755 77.0337L56.5751 80.331L66.2921 67.8887L65.3579 66.2706L61.7573 64.3939L51.0755 77.0337Z" fill="#1A1A1A"/> +<path d="M56.5756 80.3307L66.4066 67.463L69.3233 71.892L60.1456 84.0229L56.5756 80.3307Z" fill="#454545"/> +<path d="M56.1192 82.0323L51.0756 77.0333L56.5752 80.3307L60.1452 84.0229L56.1192 82.0323Z" fill="black"/> +<path d="M59.934 71.1999L64.0822 65.9283L64.5076 66.0423L63.3117 70.5053C63.2099 70.8851 62.8686 71.1515 62.4754 71.158L59.934 71.1999Z" fill="#976D1B"/> +<path d="M72.301 72.6903C69.0043 69.6792 62.326 63.6344 61.9857 63.5432L65.6168 63.6043L76.8745 67.5326L72.301 72.6903Z" fill="#454545"/> +<path d="M74.9144 69.7431C74.9144 69.7431 62.326 63.6344 61.9857 63.5432L65.6168 63.6043L76.8745 67.5326L74.9144 69.7431Z" fill="#1A1A1A"/> +<path d="M69.3228 71.8923L72.3006 72.6902L63.2615 63.8851L60.7091 63.2012L60.4811 64.052L64.8185 66.582L66.0232 68.0023L67.9021 73.7914L69.3228 71.8923Z" fill="#1A1A1A"/> +<path d="M57.7233 69.2404L59.9337 71.2005L64.0819 65.9288L61.3321 64.2801L57.7233 69.2404Z" fill="#E3B82A"/> +<path d="M72.167 72.6663L63.8336 64.333L60.5006 63.667V64.0003L63.8339 66.0003L72.167 72.6663Z" fill="black"/> +<path d="M68.4998 72.9999L69.1665 71.9993L66.1665 67.9999L68.4998 72.9999Z" fill="black"/> +<path d="M63.8173 49.9C59.5995 65.641 46.6575 75.8499 34.9105 72.7023C23.1636 69.5547 17.0599 54.2425 21.2777 38.5015C25.4955 22.7606 38.4375 12.5516 50.1845 15.6992C61.9315 18.8468 68.0351 34.159 63.8173 49.9Z" fill="#454545"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M21.7084 59.259L54.2531 53.2646L58.9294 60.9262C52.9472 70.0504 43.6024 75.0324 34.9116 72.7037C28.7054 71.0407 24.0743 65.9822 21.7084 59.259Z" fill="#606060"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M21.2387 47.1544L48.6391 50.3928L48.8612 52.7329L21.7397 55.4955L21.2387 47.1544Z" fill="#606060"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M46.4195 15.1413L60.7566 47.7126L60.2087 54.8607L29.2964 23.4115C34.1397 18.0462 40.2986 14.9336 46.4195 15.1413Z" fill="#313131"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M64.8063 34.9979L60.7574 47.7132L58.2146 40.1919L50.0264 15.6604C50.0792 15.674 50.132 15.6879 50.1847 15.702C58.0875 17.8196 63.4361 25.4426 64.8063 34.9979Z" fill="#313131"/> +<path d="M86.3184 45.8989L71.7715 40.6333C75.8732 45.7446 75.9107 50.7092 75.4168 52.5526C74.2737 59.5413 68.2549 63.3998 65.3883 64.4555L72.0807 66.7046L79.9353 69.7211L82.148 68.8044C91.447 64.9518 93.6628 52.7817 86.3184 45.8989Z" fill="#E3B82A"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M88.9415 62.7789L74.1628 57.2321L73.5531 57.5841C71.2217 61.4396 67.472 63.6882 65.3882 64.4557L72.0805 66.7048L79.9351 69.7213L82.1479 68.8046C85.2099 67.536 87.5039 65.3655 88.9415 62.7789Z" fill="#976D1B"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M87.5244 47.1748L72.7404 41.9434C73.3513 42.8453 73.8429 43.7344 74.2351 44.594L74.6878 45.0623L89.5605 50.4667C89.055 49.3084 88.3785 48.1994 87.5244 47.1748Z" fill="#FFD752"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M90.0479 51.7581L74.9399 46.412C75.0091 46.6276 75.0722 46.8402 75.1296 47.0496L90.2768 52.5537C90.2087 52.2869 90.1324 52.0216 90.0479 51.7581Z" fill="#FFD752"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M83.8446 67.9677L69.0581 62.418C67.6815 63.4251 66.3553 64.1005 65.388 64.4567L72.0804 66.7058L79.935 69.7223L82.1477 68.8056C82.7426 68.5591 83.3084 68.2787 83.8446 67.9677Z" fill="#5B450C"/> +<path opacity="0.5" d="M90.0872 60.0817C93.0713 50.3207 81.369 44.1074 71.7715 40.6333C75.8732 45.7446 75.9107 50.7092 75.4168 52.5526C74.2737 59.5413 68.2549 63.3998 65.3883 64.4555L72.0807 66.7046L79.9353 69.7211L82.148 68.8044C86.227 67.1145 88.9431 63.8242 90.0872 60.0817Z" fill="url(#paint0_linear_118_40903)"/> +<path d="M72.6224 40.8608C70.5436 39.5439 65.365 36.6365 64.6844 36.4542L62.8525 50.0974L56.6526 63.0262L65.3885 64.4551L65.6081 64.3848C75.5738 61.1976 79.2152 48.9855 72.6224 40.8608Z" fill="#7A7A7A"/> +<path d="M72.6224 40.8609C70.5436 39.544 65.3651 36.6366 64.6844 36.4542L64.5399 38.6952L75.1137 45.1759L74.3369 43.495C73.895 42.5391 73.3176 41.6519 72.6224 40.8609Z" fill="#9F9F9F"/> +<path d="M75.8731 50.8505C73.7943 49.5336 61.8094 44.8025 61.1288 44.6201L59.7833 54.7462L56.6528 63.0261L65.3887 64.455L66.7836 63.8951C72.1407 61.7449 75.7112 56.6208 75.8731 50.8505Z" fill="#444549"/> +<path d="M56.6529 63.0251L65.3888 64.454L65.8391 64.3017C69.414 63.0928 72.3918 60.5635 74.1632 57.2313L59.7834 54.7451L56.6529 63.0251Z" fill="#1A1A1A"/> +<path opacity="0.5" d="M63.8173 49.9C59.5995 65.641 46.6575 75.8499 34.9105 72.7023C23.1636 69.5547 17.0599 54.2425 21.2777 38.5015C25.4955 22.7606 38.4375 12.5516 50.1845 15.6992C61.9315 18.8468 68.0351 34.159 63.8173 49.9Z" fill="url(#paint1_linear_118_40903)"/> +<path d="M55.7186 61.4086L45.5479 50.0205L48.2835 39.811L62.6412 37.275L63.9315 49.4752L55.7186 61.4086Z" fill="#7A7A7A"/> +<path d="M56.3719 60.6718L46.2011 49.2838L46.6876 45.7666L60.976 53.6986L56.3719 60.6718Z" fill="#444549"/> +<path d="M62.2604 47.2037L47.4855 42.7888L47.9415 41.0872L63.2639 38.3538L62.2604 47.2037Z" fill="#9F9F9F"/> +<path d="M63.6277 42.0985L47.485 42.7884L49.1032 41.8541L64.0002 39.0067L63.6277 42.0985Z" fill="#BEBEBE"/> +<path d="M51.1688 46.055C50.4134 48.8743 48.0869 50.7005 45.9725 50.1339C43.858 49.5674 42.7563 46.8226 43.5117 44.0033C44.2671 41.184 46.5936 39.3579 48.7081 39.9244C50.8225 40.491 51.9243 43.2358 51.1688 46.055Z" fill="#444549"/> +<path d="M50.318 45.8271C49.5626 48.6463 47.4266 50.5236 45.5471 50.0199C43.6675 49.5163 42.7563 46.8226 43.5117 44.0033C44.2671 41.184 46.4032 39.3068 48.2827 39.8104C50.1622 40.3141 51.0735 43.0078 50.318 45.8271Z" fill="#BEBEBE"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M50.2166 41.7522C49.8616 41.3288 49.4198 41.027 48.9055 40.8892C47.026 40.3856 44.8899 42.2628 44.1345 45.0821C43.7335 46.5787 43.8022 48.0399 44.236 49.1569C43.2936 48.0328 42.963 46.0512 43.5117 44.0033C44.2671 41.184 46.4032 39.3068 48.2827 39.8104C49.1645 40.0467 49.8331 40.765 50.2166 41.7522Z" fill="#B0B0B0"/> +<path d="M48.4621 47.2646C47.8259 48.2163 46.8549 48.6834 46.2932 48.308C45.7316 47.9325 45.792 46.8567 46.4282 45.905C47.0644 44.9534 48.0354 44.4862 48.597 44.8617C49.1586 45.2371 49.0982 46.313 48.4621 47.2646Z" fill="#DDDDDD"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M50.5509 66.3097C55.2926 62.5694 59.2889 56.5907 61.265 49.2161C63.241 41.8415 62.7694 34.6656 60.5331 29.0555C58.297 23.4458 54.3851 19.5604 49.5006 18.2516C44.6161 16.9428 39.2856 18.3517 34.5442 22.0918C29.8025 25.8322 25.8061 31.8109 23.8301 39.1855C21.8541 46.56 22.3257 53.7359 24.5619 59.346C26.798 64.9557 30.71 68.8412 35.5945 70.1499C40.4789 71.4587 45.8095 70.0498 50.5509 66.3097ZM34.9105 72.7023C46.6575 75.8499 59.5995 65.641 63.8173 49.9C68.0351 34.159 61.9315 18.8468 50.1845 15.6992C38.4375 12.5516 25.4955 22.7606 21.2777 38.5015C17.0599 54.2425 23.1636 69.5547 34.9105 72.7023Z" fill="#BEBEBE"/> +<path d="M23.2458 54.9487C24.0786 58.9145 25.6708 62.347 27.8293 64.9754C30.4393 68.1536 33.7649 70.0305 37.3779 70.5046C41.0047 70.9805 44.9457 70.0442 48.7109 67.6248C51.808 65.6347 54.6387 62.7309 56.9278 59.1429C57.1327 58.8217 57.4563 58.5927 57.8294 58.5158C58.9697 58.2806 59.8494 59.4678 59.2269 60.4516C56.744 64.3754 53.6269 67.6069 50.1394 69.8478C45.9294 72.553 41.3687 73.6933 37.0341 73.1245C32.6994 72.5557 28.7855 70.3034 25.7872 66.6523C23.2961 63.6189 21.5301 59.7332 20.6303 55.3494C20.4014 54.234 21.599 53.4389 22.5814 54.0147C22.9256 54.2165 23.1638 54.5582 23.2458 54.9487Z" fill="#A4A4A4"/> +<path d="M61.9541 46.1162C62.9239 40.6462 62.6035 35.1934 61.0613 30.5094C59.2285 24.9433 55.8534 20.9768 51.7647 19.0753C47.7079 17.1885 42.938 17.3261 38.2498 19.7062C34.2199 21.7521 30.5103 25.3364 27.6978 30.0176C27.5036 30.3408 27.1908 30.5768 26.8244 30.6658C25.6873 30.942 24.7662 29.7751 25.3652 28.7699C28.4021 23.674 32.4818 19.6711 37.0536 17.35C42.375 14.6485 47.9998 14.4101 52.879 16.6793C57.7582 18.9485 61.5585 23.5704 63.5711 29.683C65.335 35.04 65.6203 41.2213 64.4159 47.3248C64.2241 48.2968 62.9655 48.4827 62.4551 47.6336L62.1315 47.0951C61.955 46.8016 61.8943 46.4534 61.9541 46.1162Z" fill="#DDDDDD"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M57.4814 21.1955C58.0013 20.8953 58.6625 20.9887 59.0523 21.4452C60.9792 23.7023 62.519 26.4894 63.5707 29.6835C63.6197 29.8323 63.6676 29.9817 63.7143 30.1318C63.8906 30.6981 63.6388 31.3048 63.1252 31.6014C62.3736 32.0353 61.4162 31.627 61.1544 30.7996C61.1237 30.7027 61.0926 30.6061 61.0609 30.5099C60.1256 27.6695 58.7887 25.2457 57.1603 23.3003C56.6103 22.6432 56.7393 21.6239 57.4814 21.1955Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M55.8881 63.57C56.1633 64.0468 56.1101 64.6472 55.7404 65.0551C54.0298 66.9427 52.1464 68.5593 50.1404 69.8483C46.4965 72.1898 42.5898 73.3589 38.7944 73.2621C38.0827 73.2439 37.5594 72.6169 37.6097 71.9068C37.6623 71.1623 38.323 70.6159 39.0693 70.6241C42.2114 70.6586 45.5247 69.6733 48.7119 67.6253C50.4795 66.4895 52.1602 65.0562 53.7031 63.3678C54.3196 62.6932 55.4311 62.7785 55.8881 63.57Z" fill="#808080"/> +<path opacity="0.35" d="M61.3542 69.3014L59.9112 66.1791L61.3198 64.2969L64.5071 66.0428L63.26 70.6967C63.2069 70.8951 62.9576 70.9597 62.8148 70.812L61.3542 69.3014Z" fill="#5B450C"/> +<path d="M59.0524 72.7881L57.7233 69.2404L59.9337 71.2005L62.714 71.0336L63.5648 71.2615L60.8374 74.6342L59.0524 72.7881Z" fill="black"/> +<line x1="4.37175" y1="30.3351" x2="16.8351" y2="34.1283" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="13.9135" y1="22.9173" x2="19.4173" y2="26.5866" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="9.10617" y1="41.6363" x2="15.4697" y2="40.7272" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="60.681" y1="16.219" x2="61.0524" y2="14.4857" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="64.293" y1="21.2222" x2="70.0555" y2="14.207" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="24.2179" y1="71.8974" x2="23.064" y2="72.282" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="28.5583" y1="73.9936" x2="25.1603" y2="81.2751" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<defs> +<linearGradient id="paint0_linear_118_40903" x1="88.4454" y1="46.4689" x2="67.0899" y2="64.9114" gradientUnits="userSpaceOnUse"> +<stop stop-color="#FFD752"/> +<stop offset="0.714248" stop-color="#5B450C"/> +</linearGradient> +<linearGradient id="paint1_linear_118_40903" x1="38.2734" y1="12.5077" x2="45.9403" y2="77.4815" gradientUnits="userSpaceOnUse"> +<stop stop-color="#25262B"/> +<stop offset="1" stop-color="#60626C"/> +</linearGradient> +</defs> +</svg> diff --git a/src/assets/icons/tabbar/analysis/analysis-off.svg b/src/assets/icons/tabbar/analysis/analysis-off.svg index 32ef11bb2f7f77fee4a99f3938a3a12f57ab2be3..712a7f5204bd1b128cf059a408e50584e9681bb0 100644 --- a/src/assets/icons/tabbar/analysis/analysis-off.svg +++ b/src/assets/icons/tabbar/analysis/analysis-off.svg @@ -3,15 +3,15 @@ <rect fill="white" x="6" y="9" width="16" height="19"/> <path d="M20.0953 10.2014C18.0606 9.80662 15.9559 9.99468 14.0235 10.7439C12.0911 11.4931 10.4097 12.773 9.17301 14.4361C7.93629 16.0993 7.19458 18.0779 7.03334 20.1442C6.8721 22.2105 7.29788 24.2803 8.26163 26.1151L18 21L20.0953 10.2014Z"/> </mask> -<path d="M20.0953 10.2014C18.0606 9.80662 15.9559 9.99468 14.0235 10.7439C12.0911 11.4931 10.4097 12.773 9.17301 14.4361C7.93629 16.0993 7.19458 18.0779 7.03334 20.1442C6.8721 22.2105 7.29788 24.2803 8.26163 26.1151L18 21L20.0953 10.2014Z" stroke="#ABABAB" stroke-width="2" mask="url(#path-1-outside-1_6562:815)"/> +<path d="M20.0953 10.2014C18.0606 9.80662 15.9559 9.99468 14.0235 10.7439C12.0911 11.4931 10.4097 12.773 9.17301 14.4361C7.93629 16.0993 7.19458 18.0779 7.03334 20.1442C6.8721 22.2105 7.29788 24.2803 8.26163 26.1151L18 21L20.0953 10.2014Z" stroke="currentColor" stroke-width="2" mask="url(#path-1-outside-1_6562:815)"/> <mask id="path-2-outside-2_6562:815" maskUnits="userSpaceOnUse" x="6" y="9" width="24" height="24" fill="black"> <rect fill="white" x="6" y="9" width="24" height="24"/> <path d="M20.0953 10.2014C17.2708 9.65336 14.344 10.2338 11.9424 11.8182C9.54076 13.4027 7.85554 15.865 7.24802 18.6773C6.64049 21.4896 7.15902 24.428 8.69243 26.8625C10.2258 29.297 12.6521 31.0338 15.4509 31.7006C18.2498 32.3673 21.1985 31.9109 23.6648 30.4292C26.1311 28.9475 27.9187 26.5585 28.6444 23.7744C29.3701 20.9902 28.976 18.0325 27.5467 15.5355C26.1174 13.0384 23.7666 11.2008 20.9984 10.4165L18 21L20.0953 10.2014Z"/> </mask> -<path d="M20.0953 10.2014C17.2708 9.65336 14.344 10.2338 11.9424 11.8182C9.54076 13.4027 7.85554 15.865 7.24802 18.6773C6.64049 21.4896 7.15902 24.428 8.69243 26.8625C10.2258 29.297 12.6521 31.0338 15.4509 31.7006C18.2498 32.3673 21.1985 31.9109 23.6648 30.4292C26.1311 28.9475 27.9187 26.5585 28.6444 23.7744C29.3701 20.9902 28.976 18.0325 27.5467 15.5355C26.1174 13.0384 23.7666 11.2008 20.9984 10.4165L18 21L20.0953 10.2014Z" stroke="#ABABAB" stroke-width="2" stroke-linejoin="round" mask="url(#path-2-outside-2_6562:815)"/> +<path d="M20.0953 10.2014C17.2708 9.65336 14.344 10.2338 11.9424 11.8182C9.54076 13.4027 7.85554 15.865 7.24802 18.6773C6.64049 21.4896 7.15902 24.428 8.69243 26.8625C10.2258 29.297 12.6521 31.0338 15.4509 31.7006C18.2498 32.3673 21.1985 31.9109 23.6648 30.4292C26.1311 28.9475 27.9187 26.5585 28.6444 23.7744C29.3701 20.9902 28.976 18.0325 27.5467 15.5355C26.1174 13.0384 23.7666 11.2008 20.9984 10.4165L18 21L20.0953 10.2014Z" stroke="currentColor" stroke-width="2" stroke-linejoin="round" mask="url(#path-2-outside-2_6562:815)"/> <mask id="path-3-outside-3_6562:815" maskUnits="userSpaceOnUse" x="6" y="17" width="13" height="11" fill="black"> <rect fill="white" x="6" y="17" width="13" height="11"/> <path d="M8.29428 26.1768C7.09512 23.9285 6.71367 21.3337 7.21507 18.8354L18 21L8.29428 26.1768Z"/> </mask> -<path d="M8.29428 26.1768C7.09512 23.9285 6.71367 21.3337 7.21507 18.8354L18 21L8.29428 26.1768Z" stroke="#ABABAB" stroke-width="2" stroke-linejoin="round" mask="url(#path-3-outside-3_6562:815)"/> +<path d="M8.29428 26.1768C7.09512 23.9285 6.71367 21.3337 7.21507 18.8354L18 21L8.29428 26.1768Z" stroke="currentColor" stroke-width="2" stroke-linejoin="round" mask="url(#path-3-outside-3_6562:815)"/> </svg> diff --git a/src/assets/icons/tabbar/astuces/astuces-off.svg b/src/assets/icons/tabbar/astuces/astuces-off.svg new file mode 100644 index 0000000000000000000000000000000000000000..985d80eeab06f0fe360a4922a44cdcec616aca2b --- /dev/null +++ b/src/assets/icons/tabbar/astuces/astuces-off.svg @@ -0,0 +1,16 @@ +<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> +<mask id="path-1-inside-1_761_1794" fill="white"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M21.824 24.4267C21.824 23.5092 22.3107 22.6783 22.9485 22.0188C24.1459 20.7804 24.8826 19.0939 24.8826 17.2353C24.8826 13.4343 21.8014 10.353 18.0004 10.353C14.1994 10.353 11.1182 13.4343 11.1182 17.2353C11.1182 19.094 11.855 20.7806 13.0525 22.0189C13.6903 22.6785 14.177 23.5093 14.177 24.4268C14.177 25.9453 15.408 27.1763 16.9265 27.1763H19.0743C20.5929 27.1763 21.824 25.9453 21.824 24.4267Z"/> +</mask> +<path d="M22.9485 22.0188L23.6674 22.7139L22.9485 22.0188ZM23.8826 17.2353C23.8826 18.8242 23.2539 20.2643 22.2296 21.3236L23.6674 22.7139C25.0378 21.2966 25.8826 19.3636 25.8826 17.2353H23.8826ZM18.0004 11.353C21.2491 11.353 23.8826 13.9866 23.8826 17.2353H25.8826C25.8826 12.882 22.3536 9.35303 18.0004 9.35303V11.353ZM12.1182 17.2353C12.1182 13.9866 14.7517 11.353 18.0004 11.353V9.35303C13.6472 9.35303 10.1182 12.882 10.1182 17.2353H12.1182ZM13.7713 21.3238C12.7469 20.2644 12.1182 18.8243 12.1182 17.2353H10.1182C10.1182 19.3636 10.9631 21.2967 12.3336 22.7141L13.7713 21.3238ZM19.0743 26.1763H16.9265V28.1763H19.0743V26.1763ZM13.177 24.4268C13.177 26.4976 14.8557 28.1763 16.9265 28.1763V26.1763C15.9603 26.1763 15.177 25.3931 15.177 24.4268H13.177ZM12.3336 22.7141C12.8757 23.2747 13.177 23.8692 13.177 24.4268H15.177C15.177 23.1494 14.5048 22.0823 13.7713 21.3238L12.3336 22.7141ZM19.0743 28.1763C21.1452 28.1763 22.824 26.4976 22.824 24.4267H20.824C20.824 25.393 20.0406 26.1763 19.0743 26.1763V28.1763ZM22.2296 21.3236C21.4961 22.0822 20.824 23.1493 20.824 24.4267H22.824C22.824 23.8691 23.1253 23.2745 23.6674 22.7139L22.2296 21.3236Z" fill="currentColor" mask="url(#path-1-inside-1_761_1794)"/> +<line x1="17.5" y1="8.32324" x2="17.5" y2="5.49978" stroke="currentColor" stroke-linecap="round"/> +<line x1="9.08838" y1="16.9702" x2="6.26491" y2="16.9702" stroke="currentColor" stroke-linecap="round"/> +<line x1="29.7354" y1="16.9702" x2="26.9119" y2="16.9702" stroke="currentColor" stroke-linecap="round"/> +<line x1="12.0522" y1="23.1256" x2="10.0558" y2="25.1221" stroke="currentColor" stroke-linecap="round"/> +<line x1="26.6514" y1="8.52595" x2="24.6549" y2="10.5224" stroke="currentColor" stroke-linecap="round"/> +<line x1="11.3451" y1="10.5225" x2="9.34865" y2="8.52597" stroke="currentColor" stroke-linecap="round"/> +<line x1="25.9443" y1="25.1221" x2="23.9478" y2="23.1256" stroke="currentColor" stroke-linecap="round"/> +<line x1="19.7944" y1="28.4409" x2="16.2063" y2="28.441" stroke="currentColor" stroke-linecap="round"/> +<line x1="19.7944" y1="29.9702" x2="16.2063" y2="29.9703" stroke="currentColor" stroke-linecap="round"/> +<line x1="18.2651" y1="31.5" x2="17.7357" y2="31.4999" stroke="currentColor" stroke-linecap="round"/> +</svg> diff --git a/src/assets/icons/tabbar/astuces/astuces-on.svg b/src/assets/icons/tabbar/astuces/astuces-on.svg new file mode 100644 index 0000000000000000000000000000000000000000..f5d1a6ebf77871405e73a6d3bfb3f7dedbef7ec1 --- /dev/null +++ b/src/assets/icons/tabbar/astuces/astuces-on.svg @@ -0,0 +1,13 @@ +<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M21.824 24.4267C21.824 23.5092 22.3107 22.6783 22.9485 22.0188C24.1459 20.7804 24.8826 19.0939 24.8826 17.2353C24.8826 13.4343 21.8014 10.353 18.0004 10.353C14.1994 10.353 11.1182 13.4343 11.1182 17.2353C11.1182 19.094 11.855 20.7806 13.0525 22.0189C13.6903 22.6785 14.177 23.5093 14.177 24.4268C14.177 25.9453 15.408 27.1763 16.9265 27.1763H19.0743C20.5929 27.1763 21.824 25.9453 21.824 24.4267Z" fill="#E3B82A"/> +<line x1="17.5" y1="8.32324" x2="17.5" y2="5.49978" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="9.08838" y1="16.9702" x2="6.26491" y2="16.9702" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="29.7354" y1="16.9702" x2="26.9119" y2="16.9702" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="12.0522" y1="23.1256" x2="10.0558" y2="25.1221" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="26.6514" y1="8.52595" x2="24.6549" y2="10.5224" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="11.3451" y1="10.5225" x2="9.34865" y2="8.52597" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="25.9443" y1="25.1221" x2="23.9478" y2="23.1256" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="19.7944" y1="28.4409" x2="16.2063" y2="28.441" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="19.7944" y1="29.9702" x2="16.2063" y2="29.9703" stroke="#E3B82A" stroke-linecap="round"/> +<line x1="18.2651" y1="31.5" x2="17.7357" y2="31.4999" stroke="#E3B82A" stroke-linecap="round"/> +</svg> diff --git a/src/assets/icons/tabbar/conso/conso-off.svg b/src/assets/icons/tabbar/conso/conso-off.svg index 6413c7c8b02449f4a838a7cd2a25c0d9865e2803..c94c7c04cce56d2c18b7540ca5b056c2070c4266 100644 --- a/src/assets/icons/tabbar/conso/conso-off.svg +++ b/src/assets/icons/tabbar/conso/conso-off.svg @@ -1,3 +1,3 @@ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M22.5 28.992V29.492H23H27H27.5V28.992V12C27.5 11.6022 27.342 11.2206 27.0607 10.9393C26.7794 10.658 26.3978 10.5 26 10.5H24C23.6022 10.5 23.2206 10.658 22.9393 10.9393C22.658 11.2206 22.5 11.6022 22.5 12V28.992ZM15.5 28.992V29.492H16H20H20.5V28.992V18C20.5 17.6022 20.342 17.2206 20.0607 16.9393C19.7794 16.658 19.3978 16.5 19 16.5H17C16.6022 16.5 16.2206 16.658 15.9393 16.9393C15.658 17.2206 15.5 17.6022 15.5 18V28.992ZM8.5 28.992V29.492H9H13H13.5V28.992V24C13.5 23.6022 13.342 23.2206 13.0607 22.9393C12.7794 22.658 12.3978 22.5 12 22.5H10C9.60217 22.5 9.22064 22.658 8.93934 22.9393C8.65804 23.2206 8.5 23.6022 8.5 24V28.992Z" stroke="#ABABAB"/> +<path d="M22.5 28.992V29.492H23H27H27.5V28.992V12C27.5 11.6022 27.342 11.2206 27.0607 10.9393C26.7794 10.658 26.3978 10.5 26 10.5H24C23.6022 10.5 23.2206 10.658 22.9393 10.9393C22.658 11.2206 22.5 11.6022 22.5 12V28.992ZM15.5 28.992V29.492H16H20H20.5V28.992V18C20.5 17.6022 20.342 17.2206 20.0607 16.9393C19.7794 16.658 19.3978 16.5 19 16.5H17C16.6022 16.5 16.2206 16.658 15.9393 16.9393C15.658 17.2206 15.5 17.6022 15.5 18V28.992ZM8.5 28.992V29.492H9H13H13.5V28.992V24C13.5 23.6022 13.342 23.2206 13.0607 22.9393C12.7794 22.658 12.3978 22.5 12 22.5H10C9.60217 22.5 9.22064 22.658 8.93934 22.9393C8.65804 23.2206 8.5 23.6022 8.5 24V28.992Z" stroke="currentColor"/> </svg> diff --git a/src/assets/icons/tabbar/defi/defi-off.svg b/src/assets/icons/tabbar/defi/defi-off.svg index 2c2c66c1c13cce203c76724e0820d5ef0efc4be1..78b8169ede427745cdc31589b0813157cab1e0ea 100644 --- a/src/assets/icons/tabbar/defi/defi-off.svg +++ b/src/assets/icons/tabbar/defi/defi-off.svg @@ -1,3 +1,3 @@ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M18.3104 29.4627L18.5 29.5404L18.6896 29.4627C22.9601 27.7125 25.0253 25.5476 25.9126 22.8119C26.7071 20.3625 26.5302 17.5035 26.3304 14.2741C26.3126 13.9877 26.2947 13.6983 26.2773 13.406L26.2505 12.957L25.8012 12.9363C23.2157 12.8171 20.9183 11.9841 18.7737 10.5815L18.5 10.4026L18.2263 10.5815C16.0817 11.9841 13.7843 12.8171 11.1988 12.9363L10.7495 12.957L10.7227 13.406C10.7053 13.6983 10.6874 13.9877 10.6696 14.2741C10.4698 17.5035 10.2929 20.3625 11.0874 22.8119C11.9747 25.5476 14.0399 27.7125 18.3104 29.4627Z" stroke="#A0A0A0"/> +<path d="M18.3104 29.4627L18.5 29.5404L18.6896 29.4627C22.9601 27.7125 25.0253 25.5476 25.9126 22.8119C26.7071 20.3625 26.5302 17.5035 26.3304 14.2741C26.3126 13.9877 26.2947 13.6983 26.2773 13.406L26.2505 12.957L25.8012 12.9363C23.2157 12.8171 20.9183 11.9841 18.7737 10.5815L18.5 10.4026L18.2263 10.5815C16.0817 11.9841 13.7843 12.8171 11.1988 12.9363L10.7495 12.957L10.7227 13.406C10.7053 13.6983 10.6874 13.9877 10.6696 14.2741C10.4698 17.5035 10.2929 20.3625 11.0874 22.8119C11.9747 25.5476 14.0399 27.7125 18.3104 29.4627Z" stroke="currentColor"/> </svg> diff --git a/src/assets/icons/tabbar/ecogeste/ecogeste-off.svg b/src/assets/icons/tabbar/ecogeste/ecogeste-off.svg deleted file mode 100644 index 80625ac065c0b8db5e7b7d7be3c307a9b155f594..0000000000000000000000000000000000000000 --- a/src/assets/icons/tabbar/ecogeste/ecogeste-off.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M10.1958 27.1929C10.0042 28.206 9.36381 29.1345 8.58258 30.0887C8.5388 30.1417 8.49458 30.1838 8.42995 30.2428C8.42471 30.2476 8.41928 30.2525 8.41368 30.2576C8.35264 30.3132 8.2711 30.3874 8.18777 30.4814L7.36721 31.4075L8.60079 31.3115C8.82723 31.2939 9.07982 31.2861 9.34866 31.2778C9.47731 31.2739 9.60968 31.2698 9.74469 31.2645C10.1336 31.2492 10.5613 31.2231 10.8778 31.1394C12.0907 30.8187 12.9916 30.2606 14.1581 29.1419L14.1591 29.1409C14.2202 29.082 14.2953 29.0396 14.3774 29.0177C14.4581 28.9962 14.543 28.9952 14.6241 29.0149C15.6848 29.3038 16.8587 29.5 18 29.5C24.3338 29.5 29.5 25.019 29.5 19.5C29.5 13.981 24.3338 9.5 18 9.5C11.6662 9.5 6.5 13.981 6.5 19.5C6.5 22.3519 7.82661 24.9131 10.0244 26.7286C10.0911 26.7846 10.1419 26.8571 10.1719 26.9388C10.2017 27.02 10.2099 27.1076 10.1958 27.1929Z" stroke="#ABABAB"/> -<path d="M14.5 16.5C15.5 15.5 15.6 15 18 15C21 15 21 16.5 21 17.5C21 18.5 21 19.25 19.5 20C17.8324 20.8338 18 21.5 18 23" stroke="#ABABAB"/> -<circle cx="18" cy="25" r="0.5" fill="#C4C4C4"/> -</svg> diff --git a/src/assets/icons/tabbar/ecogeste/ecogeste-on.svg b/src/assets/icons/tabbar/ecogeste/ecogeste-on.svg deleted file mode 100644 index c7ff87db06d18be70cbafc455f349081128406f9..0000000000000000000000000000000000000000 --- a/src/assets/icons/tabbar/ecogeste/ecogeste-on.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M10.1958 27.1929C10.0042 28.206 9.36381 29.1345 8.58258 30.0887C8.5388 30.1417 8.49458 30.1838 8.42995 30.2428C8.42471 30.2476 8.41928 30.2525 8.41368 30.2576C8.35264 30.3132 8.2711 30.3874 8.18777 30.4814L7.36721 31.4075L8.60079 31.3115C8.82723 31.2939 9.07982 31.2861 9.34866 31.2778C9.47731 31.2739 9.60968 31.2698 9.74469 31.2645C10.1336 31.2492 10.5613 31.2231 10.8778 31.1394C12.0907 30.8187 12.9916 30.2606 14.1581 29.1419L14.1591 29.1409C14.2202 29.082 14.2953 29.0396 14.3774 29.0177C14.4581 28.9962 14.543 28.9952 14.6241 29.0149C15.6848 29.3038 16.8587 29.5 18 29.5C24.3338 29.5 29.5 25.019 29.5 19.5C29.5 13.981 24.3338 9.5 18 9.5C11.6662 9.5 6.5 13.981 6.5 19.5C6.5 22.3519 7.82661 24.9131 10.0244 26.7286C10.0911 26.7846 10.1419 26.8571 10.1719 26.9388C10.2017 27.02 10.2099 27.1076 10.1958 27.1929Z" fill="#E3B82A" stroke="#E3B82A"/> -<path d="M14.5 16.5C15.5 15.5 15.6 15 18 15C21 15 21 16.5 21 17.5C21 18.5 21 19.25 19.5 20C17.8324 20.8338 18 21.5 18 23" stroke="#25262B"/> -<circle cx="18" cy="25" r="0.5" fill="#25262B"/> -</svg> diff --git a/src/assets/icons/tabbar/parametre/parametre-off.svg b/src/assets/icons/tabbar/parametre/parametre-off.svg index 106ff4754968736898580475fd8866076406d549..d3556acce91dd95bf9b45d68b7731cde71185c16 100644 --- a/src/assets/icons/tabbar/parametre/parametre-off.svg +++ b/src/assets/icons/tabbar/parametre/parametre-off.svg @@ -1,8 +1,8 @@ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg"> -<line x1="7.5" y1="11.5" x2="28.5" y2="11.5" stroke="#A0A0A0" stroke-linecap="round"/> -<line x1="7.5" y1="18.5" x2="28.5" y2="18.5" stroke="#A0A0A0" stroke-linecap="round"/> -<line x1="7.5" y1="25.5" x2="28.5" y2="25.5" stroke="#A0A0A0" stroke-linecap="round"/> -<circle cx="21.5" cy="11.5" r="2.5" fill="#A0A0A0"/> -<circle cx="13.5" cy="18.5" r="2.5" fill="#A0A0A0"/> -<circle cx="22.5" cy="25.5" r="2.5" fill="#A0A0A0"/> +<line x1="7.5" y1="11.5" x2="28.5" y2="11.5" stroke="currentColor" stroke-linecap="round"/> +<line x1="7.5" y1="18.5" x2="28.5" y2="18.5" stroke="currentColor" stroke-linecap="round"/> +<line x1="7.5" y1="25.5" x2="28.5" y2="25.5" stroke="currentColor" stroke-linecap="round"/> +<circle cx="21.5" cy="11.5" r="2.5" fill="currentColor"/> +<circle cx="13.5" cy="18.5" r="2.5" fill="currentColor"/> +<circle cx="22.5" cy="25.5" r="2.5" fill="currentColor"/> </svg> diff --git a/src/assets/icons/visu/challenge/ecolyo.svg b/src/assets/icons/visu/challenge/ecolyo.svg deleted file mode 100644 index 504f722c6051fd1557b500fc889cec674f6c5af4..0000000000000000000000000000000000000000 --- a/src/assets/icons/visu/challenge/ecolyo.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg width="62" height="62" viewBox="0 0 62 62" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M30.9999 58.3539C57.4593 48.0072 55.4028 33.2974 54.0319 11.3573C45.532 10.9834 37.9918 8.36552 30.9999 4.00244C24.0081 8.36552 16.4679 10.9834 7.96801 11.3573C6.59706 33.2974 4.54064 48.0072 30.9999 58.3539Z" fill="#1B1C22"/> -<path d="M31 0L29.2075 1.11858C22.6524 5.20911 15.6717 7.61771 7.81931 7.96319L4.77457 8.09716L4.58414 11.1446C4.52759 12.0496 4.46881 12.95 4.41037 13.8451C3.78152 23.4778 3.1917 32.5124 5.83816 40.2978C8.88926 49.2736 15.9673 56.1216 29.7672 61.5179L31 62V58.3535C5.57809 48.4124 6.4797 34.4437 7.80541 13.9043C7.85951 13.0662 7.91431 12.2171 7.96806 11.3569C16.4679 10.9829 24.0082 8.36507 31 4.00199V0Z" fill="#FFC600"/> -<path d="M31 0L32.7925 1.11858C39.3476 5.20911 46.3283 7.61771 54.1807 7.96319L57.2254 8.09716L57.4159 11.1446C57.4724 12.0496 57.5312 12.95 57.5896 13.8451C58.2185 23.4778 58.8083 32.5124 56.1618 40.2978C53.1107 49.2736 46.0327 56.1216 32.2328 61.5179L31 62V58.3535C56.4219 48.4124 55.5203 34.4437 54.1946 13.9043C54.1405 13.0662 54.0857 12.2171 54.0319 11.3569C45.5321 10.9829 37.9918 8.36507 31 4.00199V0Z" fill="#DB8300"/> -<path d="M22.639 21.3672H23.8419C24.3222 21.3672 24.783 21.5561 25.1226 21.8925C25.4623 22.2289 25.6532 22.6851 25.6532 23.1608V41.3684H20.8277V23.1608C20.8277 22.6851 21.0185 22.2289 21.3582 21.8925C21.6979 21.5561 22.1586 21.3672 22.639 21.3672ZM30.9965 30.2331H32.1993C32.6797 30.2331 33.1404 30.4221 33.4801 30.7585C33.8198 31.0948 34.0107 31.5511 34.0107 32.0268V41.3684H29.1852V32.0268C29.1852 31.5511 29.376 31.0948 29.7157 30.7585C30.0554 30.4221 30.5161 30.2331 30.9965 30.2331ZM39.8521 26.8035H41.055C41.5353 26.8035 41.9961 26.9925 42.3358 27.3288C42.6754 27.6652 42.8663 28.1214 42.8663 28.5971V41.3684H38.0408V28.5971C38.0408 28.1214 38.2316 27.6652 38.5713 27.3288C38.911 26.9925 39.3717 26.8035 39.8521 26.8035Z" fill="#FFC600"/> -</svg> diff --git a/src/assets/icons/visu/exploration/shield.svg b/src/assets/icons/visu/exploration/shield.svg new file mode 100644 index 0000000000000000000000000000000000000000..b088374f75ea661fb2a7d4b748090e150a73a833 --- /dev/null +++ b/src/assets/icons/visu/exploration/shield.svg @@ -0,0 +1,34 @@ +<svg width="129" height="141" viewBox="0 0 129 141" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g filter="url(#filter0_d_197_40913)"> +<path d="M61.0994 119.566C62.9581 120.335 65.11 120.335 66.9687 119.566C114.606 99.8594 113.654 72.4807 111.107 32.8161C110.845 28.735 107.541 25.5346 103.481 25.0432C90.8337 23.5123 79.2366 19.4496 68.3262 13.2958C65.6652 11.7949 62.4029 11.7949 59.7419 13.2958C48.8315 19.4496 37.2343 23.5123 24.5869 25.0432C20.5271 25.5346 17.2227 28.735 16.9606 32.8161C14.4141 72.4807 13.4625 99.8594 61.0994 119.566Z" fill="url(#paint0_linear_197_40913)"/> +<path d="M66.5864 118.642C64.9725 119.31 63.0955 119.31 61.4817 118.642C37.8261 108.856 26.4167 97.2487 21.1465 83.3214C15.8389 69.2952 16.6819 52.7654 17.9586 32.8802C18.1869 29.3242 21.0794 26.4751 24.7071 26.036C37.497 24.4878 49.2193 20.379 60.2332 14.1668C62.5892 12.8379 65.4788 12.8379 67.8349 14.1668C78.8488 20.379 90.5711 24.4878 103.361 26.036C106.989 26.4751 109.881 29.3242 110.11 32.8802C111.386 52.7654 112.229 69.2952 106.922 83.3214C101.651 97.2487 90.242 108.856 66.5864 118.642Z" stroke="url(#paint1_linear_197_40913)" stroke-width="2"/> +</g> +<path fill-rule="evenodd" clip-rule="evenodd" d="M94.3647 45.4594C96.3077 47.2841 96.4035 50.3383 94.5789 52.2813L64.6651 84.1338C62.9248 85.9868 60.0455 86.1722 58.0819 84.5577L40.6996 70.2649C38.6408 68.572 38.3441 65.5307 40.037 63.4719C41.7298 61.4131 44.7712 61.1165 46.8299 62.8093L60.7223 74.2324L87.5429 45.6735C89.3676 43.7306 92.4218 43.6348 94.3647 45.4594Z" fill="url(#paint2_linear_197_40913)"/> +<defs> +<filter id="filter0_d_197_40913" x="0" y="0.170166" width="128.068" height="139.973" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset dy="4"/> +<feGaussianBlur stdDeviation="8"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.55 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_197_40913"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_197_40913" result="shape"/> +</filter> +<linearGradient id="paint0_linear_197_40913" x1="62.3829" y1="10.7465" x2="62.3829" y2="120.746" gradientUnits="userSpaceOnUse"> +<stop stop-color="#323339"/> +<stop offset="1" stop-color="#25262B"/> +</linearGradient> +<linearGradient id="paint1_linear_197_40913" x1="62.3829" y1="10.7465" x2="62.3829" y2="120.746" gradientUnits="userSpaceOnUse"> +<stop stop-color="#61F0F2"/> +<stop offset="1" stop-color="#48C2C4"/> +</linearGradient> +<linearGradient id="paint2_linear_197_40913" x1="1.29475" y1="34.0164" x2="127.219" y2="111.055" gradientUnits="userSpaceOnUse"> +<stop offset="0.0896365" stop-color="#3E9596"/> +<stop offset="0.283947" stop-color="#16A1A3"/> +<stop offset="0.449352" stop-color="#35DFDF"/> +<stop offset="0.579588" stop-color="#5EFFFF"/> +<stop offset="0.657802" stop-color="#28C7D1"/> +<stop offset="0.828125" stop-color="#016E71"/> +</linearGradient> +</defs> +</svg> diff --git a/src/assets/icons/visu/exploration/validMark.svg b/src/assets/icons/visu/exploration/validMark.svg deleted file mode 100644 index 5b382fc22abc25c3b2fab259d0d6b6246a8c916a..0000000000000000000000000000000000000000 --- a/src/assets/icons/visu/exploration/validMark.svg +++ /dev/null @@ -1,38 +0,0 @@ -<svg width="132" height="146" viewBox="0 0 132 146" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path fill-rule="evenodd" clip-rule="evenodd" d="M62.2415 5.34541L66 3L69.7585 5.34541C83.5031 13.9223 98.1401 18.9726 114.605 19.697L120.989 19.9779L121.388 26.3678C121.507 28.2645 121.63 30.1515 121.752 32.0276L121.752 32.0302C123.071 52.2276 124.308 71.1711 118.759 87.4954C112.361 106.316 97.5201 120.674 68.5848 131.989L66 133L63.4152 131.989C34.4799 120.674 19.6388 106.316 13.2413 87.4954C7.69228 71.1711 8.92899 52.2276 10.2476 32.0302C10.3701 30.1532 10.4933 28.2653 10.6119 26.3678L11.0112 19.9779L17.3953 19.697C33.8599 18.9726 48.4969 13.9223 62.2415 5.34541ZM66 125.354C119.304 104.51 117.414 75.2206 114.634 32.1543C114.52 30.3968 114.405 28.6165 114.293 26.8128C96.4704 26.0287 80.6603 20.5397 66 11.3913C51.3397 20.5397 35.5296 26.0287 17.7072 26.8128C17.5945 28.6165 17.4796 30.3968 17.3662 32.1543C14.5865 75.2206 12.696 104.51 66 125.354Z" fill="url(#paint0_linear)"/> -<g filter="url(#filter0_d)"> -<path d="M64.5171 124.767C65.4503 125.142 66.5494 125.142 67.4826 124.767C119.972 103.678 117.326 74.024 114.521 30.4074C114.39 28.3669 112.742 26.7542 110.703 26.5898C95.1844 25.3381 81.1925 20.4644 68.1317 12.6911C66.8191 11.9099 65.1807 11.9099 63.868 12.6911C50.8073 20.4644 36.8153 25.3381 21.2962 26.5898C19.2581 26.7542 17.6099 28.3669 17.4787 30.4074C14.6734 74.024 12.0274 103.678 64.5171 124.767Z" fill="url(#paint1_linear)"/> -</g> -<path fill-rule="evenodd" clip-rule="evenodd" d="M97.4229 47.3553C99.4358 49.2457 99.5351 52.41 97.6447 54.4229L66.6532 87.4229C64.8503 89.3427 61.8672 89.5348 59.8329 87.8621L41.8244 73.0544C39.6914 71.3005 39.3841 68.1497 41.1379 66.0167C42.8918 63.8838 46.0426 63.5764 48.1756 65.3303L62.5684 77.1649L90.3553 47.5771C92.2457 45.5642 95.41 45.4649 97.4229 47.3553Z" fill="url(#paint2_linear)"/> -<defs> -<filter id="filter0_d" x="0.235382" y="0.10498" width="131.529" height="144.943" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/> -<feOffset dy="4"/> -<feGaussianBlur stdDeviation="8"/> -<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.55 0"/> -<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/> -<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/> -</filter> -<linearGradient id="paint0_linear" x1="-30.002" y1="28.2193" x2="176.244" y2="87.03" gradientUnits="userSpaceOnUse"> -<stop offset="0.0896365" stop-color="#3E9596"/> -<stop offset="0.283947" stop-color="#16A1A3"/> -<stop offset="0.449352" stop-color="#35DFDF"/> -<stop offset="0.579588" stop-color="#5EFFFF"/> -<stop offset="0.657802" stop-color="#28C7D1"/> -<stop offset="0.828125" stop-color="#016E71"/> -</linearGradient> -<linearGradient id="paint1_linear" x1="64.2892" y1="11.3916" x2="64.2892" y2="125.354" gradientUnits="userSpaceOnUse"> -<stop stop-color="#323339"/> -<stop offset="1" stop-color="#25262B"/> -</linearGradient> -<linearGradient id="paint2_linear" x1="0.999993" y1="35.5" x2="131.46" y2="115.314" gradientUnits="userSpaceOnUse"> -<stop offset="0.0896365" stop-color="#3E9596"/> -<stop offset="0.283947" stop-color="#16A1A3"/> -<stop offset="0.449352" stop-color="#35DFDF"/> -<stop offset="0.579588" stop-color="#5EFFFF"/> -<stop offset="0.657802" stop-color="#28C7D1"/> -<stop offset="0.828125" stop-color="#016E71"/> -</linearGradient> -</defs> -</svg> diff --git a/src/assets/png/logos.png b/src/assets/png/logos.png deleted file mode 100644 index 95a0f1d3605958bb883346abf1f4a12b9a8ec9d0..0000000000000000000000000000000000000000 Binary files a/src/assets/png/logos.png and /dev/null differ diff --git a/src/assets/png/logos_partenaires.svg b/src/assets/png/logos_partenaires.svg index dfdac99787a5390231da548bd8b43fd36a54202a..9ada9a882c0073ea6277413af9971ded34999d17 100644 --- a/src/assets/png/logos_partenaires.svg +++ b/src/assets/png/logos_partenaires.svg @@ -1 +1,85 @@ -<svg width="360" height="127" viewBox="0 0 360 127" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M119.906 18.38a6.427 6.427 0 0 1-2.074 1.42 6.748 6.748 0 0 1-5.016.117 6.477 6.477 0 0 1-2.146-1.322c-1.643-1.556-1.67-3.067-1.67-6.922 0-3.855.032-5.368 1.67-6.924a6.397 6.397 0 0 1 2.068-1.299c.772-.3 1.6-.453 2.435-.45 3.164 0 5.592 1.964 6.157 4.983h-1.365c-.535-2.347-2.353-3.832-4.784-3.832a5.006 5.006 0 0 0-1.846.334 4.8 4.8 0 0 0-1.567.984c-1.298 1.231-1.397 2.54-1.397 6.204 0 3.665.101 4.983 1.392 6.202.448.423.98.758 1.566.984a5.01 5.01 0 0 0 1.847.334 5.066 5.066 0 0 0 2.07-.428 4.815 4.815 0 0 0 1.678-1.224c.779-.91 1.084-1.916 1.084-3.376V12.63h-4.835v-1.15h6.2v2.788c0 1.774-.404 3.041-1.467 4.12m12.951-14.094h-5.314v6.899h5.314c2.302 0 3.972-1.102 3.972-3.45 0-2.347-1.67-3.449-3.972-3.449Zm3.946 15.907-4.302-7.857h-4.958V20.2h-1.365V3.15h6.855c2.945 0 5.162 1.604 5.162 4.575 0 2.534-1.62 4.192-4.15 4.6l4.35 7.882-1.592-.007Zm10.829-15.334-3.769 10.037h7.538l-3.769-10.037Zm5.769 15.331-1.569-4.144h-8.4l-1.569 4.144h-1.467l6.628-17.047h1.216l6.628 17.057-1.467-.01Zm16.387 0L159.391 5.371v14.827h-1.365V3.141h1.365l10.397 14.781V3.141h1.368v17.057h-1.368ZM186.306 5.61c-1.036-1.014-2.428-1.316-3.87-1.316h-4.353v14.753h4.35c1.443 0 2.835-.311 3.871-1.317 1.44-1.39 1.338-4.408 1.338-6.299 0-1.89.099-4.43-1.338-5.83l.002.008Zm.959 13.024c-1.071 1.014-2.629 1.557-4.503 1.557h-6.044V3.15h6.047c1.874 0 3.44.552 4.503 1.559 1.823 1.723 1.745 4.43 1.745 6.731 0 2.302.078 5.475-1.745 7.201l-.003-.008Zm5.921 1.564V3.141h3.518v14.087h8.173v2.97h-11.691Zm19.402-6.995v6.995h-3.491v-6.995L203.682 3.14h3.82l3.365 6.878 3.316-6.878h3.818l-5.413 10.062Zm15.631-6.323a2.927 2.927 0 0 0-1.021-.689 3.069 3.069 0 0 0-1.233-.22 3.122 3.122 0 0 0-1.243.22 2.987 2.987 0 0 0-1.035.69c-.683.717-.859 1.52-.859 4.79s.176 4.07.859 4.79a2.98 2.98 0 0 0 1.035.69c.393.157.817.232 1.243.22.423.012.844-.063 1.233-.22a2.93 2.93 0 0 0 1.021-.69c.683-.72.886-1.52.886-4.79s-.2-4.073-.886-4.79Zm2.616 11.596c-1.306 1.2-3.053 1.87-4.871 1.87-1.819 0-3.566-.67-4.871-1.87-1.82-1.723-1.772-3.857-1.772-6.802 0-2.946-.048-5.07 1.772-6.803 1.305-1.199 3.052-1.87 4.871-1.87 1.818 0 3.565.671 4.871 1.87 1.823 1.723 1.796 3.855 1.796 6.803 0 2.947.016 5.079-1.796 6.802Zm16.025 1.722L239.726 9.73v10.468h-3.515V3.141h3.137l7.134 10.444V3.141H250v17.057h-3.14Zm-18.313 5.385h.016a.962.962 0 0 1 .38-.393c.164-.093.352-.14.544-.134.642 0 1.295.253 1.295 1.913 0 .948-.032 2.04-1.338 2.04a1.063 1.063 0 0 1-.506-.118 1 1 0 0 1-.378-.34h-.024v1.822h-.645v-5.241h.653l.003.45Zm1.553 1.386c0-.573 0-1.409-.82-1.409-.819 0-.73 1.054-.73 1.635 0 .507.032 1.31.755 1.31.722 0 .795-.514.795-1.528v-.008Zm-46.503 1.415h-.016a.941.941 0 0 1-.392.476 1.03 1.03 0 0 1-.617.15c-.852 0-1.098-.52-1.098-1.25 0-1.153 1.194-1.204 2.107-1.184.016-.506.024-1.054-.677-1.054a.626.626 0 0 0-.271.04.59.59 0 0 0-.223.15.54.54 0 0 0-.135.488h-.696c.032-.853.508-1.147 1.359-1.147 1.034 0 1.304.507 1.304 1.146v1.83c.003.303.03.605.08.904h-.714l-.011-.55Zm-1.47-.58c0 .367.19.699.627.699.436 0 .891-.233.827-1.463-.618.01-1.454-.04-1.454.766v-.003Zm13.206 1.13v-2.636c0-.385-.113-.737-.638-.737a.79.79 0 0 0-.311.068.75.75 0 0 0-.253.185c-.101.17-.154.363-.153.558v2.56h-.648v-3.009c0-.253-.016-.527-.04-.79h.691v.473h.016a.936.936 0 0 1 .404-.432c.18-.099.39-.14.597-.118.19-.013.38.026.546.113a.96.96 0 0 1 .394.376.93.93 0 0 1 .398-.384c.17-.087.364-.124.557-.105.423 0 1.098.091 1.098.986v2.892h-.653v-2.636c0-.385-.11-.737-.637-.737a.621.621 0 0 0-.493.142.952.952 0 0 0-.222.669v2.56l-.653.002Zm7.409-1.704c0 1.063.303 1.268.803 1.268.445 0 .678-.34.699-.723h.715c0 .845-.557 1.227-1.4 1.227-.844 0-1.526-.253-1.526-1.921 0-1.115.134-2.028 1.526-2.028 1.145 0 1.432.596 1.432 1.853v.325h-2.249Zm1.566-.466c0-1.107-.326-1.242-.803-1.242-.412 0-.755.188-.763 1.242h1.566Zm.161-3.27-1.042 1.063h-.535l.709-1.062h.868Zm4.951 1.638v-.73l.653-.279v1.014h.875v.466h-.875v2.327c0 .253 0 .55.597.55.048 0 .15-.015.294-.03v.474c-.214.015-.431.06-.645.06-.621 0-.899-.253-.899-.676v-2.71h-.659v-.466h.659Zm6.4.578h.025c.267-.58.605-.646 1.239-.646v.64l-.174-.022a1.231 1.231 0 0 0-.174-.015c-.723 0-.908.52-.908 1.031v2.246h-.653v-3.802h.653l-.008.568Zm4.973 1.378c0-1.115.134-2.027 1.526-2.027s1.526.92 1.526 2.027c0 1.68-.678 1.921-1.526 1.921-.849 0-1.526-.24-1.526-1.92Zm2.369-.253c0-1.04-.343-1.268-.843-1.268-.501 0-.843.226-.843 1.268 0 1.234.168 1.68.843 1.68.674 0 .846-.456.846-1.69l-.003.01Zm11.608.253c0-1.115.134-2.027 1.526-2.027s1.528.92 1.528 2.027c0 1.68-.677 1.921-1.528 1.921s-1.526-.24-1.526-1.92Zm2.369-.253c0-1.04-.342-1.268-.843-1.268-.501 0-.843.226-.843 1.268 0 1.234.166 1.68.843 1.68.677 0 .846-.456.846-1.69l-.003.01Zm5.565 2.099h-.653v-5.437h.651l.002 5.437Zm4.813-1.704c0 1.062.303 1.268.803 1.268.444 0 .677-.34.699-.723h.715c0 .844-.557 1.227-1.401 1.227-.843 0-1.525-.253-1.525-1.921 0-1.115.133-2.028 1.525-2.028 1.146 0 1.433.596 1.433 1.853v.324h-2.249Zm1.566-.466c0-1.108-.327-1.242-.803-1.242-.412 0-.755.188-.763 1.242h1.566Zm-71.357 2.17h-.653v-5.437h.653v5.437ZM55.645 115.375c.248 0 .455.165.331.621l-1.118.248c.207-.455.539-.869.787-.869Zm.62 1.821h-.206c-.29.331-.58.58-.87.58-.29 0-.455-.166-.455-.58 0-.166 0-.331.042-.497l1.78-.579c.33-.828-.083-1.201-.58-1.201-.828 0-1.821 1.408-1.821 2.65 0 .538.248.869.662.869.538 0 1.035-.497 1.449-1.242Zm-.372-2.608 1.242-1.159v-.124h-.662l-.787 1.325h.207v-.042Zm-3.85.828h.58l-.952 2.567c-.083.206.041.455.248.455.539 0 1.408-.538 1.698-1.242h-.166c-.248.248-.704.58-1.076.662l.869-2.401h.87l.123-.372h-.869l.331-.911h-.33l-.622.911-.745.083v.248h.042Zm-.786-.124c.083-.248-.083-.373-.207-.373-.497 0-1.118.456-1.366 1.118h.166c.165-.248.455-.497.703-.538l-.993 2.566c-.083.249.083.373.207.373.497 0 1.076-.455 1.325-1.118h-.166c-.166.249-.455.497-.704.538l1.035-2.566Zm.166-1.283a.415.415 0 0 0 0-.828.415.415 0 0 0 0 .828Zm-5.671 3.932c-.125.29 0 .497.29.497.165 0 .248-.042.33-.249l.704-1.821c.331-.372.952-.786 1.242-.786.207 0 .166.165.041.372l-1.034 2.029c-.083.206.041.455.248.455.497 0 1.118-.455 1.366-1.118h-.166c-.165.249-.455.497-.703.538l.91-1.821c.125-.248.166-.455.166-.621 0-.29-.166-.497-.497-.497-.455 0-.91.497-1.449 1.118v-.497c0-.331-.124-.662-.414-.662-.206 0-.372.166-.538.414v.083c.332 0 .497.496.249.993l-.745 1.573Zm0-2.235c.124-.414.041-.787-.249-.787-.372 0-.496.29-.869 1.118v-.497c0-.331-.124-.662-.414-.662-.373 0-.704.579-.952 1.118h.166c.165-.249.33-.414.455-.414.165 0 .248.248 0 .786l-.704 1.532c-.124.289 0 .496.29.496.166 0 .248-.041.331-.248l.704-1.821c.207-.249.372-.456.58-.663h.662v.042Zm-3.974-.331c.248 0 .455.165.33.621l-1.117.248c.207-.455.538-.869.787-.869Zm.62 1.821h-.206c-.29.331-.58.58-.87.58-.29 0-.455-.166-.455-.58 0-.166 0-.331.041-.497l1.78-.579c.332-.828-.082-1.201-.58-1.201-.827 0-1.82 1.408-1.82 2.65 0 .538.248.869.662.869.538 0 1.035-.497 1.449-1.242Zm-4.222-1.78h.58l-.952 2.567c-.083.206.041.455.248.455.538 0 1.408-.538 1.697-1.242h-.165c-.248.248-.704.58-1.076.662l.869-2.401h.87l.123-.372h-.869l.331-.911h-.33l-.622.911-.745.083v.248h.041Zm-3.27 1.987c0-.786.87-1.863 1.366-1.863.125 0 .207 0 .29.042l-.497 1.366c-.29.372-.745.786-.952.786-.124.042-.207-.083-.207-.331Zm2.732-2.649h-.29l-.29.29h-.082c-1.49 0-2.732 1.655-2.732 2.856 0 .331.207.538.538.538.373 0 .745-.538 1.16-1.118v.207c-.042.58.123.911.455.911.372 0 .703-.58.952-1.118h-.166c-.166.249-.331.414-.455.414-.125 0-.249-.248 0-.786l.91-2.194Zm-3.146.952c.125-.414.042-.787-.248-.787-.373 0-.497.29-.87 1.118v-.497c0-.331-.123-.662-.413-.662-.373 0-.704.579-.952 1.118h.165c.166-.249.331-.414.456-.414.165 0 .248.248 0 .786l-.704 1.532c-.124.289 0 .496.29.496.165 0 .248-.041.33-.248l.705-1.821c.207-.249.372-.456.58-.663h.661v.042Zm-4.926 2.566.083-.207c-.869-.165-.952-.165-.62-1.076l.33-.952h.952c.415 0 .415.166.373.621h.248l.58-1.573h-.248c-.207.372-.373.621-.828.621h-.952l.496-1.366c.166-.414.249-.538.828-.538h.414c.58 0 .662.165.662.786h.249l.207-1.076h-3.56l-.083.207c.704.124.745.207.414 1.076l-.786 2.111c-.331.87-.456.952-1.242 1.077l-.042.206h2.525v.083Zm17.427-10.928c.249 0 .456.166.332.621l-1.118.248c.207-.496.538-.869.786-.869Zm.621 1.78h-.207c-.29.331-.58.58-.869.58-.29 0-.455-.166-.455-.58 0-.165 0-.331.041-.497l1.78-.579c.331-.828-.083-1.201-.58-1.201-.827 0-1.82 1.408-1.82 2.65 0 .538.248.869.662.869.538 0 1.034-.455 1.448-1.242Zm-.33-2.608 1.241-1.159v-.124h-.662l-.787 1.325h.207v-.042Zm-3.85.828h.58l-.953 2.567c-.083.207.041.455.248.455.538 0 1.408-.538 1.698-1.242h-.166c-.248.249-.704.58-1.076.662l.869-2.4h.87l.123-.373h-.869l.331-.911h-.33l-.622.911-.745.083v.248h.041Zm-.828-.124c.082-.248-.083-.373-.207-.373-.497 0-1.118.456-1.366 1.118h.165c.166-.248.456-.497.704-.538l-.994 2.566c-.082.249.083.373.207.373.497 0 1.077-.455 1.325-1.118h-.165c-.166.249-.456.497-.704.538l1.035-2.566Zm.207-1.283a.415.415 0 0 0 0-.828.415.415 0 0 0-.414.414c-.042.248.165.414.414.414Zm-3.436 3.849 1.78-4.719-.041-.082-1.118.124v.124l.207.166c.207.165.124.289-.042.786l-1.407 3.684c-.083.207.041.456.248.456.497 0 1.077-.456 1.325-1.118h-.166c-.165.29-.538.538-.786.579Zm-3.436-.414c0-.786.87-1.862 1.366-1.862.124 0 .207 0 .29.041l-.497 1.366c-.29.373-.745.787-.952.787-.124 0-.207-.125-.207-.332Zm2.732-2.649h-.29l-.29.29h-.082c-1.49 0-2.732 1.656-2.732 2.856 0 .331.207.538.538.538.373 0 .745-.538 1.159-1.117v.207c-.041.579.124.91.455.91.373 0 .704-.579.952-1.117h-.165c-.166.248-.331.414-.456.414-.124 0-.248-.249 0-.787l.911-2.194Zm-6.581 4.264c0-.331.33-.538.786-.745.166.083.373.165.704.248.496.166.662.207.662.373 0 .331-.538.538-1.283.538-.58.041-.87-.083-.87-.414Zm1.324-2.07c-.207 0-.29-.165-.29-.372 0-.58.29-1.408.787-1.408.207 0 .29.166.29.373.041.538-.29 1.407-.787 1.407Zm1.408 1.739c0-.414-.373-.58-.953-.745-.496-.166-.745-.207-.745-.373 0-.124.125-.29.332-.414.827-.041 1.407-.786 1.407-1.449 0-.124-.041-.248-.083-.372h.704l.124-.373h-1.118a.833.833 0 0 0-.455-.124c-.91 0-1.49.787-1.49 1.407 0 .497.29.787.704.87-.414.207-.663.414-.663.662 0 .166.042.248.166.331-.952.29-1.366.621-1.366 1.076 0 .456.58.621 1.283.621 1.16.083 2.153-.579 2.153-1.117Zm-4.512-2.732c.413 0 .413.165.372.621h.248l.58-1.573h-.248c-.207.372-.373.621-.828.621h-.952l.455-1.284c.166-.414.248-.496.828-.496h.414c.58 0 .662.165.662.745h.249l.206-1.077h-3.56l-.082.207c.704.125.745.207.414 1.077l-.787 2.111c-.33.869-.455.952-1.242 1.076l-.041.207h3.974l.704-1.118h-.249c-.455.414-1.035.828-1.821.828-1.035 0-.952-.041-.621-.993l.373-1.035h.951v.083Zm.538-2.732 1.242-.87v-.124h-.746l-.703.994h.207Zm15.73-5.92c.248 0 .455.166.33.621l-1.117.249c.207-.497.538-.87.787-.87Zm.62 1.78h-.207c-.29.331-.58.58-.869.58-.29 0-.455-.166-.455-.58 0-.165 0-.331.041-.496l1.78-.58c.331-.828-.083-1.2-.58-1.2-.827 0-1.82 1.407-1.82 2.649 0 .538.248.869.662.869.538 0 1.034-.455 1.448-1.242Zm-.33-2.608 1.241-1.159v-.124h-.662l-.787 1.325h.207v-.042Zm-3.726.828h.455l-.952 2.567c-.083.207.041.455.248.455.538 0 1.408-.538 1.698-1.242h-.166c-.248.249-.704.58-1.076.663l.869-2.401h.87l.123-.373h-.869l.331-.91h-.33l-.622.91-.62.083v.248h.04Zm-.456.29c.125-.414.042-.786-.248-.786-.372 0-.497.29-.87 1.117v-.496c0-.332-.123-.663-.413-.663-.373 0-.704.58-.952 1.118h.165c.166-.249.332-.414.456-.414.165 0 .248.248 0 .786l-.704 1.532c-.124.29 0 .497.29.497.165 0 .248-.042.33-.249l.705-1.821c.207-.248.372-.455.58-.662h.661v.041Zm-3.973-.29c.248 0 .455.166.33.621l-1.117.249c.207-.497.538-.87.787-.87Zm.62 1.78h-.206c-.29.331-.58.58-.87.58-.29 0-.455-.166-.455-.58 0-.165 0-.331.041-.496l1.78-.58c.331-.828-.083-1.2-.58-1.2-.827 0-1.82 1.407-1.82 2.649 0 .538.248.869.662.869.538 0 1.035-.455 1.449-1.242Zm-4.387.745c-.166 0-.414-.165-.414-.289 0-.042.083-.249.165-.497l.29-.787c.29-.372.787-.745 1.035-.745.166 0 .29.083.29.331.041.704-.621 1.987-1.366 1.987Zm2.07-2.276c0-.538-.208-.704-.539-.704-.455 0-.869.497-1.283 1.076l1.076-2.815-.041-.082-1.118.124v.124l.207.165c.207.166.124.332-.041.787l-1.16 2.98c-.082.207-.206.497-.206.539 0 .289.414.579.786.579.828 0 2.318-1.573 2.318-2.773Zm-3.52-.373c.084-.248-.082-.372-.206-.372-.497 0-1.118.455-1.366 1.117h.166c.165-.248.455-.496.703-.538l-.993 2.567c-.083.248.082.372.207.372.496 0 1.076-.455 1.324-1.118h-.165c-.166.249-.456.497-.704.539l1.035-2.567Zm.166-1.283a.415.415 0 1 0-.414-.414c0 .248.166.414.414.414Zm-2.607-.414h-2.36l-.083.207c.704.124.745.207.414 1.076l-.745 2.111c-.33.87-.455.952-1.242 1.077l-.041.206h3.601l.787-1.366h-.29c-.455.497-.952 1.077-1.738 1.077-.58 0-.663-.083-.332-.994l.745-2.11c.332-.87.456-.953 1.242-1.077l.042-.207Zm-4.016-19.29v-8.527h2.815c.952 0 1.656.248 2.236.704.538.455.828 1.076.828 1.862 0 .787-.29 1.408-.828 1.863-.538.455-1.284.704-2.236.704H28.78v3.435h-1.739v-.041Zm2.857-7.078h-1.16v2.152h1.16c.372 0 .662-.083.869-.29a1.06 1.06 0 0 0 .331-.786c0-.331-.124-.58-.331-.787a1.367 1.367 0 0 0-.87-.29Zm4.387 7.078v-8.527h2.608c.952 0 1.697.248 2.236.704.538.455.828 1.076.828 1.862 0 .497-.125.952-.373 1.325a2.53 2.53 0 0 1-.994.87l2.691 3.766h-2.07l-2.276-3.436h-.91v3.436h-1.74Zm2.733-7.078h-.994v2.152h.993c.373 0 .663-.083.87-.29.207-.207.29-.455.29-.786s-.083-.58-.29-.787a1.367 1.367 0 0 0-.87-.29Zm5.34 7.078v-8.527h4.967v1.49h-3.229v1.987h2.773v1.49h-2.773v2.153h3.229v1.49h-4.968v-.083Zm6.995 0v-8.527h2.194l2.07 3.518 2.07-3.518h2.193v8.568h-1.738v-6.126l-1.946 3.146h-1.242l-1.904-3.146v6.085h-1.697Zm10.887 0v-8.527h1.738v8.568H60.24v-.041Zm4.098 0v-8.527h4.967v1.49h-3.229v1.987h2.774v1.49h-2.774v2.153h3.23v1.49h-4.968v-.083Zm6.995 0v-8.527h2.608c.952 0 1.697.248 2.236.704.538.455.827 1.076.827 1.862 0 .497-.124.952-.372 1.325a2.53 2.53 0 0 1-.994.87l2.691 3.766h-2.07l-2.276-3.436h-.911v3.436h-1.739Zm2.732-7.078h-.993v2.152h.993c.373 0 .663-.083.87-.29.207-.207.29-.455.29-.786s-.083-.58-.29-.787a1.367 1.367 0 0 0-.87-.29ZM27.042 91.076v-8.569h2.193l2.07 3.519 2.07-3.519h2.194v8.569H33.83v-6.085l-1.904 3.146h-1.2l-1.904-3.146v6.085h-1.78Zm10.845 0v-8.569h1.738v8.569h-1.738Zm4.14 0v-8.569h2.234l3.809 6.127v-6.127h1.738v8.569h-2.235l-3.808-6.126v6.126h-1.739Zm10.182 0v-8.569h1.739v8.569h-1.739Zm3.353-1.159 1.242-1.159c.248.331.538.58.87.786.33.207.662.29 1.034.29.331 0 .621-.083.787-.248.207-.166.29-.414.29-.745 0-.373-.208-.663-.621-.87-.415-.207-.87-.413-1.325-.662-.497-.248-.952-.538-1.325-.91-.372-.373-.62-.911-.62-1.615 0-.331.082-.662.206-.952.124-.29.331-.58.58-.786.248-.207.538-.414.87-.539a3.16 3.16 0 0 1 1.117-.207c.62 0 1.2.125 1.697.414.497.249.91.621 1.283 1.035l-1.283 1.118c-.248-.331-.538-.58-.787-.787a1.49 1.49 0 0 0-.91-.29c-.29 0-.538.083-.704.249a.843.843 0 0 0-.248.62c0 .373.207.663.62.87.414.207.87.414 1.325.663.497.248.952.538 1.325.91.414.373.62.91.62 1.656 0 .414-.082.745-.248 1.076-.165.331-.372.58-.62.787a2.731 2.731 0 0 1-.911.496c-.331.125-.704.166-1.118.166-.704 0-1.325-.124-1.863-.373-.455-.206-.91-.58-1.283-.993Zm6.872-5.795v-1.573h6.995v1.573H66.78v6.954h-1.739v-6.954h-2.607Zm8.568 6.954v-8.569h2.608c.952 0 1.697.249 2.235.704.538.456.828 1.076.828 1.863 0 .497-.124.952-.372 1.325a2.53 2.53 0 0 1-.994.869l2.69 3.767h-2.069l-2.276-3.436h-.911v3.436h-1.739v.041Zm2.69-7.078H72.7v2.152h.994c.372 0 .662-.083.87-.29.206-.207.289-.455.289-.786s-.083-.58-.29-.787a1.366 1.366 0 0 0-.87-.29Zm5.34 7.078v-8.569H84v1.49h-3.229v1.987h2.774v1.49H80.77v2.153H84v1.49h-4.968v-.041ZM40.37 62.349c.125-.124.249-.249.373-.414.248-.249.455-.538.745-.745.083-.083.166-.124.248-.207.042-.042.042-.083.042-.083-.124.041-.166.124-.29.166-.041 0-.041-.042-.041-.042.082-.041.165-.124.248-.166-.041 0-.041-.04-.041-.04-.29 0-.497.165-.704.372-.041.041-.083-.042-.124-.042-.331.124-.58.414-.91.538v-.041c-.125.041-.25.124-.415.166-.207.041-.372.041-.538.041-.248.041-.538.083-.786.124h-.042c-.124.041-.29.083-.414.166l-.041.041c-.042.041-.083.083-.166.124-.124.083-.248.207-.372.29H37.1a2.7 2.7 0 0 1-.372.331h-.083v-.041c0-.042.041-.083.041-.083.042-.041.042-.083.083-.083.042-.041.042-.083.083-.124v-.041h-.041a2.27 2.27 0 0 1 .372-.29s-.041 0-.041-.041l.041-.042c.041 0 0 .041 0 .041-.041.042-.083.166-.166.125h-.082v-.042s0-.041.041-.041v-.041s0-.042.041-.042v-.041c.042-.042.083-.083.166-.125.083-.04.166-.082.248-.124l.042-.041a1.467 1.467 0 0 0-.373.166h-.082c.04-.042.082-.083.124-.125.041 0 .041 0 .041.042.704-.538 1.697-.414 2.525-.704.083-.041.124-.083.207-.124.124-.041.207-.166.331-.207.166-.124.29-.29.373-.497 0-.041-.042-.041-.042-.041-.29.33-.62.538-.993.745-.455.248-.994.207-1.449.248.042-.041.083-.041.124-.041 0-.083.042-.083.083-.124h.083c.041 0 .041-.042.041-.042.042 0 .124-.041.083-.041-.083-.083-.207.083-.331 0 .041-.041.041-.124.083-.124h.082c0-.042.042-.083.042-.083.331-.207.662-.373.952-.538-.083 0-.124.082-.166.041.042 0 0-.083.042-.083.248-.082.455-.207.703-.29-.082 0-.165.083-.248 0 .042-.04.083-.082.124-.082v-.083c0-.041.042-.041.042-.041-.042 0-.042-.042-.042-.042.042-.041.083-.041.124-.082-.04 0-.082 0-.082-.042a.376.376 0 0 1 .29-.124c-.042-.041-.083 0-.083-.041 0-.042.041-.042.041-.042-.041-.041-.041-.083-.041-.083.124-.165.124-.372.207-.538-.042 0-.042 0-.042-.041-.207.248-.58.33-.91.414h-.125a.402.402 0 0 1-.372-.042c-.083-.041-.124-.124-.207-.165a1.57 1.57 0 0 0-.538-.249 6.237 6.237 0 0 0-1.697-.248c.248-.124.496-.124.786-.207.373-.124.745-.248 1.118-.207-.083-.041-.166 0-.207 0-.331-.041-.621.083-.952.124-.207.042-.414.124-.663.166-.124.041-.207.165-.372.165v-.082c.207-.249.497-.538.828-.538.414-.083.786 0 1.159.04.29.042.538.084.828.166.124 0 .124.166.207.207.124.042.248 0 .414.083 0-.041-.042-.083 0-.124.082-.083.207.041.29-.041.165-.124-.166-.29-.249-.456 0-.041.041-.041.041-.041.166.166.29.331.538.455.125.042.373.124.332-.041-.124-.248-.331-.456-.497-.662v-.083c-.041 0-.041-.042-.083-.042v-.124c-.083-.041-.083-.124-.124-.207-.083-.124-.041-.248-.083-.414 0-.083 0-.207-.041-.33-.083-.373-.166-.705-.207-1.077-.042-.414.248-.745.455-1.118.166-.248.331-.538.621-.703.083-.249.248-.497.414-.704.166-.207.455-.331.704-.456.29-.124.58-.206.58-.206H27.04v11.714h10.763c.414-.29.828-.455 1.449-.745.248-.124.91-.414 1.117-.662Zm-3.435-1.573c-.042 0-.124.041-.124-.042.041-.124.165-.124.248-.165.041-.042.124-.083.166-.042.04.083.124.042.165.083-.124.166-.29.124-.455.166Zm-3.395-.497-.041-.041c.29-.373.497-.745.704-1.118.29-.166.538-.373.745-.621a4.69 4.69 0 0 1 1.242-.993c.165-.083.414-.042.58.04-.084.084-.166.084-.25.125-.04 0-.04 0-.082-.041.041-.042.041-.042.041-.083-.207.248-.538.373-.703.662-.125.207-.207.497-.497.58-.083.041.041-.083-.041-.042-.663.456-1.16.952-1.698 1.532Zm1.863-1.449-.083.083c-.041.041-.041.083-.082.083-.042 0-.042 0-.042-.042.042-.082.083-.165.166-.207.041.042.041.042.041.083Zm1.035 3.312c0 .041-.041.041-.041.082.041 0 .041 0 .041.042-.041.041-.083.083-.166.124h-.041l-.083.083c-.041.041-.165 0-.124-.041l.166-.166c.041-.041.082-.041.082-.083l.042-.041c0-.042.124-.042.124 0Zm-.414-.166c-.083.083-.166.124-.248.166-.083.041-.207.082-.29.124h-.041a.904.904 0 0 0-.207.166l-.042.04-.041.042-.042.042s0 .041-.041.041h-.124l-.083.083-.124.124v.041-.041l.083-.083.041-.041.041-.042c.042-.04.042-.082.083-.082l.042-.042s0-.041.041-.041c0 0 0-.041.041-.041v-.083c.042-.042.042-.083.083-.124-.041 0-.041.04-.083.082-.041 0-.082 0-.041-.041l.041-.041.125-.125c.041 0 .041-.041.082-.041l.042-.041c.207-.207.58-.207.869-.332.124-.041.248.042.373 0a.37.37 0 0 1 .207.042c-.414 0-.58.124-.787.248Zm.455-1.532c-.041-.04.083 0 .083-.04h-.165c-.042 0-.042-.042-.042-.042a1.208 1.208 0 0 1-.372.082c-.166.042-.29.166-.456.207-.248.083-.455.29-.703.373-.042 0-.042-.041-.042-.041.042-.083.124-.083.166-.166 0-.041 0-.041-.042-.041.166-.249.414-.373.663-.58v-.083c.082-.082.165-.124.207-.248a.498.498 0 0 1 .207-.207c-.042-.041-.083-.041-.083-.083-.083 0-.166.042-.248-.041.04-.041.082-.083.124-.083 0 0-.042 0-.042-.041-.041-.042.042-.083.124-.124.083-.042.208-.042.249-.083-.166-.042-.331.041-.497-.042.124-.29.29-.538.538-.662.042 0 .083 0 .083.041 0 .125-.083.207-.166.207.166.042.373.042.539.125-.042.041-.083.041-.083.041.124.083.248.041.372.124-.082.083-.124 0-.207 0 .704.207 1.408.373 1.987.787-.496.248-.993.372-1.531.455-.083 0-.125 0-.166-.041 0 .041 0 .082-.041.082-.083 0-.166 0-.207.042-.042.124-.166.124-.249.082ZM59.288 52H46.663s.04 0 .124.041l.33.166c.166.083.332.207.415.373.041.082.124.206.083.29-.042.123-.083.289-.166.33-.124.083-.29.083-.455.042-.083 0-.166-.042-.249-.042.331.125.663.29.87.58a.316.316 0 0 0 .206.083c.042 0 .042.041.042.083-.041.04-.083.082-.083.124h.083c.124-.042.083-.249.248-.207.125.083.166.207.083.33a1.109 1.109 0 0 1-.248.208.126.126 0 0 0 0 .165c.083.083.083.166.124.249.083.165.083.331.166.497.082.33.165.662.165.993 0 .166-.083.331-.041.497.041.165.165.33.248.455.083.124.166.207.248.373.125.207.373.455.249.703-.083.166-.331.125-.456.207-.124.124-.041.29.042.414.124.207-.124.331-.29.414.041.083.124.042.166.083.041.124.124.166.082.29-.082.124-.372.207-.207.414.083.165.042.33-.041.496-.083.207-.248.29-.414.332-.124.041-.29.041-.414.041-.165-.041-.207-.041-.248-.041-.373-.042-.745-.166-1.118-.166-.124.041-.207.041-.29.083-.082.083-.207.165-.248.248l-.041.041s0 .042-.042.042v.041a.864.864 0 0 0-.165.249v.041c-.083.124-.124.29-.166.414-.166.497-.083.952.041 1.035.042.041.746.248 1.2.455.25.083.373.166.539.249h12.377V52h-.124Z" fill="#fff"/><path d="M47.407 56.305c.083.041.207.041.207.083-.041.165-.29.207-.455.414h-.083c-.083.041-.041.165-.124.165-.083-.041-.124 0-.207.042.083.083.207.165.331.124.042 0 .083.041.083.083 0 0 .041 0 .041-.042.042 0 .042 0 .042.042v.041c-.083.083-.166.041-.249.083.166.041.373.041.497 0 .124-.042 0-.248.083-.373-.041 0 0-.082-.041-.082.041-.042.082-.125.124-.125.041 0 .124-.041.124-.082 0-.042-.083-.083-.083-.125.124-.082.248-.206.207-.372-.041-.083-.207-.083-.331-.124-.124-.042-.248 0-.373.041-.124 0-.207.083-.33.083-.166.041-.29.124-.415.207.166-.083.331-.083.497-.124.207.041.331 0 .455.041Z" fill="#fff"/><g clip-path="url(#a)"><path d="M150.811 82.997h-2.031v6.171h-1.499v-6.171h-1.997v-1.435h5.527v1.435Zm5.526 4.737v1.434h-4.59v-7.591h4.594v1.435h-3.114v1.617h2.844v1.415h-2.844v1.705l3.11-.015Zm3.807-1.207h-1.124v2.656h-1.499v-7.59h2.998a2.466 2.466 0 0 1 1.765.734 2.561 2.561 0 0 1 .734 1.785c-.009.471-.15.93-.407 1.323a2.46 2.46 0 0 1-1.043.894l1.663 2.87h-1.599l-1.488-2.672Zm-1.124-1.314h1.525c.265-.041.507-.177.682-.384a1.146 1.146 0 0 0 0-1.482 1.122 1.122 0 0 0-.682-.385h-1.525v2.251Zm7.823 1.314h-1.124v2.656h-1.48v-7.59h2.998a2.473 2.473 0 0 1 1.752.725c.467.466.734 1.1.743 1.764-.008.471-.149.93-.406 1.323a2.452 2.452 0 0 1-1.044.894l1.664 2.87h-1.596l-1.507-2.642Zm-1.124-1.314h1.525c.266-.041.508-.177.682-.384a1.146 1.146 0 0 0 0-1.482 1.116 1.116 0 0 0-.682-.385h-1.525v2.251Zm6.696 3.955h-1.499v-7.591h1.499v7.591Zm6.471-6.171h-2.035v6.171h-1.48v-6.171h-2.019v-1.435h5.526l.008 1.435Zm.161 2.368a3.99 3.99 0 0 1 .657-2.2 3.915 3.915 0 0 1 1.753-1.458c.714-.3 1.5-.377 2.258-.224a3.89 3.89 0 0 1 2 1.084c.546.554.917 1.26 1.067 2.028a4.002 4.002 0 0 1-.227 2.287 3.946 3.946 0 0 1-1.442 1.773 3.87 3.87 0 0 1-2.173.661 3.83 3.83 0 0 1-2.768-1.15 3.906 3.906 0 0 1-.843-1.29 3.967 3.967 0 0 1-.286-1.519l.004.008Zm6.317-.007a2.468 2.468 0 0 0-.425-1.355c-.27-.4-.651-.71-1.094-.89a2.396 2.396 0 0 0-2.631.554 2.473 2.473 0 0 0-.51 2.672c.184.447.495.829.893 1.097s.865.411 1.343.411a2.353 2.353 0 0 0 1.74-.717 2.426 2.426 0 0 0 .684-1.773Zm4.122 3.795h-1.48v-7.591h1.48v7.591Zm4.121-2.657h-1.124v2.657h-1.498v-7.591h2.997a2.464 2.464 0 0 1 1.767.734 2.53 2.53 0 0 1 .732 1.786c-.008.47-.148.93-.404 1.322a2.452 2.452 0 0 1-1.042.895l1.675 2.87h-1.611l-1.492-2.673Zm-1.124-1.313h1.525c.266-.042.508-.178.682-.384a1.146 1.146 0 0 0 0-1.483 1.116 1.116 0 0 0-.682-.384h-1.525v2.25Zm9.81 2.52v1.435h-4.616v-7.591h4.589v1.434h-3.109v1.617H202v1.416h-2.843v1.704l3.136-.015Zm.816-.292 1.267-.76a1.7 1.7 0 0 0 .646.9c.308.218.68.325 1.055.304.892 0 1.203-.38 1.203-.805 0-.565-.506-.781-1.623-1.108-1.116-.326-2.248-.827-2.248-2.277 0-1.45 1.181-2.278 2.469-2.278a2.834 2.834 0 0 1 1.597.443c.477.304.855.744 1.086 1.265l-1.244.729a1.516 1.516 0 0 0-.575-.715 1.488 1.488 0 0 0-.879-.245c-.622 0-.989.326-.989.759s.293.717 1.428 1.063c1.191.38 2.458.785 2.458 2.338 0 1.423-1.124 2.296-2.724 2.296-1.536 0-2.544-.759-2.953-1.898m-6.504-16.735v7.497h-.529v-1.242a2.52 2.52 0 0 1-.945 1.012 2.479 2.479 0 0 1-1.329.355 2.74 2.74 0 0 1-1.95-.818 2.813 2.813 0 0 1-.808-1.976c0-.74.291-1.451.808-1.975a2.74 2.74 0 0 1 1.95-.818c.466-.01.926.111 1.328.351s.73.59.946 1.008v-3.394h.529Zm-.529 4.82c0-.45-.132-.89-.379-1.264a2.254 2.254 0 0 0-1.009-.84 2.219 2.219 0 0 0-1.298-.129 2.241 2.241 0 0 0-1.152.623 2.304 2.304 0 0 0-.487 2.482c.17.416.458.772.828 1.022.37.25.805.384 1.249.384a2.203 2.203 0 0 0 1.598-.659 2.263 2.263 0 0 0 .65-1.618Zm7.494.02v.258h-4.777c.044.564.303 1.09.723 1.463.42.374.967.568 1.525.541.363.02.725-.06 1.047-.232.322-.172.592-.429.781-.743l.465.277a2.62 2.62 0 0 1-.996.92 2.594 2.594 0 0 1-1.316.298 2.639 2.639 0 0 1-2-.781 2.7 2.7 0 0 1-.603-.927 2.74 2.74 0 0 1-.185-1.093 2.744 2.744 0 0 1 .182-1.08 2.7 2.7 0 0 1 .591-.918 2.649 2.649 0 0 1 1.966-.796c1.604 0 2.623 1.348 2.623 2.813h-.026Zm-4.77-.266h4.249a2.092 2.092 0 0 0-.62-1.444 2.038 2.038 0 0 0-1.441-.59 2.11 2.11 0 0 0-1.51.568 2.165 2.165 0 0 0-.685 1.477l.007-.01Zm9.9 1.53c0 .88-.75 1.518-1.893 1.518-1.056 0-1.753-.505-2.004-1.188l.453-.27c.191.581.75.946 1.551.946.802 0 1.364-.334 1.364-1.01 0-1.454-3.2-.619-3.2-2.547 0-.846.716-1.518 1.795-1.518.371-.022.74.067 1.06.258.32.19.577.473.739.812l-.446.254a1.403 1.403 0 0 0-.551-.62 1.37 1.37 0 0 0-.802-.192c-.686 0-1.266.38-1.266 1.006 0 1.435 3.2.588 3.2 2.547v.004Zm-57.466-.646a2.037 2.037 0 0 1-.587 1.444 1.984 1.984 0 0 1-1.425.595h-3.185v-7.466h2.941a1.93 1.93 0 0 1 1.371.577c.364.368.569.868.57 1.389a1.826 1.826 0 0 1-.948 1.636c.371.139.69.39.916.718.226.328.347.719.347 1.119v-.012Zm-4.639-4.904v2.862h2.383a1.4 1.4 0 0 0 .999-.419 1.44 1.44 0 0 0 0-2.023 1.403 1.403 0 0 0-.999-.42h-2.383Zm4.08 4.904a1.506 1.506 0 0 0-.414-1.066 1.471 1.471 0 0 0-1.039-.452h-2.623v3.014h2.623a1.465 1.465 0 0 0 1.038-.453 1.509 1.509 0 0 0 .415-1.065v.022Zm6.393.114h-3.702l-.72 1.898h-.588l2.866-7.44h.596l2.859 7.478h-.611l-.7-1.936Zm-.203-.531-1.645-4.327-1.645 4.35 3.29-.023Zm8.206-5.01v7.477h-.495l-4.357-6.441v6.43h-.559v-7.466h.487l4.366 6.452v-6.452h.558Zm10.757 4.968v-4.968h.558v4.968c0 1.219.75 2.073 2.144 2.073 1.394 0 2.15-.854 2.15-2.073v-4.968h.559v4.968c0 1.58-1.087 2.615-2.709 2.615-1.623 0-2.702-1.036-2.702-2.615Zm11.541 1.966v.532h-4.197v-7.466h4.197v.535h-3.639v2.88h3.373v.536h-3.373v2.972l3.639.011Zm-13.066-3.207a3.886 3.886 0 0 0-.646-2.142 3.817 3.817 0 0 0-1.712-1.416 3.76 3.76 0 0 0-2.2-.215c-.738.15-1.416.52-1.947 1.06a3.874 3.874 0 0 0-1.037 1.978 3.904 3.904 0 0 0 .222 2.228c.29.704.78 1.305 1.407 1.727a3.805 3.805 0 0 0 3.912.192l-.408-.406a3.18 3.18 0 0 1-1.386.315 3.243 3.243 0 0 1-1.824-.547 3.301 3.301 0 0 1-1.214-1.482 3.36 3.36 0 0 1-.196-1.917 3.334 3.334 0 0 1 .89-1.702 3.262 3.262 0 0 1 1.675-.914 3.232 3.232 0 0 1 1.893.185c.599.25 1.111.675 1.471 1.22a3.34 3.34 0 0 1 .29 3.14c-.172.41-.422.78-.737 1.091l-1.698-1.681-.374.353 3.432 3.446.375-.353-1.349-1.382a3.884 3.884 0 0 0 1.161-2.778m-51.83 13.308L120 86.37V73.625l6.197-3.496 2.507 1.42-6.261 3.53.004 12.674Zm15.062-4.255 2.424-1.393v-8.48L129.967 68l-2.514 1.42 10.056 5.659v8.419Zm-7.542 5.667-6.299-3.557v2.835l6.299 3.553 9.966-5.625v-2.835l-9.966 5.629Zm84.08-18.273h-.293v18.276h.293V70.892Z" fill="#fff"/><path d="M218.442 80.207v-9.315h18.359v18.599h-18.359v-9.284Z" stroke="#fff" stroke-miterlimit="10"/><path d="M220.315 88.125a.616.616 0 0 1-.399-.446.627.627 0 0 1 .159-.58.527.527 0 0 1 .431-.166.47.47 0 0 1 .277.053c.154.076.162.091.09.178l-.056.076-.071-.045a.396.396 0 0 0-.425-.031.403.403 0 0 0-.208.376.408.408 0 0 0 .596.38c.063-.035.063-.038.071-.152v-.114h-.296v-.186h.498v.509l-.075.053a.747.747 0 0 1-.584.098l-.008-.003Zm2.949 0a.575.575 0 0 1-.3-.224.626.626 0 0 1 .24-.911.471.471 0 0 1 .259-.05.563.563 0 0 1 .428.173.59.59 0 0 1 .167.435.458.458 0 0 1-.052.262.668.668 0 0 1-.304.3.664.664 0 0 1-.434.007l-.004.008Zm.375-.205a.452.452 0 0 0 .144-.153.45.45 0 0 0 .014-.41.439.439 0 0 0-.132-.162.373.373 0 0 0-.457 0 .435.435 0 0 0-.135.421.385.385 0 0 0 .206.3.37.37 0 0 0 .36-.015v.019Zm1.172.205a.482.482 0 0 1-.269-.277 2.723 2.723 0 0 1-.023-.486v-.422h.195v.41c0 .452 0 .49.135.558a.369.369 0 0 0 .3 0c.116-.064.123-.09.134-.554v-.417h.195v.444c0 .413 0 .448-.045.52a.511.511 0 0 1-.633.212l.011.012Zm-3.331 0v-1.158h.334c.311 0 .337 0 .42.046a.38.38 0 0 1 .172.455.383.383 0 0 1-.206.209.07.07 0 0 0-.045 0l.138.205c.055.071.105.146.15.224 0 0-.018.022-.101.022h-.112l-.143-.204-.142-.206h-.266v.41h-.094c-.056 0-.097 0-.101-.022l-.004.019Zm.645-.62a.177.177 0 0 0 .082-.212c-.033-.117-.086-.14-.322-.14h-.202v.174a.966.966 0 0 0 0 .202c0 .023.048.026.202.023.154-.004.21-.03.251-.061l-.011.015Zm3.882.635v-1.188h.303c.274 0 .307 0 .375.041a.356.356 0 0 1 .21.35.342.342 0 0 1-.087.258c-.097.102-.179.129-.4.14h-.203v.38h-.187l-.011.019Zm.569-.596a.2.2 0 0 0 .063-.052.203.203 0 0 0 .02-.233c-.042-.083-.105-.106-.293-.106h-.168v.186c-.005.07-.005.14 0 .209a.672.672 0 0 0 .374 0l.004-.004Zm.75.58v-1.157h.858v.182h-.652v.3h.58v.186h-.592v.307h.675v.175h-.866l-.003.008Zm1.997-2.763v-1.104h.416v.212l.052-.068a.603.603 0 0 1 .161-.118.459.459 0 0 1 .281-.053.488.488 0 0 1 .281.053.815.815 0 0 1 .33.342.832.832 0 0 1 .086.47.814.814 0 0 1-.101.444.795.795 0 0 1-.322.316.499.499 0 0 1-.255.045.52.52 0 0 1-.42-.159l-.075-.08v.76h-.449l.015-1.06Zm1.004.179a.62.62 0 0 0 .168-.585.493.493 0 0 0-.157-.319.341.341 0 0 0-.287-.07.347.347 0 0 0-.234.184c-.15.311-.049.76.188.832a.43.43 0 0 0 .322-.042Zm-10.117.38a.752.752 0 0 1-.513-.703.911.911 0 0 1 .333-.88.63.63 0 0 1 .783.083l.042.05v-.847h.442v2.258h-.394v-.102a.352.352 0 0 0 0-.103l-.097.088a.613.613 0 0 1-.577.125l-.019.03Zm.409-.327a.4.4 0 0 0 .228-.273.984.984 0 0 0-.026-.535.341.341 0 0 0-.343-.214.338.338 0 0 0-.137.043.512.512 0 0 0-.217.512c.019.353.221.543.495.467Zm1.442.334a.767.767 0 0 1-.536-.38 1.003 1.003 0 0 1 0-.842.816.816 0 0 1 .437-.386.803.803 0 0 1 .579.006.837.837 0 0 1 .472.786v.125h-.57c-.644 0-.592 0-.539.163a.376.376 0 0 0 .483.237.37.37 0 0 0 .161-.115l.075-.08h.375l-.03.068a.691.691 0 0 1-.42.418 1.11 1.11 0 0 1-.472.034l-.015-.034Zm.502-1.044a.47.47 0 0 0-.112-.231.376.376 0 0 0-.34-.05.383.383 0 0 0-.149.096.384.384 0 0 0-.088.155v.072h.704l-.015-.042Zm1.192 1.017a.743.743 0 0 1-.397-.19.507.507 0 0 1-.139-.288v-.08h.206c.18 0 .206 0 .214.035a.295.295 0 0 0 .277.239c.187.022.337-.061.337-.194s-.052-.148-.401-.239c-.348-.091-.464-.152-.532-.254-.067-.103-.049-.095-.049-.217a.412.412 0 0 1 .169-.38.741.741 0 0 1 .51-.124.74.74 0 0 1 .505.129.566.566 0 0 1 .192.322v.06h-.21c-.18 0-.21 0-.21-.03 0-.11-.128-.193-.296-.193-.169 0-.262.072-.229.194.034.121.083.098.375.174.401.103.528.179.585.35a.61.61 0 0 1-.038.379.565.565 0 0 1-.33.27 1.426 1.426 0 0 1-.539.034v.003Zm4.496 0a.874.874 0 0 1-.635-.724.861.861 0 0 1 .119-.563.845.845 0 0 1 .446-.358.83.83 0 0 1 .568.01.853.853 0 0 1 .476.8v.11h-1.143v.088a.354.354 0 0 0 .11.226.343.343 0 0 0 .231.093.331.331 0 0 0 .214-.042.302.302 0 0 0 .131-.107c.03-.053.03-.053.221-.053s.21 0 .12.167a.777.777 0 0 1-.368.32.76.76 0 0 1-.482.033h-.008Zm.513-1.028a.422.422 0 0 0-.195-.304.424.424 0 0 0-.415.08.498.498 0 0 0-.087.212c0 .034 0 .038.349.038.348 0 .348 0 .348-.026Zm3.032 1.028a.883.883 0 0 1-.405-.208.979.979 0 0 1-.12-1.097.85.85 0 0 1 .729-.382.84.84 0 0 1 .706.423 1.07 1.07 0 0 1 0 .85.815.815 0 0 1-.91.414Zm.374-.38a.417.417 0 0 0 .124-.155.498.498 0 0 0 .056-.28.577.577 0 0 0-.112-.418.324.324 0 0 0-.27-.126.338.338 0 0 0-.326.213c-.038.065-.041.103-.041.307 0 .205 0 .24.041.308a.424.424 0 0 0 .199.194.465.465 0 0 0 .329-.042Zm2.346.38a.854.854 0 0 1-.356-.144.59.59 0 0 1-.176-.326v-.088h.404l.023.076a.324.324 0 0 0 .375.194c.164-.02.262-.152.202-.27-.03-.056-.143-.102-.405-.163-.352-.087-.461-.144-.532-.28a.526.526 0 0 1 0-.342.5.5 0 0 1 .221-.258c.28-.114.593-.114.873 0a.54.54 0 0 1 .263.38v.052h-.401v-.053c-.023-.11-.132-.17-.296-.17-.165 0-.27.083-.229.193.041.11.094.102.393.178.3.076.454.14.533.27a.319.319 0 0 1 .056.22.463.463 0 0 1-.128.342.926.926 0 0 1-.794.19h-.026Zm-8.993-.026v-2.251h.529a1.77 1.77 0 0 1 .899.11.962.962 0 0 1 .483.65 2.22 2.22 0 0 1 0 .736.938.938 0 0 1-.656.725c-.218.04-.441.054-.663.041-.314.015-.554.015-.58-.011h-.012Zm1.162-.47a.723.723 0 0 0 .285-.76.63.63 0 0 0-.229-.467.742.742 0 0 0-.487-.106h-.251v1.404h.307c.274 0 .315 0 .375-.05v-.022Zm6.688.458a.375.375 0 0 1-.206-.151c-.038-.057-.038-.1-.045-.615v-.55h-.255v-.3h.255v-.483h.442v.483h.311v.3h-.311v.451c0 .55 0 .543.191.543h.12v.36h-.225a1.287 1.287 0 0 1-.273-.038h-.004Zm-1.926-1.814s.071-.106.161-.22l.158-.213h.415l.15.198c.057.071.11.146.158.224 0 0-.023.022-.161 0h-.173l-.09-.126a1.375 1.375 0 0 0-.101-.125.706.706 0 0 0-.109.13l-.097.128h-.154a.504.504 0 0 1-.157 0v.004Zm-3.263-.095s.074-.136.161-.28l.153-.263h.48l-.056.061-.251.277-.199.22h-.15a.319.319 0 0 1-.138-.015Zm-7.543-1.09a1.019 1.019 0 0 1-.567-.265 1.05 1.05 0 0 1-.31-.55 1.871 1.871 0 0 1 0-.676 1.065 1.065 0 0 1 .75-.801c.19-.038.386-.038.577 0a.878.878 0 0 1 .644.683v.088h-.464l-.023-.076a.534.534 0 0 0-.362-.306.517.517 0 0 0-.458.112.813.813 0 0 0-.207.38c-.027.208-.015.42.038.622a.615.615 0 0 0 .285.323c.144.05.301.05.446 0a.516.516 0 0 0 .281-.38l.022-.083h.453v.046a1.017 1.017 0 0 1-.273.595.979.979 0 0 1-.843.258l.011.03Zm1.623 0a.431.431 0 0 1-.266-.178.443.443 0 0 1-.072-.315.386.386 0 0 1 .064-.216c.094-.156.236-.209.689-.27.218-.03.281-.072.289-.193a.136.136 0 0 0-.005-.077.131.131 0 0 0-.044-.064.22.22 0 0 0-.142-.064.297.297 0 0 0-.375.167l-.019.065h-.419l.018-.088a.456.456 0 0 1 .154-.265.809.809 0 0 1 .603-.175.82.82 0 0 1 .529.137c.135.114.131.106.146.808 0 .35 0 .653.022.676.023.022 0 .041-.198.041h-.214V82.8c-.019-.102-.022-.102-.079-.053a.895.895 0 0 1-.681.118Zm.577-.326a.395.395 0 0 0 .105-.15.398.398 0 0 0 .022-.184.33.33 0 0 0 0-.133h-.056a1.186 1.186 0 0 1-.206.046c-.199.034-.278.076-.323.163a.2.2 0 0 0 .068.258.469.469 0 0 0 .397 0h-.007Zm1.993.323a1.31 1.31 0 0 1-.176-.05.561.561 0 0 1-.311-.417v-.06h.401v.049a.376.376 0 0 0 .263.194.372.372 0 0 0 .314-.088c.082-.106.026-.209-.15-.266l-.307-.087a.765.765 0 0 1-.375-.16.316.316 0 0 1-.12-.288.456.456 0 0 1 .095-.296.446.446 0 0 1 .261-.163 1.36 1.36 0 0 1 .618 0 .53.53 0 0 1 .394.399v.08h-.405l-.026-.073c-.042-.102-.116-.14-.285-.14-.169 0-.214.03-.236.114a.16.16 0 0 0 .025.104c.02.031.049.054.084.066.026 0 .164.053.307.088.356.087.491.167.547.315a.763.763 0 0 1 0 .38.612.612 0 0 1-.225.246 1.165 1.165 0 0 1-.716.072l.023-.019Zm1.656 0a.583.583 0 0 1-.495-.467v-.068h.21c.188 0 .21 0 .21.03a.273.273 0 0 0 .146.19.345.345 0 0 0 .176.038c.176 0 .293-.076.293-.194 0-.117-.045-.144-.458-.254-.311-.083-.412-.133-.483-.243a.308.308 0 0 1-.049-.209c0-.284.176-.451.532-.497.443-.057.784.118.843.437v.068h-.419v-.053c0-.08-.075-.13-.184-.152-.217-.046-.374.05-.33.194.019.056.132.106.398.17.112.022.222.054.329.095a.38.38 0 0 1 .251.38.498.498 0 0 1-.374.49 1.61 1.61 0 0 1-.604.034l.008.011Zm1.72 0a.745.745 0 0 1-.551-.558 1.34 1.34 0 0 1 0-.535.78.78 0 0 1 .644-.577.742.742 0 0 1 .789.375c.05.091.082.192.092.297.011.069.019.139.022.209v.072h-1.161v.076a.377.377 0 0 0 .375.33.37.37 0 0 0 .299-.137l.06-.068h.368l-.064.129a.706.706 0 0 1-.285.315 1.02 1.02 0 0 1-.618.06l.03.012Zm.551-1.048a.353.353 0 0 0-.303-.3.342.342 0 0 0-.151.016.355.355 0 0 0-.24.285v.049h.716l-.022-.05Zm-5.055.228v-.827h.42v1.62h-.42v-.793Zm0-1.256v-.198h.42v.38h-.42v-.182Zm8.993-.088a5.566 5.566 0 0 1-1.818-.535 5.711 5.711 0 0 1-1.785-1.354 5.79 5.79 0 0 1-1.137-1.944 5.84 5.84 0 0 1 1.161-5.8l.139-.156h.622l-.244.247a5.378 5.378 0 0 0-1.426 2.576 5.42 5.42 0 0 0 .141 2.95c.32.95.897 1.79 1.665 2.424a5.247 5.247 0 0 0 2.682 1.16c.436.042.875.042 1.311 0a5.285 5.285 0 0 0 2.66-1.139l.131-.11v.558l-.138.106c-.403.284-.837.52-1.293.703-.452.166-.92.28-1.398.337-.423.036-.85.036-1.273 0v-.022Zm.266-.724c-.154-.054-.188-.186-.068-.281.045-.035.045-.035 0-.076a.154.154 0 0 1 0-.201.195.195 0 0 1 .156-.053.2.2 0 0 1 .08.028.199.199 0 0 1 .06.059c.03.072 0 .163-.049.178-.048.015-.041 0 0 .084a.186.186 0 0 1 .049.087.198.198 0 0 1-.088.15.193.193 0 0 1-.17.025h.03Zm.123-.073c.06-.041.053-.106 0-.167-.052-.06-.082-.053-.131 0a.109.109 0 0 0-.027.073.106.106 0 0 0 .1.104.103.103 0 0 0 .073-.025l-.015.015Zm.034-.31a.17.17 0 0 0 .026-.073.141.141 0 0 0-.101-.11c-.03 0-.101.064-.101.095.028.055.073.1.127.129 0 0 .03 0 .045-.042h.004Zm.21.379s.022-.023.045-.027c.022-.004.048 0 .048-.17 0-.171 0-.156-.048-.175-.049-.02-.038-.057.048-.061h.064v.201c0 .186 0 .198.045.201.02.004.037.015.049.03 0 0-.03.023-.124.023h-.131l.004-.022Zm.472-.065a.383.383 0 0 1 .019-.505.322.322 0 0 1 .217-.09c.022 0 0 .022-.056.056a.382.382 0 0 0-.173.213v.045l.053-.041a.14.14 0 0 1 .107-.047.146.146 0 0 1 .106.047.211.211 0 0 1 .054.172.21.21 0 0 1-.031.088.209.209 0 0 1-.064.066.18.18 0 0 1-.217 0l-.015-.004Zm.202-.045a.151.151 0 0 0 .027-.088.15.15 0 0 0-.027-.087.114.114 0 0 0-.083-.067.11.11 0 0 0-.1.033c-.034.03-.038.046-.027.102.023.13.12.183.195.107h.015Zm-1.386.041h-.079c-.052 0-.056-.045 0-.045s.053 0 .079-.178c.026-.179.019-.145 0-.16-.019-.015-.03-.053.045-.053s.075 0 .075.05a1.643 1.643 0 0 1-.03.197c0 .08-.026.148-.026.152 0 .003 0 0 .037 0s.037 0 .037.03-.048.023-.119 0l-.019.007Zm1.918-.265c-.045-.046-.048-.08 0-.118a.072.072 0 0 1 .027-.022.072.072 0 0 1 .033-.008c.012 0 .023.002.034.008.01.005.019.013.026.022a.074.074 0 0 1 .033.06.074.074 0 0 1-.033.06c-.086.043-.105.043-.138-.002h.018Zm.682-.042c-.026-.027-.03-.125 0-.125a.074.074 0 0 1 .041.026c.034.042.083.035.139 0 .056-.034.049-.05.03-.09-.019-.043-.03-.046-.157-.054-.128-.008-.146 0-.191-.057a.142.142 0 0 1-.041-.053.151.151 0 0 1 0-.133.142.142 0 0 1 .041-.053.37.37 0 0 1 .239-.087c.042 0 .072.09.053.136-.019.046-.019.03-.056 0-.038-.03-.053-.049-.094-.041-.112.03-.154.121-.082.186.071.064.067.03.153.03s.131 0 .169.05c.037.049.037.22-.131.284-.068.026-.098.03-.113 0v-.019Zm-3.919-.102c-.165-.084-.217-.133-.127-.122.03 0 .052-.034.131-.205.078-.17.093-.212.071-.25-.023-.038-.019-.046 0-.05.132.049.257.112.375.19 0 .023-.057.099-.075.099-.019 0-.019-.023-.019-.05 0-.026 0-.053-.071-.083l-.083-.038a.381.381 0 0 0-.075.167c.025.02.053.037.083.05.127.056.071.09-.06.037-.068-.03-.068-.03-.094.027-.075.14-.075.144 0 .19.075.045.086.038.116 0 .03-.038.06-.038.06 0s-.037.121-.052.121l-.191-.087.011.004Zm.727.064c-.041 0-.06-.03-.06-.053s0-.042.116 0 .086.03.086.057c0 .026-.048.038-.142 0v-.004Zm3.664-.17a.157.157 0 0 1 .023-.046c.019-.027 0-.065-.101-.24-.188-.314-.169-.33.164-.182.078.038.158.071.24.099a1.518 1.518 0 0 0-.082-.156c-.079-.129-.098-.144-.139-.144-.041 0-.056-.034.045-.09.101-.058.09-.046.09-.028a.078.078 0 0 1-.019.046.936.936 0 0 0 .259.421c.06-.019.052.023 0 .061l-.06.034-.251-.114a2.132 2.132 0 0 0-.247-.106c.029.06.061.119.097.175.09.152.097.163.146.152.049-.012.06 0-.034.075-.093.076-.119.061-.119.042h-.012Zm-4.979-.225c-.143-.098-.143-.2 0-.425.082-.129.097-.167.078-.19-.018-.022 0-.057.098 0 .097.057.123.11.041.088-.082-.023-.056 0-.139.132a1.901 1.901 0 0 0-.105.19.195.195 0 0 0 .113.171c.082.042.142 0 .258-.174.117-.175.098-.16.075-.179-.022-.019-.037-.072-.018-.072a.8.8 0 0 1 .191.137h-.045c-.045 0-.06 0-.146.144-.139.22-.255.266-.401.167v.011Zm-.472-.152a.326.326 0 0 1-.094-.182.458.458 0 0 0-.068-.17.311.311 0 0 1-.042-.26.296.296 0 0 1 .174-.196.279.279 0 0 1 .315.06.295.295 0 0 1 .059.32.462.462 0 0 1-.202.182.587.587 0 0 1-.12 0h-.075c.024.086.07.163.135.224.037.03.06.06.056.068-.004.008-.093.015-.157-.046h.019Zm.127-.33a.398.398 0 0 0 .176-.22.216.216 0 0 0-.013-.112.217.217 0 0 0-.069-.09.248.248 0 0 0-.176.003.255.255 0 0 0-.132.12.197.197 0 0 0 0 .273.163.163 0 0 0 .099.051.157.157 0 0 0 .107-.025h.008Zm5.883.14a.299.299 0 0 1-.138-.317.297.297 0 0 1 .25-.237.277.277 0 0 1 .266.13.265.265 0 0 1 .034.307.27.27 0 0 1-.412.118Zm.284-.049c.128-.064.117-.227-.022-.38-.064-.056-.098-.075-.146-.075a.205.205 0 0 0-.184.144.337.337 0 0 0 .247.319c.029.002.059 0 .087-.008h.018Zm-3.263-.19c.108-.193.093-.19.18-.041a.56.56 0 0 1 .071.14.188.188 0 0 1-.079 0 .336.336 0 0 0-.198 0c-.049.012-.045.012.007-.099h.019Zm-.184-.12a.39.39 0 0 0 0-.16.242.242 0 0 1 0-.076c.048.02.093.046.135.076.146.087.15.076-.041.182l-.101.057.007-.08Zm.454 0a.587.587 0 0 1-.124-.088 1.26 1.26 0 0 1 .24-.148.771.771 0 0 1 0 .152v.159l-.124-.076h.008Zm-3.83-.149a.624.624 0 0 1-.078-.095h.056c.03 0 .071 0 .221-.14.15-.14.161-.156.153-.194-.007-.038.019-.057.094.038s.075.13 0 .091c-.075-.038-.056 0-.195.13-.138.128-.165.159-.161.2.004.042 0 .053 0 .053a.5.5 0 0 1-.09-.08v-.003Zm3.612 0-.078-.133-.049-.083h.157a1.1 1.1 0 0 1 .154 0s-.15.265-.154.265a.534.534 0 0 1-.03-.053v.004Zm-.843-.042a.55.55 0 0 1 .124-.14c.075-.057.075-.06.041-.08a.256.256 0 0 1-.094-.167.034.034 0 0 0-.02-.043.034.034 0 0 0-.026 0 .034.034 0 0 0-.017.02.163.163 0 0 1-.083.042.224.224 0 0 1-.228-.06c-.038-.042-.034-.054.033-.058.068-.003.049 0 .038-.034a3.208 3.208 0 0 1-.03-.098c-.026-.095 0-.118.086-.088a.224.224 0 0 1 .15.194c0 .068 0 .072.037.038.038-.034 0-.266-.123-.33a.346.346 0 0 0-.304.022c-.075.046-.078.027 0-.053.131-.155.326-.16.697-.019.1.04.203.074.307.099.06 0 .105.03.102.042a.897.897 0 0 1-.353.25h-.067l.037-.064.038-.061-.082-.038a.597.597 0 0 0-.105-.038v.16c0 .193.048.25.172.25.124 0 .079 0 .094.064.022.13-.098.225-.315.243h-.128l.019-.053Zm1.559.05c-.169-.046-.232-.122-.199-.24 0-.053.023-.064.064-.056.131.026.191-.057.191-.274 0-.148 0-.148-.124-.087l-.078.042.037.05a.282.282 0 0 1 .038.06.289.289 0 0 1-.083 0 .894.894 0 0 1-.221-.14c-.138-.11-.138-.11-.09-.122.162-.04.32-.09.476-.148.307-.118.532-.091.63.068.052.088.048.095-.027.042a.281.281 0 0 0-.391.031.295.295 0 0 0-.066.128c0 .069 0 .167.045.167s0 0 0-.019a.176.176 0 0 1 0-.09.227.227 0 0 1 .069-.11.224.224 0 0 1 .115-.054c.052 0 .056 0 .056.053a.278.278 0 0 1-.026.11c-.03.061-.023.072.049.072.071 0 .056.035-.042.088a.228.228 0 0 1-.258 0l-.049-.038-.022.083a.188.188 0 0 1-.075.122l-.053.041.068.05a.383.383 0 0 1 .15.174c.018.05.018.05-.049.05a.688.688 0 0 1-.154-.027l.019-.026Zm2.709-.069c-.105-.11-.191-.17-.217-.148-.027.023-.049.027-.049 0a.304.304 0 0 1 .086-.106l.082-.084v.057c0 .046 0 .069.083.148.082.08.09.107.082.148v.046l-.067-.06Zm-4.496-.133c-.06-.018-.064-.034 0-.08a.216.216 0 0 1 .239 0l.045.035-.063.042a.213.213 0 0 1-.206 0l-.015.004Zm2.008 0c-.067-.034-.075-.072-.022-.098a.215.215 0 0 1 .209.019c.06.05.06.06 0 .087a.19.19 0 0 1-.187 0v-.008Zm-4.871-.178c-.09-.125-.116-.174-.094-.178a.05.05 0 0 1 .023-.006c.008 0 .015.002.022.006 0 0 .079-.027.206-.122.128-.095.184-.144.18-.182-.003-.038.019-.057.094.046.075.102.064.136 0 .09-.064-.045-.056 0-.217.115l-.188.144a.301.301 0 0 0 .053.08c.048.064.063.072.112.064.049-.008.053 0 .053 0a.216.216 0 0 1-.102.099 1.028 1.028 0 0 1-.138-.171l-.004.015Zm3.897.027c0-.023-.034-.034-.056-.027-.023.008-.087-.053-.068-.087.019-.034 0 0-.026-.027-.026-.026-.041-.087.067-.182a.534.534 0 0 1 .128-.091.81.81 0 0 1 .247.216.076.076 0 0 1-.013.029.087.087 0 0 1-.024.02.086.086 0 0 0-.038.053c0 .039-.049.08-.079.07-.03-.012-.033 0-.045.026-.011.026-.071.045-.093 0Zm-1.458-.164c-.048 0-.037-.053.026-.11a.187.187 0 0 1 .199-.03c.041.027-.022.11-.105.133a.228.228 0 0 1-.079 0h-.041v.007Zm2.897 0a.245.245 0 0 1-.12-.083c-.023-.03-.023-.038 0-.053a.199.199 0 0 1 .183 0c.045.026.101.095.09.106a.29.29 0 0 1-.131.008l-.022.022Zm2.03-.019a.146.146 0 0 1 0-.041c0-.023 0-.02 0 0v.041s.019-.015.023-.022l-.023.022Zm-7.609-.25c-.08-.093-.142-.2-.184-.315h.041c.015 0 .049.023.236-.087.188-.11.206-.122.206-.171 0-.05 0-.053.03-.02.034.055.066.11.094.168.049.099.064.144.052.182a.156.156 0 0 1-.168.099c-.038 0-.045 0-.045.038a.162.162 0 0 1-.103.127.154.154 0 0 1-.159-.033v.012Zm.153-.068c.045-.027.049-.095 0-.171-.049-.076-.045-.065-.146 0-.101.064-.079.05-.06.087.053.103.116.13.199.087l.007-.003Zm.232-.19c.027-.027.027-.042 0-.091-.026-.05-.03-.061-.041-.065a.348.348 0 0 0-.168.084s0 .042.041.072c.041.03.105.064.161 0h.007Zm1.938.285c-.034-.023 0-.095.116-.224a.71.71 0 0 0 .082-.1l-.064-.037c-.071-.038-.127-.114-.108-.144.019-.03.202 0 .277.026a.197.197 0 0 1 .075.072.253.253 0 0 0 .097.088c.06.03.072.045.057.072a.79.79 0 0 1-.251.208.445.445 0 0 1-.281.038Zm3.495-.02a.566.566 0 0 1-.266-.19c-.052-.068-.048-.087.027-.113a.174.174 0 0 0 .09-.069.229.229 0 0 1 .067-.08c.056-.04.262-.067.281-.033.019.034-.041.114-.109.148l-.063.034c.018.026.04.05.063.072.094.095.18.235.15.25a.343.343 0 0 1-.217-.041l-.023.022Zm-1.802-.166c-.697-.114-1.244-.782-1.416-1.724a3.975 3.975 0 0 1 0-.987c.079-.504.309-.972.659-1.34.142-.125.301-.228.472-.307.172-.063.354-.09.536-.08.151.006.3.045.435.114a2.08 2.08 0 0 1 1.056 1.519c.051.377.051.76 0 1.138-.168.847-.659 1.477-1.277 1.64a1.441 1.441 0 0 1-.472.03l.007-.004Zm.487-.194c.607-.186 1.064-.896 1.143-1.773.097-1.07-.423-2.08-1.18-2.277a1.219 1.219 0 0 0-.585 0c-.682.213-1.161 1.051-1.161 2.03a2.347 2.347 0 0 0 .618 1.686c.185.2.43.334.697.38.165.019.333 0 .491-.054l-.023.008Zm-.502-.118c-.243-.053-.217-.06.184-.06s.442 0 .195.064a.742.742 0 0 1-.375 0l-.004-.004Zm-.468-.27-.053-.045h1.428l-.045.046-.041.045h-1.233l-.056-.045Zm-.199-.212a.16.16 0 0 1-.03-.045c.114-.009.228-.009.341 0h.337l-.022.045-.019.046h-.288c-.255 0-.293 0-.319-.034v-.012Zm.75-.03a.242.242 0 0 0-.087-.319.175.175 0 0 0-.107-.018.181.181 0 0 0-.099.048c-.048.053-.063.046-.063-.026a.193.193 0 0 1 .126-.205.187.187 0 0 1 .083-.011c.049 0 .072 0 .113.064.041.064.086.068.03-.046a.469.469 0 0 1 .06-.531l.064-.072.037.046a.679.679 0 0 1 .135.334.52.52 0 0 1-.049.193c-.056.13-.052.16 0 .072a.132.132 0 0 1 .128-.06.187.187 0 0 1 .191.14.291.291 0 0 1 0 .11v.05l-.045-.046a.195.195 0 0 0-.239-.028.198.198 0 0 0-.084.229c0 .042.027.091.034.11.008.019 0 .03-.127.03h-.139l.038-.064Zm.202-.733c0-.083-.053-.262-.079-.262a1.2 1.2 0 0 0 0 .255v.258l.038-.084a.507.507 0 0 0 .041-.167Zm.161.76c-.064-.061-.03-.069.319-.069h.337l-.03.046c-.03.045-.03.045-.319.045a.889.889 0 0 1-.307-.023Zm-1.266-.236a.115.115 0 0 1-.023-.05c.077-.005.155-.005.232 0 .221 0 .233 0 .248.046v.042h-.225c-.206 0-.229 0-.247-.034l.015-.004Zm.655.02c0-.024.042-.058.075-.058a.105.105 0 0 1 .064.038c.03.034.03.034-.053.034h-.086v-.015Zm.57 0c0-.024.041-.058.075-.058a.103.103 0 0 1 .063.038c.03.034.03.034-.052.034h-.086v-.015Zm.348 0c0-.073 0-.077.251-.077s.263 0 .203.072a1.303 1.303 0 0 1-.442.027l-.012-.023Zm-1.678-.221a.088.088 0 0 1 0-.046c0-.03.022-.034.284-.034.096-.007.192 0 .285.02 0 .067 0 .075-.285.075a1.431 1.431 0 0 1-.273 0l-.011-.015Zm1.697 0a.116.116 0 0 0 0-.046c0-.026.023-.03.285-.03.262 0 .296 0 .288.03a.173.173 0 0 0 0 .046.961.961 0 0 1-.277.019.938.938 0 0 1-.273-.02h-.023Zm-1.78-.224a.347.347 0 0 0 0-.046c0-.026.038-.03.457-.03.42 0 .472 0 .472.027 0 .026-.161.068-.543.068a1.67 1.67 0 0 1-.374 0l-.012-.019Zm1.596 0a.15.15 0 0 0-.071 0c-.026 0-.041 0-.033-.023.007-.023.119-.026.468-.03h.464v.042c0 .041 0 .041-.397.049a2.62 2.62 0 0 1-.423 0l-.008-.038Zm-1.659-.235a.088.088 0 0 1 0-.046c.167-.02.337-.026.505-.019h.502v.095h-.49c-.435 0-.495 0-.506-.03h-.011Zm1.543 0a.116.116 0 0 1 0-.046c.168-.02.337-.026.506-.019h.506v.087h-.491c-.446.027-.502.023-.509-.003l-.012-.02Zm-1.577-.228v-.05c0-.007 1.161 0 1.161 0a.096.096 0 0 1-.033.046c-.03.027-.098.03-.577.03-.48 0-.544 0-.551-.034v.008Zm1.476 0c-.052-.072-.064-.068.547-.068h.588v.09h-.558c-.192.017-.386.01-.577-.022Zm-1.499-.247v-.045h2.623v.113h-2.645l.022-.068Zm0-.212c0-.035 0-.038.24-.038s.24 0 .221.038c-.019.038-.041.038-.24.038-.198 0-.221 0-.221-.038Zm.577 0a.46.46 0 0 0 .023-.11.21.21 0 0 0 .004-.09.206.206 0 0 0-.036-.083.193.193 0 0 0-.155-.078c-.06 0-.154.05-.154.08h-.019s-.019-.038-.019-.084a.174.174 0 0 1 .012-.084.173.173 0 0 1 .052-.068.16.16 0 0 1 .129-.069c.026 0 .051.007.073.02a.16.16 0 0 1 .057.05c.075.083.078.072 0-.088a.377.377 0 0 1-.038-.216.637.637 0 0 1 .143-.315c.026-.027.033-.023.086.034.08.1.124.224.127.353a.763.763 0 0 1-.056.174c-.026.057-.045.11-.038.118.008.008.019 0 .03-.026a.174.174 0 0 1 .182-.102.164.164 0 0 1 .069.026c.079.041.135.186.098.246-.038.061-.023.02-.041 0a.379.379 0 0 0-.09-.056.112.112 0 0 0-.128 0 .234.234 0 0 0-.101.106c-.034.064-.034.08 0 .17l.026.103h-.127c-.112 0-.127 0-.116-.034l.007.023Zm.203-.76a.515.515 0 0 0-.038-.186l-.041-.083v.55l.041-.083a.493.493 0 0 0 .056-.17l-.018-.028Zm.15.76v-.038h.404c.401 0 .405 0 .375.038-.03.038-.038.038-.393.038-.356 0-.356.026-.368 0l-.018-.038Zm.899 0a.432.432 0 0 0 0-.247.19.19 0 0 0-.173-.114c-.059 0-.157.05-.157.08h-.019s-.018-.038-.018-.084a.173.173 0 0 1 .013-.084.173.173 0 0 1 .05-.068.16.16 0 0 1 .13-.068.16.16 0 0 1 .129.068c.075.084.079.073 0-.087a.466.466 0 0 1 .082-.5l.045-.062.053.05a.697.697 0 0 1 .09.148.444.444 0 0 1 0 .38.276.276 0 0 0-.038.12s.019 0 .03-.026a.178.178 0 0 1 .108-.096.173.173 0 0 1 .143.02.218.218 0 0 1 .098.247c0 .019-.023.019-.042 0a.414.414 0 0 0-.086-.057.12.12 0 0 0-.131 0 .23.23 0 0 0-.101.106c-.034.065-.034.08 0 .171l.03.103h-.131c-.113 0-.124 0-.113-.035l.008.035Zm.198-.779a.375.375 0 0 0-.041-.185l-.037-.073v.558l.041-.083a.467.467 0 0 0 .056-.182l-.019-.035Zm.15.782v-.038c.08-.004.16-.004.24 0 .225 0 .24 0 .24.038s0 .038-.229.038c-.228 0-.228 0-.239-.03l-.012-.008Zm-2.162-.231c0-.027.023-.038.06-.038.038 0 .053 0 .06.038.008.038 0 .038-.06.038s-.052.03-.041-.004l-.019-.034Zm.334 0a.096.096 0 0 1 .064-.027c.024.001.048.01.067.027.019.026 0 .03-.067.03-.068 0-.064.038-.045.012l-.019-.042Zm.554 0c0-.038.117-.042.143 0 .026.042 0 .03-.064.03s-.064.034-.06.02l-.019-.05Zm.353 0a.241.241 0 0 0 0-.038.109.109 0 0 1 .052 0c.037 0 .056 0 .064.038.007.038 0 .038-.064.038s-.071 0-.064-.03l.012-.008Zm.344 0a.097.097 0 0 1 .03-.02.083.083 0 0 1 .034-.007c.024.001.046.01.064.027.018.026 0 .03-.064.03s-.067.038-.045.012l-.019-.042Zm.555 0c0-.038.112-.042.138 0 .027.042 0 .03-.059.03-.06 0-.075.034-.075.02l-.004-.05Zm.352 0v-.038h.052c.03 0 .057 0 .057.038s0 .038-.068.038c-.067 0-.015.026-.015.004l-.026-.042Zm-2.462-.22v-.042c0-.008 0 0 .038 0 .037 0 .037.065-.019.072-.056.008-.041 0-.03-.023l.011-.007Zm1.218 0c0-.03 0-.038.053-.038.052 0 .063 0 .059.034-.003.034-.101.053-.112 0v.004Zm1.248 0c0-.03 0-.038.03-.034a.06.06 0 0 1 .027.013.064.064 0 0 1 .018.025c0 .049-.064.045-.075 0v-.004Zm-2.409-.198a.347.347 0 0 0 0-.045.37.37 0 0 1 .146 0 .442.442 0 0 1 .146 0c0 .026-.176.08-.248.08-.071 0-.067 0-.056-.03l.012-.005Zm.951 0c-.045 0-.078-.034-.078-.045.112-.008.225-.008.337 0 .113-.008.227-.008.341 0a.234.234 0 0 1-.09.05c-.16.045-.328.053-.491.022l-.019-.027Zm1.248 0a.155.155 0 0 1-.079-.045c.05-.01.101-.01.15 0 .143 0 .154 0 .157.045.004.046 0 .042-.071.038a.542.542 0 0 1-.138-.011l-.019-.027Zm-2.117-.227c0-.038.03-.046.127-.05.098-.004.117 0 .109.038-.007.038 0 .042-.131.046-.131.004-.124 0-.109-.034h.004Zm.791.022a.116.116 0 0 0 0-.045c0-.027.026-.03.348-.03h.375v.041c0 .042 0 .042-.349.046-.114.013-.23.013-.344 0l-.03-.012Zm1.247 0a.116.116 0 0 0 0-.045c0-.027 0-.03.109-.03a.282.282 0 0 1 .124 0 .136.136 0 0 0 0 .049c0 .023 0 .026-.113.026a.27.27 0 0 1-.12 0Zm-1.937-.193a.085.085 0 0 1 .023-.05c.018-.026.045-.03.138-.026h.113l-.027.042c-.026.038-.048.045-.138.045a.219.219 0 0 1-.109 0v-.011Zm.6-.02a.1.1 0 0 1-.03-.049c.159-.008.319-.008.479 0h.48l-.03.042c-.026.042-.034.042-.45.046-.416.004-.423 0-.449-.027v-.011Zm1.24 0a.13.13 0 0 1-.023-.045c0-.022.214 0 .233 0 .018 0 .026.072-.083.072-.108 0-.108 0-.127-.037v.01Zm-1.694-.2a.11.11 0 0 1 .026-.046c.023-.03.079-.034.874-.03h.85l.026.041.027.042h-1.803v-.007Zm.225-.255.053-.049h1.24l.041.05.045.045h-1.431l.052-.046Zm.315-.193a.994.994 0 0 1 .374-.076.964.964 0 0 1 .341.072c.023 0-.097.019-.341.019a1.98 1.98 0 0 1-.374 0v-.015Zm-1.735 4.004c-.056-.023-.052-.041 0-.08a.212.212 0 0 1 .221 0c.03.03.03.035 0 .069a.22.22 0 0 1-.217 0l-.004.011Zm3.99 0c-.063-.038-.063-.06 0-.095a.2.2 0 0 1 .21.03l.045.035-.056.03a.238.238 0 0 1-.214 0h.015Zm-3.233-.19c-.12-.148-.169-.186-.277-.193h-.053l.064-.034.067-.038c.019 0-.135-.24-.191-.289-.056-.05-.108-.068-.172 0a.206.206 0 0 1-.128.034c-.116 0-.138-.019-.086-.068a.295.295 0 0 1 .319-.095l.075.023a3.418 3.418 0 0 0-.154-.38c-.045-.08-.187-.22-.21-.208a.441.441 0 0 1-.266.083c-.082 0-.221-.083-.221-.114 0-.03.038-.038.083-.064a.338.338 0 0 1 .209-.046.496.496 0 0 1 .401.186c.138.14.249.305.326.486.111.243.263.464.45.653l.169.17h-.075a.833.833 0 0 0-.143 0c-.067 0-.071 0-.191-.136l.004.03Zm2.383.13h-.113l.139-.137c.187-.18.341-.394.453-.63a1.91 1.91 0 0 1 .375-.547.49.49 0 0 1 .637-.117c.056.037.06.037.03.072a.478.478 0 0 1-.251.095.401.401 0 0 1-.135-.05l-.086-.045-.052.038a.885.885 0 0 0-.259.425c-.045.133-.045.136.03.102a.326.326 0 0 1 .266 0c.124.065.112.11-.034.114a.2.2 0 0 1-.127-.045l-.049-.046-.071.034a.527.527 0 0 0-.202.243l-.049.084.079.038.075.034h-.09c-.087 0-.098.019-.236.17a.663.663 0 0 1-.177.16h-.142l-.011.008Zm-5.497-.316a.26.26 0 0 1-.136-.278.252.252 0 0 1 .043-.101.866.866 0 0 1 .217-.118c.15-.06.172-.076.172-.114 0-.038.041-.038.083.076.041.114.033.156 0 .088l-.027-.038-.153.056c-.188.073-.266.145-.247.22a.168.168 0 0 0 .043.095.174.174 0 0 0 .088.054.85.85 0 0 0 .213-.053c.15-.061.161-.065.161-.118 0-.053.038-.053.079.06.041.115.03.137-.022.088-.053-.05-.042-.03-.18.023-.199.08-.24.087-.319.045l-.015.015Zm2.286-.022c-.034 0-.03 0 .03-.08a.408.408 0 0 1 .281-.106c.082 0 .097.026.052.09a.345.345 0 0 1-.374.096h.011Zm4.076 0a.194.194 0 0 1-.119-.133c0-.03 0-.038.059-.042a.47.47 0 0 1 .143 0c.082.019.221.137.198.16a.504.504 0 0 1-.281.003v.012Zm-4.279-.186c-.029-.023-.029-.027.027-.057.056-.03.258 0 .176.057a.211.211 0 0 1-.203-.012v.012Zm4.538 0c-.03-.035-.026-.038.026-.061a.19.19 0 0 1 .188.03c.018.023 0 .03 0 .046a.24.24 0 0 1-.21 0l-.004-.015Zm-4.579-.32-.071-.026c-.019-.019.116-.133.184-.163.067-.03.048-.03.041-.046l-.023-.056c0-.023 0-.027.023-.02l.101.02a.12.12 0 0 1 .124.136c-.008.069-.24.186-.379.137v.019Zm4.68 0c-.281-.056-.315-.261-.052-.303.071 0 .086 0 .052.06-.034.062 0 .039.068.077a.523.523 0 0 1 .123.09c.03.035.03.043 0 .058l-.056.019h-.056a.215.215 0 0 1-.086 0h.007Zm-6.714-.178a.38.38 0 0 1-.071-.121c0-.06-.034-.065-.143-.034-.109.03-.067.026-.064.057.004.03 0 .041 0 .045a.293.293 0 0 1-.048-.114c-.015-.068 0-.155.03-.09.03.064.045.022.251-.027.206-.05.228-.057.232-.095.004-.038.038-.038.075.118.037.155.034.239-.03.292a.147.147 0 0 1-.115.034.14.14 0 0 1-.058-.021.137.137 0 0 1-.044-.044h-.015Zm.172-.056a.092.092 0 0 0 .032-.038.085.085 0 0 0 .009-.05c0-.099 0-.11-.135-.083-.134.026-.105.019-.097.076.022.114.109.155.191.094Zm5.995-.22c.047-.207.078-.416.094-.627a3.5 3.5 0 0 0-.079-.854c-.101-.46-.041-.695.202-.82a.522.522 0 0 1 .154-.053c.041 0 .045 0 .034.06a.448.448 0 0 1-.158.247.532.532 0 0 1-.123.042h-.068v.14a.327.327 0 0 0 .068.243.873.873 0 0 0 .135.152c.06.046.067.05.097.023a.308.308 0 0 1 .375.046c.048.045.056.057.03.072a.49.49 0 0 1-.203.057.781.781 0 0 1-.314-.11c-.098-.065-.098-.061-.068.095l.023.106h.187l-.056.03a.212.212 0 0 0-.105.232v.05l.094-.062a.49.49 0 0 1 .483-.053c.034.027.034.03 0 .072a.327.327 0 0 1-.326.061l-.12-.034-.041.053a.337.337 0 0 0-.073.284.343.343 0 0 0 .17.237c.053.026.053.026-.037.018a.615.615 0 0 1-.124-.019c-.026 0-.034 0-.041.076-.008.076-.03.106-.12.205l-.105.118.023-.084-.008-.004Zm-3.541-.039a.322.322 0 0 1-.101-.19c0-.075-.019-.09-.049-.083h-.221l.083-.042a.27.27 0 0 0 .116-.11.426.426 0 0 0 0-.33c-.056-.114-.075-.121-.184-.087a.345.345 0 0 1-.314-.034c-.09-.061-.079-.091.041-.122a.48.48 0 0 1 .404.084.667.667 0 0 0 .102.064.242.242 0 0 0 0-.076.236.236 0 0 0-.109-.213c-.049-.03-.049-.03.041-.022h.09l.023-.121c0-.069.018-.126.018-.126a.305.305 0 0 0-.086.05.806.806 0 0 1-.195.087.317.317 0 0 1-.213 0c-.135-.03-.158-.06-.086-.11a.305.305 0 0 1 .352-.057l.067.034.075-.065a.55.55 0 0 0 .195-.46c0-.056 0-.067-.056-.067a.353.353 0 0 1-.307-.304c0-.06 0-.064.134-.023a.453.453 0 0 1 .304.433c.007.14-.009.28-.049.414a3.425 3.425 0 0 0 0 1.404c.016.044.024.09.023.137a.597.597 0 0 1-.101-.099l.003.034Zm-.524-.36c-.038-.027 0-.091.078-.114.079-.023.165 0 .15.03v.035a.224.224 0 0 1-.221.049h-.007Zm4.496-.038-.06-.057.052-.019a.195.195 0 0 1 .207.06c.033.05 0 .069-.079.069a.191.191 0 0 1-.12-.053Zm-7.018 0a.927.927 0 0 1 0-.13c0-.11 0-.136.045-.067.045.068.03.037.206.026.251 0 .289-.023.289-.068v-.034s.037.049.037.148c0 .098-.022.121-.045.053-.022-.069 0-.042-.375 0-.097 0-.119 0-.119.045 0 .046-.034.065-.045.03l.007-.003Zm2.271-.182c-.06-.038-.06-.038-.03-.076a.289.289 0 0 1 .374 0l.042.034-.064.042a.326.326 0 0 1-.307 0h-.015Zm4.893 0c-.06-.03-.06-.046 0-.088a.276.276 0 0 1 .341 0c.03.038.03.038-.03.076a.372.372 0 0 1-.296 0l-.015.012Zm-6.999-.213a.309.309 0 0 1-.191-.38.31.31 0 0 1 .193-.192.302.302 0 0 1 .268.04.297.297 0 0 1 .094.105.296.296 0 0 1 0 .274.297.297 0 0 1-.094.104.372.372 0 0 1-.27.05Zm.195-.091a.226.226 0 0 0 .15-.144.21.21 0 0 0-.019-.116.2.2 0 0 0-.079-.085.304.304 0 0 0-.18-.023c-.101 0-.123 0-.161.057a.22.22 0 0 0-.026.22.296.296 0 0 0 .247.099h.068v-.008Zm.123-.554c-.048 0-.041-.06 0-.06.042 0 .045 0 .053-.058.022-.114.019-.125-.071-.14a.24.24 0 0 0-.094 0 .246.246 0 0 0-.022.08c0 .037-.023.072-.038.075-.015.004-.022 0 0-.083v-.095h-.18c-.041 0-.049 0-.06.038-.011.038-.018.045-.03.045-.011 0 0-.102 0-.216 0-.057.038-.057.045 0 .008.057.023.042.233.076.209.034.228.03.251 0 .022-.03.056-.026.033.133-.022.239-.018.235-.12.205Zm2.155-.156c-.049-.026-.049-.042 0-.08a.217.217 0 0 1 .21 0c.033.027.033.03 0 .058a.235.235 0 0 1-.21.022Zm4.271 0c-.03 0-.052-.034-.052-.045 0-.012.067-.057.135-.057.067 0 .161.06.131.095a.235.235 0 0 1-.214 0v.007Zm-4.47-.216c-.026 0-.041-.027-.041-.034 0-.008.045-.042.105-.069.06-.026.109-.053.086-.098a.174.174 0 0 1-.026-.08c0-.027 0-.027.049 0 .048.027.135.091.135.137.001.028.01.055.026.08.026.037.026.041-.026.068a.502.502 0 0 1-.308-.012v.008Zm4.56 0c-.056 0-.063-.053-.022-.091s.026-.03.022-.042c-.004-.011.026-.106.098-.144l.071-.038v.045a.202.202 0 0 1-.023.08c-.026.034-.022.038.083.084a.44.44 0 0 1 .108.068c0 .053-.228.08-.337.038Zm-3.747-.103c-.03-.049 0-.155.049-.292.033-.072.06-.147.079-.224 0-.072 0-.076-.071-.125a.32.32 0 0 1-.15-.304.414.414 0 0 1 .018-.144c0-.03.027-.03.109.027a.56.56 0 0 1 .146.151.359.359 0 0 1 .056.243.83.83 0 0 1-.03.243c-.05.148-.119.288-.206.418v.007Zm3.163-.106c-.199-.38-.225-.645-.094-.831.064-.087.206-.19.232-.167.018.043.026.09.023.136a.32.32 0 0 1-.034.202.399.399 0 0 1-.183.17c-.027 0 0 .164.086.327s.063.152.048.216v.076l-.078-.129Zm-6.051-.273a.084.084 0 0 1-.023-.044.085.085 0 0 1 .005-.05.084.084 0 0 1 .031-.039.083.083 0 0 1 .046-.015c.021 0 .041.007.056.022a.082.082 0 0 1 .027.054.085.085 0 0 1-.02.058.083.083 0 0 1-.025.018.083.083 0 0 1-.03.007.09.09 0 0 1-.067-.019v.008Zm2.697-.084a.244.244 0 0 1-.116-.193c0-.046.023-.046.105 0a.24.24 0 0 1 .08.08c.021.034.033.07.036.11 0 .034-.022.034-.097-.004l-.008.007Zm3.504 0a.34.34 0 0 1 .082-.178.26.26 0 0 1 .086-.042c.049 0 .053 0 .053.046a.208.208 0 0 1-.124.178c-.079.027-.097.027-.097-.011v.007Zm-2.897-.284c.026-.126-.022-.262-.221-.65-.198-.387-.217-.455-.086-.379.06.034.064.034.157 0a.65.65 0 0 1 .117-.042s.037.034.059.076c.057.099.117.13.18.084.064-.046.049-.038.038-.118-.026-.163-.034-.152.135-.224l.191-.083c.022 0 .037 0 .063.068.027.068.102.152.158.136.056-.015.094-.075.067-.2 0-.061-.022-.114 0-.114a2.37 2.37 0 0 1 .375-.145c.068.018.135.043.199.072.127.057.161.08.161.107v.133c0 .053 0 .094.037.125.038.03.128 0 .184-.099l.048-.095.15.069.195.083c.03 0 .041.023.03.05a.671.671 0 0 0-.022.117c0 .076 0 .087.041.118.041.03.124 0 .172-.084.023-.042.053-.076.064-.076a.728.728 0 0 1 .127.046c.101.045.101.045.135 0 .034-.046.083-.05.105-.027-.05.131-.11.258-.18.38-.195.38-.243.531-.225.656v.065l-.123-.118a1.75 1.75 0 0 0-.203-.174.23.23 0 0 1-.074-.065.754.754 0 0 1 .172-.129v.042c0 .023.03.087.06.087s.045-.042.071-.09c.026-.05.064-.092-.105-.19a2.14 2.14 0 0 0-.869-.278c-.079 0-.098-.026-.056-.072.041-.045.783.114 1.067.319.034.023.06.03.072.019a2.3 2.3 0 0 0 .161-.28s-.026-.027-.064-.039c-.037-.011-.067-.019-.12.034a.213.213 0 0 1-.374-.174c0-.038 0-.05-.098-.088l-.105-.049-.06.064a.178.178 0 0 1-.217.061.221.221 0 0 1-.139-.205c0-.064 0-.083-.056-.106-.056-.023-.082 0-.082.057a1.05 1.05 0 0 1-.094.273 1.007 1.007 0 0 1-.101-.292c0-.05-.019-.06-.041-.05l-.064.02c-.026 0-.034.03-.034.102a.165.165 0 0 1-.052.148.205.205 0 0 1-.323-.026l-.029-.046-.105.042c-.105.042-.105.045-.109.125a.203.203 0 0 1-.202.197.153.153 0 0 1-.154-.049c-.06-.053-.071-.057-.124-.034-.052.023-.056.026-.056.038.042.093.089.183.143.27 0 .022.048 0 .183-.073.287-.182.621-.272.959-.258.075.038.038.068-.105.08-.199.019-.394.07-.577.152a1.604 1.604 0 0 0-.374.212s0 .06.041.11.052.088.09.061a.083.083 0 0 0 .031-.03.086.086 0 0 0 .01-.042v-.042a.824.824 0 0 1 .172.13.616.616 0 0 1-.093.075 1.75 1.75 0 0 0-.203.175c-.108.106-.112.106-.101.05v.007Zm-2.934-.156a.376.376 0 0 1-.202-.163.358.358 0 0 1 0-.289c.056-.117.083-.132.139-.09.056.041.078.09 0 .075-.079-.015-.068 0-.094.042a.203.203 0 0 0-.028.083.198.198 0 0 0 .008.087.206.206 0 0 0 .114.126.324.324 0 0 0 .262.023.23.23 0 0 0 .086-.19c0-.057.026-.076.049-.023a.29.29 0 0 1-.013.162.287.287 0 0 1-.096.13.307.307 0 0 1-.24.03l.015-.003Zm3.395-.262a.114.114 0 0 1-.03-.091c0-.042.026-.053.161-.106s.158-.061.203-.03c.045.03.067.151 0 .136a.487.487 0 0 0-.274.11c.004.03-.019.023-.06-.026v.007Zm1.405.02c0-.039-.236-.13-.266-.103-.03.026-.026 0-.037-.03a.086.086 0 0 1-.007-.036.085.085 0 0 1 .059-.082c.038-.023.06-.02.195.034.135.053.15.06.161.114.011.053 0 .064-.034.09-.033.027-.071.039-.071.004v.008Zm-4.387-.164a1.426 1.426 0 0 0-.165-.258c-.169-.228-.188-.277-.116-.308.094.012.187.034.277.065.097.037.2.058.303.064h.053l-.06.095c-.034.053-.071.095-.086.095s-.027 0 0-.053c.026-.053 0-.038-.06-.057-.06-.019-.075-.019-.09 0a.758.758 0 0 1-.06.087l-.045.065.049.064c.045.057.048.061.078.035.03-.027.056 0 0 .08-.056.079-.078.075-.078.018v.008Zm-.034-.334c.022-.03.034-.065.022-.072a.896.896 0 0 0-.224-.065.936.936 0 0 0 .149.194.259.259 0 0 0 .053-.065v.008Zm3.556.322a.08.08 0 0 1-.019-.05.08.08 0 0 1 .019-.052c.026-.05.03-.053.198-.053.169 0 .173 0 .203.045a.08.08 0 0 1 .015.048.08.08 0 0 1-.015.047c-.023.05-.042.061-.06.027a.458.458 0 0 0-.293 0c-.018.026-.026.023-.052-.023l.004.011Zm-3.151-.523c0-.05 0-.072-.165-.205s-.176-.144-.206-.126c-.03.02-.057 0 .018-.098.075-.099.087-.087.098-.076.011.011 0 .026 0 .045 0 .02-.041.023.18.213.153.137.176.148.194.114.019-.034.045-.023.045 0a.724.724 0 0 1-.149.178s-.015-.022-.015-.053v.008Zm.164-.274c-.063-.083-.052-.098.045-.06.098.038.068 0 .109-.023.041-.023.075-.106.034-.148-.041-.042-.094-.046-.184 0a.203.203 0 0 1-.236 0c-.075-.076-.049-.182.075-.285.124-.102.101-.06.139 0 .037.06 0 .076-.049.046s-.052 0-.094.026c-.041.027-.056.11 0 .145.056.034.049.026.131 0 .083-.027.221-.046.266 0a.149.149 0 0 1 .03.19.428.428 0 0 1-.202.174.121.121 0 0 1-.06-.05l-.004-.015Zm.353-.349c-.038-.08-.023-.102.037-.06a.1.1 0 0 0 .146 0 .109.109 0 0 0 .035-.04.13.13 0 0 0 .014-.052c0-.072-.041-.102-.124-.087-.228.038-.24.038-.288 0-.049-.038-.049-.205.105-.304.078-.049.078-.049.123.038.045.088 0 .076-.048.042-.049-.034-.049-.026-.09 0-.101.069-.072.186.045.17.258-.037.254-.037.303 0a.182.182 0 0 1 0 .225.461.461 0 0 1-.195.129c-.026-.004-.037-.011-.063-.068v.007Zm2.739-.019a.125.125 0 0 1-.031-.042.126.126 0 0 1-.01-.05.13.13 0 0 1 .01-.052.125.125 0 0 1 .031-.042.134.134 0 0 1 .194 0 .14.14 0 0 1 .04.099.14.14 0 0 1-.04.099.12.12 0 0 1-.047.03c-.018.007-.037.01-.056.007a.124.124 0 0 1-.091-.06v.011Zm-2.305-.209a.096.096 0 0 1 .023-.041c.018 0-.023-.107-.139-.285l-.034-.05h.251l-.052.039-.049.038.041.064c.072.125.075.125.162.076.086-.05.075-.05.063-.095-.011-.045 0-.05 0-.05s.086.073.086.1c-.107.076-.22.146-.337.208h-.03l.015-.004Zm.645-.38h.052-.052Z" fill="#fff"/></g><path fill-rule="evenodd" clip-rule="evenodd" d="M323.996 107.025a32.422 32.422 0 0 1-40.942-4.035 32.423 32.423 0 0 1-4.031-40.943 32.424 32.424 0 0 1 49.89-4.912 32.426 32.426 0 0 1-4.917 49.89Zm-1.566-51.582a29.606 29.606 0 0 0-46.054 24.62 29.611 29.611 0 0 0 18.278 27.354 29.604 29.604 0 0 0 32.266-6.42 29.604 29.604 0 0 0-4.49-45.554Z" fill="#fff"/><path d="M314.042 77.69c.208.05.518.05.518.155-.102.416-.726.518-1.036.934h-.155c-.155.1-.106.36-.261.36a.738.738 0 0 0-.465.053.882.882 0 0 0 .779.31.23.23 0 0 1 .155.208.15.15 0 0 0 .102-.053c.053 0 .102 0 .102.053v.208c-.151.204-.412.102-.62.155.391.102.801.102 1.191 0 .311-.102 0-.624.208-.881-.102 0 0-.155-.102-.155.102-.103.205-.258.31-.31a.37.37 0 0 0 .31-.156c0-.105-.208-.155-.155-.26.31-.208.568-.519.466-.829-.05-.155-.466-.155-.726-.257a1.707 1.707 0 0 0-.882.053 4.21 4.21 0 0 0-.775.204c-.356.12-.69.294-.99.518a7.14 7.14 0 0 1 1.145-.31c.292-.038.589-.038.881 0Zm-24.832 2.97a.329.329 0 0 0 .072-.076l-.076-.03.004.106Zm1.488 6.34a12.734 12.734 0 0 0 3.039-.99c-1.158-.892-2.584-1.284-3.983-1.674.241.905.556 1.788.944 2.64V87Zm2.379 3.755a16.139 16.139 0 0 1-.782-1.01c1.241-.284 2.577-.33 3.772-.742.155-.103.313-.205.465-.31.261-.103.469-.364.779-.519.419-.286.73-.706.881-1.191a.188.188 0 0 0-.049-.102 8.08 8.08 0 0 1-2.281 1.71c-1.089.567-2.28.464-3.418.62.049-.103.155-.103.257-.103 0-.155.106-.208.208-.31h.155c.053 0 .053-.106.106-.106.102 0 .257-.052.204-.052-.155-.205-.465.158-.723 0 .103-.103.05-.258.156-.31h.204a.358.358 0 0 1 .106-.205c.775-.469 1.501-.832 2.227-1.244-.155 0-.26.155-.416.052.106 0 0-.158.106-.158.568-.155 1.033-.462 1.604-.66-.205 0-.363.159-.571 0 .106-.053.155-.155.313-.155v-.155c0-.05.053-.05.103-.05a.187.187 0 0 1-.103-.052c.053-.106.208-.053.307-.159-.049 0-.155 0-.155-.05.175-.18.41-.29.66-.31-.053-.105-.208 0-.208-.105 0-.05.053-.05.103-.05h-.103c-.102-.052-.052-.155-.052-.207.31-.364.31-.829.468-1.241-.053 0-.105 0-.105-.056-.518.57-1.347.778-2.122.99h-.261a1.027 1.027 0 0 1-.878-.053 3.626 3.626 0 0 1-.521-.413 5.996 5.996 0 0 0-1.294-.623 12.01 12.01 0 0 0-2.798-.548c-.023-.126-.043-.254-.063-.38.228-.046.459-.092.686-.158.882-.26 1.71-.571 2.64-.522a1.792 1.792 0 0 0-.514 0 8.552 8.552 0 0 0-2.231.33 6.054 6.054 0 0 0-.607.162c-.037-.26-.063-.518-.086-.782.108-.028.219-.045.33-.053.934-.155 1.815 0 2.749.103.668.07 1.33.192 1.98.363.257 0 .31.415.518.465.31.105.62 0 .934.208 0-.103-.053-.208 0-.31.204-.208.462.052.66-.053.412-.26-.366-.726-.571-1.09a.184.184 0 0 1 .053-.102c.412.364.722.776 1.241 1.037.26.105.881.26.775-.05-.257-.57-.775-1.036-1.188-1.554v-.208c-.106 0-.106-.053-.155-.106v-.204c-.208-.106-.155-.33-.261-.469-.155-.257-.053-.623-.155-.93a5.242 5.242 0 0 1-.191-.885c-.155-.88-.363-1.65-.466-2.485-.105-.99.568-1.762 1.033-2.64a4.494 4.494 0 0 1 1.452-1.65 4.571 4.571 0 0 1 .99-1.65c.416-.505 1.033-.765 1.601-1.036 3.96-1.782 8.874-1.419 12.748 0 .398.182.74.468.99.828.105.152.26.466.158.66-.105.261-.158.66-.416.776a1.893 1.893 0 0 1-1.089.106 2.545 2.545 0 0 1-.62-.106c.775.31 1.501.66 2.02 1.4.052.101.26.154.465.154.053 0 .053.106.053.155-.103.103-.208.155-.155.31h.155c.26-.102.208-.62.567-.465a.58.58 0 0 1 .208.779 5.711 5.711 0 0 1-.62.515.445.445 0 0 0 0 .366c.131.184.219.395.257.617.155.367.208.779.363 1.142a7.23 7.23 0 0 1 .363 2.33c0 .416-.204.779-.049 1.191a4.4 4.4 0 0 0 .567 1.09c.209.263.4.541.571.83.31.516.878 1.034.621 1.65-.156.367-.723.31-1.086.519-.31.26-.053.66.102.934.261.465-.31.775-.66.93.102.155.31.106.363.208.053.258.31.413.155.66-.208.31-.828.469-.518.934.208.363.073.766-.053 1.139a1.271 1.271 0 0 1-.93.775 2.071 2.071 0 0 1-.99.053.735.735 0 0 0-.33-.102c-.878-.106-1.759-.363-2.64-.363-.25.037-.494.107-.726.207a4.954 4.954 0 0 0-1.753 2.505 27.584 27.584 0 0 0-.359 2.125c-.763.123-.522.188-2.337.188-1.815 0-5.415-.815-7.652-2.22l.095-.093a14.733 14.733 0 0 1 2.31-2.247c.053-.053.053-.155.106-.208-.261.106-.416.33-.66.416-.053 0-.106-.053-.053-.103l.604-.445c0 .053-.053.053-.102.053-.05 0-.053-.053-.053-.102-.66-.106-1.191.36-1.65.775-.106.053-.208-.053-.261-.053-.775.26-1.346.934-2.125 1.244v-.102a9.665 9.665 0 0 1-.927.376c-.428.07-.862.09-1.294.056-.413.044-.824.11-1.231.195" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M321.054 57.51a27.127 27.127 0 0 0-34.253 3.376 27.128 27.128 0 0 0-3.373 34.254 27.13 27.13 0 0 0 47.621-25.457 27.123 27.123 0 0 0-9.995-12.174Zm-24.365 8.649a16.727 16.727 0 0 1 24.745 7.503 16.719 16.719 0 0 1-1.545 15.692 16.72 16.72 0 0 1-17.167 7.112 16.724 16.724 0 0 1-6.033-30.307Zm25.547-.435.762-.66.083.093c.16.155.274.351.33.567a.462.462 0 0 1-.044.223.459.459 0 0 1-.148.173.414.414 0 0 1-.389.126 1.324 1.324 0 0 1-.515-.436l-.079-.086Zm-.396 2.927.63-1.947a.932.932 0 0 0 .66.251.989.989 0 0 0 .66-.264.985.985 0 0 0 .393-.802 1.713 1.713 0 0 0-.482-.99l-.772-.89-2.914 2.52.541.624 1.36-1.178-.7 1.944.624.732Zm-4.561-4.438 2.251-3.138.66.475-2.231 3.138-.68-.475Zm-1.623-4.6-1.3 2.87-.749-.33 1.3-2.87-.862-.403.291-.637 2.468 1.115-.287.637-.861-.382Zm-7.534.56.544-.428c.03.146.105.278.215.38a.768.768 0 0 0 .403.194.7.7 0 0 0 .475-.053.453.453 0 0 0 .227-.33c.033-.181-.118-.393-.455-.637l-.254-.188a2.165 2.165 0 0 1-.601-.63.993.993 0 0 1 .426-1.32c.313-.163.673-.21 1.016-.132.206.034.402.111.575.227.158.12.286.277.373.456l-.561.373a.622.622 0 0 0-.182-.287.686.686 0 0 0-.33-.142.597.597 0 0 0-.409.05.391.391 0 0 0-.205.286c-.036.202.129.42.489.66l.165.11c.25.16.463.373.623.623a.97.97 0 0 1 .119.66 1.069 1.069 0 0 1-.518.785 1.436 1.436 0 0 1-1.033.145 1.775 1.775 0 0 1-.719-.283 1.032 1.032 0 0 1-.386-.515l.003-.003Zm-4.815.575-.277-3.848 2.261-.175.049.703-1.439.109.06.789 1.429-.106.052.696-1.422.11.073.96 1.422-.116.056.7-2.264.178Zm-4.379 1.148-2.584-3.194.865-.29 1.478 2.035c.03.043.079.12.152.238l.231.4a4.936 4.936 0 0 1-.073-.44 2.8 2.8 0 0 1-.023-.33l-.043-2.491.852-.29-.122 4.108-.733.254Zm-6.243 3.861.62-.488-1.363-1.73a7.11 7.11 0 0 0-.274-.33 3.124 3.124 0 0 0-.241-.237c.152.086.284.155.4.208.093.045.19.083.29.112l2.792.713.637-.505-2.383-3.02-.617.486 1.32 1.692c.102.133.195.245.271.33.077.086.158.168.244.245a4.627 4.627 0 0 0-.396-.208 1.784 1.784 0 0 0-.294-.11l-2.726-.709-.66.528 2.38 3.023Zm-2.363 2.73-3.026-2.38.508-.66 3.016 2.392-.498.647Zm28.911 27.109.66.769.092-.083c.187-.13.336-.306.433-.511a.437.437 0 0 0-.126-.393.468.468 0 0 0-.396-.195 1.21 1.21 0 0 0-.567.33l-.096.083Zm1.64.534 1.947.64-.709.62-1.941-.712 1.168 1.366-.623.538-2.505-2.93.871-.763a1.71 1.71 0 0 1 .99-.475.992.992 0 0 1 .799.396c.162.182.254.416.26.66a.936.936 0 0 1-.257.66Zm-5.108 1.142 1.95 3.326.709-.419-1.947-3.323-.712.416Zm-5.204 2.162 1.247 3.63.746-.271-.713-2.082a6.788 6.788 0 0 0-.152-.403 3.363 3.363 0 0 0-.148-.304c.115.132.214.241.307.33.074.075.154.142.24.202l2.396 1.594.766-.261-1.248-3.63-.742.257.696 2.063.009.023c.052.148.096.272.14.37.045.104.096.207.152.306a4.408 4.408 0 0 0-.307-.33 1.596 1.596 0 0 0-.241-.201l-2.34-1.567-.808.274Zm-3.993.429.29 3.841 2.26-.172-.052-.699-1.439.112-.076-.964 1.442-.109-.053-.699-1.439.109-.062-.789 1.442-.109-.056-.693-2.257.172Zm-5.188-.393.957 3.976.782.109 1.874-3.66-.894-.105-1.036 2.27c-.033.08-.073.182-.116.304a6.48 6.48 0 0 0-.125.429 14.425 14.425 0 0 0-.076-.743l-.462-2.474-.904-.106Zm-2.99-1.115-2.805 3.019.805.333.558-.66 1.383.561v.875l.864.353.066-4.132-.871-.35Zm.086 1.26-.066 1.32-.993-.399.848-.99c.023-.03.062-.083.119-.169l.188-.283c-.013.055-.022.106-.031.154a1.562 1.562 0 0 1-.039.176c-.026.089-.026.155-.026.191Zm-3.257-2.924-1.32 1.106.402.274 1.578-.938-.66-.442Zm-3.168-2.544-2.67 2.779 1.541 1.481.485-.505-.947-.914 2.185-2.27-.594-.571Z" fill="#fff"/><defs><clipPath id="a"><path fill="#fff" transform="translate(120 68)" d="M0 0h117v24H0z"/></clipPath></defs></svg> \ No newline at end of file +<svg width="360" height="127" viewBox="0 0 360 127" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_627_41819)"> +<path d="M160.262 37.9602C160.318 37.9602 160.364 38.0046 160.364 38.0616V38.7481C160.364 41.9748 158.887 43.3586 156.574 43.3586C154.261 43.3586 152.725 41.9748 152.725 38.7481V37.5137C152.725 34.2124 154.277 32.8303 156.574 32.8303C158.623 32.8303 159.941 33.9474 160.3 36.0267C160.311 36.0889 160.262 36.1459 160.2 36.1459H158.728C158.682 36.1459 158.641 36.1121 158.63 36.0676C158.365 34.9292 157.712 34.3316 156.574 34.3316C155.2 34.3316 154.455 35.2245 154.455 37.439V38.7481C154.455 40.9644 155.2 41.8556 156.574 41.8556C157.947 41.8556 158.536 41.0907 158.661 39.4899C158.661 39.4756 158.65 39.4614 158.636 39.4614H156.72C156.665 39.4614 156.618 39.4169 156.618 39.36V38.0598C156.618 38.0046 156.663 37.9584 156.72 37.9584H160.262V37.9602Z" fill="white"/> +<path d="M165.567 37.5741C167.026 37.5741 167.739 37.1881 167.739 36.0319C167.739 34.8758 167.026 34.4755 165.567 34.4755H163.94C163.926 34.4755 163.915 34.4862 163.915 34.5004V37.5492C163.915 37.5634 163.926 37.5741 163.94 37.5741H165.567ZM167.861 43.1522L165.916 39.0718C165.916 39.0718 165.904 39.0575 165.893 39.0575H163.94C163.926 39.0575 163.915 39.0682 163.915 39.0824V43.1077C163.915 43.1628 163.871 43.2091 163.814 43.2091H162.29C162.235 43.2091 162.189 43.1646 162.189 43.1077V33.0775C162.189 33.0223 162.233 32.9761 162.29 32.9761H165.686C168.051 32.9761 169.466 33.9988 169.466 36.0301C169.466 37.4282 168.806 38.33 167.632 38.764C167.618 38.7694 167.611 38.7854 167.618 38.7978L169.721 43.0615C169.755 43.129 169.705 43.2073 169.63 43.2073H167.952C167.912 43.2073 167.877 43.1842 167.861 43.1504" fill="white"/> +<path d="M173.83 39.6054H176.498C176.516 39.6054 176.527 39.5894 176.522 39.5716L175.188 35.5392C175.18 35.5161 175.147 35.5161 175.139 35.5392L173.805 39.5716C173.8 39.5876 173.812 39.6054 173.828 39.6054M170.82 43.0739L174.321 33.0437C174.335 33.0028 174.372 32.9761 174.417 32.9761H175.91C175.953 32.9761 175.992 33.0028 176.006 33.0437L179.507 43.0739C179.531 43.1397 179.481 43.2073 179.411 43.2073H177.797C177.754 43.2073 177.715 43.1788 177.701 43.1379L177.03 41.1049C177.026 41.0942 177.018 41.0871 177.007 41.0871H173.338C173.327 41.0871 173.317 41.0942 173.315 41.1049L172.644 43.1379C172.63 43.1788 172.592 43.2073 172.548 43.2073H170.918C170.848 43.2073 170.8 43.1397 170.821 43.0739" fill="white"/> +<path d="M187.974 33.0794V43.1097C187.974 43.1648 187.929 43.211 187.872 43.211H186.499C186.463 43.211 186.431 43.1933 186.412 43.1612L182.308 36.3345C182.295 36.3131 182.261 36.322 182.261 36.3469V43.1097C182.261 43.1648 182.217 43.211 182.16 43.211H180.695C180.64 43.211 180.594 43.1666 180.594 43.1097V33.0794C180.594 33.0243 180.638 32.978 180.695 32.978H182.024C182.06 32.978 182.092 32.9958 182.111 33.0278L186.26 39.9435C186.272 39.9649 186.306 39.956 186.306 39.9311V33.0794C186.306 33.0243 186.351 32.978 186.408 32.978H187.872C187.928 32.978 187.974 33.0225 187.974 33.0794Z" fill="white"/> +<path d="M195.433 38.7018V37.4851C195.433 35.3791 194.779 34.4755 193.305 34.4755H191.59C191.575 34.4755 191.565 34.4862 191.565 34.5004V41.7007C191.565 41.715 191.575 41.7256 191.59 41.7256H193.305C194.779 41.7256 195.433 40.806 195.433 38.7M189.84 43.1077V33.0775C189.84 33.0223 189.884 32.9761 189.942 32.9761H193.307C195.613 32.9761 197.16 34.207 197.16 37.4834V38.7C197.16 41.9764 195.612 43.2073 193.307 43.2073H189.942C189.886 43.2073 189.84 43.1628 189.84 43.1059" fill="white"/> +<path d="M229.767 34.8831C228.742 34.8831 228.191 35.6248 228.191 37.3003V38.9012C228.191 40.5768 228.74 41.3185 229.767 41.3185C230.795 41.3185 231.344 40.5768 231.344 38.9012V37.3003C231.344 35.6248 230.795 34.8831 229.767 34.8831Z" fill="white"/> +<path d="M203.404 25.2441V50.9592H251.187V25.2441H203.404ZM217.65 43.1168C217.65 43.1719 217.605 43.2182 217.548 43.2182H211.268C211.213 43.2182 211.166 43.1737 211.166 43.1168V33.0865C211.166 33.0314 211.211 32.9852 211.268 32.9852H213.533C213.588 32.9852 213.635 33.0296 213.635 33.0865V41.146C213.635 41.1602 213.645 41.1709 213.66 41.1709H217.548C217.603 41.1709 217.65 41.2153 217.65 41.2722V43.1168ZM225.246 33.1328L222.128 39.1182C222.128 39.1182 222.125 39.1253 222.125 39.1307V43.1168C222.125 43.1719 222.08 43.2182 222.023 43.2182H219.756C219.701 43.2182 219.654 43.1737 219.654 43.1168V39.1307C219.654 39.1307 219.654 39.1218 219.651 39.1182L216.533 33.1328C216.497 33.0652 216.547 32.9852 216.622 32.9852H219.23C219.269 32.9852 219.305 33.0083 219.323 33.0439L220.864 36.4483C220.873 36.4679 220.901 36.4679 220.91 36.4483L222.451 33.0439C222.467 33.0083 222.503 32.9852 222.544 32.9852H225.151C225.228 32.9852 225.276 33.0652 225.241 33.1328H225.246ZM233.811 38.9012C233.811 41.9553 232.1 43.364 229.766 43.364C227.431 43.364 225.72 41.9553 225.72 38.9012V37.3003C225.72 34.216 227.431 32.8375 229.766 32.8375C232.1 32.8375 233.811 34.216 233.811 37.3003V38.9012ZM243.424 43.115C243.424 43.1701 243.38 43.2164 243.323 43.2164H241.486C241.452 43.2164 241.42 43.2004 241.402 43.1719L237.701 37.6223C237.687 37.601 237.655 37.6116 237.655 37.6365V43.1168C237.655 43.1719 237.61 43.2182 237.553 43.2182H235.436C235.38 43.2182 235.334 43.1737 235.334 43.1168V33.0865C235.334 33.0314 235.379 32.9852 235.436 32.9852H237.243C237.276 32.9852 237.308 33.0029 237.326 33.0296L241.056 38.654C241.07 38.6753 241.102 38.6646 241.102 38.6397V33.0848C241.102 33.0296 241.147 32.9834 241.204 32.9834H243.321C243.376 32.9834 243.423 33.0278 243.423 33.0848V43.115H243.424Z" fill="white"/> +<path d="M148.521 10.8292H147.445C147.431 10.8292 147.42 10.8398 147.42 10.8541V13.0721C147.42 13.0864 147.431 13.097 147.445 13.097H148.521C149.518 13.097 150.231 12.9636 150.231 11.9996C150.231 11.0355 149.518 10.8274 148.521 10.8274V10.8292Z" fill="white"/> +<path d="M177.021 10.6816C175.995 10.6816 175.444 11.4234 175.444 13.0989V14.6998C175.444 16.3753 175.994 17.1171 177.021 17.1171C178.048 17.1171 178.598 16.3753 178.598 14.6998V13.0989C178.598 11.4234 178.048 10.6816 177.021 10.6816Z" fill="white"/> +<path d="M158.225 10.6816C157.2 10.6816 156.649 11.4234 156.649 13.0989V14.6998C156.649 16.3753 157.198 17.1171 158.225 17.1171C159.253 17.1171 159.802 16.3753 159.802 14.6998V13.0989C159.802 11.4234 159.253 10.6816 158.225 10.6816Z" fill="white"/> +<path d="M167.213 10.8293H166.287C166.273 10.8293 166.262 10.84 166.262 10.8542V13.4885C166.262 13.5028 166.273 13.5134 166.287 13.5134H167.213C168.506 13.5134 169.072 13.1275 169.072 12.1047C169.072 11.274 168.506 10.8293 167.213 10.8293Z" fill="white"/> +<path d="M108.056 1.04272V26.756H204.922V1.04272H108.056ZM125.958 18.9154C125.958 18.9705 125.914 19.0168 125.857 19.0168H123.74C123.684 19.0168 123.638 18.9723 123.638 18.9154V13.3373C123.638 13.3106 123.602 13.3017 123.59 13.3266L121.555 17.2718C121.537 17.3056 121.503 17.327 121.465 17.327H120.265C120.228 17.327 120.192 17.3056 120.174 17.2718L118.184 13.3729C118.171 13.3497 118.136 13.3586 118.136 13.3835V18.9171C118.136 18.9723 118.091 19.0185 118.034 19.0185H115.917C115.861 19.0185 115.815 18.9741 115.815 18.9171V8.88691C115.815 8.83177 115.86 8.78552 115.917 8.78552H118.045C118.082 8.78552 118.116 8.80687 118.134 8.83888L120.863 13.9332C120.872 13.9509 120.898 13.9509 120.907 13.9332L123.622 8.83888C123.64 8.80509 123.674 8.78552 123.711 8.78552H125.853C125.908 8.78552 125.955 8.82999 125.955 8.88691V18.9171L125.958 18.9154ZM134.004 10.7297C134.004 10.7848 133.958 10.8311 133.903 10.8311H130.016C130.002 10.8311 129.991 10.8417 129.991 10.856V12.6738C129.991 12.688 130.002 12.6987 130.016 12.6987H133.458C133.514 12.6987 133.558 12.7432 133.558 12.7983V14.6446C133.558 14.6998 133.512 14.746 133.457 14.746H130.016C130.002 14.746 129.991 14.7567 129.991 14.7709V16.9445C129.991 16.9588 130.002 16.9694 130.016 16.9694H133.904C133.96 16.9694 134.004 17.0139 134.004 17.069V18.9154C134.004 18.9705 133.958 19.0168 133.903 19.0168H127.622C127.567 19.0168 127.523 18.9723 127.523 18.9171V8.88513C127.523 8.82999 127.569 8.78374 127.624 8.78374H128.955C128.964 8.78374 128.973 8.77841 128.976 8.77129L129.939 7.15443C129.959 7.12597 129.991 7.10818 130.027 7.10818H132.527C132.613 7.10818 132.659 7.20601 132.608 7.27182L131.532 8.74283C131.52 8.75884 131.532 8.78374 131.552 8.78374H133.903C133.958 8.78374 134.002 8.82821 134.002 8.88335V10.7297H134.004ZM143.384 10.7297C143.384 10.7848 143.34 10.8311 143.282 10.8311H140.732C140.718 10.8311 140.707 10.8417 140.707 10.856V18.9154C140.707 18.9705 140.662 19.0168 140.605 19.0168H138.34C138.285 19.0168 138.238 18.9723 138.238 18.9154V10.856C138.238 10.8417 138.228 10.8311 138.213 10.8311H135.663C135.608 10.8311 135.561 10.7866 135.561 10.7297V8.88513C135.561 8.82999 135.606 8.78374 135.663 8.78374H143.282C143.338 8.78374 143.384 8.82821 143.384 8.88513V10.7297ZM152.957 19.015H150.476C150.436 19.015 150.399 18.9919 150.383 18.9545L148.706 15.1587C148.703 15.1498 148.694 15.1445 148.683 15.1445H147.445C147.431 15.1445 147.42 15.1551 147.42 15.1694V18.9136C147.42 18.9687 147.376 19.015 147.319 19.015H145.054C144.998 19.015 144.952 18.9705 144.952 18.9136V8.88335C144.952 8.82821 144.997 8.78196 145.054 8.78196H148.819C151.184 8.78196 152.7 9.86521 152.7 11.9997C152.7 13.3248 152.113 14.2249 151.088 14.7033C151.075 14.7087 151.07 14.7247 151.075 14.7371L153.048 18.8709C153.08 18.9385 153.03 19.015 152.957 19.015ZM162.271 14.6998C162.271 17.7539 160.56 19.1626 158.225 19.1626C155.891 19.1626 154.18 17.7539 154.18 14.6998V13.0989C154.18 10.0146 155.891 8.63611 158.225 8.63611C160.56 8.63611 162.271 10.0146 162.271 13.0989V14.6998ZM167.661 15.5589H166.289C166.275 15.5589 166.264 15.5696 166.264 15.5838V18.9136C166.264 18.9687 166.22 19.015 166.162 19.015H163.897C163.842 19.015 163.796 18.9705 163.796 18.9136V8.88335C163.796 8.82821 163.84 8.78196 163.897 8.78196H167.662C170.028 8.78196 171.544 9.82074 171.544 12.1028C171.544 14.385 170.042 15.5571 167.662 15.5571L167.661 15.5589ZM181.066 14.6998C181.066 17.7539 179.356 19.1626 177.021 19.1626C174.686 19.1626 172.976 17.7539 172.976 14.6998V13.0989C172.976 10.0146 174.686 8.63611 177.021 8.63611C179.356 8.63611 181.066 10.0146 181.066 13.0989V14.6998ZM189.103 18.9136C189.103 18.9687 189.059 19.015 189.001 19.015H182.721C182.666 19.015 182.62 18.9705 182.62 18.9136V8.88335C182.62 8.82821 182.664 8.78196 182.721 8.78196H184.987C185.042 8.78196 185.088 8.82643 185.088 8.88335V16.9428C185.088 16.957 185.099 16.9677 185.113 16.9677H189.001C189.057 16.9677 189.103 17.0121 189.103 17.069V18.9136ZM197.16 10.7279C197.16 10.783 197.115 10.8293 197.058 10.8293H193.17C193.155 10.8293 193.145 10.84 193.145 10.8542V12.672C193.145 12.6863 193.155 12.6969 193.17 12.6969H196.612C196.667 12.6969 196.714 12.7414 196.714 12.7983V14.6429C196.714 14.698 196.669 14.7443 196.612 14.7443H193.17C193.155 14.7443 193.145 14.7549 193.145 14.7692V16.9428C193.145 16.957 193.155 16.9677 193.17 16.9677H197.058C197.113 16.9677 197.16 17.0121 197.16 17.069V18.9136C197.16 18.9687 197.115 19.015 197.058 19.015H190.778C190.723 19.015 190.676 18.9705 190.676 18.9136V8.88335C190.676 8.82821 190.721 8.78196 190.778 8.78196H197.058C197.113 8.78196 197.16 8.82643 197.16 8.88335V10.7279Z" fill="white"/> +<path d="M257.853 92.8526H258.466V91.575H259.443V91.069H258.466V90.3573H259.616V89.8514H257.853V92.8526Z" fill="white"/> +<path d="M260.199 92.8526H260.812V91.6393H261.128L261.935 92.8526H262.657L261.711 91.5235C262.022 91.382 262.199 91.1119 262.199 90.7475C262.199 90.1901 261.789 89.8514 261.123 89.8514H260.199V92.8526ZM261.158 90.3573C261.417 90.3573 261.568 90.5117 261.568 90.7389C261.568 90.9833 261.417 91.1333 261.158 91.1333H260.812V90.3573H261.158Z" fill="white"/> +<path d="M262.839 92.8526H263.492L263.781 92.0723H264.991L265.28 92.8526H265.933L264.788 89.8514H263.984L262.839 92.8526ZM263.971 91.5535L264.386 90.4259L264.801 91.5535H263.971Z" fill="white"/> +<path d="M266.443 92.8526H267.056V90.6832L268.409 92.8526H269.195V89.8514H268.582V92.0209L267.229 89.8514H266.443V92.8526Z" fill="white"/> +<path d="M271.432 92.3681C270.862 92.3681 270.456 91.9265 270.456 91.352C270.456 90.7775 270.862 90.3359 271.432 90.3359C271.778 90.3359 272.05 90.5031 272.223 90.7475L272.707 90.3745C272.43 90.01 271.981 89.7656 271.432 89.7656C270.477 89.7656 269.825 90.4945 269.825 91.352C269.825 92.2095 270.477 92.9384 271.432 92.9384C271.981 92.9384 272.43 92.6983 272.707 92.3253L272.223 91.9565C272.05 92.2009 271.778 92.3681 271.432 92.3681Z" fill="white"/> +<path d="M273.282 92.8526H275.045V92.3467H273.896V91.575H274.872V91.069H273.896V90.3573H275.045V89.8514H273.282V92.8526Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M269.688 99.605C270.459 98.9088 270.942 97.9055 270.942 96.79C270.942 95.6746 270.459 94.6713 269.688 93.9751C269.901 94.1019 270.098 94.2518 270.276 94.4212C270.777 95.0804 271.074 95.9008 271.074 96.79C271.074 97.6793 270.777 98.4997 270.276 99.1589C270.098 99.3283 269.901 99.4782 269.688 99.605ZM268.404 100.046C269.71 99.5327 270.634 98.2684 270.634 96.79C270.634 95.3117 269.71 94.0474 268.404 93.5345C268.268 93.5175 268.129 93.5088 267.988 93.5088C267.954 93.5088 267.92 93.5093 267.885 93.5104C269.385 93.8596 270.501 95.1955 270.501 96.79C270.501 98.3846 269.385 99.7204 267.885 100.07C267.92 100.071 267.954 100.071 267.988 100.071C268.129 100.071 268.268 100.063 268.404 100.046ZM266.746 93.7482C266.864 93.7346 266.985 93.7275 267.107 93.7275C268.811 93.7275 270.193 95.0987 270.193 96.79C270.193 98.4814 268.811 99.8525 267.107 99.8525C266.985 99.8525 266.864 99.8455 266.746 99.8319C266.59 99.7689 266.439 99.6945 266.296 99.6095C266.554 99.6823 266.826 99.7213 267.107 99.7213C268.738 99.7213 270.06 98.4089 270.06 96.79C270.06 95.1712 268.738 93.8588 267.107 93.8588C266.826 93.8588 266.554 93.8977 266.296 93.9705C266.439 93.8856 266.59 93.8111 266.746 93.7482ZM265.315 98.7211C265.159 98.509 265.028 98.2777 264.927 98.0314C265.36 98.7798 266.174 99.2838 267.107 99.2838C268.494 99.2838 269.62 98.1673 269.62 96.79C269.62 95.4128 268.494 94.2963 267.107 94.2963C266.174 94.2963 265.36 94.8002 264.927 95.5486C265.028 95.3024 265.159 95.0711 265.315 94.859C265.786 94.4282 266.415 94.165 267.107 94.165C268.568 94.165 269.752 95.3403 269.752 96.79C269.752 98.2398 268.568 99.415 267.107 99.415C266.415 99.415 265.786 99.1519 265.315 98.7211ZM267.107 98.8463C268.251 98.8463 269.179 97.9257 269.179 96.79C269.179 95.6544 268.251 94.7338 267.107 94.7338C265.962 94.7338 265.035 95.6544 265.035 96.79C265.035 97.9257 265.962 98.8463 267.107 98.8463ZM267.107 98.9775C268.324 98.9775 269.311 97.9982 269.311 96.79C269.311 95.5819 268.324 94.6025 267.107 94.6025C265.889 94.6025 264.902 95.5819 264.902 96.79C264.902 97.9982 265.889 98.9775 267.107 98.9775ZM268.738 96.79C268.738 97.684 268.008 98.4088 267.107 98.4088C266.206 98.4088 265.475 97.684 265.475 96.79C265.475 95.896 266.206 95.1713 267.107 95.1713C268.008 95.1713 268.738 95.896 268.738 96.79ZM268.87 96.79C268.87 97.7565 268.081 98.54 267.107 98.54C266.133 98.54 265.343 97.7565 265.343 96.79C265.343 95.8235 266.133 95.04 267.107 95.04C268.081 95.04 268.87 95.8235 268.87 96.79ZM267.107 97.9713C267.764 97.9713 268.297 97.4424 268.297 96.79C268.297 96.1377 267.764 95.6088 267.107 95.6088C266.449 95.6088 265.916 96.1377 265.916 96.79C265.916 97.4424 266.449 97.9713 267.107 97.9713ZM267.107 98.1025C267.837 98.1025 268.429 97.5149 268.429 96.79C268.429 96.0652 267.837 95.4775 267.107 95.4775C266.376 95.4775 265.784 96.0652 265.784 96.79C265.784 97.5149 266.376 98.1025 267.107 98.1025ZM267.856 96.79C267.856 97.2008 267.521 97.5338 267.107 97.5338C266.693 97.5338 266.357 97.2008 266.357 96.79C266.357 96.3793 266.693 96.0463 267.107 96.0463C267.521 96.0463 267.856 96.3793 267.856 96.79ZM267.988 96.79C267.988 97.2733 267.594 97.665 267.107 97.665C266.62 97.665 266.225 97.2733 266.225 96.79C266.225 96.3068 266.62 95.915 267.107 95.915C267.594 95.915 267.988 96.3068 267.988 96.79ZM267.415 96.79C267.415 96.9592 267.277 97.0963 267.107 97.0963C266.936 97.0963 266.798 96.9592 266.798 96.79C266.798 96.6209 266.936 96.4838 267.107 96.4838C267.277 96.4838 267.415 96.6209 267.415 96.79ZM267.547 96.79C267.547 97.0317 267.35 97.2275 267.107 97.2275C266.863 97.2275 266.666 97.0317 266.666 96.79C266.666 96.5484 266.863 96.3525 267.107 96.3525C267.35 96.3525 267.547 96.5484 267.547 96.79Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M272.753 93.646C272.244 93.8286 271.854 94.1863 271.57 94.6793L271.655 94.7354L272.753 93.646ZM272.03 94.982L271.774 94.8135L273.03 93.5667C273.182 93.5337 273.343 93.5144 273.513 93.5098L272.03 94.982ZM272.405 95.2286L272.149 95.0602L273.71 93.5112C273.841 93.517 273.967 93.5329 274.088 93.5582L272.405 95.2286ZM273.677 94.5851C273.624 94.577 273.569 94.5729 273.511 94.5729C273.409 94.5729 273.314 94.5856 273.225 94.6103L274.246 93.5976C274.354 93.6289 274.457 93.6684 274.553 93.7154L273.677 94.5851ZM272.57 96.9211V96.4985L272.991 96.0805H273.417L272.57 96.9211ZM271.59 99.1312C271.529 99.0521 271.471 98.9685 271.416 98.8805L272.279 98.0244C272.327 98.1245 272.376 98.2164 272.427 98.3003L271.59 99.1312ZM271.885 99.4571C271.812 99.3898 271.743 99.3175 271.677 99.2401L272.504 98.4197C272.565 98.5076 272.629 98.585 272.696 98.6523L271.885 99.4571ZM272.238 99.7255C272.151 99.6723 272.069 99.6134 271.99 99.5488L272.799 98.746C272.881 98.8134 272.968 98.8671 273.062 98.9079L272.238 99.7255ZM272.659 99.9258C272.556 99.8894 272.457 99.8464 272.363 99.797L273.207 98.9599C273.319 98.9916 273.44 99.007 273.57 99.007C273.575 99.007 273.58 99.0069 273.585 99.0069L272.659 99.9258ZM273.163 100.045C273.04 100.028 272.922 100.004 272.809 99.9729L273.805 98.9848C274.193 98.9089 274.479 98.6428 274.547 98.2491L275.514 97.2893C275.563 97.3856 275.602 97.4874 275.633 97.5939L273.163 100.045ZM273.766 100.065C273.704 100.069 273.642 100.071 273.578 100.071C273.497 100.071 273.419 100.068 273.342 100.063L275.67 97.7529C275.692 97.8705 275.703 97.9932 275.703 98.1202C275.703 98.1276 275.703 98.1351 275.703 98.1426L273.766 100.065ZM274.591 99.8649C274.407 99.9481 274.204 100.007 273.988 100.041L275.691 98.3506C275.67 98.5554 275.619 98.746 275.543 98.9199L274.591 99.8649ZM275.259 96.9231C275.328 96.998 275.389 97.0784 275.443 97.1637L274.561 98.0386C274.558 97.9097 274.533 97.7922 274.489 97.6878L275.259 96.9231ZM274.922 96.6394C275.008 96.6955 275.088 96.7574 275.161 96.8246L274.42 97.5594C274.366 97.4753 274.296 97.4025 274.213 97.3425L274.922 96.6394ZM274.876 96.489C274.847 96.5133 274.817 96.5367 274.787 96.5593C274.79 96.5615 274.794 96.5636 274.798 96.5657L274.091 97.2679C273.995 97.2192 273.887 97.1842 273.769 97.1642L275.423 95.5228C275.37 95.822 275.246 96.0884 275.058 96.3082L274.876 96.489ZM275.432 94.8952C275.446 94.9852 275.453 95.0789 275.453 95.1759C275.453 95.2179 275.452 95.2595 275.45 95.3006L273.59 97.1459C273.57 97.1451 273.549 97.1446 273.528 97.1446H273.165L275.432 94.8952ZM275.284 94.4237C275.332 94.5201 275.371 94.6231 275.399 94.7323L272.968 97.1446H272.57V97.1171L273.627 96.0675C273.997 96.0106 274.261 95.7697 274.299 95.4015L275.284 94.4237ZM275.028 94.0592C275.097 94.1323 275.159 94.212 275.213 94.2978L274.298 95.2064C274.284 95.0852 274.246 94.9799 274.189 94.8918L275.028 94.0592ZM274.681 93.7845C274.77 93.837 274.852 93.8966 274.927 93.9628L274.1 94.7839C274.027 94.7133 273.938 94.6596 273.835 94.624L274.681 93.7845ZM272.793 96.0805H272.57V96.3025L272.793 96.0805ZM271.699 98.4037L271.295 98.67C271.31 98.6995 271.327 98.7286 271.343 98.7573L271.699 98.4037Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M262.696 93.7467C262.596 93.734 262.493 93.7275 262.388 93.7275C262.268 93.7275 262.152 93.734 262.04 93.7467H262.696ZM260.86 94.1843C261.038 94.0604 261.231 93.9595 261.44 93.8843L263.236 93.8843C263.424 93.9595 263.595 94.0605 263.742 94.1843L260.86 94.1843ZM260.375 94.6217C260.47 94.5129 260.572 94.4127 260.681 94.3217H263.886C263.971 94.4127 264.044 94.513 264.105 94.6217H260.375ZM260.061 95.0592L260.053 95.0546C260.118 94.9511 260.187 94.8525 260.26 94.7592H262.102C261.849 94.7919 261.641 94.8978 261.459 95.0592H260.061ZM260.796 95.4966L260.292 95.1966H261.322C261.241 95.2859 261.166 95.3865 261.093 95.4966H260.796ZM263.025 95.9342C263.063 95.8391 263.088 95.7403 263.098 95.6342L264.291 95.6342C264.278 95.7372 264.257 95.8371 264.228 95.9342H263.025ZM262.747 96.3717C262.832 96.2707 262.903 96.1723 262.959 96.0717H264.181C264.142 96.1747 264.094 96.2745 264.04 96.3717H262.747ZM262.333 96.8092L262.336 96.8071C262.442 96.7016 262.539 96.6034 262.626 96.5092H263.957C263.891 96.612 263.818 96.7118 263.74 96.8092H262.333ZM261.878 97.2466L262.19 96.9466L263.624 96.9466C263.534 97.049 263.439 97.1488 263.342 97.2466H261.878ZM261.422 97.6842L261.735 97.3842L263.201 97.3842C263.185 97.3989 263.17 97.4135 263.155 97.4281L262.883 97.6842H261.422ZM260.966 98.1217L261.279 97.8217H262.737L262.418 98.1217H260.966ZM260.511 98.5593L260.823 98.2593H262.272L261.953 98.5593H260.511ZM260.245 98.9967V98.8147L260.368 98.6967H261.808L261.682 98.8147H264.462V98.9967H260.245ZM260.245 99.4342V99.1342H264.462V99.4342H260.245ZM264.462 99.5718V99.8525H260.245V99.5718H264.462ZM264.303 95.4966H263.102C263.098 95.3854 263.076 95.2851 263.039 95.1966H264.292C264.3 95.2665 264.305 95.3383 264.305 95.4119C264.305 95.4404 264.304 95.4686 264.303 95.4966ZM264.173 94.7592C264.214 94.8539 264.247 94.954 264.269 95.0592H262.962C262.843 94.8951 262.657 94.7915 262.431 94.7592H264.173Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M279.01 100.064C279.083 100.069 279.156 100.071 279.23 100.071C279.257 100.071 279.283 100.071 279.31 100.07L279.31 93.5097C279.283 93.5091 279.257 93.5088 279.23 93.5088C279.156 93.5088 279.083 93.5112 279.01 93.516L279.01 100.064ZM278.087 93.7103C278.183 93.6752 278.281 93.6443 278.381 93.618L278.813 100.045C278.282 99.9791 277.791 99.788 277.369 99.5026L275.993 96.1191C276.026 95.9594 276.072 95.8039 276.127 95.6537L277.682 99.4766L276.335 95.2049C276.398 95.0906 276.469 94.9805 276.545 94.8751L277.834 98.9587L276.79 94.5756C276.869 94.4899 276.953 94.4084 277.041 94.3314L278.347 99.8207L277.523 93.9796C277.614 93.925 277.708 93.8746 277.804 93.8287L278.359 97.7556L278.087 93.7103ZM276.005 97.5173C275.952 97.2834 275.924 97.04 275.924 96.79C275.924 96.7588 275.924 96.7277 275.925 96.6967L277.339 99.4816C276.785 99.098 276.356 98.5507 276.122 97.9105L276.708 98.9014L276.005 97.5173ZM279.756 93.5501L279.318 100.07C280.277 100.045 281.134 99.6156 281.722 98.9469L282.345 97.8942C282.447 97.6093 282.511 97.3063 282.531 96.9912L281.428 98.8544L282.535 96.6747C282.528 96.4912 282.507 96.3117 282.471 96.1371L280.686 99.6542L282.324 95.6285C282.274 95.4994 282.217 95.3741 282.152 95.2533L280.454 99.4296L281.898 94.8515C281.827 94.7556 281.751 94.6637 281.671 94.5761L280.303 98.9117L281.397 94.3118C281.314 94.2401 281.227 94.1725 281.137 94.1092L279.789 99.7737L280.63 93.8164C280.537 93.7731 280.441 93.734 280.343 93.6994L279.778 97.7086L280.053 93.6112C279.956 93.5865 279.857 93.566 279.756 93.5501Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M276.088 84.1838C273.827 82.7497 271.119 81.915 268.209 81.915C260.296 81.915 253.881 88.0851 253.881 95.6963C253.881 103.307 260.296 109.478 268.209 109.478C271.119 109.478 273.827 108.643 276.088 107.209C273.689 108.911 270.738 109.915 267.548 109.915C259.513 109.915 252.999 103.549 252.999 95.6963C252.999 87.8435 259.513 81.4775 267.548 81.4775C270.738 81.4775 273.689 82.4815 276.088 84.1838Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M267.548 84.54C265.059 84.54 262.743 85.2184 260.805 86.3855C262.928 84.6853 265.643 83.665 268.602 83.665C274.398 83.665 279.259 87.5803 280.566 92.8525C279.897 92.8525 279.316 92.4096 279.056 91.7932C277.265 87.5485 272.787 84.54 267.548 84.54ZM279.787 100.728C279.142 100.728 278.561 101.096 278.216 101.641C276.076 105.02 272.099 107.29 267.548 107.29C266.176 107.29 264.856 107.084 263.624 106.703C265.146 107.362 266.83 107.728 268.602 107.728C273.562 107.728 277.838 104.86 279.787 100.728Z" fill="white"/> +<path d="M284.988 88.117H286.625V92.415H287.288V88.117H288.924V87.515H284.988V88.117Z" fill="white"/> +<path d="M290.666 92.415H293.318V91.855H291.329V90.196H293.036V89.643H291.329V88.075H293.318V87.515H290.666V92.415Z" fill="white"/> +<path d="M295.346 92.415H296.009V90.266H296.658C296.707 90.266 296.763 90.266 296.813 90.259L298.245 92.415H299.028L297.434 90.133C297.963 89.923 298.266 89.482 298.266 88.894C298.266 88.054 297.652 87.515 296.658 87.515H295.346V92.415ZM296.686 88.075C297.25 88.075 297.582 88.383 297.582 88.88C297.582 89.405 297.25 89.706 296.686 89.706H296.009V88.075H296.686Z" fill="white"/> +<path d="M300.57 92.415H301.233V90.266H301.882C301.931 90.266 301.988 90.266 302.037 90.259L303.469 92.415H304.252L302.658 90.133C303.187 89.923 303.49 89.482 303.49 88.894C303.49 88.054 302.876 87.515 301.882 87.515H300.57V92.415ZM301.91 88.075C302.474 88.075 302.806 88.383 302.806 88.88C302.806 89.405 302.474 89.706 301.91 89.706H301.233V88.075H301.91Z" fill="white"/> +<path d="M305.794 92.415H306.457V87.515H305.794V92.415Z" fill="white"/> +<path d="M308.195 88.117H309.832V92.415H310.495V88.117H312.131V87.515H308.195V88.117Z" fill="white"/> +<path d="M315.79 87.375C314.246 87.375 313.195 88.565 313.195 89.965C313.195 91.365 314.246 92.555 315.79 92.555C317.328 92.555 318.379 91.365 318.379 89.965C318.379 88.565 317.328 87.375 315.79 87.375ZM315.79 91.939C314.676 91.939 313.879 91.057 313.879 89.965C313.879 88.873 314.676 87.991 315.79 87.991C316.898 87.991 317.695 88.873 317.695 89.965C317.695 91.057 316.898 91.939 315.79 91.939Z" fill="white"/> +<path d="M320.227 92.415H320.89V87.515H320.227V92.415Z" fill="white"/> +<path d="M323.164 92.415H323.827V90.266H324.476C324.525 90.266 324.582 90.266 324.631 90.259L326.063 92.415H326.846L325.252 90.133C325.781 89.923 326.084 89.482 326.084 88.894C326.084 88.054 325.47 87.515 324.476 87.515H323.164V92.415ZM324.504 88.075C325.068 88.075 325.4 88.383 325.4 88.88C325.4 89.405 325.068 89.706 324.504 89.706H323.827V88.075H324.504Z" fill="white"/> +<path d="M328.388 92.415H331.04V91.855H329.051V90.196H330.758V89.643H329.051V88.075H331.04V87.515H328.388V92.415Z" fill="white"/> +<path d="M332.694 91.743C333.124 92.275 333.661 92.548 334.387 92.548C335.262 92.548 335.918 92.009 335.918 91.162C335.918 89.531 333.583 89.783 333.583 88.684C333.583 88.264 333.893 87.963 334.38 87.963C334.803 87.963 335.149 88.194 335.438 88.607L335.939 88.173C335.572 87.69 335.064 87.375 334.373 87.375C333.512 87.375 332.906 87.97 332.906 88.698C332.906 90.315 335.248 90.077 335.248 91.183C335.248 91.631 334.93 91.96 334.38 91.96C333.921 91.96 333.526 91.729 333.188 91.295L332.694 91.743Z" fill="white"/> +<path d="M285.468 98.1025H287.408C288.973 98.1025 290.032 96.9755 290.032 95.6525C290.032 94.3295 288.973 93.2025 287.408 93.2025H285.468V98.1025ZM287.422 94.1055C288.339 94.1055 289.002 94.7775 289.002 95.6525C289.002 96.5205 288.339 97.1995 287.422 97.1995H286.469V94.1055H287.422Z" fill="white"/> +<path d="M293.534 98.1025H294.535V93.2025H293.534V98.1025Z" fill="white"/> +<path d="M296.268 98.1025H297.27V94.5605L299.477 98.1025H300.761V93.2025H299.76V96.7445L297.552 93.2025H296.268V98.1025Z" fill="white"/> +<path d="M302.495 98.1025H303.496V94.5605L305.704 98.1025H306.988V93.2025H305.986V96.7445L303.779 93.2025H302.495V98.1025Z" fill="white"/> +<path d="M310.922 93.0625C309.364 93.0625 308.298 94.2525 308.298 95.6525C308.298 97.0525 309.364 98.2425 310.922 98.2425C312.474 98.2425 313.539 97.0525 313.539 95.6525C313.539 94.2525 312.474 93.0625 310.922 93.0625ZM310.922 97.3115C309.991 97.3115 309.328 96.5905 309.328 95.6525C309.328 94.7145 309.991 93.9935 310.922 93.9935C311.847 93.9935 312.51 94.7145 312.51 95.6525C312.51 96.5905 311.847 97.3115 310.922 97.3115Z" fill="white"/> +<path d="M314.121 93.2025L315.99 98.1025H317.302L319.172 93.2025H318.107L316.646 97.0315L315.186 93.2025H314.121Z" fill="white"/> +<path d="M319.232 98.1025H320.297L320.77 96.8285H322.745L323.217 98.1025H324.283L322.413 93.2025H321.101L319.232 98.1025ZM321.08 95.9815L321.757 94.1405L322.435 95.9815H321.08Z" fill="white"/> +<path d="M324.394 94.1055H325.918V98.1025H326.919V94.1055H328.443V93.2025H324.394V94.1055Z" fill="white"/> +<path d="M329.675 98.1025H330.677V93.2025H329.675V98.1025Z" fill="white"/> +<path d="M334.61 93.0625C333.051 93.0625 331.986 94.2525 331.986 95.6525C331.986 97.0525 333.051 98.2425 334.61 98.2425C336.162 98.2425 337.227 97.0525 337.227 95.6525C337.227 94.2525 336.162 93.0625 334.61 93.0625ZM334.61 97.3115C333.679 97.3115 333.016 96.5905 333.016 95.6525C333.016 94.7145 333.679 93.9935 334.61 93.9935C335.534 93.9935 336.197 94.7145 336.197 95.6525C336.197 96.5905 335.534 97.3115 334.61 97.3115Z" fill="white"/> +<path d="M338.54 98.1025H339.542V94.5605L341.749 98.1025H343.033V93.2025H342.032V96.7445L339.824 93.2025H338.54V98.1025Z" fill="white"/> +<path d="M290.832 94.3257V92.9863H292.078V94.0438C292.078 94.6163 292.012 95.0286 291.878 95.2806C291.693 95.6267 291.405 95.8873 291.013 96.0625L290.729 95.6075C290.961 95.5135 291.133 95.3661 291.245 95.1653C291.362 94.9602 291.426 94.6804 291.439 94.3257H290.832Z" fill="white"/> +<path d="M282.096 99.8525H343.375V100.728H282.096V99.8525Z" fill="white"/> +<g clip-path="url(#clip1_627_41819)"> +<path d="M155.022 98.6216H152.912V105.05H151.354V98.6216H149.278V97.127H155.022V98.6216ZM160.766 103.556V105.05H155.996V97.1428H160.77V98.6374H157.534V100.322H160.49V101.796H157.534V103.572L160.766 103.556ZM164.723 102.299H163.555V105.066H161.997V97.1586H165.112C165.453 97.1576 165.79 97.2247 166.105 97.3561C166.42 97.4876 166.706 97.6807 166.947 97.9245C167.188 98.1684 167.38 98.4581 167.511 98.7772C167.642 99.0962 167.709 99.4384 167.71 99.784C167.701 100.274 167.554 100.752 167.287 101.161C167.02 101.57 166.644 101.893 166.203 102.093L167.932 105.082H166.269L164.723 102.299ZM163.555 100.931H165.14C165.415 100.887 165.667 100.746 165.848 100.53C166.03 100.315 166.13 100.042 166.13 99.7583C166.13 99.475 166.03 99.2011 165.848 98.9861C165.667 98.771 165.415 98.6291 165.14 98.586H163.555V100.931ZM171.686 102.299H170.517V105.066H168.979V97.1586H172.095C172.776 97.1575 173.43 97.4292 173.916 97.9147C174.401 98.4003 174.679 99.0605 174.688 99.7523C174.679 100.243 174.533 100.721 174.266 101.13C173.999 101.539 173.623 101.862 173.181 102.061L174.91 105.05H173.251L171.686 102.299ZM170.517 100.931H172.102C172.378 100.887 172.63 100.746 172.811 100.53C172.993 100.315 173.093 100.042 173.093 99.7583C173.093 99.475 172.993 99.2011 172.811 98.9861C172.63 98.771 172.378 98.6291 172.102 98.586H170.517V100.931ZM177.476 105.05H175.919V97.1428H177.476V105.05ZM184.202 98.6216H182.087V105.05H180.549V98.6216H178.45V97.127H184.194L184.202 98.6216ZM184.369 101.089C184.368 100.273 184.606 99.4758 185.052 98.7975C185.498 98.1193 186.132 97.5906 186.874 97.2785C187.616 96.9664 188.433 96.885 189.221 97.0445C190.008 97.204 190.732 97.5972 191.299 98.1744C191.866 98.7516 192.252 99.4868 192.408 100.287C192.563 101.087 192.482 101.916 192.173 102.669C191.864 103.422 191.342 104.064 190.673 104.516C190.004 104.967 189.219 105.207 188.415 105.205C187.881 105.209 187.352 105.105 186.858 104.899C186.364 104.693 185.915 104.389 185.538 104.006C185.161 103.622 184.863 103.165 184.662 102.663C184.46 102.161 184.36 101.623 184.365 101.081L184.369 101.089ZM190.935 101.081C190.928 100.576 190.774 100.085 190.493 99.6694C190.212 99.2535 189.816 98.9311 189.355 98.743C188.894 98.5548 188.389 98.5092 187.903 98.6119C187.416 98.7145 186.971 98.9609 186.622 99.3201C186.273 99.6792 186.036 100.135 185.942 100.63C185.847 101.126 185.899 101.638 186.091 102.103C186.283 102.569 186.606 102.966 187.019 103.246C187.433 103.525 187.918 103.674 188.415 103.675C188.751 103.681 189.084 103.618 189.395 103.49C189.706 103.361 189.988 103.17 190.224 102.927C190.46 102.685 190.644 102.396 190.767 102.078C190.889 101.761 190.946 101.421 190.935 101.081ZM195.219 105.035H193.68V97.127H195.219V105.035ZM199.502 102.267H198.334V105.035H196.776V97.127H199.892C200.232 97.1254 200.57 97.1922 200.885 97.3234C201.2 97.4547 201.486 97.6478 201.728 97.8917C201.969 98.1357 202.16 98.4256 202.291 98.7449C202.422 99.0642 202.489 99.4066 202.489 99.7523C202.481 100.243 202.335 100.72 202.069 101.129C201.802 101.538 201.427 101.861 200.986 102.061L202.727 105.05H201.052L199.502 102.267ZM198.334 100.899H199.919C200.195 100.856 200.446 100.714 200.628 100.499C200.809 100.284 200.909 100.01 200.909 99.7266C200.909 99.4434 200.809 99.1694 200.628 98.9544C200.446 98.7394 200.195 98.5975 199.919 98.5543H198.334V100.899ZM208.529 103.524V105.019H203.731V97.1112H208.502V98.6057H205.27V100.29H208.225V101.765H205.27V103.54L208.529 103.524ZM209.378 103.22L210.694 102.429C210.808 102.809 211.045 103.138 211.365 103.365C211.686 103.593 212.072 103.704 212.462 103.682C213.389 103.682 213.712 103.287 213.712 102.844C213.712 102.255 213.186 102.03 212.026 101.69C210.866 101.35 209.689 100.828 209.689 99.3174C209.689 97.8071 210.916 96.9451 212.256 96.9451C212.842 96.9295 213.419 97.0901 213.915 97.4067C214.411 97.7232 214.804 98.1817 215.044 98.7244L213.751 99.4835C213.633 99.1782 213.424 98.9179 213.153 98.7387C212.882 98.5594 212.563 98.4702 212.24 98.4832C211.594 98.4832 211.212 98.8232 211.212 99.2739C211.212 99.7247 211.516 100.021 212.696 100.381C213.934 100.776 215.25 101.199 215.25 102.817C215.25 104.299 214.082 105.209 212.419 105.209C210.823 105.209 209.775 104.418 209.351 103.232" fill="white"/> +<path d="M202.59 85.7992V93.608H202.041V92.3151C201.817 92.7525 201.477 93.1175 201.059 93.369C200.641 93.6205 200.163 93.7485 199.677 93.7385C198.917 93.7385 198.188 93.4319 197.651 92.8862C197.113 92.3404 196.811 91.6003 196.811 90.8285C196.811 90.0567 197.113 89.3165 197.651 88.7708C198.188 88.2251 198.917 87.9185 199.677 87.9185C200.162 87.9077 200.64 88.0345 201.058 88.2846C201.475 88.5346 201.816 88.8981 202.041 89.3339V85.7992H202.59ZM202.041 90.8206C202.041 90.3514 201.904 89.8927 201.647 89.5026C201.391 89.1125 201.026 88.8084 200.599 88.6289C200.172 88.4493 199.702 88.4023 199.249 88.4939C198.795 88.5854 198.379 88.8113 198.052 89.1431C197.726 89.4749 197.503 89.8976 197.413 90.3578C197.323 90.8179 197.369 91.2949 197.546 91.7284C197.723 92.1619 198.022 92.5324 198.406 92.7931C198.791 93.0537 199.242 93.1929 199.705 93.1929C200.012 93.1966 200.318 93.1377 200.603 93.0198C200.888 92.9019 201.147 92.7273 201.365 92.5063C201.583 92.2853 201.755 92.0223 201.871 91.7328C201.987 91.4433 202.045 91.1331 202.041 90.8206ZM209.83 90.8403C209.83 90.9313 209.83 91.0222 209.83 91.1092H204.864C204.91 91.6972 205.18 92.244 205.616 92.6337C206.052 93.0234 206.621 93.2254 207.201 93.1968C207.579 93.2173 207.955 93.1337 208.289 92.9548C208.624 92.7759 208.904 92.5084 209.101 92.1807L209.584 92.4693C209.327 92.8751 208.971 93.2057 208.549 93.4283C208.128 93.6509 207.656 93.7579 207.181 93.7385C206.798 93.7563 206.416 93.6931 206.058 93.5531C205.7 93.4131 205.375 93.1992 205.102 92.9249C204.83 92.6507 204.617 92.3221 204.476 91.9599C204.335 91.5976 204.27 91.2097 204.284 90.8206C204.271 90.4364 204.335 90.0535 204.473 89.6956C204.611 89.3377 204.82 89.0123 205.087 88.7396C205.354 88.4668 205.673 88.2525 206.024 88.11C206.376 87.9674 206.752 87.8995 207.131 87.9106C208.798 87.9106 209.857 89.3142 209.857 90.8403H209.83ZM204.872 90.5636H209.288C209.276 89.9958 209.045 89.4556 208.644 89.0593C208.244 88.663 207.706 88.4421 207.146 88.4443C206.567 88.4249 206.003 88.6374 205.576 89.036C205.149 89.4346 204.894 89.9874 204.864 90.5754L204.872 90.5636ZM215.161 92.157C215.161 93.0742 214.382 93.7385 213.194 93.7385C212.096 93.7385 211.372 93.2126 211.111 92.5009L211.582 92.2202C211.781 92.8252 212.361 93.2047 213.194 93.2047C214.028 93.2047 214.612 92.8568 214.612 92.153C214.612 90.6387 211.286 91.5085 211.286 89.5C211.286 88.6183 212.03 87.9185 213.151 87.9185C213.537 87.8953 213.92 87.9889 214.253 88.1874C214.586 88.3859 214.853 88.6804 215.021 89.0334L214.557 89.2984C214.435 89.029 214.235 88.8038 213.984 88.6526C213.733 88.5015 213.443 88.4316 213.151 88.4522C212.439 88.4522 211.835 88.8476 211.835 89.5C211.835 90.9945 215.161 90.1128 215.161 92.153V92.157ZM155.435 91.4848C155.436 91.7639 155.383 92.0405 155.278 92.2986C155.173 92.5566 155.019 92.7911 154.825 92.9885C154.63 93.1858 154.399 93.3422 154.145 93.4485C153.891 93.5549 153.619 93.6091 153.344 93.608H150.034V85.8309H153.091C153.625 85.8319 154.138 86.048 154.516 86.4319C154.894 86.8157 155.107 87.3361 155.108 87.8789C155.113 88.2273 155.023 88.5703 154.85 88.8708C154.676 89.1712 154.425 89.4175 154.123 89.583C154.508 89.7276 154.84 89.9886 155.075 90.3307C155.309 90.6729 155.435 91.0798 155.435 91.4967V91.4848ZM150.614 86.3765V89.3577H153.091C153.48 89.3577 153.853 89.2006 154.129 88.9211C154.404 88.6415 154.559 88.2624 154.559 87.8671C154.559 87.4717 154.404 87.0926 154.129 86.8131C153.853 86.5335 153.48 86.3765 153.091 86.3765H150.614ZM154.855 91.4848C154.859 91.28 154.823 91.0763 154.749 90.8856C154.675 90.695 154.565 90.5211 154.424 90.374C154.284 90.2269 154.116 90.1096 153.93 90.0288C153.745 89.948 153.546 89.9053 153.344 89.9033H150.618V93.0426H153.344C153.545 93.04 153.745 92.997 153.93 92.9161C154.115 92.8351 154.283 92.7177 154.423 92.5708C154.563 92.4238 154.674 92.2501 154.748 92.0597C154.822 91.8692 154.858 91.6658 154.855 91.4611V91.4848ZM161.498 91.6034H157.651L156.903 93.5803H156.292L159.271 85.8309H159.89L162.861 93.6199H162.227L161.498 91.6034ZM161.288 91.0499L159.578 86.5425L157.869 91.0736L161.288 91.0499ZM169.816 85.8309V93.6199H169.302L164.773 86.9102V93.608H164.193V85.8309H164.699L169.236 92.5523V85.8309H169.816ZM180.997 91.0064V85.8309H181.577V91.0064C181.577 92.2756 182.356 93.1652 183.804 93.1652C185.253 93.1652 186.04 92.2756 186.04 91.0064V85.8309H186.62V91.0064C186.62 92.6512 185.491 93.7306 183.804 93.7306C182.118 93.7306 180.997 92.6512 180.997 91.0064ZM192.991 93.0545V93.608H188.629V85.8309H192.991V86.3883H189.21V89.3893H192.714V89.9468H189.21V93.0426L192.991 93.0545ZM179.412 89.7135C179.41 88.9188 179.177 88.1425 178.74 87.4827C178.304 86.8228 177.685 86.3092 176.961 86.0067C176.237 85.7043 175.442 85.6265 174.674 85.7834C173.907 85.9402 173.203 86.3246 172.651 86.8879C172.099 87.4512 171.723 88.1681 171.573 88.9479C171.422 89.7277 171.502 90.5354 171.804 91.2687C172.105 92.0021 172.614 92.6282 173.266 93.0678C173.918 93.5074 174.684 93.7408 175.467 93.7385C176.117 93.7381 176.757 93.5766 177.332 93.268L176.908 92.8449C176.458 93.0621 175.965 93.1742 175.467 93.1731C174.794 93.1778 174.134 92.9794 173.572 92.6029C173.01 92.2265 172.57 91.6891 172.309 91.0588C172.049 90.4285 171.978 89.7338 172.106 89.0627C172.235 88.3916 172.557 87.7743 173.031 87.2892C173.506 86.8041 174.112 86.473 174.772 86.3379C175.432 86.2028 176.116 86.2697 176.739 86.5303C177.362 86.7908 177.894 87.2332 178.269 87.8013C178.643 88.3694 178.843 89.0377 178.843 89.7214C178.841 90.1853 178.748 90.6441 178.57 91.0711C178.391 91.4981 178.131 91.8848 177.803 92.2084L176.039 90.4568L175.65 90.8245L179.217 94.4146L179.606 94.0469L178.205 92.6077C178.586 92.232 178.89 91.7822 179.098 91.2851C179.305 90.7879 179.412 90.2534 179.412 89.7135Z" fill="white"/> +<path d="M125.543 103.576L123 102.136V88.8596L129.441 85.2181L132.046 86.6968L125.539 90.3739L125.543 103.576ZM141.198 99.1434L143.717 97.6924V88.8596L133.359 83L130.746 84.4787L141.198 90.3739V99.1434ZM133.359 105.046L126.812 101.342V104.295L133.359 107.996L143.717 102.136V99.183L133.359 105.046Z" fill="white"/> +</g> +<g clip-path="url(#clip2_627_41819)"> +<path d="M16.7182 94.1067C15.6795 94.1067 14.9289 93.3202 14.9289 92.2969C14.9289 91.2736 15.6416 90.4871 16.6424 90.4871C17.2489 90.4871 17.7265 90.7849 18.0298 91.2202L18.8789 90.5558C18.3937 89.9067 17.6052 89.4714 16.6424 89.4714C14.9668 89.4714 13.822 90.7696 13.822 92.2969C13.822 93.8242 14.9972 95.1223 16.7182 95.1223C17.7114 95.1223 18.5377 94.6947 19.0305 94.0303V91.7853H16.6044V92.7093H17.954V93.6409C17.6507 93.9311 17.2186 94.1067 16.7182 94.1067Z" fill="white"/> +<path d="M22.9179 89.4714C21.2423 89.4714 20.0975 90.7696 20.0975 92.2969C20.0975 93.8242 21.2423 95.1223 22.9179 95.1223C24.5858 95.1223 25.7306 93.8242 25.7306 92.2969C25.7306 90.7696 24.5858 89.4714 22.9179 89.4714ZM22.9179 94.1067C21.9171 94.1067 21.2044 93.3202 21.2044 92.2969C21.2044 91.2736 21.9171 90.4871 22.9179 90.4871C23.911 90.4871 24.6237 91.2736 24.6237 92.2969C24.6237 93.3202 23.911 94.1067 22.9179 94.1067Z" fill="white"/> +<path d="M30.1576 92.9689C30.1576 93.6867 29.7482 94.1067 29.0886 94.1067C28.4138 94.1067 28.012 93.6867 28.012 92.9689V89.6242H26.9354V92.8773C26.9354 94.2823 27.7542 95.1223 29.081 95.1223C30.4153 95.1223 31.2341 94.2823 31.2341 92.8773V89.6242H30.1576V92.9689Z" fill="white"/> +<path d="M32.1697 89.6242L34.1788 94.9696H35.589L37.5981 89.6242H36.4533L34.8839 93.8013L33.3145 89.6242H32.1697Z" fill="white"/> +<path d="M38.6829 94.9696H41.7762V94.0685H39.7595V92.694H41.473V91.7929H39.7595V90.5253H41.7762V89.6242H38.6829V94.9696Z" fill="white"/> +<path d="M43.2926 94.9696H44.3692V92.8085H44.9226L46.3404 94.9696H47.6065L45.9461 92.6023C46.492 92.3503 46.8028 91.8693 46.8028 91.2202C46.8028 90.2274 46.0826 89.6242 44.915 89.6242H43.2926V94.9696ZM44.9757 90.5253C45.4306 90.5253 45.6959 90.8002 45.6959 91.2049C45.6959 91.6402 45.4306 91.9074 44.9757 91.9074H44.3692V90.5253H44.9757Z" fill="white"/> +<path d="M48.5538 94.9696H49.6303V91.1056L52.0034 94.9696H53.3832V89.6242H52.3066V93.4882L49.9336 89.6242H48.5538V94.9696Z" fill="white"/> +<path d="M55.1328 94.9696H58.2261V94.0685H56.2094V92.694H57.9228V91.7929H56.2094V90.5253H58.2261V89.6242H55.1328V94.9696Z" fill="white"/> +<path d="M59.7424 94.9696H60.819V91.1362L62.0017 93.1369H62.7599L63.9426 91.1362V94.9696H65.0192V89.6242H63.6773L62.3808 91.8693L61.0844 89.6242H59.7424V94.9696Z" fill="white"/> +<path d="M66.7657 94.9696H69.859V94.0685H67.8423V92.694H69.5557V91.7929H67.8423V90.5253H69.859V89.6242H66.7657V94.9696Z" fill="white"/> +<path d="M71.3754 94.9696H72.4519V91.1056L74.825 94.9696H76.2048V89.6242H75.1282V93.4882L72.7552 89.6242H71.3754V94.9696Z" fill="white"/> +<path d="M77.4086 90.6093H79.0462V94.9696H80.1227V90.6093H81.7604V89.6242H77.4086V90.6093Z" fill="white"/> +<path d="M22.5389 85.2117C22.6278 85.1222 22.7167 85.0327 22.8055 84.9133C22.9833 84.7343 23.1314 84.5254 23.3388 84.3762C23.398 84.3165 23.4573 84.2867 23.5165 84.227C23.5461 84.1972 23.5461 84.1674 23.5461 84.1674C23.4573 84.1972 23.4276 84.2569 23.3388 84.2867C23.3091 84.2867 23.3091 84.2569 23.3091 84.2569C23.3684 84.227 23.4276 84.1674 23.4869 84.1375C23.4573 84.1375 23.4573 84.1077 23.4573 84.1077C23.2499 84.1077 23.1018 84.227 22.9536 84.3762C22.924 84.4061 22.8944 84.3464 22.8648 84.3464C22.6278 84.4359 22.45 84.6448 22.213 84.7343V84.7044C22.1242 84.7343 22.0353 84.794 21.9168 84.8238C21.7687 84.8536 21.6502 84.8536 21.5317 84.8536C21.354 84.8835 21.1466 84.9133 20.9688 84.9431C20.9688 84.9431 20.9688 84.9431 20.9392 84.9431C20.8503 84.973 20.7319 85.0028 20.643 85.0625L20.6134 85.0923C20.5837 85.1222 20.5541 85.152 20.4949 85.1818C20.406 85.2415 20.3171 85.331 20.2282 85.3907H20.1986C20.1097 85.4802 20.0209 85.5697 19.932 85.6294C19.932 85.6294 19.9024 85.6294 19.8728 85.6294C19.8728 85.6294 19.8728 85.6294 19.8728 85.5996C19.8728 85.5697 19.9024 85.5399 19.9024 85.5399C19.932 85.5101 19.932 85.4802 19.9616 85.4802C19.9913 85.4504 19.9913 85.4206 20.0209 85.3907V85.3609C20.0209 85.3609 20.0209 85.3609 19.9913 85.3609C20.0801 85.2714 20.169 85.2117 20.2579 85.152C20.2579 85.152 20.2282 85.152 20.2282 85.1222L20.2579 85.0923C20.2875 85.0923 20.2579 85.1222 20.2579 85.1222C20.2282 85.152 20.1986 85.2415 20.1394 85.2117H20.1097C20.1097 85.2117 20.1097 85.2117 20.0801 85.2117C20.0801 85.2117 20.0801 85.2117 20.0801 85.1818C20.0801 85.1818 20.0801 85.152 20.1097 85.152C20.1097 85.152 20.1097 85.152 20.1097 85.1222C20.1097 85.1222 20.1097 85.0923 20.1394 85.0923V85.0625C20.169 85.0327 20.1986 85.0028 20.2579 84.973C20.3171 84.9431 20.3764 84.9133 20.4356 84.8835L20.4652 84.8536C20.3764 84.8835 20.2875 84.9133 20.1986 84.973H20.169H20.1394C20.169 84.9431 20.1986 84.9133 20.2282 84.8835C20.2579 84.8835 20.2579 84.8835 20.2579 84.9133C20.7615 84.5254 21.4724 84.6149 22.0649 84.4061C22.1242 84.3762 22.1538 84.3464 22.213 84.3165C22.3019 84.2867 22.3612 84.1972 22.45 84.1674C22.5685 84.0778 22.6574 83.9585 22.7167 83.8093C22.7167 83.7795 22.687 83.7795 22.687 83.7795C22.4797 84.0182 22.2427 84.1674 21.9761 84.3165C21.6502 84.4956 21.2651 84.4657 20.9392 84.4956C20.9688 84.4657 20.9985 84.4657 21.0281 84.4657C21.0281 84.4061 21.0577 84.4061 21.0873 84.3762H21.1466C21.1762 84.3762 21.1762 84.3464 21.1762 84.3464C21.2058 84.3464 21.2651 84.3165 21.2355 84.3165C21.1762 84.2569 21.0873 84.3762 20.9985 84.3165C21.0281 84.2867 21.0281 84.227 21.0577 84.227H21.117C21.117 84.1972 21.1466 84.1674 21.1466 84.1674C21.3836 84.0182 21.6206 83.8988 21.8279 83.7795C21.7687 83.7795 21.7391 83.8391 21.7094 83.8093C21.7391 83.8093 21.7094 83.7496 21.7391 83.7496C21.9168 83.6899 22.0649 83.6004 22.2427 83.5407C22.1834 83.5407 22.1242 83.6004 22.0649 83.5407C22.0946 83.5109 22.1242 83.4811 22.1538 83.4811V83.4214C22.1538 83.3916 22.1834 83.3916 22.1834 83.3916C22.1538 83.3916 22.1538 83.3617 22.1538 83.3617C22.1834 83.3319 22.213 83.3319 22.2427 83.302C22.213 83.302 22.1834 83.302 22.1834 83.2722C22.2427 83.2125 22.3019 83.1827 22.3908 83.1827C22.3612 83.1529 22.3315 83.1827 22.3315 83.1529C22.3315 83.123 22.3612 83.123 22.3612 83.123C22.3315 83.0932 22.3315 83.0633 22.3315 83.0633C22.4204 82.944 22.4204 82.7948 22.4797 82.6754C22.45 82.6754 22.45 82.6754 22.45 82.6456C22.3019 82.8246 22.0353 82.8843 21.7983 82.944H21.7094C21.6206 82.9738 21.5317 82.9738 21.4428 82.9141C21.3836 82.8843 21.354 82.8246 21.2947 82.7948C21.1762 82.7053 21.0281 82.6456 20.9096 82.6158C20.4949 82.4964 20.0801 82.4367 19.695 82.4367C19.8728 82.3472 20.0505 82.3472 20.2579 82.2875C20.5245 82.198 20.7911 82.1085 21.0577 82.1384C20.9985 82.1085 20.9392 82.1384 20.9096 82.1384C20.6726 82.1085 20.4652 82.198 20.2282 82.2279C20.0801 82.2577 19.932 82.3174 19.7543 82.3472C19.6654 82.3771 19.6061 82.4666 19.4876 82.4666V82.4069C19.6358 82.2279 19.8431 82.019 20.0801 82.019C20.3764 81.9593 20.643 82.019 20.9096 82.0488C21.117 82.0787 21.2947 82.1085 21.5021 82.1682C21.5909 82.1682 21.5909 82.2875 21.6502 82.3174C21.7391 82.3472 21.8279 82.3174 21.9464 82.3771C21.9464 82.3472 21.9168 82.3174 21.9464 82.2875C22.0057 82.2279 22.0946 82.3174 22.1538 82.2577C22.2723 82.1682 22.0353 82.0488 21.9761 81.9295C21.9761 81.8996 22.0057 81.8997 22.0057 81.8997C22.1242 82.019 22.213 82.1384 22.3908 82.2279C22.4797 82.2577 22.6574 82.3174 22.6278 82.198C22.5389 82.019 22.3908 81.8698 22.2723 81.7206V81.6609C22.2427 81.6609 22.2427 81.6311 22.213 81.6311V81.5416C22.1538 81.5118 22.1538 81.4521 22.1242 81.3924C22.0649 81.3029 22.0946 81.2134 22.0649 81.094C22.0649 81.0343 22.0649 80.9448 22.0353 80.8553C21.9761 80.5868 21.9168 80.3481 21.8872 80.0795C21.8576 79.7811 22.0649 79.5424 22.213 79.2739C22.3315 79.0949 22.45 78.886 22.6574 78.7666C22.7167 78.5876 22.8352 78.4086 22.9536 78.2594C23.0721 78.1102 23.2795 78.0207 23.4573 77.9312C23.6646 77.8417 23.872 77.782 23.872 77.782H13V86.2262H20.7022C20.9985 86.0173 21.2947 85.898 21.7391 85.6891C21.9168 85.5996 22.3908 85.3907 22.5389 85.2117ZM20.0801 84.0778C20.0505 84.0778 19.9913 84.1077 19.9913 84.048C20.0209 83.9585 20.1097 83.9585 20.169 83.9286C20.1986 83.8988 20.2579 83.869 20.2875 83.8988C20.3171 83.9585 20.3764 83.9286 20.406 83.9585C20.3171 84.0778 20.1986 84.048 20.0801 84.0778ZM17.651 83.7198L17.6213 83.6899C17.8287 83.4214 17.9768 83.1529 18.1249 82.8843C18.3323 82.765 18.5101 82.6158 18.6582 82.4367C18.9248 82.1384 19.221 81.8996 19.5469 81.7206C19.6654 81.6609 19.8431 81.6908 19.9616 81.7505C19.9024 81.8101 19.8431 81.8101 19.7839 81.84C19.7543 81.84 19.7543 81.84 19.7246 81.8101C19.7543 81.7803 19.7543 81.7803 19.7543 81.7505C19.6061 81.9295 19.3691 82.019 19.2507 82.2279C19.1618 82.3771 19.1025 82.5859 18.8952 82.6456C18.8359 82.6754 18.9248 82.5859 18.8655 82.6158C18.3916 82.944 18.0361 83.302 17.651 83.7198ZM18.984 82.6754C18.9544 82.7053 18.9544 82.7053 18.9248 82.7351C18.8952 82.765 18.8952 82.7948 18.8655 82.7948C18.8359 82.7948 18.8359 82.7948 18.8359 82.765C18.8655 82.7053 18.8952 82.6456 18.9544 82.6158C18.984 82.6456 18.984 82.6456 18.984 82.6754ZM19.7246 85.0625C19.7246 85.0923 19.695 85.0923 19.695 85.1222C19.7246 85.1222 19.7246 85.1222 19.7246 85.152C19.695 85.1818 19.6654 85.2117 19.6061 85.2415C19.6061 85.2415 19.6061 85.2415 19.5765 85.2415C19.5469 85.2714 19.5469 85.2714 19.5173 85.3012C19.4876 85.331 19.3988 85.3012 19.4284 85.2714C19.458 85.2415 19.5173 85.1818 19.5469 85.152C19.5765 85.1222 19.6061 85.1222 19.6061 85.0923L19.6358 85.0625C19.6358 85.0327 19.7246 85.0327 19.7246 85.0625ZM19.4284 84.9431C19.3691 85.0028 19.3099 85.0327 19.2507 85.0625C19.1914 85.0923 19.1025 85.1222 19.0433 85.152H19.0137C18.9544 85.1818 18.8952 85.2415 18.8655 85.2714C18.8655 85.2714 18.8655 85.2714 18.8359 85.3012L18.8063 85.331L18.7767 85.3609C18.7767 85.3609 18.7767 85.3907 18.747 85.3907H18.7174H18.6878H18.6582C18.6286 85.4206 18.6286 85.4206 18.5989 85.4504C18.5693 85.4802 18.5397 85.5101 18.5101 85.5399C18.5101 85.5399 18.5101 85.5399 18.5101 85.5697V85.5399C18.5397 85.5101 18.5397 85.5101 18.5693 85.4802C18.5693 85.4802 18.5693 85.4802 18.5989 85.4504L18.6286 85.4206C18.6582 85.3907 18.6582 85.3609 18.6878 85.3609L18.7174 85.331C18.7174 85.331 18.7174 85.3012 18.747 85.3012C18.747 85.3012 18.747 85.2714 18.7767 85.2714C18.7767 85.2714 18.7767 85.2714 18.7767 85.2415V85.2117C18.8063 85.1818 18.8063 85.152 18.8359 85.1222C18.8063 85.1222 18.8063 85.152 18.7767 85.1818C18.747 85.1818 18.7174 85.1818 18.747 85.152L18.7767 85.1222C18.8063 85.0923 18.8359 85.0625 18.8655 85.0327C18.8952 85.0327 18.8952 85.0028 18.9248 85.0028L18.9544 84.973C19.1025 84.8238 19.3691 84.8238 19.5765 84.7343C19.6654 84.7044 19.7543 84.7641 19.8431 84.7343C19.9024 84.7343 19.932 84.7343 19.9913 84.7641C19.695 84.7641 19.5765 84.8536 19.4284 84.9431ZM19.7543 83.8391C19.7246 83.8093 19.8135 83.8391 19.8135 83.8093H19.695C19.6654 83.8093 19.6654 83.7795 19.6654 83.7795C19.5765 83.8093 19.4876 83.8391 19.3988 83.8391C19.2803 83.869 19.1914 83.9585 19.0729 83.9883C18.8952 84.048 18.747 84.1972 18.5693 84.2569C18.5397 84.2569 18.5397 84.227 18.5397 84.227C18.5693 84.1674 18.6286 84.1674 18.6582 84.1077C18.6582 84.0778 18.6582 84.0778 18.6286 84.0778C18.747 83.8988 18.9248 83.8093 19.1025 83.6601V83.6004C19.1618 83.5407 19.221 83.5109 19.2507 83.4214C19.2803 83.3617 19.3395 83.302 19.3988 83.2722C19.3691 83.2424 19.3395 83.2424 19.3395 83.2125C19.2803 83.2125 19.221 83.2424 19.1618 83.1827C19.1914 83.1529 19.221 83.123 19.2507 83.123C19.2507 83.123 19.221 83.123 19.221 83.0932C19.1914 83.0633 19.2507 83.0335 19.3099 83.0037C19.3691 82.9738 19.458 82.9738 19.4876 82.944C19.3691 82.9141 19.2507 82.9738 19.1322 82.9141C19.221 82.7053 19.3395 82.5263 19.5173 82.4367C19.5469 82.4367 19.5765 82.4367 19.5765 82.4666C19.5765 82.5561 19.5173 82.6158 19.458 82.6158C19.5765 82.6456 19.7246 82.6456 19.8431 82.7053C19.8135 82.7351 19.7839 82.7351 19.7839 82.7351C19.8728 82.7948 19.9616 82.765 20.0505 82.8246C19.9913 82.8843 19.9616 82.8246 19.9024 82.8246C20.406 82.9738 20.9096 83.0932 21.3243 83.3916C20.9688 83.5706 20.6134 83.6601 20.2282 83.7198C20.169 83.7198 20.1394 83.7198 20.1097 83.6899C20.1097 83.7198 20.1097 83.7496 20.0801 83.7496C20.0209 83.7496 19.9616 83.7496 19.932 83.7795C19.9024 83.869 19.8135 83.869 19.7543 83.8391Z" fill="white"/> +<path d="M36.0769 77.752H27.0416C27.0416 77.752 27.0712 77.752 27.1305 77.7818C27.1897 77.8116 27.3082 77.8713 27.3675 77.9011C27.4859 77.9608 27.6044 78.0503 27.6637 78.1697C27.6933 78.2294 27.7526 78.3189 27.7229 78.3786C27.6933 78.4681 27.6637 78.5874 27.6044 78.6173C27.5156 78.6769 27.3971 78.6769 27.2786 78.6471C27.2193 78.6471 27.1601 78.6173 27.1008 78.6173C27.3378 78.7068 27.5748 78.8261 27.7229 79.035C27.7526 79.0648 27.8118 79.0947 27.8711 79.0947C27.9007 79.0947 27.9007 79.1245 27.9007 79.1543C27.8711 79.1842 27.8414 79.214 27.8414 79.2439H27.9007C27.9896 79.214 27.9599 79.0648 28.0784 79.0947C28.1673 79.1543 28.1969 79.2439 28.1377 79.3334C28.0784 79.3931 28.0192 79.4527 27.9599 79.4826C27.9303 79.5124 27.9303 79.5721 27.9599 79.6019C28.0192 79.6616 28.0192 79.7213 28.0488 79.7809C28.1081 79.9003 28.1081 80.0197 28.1673 80.139C28.2265 80.3777 28.2858 80.6164 28.2858 80.8551C28.2858 80.9745 28.2265 81.0938 28.2562 81.2132C28.2858 81.3325 28.3747 81.4519 28.4339 81.5414C28.4932 81.6309 28.5524 81.6906 28.6117 81.8099C28.7005 81.9591 28.8783 82.1382 28.7894 82.3172C28.7302 82.4365 28.5524 82.4067 28.4635 82.4664C28.3747 82.5559 28.4339 82.6753 28.4932 82.7648C28.582 82.914 28.4043 83.0035 28.2858 83.0631C28.3154 83.1228 28.3747 83.093 28.4043 83.1228C28.4339 83.2123 28.4932 83.2422 28.4635 83.3317C28.4043 83.4212 28.1969 83.4809 28.3154 83.6301C28.3747 83.7494 28.345 83.8688 28.2858 83.9881C28.2265 84.1373 28.1081 84.197 27.9896 84.2268C27.9007 84.2567 27.7822 84.2567 27.6933 84.2567C27.5748 84.2268 27.5452 84.2268 27.5156 84.2268C27.249 84.197 26.9823 84.1075 26.7157 84.1075C26.6269 84.1373 26.5676 84.1373 26.5084 84.1672C26.4491 84.2268 26.3602 84.2865 26.3306 84.3462L26.301 84.376C26.301 84.376 26.301 84.4059 26.2714 84.4059C26.2714 84.4059 26.2714 84.4059 26.2714 84.4357C26.2121 84.4954 26.1825 84.5551 26.1529 84.6147V84.6446C26.0936 84.7341 26.064 84.8534 26.0344 84.943C25.9159 85.301 25.9751 85.6292 26.064 85.6889C26.0936 85.7187 26.5972 85.8679 26.9231 86.0171C27.1008 86.0768 27.1897 86.1365 27.3082 86.1962H36.1658V77.752H36.0769Z" fill="white"/> +<path d="M33.0705 111.03C33.2354 111.03 33.3728 111.137 33.2903 111.43L32.5483 111.589C32.6857 111.297 32.9056 111.03 33.0705 111.03ZM33.4827 112.202H33.3453C33.1529 112.414 32.9605 112.574 32.7682 112.574C32.5758 112.574 32.4659 112.468 32.4659 112.202C32.4659 112.095 32.4659 111.989 32.4933 111.882L33.6751 111.509C33.8949 110.977 33.6201 110.738 33.2903 110.738C32.7407 110.738 32.0811 111.643 32.0811 112.441C32.0811 112.787 32.246 113 32.5208 113C32.8781 113 33.2079 112.681 33.4827 112.202ZM33.2354 110.525L34.0598 109.779V109.699H33.6201L33.0979 110.551H33.2354V110.525ZM30.6795 111.057H31.0643L30.4322 112.707C30.3772 112.84 30.4597 113 30.5971 113C30.9544 113 31.5315 112.654 31.7239 112.202H31.6139C31.449 112.361 31.1467 112.574 30.8994 112.627L31.4765 111.084H32.0536L32.1361 110.844H31.559L31.7788 110.258H31.559L31.1467 110.844L30.6521 110.897V111.057H30.6795ZM30.1574 110.977C30.2123 110.817 30.1024 110.738 30.02 110.738C29.6902 110.738 29.278 111.03 29.1131 111.456H29.223C29.3329 111.297 29.5253 111.137 29.6902 111.11L29.0306 112.76C28.9757 112.92 29.0856 113 29.168 113C29.4978 113 29.8826 112.707 30.0475 112.281H29.9375C29.8276 112.441 29.6352 112.601 29.4703 112.627L30.1574 110.977ZM30.2673 110.152C30.4322 110.152 30.5421 110.019 30.5421 109.886C30.5421 109.726 30.4047 109.62 30.2673 109.62C30.1024 109.62 29.9925 109.753 29.9925 109.886C29.9925 110.019 30.1024 110.152 30.2673 110.152ZM26.5023 112.681C26.4198 112.867 26.5023 113 26.6947 113C26.8046 113 26.8596 112.973 26.9145 112.84L27.3817 111.669C27.6016 111.43 28.0138 111.163 28.2062 111.163C28.3436 111.163 28.3161 111.27 28.2336 111.403L27.5466 112.707C27.4916 112.84 27.5741 113 27.7115 113C28.0413 113 28.4535 112.707 28.6184 112.281H28.5085C28.3985 112.441 28.2062 112.601 28.0413 112.627L28.6459 111.456C28.7283 111.297 28.7558 111.163 28.7558 111.057C28.7558 110.871 28.6459 110.738 28.426 110.738C28.1237 110.738 27.8214 111.057 27.4642 111.456V111.137C27.4642 110.924 27.3817 110.711 27.1893 110.711C27.0519 110.711 26.942 110.817 26.8321 110.977V111.03C27.0519 111.03 27.1619 111.35 26.997 111.669L26.5023 112.681ZM26.5023 111.243C26.5847 110.977 26.5298 110.738 26.3374 110.738C26.0901 110.738 26.0076 110.924 25.7603 111.456V111.137C25.7603 110.924 25.6778 110.711 25.4855 110.711C25.2381 110.711 25.0183 111.084 24.8534 111.43H24.9633C25.0732 111.27 25.1832 111.163 25.2656 111.163C25.3755 111.163 25.4305 111.323 25.2656 111.669L24.7984 112.654C24.716 112.84 24.7984 112.973 24.9908 112.973C25.1007 112.973 25.1557 112.947 25.2106 112.814L25.6778 111.643C25.8152 111.483 25.9252 111.35 26.0626 111.217H26.5023V111.243ZM23.864 111.03C24.0289 111.03 24.1663 111.137 24.0839 111.43L23.3419 111.589C23.4793 111.297 23.6991 111.03 23.864 111.03ZM24.2763 112.202H24.1388C23.9465 112.414 23.7541 112.574 23.5617 112.574C23.3693 112.574 23.2594 112.468 23.2594 112.202C23.2594 112.095 23.2594 111.989 23.2869 111.882L24.4686 111.509C24.6885 110.977 24.4137 110.738 24.0839 110.738C23.5342 110.738 22.8747 111.643 22.8747 112.441C22.8747 112.787 23.0396 113 23.3144 113C23.6716 113 24.0014 112.681 24.2763 112.202ZM21.4731 111.057H21.8578L21.2258 112.707C21.1708 112.84 21.2532 113 21.3907 113C21.7479 113 22.325 112.654 22.5174 112.202H22.4075C22.2426 112.361 21.9403 112.574 21.693 112.627L22.2701 111.084H22.8472L22.9296 110.844H22.3525L22.5724 110.258H22.3525L21.9403 110.844L21.4456 110.897V111.057H21.4731ZM19.302 112.335C19.302 111.829 19.8791 111.137 20.2089 111.137C20.2914 111.137 20.3463 111.137 20.4013 111.163L20.0715 112.042C19.8791 112.281 19.5768 112.548 19.4394 112.548C19.357 112.574 19.302 112.494 19.302 112.335ZM21.1158 110.631H20.9235L20.7311 110.817H20.6761C19.6868 110.817 18.8623 111.882 18.8623 112.654C18.8623 112.867 18.9997 113 19.2196 113C19.4669 113 19.7143 112.654 19.9891 112.281V112.414C19.9616 112.787 20.0715 113 20.2914 113C20.5387 113 20.7586 112.627 20.9235 112.281H20.8135C20.7036 112.441 20.5937 112.548 20.5112 112.548C20.4288 112.548 20.3463 112.388 20.5112 112.042L21.1158 110.631ZM19.0272 111.243C19.1097 110.977 19.0547 110.738 18.8623 110.738C18.615 110.738 18.5325 110.924 18.2852 111.456V111.137C18.2852 110.924 18.2027 110.711 18.0104 110.711C17.763 110.711 17.5432 111.084 17.3783 111.43H17.4882C17.5981 111.27 17.7081 111.163 17.7905 111.163C17.9004 111.163 17.9554 111.323 17.7905 111.669L17.3233 112.654C17.2409 112.84 17.3233 112.973 17.5157 112.973C17.6256 112.973 17.6806 112.947 17.7356 112.814L18.2027 111.643C18.3402 111.483 18.4501 111.35 18.5875 111.217H19.0272V111.243ZM15.7569 112.894L15.8118 112.76C15.2347 112.654 15.1797 112.654 15.3996 112.068L15.6194 111.456H16.2515C16.5264 111.456 16.5264 111.563 16.4989 111.855H16.6638L17.0485 110.844H16.8836C16.7462 111.084 16.6363 111.243 16.334 111.243H15.7019L16.0317 110.365C16.1416 110.099 16.1966 110.019 16.5813 110.019H16.8561C17.2409 110.019 17.2958 110.125 17.2958 110.525H17.4607L17.5981 109.833H15.2347L15.1797 109.966C15.6469 110.045 15.6744 110.099 15.4546 110.658L14.9324 112.015C14.7125 112.574 14.6301 112.627 14.1079 112.707L14.0805 112.84H15.7569V112.894ZM27.3267 105.867C27.4916 105.867 27.629 105.973 27.5466 106.266L26.8046 106.426C26.942 106.106 27.1619 105.867 27.3267 105.867ZM27.739 107.011H27.6016C27.4092 107.224 27.2168 107.384 27.0244 107.384C26.8321 107.384 26.7221 107.277 26.7221 107.011C26.7221 106.905 26.7221 106.798 26.7496 106.692L27.9313 106.319C28.1512 105.787 27.8764 105.547 27.5466 105.547C26.997 105.547 26.3374 106.452 26.3374 107.251C26.3374 107.597 26.5023 107.81 26.7771 107.81C27.1344 107.81 27.4642 107.517 27.739 107.011ZM27.5191 105.334L28.3436 104.589V104.509H27.9039L27.3817 105.361H27.5191V105.334ZM24.9633 105.867H25.348L24.716 107.517C24.661 107.65 24.7434 107.81 24.8809 107.81C25.2381 107.81 25.8152 107.464 26.0076 107.011H25.8977C25.7328 107.171 25.4305 107.384 25.1832 107.437L25.7603 105.893H26.3374L26.4198 105.654H25.8427L26.0626 105.068H25.8427L25.4305 105.654L24.9358 105.707V105.867H24.9633ZM24.4137 105.787C24.4686 105.627 24.3587 105.547 24.2763 105.547C23.9465 105.547 23.5342 105.84 23.3693 106.266H23.4793C23.5892 106.106 23.7816 105.946 23.9465 105.92L23.2869 107.57C23.2319 107.73 23.3419 107.81 23.4243 107.81C23.7541 107.81 24.1388 107.517 24.3037 107.091H24.1938C24.0839 107.251 23.8915 107.41 23.7266 107.437L24.4137 105.787ZM24.5511 104.962C24.716 104.962 24.8259 104.828 24.8259 104.695C24.8259 104.536 24.6885 104.429 24.5511 104.429C24.3862 104.429 24.2763 104.562 24.2763 104.695C24.2488 104.855 24.3862 104.962 24.5511 104.962ZM22.2701 107.437L23.4518 104.403L23.4243 104.349L22.6823 104.429V104.509L22.8197 104.616C22.9571 104.722 22.9022 104.802 22.7922 105.121L21.8578 107.49C21.8029 107.623 21.8853 107.783 22.0227 107.783C22.3525 107.783 22.7373 107.49 22.9022 107.064H22.7922C22.6823 107.251 22.435 107.41 22.2701 107.437ZM19.9891 107.171C19.9891 106.665 20.5662 105.973 20.896 105.973C20.9784 105.973 21.0334 105.973 21.0883 106L20.7586 106.878C20.5662 107.118 20.2639 107.384 20.1265 107.384C20.044 107.384 19.9891 107.304 19.9891 107.171ZM21.8029 105.467H21.6105L21.4181 105.654H21.3632C20.3738 105.654 19.5494 106.718 19.5494 107.49C19.5494 107.703 19.6868 107.836 19.9066 107.836C20.154 107.836 20.4013 107.49 20.6761 107.118V107.251C20.6486 107.623 20.7586 107.836 20.9784 107.836C21.2258 107.836 21.4456 107.464 21.6105 107.118H21.5006C21.3907 107.277 21.2807 107.384 21.1983 107.384C21.1158 107.384 21.0334 107.224 21.1983 106.878L21.8029 105.467ZM17.4333 108.209C17.4333 107.996 17.6531 107.863 17.9554 107.73C18.0653 107.783 18.2027 107.836 18.4226 107.889C18.7524 107.996 18.8623 108.023 18.8623 108.129C18.8623 108.342 18.505 108.475 18.0104 108.475C17.6256 108.502 17.4333 108.422 17.4333 108.209ZM18.3127 106.878C18.1753 106.878 18.1203 106.772 18.1203 106.638C18.1203 106.266 18.3127 105.733 18.6425 105.733C18.7799 105.733 18.8348 105.84 18.8348 105.973C18.8623 106.319 18.6425 106.878 18.3127 106.878ZM19.2471 107.996C19.2471 107.73 18.9997 107.623 18.615 107.517C18.2852 107.41 18.1203 107.384 18.1203 107.277C18.1203 107.197 18.2027 107.091 18.3402 107.011C18.8898 106.984 19.2745 106.505 19.2745 106.079C19.2745 106 19.2471 105.92 19.2196 105.84H19.6868L19.7692 105.6H19.0272C18.9448 105.547 18.8348 105.521 18.7249 105.521C18.1203 105.521 17.7356 106.026 17.7356 106.426C17.7356 106.745 17.9279 106.931 18.2027 106.984C17.9279 107.118 17.763 107.251 17.763 107.41C17.763 107.517 17.7905 107.57 17.873 107.623C17.2409 107.81 16.9661 108.023 16.9661 108.315C16.9661 108.608 17.3508 108.715 17.818 108.715C18.5875 108.768 19.2471 108.342 19.2471 107.996ZM16.2515 106.239C16.5264 106.239 16.5264 106.346 16.4989 106.638H16.6638L17.0485 105.627H16.8836C16.7462 105.867 16.6363 106.026 16.334 106.026H15.7019L16.0042 105.201C16.1141 104.935 16.1691 104.882 16.5538 104.882H16.8287C17.2134 104.882 17.2684 104.988 17.2684 105.361H17.4333L17.5707 104.669H15.2072L15.1523 104.802C15.6194 104.882 15.6469 104.935 15.4271 105.494L14.9049 106.851C14.6851 107.41 14.6026 107.464 14.0805 107.543L14.053 107.677H16.6912L17.1584 106.958H16.9935C16.6912 107.224 16.3065 107.49 15.7843 107.49C15.0973 107.49 15.1523 107.464 15.3721 106.851L15.6194 106.186H16.2515V106.239ZM16.6088 104.482L17.4333 103.923V103.844H16.9386L16.4714 104.482H16.6088ZM27.0519 100.676C27.2168 100.676 27.3542 100.783 27.2718 101.075L26.5298 101.235C26.6672 100.916 26.887 100.676 27.0519 100.676ZM27.4642 101.821H27.3267C27.1344 102.034 26.942 102.193 26.7496 102.193C26.5573 102.193 26.4473 102.087 26.4473 101.821C26.4473 101.714 26.4473 101.608 26.4748 101.501L27.6565 101.129C27.8764 100.596 27.6016 100.357 27.2718 100.357C26.7221 100.357 26.0626 101.262 26.0626 102.06C26.0626 102.406 26.2275 102.619 26.5023 102.619C26.8596 102.619 27.1893 102.326 27.4642 101.821ZM27.2443 100.144L28.0688 99.3985V99.3186H27.629L27.1069 100.17H27.2443V100.144ZM24.7709 100.676H25.0732L24.4411 102.326C24.3862 102.459 24.4686 102.619 24.606 102.619C24.9633 102.619 25.5404 102.273 25.7328 101.821H25.6229C25.458 101.98 25.1557 102.193 24.9083 102.247L25.4855 100.703H26.0626L26.145 100.463H25.5679L25.7878 99.8776H25.5679L25.1557 100.463L24.7434 100.516V100.676H24.7709ZM24.4686 100.862C24.5511 100.596 24.4961 100.357 24.3037 100.357C24.0564 100.357 23.974 100.543 23.7266 101.075V100.756C23.7266 100.543 23.6442 100.33 23.4518 100.33C23.2045 100.33 22.9846 100.703 22.8197 101.049H22.9296C23.0396 100.889 23.1495 100.783 23.2319 100.783C23.3419 100.783 23.3968 100.942 23.2319 101.288L22.7647 102.273C22.6823 102.459 22.7647 102.593 22.9571 102.593C23.067 102.593 23.122 102.566 23.177 102.433L23.6442 101.262C23.7816 101.102 23.8915 100.969 24.0289 100.836H24.4686V100.862ZM21.8304 100.676C21.9953 100.676 22.1327 100.783 22.0502 101.075L21.3082 101.235C21.4456 100.916 21.6655 100.676 21.8304 100.676ZM22.2426 101.821H22.1052C21.9128 102.034 21.7204 102.193 21.5281 102.193C21.3357 102.193 21.2258 102.087 21.2258 101.821C21.2258 101.714 21.2258 101.608 21.2532 101.501L22.435 101.129C22.6548 100.596 22.38 100.357 22.0502 100.357C21.5006 100.357 20.841 101.262 20.841 102.06C20.841 102.406 21.0059 102.619 21.2807 102.619C21.638 102.619 21.9678 102.326 22.2426 101.821ZM19.3295 102.3C19.2196 102.3 19.0547 102.193 19.0547 102.113C19.0547 102.087 19.1097 101.954 19.1646 101.794L19.357 101.288C19.5494 101.049 19.8791 100.809 20.044 100.809C20.154 100.809 20.2364 100.862 20.2364 101.022C20.2639 101.475 19.8242 102.3 19.3295 102.3ZM20.7036 100.836C20.7036 100.49 20.5662 100.383 20.3463 100.383C20.044 100.383 19.7692 100.703 19.4944 101.075L20.2089 99.2654L20.1814 99.2122L19.4394 99.292V99.3719L19.5768 99.4783C19.7143 99.5848 19.6593 99.6913 19.5494 99.9841L18.7799 101.901C18.7249 102.034 18.6425 102.22 18.6425 102.247C18.6425 102.433 18.9173 102.619 19.1646 102.619C19.7143 102.619 20.7036 101.608 20.7036 100.836ZM18.3676 100.596C18.4226 100.437 18.3127 100.357 18.2302 100.357C17.9004 100.357 17.4882 100.65 17.3233 101.075H17.4333C17.5432 100.916 17.7356 100.756 17.9004 100.729L17.2409 102.38C17.1859 102.539 17.2958 102.619 17.3783 102.619C17.7081 102.619 18.0928 102.326 18.2577 101.901H18.1478C18.0379 102.06 17.8455 102.22 17.6806 102.247L18.3676 100.596ZM18.4776 99.7711C18.6425 99.7711 18.7524 99.638 18.7524 99.505C18.7524 99.3452 18.615 99.2388 18.4776 99.2388C18.3127 99.2388 18.2027 99.3719 18.2027 99.505C18.2027 99.6647 18.3127 99.7711 18.4776 99.7711ZM16.7462 99.505H15.1797L15.1248 99.638C15.592 99.7179 15.6194 99.7711 15.3996 100.33L14.9049 101.688C14.6851 102.247 14.6026 102.3 14.0805 102.38L14.053 102.513H16.4439L16.9661 101.634H16.7737C16.4714 101.954 16.1416 102.326 15.6194 102.326C15.2347 102.326 15.1797 102.273 15.3996 101.688L15.8943 100.33C16.1141 99.7711 16.1966 99.7179 16.7187 99.638L16.7462 99.505Z" fill="white"/> +</g> +</g> +<defs> +<clipPath id="clip0_627_41819"> +<rect width="360" height="127" fill="white"/> +</clipPath> +<clipPath id="clip1_627_41819"> +<rect width="92.5" height="25" fill="white" transform="translate(123 83)"/> +</clipPath> +<clipPath id="clip2_627_41819"> +<rect width="68.4444" height="35" fill="white" transform="translate(13 78)"/> +</clipPath> +</defs> +</svg> diff --git a/src/components/Action/ActionBegin.tsx b/src/components/Action/ActionBegin.tsx index ff9375ddae09e3087d4aeac47c5046cc1b8d2a5c..ca25da039fdcd87347f43df0ebd138f2d06834c2 100644 --- a/src/components/Action/ActionBegin.tsx +++ b/src/components/Action/ActionBegin.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useState } from 'react' +import React, { useCallback, useState, useEffect } from 'react' import { Client, useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { useSelector } from 'react-redux' @@ -9,7 +9,6 @@ import ActionModal from 'components/Action/ActionModal' import './actionBegin.scss' import { AppStore } from 'store' import ActionService from 'services/action.service' -import { useEffect } from 'react' import { importIconbyId } from 'utils/utils' import { Button } from '@material-ui/core' import defaultIcon from 'assets/icons/visu/ecogesture/default.svg' @@ -101,7 +100,7 @@ const ActionBegin: React.FC<ActionBeginProps> = ({ </div> <div className="action-duration text-18"> {t('action.duration', { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase smart_count: currentAction.actionDuration, })} </div> diff --git a/src/components/Action/ActionCard.tsx b/src/components/Action/ActionCard.tsx index 05abf2dc2ff83fe176fd73ed487ccc150e4bd5e3..6dcfbfac60b6b6d5adcdb5d538d2fa558416a633 100644 --- a/src/components/Action/ActionCard.tsx +++ b/src/components/Action/ActionCard.tsx @@ -1,7 +1,6 @@ -import React, { useState, useCallback } from 'react' +import React, { useState, useCallback, useEffect } from 'react' import { Ecogesture } from 'models' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { useEffect } from 'react' import { importIconbyId } from 'utils/utils' import './actionList.scss' import { Button } from '@material-ui/core' diff --git a/src/components/Action/ActionChoose.tsx b/src/components/Action/ActionChoose.tsx index 09f328f2fe1f25351d247ccc27b6eac747b16d0c..afdf64117986538b49a5040f2f8ffcb84261bbee 100644 --- a/src/components/Action/ActionChoose.tsx +++ b/src/components/Action/ActionChoose.tsx @@ -2,6 +2,8 @@ import React, { useState } from 'react' import { Ecogesture, UserChallenge } from 'models' import ActionBegin from 'components/Action/ActionBegin' import ActionList from 'components/Action/ActionList' +import './actionChoose.scss' + interface ActionChooseProps { userChallenge: UserChallenge } diff --git a/src/components/Action/ActionModal.tsx b/src/components/Action/ActionModal.tsx index 4ae600afff45ff7b75fab5642e23d72ef8f07755..98cee53cdff3296cd4912cdf9eaf6527f2396c9a 100644 --- a/src/components/Action/ActionModal.tsx +++ b/src/components/Action/ActionModal.tsx @@ -59,7 +59,7 @@ const ActionModal: React.FC<ActionModalProps> = ({ <Icon icon={chronoMini} size={75} /> <div className="action-title text-16-normal"> {t('action.duration', { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase smart_count: action.actionDuration, })} </div> diff --git a/src/components/Action/ActionOnGoing.tsx b/src/components/Action/ActionOnGoing.tsx index 5253eaa6765133bc1ceb5f83ddb1ccb1039e30a8..16e4379b858860c7d902a90d49ccc36f25beb049 100644 --- a/src/components/Action/ActionOnGoing.tsx +++ b/src/components/Action/ActionOnGoing.tsx @@ -31,7 +31,7 @@ const ActionOnGoing: React.FC<ActionOnGoingProps> = ({ userAction.startDate.diffNow('days').days ) const progress = ratio * progressionInDays - if (progress === 0 || progress === -0) { + if (progress === 0) { return `linear-gradient(90deg, #121212 50%,transparent 50%), linear-gradient(110deg, #58ffff 50%, transparent 50%)` } else if (progress === circle) { return `linear-gradient(90deg, #58ffff 50%, #58ffff 50%)` @@ -78,7 +78,7 @@ const ActionOnGoing: React.FC<ActionOnGoingProps> = ({ <> <div className="duration text-18-normal"> {t('action.duration', { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase smart_count: userAction.ecogesture.actionDuration, })} </div> diff --git a/src/components/Action/actionBegin.scss b/src/components/Action/actionBegin.scss index 8385a18303fb5ec622f0cd9a04ecb6ffa5bbbc45..890eb89d90520e164751043fa80809862f564cd3 100644 --- a/src/components/Action/actionBegin.scss +++ b/src/components/Action/actionBegin.scss @@ -6,6 +6,8 @@ flex-direction: column; justify-content: center; align-items: center; + margin: auto; + padding: 1.5rem; } .action-begin-container { display: flex; @@ -13,12 +15,11 @@ align-items: center; justify-content: space-around; box-sizing: border-box; - margin: 5rem 1rem 0 1rem; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; color: $white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; height: 63vh; text-align: center; position: relative; @@ -34,7 +35,7 @@ right: 0; margin: 0 auto; top: -70px; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 8px; border: solid 2px $blue; @@ -66,6 +67,7 @@ button { padding: 0.7rem; border-color: $grey-bright; + margin-top: 0.5rem; span { font-weight: 700; } diff --git a/src/components/Action/actionChoose.scss b/src/components/Action/actionChoose.scss new file mode 100644 index 0000000000000000000000000000000000000000..380667b4d295a202f77b38a17a77a908910ec05b --- /dev/null +++ b/src/components/Action/actionChoose.scss @@ -0,0 +1,3 @@ +.action-choose { + margin: auto; +} diff --git a/src/components/Action/actionDone.scss b/src/components/Action/actionDone.scss index 8167fdb4d761685099968d4a7d07cffa90b124a9..4a5de7d211b0b6e4d5015e55bb6eb9122e79fb99 100644 --- a/src/components/Action/actionDone.scss +++ b/src/components/Action/actionDone.scss @@ -7,25 +7,20 @@ width: 100%; padding: 1.5rem; box-sizing: border-box; - min-height: 75vh; + display: flex; flex-direction: column; .action-done { - box-sizing: border-box; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; - width: 100%; padding: 3rem 1.2rem; - margin: auto; color: white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); - @media all and(max-width:$width-large-phone) { - min-height: 75vh; - } + .result-title { font-size: 1.8rem; color: white; diff --git a/src/components/Action/actionList.scss b/src/components/Action/actionList.scss index 4a3f1ec5a807d478013c74e4c08b4f68e381294a..30824bec53818fbc47886dca93e74a4a7a47732b 100644 --- a/src/components/Action/actionList.scss +++ b/src/components/Action/actionList.scss @@ -1,3 +1,5 @@ +@import '../../styles/base/color'; + .action-list-container { padding: 1.5rem 2rem; display: flex; @@ -14,7 +16,7 @@ button.action-card { align-items: center; justify-content: flex-start; height: 10rem; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; padding: 1rem; diff --git a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.spec.tsx b/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.spec.tsx deleted file mode 100644 index 42801b8be53e3a256e153d752dfc4a7e9ef06dbb..0000000000000000000000000000000000000000 --- a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.spec.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import ActivateHalfHourLoad from './ActivateHalfHourLoad' -import { Provider } from 'react-redux' -import configureStore from 'redux-mock-store' -import * as reactRedux from 'react-redux' -import Button from '@material-ui/core/Button' -import { profileData } from '../../../tests/__mocks__/profile.mock' -import { DateTime } from 'luxon' -import * as profileActions from 'store/profile/profile.actions' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) -jest.mock('components/Hooks/useExploration', () => { - return () => ['', jest.fn()] -}) - -const localSpy = jest.spyOn(DateTime, 'local') -const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') -const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') -const updateProfileSpy = jest.spyOn(profileActions, 'updateProfile') - -const mockConfigureStore = configureStore([]) -const mockStore = mockConfigureStore({ - ecolyo: { - profile: profileData, - }, -}) - -describe('ActivateHalfHourLoad component test', () => { - beforeEach(() => { - localSpy.mockClear() - mockUseSelector.mockClear() - mockUseDispatch.mockClear() - updateProfileSpy.mockClear() - }) - - it('should render correctly ActivatehalfHourLoad', () => { - localSpy.mockReturnValue( - DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc' }) - ) - mockUseSelector.mockReturnValue(profileData) - mockUseDispatch.mockReturnValue(jest.fn()) - const wrapper = mount( - <Provider store={mockStore}> - <ActivateHalfHourLoad /> - </Provider> - ) - expect(wrapper.getElement()).toMatchSnapshot() - }) - - it('should render correctly ActivatehalfHourLoad with activateHalfHourDate +1 day > today', () => { - const _mockStore = mockConfigureStore({ - ecolyo: { - profile: { - ...profileData, - activateHalfHourDate: DateTime.fromISO('2020-10-10T08:00:00.000Z', { - zone: 'utc', - }), - }, - }, - }) - localSpy.mockReturnValue( - DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc' }) - ) - mockUseSelector.mockReturnValue(profileData) - mockUseDispatch.mockReturnValue(jest.fn()) - const wrapper = mount( - <Provider store={_mockStore}> - <ActivateHalfHourLoad /> - </Provider> - ) - expect(wrapper.getElement()).toMatchSnapshot() - }) - - it('should open konnector website when button is clicked and set the activateHalfHourDate in profile', () => { - localSpy.mockReturnValue( - DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc' }) - ) - mockUseSelector.mockReturnValue(profileData) - mockUseDispatch.mockReturnValue(jest.fn()) - const wrapper = mount( - <Provider store={mockStore}> - <ActivateHalfHourLoad /> - </Provider> - ) - - global.open = jest.fn() - - wrapper.find(Button).simulate('click') - expect(updateProfileSpy).toBeCalledTimes(1) - expect(updateProfileSpy).toHaveBeenCalledWith({ - activateHalfHourDate: DateTime.fromISO('2020-10-10T08:08:08.008Z', { - zone: 'utc', - }), - }) - expect(global.open).toHaveBeenCalledWith( - 'https://mon-compte-particulier.enedis.fr/donnees/', - '_blank' - ) - }) -}) diff --git a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.tsx b/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.tsx deleted file mode 100644 index e13e3c3927ad17114df940add648ebb1072f6188..0000000000000000000000000000000000000000 --- a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React, { Dispatch, useCallback } from 'react' -import { AppStore } from 'store' -import { useDispatch, useSelector } from 'react-redux' -import { IuseI18n, useI18n } from 'cozy-ui/transpiled/react/I18n' -import ConfigService from 'services/fluidConfig.service' -import Button from '@material-ui/core/Button' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import iconEnedisLogo from 'assets/icons/visu/enedis-logo.svg' -import './activateHalfHourLoad.scss' -import useExploration from 'components/Hooks/useExploration' -import { UserExplorationID } from 'enum/userExploration.enum' -import { FluidConfig, Profile } from 'models' -import { decoreText } from 'utils/decoreText' -import { DateTime } from 'luxon' -import { - ProfileActionTypes, - updateProfile, -} from 'store/profile/profile.actions' - -interface ActivateHalfHourLoadProps { - consentActive?: boolean -} - -const ActivateHalfHourLoad: React.FC<ActivateHalfHourLoadProps> = ({ - consentActive = false, -}: ActivateHalfHourLoadProps) => { - const { t }: IuseI18n = useI18n() - const { activateHalfHourDate } = useSelector( - (state: AppStore) => state.ecolyo.profile - ) - const dispatch: Dispatch<ProfileActionTypes> = useDispatch() - const fluidConfig: Array<FluidConfig> = new ConfigService().getFluidConfig() - const [, setValidExploration] = useExploration() - const tradKey: string = consentActive ? 'consent_active' : 'no_consent_active' - - const activateConsent = useCallback(() => { - setValidExploration(UserExplorationID.EXPLORATION004) - const partialProfile: Partial<Profile> = { - activateHalfHourDate: DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - } - dispatch(updateProfile(partialProfile)) - window.open(fluidConfig[0].konnectorConfig.activation, '_blank') - }, [dispatch, fluidConfig, setValidExploration]) - - return ( - <> - <div className="activatehalfhour-box"> - <div className="activatehalfhour-box-header header-text text-16-normal"> - {activateHalfHourDate && - activateHalfHourDate.plus({ days: 1 }).startOf('day') > - DateTime.local().setZone('utc', { - keepLocalTime: true, - }) ? ( - <> - <h2 className="title text-20-bold"> - {t(`timestep.activate.enedis.consent_activated.title`)} - <br /> - {t(`timestep.activate.enedis.consent_activated.title_2`)} - </h2> - {t(`timestep.activate.enedis.consent_activated.info`)} - </> - ) : ( - <> - <h2 className="title text-20-bold"> - {t(`timestep.activate.enedis.${tradKey}.title`)} - </h2> - {decoreText(t(`timestep.activate.enedis.${tradKey}.info`))} - </> - )} - </div> - <Button - aria-label={t( - `timestep.activate.enedis.${tradKey}.accessibility.button_activate` - )} - onClick={activateConsent} - classes={{ - root: 'btn-highlight', - label: 'text-16-bold', - }} - > - <div className="oauthform-button-content"> - <div className="oauthform-button-content-icon"> - <StyledIcon icon={iconEnedisLogo} size={48} /> - </div> - <div className="oauthform-button-text text-18-bold"> - {t(`timestep.activate.enedis.${tradKey}.label1`)} - </div> - </div> - </Button> - </div> - </> - ) -} - -export default ActivateHalfHourLoad diff --git a/src/components/ActivateHalfHourLoad/__snapshots__/ActivateHalfHourLoad.spec.tsx.snap b/src/components/ActivateHalfHourLoad/__snapshots__/ActivateHalfHourLoad.spec.tsx.snap deleted file mode 100644 index 3b624456f0206ebc3dd18b7eb8353c0cf2a910f0..0000000000000000000000000000000000000000 --- a/src/components/ActivateHalfHourLoad/__snapshots__/ActivateHalfHourLoad.spec.tsx.snap +++ /dev/null @@ -1,35 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ActivateHalfHourLoad component test should render correctly ActivatehalfHourLoad 1`] = ` -<Provider - store={ - Object { - "clearActions": [Function], - "dispatch": [Function], - "getActions": [Function], - "getState": [Function], - "replaceReducer": [Function], - "subscribe": [Function], - } - } -> - <ActivateHalfHourLoad /> -</Provider> -`; - -exports[`ActivateHalfHourLoad component test should render correctly ActivatehalfHourLoad with activateHalfHourDate +1 day > today 1`] = ` -<Provider - store={ - Object { - "clearActions": [Function], - "dispatch": [Function], - "getActions": [Function], - "getState": [Function], - "replaceReducer": [Function], - "subscribe": [Function], - } - } -> - <ActivateHalfHourLoad /> -</Provider> -`; diff --git a/src/components/ActivateHalfHourLoad/activateHalfHourLoad.scss b/src/components/ActivateHalfHourLoad/activateHalfHourLoad.scss deleted file mode 100644 index 60a62f65c327a18ba16fa4b7c9390e84b7314195..0000000000000000000000000000000000000000 --- a/src/components/ActivateHalfHourLoad/activateHalfHourLoad.scss +++ /dev/null @@ -1,55 +0,0 @@ -@import 'src/styles/base/breakpoint'; -@import 'src/styles/base/color'; - -// Enedis Half Hour Load Activation -.activatehalfhour-box { - background-color: rgba(18, 18, 18, 0.8); - padding: 0rem 1rem 0rem 0rem; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - min-height: 29.5rem; - @media #{$large-phone} { - min-height: 21.5rem; - padding: 0; - } - - .title { - color: $elec-color; - margin-bottom: 18px; - } - - .activatehalfhour-box-header { - text-align: center; - font-weight: bold; - letter-spacing: 0.2px; - margin-bottom: 1.5em; - color: $grey-bright; - width: 50%; - @media #{$large-phone} { - width: 90%; - } - span { - color: $elec-color; - font-weight: bold; - } - } - button.btn-highlight { - margin-left: auto; - margin-right: auto; - width: 50%; - @media #{$large-phone} { - width: 80%; - } - } - .oauthform-button-content { - display: flex; - @media (min-width: $width-large-desktop) { - display: block; - } - } - .oauthform-button-text { - align-self: center; - } -} diff --git a/src/components/Analysis/AnalysisConsumption.spec.tsx b/src/components/Analysis/AnalysisConsumption.spec.tsx index fb9eea498122754f72d2df482be6a41e06e0fc77..a080095b356ddd774283a9eb1347a0bed831e873 100644 --- a/src/components/Analysis/AnalysisConsumption.spec.tsx +++ b/src/components/Analysis/AnalysisConsumption.spec.tsx @@ -7,7 +7,6 @@ import { profileData } from '../../../tests/__mocks__/profile.mock' import AnalysisConsumption from 'components/Analysis/AnalysisConsumption' import { act } from 'react-dom/test-utils' import Button from '@material-ui/core/Button' -import StyledCard from 'components/CommonKit/Card/StyledCard' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import { mockMonthlyForecastJanuaryTestProfile1, @@ -16,6 +15,7 @@ import { import { FluidType } from 'enum/fluid.enum' import { PerformanceIndicator } from 'models' import { DateTime } from 'luxon' +import { Accordion } from '@material-ui/core' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -108,7 +108,7 @@ describe('AnalysisConsumption component', () => { await new Promise(resolve => setTimeout(resolve)) wrapper.update() }) - expect(wrapper.find(StyledCard).exists()).toBeTruthy() + expect(wrapper.find(Accordion).exists()).toBeTruthy() expect(wrapper.find('#analysisconsumptionrow').length).toBe(4) }) @@ -171,11 +171,11 @@ describe('AnalysisConsumption component', () => { await new Promise(resolve => setTimeout(resolve)) wrapper.update() }) - expect(wrapper.find(StyledCard).exists()).toBeTruthy() + expect(wrapper.find(Accordion).exists()).toBeTruthy() expect(wrapper.find('#analysisconsumptionrow').length).toBe(4) }) - it('should be rendered correctly without fluid and when click on ideal home button', async () => { + it('should be rendered correctly without fluid', async () => { const store = mockStore({ ecolyo: { profile: modifiedProfile, @@ -198,49 +198,12 @@ describe('AnalysisConsumption component', () => { await new Promise(resolve => setTimeout(resolve)) wrapper.update() }) - wrapper.find('.link-ideal').first().simulate('click') expect( - wrapper - .find('#analysisconsumptionrow') - .first() - .parent() - .prop('toggleHome') - ).toBe('ideal') + wrapper.find('#analysisconsumptionrow').first().parent().prop('fluid') + ).toBe(FluidType.MULTIFLUID) }) - it('should be rendered correctly without fluid and when click on average home button', async () => { - const store = mockStore({ - ecolyo: { - profile: modifiedProfile, - global: globalStateData, - }, - }) - const wrapper = mount( - <Provider store={store}> - <AnalysisConsumption - aggregatedPerformanceIndicator={performanceIndicator} - performanceIndicators={performanceIndicators} - analysisDate={DateTime.fromISO('2021-07-01T00:00:00.000Z', { - zone: 'utc', - })} - /> - </Provider> - ) - await act(async () => { - await new Promise(resolve => setTimeout(resolve)) - wrapper.update() - }) - wrapper.find('.link-average').first().simulate('click') - expect( - wrapper - .find('#analysisconsumptionrow') - .first() - .parent() - .prop('toggleHome') - ).toBe('average') - }) - - it('should be rendered correctly with all fluids connected for ideal', async () => { + it('should be rendered correctly with all fluids connected', async () => { const updateGlobalState = { ...globalStateData } updateGlobalState.fluidTypes = [ FluidType.ELECTRICITY, @@ -273,103 +236,12 @@ describe('AnalysisConsumption component', () => { expect(mockgetMonthlyForecast).toHaveBeenCalledWith( profileData.monthlyAnalysisDate.month - 1 ) - wrapper.find('.link-ideal').first().simulate('click') - expect( - wrapper - .find('#analysisconsumptionrow') - .first() - .parent() - .prop('toggleHome') - ).toBe('ideal') - }) - - it('should be rendered correctly with all fluids connected for average', async () => { - const updateGlobalState = { ...globalStateData } - updateGlobalState.fluidTypes = [ - FluidType.ELECTRICITY, - FluidType.WATER, - FluidType.GAS, - ] - const store = mockStore({ - ecolyo: { - profile: modifiedProfile, - profileType: profileTypeData, - global: updateGlobalState, - }, - }) - mockgetMonthlyForecast.mockReturnValue( - mockMonthlyForecastJanuaryTestProfile1 - ) - const wrapper = mount( - <Provider store={store}> - <AnalysisConsumption - aggregatedPerformanceIndicator={performanceIndicator} - performanceIndicators={performanceIndicators} - analysisDate={DateTime.fromISO('2021-07-01T00:00:00.000Z', { - zone: 'utc', - })} - /> - </Provider> - ) - await act(async () => { - await new Promise(resolve => setTimeout(resolve)) - wrapper.update() - }) - expect(mockgetMonthlyForecast).toHaveBeenCalledWith( - profileData.monthlyAnalysisDate.month - 1 - ) - wrapper.find('.link-average').first().simulate('click') - expect( - wrapper - .find('#analysisconsumptionrow') - .first() - .parent() - .prop('toggleHome') - ).toBe('average') - }) - - it('should be rendered correctly with 2 fluids connected for ideal', async () => { - const updateGlobalState = { ...globalStateData } - updateGlobalState.fluidTypes = [FluidType.ELECTRICITY, FluidType.WATER] - const store = mockStore({ - ecolyo: { - profile: modifiedProfile, - profileType: profileTypeData, - global: updateGlobalState, - }, - }) - mockgetMonthlyForecast.mockReturnValue( - mockMonthlyForecastJanuaryTestProfile1 - ) - const wrapper = mount( - <Provider store={store}> - <AnalysisConsumption - aggregatedPerformanceIndicator={performanceIndicator} - performanceIndicators={performanceIndicators} - analysisDate={DateTime.fromISO('2021-07-01T00:00:00.000Z', { - zone: 'utc', - })} - /> - </Provider> - ) - await act(async () => { - await new Promise(resolve => setTimeout(resolve)) - wrapper.update() - }) - expect(mockgetMonthlyForecast).toHaveBeenCalledWith( - profileData.monthlyAnalysisDate.month - 1 - ) - wrapper.find('.link-ideal').first().simulate('click') expect( - wrapper - .find('#analysisconsumptionrow') - .first() - .parent() - .prop('toggleHome') - ).toBe('ideal') + wrapper.find('#analysisconsumptionrow').first().parent().prop('fluid') + ).toBe(FluidType.MULTIFLUID) }) - it('should be rendered correctly with 2 fluids connected for average', async () => { + it('should be rendered correctly with 2 fluids connected', async () => { const updateGlobalState = { ...globalStateData } updateGlobalState.fluidTypes = [FluidType.ELECTRICITY, FluidType.WATER] const store = mockStore({ @@ -399,14 +271,9 @@ describe('AnalysisConsumption component', () => { expect(mockgetMonthlyForecast).toHaveBeenCalledWith( profileData.monthlyAnalysisDate.month - 1 ) - wrapper.find('.link-average').first().simulate('click') expect( - wrapper - .find('#analysisconsumptionrow') - .first() - .parent() - .prop('toggleHome') - ).toBe('average') + wrapper.find('#analysisconsumptionrow').first().parent().prop('fluid') + ).toBe(FluidType.MULTIFLUID) }) it('should redirect to profileType form when click on mui button', async () => { diff --git a/src/components/Analysis/AnalysisConsumption.tsx b/src/components/Analysis/AnalysisConsumption.tsx index 622af99b6b4ea4746430fad728a6080ea1fe4b9a..ea850893ab874a7aa107c2fa97dc32c30b2aa659 100644 --- a/src/components/Analysis/AnalysisConsumption.tsx +++ b/src/components/Analysis/AnalysisConsumption.tsx @@ -1,25 +1,30 @@ -import React, { useCallback, useEffect, useState } from 'react' +import { + Accordion, + AccordionDetails, + AccordionSummary, +} from '@material-ui/core' +import Button from '@material-ui/core/Button' +import chevronDown from 'assets/icons/ico/chevron-down.svg' +import ProfileEditIcon from 'assets/icons/ico/profile-edit.svg' +import AnalysisIcon from 'assets/icons/visu/analysis/analysis.svg' +import PlaceHolderIcon from 'assets/icons/visu/analysis/no-profile-placeholder.svg' +import AnalysisConsumptionRow from 'components/Analysis/AnalysisConsumptionRow' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import Loader from 'components/Loader/Loader' +import { Client, useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' -import { useHistory } from 'react-router-dom' import { FluidType } from 'enum/fluid.enum' +import { DateTime } from 'luxon' import { PerformanceIndicator, Profile } from 'models' import { MonthlyForecast, ProfileType } from 'models/profileType.model' -import './analysisConsumption.scss' -import Button from '@material-ui/core/Button' -import AnalysisConsumptionRow from 'components/Analysis/AnalysisConsumptionRow' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import StyledCard from 'components/CommonKit/Card/StyledCard' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import React, { useCallback, useEffect, useState } from 'react' +import { useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' import ProfileTypeService from 'services/profileType.service' -import { Client, useClient } from 'cozy-client' -import { DateTime } from 'luxon' import ProfileTypeEntityService from 'services/profileTypeEntity.service' -import PlaceHolderIcon from 'assets/icons/visu/analysis/no-profile-placeholder.svg' -import ProfileEditIcon from 'assets/icons/ico/profile-edit.svg' -import AnalysisIcon from 'assets/icons/visu/analysis/analysis.svg' +import { AppStore } from 'store' +import './analysisConsumption.scss' interface AnalysisConsumptionProps { aggregatedPerformanceIndicator: PerformanceIndicator @@ -42,9 +47,24 @@ const AnalysisConsumption: React.FC<AnalysisConsumptionProps> = ({ const { fluidTypes } = useSelector((state: AppStore) => state.ecolyo.global) const [homePriceConsumption, setHomePriceConsumption] = useState<number>(0) const [forecast, setForecast] = useState<MonthlyForecast | null>(null) - const [toggleHome, setToggleHome] = useState<string>('average') const [isLoading, setisLoading] = useState<boolean>(true) + const [activeAverageHome, setActiveAverageHome] = useState<boolean>(false) + const toggleAccordion = () => { + setActiveAverageHome(prev => !prev) + if (!activeAverageHome) { + setTimeout(() => { + const content = document.querySelector('.consumption-electricity') + if (content) { + content.scrollIntoView({ + behavior: 'smooth', + block: 'start', + }) + } + }, 300) + } + } + // Disconnected + empty fluids to show in AnalysisConsumptionRow const disconnectedFluidTypes: FluidType[] = [ FluidType.ELECTRICITY, @@ -75,12 +95,6 @@ const AnalysisConsumption: React.FC<AnalysisConsumptionProps> = ({ }, [fluidTypes] ) - const toggleAverage = () => { - setToggleHome('average') - } - const toggleIdeal = () => { - setToggleHome('ideal') - } const goToForm = () => { history.push('/profileType') @@ -175,40 +189,24 @@ const AnalysisConsumption: React.FC<AnalysisConsumptionProps> = ({ profileNotCompleted() ) : isLoading ? ( <div className="loader-container"> - <StyledSpinner size="5em" fluidType={FluidType.ELECTRICITY} /> + <Loader color="elec" /> </div> ) : ( <> <div className="consumption-title text-20-bold"> <div className="user-title">{t('analysis.user_consumption')}</div> - <div className={`${toggleHome}-title`}> - {t(`analysis.comparison`)} - </div> + <div className={`average-title`}>{t(`analysis.comparison`)}</div> </div> <div className="consumption-price"> - {fluidTypes.length > 0 ? ( - <AnalysisConsumptionRow - fluid={FluidType.MULTIFLUID} - userPriceConsumption={userPriceConsumption} - homePriceConsumption={homePriceConsumption} - performanceValue={null} - forecast={forecast} - toggleHome={toggleHome} - connected={true} - noData={false} - /> - ) : ( - <AnalysisConsumptionRow - fluid={FluidType.MULTIFLUID} - userPriceConsumption={userPriceConsumption} - homePriceConsumption={homePriceConsumption} - performanceValue={null} - forecast={forecast} - toggleHome={toggleHome} - connected={false} - noData={false} - /> - )} + <AnalysisConsumptionRow + fluid={FluidType.MULTIFLUID} + userPriceConsumption={userPriceConsumption} + homePriceConsumption={homePriceConsumption} + performanceValue={null} + forecast={forecast} + connected={fluidTypes.length > 0} + noData={false} + /> </div> {fluidTypes.map( (fluid, index) => @@ -220,7 +218,6 @@ const AnalysisConsumption: React.FC<AnalysisConsumptionProps> = ({ homePriceConsumption={homePriceConsumption} performanceValue={performanceIndicators[fluid].value} forecast={forecast} - toggleHome={toggleHome} connected={true} noData={false} /> @@ -235,7 +232,6 @@ const AnalysisConsumption: React.FC<AnalysisConsumptionProps> = ({ homePriceConsumption={homePriceConsumption} performanceValue={null} forecast={forecast} - toggleHome={toggleHome} connected={false} noData={false} /> @@ -248,34 +244,48 @@ const AnalysisConsumption: React.FC<AnalysisConsumptionProps> = ({ homePriceConsumption={homePriceConsumption} performanceValue={null} forecast={forecast} - toggleHome={toggleHome} connected={false} noData={true} /> ))} - <StyledCard - onClick={toggleAverage} - className={`link-average ${ - toggleHome === 'average' && 'active' - } grid-align`} + <Accordion + expanded={activeAverageHome} + onChange={toggleAccordion} + classes={{ + root: 'expansion-panel-root', + }} > - <span className="check-icon"></span> - <span className="link-label text-16-normal"> - {t('analysis.average_home')} - </span> - </StyledCard> - <StyledCard - onClick={toggleIdeal} - className={`link-ideal ${ - toggleHome === 'ideal' && 'active' - } grid-align`} - > - <span className="check-icon"></span> - <span className="link-label text-16-normal"> - {t('analysis.ideal_home')} - </span> - </StyledCard> + <AccordionSummary + aria-label={t( + 'profile_type.accessibility.button_toggle_average_home' + )} + expandIcon={ + <Icon + icon={chevronDown} + size={16} + className="accordion-icon" + /> + } + classes={{ + root: 'expansion-panel-summary', + content: 'expansion-panel-content', + }} + > + <div className="accordion-title accordion-title"> + {t('analysis.average_home')} + </div> + </AccordionSummary> + <AccordionDetails + classes={{ + root: 'expansion-panel-details', + }} + > + <span className="accordion-desc text-16-normal"> + {t('analysis.average_home_description')} + </span> + </AccordionDetails> + </Accordion> </> )} </div> diff --git a/src/components/Analysis/AnalysisConsumptionRow.spec.tsx b/src/components/Analysis/AnalysisConsumptionRow.spec.tsx index 866717ba5f698741665112769fdf6a01f0506f24..2deb45ac4ad4b3d3cee5ee7c0c71f6ebc5e3767d 100644 --- a/src/components/Analysis/AnalysisConsumptionRow.spec.tsx +++ b/src/components/Analysis/AnalysisConsumptionRow.spec.tsx @@ -20,7 +20,6 @@ describe('AnalysisConsumptionRow component', () => { const homePriceConsumption = 18 const performanceValue: number | null = 25 const forecast: MonthlyForecast = mockMonthlyForecastJanuaryTestProfile1 - const toggleHome = 'average' const connected = true const noData = false @@ -33,7 +32,6 @@ describe('AnalysisConsumptionRow component', () => { homePriceConsumption={homePriceConsumption} performanceValue={mockPerformanceValue} forecast={forecast} - toggleHome={toggleHome} connected={connected} noData={noData} /> @@ -55,7 +53,6 @@ describe('AnalysisConsumptionRow component', () => { homePriceConsumption={homePriceConsumption} performanceValue={mockPerformanceValue} forecast={forecast} - toggleHome={toggleHome} connected={mockConnected} noData={noData} /> @@ -75,7 +72,6 @@ describe('AnalysisConsumptionRow component', () => { homePriceConsumption={homePriceConsumption} performanceValue={performanceValue} forecast={forecast} - toggleHome={toggleHome} connected={connected} noData={noData} /> @@ -91,31 +87,6 @@ describe('AnalysisConsumptionRow component', () => { expect(wrapper.find('.not-connected').exists()).toBeFalsy() }) - it('should be rendered correctly for singleFluid connected for ideal', async () => { - const mockToggleHome = 'ideal' - const wrapper = mount( - <AnalysisConsumptionRow - fluid={FluidType.ELECTRICITY} - userPriceConsumption={userPriceConsumption} - homePriceConsumption={homePriceConsumption} - performanceValue={performanceValue} - forecast={forecast} - toggleHome={mockToggleHome} - connected={connected} - noData={noData} - /> - ) - expect(wrapper.find('.consumption-electricity').exists()).toBeTruthy() - expect(wrapper.find('.price').first().text()).toBe( - '25 FLUID.ELECTRICITY.UNIT' - ) - expect(wrapper.find('.price').last().text()).toBe( - '3906 FLUID.ELECTRICITY.UNIT' - ) - expect(wrapper.find('.graph').exists()).toBeTruthy() - expect(wrapper.find('.not-connected').exists()).toBeFalsy() - }) - it('should be rendered correctly for singleFluid not connected', async () => { const mockConnected = false const wrapper = mount( @@ -125,7 +96,6 @@ describe('AnalysisConsumptionRow component', () => { homePriceConsumption={homePriceConsumption} performanceValue={performanceValue} forecast={forecast} - toggleHome={toggleHome} connected={mockConnected} noData={noData} /> @@ -148,7 +118,6 @@ describe('AnalysisConsumptionRow component', () => { homePriceConsumption={homePriceConsumption} performanceValue={mockPerformanceValue} forecast={forecast} - toggleHome={toggleHome} connected={connected} noData={noData} /> @@ -183,7 +152,6 @@ describe('AnalysisConsumptionRow component', () => { homePriceConsumption={homePriceConsumption} performanceValue={performanceValue} forecast={mockforecast} - toggleHome={toggleHome} connected={connected} noData={noData} /> diff --git a/src/components/Analysis/AnalysisConsumptionRow.tsx b/src/components/Analysis/AnalysisConsumptionRow.tsx index e3830ee19ffd749cd38e36aa9123d00774f2a706..c4a3fbeb8ed1f7b4984448c3d98638767ecc13b0 100644 --- a/src/components/Analysis/AnalysisConsumptionRow.tsx +++ b/src/components/Analysis/AnalysisConsumptionRow.tsx @@ -16,7 +16,6 @@ interface AnalysisConsumptionRowProps { homePriceConsumption: number performanceValue: number | null forecast: MonthlyForecast | null - toggleHome: string connected: boolean noData: boolean } @@ -27,21 +26,15 @@ const AnalysisConsumptionRow: React.FC<AnalysisConsumptionRowProps> = ({ homePriceConsumption, performanceValue, forecast, - toggleHome, connected, noData, }: AnalysisConsumptionRowProps) => { const { t } = useI18n() const converterService: ConverterService = new ConverterService() - const idealCoefficient = 0.1 const maxPriceConsumption: number = Math.max( userPriceConsumption, homePriceConsumption ) - const forecastPriceConsumption: number = - toggleHome === 'ideal' - ? homePriceConsumption - homePriceConsumption * idealCoefficient - : homePriceConsumption const fluidLoad: number = forecast && fluid !== FluidType.MULTIFLUID ? forecast.fluidForecast[fluid].load @@ -73,24 +66,19 @@ const AnalysisConsumptionRow: React.FC<AnalysisConsumptionRowProps> = ({ const formatFluidConsumptionForForecast = (_fluid: FluidType) => { if (_fluid === FluidType.MULTIFLUID) { - return `${formatNumberValues(forecastPriceConsumption).toString()} €` + return `${formatNumberValues(homePriceConsumption).toString()} €` } else { - let _fluidLoad: number = fluidLoad - if (toggleHome === 'ideal') { - _fluidLoad = fluidLoad - fluidLoad * idealCoefficient - } // keeps unit in kWh for electricity and gas if (_fluid === FluidType.ELECTRICITY || _fluid === FluidType.GAS) { - return `${Math.round(_fluidLoad)} ${t( + return `${Math.round(fluidLoad)} ${t( `FLUID.${FluidType[_fluid]}.UNIT` )}` } - return (performanceValue && performanceValue >= 1000) || - _fluidLoad >= 1000 - ? formatNumberValues(_fluidLoad / 1000).toString() + + return (performanceValue && performanceValue >= 1000) || fluidLoad >= 1000 + ? formatNumberValues(fluidLoad / 1000).toString() + ' ' + t(`FLUID.${FluidType[_fluid]}.MEGAUNIT`) - : Math.round(_fluidLoad) + ' ' + t(`FLUID.${FluidType[_fluid]}.UNIT`) + : Math.round(fluidLoad) + ' ' + t(`FLUID.${FluidType[_fluid]}.UNIT`) } } @@ -108,14 +96,11 @@ const AnalysisConsumptionRow: React.FC<AnalysisConsumptionRowProps> = ({ const getWidthForForecast = (_fluid: FluidType) => { if (_fluid === FluidType.MULTIFLUID) { - return `${(forecastPriceConsumption / maxPriceConsumption) * 100}%` + return `${(homePriceConsumption / maxPriceConsumption) * 100}%` } else { - let fluidValue: number = forecast + const fluidValue: number = forecast ? forecast.fluidForecast[_fluid].value : 0 - if (toggleHome === 'ideal') { - fluidValue = fluidValue - fluidValue * idealCoefficient - } return `${(fluidValue / maxPriceConsumption) * 100}%` } } @@ -154,7 +139,7 @@ const AnalysisConsumptionRow: React.FC<AnalysisConsumptionRowProps> = ({ size={22} /> </div> - <div className={`${toggleHome}-graph`}> + <div className="average-graph"> <div className="container-graph"> {connected && ( <div diff --git a/src/components/Analysis/ElecHalfHourChart.tsx b/src/components/Analysis/ElecHalfHourChart.tsx index 3d2c1990fe524c0b6b6b76e8cfc38d96851a2c90..e04845561012176f17a145ff8ff19956e448781c 100644 --- a/src/components/Analysis/ElecHalfHourChart.tsx +++ b/src/components/Analysis/ElecHalfHourChart.tsx @@ -19,9 +19,9 @@ const ElecHalfHourChart = ({ dataLoad, isWeekend }: ElecHalfHourChartProps) => { const [height, setHeight] = useState<number>(0) const chartContainer = useRef<HTMLDivElement>(null) const marginLeft = 10 - const marginRight = 10 - const marginTop = 20 - const marginBottom = 50 + const marginRight = 60 + const marginTop = 0 + const marginBottom = 30 const getContentWidth = () => { return width - marginLeft - marginRight } @@ -30,10 +30,7 @@ const ElecHalfHourChart = ({ dataLoad, isWeekend }: ElecHalfHourChartProps) => { return height - marginTop - marginBottom } const getMaxLoad = () => { - const maxLoad = dataLoad - ? Math.max(...dataLoad.map((d: Dataload) => d.value)) - : 0 - return maxLoad + return dataLoad ? Math.max(...dataLoad.map((d: Dataload) => d.value)) : 0 } const xScale: ScaleBand<string> = scaleBand() @@ -43,7 +40,7 @@ const ElecHalfHourChart = ({ dataLoad, isWeekend }: ElecHalfHourChartProps) => { ) ) .range([0, getContentWidth()]) - .padding(0.2) + .padding(0.1) const yScale: ScaleLinear<number, number> = scaleLinear() .domain([0, getMaxLoad()]) @@ -52,7 +49,7 @@ const ElecHalfHourChart = ({ dataLoad, isWeekend }: ElecHalfHourChartProps) => { useEffect(() => { function handleResize() { const maxWidth = 940 - const maxHeight = 200 + const maxHeight = 170 const _width = chartContainer.current ? chartContainer.current.offsetWidth > maxWidth ? maxWidth @@ -82,7 +79,7 @@ const ElecHalfHourChart = ({ dataLoad, isWeekend }: ElecHalfHourChartProps) => { marginTop={marginTop} isAnalysis={true} /> - <g transform={`translate(${10},${10})`}> + <g transform={`translate(${10},${0})`}> {dataLoad.map((value, index) => { return ( <Bar diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis.spec.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis.spec.tsx index 02cfa8bca48d4c991fbeafdef5040fc8fb59bf77..9ce4cd90f3c0e38d3fceae44c5f4aaf3f57acd7e 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis.spec.tsx +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis.spec.tsx @@ -136,7 +136,7 @@ describe('ElecHalfHourMonthlyAnalysis component', () => { mockGetEnedisMonthlyAnalysisByDate.mockResolvedValueOnce( mockEnedisMonthlyAnalysisArray ) - mockAggregateValuesToDataLoad.mockResolvedValueOnce( + mockAggregateValuesToDataLoad.mockReturnValueOnce( mockDataLoadEnedisAnalysis ) mockGetPrices.mockResolvedValue(allLastFluidPrices[0]) diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis.tsx index 712283338269cd52f1cc3fc83a48ec4b6c7d34af..c80479c0bc760ddccb18ae119e6c473b47f096f0 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis.tsx +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis.tsx @@ -1,34 +1,28 @@ -import React, { useCallback, useEffect, useState } from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import IconButton from '@material-ui/core/IconButton' import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg' -import RigthArrowIcon from 'assets/icons/ico/right-arrow.svg' -import MinIcon from 'assets/icons/ico/minimum.svg' import MaxPowerIcon from 'assets/icons/ico/maxPower.svg' -import IconButton from '@material-ui/core/IconButton' +import MinIcon from 'assets/icons/ico/minimum.svg' +import RightArrowIcon from 'assets/icons/ico/right-arrow.svg' +import ElecHalfHourChart from 'components/Analysis/ElecHalfHourChart' +import Loader from 'components/Loader/Loader' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' import { FluidType } from 'enum/fluid.enum' -import iconEnedisLogo from 'assets/icons/visu/enedis-logo.svg' -import { UserExplorationID } from 'enum/userExploration.enum' -import { getNavPicto } from 'utils/picto' +import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' -import { useClient } from 'cozy-client' -import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service' -import ConsumptionService from 'services/consumption.service' +import { FluidPrice, PerformanceIndicator } from 'models' import { AggregatedEnedisMonthlyDataloads, EnedisMonthlyAnalysisData, } from 'models/enedisMonthlyAnalysis' -import ElecHalfHourChart from 'components/Analysis/ElecHalfHourChart' +import React, { useCallback, useEffect, useState } from 'react' +import ConsumptionService from 'services/consumption.service' +import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service' +import FluidPricesService from 'services/fluidsPrices.service' +import { getNavPicto } from 'utils/picto' import './elecHalfHourMonthlyAnalysis.scss' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import { TimeStep } from 'enum/timeStep.enum' -import { Button } from '@material-ui/core' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import useExploration from 'components/Hooks/useExploration' -import { FluidConfig, FluidPrice, PerformanceIndicator } from 'models' -import ConfigService from 'services/fluidConfig.service' import ElecInfoModal from './ElecInfoModal' -import FluidPricesService from 'services/fluidsPrices.service' interface ElecHalfHourMonthlyAnalysisProps { analysisDate: DateTime @@ -40,8 +34,6 @@ const ElecHalfHourMonthlyAnalysis: React.FC< > = ({ analysisDate, perfIndicator }: ElecHalfHourMonthlyAnalysisProps) => { const { t } = useI18n() const client = useClient() - const fluidConfig: Array<FluidConfig> = new ConfigService().getFluidConfig() - const [, setValidExploration] = useExploration() const [isWeekend, setisWeekend] = useState<boolean>(true) const [isHalfHourActivated, setisHalfHourActivated] = useState<boolean>(true) const [isLoading, setisLoading] = useState<boolean>(true) @@ -60,14 +52,20 @@ const ElecHalfHourMonthlyAnalysis: React.FC< const toggleOpenModal = useCallback(() => { setOpenInfoModal(prev => !prev) }, []) - const getPowerChart = useCallback((): JSX.Element => { + const isDataFullyComplete = useCallback(monthDataloads => { if ( monthDataloads && monthDataloads.weekend && monthDataloads.week && - monthDataloads.weekend[0] !== null && - monthDataloads.week[0] !== null + monthDataloads.weekend[0]?.value !== null && + monthDataloads.week[0]?.value !== null ) { + return true + } else return false + }, []) + + const getPowerChart = useCallback((): JSX.Element => { + if (monthDataloads && isDataFullyComplete(monthDataloads)) { return ( <ElecHalfHourChart dataLoad={isWeekend ? monthDataloads.weekend : monthDataloads.week} @@ -77,7 +75,7 @@ const ElecHalfHourMonthlyAnalysis: React.FC< } else { return <p className={`text-20-bold no_data`}>{t('analysis.no_data')}</p> } - }, [isWeekend, monthDataloads, t]) + }, [isDataFullyComplete, isWeekend, monthDataloads, t]) useEffect(() => { let subscribed = true @@ -132,6 +130,7 @@ const ElecHalfHourMonthlyAnalysis: React.FC< } } getAllLastPrices() + return () => { subscribed = false } @@ -145,7 +144,12 @@ const ElecHalfHourMonthlyAnalysis: React.FC< size={42} /> <div className="text-18-normal title">{t('special_elec.title')}</div> - {isHalfHourActivated ? ( + {!isHalfHourActivated && ( + <div className="activation-text text-18-normal"> + {t(`timestep.half_an_hour.analysis_waiting_data`)} + </div> + )} + {isHalfHourActivated && ( <> <div className="navigator"> <IconButton @@ -171,13 +175,18 @@ const ElecHalfHourMonthlyAnalysis: React.FC< onClick={handleChangeWeek} className="arrow-next" > - <Icon icon={RigthArrowIcon} size={24} /> + <Icon icon={RightArrowIcon} size={24} /> </IconButton> </div> - {!isLoading ? ( + {isLoading && ( + <div className="loader-container"> + <Loader color="elec" /> + </div> + )} + {!isLoading && ( <> {getPowerChart()} - {enedisAnalysisValues && ( + {enedisAnalysisValues && isDataFullyComplete(monthDataloads) && ( <div className="min-max"> <div className="container"> <Icon icon={MaxPowerIcon} size={40} className="minIcon" /> @@ -214,9 +223,7 @@ const ElecHalfHourMonthlyAnalysis: React.FC< <span className="text-18-normal"> kWh</span> </div> <div className="text-18-bold"> - {facturePercentage - ? facturePercentage.toFixed(0) - : '---'} + {facturePercentage?.toFixed(0) || '---'} <span className="text-18-normal"> %</span> </div> <div className="text-18-bold"> @@ -241,44 +248,8 @@ const ElecHalfHourMonthlyAnalysis: React.FC< </div> )} </> - ) : ( - <div className="loader-container"> - <StyledSpinner size="5em" fluidType={FluidType.ELECTRICITY} /> - </div> )} </> - ) : ( - <> - <div className="activation-text text-18-normal"> - {t(`timestep.activate.enedis.no_consent_active.text_analysis`)} - </div> - <Button - aria-label={t( - `timestep.activate.enedis.no_consent_active.accessibility.button_activate` - )} - onClick={() => { - setValidExploration(UserExplorationID.EXPLORATION004) - window.open(fluidConfig[0].konnectorConfig.activation, '_blank') - }} - classes={{ - root: 'btn-highlight', - label: 'text-16-bold', - }} - > - <div className="oauthform-button-content"> - <div className="oauthform-button-content-icon"> - <StyledIcon icon={iconEnedisLogo} size={48} /> - </div> - <div className="oauthform-button-text text-18-bold"> - <div> - {t( - `timestep.activate.enedis.no_consent_active.accessibility.button_activate` - )} - </div> - </div> - </div> - </Button> - </> )} <ElecInfoModal open={openInfoModal} handleCloseClick={toggleOpenModal} /> </div> diff --git a/src/components/Analysis/MaxConsumptionCard.tsx b/src/components/Analysis/MaxConsumptionCard.tsx index 3d95f0ec3d15f8abdb56338af830766b54314e38..b8bb9c6deb9d1678a4f52033108c2c9736756ffc 100644 --- a/src/components/Analysis/MaxConsumptionCard.tsx +++ b/src/components/Analysis/MaxConsumptionCard.tsx @@ -1,23 +1,23 @@ -import React, { useCallback, useEffect, useState } from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import IconButton from '@material-ui/core/IconButton' +import GraphIcon from 'assets/icons/ico/graph-icon.svg' import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg' -import RigthArrowIcon from 'assets/icons/ico/right-arrow.svg' +import RightArrowIcon from 'assets/icons/ico/right-arrow.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import IconButton from '@material-ui/core/IconButton' +import Loader from 'components/Loader/Loader' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' -import GraphIcon from 'assets/icons/ico/graph-icon.svg' import { FluidType } from 'enum/fluid.enum' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' -import { getNavPicto } from 'utils/picto' -import { DateTime } from 'luxon' -import { useClient } from 'cozy-client' import { TimeStep } from 'enum/timeStep.enum' +import { DateTime } from 'luxon' import { Dataload, TimePeriod } from 'models' +import React, { useCallback, useEffect, useState } from 'react' +import { useSelector } from 'react-redux' import ConsumptionDataManager from 'services/consumption.service' -import './maxConsumptionCard.scss' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' +import { AppStore } from 'store' +import { getNavPicto } from 'utils/picto' import { formatNumberValues } from 'utils/utils' +import './maxConsumptionCard.scss' interface MaxConsumptionCardProps { analysisDate: DateTime @@ -33,10 +33,10 @@ const MaxConsumptionCard: React.FC<MaxConsumptionCardProps> = ({ const [index, setIndex] = useState<number>(0) const [maxDayData, setMaxDayData] = useState<Dataload | null>(null) - const [isLoading, setisLoading] = useState<boolean>(false) + const [isLoading, setIsLoading] = useState<boolean>(false) const handleChangePrevFluid = useCallback(() => { - setisLoading(true) + setIsLoading(true) if (index === 0) { setIndex(fluidTypes.length - 1) } else { @@ -45,7 +45,7 @@ const MaxConsumptionCard: React.FC<MaxConsumptionCardProps> = ({ }, [fluidTypes, index]) const handleChangeNextFluid = useCallback(() => { - setisLoading(true) + setIsLoading(true) if (index === fluidTypes.length - 1) { setIndex(0) } else { @@ -56,7 +56,7 @@ const MaxConsumptionCard: React.FC<MaxConsumptionCardProps> = ({ useEffect(() => { let subscribed = true async function getMaxLoadData() { - setisLoading(true) + setIsLoading(true) const timePeriod: TimePeriod = { startDate: analysisDate.minus({ month: 1 }).startOf('month'), endDate: analysisDate.minus({ month: 1 }).endOf('month'), @@ -75,7 +75,7 @@ const MaxConsumptionCard: React.FC<MaxConsumptionCardProps> = ({ } else { setMaxDayData(null) } - setisLoading(false) + setIsLoading(false) } if (subscribed) { getMaxLoadData() @@ -111,51 +111,41 @@ const MaxConsumptionCard: React.FC<MaxConsumptionCardProps> = ({ onClick={handleChangeNextFluid} className="arrow-next" > - <Icon icon={RigthArrowIcon} size={24} /> + <Icon icon={RightArrowIcon} size={24} /> </IconButton> )} </div> <div className="data-container"> - {!isLoading ? ( - maxDayData ? ( - <> - <div className="text-24-bold maxDay-date"> - {maxDayData.date.setLocale('fr').toFormat('cccc dd LLLL')} - </div> - <Icon - className="dataloadvisualizer-euro-fluid-icon" - icon={getNavPicto(fluidTypes[index], true, true)} - size={38} - /> - <div className="maxDay-load"> - {maxDayData.value >= 1000 ? ( - <> - {formatNumberValues( - maxDayData.value, - FluidType[fluidTypes[index]] - )} - - {` ${t( - 'FLUID.' + FluidType[fluidTypes[index]] + '.MEGAUNIT' - )}`} - </> - ) : ( - <> - {formatNumberValues( - maxDayData.value, - FluidType[fluidTypes[index]] - )} - - {` ${t('FLUID.' + FluidType[fluidTypes[index]] + '.UNIT')}`} - </> - )} - </div> - </> - ) : ( - <p className={`text-20-bold no_data`}>{t('analysis.no_data')}</p> - ) - ) : ( - <StyledSpinner size="3em" fluidType={fluidTypes[index]} /> + {isLoading && <Loader fluidType={fluidTypes[index]} />} + {!isLoading && ( + <> + {!maxDayData && ( + <p className={`text-20-bold no_data`}>{t('analysis.no_data')}</p> + )} + {maxDayData && ( + <> + <div className="text-24-bold maxDay-date"> + {maxDayData.date.setLocale('fr').toFormat('cccc dd LLLL')} + </div> + <Icon + className="dataloadvisualizer-euro-fluid-icon" + icon={getNavPicto(fluidTypes[index], true, true)} + size={38} + /> + <div className="maxDay-load"> + {formatNumberValues( + maxDayData.value, + FluidType[fluidTypes[index]] + )}{' '} + {t( + `FLUID.${FluidType[fluidTypes[index]]}.${ + maxDayData.value >= 1000 ? 'MEGAUNIT' : 'UNIT' + }` + )} + </div> + </> + )} + </> )} </div> </div> diff --git a/src/components/Analysis/MonthlyAnalysis.spec.tsx b/src/components/Analysis/MonthlyAnalysis.spec.tsx index fc432cab6f73efc7b6d7e0860f3bb92bff75ab8f..ab9d33e918e9369c2a78ed777cc6df0d861137ee 100644 --- a/src/components/Analysis/MonthlyAnalysis.spec.tsx +++ b/src/components/Analysis/MonthlyAnalysis.spec.tsx @@ -39,6 +39,8 @@ describe('MonthlyAnalysis component', () => { analysisDate={DateTime.fromISO('2021-07-01T00:00:00.000Z', { zone: 'utc', })} + saveLastScrollPosition={jest.fn()} + scrollPosition={0} /> </Provider> ).getElement() diff --git a/src/components/Analysis/MonthlyAnalysis.tsx b/src/components/Analysis/MonthlyAnalysis.tsx index 94e0b0b6e15183bafca04028e2cb0c69b2c73447..ee59f2a5d1b96b51cc4346d3e94fcb33c43d3e13 100644 --- a/src/components/Analysis/MonthlyAnalysis.tsx +++ b/src/components/Analysis/MonthlyAnalysis.tsx @@ -1,23 +1,22 @@ -import React, { useEffect, useState } from 'react' +import Loader from 'components/Loader/Loader' +import FluidPerformanceIndicator from 'components/PerformanceIndicator/FluidPerformanceIndicator' import { useClient } from 'cozy-client' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' -import './monthlyanalysis.scss' - import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' +import { DateTime } from 'luxon' import { PerformanceIndicator } from 'models' +import React, { useEffect, useState } from 'react' +import { useSelector } from 'react-redux' import ConsumptionService from 'services/consumption.service' -import PerformanceIndicatorService from 'services/performanceIndicator.service' import ConfigService from 'services/fluidConfig.service' -import FluidPerformanceIndicator from 'components/PerformanceIndicator/FluidPerformanceIndicator' +import PerformanceIndicatorService from 'services/performanceIndicator.service' +import { AppStore } from 'store' import AnalysisConsumption from './AnalysisConsumption' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' import AnalysisErrorModal from './AnalysisErrorModal' -import { DateTime } from 'luxon' +import ElecHalfHourMonthlyAnalysis from './ElecHalfHourMonthlyAnalysis' import MaxConsumptionCard from './MaxConsumptionCard' +import './monthlyanalysis.scss' import TotalAnalysisChart from './TotalAnalysisChart' -import ElecHalfHourMonthlyAnalysis from './ElecHalfHourMonthlyAnalysis' interface MonthlyAnalysisProps { analysisDate: DateTime @@ -109,7 +108,12 @@ const MonthlyAnalysis: React.FC<MonthlyAnalysisProps> = ({ return ( <> - {isLoaded ? ( + {!isLoaded && ( + <div className="analysis-container-spinner" aria-busy="true"> + <Loader /> + </div> + )} + {isLoaded && ( <div className="analysis-root black"> {fluidTypes.length >= 1 ? ( <> @@ -175,10 +179,6 @@ const MonthlyAnalysis: React.FC<MonthlyAnalysisProps> = ({ <AnalysisErrorModal /> )} </div> - ) : ( - <div className="analysis-container-spinner" aria-busy="true"> - <StyledSpinner size="5em" fluidType={FluidType.MULTIFLUID} /> - </div> )} </> ) diff --git a/src/components/Analysis/PieChart.tsx b/src/components/Analysis/PieChart.tsx index d831ee1e8f82095f8c593f399c2b178e2fb358e2..72433597c1ac1d0b57513013a282eff56b5f1dde 100644 --- a/src/components/Analysis/PieChart.tsx +++ b/src/components/Analysis/PieChart.tsx @@ -45,7 +45,6 @@ const PieChart: React.FC<PieProps> = ({ const groupWithData = group.selectAll('g.arc').data(data) const colors = ['#D87B39', '#3A98EC', '#45D1B8'] - // eslint-disable-next-line @typescript-eslint/no-explicit-any const createArc: any = d3 .arc() .innerRadius(innerRadius) @@ -65,7 +64,7 @@ const PieChart: React.FC<PieProps> = ({ path .attr('class', 'arc') .attr('d', createArc) - .attr('fill', (d, i) => colors[i]) + .attr('fill', (_d, i) => colors[i]) }, [createPie, dataloadValueDetailArray, innerRadius, outerRadius]) return ( diff --git a/src/components/Analysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap b/src/components/Analysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap index 28a533d97ce044334a6213acf0d79b18e3bf25ec..1e836d9ae8cffd24ddee784604c37e2c3019a2a5 100644 --- a/src/components/Analysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap +++ b/src/components/Analysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap @@ -47,184 +47,8 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when <div className="activation-text text-18-normal" > - timestep.activate.enedis.no_consent_active.text_analysis + timestep.half_an_hour.analysis_waiting_data </div> - <WithStyles(ForwardRef(Button)) - aria-label="timestep.activate.enedis.no_consent_active.accessibility.button_activate" - classes={ - Object { - "label": "text-16-bold", - "root": "btn-highlight", - } - } - onClick={[Function]} - > - <ForwardRef(Button) - aria-label="timestep.activate.enedis.no_consent_active.accessibility.button_activate" - classes={ - Object { - "colorInherit": "MuiButton-colorInherit", - "contained": "MuiButton-contained", - "containedPrimary": "MuiButton-containedPrimary", - "containedSecondary": "MuiButton-containedSecondary", - "containedSizeLarge": "MuiButton-containedSizeLarge", - "containedSizeSmall": "MuiButton-containedSizeSmall", - "disableElevation": "MuiButton-disableElevation", - "disabled": "Mui-disabled", - "endIcon": "MuiButton-endIcon", - "focusVisible": "Mui-focusVisible", - "fullWidth": "MuiButton-fullWidth", - "iconSizeLarge": "MuiButton-iconSizeLarge", - "iconSizeMedium": "MuiButton-iconSizeMedium", - "iconSizeSmall": "MuiButton-iconSizeSmall", - "label": "MuiButton-label text-16-bold", - "outlined": "MuiButton-outlined", - "outlinedPrimary": "MuiButton-outlinedPrimary", - "outlinedSecondary": "MuiButton-outlinedSecondary", - "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", - "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", - "root": "MuiButton-root btn-highlight", - "sizeLarge": "MuiButton-sizeLarge", - "sizeSmall": "MuiButton-sizeSmall", - "startIcon": "MuiButton-startIcon", - "text": "MuiButton-text", - "textPrimary": "MuiButton-textPrimary", - "textSecondary": "MuiButton-textSecondary", - "textSizeLarge": "MuiButton-textSizeLarge", - "textSizeSmall": "MuiButton-textSizeSmall", - } - } - onClick={[Function]} - > - <WithStyles(ForwardRef(ButtonBase)) - aria-label="timestep.activate.enedis.no_consent_active.accessibility.button_activate" - className="MuiButton-root btn-highlight MuiButton-text" - component="button" - disabled={false} - focusRipple={true} - focusVisibleClassName="Mui-focusVisible" - onClick={[Function]} - type="button" - > - <ForwardRef(ButtonBase) - aria-label="timestep.activate.enedis.no_consent_active.accessibility.button_activate" - className="MuiButton-root btn-highlight MuiButton-text" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="button" - disabled={false} - focusRipple={true} - focusVisibleClassName="Mui-focusVisible" - onClick={[Function]} - type="button" - > - <button - aria-label="timestep.activate.enedis.no_consent_active.accessibility.button_activate" - className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" - disabled={false} - onBlur={[Function]} - onClick={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - tabIndex={0} - type="button" - > - <span - className="MuiButton-label text-16-bold" - > - <div - className="oauthform-button-content" - > - <div - className="oauthform-button-content-icon" - > - <StyledIcon - icon="test-file-stub" - size={48} - > - <Icon - aria-hidden={true} - icon="test-file-stub" - size={48} - spin={false} - > - <Component - aria-hidden={true} - className="styles__icon___23x3R" - height={48} - style={Object {}} - width={48} - > - <svg - aria-hidden={true} - className="styles__icon___23x3R" - height={48} - style={Object {}} - width={48} - > - <use - xlinkHref="#test-file-stub" - /> - </svg> - </Component> - </Icon> - </StyledIcon> - </div> - <div - className="oauthform-button-text text-18-bold" - > - <div> - timestep.activate.enedis.no_consent_active.accessibility.button_activate - </div> - </div> - </div> - </span> - <WithStyles(memo) - center={false} - > - <ForwardRef(TouchRipple) - center={false} - classes={ - Object { - "child": "MuiTouchRipple-child", - "childLeaving": "MuiTouchRipple-childLeaving", - "childPulsate": "MuiTouchRipple-childPulsate", - "ripple": "MuiTouchRipple-ripple", - "ripplePulsate": "MuiTouchRipple-ripplePulsate", - "rippleVisible": "MuiTouchRipple-rippleVisible", - "root": "MuiTouchRipple-root", - } - } - > - <span - className="MuiTouchRipple-root" - > - <TransitionGroup - childFactory={[Function]} - component={null} - exit={true} - /> - </span> - </ForwardRef(TouchRipple)> - </WithStyles(memo)> - </button> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(Button)> - </WithStyles(ForwardRef(Button))> <mock-elecinfomodal handleCloseClick={[Function]} open={false} @@ -556,142 +380,6 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when > analysis.no_data </p> - <div - className="min-max" - > - <div - className="container" - > - <Icon - className="minIcon" - icon="test-file-stub" - size={40} - spin={false} - > - <Component - className="minIcon styles__icon___23x3R" - height={40} - style={Object {}} - width={40} - > - <svg - className="minIcon styles__icon___23x3R" - height={40} - style={Object {}} - width={40} - > - <use - xlinkHref="#test-file-stub" - /> - </svg> - </Component> - </Icon> - <div - className="text" - > - <div - className="min text-18-normal" - > - special_elec.maxPower - </div> - </div> - <div - className="value kvAval" - > - <div - className="text-18-bold" - > - 2.0 - <span - className="text-18-normal" - > - kVA - </span> - </div> - </div> - </div> - <div - className="container consomin" - > - <Icon - className="minIcon" - icon="test-file-stub" - size={40} - spin={false} - > - <Component - className="minIcon styles__icon___23x3R" - height={40} - style={Object {}} - width={40} - > - <svg - className="minIcon styles__icon___23x3R" - height={40} - style={Object {}} - width={40} - > - <use - xlinkHref="#test-file-stub" - /> - </svg> - </Component> - </Icon> - <div - className="text text-18-normal" - > - <div> - special_elec.min - </div> - <div> - special_elec.percentage - </div> - <div> - special_elec.price - </div> - </div> - <div - className="value" - > - <div - className="text-18-bold" - > - 3.0 - <span - className="text-18-normal" - > - kWh - </span> - </div> - <div - className="text-18-bold" - > - --- - <span - className="text-18-normal" - > - % - </span> - </div> - <div - className="text-18-bold" - > - 0.4 - <span - className="text-18-normal" - > - € - </span> - </div> - </div> - </div> - <div - className="showmodal" - onClick={[Function]} - > - special_elec.showModal - </div> - </div> <mock-elecinfomodal handleCloseClick={[Function]} open={false} diff --git a/src/components/Analysis/__snapshots__/MonthlyAnalysis.spec.tsx.snap b/src/components/Analysis/__snapshots__/MonthlyAnalysis.spec.tsx.snap index 9835494487c6bd07f9bfb47b8b08a91aa150839a..df6db5b4dd2d3cd1752ae4b844b1561999e79bce 100644 --- a/src/components/Analysis/__snapshots__/MonthlyAnalysis.spec.tsx.snap +++ b/src/components/Analysis/__snapshots__/MonthlyAnalysis.spec.tsx.snap @@ -15,6 +15,8 @@ exports[`MonthlyAnalysis component should be rendered correctly 1`] = ` > <MonthlyAnalysis analysisDate={"2021-07-01T00:00:00.000Z"} + saveLastScrollPosition={[MockFunction]} + scrollPosition={0} /> </Provider> `; diff --git a/src/components/Analysis/analysisConsumption.scss b/src/components/Analysis/analysisConsumption.scss index f1465899023a2716a54d40fc243024e660bc0b9d..510244040a68e994aa9c95f1512a3a9b9016ac4f 100644 --- a/src/components/Analysis/analysisConsumption.scss +++ b/src/components/Analysis/analysisConsumption.scss @@ -7,103 +7,31 @@ display: flex; justify-content: space-between; margin-bottom: 2rem; + gap: 2rem; .user-title, - .average-title, - .ideal-title { + .average-title { flex-basis: 50%; } .user-title { text-align: right; - padding-right: 5%; color: $multi-color; } - .average-title, - .ideal-title { - padding-left: 5%; - } .average-title { color: $blue-grey; } - .ideal-title { - color: $green-light; - } } - .link-average, - .link-ideal { - .check-icon { - display: inline-block; - background: $dark-light-2; - width: 20px; - height: 20px; - border-radius: 50%; - vertical-align: middle; - margin-right: 1rem; - position: relative; - &::before, - &:after { - content: ''; - display: none; - background-color: $blue-grey; - position: absolute; - border-radius: 0.5rem; - } - &::before { - top: 11px; - left: 3px; - width: 7px; - height: 3px; - transform: rotate(46deg); - } - &::after { - top: 9px; - left: 6px; - width: 13px; - height: 3px; - transform: rotate(-45deg); - } - } - .link-label { - display: inline-block; - vertical-align: middle; - font-weight: bold; - } - &.active { - .link-label { - color: $dark-light-2; - } - .check-icon { - &::before, - &:after { - display: inline-block; - } - } - } + div.expansion-panel-root { + border: solid 2px $blue-grey; + color: $blue-grey; } - .link-average { - margin-top: 2rem; - &.active { - background: $blue-grey; - .link-label { - color: $dark-light-2; - } - } - .check-icon { - &::before, - &:after { - background-color: $blue-grey; - } - } + .accordion-title { + font-weight: bold; } - .link-ideal { - &.active { - background: $green-light; - } - .check-icon { - &::before, - &:after { - background-color: $green-light; - } - } + .accordion-desc { + color: $grey-bright; + } + div.expansion-panel-summary { + padding: 0 1rem; } .loader-container { min-height: 350px; @@ -112,17 +40,22 @@ align-items: center; margin: auto; } + .accordion-icon { + color: $blue-grey; + } } .no-profile { display: flex; align-items: center; flex-direction: column; + gap: 1rem; div { text-align: center; color: $white; } button { max-width: $width-small-phone; + margin-top: 0; } } diff --git a/src/components/Analysis/analysisConsumptionRow.scss b/src/components/Analysis/analysisConsumptionRow.scss index 2079dd10bcb6a4e410822290a0603ced17ab7d36..5d0171f1f6468965c2e8394e11f0548bbcc808a1 100644 --- a/src/components/Analysis/analysisConsumptionRow.scss +++ b/src/components/Analysis/analysisConsumptionRow.scss @@ -33,26 +33,13 @@ background-color: $blue-grey; } } - .ideal-graph { - color: $green-light; - .price { - text-align: right; - &.not-connected { - opacity: 0.55; - } - } - .graph { - background-color: $green-light; - } - } } .consumption-sep { border-top: 1px solid $grey-dark; margin: 1rem 0; } .user-graph, -.average-graph, -.ideal-graph { +.average-graph { display: flex; justify-content: space-between; flex-basis: 45%; diff --git a/src/components/Analysis/elecHalfHourMonthlyAnalysis.scss b/src/components/Analysis/elecHalfHourMonthlyAnalysis.scss index 0bf6cb51094b1d014c0657507fcfe2d01c81678b..1c91ccaf086d8e266c051b1869760209b3c2bc92 100644 --- a/src/components/Analysis/elecHalfHourMonthlyAnalysis.scss +++ b/src/components/Analysis/elecHalfHourMonthlyAnalysis.scss @@ -2,6 +2,7 @@ .special-elec-container { color: white; + .elec-icon { margin: auto; display: block; @@ -81,12 +82,13 @@ } .showmodal { cursor: pointer; - margin: 1.5rem 0 1rem 0; + margin: 1.5rem 0 0.5rem; text-align: center; color: $grey-bright; text-decoration: underline; } } .graph-elec-half-hour { - height: 13rem; + height: 12rem; + margin-top: 2rem; } diff --git a/src/components/Analysis/maxConsumptionCard.scss b/src/components/Analysis/maxConsumptionCard.scss index 1d4e4641ba0b1251fd54ad833c06cb465ca80f5d..a3da1133e6da3cb29116b85df4f83692f4bc0fd3 100644 --- a/src/components/Analysis/maxConsumptionCard.scss +++ b/src/components/Analysis/maxConsumptionCard.scss @@ -9,6 +9,7 @@ .title { color: $grey-bright; margin: 1rem 0 0.7rem 0; + text-align: center; } .fluid-navigation { display: flex; @@ -30,9 +31,6 @@ .gas { color: $gas-color; } - .title { - text-align: center; - } .no_data { color: white; } diff --git a/src/components/Analysis/monthlyanalysis.scss b/src/components/Analysis/monthlyanalysis.scss index 298a5c2bfe4916330cc53e4ba4ba86ac28c0a5c5..63a26ff9dc3254d077c3fd4369785914bb54d95c 100644 --- a/src/components/Analysis/monthlyanalysis.scss +++ b/src/components/Analysis/monthlyanalysis.scss @@ -6,7 +6,7 @@ flex-direction: column; align-items: center; justify-content: center; - padding: 0.5rem 1.5rem; + padding: 0 1.5rem 2rem; &.black { background: var(--darkLight2); } diff --git a/src/components/App.tsx b/src/components/App.tsx index 2877180faca003b9ef1c3cd4f465b6c49fbc3e9e..cd290bbd0ef71a50fd8b192df69b06379bd2b480 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -18,9 +18,7 @@ interface AppProps { } export const App = ({ tracker }: AppProps) => { - const { onboarding, isProfileEcogestureCompleted } = useSelector( - (state: AppStore) => state.ecolyo.profile - ) + const { onboarding } = useSelector((state: AppStore) => state.ecolyo.profile) const { termsStatus } = useSelector((state: AppStore) => state.ecolyo.global) const isDev = new EnvironmentService().isLocal() @@ -50,10 +48,7 @@ export const App = ({ tracker }: AppProps) => { )} <Main> <Content className="app-content"> - <Routes - termsStatus={termsStatus} - isProfileEcogestureCompleted={isProfileEcogestureCompleted} - /> + <Routes termsStatus={termsStatus} /> </Content> </Main> </SplashRoot> diff --git a/src/components/Challenge/ChallengeCardDone.spec.tsx b/src/components/Challenge/ChallengeCardDone.spec.tsx index 911ad8aafb4179d1b28446a183eeb8fa4c10bb85..aed2d7c32e5144ba4da88082915aea8c158b0ab8 100644 --- a/src/components/Challenge/ChallengeCardDone.spec.tsx +++ b/src/components/Challenge/ChallengeCardDone.spec.tsx @@ -16,12 +16,9 @@ const mockImportIconbyId = jest.fn() const mockFormatNumberValues = jest.fn() jest.mock('utils/utils', () => { return { - importIconbyId: jest.fn(() => { - return mockImportIconbyId - }), - formatNumberValues: jest.fn(() => { - return mockFormatNumberValues - }), + importIconbyId: jest.fn(() => mockImportIconbyId), + formatNumberValues: jest.fn(() => mockFormatNumberValues), + getChallengeTitleWithLineReturn: jest.fn(() => 'Challenge 1'), } }) diff --git a/src/components/Challenge/ChallengeCardDone.tsx b/src/components/Challenge/ChallengeCardDone.tsx index 9bcb3e36f99ffc04327b8fb64df99d6429681a64..5ad7f626d5a2bb3b14241444eb7faf726bc53254 100644 --- a/src/components/Challenge/ChallengeCardDone.tsx +++ b/src/components/Challenge/ChallengeCardDone.tsx @@ -2,10 +2,13 @@ import React, { useEffect, useState } from 'react' import './challengeCardDone.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import classNames from 'classnames' -import { formatNumberValues, importIconbyId } from 'utils/utils' +import { + formatNumberValues, + getChallengeTitleWithLineReturn, + importIconbyId, +} from 'utils/utils' import { UserChallenge } from 'models' import { UserChallengeSuccess } from 'enum/userChallenge.enum' -import { DateTime } from 'luxon' import defaultIcon from 'assets/icons/visu/duelResult/default.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { useHistory } from 'react-router-dom' @@ -72,7 +75,7 @@ const ChallengeCardDone: React.FC<ChallengeCardDoneProps> = ({ return ( <div className="cardContent cardDone"> <div className="challengeName text-22-bold"> - {userChallenge.duel.title} + {getChallengeTitleWithLineReturn(userChallenge.id)} </div> <div className="iconResult"> <StyledIcon diff --git a/src/components/Challenge/ChallengeCardLast.spec.tsx b/src/components/Challenge/ChallengeCardLast.spec.tsx index 68b0c68149f6f47706cecf0809fba50836e6f954..0a304978c8e1a5527c6aef4cea4956e1ccba3043 100644 --- a/src/components/Challenge/ChallengeCardLast.spec.tsx +++ b/src/components/Challenge/ChallengeCardLast.spec.tsx @@ -5,6 +5,9 @@ import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' +// Value coming from jest.config +declare let __SAU_IDEA_DIRECT_LINK__: string + jest.mock('cozy-ui/transpiled/react/I18n', () => { return { useI18n: jest.fn(() => { @@ -18,12 +21,13 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { const mockStore = configureStore([]) describe('ChallengeCardLast component', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + it('should be rendered correctly', () => { - const store = mockStore({ - ecolyo: { - global: globalStateData, - }, - }) const wrapper = mount( <Provider store={store}> <ChallengeCardLast /> @@ -31,4 +35,19 @@ describe('ChallengeCardLast component', () => { ) expect(wrapper).toMatchSnapshot() }) + + it('should open SAU new idea link', () => { + global.open = jest.fn() + + const wrapper = mount( + <Provider store={store}> + <ChallengeCardLast /> + </Provider> + ) + wrapper.find('.btn_lastCard').first().simulate('click') + expect(window.open).toBeCalledTimes(1) + expect(global.open).toHaveBeenCalledWith( + `${__SAU_IDEA_DIRECT_LINK__}?version=0.0.0` + ) + }) }) diff --git a/src/components/Challenge/ChallengeCardLast.tsx b/src/components/Challenge/ChallengeCardLast.tsx index 345753b9662de26739f3db7b74f15497b461f5c4..252ad7ec0eb7aa76703eab79af70e9b1d6287923 100644 --- a/src/components/Challenge/ChallengeCardLast.tsx +++ b/src/components/Challenge/ChallengeCardLast.tsx @@ -1,20 +1,21 @@ +import { Button } from '@material-ui/core' +import ecolyoIcon from 'assets/icons/ico/ecolyo.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import React from 'react' import './challengeCardLast.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import ecolyoIcon from 'assets/icons/visu/challenge/ecolyo.svg' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { Button } from '@material-ui/core' -import { updateModalIsFeedbacksOpen } from 'store/modal/modal.actions' -import { useDispatch } from 'react-redux' -interface ChallengeCardLastProps {} +declare let __SAU_IDEA_DIRECT_LINK__: string const ChallengeCardLast: React.FC = () => { const { t } = useI18n() - const dispatch = useDispatch() + const client = useClient() const handleClickFeedbacks = (): void => { - dispatch(updateModalIsFeedbacksOpen(true)) + window.open( + `${__SAU_IDEA_DIRECT_LINK__}?version=${client.appMetadata.version}` + ) } return ( @@ -27,9 +28,6 @@ const ChallengeCardLast: React.FC = () => { <div className="text-18-normal message"> {t('challenge.card_last.message1')} </div> - <div className="text-18-normal message"> - {t('challenge.card_last.message2')} - </div> </div> <Button aria-label={t('challenge.card_last.button')} diff --git a/src/components/Challenge/ChallengeCardLocked.tsx b/src/components/Challenge/ChallengeCardLocked.tsx index 2145bae9d39386f9e74d1644b937a4edeb84d50a..980beac580f7ef4b6425b2c9dd910293c63685ff 100644 --- a/src/components/Challenge/ChallengeCardLocked.tsx +++ b/src/components/Challenge/ChallengeCardLocked.tsx @@ -4,6 +4,7 @@ import { UserChallenge } from 'models' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import challengeLockedIcon from 'assets/icons/visu/challenge/challengeLocked.svg' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { getChallengeTitleWithLineReturn } from 'utils/utils' interface ChallengeCardLockedProps { userChallenge: UserChallenge @@ -15,7 +16,9 @@ const ChallengeCardLocked: React.FC<ChallengeCardLockedProps> = ({ return ( <div className="cardContent cardLocked"> - <span className="challengeTitle">{userChallenge.title}</span> + <span className="challengeTitle"> + {getChallengeTitleWithLineReturn(userChallenge.id)} + </span> <StyledIcon className="challengeIcon" icon={challengeLockedIcon} /> <p className="toUnlock text-16-normal-150"> {t('challenge.card.locked.desc')} diff --git a/src/components/Challenge/ChallengeCardOnGoing.tsx b/src/components/Challenge/ChallengeCardOnGoing.tsx index 25388104f9af31a5870a45002f7c9b249acecd68..586a2c3710ae00b0c960995a20c1b8fc3917d90d 100644 --- a/src/components/Challenge/ChallengeCardOnGoing.tsx +++ b/src/components/Challenge/ChallengeCardOnGoing.tsx @@ -1,32 +1,30 @@ -import React, { useCallback, useEffect, useState } from 'react' +import defaultChallengeIcon from 'assets/icons/visu/challenge/CHALLENGE0001.svg' +import circleChecked from 'assets/icons/visu/challenge/circleChecked.svg' +import circleUnchecked from 'assets/icons/visu/challenge/circleUnchecked.svg' +import circleStar from 'assets/icons/visu/duel/circleStar.svg' +import defaultIcon from 'assets/icons/visu/duel/default.svg' +import duelLocked from 'assets/icons/visu/duel/locked.svg' +import classNames from 'classnames' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import Loader from 'components/Loader/Loader' import { Client, useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { UserActionState } from 'enum/userAction.enum' +import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum' +import { UserDuelState } from 'enum/userDuel.enum' +import { UserExplorationState } from 'enum/userExploration.enum' +import { UserQuizState } from 'enum/userQuiz.enum' +import { UserChallenge } from 'models' +import React, { useCallback, useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { useHistory } from 'react-router-dom' -import { updateUserChallengeList } from 'store/challenge/challenge.actions' -import './challengeCardOnGoing.scss' import ChallengeService from 'services/challenge.service' -import { UserChallenge } from 'models' -import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum' - -import circleUnchecked from 'assets/icons/visu/challenge/circleUnchecked.svg' -import circleChecked from 'assets/icons/visu/challenge/circleChecked.svg' - -import StarsContainer from './StarsContainer' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { importIconbyId } from 'utils/utils' -import defaultIcon from 'assets/icons/visu/duel/default.svg' -import defaultChallengeIcon from 'assets/icons/visu/challenge/CHALLENGE0001.svg' -import circleStar from 'assets/icons/visu/duel/circleStar.svg' -import duelLocked from 'assets/icons/visu/duel/locked.svg' -import { UserDuelState } from 'enum/userDuel.enum' -import classNames from 'classnames' import { AppStore } from 'store' -import { UserQuizState } from 'enum/userQuiz.enum' +import { updateUserChallengeList } from 'store/challenge/challenge.actions' +import { getChallengeTitleWithLineReturn, importIconbyId } from 'utils/utils' +import './challengeCardOnGoing.scss' import ChallengeNoFluidModal from './ChallengeNoFluidModal' -import { UserExplorationState } from 'enum/userExploration.enum' -import { UserActionState } from 'enum/userAction.enum' -import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner' +import StarsContainer from './StarsContainer' interface ChallengeCardOnGoingProps { userChallenge: UserChallenge @@ -150,7 +148,9 @@ const ChallengeCardOnGoing: React.FC<ChallengeCardOnGoingProps> = ({ return ( <div className="cardContent onGoing"> <div className="titleBlock"> - <span className="challengeTitle">{userChallenge.title}</span> + <span className="challengeTitle"> + {getChallengeTitleWithLineReturn(userChallenge.id)} + </span> </div> <button title={t('challenge.card.ongoing.quiz')} @@ -234,7 +234,7 @@ const ChallengeCardOnGoing: React.FC<ChallengeCardOnGoingProps> = ({ <button className="smallCard goDuel" onClick={goDuel}> {isLoading ? ( <div className="spinner-container"> - <StyledBlackSpinner className="duel-spinner" size={46} /> + <Loader color="black" /> </div> ) : ( <> diff --git a/src/components/Challenge/ChallengeCardUnlocked.spec.tsx b/src/components/Challenge/ChallengeCardUnlocked.spec.tsx index 22c9a2f9d376cfc4da5c088bf102268b51593210..b455ad417a91598bc98890d33f2cb2ceae8d176c 100644 --- a/src/components/Challenge/ChallengeCardUnlocked.spec.tsx +++ b/src/components/Challenge/ChallengeCardUnlocked.spec.tsx @@ -1,12 +1,12 @@ -import React from 'react' +import { FluidType } from 'enum/fluid.enum' import { mount } from 'enzyme' +import React from 'react' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' -import ChallengeCardUnlocked from './ChallengeCardUnlocked' -import { userChallengeData } from '../../../tests/__mocks__/userChallengeData.mock' import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' +import { userChallengeData } from '../../../tests/__mocks__/userChallengeData.mock' +import ChallengeCardUnlocked from './ChallengeCardUnlocked' import ChallengeNoFluidModal from './ChallengeNoFluidModal' -import { FluidType } from 'enum/fluid.enum' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -29,9 +29,8 @@ jest.mock('services/challenge.service', () => { const mockImportIconbyId = jest.fn() jest.mock('utils/utils', () => { return { - importIconbyId: jest.fn(() => { - return mockImportIconbyId - }), + importIconbyId: jest.fn(() => mockImportIconbyId), + getChallengeTitleWithLineReturn: jest.fn(() => 'Challenge 1'), } }) diff --git a/src/components/Challenge/ChallengeCardUnlocked.tsx b/src/components/Challenge/ChallengeCardUnlocked.tsx index d5ad1daa2354ff346042b918a3418ec3194e6265..eaf5718d192cf3e11a74c324d43783f8b41eee51 100644 --- a/src/components/Challenge/ChallengeCardUnlocked.tsx +++ b/src/components/Challenge/ChallengeCardUnlocked.tsx @@ -11,7 +11,7 @@ import ChallengeNoFluidModal from './ChallengeNoFluidModal' import { AppStore } from 'store' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import defaultIcon from 'assets/icons/visu/challenge/challengeLocked.svg' -import { importIconbyId } from 'utils/utils' +import { getChallengeTitleWithLineReturn, importIconbyId } from 'utils/utils' import UsageEventService from 'services/usageEvent.service' import { UsageEventType } from 'enum/usageEvent.enum' import { FluidState } from 'enum/fluid.enum' @@ -83,7 +83,9 @@ const ChallengeCardUnlocked: React.FC<ChallengeCardUnlockedProps> = ({ return ( <> <div className="cardContent cardUnlocked"> - <span className="challengeTitle">{userChallenge.title}</span> + <span className="challengeTitle"> + {getChallengeTitleWithLineReturn(userChallenge.id)} + </span> <StyledIcon className="challengeIcon" icon={challengeIcon} /> <Button aria-label={t('challenge.accessibility.button_launch')} diff --git a/src/components/Challenge/ChallengeView.tsx b/src/components/Challenge/ChallengeView.tsx index aaa1b27e4014761c84fd12d0b25046e53c9e480a..46ec435514b207fc75e8844036ac2c73c29fb563 100644 --- a/src/components/Challenge/ChallengeView.tsx +++ b/src/components/Challenge/ChallengeView.tsx @@ -22,10 +22,7 @@ const ChallengeView: React.FC = () => { const marginPx = 16 const cardWitdh = window.outerWidth < 500 ? window.outerWidth - marginPx * 6 : 285 - const cardHeight = - window.outerWidth < 500 - ? window.outerHeight * 0.6 - : window.outerHeight * 0.5 + const cardHeight = window.outerHeight * 0.6 const [headerHeight, setHeaderHeight] = useState<number>(0) const [touchStart, setTouchStart] = useState<number>() const [touchEnd, setTouchEnd] = useState<number>() @@ -197,13 +194,13 @@ const ChallengeView: React.FC = () => { <StyledIconbutton onClick={moveSliderLeft} icon={LeftArrowIcon} - size={16} + sized={16} aria-label={t('challenge.accessibility.button_slider_previous')} /> <StyledIconbutton onClick={moveSliderRight} icon={RightArrowIcon} - size={16} + sized={16} aria-label={t('challenge.accessibility.button_slider_next')} /> </div> diff --git a/src/components/Challenge/__snapshots__/ChallengeCardDone.spec.tsx.snap b/src/components/Challenge/__snapshots__/ChallengeCardDone.spec.tsx.snap index ff1a9be37f62505fd20e7b875e84fa34b3ff37b2..54a1e470aabfe564142211875f79cde6e1102c84 100644 --- a/src/components/Challenge/__snapshots__/ChallengeCardDone.spec.tsx.snap +++ b/src/components/Challenge/__snapshots__/ChallengeCardDone.spec.tsx.snap @@ -7,7 +7,7 @@ exports[`ChallengeCardDone component should be rendered correctly 1`] = ` <div className="challengeName text-22-bold" > - Title DUEL001 + Challenge 1 </div> <div className="iconResult" diff --git a/src/components/Challenge/__snapshots__/ChallengeCardLocked.spec.tsx.snap b/src/components/Challenge/__snapshots__/ChallengeCardLocked.spec.tsx.snap index 57d90c6c65c183692181ef93da20a0b32d59f294..fda39f814bb35524b8a1bbc95e8f9e1740ddfdea 100644 --- a/src/components/Challenge/__snapshots__/ChallengeCardLocked.spec.tsx.snap +++ b/src/components/Challenge/__snapshots__/ChallengeCardLocked.spec.tsx.snap @@ -7,7 +7,8 @@ exports[`ChallengeCardLocked component should be rendered correctly 1`] = ` <span className="challengeTitle" > - Challenge 4 + Bernard +PIV'EAU </span> <StyledIcon className="challengeIcon" diff --git a/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap b/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap index 80f37a2cbed5893658b1c5ad8750161511129f84..487d01b855f6718e93bb1a75d57085cf2033d785 100644 --- a/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap +++ b/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap @@ -43,7 +43,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` } > <mock-challengecard - cardHeight={384} + cardHeight={460.79999999999995} cardWidth={285} index={0} indexSlider={3} @@ -195,7 +195,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` } /> <mock-challengecard - cardHeight={384} + cardHeight={460.79999999999995} cardWidth={285} index={1} indexSlider={3} @@ -347,7 +347,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` } /> <mock-challengecard - cardHeight={384} + cardHeight={460.79999999999995} cardWidth={285} index={2} indexSlider={3} @@ -499,7 +499,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` } /> <mock-challengecard - cardHeight={384} + cardHeight={460.79999999999995} cardWidth={285} index={3} indexSlider={3} @@ -651,7 +651,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` } /> <mock-challengecard - cardHeight={384} + cardHeight={460.79999999999995} cardWidth={285} index={4} indexSlider={3} @@ -803,7 +803,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` } /> <mock-challengecard - cardHeight={384} + cardHeight={460.79999999999995} cardWidth={285} index={5} indexSlider={3} @@ -963,7 +963,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` aria-label="challenge.accessibility.button_slider_previous" icon="test-file-stub" onClick={[Function]} - size={16} + sized={16} > <WithStyles(WithStyles(ForwardRef(IconButton))) aria-label="challenge.accessibility.button_slider_previous" @@ -1111,7 +1111,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = ` aria-label="challenge.accessibility.button_slider_next" icon="test-file-stub" onClick={[Function]} - size={16} + sized={16} > <WithStyles(WithStyles(ForwardRef(IconButton))) aria-label="challenge.accessibility.button_slider_next" diff --git a/src/components/Challenge/challengeCard.scss b/src/components/Challenge/challengeCard.scss index 467bf027d6cb61a93c8df01b7b56a48e6a6addd2..8088fe285dec927eb17a824e23342866fcc29239 100644 --- a/src/components/Challenge/challengeCard.scss +++ b/src/components/Challenge/challengeCard.scss @@ -1,5 +1,7 @@ +@import '../../styles/base/color'; + .slide { - margin: 1rem 1rem 1rem 0; + margin: 0 1rem 0 0; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; @@ -13,11 +15,12 @@ transform: scale(0.9); } .cardContent { - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; width: 100%; height: inherit; box-sizing: border-box; - padding: 5% 10%; + padding: 1rem; transition: all 300ms ease; + border-radius: 4px; } } diff --git a/src/components/Challenge/challengeCardDone.scss b/src/components/Challenge/challengeCardDone.scss index f03683ea5b0f4e48af5fb1d90e269d2969e96de6..1b7fd3ba8d9e505f853c63afce38cf8ecf4a6718 100644 --- a/src/components/Challenge/challengeCardDone.scss +++ b/src/components/Challenge/challengeCardDone.scss @@ -8,15 +8,14 @@ display: flex; flex-direction: column; justify-content: space-between; + gap: 1rem; align-items: center; - padding: 5% !important; .challengeName { - margin: 0.5rem 0rem; + text-align: center; } .iconResult { display: flex; - margin: 1rem 0rem; @media all and(max-height: 700px) { width: 55%; margin: auto; @@ -44,6 +43,7 @@ } .review-btn { padding: 0.625rem; + margin: 0; border: 1px solid $grey-bright; } } diff --git a/src/components/Challenge/challengeCardLast.scss b/src/components/Challenge/challengeCardLast.scss index a33b5213e170b2d0efeaabad7df147cd3313669d..b74e69be70cb5314442ea74c54cfcb517b46ac3f 100644 --- a/src/components/Challenge/challengeCardLast.scss +++ b/src/components/Challenge/challengeCardLast.scss @@ -29,7 +29,7 @@ } .btn_lastCard { padding: 8px; - max-height: 33px; + max-height: 40px; } .content, .title-last, diff --git a/src/components/Challenge/challengeCardLocked.scss b/src/components/Challenge/challengeCardLocked.scss index 35d10645f1eb0de597b6f2f9d60cd867728dbf49..279b8f1acfdac4be950684ba27e303a0078009d4 100644 --- a/src/components/Challenge/challengeCardLocked.scss +++ b/src/components/Challenge/challengeCardLocked.scss @@ -12,4 +12,5 @@ .toUnlock { text-align: center; color: $grey-bright; + font-weight: 700; } diff --git a/src/components/Challenge/challengeCardOnGoing.scss b/src/components/Challenge/challengeCardOnGoing.scss index 73bc4b49d39ffa2dc03467a8aed215217038c1fb..ce9b54f8b2aab96d482f758dffae3f82c2d7fff2 100644 --- a/src/components/Challenge/challengeCardOnGoing.scss +++ b/src/components/Challenge/challengeCardOnGoing.scss @@ -2,10 +2,10 @@ @import '../../styles/base/color'; .cardContent { - background: transparent !important; + background: transparent; &.onGoing { border: 1px solid #e0e0e0; - position: relative; + background: inherit !important; .challengeTitle { margin-top: 0; } @@ -13,31 +13,32 @@ display: flex; flex-direction: column; justify-content: center; + gap: 1rem; } .titleBlock { position: absolute; left: 0; right: 0; margin: auto; - top: -1rem; + top: -1.5rem; background: $dark-light-2; width: fit-content; padding: 0 1rem; max-width: 235px; } .smallCard { + display: flex; + align-items: center; border: none; width: 100%; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; height: 24%; max-height: 90px; - margin: 0.5rem 0; - padding: 8%; + padding: 1rem; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; color: $grey-bright; box-sizing: border-box; - display: flex; font-family: $text-font; transition: all 300ms ease; @@ -75,7 +76,7 @@ margin: auto; } .cardIcon { - margin-right: 0.6rem; + margin-right: 1rem; } span { font-size: 1.1rem; diff --git a/src/components/Challenge/challengeCardUnlocked.scss b/src/components/Challenge/challengeCardUnlocked.scss index 643b024ea098228bd9db084b5cab3abb3c761640..16e4bf2bbf4e99045335009969c4fd28afe40420 100644 --- a/src/components/Challenge/challengeCardUnlocked.scss +++ b/src/components/Challenge/challengeCardUnlocked.scss @@ -1,17 +1,17 @@ +@import '../../styles/base/color'; + .modal-overlay { width: 100%; height: 100%; } .cardUnlocked { + background: linear-gradient(180deg, #323339 0%, $dark-light 100%); filter: drop-shadow(0px 4px 16px rgba(0, 0, 0, 0.55)); button.btn-duel-active { - width: fit-content !important; - margin: auto !important; - text-align: center; - display: block !important; - padding: 1rem 1.5rem !important; + margin: auto; + padding: 1.2rem 1.5rem; } .challengeIcon { @media all and(max-height: 700px) { diff --git a/src/components/Challenge/challengeView.scss b/src/components/Challenge/challengeView.scss index 00af8a20ba27b7d7fa017dbbd9ba83c5b2102999..694fcbcad650b5d18b0279daf8a3148b0098b995 100644 --- a/src/components/Challenge/challengeView.scss +++ b/src/components/Challenge/challengeView.scss @@ -5,9 +5,9 @@ .challengeSlider { position: relative; - min-height: inherit; user-select: none; display: flex; + flex: 1; flex-direction: column; align-items: center; padding: 0 2rem; @@ -17,8 +17,8 @@ width: 100%; display: flex; flex: 1; + align-items: center; transition: all 300ms ease; - margin-top: 3rem; } .cardContent { margin: auto; @@ -36,7 +36,7 @@ text-align: center; font-family: $text-font; color: $grey-bright; - font-size: 1.3rem; + font-size: 1.5rem; margin-top: 1rem; } .challengeIcon { diff --git a/src/components/Charts/AxisRight.tsx b/src/components/Charts/AxisRight.tsx index 259eb53e50c92f46ce89dffde71b3b38e658907a..18fc9e45fcdd2c985060cd31f7a6515e78beed38 100644 --- a/src/components/Charts/AxisRight.tsx +++ b/src/components/Charts/AxisRight.tsx @@ -33,7 +33,7 @@ const AxisRight = ({ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion select(yAxisRef.current!).call( axisRight(yScale) - .ticks(isAnalysis ? 0 : 4) + .ticks(isAnalysis ? 2 : 4) .tickSize(-width) .tickSizeOuter(0) .tickFormat(d => diff --git a/src/components/Charts/Bar.tsx b/src/components/Charts/Bar.tsx index 0e259ed6e063c4c6c1c3954c13fa86ef778f5b36..6cb7877b4a96217d05f9e48d0e1d456f81d5809a 100644 --- a/src/components/Charts/Bar.tsx +++ b/src/components/Charts/Bar.tsx @@ -1,14 +1,13 @@ -import React, { useState, useEffect } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' import { ScaleBand, ScaleLinear } from 'd3-scale' -import { DateTime } from 'luxon' import { detect } from 'detect-browser' - import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' +import { DateTime } from 'luxon' import { Dataload } from 'models' +import React, { useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' import DateChartService from 'services/dateChart.service' +import { AppStore } from 'store' import { setCurrentDatachartIndex, setSelectedDate, @@ -176,13 +175,13 @@ const Bar = ({ return ( <g> - {height > 0 ? ( + {height > 0 && ( <g transform={`translate(${xScaleValue}, -40)`} className="barContainer" > <rect - onClick={handleClick} + onClick={!weekdays ? handleClick : () => {}} x="0" y="0" width={showCompare ? getBandWidth() * 2 : getBandWidth()} @@ -191,11 +190,8 @@ const Bar = ({ fill="#E0E0E0" /> </g> - ) : null} - {height > 0 && - dataload.value && - dataload.value >= 0 && - isMultiMissingFluid ? ( + )} + {height > 0 && dataload.value >= 0 && isMultiMissingFluid ? ( <g transform={`translate(${xScaleValue}, ${yScaleValue})`} fill="#00000" @@ -248,44 +244,45 @@ const Bar = ({ : 'url(#diagonalHatch)' } // className={isDuel ? 'bar-duel' : barClass} - onClick={handleClick} - onAnimationEnd={onAnimationEnd} - /> - </g> - ) : height > 0 && dataload.value && dataload.value >= 0 ? ( - <g transform={`translate(${xScaleValue}, ${yScaleValue})`}> - <defs> - <linearGradient - id="gradient" - className={barClass} - x1="0" - x2="0" - y1="0" - y2="1" - > - <stop id="stop-color-1" offset="0%" /> - <stop id="stop-color-2" offset="100%" /> - </linearGradient> - </defs> - <path - d={topRoundedRect( - showCompare ? getBandWidth() : 0, - 0, - getBandWidth(), - height - yScaleValue - )} - fill="url(#gradient)" - className={isDuel ? 'bar-duel' : barClass} - onClick={handleClick} + onClick={!weekdays ? handleClick : () => {}} onAnimationEnd={onAnimationEnd} /> </g> - ) : null} + ) : ( + height > 0 && + dataload.value && + dataload.value >= 0 && ( + <g transform={`translate(${xScaleValue}, ${yScaleValue})`}> + <defs> + <linearGradient + id="gradient" + className={barClass} + x1="0" + x2="0" + y1="0" + y2="1" + > + <stop id="stop-color-1" offset="0%" /> + <stop id="stop-color-2" offset="100%" /> + </linearGradient> + </defs> + <path + d={topRoundedRect( + showCompare ? getBandWidth() : 0, + 0, + weekdays ? 3 : getBandWidth(), + height - yScaleValue + )} + fill="url(#gradient)" + className={isDuel ? 'bar-duel' : barClass} + onClick={!weekdays ? handleClick : () => {}} + onAnimationEnd={onAnimationEnd} + /> + </g> + ) + )} - {showCompare && - compareDataload && - compareDataload.value && - compareDataload.value >= 0 ? ( + {showCompare && compareDataload && compareDataload.value >= 0 && ( <g transform={`translate(${xScaleValue}, ${yScaleCompareValue})`}> <defs> <linearGradient @@ -313,7 +310,7 @@ const Bar = ({ onAnimationEnd={onCompareAnimationEnd} /> </g> - ) : null} + )} </g> ) } diff --git a/src/components/CommonKit/Icon/StyledIcon.tsx b/src/components/CommonKit/Icon/StyledIcon.tsx index c8b093a822191d2020a9d7e379408a3c5edf9af5..bbf01cc5803f126ba7b5a72e8764c34cdc961d64 100644 --- a/src/components/CommonKit/Icon/StyledIcon.tsx +++ b/src/components/CommonKit/Icon/StyledIcon.tsx @@ -1,5 +1,5 @@ -import React from 'react' import Icon from 'cozy-ui/transpiled/react/Icon' +import React from 'react' interface StyledIconProps { className?: string @@ -15,12 +15,8 @@ const StyledIcon: React.FC<StyledIconProps> = ({ ariaHidden = true, size = 16, ...props -}: StyledIconProps) => { - return ( - <> - <Icon aria-hidden={ariaHidden} icon={icon} size={size} {...props} /> - </> - ) -} +}: StyledIconProps) => ( + <Icon aria-hidden={ariaHidden} icon={icon} size={size} {...props} /> +) export default StyledIcon diff --git a/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx b/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx index 57dad61b73ea1055620af3b7fbe9f44bd13f956c..6ec0e550b0fb042da39dd822eadf0feb0cf5385c 100644 --- a/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx +++ b/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx @@ -14,7 +14,7 @@ const IconButtonBase = withStyles({ display: 'flex', flexDirection: 'column', }, -})(IconButton) +})(IconButton) as React.FC<IconButtonProps> const SelectedIconButtonBase = withStyles({ root: { @@ -22,26 +22,24 @@ const SelectedIconButtonBase = withStyles({ background: 'var(--greyLinearGradientBackground)', boxShadow: '0px 4px 16px rgba(0, 0, 0, 0.55)', }, -})(IconButtonBase) +})(IconButtonBase) as React.FC<IconButtonProps> const UnselectedIconButtonBase = withStyles({ root: { border: '1px solid var(--greyDark)', }, -})(IconButtonBase) +})(IconButtonBase) as React.FC<IconButtonProps> interface StyledIconBorderedButtonProps extends IconButtonProps { icon: string - size?: number + sized?: number selected?: boolean children?: React.ReactNode } -const StyledIconBorderedButton: React.ComponentType< - StyledIconBorderedButtonProps -> = ({ +const StyledIconBorderedButton: React.FC<StyledIconBorderedButtonProps> = ({ icon, - size = 16, + sized = 16, selected = false, children = null, ...props @@ -50,12 +48,12 @@ const StyledIconBorderedButton: React.ComponentType< <> {selected ? ( <SelectedIconButtonBase {...props}> - <StyledIconProps icon={icon} size={size} /> + <StyledIconProps icon={icon} size={sized} /> {children} </SelectedIconButtonBase> ) : ( <UnselectedIconButtonBase {...props}> - <StyledIconProps icon={icon} size={size} /> + <StyledIconProps icon={icon} size={sized} /> {children} </UnselectedIconButtonBase> )} diff --git a/src/components/CommonKit/IconButton/StyledIconButton.tsx b/src/components/CommonKit/IconButton/StyledIconButton.tsx index dd19c8551a8b43cc47dd2b9ef04771a5fddff0e6..4aaea811af86664831811cbc3e4d19219a5fa694 100644 --- a/src/components/CommonKit/IconButton/StyledIconButton.tsx +++ b/src/components/CommonKit/IconButton/StyledIconButton.tsx @@ -7,21 +7,21 @@ const IconButtonBase = withStyles({ root: { outline: 'none !important', }, -})(IconButton) +})(IconButton) as React.FC<IconButtonProps> interface StyledIconButtonProps extends IconButtonProps { icon: string - size?: number + sized?: number } -const StyledIconButton: React.ComponentType<StyledIconButtonProps> = ({ +const StyledIconButton: React.FC<StyledIconButtonProps> = ({ icon, - size = 16, + sized = 16, ...props }: StyledIconButtonProps) => { return ( <IconButtonBase {...props}> - <StyledIconProps icon={icon} size={size} /> + <StyledIconProps icon={icon} size={sized} /> </IconButtonBase> ) } diff --git a/src/components/CommonKit/IconButton/__snapshots__/StyledIconBorderedButton.spec.tsx.snap b/src/components/CommonKit/IconButton/__snapshots__/StyledIconBorderedButton.spec.tsx.snap index 55ffe0707050115b083c4664fa1c380f7755ceeb..e8691596e93d58279f285ae20f03e7f280a092ec 100644 --- a/src/components/CommonKit/IconButton/__snapshots__/StyledIconBorderedButton.spec.tsx.snap +++ b/src/components/CommonKit/IconButton/__snapshots__/StyledIconBorderedButton.spec.tsx.snap @@ -2,10 +2,12 @@ exports[`StyledIconBorderedButton component test should render correctly SelectedIconButtonBase 1`] = ` <React.Fragment> - <WithStyles(WithStyles(WithStyles(ForwardRef(IconButton))))> + <WithStyles(WithStyles(WithStyles(ForwardRef(IconButton)))) + size={20} + > <StyledIcon icon="icon" - size={20} + size={16} /> </WithStyles(WithStyles(WithStyles(ForwardRef(IconButton))))> </React.Fragment> @@ -13,10 +15,12 @@ exports[`StyledIconBorderedButton component test should render correctly Selecte exports[`StyledIconBorderedButton component test should render correctly UnselectedIconButtonBase 1`] = ` <React.Fragment> - <WithStyles(WithStyles(WithStyles(ForwardRef(IconButton))))> + <WithStyles(WithStyles(WithStyles(ForwardRef(IconButton)))) + size={20} + > <StyledIcon icon="icon" - size={20} + size={16} /> </WithStyles(WithStyles(WithStyles(ForwardRef(IconButton))))> </React.Fragment> diff --git a/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap b/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap index f91cdd49811fe980afd9c27de7cd25b30dd99de0..5f194e789590b447fa73af9ec20db6d5428904ac 100644 --- a/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap +++ b/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap @@ -1,10 +1,12 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`StyledIconButton component test should render correctly StyledIconButton 1`] = ` -<WithStyles(WithStyles(ForwardRef(IconButton)))> +<WithStyles(WithStyles(ForwardRef(IconButton))) + size={15} +> <StyledIcon icon="icon" - size={15} + size={16} /> </WithStyles(WithStyles(ForwardRef(IconButton)))> `; diff --git a/src/components/CommonKit/Spinner/Spinner.spec.tsx b/src/components/CommonKit/Spinner/Spinner.spec.tsx deleted file mode 100644 index ff1327a0d2a4de39ce9adf447cb383808841a78b..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/Spinner.spec.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import Spinner from './Spinner' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) - -describe('Spinner component test ', () => { - const mockProps = { - size: 14, - } - - it('should render correctly Spinner', () => { - const wrapper = mount(<Spinner size={mockProps.size} />) - - expect(wrapper.getElement()).toMatchSnapshot() - }) -}) diff --git a/src/components/CommonKit/Spinner/Spinner.tsx b/src/components/CommonKit/Spinner/Spinner.tsx deleted file mode 100644 index 6c9ab1f66946f964deab153a9a3ffe131a6d88c0..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/Spinner.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react' -import CircularProgress from '@material-ui/core/CircularProgress' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' - -interface SpinnerProps { - size: number | string -} - -const Spinner: React.FC<SpinnerProps> = ({ size }: SpinnerProps) => { - const { t } = useI18n() - return ( - <CircularProgress - size={size} - aria-label={t('common.accessibility.loading')} - title={t('common.accessibility.loading')} - /> - ) -} - -export default Spinner diff --git a/src/components/CommonKit/Spinner/StyledBlackSpinner.spec.tsx b/src/components/CommonKit/Spinner/StyledBlackSpinner.spec.tsx deleted file mode 100644 index 80e83b0a9ff734e3f0d96d12e41d2038a43028ee..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/StyledBlackSpinner.spec.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { mount } from 'enzyme' -import React from 'react' - -import StyledBlackSpinner from './StyledBlackSpinner' - -describe('StyledBlackSpinner component test', () => { - it('should render correclty StyledBlackSpinner', () => { - const wrapper = mount(<StyledBlackSpinner />) - expect(wrapper.getElement()).toMatchSnapshot() - }) -}) diff --git a/src/components/CommonKit/Spinner/StyledBlackSpinner.tsx b/src/components/CommonKit/Spinner/StyledBlackSpinner.tsx deleted file mode 100644 index 3895685d0115b60dad99ffcc680ebf2a9449b38c..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/StyledBlackSpinner.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react' -import { withStyles } from '@material-ui/core/styles' -import MuiCircularProgress, { - CircularProgressProps, -} from '@material-ui/core/CircularProgress' - -const SpinnerBase = withStyles({ - root: { - color: 'var(--black)', - }, -})(MuiCircularProgress) - -type StyledBlackSpinnerProps = CircularProgressProps - -const StyledBlackSpinner: React.ComponentType<StyledBlackSpinnerProps> = ({ - ...props -}: StyledBlackSpinnerProps) => { - return <SpinnerBase {...props} /> -} - -export default StyledBlackSpinner diff --git a/src/components/CommonKit/Spinner/StyledEcogestureSpinner.tsx b/src/components/CommonKit/Spinner/StyledEcogestureSpinner.tsx deleted file mode 100644 index 6b3957417a8c50fc6d0c9543ee0cfa7ec2dd734e..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/StyledEcogestureSpinner.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react' -import { withStyles } from '@material-ui/core/styles' -import MuiCircularProgress, { - CircularProgressProps, -} from '@material-ui/core/CircularProgress' - -const SpinnerBase = withStyles({ - root: { - color: 'var(--blue)', - }, -})(MuiCircularProgress) - -type StyledSpinnerProps = CircularProgressProps - -const StyledEcogestureSpinner: React.ComponentType<StyledSpinnerProps> = ({ - ...props -}: StyledSpinnerProps) => { - return <SpinnerBase {...props} /> -} - -export default StyledEcogestureSpinner diff --git a/src/components/CommonKit/Spinner/StyledSpinner.spec.tsx b/src/components/CommonKit/Spinner/StyledSpinner.spec.tsx deleted file mode 100644 index 684001d9787002e06522530afd7556c3c8dc9a50..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/StyledSpinner.spec.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import StyledSpinner from './StyledSpinner' -import { FluidType } from 'enum/fluid.enum' - -describe('StyledSpinner component test', () => { - it('should render correctly base StyledSpinner (with option home)', () => { - const wrapper = mount(<StyledSpinner fluidType={FluidType.ELECTRICITY} />) - - expect(wrapper.getElement()).toMatchSnapshot() - }) - - it('should render correctly base StyledSpinner with unknown FluidType', () => { - const wrapper = mount(<StyledSpinner fluidType={99} />) - - expect(wrapper.getElement()).toMatchSnapshot() - }) - - it('should render correctly Electricty StyledSpinner', () => { - const wrapper = mount(<StyledSpinner fluidType={FluidType.ELECTRICITY} />) - - expect(wrapper.getElement()).toMatchSnapshot() - }) - - it('should render correctly Water StyledSpinner', () => { - const wrapper = mount(<StyledSpinner fluidType={FluidType.WATER} />) - - expect(wrapper.getElement()).toMatchSnapshot() - }) - - it('should render correctly Gas StyledSpinner', () => { - const wrapper = mount(<StyledSpinner fluidType={FluidType.GAS} />) - - expect(wrapper.getElement()).toMatchSnapshot() - }) -}) diff --git a/src/components/CommonKit/Spinner/StyledSpinner.tsx b/src/components/CommonKit/Spinner/StyledSpinner.tsx deleted file mode 100644 index b6d7784c5338bb52a97a4b2127b8e1df2d341fca..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/StyledSpinner.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from 'react' -import { FluidType } from 'enum/fluid.enum' -import { withStyles } from '@material-ui/core/styles' -import MuiCircularProgress, { - CircularProgressProps, -} from '@material-ui/core/CircularProgress' - -const SpinnerBase = withStyles({ - root: { - color: 'var(--multiColor)', - }, -})(MuiCircularProgress) - -const SpinnerElec = withStyles({ - root: { - color: 'var(--elecColor)', - }, -})(MuiCircularProgress) - -const SpinnerWater = withStyles({ - root: { - color: 'var(--waterColor)', - }, -})(MuiCircularProgress) - -const SpinnerGas = withStyles({ - root: { - color: 'var(--gasColor)', - }, -})(MuiCircularProgress) - -interface StyledSpinnerProps extends CircularProgressProps { - fluidType: FluidType -} - -const StyledSpinner: React.ComponentType<StyledSpinnerProps> = ({ - fluidType, - ...props -}: StyledSpinnerProps) => { - switch (fluidType) { - case FluidType.ELECTRICITY: - return <SpinnerElec {...props} /> - case FluidType.WATER: - return <SpinnerWater {...props} /> - case FluidType.GAS: - return <SpinnerGas {...props} /> - case FluidType.MULTIFLUID: - return <SpinnerBase {...props} /> - default: - return <SpinnerBase {...props} /> - } -} - -export default StyledSpinner diff --git a/src/components/CommonKit/Spinner/__snapshots__/Spinner.spec.tsx.snap b/src/components/CommonKit/Spinner/__snapshots__/Spinner.spec.tsx.snap deleted file mode 100644 index 1d209b97fa03772a710d1b4ca6edcaaf6610f659..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/__snapshots__/Spinner.spec.tsx.snap +++ /dev/null @@ -1,7 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Spinner component test should render correctly Spinner 1`] = ` -<Spinner - size={14} -/> -`; diff --git a/src/components/CommonKit/Spinner/__snapshots__/StyledBlackSpinner.spec.tsx.snap b/src/components/CommonKit/Spinner/__snapshots__/StyledBlackSpinner.spec.tsx.snap deleted file mode 100644 index f37195d63a69872c3d7531c7c25996d9707e66d1..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/__snapshots__/StyledBlackSpinner.spec.tsx.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`StyledBlackSpinner component test should render correclty StyledBlackSpinner 1`] = `<StyledBlackSpinner />`; diff --git a/src/components/CommonKit/Spinner/__snapshots__/StyledSpinner.spec.tsx.snap b/src/components/CommonKit/Spinner/__snapshots__/StyledSpinner.spec.tsx.snap deleted file mode 100644 index e0b7eb274e12bdd8fcd046ae9f283a24b4e5bdc9..0000000000000000000000000000000000000000 --- a/src/components/CommonKit/Spinner/__snapshots__/StyledSpinner.spec.tsx.snap +++ /dev/null @@ -1,31 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`StyledSpinner component test should render correctly Electricty StyledSpinner 1`] = ` -<StyledSpinner - fluidType={0} -/> -`; - -exports[`StyledSpinner component test should render correctly Gas StyledSpinner 1`] = ` -<StyledSpinner - fluidType={2} -/> -`; - -exports[`StyledSpinner component test should render correctly Water StyledSpinner 1`] = ` -<StyledSpinner - fluidType={1} -/> -`; - -exports[`StyledSpinner component test should render correctly base StyledSpinner (with option home) 1`] = ` -<StyledSpinner - fluidType={0} -/> -`; - -exports[`StyledSpinner component test should render correctly base StyledSpinner with unknown FluidType 1`] = ` -<StyledSpinner - fluidType={99} -/> -`; diff --git a/src/components/Connection/Connection.spec.tsx b/src/components/Connection/Connection.spec.tsx index bc417a77f2df40182fefa5590f26754f053cd15c..e3f3dca8bbc8091b8313f0d1d2b16a099094fc6b 100644 --- a/src/components/Connection/Connection.spec.tsx +++ b/src/components/Connection/Connection.spec.tsx @@ -3,6 +3,10 @@ import { mount } from 'enzyme' import toJson from 'enzyme-to-json' import Connection from 'components/Connection/Connection' import { fluidStatusConnectedData } from '../../../tests/__mocks__/fluidStatusData.mock' +import * as reactRedux from 'react-redux' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' jest.mock('components/Connection/ConnectionLogin', () => { return jest.fn(() => { @@ -25,23 +29,31 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) - -const mockDispatch = jest.fn() -jest.mock('react-redux', () => ({ - useDispatch: () => mockDispatch, -})) - +const mockStore = configureStore([]) +const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') +const useSelectorSpy = jest.spyOn(reactRedux, 'useSelector') describe('Connection component test', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) it('should call ConnectionOAuth', () => { const wrapper = mount( - <Connection fluidStatus={fluidStatusConnectedData[2]} /> + <Provider store={store}> + <Connection fluidStatus={fluidStatusConnectedData[2]} /> + </Provider> ) expect(toJson(wrapper)).toMatchSnapshot() }) it('should call ConnectionLogin', () => { + useDispatchSpy.mockReturnValue(jest.fn()) + useSelectorSpy.mockReturnValue(globalStateData) const wrapper = mount( - <Connection fluidStatus={fluidStatusConnectedData[0]} /> + <Provider store={store}> + <Connection fluidStatus={fluidStatusConnectedData[0]} /> + </Provider> ) expect(toJson(wrapper)).toMatchSnapshot() }) diff --git a/src/components/Connection/Connection.tsx b/src/components/Connection/Connection.tsx index 0fae75cc5cabba0a142d7017479c35934c00c65f..61ba7c10aa30a149bc02a0e9eb80cce352d8d966 100644 --- a/src/components/Connection/Connection.tsx +++ b/src/components/Connection/Connection.tsx @@ -6,6 +6,8 @@ import { FluidStatus, FluidConnection } from 'models' import ConnectionLogin from 'components/Connection/ConnectionLogin' import ConnectionOauth from 'components/Connection/ConnectionOAuth' import './connection.scss' +import { FluidType } from 'enum/fluid.enum' +import SgeInit from './SGEConnect/SgeInit' interface ConnectionProps { fluidStatus: FluidStatus } @@ -24,9 +26,13 @@ const Connection: React.FC<ConnectionProps> = ({ }, [dispatch, fluidStatus.fluidType, fluidStatus.connection]) return ( <div className="konnector-form"> - {!fluidStatus.connection.konnectorConfig.oauth ? ( - <ConnectionLogin fluidStatus={fluidStatus} onSuccess={handleSuccess} /> - ) : ( + {fluidStatus.fluidType === FluidType.ELECTRICITY && ( + <SgeInit fluidStatus={fluidStatus} /> + )} + {fluidStatus.fluidType === FluidType.WATER && ( + <ConnectionLogin fluidStatus={fluidStatus} /> + )} + {fluidStatus.fluidType === FluidType.GAS && ( <ConnectionOauth fluidStatus={fluidStatus} onSuccess={handleSuccess} /> )} </div> diff --git a/src/components/Connection/ConnectionLogin.tsx b/src/components/Connection/ConnectionLogin.tsx index ae572a9ebc7ab629c580e9fd61e014ec51b825ed..0a410cd12584dfba44c1e106607fb5373ec3eea6 100644 --- a/src/components/Connection/ConnectionLogin.tsx +++ b/src/components/Connection/ConnectionLogin.tsx @@ -8,12 +8,10 @@ import ConnectionLoginNoPartnerAccount from './ConnectionLoginNoPartnerAccount' interface ConnectionLoginProps { fluidStatus: FluidStatus - onSuccess: () => Promise<void> } const ConnectionLogin: React.FC<ConnectionLoginProps> = ({ fluidStatus, - onSuccess, }: ConnectionLoginProps) => { const konnectorSlug: string = fluidStatus.connection.konnectorConfig.slug const siteLink: string = fluidStatus.connection.konnectorConfig.siteLink @@ -39,14 +37,12 @@ const ConnectionLogin: React.FC<ConnectionLoginProps> = ({ <ConnectionLoginWithPartnerAccount konnectorSlug={konnectorSlug} fluidStatus={fluidStatus} - handleSuccess={onSuccess} togglePartnerConnectionModal={togglePartnerConnectionModal} /> ) : ( <ConnectionLoginNoPartnerAccount konnectorSlug={konnectorSlug} fluidStatus={fluidStatus} - handleSuccess={onSuccess} togglePartnerConnectionModal={togglePartnerConnectionModal} /> )} diff --git a/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx b/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx index 29b8738dad26d30e62e1844bd23e17f04cd9aca4..da6a343c089daee9610f38e2e472468bae108e44 100644 --- a/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx +++ b/src/components/Connection/ConnectionLoginNoPartnerAccount.tsx @@ -8,14 +8,12 @@ import FormLogin from 'components/Connection/FormLogin' interface ConnectionLoginNoPartnerAccountProps { konnectorSlug: string fluidStatus: FluidStatus - handleSuccess: () => Promise<void> togglePartnerConnectionModal: () => void } const ConnectionLoginNoPartnerAccount = ({ konnectorSlug, fluidStatus, - handleSuccess, togglePartnerConnectionModal, }: ConnectionLoginNoPartnerAccountProps) => { const { t } = useI18n() @@ -49,11 +47,7 @@ const ConnectionLoginNoPartnerAccount = ({ {t('auth.' + `${konnectorSlug}` + '.no_account.subtitle2_info')} </div> <div className="kloginform-connect-button"> - <FormLogin - fluidStatus={fluidStatus} - highlightedStyle={false} - handleSuccess={handleSuccess} - /> + <FormLogin fluidStatus={fluidStatus} highlightedStyle={false} /> </div> </div> ) diff --git a/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx b/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx index 242e84c8bd860af204b80862b68b261d8d3a4652..9da0f6abcbb38b8cd22395a34cd086f57894268c 100644 --- a/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx +++ b/src/components/Connection/ConnectionLoginWithPartnerAccount.tsx @@ -8,14 +8,12 @@ import FormLogin from 'components/Connection/FormLogin' interface ConnectionLoginWithPartnerAccountProps { konnectorSlug: string fluidStatus: FluidStatus - handleSuccess: () => Promise<void> togglePartnerConnectionModal: () => void } const ConnectionLoginWithPartnerAccount = ({ konnectorSlug, fluidStatus, - handleSuccess, togglePartnerConnectionModal, }: ConnectionLoginWithPartnerAccountProps) => { const { t } = useI18n() @@ -37,11 +35,7 @@ const ConnectionLoginWithPartnerAccount = ({ {t('auth.' + konnectorSlug + '.with_account.subtitle1')} </div> <div className="kloginform-connect-button"> - <FormLogin - fluidStatus={fluidStatus} - highlightedStyle={true} - handleSuccess={handleSuccess} - /> + <FormLogin fluidStatus={fluidStatus} highlightedStyle={true} /> </div> {konnectorSlug === 'grdfgrandlyon' && ( <div className="kloginform-infotext text-16-normal"> diff --git a/src/components/Connection/ConnectionNotFound.spec.tsx b/src/components/Connection/ConnectionNotFound.spec.tsx index 73dd07fae8dd3b763075bbe778c6effa1279a557..a2b02027cfe45ae4a19a47dc8ebc6d2dca8ab8c1 100644 --- a/src/components/Connection/ConnectionNotFound.spec.tsx +++ b/src/components/Connection/ConnectionNotFound.spec.tsx @@ -14,7 +14,7 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }) describe('ConnectionNotFound component test', () => { - const konnectorSlug = 'enedisgrandlyon' + const konnectorSlug = 'enedissgegrandlyon' it('should correctly render connection not found', () => { const result = shallow( @@ -31,7 +31,7 @@ describe('ConnectionNotFound component test', () => { submitStyledButton.simulate('click') expect(global.open).toHaveBeenCalledWith( - 'http://localhost/#/discover/enedisgrandlyon', + 'http://localhost/#/discover/enedissgegrandlyon', '_blank' ) }) diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx index b8e082d1f44dc075835ca53d5d45efde72562869..c3560ac13c6d4128400fe0df8daa087362691340 100644 --- a/src/components/Connection/ConnectionResult.tsx +++ b/src/components/Connection/ConnectionResult.tsx @@ -1,28 +1,31 @@ -import React, { useState, useEffect, useCallback } from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Button from '@material-ui/core/Button' +import warningWhite from 'assets/icons/ico/warning-white.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import Loader from 'components/Loader/Loader' import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { FluidState, FluidType } from 'enum/fluid.enum' +import { DateTime } from 'luxon' +import { + Account, + AccountSgeData, + FluidConnection, + FluidStatus, + Trigger, +} from 'models' +import React, { useCallback, useEffect, useState } from 'react' import { useDispatch } from 'react-redux' +import AccountService from 'services/account.service' +import DateChartService from 'services/dateChart.service' +import TriggerService from 'services/triggers.service' import { setShouldRefreshConsent, updatedFluidConnection, + updateSgeStore, } from 'store/global/global.actions' - -import { Account, FluidConnection, FluidStatus, Trigger } from 'models' -import AccountService from 'services/account.service' import { getKonnectorUpdateError } from 'utils/utils' - -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import warningWhite from 'assets/icons/ico/warning-white.svg' -import Button from '@material-ui/core/Button' -import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner' - import './connectionResult.scss' -import DateChartService from 'services/dateChart.service' -import { FluidState, FluidType } from 'enum/fluid.enum' -import { DateTime } from 'luxon' import DeleteGRDFAccountModal from './DeleteGRDFAccountModal' -import TriggerService from 'services/triggers.service' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' interface ConnectionResultProps { fluidStatus: FluidStatus @@ -111,10 +114,33 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ } }, [lastExecutionDate]) - const handleRefreshConsent = useCallback(() => { - deleteAccountsAndTriggers() - dispatch(setShouldRefreshConsent(true)) - }, [deleteAccountsAndTriggers, dispatch]) + const handleRefreshConsent = useCallback( + (fluidType: FluidType) => { + if (fluidType == FluidType.ELECTRICITY) { + const accountData = fluidStatus.connection.account + ?.auth as AccountSgeData + //store the previous account data since the onDelete will remove account from DB + dispatch( + updateSgeStore({ + currentStep: 0, + firstName: accountData.firstname, + lastName: accountData.lastname, + pdl: parseInt(accountData.pointId), + address: accountData.address, + zipCode: parseInt(accountData.postalCode), + city: accountData.city, + dataConsent: true, + pdlConfirm: true, + shouldLaunchAccount: true, + }) + ) + dispatch(setShouldRefreshConsent(true)) + } else { + deleteAccountsAndTriggers() + } + }, + [deleteAccountsAndTriggers, dispatch, fluidStatus.connection.account?.auth] + ) useEffect(() => { if (fluidStatus.connection.triggerState?.last_success) { @@ -264,17 +290,14 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ label: 'text-16-normal', }} > - {deleting ? ( - <StyledSpinner size="1rem" fluidType={fluidType} /> - ) : ( - t('konnector_form.button_delete') - )} + {deleting && <Loader fluidType={fluidType} />} + {!deleting && t('konnector_form.button_delete')} </Button> <Button aria-label={t('konnector_form.accessibility.button_update')} onClick={ konnectorError === 'error_update_oauth' - ? handleRefreshConsent + ? () => handleRefreshConsent(fluidType) : updateKonnector } disabled={updating || deleting} @@ -283,9 +306,8 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ label: 'text-16-bold', }} > - {updating ? ( - <StyledBlackSpinner size="1rem" /> - ) : ( + {updating && <Loader color="black" />} + {!updating && ( <div> {konnectorError === 'error_update_oauth' ? t('konnector_form.button_oauth_reload') diff --git a/src/components/Connection/ExpiredConsentModal.spec.tsx b/src/components/Connection/ExpiredConsentModal.spec.tsx index b52ebe5644ccd1d9d1152c00cb57763d9339c2e8..4dd3fb84520227f1de56debcc40c86b70e6e706b 100644 --- a/src/components/Connection/ExpiredConsentModal.spec.tsx +++ b/src/components/Connection/ExpiredConsentModal.spec.tsx @@ -8,6 +8,7 @@ import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import { Button } from '@material-ui/core' import * as reactRedux from 'react-redux' +import { fluidStatusConnectedData } from '../../../tests/__mocks__/fluidStatusData.mock' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -25,6 +26,8 @@ jest.mock('react-router-dom', () => ({ push: mockHistoryPush, }), })) +const mockToggleModal = jest.fn() +const mockHandleCloseClick = jest.fn() const mockStore = configureStore([]) describe('ExpiredConsentModal component', () => { @@ -33,6 +36,9 @@ describe('ExpiredConsentModal component', () => { global: globalStateData, }, }) + beforeEach(() => { + mockHistoryPush.mockReset() + }) it('should be rendered correctly', () => { const component = mount( <Provider store={store}> @@ -40,12 +46,13 @@ describe('ExpiredConsentModal component', () => { open={true} handleCloseClick={jest.fn()} fluidType={FluidType.ELECTRICITY} + toggleModal={mockToggleModal} /> </Provider> ) expect(toJson(component)).toMatchSnapshot() }) - it('should launch the update consent process', () => { + it('should launch the update consent process for GRDF', () => { const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') useDispatchSpy.mockReturnValue(jest.fn()) @@ -55,6 +62,7 @@ describe('ExpiredConsentModal component', () => { open={true} handleCloseClick={jest.fn()} fluidType={FluidType.GAS} + toggleModal={mockToggleModal} /> </Provider> ) @@ -62,4 +70,37 @@ describe('ExpiredConsentModal component', () => { expect(useDispatchSpy).toHaveBeenCalledTimes(1) expect(mockHistoryPush).toHaveBeenCalledTimes(1) }) + it('should launch the update consent process for Enedis', () => { + const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') + useDispatchSpy.mockReturnValue(jest.fn()) + const useSelectorSpy = jest.spyOn(reactRedux, 'useSelector') + useSelectorSpy.mockReturnValue({ fluidStatus: fluidStatusConnectedData }) + const component = mount( + <Provider store={store}> + <ExpiredConsentModal + open={true} + handleCloseClick={jest.fn()} + fluidType={FluidType.ELECTRICITY} + toggleModal={mockToggleModal} + /> + </Provider> + ) + component.find(Button).at(1).simulate('click') + expect(useDispatchSpy).toHaveBeenCalledTimes(2) + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + }) + it('should click on close modal', () => { + const component = mount( + <Provider store={store}> + <ExpiredConsentModal + open={true} + handleCloseClick={mockHandleCloseClick} + fluidType={FluidType.ELECTRICITY} + toggleModal={mockToggleModal} + /> + </Provider> + ) + component.find(Button).at(0).simulate('click') + expect(mockHandleCloseClick).toHaveBeenCalled() + }) }) diff --git a/src/components/Connection/ExpiredConsentModal.tsx b/src/components/Connection/ExpiredConsentModal.tsx index 117fd283935295a3af8f30a516bf56d48d20d5b2..96dd6a33b42071b6580e9beac44d28000be5cef4 100644 --- a/src/components/Connection/ExpiredConsentModal.tsx +++ b/src/components/Connection/ExpiredConsentModal.tsx @@ -9,33 +9,61 @@ import { Button, IconButton } from '@material-ui/core' import { FluidType } from 'enum/fluid.enum' import './expiredConsentModal.scss' import { useHistory } from 'react-router-dom' -import { useDispatch } from 'react-redux' -import { setShouldRefreshConsent } from 'store/global/global.actions' +import { useDispatch, useSelector } from 'react-redux' +import { + setShouldRefreshConsent, + updateSgeStore, +} from 'store/global/global.actions' +import { AppStore } from 'store' +import { AccountSgeData } from 'models' interface ExpiredConsentModalProps { open: boolean handleCloseClick: () => void fluidType: FluidType + toggleModal: () => void } const ExpiredConsentModal: React.FC<ExpiredConsentModalProps> = ({ open, handleCloseClick, fluidType, + toggleModal, }: ExpiredConsentModalProps) => { const { t } = useI18n() const history = useHistory() const dispatch = useDispatch() + const { fluidStatus } = useSelector((state: AppStore) => state.ecolyo.global) const launchUpdateConsent = useCallback(() => { - dispatch(setShouldRefreshConsent(true)) + if (fluidType === FluidType.ELECTRICITY) { + const accountData = fluidStatus[FluidType.ELECTRICITY].connection.account + ?.auth as AccountSgeData + //store the previous account data since the onDelete will remove account from DB + dispatch( + updateSgeStore({ + currentStep: 0, + firstName: accountData.firstname, + lastName: accountData.lastname, + pdl: parseInt(accountData.pointId), + address: accountData.address, + zipCode: parseInt(accountData.postalCode), + city: accountData.city, + dataConsent: true, + pdlConfirm: true, + shouldLaunchAccount: true, + }) + ) + dispatch(setShouldRefreshConsent(true)) + } + toggleModal() history.push(`/consumption/${FluidType[fluidType].toLocaleLowerCase()}`) - }, [dispatch, fluidType, history]) + }, [dispatch, fluidStatus, fluidType, history, toggleModal]) return ( <Dialog open={open} - onClose={handleCloseClick} + onClose={toggleModal} aria-labelledby={'accessibility-title'} classes={{ root: 'modal-root', @@ -48,7 +76,7 @@ const ExpiredConsentModal: React.FC<ExpiredConsentModalProps> = ({ <IconButton aria-label={t('consumption_visualizer.modal.close')} className="modal-paper-close-button" - onClick={handleCloseClick} + onClick={toggleModal} > <Icon icon={CloseIcon} size={16} /> </IconButton> @@ -61,9 +89,7 @@ const ExpiredConsentModal: React.FC<ExpiredConsentModalProps> = ({ </div> <div - className={`text-20-normal title ${FluidType[ - fluidType - ].toLowerCase()}`} + className={`text-20-bold title ${FluidType[fluidType].toLowerCase()}`} > {t(`consent_outdated.title.${fluidType}`)} </div> @@ -82,7 +108,9 @@ const ExpiredConsentModal: React.FC<ExpiredConsentModalProps> = ({ label: 'text-16-normal', }} > - {t('consent_outdated.later')} + {fluidType === FluidType.ELECTRICITY + ? t('consent_outdated.no') + : t('consent_outdated.later')} </Button> <Button aria-label={t('consent_outdated.go')} @@ -92,7 +120,9 @@ const ExpiredConsentModal: React.FC<ExpiredConsentModalProps> = ({ label: 'text-16-bold', }} > - {t('consent_outdated.go')} + {fluidType === FluidType.ELECTRICITY + ? t('consent_outdated.yes') + : t('consent_outdated.go')} </Button> </div> </div> diff --git a/src/components/Connection/FormLogin.tsx b/src/components/Connection/FormLogin.tsx index 3d2f9674e67d63f5bf8c4621194ecc0113d8b9fb..ba3f0171d3cbfd32cbe26bec820df83988378695 100644 --- a/src/components/Connection/FormLogin.tsx +++ b/src/components/Connection/FormLogin.tsx @@ -1,13 +1,6 @@ import React, { useState, useEffect } from 'react' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useClient } from 'cozy-client' -import { useDispatch } from 'react-redux' - -import { Account, FluidStatus, FluidConnection, UsageEvent } from 'models' -import AccountService from 'services/account.service' -import ConnectionService from 'services/connection.service' -import UsageEventService from 'services/usageEvent.service' - +import { Account, AccountAuthData, FluidStatus } from 'models' import './formLogin.scss' import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton' import Button from '@material-ui/core/Button' @@ -15,24 +8,19 @@ import TrailingIcon from 'assets/icons/ico/trailing-icon.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { FluidType } from 'enum/fluid.enum' import { getPartnerPicto } from 'utils/picto' -import { UsageEventType } from 'enum/usageEvent.enum' -import { updatedFluidConnection } from 'store/global/global.actions' +import useKonnectorAuth from 'components/Hooks/useKonnectorAuth' +import * as Sentry from '@sentry/react' interface FormLoginProps { fluidStatus: FluidStatus highlightedStyle?: boolean - handleSuccess: () => Promise<void> } const FormLogin: React.FC<FormLoginProps> = ({ fluidStatus, highlightedStyle = true, - handleSuccess, }: FormLoginProps) => { const { t } = useI18n() - const client = useClient() - const dispatch = useDispatch() - const konnectorSlug: string = fluidStatus.connection.konnectorConfig.slug const lastKnownCredentials: string | undefined = fluidStatus.connection.konnectorConfig.lastKnownCredentials @@ -45,6 +33,11 @@ const FormLogin: React.FC<FormLoginProps> = ({ const [loading, setLoading] = useState<boolean>(false) const icon = getPartnerPicto(konnectorSlug, highlightedStyle) + const [connect, update, connectError] = useKonnectorAuth( + fluidStatus, + login, + password + ) const changeLogin = (value: string) => { if ((/[0-9]/.test(value) && value.length <= 7) || value === '') { @@ -69,66 +62,6 @@ const FormLogin: React.FC<FormLoginProps> = ({ } } - const sendUsageEventError = async ( - konnectorSlug: string - ): Promise<UsageEvent> => { - return UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: konnectorSlug, - result: 'error', - }) - } - - const connect = async () => { - const connectionService = new ConnectionService(client) - try { - // If first connexion, send the usage event - await UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - target: konnectorSlug, - result: 'error', - }) - const { account: _account, trigger: _trigger } = - await connectionService.connectNewUser(konnectorSlug, login, password) - if (!_trigger) { - setError(t('konnector_form.error_account_creation')) - sendUsageEventError(konnectorSlug) - return null - } - const updatedConnection: FluidConnection = { - ...fluidStatus.connection, - account: _account, - trigger: _trigger, - } - setLoading(false) - dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) - handleSuccess() - } catch (err) { - setLoading(false) - sendUsageEventError(konnectorSlug) - console.log(err) - } - } - - const update = async () => { - if (fluidStatus.connection.account) { - const _account = fluidStatus.connection.account - const auth = { - login: login, - password: password, - } - _account.auth = auth - const accountService = new AccountService(client) - const updatedAccount = await accountService.updateAccount(_account) - const updatedConnection: FluidConnection = { - ...fluidStatus.connection, - account: updatedAccount, - } - dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) - handleSuccess() - } - } - const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { e.preventDefault() try { @@ -141,18 +74,24 @@ const FormLogin: React.FC<FormLoginProps> = ({ } if (!account) { await connect() + setLoading(false) } else { await update() } - } catch (err) { + } catch (error) { + Sentry.captureException(JSON.stringify({ error })) setLoading(false) } } + useEffect(() => { + if (connectError) setError(connectError) + }, [connectError]) + useEffect(() => { if (account?.auth) { const auth = account.auth - const authData = auth + const authData = auth as AccountAuthData if (authData.login) { setLogin(authData.login) } @@ -208,7 +147,7 @@ const FormLogin: React.FC<FormLoginProps> = ({ icon={TrailingIcon} aria-label={t('auth.accessibility.button_reveal_password')} className="form-trailing-icon" - size={22} + sized={22} onClick={() => revealPassword('idFieldPassword' + fluidName)} /> </span> diff --git a/src/components/Connection/FormOAuth.tsx b/src/components/Connection/FormOAuth.tsx index 3bb9b0b428df2039eb9557be6c47424951165fa3..eb30fdc6099d2abe8d632663cb5861be506d816c 100644 --- a/src/components/Connection/FormOAuth.tsx +++ b/src/components/Connection/FormOAuth.tsx @@ -1,18 +1,18 @@ -import React, { useCallback, useEffect, useState } from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useClient } from 'cozy-client' -import './auth.scss' -import { FluidStatus, Konnector } from 'models' -import { OAuthWindow } from 'cozy-harvest-lib/dist/components/OAuthWindow' import Button from '@material-ui/core/Button' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner' -import { getPartnerPicto } from 'utils/picto' +import Loader from 'components/Loader/Loader' +import { useClient } from 'cozy-client' +import { OAuthWindow } from 'cozy-harvest-lib/dist/components/OAuthWindow' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { UsageEventType } from 'enum/usageEvent.enum' +import { FluidStatus, Konnector } from 'models' +import React, { useCallback, useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' +import UsageEventService from 'services/usageEvent.service' import { AppStore } from 'store' import { setShouldRefreshConsent } from 'store/global/global.actions' -import { UsageEventType } from 'enum/usageEvent.enum' -import UsageEventService from 'services/usageEvent.service' +import { getPartnerPicto } from 'utils/picto' +import './auth.scss' interface FormOAuthProps { konnector: Konnector | null @@ -100,7 +100,7 @@ const FormOAuth: React.FC<FormOAuthProps> = ({ <div className="authform-button-content"> <div className="authform-button-content-icon"> {isWaiting ? ( - <StyledBlackSpinner size={48} /> + <Loader color="black" /> ) : ( <StyledIcon icon={icon} size={80} /> )} diff --git a/src/components/Connection/SGEConnect/SgeConnect.scss b/src/components/Connection/SGEConnect/SgeConnect.scss new file mode 100644 index 0000000000000000000000000000000000000000..76ae66c9c6e904d690f278eabafe360df1836964 --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeConnect.scss @@ -0,0 +1,116 @@ +@import 'src/styles/base/color'; +@import 'src/styles/base/mixins'; +@import 'src/styles/base/breakpoint'; + +.sge-view { + box-sizing: border-box; + min-height: inherit; + width: inherit; + display: flex; + flex: 1; + flex-direction: column; + justify-content: space-between; + .sge-container { + padding: 1rem; + + .sge-step-container { + color: $grey-bright; + .title, + .head { + margin-top: 1rem; + } + label { + display: block; + margin-top: 1rem; + margin-bottom: 0.625rem; + cursor: pointer; + span span { + color: $gold-shadow; + } + } + #zipCode { + max-width: 115px; + } + @include checkBox(); + input:not([type='checkbox']) { + appearance: none; + max-width: 280px; + width: 100%; + height: 45px; + border-radius: 4px; + border: 1px solid $grey-dark; + background: rgba(0, 0, 0, 0.3); + transition: all 300ms ease; + color: $grey-bright; + padding: 0 0.5rem; + &:focus, + &:focus-visible { + outline: 1px solid $gold-shadow; + } + } + /* Chrome, Safari, Edge, Opera */ + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + /* Firefox */ + input[type='number'] { + -moz-appearance: textfield; + } + .pdl-hint { + cursor: pointer; + border-bottom: solid 1px $grey-bright; + text-align: center; + margin: 1rem auto auto; + padding: 0.2rem; + width: 175px; + @media (min-width: $width-tablet) { + margin-left: 0; + } + } + ul { + padding: 0 1rem 1rem; + line-height: 130%; + border-bottom: 1px solid $grey-dark; + li { + margin: 0.5rem 0; + } + } + } + } +} +.sgeHintModal { + text-align: center; + .title { + color: $gold-shadow; + margin: 1rem 0; + } + .pdl { + padding: 1rem; + display: flex; + flex-direction: column; + gap: 1rem; + background: #eff2f4; + text-align: left; + + p { + color: #526576; + margin: 0; + } + + .bill { + display: flex; + gap: 0.5rem; + } + + svg.prm { + width: 100%; + height: 180px; + } + svg.bill { + width: 150px; + height: 80px; + } + } +} diff --git a/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5f768c23a1bbb35bbee5ea95f74701d92777469a --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx @@ -0,0 +1,152 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import SgeConnectView from './SgeConnectView' +import * as reactRedux from 'react-redux' +import { SgeStep } from 'enum/sgeStep.enum' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +jest.mock('components/Content/Content', () => 'mock-content') +jest.mock('components/FormGlobal/FormProgress', () => 'mock-formprogress') + +const mockStore = configureStore([]) +const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') + +describe('SgeConnectView component', () => { + beforeEach(() => { + useDispatchSpy.mockReset() + }) + it('should be rendered correctly', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should render address Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: SgeStep.Address, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepAddress')).toBeTruthy() + }) + it('should render identity Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: SgeStep.IdentityAndPDL, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepIdentity')).toBeTruthy() + }) + it('should render consent Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: SgeStep.Consent, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepConsent')).toBeTruthy() + }) + it('should render default Step', () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { + ...globalStateData.sgeConnect, + currentStep: 99, + }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + expect(wrapper.find('.stepIdentity')).toBeTruthy() + }) + describe('SgeConnectView Navigation methods', () => { + beforeEach(() => { + useDispatchSpy.mockReset() + }) + it('should call nextStep method', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + wrapper.find('.profile-navigation-button').last().simulate('click') + expect(useDispatchSpy).toHaveBeenCalled() + }) + it('shouldnt call disabled nextStep method', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeConnectView /> + </Provider> + ) + wrapper.find('.profile-navigation-button').last().simulate('click') + expect(useDispatchSpy).toHaveBeenCalled() + }) + }) +}) diff --git a/src/components/Connection/SGEConnect/SgeConnectView.tsx b/src/components/Connection/SGEConnect/SgeConnectView.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0850fd8433fbfb87f2a491e02a44446cfbb480cf --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeConnectView.tsx @@ -0,0 +1,147 @@ +import React, { useCallback, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { AppStore } from 'store' +import CozyBar from 'components/Header/CozyBar' +import Content from 'components/Content/Content' +import Header from 'components/Header/Header' +import { SgeStep } from 'enum/sgeStep.enum' +import StepIdentityAndPdl from './StepIdentityAndPdl' +import StepAddress from './StepAddress' +import StepConsent from './StepConsent' +import './SgeConnect.scss' +import FormNavigation from 'components/FormGlobal/FormNavigation' +import { SgeStore } from 'models/sgeStore.model' +import { updateSgeStore } from 'store/global/global.actions' +import FormProgress from 'components/FormGlobal/FormProgress' + +const SgeConnectView: React.FC = () => { + const [headerHeight, setHeaderHeight] = useState<number>(0) + const { sgeConnect } = useSelector((state: AppStore) => state.ecolyo.global) + const dispatch = useDispatch() + const [currentStep, setcurrentStep] = useState<SgeStep>( + sgeConnect.currentStep + ) + const [currentSgeState, setcurrentSgeState] = useState<SgeStore>(sgeConnect) + const defineHeaderHeight = useCallback((height: number) => { + setHeaderHeight(height) + }, []) + + const isNextValid = useCallback(() => { + switch (currentStep) { + case SgeStep.IdentityAndPDL: + return ( + currentSgeState.firstName !== '' && + currentSgeState.lastName !== '' && + currentSgeState.pdl !== null && + currentSgeState.pdl.toString().length === 14 + ) + case SgeStep.Address: + return ( + currentSgeState.address !== '' && + currentSgeState.city !== '' && + currentSgeState.zipCode !== null && + currentSgeState.zipCode.toString().length === 5 + ) + case SgeStep.Consent: + return currentSgeState.dataConsent && currentSgeState.pdlConfirm + default: + return false + } + }, [ + currentSgeState.address, + currentSgeState.city, + currentSgeState.dataConsent, + currentSgeState.firstName, + currentSgeState.lastName, + currentSgeState.pdl, + currentSgeState.pdlConfirm, + currentSgeState.zipCode, + currentStep, + ]) + + const handleNext = useCallback(() => { + if (currentStep < SgeStep.Consent && isNextValid()) { + setcurrentStep(prev => prev + 1) + dispatch(updateSgeStore(currentSgeState)) + } + if (currentStep === SgeStep.Consent && isNextValid()) { + const updatedState = { + ...currentSgeState, + shouldLaunchAccount: true, + // switch to false in case the form fails and the user have to give its consent again + dataConsent: false, + pdlConfirm: false, + } + setcurrentSgeState(updatedState) + dispatch(updateSgeStore(updatedState)) + } + }, [currentSgeState, currentStep, dispatch, isNextValid]) + + const handlePrev = useCallback(() => { + if (currentStep !== SgeStep.IdentityAndPDL) { + setcurrentStep(prev => prev - 1) + } + dispatch(updateSgeStore(currentSgeState)) + }, [currentSgeState, currentStep, dispatch]) + + const onChange = useCallback( + (objkey: string, value: string | boolean | number, maxLength?: number) => { + if ( + !maxLength || // optionnal ? + value === '' || + (/[0-9]/.test(value.toString()) && value.toString().length <= maxLength) + ) { + const updatedState = { + ...currentSgeState, + [objkey]: value, + } + setcurrentSgeState(updatedState) + } + }, + [currentSgeState] + ) + + const renderStep = (step: SgeStep) => { + switch (step) { + case SgeStep.Address: + return <StepAddress sgeState={currentSgeState} onChange={onChange} /> + case SgeStep.Consent: + return <StepConsent sgeState={currentSgeState} onChange={onChange} /> + case SgeStep.IdentityAndPDL: + default: + return ( + <StepIdentityAndPdl sgeState={currentSgeState} onChange={onChange} /> + ) + } + } + + return ( + <> + <CozyBar titleKey={'common.title_sge_connect'} displayBackArrow={true} /> + <Header + setHeaderHeight={defineHeaderHeight} + desktopTitleKey={'common.title_sge_connect'} + displayBackArrow={true} + ></Header> + <Content height={headerHeight}> + <div className="sge-view"> + <div className="sge-container"> + <FormProgress step={currentStep} formType={'sge'} /> + {renderStep(currentStep)} + </div> + <FormNavigation + step={currentStep} + handlePrevious={handlePrev} + handleNext={handleNext} + disableNextButton={!isNextValid()} + disablePrevButton={currentStep === SgeStep.IdentityAndPDL} + isLastConnectStep={currentStep === SgeStep.Consent} + isEcogesture={false} + /> + </div> + </Content> + </> + ) +} + +export default SgeConnectView diff --git a/src/components/Connection/SGEConnect/SgeInit.spec.tsx b/src/components/Connection/SGEConnect/SgeInit.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1b093367e95dd2fbfb4c4bc9534f9b85330b76dd --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeInit.spec.tsx @@ -0,0 +1,103 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import SgeInit from './SgeInit' +import { + fluidStatusData, + SgeStatusWithAccout, +} from '../../../../tests/__mocks__/fluidStatusData.mock' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import { Button } from '@material-ui/core' +import { waitForComponentToPaint } from '../../../../tests/__mocks__/testUtils' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockHistoryPush = jest.fn() +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})) + +const mockConnect = jest.fn() +const mockUpdate = jest.fn() + +jest.mock('components/Hooks/useKonnectorAuth', () => + jest.fn(() => [mockConnect, mockUpdate]) +) +const mockStore = configureStore([]) + +describe('SgeInit component', () => { + it('should be rendered correctly', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={fluidStatusData[0]} /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should go to sge connect steps', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={fluidStatusData[0]} /> + </Provider> + ) + wrapper.find(Button).first().simulate('click') + expect(mockHistoryPush).toHaveBeenCalled() + }) + it('should launch account and trigger creation process', async () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { shouldLaunchAccount: true }, + }, + }, + }) + + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={fluidStatusData[0]} /> + </Provider> + ) + await waitForComponentToPaint(wrapper) + expect(mockConnect).toHaveBeenCalled() + }) + it('should launch existing account update process', async () => { + const store = mockStore({ + ecolyo: { + global: { + ...globalStateData, + sgeConnect: { shouldLaunchAccount: true }, + }, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeInit fluidStatus={SgeStatusWithAccout} /> + </Provider> + ) + await waitForComponentToPaint(wrapper) + expect(mockUpdate).toHaveBeenCalled() + }) +}) diff --git a/src/components/Connection/SGEConnect/SgeInit.tsx b/src/components/Connection/SGEConnect/SgeInit.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b2a55732edc70b0db64b6de7a96fa7502d4312b7 --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeInit.tsx @@ -0,0 +1,73 @@ +import React, { useEffect } from 'react' +import { Account, FluidStatus } from 'models' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { Button } from '@material-ui/core' +import { decoreText } from 'utils/decoreText' +import ElectricityBillIcon from 'assets/icons/visu/partnerSteps/electricity_bill.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useHistory } from 'react-router-dom' +import { useDispatch, useSelector } from 'react-redux' +import { AppStore } from 'store' +import useKonnectorAuth from 'components/Hooks/useKonnectorAuth' +import { + setShouldRefreshConsent, + updateSgeStore, +} from 'store/global/global.actions' +interface SgeInitProps { + fluidStatus: FluidStatus +} + +const SgeInit: React.FC<SgeInitProps> = ({ fluidStatus }: SgeInitProps) => { + const { t } = useI18n() + const history = useHistory() + const konnectorSlug: string = fluidStatus.connection.konnectorConfig.slug + const account: Account | null = fluidStatus.connection.account + const { sgeConnect } = useSelector((state: AppStore) => state.ecolyo.global) + + const dispatch = useDispatch() + const [connect, update] = useKonnectorAuth(fluidStatus) + + useEffect(() => { + async function launchConnect() { + if (sgeConnect.shouldLaunchAccount) { + dispatch(updateSgeStore({ ...sgeConnect, shouldLaunchAccount: false })) + dispatch(setShouldRefreshConsent(false)) + if (!account) { + await connect() + } else { + await update() + } + } + } + launchConnect() + }, [account, connect, dispatch, sgeConnect, update]) + + return ( + <div className="kloginform sge-connect"> + <p className={`kloginform-title ${konnectorSlug} text-20-bold`}> + {t(`auth.${konnectorSlug}.title`)} + </p> + <StyledIcon icon={ElectricityBillIcon} size={180} /> + <p className={`sge-subtitle ${konnectorSlug} text-16-regular`}> + {decoreText(t('auth.' + `${konnectorSlug}` + '.bill'))} + </p> + + <div className="kloginform-button"> + <Button + aria-label={t(`auth.${konnectorSlug}.accessibility.connect`)} + onClick={() => { + history.push('/sge-connect') + }} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + {t(`auth.${konnectorSlug}.connect`)} + </Button> + </div> + </div> + ) +} + +export default SgeInit diff --git a/src/components/Connection/SGEConnect/SgeModalHint.spec.tsx b/src/components/Connection/SGEConnect/SgeModalHint.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c5513c1ef3fa9516d79d96f6f6338f8c0674d2c6 --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeModalHint.spec.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import SgeModalHint from './SgeModalHint' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('SgeModalHint component', () => { + it('should be rendered correctly', () => { + const mockClose = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <SgeModalHint open={true} handleCloseClick={mockClose} /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) +}) diff --git a/src/components/Connection/SGEConnect/SgeModalHint.tsx b/src/components/Connection/SGEConnect/SgeModalHint.tsx new file mode 100644 index 0000000000000000000000000000000000000000..43827c813e6faa9944ff53e94a7d078c5d266649 --- /dev/null +++ b/src/components/Connection/SGEConnect/SgeModalHint.tsx @@ -0,0 +1,75 @@ +import { IconButton } from '@material-ui/core' +import Button from '@material-ui/core/Button' +import Dialog from '@material-ui/core/Dialog' +import Bill from 'assets/icons/ico/bill.svg' +import CloseIcon from 'assets/icons/ico/close.svg' +import Prm from 'assets/icons/ico/prm.svg' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import React from 'react' + +interface SgeModalHintProps { + open: boolean + handleCloseClick: () => void +} + +const SgeModalHint: React.FC<SgeModalHintProps> = ({ + open, + handleCloseClick, +}: SgeModalHintProps) => { + const { t } = useI18n() + + return ( + <Dialog + open={open} + disableEscapeKeyDown + onClose={handleCloseClick} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + > + <div id={'accessibility-title'}> + {t('challenge_no_fluid_modal.accessibility.window_title')} + </div> + <IconButton + aria-label={t('feedback.accessibility.button_close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={16} /> + </IconButton> + <div className="sgeHintModal"> + <div className="title text-20-bold"> + {t('auth.enedissgegrandlyon.modalHint.title')} + </div> + <div className="pdl"> + <p>{t('auth.enedissgegrandlyon.pdlModal.txt1')}</p> + <p>{t('auth.enedissgegrandlyon.pdlModal.txt2')}</p> + <div className="bill"> + <Icon icon={Bill} alt="Facture" className="bill" /> + <p>{t('auth.enedissgegrandlyon.pdlModal.txt3')}</p> + </div> + <p>{t('auth.enedissgegrandlyon.pdlModal.txt4')}</p> + <Icon icon={Prm} alt="PDL" className="prm" /> + </div> + <Button + aria-label={t( + 'auth.enedissgegrandlyon.modalHint.button-accessibility' + )} + onClick={handleCloseClick} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + {t('auth.enedissgegrandlyon.modalHint.button')} + </Button> + </div> + </Dialog> + ) +} + +export default SgeModalHint diff --git a/src/components/Connection/SGEConnect/StepAddress.spec.tsx b/src/components/Connection/SGEConnect/StepAddress.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..dd8b7fbdfc20ed56cddb82dfe43a08f3a4cb2e98 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepAddress.spec.tsx @@ -0,0 +1,109 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import StepAddress from './StepAddress' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('StepAddress component', () => { + it('should be rendered correctly', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should change address value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#address').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('address', '') + }) + it('should change zipCode value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#zipCode').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('zipCode', '', 5) + }) + it('should have an existing zipCode value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={{ ...globalStateData.sgeConnect, zipCode: 69200 }} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(wrapper.find('#zipCode').first().props().value).toBe(69200) + }) + it('should change city value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepAddress + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#city').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('city', '') + }) +}) diff --git a/src/components/Connection/SGEConnect/StepAddress.tsx b/src/components/Connection/SGEConnect/StepAddress.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c5265592c3f82126e1332df5d3d8c2f3aab6a94a --- /dev/null +++ b/src/components/Connection/SGEConnect/StepAddress.tsx @@ -0,0 +1,62 @@ +import React from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { SgeStore } from 'models/sgeStore.model' + +interface StepAddressProps { + sgeState: SgeStore + onChange: (key: string, value: string, maxLength?: number) => void +} + +const StepAddress: React.FC<StepAddressProps> = ({ + sgeState, + onChange, +}: StepAddressProps) => { + const { t } = useI18n() + return ( + <div className="sge-step-container stepAddress"> + <div className="title text-22-bold"> + {t('auth.enedissgegrandlyon.addressTitle')} + </div> + <label htmlFor="address" className="text-16-normal"> + {t('auth.enedissgegrandlyon.address')} + </label> + <input + type="text" + id="address" + name="address" + value={sgeState.address} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('address', e.target.value) + } + /> + <label htmlFor="zipCode" className="text-16-normal"> + {t('auth.enedissgegrandlyon.zipCode')} + </label> + <input + type="number" + min={0} + id="zipCode" + name="zipCode" + value={sgeState.zipCode !== null ? sgeState.zipCode : undefined} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('zipCode', e.target.value, 5) + } + /> + + <label htmlFor="city" className="text-16-normal"> + {t('auth.enedissgegrandlyon.city')} + </label> + <input + type="text" + id="city" + name="city" + value={sgeState.city} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('city', e.target.value) + } + /> + </div> + ) +} + +export default StepAddress diff --git a/src/components/Connection/SGEConnect/StepConsent.spec.tsx b/src/components/Connection/SGEConnect/StepConsent.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..985082b68f6aeea772e9df4dd723cb85fac38d72 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepConsent.spec.tsx @@ -0,0 +1,74 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import StepConsent from './StepConsent' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('StepConsent component', () => { + it('should be rendered correctly', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepConsent + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should change pdlConfirm value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepConsent + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#pdlConfirm').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('pdlConfirm', false) + }) + it('should change dataConsent value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepConsent + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#dataConsent').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('dataConsent', false) + }) +}) diff --git a/src/components/Connection/SGEConnect/StepConsent.tsx b/src/components/Connection/SGEConnect/StepConsent.tsx new file mode 100644 index 0000000000000000000000000000000000000000..53c09677e9f12f52c421d59aa9793266103416dc --- /dev/null +++ b/src/components/Connection/SGEConnect/StepConsent.tsx @@ -0,0 +1,67 @@ +import React from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { decoreText } from 'utils/decoreText' +import classNames from 'classnames' +import { SgeStore } from 'models/sgeStore.model' + +interface StepConsentProps { + sgeState: SgeStore + onChange: (key: string, value: boolean, maxLength?: number) => void +} +const StepConsent: React.FC<StepConsentProps> = ({ + sgeState, + onChange, +}: StepConsentProps) => { + const { t } = useI18n() + + return ( + <div className="sge-step-container stepConsent"> + <div className="head text-16-normal"> + {t('auth.enedissgegrandlyon.headConsent')} + </div> + <div className="title text-22-bold"> + {t('auth.enedissgegrandlyon.textConsent')} + </div> + <ul className="text-16-normal"> + <li>{t('auth.enedissgegrandlyon.consentLi1')}</li> + <li>{t('auth.enedissgegrandlyon.consentLi2')}</li> + <li>{t('auth.enedissgegrandlyon.consentLi3')}</li> + <li>{t('auth.enedissgegrandlyon.consentLi4')}</li> + </ul> + <label + className={classNames('checkbox', { + ['answer-checked']: sgeState.dataConsent, + })} + > + <input + id="dataConsent" + type="checkbox" + name="Data-consent-validation" + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('dataConsent', e.target.checked) + } + checked={sgeState.dataConsent} + /> + <span>{decoreText(t('auth.enedissgegrandlyon.consentCheck1'))}</span> + </label> + <label + className={classNames('checkbox', { + ['answer-checked']: sgeState.pdlConfirm, + })} + > + <input + id="pdlConfirm" + type="checkbox" + name="Data-consent-validation" + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('pdlConfirm', e.target.checked) + } + checked={sgeState.pdlConfirm} + /> + {decoreText(t('auth.enedissgegrandlyon.consentCheck2'))} + </label> + </div> + ) +} + +export default StepConsent diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4a6ffacf3c40c7e37edefbd4a17850a317ad8ee4 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx @@ -0,0 +1,127 @@ +import React from 'react' +import { mount } from 'enzyme' +import configureStore from 'redux-mock-store' +import { Provider } from 'react-redux' +import { globalStateData } from '../../../../tests/__mocks__/globalStateData.mock' +import toJson from 'enzyme-to-json' +import StepIdentityAndPdl from './StepIdentityAndPdl' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockStore = configureStore([]) + +describe('StepIdentityAndPdl component', () => { + it('should be rendered correctly', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should change firstName value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#firstName').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('firstName', '') + }) + it('should change lastName value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#lastName').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('lastName', '') + }) + it('should change pdl value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('#pdl').first().simulate('change') + expect(mockHandleChange).toHaveBeenCalledWith('pdl', '', 14) + }) + it('should open hint modal', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={globalStateData.sgeConnect} + onChange={mockHandleChange} + /> + </Provider> + ) + wrapper.find('.pdl-hint').first().simulate('click') + expect(wrapper.find('.sgeHintModal')).toBeTruthy() + }) + it('should have an existing pdl value', () => { + const mockHandleChange = jest.fn() + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + const wrapper = mount( + <Provider store={store}> + <StepIdentityAndPdl + sgeState={{ ...globalStateData.sgeConnect, pdl: 11111111111111 }} + onChange={mockHandleChange} + /> + </Provider> + ) + expect(wrapper.find('#pdl').first().props().value).toBe(11111111111111) + }) +}) diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e545c2b98c080839c01abc5537c179fb8a6c9776 --- /dev/null +++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx @@ -0,0 +1,78 @@ +import React, { useCallback, useState } from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { SgeStore } from 'models/sgeStore.model' +import SgeModalHint from 'components/Connection/SGEConnect/SgeModalHint' + +interface StepIdentityAndPdlProps { + sgeState: SgeStore + onChange: (key: string, value: string | number, maxLength?: number) => void +} + +const StepIdentityAndPdl: React.FC<StepIdentityAndPdlProps> = ({ + sgeState, + onChange, +}: StepIdentityAndPdlProps) => { + const { t } = useI18n() + const [openHintModal, setopenHintModal] = useState<boolean>(false) + const toggleModal = useCallback(() => { + setopenHintModal(prev => !prev) + }, []) + + return ( + <div className="sge-step-container stepIdentity"> + <div className="title text-22-bold"> + {t('auth.enedissgegrandlyon.identityTitle')} + </div> + <label htmlFor="firstName" className="text-16-normal"> + {t('auth.enedissgegrandlyon.firstName')} + </label> + <input + type="text" + id="firstName" + name="firstName" + value={sgeState.firstName} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('firstName', e.target.value) + } + required + /> + <label htmlFor="lastName" className="text-16-normal"> + {t('auth.enedissgegrandlyon.lastName')} + </label> + <input + type="text" + id="lastName" + name="lastName" + value={sgeState.lastName} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('lastName', e.target.value) + } + required + /> + <div className="title text-22-bold"> + {t('auth.enedissgegrandlyon.pdlTitle')} + </div> + <label htmlFor="pdl" className="text-16-normal"> + {t('auth.enedissgegrandlyon.pdlLabel')} + </label> + <input + id="pdl" + name="pdl" + type="number" + min={0} + value={sgeState.pdl ? sgeState.pdl : undefined} + onChange={(e: React.ChangeEvent<HTMLInputElement>) => + onChange('pdl', e.target.value, 14) + } + inputMode="numeric" + required + /> + <div onClick={toggleModal} className="pdl-hint text-16-normal"> + {t('auth.enedissgegrandlyon.pdlHint')} + </div> + <SgeModalHint open={openHintModal} handleCloseClick={toggleModal} /> + </div> + ) +} + +export default StepIdentityAndPdl diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..4875200e3e8dde4ff5b23bb5a359017cb8c41d57 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap @@ -0,0 +1,1323 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SgeConnectView component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <SgeConnectView> + <CozyBar + displayBackArrow={true} + titleKey="common.title_sge_connect" + > + <BarLeft> + <StyledIconButton + aria-label="header.accessibility.button_back" + className="cv-button" + icon="test-file-stub" + onClick={[Function]} + > + <WithStyles(WithStyles(ForwardRef(IconButton))) + aria-label="header.accessibility.button_back" + className="cv-button" + onClick={[Function]} + > + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_back" + className="cv-button" + classes={ + Object { + "root": "WithStyles(ForwardRef(IconButton))-root-1", + } + } + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_back" + className="cv-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_back" + className="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <StyledIcon + icon="test-file-stub" + size={16} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={16} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </WithStyles(WithStyles(ForwardRef(IconButton)))> + </StyledIconButton> + </BarLeft> + <BarCenter> + <div + className="cozy-bar" + > + <span + className="app-title" + > + common.title_sge_connect + </span> + </div> + </BarCenter> + <BarRight> + <StyledIconButton + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + icon="test-file-stub" + onClick={[Function]} + sized={22} + > + <WithStyles(WithStyles(ForwardRef(IconButton))) + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + onClick={[Function]} + > + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + classes={ + Object { + "root": "WithStyles(ForwardRef(IconButton))-root-1", + } + } + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_open_feedbacks" + className="cv-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_open_feedbacks" + className="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <StyledIcon + icon="test-file-stub" + size={22} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={22} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={22} + style={Object {}} + width={22} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={22} + style={Object {}} + width={22} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </WithStyles(WithStyles(ForwardRef(IconButton)))> + </StyledIconButton> + </BarRight> + </CozyBar> + <Header + desktopTitleKey="common.title_sge_connect" + displayBackArrow={true} + setHeaderHeight={[Function]} + > + <div + className="header" + > + <div + className="header-top" + > + <div + className="header-content" + > + <div + className="header-content-top" + > + <div + className="header-text-desktop text-14-normal-uppercase" + > + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_back" + className="header-back-button" + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_back" + className="header-back-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root header-back-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_back" + centerRipple={true} + className="MuiIconButton-root header-back-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_back" + className="MuiButtonBase-root MuiIconButton-root header-back-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + <span> + common.title_sge_connect + </span> + </div> + <WithStyles(ForwardRef(IconButton)) + aria-label="header.accessibility.button_open_feedbacks" + className="header-feedbacks-button" + onClick={[Function]} + > + <ForwardRef(IconButton) + aria-label="header.accessibility.button_open_feedbacks" + className="header-feedbacks-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root header-feedbacks-button" + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-label="header.accessibility.button_open_feedbacks" + centerRipple={true} + className="MuiIconButton-root header-feedbacks-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[Function]} + > + <button + aria-label="header.accessibility.button_open_feedbacks" + className="MuiButtonBase-root MuiIconButton-root header-feedbacks-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={40} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={40} + style={Object {}} + width={40} + > + <svg + className="styles__icon___23x3R" + height={40} + style={Object {}} + width={40} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </div> + </div> + </div> + <div + className="header-bar" + /> + </div> + </Header> + <mock-content + height={-48} + > + <div + className="sge-view" + > + <div + className="sge-container" + > + <mock-formprogress + formType="sge" + step={0} + /> + <StepIdentityAndPdl + onChange={[Function]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepIdentity" + > + <div + className="title text-22-bold" + > + auth.enedissgegrandlyon.identityTitle + </div> + <label + className="text-16-normal" + htmlFor="firstName" + > + auth.enedissgegrandlyon.firstName + </label> + <input + id="firstName" + name="firstName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <label + className="text-16-normal" + htmlFor="lastName" + > + auth.enedissgegrandlyon.lastName + </label> + <input + id="lastName" + name="lastName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <div + className="title text-22-bold" + > + auth.enedissgegrandlyon.pdlTitle + </div> + <label + className="text-16-normal" + htmlFor="pdl" + > + auth.enedissgegrandlyon.pdlLabel + </label> + <input + id="pdl" + inputMode="numeric" + min={0} + name="pdl" + onChange={[Function]} + required={true} + type="number" + /> + <div + className="pdl-hint text-16-normal" + onClick={[Function]} + > + auth.enedissgegrandlyon.pdlHint + </div> + <SgeModalHint + handleCloseClick={[Function]} + open={false} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + /> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </SgeModalHint> + </div> + </StepIdentityAndPdl> + </div> + <FormNavigation + disableNextButton={true} + disablePrevButton={true} + handleNext={[Function]} + handlePrevious={[Function]} + isEcogesture={false} + isLastConnectStep={false} + step={0} + > + <div + className="profile-navigation" + > + <WithStyles(ForwardRef(Button)) + aria-label="profile_type.accessibility.button_previous" + className="profile-navigation-button" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-profile-back", + } + } + disabled={true} + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="profile_type.accessibility.button_previous" + className="profile-navigation-button" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-profile-back", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + disabled={true} + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="profile_type.accessibility.button_previous" + className="MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled" + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="profile_type.accessibility.button_previous" + className="MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="profile_type.accessibility.button_previous" + className="MuiButtonBase-root MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled Mui-disabled" + disabled={true} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={-1} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + < profile_type.form.button_previous + </span> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + <WithStyles(ForwardRef(Button)) + aria-label="profile_type.accessibility.button_next" + className="profile-navigation-button disabled" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-profile-next", + } + } + disabled={true} + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="profile_type.accessibility.button_next" + className="profile-navigation-button disabled" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-profile-next", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + disabled={true} + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="profile_type.accessibility.button_next" + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled" + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="profile_type.accessibility.button_next" + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="profile_type.accessibility.button_next" + className="MuiButtonBase-root MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled Mui-disabled" + disabled={true} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={-1} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + profile_type.form.button_next > + </span> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </FormNavigation> + </div> + </mock-content> + </SgeConnectView> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeInit.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeInit.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..1427c5b554adf3591873040e3b3ed47f441172ec --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeInit.spec.tsx.snap @@ -0,0 +1,223 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SgeInit component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <SgeInit + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": false, + "siteLink": "", + "slug": "enedissgegrandlyon", + }, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 0, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 0, + } + } + > + <div + className="kloginform sge-connect" + > + <p + className="kloginform-title enedissgegrandlyon text-20-bold" + > + auth.enedissgegrandlyon.title + </p> + <StyledIcon + icon="test-file-stub" + size={180} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={180} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + <p + className="sge-subtitle enedissgegrandlyon text-16-regular" + > + auth.enedissgegrandlyon.bill + </p> + <div + className="kloginform-button" + > + <WithStyles(ForwardRef(Button)) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="auth.enedissgegrandlyon.accessibility.connect" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + auth.enedissgegrandlyon.connect + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </SgeInit> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..eff1752825bab266d4a25c487d26d8a29d4d18db --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap @@ -0,0 +1,1106 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`SgeModalHint component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <SgeModalHint + handleCloseClick={[MockFunction]} + open={true} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + challenge_no_fluid_modal.accessibility.window_title + </div> + <button + aria-label="feedback.accessibility.button_close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <div + class="sgeHintModal" + > + <div + class="title text-20-bold" + > + auth.enedissgegrandlyon.modalHint.title + </div> + <div + class="pdl" + > + <p> + auth.enedissgegrandlyon.pdlModal.txt1 + </p> + <p> + auth.enedissgegrandlyon.pdlModal.txt2 + </p> + <div + class="bill" + > + <svg + alt="Facture" + class="bill styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + <p> + auth.enedissgegrandlyon.pdlModal.txt3 + </p> + </div> + <p> + auth.enedissgegrandlyon.pdlModal.txt4 + </p> + <svg + alt="PDL" + class="prm styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </div> + <button + aria-label="auth.enedissgegrandlyon.modalHint.button-accessibility" + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + style="height: 40px;" + tabindex="0" + type="button" + > + <span + class="MuiButton-label text-16-bold" + > + auth.enedissgegrandlyon.modalHint.button + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + challenge_no_fluid_modal.accessibility.window_title + </div> + <WithStyles(ForwardRef(IconButton)) + aria-label="feedback.accessibility.button_close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="feedback.accessibility.button_close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="feedback.accessibility.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="feedback.accessibility.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="feedback.accessibility.button_close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + <div + className="sgeHintModal" + > + <div + className="title text-20-bold" + > + auth.enedissgegrandlyon.modalHint.title + </div> + <div + className="pdl" + > + <p> + auth.enedissgegrandlyon.pdlModal.txt1 + </p> + <p> + auth.enedissgegrandlyon.pdlModal.txt2 + </p> + <div + className="bill" + > + <Icon + alt="Facture" + className="bill" + icon="test-file-stub" + spin={false} + > + <Component + alt="Facture" + className="bill styles__icon___23x3R" + height="16" + style={Object {}} + width="16" + > + <svg + alt="Facture" + className="bill styles__icon___23x3R" + height="16" + style={Object {}} + width="16" + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + <p> + auth.enedissgegrandlyon.pdlModal.txt3 + </p> + </div> + <p> + auth.enedissgegrandlyon.pdlModal.txt4 + </p> + <Icon + alt="PDL" + className="prm" + icon="test-file-stub" + spin={false} + > + <Component + alt="PDL" + className="prm styles__icon___23x3R" + height="16" + style={Object {}} + width="16" + > + <svg + alt="PDL" + className="prm styles__icon___23x3R" + height="16" + style={Object {}} + width="16" + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </div> + <WithStyles(ForwardRef(Button)) + aria-label="auth.enedissgegrandlyon.modalHint.button-accessibility" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + > + <ForwardRef(Button) + aria-label="auth.enedissgegrandlyon.modalHint.button-accessibility" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="auth.enedissgegrandlyon.modalHint.button-accessibility" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + type="button" + > + <ForwardRef(ButtonBase) + aria-label="auth.enedissgegrandlyon.modalHint.button-accessibility" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + style={ + Object { + "height": "40px", + } + } + type="button" + > + <button + aria-label="auth.enedissgegrandlyon.modalHint.button-accessibility" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + style={ + Object { + "height": "40px", + } + } + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + auth.enedissgegrandlyon.modalHint.button + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </SgeModalHint> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..bffbbf9d0daf4c604fe6515786a9fa9d54a83c71 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap @@ -0,0 +1,83 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StepAddress component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <StepAddress + onChange={[MockFunction]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepAddress" + > + <div + className="title text-22-bold" + > + auth.enedissgegrandlyon.addressTitle + </div> + <label + className="text-16-normal" + htmlFor="address" + > + auth.enedissgegrandlyon.address + </label> + <input + id="address" + name="address" + onChange={[Function]} + type="text" + value="" + /> + <label + className="text-16-normal" + htmlFor="zipCode" + > + auth.enedissgegrandlyon.zipCode + </label> + <input + id="zipCode" + min={0} + name="zipCode" + onChange={[Function]} + type="number" + /> + <label + className="text-16-normal" + htmlFor="city" + > + auth.enedissgegrandlyon.city + </label> + <input + id="city" + name="city" + onChange={[Function]} + type="text" + value="" + /> + </div> + </StepAddress> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..f5fd68d492c79666b431eae5ce7719273b7005d1 --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap @@ -0,0 +1,91 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StepConsent component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <StepConsent + onChange={[MockFunction]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepConsent" + > + <div + className="head text-16-normal" + > + auth.enedissgegrandlyon.headConsent + </div> + <div + className="title text-22-bold" + > + auth.enedissgegrandlyon.textConsent + </div> + <ul + className="text-16-normal" + > + <li> + auth.enedissgegrandlyon.consentLi1 + </li> + <li> + auth.enedissgegrandlyon.consentLi2 + </li> + <li> + auth.enedissgegrandlyon.consentLi3 + </li> + <li> + auth.enedissgegrandlyon.consentLi4 + </li> + </ul> + <label + className="checkbox" + > + <input + checked={false} + id="dataConsent" + name="Data-consent-validation" + onChange={[Function]} + type="checkbox" + /> + <span> + auth.enedissgegrandlyon.consentCheck1 + </span> + </label> + <label + className="checkbox" + > + <input + checked={false} + id="pdlConfirm" + name="Data-consent-validation" + onChange={[Function]} + type="checkbox" + /> + auth.enedissgegrandlyon.consentCheck2 + </label> + </div> + </StepConsent> +</Provider> +`; diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..e5fd436186347e2a50eaf39f652ef27a388c17ae --- /dev/null +++ b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap @@ -0,0 +1,472 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StepIdentityAndPdl component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <StepIdentityAndPdl + onChange={[MockFunction]} + sgeState={ + Object { + "address": "", + "city": "", + "currentStep": 0, + "dataConsent": false, + "firstName": "", + "lastName": "", + "pdl": null, + "pdlConfirm": false, + "shouldLaunchAccount": false, + "zipCode": null, + } + } + > + <div + className="sge-step-container stepIdentity" + > + <div + className="title text-22-bold" + > + auth.enedissgegrandlyon.identityTitle + </div> + <label + className="text-16-normal" + htmlFor="firstName" + > + auth.enedissgegrandlyon.firstName + </label> + <input + id="firstName" + name="firstName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <label + className="text-16-normal" + htmlFor="lastName" + > + auth.enedissgegrandlyon.lastName + </label> + <input + id="lastName" + name="lastName" + onChange={[Function]} + required={true} + type="text" + value="" + /> + <div + className="title text-22-bold" + > + auth.enedissgegrandlyon.pdlTitle + </div> + <label + className="text-16-normal" + htmlFor="pdl" + > + auth.enedissgegrandlyon.pdlLabel + </label> + <input + id="pdl" + inputMode="numeric" + min={0} + name="pdl" + onChange={[Function]} + required={true} + type="number" + /> + <div + className="pdl-hint text-16-normal" + onClick={[Function]} + > + auth.enedissgegrandlyon.pdlHint + </div> + <SgeModalHint + handleCloseClick={[Function]} + open={false} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[Function]} + open={false} + /> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </SgeModalHint> + </div> + </StepIdentityAndPdl> +</Provider> +`; diff --git a/src/components/Connection/__snapshots__/Connection.spec.tsx.snap b/src/components/Connection/__snapshots__/Connection.spec.tsx.snap index 990ba1c0eea23080bf48922657c3ce3bba03515a..c3cfe15733de7039743ecb266d67ad749fc67a60 100644 --- a/src/components/Connection/__snapshots__/Connection.spec.tsx.snap +++ b/src/components/Connection/__snapshots__/Connection.spec.tsx.snap @@ -1,127 +1,351 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Connection component test should call ConnectionLogin 1`] = ` -<Connection - fluidStatus={ +<Provider + store={ Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": false, - "siteLink": "", - "slug": "", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, - }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 0, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], } } > - <div - className="konnector-form" - > - <mockConstructor - fluidStatus={ - Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": false, - "siteLink": "", - "slug": "", + <Connection + fluidStatus={ + Object { + "connection": Object { + "account": Object { + "_id": "test", + "account_type": "test", + "auth": Object { + "address": "address", + "city": "Lyon", + "firstname": "Jane", + "lastname": "Doe", + "pointId": "testid", + "postalCode": "69200", }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 0, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, - } + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": false, + "siteLink": "", + "slug": "enedissgegrandlyon", + }, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 0, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, } - onSuccess={[Function]} + } + > + <div + className="konnector-form" > - <div - id="ConnectionLogin" - /> - </mockConstructor> - </div> -</Connection> + <SgeInit + fluidStatus={ + Object { + "connection": Object { + "account": Object { + "_id": "test", + "account_type": "test", + "auth": Object { + "address": "address", + "city": "Lyon", + "firstname": "Jane", + "lastname": "Doe", + "pointId": "testid", + "postalCode": "69200", + }, + }, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": false, + "siteLink": "", + "slug": "enedissgegrandlyon", + }, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 0, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, + } + } + > + <div + className="kloginform sge-connect" + > + <p + className="kloginform-title enedissgegrandlyon text-20-bold" + > + auth.enedissgegrandlyon.title + </p> + <StyledIcon + icon="test-file-stub" + size={180} + > + <Icon + aria-hidden={true} + icon="test-file-stub" + size={180} + spin={false} + > + <Component + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <svg + aria-hidden={true} + className="styles__icon___23x3R" + height={180} + style={Object {}} + width={180} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + <p + className="sge-subtitle enedissgegrandlyon text-16-regular" + > + auth.enedissgegrandlyon.bill + </p> + <div + className="kloginform-button" + > + <WithStyles(ForwardRef(Button)) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="auth.enedissgegrandlyon.accessibility.connect" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="auth.enedissgegrandlyon.accessibility.connect" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + auth.enedissgegrandlyon.connect + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </SgeInit> + </div> + </Connection> +</Provider> `; exports[`Connection component test should call ConnectionOAuth 1`] = ` -<Connection - fluidStatus={ +<Provider + store={ Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": true, - "siteLink": "", - "slug": "", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, - }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 2, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], } } > - <div - className="konnector-form" - > - <mockConstructor - fluidStatus={ - Object { - "connection": Object { - "account": null, - "isUpdating": false, - "konnector": null, - "konnectorConfig": Object { - "activation": "", - "name": "", - "oauth": true, - "siteLink": "", - "slug": "", - }, - "shouldLaunchKonnector": false, - "trigger": null, - "triggerState": null, + <Connection + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": true, + "siteLink": "", + "slug": "grdfgrandlyon", }, - "firstDataDate": "2019-09-01T00:00:00.000Z", - "fluidType": 2, - "lastDataDate": "2020-09-01T00:00:00.000Z", - "status": 200, - } + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 2, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, } - onSuccess={[Function]} + } + > + <div + className="konnector-form" > - <div - id="ConnectionOAuth" - /> - </mockConstructor> - </div> -</Connection> + <mockConstructor + fluidStatus={ + Object { + "connection": Object { + "account": null, + "isUpdating": false, + "konnector": null, + "konnectorConfig": Object { + "activation": "", + "name": "", + "oauth": true, + "siteLink": "", + "slug": "grdfgrandlyon", + }, + "shouldLaunchKonnector": false, + "trigger": null, + "triggerState": null, + }, + "firstDataDate": "2019-09-01T00:00:00.000Z", + "fluidType": 2, + "lastDataDate": "2020-09-01T00:00:00.000Z", + "status": 200, + } + } + onSuccess={[Function]} + > + <div + id="ConnectionOAuth" + /> + </mockConstructor> + </div> + </Connection> +</Provider> `; diff --git a/src/components/Connection/__snapshots__/ExpiredConsentModal.spec.tsx.snap b/src/components/Connection/__snapshots__/ExpiredConsentModal.spec.tsx.snap index 1ee47a975ce6cb8a834d5af119c0ba4d7379f568..4288ee9d7a22a3dfc207be38ea715fca1ae4b6cd 100644 --- a/src/components/Connection/__snapshots__/ExpiredConsentModal.spec.tsx.snap +++ b/src/components/Connection/__snapshots__/ExpiredConsentModal.spec.tsx.snap @@ -17,6 +17,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` fluidType={0} handleCloseClick={[MockFunction]} open={true} + toggleModal={[MockFunction]} > <WithStyles(ForwardRef(Dialog)) aria-labelledby="accessibility-title" @@ -461,7 +462,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` </svg> </div> <div - class="text-20-normal title electricity" + class="text-20-bold title electricity" > consent_outdated.title.0 </div> @@ -487,7 +488,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` <span class="MuiButton-label text-16-normal" > - consent_outdated.later + consent_outdated.no </span> <span class="MuiTouchRipple-root" @@ -502,7 +503,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` <span class="MuiButton-label text-16-bold" > - consent_outdated.go + consent_outdated.yes </span> <span class="MuiTouchRipple-root" @@ -878,7 +879,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` </Icon> </div> <div - className="text-20-normal title electricity" + className="text-20-bold title electricity" > consent_outdated.title.0 </div> @@ -991,7 +992,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` <span className="MuiButton-label text-16-normal" > - consent_outdated.later + consent_outdated.no </span> <WithStyles(memo) center={false} @@ -1122,7 +1123,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` <span className="MuiButton-label text-16-bold" > - consent_outdated.go + consent_outdated.yes </span> <WithStyles(memo) center={false} diff --git a/src/components/Connection/connectionLogin.scss b/src/components/Connection/connectionLogin.scss index 9460217f553e72c77da5f388102c5336160b2b4f..6cd0f09f422f3bf8df53e2fd3feca5480aa59dae 100644 --- a/src/components/Connection/connectionLogin.scss +++ b/src/components/Connection/connectionLogin.scss @@ -1,11 +1,14 @@ @import 'src/styles/base/color'; .kloginform { + &.sge-connect { + text-align: center; + } .kloginform-title { text-align: center; margin-bottom: 0; padding: 0 1rem; - &.enedisgrandlyon { + &.enedissgegrandlyon { color: $elec-color; } &.grdfgrandlyon { @@ -20,6 +23,15 @@ color: $white; margin: 2.5rem 0 0.5rem; } + + .sge-subtitle { + color: $white; + text-align: center; + span { + font-weight: bold; + color: $gold-shadow; + } + } .kloginform-infotext { text-align: center; color: $grey-bright; diff --git a/src/components/Connection/connectionResult.scss b/src/components/Connection/connectionResult.scss index 8d4e5d1ada012afebae7e5115840670f8169f4c4..49753c53b3b5c33342bbe943a914d506426f9e15 100644 --- a/src/components/Connection/connectionResult.scss +++ b/src/components/Connection/connectionResult.scss @@ -34,13 +34,10 @@ .inline-buttons { display: flex; flex-flow: row nowrap; + gap: 1rem; button.btn-secondary-positive { - margin-right: 0.25rem; span:first-child { color: $red-primary !important; } } - button.btn-highlight { - margin-left: 0.25rem; - } } diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx index 74f271ffd71581b9e202aff8bcb5fa1fc0637989..31bf92185c0694392301ece6e18260f6de790754 100644 --- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx +++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx @@ -9,7 +9,6 @@ import { } from '../../../tests/__mocks__/store' import DataloadConsumptionVisualizer from './DataloadConsumptionVisualizer' import { FluidType } from 'enum/fluid.enum' -import { DateTime } from 'luxon' import { baseDataLoad } from '../../../tests/__mocks__/datachartData.mock' import { Dataload } from 'models' import { BrowserRouter as Router } from 'react-router-dom' diff --git a/src/components/Content/content.scss b/src/components/Content/content.scss index 5d6b401d1ff8e6d82702c0ee5c0e0b0477e5b565..4d5c7ecbcaad555335d7451b8c774cd05203b4f4 100644 --- a/src/components/Content/content.scss +++ b/src/components/Content/content.scss @@ -6,6 +6,9 @@ height: inherit; margin-top: 116px; background-color: $default-background; + display: flex; + flex-direction: column; + flex: 1; @media #{$large-phone} { margin-top: 0; height: 100%; diff --git a/src/components/CustomPopup/CustomPopupModal.spec.tsx b/src/components/CustomPopup/CustomPopupModal.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..845c8722cc606e65cba16fefc2ef938b3af8aa3a --- /dev/null +++ b/src/components/CustomPopup/CustomPopupModal.spec.tsx @@ -0,0 +1,59 @@ +import { Button } from '@material-ui/core' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import React from 'react' +import { + mockCustomPopup, + mockCustomPopupOff, + mockCustomPopupOutdated, +} from '../../../tests/__mocks__/customPopup.mock' +import CustomPopupModal from './CustomPopupModal' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +const mockHandleClose = jest.fn() + +describe('CustomPopupModal component', () => { + const wrapper = mount( + <CustomPopupModal + customPopup={mockCustomPopup} + handleCloseClick={mockHandleClose} + /> + ) + it('should render correctly', () => { + expect(toJson(wrapper)).toMatchSnapshot() + }) + + it('should close modal', () => { + wrapper.find(Button).simulate('click') + expect(mockHandleClose).toHaveBeenCalled() + }) + + it('should not be rendered, popup not enabled', () => { + const wrapper = mount( + <CustomPopupModal + customPopup={mockCustomPopupOff} + handleCloseClick={mockHandleClose} + /> + ) + expect(wrapper.find('div.customPopupModal').exists()).toBeFalsy() + }) + + it('should not be rendered, popup outdated', () => { + const wrapper = mount( + <CustomPopupModal + customPopup={mockCustomPopupOutdated} + handleCloseClick={mockHandleClose} + /> + ) + expect(wrapper.find('div.customPopupModal').exists()).toBeFalsy() + }) +}) diff --git a/src/components/CustomPopup/CustomPopupModal.tsx b/src/components/CustomPopup/CustomPopupModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8e1d402d506314ea7fb28d9dae128e4fd7431e12 --- /dev/null +++ b/src/components/CustomPopup/CustomPopupModal.tsx @@ -0,0 +1,74 @@ +import Button from '@material-ui/core/Button' +import Dialog from '@material-ui/core/Dialog' +import IconButton from '@material-ui/core/IconButton' +import CloseIcon from 'assets/icons/ico/close.svg' +import Speaker from 'assets/icons/ico/speaker.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { DateTime } from 'luxon' +import { CustomPopup } from 'models/customPopup.model' +import React from 'react' +import './customPopupModal.scss' + +interface CustomPopupModalProps { + customPopup: CustomPopup + handleCloseClick: () => void +} + +const CustomPopupModal: React.FC<CustomPopupModalProps> = ({ + customPopup, + handleCloseClick, +}) => { + const { t } = useI18n() + const isPopupOutdated = () => + DateTime.local() >= DateTime.fromISO(customPopup.endDate) + + return ( + <Dialog + open={customPopup.popupEnabled && !isPopupOutdated()} + disableEscapeKeyDown + onClose={(event, reason): void => { + event && reason !== 'backdropClick' && handleCloseClick() + }} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper customPopupRoot', + }} + > + <div id="accessibility-title">{customPopup.title}</div> + <div id="accessibility-content">{customPopup.description}</div> + <IconButton + aria-label={t('feedback.accessibility.button_close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={16} /> + </IconButton> + <div className="customPopupModal"> + <StyledIcon icon={Speaker} size={100} className={'warn-icon'} /> + + <div className="customPopup-title text-20-bold"> + {customPopup.title} + </div> + + <div className="customPopup-content text-16-normal"> + {customPopup.description} + </div> + + <Button + onClick={handleCloseClick} + classes={{ + root: 'btn-highlight ', + label: 'text-16-bold', + }} + > + {t('consumption.partners_issue_modal.ok')} + </Button> + </div> + </Dialog> + ) +} + +export default CustomPopupModal diff --git a/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..bb492567614e5d308210feb46a05d3790acd9f93 --- /dev/null +++ b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap @@ -0,0 +1,1019 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CustomPopupModal component should render correctly 1`] = ` +<CustomPopupModal + customPopup={ + Object { + "description": "Interesting description", + "endDate": "2099-10-04T15:10:53.219+02:00", + "popupEnabled": true, + "title": "Bold title", + } + } + handleCloseClick={[MockFunction]} +> + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper customPopupRoot", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper customPopupRoot", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper customPopupRoot MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + Bold title + </div> + <div + id="accessibility-content" + > + Interesting description + </div> + <button + aria-label="feedback.accessibility.button_close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <div + class="customPopupModal" + > + <svg + aria-hidden="true" + class="warn-icon styles__icon___23x3R" + height="100" + width="100" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + <div + class="customPopup-title text-20-bold" + > + Bold title + </div> + <div + class="customPopup-content text-16-normal" + > + Interesting description + </div> + <button + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + tabindex="0" + type="button" + > + <span + class="MuiButton-label text-16-bold" + > + consumption.partners_issue_modal.ok + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper customPopupRoot MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper customPopupRoot MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper customPopupRoot MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + Bold title + </div> + <div + id="accessibility-content" + > + Interesting description + </div> + <WithStyles(ForwardRef(IconButton)) + aria-label="feedback.accessibility.button_close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="feedback.accessibility.button_close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="feedback.accessibility.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="feedback.accessibility.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="feedback.accessibility.button_close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + <div + className="customPopupModal" + > + <StyledIcon + className="warn-icon" + icon="test-file-stub" + size={100} + > + <Icon + aria-hidden={true} + className="warn-icon" + icon="test-file-stub" + size={100} + spin={false} + > + <Component + aria-hidden={true} + className="warn-icon styles__icon___23x3R" + height={100} + style={Object {}} + width={100} + > + <svg + aria-hidden={true} + className="warn-icon styles__icon___23x3R" + height={100} + style={Object {}} + width={100} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + <div + className="customPopup-title text-20-bold" + > + Bold title + </div> + <div + className="customPopup-content text-16-normal" + > + Interesting description + </div> + <WithStyles(ForwardRef(Button)) + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight ", + } + } + onClick={[MockFunction]} + > + <ForwardRef(Button) + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight ", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="button" + > + <ForwardRef(ButtonBase) + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="button" + > + <button + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + consumption.partners_issue_modal.ok + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> +</CustomPopupModal> +`; diff --git a/src/components/CustomPopup/customPopupModal.scss b/src/components/CustomPopup/customPopupModal.scss new file mode 100644 index 0000000000000000000000000000000000000000..4262831b6a91356c8fe5424287429fac1a1fc638 --- /dev/null +++ b/src/components/CustomPopup/customPopupModal.scss @@ -0,0 +1,34 @@ +@import '../../styles/base/typo-variables'; +@import '../../styles/base/color'; + +.customPopupRoot { + border: 1px solid $gold-euro; +} + +.customPopupModal { + padding: 1rem; + max-width: 20rem; + + .warn-icon { + margin: 1rem auto; + display: block; + } + .customPopup-title { + text-align: center; + color: $gold-shadow; + margin: 1rem auto; + } + .customPopup-content { + text-align: center; + color: $grey-bright; + } + + button.btn-highlight { + padding: 0.65rem; + } +} + +#accessibility-title, +#accessibility-content { + display: none; +} diff --git a/src/components/DateNavigator/DateNavigator.tsx b/src/components/DateNavigator/DateNavigator.tsx index ff14f1f74173d11f91fc91a5861725c5eaf6dd88..5a1936bad94e991a3dda66ffd4092045a3cab59e 100644 --- a/src/components/DateNavigator/DateNavigator.tsx +++ b/src/components/DateNavigator/DateNavigator.tsx @@ -1,23 +1,21 @@ -import React from 'react' -import './datenavigator.scss' +import IconButton from '@material-ui/core/IconButton' +import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg' +import RightArrowIcon from 'assets/icons/ico/right-arrow.svg' +import classNames from 'classnames' +import DateNavigatorFormat from 'components/DateNavigator/DateNavigatorFormat' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' +import { DateTime } from 'luxon' +import React from 'react' import { useDispatch, useSelector } from 'react-redux' +import DateChartService from 'services/dateChart.service' import { AppStore } from 'store' import { setCurrentIndex, setSelectedDate } from 'store/chart/chart.actions' -import { DateTime } from 'luxon' -import classNames from 'classnames' - -import DateChartService from 'services/dateChart.service' import { isLastDateReached } from 'utils/date' - -import DateNavigatorFormat from 'components/DateNavigator/DateNavigatorFormat' -import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg' -import RigthArrowIcon from 'assets/icons/ico/right-arrow.svg' -import IconButton from '@material-ui/core/IconButton' -import Icon from 'cozy-ui/transpiled/react/Icon' -import { TimeStep } from 'enum/timeStep.enum' import { isKonnectorActive } from 'utils/utils' -import { FluidType } from 'enum/fluid.enum' +import './datenavigator.scss' interface DateNavigatorProps { currentAnalysisDate?: DateTime @@ -132,7 +130,7 @@ const DateNavigator: React.FC<DateNavigatorProps> = ({ })} onClick={() => handleChangeNextIndex()} > - <Icon icon={RigthArrowIcon} size={16} /> + <Icon icon={RightArrowIcon} size={16} /> </IconButton> </div> </div> diff --git a/src/components/DateNavigator/DateNavigatorFormat.tsx b/src/components/DateNavigator/DateNavigatorFormat.tsx index d13361f6e38964276732aa2fa5b079bfea3e04c2..7b206615476ff2c9e875f46682907f09900026ad 100644 --- a/src/components/DateNavigator/DateNavigatorFormat.tsx +++ b/src/components/DateNavigator/DateNavigatorFormat.tsx @@ -1,6 +1,6 @@ -import React from 'react' -import { DateTime } from 'luxon' import { TimeStep } from 'enum/timeStep.enum' +import { DateTime } from 'luxon' +import React from 'react' import './datenavigatorformat.scss' interface DateNavigatorFormatProps { @@ -44,11 +44,20 @@ const DateNavigatorFormat: React.FC<DateNavigatorFormatProps> = ({ }), ] case TimeStep.HALF_AN_HOUR: + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ return [ - date.toLocaleString({ + `${date.toLocaleString({ hour: 'numeric', minute: 'numeric', - }), + })} - + ${date.plus({ minutes: 30 }).toLocaleString({ + hour: 'numeric', + minute: 'numeric', + })}`, date.toLocaleString({ weekday: 'long', day: '2-digit', @@ -74,7 +83,7 @@ const DateNavigatorFormat: React.FC<DateNavigatorFormatProps> = ({ ) : ( <> {formatedDate[0] && ( - <div className="date-navigator-format-date text-16-bold"> + <div className="date-navigator-format-date text-16-bold timeRange"> {formatedDate[0]} </div> )} diff --git a/src/components/DateNavigator/datenavigatorformat.scss b/src/components/DateNavigator/datenavigatorformat.scss index 4fc1f721d638c846873da03c0715f42313ce4c42..e964a71685463124326cc49aed07041b4b130125 100644 --- a/src/components/DateNavigator/datenavigatorformat.scss +++ b/src/components/DateNavigator/datenavigatorformat.scss @@ -16,5 +16,8 @@ &::first-letter { text-transform: uppercase; } + &.timeRange { + white-space: normal; + } } } diff --git a/src/components/Duel/DuelBar.tsx b/src/components/Duel/DuelBar.tsx index 5ba505e98d059fbccc7f603a609e449a1ae6e943..976ab117515cd35e39e6c9c5681e1cd80173388e 100644 --- a/src/components/Duel/DuelBar.tsx +++ b/src/components/Duel/DuelBar.tsx @@ -67,10 +67,7 @@ const DuelBar: React.FC<BarChartProps> = (props: BarChartProps) => { } const getMaxLoad = () => { - const maxLoad = dataload - ? Math.max(...dataload.map((d: Dataload) => d.value)) - : 0 - return maxLoad + return dataload ? Math.max(...dataload.map((d: Dataload) => d.value)) : 0 } const xScale: ScaleBand<string> = scaleBand() diff --git a/src/components/Duel/DuelOngoing.tsx b/src/components/Duel/DuelOngoing.tsx index 8b78f74c796c8c267cf57647b175928623911ba0..171d0d946be1aac7a2053a3224151a1e4dd46bb4 100644 --- a/src/components/Duel/DuelOngoing.tsx +++ b/src/components/Duel/DuelOngoing.tsx @@ -155,9 +155,8 @@ const DuelOngoing: React.FC<DuelOngoingProps> = ({ let subscribed = true async function populateData() { if (isFinished) { - const dataloads: Dataload[] = await challengeService.getUserChallengeDataload( - userChallenge - ) + const dataloads: Dataload[] = + await challengeService.getUserChallengeDataload(userChallenge) if (subscribed) { setfinishedDataLoad(dataloads) } @@ -183,11 +182,13 @@ const DuelOngoing: React.FC<DuelOngoingProps> = ({ <div className="duel-goal text-18-normal"> {t('duel.goal1', { durationInDays, + // eslint-disable-next-line camelcase smart_count: durationInDays, })} <span> </span> {t('duel.goal2', { title, + // eslint-disable-next-line camelcase smart_count: title, })} </div> diff --git a/src/components/Duel/DuelUnlocked.tsx b/src/components/Duel/DuelUnlocked.tsx index bac87b312f5f3b27c98346f9f17dc9089584c6d9..c542baeb0a557ed1899f306b8865ceb285ca93fa 100644 --- a/src/components/Duel/DuelUnlocked.tsx +++ b/src/components/Duel/DuelUnlocked.tsx @@ -69,14 +69,14 @@ const DuelUnlocked: React.FC<DuelUnlockedProps> = ({ <> <div className="duel-unlocked-container"> <StyledIcon className="duel-icon" icon={duelIcon} size={219} /> + <div className="duel-description text-20-italic">{`"${description}"`}</div> <div className="duel-title text-16-normal"> {userChallenge.duel.title} </div> - <div className="duel-description text-20-italic">{`\"${description}\"`}</div> <div className="duel-average-info text-18-normal"> {`${t('duel.average_info', { average, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase smart_count: average, })}`} </div> diff --git a/src/components/Duel/duelResultModal.scss b/src/components/Duel/duelResultModal.scss index 42ed6db9f9ee924108ccb8861a0acae269ae959c..672c1629a1b48c68b4ef18ab3ddaf264075447fc 100644 --- a/src/components/Duel/duelResultModal.scss +++ b/src/components/Duel/duelResultModal.scss @@ -1,15 +1,11 @@ .duel-result-modal-root { text-align: center; overflow-x: hidden; - padding: 1rem 1.5rem 0.5rem; .title { margin: 2rem 0 1rem; } - button.btn-secondary-negative { - margin: 2rem 0.25rem 0.5rem; - } } #accessibility-title { display: none; -} \ No newline at end of file +} diff --git a/src/components/Duel/duelUnlocked.scss b/src/components/Duel/duelUnlocked.scss index b787378c76622ff62741ee16c410d208edd89138..077c1eed988fa2c8797b9610d87350a3b3eefd71 100644 --- a/src/components/Duel/duelUnlocked.scss +++ b/src/components/Duel/duelUnlocked.scss @@ -20,10 +20,9 @@ } .duel-average-info { color: $grey-bright; - margin-top: 0.75rem; + margin-top: 2.5rem; text-align: center; } .button-start { - width: 11rem; - margin-top: 2.5rem; + margin-top: 1rem; } diff --git a/src/components/Duel/lastDuelModal.scss b/src/components/Duel/lastDuelModal.scss index 16e4bafe7ed5711ccebf9369a0415ddd1f9962db..dcd32cb494061695845daf6986f9f69eefb09aa6 100644 --- a/src/components/Duel/lastDuelModal.scss +++ b/src/components/Duel/lastDuelModal.scss @@ -19,9 +19,6 @@ .content { margin: 0.5rem 0; } - button.btn-secondary-negative { - margin: 2rem 0.25rem 0.5rem; - } } #accessibility-title { diff --git a/src/components/Duel/lastDuelModal.tsx b/src/components/Duel/lastDuelModal.tsx index 5ebd3f2e8252d86472169d7fad0e95559d8a4bfe..97ac7a1a5f389b4b409bc55a46fb8d4052a801c6 100644 --- a/src/components/Duel/lastDuelModal.tsx +++ b/src/components/Duel/lastDuelModal.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React from 'react' import './lastDuelModal.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Dialog from '@material-ui/core/Dialog' diff --git a/src/components/Ecogesture/EcogestureEmptyList.tsx b/src/components/Ecogesture/EcogestureEmptyList.tsx index 234614fcb21c6bedfa61b9241554f158233548d1..5c78275e6bf5c42d3176c8a3ad3af24392f77c2b 100644 --- a/src/components/Ecogesture/EcogestureEmptyList.tsx +++ b/src/components/Ecogesture/EcogestureEmptyList.tsx @@ -32,21 +32,13 @@ const EcogestureEmptyList: React.FC<EcogestureEmptyListProps> = ({ /> <div className="text-16-normal text"> {isObjective - ? isSelectionDone - ? t('ecogesture.emptyList.obj1_done') - : t('ecogesture.emptyList.obj1') - : isSelectionDone - ? t('ecogesture.emptyList.doing1_done') - : t('ecogesture.emptyList.doing1')} + ? t(`ecogesture.emptyList.obj1${isSelectionDone ? '_done' : ''}`) + : t(`ecogesture.emptyList.doing1${isSelectionDone ? '_done' : ''}`)} </div> <div className="text-16-normal text"> {isObjective - ? isSelectionDone - ? t('ecogesture.emptyList.obj2_done') - : t('ecogesture.emptyList.obj2') - : isSelectionDone - ? t('ecogesture.emptyList.doing2_done') - : t('ecogesture.emptyList.doing2')} + ? t(`ecogesture.emptyList.obj2${isSelectionDone ? '_done' : ''}`) + : t(`ecogesture.emptyList.doing2${isSelectionDone ? '_done' : ''}`)} </div> <div className="btn-container"> <Button diff --git a/src/components/Ecogesture/EcogestureView.tsx b/src/components/Ecogesture/EcogestureView.tsx index 05f9f3cf7953ef73a7f3b1e53021c0aea41dff43..e167d49ac0bd263e6feaed2841f15e4db3ebc78f 100644 --- a/src/components/Ecogesture/EcogestureView.tsx +++ b/src/components/Ecogesture/EcogestureView.tsx @@ -1,27 +1,26 @@ -import React, { useCallback, useEffect, useState } from 'react' -import { useClient } from 'cozy-client' +import { Tab, Tabs } from '@material-ui/core' +import classNames from 'classnames' +import Content from 'components/Content/Content' import EcogestureList from 'components/Ecogesture/EcogestureList' import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' -import Content from 'components/Content/Content' -import { Tabs, Tab } from '@material-ui/core' -import './ecogestureView.scss' -import classNames from 'classnames' +import Loader from 'components/Loader/Loader' +import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' +import { EcogestureStatus } from 'enum/ecogesture.enum' import { Ecogesture } from 'models' +import { ProfileEcogesture } from 'models/profileEcogesture.model' +import React, { useCallback, useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useHistory, useLocation } from 'react-router-dom' import EcogestureService from 'services/ecogesture.service' +import { AppStore } from 'store' +import { updateProfile } from 'store/profile/profile.actions' import { getSeason } from 'utils/utils' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import { FluidType } from 'enum/fluid.enum' import EcogestureEmptyList from './EcogestureEmptyList' -import { EcogestureStatus } from 'enum/ecogesture.enum' import EcogestureInitModal from './EcogestureInitModal' import EcogestureReinitModal from './EcogestureReinitModal' -import { updateProfile } from 'store/profile/profile.actions' -import { useHistory, useLocation } from 'react-router-dom' -import { ProfileEcogesture } from 'models/profileEcogesture.model' +import './ecogestureView.scss' interface TabPanelProps { children?: React.ReactNode @@ -64,7 +63,7 @@ const EcogestureView: React.FC = () => { (state: AppStore) => state.ecolyo.profile ) const [tabValue, setTabValue] = useState<EcogestureStatus>( - tab ? parseInt(tab) : EcogestureStatus.ALL + tab ? parseInt(tab) : EcogestureStatus.OBJECTIVE ) const history = useHistory() const [isLoaded, setIsLoaded] = useState<boolean>(false) @@ -184,13 +183,14 @@ const EcogestureView: React.FC = () => { return ( <> <CozyBar titleKey={'common.title_ecogestures'} /> - {!isLoaded ? ( + {!isLoaded && ( <Content height={headerHeight}> <div className="ecogesture-spinner" aria-busy="true"> - <StyledSpinner size="5em" fluidType={FluidType.MULTIFLUID} /> + <Loader /> </div> </Content> - ) : ( + )} + {isLoaded && ( <> <Header setHeaderHeight={defineHeaderHeight} @@ -210,28 +210,28 @@ const EcogestureView: React.FC = () => { ['active']: tabValue === EcogestureStatus.OBJECTIVE, })} {...tabProps(EcogestureStatus.OBJECTIVE)} - ></Tab> + /> <Tab label={getLabel(EcogestureStatus.DOING)} className={classNames('single-tab', { ['active']: tabValue === EcogestureStatus.DOING, })} {...tabProps(EcogestureStatus.DOING)} - ></Tab> - + /> <Tab label={getLabel(EcogestureStatus.ALL)} className={classNames('single-tab', { ['active']: tabValue === EcogestureStatus.ALL, })} {...tabProps(EcogestureStatus.ALL)} - ></Tab> + /> </Tabs> </Header> + <Content height={headerHeight}> <TabPanel value={tabValue} index={EcogestureStatus.OBJECTIVE}> - {isProfileEcogestureCompleted === true ? ( - totalAvailable === totalViewed && + {isProfileEcogestureCompleted && + (totalAvailable === totalViewed && objectiveEcogestureList.length === 0 ? ( <EcogestureEmptyList setTab={setTabValue} @@ -248,8 +248,8 @@ const EcogestureView: React.FC = () => { index={EcogestureStatus.OBJECTIVE} handleReinitClick={handleReinitClick} /> - ) - ) : ( + ))} + {!isProfileEcogestureCompleted && ( <EcogestureEmptyList setTab={setTabValue} isObjective={true} @@ -260,8 +260,8 @@ const EcogestureView: React.FC = () => { </TabPanel> <TabPanel value={tabValue} index={EcogestureStatus.DOING}> - {isProfileEcogestureCompleted === true ? ( - totalAvailable === totalViewed && + {isProfileEcogestureCompleted && + (totalAvailable === totalViewed && doingEcogestureList.length === 0 ? ( <EcogestureEmptyList setTab={setTabValue} @@ -278,8 +278,8 @@ const EcogestureView: React.FC = () => { index={EcogestureStatus.DOING} handleReinitClick={handleReinitClick} /> - ) - ) : ( + ))} + {!isProfileEcogestureCompleted && ( <EcogestureEmptyList setTab={setTabValue} isObjective={false} diff --git a/src/components/Ecogesture/SingleEcogesture.spec.tsx b/src/components/Ecogesture/SingleEcogesture.spec.tsx index b70a8f41f32171d533b46b873cf88b5f394aed6b..1c4cd286b5237908c5364e48b51c8a57b47c7498 100644 --- a/src/components/Ecogesture/SingleEcogesture.spec.tsx +++ b/src/components/Ecogesture/SingleEcogesture.spec.tsx @@ -31,9 +31,7 @@ jest.mock('components/Ecogesture/EfficientyRating', () => () => ( )) jest.mock('components/Header/Header', () => () => <div id="Header"></div>) jest.mock('components/Header/CozyBar', () => () => <div id="CozyBar"></div>) -jest.mock('components/CommonKit/Spinner/StyledSpinner', () => () => ( - <div id="spinner"></div> -)) +jest.mock('components/Loader/Loader', () => () => <div id="spinner"></div>) // eslint-disable-next-line @typescript-eslint/no-explicit-any jest.mock('components/Content/Content', () => (props: any) => ( <div id="content">{props.children}</div> @@ -56,11 +54,10 @@ jest.mock('react-router-dom', () => ({ useLocation: jest.fn().mockReturnValue({ state: { selectionCompleted: true }, }), + useHistory: () => jest.fn(), })) describe('SingleEcogesture component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - it('should be rendered correctly', async () => { const store = mockStore({ ecolyo: { @@ -70,7 +67,6 @@ describe('SingleEcogesture component', () => { }) mockgetEcogesturesByIds.mockResolvedValue([ecogesturesData[0]]) - const wrapper = mount( <Provider store={store}> <SingleEcogesture @@ -81,9 +77,9 @@ describe('SingleEcogesture component', () => { </Provider> ) await waitForComponentToPaint(wrapper) - expect(toJson(wrapper)).toMatchSnapshot() }) + it('should change doing status', async () => { const store = mockStore({ ecolyo: { @@ -106,7 +102,6 @@ describe('SingleEcogesture component', () => { </Provider> ) await waitForComponentToPaint(wrapper) - wrapper.find('.doing-btn').first().simulate('click') await waitForComponentToPaint(wrapper) @@ -135,7 +130,6 @@ describe('SingleEcogesture component', () => { </Provider> ) await waitForComponentToPaint(wrapper) - wrapper.find('.objective-btn').first().simulate('click') await waitForComponentToPaint(wrapper) expect(mockupdateEcogesture).toHaveBeenCalledWith(updatedEcogesture) diff --git a/src/components/Ecogesture/SingleEcogesture.tsx b/src/components/Ecogesture/SingleEcogesture.tsx index d5dad471b750d687e8b8396bc510e18e468ef3d6..2d49b1c0d8eb4314afad4ccecd907e33b907475d 100644 --- a/src/components/Ecogesture/SingleEcogesture.tsx +++ b/src/components/Ecogesture/SingleEcogesture.tsx @@ -1,31 +1,30 @@ -import React, { useState, useEffect, useCallback, useMemo } from 'react' -import './singleEcogesture.scss' -import classNames from 'classnames' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { AppStore } from 'store' -import { useSelector } from 'react-redux' -import useExploration from 'components/Hooks/useExploration' -import { importIconbyId } from 'utils/utils' -import EcogestureService from 'services/ecogesture.service' import IconButton from '@material-ui/core/IconButton' -import Icon from 'cozy-ui/transpiled/react/Icon' -import { Ecogesture } from 'models' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import EfficientyRating from './EfficientyRating' -import defaultIcon from 'assets/icons/visu/ecogesture/default.svg' -import doingEnabledIcon from 'assets/icons/ico/doing-enabled.svg' import doingDisabledIcon from 'assets/icons/ico/doing-disabled.svg' -import objectiveEnabledIcon from 'assets/icons/ico/objective-enabled.svg' +import doingEnabledIcon from 'assets/icons/ico/doing-enabled.svg' import objectiveDisabledIcon from 'assets/icons/ico/objective-disabled.svg' +import objectiveEnabledIcon from 'assets/icons/ico/objective-enabled.svg' +import defaultIcon from 'assets/icons/visu/ecogesture/default.svg' +import classNames from 'classnames' +import ErrorPage from 'components/CommonKit/ErrorPage/ErrorPage' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import Content from 'components/Content/Content' import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' +import useExploration from 'components/Hooks/useExploration' +import Loader from 'components/Loader/Loader' import { useClient } from 'cozy-client' -import ErrorPage from 'components/CommonKit/ErrorPage/ErrorPage' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import { FluidType } from 'enum/fluid.enum' -import { useLocation } from 'react-router-dom' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' import { Location } from 'history' +import { Ecogesture } from 'models' +import React, { useCallback, useEffect, useMemo, useState } from 'react' +import { useSelector } from 'react-redux' +import { useHistory, useLocation } from 'react-router-dom' +import EcogestureService from 'services/ecogesture.service' +import { AppStore } from 'store' +import { importIconbyId } from 'utils/utils' +import EfficientyRating from './EfficientyRating' +import './singleEcogesture.scss' interface SingleEcogestureProps { match: { params: { id: string } } @@ -36,6 +35,7 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ }: SingleEcogestureProps) => { const { t } = useI18n() const client = useClient() + const history = useHistory() const location: Location<any> = useLocation<any>() const [ecogesture, setEcogesture] = useState<Ecogesture>() const [ecogestureIcon, setEcogestureIcon] = useState<string>('') @@ -132,7 +132,7 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ return ( <Content height={headerHeight}> <div className="se-loader-container"> - <StyledSpinner size="5em" fluidType={FluidType.MULTIFLUID} /> + <Loader /> </div> </Content> ) @@ -144,6 +144,7 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ titleKey={t('common.title_ecogesture')} isNotKey={true} displayBackArrow={true} + backFunction={() => history.push('/ecogestures')} /> <Header setHeaderHeight={defineHeaderHeight} @@ -174,7 +175,7 @@ const SingleEcogesture: React.FC<SingleEcogestureProps> = ({ <div className="styled-container"> <div className="long-name text-18-bold">{ecogesture.longName}</div> <div - className={classNames('description text-18-normal-150', { + className={classNames('description text-16-normal-150', { ['block']: isMoreDetail === true, })} > diff --git a/src/components/Ecogesture/__snapshots__/EcogestureView.spec.tsx.snap b/src/components/Ecogesture/__snapshots__/EcogestureView.spec.tsx.snap index ad6c92b1efe5377c455bb714d02db5bfcb985c76..6c9d81778a4947c8740c528210754d92536a5c28 100644 --- a/src/components/Ecogesture/__snapshots__/EcogestureView.spec.tsx.snap +++ b/src/components/Ecogesture/__snapshots__/EcogestureView.spec.tsx.snap @@ -31,7 +31,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` centered={true} className="ecogestures-tabs" onChange={[Function]} - value={2} + value={0} > <ForwardRef(Tabs) TabIndicatorProps={ @@ -58,7 +58,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` } } onChange={[Function]} - value={2} + value={0} > <div className="MuiTabs-root ecogestures-tabs" @@ -81,7 +81,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` > <WithStyles(ForwardRef(Tab)) aria-controls="simple-tabpanel-0" - className="single-tab" + className="single-tab active" fullWidth={false} id="simple-tab-0" indicator={false} @@ -94,13 +94,13 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` </React.Fragment> } onChange={[Function]} - selected={false} + selected={true} textColor="inherit" value={0} > <ForwardRef(Tab) aria-controls="simple-tabpanel-0" - className="single-tab" + className="single-tab active" classes={ Object { "disabled": "Mui-disabled", @@ -126,26 +126,26 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` </React.Fragment> } onChange={[Function]} - selected={false} + selected={true} textColor="inherit" value={0} > <WithStyles(ForwardRef(ButtonBase)) aria-controls="simple-tabpanel-0" - aria-selected={false} - className="MuiTab-root MuiTab-textColorInherit single-tab" + aria-selected={true} + className="MuiTab-root MuiTab-textColorInherit single-tab active Mui-selected" disabled={false} focusRipple={true} id="simple-tab-0" onClick={[Function]} onFocus={[Function]} role="tab" - tabIndex={-1} + tabIndex={0} > <ForwardRef(ButtonBase) aria-controls="simple-tabpanel-0" - aria-selected={false} - className="MuiTab-root MuiTab-textColorInherit single-tab" + aria-selected={true} + className="MuiTab-root MuiTab-textColorInherit single-tab active Mui-selected" classes={ Object { "disabled": "Mui-disabled", @@ -159,12 +159,12 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` onClick={[Function]} onFocus={[Function]} role="tab" - tabIndex={-1} + tabIndex={0} > <button aria-controls="simple-tabpanel-0" - aria-selected={false} - className="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit single-tab" + aria-selected={true} + className="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit single-tab active Mui-selected" disabled={false} id="simple-tab-0" onBlur={[Function]} @@ -180,7 +180,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` onTouchMove={[Function]} onTouchStart={[Function]} role="tab" - tabIndex={-1} + tabIndex={0} type="button" > <span @@ -369,7 +369,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` </WithStyles(ForwardRef(Tab))> <WithStyles(ForwardRef(Tab)) aria-controls="simple-tabpanel-2" - className="single-tab active" + className="single-tab" fullWidth={false} id="simple-tab-2" indicator={false} @@ -382,13 +382,13 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` </React.Fragment> } onChange={[Function]} - selected={true} + selected={false} textColor="inherit" value={2} > <ForwardRef(Tab) aria-controls="simple-tabpanel-2" - className="single-tab active" + className="single-tab" classes={ Object { "disabled": "Mui-disabled", @@ -414,26 +414,26 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` </React.Fragment> } onChange={[Function]} - selected={true} + selected={false} textColor="inherit" value={2} > <WithStyles(ForwardRef(ButtonBase)) aria-controls="simple-tabpanel-2" - aria-selected={true} - className="MuiTab-root MuiTab-textColorInherit single-tab active Mui-selected" + aria-selected={false} + className="MuiTab-root MuiTab-textColorInherit single-tab" disabled={false} focusRipple={true} id="simple-tab-2" onClick={[Function]} onFocus={[Function]} role="tab" - tabIndex={0} + tabIndex={-1} > <ForwardRef(ButtonBase) aria-controls="simple-tabpanel-2" - aria-selected={true} - className="MuiTab-root MuiTab-textColorInherit single-tab active Mui-selected" + aria-selected={false} + className="MuiTab-root MuiTab-textColorInherit single-tab" classes={ Object { "disabled": "Mui-disabled", @@ -447,12 +447,12 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` onClick={[Function]} onFocus={[Function]} role="tab" - tabIndex={0} + tabIndex={-1} > <button aria-controls="simple-tabpanel-2" - aria-selected={true} - className="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit single-tab active Mui-selected" + aria-selected={false} + className="MuiButtonBase-root MuiTab-root MuiTab-textColorInherit single-tab" disabled={false} id="simple-tab-2" onBlur={[Function]} @@ -468,7 +468,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` onTouchMove={[Function]} onTouchStart={[Function]} role="tab" - tabIndex={0} + tabIndex={-1} type="button" > <span @@ -527,10 +527,10 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` className="indicator-tab" classes={ Object { - "colorPrimary": "PrivateTabIndicator-colorPrimary-3", - "colorSecondary": "PrivateTabIndicator-colorSecondary-4", - "root": "PrivateTabIndicator-root-2", - "vertical": "PrivateTabIndicator-vertical-5", + "colorPrimary": "PrivateTabIndicator-colorPrimary-2", + "colorSecondary": "PrivateTabIndicator-colorSecondary-3", + "root": "PrivateTabIndicator-root-1", + "vertical": "PrivateTabIndicator-vertical-4", } } color="secondary" @@ -543,7 +543,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` } > <span - className="PrivateTabIndicator-root-2 PrivateTabIndicator-colorSecondary-4 indicator-tab" + className="PrivateTabIndicator-root-1 PrivateTabIndicator-colorSecondary-3 indicator-tab" style={ Object { "left": 0, @@ -563,11 +563,11 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` > <TabPanel index={0} - value={2} + value={0} > <div aria-labelledby="simple-tab-0" - hidden={true} + hidden={false} id="simple-tabpanel-0" role="tabpanel" > @@ -899,7 +899,7 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` </TabPanel> <TabPanel index={1} - value={2} + value={0} > <div aria-labelledby="simple-tab-1" @@ -1235,11 +1235,11 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` </TabPanel> <TabPanel index={2} - value={2} + value={0} > <div aria-labelledby="simple-tab-2" - hidden={false} + hidden={true} id="simple-tabpanel-2" role="tabpanel" > diff --git a/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap b/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap index 74d690fb4bb3ebbeb961c77fe06678c21f34eb0c..23aaff6f392f44a743614f35dc94f361e2ac6136 100644 --- a/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap +++ b/src/components/Ecogesture/__snapshots__/SingleEcogesture.spec.tsx.snap @@ -23,6 +23,7 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = ` } > <Component + backFunction={[Function]} displayBackArrow={true} isNotKey={true} titleKey="common.title_ecogesture" @@ -87,7 +88,7 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = ` Je baisse le chauffage en mode hors gel lorsque je m'absente plus de 2 jours. </div> <div - className="description text-18-normal-150" + className="description text-16-normal-150" > On se demande parfois si cela vaut le coup de "couper le chauffage" quand on s’absente… dès qu’il s’agit d’un week-end la réponse est « oui sûrement » ! Attention cependant au retour à ne pas faire de la surchauffe ! L’idéal est bien évidemment de régler sa programmation pour que le chauffage se relance quelques heures avant votre retour… </div> diff --git a/src/components/Ecogesture/ecogestureEmptyList.scss b/src/components/Ecogesture/ecogestureEmptyList.scss index 08a6ade8e032f81643da044b480f9e24a7b9eb96..49974c072391ef74e2f70d34753e48d9ea40ea66 100644 --- a/src/components/Ecogesture/ecogestureEmptyList.scss +++ b/src/components/Ecogesture/ecogestureEmptyList.scss @@ -7,20 +7,27 @@ .ec-empty-content { color: $grey-bright; text-align: center; - padding: 0 0.5rem; + padding: 0 1.5rem; + display: flex; + gap: 1rem; + flex-direction: column; + align-items: center; margin: 0 auto; - max-width: 80%; + @media (min-width: $width-phone) { max-width: 45%; } @media (min-width: $width-desktop) { max-width: 35%; } - .text { - margin: 1rem 0; - } + .btn-container { + margin-top: 1rem; display: flex; + gap: 1rem; + button { + margin: 0; + } button.btn2 { margin-left: 1rem; } diff --git a/src/components/Ecogesture/ecogestureList.scss b/src/components/Ecogesture/ecogestureList.scss index 501534cc2b6d0885885cd91ee5164a26d521aa3e..58f38c24f8d9340a9262a223760fbc501f7122e3 100644 --- a/src/components/Ecogesture/ecogestureList.scss +++ b/src/components/Ecogesture/ecogestureList.scss @@ -153,7 +153,7 @@ div.filter-menu { rgba(255, 255, 255, 0.09), rgba(255, 255, 255, 0.09) ), - linear-gradient(180deg, #323339 0%, #25262b 100%); + $grey-linear-gradient-background; border: 1px solid $soft-grey; box-sizing: border-box; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); diff --git a/src/components/Ecogesture/ecogestureModal.scss b/src/components/Ecogesture/ecogestureModal.scss index 6a0b07182a582a57ce43b1b51c80e3605fa7e8b6..1e95283c966cc380368f103f3c025e8d47c8c98e 100644 --- a/src/components/Ecogesture/ecogestureModal.scss +++ b/src/components/Ecogesture/ecogestureModal.scss @@ -78,7 +78,7 @@ #2a2b30 0%, #1b1c22 100% ); - border: 2px solid $blue-40; + border: 1px solid $blue; padding: 1.5rem 0.6rem; border-radius: 50px 1px 50px 1px; text-align: center; @@ -90,7 +90,7 @@ text-align: left; } button.btn-action-launch { - background-color: #58ffff; + background: $blue-radial-gradient; border: none; border-radius: 2px; margin: 1.5rem 0 0; @@ -132,4 +132,4 @@ #accessibility-title { display: none; -} \ No newline at end of file +} diff --git a/src/components/Ecogesture/ecogestureReinitModal.scss b/src/components/Ecogesture/ecogestureReinitModal.scss index a73ec8a1c8f733a2f3253102806b6c692c012ab3..01939fe7946009a67ee1dd35755ebca3c87bd958 100644 --- a/src/components/Ecogesture/ecogestureReinitModal.scss +++ b/src/components/Ecogesture/ecogestureReinitModal.scss @@ -1,28 +1,26 @@ @import '../../styles/base/color'; .eg-reinit-modal { + display: flex; + flex-direction: column; + gap: 1rem; + align-items: center; color: $grey-bright; - margin: 1rem 0; - text-align: center; .title { + text-align: center; color: $white; } .warn-title { color: $orange; margin: 0 0.3rem; } - .text { - margin: 1rem 0; - text-align: left; - } .buttons-container { display: flex; + gap: 1rem; + width: 100%; button { + margin: 0; min-height: 45px; - cursor: pointer; - } - button.btn1 { - margin-right: 1rem; } } } diff --git a/src/components/Ecogesture/ecogestureView.scss b/src/components/Ecogesture/ecogestureView.scss index 9206f18f6160faf74105a212b5c2c27fab9dd00d..4d6106f9e04789dd82d6f8cbefe7092a0206275d 100644 --- a/src/components/Ecogesture/ecogestureView.scss +++ b/src/components/Ecogesture/ecogestureView.scss @@ -18,6 +18,9 @@ justify-content: center; margin: 0 1rem; box-sizing: border-box; + button { + border-radius: 4px 4px 0 0; + } .single-tab { width: 32%; text-transform: initial; @@ -32,5 +35,16 @@ .indicator-tab { background: $gold-shadow; height: 1px; + &::before { + content: ''; + position: absolute; + height: 12px; + left: 10.41%; + right: 10.42%; + bottom: -6px; + background: $gold-shadow; + opacity: 0.35; + filter: blur(10px); + } } } diff --git a/src/components/Ecogesture/singleEcogesture.scss b/src/components/Ecogesture/singleEcogesture.scss index 640b5afaf5c769bd2604849835c2f73c3c3dec07..f6707548e35b190ed48e90f6b6d26527f36b6b9a 100644 --- a/src/components/Ecogesture/singleEcogesture.scss +++ b/src/components/Ecogesture/singleEcogesture.scss @@ -31,6 +31,7 @@ display: flex; .title { color: $soft-grey; + font-weight: 700; } .efficiency { display: flex; @@ -43,24 +44,16 @@ } .styled-container { line-height: 150%; - background: radial-gradient( - 60.65% 30.62% at 50% 3.13%, - #2a2b30 0%, - #1b1c22 100% - ); - border: 3px solid $blue-40; - padding: 1.5rem 0.6rem; - border-radius: 50px 1px 50px 1px; + padding: 1rem; margin: 1.5rem 0 1rem; max-width: 500px; .long-name { text-align: center; - font-weight: bold; color: white; } .description { display: none; - margin: 0.5rem; + margin: 1.5rem 0.5rem 0.5rem 0.5rem; text-align: left; } .block { @@ -74,17 +67,20 @@ } } .buttons-selection { - display: flex; width: 100%; + display: flex; + gap: 0.5rem; justify-content: center; - button.btn-secondary-negative { - height: 45px; - max-width: 160px; - width: 100%; - border-radius: 4px; + button { + margin: 0; + &.btn-secondary-negative { + height: 45px; + max-width: 160px; + width: 100%; + border-radius: 4px; + } } .objective-btn { - margin-right: 0.5rem; span { color: $grey-bright; } diff --git a/src/components/EcogestureForm/EcogestureFormEquipment.tsx b/src/components/EcogestureForm/EcogestureFormEquipment.tsx index 8f0524dbd29ef957a45f40723e1ccb4903861424..4a53fc968dc8c6648572fdeaaa0ab3430a9ac219 100644 --- a/src/components/EcogestureForm/EcogestureFormEquipment.tsx +++ b/src/components/EcogestureForm/EcogestureFormEquipment.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { EcogestureStepForm } from 'enum/ecogestureForm.enum' import { ProfileEcogesture } from 'models/profileEcogesture.model' import { EquipmentType } from 'enum/ecogesture.enum' @@ -83,43 +83,45 @@ const EcogestureFormEquipment: React.FC<EcogestureFormEquipmentProps> = ({ ) return ( - <div className="ecogesture-profile-container"> - <div className={'equipment-form-container'}> - <div className={'equipment-label text-22-normal'}> - {t( - `ecogesture_profile.${EcogestureStepForm[ - EcogestureStepForm.EQUIPMENTS - ].toLowerCase()}.question` - )} - </div> - <div className={'equipment-hint text-16-normal'}> - {t( - `ecogesture_profile.${EcogestureStepForm[ - EcogestureStepForm.EQUIPMENTS - ].toLowerCase()}.hint` - )} - </div> - <div className="icons-container"> - {Object.values(EquipmentType).map((equipment, index) => { - return ( - <label key={index} className={'checkbox-equipment'}> - <input - type={'checkbox'} - value={equipment} - name={equipment.toString()} - onChange={() => handleChange(equipment)} - checked={isChecked(equipment)} - className={ - isChecked(equipment) ? 'item-eq checked' : 'item-eq' - } - /> - <EquipmentIcon - equipment={equipment} - isChecked={answer.includes(equipment)} - /> - </label> - ) - })} + <> + <div className="ecogesture-profile-container"> + <div className={'equipment-form-container'}> + <div className={'equipment-label text-22-normal'}> + {t( + `ecogesture_profile.${EcogestureStepForm[ + EcogestureStepForm.EQUIPMENTS + ].toLowerCase()}.question` + )} + </div> + <div className={'equipment-hint text-16-normal'}> + {t( + `ecogesture_profile.${EcogestureStepForm[ + EcogestureStepForm.EQUIPMENTS + ].toLowerCase()}.hint` + )} + </div> + <div className="icons-container"> + {Object.values(EquipmentType).map((equipment, index) => { + return ( + <label key={index} className={'checkbox-equipment'}> + <input + type={'checkbox'} + value={equipment} + name={equipment.toString()} + onChange={() => handleChange(equipment)} + checked={isChecked(equipment)} + className={ + isChecked(equipment) ? 'item-eq checked' : 'item-eq' + } + /> + <EquipmentIcon + equipment={equipment} + isChecked={answer.includes(equipment)} + /> + </label> + ) + })} + </div> </div> </div> <FormNavigation @@ -129,7 +131,7 @@ const EcogestureFormEquipment: React.FC<EcogestureFormEquipmentProps> = ({ disableNextButton={answer === []} isEcogesture={true} /> - </div> + </> ) } diff --git a/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx b/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx index 7fa2f94474fc34ced9ad17b5605e9a120fe16f28..eab64499cd3bfdfcd56ac1e0e131613a806478bb 100644 --- a/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx +++ b/src/components/EcogestureForm/EcogestureFormSingleChoice.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import classNames from 'classnames' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { EcogestureStepForm } from 'enum/ecogestureForm.enum' import { ProfileEcogesture, diff --git a/src/components/EcogestureForm/EcogestureFormView.tsx b/src/components/EcogestureForm/EcogestureFormView.tsx index 23dda80906d54d6babef45b41a01ca1238e0eba7..2e001b9fc2127c95c2b60a7dd8b8fda4ec4fd2f8 100644 --- a/src/components/EcogestureForm/EcogestureFormView.tsx +++ b/src/components/EcogestureForm/EcogestureFormView.tsx @@ -1,27 +1,26 @@ -import React, { useCallback, useEffect, useState } from 'react' +import Content from 'components/Content/Content' +import EcogestureFormEquipment from 'components/EcogestureForm/EcogestureFormEquipment' +import EcogestureFormSingleChoice from 'components/EcogestureForm/EcogestureFormSingleChoice' +import EcogestureLaunchFormModal from 'components/EcogestureForm/EcogestureLaunchFormModal' import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' -import Content from 'components/Content/Content' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' +import Loader from 'components/Loader/Loader' +import ProfileTypeView from 'components/ProfileType/ProfileTypeView' import { - ProfileEcogestureAnswerType, EcogestureStepForm, + ProfileEcogestureAnswerType, } from 'enum/ecogestureForm.enum' -import EcogestureFormSingleChoice from 'components/EcogestureForm/EcogestureFormSingleChoice' -import EcogestureLaunchFormModal from 'components/EcogestureForm/EcogestureLaunchFormModal' -import EcogestureFormEquipment from 'components/EcogestureForm/EcogestureFormEquipment' +import { Profile } from 'models' import { ProfileEcogesture, ProfileEcogestureAnswer, } from 'models/profileEcogesture.model' -import { Profile } from 'models' +import React, { useCallback, useEffect, useState } from 'react' +import { useSelector } from 'react-redux' +import { useLocation } from 'react-router-dom' import ProfileEcogestureFormService from 'services/profileEcogestureForm.service' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import { FluidType } from 'enum/fluid.enum' +import { AppStore } from 'store' import './ecogestureFormView.scss' -import { useLocation } from 'react-router-dom' -import ProfileTypeView from 'components/ProfileType/ProfileTypeView' const EcogestureFormView: React.FC = () => { const [headerHeight, setHeaderHeight] = useState<number>(0) @@ -92,7 +91,7 @@ const EcogestureFormView: React.FC = () => { return ( <Content height={headerHeight}> <div className="se-loader-container"> - <StyledSpinner size="5em" fluidType={FluidType.MULTIFLUID} /> + <Loader /> </div> </Content> ) diff --git a/src/components/EcogestureForm/__snapshots__/EcogestureFormEquipment.spec.tsx.snap b/src/components/EcogestureForm/__snapshots__/EcogestureFormEquipment.spec.tsx.snap index e4159159d59f8551d5711d9a52186e5022644fa8..ddc81916dc8bfdab84df561049c7ef8387b9ccf8 100644 --- a/src/components/EcogestureForm/__snapshots__/EcogestureFormEquipment.spec.tsx.snap +++ b/src/components/EcogestureForm/__snapshots__/EcogestureFormEquipment.spec.tsx.snap @@ -302,70 +302,88 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = ` </label> </div> </div> - <FormNavigation - disableNextButton={false} - handleNext={[Function]} - handlePrevious={[Function]} - isEcogesture={true} - step={0} + </div> + <FormNavigation + disableNextButton={false} + handleNext={[Function]} + handlePrevious={[Function]} + isEcogesture={true} + step={0} + > + <div + className="profile-navigation" > - <div - className="profile-navigation" + <WithStyles(ForwardRef(Button)) + aria-label="profile_type.accessibility.button_previous" + className="profile-navigation-button" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-profile-back", + } + } + disabled={true} + onClick={[Function]} > - <WithStyles(ForwardRef(Button)) + <ForwardRef(Button) aria-label="profile_type.accessibility.button_previous" className="profile-navigation-button" classes={ Object { - "label": "text-16-normal", - "root": "btn-profile-back", + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-profile-back", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", } } disabled={true} onClick={[Function]} > - <ForwardRef(Button) + <WithStyles(ForwardRef(ButtonBase)) aria-label="profile_type.accessibility.button_previous" - className="profile-navigation-button" - classes={ - Object { - "colorInherit": "MuiButton-colorInherit", - "contained": "MuiButton-contained", - "containedPrimary": "MuiButton-containedPrimary", - "containedSecondary": "MuiButton-containedSecondary", - "containedSizeLarge": "MuiButton-containedSizeLarge", - "containedSizeSmall": "MuiButton-containedSizeSmall", - "disableElevation": "MuiButton-disableElevation", - "disabled": "Mui-disabled", - "endIcon": "MuiButton-endIcon", - "focusVisible": "Mui-focusVisible", - "fullWidth": "MuiButton-fullWidth", - "iconSizeLarge": "MuiButton-iconSizeLarge", - "iconSizeMedium": "MuiButton-iconSizeMedium", - "iconSizeSmall": "MuiButton-iconSizeSmall", - "label": "MuiButton-label text-16-normal", - "outlined": "MuiButton-outlined", - "outlinedPrimary": "MuiButton-outlinedPrimary", - "outlinedSecondary": "MuiButton-outlinedSecondary", - "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", - "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", - "root": "MuiButton-root btn-profile-back", - "sizeLarge": "MuiButton-sizeLarge", - "sizeSmall": "MuiButton-sizeSmall", - "startIcon": "MuiButton-startIcon", - "text": "MuiButton-text", - "textPrimary": "MuiButton-textPrimary", - "textSecondary": "MuiButton-textSecondary", - "textSizeLarge": "MuiButton-textSizeLarge", - "textSizeSmall": "MuiButton-textSizeSmall", - } - } + className="MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled" + component="button" disabled={true} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" onClick={[Function]} + type="button" > - <WithStyles(ForwardRef(ButtonBase)) + <ForwardRef(ButtonBase) aria-label="profile_type.accessibility.button_previous" className="MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } component="button" disabled={true} focusRipple={true} @@ -373,106 +391,106 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = ` onClick={[Function]} type="button" > - <ForwardRef(ButtonBase) + <button aria-label="profile_type.accessibility.button_previous" - className="MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="button" + className="MuiButtonBase-root MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled Mui-disabled" disabled={true} - focusRipple={true} - focusVisibleClassName="Mui-focusVisible" + onBlur={[Function]} onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={-1} type="button" > - <button - aria-label="profile_type.accessibility.button_previous" - className="MuiButtonBase-root MuiButton-root btn-profile-back MuiButton-text profile-navigation-button Mui-disabled Mui-disabled" - disabled={true} - onBlur={[Function]} - onClick={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - tabIndex={-1} - type="button" + <span + className="MuiButton-label text-16-bold" > - <span - className="MuiButton-label text-16-normal" - > - < profile_type.form.button_previous - </span> - </button> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(Button)> - </WithStyles(ForwardRef(Button))> - <WithStyles(ForwardRef(Button)) + < profile_type.form.button_previous + </span> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + <WithStyles(ForwardRef(Button)) + aria-label="profile_type.accessibility.button_next" + className="profile-navigation-button" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-profile-next", + } + } + disabled={false} + onClick={[Function]} + > + <ForwardRef(Button) aria-label="profile_type.accessibility.button_next" className="profile-navigation-button" classes={ Object { - "label": "text-16-normal", - "root": "btn-profile-next rounded", + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-profile-next", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", } } disabled={false} onClick={[Function]} > - <ForwardRef(Button) + <WithStyles(ForwardRef(ButtonBase)) aria-label="profile_type.accessibility.button_next" - className="profile-navigation-button" - classes={ - Object { - "colorInherit": "MuiButton-colorInherit", - "contained": "MuiButton-contained", - "containedPrimary": "MuiButton-containedPrimary", - "containedSecondary": "MuiButton-containedSecondary", - "containedSizeLarge": "MuiButton-containedSizeLarge", - "containedSizeSmall": "MuiButton-containedSizeSmall", - "disableElevation": "MuiButton-disableElevation", - "disabled": "Mui-disabled", - "endIcon": "MuiButton-endIcon", - "focusVisible": "Mui-focusVisible", - "fullWidth": "MuiButton-fullWidth", - "iconSizeLarge": "MuiButton-iconSizeLarge", - "iconSizeMedium": "MuiButton-iconSizeMedium", - "iconSizeSmall": "MuiButton-iconSizeSmall", - "label": "MuiButton-label text-16-normal", - "outlined": "MuiButton-outlined", - "outlinedPrimary": "MuiButton-outlinedPrimary", - "outlinedSecondary": "MuiButton-outlinedSecondary", - "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", - "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", - "root": "MuiButton-root btn-profile-next rounded", - "sizeLarge": "MuiButton-sizeLarge", - "sizeSmall": "MuiButton-sizeSmall", - "startIcon": "MuiButton-startIcon", - "text": "MuiButton-text", - "textPrimary": "MuiButton-textPrimary", - "textSecondary": "MuiButton-textSecondary", - "textSizeLarge": "MuiButton-textSizeLarge", - "textSizeSmall": "MuiButton-textSizeSmall", - } - } + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button" + component="button" disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" onClick={[Function]} + type="button" > - <WithStyles(ForwardRef(ButtonBase)) + <ForwardRef(ButtonBase) aria-label="profile_type.accessibility.button_next" - className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button" + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } component="button" disabled={false} focusRipple={true} @@ -480,83 +498,65 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = ` onClick={[Function]} type="button" > - <ForwardRef(ButtonBase) + <button aria-label="profile_type.accessibility.button_next" - className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="button" + className="MuiButtonBase-root MuiButton-root btn-profile-next MuiButton-text profile-navigation-button" disabled={false} - focusRipple={true} - focusVisibleClassName="Mui-focusVisible" + onBlur={[Function]} onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} type="button" > - <button - aria-label="profile_type.accessibility.button_next" - className="MuiButtonBase-root MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button" - disabled={false} - onBlur={[Function]} - onClick={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - tabIndex={0} - type="button" + <span + className="MuiButton-label text-16-bold" > - <span - className="MuiButton-label text-16-normal" - > - profile_type.form.button_next > - </span> - <WithStyles(memo) + profile_type.form.button_next > + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) center={false} - > - <ForwardRef(TouchRipple) - center={false} - classes={ - Object { - "child": "MuiTouchRipple-child", - "childLeaving": "MuiTouchRipple-childLeaving", - "childPulsate": "MuiTouchRipple-childPulsate", - "ripple": "MuiTouchRipple-ripple", - "ripplePulsate": "MuiTouchRipple-ripplePulsate", - "rippleVisible": "MuiTouchRipple-rippleVisible", - "root": "MuiTouchRipple-root", - } + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", } + } + > + <span + className="MuiTouchRipple-root" > - <span - className="MuiTouchRipple-root" - > - <TransitionGroup - childFactory={[Function]} - component={null} - exit={true} - /> - </span> - </ForwardRef(TouchRipple)> - </WithStyles(memo)> - </button> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(Button)> - </WithStyles(ForwardRef(Button))> - </div> - </FormNavigation> - </div> + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </FormNavigation> </EcogestureFormEquipment> </Provider> `; diff --git a/src/components/EcogestureForm/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap b/src/components/EcogestureForm/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap index e68886b80ccfeafb97303f9ec5c9d7c37560d210..93eafddb3cce92ff89963b43662aca1aa14e3555 100644 --- a/src/components/EcogestureForm/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap +++ b/src/components/EcogestureForm/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap @@ -92,7 +92,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = className="profile-navigation-button" classes={ Object { - "label": "text-16-normal", + "label": "text-16-bold", "root": "btn-profile-back", } } @@ -118,7 +118,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = "iconSizeLarge": "MuiButton-iconSizeLarge", "iconSizeMedium": "MuiButton-iconSizeMedium", "iconSizeSmall": "MuiButton-iconSizeSmall", - "label": "MuiButton-label text-16-normal", + "label": "MuiButton-label text-16-bold", "outlined": "MuiButton-outlined", "outlinedPrimary": "MuiButton-outlinedPrimary", "outlinedSecondary": "MuiButton-outlinedSecondary", @@ -185,7 +185,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = type="button" > <span - className="MuiButton-label text-16-normal" + className="MuiButton-label text-16-bold" > < profile_type.form.button_previous </span> @@ -199,8 +199,8 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = className="profile-navigation-button disabled" classes={ Object { - "label": "text-16-normal", - "root": "btn-profile-next rounded", + "label": "text-16-bold", + "root": "btn-profile-next", } } disabled={true} @@ -225,13 +225,13 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = "iconSizeLarge": "MuiButton-iconSizeLarge", "iconSizeMedium": "MuiButton-iconSizeMedium", "iconSizeSmall": "MuiButton-iconSizeSmall", - "label": "MuiButton-label text-16-normal", + "label": "MuiButton-label text-16-bold", "outlined": "MuiButton-outlined", "outlinedPrimary": "MuiButton-outlinedPrimary", "outlinedSecondary": "MuiButton-outlinedSecondary", "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", - "root": "MuiButton-root btn-profile-next rounded", + "root": "MuiButton-root btn-profile-next", "sizeLarge": "MuiButton-sizeLarge", "sizeSmall": "MuiButton-sizeSmall", "startIcon": "MuiButton-startIcon", @@ -247,7 +247,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = > <WithStyles(ForwardRef(ButtonBase)) aria-label="profile_type.accessibility.button_next" - className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled" + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled" component="button" disabled={true} focusRipple={true} @@ -257,7 +257,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = > <ForwardRef(ButtonBase) aria-label="profile_type.accessibility.button_next" - className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled" + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled" classes={ Object { "disabled": "Mui-disabled", @@ -274,7 +274,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = > <button aria-label="profile_type.accessibility.button_next" - className="MuiButtonBase-root MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled Mui-disabled" + className="MuiButtonBase-root MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled Mui-disabled" disabled={true} onBlur={[Function]} onClick={[Function]} @@ -292,7 +292,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] = type="button" > <span - className="MuiButton-label text-16-normal" + className="MuiButton-label text-16-bold" > profile_type.form.button_next > </span> diff --git a/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap b/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap index 3caf0d88608e85810999a00c625118971598c111..70dd31dc953e82bf248058ae95601460c421e3ee 100644 --- a/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap +++ b/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap @@ -103,7 +103,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` className="profile-navigation-button" classes={ Object { - "label": "text-16-normal", + "label": "text-16-bold", "root": "btn-profile-back", } } @@ -129,7 +129,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` "iconSizeLarge": "MuiButton-iconSizeLarge", "iconSizeMedium": "MuiButton-iconSizeMedium", "iconSizeSmall": "MuiButton-iconSizeSmall", - "label": "MuiButton-label text-16-normal", + "label": "MuiButton-label text-16-bold", "outlined": "MuiButton-outlined", "outlinedPrimary": "MuiButton-outlinedPrimary", "outlinedSecondary": "MuiButton-outlinedSecondary", @@ -196,7 +196,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` type="button" > <span - className="MuiButton-label text-16-normal" + className="MuiButton-label text-16-bold" > < profile_type.form.button_previous </span> @@ -210,8 +210,8 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` className="profile-navigation-button disabled" classes={ Object { - "label": "text-16-normal", - "root": "btn-profile-next rounded", + "label": "text-16-bold", + "root": "btn-profile-next", } } disabled={true} @@ -236,13 +236,13 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` "iconSizeLarge": "MuiButton-iconSizeLarge", "iconSizeMedium": "MuiButton-iconSizeMedium", "iconSizeSmall": "MuiButton-iconSizeSmall", - "label": "MuiButton-label text-16-normal", + "label": "MuiButton-label text-16-bold", "outlined": "MuiButton-outlined", "outlinedPrimary": "MuiButton-outlinedPrimary", "outlinedSecondary": "MuiButton-outlinedSecondary", "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", - "root": "MuiButton-root btn-profile-next rounded", + "root": "MuiButton-root btn-profile-next", "sizeLarge": "MuiButton-sizeLarge", "sizeSmall": "MuiButton-sizeSmall", "startIcon": "MuiButton-startIcon", @@ -258,7 +258,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` > <WithStyles(ForwardRef(ButtonBase)) aria-label="profile_type.accessibility.button_next" - className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled" + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled" component="button" disabled={true} focusRipple={true} @@ -268,7 +268,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` > <ForwardRef(ButtonBase) aria-label="profile_type.accessibility.button_next" - className="MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled" + className="MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled" classes={ Object { "disabled": "Mui-disabled", @@ -285,7 +285,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` > <button aria-label="profile_type.accessibility.button_next" - className="MuiButtonBase-root MuiButton-root btn-profile-next rounded MuiButton-text profile-navigation-button disabled Mui-disabled Mui-disabled" + className="MuiButtonBase-root MuiButton-root btn-profile-next MuiButton-text profile-navigation-button disabled Mui-disabled Mui-disabled" disabled={true} onBlur={[Function]} onClick={[Function]} @@ -303,7 +303,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = ` type="button" > <span - className="MuiButton-label text-16-normal" + className="MuiButton-label text-16-bold" > profile_type.form.button_next > </span> diff --git a/src/components/EcogestureForm/ecogestureFormSingleChoice.scss b/src/components/EcogestureForm/ecogestureFormSingleChoice.scss index 48c3d4c9dc5ccd82e7a6ac81a655847e9a09550b..1afea74c1b4db91656df55458e5cc0d5a3f43880 100644 --- a/src/components/EcogestureForm/ecogestureFormSingleChoice.scss +++ b/src/components/EcogestureForm/ecogestureFormSingleChoice.scss @@ -2,13 +2,19 @@ @import '../../styles/base/breakpoint'; .ecogesture-profile-container { - position: relative; - height: 100%; - min-height: inherit; + overflow-y: scroll; display: flex; - justify-content: center; + flex-direction: column; + flex: 1; + justify-content: space-between; + + // 100 -header -navigation -bottom -navbar + height: calc(100vh - 60px - 72px - 56px); + @media (min-width: $width-large-phone) { + // 100 -cozyBar -header -navigation -bottom -navbar + height: calc(100vh - 48px - 148px - 72px - 0px); + } .ecogesture-form-single { - width: 100%; max-width: 53rem; color: $white; margin: 1rem 1rem 3.5rem; diff --git a/src/components/EcogestureSelection/EcogestureSelection.tsx b/src/components/EcogestureSelection/EcogestureSelection.tsx index 43a2b0c6f22ae2e628fb18eeac557f28a06aaee9..1dd8fb2d7723aa408fd5c8e04bb628e1f9abb811 100644 --- a/src/components/EcogestureSelection/EcogestureSelection.tsx +++ b/src/components/EcogestureSelection/EcogestureSelection.tsx @@ -1,25 +1,26 @@ -import React, { useCallback, useEffect, useMemo, useState } from 'react' -import './ecogestureSelection.scss' -import { ProfileEcogesture } from 'models/profileEcogesture.model' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' +import Content from 'components/Content/Content' +import EcogestureSelectionDetail from 'components/EcogestureSelection/EcogestureSelectionDetail' +import EcogestureSelectionEnd from 'components/EcogestureSelection/EcogestureSelectionEnd' +import EcogestureSelectionModal from 'components/EcogestureSelection/EcogestureSelectionModal' +import EcogestureSelectionRestart from 'components/EcogestureSelection/EcogestureSelectionRestart' +import CozyBar from 'components/Header/CozyBar' +import Header from 'components/Header/Header' +import Loader from 'components/Loader/Loader' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { Ecogesture } from 'models' -import CozyBar from 'components/Header/CozyBar' -import Header from 'components/Header/Header' -import Content from 'components/Content/Content' +import { ProfileEcogesture } from 'models/profileEcogesture.model' +import React, { useCallback, useEffect, useMemo, useState } from 'react' +import { useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' import EcogestureService from 'services/ecogesture.service' -import EcogestureSelectionModal from 'components/EcogestureSelection/EcogestureSelectionModal' -import EcogestureSelectionDetail from 'components/EcogestureSelection/EcogestureSelectionDetail' -import EcogestureSelectionRestart from 'components/EcogestureSelection/EcogestureSelectionRestart' -import EcogestureSelectionEnd from 'components/EcogestureSelection/EcogestureSelectionEnd' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import { FluidType } from 'enum/fluid.enum' +import { AppStore } from 'store' +import './ecogestureSelection.scss' const EcogestureSelection: React.FC = () => { const { t } = useI18n() const client = useClient() + const history = useHistory() const [isLoading, setIsLoading] = useState(true) const [headerHeight, setHeaderHeight] = useState<number>(0) const [indexEcogesture, setIndexEcogesture] = useState<number>(0) @@ -63,7 +64,7 @@ const EcogestureSelection: React.FC = () => { const updatedList: Ecogesture[] = ecogestureList updatedList[indexEcogesture] = updatedEcogesture setEcogestureList(updatedList) - setIndexEcogesture((prev) => prev + 1) + setIndexEcogesture(prev => prev + 1) }, [ecogestureList, ecogestureService, indexEcogesture] ) @@ -115,7 +116,7 @@ const EcogestureSelection: React.FC = () => { return ( <Content height={headerHeight}> <div className="eg-selection-loader"> - <StyledSpinner size="5em" fluidType={FluidType.MULTIFLUID} /> + <Loader /> </div> </Content> ) @@ -126,15 +127,14 @@ const EcogestureSelection: React.FC = () => { <CozyBar titleKey={t('common.title_ecogestures_choice')} isNotKey={true} - displayBackArrow={indexEcogesture === 0 ? false : true} - backFunction={() => setIndexEcogesture((prev) => prev - 1)} + displayBackArrow={true} + backFunction={() => history.push('/ecogestures')} /> <Header setHeaderHeight={defineHeaderHeight} desktopTitleKey={t('common.title_ecogestures_choice')} - displayBackArrow={indexEcogesture === 0 ? false : true} + displayBackArrow={true} isNotKey={true} - backFunction={() => setIndexEcogesture((prev) => prev - 1)} > <div className="eg-selection-header"> {indexEcogesture <= ecogestureList.length - 1 diff --git a/src/components/EcogestureSelection/EcogestureSelectionDetail.spec.tsx b/src/components/EcogestureSelection/EcogestureSelectionDetail.spec.tsx index b3503365c5ff2d2eed4b8b788b18af26c627cdb8..5b8e36a2047a075b2e62837bf748dbf4791d1683 100644 --- a/src/components/EcogestureSelection/EcogestureSelectionDetail.spec.tsx +++ b/src/components/EcogestureSelection/EcogestureSelectionDetail.spec.tsx @@ -37,6 +37,7 @@ describe('EcogestureSelectionDetail component', () => { <EcogestureSelectionDetail ecogesture={ecogesturesData[0]} validate={mockValidate} + title={ecogesturesData[0].shortName} /> ) await waitForComponentToPaint(wrapper) @@ -49,6 +50,7 @@ describe('EcogestureSelectionDetail component', () => { <EcogestureSelectionDetail ecogesture={ecogesturesData[0]} validate={mockValidate} + title={ecogesturesData[0].shortName} /> ) wrapper.find(Button).at(0).simulate('click') @@ -62,6 +64,7 @@ describe('EcogestureSelectionDetail component', () => { <EcogestureSelectionDetail ecogesture={ecogesturesData[0]} validate={mockValidate} + title={ecogesturesData[0].shortName} /> ) wrapper.find(Button).at(1).simulate('click') @@ -75,6 +78,7 @@ describe('EcogestureSelectionDetail component', () => { <EcogestureSelectionDetail ecogesture={ecogesturesData[0]} validate={mockValidate} + title={ecogesturesData[0].shortName} /> ) wrapper.find(Button).at(2).simulate('click') diff --git a/src/components/EcogestureSelection/EcogestureSelectionEnd.tsx b/src/components/EcogestureSelection/EcogestureSelectionEnd.tsx index 13a515bc70c3dda147ad62af835f1f2c7bc3418e..5bfd2f9b896f94ab42ed0cbbb9fa75342c8c00a8 100644 --- a/src/components/EcogestureSelection/EcogestureSelectionEnd.tsx +++ b/src/components/EcogestureSelection/EcogestureSelectionEnd.tsx @@ -16,7 +16,7 @@ const EcogestureSelectionEnd: React.FC = () => { return ( <div className="eg-selection-end-container"> <div className="content"> - <div className="title text-21-bold"> + <div className="title text-28-bold"> {t('ecogesture_selection.title_final')} </div> <StyledIcon icon={icon} size={120} /> diff --git a/src/components/EcogestureSelection/EcogestureSelectionRestart.tsx b/src/components/EcogestureSelection/EcogestureSelectionRestart.tsx index e8058004449d08f5219e4fe420a27bb70afaf2ef..d5178c08d8fd1cef700043178c4be516345ae81c 100644 --- a/src/components/EcogestureSelection/EcogestureSelectionRestart.tsx +++ b/src/components/EcogestureSelection/EcogestureSelectionRestart.tsx @@ -27,7 +27,7 @@ const EcogestureSelectionRestart: React.FC<EcogestureSelectionRestartProps> = ({ <div className="content"> <div className="title text-21-bold"> {t('ecogesture_selection.title', { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase smart_count: listLength, })} </div> diff --git a/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap b/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap index 7bf5a2890a74340c966a3baadba5fb0b89517315..5680d8025e4e8999108f259e115c2fe00035c465 100644 --- a/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap +++ b/src/components/EcogestureSelection/__snapshots__/EcogestureSelection.spec.tsx.snap @@ -16,14 +16,13 @@ exports[`EcogestureSelection component should be rendered correctly 1`] = ` <EcogestureSelection> <mock-cozybar backFunction={[Function]} - displayBackArrow={false} + displayBackArrow={true} isNotKey={true} titleKey="common.title_ecogestures_choice" /> <mock-header - backFunction={[Function]} desktopTitleKey="common.title_ecogestures_choice" - displayBackArrow={false} + displayBackArrow={true} isNotKey={true} setHeaderHeight={[Function]} > diff --git a/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap b/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap index b75cf8e8a6fc00a05347245c6640bc9071ba725d..13d309ddfbb17765cde97b784c6f2f7bc7e221d6 100644 --- a/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap +++ b/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap @@ -35,6 +35,7 @@ exports[`EcogestureSelectionDetail component should be rendered correctly 1`] = "viewedInSelection": false, } } + title="Bonhomme de neige" validate={[MockFunction]} > <div @@ -78,7 +79,9 @@ exports[`EcogestureSelectionDetail component should be rendered correctly 1`] = </StyledIcon> <div className="text-22 title" - /> + > + Bonhomme de neige + </div> <div className="text text-18-bold" > diff --git a/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionEnd.spec.tsx.snap b/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionEnd.spec.tsx.snap index 82c3300b01227f80f3275354e41b5bb8886c52b0..4e0248f1f278b5686a66e12daf41c7bfa28ab2bc 100644 --- a/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionEnd.spec.tsx.snap +++ b/src/components/EcogestureSelection/__snapshots__/EcogestureSelectionEnd.spec.tsx.snap @@ -9,7 +9,7 @@ exports[`EcogestureSelectionEnd component should be rendered correctly 1`] = ` className="content" > <div - className="title text-21-bold" + className="title text-28-bold" > ecogesture_selection.title_final </div> diff --git a/src/components/EcogestureSelection/ecogestureSelectionDetail.scss b/src/components/EcogestureSelection/ecogestureSelectionDetail.scss index 2ef624130480c5ac35b124dd23587eabf102dc99..c680eaa3788c672a2073a55a949642a0b89861f0 100644 --- a/src/components/EcogestureSelection/ecogestureSelectionDetail.scss +++ b/src/components/EcogestureSelection/ecogestureSelectionDetail.scss @@ -18,15 +18,18 @@ } .content { display: flex; + gap: 0.5rem; flex-direction: column; flex: 1; justify-content: center; align-items: center; + + .title { + color: $soft-grey; + font-weight: 700; + } + .icon { - margin: 5rem 0 0; - @media #{$large-phone} { - margin: 1rem 0 0; - } @media #{$phone} { width: 50%; height: 50%; @@ -36,6 +39,7 @@ height: 30%; } } + .text { min-height: 4.875rem; display: flex; @@ -46,14 +50,15 @@ .buttons { margin: 1rem 0; display: flex; + gap: 0.5rem; flex-direction: row; justify-content: center; width: 100%; button.btn-secondary-negative { + margin: 0; padding: 0.75rem 0.25rem; - margin: 0 0.25rem; height: 7.375rem; - width: 6.5rem; + border: 1px solid $grey-bright; border-radius: 0.25rem; &:focus, &.active, @@ -71,8 +76,4 @@ background: transparent; } } - - .title { - color: $soft-grey; - } } diff --git a/src/components/EcogestureSelection/ecogestureSelectionEnd.scss b/src/components/EcogestureSelection/ecogestureSelectionEnd.scss index 1d9d3315659a459553e3761f34ac572c1d4f64b4..803a4b3aded9e9120c63c703f13e11cefde0c142 100644 --- a/src/components/EcogestureSelection/ecogestureSelectionEnd.scss +++ b/src/components/EcogestureSelection/ecogestureSelectionEnd.scss @@ -20,6 +20,7 @@ display: flex; flex-direction: column; flex: 1; + gap: 1rem; justify-content: center; align-items: center; .title { @@ -29,9 +30,6 @@ margin: 5rem; } } - .text { - margin-top: 1rem; - } } .buttons { margin: 1rem 0; diff --git a/src/components/Exploration/ExplorationOngoing.tsx b/src/components/Exploration/ExplorationOngoing.tsx index 7ca4c8a1f94fd298f8ec70f379444307164761a9..6c8ab6bcc80a95c26d66c266f1547c6a40eb56d6 100644 --- a/src/components/Exploration/ExplorationOngoing.tsx +++ b/src/components/Exploration/ExplorationOngoing.tsx @@ -16,7 +16,7 @@ import { } from 'enum/userExploration.enum' import ChallengeService from 'services/challenge.service' import { updateUserChallengeList } from 'store/challenge/challenge.actions' -import explorationIcon from 'assets/icons/visu/exploration/validMark.svg' +import explorationIcon from 'assets/icons/visu/exploration/shield.svg' import UsageEventService from 'services/usageEvent.service' import { UsageEventType } from 'enum/usageEvent.enum' diff --git a/src/components/Exploration/ExplorationView.spec.tsx b/src/components/Exploration/ExplorationView.spec.tsx index af8c18175b1be1c10018d36a4e447df74aaddaf1..8852f059e2fff1c9677acb69e7d37c964573d039 100644 --- a/src/components/Exploration/ExplorationView.spec.tsx +++ b/src/components/Exploration/ExplorationView.spec.tsx @@ -3,7 +3,6 @@ import { shallow } from 'enzyme' import * as reactRedux from 'react-redux' import ExplorationView from './ExplorationView' import { userChallengeData } from '../../../tests/__mocks__/userChallengeData.mock' -import { UserQuizState } from 'enum/userQuiz.enum' import { challengeStateData } from '../../../tests/__mocks__/challengeStateData.mock' import ExplorationFinished from './ExplorationFinished' import ExplorationError from './ExplorationError' diff --git a/src/components/Exploration/explorationFinished.scss b/src/components/Exploration/explorationFinished.scss index 4a16d89fdc7f19f43b105064559cdd2306aca6e7..b9110a27750cbd096ec0b1a42ace2718736c33a0 100644 --- a/src/components/Exploration/explorationFinished.scss +++ b/src/components/Exploration/explorationFinished.scss @@ -6,15 +6,15 @@ flex-direction: column; justify-content: center; align-items: center; - margin: 4rem auto 0; + margin: auto; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; color: $white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; width: 80%; text-align: center; - padding: 0.5rem 1rem 1rem; + padding: 1rem 1.5rem 1rem; font-size: 1.1rem; font-weight: 700; @media (min-width: $width-tablet) { diff --git a/src/components/Exploration/explorationOngoing.scss b/src/components/Exploration/explorationOngoing.scss index 8d1e55337cf1efd4a67abf4d4bf74e09c41bdbc2..81ebd1521a1d8db3531a78809ec51586a8e08fb9 100644 --- a/src/components/Exploration/explorationOngoing.scss +++ b/src/components/Exploration/explorationOngoing.scss @@ -6,21 +6,25 @@ flex-direction: column; justify-content: center; align-items: center; + margin: auto; + padding: 1.5rem; } .exploration-begin-container { display: flex; flex-direction: column; align-items: center; justify-content: space-around; - margin: 2rem 1rem; - padding: 1rem; + padding: 2rem 1rem 1.5rem; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; color: $white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); - height: 70vh; - width: 80%; + background: $grey-linear-gradient-background; + + svg { + margin-top: -33%; + } + text-align: center; @media (min-width: $width-large-phone) { width: 60%; @@ -52,11 +56,13 @@ } .button-start { margin-top: 0; + width: 100%; button.btn-secondary-negative { margin: 0; } } .stars { + margin-top: 1rem; svg { margin-right: 0.25rem; } diff --git a/src/components/Export/__snapshots__/exportDoneModal.spec.tsx.snap b/src/components/Export/__snapshots__/exportDoneModal.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..70ad61389e74a45d53df715e76902c98197a563e --- /dev/null +++ b/src/components/Export/__snapshots__/exportDoneModal.spec.tsx.snap @@ -0,0 +1,1033 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`exportDoneModal component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <ExportDoneModal + error={false} + handleCloseClick={[MockFunction]} + open={true} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={false} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + export.modal_done.accessibility_title + </div> + <div + class="modal-done-root" + > + <div> + <button + aria-label="export.button_close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="18" + width="18" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + <div + class="content" + > + <div + class="icon-main" + > + <svg + class="styles__icon___23x3R" + height="44" + width="44" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </div> + <div + class="text-16-bold text text1" + > + export.modal_done.text1 + </div> + <div + class="text-16-normal text" + > + export.modal_done.text2 + </div> + <button + aria-label="export.modal_done.button_close" + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + tabindex="0" + type="submit" + > + <span + class="MuiButton-label text-16-bold" + > + export.modal_done.button_close + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + export.modal_done.accessibility_title + </div> + <div + className="modal-done-root" + > + <div + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(IconButton)) + aria-label="export.button_close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="export.button_close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="export.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="export.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="export.button_close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={18} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={18} + style={Object {}} + width={18} + > + <svg + className="styles__icon___23x3R" + height={18} + style={Object {}} + width={18} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </div> + <div + className="content" + > + <div + className="icon-main" + > + <Icon + icon="test-file-stub" + size={44} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={44} + style={Object {}} + width={44} + > + <svg + className="styles__icon___23x3R" + height={44} + style={Object {}} + width={44} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </div> + <div + className="text-16-bold text text1" + > + export.modal_done.text1 + </div> + <div + className="text-16-normal text" + > + export.modal_done.text2 + </div> + <WithStyles(ForwardRef(Button)) + aria-label="export.modal_done.button_close" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[MockFunction]} + type="submit" + > + <ForwardRef(Button) + aria-label="export.modal_done.button_close" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + type="submit" + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="export.modal_done.button_close" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="submit" + > + <ForwardRef(ButtonBase) + aria-label="export.modal_done.button_close" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="submit" + > + <button + aria-label="export.modal_done.button_close" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="submit" + > + <span + className="MuiButton-label text-16-bold" + > + export.modal_done.button_close + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </ExportDoneModal> +</Provider> +`; diff --git a/src/components/Export/__snapshots__/exportLoadingModal.spec.tsx.snap b/src/components/Export/__snapshots__/exportLoadingModal.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..85084920c8a51db720125b84c069375038a7d6ee --- /dev/null +++ b/src/components/Export/__snapshots__/exportLoadingModal.spec.tsx.snap @@ -0,0 +1,1044 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ExportLoadingModal component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <ExportLoadingModal + handleCloseClick={[MockFunction]} + handleDone={[MockFunction]} + open={true} + selectedFluids={ + Array [ + 0, + 1, + 2, + ] + } + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + onClose={[Function]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + onClose={[Function]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={false} + onClose={[Function]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + export.modal_loading.accessibility_title + </div> + <div + class="modal-loading-root" + > + <div> + <button + aria-label="export.button_close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="18" + width="18" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + <div + class="content" + > + <div + class="icon-main" + > + <div + aria-busy="true" + aria-label="common.accessibility.loading" + class="loader gold" + title="common.accessibility.loading" + > + <div + class="bar" + /> + <div + class="bar" + /> + <div + class="bar" + /> + </div> + </div> + <div + class="text-16-bold text text1" + > + export.modal_loading.text1 + </div> + <div + class="text-16-normal text" + > + export.modal_loading.text2 + </div> + <button + aria-label="export.modal_loading.button_cancel" + class="MuiButtonBase-root MuiButton-root btn-secondary-negative MuiButton-text" + tabindex="0" + type="submit" + > + <span + class="MuiButton-label text-16-bold" + > + export.modal_loading.button_cancel + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + export.modal_loading.accessibility_title + </div> + <div + className="modal-loading-root" + > + <div + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(IconButton)) + aria-label="export.button_close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="export.button_close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="export.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="export.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="export.button_close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={18} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={18} + style={Object {}} + width={18} + > + <svg + className="styles__icon___23x3R" + height={18} + style={Object {}} + width={18} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </div> + <div + className="content" + > + <div + className="icon-main" + > + <Loader + color="gold" + > + <div + aria-busy="true" + aria-label="common.accessibility.loading" + className="loader gold" + title="common.accessibility.loading" + > + <div + className="bar" + /> + <div + className="bar" + /> + <div + className="bar" + /> + </div> + </Loader> + </div> + <div + className="text-16-bold text text1" + > + export.modal_loading.text1 + </div> + <div + className="text-16-normal text" + > + export.modal_loading.text2 + </div> + <WithStyles(ForwardRef(Button)) + aria-label="export.modal_loading.button_cancel" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-secondary-negative", + } + } + onClick={[Function]} + type="submit" + > + <ForwardRef(Button) + aria-label="export.modal_loading.button_cancel" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-secondary-negative", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + type="submit" + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="export.modal_loading.button_cancel" + className="MuiButton-root btn-secondary-negative MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="submit" + > + <ForwardRef(ButtonBase) + aria-label="export.modal_loading.button_cancel" + className="MuiButton-root btn-secondary-negative MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="submit" + > + <button + aria-label="export.modal_loading.button_cancel" + className="MuiButtonBase-root MuiButton-root btn-secondary-negative MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="submit" + > + <span + className="MuiButton-label text-16-bold" + > + export.modal_loading.button_cancel + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </ExportLoadingModal> +</Provider> +`; diff --git a/src/components/Export/__snapshots__/exportStartModal.spec.tsx.snap b/src/components/Export/__snapshots__/exportStartModal.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..543ec790c3bae74ee027b6467aec960754a79ed3 --- /dev/null +++ b/src/components/Export/__snapshots__/exportStartModal.spec.tsx.snap @@ -0,0 +1,1193 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`exportStartModal component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <ExportStartModal + handleCloseClick={[MockFunction]} + handleDownloadClick={[MockFunction]} + open={true} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility_title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility_title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={false} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility_title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + export.modal_start.accessibility_title + </div> + <div + class="modal-start-root" + > + <div> + <button + aria-label="export.button_close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="18" + width="18" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + <div + class="content" + > + <div + class="icon-main" + > + <svg + class="styles__icon___23x3R" + height="48" + width="48" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </div> + <div + class="text-16-bold text text1" + > + export.modal_start.text1 + </div> + <div + class="text-16-normal text" + > + export.modal_start.text2 + <br /> + export.modal_start.text3 + </div> + <div + class="buttons" + > + <button + aria-label="export.modal_start.button_cancel" + class="MuiButtonBase-root MuiButton-root btn-secondary-negative MuiButton-text" + tabindex="0" + type="submit" + > + <span + class="MuiButton-label text-16-bold" + > + export.modal_start.button_cancel + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <button + aria-label="export.button_download" + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + tabindex="0" + type="submit" + > + <span + class="MuiButton-label text-16-bold" + > + export.button_download + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility_title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility_title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility_title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + export.modal_start.accessibility_title + </div> + <div + className="modal-start-root" + > + <div + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(IconButton)) + aria-label="export.button_close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="export.button_close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="export.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="export.button_close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="export.button_close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={18} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={18} + style={Object {}} + width={18} + > + <svg + className="styles__icon___23x3R" + height={18} + style={Object {}} + width={18} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </div> + <div + className="content" + > + <div + className="icon-main" + > + <Icon + icon="test-file-stub" + size={48} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={48} + style={Object {}} + width={48} + > + <svg + className="styles__icon___23x3R" + height={48} + style={Object {}} + width={48} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </div> + <div + className="text-16-bold text text1" + > + export.modal_start.text1 + </div> + <div + className="text-16-normal text" + > + export.modal_start.text2 + <br /> + export.modal_start.text3 + </div> + <div + className="buttons" + > + <WithStyles(ForwardRef(Button)) + aria-label="export.modal_start.button_cancel" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-secondary-negative", + } + } + onClick={[MockFunction]} + type="submit" + > + <ForwardRef(Button) + aria-label="export.modal_start.button_cancel" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-secondary-negative", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + type="submit" + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="export.modal_start.button_cancel" + className="MuiButton-root btn-secondary-negative MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="submit" + > + <ForwardRef(ButtonBase) + aria-label="export.modal_start.button_cancel" + className="MuiButton-root btn-secondary-negative MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="submit" + > + <button + aria-label="export.modal_start.button_cancel" + className="MuiButtonBase-root MuiButton-root btn-secondary-negative MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="submit" + > + <span + className="MuiButton-label text-16-bold" + > + export.modal_start.button_cancel + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + <WithStyles(ForwardRef(Button)) + aria-label="export.button_download" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[MockFunction]} + type="submit" + > + <ForwardRef(Button) + aria-label="export.button_download" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + type="submit" + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="export.button_download" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="submit" + > + <ForwardRef(ButtonBase) + aria-label="export.button_download" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="submit" + > + <button + aria-label="export.button_download" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="submit" + > + <span + className="MuiButton-label text-16-bold" + > + export.button_download + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </ExportStartModal> +</Provider> +`; diff --git a/src/components/Export/exportDoneModal.scss b/src/components/Export/exportDoneModal.scss new file mode 100644 index 0000000000000000000000000000000000000000..10ed1cd2819fc8d64d6c5a3c661a306feace376e --- /dev/null +++ b/src/components/Export/exportDoneModal.scss @@ -0,0 +1,22 @@ +@import 'src/styles/base/color'; + +.modal-done-root { + .content { + text-align: center; + padding-top: 2rem; + .text { + margin: 2rem 0 0; + color: $grey-bright; + } + .text1 { + margin-bottom: 2rem; + color: $gold-shadow; + } + .error1 { + color: $red-primary; + } + button { + height: 40px; + } + } +} diff --git a/src/components/Export/exportDoneModal.spec.tsx b/src/components/Export/exportDoneModal.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3cedb4649cc8a0e35800b3d50fad817fab7b45a6 --- /dev/null +++ b/src/components/Export/exportDoneModal.spec.tsx @@ -0,0 +1,68 @@ +import React from 'react' +import { Provider } from 'react-redux' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { Button } from '@material-ui/core' +import ExportDoneModal from 'components/Export/exportDoneModal' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +const mockHandleClose = jest.fn() + +describe('exportDoneModal component', () => { + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + }) + + it('should be rendered correctly', () => { + const wrapper = mount( + <Provider store={store}> + <ExportDoneModal + open={true} + error={false} + handleCloseClick={mockHandleClose} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + it('should display error message', () => { + const wrapper = mount( + <Provider store={store}> + <ExportDoneModal + open={true} + error={true} + handleCloseClick={mockHandleClose} + /> + </Provider> + ) + }) + + it('should close modal ', () => { + const wrapper = mount( + <Provider store={store}> + <ExportDoneModal + open={true} + error={false} + handleCloseClick={mockHandleClose} + /> + </Provider> + ) + wrapper.find(Button).first().simulate('click') + expect(mockHandleClose).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/components/Export/exportDoneModal.tsx b/src/components/Export/exportDoneModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6de9ff9ce3c7632d6cc0f7e94b9581408027ae82 --- /dev/null +++ b/src/components/Export/exportDoneModal.tsx @@ -0,0 +1,93 @@ +import React from 'react' +import './exportDoneModal.scss' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Dialog from '@material-ui/core/Dialog' +import CloseIcon from 'assets/icons/ico/close.svg' +import { Button, IconButton } from '@material-ui/core' +import Icon from 'cozy-ui/transpiled/react/Icon' +import exportDone from 'assets/icons/ico/exportDone.svg' +import warnCross from 'assets/icons/ico/warn-cross.svg' + +interface ExportDoneModalProps { + open: boolean + error: boolean + handleCloseClick: () => void +} + +const ExportDoneModal: React.FC<ExportDoneModalProps> = ({ + open, + error, + handleCloseClick, +}: ExportDoneModalProps) => { + const { t } = useI18n() + + return ( + <Dialog + open={open} + onClose={handleCloseClick} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + > + <div id={'accessibility-title'}> + {t('export.modal_done.accessibility_title')} + </div> + + <div className="modal-done-root"> + <div onClick={handleCloseClick}> + <IconButton + aria-label={t('export.button_close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={18} /> + </IconButton> + </div> + + <div className="content"> + <div className="icon-main"> + <Icon icon={error ? warnCross : exportDone} size={44} /> + </div> + {!error && ( + <> + <div className="text-16-bold text text1"> + {t('export.modal_done.text1')} + </div> + <div className="text-16-normal text"> + {t('export.modal_done.text2')} + </div> + </> + )} + {error && ( + <> + <div className="text-20-bold text error1"> + {t('export.modal_done.error1')} + </div> + <div className="text-16-bold text"> + {t('export.modal_done.error2')} + </div> + </> + )} + + <Button + aria-label={t('export.modal_done.button_close')} + onClick={handleCloseClick} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + type="submit" + > + {error + ? t('export.modal_done.button_close_error') + : t('export.modal_done.button_close')} + </Button> + </div> + </div> + </Dialog> + ) +} + +export default ExportDoneModal diff --git a/src/components/Export/exportLoadingModal.scss b/src/components/Export/exportLoadingModal.scss new file mode 100644 index 0000000000000000000000000000000000000000..69f583deeb76530f18b82cb2fe4816e2394947ab --- /dev/null +++ b/src/components/Export/exportLoadingModal.scss @@ -0,0 +1,18 @@ +@import 'src/styles/base/color'; + +.modal-loading-root { + .content { + text-align: center; + padding-top: 2rem; + .text { + color: $grey-bright; + } + .text1 { + margin: 2rem 0; + color: $gold-shadow; + } + button { + height: 40px; + } + } +} diff --git a/src/components/Export/exportLoadingModal.spec.tsx b/src/components/Export/exportLoadingModal.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..904424ba61d16904d6c788a2fe0770ead1462b56 --- /dev/null +++ b/src/components/Export/exportLoadingModal.spec.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import { Provider } from 'react-redux' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { Button } from '@material-ui/core' +import ExportLoadingModal from 'components/Export/exportLoadingModal' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +const mockHandleClose = jest.fn() +const mockHandleDone = jest.fn() +const mockSelectedFluids: Array<any> = [0, 1, 2] + +describe('ExportLoadingModal component', () => { + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + }) + + it('should be rendered correctly', () => { + const wrapper = mount( + <Provider store={store}> + <ExportLoadingModal + open={true} + handleCloseClick={mockHandleClose} + handleDone={mockHandleDone} + selectedFluids={mockSelectedFluids} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + it('should cancel download ', () => { + const wrapper = mount( + <Provider store={store}> + <ExportLoadingModal + open={true} + handleCloseClick={mockHandleClose} + handleDone={mockHandleDone} + selectedFluids={mockSelectedFluids} + /> + </Provider> + ) + wrapper.find(Button).first().simulate('click') + expect(mockHandleClose).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/components/Export/exportLoadingModal.tsx b/src/components/Export/exportLoadingModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..516a4a590111256fee86ad08c51baa7b67fc7492 --- /dev/null +++ b/src/components/Export/exportLoadingModal.tsx @@ -0,0 +1,194 @@ +import { Button, IconButton } from '@material-ui/core' +import Dialog from '@material-ui/core/Dialog' +import CloseIcon from 'assets/icons/ico/close.svg' +import Loader from 'components/Loader/Loader' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' +import * as FileSaver from 'file-saver' +import { Datachart, TimePeriod } from 'models' +import React, { useCallback, useEffect } from 'react' +import ConsumptionDataManager from 'services/consumption.service' +import * as XLSX from 'xlsx' +import './exportLoadingModal.scss' + +interface ExportLoadingModalProps { + open: boolean + handleCloseClick: () => void + handleDone: (e?: any) => void + selectedFluids: FluidType[] +} + +const ExportLoadingModal: React.FC<ExportLoadingModalProps> = ({ + open, + handleCloseClick, + handleDone, + selectedFluids, +}: ExportLoadingModalProps) => { + const { t } = useI18n() + const client = useClient() + + const fileType = + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8' + const fileExtension = '.xlsx' + + const exportToXlsx = (exportDataSheets: any, fileName: string) => { + const wb = XLSX.utils.book_new() + for (const dataSheet of exportDataSheets) { + const ws = XLSX.utils.json_to_sheet(dataSheet.data) + XLSX.utils.book_append_sheet(wb, ws, dataSheet.fluidName) + } + const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' }) + const data = new Blob([excelBuffer], { type: fileType }) + FileSaver.saveAs(data, fileName + fileExtension) + } + + const getExportDataFluid = useCallback( + async (fluidType: FluidType): Promise<any> => { + const consumptionService = new ConsumptionDataManager(client) + const firstDataDate = await consumptionService.fetchAllFirstDateData( + [fluidType], + TimeStep.MONTH + ) + const lastDataDate = await consumptionService.fetchAllLastDateData( + [fluidType], + TimeStep.MONTH + ) + if (!firstDataDate[0] || !lastDataDate[0]) return null + + const timePeriod: TimePeriod = { + startDate: firstDataDate[0], + endDate: lastDataDate[0], + } + + const dataLoad: Datachart | null = await consumptionService.getGraphData( + timePeriod, + TimeStep.MONTH, + [fluidType], + undefined, + undefined, + false, + true + ) + + if (dataLoad?.actualData) { + const exportDataFluid: any = {} + exportDataFluid.fluidName = t( + 'FLUID.' + FluidType[fluidType] + '.LABEL' + ) + exportDataFluid.data = [] + + for (const data of dataLoad.actualData) { + if (data.value != -1) { + const dataRow: any = {} + dataRow[t('export.month')] = data.date.month + .toString() + .padStart(2, '0') + dataRow[t('export.year')] = data.date.year + dataRow[ + `${t('export.consumption')} (${t( + 'FLUID.' + FluidType[fluidType] + '.UNIT' + )})` + ] = data.value + exportDataFluid.data.push(dataRow) + } + } + return exportDataFluid + } + return null + }, + [client, t] + ) + + useEffect(() => { + let subscribed = true + const date = new Date() + + async function exportData(): Promise<void> { + try { + const exportDataSheets: any[] = [] + for (const fluidType of selectedFluids) { + const exportDataFluid = await getExportDataFluid(fluidType) + if (exportDataFluid) exportDataSheets.push(exportDataFluid) + } + await new Promise(r => setTimeout(r, 2000)) + if (subscribed) { + exportToXlsx( + exportDataSheets, + 'ecolyo_data_' + date.toLocaleDateString() + ) + handleDone() + } + } catch (e) { + handleDone(e) + } + } + + if (subscribed) { + exportData() + } + return () => { + subscribed = false + } + }, [client, getExportDataFluid, handleDone, selectedFluids, t]) + + return ( + <Dialog + open={open} + onClose={(_event, reason) => { + if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') { + handleCloseClick() + } + }} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + > + <div id={'accessibility-title'}> + {t('export.modal_loading.accessibility_title')} + </div> + + <div className="modal-loading-root"> + <div onClick={handleCloseClick}> + <IconButton + aria-label={t('export.button_close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={18} /> + </IconButton> + </div> + <div className="content"> + <div className="icon-main"> + <Loader color="gold" /> + </div> + <div className="text-16-bold text text1"> + {t('export.modal_loading.text1')} + </div> + <div className="text-16-normal text"> + {t('export.modal_loading.text2')} + </div> + <Button + aria-label={t('export.modal_loading.button_cancel')} + onClick={() => { + handleCloseClick() + }} + classes={{ + root: 'btn-secondary-negative', + label: 'text-16-bold', + }} + type="submit" + > + {t('export.modal_loading.button_cancel')} + </Button> + </div> + </div> + </Dialog> + ) +} + +export default ExportLoadingModal diff --git a/src/components/Export/exportStartModal.scss b/src/components/Export/exportStartModal.scss new file mode 100644 index 0000000000000000000000000000000000000000..9f481c116266658ae05958a024366871e2632eaa --- /dev/null +++ b/src/components/Export/exportStartModal.scss @@ -0,0 +1,22 @@ +@import 'src/styles/base/color'; + +.modal-start-root { + .content { + text-align: center; + padding-top: 2rem; + .text { + margin: 2rem 0 0; + color: $grey-bright; + } + .text1 { + color: $gold-shadow; + } + .buttons { + display: flex; + gap: 1rem; + button { + height: 40px; + } + } + } +} diff --git a/src/components/Export/exportStartModal.spec.tsx b/src/components/Export/exportStartModal.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c6cd58838d44a1c580f721e0db276f69e8e520d1 --- /dev/null +++ b/src/components/Export/exportStartModal.spec.tsx @@ -0,0 +1,57 @@ +import React from 'react' +import { Provider } from 'react-redux' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { Button } from '@material-ui/core' +import ExportStartModal from 'components/Export/exportStartModal' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +const mockHandleClose = jest.fn() +const mockHandleDownloadClick = jest.fn() + +describe('exportStartModal component', () => { + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + }) + + it('should be rendered correctly', () => { + const wrapper = mount( + <Provider store={store}> + <ExportStartModal + open={true} + handleCloseClick={mockHandleClose} + handleDownloadClick={mockHandleDownloadClick} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + it('should close modal ', () => { + const wrapper = mount( + <Provider store={store}> + <ExportStartModal + open={true} + handleCloseClick={mockHandleClose} + handleDownloadClick={mockHandleDownloadClick} + /> + </Provider> + ) + wrapper.find(Button).first().simulate('click') + expect(mockHandleClose).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/components/Export/exportStartModal.tsx b/src/components/Export/exportStartModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..58fd7a5954fe66606239bd09f0df3a4f70390948 --- /dev/null +++ b/src/components/Export/exportStartModal.tsx @@ -0,0 +1,88 @@ +import React from 'react' +import './exportStartModal.scss' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Dialog from '@material-ui/core/Dialog' +import CloseIcon from 'assets/icons/ico/close.svg' +import { Button, IconButton } from '@material-ui/core' +import Icon from 'cozy-ui/transpiled/react/Icon' +import download from 'assets/icons/ico/download.svg' + +interface ExportStartModalProps { + open: boolean + handleCloseClick: () => void + handleDownloadClick: () => void +} + +const ExportStartModal: React.FC<ExportStartModalProps> = ({ + open, + handleCloseClick, + handleDownloadClick, +}: ExportStartModalProps) => { + const { t } = useI18n() + + return ( + <Dialog + open={open} + onClose={handleCloseClick} + aria-labelledby={'accessibility_title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + > + <div id={'accessibility-title'}> + {t('export.modal_start.accessibility_title')} + </div> + <div className="modal-start-root"> + <div onClick={handleCloseClick}> + <IconButton + aria-label={t('export.button_close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={18} /> + </IconButton> + </div> + <div className="content"> + <div className="icon-main"> + <Icon icon={download} size={48} /> + </div> + <div className="text-16-bold text text1"> + {t('export.modal_start.text1')} + </div> + <div className="text-16-normal text"> + {t('export.modal_start.text2')} + <br /> + {t('export.modal_start.text3')} + </div> + <div className="buttons"> + <Button + aria-label={t('export.modal_start.button_cancel')} + onClick={handleCloseClick} + classes={{ + root: 'btn-secondary-negative', + label: 'text-16-bold', + }} + type="submit" + > + {t('export.modal_start.button_cancel')} + </Button> + <Button + aria-label={t('export.button_download')} + onClick={handleDownloadClick} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + type="submit" + > + {t('export.button_download')} + </Button> + </div> + </div> + </div> + </Dialog> + ) +} + +export default ExportStartModal diff --git a/src/components/FAQ/FAQContent.spec.tsx b/src/components/FAQ/FAQContent.spec.tsx deleted file mode 100644 index 56c711d0d23b12f9339b243f4639e0137010eb3f..0000000000000000000000000000000000000000 --- a/src/components/FAQ/FAQContent.spec.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import toJson from 'enzyme-to-json' -import FAQContent from 'components/FAQ/FAQContent' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import { faqData } from '../../../tests/__mocks__/faq.mock' -import mockClient from '../../../tests/__mocks__/client' -import { act } from 'react-dom/test-utils' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) - -jest.mock('cozy-client', () => ({ - ...jest.requireActual('cozy-client'), - useClient: () => mockClient, -})) - -const mockFAQData = jest.fn() -jest.mock('components/FAQ/FAQData', () => { - return () => mockFAQData() -}) - -describe('FAQContent', () => { - beforeEach(() => { - mockFAQData.mockClear() - }) - - it('should render a loader', () => { - mockFAQData.mockResolvedValue([]) - const wrapper = mount(<FAQContent />) - expect(wrapper.find(StyledSpinner).exists()).toBeTruthy() - }) - - it('should render the full FAQ', async () => { - mockFAQData.mockResolvedValue(faqData) - const wrapper = mount(<FAQContent />) - await act(async () => { - await new Promise(resolve => setTimeout(resolve, 0)) - wrapper.update() - }) - expect(toJson(wrapper)).toMatchSnapshot() - }) -}) diff --git a/src/components/FAQ/FAQContent.tsx b/src/components/FAQ/FAQContent.tsx deleted file mode 100644 index e510abed50c1cae5f10496562cc7e5907348ccd5..0000000000000000000000000000000000000000 --- a/src/components/FAQ/FAQContent.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import React, { useEffect, useState } from 'react' -import './faqContent.scss' -import { useClient } from 'cozy-client' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import FaqData from 'components/FAQ/FAQData' -import { - Accordion, - AccordionSummary, - AccordionDetails, -} from '@material-ui/core' -import ChevronOffIcon from 'assets/icons/ico/chevron-off.svg' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { FAQSection } from 'models' -import { FluidType } from 'enum/fluid.enum' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' - -const FAQContent: React.FC = () => { - const { t } = useI18n() - const client = useClient() - const [expanded, setExpanded] = useState<string | false>(false) - const [faqData, setFaqData] = useState<FAQSection[]>([]) - - const handleChange = - (panel: string) => (event: React.ChangeEvent<{}>, isExpanded: boolean) => { - event.preventDefault() - setExpanded(isExpanded ? panel : false) - } - - useEffect(() => { - let subscribed = true - async function loadFaqData() { - const data: FAQSection[] = await FaqData(client) - if (subscribed && data.length > 0) { - setFaqData(data) - } - } - loadFaqData() - return () => { - subscribed = false - } - }, [client]) - - if (faqData.length <= 0) { - return ( - <div className="faq-spinner"> - <StyledSpinner size="5rem" fluidType={FluidType.MULTIFLUID} /> - </div> - ) - } - - return ( - <div className="faq-view-root"> - <div className="faq-view-content"> - {faqData.map((faq, index) => { - return ( - <div key={index} className="faq-section"> - <div className="text-16-normal-uppercase">{faq.section}</div> - {faq.questions.map((question, index2) => { - return ( - <Accordion - key={index2} - expanded={expanded === `panel${index}_${index2}`} - onChange={handleChange(`panel${index}_${index2}`)} - classes={{ - root: 'expansion-panel-root', - }} - > - <AccordionSummary - aria-label={t('faq.accessibility.button_toggle_detail')} - expandIcon={<StyledIcon icon={ChevronOffIcon} />} - classes={{ - root: 'expansion-panel-summary small bold-text', - content: 'expansion-panel-content', - }} - > - {question.summary} - </AccordionSummary> - <AccordionDetails - classes={{ - root: 'expansion-panel-details', - }} - > - {question.details} - </AccordionDetails> - </Accordion> - ) - })} - </div> - ) - })} - </div> - </div> - ) -} - -export default FAQContent diff --git a/src/components/FAQ/FAQData.spec.tsx b/src/components/FAQ/FAQData.spec.tsx deleted file mode 100644 index dcdd2188d461c5570effe7b0b9da677608b74cc0..0000000000000000000000000000000000000000 --- a/src/components/FAQ/FAQData.spec.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import mockClient from '../../../tests/__mocks__/client' -import FaqData from 'components/FAQ/FAQData' -import { allLastFluidPrices } from '../../../tests/__mocks__/fluidPrice.mock' -import { FAQSection } from 'models' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) - -const mockGetAllLastPrices = jest.fn() -jest.mock('services/fluidsPrices.service', () => { - return jest.fn(() => { - return { - getAllLastPrices: mockGetAllLastPrices, - } - }) -}) - -describe('FAQData', () => { - beforeEach(() => { - mockGetAllLastPrices.mockClear() - }) - - it('should return', async () => { - mockGetAllLastPrices.mockResolvedValue(allLastFluidPrices) - const result: FAQSection[] = await FaqData(mockClient) - expect(result.length).toBe(3) - }) -}) diff --git a/src/components/FAQ/FAQData.tsx b/src/components/FAQ/FAQData.tsx deleted file mode 100644 index ff4fa0c0e4c9ab07009af233bc598ea10cbba256..0000000000000000000000000000000000000000 --- a/src/components/FAQ/FAQData.tsx +++ /dev/null @@ -1,369 +0,0 @@ -/* eslint-disable react/no-unescaped-entities */ -import React from 'react' -import { Client } from 'cozy-client' -import { FluidType } from 'enum/fluid.enum' -import { DateTime } from 'luxon' -import { FAQSection, FluidPrice } from 'models' -import FluidPricesService from 'services/fluidsPrices.service' - -const FaqData = async (client: Client): Promise<FAQSection[]> => { - const fluidsPricesService = new FluidPricesService(client) - const fluidPrices: FluidPrice[] = await fluidsPricesService.getAllLastPrices() - return [ - { - section: 'Mes données', - questions: [ - { - summary: 'Comment accéder à mes données électricité ?', - details: ( - <div> - Rendez-vous dans la partie Options du service et cliquer sur le - bouton "Se connecter à l'électricité". Suivez la procédure (en - vous créant un compte Enedis si nécessaire). Une fois votre - consentement donné, vos données de consommation seront récupérées. - </div> - ), - }, - { - summary: 'Comment accéder à mes données gaz ?', - details: ( - <div> - Rendez-vous dans la partie Options du service et cliquez sur le - bouton "Se connecter au gaz". Suivez la procédure (en vous créant - un compte GRDF si nécessaire). Une fois votre consentement donné, - vos données de consommation seront récupérées. - </div> - ), - }, - { - summary: 'Comment accéder à mes données eau ?', - details: ( - <div> - Rendez-vous dans la partie Options du service et cliquez sur "Se - connecter à l'eau". Entrez vos identifiants Eau du Grand Lyon. Vos - données seront ainsi récupérées. - </div> - ), - }, - { - summary: "Mes données ne s'affichent pas. Que se passe-t-il ?", - details: ( - <div> - <p> - En fonctionnement normal, vos données électricité arrivent à J+1 - (le lendemain), vos données eau et gaz arrivent quant à elles 3 - jours après (à J+3). - </p> - <p>Plusieurs raisons peuvent expliquer l'absence de données :</p> - <p> - - Le lien entre Ecolyo et le fournisseur de données est rompu. - Une mise à jour de ce lien (en bas de la page) peut parfois - résoudre ce problème. - </p> - <p> - - Si la mise à jour a été effectuée mais que la donnée - n'apparaît toujours pas, le souci vient du fournisseur de - données (Enedis pour l'électricité, GRDF pour le gaz, Eau du - Grand Lyon pour l'eau). Cela peut être un problème de - transmission de données entre le compte et le système de données - du partenaire, ou un problème sur votre compteur. Dans ce cas, - le mieux est de contacter directement Enedis, GRDF ou Eau du - Grand Lyon pour tenter de régler le problème avec eux. - </p> - </div> - ), - }, - { - summary: - 'Pourquoi dois-je avoir un compte Enedis, GRDF ou Eau du Grand Lyon ?', - details: ( - <div> - Nous avons fait le choix de passer par les gestionnaires de - réseaux (Enedis pour l'électricité, GRDF pour le gaz et Eau du - Grand Lyon pour l'eau). Ils sont en effet responsables de votre - compteur, de la collecte des données et du partage de celles-ci. - Ils ont les données brutes, ces mêmes données qui sont consolidées - pour votre fournisseur d'énergie ou d'eau, celui-là même qui vous - facture. Pour récupérer vos données, et afin que vous et vous seul - y ait accès, il vous faut créer un compte chez ces gestionnaires - de réseaux. Ce process n'est à réaliser que lors de première - connexion. - </div> - ), - }, - { - summary: - "Si je n'en ai pas, est-ce possible d'avoir des compteurs communicants (Linky, Gazpar, Téléo ?)", - details: ( - <div> - <p> - - Linky, le compteur électricité est déployé sur 95% de notre - territoire métropolitain. Si vous n'êtes pas encore équipé, vous - pouvez contacter Enedis au 0 970 831 970 (prix d'un appel local) - entre 8h et 17h pour convenir d'un rendez-vous. - </p> - <p> - - Concernant Gazpar le compteur gaz, s'il n'est pas encore - installé chez vous, vous pouvez vous renseigner sur le planning - de déploiement du compteur à cette adresse :{' '} - <a href="https://monespace.grdf.fr/compteur-gazpar-et-ma-commune"> - https://monespace.grdf.fr/compteur-gazpar-et-ma-commune. - </a> - </p> - <p> - - Concernant Téléo, le compteur eau, si vous êtes en eau - individualisé. En principe, vous devriez déjà avoir Téléo chez - vous. Si vous êtes abonné et que vous n'êtes pas encore équipé, - contactez le service client d'eau du Grand Lyon par téléphone au - 09 69 39 69 99 (numéro cristal non surtaxé) pour obtenir - l'installation d'un compteur communicant Téléo. - </p> - </div> - ), - }, - { - summary: 'Qui a accès à mes données de consommation?', - details: ( - <div> - <p> - Vos données privées de consommation d’énergie et d’eau sont - récupérées, sauvegardées et stockées dans votre cloud personnel - à votre initiative sans visibilité de la Métropole de Lyon sur - leur contenu. Il en est de même pour les données privées de - composition du logement et du foyer, fournies par vos soins. - Elles restent également sans visibilité de la Métropole de Lyon - sur leur contenu. - </p> - <p> - Dans le cadre de l’évaluation et de l’amélioration du service, - des données d’utilisation anonymisées sont cependant remontées à - des fins d’exploitation statistiques. La récupération de ces - statistiques anonymisées nous permettra de s’assurer du bon - fonctionnement technique de la connexion à vos données de - consommation ainsi que d’évaluer l’impact global en termes de - baisse des consommations énergétiques de notre service (Plus - d’informations sur la manière dont votre anonymat est bien - préservé dans ce processus{' '} - <a href=" https://ecolyo.com/cloud_statistiques.html">ici</a> - ). - </p> - </div> - ), - }, - { - summary: - 'Comment supprimer mon consentement au partage de mes données (électricité ou gaz) ?', - details: ( - <div> - <p> - Dans un premier temps, vous pouvez supprimer le connecteur - électricité, gaz ou eau dans la page Options du service afin de - stopper le transfert de vos données vers notre service. Pour - supprimer totalement votre consentement vous devez ensuite : - </p> - <p> - - pour l'électricité : contacter directement - dataconnect@enedis.fr pour leur indiquer votre souhait de - supprimer le consentement de partage des données avec notre - service. - </p> - <p> - - pour le gaz, rendez-vous dans votre espace GRDF ( - <a href="https://monespace.grdf.fr/"> - https://monespace.grdf.fr/ - </a> - ) dans partie "Suivi des consommations" puis "Données - consultées". Vous pouvez alors supprimer le consentement donné à - notre service. - </p> - </div> - ), - }, - ], - }, - { - section: 'Contenu du service', - questions: [ - { - summary: - 'Pourquoi les prix affichés sont-ils différents de ceux indiqués sur ma facture ?', - details: ( - <div> - <p> - Le prix de votre électricité ou de votre gaz dépend de l'offre - choisie auprès de votre fournisseur. N’ayant pas accès à cette - information, Ecolyo affiche un prix moyen par fluide. - </p> - <p>Tarifs moyens retenus :</p> - <p> - - pour l'électricité, 1 kWh ={' '} - {fluidPrices[FluidType.ELECTRICITY].price}€ TTC (il correspond - au tarif réglementé d’EDF au{' '} - {DateTime.fromISO(fluidPrices[FluidType.ELECTRICITY].startDate) - .setZone('utc', { - keepLocalTime: true, - }) - .toLocaleString()}{' '} - pour une puissance souscrite de 3 ou 6 kVA et hors offre heure - pleine/heure creuse) - </p> - <p> - - pour le gaz, 1 kWh = {fluidPrices[FluidType.GAS].price}€ TTC - (tarif réglementé de vente au{' '} - {DateTime.fromISO(fluidPrices[FluidType.GAS].startDate) - .setZone('utc', { - keepLocalTime: true, - }) - .toLocaleString()}{' '} - pour un consommateur soutirant moins de 6 MWh par an) - </p> - <p> - - pour l'eau, 1 litre d’eau ={' '} - {fluidPrices[FluidType.WATER].price}€ TTC (prix constaté au{' '} - {DateTime.fromISO(fluidPrices[FluidType.WATER].startDate) - .setZone('utc', { - keepLocalTime: true, - }) - .toLocaleString()}{' '} - pour un abonnement et une consommation de 120 m3/an sur la - Métropole de Lyon) - </p> - <p> - Le coût de votre abonnement n'est pas pris en compte dans - Ecolyo. - </p> - </div> - ), - }, - { - summary: - 'Est-ce la météo est prise en compte dans les données affichées ?', - details: ( - <div> - La météo n'est pour l'instant pas prise en compte dans les données - présentées. Nous réfléchissons à termes à une intégration des - données de température extérieure. En effet, celles-ci influent - fortement sur les comportements et donc les consommations aussi - bien d'énergie en hiver que d'eau en été. Affaire à suivre pour - notre service ! - </div> - ), - }, - { - summary: 'Quelle est la source des écogestes ?', - details: ( - <div> - Les écogestes présentés dans le service sont issus de guides - préparé par le CLER - Réseau pour la transition énergétique ainsi - que par l'ADEME (l'Agence de l'environnement et de la maîtrise de - l'énergie). La source principale est le guide des 100 écogestes - (version 2020-2021) produit par le CLER dans le cadre du programme - DECLIC. - </div> - ), - }, - { - summary: "Qu'est-ce qu'un kWh ?", - details: ( - <div> - Le kWh est l'unité de mesure correspondant à l'énergie consommée - pendant une heure par un appareil d'une puissance de 1000 watts (1 - kW). Avec 1 kWh, il est possible de … regarder la télévision - pendant 3 à 5h (selon le modèle de télé), cuire un poulet au four - thermostat 6 pendant 1h, vous servir d'un ordinateur au bureau - pendant une demi-journée... - </div> - ), - }, - { - summary: - 'Pourquoi dois-je renseigner mon profil dans le service ? Comment le modifier ? ', - details: ( - <div> - Renseigner votre profil c'est profiter à la fois d'une comparaison - de vos consommations avec les consommation d'un foyer vous - ressemblant (allez jetez un Å“il dans la partie Analyse) mais aussi - avoir accès à un tri personnalisé des écogestes dans la partie - Ecogestes du service. - </div> - ), - }, - { - summary: 'Comment sont choisis les écogestes personnalisés ?', - details: ( - <div> - Les écogestes personnalisés sont aujourd'hui choisis en fonction - des compteurs individuels que vous possédez (communicants ou non). - Ils vous permettent d'agir sur ces consommations. D'autres modes - de tri, davantage personnalisables seront proposés à l'avenir. - </div> - ), - }, - ], - }, - { - section: 'Autres infos', - questions: [ - { - summary: "Comment accéder plus facilement au service à l'avenir ?", - details: ( - <div> - <p> - Pour retrouver facilement l'accès à Ecolyo à l'avenir, il suffit - de vous créer un raccourci : - </p> - <p> - - Sur mobile APPLE : Pour créer un raccourci sur votre écran - d'accueil, ouvrez Ecolyo dans Safari et cliquez sur Partager - (carré avec une flèche pointant vers le haut), en descendant - dans le menu cliquez sur "Sur l'écran d'accueil" puis ajouter. - Un raccourci d'Ecolyo sera alors présent (il ressemblera à une - application comme une autre). - </p> - <p> - - Sur mobile ANDROID : Une fois sur la page web du service, - appuyez sur les trois petits points du menu en haut à droite. - Sélectionnez "Ajouter à l'écran d'accueil". Nommez la page et - appuyez sur "Ajouter". Un raccourci vers la page web est apparu - sur l'écran d'accueil de votre smartphone. - </p> - <p> - - Sur ordinateur : ajoutez classiquement Ecolyo dans les Favoris - de votre navigateur préféré. Cela sera plus facile par la suite - de retrouver notre service. - </p> - <p> - Si un jour vous avez totalement perdu l'adresse d'accès à votre - service, vous pouvez le retrouver en cliquant tout en bas sur le - bouton "Accéder à mon cloud personnel" du site web Ecolyo.com - </p> - </div> - ), - }, - { - summary: - "Pour accéder à Ecolyo, j'ai dû me créer un cloud personnel Grand Lyon. Qu'est-ce ?", - details: ( - <div> - Souvent le cloud personnel est réduit à un simple espace de - stockage de documents mais il est bien plus que ça. C'est un - espace individuel et sécurisé. Vous seul pouvez y accéder, - personne d'autre. Dans le cloud vous avez deux types de services: - les premiers sont des services qui vous permettent de récupérer - vos données et les stocker dans cet espace. Vous avez aussi des - services qui vous permettent de valoriser vos données pour - qu'elles aient plus de sens pour vous (c'est le cas d'Ecolyo!). Si - vous souhaitez en savoir plus sur votre cloud personnel cliquez{' '} - <a href="https://support.grandlyon.com/clouds-personnels-grand-lyon/"> - ici - </a> - . - </div> - ), - }, - ], - }, - ] -} - -export default FaqData diff --git a/src/components/FAQ/FAQLink.tsx b/src/components/FAQ/FAQLink.tsx deleted file mode 100644 index 472d4dfa8f492ba7ad2a7930d42221fbd192cba7..0000000000000000000000000000000000000000 --- a/src/components/FAQ/FAQLink.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React, { useCallback } from 'react' -import './faqLink.scss' -import Link from '@material-ui/core/Link' -import { Link as RouterLink } from 'react-router-dom' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import QuestionMarkIcon from 'assets/icons/ico/question-mark.svg' -import { useClient } from 'cozy-client' -import { UsageEventType } from 'enum/usageEvent.enum' -import UsageEventService from 'services/usageEvent.service' - -const FAQLink: React.FC = () => { - const { t } = useI18n() - const client = useClient() - const emitNavEvent = useCallback(async () => { - await UsageEventService.addEvent(client, { - type: UsageEventType.NAVIGATION_EVENT, - target: 'faq', - }) - }, [client]) - return ( - <div className="faq-root"> - <div className="faq-content"> - <div className="faq-header text-16-normal-uppercase"> - {t('faq.title_faq')} - </div> - <Link className="faq-card-link" component={RouterLink} to="options/FAQ"> - <div className="card" onClick={emitNavEvent}> - <div className="faq-card"> - <div className="faq-card-content"> - <StyledIcon - className="faq-card-content-icon" - icon={QuestionMarkIcon} - size={50} - /> - <div className="faq-card-content-title"> - {t('faq.read_faq')} - </div> - </div> - </div> - </div> - </Link> - </div> - </div> - ) -} - -export default FAQLink diff --git a/src/components/FAQ/FAQView.spec.tsx b/src/components/FAQ/FAQView.spec.tsx deleted file mode 100644 index 74f74ef60abcb520e3ff5571e0c85389b725583b..0000000000000000000000000000000000000000 --- a/src/components/FAQ/FAQView.spec.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react' -import { shallow } from 'enzyme' -import FAQView from 'components/FAQ/FAQView' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) -jest.mock('components/Header/CozyBar', () => 'mock-cozybar') -jest.mock('components/Header/Header', () => 'mock-header') -jest.mock('components/Content/Content', () => 'mock-content') - -describe('FAQView component', () => { - it('should render only the parent component', () => { - const component = shallow(<FAQView />).getElement() - expect(component).toMatchSnapshot() - }) -}) diff --git a/src/components/FAQ/FAQView.tsx b/src/components/FAQ/FAQView.tsx deleted file mode 100644 index 69240dfb19882f4592d62d34359b1050a9150cee..0000000000000000000000000000000000000000 --- a/src/components/FAQ/FAQView.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React, { useState } from 'react' -import CozyBar from 'components/Header/CozyBar' -import Header from 'components/Header/Header' -import Content from 'components/Content/Content' -import FAQContent from 'components/FAQ/FAQContent' - -const FAQView: React.FC = () => { - const [headerHeight, setHeaderHeight] = useState<number>(0) - const defineHeaderHeight = (height: number) => { - setHeaderHeight(height) - } - return ( - <React.Fragment> - <CozyBar titleKey={'common.title_faq'} displayBackArrow={true} /> - <Header - setHeaderHeight={defineHeaderHeight} - desktopTitleKey={'common.title_faq'} - displayBackArrow={true} - ></Header> - <Content height={headerHeight}> - <FAQContent /> - </Content> - </React.Fragment> - ) -} - -export default FAQView diff --git a/src/components/FAQ/__snapshots__/FAQContent.spec.tsx.snap b/src/components/FAQ/__snapshots__/FAQContent.spec.tsx.snap deleted file mode 100644 index 2a395d05dd96bb4ad578c010d150c736f31edc47..0000000000000000000000000000000000000000 --- a/src/components/FAQ/__snapshots__/FAQContent.spec.tsx.snap +++ /dev/null @@ -1,1194 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FAQContent should render the full FAQ 1`] = ` -<FAQContent> - <div - className="faq-view-root" - > - <div - className="faq-view-content" - > - <div - className="faq-section" - key="0" - > - <div - className="text-16-normal-uppercase" - > - Mes données - </div> - <WithStyles(ForwardRef(Accordion)) - classes={ - Object { - "root": "expansion-panel-root", - } - } - expanded={false} - key="0" - onChange={[Function]} - > - <ForwardRef(Accordion) - classes={ - Object { - "disabled": "Mui-disabled", - "expanded": "Mui-expanded", - "root": "MuiAccordion-root expansion-panel-root", - "rounded": "MuiAccordion-rounded", - } - } - expanded={false} - onChange={[Function]} - > - <WithStyles(ForwardRef(Paper)) - className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" - square={false} - > - <ForwardRef(Paper) - className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" - classes={ - Object { - "elevation0": "MuiPaper-elevation0", - "elevation1": "MuiPaper-elevation1", - "elevation10": "MuiPaper-elevation10", - "elevation11": "MuiPaper-elevation11", - "elevation12": "MuiPaper-elevation12", - "elevation13": "MuiPaper-elevation13", - "elevation14": "MuiPaper-elevation14", - "elevation15": "MuiPaper-elevation15", - "elevation16": "MuiPaper-elevation16", - "elevation17": "MuiPaper-elevation17", - "elevation18": "MuiPaper-elevation18", - "elevation19": "MuiPaper-elevation19", - "elevation2": "MuiPaper-elevation2", - "elevation20": "MuiPaper-elevation20", - "elevation21": "MuiPaper-elevation21", - "elevation22": "MuiPaper-elevation22", - "elevation23": "MuiPaper-elevation23", - "elevation24": "MuiPaper-elevation24", - "elevation3": "MuiPaper-elevation3", - "elevation4": "MuiPaper-elevation4", - "elevation5": "MuiPaper-elevation5", - "elevation6": "MuiPaper-elevation6", - "elevation7": "MuiPaper-elevation7", - "elevation8": "MuiPaper-elevation8", - "elevation9": "MuiPaper-elevation9", - "outlined": "MuiPaper-outlined", - "root": "MuiPaper-root", - "rounded": "MuiPaper-rounded", - } - } - square={false} - > - <div - className="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded" - > - <WithStyles(ForwardRef(AccordionSummary)) - aria-label="faq.accessibility.button_toggle_detail" - classes={ - Object { - "content": "expansion-panel-content", - "root": "expansion-panel-summary small bold-text", - } - } - expandIcon={ - <StyledIcon - icon="test-file-stub" - /> - } - key=".0" - > - <ForwardRef(AccordionSummary) - aria-label="faq.accessibility.button_toggle_detail" - classes={ - Object { - "content": "MuiAccordionSummary-content expansion-panel-content", - "disabled": "Mui-disabled", - "expandIcon": "MuiAccordionSummary-expandIcon", - "expanded": "Mui-expanded", - "focusVisible": "Mui-focusVisible", - "focused": "Mui-focused", - "root": "MuiAccordionSummary-root expansion-panel-summary small bold-text", - } - } - expandIcon={ - <StyledIcon - icon="test-file-stub" - /> - } - > - <WithStyles(ForwardRef(ButtonBase)) - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiAccordionSummary-root expansion-panel-summary small bold-text" - component="div" - disableRipple={true} - disabled={false} - focusRipple={false} - focusVisibleClassName="Mui-focusVisible Mui-focused" - onClick={[Function]} - > - <ForwardRef(ButtonBase) - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiAccordionSummary-root expansion-panel-summary small bold-text" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="div" - disableRipple={true} - disabled={false} - focusRipple={false} - focusVisibleClassName="Mui-focusVisible Mui-focused" - onClick={[Function]} - > - <div - aria-disabled={false} - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary small bold-text" - onBlur={[Function]} - onClick={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - role="button" - tabIndex={0} - > - <div - className="MuiAccordionSummary-content expansion-panel-content" - > - Comment accéder à mes données électricité ? - </div> - <WithStyles(ForwardRef(IconButton)) - aria-hidden={true} - className="MuiAccordionSummary-expandIcon" - component="div" - edge="end" - role={null} - tabIndex={null} - > - <ForwardRef(IconButton) - aria-hidden={true} - className="MuiAccordionSummary-expandIcon" - classes={ - Object { - "colorInherit": "MuiIconButton-colorInherit", - "colorPrimary": "MuiIconButton-colorPrimary", - "colorSecondary": "MuiIconButton-colorSecondary", - "disabled": "Mui-disabled", - "edgeEnd": "MuiIconButton-edgeEnd", - "edgeStart": "MuiIconButton-edgeStart", - "label": "MuiIconButton-label", - "root": "MuiIconButton-root", - "sizeSmall": "MuiIconButton-sizeSmall", - } - } - component="div" - edge="end" - role={null} - tabIndex={null} - > - <WithStyles(ForwardRef(ButtonBase)) - aria-hidden={true} - centerRipple={true} - className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - component="div" - disabled={false} - focusRipple={true} - role={null} - tabIndex={null} - > - <ForwardRef(ButtonBase) - aria-hidden={true} - centerRipple={true} - className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="div" - disabled={false} - focusRipple={true} - role={null} - tabIndex={null} - > - <div - aria-disabled={false} - aria-hidden={true} - className="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - onBlur={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - role={null} - tabIndex={null} - > - <span - className="MuiIconButton-label" - > - <StyledIcon - icon="test-file-stub" - > - <Icon - aria-hidden={true} - icon="test-file-stub" - size={16} - spin={false} - > - <Component - aria-hidden={true} - className="styles__icon___23x3R" - height={16} - style={Object {}} - width={16} - > - <svg - aria-hidden={true} - className="styles__icon___23x3R" - height={16} - style={Object {}} - width={16} - > - <use - xlinkHref="#test-file-stub" - /> - </svg> - </Component> - </Icon> - </StyledIcon> - </span> - <WithStyles(memo) - center={true} - > - <ForwardRef(TouchRipple) - center={true} - classes={ - Object { - "child": "MuiTouchRipple-child", - "childLeaving": "MuiTouchRipple-childLeaving", - "childPulsate": "MuiTouchRipple-childPulsate", - "ripple": "MuiTouchRipple-ripple", - "ripplePulsate": "MuiTouchRipple-ripplePulsate", - "rippleVisible": "MuiTouchRipple-rippleVisible", - "root": "MuiTouchRipple-root", - } - } - > - <span - className="MuiTouchRipple-root" - > - <TransitionGroup - childFactory={[Function]} - component={null} - exit={true} - /> - </span> - </ForwardRef(TouchRipple)> - </WithStyles(memo)> - </div> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(IconButton)> - </WithStyles(ForwardRef(IconButton))> - </div> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(AccordionSummary)> - </WithStyles(ForwardRef(AccordionSummary))> - <WithStyles(ForwardRef(Collapse)) - in={false} - timeout="auto" - > - <ForwardRef(Collapse) - classes={ - Object { - "entered": "MuiCollapse-entered", - "hidden": "MuiCollapse-hidden", - "root": "MuiCollapse-root", - "wrapper": "MuiCollapse-wrapper", - "wrapperInner": "MuiCollapse-wrapperInner", - } - } - in={false} - timeout="auto" - > - <Transition - addEndListener={[Function]} - appear={false} - enter={true} - exit={true} - in={false} - mountOnEnter={false} - onEnter={[Function]} - onEntered={[Function]} - onEntering={[Function]} - onExit={[Function]} - onExited={[Function]} - onExiting={[Function]} - timeout={null} - unmountOnExit={false} - > - <div - className="MuiCollapse-root MuiCollapse-hidden" - style={ - Object { - "minHeight": "0px", - } - } - > - <div - className="MuiCollapse-wrapper" - > - <div - className="MuiCollapse-wrapperInner" - > - <div - role="region" - > - <WithStyles(ForwardRef(AccordionDetails)) - classes={ - Object { - "root": "expansion-panel-details", - } - } - key=".1" - > - <ForwardRef(AccordionDetails) - classes={ - Object { - "root": "MuiAccordionDetails-root expansion-panel-details", - } - } - > - <div - className="MuiAccordionDetails-root expansion-panel-details" - > - <div> - Rendez-vous dans la partie Options du service et cliquer sur le bouton "Se connecter à l\\'électricité". Suivez la procédure (en vous créant un compte Enedis si nécessaire). Une fois votre consentement donné, vos données de consommation seront récupérées. - </div> - </div> - </ForwardRef(AccordionDetails)> - </WithStyles(ForwardRef(AccordionDetails))> - </div> - </div> - </div> - </div> - </Transition> - </ForwardRef(Collapse)> - </WithStyles(ForwardRef(Collapse))> - </div> - </ForwardRef(Paper)> - </WithStyles(ForwardRef(Paper))> - </ForwardRef(Accordion)> - </WithStyles(ForwardRef(Accordion))> - <WithStyles(ForwardRef(Accordion)) - classes={ - Object { - "root": "expansion-panel-root", - } - } - expanded={false} - key="1" - onChange={[Function]} - > - <ForwardRef(Accordion) - classes={ - Object { - "disabled": "Mui-disabled", - "expanded": "Mui-expanded", - "root": "MuiAccordion-root expansion-panel-root", - "rounded": "MuiAccordion-rounded", - } - } - expanded={false} - onChange={[Function]} - > - <WithStyles(ForwardRef(Paper)) - className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" - square={false} - > - <ForwardRef(Paper) - className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" - classes={ - Object { - "elevation0": "MuiPaper-elevation0", - "elevation1": "MuiPaper-elevation1", - "elevation10": "MuiPaper-elevation10", - "elevation11": "MuiPaper-elevation11", - "elevation12": "MuiPaper-elevation12", - "elevation13": "MuiPaper-elevation13", - "elevation14": "MuiPaper-elevation14", - "elevation15": "MuiPaper-elevation15", - "elevation16": "MuiPaper-elevation16", - "elevation17": "MuiPaper-elevation17", - "elevation18": "MuiPaper-elevation18", - "elevation19": "MuiPaper-elevation19", - "elevation2": "MuiPaper-elevation2", - "elevation20": "MuiPaper-elevation20", - "elevation21": "MuiPaper-elevation21", - "elevation22": "MuiPaper-elevation22", - "elevation23": "MuiPaper-elevation23", - "elevation24": "MuiPaper-elevation24", - "elevation3": "MuiPaper-elevation3", - "elevation4": "MuiPaper-elevation4", - "elevation5": "MuiPaper-elevation5", - "elevation6": "MuiPaper-elevation6", - "elevation7": "MuiPaper-elevation7", - "elevation8": "MuiPaper-elevation8", - "elevation9": "MuiPaper-elevation9", - "outlined": "MuiPaper-outlined", - "root": "MuiPaper-root", - "rounded": "MuiPaper-rounded", - } - } - square={false} - > - <div - className="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded" - > - <WithStyles(ForwardRef(AccordionSummary)) - aria-label="faq.accessibility.button_toggle_detail" - classes={ - Object { - "content": "expansion-panel-content", - "root": "expansion-panel-summary small bold-text", - } - } - expandIcon={ - <StyledIcon - icon="test-file-stub" - /> - } - key=".0" - > - <ForwardRef(AccordionSummary) - aria-label="faq.accessibility.button_toggle_detail" - classes={ - Object { - "content": "MuiAccordionSummary-content expansion-panel-content", - "disabled": "Mui-disabled", - "expandIcon": "MuiAccordionSummary-expandIcon", - "expanded": "Mui-expanded", - "focusVisible": "Mui-focusVisible", - "focused": "Mui-focused", - "root": "MuiAccordionSummary-root expansion-panel-summary small bold-text", - } - } - expandIcon={ - <StyledIcon - icon="test-file-stub" - /> - } - > - <WithStyles(ForwardRef(ButtonBase)) - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiAccordionSummary-root expansion-panel-summary small bold-text" - component="div" - disableRipple={true} - disabled={false} - focusRipple={false} - focusVisibleClassName="Mui-focusVisible Mui-focused" - onClick={[Function]} - > - <ForwardRef(ButtonBase) - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiAccordionSummary-root expansion-panel-summary small bold-text" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="div" - disableRipple={true} - disabled={false} - focusRipple={false} - focusVisibleClassName="Mui-focusVisible Mui-focused" - onClick={[Function]} - > - <div - aria-disabled={false} - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary small bold-text" - onBlur={[Function]} - onClick={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - role="button" - tabIndex={0} - > - <div - className="MuiAccordionSummary-content expansion-panel-content" - > - Comment accéder à mes données gaz ? - </div> - <WithStyles(ForwardRef(IconButton)) - aria-hidden={true} - className="MuiAccordionSummary-expandIcon" - component="div" - edge="end" - role={null} - tabIndex={null} - > - <ForwardRef(IconButton) - aria-hidden={true} - className="MuiAccordionSummary-expandIcon" - classes={ - Object { - "colorInherit": "MuiIconButton-colorInherit", - "colorPrimary": "MuiIconButton-colorPrimary", - "colorSecondary": "MuiIconButton-colorSecondary", - "disabled": "Mui-disabled", - "edgeEnd": "MuiIconButton-edgeEnd", - "edgeStart": "MuiIconButton-edgeStart", - "label": "MuiIconButton-label", - "root": "MuiIconButton-root", - "sizeSmall": "MuiIconButton-sizeSmall", - } - } - component="div" - edge="end" - role={null} - tabIndex={null} - > - <WithStyles(ForwardRef(ButtonBase)) - aria-hidden={true} - centerRipple={true} - className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - component="div" - disabled={false} - focusRipple={true} - role={null} - tabIndex={null} - > - <ForwardRef(ButtonBase) - aria-hidden={true} - centerRipple={true} - className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="div" - disabled={false} - focusRipple={true} - role={null} - tabIndex={null} - > - <div - aria-disabled={false} - aria-hidden={true} - className="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - onBlur={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - role={null} - tabIndex={null} - > - <span - className="MuiIconButton-label" - > - <StyledIcon - icon="test-file-stub" - > - <Icon - aria-hidden={true} - icon="test-file-stub" - size={16} - spin={false} - > - <Component - aria-hidden={true} - className="styles__icon___23x3R" - height={16} - style={Object {}} - width={16} - > - <svg - aria-hidden={true} - className="styles__icon___23x3R" - height={16} - style={Object {}} - width={16} - > - <use - xlinkHref="#test-file-stub" - /> - </svg> - </Component> - </Icon> - </StyledIcon> - </span> - <WithStyles(memo) - center={true} - > - <ForwardRef(TouchRipple) - center={true} - classes={ - Object { - "child": "MuiTouchRipple-child", - "childLeaving": "MuiTouchRipple-childLeaving", - "childPulsate": "MuiTouchRipple-childPulsate", - "ripple": "MuiTouchRipple-ripple", - "ripplePulsate": "MuiTouchRipple-ripplePulsate", - "rippleVisible": "MuiTouchRipple-rippleVisible", - "root": "MuiTouchRipple-root", - } - } - > - <span - className="MuiTouchRipple-root" - > - <TransitionGroup - childFactory={[Function]} - component={null} - exit={true} - /> - </span> - </ForwardRef(TouchRipple)> - </WithStyles(memo)> - </div> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(IconButton)> - </WithStyles(ForwardRef(IconButton))> - </div> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(AccordionSummary)> - </WithStyles(ForwardRef(AccordionSummary))> - <WithStyles(ForwardRef(Collapse)) - in={false} - timeout="auto" - > - <ForwardRef(Collapse) - classes={ - Object { - "entered": "MuiCollapse-entered", - "hidden": "MuiCollapse-hidden", - "root": "MuiCollapse-root", - "wrapper": "MuiCollapse-wrapper", - "wrapperInner": "MuiCollapse-wrapperInner", - } - } - in={false} - timeout="auto" - > - <Transition - addEndListener={[Function]} - appear={false} - enter={true} - exit={true} - in={false} - mountOnEnter={false} - onEnter={[Function]} - onEntered={[Function]} - onEntering={[Function]} - onExit={[Function]} - onExited={[Function]} - onExiting={[Function]} - timeout={null} - unmountOnExit={false} - > - <div - className="MuiCollapse-root MuiCollapse-hidden" - style={ - Object { - "minHeight": "0px", - } - } - > - <div - className="MuiCollapse-wrapper" - > - <div - className="MuiCollapse-wrapperInner" - > - <div - role="region" - > - <WithStyles(ForwardRef(AccordionDetails)) - classes={ - Object { - "root": "expansion-panel-details", - } - } - key=".1" - > - <ForwardRef(AccordionDetails) - classes={ - Object { - "root": "MuiAccordionDetails-root expansion-panel-details", - } - } - > - <div - className="MuiAccordionDetails-root expansion-panel-details" - > - <div> - Rendez-vous dans la partie Options du service et cliquez sur le bouton "Se connecter au gaz". Suivez la procédure (en vous créant un compte GRDF si nécessaire). Une fois votre consentement donné, vos données de consommation seront récupérées.', - </div> - </div> - </ForwardRef(AccordionDetails)> - </WithStyles(ForwardRef(AccordionDetails))> - </div> - </div> - </div> - </div> - </Transition> - </ForwardRef(Collapse)> - </WithStyles(ForwardRef(Collapse))> - </div> - </ForwardRef(Paper)> - </WithStyles(ForwardRef(Paper))> - </ForwardRef(Accordion)> - </WithStyles(ForwardRef(Accordion))> - </div> - <div - className="faq-section" - key="1" - > - <div - className="text-16-normal-uppercase" - > - Contenu du service - </div> - <WithStyles(ForwardRef(Accordion)) - classes={ - Object { - "root": "expansion-panel-root", - } - } - expanded={false} - key="0" - onChange={[Function]} - > - <ForwardRef(Accordion) - classes={ - Object { - "disabled": "Mui-disabled", - "expanded": "Mui-expanded", - "root": "MuiAccordion-root expansion-panel-root", - "rounded": "MuiAccordion-rounded", - } - } - expanded={false} - onChange={[Function]} - > - <WithStyles(ForwardRef(Paper)) - className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" - square={false} - > - <ForwardRef(Paper) - className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" - classes={ - Object { - "elevation0": "MuiPaper-elevation0", - "elevation1": "MuiPaper-elevation1", - "elevation10": "MuiPaper-elevation10", - "elevation11": "MuiPaper-elevation11", - "elevation12": "MuiPaper-elevation12", - "elevation13": "MuiPaper-elevation13", - "elevation14": "MuiPaper-elevation14", - "elevation15": "MuiPaper-elevation15", - "elevation16": "MuiPaper-elevation16", - "elevation17": "MuiPaper-elevation17", - "elevation18": "MuiPaper-elevation18", - "elevation19": "MuiPaper-elevation19", - "elevation2": "MuiPaper-elevation2", - "elevation20": "MuiPaper-elevation20", - "elevation21": "MuiPaper-elevation21", - "elevation22": "MuiPaper-elevation22", - "elevation23": "MuiPaper-elevation23", - "elevation24": "MuiPaper-elevation24", - "elevation3": "MuiPaper-elevation3", - "elevation4": "MuiPaper-elevation4", - "elevation5": "MuiPaper-elevation5", - "elevation6": "MuiPaper-elevation6", - "elevation7": "MuiPaper-elevation7", - "elevation8": "MuiPaper-elevation8", - "elevation9": "MuiPaper-elevation9", - "outlined": "MuiPaper-outlined", - "root": "MuiPaper-root", - "rounded": "MuiPaper-rounded", - } - } - square={false} - > - <div - className="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded" - > - <WithStyles(ForwardRef(AccordionSummary)) - aria-label="faq.accessibility.button_toggle_detail" - classes={ - Object { - "content": "expansion-panel-content", - "root": "expansion-panel-summary small bold-text", - } - } - expandIcon={ - <StyledIcon - icon="test-file-stub" - /> - } - key=".0" - > - <ForwardRef(AccordionSummary) - aria-label="faq.accessibility.button_toggle_detail" - classes={ - Object { - "content": "MuiAccordionSummary-content expansion-panel-content", - "disabled": "Mui-disabled", - "expandIcon": "MuiAccordionSummary-expandIcon", - "expanded": "Mui-expanded", - "focusVisible": "Mui-focusVisible", - "focused": "Mui-focused", - "root": "MuiAccordionSummary-root expansion-panel-summary small bold-text", - } - } - expandIcon={ - <StyledIcon - icon="test-file-stub" - /> - } - > - <WithStyles(ForwardRef(ButtonBase)) - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiAccordionSummary-root expansion-panel-summary small bold-text" - component="div" - disableRipple={true} - disabled={false} - focusRipple={false} - focusVisibleClassName="Mui-focusVisible Mui-focused" - onClick={[Function]} - > - <ForwardRef(ButtonBase) - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiAccordionSummary-root expansion-panel-summary small bold-text" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="div" - disableRipple={true} - disabled={false} - focusRipple={false} - focusVisibleClassName="Mui-focusVisible Mui-focused" - onClick={[Function]} - > - <div - aria-disabled={false} - aria-expanded={false} - aria-label="faq.accessibility.button_toggle_detail" - className="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary small bold-text" - onBlur={[Function]} - onClick={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - role="button" - tabIndex={0} - > - <div - className="MuiAccordionSummary-content expansion-panel-content" - > - Pourquoi les prix affichés sont-ils différents de ceux indiqués sur ma facture ? - </div> - <WithStyles(ForwardRef(IconButton)) - aria-hidden={true} - className="MuiAccordionSummary-expandIcon" - component="div" - edge="end" - role={null} - tabIndex={null} - > - <ForwardRef(IconButton) - aria-hidden={true} - className="MuiAccordionSummary-expandIcon" - classes={ - Object { - "colorInherit": "MuiIconButton-colorInherit", - "colorPrimary": "MuiIconButton-colorPrimary", - "colorSecondary": "MuiIconButton-colorSecondary", - "disabled": "Mui-disabled", - "edgeEnd": "MuiIconButton-edgeEnd", - "edgeStart": "MuiIconButton-edgeStart", - "label": "MuiIconButton-label", - "root": "MuiIconButton-root", - "sizeSmall": "MuiIconButton-sizeSmall", - } - } - component="div" - edge="end" - role={null} - tabIndex={null} - > - <WithStyles(ForwardRef(ButtonBase)) - aria-hidden={true} - centerRipple={true} - className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - component="div" - disabled={false} - focusRipple={true} - role={null} - tabIndex={null} - > - <ForwardRef(ButtonBase) - aria-hidden={true} - centerRipple={true} - className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - classes={ - Object { - "disabled": "Mui-disabled", - "focusVisible": "Mui-focusVisible", - "root": "MuiButtonBase-root", - } - } - component="div" - disabled={false} - focusRipple={true} - role={null} - tabIndex={null} - > - <div - aria-disabled={false} - aria-hidden={true} - className="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" - onBlur={[Function]} - onDragLeave={[Function]} - onFocus={[Function]} - onKeyDown={[Function]} - onKeyUp={[Function]} - onMouseDown={[Function]} - onMouseLeave={[Function]} - onMouseUp={[Function]} - onTouchEnd={[Function]} - onTouchMove={[Function]} - onTouchStart={[Function]} - role={null} - tabIndex={null} - > - <span - className="MuiIconButton-label" - > - <StyledIcon - icon="test-file-stub" - > - <Icon - aria-hidden={true} - icon="test-file-stub" - size={16} - spin={false} - > - <Component - aria-hidden={true} - className="styles__icon___23x3R" - height={16} - style={Object {}} - width={16} - > - <svg - aria-hidden={true} - className="styles__icon___23x3R" - height={16} - style={Object {}} - width={16} - > - <use - xlinkHref="#test-file-stub" - /> - </svg> - </Component> - </Icon> - </StyledIcon> - </span> - <WithStyles(memo) - center={true} - > - <ForwardRef(TouchRipple) - center={true} - classes={ - Object { - "child": "MuiTouchRipple-child", - "childLeaving": "MuiTouchRipple-childLeaving", - "childPulsate": "MuiTouchRipple-childPulsate", - "ripple": "MuiTouchRipple-ripple", - "ripplePulsate": "MuiTouchRipple-ripplePulsate", - "rippleVisible": "MuiTouchRipple-rippleVisible", - "root": "MuiTouchRipple-root", - } - } - > - <span - className="MuiTouchRipple-root" - > - <TransitionGroup - childFactory={[Function]} - component={null} - exit={true} - /> - </span> - </ForwardRef(TouchRipple)> - </WithStyles(memo)> - </div> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(IconButton)> - </WithStyles(ForwardRef(IconButton))> - </div> - </ForwardRef(ButtonBase)> - </WithStyles(ForwardRef(ButtonBase))> - </ForwardRef(AccordionSummary)> - </WithStyles(ForwardRef(AccordionSummary))> - <WithStyles(ForwardRef(Collapse)) - in={false} - timeout="auto" - > - <ForwardRef(Collapse) - classes={ - Object { - "entered": "MuiCollapse-entered", - "hidden": "MuiCollapse-hidden", - "root": "MuiCollapse-root", - "wrapper": "MuiCollapse-wrapper", - "wrapperInner": "MuiCollapse-wrapperInner", - } - } - in={false} - timeout="auto" - > - <Transition - addEndListener={[Function]} - appear={false} - enter={true} - exit={true} - in={false} - mountOnEnter={false} - onEnter={[Function]} - onEntered={[Function]} - onEntering={[Function]} - onExit={[Function]} - onExited={[Function]} - onExiting={[Function]} - timeout={null} - unmountOnExit={false} - > - <div - className="MuiCollapse-root MuiCollapse-hidden" - style={ - Object { - "minHeight": "0px", - } - } - > - <div - className="MuiCollapse-wrapper" - > - <div - className="MuiCollapse-wrapperInner" - > - <div - role="region" - > - <WithStyles(ForwardRef(AccordionDetails)) - classes={ - Object { - "root": "expansion-panel-details", - } - } - key=".1" - > - <ForwardRef(AccordionDetails) - classes={ - Object { - "root": "MuiAccordionDetails-root expansion-panel-details", - } - } - > - <div - className="MuiAccordionDetails-root expansion-panel-details" - > - <div> - <p> - Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. - </p> - <p> - Tarifs moyens retenus : - </p> - </div> - </div> - </ForwardRef(AccordionDetails)> - </WithStyles(ForwardRef(AccordionDetails))> - </div> - </div> - </div> - </div> - </Transition> - </ForwardRef(Collapse)> - </WithStyles(ForwardRef(Collapse))> - </div> - </ForwardRef(Paper)> - </WithStyles(ForwardRef(Paper))> - </ForwardRef(Accordion)> - </WithStyles(ForwardRef(Accordion))> - </div> - </div> - </div> -</FAQContent> -`; diff --git a/src/components/FAQ/__snapshots__/FAQView.spec.tsx.snap b/src/components/FAQ/__snapshots__/FAQView.spec.tsx.snap deleted file mode 100644 index 285ef8a29c5ce9475e1167d5d092bfd17c0099e4..0000000000000000000000000000000000000000 --- a/src/components/FAQ/__snapshots__/FAQView.spec.tsx.snap +++ /dev/null @@ -1,20 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FAQView component should render only the parent component 1`] = ` -<React.Fragment> - <mock-cozybar - displayBackArrow={true} - titleKey="common.title_faq" - /> - <mock-header - desktopTitleKey="common.title_faq" - displayBackArrow={true} - setHeaderHeight={[Function]} - /> - <mock-content - height={0} - > - <FAQContent /> - </mock-content> -</React.Fragment> -`; diff --git a/src/components/FAQ/faqContent.scss b/src/components/FAQ/faqContent.scss deleted file mode 100644 index c8cae55585fd727a36578775cf5514c5d21ec5b4..0000000000000000000000000000000000000000 --- a/src/components/FAQ/faqContent.scss +++ /dev/null @@ -1,45 +0,0 @@ -@import 'src/styles/base/color'; -@import 'src/styles/base/breakpoint'; - -// FAQ -.faq-view-root { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - margin: 1.5rem; - .faq-view-content { - width: 45.75rem; - @media #{$large-phone} { - width: 100%; - } - } -} - -.faq-spinner { - display: flex; - align-items: center; - justify-content: center; - min-height: 100%; - @media #{$large-phone} { - min-height: inherit; - } -} - -.faq-section { - color: $grey-bright; - padding-top: 1rem; - .expansion-panel-details { - div { - padding-bottom: 0.6rem; - p { - color: $grey-bright; - margin-block-start: 0; - margin-block-end: 0.6rem; - } - p:last-child { - margin-block-end: 0rem; - } - } - } -} diff --git a/src/components/Feedback/FeedbackModal.spec.tsx b/src/components/Feedback/FeedbackModal.spec.tsx index 3a5a63748ee16066ca0b263c49899a9950e8fe59..93bbd7f6118c569254491cb1e22bd949b9bc34f7 100644 --- a/src/components/Feedback/FeedbackModal.spec.tsx +++ b/src/components/Feedback/FeedbackModal.spec.tsx @@ -1,17 +1,18 @@ import React from 'react' +import { BrowserRouter } from 'react-router-dom' import * as reactRedux from 'react-redux' +import { Provider } from 'react-redux' import { mount } from 'enzyme' import FeedbackModal from 'components/Feedback/FeedbackModal' - -import Button from '@material-ui/core/Button' import { userChallengeExplo1OnGoing } from '../../../tests/__mocks__/userChallengeData.mock' -import { Provider } from 'react-redux' import { createMockStore, mockInitialEcolyoState, } from '../../../tests/__mocks__/store' import { act } from 'react-dom/test-utils' -import { BrowserRouter } from 'react-router-dom' + +// Value coming from jest.config +declare let __SAU_LINK__: string jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -31,29 +32,18 @@ jest.mock('services/environment.service', () => { }) }) -const mockSendMail = jest.fn() -jest.mock('services/mail.service', () => { - return jest.fn(() => { - return { - SendMail: mockSendMail, - } - }) -}) - const handleFeedbackModalClose = jest.fn() const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') describe('FeedbackModal component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) }) it('should render the component', () => { mockUseDispatch.mockReturnValue(jest.fn()) - mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) const component = mount( <Provider store={store}> <BrowserRouter> @@ -68,83 +58,12 @@ describe('FeedbackModal component', () => { }) }) describe('FeedbackModal functionnalities', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) }) - it('should should send an email to the support', () => { - mockUseDispatch.mockReturnValue(jest.fn()) - mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) - - const wrapper = mount( - <Provider store={store}> - <BrowserRouter> - <FeedbackModal - open={true} - handleCloseClick={handleFeedbackModalClose} - /> - </BrowserRouter> - </Provider> - ) - - const mockPlatform = 'platform' - const mockVendor = 'vendor' - const mockUserAgent = 'userAgent' - Object.defineProperty(navigator, 'platform', { value: mockPlatform }) - Object.defineProperty(navigator, 'vendor', { value: mockVendor }) - Object.defineProperty(navigator, 'userAgent', { value: mockUserAgent }) - const expectedMailData = { - mode: 'from', - to: [ - { - name: 'Support', - email: 'ecolyo@grandlyon.com', - }, - ], - subject: '[Ecolyo] - Feedbacks - feedback.type_bug', - attachments: [], - parts: [ - { - type: 'text/plain', - body: - 'Type: feedback.type_bug\n' + - '\n' + - 'Description:\n' + - 'La description\n' + - 'Ecolyo\n' + - 'v0.0.0\n' + - '\n' + - 'Location: http://localhost/\n' + - '\n' + - 'Browser:\n' + - 'On null\n' + - 'From null\n' + - 'null\n' + - '\n' + - 'Navigator:' + - `\nOn ${mockPlatform}` + - `\nFrom ${mockVendor}` + - `\n${mockUserAgent}`, - }, - ], - } - - wrapper.find('div.fb-selector-item').first().simulate('click') - wrapper.find('#idFeedbackDescription').simulate('change', { - target: { - value: 'La description', - }, - }) - wrapper.find(Button).simulate('click') - - expect(mockSendMail).toHaveBeenCalledWith( - expect.anything(), - expectedMailData - ) - }) - it('should close the modal and reset the inputs', async () => { + it('should close the modal', async () => { mockUseDispatch.mockReturnValue(jest.fn()) mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) const wrapper = mount( @@ -161,18 +80,16 @@ describe('FeedbackModal functionnalities', () => { await new Promise(resolve => setTimeout(resolve)) wrapper.update() }) - wrapper.find('#idFeedbackDescription').simulate('change', { - target: { - value: 'La description', - }, - }) + wrapper.find('.modal-paper-close-button').first().simulate('click') expect(handleFeedbackModalClose).toHaveBeenCalledTimes(1) - setTimeout(() => { - expect(wrapper.find('#idFeedbackDescription').prop('value')).toBe('') - }) + wrapper.find('.btn-secondary-positive').first().simulate('click') + expect(handleFeedbackModalClose).toHaveBeenCalledTimes(2) }) - it('should upload the image', async () => { + + it('should open the SAU link', () => { + global.open = jest.fn() + const wrapper = mount( <Provider store={store}> <BrowserRouter> @@ -183,14 +100,8 @@ describe('FeedbackModal functionnalities', () => { </BrowserRouter> </Provider> ) - await act(async () => { - await new Promise(resolve => setTimeout(resolve)) - wrapper.update() - }) - const file = new File([new ArrayBuffer(1)], 'file.jpg') - const readAsDataURLSpy = jest.spyOn(FileReader.prototype, 'readAsDataURL') - wrapper.find('#folder').simulate('change', { target: { files: [file] } }) - expect(readAsDataURLSpy).toBeCalledWith(file) - expect(wrapper.find('.removeUploaded').first().simulate('click')) + wrapper.find('.btn-highlight').first().simulate('click') + expect(window.open).toBeCalledTimes(1) + expect(global.open).toHaveBeenCalledWith(`${__SAU_LINK__}?version=0.0.0`) }) }) diff --git a/src/components/Feedback/FeedbackModal.tsx b/src/components/Feedback/FeedbackModal.tsx index 9dabd1b1452261515e24d29250d5a88bf330415f..53a9130ee7b45ed28ccd2e2c3ff49e626946f6c4 100644 --- a/src/components/Feedback/FeedbackModal.tsx +++ b/src/components/Feedback/FeedbackModal.tsx @@ -1,33 +1,18 @@ -import React, { ChangeEvent, useState } from 'react' -import { IuseI18n, useI18n } from 'cozy-ui/transpiled/react/I18n' -import Icon from 'cozy-ui/transpiled/react/Icon' -import { Client, useClient } from 'cozy-client' -import { detect } from 'detect-browser' - -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import IconButton from '@material-ui/core/IconButton' import Button from '@material-ui/core/Button' import Dialog from '@material-ui/core/Dialog' -import StyledIconBorderedButton from 'components/CommonKit/IconButton/StyledIconBorderedButton' -import BugOnIcon from 'assets/icons/visu/feedback/bug-on.svg' -import BugOffIcon from 'assets/icons/visu/feedback/bug-off.svg' -import IdeaOnIcon from 'assets/icons/visu/feedback/idea-on.svg' -import IdeaOffIcon from 'assets/icons/visu/feedback/idea-off.svg' -import OtherOnIcon from 'assets/icons/visu/feedback/other-on.svg' -import OtherOffIcon from 'assets/icons/visu/feedback/other-off.svg' -import WarningIcon from 'assets/icons/ico/warning-yellow.svg' +import IconButton from '@material-ui/core/IconButton' import CloseIcon from 'assets/icons/ico/close.svg' -import SuccessIcon from 'assets/icons/visu/data-ok.svg' -import MailService from 'services/mail.service' -import './feedbackModal.scss' +import ecolyoIcon from 'assets/icons/ico/ecolyo.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import useExploration from 'components/Hooks/useExploration' +import { Client, useClient } from 'cozy-client' +import { IuseI18n, useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' import { UserExplorationID } from 'enum/userExploration.enum' -import EnvironmentService from 'services/environment.service' -import Link from '@material-ui/core/Link' -import { Link as RouterLink } from 'react-router-dom' +import React from 'react' +import './feedbackModal.scss' -const FEEDBACK_EMAIL = 'ecolyo@grandlyon.com' -const browser = detect() +declare let __SAU_LINK__: string interface FeedbackModalProps { open: boolean @@ -40,162 +25,15 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({ }: FeedbackModalProps) => { const { t }: IuseI18n = useI18n() const client: Client = useClient() - const [type, setType] = useState<string>('bug') - const [description, setDescription] = useState<string>('') - const [sending, setSending] = useState<boolean>(false) - const [sent, setSent] = useState<boolean>(false) - const [error, setError] = useState<string>('') - const [textFile, setTextFile] = useState<string>() - const [uploadedFile, setuploadedFile] = useState<File | null>(null) - const [, setValidExploration] = useExploration() - const resetInputs = () => { - setType('bug') - setDescription('') - setSent(false) - setError('') - } const closeModal = () => { - resetInputs() handleCloseClick() } - const sendEmail = async () => { - setSending(true) - if (description === '') { - setError(t('feedback.error_empty_description')) - } else { - setValidExploration(UserExplorationID.EXPLORATION005) - const envInfo = - `Ecolyo` + - `\nv${client.appMetadata.version}` + - `\n\nLocation: ${window.location}` + - '\n\nBrowser:' + - `\nOn ${browser && browser.os}` + - `\nFrom ${browser && browser.name}` + - `\n${browser && browser.version}` + - '\n\nNavigator:' + - `\nOn ${navigator.platform}` + - `\nFrom ${navigator.vendor}` + - `\n${navigator.userAgent}` - - const mailContent = - 'Type: ' + - t('feedback.type_' + type) + - '\n\nDescription:\n' + - description + - '\n' + - envInfo - - const subjectEnv = new EnvironmentService().isProduction() - ? '[Ecolyo]' - : '[Ecolyo - alpha]' - - const mailData = { - mode: 'from', - to: [{ name: 'Support', email: FEEDBACK_EMAIL }], - subject: subjectEnv + ' - Feedbacks - ' + t('feedback.type_' + type), - parts: [{ type: 'text/plain', body: mailContent }], - attachments: - uploadedFile && textFile - ? [{ filename: uploadedFile.name, content: textFile }] - : [], - } - try { - const mailService = new MailService() - mailService.SendMail(client, mailData) - } catch (e) { - // eslint-disable-next-line no-console - console.error(e) - setError(t('feedback.error_sending')) - } - } - setSending(false) - setSent(true) - setuploadedFile(null) - } - - const validResult = () => { - setSent(false) - setError('') - if (error === '') { - resetInputs() - closeModal() - } - } - - const getOnIcon = (_type: string) => { - switch (_type) { - case 'bug': - return BugOnIcon - case 'idea': - return IdeaOnIcon - case 'other': - return OtherOnIcon - default: - return BugOnIcon - } - } - const getOffIcon = (_type: string) => { - switch (_type) { - case 'bug': - return BugOffIcon - case 'idea': - return IdeaOffIcon - case 'other': - return OtherOffIcon - default: - return BugOffIcon - } - } - - const selectorItem = (itemType: string) => { - const selected = type === itemType - return ( - <div className="fb-selector-item"> - <StyledIconBorderedButton - aria-label={t('feedback.accessibility.select_type_' + itemType)} - icon={selected ? getOnIcon(itemType) : getOffIcon(itemType)} - selected={selected} - autoFocus={selected} - size={36} - onClick={() => setType(itemType)} - > - <div - className={ - selected - ? 'fb-selector-item-selectedlabel text-10-bold' - : 'fb-selector-item-label text-10-normal' - } - > - {t('feedback.type_' + itemType)} - </div> - </StyledIconBorderedButton> - </div> - ) - } - const readFileAsDataURL = async (file: File): Promise<string> => { - return new Promise(resolve => { - const reader = new FileReader() - reader.onloadend = () => { - if (reader.result) { - resolve(reader.result as string) - } - } - reader.readAsDataURL(file) - }) - } - const getDocument = async ( - e: ChangeEvent<HTMLInputElement> - ): Promise<void> => { - const { files } = e.target - const file = files ? files[0] : null - if (file) { - setuploadedFile(file) - const base64File: string = await readFileAsDataURL(file) - setTextFile(base64File.split(',')[1]) - } + const goToSAU = () => { + setValidExploration(UserExplorationID.EXPLORATION005) + window.open(`${__SAU_LINK__}?version=${client.appMetadata.version}`) } return ( @@ -222,127 +60,31 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({ <Icon icon={CloseIcon} size={16} /> </IconButton> <div className="fb-root"> - {sent ? ( - <> - <div className="fb-content"> - {error === '' ? ( - <div className="fb-content-success"> - <div className="fb-icon"> - <StyledIcon icon={SuccessIcon} size={48} /> - </div> - <div>{t('feedback.success_sending')}</div> - </div> - ) : ( - <div className="fb-content-error"> - <div className="fb-icon"> - <StyledIcon icon={WarningIcon} size={48} /> - </div> - <div>{t('feedback.warning')}</div> - <div>{error}</div> - </div> - )} - <Button - aria-label={t('feedback.accessibility.button_ok')} - onClick={validResult} - variant={'contained'} - classes={{ - root: 'btn-highlight', - label: 'text-16-bold', - }} - > - {t('feedback.ok')} - </Button> - </div> - </> - ) : ( - <> - <div id="title" className="fb-header text-18-bold"> - {t('feedback.title')} - </div> - <form className="fb-content"> - <label htmlFor="feedbackType" className="fb-label text-16-bold"> - {t('feedback.type')} - </label> - <fieldset id="feedbackType" className="fb-selector"> - {selectorItem('bug')} - {selectorItem('idea')} - {selectorItem('other')} - </fieldset> - - <span id="suggestFaq" className="fb-label text-16-bold"> - {t('feedback.suggest_faq')} - <Link - component={RouterLink} - to="options/FAQ" - onClick={closeModal} - > - <span className="styledLink">FAQ</span> - </Link> - ? - </span> - <label - htmlFor="idFeedbackDescription" - className="fb-label text-16-bold" - > - {t('feedback.description')} - </label> - <textarea - id="idFeedbackDescription" - className="fb-form fb-textarea" - placeholder={t('feedback.description_placeholder')} - name="description" - onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => - setDescription(e.target.value) - } - value={description} - ></textarea> - <div className="validate_row"> - {!uploadedFile ? ( - <> - <input - type="file" - id="folder" - accept="image/*" - onChange={(e): Promise<void> => getDocument(e)} - className="input-file" - hidden - /> - <label htmlFor="folder" className="upload-label"> - {t('feedback.upload')} - </label> - </> - ) : ( - <> - <span className="fb-label text-16-bold"> - {t('feedback.imageLabel')} - </span> - <div className="fileName"> - <span>{uploadedFile.name.substring(0, 3)}..</span> - <IconButton - onClick={() => setuploadedFile(null)} - className="removeUploaded" - > - <Icon icon={CloseIcon} size={12} /> - </IconButton> - </div> - </> - )} - <Button - aria-label={t('feedback.accessibility.button_send')} - onClick={sendEmail} - disabled={sending} - classes={{ - root: 'btn-highlight', - label: 'text-16-bold', - }} - type="submit" - > - {t('feedback.send')} - </Button> - </div> - </form> - </> - )} + <StyledIcon icon={ecolyoIcon} size={80} /> + <p className="title">{t('feedback.title')}</p> + <p className="subtitle">{t('feedback.subtitle')}</p> + <div className="actions"> + <Button + aria-label={t('feedback.later')} + onClick={closeModal} + classes={{ + root: 'btn-secondary-positive', + label: 'text-16-bold', + }} + > + {t('feedback.later')} + </Button> + <Button + aria-label={t('feedback.lets_go')} + onClick={goToSAU} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + {t('feedback.lets_go')} + </Button> + </div> </div> </Dialog> ) diff --git a/src/components/Feedback/feedbackModal.scss b/src/components/Feedback/feedbackModal.scss index e8af88519790520306425b2dfbfebd09bd09e174..dae85d4cae5c98e9f93cafc959ca539c7ff76ba2 100644 --- a/src/components/Feedback/feedbackModal.scss +++ b/src/components/Feedback/feedbackModal.scss @@ -1,133 +1,35 @@ @import 'src/styles/base/color'; -@import '../../styles/base/mixins'; .fb-root { overflow-y: auto; min-width: 70%; - margin: 1rem 0; - .fb-header { - color: $gold-shadow; - padding: 0.5rem 0.5rem 0rem 0.5rem; - display: flex; - justify-content: center; + display: flex; + flex-direction: column; + align-items: center; + + p { + text-align: center; } - .fb-content { - padding: 1rem 0.5rem 1.5rem 0.5rem; - display: flex; - flex-direction: column; - .fb-content-success { - color: $grey-bright; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - } - .fb-content-error { - color: $grey-bright; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - } - .fb-icon { - display: flex; - justify-content: center; - margin: 0 0 1.5rem 0; - } - .fb-label { - margin: 0.5rem 0 0 0; - } - .fb-selector { - margin: 0.5rem 0; - display: flex; - flex-direction: row; - align-content: space-around; - justify-content: space-around; - padding: 0; - border: none; - .fb-selector-item { - height: 3.125rem; - width: 3.125rem; - .fb-selector-item-label { - color: $grey-bright; - } - .fb-selector-item-selectedlabel { - color: $white; - } - } - } - .fb-form { - margin: 0.5rem 0; - border: 1px solid $grey-dark; - border-radius: 4px; - color: $grey-bright; - background: rgba(0, 0, 0, 0.3); - padding: 0 1rem; - outline: none; - } - .fb-form:focus { - border: 1px solid $gold-shadow; - } - .fb-textarea { - height: 8.725rem; - padding: 0.5rem 1rem; - resize: none; - } - .fb-input { - height: 2rem; - } - button.btn-highlight { - max-width: 9.375rem; - align-self: center; - width: 38%; - padding-top: 0.5rem; - padding-bottom: 0.6rem; - margin: 0 !important; - } + .title { + color: $gold-light; + font-weight: 700; + padding: 0.5rem; } -} -.upload-label { - appearance: none; - padding: 0.5rem; - text-align: center; - max-width: 180px; - width: 50% !important; - @include button( - transparent, - rgba($grey-bright, 0.7), - 1px solid $grey-dark, - transparent - ); - background-color: rgba($grey-dark, 0.2); - margin: 0.8rem auto; - transition: all 300ms ease; - &:hover { - opacity: 0.7; + + .subtitle { + color: $grey-bright; + margin: 1rem 0 2rem; } -} -.styledLink { - color: $gold-light; - text-decoration: underline; -} -.fileName { - display: flex; - justify-content: space-between; - padding: 0 0.5rem; - color: $grey-bright; - border: solid 1px $grey-dark; - border-radius: 3px; - margin: 0.5rem 0; - align-items: center; -} -.validate_row { - display: flex; - justify-content: space-evenly; -} -#accessibility-title { - display: none; -} -#suggestFaq { - margin-bottom: 1rem; + .actions { + width: 100%; + display: flex; + justify-content: center; + gap: 16px; + button { + margin-top: 0; + max-width: 150px; + } + } } diff --git a/src/components/FluidChart/FluidChart.tsx b/src/components/FluidChart/FluidChart.tsx index e24c47f472b1d04c783a36a042affd8fa4c6c2f2..c3257a3245a907111dae927a396301085d141e53 100644 --- a/src/components/FluidChart/FluidChart.tsx +++ b/src/components/FluidChart/FluidChart.tsx @@ -1,22 +1,20 @@ -import React, { useState, useEffect } from 'react' -import './fluidChart.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useClient } from 'cozy-client' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' +import StyledSwitch from 'components/CommonKit/Switch/StyledSwitch' +import HalfHourNoData from 'components/HalfHourNoData/HalfHourNoData' import useExploration from 'components/Hooks/useExploration' - +import TimeStepSelector from 'components/TimeStepSelector/TimeStepSelector' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' +import { UsageEventType } from 'enum/usageEvent.enum' import { UserExplorationID } from 'enum/userExploration.enum' +import React, { useEffect, useState } from 'react' +import { useSelector } from 'react-redux' import ConsumptionService from 'services/consumption.service' - -import StyledSwitch from 'components/CommonKit/Switch/StyledSwitch' -import TimeStepSelector from 'components/TimeStepSelector/TimeStepSelector' -import ActivateHalfHourLoad from 'components/ActivateHalfHourLoad/ActivateHalfHourLoad' -import FluidChartSwipe from './FluidChartSwipe' -import { UsageEventType } from 'enum/usageEvent.enum' import UsageEventService from 'services/usageEvent.service' +import { AppStore } from 'store' +import './fluidChart.scss' +import FluidChartSwipe from './FluidChartSwipe' interface FluidChartProps { fluidType: FluidType @@ -34,10 +32,10 @@ const FluidChart: React.FC<FluidChartProps> = ({ (state: AppStore) => state.ecolyo.chart ) const [, setValidExploration] = useExploration() - const [isMinuteBlocked, setMinuteBlocked] = useState<boolean>(false) - const [isEnedisConsentTimeout, setEnedisConsentKO] = useState<boolean>(false) const [isLoaded, setIsLoaded] = useState<boolean>(false) const [showCompare, setShowCompare] = useState<boolean>(false) + const [containsHalfHourData, setContainsHalfHourData] = + useState<boolean>(false) const handleChangeSwitch = async () => { if (!showCompare) { @@ -52,94 +50,79 @@ const FluidChart: React.FC<FluidChartProps> = ({ useEffect(() => { let subscribed = true - let isEnedisConsentValid = true async function loadData() { const consumptionService = new ConsumptionService(client) - let activateHalfHourLoad = false if (fluidType === FluidType.ELECTRICITY) { - activateHalfHourLoad = await consumptionService.checkDoctypeEntries( + const halfHourData = await consumptionService.checkDoctypeEntries( FluidType.ELECTRICITY, TimeStep.HALF_AN_HOUR ) - } - if (currentTimeStep === TimeStep.HALF_AN_HOUR && activateHalfHourLoad) { - isEnedisConsentValid = - await consumptionService.checkEnedisHalHourConsent(selectedDate) + if (halfHourData) { + setContainsHalfHourData(true) + } } if (subscribed) { - if (!activateHalfHourLoad) { - setMinuteBlocked(true) - } - setEnedisConsentKO(!isEnedisConsentValid) setIsLoaded(true) } } + loadData() + return () => { subscribed = false } }, [client, fluidStatus, selectedDate, currentTimeStep, fluidType]) useEffect(() => { - if (!isMinuteBlocked && currentTimeStep === TimeStep.HALF_AN_HOUR) { + if (containsHalfHourData && currentTimeStep === TimeStep.HALF_AN_HOUR) { setValidExploration(UserExplorationID.EXPLORATION004) } else if (currentTimeStep === TimeStep.YEAR) { setValidExploration(UserExplorationID.EXPLORATION003) } - }, [isMinuteBlocked, currentTimeStep, setValidExploration]) + }, [containsHalfHourData, currentTimeStep, setValidExploration]) + + const getCompareLabel = (currentTimeStep: TimeStep) => { + return t(`timestep.${TimeStep[currentTimeStep].toLowerCase()}.comparelabel`) + } return ( <> {isLoaded && ( - <> - <div className="fluidchart-root"> - {isMinuteBlocked && currentTimeStep === TimeStep.HALF_AN_HOUR ? ( - <ActivateHalfHourLoad consentActive={true} /> - ) : isEnedisConsentTimeout && - currentTimeStep === TimeStep.HALF_AN_HOUR ? ( - <ActivateHalfHourLoad consentActive={false} /> - ) : ( - <div className="fluidchart-content"> - <FluidChartSwipe + <div className="fluidchart-root"> + {currentTimeStep === TimeStep.HALF_AN_HOUR && + !containsHalfHourData ? ( + <HalfHourNoData /> + ) : ( + <div className="fluidchart-content"> + <FluidChartSwipe + fluidType={fluidType} + showCompare={ + currentTimeStep === TimeStep.YEAR ? false : showCompare + } + setActive={setActive} + /> + </div> + )} + <TimeStepSelector fluidType={fluidType} /> + {currentTimeStep !== TimeStep.YEAR && ( + <div className="fluidchart-footer" onClick={handleChangeSwitch}> + <div className="fluidchart-footer-compare text-15-normal"> + <StyledSwitch fluidType={fluidType} - showCompare={ - currentTimeStep === TimeStep.YEAR ? false : showCompare - } - setActive={setActive} + checked={showCompare} + inputProps={{ + 'aria-label': t( + 'consumption.accessibility.checkbox_compare' + ), + }} /> + <span className="fluidchart-footer-label graph-switch-text"> + {getCompareLabel(currentTimeStep)} + </span> </div> - )} - <TimeStepSelector fluidType={fluidType} /> - {currentTimeStep !== TimeStep.YEAR ? ( - <div className="fluidchart-footer" onClick={handleChangeSwitch}> - <div className="fluidchart-footer-compare text-15-normal"> - <StyledSwitch - fluidType={fluidType} - checked={showCompare} - inputProps={{ - 'aria-label': t( - 'consumption.accessibility.checkbox_compare' - ), - }} - /> - <span - className={ - showCompare - ? `fluidchart-footer-label graph-switch-text selected` - : `fluidchart-footer-label graph-switch-text` - } - > - {t( - `timestep.${TimeStep[ - currentTimeStep - ].toLowerCase()}.comparelabel` - )} - </span> - </div> - </div> - ) : null} - </div> - </> + </div> + )} + </div> )} </> ) diff --git a/src/components/FluidChart/FluidChartSlide.tsx b/src/components/FluidChart/FluidChartSlide.tsx index 1959cbfab0b9db77cb825fe1ed4ccbb674312350..1a60fb84ad09dbba3a7183343d8b690536dddacb 100644 --- a/src/components/FluidChart/FluidChartSlide.tsx +++ b/src/components/FluidChart/FluidChartSlide.tsx @@ -1,20 +1,18 @@ -import React, { useState, useEffect } from 'react' -import './fluidChartSlide.scss' +import BarChart from 'components/Charts/BarChart' +import ConsumptionVisualizer from 'components/ConsumptionVisualizer/ConsumptionVisualizer' +import Loader from 'components/Loader/Loader' import { useClient } from 'cozy-client' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' -import { setCurrentDatachart, setLoading } from 'store/chart/chart.actions' -import { DateTime } from 'luxon' - import { FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' +import { DateTime } from 'luxon' import { Datachart } from 'models' +import React, { useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' import ConsumptionService from 'services/consumption.service' import DateChartService from 'services/dateChart.service' - -import BarChart from 'components/Charts/BarChart' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import { TimeStep } from 'enum/timeStep.enum' -import ConsumptionVisualizer from 'components/ConsumptionVisualizer/ConsumptionVisualizer' +import { AppStore } from 'store' +import { setCurrentDatachart, setLoading } from 'store/chart/chart.actions' +import './fluidChartSlide.scss' interface FluidChartSlideProps { index: number @@ -122,11 +120,9 @@ const FluidChartSlide: React.FC<FluidChartSlideProps> = ({ return ( <div className={'fluidchartslide-root'} aria-busy={!isDataLoaded}> {!isDataLoaded ? ( - <StyledSpinner - size="5em" - fluidType={fluidType} - className="data-spinner" - /> + <div className="data-spinner"> + <Loader fluidType={fluidType} /> + </div> ) : ( <> <ConsumptionVisualizer diff --git a/src/components/FluidChart/fluidChartSlide.scss b/src/components/FluidChart/fluidChartSlide.scss index cd629bab5d4e630bc397840ea8f3e94852a9db68..4e062f5b08335e1f8a0f279050e7ef9afd4a6650 100644 --- a/src/components/FluidChart/fluidChartSlide.scss +++ b/src/components/FluidChart/fluidChartSlide.scss @@ -11,6 +11,6 @@ min-height: 14rem; } .data-spinner { - margin-top: 4rem; + margin-top: 5rem; } } diff --git a/src/components/ProfileType/FormNavigation.spec.tsx b/src/components/FormGlobal/FormNavigation.spec.tsx similarity index 95% rename from src/components/ProfileType/FormNavigation.spec.tsx rename to src/components/FormGlobal/FormNavigation.spec.tsx index fbb34ae60ebc1375821ed973657ef5e71d22a3d0..a3357ea6784be7623a981443eef48f06e4ece0f2 100644 --- a/src/components/ProfileType/FormNavigation.spec.tsx +++ b/src/components/FormGlobal/FormNavigation.spec.tsx @@ -20,7 +20,6 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }) describe('FormNavigation component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) diff --git a/src/components/ProfileType/FormNavigation.tsx b/src/components/FormGlobal/FormNavigation.tsx similarity index 70% rename from src/components/ProfileType/FormNavigation.tsx rename to src/components/FormGlobal/FormNavigation.tsx index 07e9097a1c8adbb85c42d8ea0b8d9c3a2afc4b02..d2711c30bb04c4f18c8360ea7e55836d582aa1fc 100644 --- a/src/components/ProfileType/FormNavigation.tsx +++ b/src/components/FormGlobal/FormNavigation.tsx @@ -1,17 +1,21 @@ import React from 'react' -import 'components/ProfileType/formNavigation.scss' +import 'components/FormGlobal/formNavigation.scss' import classNames from 'classnames' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Button from '@material-ui/core/Button' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { EcogestureStepForm } from 'enum/ecogestureForm.enum' +import { SgeStep } from 'enum/sgeStep.enum' +import { useHistory } from 'react-router-dom' interface FormNavigationProps { - step: ProfileTypeStepForm | EcogestureStepForm + step: ProfileTypeStepForm | EcogestureStepForm | SgeStep handlePrevious: Function handleNext: Function disableNextButton: boolean + disablePrevButton?: boolean isEcogesture?: boolean + isLastConnectStep?: boolean } const FormNavigation: React.FC<FormNavigationProps> = ({ @@ -19,15 +23,21 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ handlePrevious, handleNext, disableNextButton, + disablePrevButton, isEcogesture, + isLastConnectStep, }: FormNavigationProps) => { const { t } = useI18n() - + const history = useHistory() const handlePreviousClick = () => { handlePrevious() } const handleNextClick = () => { handleNext() + //handle go back to connect for SGE + if (isLastConnectStep) { + history.push('/consumption/electricity') + } } return ( @@ -36,10 +46,12 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ aria-label={t('profile_type.accessibility.button_previous')} onClick={handlePreviousClick} className={'profile-navigation-button'} - disabled={step === ProfileTypeStepForm.HOUSING_TYPE} + disabled={ + disablePrevButton || step === ProfileTypeStepForm.HOUSING_TYPE + } classes={{ root: 'btn-profile-back', - label: 'text-16-normal', + label: 'text-16-bold', }} > {`< ${t('profile_type.form.button_previous')}`} @@ -57,11 +69,12 @@ const FormNavigation: React.FC<FormNavigationProps> = ({ })} disabled={disableNextButton} classes={{ - root: 'btn-profile-next rounded', - label: 'text-16-normal', + root: 'btn-profile-next', + label: 'text-16-bold', }} > {step === ProfileTypeStepForm.UPDATE_DATE || + isLastConnectStep || (step === EcogestureStepForm.EQUIPMENTS && isEcogesture) ? t('profile_type.form.button_end') : `${t('profile_type.form.button_next')} >`} diff --git a/src/components/ProfileType/ProfileTypeProgress.tsx b/src/components/FormGlobal/FormProgress.tsx similarity index 51% rename from src/components/ProfileType/ProfileTypeProgress.tsx rename to src/components/FormGlobal/FormProgress.tsx index 561c12159101e58157d4685450ad58778bfe77e3..8f8616872dbadd4abe525f2482831a8fa9c82ff4 100644 --- a/src/components/ProfileType/ProfileTypeProgress.tsx +++ b/src/components/FormGlobal/FormProgress.tsx @@ -1,17 +1,22 @@ import React from 'react' -import 'components/ProfileType/profileTypeProgress.scss' +import 'components/FormGlobal/formProgress.scss' import { ProfileTypeStepForm } from 'enum/profileType.enum' +import { SgeStep } from 'enum/sgeStep.enum' -interface ProfileTypeProgressProps { - step: ProfileTypeStepForm +interface FormProgressProps { + step: ProfileTypeStepForm | SgeStep + formType: 'sge' | 'profile' } -const ProfileTypeProgress: React.FC<ProfileTypeProgressProps> = ({ +const FormProgress: React.FC<FormProgressProps> = ({ step, -}: ProfileTypeProgressProps) => { + formType, +}: FormProgressProps) => { const getProgress = () => { - const total: number = Object.values(ProfileTypeStepForm).length / 2 - const progress: number = Math.round((step / total) * 100) + const total: number = + Object.values(formType === 'sge' ? SgeStep : ProfileTypeStepForm).length / + 2 + const progress: number = Math.round((step / total) * 100) || 1 return progress } return ( @@ -27,4 +32,4 @@ const ProfileTypeProgress: React.FC<ProfileTypeProgressProps> = ({ ) } -export default ProfileTypeProgress +export default FormProgress diff --git a/src/components/ProfileType/formNavigation.scss b/src/components/FormGlobal/formNavigation.scss similarity index 57% rename from src/components/ProfileType/formNavigation.scss rename to src/components/FormGlobal/formNavigation.scss index b3baeff5f57b2701a689aa1601dd4db2089a1a32..827eb3c93414073fa34204a33e3a0984fd155d53 100644 --- a/src/components/ProfileType/formNavigation.scss +++ b/src/components/FormGlobal/formNavigation.scss @@ -4,29 +4,20 @@ .profile-navigation { border-top: 1px solid $grey-dark; background: $dark-2; - position: fixed; - bottom: 0; - height: 6.5rem; - width: 100%; display: flex; justify-content: center; - align-items: flex-start; - padding: 0 0 env(safe-area-inset-bottom) 0; + align-items: center; + gap: 1.5rem; + padding: 1rem; + @media (min-width: $width-tablet) { background: $dark-light-2; height: 3rem; } - .rounded { - border-radius: 22px; - margin-left: 1rem; - margin-right: 1rem; - } - .disabled { - opacity: 0.5; - } + button.profile-navigation-button { max-width: 12.5rem; - margin: 0.375rem 1rem; + margin: 0; padding: 0.5rem 1rem; } } diff --git a/src/components/ProfileType/profileTypeProgress.scss b/src/components/FormGlobal/formProgress.scss similarity index 91% rename from src/components/ProfileType/profileTypeProgress.scss rename to src/components/FormGlobal/formProgress.scss index 2a7d6d5a7690e1b621074a4a5d95dfbcb36caadd..d14628b00b61b1a07769ddd104ad634db475a383 100644 --- a/src/components/ProfileType/profileTypeProgress.scss +++ b/src/components/FormGlobal/formProgress.scss @@ -1,12 +1,13 @@ @import '../../styles/base/color'; -.profile-type-progress{ +.profile-type-progress { display: flex; flex-direction: row; justify-content: center; align-items: center; .profile-type-progress-label { font-size: 0.938rem; + font-weight: 700; width: 1.875rem; color: $gold-shadow; text-align: right; @@ -22,4 +23,4 @@ border-radius: 12px; } } -} \ No newline at end of file +} diff --git a/src/components/GCU/GCUContent.tsx b/src/components/GCU/GCUContent.tsx index a518b669597e2acf5bc6532311459af3e8e1ac90..ec398cb5dcb7be24f47c81778f87594013c00ed5 100644 --- a/src/components/GCU/GCUContent.tsx +++ b/src/components/GCU/GCUContent.tsx @@ -61,8 +61,7 @@ const GCUContent: React.FC<GCUContentProps> = ({ <p className="text-14-normal">{t('gcu.content.part5_3')}</p> <ul className="text-14-normal"> <li>{t('gcu.content.part5_3_list1')}</li> - <li>{decoreText(t('gcu.content.part5_3_list2'))}</li> - <li>{t('gcu.content.part5_3_list3')}</li> + <li>{t('gcu.content.part5_3_list2')}</li> </ul> <p className="text-14-normal">{t('gcu.content.part5_4')}</p> <p className="text-14-normal">{t('gcu.content.part5_5')}</p> @@ -78,6 +77,7 @@ const GCUContent: React.FC<GCUContentProps> = ({ <li>{t('gcu.content.part6_3_list3')}</li> </ul> <p className="text-14-normal">{t('gcu.content.part6_4')}</p> + <p className="text-14-normal">{t('gcu.content.part6_5')}</p> <div className="gcu-content-part-title text-15-normal"> {t('gcu.content.title8')} </div> diff --git a/src/components/GCU/GCULink.tsx b/src/components/GCU/GCULink.tsx index 105d65d2f990f479080fce8317f92eff033aad84..d3bdd037f4985be8786cc229f8117744d67e7288 100644 --- a/src/components/GCU/GCULink.tsx +++ b/src/components/GCU/GCULink.tsx @@ -11,24 +11,21 @@ const GCULink: React.FC = () => { return ( <div className="gcu-link-root"> <div className="gcu-link-content"> - <div className="gcu-link-header text-16-normal-uppercase"> - {t('gcu_option.title')} - </div> <Link className="gcu-link-card-link" component={RouterLink} to="options/gcu" > - <div className="card"> + <div className="card optionCard"> <div className="gcu-link-card"> <div className="gcu-link-card-content"> <StyledIcon className="gcu-link-card-content-icon" icon={LegalNoticeIcon} - size={50} + size={42} /> <div className="gcu-link-card-content-title"> - {t('gcu_option.read_gcu')} + {t('gcu_option.title')} </div> </div> </div> diff --git a/src/components/GCU/__snapshots__/GCUContent.spec.tsx.snap b/src/components/GCU/__snapshots__/GCUContent.spec.tsx.snap index a099dc98b53721adf4c9adbcf3d442f437555b84..67a32efc169d6ad61786a0027d3cca580f41e6e6 100644 --- a/src/components/GCU/__snapshots__/GCUContent.spec.tsx.snap +++ b/src/components/GCU/__snapshots__/GCUContent.spec.tsx.snap @@ -144,9 +144,6 @@ exports[`GCUContent component should be rendered correctly 1`] = ` <li> gcu.content.part5_3_list2 </li> - <li> - gcu.content.part5_3_list3 - </li> </ul> <p className="text-14-normal" @@ -196,6 +193,11 @@ exports[`GCUContent component should be rendered correctly 1`] = ` > gcu.content.part6_4 </p> + <p + className="text-14-normal" + > + gcu.content.part6_5 + </p> <div className="gcu-content-part-title text-15-normal" > @@ -434,9 +436,6 @@ exports[`GCUContent component should display a link when translation contains <a <li> gcu.content.part5_3_list2 </li> - <li> - gcu.content.part5_3_list3 - </li> </ul> <p className="text-14-normal" @@ -486,6 +485,11 @@ exports[`GCUContent component should display a link when translation contains <a > gcu.content.part6_4 </p> + <p + className="text-14-normal" + > + gcu.content.part6_5 + </p> <div className="gcu-content-part-title text-15-normal" > diff --git a/src/components/GCU/__snapshots__/GCULink.spec.tsx.snap b/src/components/GCU/__snapshots__/GCULink.spec.tsx.snap index df907555797df2ce84ce553ff836c1df72ec76da..da5e1b8ff218650aaa87b7e74b76df94ceeaf5cc 100644 --- a/src/components/GCU/__snapshots__/GCULink.spec.tsx.snap +++ b/src/components/GCU/__snapshots__/GCULink.spec.tsx.snap @@ -31,7 +31,7 @@ exports[`LegalNoticeLink component should be rendered correctly 1`] = ` to="options/legalnotice" > <div - className="card" + className="card optionCard" onClick={[Function]} > <div @@ -43,7 +43,7 @@ exports[`LegalNoticeLink component should be rendered correctly 1`] = ` <StyledIcon className="legal-notice-card-content-icon" icon="test-file-stub" - size={50} + size={42} /> <div className="legal-notice-card-content-title" diff --git a/src/components/GCU/gcuLink.scss b/src/components/GCU/gcuLink.scss index b7545dd98ecfd6a257b712c512e5ec91e04f5ac4..42e9c1500da97f3a40f4cfe27d61c6d834fe42c4 100644 --- a/src/components/GCU/gcuLink.scss +++ b/src/components/GCU/gcuLink.scss @@ -7,8 +7,7 @@ align-items: center; justify-content: center; color: $white; - padding: 1rem 1.5rem 0; - margin-top: 1rem; + padding: 0 1.5rem 0; .gcu-link-header { margin-bottom: 1.25rem; } @@ -39,6 +38,9 @@ } } } +.optionCard { + padding: 0.938rem 1rem; +} .gcu-link-card-link { color: black; } diff --git a/src/components/HalfHourNoData/HalfHourNoData.spec.tsx b/src/components/HalfHourNoData/HalfHourNoData.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..84275d83bc6056bb85a120c6f190ee2847e001f4 --- /dev/null +++ b/src/components/HalfHourNoData/HalfHourNoData.spec.tsx @@ -0,0 +1,20 @@ +import React from 'react' +import { mount } from 'enzyme' +import HalfHourNoData from './HalfHourNoData' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +describe('HalfHourNoData component', () => { + it('should render correctly HalfHourNoData', () => { + const component = mount(<HalfHourNoData />) + expect(component).toMatchSnapshot() + }) +}) diff --git a/src/components/HalfHourNoData/HalfHourNoData.tsx b/src/components/HalfHourNoData/HalfHourNoData.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1834608414a7e84f390927e8363ac624da88503d --- /dev/null +++ b/src/components/HalfHourNoData/HalfHourNoData.tsx @@ -0,0 +1,15 @@ +import React from 'react' +import { IuseI18n, useI18n } from 'cozy-ui/transpiled/react/I18n' +import './halfHourNoData.scss' + +const HalfHourNoData = () => { + const { t }: IuseI18n = useI18n() + return ( + <div className="halfHour"> + <h2>{t('timestep.half_an_hour.gather_data_title')}</h2> + <p>{t('timestep.half_an_hour.gather_data_subtitle')}</p> + </div> + ) +} + +export default HalfHourNoData diff --git a/src/components/HalfHourNoData/__snapshots__/HalfHourNoData.spec.tsx.snap b/src/components/HalfHourNoData/__snapshots__/HalfHourNoData.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..ef55e75a7baa649a8a4924df51b3b59c2da6b06b --- /dev/null +++ b/src/components/HalfHourNoData/__snapshots__/HalfHourNoData.spec.tsx.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`HalfHourNoData component should render correctly HalfHourNoData 1`] = `ReactWrapper {}`; diff --git a/src/components/HalfHourNoData/halfHourNoData.scss b/src/components/HalfHourNoData/halfHourNoData.scss new file mode 100644 index 0000000000000000000000000000000000000000..2691c324d3d3ee41a7d1075eb27ee0a7bbe8f57a --- /dev/null +++ b/src/components/HalfHourNoData/halfHourNoData.scss @@ -0,0 +1,26 @@ +@import 'src/styles/base/color'; +@import 'src/styles/base/breakpoint'; + +.halfHour { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 2rem 0; + + // Same height as FluidChartSwipe + height: 25.5rem; + @media #{$large-phone} { + height: 17.5rem; + } + + h2 { + color: $elec-color; + margin-bottom: 3rem; + } + + p { + color: $grey-bright; + padding: 0 0.5rem; + } +} diff --git a/src/components/Header/CozyBar.tsx b/src/components/Header/CozyBar.tsx index e25b1c9703a9ff6b99783160c2ab0ce820a6e218..33b4c8d7449ba701836f955187b1e62bf12d8a02 100644 --- a/src/components/Header/CozyBar.tsx +++ b/src/components/Header/CozyBar.tsx @@ -1,17 +1,13 @@ -import React, { useCallback } from 'react' +import BackArrowIcon from 'assets/icons/ico/back-arrow.svg' +import FeedbackIcon from 'assets/icons/ico/feedback.svg' +import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useSelector, useDispatch } from 'react-redux' +import { ScreenType } from 'enum/screen.enum' +import React, { useCallback } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' import { AppStore } from 'store' import { updateModalIsFeedbacksOpen } from 'store/modal/modal.actions' -import { useHistory } from 'react-router-dom' -import Icon from 'cozy-ui/transpiled/react/Icon' - -import { ScreenType } from 'enum/screen.enum' -import HammerLeft from 'assets/icons/ico/hammer-left.svg' -import HammerRight from 'assets/icons/ico/hammer-right.svg' -import BackArrowIcon from 'assets/icons/ico/back-arrow.svg' -import FeedbacksIcon from 'assets/icons/ico/feedbacks.svg' -import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton' interface CozyBarProps { titleKey?: string @@ -69,8 +65,8 @@ const CozyBar = ({ <StyledIconButton aria-label={t('header.accessibility.button_open_feedbacks')} className="cv-button" - icon={FeedbacksIcon} - size={40} + icon={FeedbackIcon} + sized={22} onClick={handleClickFeedbacks} /> </BarRight> diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 2d10f4b38c84a13755a986c65c063c8966831717..3a469698acd1c2763813fac605baae53afe10cfe 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -7,14 +7,10 @@ import { updateModalIsFeedbacksOpen } from 'store/modal/modal.actions' import { useHistory } from 'react-router-dom' import { ScreenType } from 'enum/screen.enum' - -import IconButton from '@material-ui/core/IconButton' -import Icon from 'cozy-ui/transpiled/react/Icon' import BackArrowIcon from 'assets/icons/ico/back-arrow.svg' -import FeedbacksIcon from 'assets/icons/ico/feedbacks.svg' -import HammerLeft from 'assets/icons/ico/hammer-left.svg' -import HammerRight from 'assets/icons/ico/hammer-right.svg' -import { EcogestureStatus } from 'enum/ecogesture.enum' +import FeedbackIcon from 'assets/icons/ico/feedback.svg' +import Icon from 'cozy-ui/transpiled/react/Icon' +import IconButton from '@material-ui/core/IconButton' interface HeaderProps { textKey?: string @@ -104,7 +100,6 @@ const Header: React.FC<HeaderProps> = ({ <Icon icon={BackArrowIcon} size={16} /> </IconButton> )} - {/* {t(desktopTitleKey)} */} <span>{isNotKey ? desktopTitleKey : t(desktopTitleKey)}</span> </div> )} @@ -117,7 +112,7 @@ const Header: React.FC<HeaderProps> = ({ } onClick={handleClickFeedbacks} > - <Icon icon={FeedbacksIcon} size={40} /> + <Icon icon={FeedbackIcon} size={40} /> </IconButton> </div> {children} diff --git a/src/components/Header/header.scss b/src/components/Header/header.scss index 325ab08bd8fd1171b56dc7dc20bbfb2fef5bb917..58b400875df97adae6f402c919734b5db7e52a09 100644 --- a/src/components/Header/header.scss +++ b/src/components/Header/header.scss @@ -17,9 +17,9 @@ } .header-top { background: radial-gradient( - 74.83% 76.97% at 50% 13.64%, + 51.85% 47.89% at 50% 13.32%, #343641 0%, - #1b1c22 100% + $dark-2 100% ); width: 100%; .header-text { diff --git a/src/components/Home/ConsumptionView.spec.tsx b/src/components/Home/ConsumptionView.spec.tsx index 1692736e7d99cba2e99ac6a3701b00b80cf215bf..9aae9a9603d0c59ee157bfc52692b83b9c014375 100644 --- a/src/components/Home/ConsumptionView.spec.tsx +++ b/src/components/Home/ConsumptionView.spec.tsx @@ -1,21 +1,20 @@ -import React from 'react' +import Loader from 'components/Loader/Loader' +import { FluidState, FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' import { mount } from 'enzyme' -import { Provider } from 'react-redux' +import { FluidStatus } from 'models' +import React from 'react' import * as reactRedux from 'react-redux' +import { Provider } from 'react-redux' +import * as chartActions from 'store/chart/chart.actions' +import { mockTestProfile1 } from '../../../tests/__mocks__/profileType.mock' import { createMockStore, mockExpiredElec, + mockExpiredGas, mockInitialEcolyoState, } from '../../../tests/__mocks__/store' -import * as chartActions from 'store/chart/chart.actions' -import { FluidState, FluidType } from 'enum/fluid.enum' -import { TimeStep } from 'enum/timeStep.enum' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import FluidButtons from 'components/Home/FluidButtons' -import KonnectorViewerList from 'components/Konnector/KonnectorViewerList' import ConsumptionView from './ConsumptionView' -import { FluidStatus } from 'models' -import { mockTestProfile1 } from '../../../tests/__mocks__/profileType.mock' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -51,10 +50,8 @@ jest.mock( 'components/PartnersIssue/PartnersIssueModal', () => 'mock-partnersissuemodal' ) -jest.mock( - 'components/Connection/ExpiredConsentModal', - () => 'mock-expiredconsentmodal' -) +jest.mock('components/CustomPopup/CustomPopupModal', () => 'mock-custompopup') +jest.mock('components/Home/ReleaseNotesModal', () => 'mock-releasenotes') const useSelectorSpy = jest.spyOn(reactRedux, 'useSelector') const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') @@ -78,7 +75,6 @@ describe('ConsumptionView component', () => { loading: false, fluidStatus: mockFluidStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: false, }) const wrapper = mount( <Provider store={store}> @@ -102,7 +98,6 @@ describe('ConsumptionView component', () => { loading: true, fluidStatus: mockFluidStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: false, }) const wrapper = mount( <Provider store={store}> @@ -112,7 +107,7 @@ describe('ConsumptionView component', () => { expect(wrapper.find('mock-cozybar').exists()).toBeTruthy() expect(wrapper.find('mock-header').exists()).toBeTruthy() expect(wrapper.find('mock-datenavigator').exists()).toBeTruthy() - expect(wrapper.find(StyledSpinner).exists()).toBeTruthy() + expect(wrapper.find(Loader).exists()).toBeTruthy() }) it('should set CurrentTimeStep to WEEK when fluid != ELECTRICITY and timeStep = HALF_AN_HOUR', () => { @@ -121,7 +116,6 @@ describe('ConsumptionView component', () => { loading: true, fluidStatus: mockInitialEcolyoState.global.fluidStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: false, }) mount( <Provider store={store}> @@ -138,7 +132,6 @@ describe('ConsumptionView component', () => { loading: true, fluidStatus: mockInitialEcolyoState.global.fluidStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: false, }) const wrapper = mount( <Provider store={store}> @@ -152,13 +145,11 @@ describe('ConsumptionView component', () => { const updatedStatus: FluidStatus[] = mockInitialEcolyoState.global.fluidStatus updatedStatus[1].status = FluidState.DONE - useSelectorSpy.mockReturnValue({ currentTimeStep: TimeStep.WEEK, loading: true, fluidStatus: updatedStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: false, }) const wrapper = mount( <Provider store={store}> @@ -177,7 +168,6 @@ describe('ConsumptionView component', () => { loading: true, fluidStatus: updatedStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: false, }) const wrapper = mount( <Provider store={store}> @@ -187,7 +177,7 @@ describe('ConsumptionView component', () => { expect(wrapper.find('.consumptionview-content').exists()).toBeTruthy() expect(wrapper.find('mock-consumptiondetails').exists()).toBeTruthy() }) - it('should show partner issue Modal', async () => { + it('should render partner issue Modal', async () => { const updatedStatus: FluidStatus[] = mockInitialEcolyoState.global.fluidStatus updatedStatus[0] = mockExpiredElec @@ -196,7 +186,6 @@ describe('ConsumptionView component', () => { loading: true, fluidStatus: updatedStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, - openPartnersIssueModal: true, }) useDispatchSpy.mockReturnValue(jest.fn()) mockUpdateProfile.mockResolvedValue(mockTestProfile1) @@ -207,10 +196,10 @@ describe('ConsumptionView component', () => { ) expect(wrapper.find('mock-partnersissuemodal').exists()).toBeTruthy() }) - it('should show expired modal when a fluid oauth is expired', () => { + it('should show expired modal when a GRDF consent is expired', () => { const updatedStatus: FluidStatus[] = mockInitialEcolyoState.global.fluidStatus - updatedStatus[0] = mockExpiredElec + updatedStatus[0] = mockExpiredGas useSelectorSpy.mockReturnValue({ currentTimeStep: TimeStep.WEEK, loading: true, @@ -224,6 +213,66 @@ describe('ConsumptionView component', () => { <ConsumptionView fluidType={FluidType.MULTIFLUID} /> </Provider> ) - expect(wrapper.find('mock-expiredconsentmodal').exists()).toBeTruthy() + expect(wrapper.find('.title').text()).toBe('consent_outdated.title.2') + }) + it('should show expired modal when a Enedis consent is expired', () => { + const updatedStatus: FluidStatus[] = + mockInitialEcolyoState.global.fluidStatus + updatedStatus[0] = mockExpiredElec + useSelectorSpy.mockReturnValue({ + currentTimeStep: TimeStep.WEEK, + loading: true, + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }) + useDispatchSpy.mockReturnValue(jest.fn()) + const wrapper = mount( + <Provider store={store}> + <ConsumptionView fluidType={FluidType.MULTIFLUID} /> + </Provider> + ) + + expect(wrapper.find('.title').text()).toBe('consent_outdated.title.0') + }) + it('should render customPopup Modal', async () => { + const updatedStatus: FluidStatus[] = + mockInitialEcolyoState.global.fluidStatus + updatedStatus[0] = mockExpiredElec + useSelectorSpy.mockReturnValue({ + currentTimeStep: TimeStep.WEEK, + loading: true, + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + }) + useDispatchSpy.mockReturnValue(jest.fn()) + mockUpdateProfile.mockResolvedValue(mockTestProfile1) + const wrapper = mount( + <Provider store={store}> + <ConsumptionView fluidType={FluidType.ELECTRICITY} /> + </Provider> + ) + expect(wrapper.find('mock-custompopup').exists()).toBeTruthy() + }) + it('should render releaseNotesModal if releaseNotes.show is true', async () => { + const updatedStatus: FluidStatus[] = + mockInitialEcolyoState.global.fluidStatus + updatedStatus[0] = mockExpiredElec + useSelectorSpy.mockReturnValue({ + currentTimeStep: TimeStep.WEEK, + loading: true, + fluidStatus: updatedStatus, + releaseNotes: { + show: true, + notes: [{ description: 'description', title: 'title' }], + }, + }) + useDispatchSpy.mockReturnValue(jest.fn()) + mockUpdateProfile.mockResolvedValue(mockTestProfile1) + const wrapper = mount( + <Provider store={store}> + <ConsumptionView fluidType={FluidType.ELECTRICITY} /> + </Provider> + ) + expect(wrapper.find('mock-releasenotes').exists()).toBeTruthy() }) }) diff --git a/src/components/Home/ConsumptionView.tsx b/src/components/Home/ConsumptionView.tsx index 43fae72cd5aeadb5f885a2e12451a1f52effdf6d..ae00f24586dd6041ec9c2c7e05c11380cefe1ec2 100644 --- a/src/components/Home/ConsumptionView.tsx +++ b/src/components/Home/ConsumptionView.tsx @@ -1,46 +1,58 @@ -import React, { useCallback, useEffect, useState } from 'react' -import './consumptionView.scss' -import { useSelector, useDispatch } from 'react-redux' -import { AppStore } from 'store' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' +import React, { useCallback, useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { AppStore } from 'store' +import './consumptionView.scss' -import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' -import CozyBar from 'components/Header/CozyBar' -import Header from 'components/Header/Header' +import classNames from 'classnames' +import ExpiredConsentModal from 'components/Connection/ExpiredConsentModal' import Content from 'components/Content/Content' -import FluidChart from 'components/FluidChart/FluidChart' +import CustomPopupModal from 'components/CustomPopup/CustomPopupModal' import DateNavigator from 'components/DateNavigator/DateNavigator' -import { setCurrentTimeStep, setLoading } from 'store/chart/chart.actions' +import FluidChart from 'components/FluidChart/FluidChart' +import CozyBar from 'components/Header/CozyBar' +import Header from 'components/Header/Header' import ConsumptionDetails from 'components/Home/ConsumptionDetails' import FluidButtons from 'components/Home/FluidButtons' import KonnectorViewerCard from 'components/Konnector/KonnectorViewerCard' import KonnectorViewerList from 'components/Konnector/KonnectorViewerList' -import classNames from 'classnames' -import { getKonnectorUpdateError, isKonnectorActive } from 'utils/utils' -import ReleaseNotesModal from './releaseNotesModal' -import { setPartnersIssue, showReleaseNotes } from 'store/global/global.actions' +import Loader from 'components/Loader/Loader' import PartnersIssueModal from 'components/PartnersIssue/PartnersIssueModal' -import ProfileService from 'services/profile.service' import { useClient } from 'cozy-client' -import { DateTime } from 'luxon' -import ExpiredConsentModal from 'components/Connection/ExpiredConsentModal' - +import { useHistory } from 'react-router-dom' +import ProfileService from 'services/profile.service' +import { setCurrentTimeStep, setLoading } from 'store/chart/chart.actions' +import { + setCustomPopup, + setPartnersIssue, + showReleaseNotes, +} from 'store/global/global.actions' +import { + getKonnectorUpdateError, + getTodayDate, + isKonnectorActive, +} from 'utils/utils' +import ReleaseNotesModal from './ReleaseNotesModal' interface ConsumptionViewProps { fluidType: FluidType } const ConsumptionView: React.FC<ConsumptionViewProps> = ({ fluidType, }: ConsumptionViewProps) => { + const history = useHistory() const client = useClient() const dispatch = useDispatch() const isMulti = fluidType !== FluidType.MULTIFLUID const { currentTimeStep, loading } = useSelector( (state: AppStore) => state.ecolyo.chart ) - const { fluidStatus, releaseNotes, openPartnersIssueModal } = useSelector( - (state: AppStore) => state.ecolyo.global - ) + const { + fluidStatus, + releaseNotes, + customPopupModal, + openPartnersIssueModal, + } = useSelector((state: AppStore) => state.ecolyo.global) const [isFluidKonnected, setIsFluidKonnected] = useState<boolean>(false) const [openReleaseNoteModal, setOpenReleaseNoteModal] = useState<boolean>( @@ -54,7 +66,6 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ const [consentExpiredFluids, setconsentExpiredFluids] = useState<FluidType[]>( [] ) - /* eslint-disable @typescript-eslint/no-non-null-assertion */ const updatekey = fluidType !== FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate @@ -71,25 +82,41 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ setHeaderHeight(height) }, []) - const toggleReleaseNoteModal = useCallback(() => { - setOpenReleaseNoteModal(prev => !prev) - dispatch(showReleaseNotes(false, releaseNotes.notes)) - }, [dispatch, releaseNotes.notes]) + const handleCloseReleaseNoteModal = useCallback(() => { + setOpenReleaseNoteModal(false) + dispatch( + showReleaseNotes(false, releaseNotes.notes, releaseNotes.redirectLink) + ) + if (releaseNotes.redirectLink) { + history.push(releaseNotes.redirectLink) + } + }, [dispatch, history, releaseNotes.notes, releaseNotes.redirectLink]) const handleCloseModal = useCallback(async () => { const profileService = new ProfileService(client) const updatedProfile = await profileService.updateProfile({ - partnersIssueDate: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day'), + partnersIssueDate: getTodayDate(), }) if (updatedProfile) { dispatch(setPartnersIssue(false)) } }, [client, dispatch]) + const handleCloseCustomPopupModal = async () => { + const profileService = new ProfileService(client) + const updatedProfile = await profileService.updateProfile({ + customPopupDate: getTodayDate(), + }) + if (updatedProfile) { + dispatch( + setCustomPopup({ + ...customPopupModal, + popupEnabled: false, + }) + ) + } + } + useEffect(() => { setIsFluidKonnected(isKonnectorActive(fluidStatus, fluidType)) if ( @@ -106,17 +133,15 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ useEffect(() => { let subscribed = true + const expiredConsents: FluidType[] = [] //Check if some fluids have expired consent error - const expiredConsents = [] for (const fluid of fluidStatus) { - if ( - fluid.connection.triggerState?.last_error && - getKonnectorUpdateError(fluid.connection.triggerState.last_error) === - 'error_update_oauth' - ) { + const error = fluid.connection.triggerState?.last_error + if (error && getKonnectorUpdateError(error) === 'error_update_oauth') { expiredConsents.push(fluid.fluidType) } } + if (subscribed) setconsentExpiredFluids(expiredConsents) return () => { subscribed = false @@ -135,14 +160,14 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ {openReleaseNoteModal && ( <ReleaseNotesModal open={openReleaseNoteModal} - handleCloseClick={toggleReleaseNoteModal} + handleCloseClick={handleCloseReleaseNoteModal} ></ReleaseNotesModal> )} {isFluidKonnected ? ( <> {loading && ( <div className={'consumptionview-loading'} aria-busy="true"> - <StyledSpinner size="5em" fluidType={fluidType} /> + <Loader fluidType={fluidType} /> </div> )} <div @@ -194,6 +219,10 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ fluidStatus={fluidStatus} handleCloseClick={handleCloseModal} /> + <CustomPopupModal + customPopup={customPopupModal} + handleCloseClick={handleCloseCustomPopupModal} + /> {consentExpiredFluids.length && consentExpiredFluids.map(fluid => { return ( @@ -202,6 +231,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ open={openExpiredConsentModal} handleCloseClick={() => setopenExpiredConsentModal(false)} fluidType={fluid} + toggleModal={() => setopenExpiredConsentModal(prev => !prev)} /> ) })} diff --git a/src/components/Home/releaseNotesModal.scss b/src/components/Home/ReleaseNotesModal.scss similarity index 100% rename from src/components/Home/releaseNotesModal.scss rename to src/components/Home/ReleaseNotesModal.scss diff --git a/src/components/Home/releaseNotesModal.tsx b/src/components/Home/ReleaseNotesModal.tsx similarity index 95% rename from src/components/Home/releaseNotesModal.tsx rename to src/components/Home/ReleaseNotesModal.tsx index e46be103f00791fa7fbc9cdcec30e3b71849e711..507f38650ccc8c8e63381ce2a987000469ec14ad 100644 --- a/src/components/Home/releaseNotesModal.tsx +++ b/src/components/Home/ReleaseNotesModal.tsx @@ -1,10 +1,11 @@ -import React from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Button from '@material-ui/core/Button' -import './releaseNotesModal.scss' import Dialog from '@material-ui/core/Dialog' -import { AppStore } from 'store' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import React from 'react' import { useSelector } from 'react-redux' +import { AppStore } from 'store' +import { decoreText } from 'utils/decoreText' +import './ReleaseNotesModal.scss' interface ReleaseNotesModalProps { open: boolean @@ -52,7 +53,7 @@ const ReleaseNotesModal: React.FC<ReleaseNotesModalProps> = ({ {note.title} </div> <div className="release-note-description text-16-normal"> - {note.description} + {decoreText(note.description)} </div> </div> ))} diff --git a/src/components/Hooks/useExploration.tsx b/src/components/Hooks/useExploration.tsx index 9d9d4e0fa81f4f8567f68f838c26376927239c8a..eac9ba9bcd82b15968ed34a08aeb36b86f50c26b 100644 --- a/src/components/Hooks/useExploration.tsx +++ b/src/components/Hooks/useExploration.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/camelcase */ import { useState, useEffect, Dispatch, SetStateAction } from 'react' import { useDispatch, useSelector } from 'react-redux' import { Client, useClient } from 'cozy-client' diff --git a/src/components/Hooks/useKonnectorAuth.tsx b/src/components/Hooks/useKonnectorAuth.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2feceda088b7979cff007c8b2f198db54eecf90e --- /dev/null +++ b/src/components/Hooks/useKonnectorAuth.tsx @@ -0,0 +1,127 @@ +import * as Sentry from '@sentry/react' +import { Client, useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { FluidSlugType } from 'enum/fluidSlug.enum' +import { UsageEventType } from 'enum/usageEvent.enum' +import { + AccountAuthData, + AccountSgeData, + FluidConnection, + FluidStatus, + UsageEvent, +} from 'models' +import { useCallback, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import AccountService from 'services/account.service' +import ConnectionService from 'services/connection.service' +import UsageEventService from 'services/usageEvent.service' +import { AppStore } from 'store' +import { setLoading } from 'store/chart/chart.actions' +import { updatedFluidConnection } from 'store/global/global.actions' +import logApp from 'utils/logger' + +const useKonnectorAuth = ( + fluidStatus: FluidStatus, + login?: string, + password?: string +): [() => Promise<null | undefined>, () => Promise<void>, string] => { + const client: Client = useClient() + const { t } = useI18n() + const dispatch = useDispatch() + const konnectorSlug: FluidSlugType = + fluidStatus.connection.konnectorConfig.slug + const { sgeConnect } = useSelector((state: AppStore) => state.ecolyo.global) + + const [connectError, setError] = useState<string>('') + + const onSuccess = useCallback(async () => { + const updatedConnection: FluidConnection = { + ...fluidStatus.connection, + shouldLaunchKonnector: true, + } + dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) + }, [dispatch, fluidStatus.fluidType, fluidStatus.connection]) + + const sendUsageEventError = async (slug: string): Promise<UsageEvent> => { + return UsageEventService.addEvent(client, { + type: UsageEventType.KONNECTOR_CONNECT_EVENT, + target: slug, + result: 'error', + }) + } + + const connect = async () => { + const connectionService = new ConnectionService(client) + try { + // If first connexion, send the usage event + await UsageEventService.addEvent(client, { + type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, + target: konnectorSlug, + result: 'error', + }) + const { account: _account, trigger: _trigger } = + konnectorSlug === FluidSlugType.WATER + ? await connectionService.connectNewUser(konnectorSlug, { + login: login ? login : '', + password: password, + }) + : await connectionService.connectNewUser( + konnectorSlug, + undefined, + sgeConnect + ) + if (!_trigger || !_account) { + setError(t('konnector_form.error_account_creation')) + sendUsageEventError(konnectorSlug) + return null + } + const updatedConnection: FluidConnection = { + ...fluidStatus.connection, + account: _account, + trigger: _trigger, + } + setLoading(false) + dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) + onSuccess() + } catch (error) { + setLoading(false) + sendUsageEventError(konnectorSlug) + logApp.error(error) + Sentry.captureException(JSON.stringify({ error })) + } + } + + const update = async () => { + if (fluidStatus.connection.account) { + const _account = fluidStatus.connection.account + let auth: AccountAuthData | AccountSgeData + if (konnectorSlug === FluidSlugType.WATER) { + auth = { + login: login, + password: password, + } as AccountAuthData + } else { + auth = { + pointId: sgeConnect.pdl ? sgeConnect.pdl.toString() : '', + firstname: sgeConnect.firstName, + lastname: sgeConnect.lastName, + address: sgeConnect.address, + postalCode: sgeConnect.zipCode ? sgeConnect.zipCode.toString() : '', + city: sgeConnect.city, + } as AccountSgeData + } + _account.auth = auth + const accountService = new AccountService(client) + const updatedAccount = await accountService.updateAccount(_account) + const updatedConnection: FluidConnection = { + ...fluidStatus.connection, + account: updatedAccount, + } + dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) + onSuccess() + } + } + return [connect, update, connectError] +} + +export default useKonnectorAuth diff --git a/src/components/Hooks/userInstanceSettings.tsx b/src/components/Hooks/useUserInstanceSettings.tsx similarity index 76% rename from src/components/Hooks/userInstanceSettings.tsx rename to src/components/Hooks/useUserInstanceSettings.tsx index 34a0810aa55cc2dbf281c0f8eace00449f9abf10..00390b76c4a118c2f33820c0fd8755e923f9f4d1 100644 --- a/src/components/Hooks/userInstanceSettings.tsx +++ b/src/components/Hooks/useUserInstanceSettings.tsx @@ -1,14 +1,11 @@ -/* eslint-disable react-hooks/rules-of-hooks */ -// TODO remove the disable and transform it to hooks import { useState, useEffect } from 'react' import get from 'lodash/get' import { useClient } from 'cozy-client' import { UserInstanceSettings, UserInstanceSettingsAttributes } from 'models' -const userInstanceSettings = (): UserInstanceSettings => { +const useUserInstanceSettings = (): UserInstanceSettings => { const client = useClient() const [settings, setSettings] = useState<UserInstanceSettingsAttributes>({ - // eslint-disable-next-line @typescript-eslint/camelcase public_name: '', }) const [fetchStatus, setFetchStatus] = useState<string>('idle') @@ -34,4 +31,4 @@ const userInstanceSettings = (): UserInstanceSettings => { } } -export default userInstanceSettings +export default useUserInstanceSettings diff --git a/src/components/Konnector/KonnectorModal.spec.tsx b/src/components/Konnector/KonnectorModal.spec.tsx index 5f0308da6a915afe3fb03041c4796d18691791f0..8610edb9ad736b070f86885526ed18f0604d220f 100644 --- a/src/components/Konnector/KonnectorModal.spec.tsx +++ b/src/components/Konnector/KonnectorModal.spec.tsx @@ -9,6 +9,9 @@ import { import KonnectorModal from './KonnectorModal' import { FluidType } from 'enum/fluid.enum' import { Button } from '@material-ui/core' +import toJson from 'enzyme-to-json' +import { KonnectorError } from 'enum/konnectorError.enum' +import { waitForComponentToPaint } from '../../../tests/__mocks__/testUtils' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -20,11 +23,11 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { } }) -describe('KonnectroModal component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any +describe('KonnectorModal component', () => { let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) + jest.clearAllMocks() }) const mockHandleCloseClick = jest.fn() it('should be rendered correctly', () => { @@ -37,10 +40,13 @@ describe('KonnectroModal component', () => { error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> - ).getElement() - expect(wrapper).toMatchSnapshot() + ) + expect(toJson(wrapper)).toMatchSnapshot() }) it('should be with updating text', () => { const wrapper = mount( @@ -52,10 +58,13 @@ describe('KonnectroModal component', () => { error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) - expect(wrapper.find('.kmodal-waiting-text')).toBeTruthy() + expect(wrapper.find('.kmodal-waiting-text').exists()).toBeTruthy() }) it('should be correctly closed', async () => { const wrapper = mount( @@ -67,6 +76,9 @@ describe('KonnectroModal component', () => { error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) @@ -80,13 +92,16 @@ describe('KonnectroModal component', () => { open={true} isUpdating={false} state={'error'} - error={'LOGIN_FAILED'} + error={KonnectorError.LOGIN_FAILED} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) - expect(wrapper.find('.kce-picto-txt')).toBeTruthy() + expect(wrapper.find('.kce-picto-txt').exists()).toBeTruthy() }) it('should render unknown error', async () => { const wrapper = mount( @@ -95,12 +110,34 @@ describe('KonnectroModal component', () => { open={true} isUpdating={false} state={'error'} - error={''} + error={null} fluidType={FluidType.ELECTRICITY} handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} + /> + </Provider> + ) + expect(wrapper.find('.err-data-2').exists()).toBeTruthy() + }) + it('should render update error', async () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModal + open={true} + isUpdating={true} + state={null} + error={null} + fluidType={FluidType.WATER} + handleCloseClick={mockHandleCloseClick} + isLogging={false} + account={null} + handleAccountDeletion={jest.fn()} /> </Provider> ) - expect(wrapper.find('.err-data-2')).toBeTruthy() + await waitForComponentToPaint(wrapper) + expect(wrapper.find('.waiting-text').exists()).toBeTruthy() }) }) diff --git a/src/components/Konnector/KonnectorModal.tsx b/src/components/Konnector/KonnectorModal.tsx index d2c16a07e84868ec8a7feb89f975b601455de324..a71533554111eeff77da2b520d25bbcbb3cc8287 100644 --- a/src/components/Konnector/KonnectorModal.tsx +++ b/src/components/Konnector/KonnectorModal.tsx @@ -1,51 +1,47 @@ -import React, { useEffect, useMemo, useState } from 'react' -import './konnectorModal.scss' +import Dialog from '@material-ui/core/Dialog' +import EnedisIcon from 'assets/icons/ico/consent-outdated-enedis.svg' +import errorIcon from 'assets/icons/visu/data-nok.svg' +import successIcon from 'assets/icons/visu/data-ok.svg' import classNames from 'classnames' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import Lottie from 'react-lottie' -import * as loadingData from 'assets/anims/bounceloading.json' - +import Loader from 'components/Loader/Loader' +import connectionWaitingText from 'constants/connectionWaitingText.json' +import firstConnectionWaitingText from 'constants/firstConnectionWaitingText.json' import { ERROR_EVENT, SUCCESS_EVENT, - LOGIN_SUCCESS_EVENT, } from 'cozy-harvest-lib/dist/models/flowEvents' -import { FluidType } from 'enum/fluid.enum' - +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' -import Button from '@material-ui/core/Button' -import Dialog from '@material-ui/core/Dialog' -import errorIcon from 'assets/icons/visu/data-nok.svg' -import successIcon from 'assets/icons/visu/data-ok.svg' -import connectionWaitingText from 'constants/connectionWaitingText.json' -import firstConnectionWaitingText from 'constants/firstConnectionWaitingText.json' +import { FluidType } from 'enum/fluid.enum' +import { KonnectorError } from 'enum/konnectorError.enum' import { shuffle } from 'lodash' - -const loadingOptions = { - loop: true, - autoplay: true, - animationData: loadingData, - rendererSettings: { - preserveAspectRatio: 'xMidYMid slice', - }, -} +import { Account } from 'models' +import React, { useCallback, useEffect, useMemo, useState } from 'react' +import './konnectorModal.scss' +import KonnectorModalFooter from './KonnectorModalFooter' interface KonnectorModalProps { open: boolean isUpdating: boolean + isLogging: boolean state: string | null - error: string | null + error: KonnectorError | null fluidType: FluidType handleCloseClick: (isSuccess?: boolean) => void + handleAccountDeletion: () => Promise<void> + account: Account | null } const KonnectorModal: React.FC<KonnectorModalProps> = ({ open, isUpdating, + isLogging, state, error, fluidType, handleCloseClick, + handleAccountDeletion, + account, }: KonnectorModalProps) => { const { t } = useI18n() const fluidName: string = FluidType[fluidType] @@ -60,6 +56,47 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ const firstConnectionWaitingTexts = firstConnectionWaitingText.concat( ...shuffledWaitingTexts ) + const [showCommonErrors, setShowCommonErrors] = useState(false) + + const getUpdatingText = useCallback((): JSX.Element => { + return ( + <div className="kmodal-waiting-text text-18-italic"> + {shuffledWaitingTexts.map((text, idx) => ( + <div + key={idx} + className={classNames('waiting-text', { + ['show']: idx === index % shuffledWaitingTexts.length, + })} + > + <p>{text.first}</p> + <p>{text.second}</p> + </div> + ))} + </div> + ) + }, [index, shuffledWaitingTexts]) + + const getConnectionText = useCallback((): JSX.Element => { + return ( + <div className="kmodal-waiting-text text-18-italic"> + {isLogging ? ( + <p className="text-18-white">{t('konnector_modal.logging_txt')}</p> + ) : ( + firstConnectionWaitingTexts.map((text, idx) => ( + <div + key={idx} + className={classNames('waiting-text', { + ['show']: idx === index % firstConnectionWaitingTexts.length, + })} + > + <p>{text.first}</p> + <p>{text.second}</p> + </div> + )) + )} + </div> + ) + }, [firstConnectionWaitingTexts, index, isLogging, t]) useEffect(() => { const interval = setInterval(() => { @@ -93,51 +130,26 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ <div className="kmodal-content"> {open && !state ? ( <> - <Lottie options={loadingOptions} height={50} width={50} speed={2} /> - <div className="kmodal-content-text kmodal-content-text-center text-16-normal"> - <div className="kc-wait text-16-bold"> - {t( - `konnector_modal.loading_data${isUpdating ? '_update' : ''}` - )} - </div> - </div> - {isUpdating ? ( - <div className="kmodal-waiting-text text-18-italic"> - {shuffledWaitingTexts.map((text, idx) => ( - <div - key={idx} - className={classNames('waiting-text', { - ['show']: idx === index % shuffledWaitingTexts.length, - })} - > - <p>{text.first}</p> - <p>{text.second}</p> - </div> - ))} - </div> - ) : ( - <div className="kmodal-waiting-text text-18-italic"> - {firstConnectionWaitingTexts.map((text, idx) => ( - <div - key={idx} - className={classNames('waiting-text', { - ['show']: - idx === index % firstConnectionWaitingTexts.length, - })} - > - <p>{text.first}</p> - <p>{text.second}</p> - </div> - ))} + <Loader fluidType={fluidType} /> + {!isLogging && ( + <div className="kmodal-content-text kmodal-content-text-center text-16-normal"> + <div className="kc-wait text-16-bold"> + {t( + `konnector_modal.loading_data${isUpdating ? '_update' : ''}` + )} + </div> </div> )} + {isUpdating && getUpdatingText()} + {!isUpdating && getConnectionText()} </> ) : ( <> <div className="kmodal-info"> {state === ERROR_EVENT && ( <> - {error === 'LOGIN_FAILED' ? ( + {error === KonnectorError.LOGIN_FAILED && ( + //LOGIN FAILED FOR ENEDIS AND EGL <div className="konnector-config"> <Icon icon={errorIcon} size={48} /> <div className="kce-picto-txt text-20-bold"> @@ -150,28 +162,82 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ }${fluidName.toLowerCase()}` )} </div> + {fluidType === FluidType.ELECTRICITY && !isUpdating && ( + <div className="elec-fail"> + {t( + `konnector_modal.error_credentials_${fluidName.toLowerCase()}_2` + )} + </div> + )} + {/* Show common errors */} + {fluidType === FluidType.ELECTRICITY && ( + <> + {!showCommonErrors && ( + <span + className="commonErrors" + onClick={() => setShowCommonErrors(true)} + > + {t('konnector_modal.show_common_error')} + </span> + )} + {showCommonErrors && ( + <div + dangerouslySetInnerHTML={{ + __html: t( + 'konnector_modal.show_common_error_list' + ), + }} + /> + )} + </> + )} </div> - ) : ( - <div className="konnector-config"> - <Icon icon={errorIcon} size={48} /> - <div className="kce-picto-txt text-20-bold"> - {t('konnector_modal.error_txt')} - </div> - <div> - {t( - `konnector_modal.error_data_${ - isUpdating ? 'update_' : '' - }${fluidName.toLowerCase()}` - )} + )} + {error === KonnectorError.TERMS_VERSION_MISMATCH && + isUpdating && + fluidType === FluidType.ELECTRICITY && ( + //MISMATCH UPDATE ERROR ENEDIS + <div className="kce-picto-txt konnector-config mismatch"> + <Icon icon={EnedisIcon} width={120} height={80} /> + <div className="title text-20-bold"> + {t('konnector_modal.mismatch.title')} + </div> + <div className="text-15-white"> + {t('konnector_modal.mismatch.text1')} + </div> + <div className="text-15-white"> + {t('konnector_modal.mismatch.text2')} + </div> + <div className="info text-15-normal"> + {t('konnector_modal.mismatch.text3')} + </div> </div> - <div className="err-data-2"> - {t('konnector_modal.error_data_2')} + )} + {error !== KonnectorError.LOGIN_FAILED && + error !== KonnectorError.TERMS_VERSION_MISMATCH && ( + //DEFAULT CASE + <div className="konnector-config"> + {console.log('errortype', error)} + <Icon icon={errorIcon} size={48} /> + <div className="kce-picto-txt text-20-bold"> + {t('konnector_modal.error_txt')} + </div> + <div> + {t( + `konnector_modal.error_data_${ + isUpdating ? 'update_' : '' + }${fluidName.toLowerCase()}` + )} + </div> + <div className="err-data-2"> + {t('konnector_modal.error_data_2')} + </div> </div> - </div> - )} + )} </> )} {state === SUCCESS_EVENT && ( + //SUCCESS CASE <div className="konnector-config"> <Icon icon={successIcon} size={48} /> <div className="kcs-picto-txt text-20-bold"> @@ -184,18 +250,15 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ )} </div> )} - {state !== LOGIN_SUCCESS_EVENT && ( - <Button - aria-label={t('konnector_modal.accessibility.button_close')} - onClick={() => handleCloseClick(state === SUCCESS_EVENT)} - classes={{ - root: 'btn-highlight', - label: 'text-16-bold', - }} - > - <div>{t('konnector_modal.button_validate')}</div> - </Button> - )} + <KonnectorModalFooter + state={state} + error={error} + fluidType={fluidType} + handleCloseClick={handleCloseClick} + handleAccountDeletion={handleAccountDeletion} + account={account} + isUpdating={isUpdating} + /> </div> </> )} diff --git a/src/components/Konnector/KonnectorModalFooter.spec.tsx b/src/components/Konnector/KonnectorModalFooter.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..53cb597641b9fba6a8500545a73a28420aee7031 --- /dev/null +++ b/src/components/Konnector/KonnectorModalFooter.spec.tsx @@ -0,0 +1,190 @@ +import React from 'react' +import { mount } from 'enzyme' +import { Provider } from 'react-redux' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { ERROR_EVENT } from 'cozy-harvest-lib/dist/models/flowEvents' +import toJson from 'enzyme-to-json' +import KonnectorModalFooter from './KonnectorModalFooter' +import { FluidType } from 'enum/fluid.enum' +import { KonnectorError } from 'enum/konnectorError.enum' +import { Button } from '@material-ui/core' +import { accountsData } from '../../../tests/__mocks__/accountsData.mock' +import { waitForComponentToPaint } from '../../../tests/__mocks__/testUtils' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockHistoryPush = jest.fn() +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})) +const mockClose = jest.fn() +const mockDelete = jest.fn() +describe('KonnectorModalFooter component', () => { + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + mockDelete.mockClear() + mockClose.mockClear() + mockHistoryPush.mockClear() + }) + + it('should be rendered correctly', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={null} + error={null} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + it('should render "understood" for enedis sge when postal code not supported (USER_ACTION_NEEDED)', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.USER_ACTION_NEEDED} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(wrapper.find(Button).text()).toBe( + 'konnector_modal.button_understood' + ) + }) + + it('should render "come back later" for enedis sge when address / name / pdl are not matching (LOGIN_FAILED)', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.LOGIN_FAILED} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(wrapper.find(Button).text()).toBe( + 'konnector_modal.button_come_back_later' + ) + }) + + it('should render "later" and "Verify infos" for enedis sge encountering an error on contract (TERMS_VERSION_MISMATCH)', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + expect(wrapper.find(Button).at(0).text()).toBe('Plus tard') + expect(wrapper.find(Button).at(1).text()).toBe('Vérifier les infos') + }) + + it('should close the modal', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.LOGIN_FAILED} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + wrapper.find(Button).first().simulate('click') + expect(mockClose).toHaveBeenCalled() + }) + it('should go back to login', async () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={accountsData[0]} + isUpdating={true} + /> + </Provider> + ) + wrapper.find(Button).at(1).simulate('click') + await waitForComponentToPaint(wrapper) + expect(mockDelete).toHaveBeenCalled() + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + }) + it('should reset sge account and go back to login', async () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={accountsData[0]} + isUpdating={true} + /> + </Provider> + ) + wrapper.find(Button).at(1).simulate('click') + await waitForComponentToPaint(wrapper) + expect(mockDelete).toHaveBeenCalled() + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + }) + it('should not reset account if no account', () => { + const wrapper = mount( + <Provider store={store}> + <KonnectorModalFooter + state={ERROR_EVENT} + error={KonnectorError.TERMS_VERSION_MISMATCH} + fluidType={FluidType.ELECTRICITY} + handleCloseClick={mockClose} + handleAccountDeletion={mockDelete} + account={null} + isUpdating={false} + /> + </Provider> + ) + wrapper.find(Button).at(1).simulate('click') + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + expect(mockDelete).toHaveBeenCalledTimes(0) + }) +}) diff --git a/src/components/Konnector/KonnectorModalFooter.tsx b/src/components/Konnector/KonnectorModalFooter.tsx new file mode 100644 index 0000000000000000000000000000000000000000..40b11039edd43a581182994d6e3fe7b5a37cf97b --- /dev/null +++ b/src/components/Konnector/KonnectorModalFooter.tsx @@ -0,0 +1,157 @@ +import Button from '@material-ui/core/Button' +import { useClient } from 'cozy-client' +import { + ERROR_EVENT, + SUCCESS_EVENT, +} from 'cozy-harvest-lib/dist/models/flowEvents' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { FluidType } from 'enum/fluid.enum' +import { KonnectorError } from 'enum/konnectorError.enum' +import { Account } from 'models' +import React, { useCallback } from 'react' +import { useHistory } from 'react-router-dom' +import AccountService from 'services/account.service' +import './konnectorModal.scss' + +interface KonnectorModalFooterProps { + state: string | null + error: KonnectorError | null + fluidType: FluidType + handleCloseClick: (isSuccess?: boolean) => void + handleAccountDeletion: () => Promise<void> + account: Account | null + isUpdating: boolean +} + +const KonnectorModalFooter: React.FC<KonnectorModalFooterProps> = ({ + state, + error, + fluidType, + handleCloseClick, + handleAccountDeletion, + account, + isUpdating, +}: KonnectorModalFooterProps) => { + const { t } = useI18n() + const history = useHistory() + const client = useClient() + const handleSGELoginRetry = useCallback(() => { + handleCloseClick(state === SUCCESS_EVENT) + history.push('/sge-connect') + }, [handleCloseClick, history, state]) + + const handleResetSGEAccount = useCallback(async () => { + if (account) { + const accountService = new AccountService(client) + await accountService.deleteAccount(account) + await handleAccountDeletion() + history.push('/sge-connect') + } + }, [account, client, handleAccountDeletion, history]) + + const errorButtons = () => { + switch (error) { + case KonnectorError.USER_ACTION_NEEDED: + //INSEE CODE ERROR ENEDIS + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{t('konnector_modal.button_understood')}</div> + </Button> + ) + case KonnectorError.LOGIN_FAILED: + //MISMATCH NAME / ADDRESS / PDL + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{t('konnector_modal.button_come_back_later')}</div> + </Button> + ) + case KonnectorError.TERMS_VERSION_MISMATCH: + return ( + <div className="buttons"> + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-secondary-negative', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{'Plus tard'}</div> + </Button> + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={ + !isUpdating ? handleSGELoginRetry : handleResetSGEAccount + } + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{!isUpdating ? 'Vérifier les infos' : 'Jy vais'}</div> + </Button> + </div> + ) + default: + //DEFAULT FOOTER BUTTONS + //TODO change default button + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + style={{ height: '40px' }} + > + <div>{t('konnector_modal.button_validate')}</div> + </Button> + ) + } + } + + const successButton = () => { + //DEFAULT FOOTER BUTTONS + return ( + <Button + aria-label={t('konnector_modal.accessibility.button_close')} + onClick={() => handleCloseClick(state === SUCCESS_EVENT)} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + <div>{t('konnector_modal.button_validate')}</div> + </Button> + ) + } + + return ( + <> + {state === ERROR_EVENT && fluidType === FluidType.ELECTRICITY + ? errorButtons() + : successButton()} + </> + ) +} + +export default KonnectorModalFooter diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx index 470ab679a1ed35d9b47454d8d6d23191bf44b1bf..c160dc6332b4f0f4b35bfd1cb950caf39af4f93a 100644 --- a/src/components/Konnector/KonnectorViewerCard.tsx +++ b/src/components/Konnector/KonnectorViewerCard.tsx @@ -16,6 +16,7 @@ import { FluidStatus, FluidConnection, UsageEvent, + AccountAuthData, } from 'models' import { getAddPicto, getParamPicto } from 'utils/picto' import { setChallengeConsumption } from 'store/challenge/challenge.actions' @@ -57,6 +58,8 @@ import UsageEventService from 'services/usageEvent.service' import { UsageEventType } from 'enum/usageEvent.enum' import PartnersInfoService from 'services/partnersInfo.service' import { PartnersInfo } from 'models/partnersInfo.model' +import { FluidSlugType } from 'enum/fluidSlug.enum' +import { KonnectorError } from 'enum/konnectorError.enum' interface KonnectorViewerCardProps { fluidStatus: FluidStatus @@ -90,9 +93,11 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const [openModal, setOpenModal] = useState(false) const [isUpdating, setIsUpdating] = useState(false) - const [konnectorErrorDescription, setKonnectorErrorDescription] = useState< - string | null - >(null) + const [isLogging, setIsLogging] = useState( + fluidSlug !== FluidSlugType.GAS ? true : false + ) + const [konnectorErrorDescription, setKonnectorErrorDescription] = + useState<KonnectorError | null>(null) const [konnectorState, setKonnectorState] = useState<string | null>(null) const [updatedFluidStatus, setUpdatedFluidStatus] = useState<FluidStatus[]>( [] @@ -107,7 +112,6 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ [client] ) - /* eslint-disable @typescript-eslint/no-non-null-assertion */ const lastDataDate = fluidType !== FluidType.MULTIFLUID && statusArray[fluidType].lastDataDate ? statusArray[fluidType].lastDataDate!.toLocaleString() + fluidType @@ -131,7 +135,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const refDate: DateTime = DateTime.fromISO('0001-01-01') let _lastDataDate: DateTime | null = DateTime.fromISO('0001-01-01') for (const fluid of _updatedFluidStatus) { - if (fluid?.lastDataDate > _lastDataDate) { + if (fluid && fluid?.lastDataDate && fluid?.lastDataDate > _lastDataDate) { _lastDataDate = fluid.lastDataDate } } @@ -183,20 +187,37 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const handleConnectionEnd = useCallback( async (isSuccess?: boolean) => { if ( - account && - konnectorErrorDescription === 'LOGIN_FAILED' && - fluidStatus !== null && - fluidStatus.connection.account !== null && - fluidStatus.connection.account.auth !== undefined && - fluidStatus.connection.account.auth.login + //CASE FOR GLOBAL LOGIN FAILED + (account && + !isSuccess && + (konnectorErrorDescription === KonnectorError.LOGIN_FAILED || + konnectorErrorDescription === KonnectorError.UNKNOWN_ERROR || + konnectorErrorDescription == KonnectorError.CRITICAL) && + fluidStatus !== null && + fluidStatus.connection.account !== null && + fluidStatus.connection.account.auth !== undefined) || + //CASE FOR ENEDIS CODE INSEE ERROR + (account && + !isSuccess && + !isUpdating && + fluidType === FluidType.ELECTRICITY && + fluidStatus !== null && + fluidStatus.connection.account !== null && + fluidStatus.connection.account.auth !== undefined) ) { - fluidStatus.connection.konnectorConfig.lastKnownCredentials = - fluidStatus.connection.account.auth.login + //KEEP CREDENTIALS FOR EGL + if (fluidSlug === FluidSlugType.WATER) { + const auth = fluidStatus.connection.account.auth as AccountAuthData + fluidStatus.connection.konnectorConfig.lastKnownCredentials = + auth.login + } + //DELETE ACCOUNT const accountService = new AccountService(client) await accountService.deleteAccount(account) await handleAccountDeletion() } else { if (isSuccess && fluidStatus.lastDataDate === null) { + //UPDATE THE DACC EVENT STATUS TO SUCCESS await UsageEventService.udpateConnectionAttemptEvent( client, fluidSlug @@ -219,16 +240,18 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ }, [ account, - client, - dispatch, - fluidService, - fluidStatus, - handleAccountDeletion, konnectorErrorDescription, - partnersInfoService, + fluidStatus, + isUpdating, + fluidType, setActive, - updatedFluidStatus.length, fluidSlug, + client, + handleAccountDeletion, + updatedFluidStatus.length, + partnersInfoService, + fluidService, + dispatch, ] ) @@ -367,7 +390,6 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ return ( <span className="text-16-bold outdated"> {t('konnector_options.outdated', { - // eslint-disable-next-line @typescript-eslint/camelcase isOutdatedData: isOutdatedData, })} </span> @@ -389,6 +411,18 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ t, ]) + // If user has selected accept button on Expired consent modal, then delete its account + useEffect(() => { + async function deleteAccountForConsentRefresh() { + if (shouldRefreshConsent && account) { + const accountService = new AccountService(client) + await accountService.deleteAccount(account) + await handleAccountDeletion() + } + } + deleteAccountForConsentRefresh() + }, [account, client, handleAccountDeletion, shouldRefreshConsent]) + useEffect(() => { let subscribed = true async function getData() { @@ -410,8 +444,8 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ callbackResponse(ERROR_EVENT) }) connectionFlow.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => { + setIsLogging(false) sendUsageEventSuccess(fluidSlug, fluidStatus.lastDataDate === null) - callbackResponse(LOGIN_SUCCESS_EVENT) }) connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => { sendUsageEventSuccess(fluidSlug, fluidStatus.lastDataDate === null) @@ -419,7 +453,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ }) } } - getData() + !shouldRefreshConsent && getData() const dateChartService = new DateChartService() setIsOutdatedData( dateChartService.isDataOutdated(fluidStatus.lastDataDate, fluidType) @@ -442,20 +476,9 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ sendUsageEventError, fluidSlug, sendUsageEventSuccess, + shouldRefreshConsent, ]) - useEffect(() => { - // If user has selected accept button on Expired consent modal, then delete its account - async function deleteAccountForConsentRefresh() { - if (shouldRefreshConsent && account) { - const accountService = new AccountService(client) - await accountService.deleteAccount(account) - await handleAccountDeletion() - } - } - deleteAccountForConsentRefresh() - }, [account, client, handleAccountDeletion, shouldRefreshConsent]) - return ( <> {!isDisconnected ? ( @@ -479,7 +502,9 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ fluidStatus.fluidType ].toLowerCase()}` )} - expandIcon={<Icon icon={chevronDown} size={16} />} + expandIcon={ + <Icon icon={chevronDown} size={16} className="accordion-icon" /> + } classes={{ root: 'expansion-panel-summary', content: 'expansion-panel-content', @@ -512,10 +537,13 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ <KonnectorModal open={openModal} isUpdating={isUpdating} + isLogging={isLogging} state={konnectorState} error={konnectorErrorDescription} fluidType={fluidStatus.fluidType} handleCloseClick={handleConnectionEnd} + handleAccountDeletion={handleAccountDeletion} + account={account} /> </> ) diff --git a/src/components/Konnector/KonnectorViewerList.spec.tsx b/src/components/Konnector/KonnectorViewerList.spec.tsx index b87e6632f3191d4c3158e0cb5ac0659408ecc138..5e71995a85e25d93277ff8b44bc31b3425f51494 100644 --- a/src/components/Konnector/KonnectorViewerList.spec.tsx +++ b/src/components/Konnector/KonnectorViewerList.spec.tsx @@ -27,7 +27,6 @@ jest.mock('react-router-dom', () => ({ })) describe('KonnectorViewerList component', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any let store: any beforeEach(() => { store = createMockStore(mockInitialEcolyoState) diff --git a/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap b/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap index c011bada0e60d4f97ca05b955a146ce9c49bb4d2..4e833e5a8723391b59f612379dd4e8fd0887f79f 100644 --- a/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap +++ b/src/components/Konnector/__snapshots__/KonnectorModal.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`KonnectroModal component should be rendered correctly 1`] = ` +exports[`KonnectorModal component should be rendered correctly 1`] = ` <Provider store={ Object { @@ -14,12 +14,960 @@ exports[`KonnectroModal component should be rendered correctly 1`] = ` } > <KonnectorModal + account={null} error={null} fluidType={0} + handleAccountDeletion={[MockFunction]} handleCloseClick={[MockFunction]} + isLogging={false} isUpdating={false} open={true} state={null} - /> + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={true} + onClose={[Function]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + konnector_modal.accessibility.window_title + </div> + <div + class="kmodal-content" + > + <div + aria-busy="true" + aria-label="common.accessibility.loading" + class="loader elec" + title="common.accessibility.loading" + > + <div + class="bar" + /> + <div + class="bar" + /> + <div + class="bar" + /> + </div> + <div + class="kmodal-content-text kmodal-content-text-center text-16-normal" + > + <div + class="kc-wait text-16-bold" + > + konnector_modal.loading_data + </div> + </div> + <div + class="kmodal-waiting-text text-18-italic" + > + <div + class="waiting-text show" + > + <p> + La première fois cela peut prendre quelques minutes, par la suite, seulement quelques secondes. + </p> + <p /> + </div> + <div + class="waiting-text" + > + <p> + Afin de limiter le temps de ce premier chargement, un historique réduit de vos consommations va être chargé. Vous aurez tout de même accès à un an d'historique dès à présent. + </p> + <p /> + </div> + <div + class="waiting-text" + > + <p> + Demain matin, vous aurez accès à l'ensemble de vos données (jusqu'à trois ans d'historique). + </p> + <p /> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + Pour acheminer l’eau sur Lyon (Lugdunum !) l’acqueduc de Gier faisait 86 km à l’époque Romaine ! + </p> + </div> + <div + class="waiting-text" + > + <p> + Rien que de l’eau, de l’eau de pluie, de l’eau de la Métroooooo + </p> + <p> + ♪♪ + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + Environ 90% de notre électricité provient de centrales de production hors de notre métropole. + </p> + </div> + <div + class="waiting-text" + > + <p> + « Il y a de l’eau dans le gaz » … + </p> + <p> + Avec Ecolyo c’est l’eau AVEC le gaz. + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + La consommation énergétique résidentielle représente environ 30% de la consommation énergétique totale de notre territoire. + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + La Métropole de Lyon a été territoire d’expérimentation Linky. Le compteur est présent sur notre territoire depuis plus de 10 ans ! + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + 10 minutes d'aération par jour permettent à notre habitat d’être plus sain, avec un air renouvelé, moins de polluants et l’évacuation de l’humidité qui stagne et qui nous oblige à consommer plus de chauffage. + </p> + </div> + <div + class="waiting-text" + > + <p> + Le saviez-vous ? + </p> + <p> + 2°C ! C’est la différence qu’on peut mesurer dans une rue bien arborée en comparaison d’une rue vide : la végétation est donc cruciale pour le bien être en ville l’été et pour limiter l’installation des climatiseurs. + </p> + </div> + <div + class="waiting-text" + > + <p> + Il y a les bonnes pratiques de consommations énergétiques (et Ecolyo est là pour cela !) mais aussi et bien sûr, la rénovation. + </p> + <p> + Le saviez-vous ? La loi énergie climat de 2019 impose que d’ici 2025, les bâtiments privés résidentiels les plus énergivores soient tous rénovés ! + </p> + </div> + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <Unstable_TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onMouseDown={[Function]} + onMouseUp={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + konnector_modal.accessibility.window_title + </div> + <div + className="kmodal-content" + > + <Loader + fluidType={0} + > + <div + aria-busy="true" + aria-label="common.accessibility.loading" + className="loader elec" + title="common.accessibility.loading" + > + <div + className="bar" + /> + <div + className="bar" + /> + <div + className="bar" + /> + </div> + </Loader> + <div + className="kmodal-content-text kmodal-content-text-center text-16-normal" + > + <div + className="kc-wait text-16-bold" + > + konnector_modal.loading_data + </div> + </div> + <div + className="kmodal-waiting-text text-18-italic" + > + <div + className="waiting-text show" + key="0" + > + <p> + La première fois cela peut prendre quelques minutes, par la suite, seulement quelques secondes. + </p> + <p /> + </div> + <div + className="waiting-text" + key="1" + > + <p> + Afin de limiter le temps de ce premier chargement, un historique réduit de vos consommations va être chargé. Vous aurez tout de même accès à un an d'historique dès à présent. + </p> + <p /> + </div> + <div + className="waiting-text" + key="2" + > + <p> + Demain matin, vous aurez accès à l'ensemble de vos données (jusqu'à trois ans d'historique). + </p> + <p /> + </div> + <div + className="waiting-text" + key="3" + > + <p> + Le saviez-vous ? + </p> + <p> + Pour acheminer l’eau sur Lyon (Lugdunum !) l’acqueduc de Gier faisait 86 km à l’époque Romaine ! + </p> + </div> + <div + className="waiting-text" + key="4" + > + <p> + Rien que de l’eau, de l’eau de pluie, de l’eau de la Métroooooo + </p> + <p> + ♪♪ + </p> + </div> + <div + className="waiting-text" + key="5" + > + <p> + Le saviez-vous ? + </p> + <p> + Environ 90% de notre électricité provient de centrales de production hors de notre métropole. + </p> + </div> + <div + className="waiting-text" + key="6" + > + <p> + « Il y a de l’eau dans le gaz » … + </p> + <p> + Avec Ecolyo c’est l’eau AVEC le gaz. + </p> + </div> + <div + className="waiting-text" + key="7" + > + <p> + Le saviez-vous ? + </p> + <p> + La consommation énergétique résidentielle représente environ 30% de la consommation énergétique totale de notre territoire. + </p> + </div> + <div + className="waiting-text" + key="8" + > + <p> + Le saviez-vous ? + </p> + <p> + La Métropole de Lyon a été territoire d’expérimentation Linky. Le compteur est présent sur notre territoire depuis plus de 10 ans ! + </p> + </div> + <div + className="waiting-text" + key="9" + > + <p> + Le saviez-vous ? + </p> + <p> + 10 minutes d'aération par jour permettent à notre habitat d’être plus sain, avec un air renouvelé, moins de polluants et l’évacuation de l’humidité qui stagne et qui nous oblige à consommer plus de chauffage. + </p> + </div> + <div + className="waiting-text" + key="10" + > + <p> + Le saviez-vous ? + </p> + <p> + 2°C ! C’est la différence qu’on peut mesurer dans une rue bien arborée en comparaison d’une rue vide : la végétation est donc cruciale pour le bien être en ville l’été et pour limiter l’installation des climatiseurs. + </p> + </div> + <div + className="waiting-text" + key="11" + > + <p> + Il y a les bonnes pratiques de consommations énergétiques (et Ecolyo est là pour cela !) mais aussi et bien sûr, la rénovation. + </p> + <p> + Le saviez-vous ? La loi énergie climat de 2019 impose que d’ici 2025, les bâtiments privés résidentiels les plus énergivores soient tous rénovés ! + </p> + </div> + </div> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </Unstable_TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </KonnectorModal> </Provider> `; diff --git a/src/components/Konnector/__snapshots__/KonnectorModalFooter.spec.tsx.snap b/src/components/Konnector/__snapshots__/KonnectorModalFooter.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..527aa6f28cc29dd6db93240fe135b592d52877e6 --- /dev/null +++ b/src/components/Konnector/__snapshots__/KonnectorModalFooter.spec.tsx.snap @@ -0,0 +1,160 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`KonnectorModalFooter component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <KonnectorModalFooter + account={null} + error={null} + fluidType={0} + handleAccountDeletion={[MockFunction]} + handleCloseClick={[MockFunction]} + isUpdating={false} + state={null} + > + <WithStyles(ForwardRef(Button)) + aria-label="konnector_modal.accessibility.button_close" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="konnector_modal.accessibility.button_close" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="konnector_modal.accessibility.button_close" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="konnector_modal.accessibility.button_close" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="konnector_modal.accessibility.button_close" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + <div> + konnector_modal.button_validate + </div> + </span> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </KonnectorModalFooter> +</Provider> +`; diff --git a/src/components/Konnector/konnectorModal.scss b/src/components/Konnector/konnectorModal.scss index 670a58bb1cf76da2b12a2c1c6ee2a711fb5497e2..f6fd4967003b641af2010af18788b5308d4f5726 100644 --- a/src/components/Konnector/konnectorModal.scss +++ b/src/components/Konnector/konnectorModal.scss @@ -43,24 +43,46 @@ } .kmodal-info { - margin: 1.5rem; + padding: 1rem; text-align: center; - + .buttons { + display: flex; + gap: 0.825rem; + } .konnector-config { align-items: center; display: flex; flex-direction: column; justify-content: center; text-align: center; - + gap: 1rem; + .elec-fail { + color: $grey-bright; + margin-top: 1rem; + } + &.mismatch { + .title { + color: $orange; + } + div { + margin-bottom: 1rem; + } + .info { + color: $grey-bright; + } + } .kce-picto-txt { color: $red-primary; - margin: 1.25rem; } .kcs-picto-txt { color: $multi-color; - margin: 1.25rem; + } + + .commonErrors { + text-decoration: underline; + cursor: pointer; + margin: 1rem auto 0.5rem; } } } diff --git a/src/components/LegalNotice/LegalNoticeContent.tsx b/src/components/LegalNotice/LegalNoticeContent.tsx index 66b9eedd6ec4dec558b5ba1e43b59191aa239b46..4b14ca7f09a524eee7a1d247ef0d5c8ab5df9eef 100644 --- a/src/components/LegalNotice/LegalNoticeContent.tsx +++ b/src/components/LegalNotice/LegalNoticeContent.tsx @@ -31,7 +31,7 @@ const LegalNoticeContent: React.FC = () => { </div> <div className="legal-notice-oneline"> <span className="text-14-normal">{t('legal.p4b')}</span> - {decoreText(t('legal.p4'))} + {t('legal.p4')} </div> <div className="legal-notice-oneline"> <span className="text-14-normal">{t('legal.p5b')}</span> @@ -50,29 +50,31 @@ const LegalNoticeContent: React.FC = () => { <p>{t('legal.part2')}</p> <ul> <li>{t('legal.part2-1')}</li> + <li>{t('legal.part2-2')}</li> <li> - {t('legal.part2-2')} + {t('legal.part2-3')} <ul> - <li>{t('legal.part2-2-1')}</li> - <li>{t('legal.part2-2-2')}</li> - <li>{t('legal.part2-2-3')}</li> - <li>{decoreText(t('legal.part2-2-4'))}</li> - <li>{t('legal.part2-2-5')}</li> + <li>{t('legal.part2-3-1')}</li> + <li>{t('legal.part2-3-2')}</li> + <li>{t('legal.part2-3-3')}</li> + <li>{t('legal.part2-3-4')}</li> + <li>{decoreText(t('legal.part2-3-5'))}</li> </ul> </li> - <li>{t('legal.part2-3')}</li> + <li>{t('legal.part2-4')}</li> </ul> - <p>{t('legal.part2-4')}</p> + <p>{t('legal.part2-5')}</p> + <p>{t('legal.part2-6')}</p> <ul> - <li>{t('legal.part2-4-1')}</li> - <li>{t('legal.part2-4-2')}</li> - <li>{t('legal.part2-4-3')}</li> + <li>{t('legal.part2-6-1')}</li> + <li>{t('legal.part2-6-2')}</li> + <li>{t('legal.part2-6-3')}</li> </ul> - <p>{decoreText(t('legal.part2-5'))}</p> - <p>{t('legal.part2-6')}</p> - <p>{t('legal.part2-7')}</p> - <p>{decoreText(t('legal.part2-8'))}</p> + <p>{decoreText(t('legal.part2-7'))}</p> + <p>{t('legal.part2-8')}</p> <p>{t('legal.part2-9')}</p> + <p>{decoreText(t('legal.part2-10'))}</p> + <p>{t('legal.part2-11')}</p> </div> <div className="legal-notice-part"> <h3>{t('legal.title3')}</h3> diff --git a/src/components/LegalNotice/LegalNoticeLink.tsx b/src/components/LegalNotice/LegalNoticeLink.tsx index cf86ad49327d5f2bcaa79cb29b616d9f62ee83af..d787f0f87ab10fab63b2e1b38e30c566121578c4 100644 --- a/src/components/LegalNotice/LegalNoticeLink.tsx +++ b/src/components/LegalNotice/LegalNoticeLink.tsx @@ -29,13 +29,13 @@ const LegalNoticeLink: React.FC = () => { component={RouterLink} to="options/legalnotice" > - <div className="card" onClick={emitNavEvent}> + <div className="card optionCard" onClick={emitNavEvent}> <div className="legal-notice-card"> <div className="legal-notice-card-content"> <StyledIcon className="legal-notice-card-content-icon" icon={LegalNoticeIcon} - size={50} + size={42} /> <div className="legal-notice-card-content-title"> {t('legal.read_legal')} diff --git a/src/components/LegalNotice/__snapshots__/LegalNoticeContent.spec.tsx.snap b/src/components/LegalNotice/__snapshots__/LegalNoticeContent.spec.tsx.snap index a76fba0e2b2c4883efee3ad5e2947ab25bd39a79..f1a119c2c28210b3e9fdf7be12c91ddcaba56f37 100644 --- a/src/components/LegalNotice/__snapshots__/LegalNoticeContent.spec.tsx.snap +++ b/src/components/LegalNotice/__snapshots__/LegalNoticeContent.spec.tsx.snap @@ -119,56 +119,62 @@ exports[`LegalNoticeContent component should be rendered correctly 1`] = ` </li> <li> legal.part2-2 + </li> + <li> + legal.part2-3 <ul> <li> - legal.part2-2-1 + legal.part2-3-1 </li> <li> - legal.part2-2-2 + legal.part2-3-2 </li> <li> - legal.part2-2-3 + legal.part2-3-3 </li> <li> - legal.part2-2-4 + legal.part2-3-4 </li> <li> - legal.part2-2-5 + legal.part2-3-5 </li> </ul> </li> <li> - legal.part2-3 + legal.part2-4 </li> </ul> <p> - legal.part2-4 + legal.part2-5 + </p> + <p> + legal.part2-6 </p> <ul> <li> - legal.part2-4-1 + legal.part2-6-1 </li> <li> - legal.part2-4-2 + legal.part2-6-2 </li> <li> - legal.part2-4-3 + legal.part2-6-3 </li> </ul> <p> - legal.part2-5 + legal.part2-7 </p> <p> - legal.part2-6 + legal.part2-8 </p> <p> - legal.part2-7 + legal.part2-9 </p> <p> - legal.part2-8 + legal.part2-10 </p> <p> - legal.part2-9 + legal.part2-11 </p> </div> <div diff --git a/src/components/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap b/src/components/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap index c4d14015bda3938d182a0621237e2abfef34032f..7a39bbb71ebbb419d51b357898ae570d3e1624a9 100644 --- a/src/components/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap +++ b/src/components/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap @@ -7,11 +7,6 @@ exports[`GCULink component should be rendered correctly 1`] = ` <div className="gcu-link-content" > - <div - className="gcu-link-header text-16-normal-uppercase" - > - gcu_option.title - </div> <WithStyles(ForwardRef(Link)) className="gcu-link-card-link" component={ @@ -31,7 +26,7 @@ exports[`GCULink component should be rendered correctly 1`] = ` to="options/gcu" > <div - className="card" + className="card optionCard" > <div className="gcu-link-card" @@ -42,12 +37,12 @@ exports[`GCULink component should be rendered correctly 1`] = ` <StyledIcon className="gcu-link-card-content-icon" icon="test-file-stub" - size={50} + size={42} /> <div className="gcu-link-card-content-title" > - gcu_option.read_gcu + gcu_option.title </div> </div> </div> diff --git a/src/components/LegalNotice/legalNoticeLink.scss b/src/components/LegalNotice/legalNoticeLink.scss index 402a22fc23d7dd52321ea2a21ae2de308b2350a2..c6eb9a42feb3c3b3f235ebbbc247001e65395bf0 100644 --- a/src/components/LegalNotice/legalNoticeLink.scss +++ b/src/components/LegalNotice/legalNoticeLink.scss @@ -8,10 +8,11 @@ align-items: center; justify-content: center; color: $white; - padding: 1rem 1.5rem 0; - margin-top: 1rem; + padding: 0 1.5rem; + margin-top: 2rem; .legal-notice-header { - margin-bottom: 1.25rem; + color: $grey-bright; + margin-bottom: 1rem; } .legal-notice-content { max-width: 45.75rem; diff --git a/src/components/Loader/Loader.scss b/src/components/Loader/Loader.scss new file mode 100644 index 0000000000000000000000000000000000000000..fb60035b90f0ff567ab5dd76cb0c91bfd1261ec9 --- /dev/null +++ b/src/components/Loader/Loader.scss @@ -0,0 +1,53 @@ +@import 'src/styles/base/color'; + +.loader { + height: 50px; + margin: auto; + display: flex; + align-items: flex-end; + justify-content: center; + gap: 8px; + + &.gold { + color: $gold; + } + + &.gaz { + color: $gas-color; + } + + &.elec { + color: $elec-color; + } + + &.water { + color: $water-color; + } + + &.black { + color: $dark; + } + + .bar { + width: 10px; + border-radius: 5px; + background: currentColor; + // Negative delay to fix bar appearing after delay + animation: load 0.4s -0.4s linear infinite alternate; + &:nth-child(1) { + animation-delay: -0.1s; + } + &:nth-child(3) { + animation-delay: -0.55s; + } + } + + @keyframes load { + 0% { + height: 20%; + } + 100% { + height: 100%; + } + } +} diff --git a/src/components/Loader/Loader.spec.tsx b/src/components/Loader/Loader.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..231c5b013606758b577ee2be1abef4973f99fa88 --- /dev/null +++ b/src/components/Loader/Loader.spec.tsx @@ -0,0 +1,36 @@ +import { FluidType } from 'enum/fluid.enum' +import { mount } from 'enzyme' +import React from 'react' +import Loader from './Loader' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +describe('Loader component', () => { + it('should render base Loader', () => { + const wrapper = mount(<Loader />) + expect(wrapper.getElement()).toMatchSnapshot() + }) + + it('should render Electricity Loader', () => { + const wrapper = mount(<Loader color="elec" />) + expect(wrapper.getElement()).toMatchSnapshot() + }) + + it('should render Water Loader', () => { + const wrapper = mount(<Loader fluidType={FluidType.WATER} />) + expect(wrapper.getElement()).toMatchSnapshot() + }) + + it('should render Gas Loader', () => { + const wrapper = mount(<Loader fluidType={FluidType.GAS} />) + expect(wrapper.getElement()).toMatchSnapshot() + }) +}) diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx new file mode 100644 index 0000000000000000000000000000000000000000..09aef3ec4626b91e1cfd7f0cd8b29d7fa2bf9f77 --- /dev/null +++ b/src/components/Loader/Loader.tsx @@ -0,0 +1,47 @@ +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { FluidType } from 'enum/fluid.enum' +import React from 'react' +import './Loader.scss' + +interface color { + color?: 'gold' | 'gaz' | 'elec' | 'water' | 'black' + fluidType?: FluidType +} + +/** + * Loader of Ecolyo, default color is gold + * @param color 'gold' | 'gaz' | 'elec' | 'water' + */ +const Loader = ({ color = 'gold', fluidType }: color) => { + const { t } = useI18n() + + switch (fluidType) { + case FluidType.MULTIFLUID: + color = 'gold' + break + case FluidType.ELECTRICITY: + color = 'elec' + break + case FluidType.GAS: + color = 'gaz' + break + case FluidType.WATER: + color = 'water' + break + } + + return ( + <div + className={`loader ${color}`} + aria-busy="true" + aria-label={t('common.accessibility.loading')} + title={t('common.accessibility.loading')} + > + <div className="bar" /> + <div className="bar" /> + <div className="bar" /> + </div> + ) +} + +export default Loader diff --git a/src/components/Loader/__snapshots__/Loader.spec.tsx.snap b/src/components/Loader/__snapshots__/Loader.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..e33f3c5b6e55146c70713ded38d7342c604476ea --- /dev/null +++ b/src/components/Loader/__snapshots__/Loader.spec.tsx.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Loader component should render Electricity Loader 1`] = ` +<Loader + color="elec" +/> +`; + +exports[`Loader component should render Gas Loader 1`] = ` +<Loader + fluidType={2} +/> +`; + +exports[`Loader component should render Water Loader 1`] = ` +<Loader + fluidType={1} +/> +`; + +exports[`Loader component should render base Loader 1`] = `<Loader />`; diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index 7ff5e95d957c79be1929e7468a209071d0d9b4b6..7cd951e62a565438de5ca3e263fac258381c64ee 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -1,26 +1,25 @@ -import React, { useCallback } from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Link from '@material-ui/core/Link' -import { NavLink } from 'react-router-dom' -import { useSelector } from 'react-redux' - -import ConsoIconOn from 'assets/icons/tabbar/conso/conso-on.svg' +import AnalysisIconOff from 'assets/icons/tabbar/analysis/analysis-off.svg' +import AnalysisIconOn from 'assets/icons/tabbar/analysis/analysis-on.svg' +import BulbIconOff from 'assets/icons/tabbar/astuces/astuces-off.svg' +import BulbIconOn from 'assets/icons/tabbar/astuces/astuces-on.svg' import ConsoIconOff from 'assets/icons/tabbar/conso/conso-off.svg' -import ChallengeIconOn from 'assets/icons/tabbar/defi/defi-on.svg' +import ConsoIconOn from 'assets/icons/tabbar/conso/conso-on.svg' import ChallengeIconOff from 'assets/icons/tabbar/defi/defi-off.svg' -import ParameterIconOn from 'assets/icons/tabbar/parametre/parametre-on.svg' +import ChallengeIconOn from 'assets/icons/tabbar/defi/defi-on.svg' import ParameterIconOff from 'assets/icons/tabbar/parametre/parametre-off.svg' -import EcogestesIconOn from 'assets/icons/tabbar/ecogeste/ecogeste-on.svg' -import EcogestesIconOff from 'assets/icons/tabbar/ecogeste/ecogeste-off.svg' -import AnalysisIconOn from 'assets/icons/tabbar/analysis/analysis-on.svg' -import AnalysisIconOff from 'assets/icons/tabbar/analysis/analysis-off.svg' -import logos from 'assets/png/logos.png' +import ParameterIconOn from 'assets/icons/tabbar/parametre/parametre-on.svg' +import logos from 'assets/png/logos_partenaires.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { AppStore } from 'store' -import './navBar.scss' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { UsageEventType } from 'enum/usageEvent.enum' +import React, { useCallback } from 'react' +import { useSelector } from 'react-redux' +import { NavLink } from 'react-router-dom' import UsageEventService from 'services/usageEvent.service' -import { useClient } from 'cozy-client' +import { AppStore } from 'store' +import './navBar.scss' export const Navbar: React.FC = () => { const { t } = useI18n() @@ -85,8 +84,8 @@ export const Navbar: React.FC = () => { className="c-nav-link" activeClassName="is-active" > - <StyledIcon className="c-nav-icon off" icon={EcogestesIconOff} /> - <StyledIcon className="c-nav-icon on" icon={EcogestesIconOn} /> + <StyledIcon className="c-nav-icon off" icon={BulbIconOff} /> + <StyledIcon className="c-nav-icon on" icon={BulbIconOn} /> {t('navigation.ecogestures')} </Link> </li> diff --git a/src/components/Navbar/navBar.scss b/src/components/Navbar/navBar.scss index d9b924b35db71101867b68dbe59387a300f817b6..eec9e331f0a42e72d97906fe970aa40d60de7d70 100644 --- a/src/components/Navbar/navBar.scss +++ b/src/components/Navbar/navBar.scss @@ -3,7 +3,7 @@ @import 'src/styles/base/z-index'; .o-sidebar { - background-color: $dark-light; + background-color: $bottom-bar-grey; box-shadow: 0px 5px 5px rgba(0, 0, 0, 0.2), 0px 3px 14px rgba(0, 0, 0, 0.12), 0px 8px 10px rgba(0, 0, 0, 0.14); border-top: unset; @@ -50,50 +50,54 @@ max-width: 100px; margin: auto; } -.c-nav-link { - padding: 0 1rem; - font-size: 0.9rem; - .on { - display: none; - } - .off { - display: block; - } -} -a.c-nav-link, -a.c-nav-link:visited { - color: $white-light; -} -@media #{$tablet} { - .c-nav-item { - height: 54px; - margin: -0.3rem 0 0 0; +.c-nav-item { + &:hover { + a, + svg { + color: $white !important; + &.is-active { + color: $gold; + } + } } -} - -.c-nav-link .c-nav-icon { - width: 60px; - height: 36px; - fill: none; -} - -.c-nav-link.is-active .c-nav-icon { - fill: $gold !important; -} + .c-nav-link { + color: $white-light; + padding: 0 1rem; + font-size: 0.9rem; + &:visited { + color: $white-light; + } + .c-nav-icon { + width: 60px; + height: 36px; + fill: none; + } + .on { + display: none; + } + .off { + display: block; + } -.c-nav-link.is-active { - color: $white; - box-shadow: inset 0.25rem 0 0 0 $gold; - text-decoration: none; - &:focus-visible { - box-shadow: inset 0 0 0 1px $grey-bright, inset 0.25rem 0 0 0 $gold; - } - .on { - display: block; - } - .off { - display: none; + &.is-active { + color: $white; + box-shadow: inset 0.25rem 0 0 0 $gold; + text-decoration: none; + svg.c-nav-icon { + fill: $gold; + color: $gold !important; + } + &:focus-visible { + box-shadow: inset 0 0 0 1px $grey-bright, inset 0.25rem 0 0 0 $gold; + } + .on { + display: block; + } + .off { + display: none; + } + } } } @@ -101,19 +105,22 @@ a.c-nav-link:visited { .o-sidebar { height: 56px; } - .c-nav-link { - padding: 0; - } - - .c-nav-link .c-nav-icon { - padding: 0; - margin: auto; - } - .c-nav-link.is-active { - box-shadow: unset; - &:focus { - box-shadow: unset; + .c-nav-item { + height: 54px; + margin: -0.3rem 0 0 0; + .c-nav-link { + padding: 0; + .c-nav-icon { + padding: 0; + margin: auto; + } + &.is-active { + box-shadow: unset; + &:focus { + box-shadow: unset; + } + } } } } diff --git a/src/components/Onboarding/WelcomeModal.spec.tsx b/src/components/Onboarding/WelcomeModal.spec.tsx index 9c46bca76a57a7ca522fc35693d1ef3aadab36fd..1d6e8a48b841ffaec6a2df04b4bf91eeb0fdc3c7 100644 --- a/src/components/Onboarding/WelcomeModal.spec.tsx +++ b/src/components/Onboarding/WelcomeModal.spec.tsx @@ -23,10 +23,10 @@ jest.mock('cozy-client', () => { useClient: jest.fn(() => mockClient), } }) -jest.mock('components/Hooks/userInstanceSettings', () => { +jest.mock('components/Hooks/useUserInstanceSettings', () => { return jest.fn(() => ({ data: { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase public_name: 'mocked_public_name', }, })) diff --git a/src/components/Onboarding/WelcomeModal.tsx b/src/components/Onboarding/WelcomeModal.tsx index 8db78b491ef92dd9f2c9ce847426e075902e0bf7..44dcbdd575a79c718859f12b91af94db9bff2748 100644 --- a/src/components/Onboarding/WelcomeModal.tsx +++ b/src/components/Onboarding/WelcomeModal.tsx @@ -1,16 +1,17 @@ +import { Button, Dialog, IconButton } from '@material-ui/core' +import CloseIcon from 'assets/icons/ico/close.svg' +import PartnersConsentIcon from 'assets/icons/visu/onboarding/partners_consent.svg' +import useUserInstanceSettings from 'components/Hooks/useUserInstanceSettings' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' import React, { useCallback } from 'react' -import './welcomeModal.scss' import { useDispatch } from 'react-redux' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useClient } from 'cozy-client' -import { Button, Dialog, IconButton } from '@material-ui/core' -import userInstanceSettings from 'components/Hooks/userInstanceSettings' import EnvironmentService from 'services/environment.service' import MailService from 'services/mail.service' -import Icon from 'cozy-ui/transpiled/react/Icon' -import CloseIcon from 'assets/icons/ico/close.svg' -import PartnersConsentIcon from 'assets/icons/visu/onboarding/partners_consent.svg' import { updateProfile } from 'store/profile/profile.actions' +import './welcomeModal.scss' + const welcomeTemplate = require('notifications/welcome.hbs') const mjml2html = require('mjml-browser') @@ -22,7 +23,7 @@ const WelcomeModal = ({ open }: WelcomeModalProps) => { const { t } = useI18n() const client = useClient() const dispatch = useDispatch() - const { data: instanceSettings } = userInstanceSettings() + const { data: instanceSettings } = useUserInstanceSettings() const setWelcomeModalViewed = useCallback(async () => { const mailService = new MailService() diff --git a/src/components/FAQ/faqLink.scss b/src/components/Options/HelpLink/HelpLink.scss similarity index 68% rename from src/components/FAQ/faqLink.scss rename to src/components/Options/HelpLink/HelpLink.scss index 4dcfaf6adc757ab2650259706caca0be1971e25a..6b6d881a475564c4c46cb1b3c40d3cc066ca9588 100644 --- a/src/components/FAQ/faqLink.scss +++ b/src/components/Options/HelpLink/HelpLink.scss @@ -1,15 +1,14 @@ @import 'src/styles/base/color'; @import 'src/styles/base/breakpoint'; -// FAQContainer -.faq-root { +.help-root { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 0 1.5rem; - .faq-content { - margin-bottom: -1rem; + margin-top: 2rem; + .help-content { width: 45.75rem; a { color: $white; @@ -18,18 +17,17 @@ @media #{$large-phone} { width: 100%; } - .faq-header { - margin-top: 1.5rem; - margin-bottom: 1.25rem; + .help-header { color: $grey-bright; + margin-bottom: 1rem; } } } -.faq-card-link { +.help-card-link { color: $white; } -.faq-card { +.help-card { display: flex; flex-direction: row; margin: -0.75rem 0; @@ -37,13 +35,14 @@ @media #{$large-phone} { width: 100%; } - .faq-card-content { + .help-card-content { display: flex; flex-direction: row; - .faq-card-content-icon { + .help-card-content-icon { margin: 0.5rem 0; + min-width: 42px; } - .faq-card-content-title { + .help-card-content-title { margin: 0 1rem; align-self: center; text-decoration: none; diff --git a/src/components/Options/HelpLink/HelpLink.tsx b/src/components/Options/HelpLink/HelpLink.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7311138ae02517f63607ce95f2d93294bb061765 --- /dev/null +++ b/src/components/Options/HelpLink/HelpLink.tsx @@ -0,0 +1,44 @@ +import Link from '@material-ui/core/Link' +import QuestionMarkIcon from 'assets/icons/ico/questionMark.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import React from 'react' +import { useDispatch } from 'react-redux' +import { updateModalIsFeedbacksOpen } from 'store/modal/modal.actions' +import './HelpLink.scss' + +const HelpLink: React.FC = () => { + const { t } = useI18n() + const dispatch = useDispatch() + + return ( + <div + className="help-root" + onClick={() => dispatch(updateModalIsFeedbacksOpen(true))} + > + <div className="help-content"> + <div className="help-header text-16-normal-uppercase"> + {t('help.title_help')} + </div> + <Link className="help-card-link"> + <div className="card optionCard"> + <div className="help-card"> + <div className="help-card-content"> + <StyledIcon + className="help-card-content-icon" + icon={QuestionMarkIcon} + size={42} + /> + <div className="help-card-content-title"> + {t('help.read_help')} + </div> + </div> + </div> + </div> + </Link> + </div> + </div> + ) +} + +export default HelpLink diff --git a/src/components/Options/MatomoOptOut.spec.tsx b/src/components/Options/MatomoOptOut/MatomoOptOut.spec.tsx similarity index 90% rename from src/components/Options/MatomoOptOut.spec.tsx rename to src/components/Options/MatomoOptOut/MatomoOptOut.spec.tsx index 11ca220012806d180ab8d95272e65ad1679325d2..69296c020177a909d8e354410040bccab0cd60d9 100644 --- a/src/components/Options/MatomoOptOut.spec.tsx +++ b/src/components/Options/MatomoOptOut/MatomoOptOut.spec.tsx @@ -1,6 +1,6 @@ import React from 'react' import { shallow } from 'enzyme' -import { MatomoOptOut } from './MatomoOptOut' +import MatomoOptOut from './MatomoOptOut' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { diff --git a/src/components/Options/MatomoOptOut.tsx b/src/components/Options/MatomoOptOut/MatomoOptOut.tsx similarity index 91% rename from src/components/Options/MatomoOptOut.tsx rename to src/components/Options/MatomoOptOut/MatomoOptOut.tsx index 69e16ae49cc8eca9e7897a869c213e541d36ac5a..c638d3edaaf568b11361e9e1fbd4e82c7cdbe957 100644 --- a/src/components/Options/MatomoOptOut.tsx +++ b/src/components/Options/MatomoOptOut/MatomoOptOut.tsx @@ -4,7 +4,7 @@ import './matomoOptOut.scss' declare let __PIWIK_TRACKER_URL__: string -export const MatomoOptOut: React.FC = () => { +const MatomoOptOut: React.FC = () => { const { t } = useI18n() const baseUrl = __PIWIK_TRACKER_URL__ @@ -22,3 +22,5 @@ export const MatomoOptOut: React.FC = () => { </div> ) } + +export default MatomoOptOut diff --git a/src/components/Options/__snapshots__/MatomoOptOut.spec.tsx.snap b/src/components/Options/MatomoOptOut/__snapshots__/MatomoOptOut.spec.tsx.snap similarity index 100% rename from src/components/Options/__snapshots__/MatomoOptOut.spec.tsx.snap rename to src/components/Options/MatomoOptOut/__snapshots__/MatomoOptOut.spec.tsx.snap diff --git a/src/components/Options/matomoOptOut.scss b/src/components/Options/MatomoOptOut/matomoOptOut.scss similarity index 96% rename from src/components/Options/matomoOptOut.scss rename to src/components/Options/MatomoOptOut/matomoOptOut.scss index 184e9e44e3ae351ae99a80537907fc0d187336bc..830a9fb804007b926142b5da14febf8facf8cca5 100644 --- a/src/components/Options/matomoOptOut.scss +++ b/src/components/Options/MatomoOptOut/matomoOptOut.scss @@ -8,7 +8,7 @@ align-items: center; justify-content: center; padding: 0 1.5rem; - margin: 1rem 0; + margin: 2rem 0; .matomo-opt-out { margin: 0 auto; diff --git a/src/components/Options/OptionsView.tsx b/src/components/Options/OptionsView.tsx index 906e5c209d0978b3b12c1675201476e4b29c103b..15fd3108a7219bb5ab44763929dddabb46615a83 100644 --- a/src/components/Options/OptionsView.tsx +++ b/src/components/Options/OptionsView.tsx @@ -1,22 +1,23 @@ -import React, { useState } from 'react' +import logos from 'assets/png/logos_partenaires.svg' +import Content from 'components/Content/Content' +import GCULink from 'components/GCU/GCULink' import CozyBar from 'components/Header/CozyBar' import Header from 'components/Header/Header' -import Content from 'components/Content/Content' -import ReportOptions from 'components/Options/ReportOptions' -import FAQLink from 'components/FAQ/FAQLink' import LegalNoticeLink from 'components/LegalNotice/LegalNoticeLink' -import GCULink from 'components/GCU/GCULink' +import ExportOptions from 'components/Options/exportOptions' import Version from 'components/Version/Version' -import ProfileTypeOptions from './ProfileTypeOptions' - -import logos from 'assets/png/logos.png' -import { MatomoOptOut } from './MatomoOptOut' +import React, { useState } from 'react' +import HelpLink from './HelpLink/HelpLink' +import MatomoOptOut from './MatomoOptOut/MatomoOptOut' +import ProfileTypeOptions from './ProfileTypeOptions/ProfileTypeOptions' +import ReportOptions from './ReportOptions/ReportOptions' const OptionsView: React.FC = () => { const [headerHeight, setHeaderHeight] = useState<number>(0) const defineHeaderHeight = (height: number) => { setHeaderHeight(height) } + return ( <> <CozyBar titleKey={'common.title_options'} /> @@ -26,8 +27,9 @@ const OptionsView: React.FC = () => { ></Header> <Content height={headerHeight}> <ProfileTypeOptions /> + <ExportOptions /> <ReportOptions /> - <FAQLink /> + <HelpLink /> <LegalNoticeLink /> <GCULink /> <MatomoOptOut /> diff --git a/src/components/Options/ProfileTypeOptions.spec.tsx b/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.spec.tsx similarity index 94% rename from src/components/Options/ProfileTypeOptions.spec.tsx rename to src/components/Options/ProfileTypeOptions/ProfileTypeOptions.spec.tsx index e9e76356b6fd67b89366fe4504cc1e67421adc9f..fed0a9870aac2c6e2acc96614577d5ce853f52fd 100644 --- a/src/components/Options/ProfileTypeOptions.spec.tsx +++ b/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.spec.tsx @@ -2,9 +2,9 @@ import React from 'react' import { mount } from 'enzyme' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' -import ProfileTypeOptions from 'components/Options/ProfileTypeOptions' -import { profileData } from '../../../tests/__mocks__/profile.mock' -import { mockProfileType } from '../../../tests/__mocks__/profileType.mock' +import ProfileTypeOptions from 'components/Options/ProfileTypeOptions/ProfileTypeOptions' +import { profileData } from '../../../../tests/__mocks__/profile.mock' +import { mockProfileType } from '../../../../tests/__mocks__/profileType.mock' import StyledCard from 'components/CommonKit/Card/StyledCard' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import profileIcon from 'assets/icons/ico/profile.svg' @@ -14,7 +14,7 @@ import { IndividualOrCollective, ThreeChoicesAnswer, } from 'enum/profileType.enum' -import { mockInitialChallengeState } from '../../../tests/__mocks__/store' +import { mockInitialChallengeState } from '../../../../tests/__mocks__/store' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { diff --git a/src/components/Options/ProfileTypeOptions.tsx b/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.tsx similarity index 96% rename from src/components/Options/ProfileTypeOptions.tsx rename to src/components/Options/ProfileTypeOptions/ProfileTypeOptions.tsx index 639467f227a40ea43aeef30f4959f982ee1b093c..230e6f90eff29ae1d736bbcbb6262ff781b9a8a5 100644 --- a/src/components/Options/ProfileTypeOptions.tsx +++ b/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.tsx @@ -63,13 +63,16 @@ const ProfileTypeOptions: React.FC = () => { aria-label={t( 'profile_type.accessibility.button_toggle_detail_profile' )} - expandIcon={<Icon icon={chevronDown} size={16} />} + expandIcon={ + <Icon icon={chevronDown} size={16} className="accordion-icon" /> + } classes={{ root: 'expansion-panel-summary', content: 'expansion-panel-content', }} > - <div className="text-18-normal"> + <Icon className="profile-icon" icon={profileIcon} size={42} /> + <div className="text-16-normal profile-title"> {t('profile_type.your_profile')} </div> </AccordionSummary> @@ -236,9 +239,9 @@ const ProfileTypeOptions: React.FC = () => { </AccordionDetails> </Accordion> )} - {profile.isProfileTypeCompleted === false && ( + {!profile.isProfileTypeCompleted && ( <StyledCard onClick={goToForm} className="profile-link"> - <StyledIcon className="profile-icon" icon={profileIcon} size={50} /> + <StyledIcon className="profile-icon" icon={profileIcon} size={42} /> <span className="link-label text-16-normal"> {t('profile_type.read_profile')} </span> diff --git a/src/components/Options/profileTypeOptions.scss b/src/components/Options/ProfileTypeOptions/profileTypeOptions.scss similarity index 73% rename from src/components/Options/profileTypeOptions.scss rename to src/components/Options/ProfileTypeOptions/profileTypeOptions.scss index 35aa6afa5cf8fc4baa27e88c1adfbd3ee127f280..5f912a4f9e2bdebbcb530fb3193151c03955ee16 100644 --- a/src/components/Options/profileTypeOptions.scss +++ b/src/components/Options/ProfileTypeOptions/profileTypeOptions.scss @@ -2,7 +2,7 @@ @import 'src/styles/base/breakpoint'; .profile-type-root { - margin-top: 1.75rem; + margin-top: 1.5rem; padding: 0 1.5rem; .profile-type-content { margin: 0 auto; @@ -10,6 +10,14 @@ @media (min-width: $width-large-phone) { width: 45.75rem; } + .MuiButtonBase-root { + height: 40px; + margin: 0; + } + .btn-secondary-negative { + border-color: $grey-bright; + height: 40px; + } } .value { color: $white; @@ -27,8 +35,7 @@ } .head { color: $grey-bright; - margin-top: 1rem; - margin-bottom: 1.25rem; + margin-bottom: 1rem; } .label { color: $soft-grey; @@ -49,10 +56,14 @@ padding: 8px 0px; width: 100%; } + .profile-title { + padding-left: 1rem; + } + button.profile-link { color: $grey-bright; text-decoration: none; - max-height: 5rem; + min-height: 4rem; .profile-icon { vertical-align: middle; } @@ -66,4 +77,10 @@ } } } + div.expansion-panel-summary { + padding: 0 0.25rem 0 1rem; + } + .MuiCardContent-root { + padding: 0 1rem !important; + } } diff --git a/src/components/Options/ReportOptions.spec.tsx b/src/components/Options/ReportOptions/ReportOptions.spec.tsx similarity index 93% rename from src/components/Options/ReportOptions.spec.tsx rename to src/components/Options/ReportOptions/ReportOptions.spec.tsx index f97b6ddad87824400d8cd65bfa56ad4336ba3a78..a31d03958e75df27bf91de38da7acdb762f2f669 100644 --- a/src/components/Options/ReportOptions.spec.tsx +++ b/src/components/Options/ReportOptions/ReportOptions.spec.tsx @@ -1,11 +1,11 @@ import React from 'react' import { mount } from 'enzyme' import { Provider } from 'react-redux' -import ReportOptions from 'components/Options/ReportOptions' +import ReportOptions from 'components/Options/ReportOptions/ReportOptions' import { createMockStore, mockInitialEcolyoState, -} from '../../../tests/__mocks__/store' +} from '../../../../tests/__mocks__/store' import * as profileActions from 'store/profile/profile.actions' import { Button } from '@material-ui/core' import StyledSwitch from 'components/CommonKit/Switch/StyledSwitch' diff --git a/src/components/Options/ReportOptions.tsx b/src/components/Options/ReportOptions/ReportOptions.tsx similarity index 96% rename from src/components/Options/ReportOptions.tsx rename to src/components/Options/ReportOptions/ReportOptions.tsx index 0a5778ad3741afaf1cd7afc9c7aff452e0e1e061..04a5d172ef22a84b3bdf3855b2fa9874cb736d49 100644 --- a/src/components/Options/ReportOptions.tsx +++ b/src/components/Options/ReportOptions/ReportOptions.tsx @@ -166,7 +166,7 @@ const ReportOptions: React.FC = () => { <div className="alert-input-subtext"> {t('profile.report.input_label_subtext_alert')} {Math.round(maxDayData.value)} - {' L)'} + {' L'} </div> )} </div> diff --git a/src/components/Options/reportOptions.scss b/src/components/Options/ReportOptions/reportOptions.scss similarity index 92% rename from src/components/Options/reportOptions.scss rename to src/components/Options/ReportOptions/reportOptions.scss index 78adb64fcd291ff3b933c70c44b4fe6c1cada7c7..b5ca2f087c7c3a71f41695aab6fd749acf9bfc38 100644 --- a/src/components/Options/reportOptions.scss +++ b/src/components/Options/ReportOptions/reportOptions.scss @@ -6,7 +6,7 @@ align-items: center; justify-content: center; padding: 0 1.5rem; - margin: 1rem 0; + margin-top: 2rem; .report-option-content { width: 45.75rem; @media #{$large-phone} { @@ -14,8 +14,8 @@ } } .head { - margin: 1rem 0; color: $grey-bright; + margin-bottom: 1rem; } .switch-container-bilan { display: flex; diff --git a/src/components/Options/UnSubscribe.spec.tsx b/src/components/Options/Unsubscribe/UnSubscribe.spec.tsx similarity index 97% rename from src/components/Options/UnSubscribe.spec.tsx rename to src/components/Options/Unsubscribe/UnSubscribe.spec.tsx index bd7b90d4697e2b2ef304a4aa301fd30d4544b1a1..2bc1f64607d47c166ab5c83d0da0862dd7053acf 100644 --- a/src/components/Options/UnSubscribe.spec.tsx +++ b/src/components/Options/Unsubscribe/UnSubscribe.spec.tsx @@ -5,7 +5,7 @@ import { Provider } from 'react-redux' import { createMockStore, mockInitialEcolyoState, -} from '../../../tests/__mocks__/store' +} from '../../../../tests/__mocks__/store' import * as profileActions from 'store/profile/profile.actions' import UnSubscribe from './UnSubscribe' import { Button } from '@material-ui/core' diff --git a/src/components/Options/UnSubscribe.tsx b/src/components/Options/Unsubscribe/UnSubscribe.tsx similarity index 100% rename from src/components/Options/UnSubscribe.tsx rename to src/components/Options/Unsubscribe/UnSubscribe.tsx diff --git a/src/components/Options/__snapshots__/UnSubscribe.spec.tsx.snap b/src/components/Options/Unsubscribe/__snapshots__/UnSubscribe.spec.tsx.snap similarity index 100% rename from src/components/Options/__snapshots__/UnSubscribe.spec.tsx.snap rename to src/components/Options/Unsubscribe/__snapshots__/UnSubscribe.spec.tsx.snap diff --git a/src/components/Options/unSubscribe.scss b/src/components/Options/Unsubscribe/unSubscribe.scss similarity index 100% rename from src/components/Options/unSubscribe.scss rename to src/components/Options/Unsubscribe/unSubscribe.scss diff --git a/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap b/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap index 3cdb93ecb9ac5e5207444fe7bc45111e528e874e..1fcb358c2fd2fdfedf95ab7a6e2f06504c83460f 100644 --- a/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap +++ b/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap @@ -13,8 +13,9 @@ exports[`OptionsView component should be rendered correctly 1`] = ` height={0} > <ProfileTypeOptions /> + <ExportOptions /> <ReportOptions /> - <FAQLink /> + <HelpLink /> <LegalNoticeLink /> <GCULink /> <MatomoOptOut /> diff --git a/src/components/Options/__snapshots__/exportOptions.spec.tsx.snap b/src/components/Options/__snapshots__/exportOptions.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..aa4c3579151d165dc4d3cd7204c80e86598c680c --- /dev/null +++ b/src/components/Options/__snapshots__/exportOptions.spec.tsx.snap @@ -0,0 +1,1184 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`exportOptions component should be rendered correctly 1`] = ` +<ExportOptions> + <div + className="export-option-root" + > + <div + className="export-option-content" + > + <WithStyles(ForwardRef(Accordion)) + classes={ + Object { + "root": "expansion-panel-root", + } + } + expanded={false} + onChange={[Function]} + > + <ForwardRef(Accordion) + classes={ + Object { + "disabled": "Mui-disabled", + "expanded": "Mui-expanded", + "root": "MuiAccordion-root expansion-panel-root", + "rounded": "MuiAccordion-rounded", + } + } + expanded={false} + onChange={[Function]} + > + <WithStyles(ForwardRef(Paper)) + className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" + square={false} + > + <ForwardRef(Paper) + className="MuiAccordion-root expansion-panel-root MuiAccordion-rounded" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + square={false} + > + <div + className="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded" + > + <WithStyles(ForwardRef(AccordionSummary)) + aria-label="profile_type.accessibility.button_toggle_export" + classes={ + Object { + "content": "expansion-panel-content", + "root": "expansion-panel-summary", + } + } + expandIcon={ + <Icon + className="accordion-icon" + icon="test-file-stub" + size={16} + spin={false} + /> + } + key=".0" + > + <ForwardRef(AccordionSummary) + aria-label="profile_type.accessibility.button_toggle_export" + classes={ + Object { + "content": "MuiAccordionSummary-content expansion-panel-content", + "disabled": "Mui-disabled", + "expandIcon": "MuiAccordionSummary-expandIcon", + "expanded": "Mui-expanded", + "focusVisible": "Mui-focusVisible", + "focused": "Mui-focused", + "root": "MuiAccordionSummary-root expansion-panel-summary", + } + } + expandIcon={ + <Icon + className="accordion-icon" + icon="test-file-stub" + size={16} + spin={false} + /> + } + > + <WithStyles(ForwardRef(ButtonBase)) + aria-expanded={false} + aria-label="profile_type.accessibility.button_toggle_export" + className="MuiAccordionSummary-root expansion-panel-summary" + component="div" + disableRipple={true} + disabled={false} + focusRipple={false} + focusVisibleClassName="Mui-focusVisible Mui-focused" + onClick={[Function]} + > + <ForwardRef(ButtonBase) + aria-expanded={false} + aria-label="profile_type.accessibility.button_toggle_export" + className="MuiAccordionSummary-root expansion-panel-summary" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="div" + disableRipple={true} + disabled={false} + focusRipple={false} + focusVisibleClassName="Mui-focusVisible Mui-focused" + onClick={[Function]} + > + <div + aria-disabled={false} + aria-expanded={false} + aria-label="profile_type.accessibility.button_toggle_export" + className="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary" + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + role="button" + tabIndex={0} + > + <div + className="MuiAccordionSummary-content expansion-panel-content" + > + <Icon + className="export-icon" + icon="test-file-stub" + size={42} + spin={false} + > + <Component + className="export-icon styles__icon___23x3R" + height={42} + style={Object {}} + width={42} + > + <svg + className="export-icon styles__icon___23x3R" + height={42} + style={Object {}} + width={42} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + <div + className="text-16-normal accordion-title" + > + export.title_export + </div> + </div> + <WithStyles(ForwardRef(IconButton)) + aria-hidden={true} + className="MuiAccordionSummary-expandIcon" + component="div" + edge="end" + role={null} + tabIndex={null} + > + <ForwardRef(IconButton) + aria-hidden={true} + className="MuiAccordionSummary-expandIcon" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + component="div" + edge="end" + role={null} + tabIndex={null} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-hidden={true} + centerRipple={true} + className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" + component="div" + disabled={false} + focusRipple={true} + role={null} + tabIndex={null} + > + <ForwardRef(ButtonBase) + aria-hidden={true} + centerRipple={true} + className="MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="div" + disabled={false} + focusRipple={true} + role={null} + tabIndex={null} + > + <div + aria-disabled={false} + aria-hidden={true} + className="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd" + onBlur={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + role={null} + tabIndex={null} + > + <span + className="MuiIconButton-label" + > + <Icon + className="accordion-icon" + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="accordion-icon styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="accordion-icon styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </div> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + </div> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(AccordionSummary)> + </WithStyles(ForwardRef(AccordionSummary))> + <WithStyles(ForwardRef(Collapse)) + in={false} + timeout="auto" + > + <ForwardRef(Collapse) + classes={ + Object { + "entered": "MuiCollapse-entered", + "hidden": "MuiCollapse-hidden", + "root": "MuiCollapse-root", + "wrapper": "MuiCollapse-wrapper", + "wrapperInner": "MuiCollapse-wrapperInner", + } + } + in={false} + timeout="auto" + > + <Transition + addEndListener={[Function]} + appear={false} + enter={true} + exit={true} + in={false} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={null} + unmountOnExit={false} + > + <div + className="MuiCollapse-root MuiCollapse-hidden" + style={ + Object { + "minHeight": "0px", + } + } + > + <div + className="MuiCollapse-wrapper" + > + <div + className="MuiCollapse-wrapperInner" + > + <div + role="region" + > + <WithStyles(ForwardRef(AccordionDetails)) + classes={ + Object { + "root": "expansion-panel-details", + } + } + key=".1" + > + <ForwardRef(AccordionDetails) + classes={ + Object { + "root": "MuiAccordionDetails-root expansion-panel-details", + } + } + > + <div + className="MuiAccordionDetails-root expansion-panel-details" + > + <div + className="text-15-normal content intro" + > + export.text1 + </div> + <div + className="text-16-bold content" + > + export.fluid_select + </div> + <div + className="text-15-normal content intro" + > + export.no_data + </div> + </div> + </ForwardRef(AccordionDetails)> + </WithStyles(ForwardRef(AccordionDetails))> + </div> + </div> + </div> + </div> + </Transition> + </ForwardRef(Collapse)> + </WithStyles(ForwardRef(Collapse))> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </ForwardRef(Accordion)> + </WithStyles(ForwardRef(Accordion))> + </div> + </div> + <ExportStartModal + handleCloseClick={[Function]} + handleDownloadClick={[Function]} + open={false} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility_title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + onClose={[Function]} + open={false} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility_title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + onClose={[Function]} + open={false} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={false} + onClose={[Function]} + open={false} + /> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </ExportStartModal> + <ExportDoneModal + error={false} + handleCloseClick={[Function]} + open={false} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + onClose={[Function]} + open={false} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + onClose={[Function]} + open={false} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "activatedOpacity": 0.12, + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "disabledOpacity": 0.38, + "focus": "rgba(0, 0, 0, 0.12)", + "focusOpacity": 0.12, + "hover": "rgba(0, 0, 0, 0.04)", + "hoverOpacity": 0.04, + "selected": "rgba(0, 0, 0, 0.08)", + "selectedOpacity": 0.08, + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableEscapeKeyDown={false} + onClose={[Function]} + open={false} + /> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </ExportDoneModal> +</ExportOptions> +`; diff --git a/src/components/Options/exportOptions.scss b/src/components/Options/exportOptions.scss new file mode 100644 index 0000000000000000000000000000000000000000..86950681878ff8458c8cf239fa45fc9d8141f95a --- /dev/null +++ b/src/components/Options/exportOptions.scss @@ -0,0 +1,71 @@ +@import 'src/styles/base/color'; +@import 'src/styles/base/breakpoint'; +div.expansion-panel-root, +div.expansion-panel-root.Mui-expanded:last-child { + margin: 0.2rem 0; +} +.export-option-root { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: 0.5rem; + padding: 0 1.5rem; +} +.export-option-content { + width: 45.75rem; + @media #{$large-phone} { + width: 100%; + } + .MuiAccordionSummary-content { + margin: 0; + } + .MuiIconButton-edgeEnd { + margin: 0; + } + .accordion-title { + padding-left: 1rem; + color: $white; + } + .expansion-panel-details { + flex-direction: column; + .content { + padding-bottom: 16px; + } + .intro { + color: $soft-grey; + } + .btn-secondary-negative { + border-color: $grey-bright !important; + height: 40px; + } + .checkbox { + margin: 0; + input { + margin: 0.5rem; + border: 1px solid $soft-grey; + border-radius: 2px; + } + } + .answer-checked input:before, + .answer-checked input:after { + background: black; + } + .answer-checked input { + background: $gold-shadow; + border: 2px solid $gold-shadow; + } + .answer-checked input:before { + height: 13px; + left: 11px; + top: 3px; + } + .answer-checked input:after { + height: 9px; + left: 4px; + } + } + div.expansion-panel-summary { + padding: 0 0.25rem 0 1rem; + } +} diff --git a/src/components/Options/exportOptions.spec.tsx b/src/components/Options/exportOptions.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f9248186d09ff934f3b3ca8532afd8beac73aebb --- /dev/null +++ b/src/components/Options/exportOptions.spec.tsx @@ -0,0 +1,35 @@ +import ExportOptions from 'components/Options/exportOptions' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import React from 'react' +import mockClient from '../../../tests/__mocks__/client' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +jest.mock('services/consumption.service', () => { + return jest.fn(() => { + return { + fetchAllFirstDateData: jest.fn(() => { + return [null, null, null] + }), + } + }) +}) + +jest.mock('cozy-client', () => ({ + useClient: () => mockClient, +})) + +describe('exportOptions component', () => { + it('should be rendered correctly', async () => { + const wrapper = mount(<ExportOptions />) + expect(toJson(wrapper)).toMatchSnapshot() + }) +}) diff --git a/src/components/Options/exportOptions.tsx b/src/components/Options/exportOptions.tsx new file mode 100644 index 0000000000000000000000000000000000000000..bce44da306f943c2c4e16d72d8bd655a8827c573 --- /dev/null +++ b/src/components/Options/exportOptions.tsx @@ -0,0 +1,193 @@ +import { + Accordion, + AccordionDetails, + AccordionSummary, + Button, +} from '@material-ui/core' +import chevronDown from 'assets/icons/ico/chevron-down.svg' +import exportIcon from 'assets/icons/ico/export.svg' +import classNames from 'classnames' +import ExportDoneModal from 'components/Export/exportDoneModal' +import ExportLoadingModal from 'components/Export/exportLoadingModal' +import ExportStartModal from 'components/Export/exportStartModal' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' +import { remove } from 'lodash' +import React, { useEffect, useMemo, useState } from 'react' +import ConsumptionDataManager from 'services/consumption.service' +import './exportOptions.scss' + +const ExportOptions: React.FC = () => { + const { t } = useI18n() + const client = useClient() + const consumptionService = useMemo( + () => new ConsumptionDataManager(client), + [client] + ) + + const [isExportStartModal, setIsExportStartModal] = useState<boolean>(false) + const [isExportLoadingModal, setIsExportLoadingModal] = + useState<boolean>(false) + const [isExportDoneModal, setIsExportDoneModal] = useState<boolean>(false) + const [hasError, setHasError] = useState<boolean>(false) + const [exportableFluids, setExportableFluids] = useState<FluidType[]>([]) + const [answer, setAnswer] = useState<FluidType[]>([]) + + const [active, setActive] = useState<boolean>(false) + + const toggleAccordion = () => { + setActive(prev => !prev) + } + + const handleChange = (value: FluidType) => { + const tempAnswer = [...answer] + if (tempAnswer.includes(value)) { + remove(tempAnswer, answer => answer === value) + } else { + tempAnswer.push(value) + } + setAnswer(tempAnswer) + } + + useEffect(() => { + let subscribed = true + const getExportableFluids = async () => { + const exportableFluidsData: FluidType[] = + await consumptionService.getExportableFluids( + [FluidType.ELECTRICITY, FluidType.WATER, FluidType.GAS], + TimeStep.MONTH + ) + setExportableFluids(exportableFluidsData) + setAnswer(exportableFluidsData) + subscribed = false + } + + if (subscribed) { + getExportableFluids() + } + return () => { + subscribed = false + } + }, [consumptionService]) + + const fluidCheckbox = () => + exportableFluids.map((fluidType, key) => ( + <label + key={key} + className={classNames('checkbox', { + ['answer-checked']: answer.includes(fluidType), + })} + > + <input + type={'checkbox'} + value={fluidType} + name={t('FLUID.' + FluidType[fluidType] + '.LABEL')} + onChange={() => handleChange(fluidType)} + checked={answer.includes(fluidType)} + /> + {t('FLUID.' + FluidType[fluidType] + '.LABEL')} + </label> + )) + + const handleDone = (e?: any) => { + if (e) { + setHasError(true) + } + setIsExportDoneModal(true) + setIsExportLoadingModal(false) + } + + return ( + <> + <div className="export-option-root"> + <div className="export-option-content"> + <Accordion + expanded={active} + onChange={toggleAccordion} + classes={{ + root: 'expansion-panel-root', + }} + > + <AccordionSummary + aria-label={t('profile_type.accessibility.button_toggle_export')} + expandIcon={ + <Icon icon={chevronDown} size={16} className="accordion-icon" /> + } + classes={{ + root: 'expansion-panel-summary', + content: 'expansion-panel-content', + }} + > + <Icon className="export-icon" icon={exportIcon} size={42} /> + <div className="text-16-normal accordion-title"> + {t('export.title_export')} + </div> + </AccordionSummary> + <AccordionDetails + classes={{ + root: 'expansion-panel-details', + }} + > + <div className="text-15-normal content intro"> + {t('export.text1')} + </div> + <div className="text-16-bold content"> + {t('export.fluid_select')} + </div> + + {exportableFluids.length === 0 ? ( + <div className="text-15-normal content intro"> + {t('export.no_data')} + </div> + ) : ( + <> + {fluidCheckbox()} + <Button + aria-label={t('unsubscribe.button_accessibility')} + onClick={() => setIsExportStartModal(true)} + classes={{ + root: 'btn-secondary-negative', + label: 'text-16-normal', + }} + type="submit" + disabled={answer.length === 0} + > + {t('export.button_download')} + </Button> + </> + )} + </AccordionDetails> + </Accordion> + </div> + </div> + <ExportStartModal + open={isExportStartModal} + handleCloseClick={() => setIsExportStartModal(false)} + handleDownloadClick={() => { + setIsExportStartModal(false) + setIsExportLoadingModal(true) + }} + /> + {isExportLoadingModal && ( + <ExportLoadingModal + open={isExportLoadingModal} + handleCloseClick={() => { + setIsExportLoadingModal(false) + }} + handleDone={(e?: any): void => handleDone(e)} + selectedFluids={answer} + /> + )} + <ExportDoneModal + open={isExportDoneModal} + error={hasError} + handleCloseClick={() => setIsExportDoneModal(false)} + /> + </> + ) +} + +export default ExportOptions diff --git a/src/components/PartnersIssue/PartnersIssueModal.spec.tsx b/src/components/PartnersIssue/PartnersIssueModal.spec.tsx index ec3e9bd9884670f2df2830a6d0289208e6d35cbd..8d04d89bd6f5524332a6623d6d7c1f0ae6e9e02a 100644 --- a/src/components/PartnersIssue/PartnersIssueModal.spec.tsx +++ b/src/components/PartnersIssue/PartnersIssueModal.spec.tsx @@ -20,10 +20,10 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { const mockStore = configureStore([]) const mockHandleClose = jest.fn() describe('PartnersIssueModal component', () => { + const store = mockStore({ + ecolyo: mockInitialEcolyoState, + }) it('should render correctly', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) const wrapper = mount( <Provider store={store}> <PartnersIssueModal @@ -35,10 +35,7 @@ describe('PartnersIssueModal component', () => { ) expect(toJson(wrapper)).toMatchSnapshot() }) - it('should close modal correctly', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) + it('should close modal', () => { const wrapper = mount( <Provider store={store}> <PartnersIssueModal @@ -51,4 +48,17 @@ describe('PartnersIssueModal component', () => { wrapper.find(Button).simulate('click') expect(mockHandleClose).toHaveBeenCalled() }) + + it('should not be rendered', () => { + const wrapper = mount( + <Provider store={store}> + <PartnersIssueModal + open={false} + handleCloseClick={mockHandleClose} + fluidStatus={mockInitialEcolyoState.global.fluidStatus} + /> + </Provider> + ) + expect(wrapper.find('div.partnersIssueModal').exists()).toBeFalsy() + }) }) diff --git a/src/components/PartnersIssue/PartnersIssueModal.tsx b/src/components/PartnersIssue/PartnersIssueModal.tsx index e29c89b237f9032dea5b87be941e523c11cf53f2..d79afb180370335afd8d90884454f3377203edd9 100644 --- a/src/components/PartnersIssue/PartnersIssueModal.tsx +++ b/src/components/PartnersIssue/PartnersIssueModal.tsx @@ -1,15 +1,15 @@ -import React, { useEffect, useState } from 'react' -import './partnersIssueModal.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Button from '@material-ui/core/Button' import Dialog from '@material-ui/core/Dialog' +import IconButton from '@material-ui/core/IconButton' +import CloseIcon from 'assets/icons/ico/close.svg' +import OrangeWarn from 'assets/icons/ico/warn-orange.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' import { FluidState } from 'enum/fluid.enum' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import OrangeWarn from 'assets/icons/ico/warn-orange.svg' import { FluidStatus } from 'models' -import IconButton from '@material-ui/core/IconButton' -import CloseIcon from 'assets/icons/ico/close.svg' +import React, { useEffect, useState } from 'react' +import './partnersIssueModal.scss' interface PartnersIssueModalProps { open: boolean @@ -43,6 +43,7 @@ const PartnersIssueModal: React.FC<PartnersIssueModalProps> = ({ root: 'modal-root', paper: 'modal-paper', }} + style={{ zIndex: 1500 }} > <div id={'accessibility-title'}> {t('feedback.accessibility.window_title')} diff --git a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap index 6c4bfa3e7818464f168fba11ce330ff0bfee6ba0..4da8c4e6889a12c8b55fffeb912ed50bac6fec2f 100644 --- a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap +++ b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap @@ -26,7 +26,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "name": "", "oauth": false, "siteLink": "", - "slug": "", + "slug": "enedissgegrandlyon", }, "shouldLaunchKonnector": false, "trigger": null, @@ -47,7 +47,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "name": "", "oauth": false, "siteLink": "", - "slug": "", + "slug": "eglgrandlyon", }, "shouldLaunchKonnector": false, "trigger": null, @@ -68,7 +68,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "name": "", "oauth": false, "siteLink": "", - "slug": "", + "slug": "grdfgrandlyon", }, "shouldLaunchKonnector": false, "trigger": null, @@ -95,6 +95,11 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` disableEscapeKeyDown={true} onClose={[Function]} open={true} + style={ + Object { + "zIndex": 1500, + } + } > <ForwardRef(Dialog) aria-labelledby="accessibility-title" @@ -120,6 +125,11 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` disableEscapeKeyDown={true} onClose={[Function]} open={true} + style={ + Object { + "zIndex": 1500, + } + } > <ForwardRef(Modal) BackdropComponent={ @@ -450,6 +460,11 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` disableEscapeKeyDown={true} onClose={[Function]} open={true} + style={ + Object { + "zIndex": 1500, + } + } > <ForwardRef(Portal) disablePortal={false} @@ -462,7 +477,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` <div class="MuiDialog-root modal-root" role="presentation" - style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + style="position: fixed; z-index: 1500; right: 0px; bottom: 0px; top: 0px; left: 0px;" > <div aria-hidden="true" @@ -577,7 +592,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "position": "fixed", "right": 0, "top": 0, - "zIndex": 1300, + "zIndex": 1500, } } > diff --git a/src/components/PerformanceIndicator/FluidPerformanceIndicator.tsx b/src/components/PerformanceIndicator/FluidPerformanceIndicator.tsx index 50a77b3aea7b98b7cb317239859587ed77612122..9e94a506506817a0345722a7ecdd80f9d532a58c 100644 --- a/src/components/PerformanceIndicator/FluidPerformanceIndicator.tsx +++ b/src/components/PerformanceIndicator/FluidPerformanceIndicator.tsx @@ -15,6 +15,16 @@ interface FluidPerformanceIndicatorProps { date: DateTime } +const percentSwitch = (percentage: number) => { + if (percentage > 0) { + return `+${formatNumberValues(percentage * 100)} %` + } else if (percentage < 0) { + return `-${formatNumberValues(Math.abs(percentage) * 100)} %` + } else { + return `${formatNumberValues(percentage * 100)} %` + } +} + const FluidPerformanceIndicator: React.FC<FluidPerformanceIndicatorProps> = ({ performanceIndicator, fluidType, @@ -52,22 +62,13 @@ const FluidPerformanceIndicator: React.FC<FluidPerformanceIndicatorProps> = ({ <span className={`${ performanceIndicator?.percentageVariation && - performanceIndicator?.percentageVariation > 0 - ? 'negative' - : 'positive' + performanceIndicator?.percentageVariation >= 0 + ? 'positive' + : 'negative' }`} > - {performanceIndicator?.percentageVariation ? ( - performanceIndicator.percentageVariation > 0 ? ( - `+${formatNumberValues( - performanceIndicator.percentageVariation * 100 - )} %` - ) : ( - `-${formatNumberValues( - Math.abs(performanceIndicator.percentageVariation) * - 100 - )} %` - ) + {performanceIndicator?.percentageVariation !== null ? ( + percentSwitch(performanceIndicator.percentageVariation) ) : ( <> <span className="no-comparison"> @@ -76,7 +77,7 @@ const FluidPerformanceIndicator: React.FC<FluidPerformanceIndicatorProps> = ({ </> )} </span> - {performanceIndicator.percentageVariation && + {performanceIndicator.percentageVariation !== null && `/ ${getPreviousMonthName(date.minus({ month: 1 }))}`} </span> </div> diff --git a/src/components/ProfileType/ProfileTypeFinished.tsx b/src/components/ProfileType/ProfileTypeFinished.tsx index b71f51309fb3c514080a8c068197d520e2af3d15..9149ff48d098c844b9281d651015a8e5f0aceddd 100644 --- a/src/components/ProfileType/ProfileTypeFinished.tsx +++ b/src/components/ProfileType/ProfileTypeFinished.tsx @@ -1,24 +1,25 @@ -import React, { useEffect, useState } from 'react' +import Button from '@material-ui/core/Button' +import * as Sentry from '@sentry/react' +import finishIcon from 'assets/icons/visu/profileType/finish.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import useExploration from 'components/Hooks/useExploration' import 'components/ProfileType/profileTypeFinished.scss' +import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { UsageEventType } from 'enum/usageEvent.enum' +import { UserExplorationID } from 'enum/userExploration.enum' +import { DateTime } from 'luxon' +import { TimePeriod } from 'models' +import { ProfileType } from 'models/profileType.model' +import React, { useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { useHistory, useLocation } from 'react-router-dom' -import { updateProfile } from 'store/profile/profile.actions' -import { newProfileTypeEntry } from 'store/profileType/profileType.actions' -import { ProfileType } from 'models/profileType.model' -import Button from '@material-ui/core/Button' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import finishIcon from 'assets/icons/visu/profileType/finish.svg' import ProfileTypeService from 'services/profileType.service' -import useExploration from 'components/Hooks/useExploration' -import { AppStore } from 'store' -import { TimePeriod } from 'models' -import { UserExplorationID } from 'enum/userExploration.enum' -import { UsageEventType } from 'enum/usageEvent.enum' -import { useClient } from 'cozy-client' -import UsageEventService from 'services/usageEvent.service' import ProfileTypeEntityService from 'services/profileTypeEntity.service' -import { DateTime } from 'luxon' +import UsageEventService from 'services/usageEvent.service' +import { AppStore } from 'store' +import { updateProfile } from 'store/profile/profile.actions' +import { newProfileTypeEntry } from 'store/profileType/profileType.actions' interface ProfileTypeFinishedProps { profileType: ProfileType @@ -77,6 +78,7 @@ const ProfileTypeFinished: React.FC<ProfileTypeFinishedProps> = ({ ) } else { console.log('ERROR') + Sentry.captureException('error in profileTypeFinished') } } else { dispatch(newProfileTypeEntry(consistentProfileType)) @@ -131,7 +133,7 @@ const ProfileTypeFinished: React.FC<ProfileTypeFinishedProps> = ({ onClick={handleClick} className={'profile-type-finished-button'} classes={{ - root: 'btn-secondary-negative', + root: 'btn-primary-positive', label: 'text-16-normal', }} > diff --git a/src/components/ProfileType/ProfileTypeFormDateSelection.tsx b/src/components/ProfileType/ProfileTypeFormDateSelection.tsx index 9b85807d035ec1d65d5ecee9f225a95a8d867620..fcdebab17dacde7581fd5202857905db27993499 100644 --- a/src/components/ProfileType/ProfileTypeFormDateSelection.tsx +++ b/src/components/ProfileType/ProfileTypeFormDateSelection.tsx @@ -1,10 +1,8 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -181,7 +179,7 @@ const ProfileTypeFormDateSelection: React.FC< return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx b/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx index 57ea92b703bba66b17ba70319281aed606736593..1df12766cb42d6b4a3b1b95dd6d8711e87df24ca 100644 --- a/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx +++ b/src/components/ProfileType/ProfileTypeFormMultiChoice.tsx @@ -2,8 +2,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import classNames from 'classnames' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { remove } from 'lodash' import { IndividualInsulationWork, @@ -83,7 +83,7 @@ const ProfileTypeFormMultiChoice: React.FC<ProfileTypeFormMultiChoiceProps> = ({ return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormNumber.tsx b/src/components/ProfileType/ProfileTypeFormNumber.tsx index 18f54f4c4a9e24e30a7fa945aa506625cbd3d685..cdb31f505c0486f66038d2f306191fa189fb69ad 100644 --- a/src/components/ProfileType/ProfileTypeFormNumber.tsx +++ b/src/components/ProfileType/ProfileTypeFormNumber.tsx @@ -1,8 +1,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -50,7 +50,7 @@ const ProfileTypeFormNumber: React.FC<ProfileTypeFormNumberProps> = ({ return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx b/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx index 2979bb1723adb28a352f9b91c58f07acaf327500..8996894ac4a871f2d4d3b3a7653edbe4f4dd07a2 100644 --- a/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx +++ b/src/components/ProfileType/ProfileTypeFormNumberSelection.tsx @@ -1,8 +1,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -69,7 +69,7 @@ const ProfileTypeFormNumberSelection: React.FC< return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx b/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx index d39461b166bd3daaa16cc94b1ad251a615a9b90b..f1ddbe33c72c1367d83a46cc5ea65404655176fa 100644 --- a/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx +++ b/src/components/ProfileType/ProfileTypeFormSingleChoice.tsx @@ -2,8 +2,8 @@ import React, { useCallback, useEffect, useState } from 'react' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import classNames from 'classnames' -import ProfileTypeProgress from 'components/ProfileType/ProfileTypeProgress' -import FormNavigation from 'components/ProfileType/FormNavigation' +import FormProgress from 'components/FormGlobal/FormProgress' +import FormNavigation from 'components/FormGlobal/FormNavigation' import { ProfileTypeStepForm } from 'enum/profileType.enum' import { ProfileType, @@ -53,7 +53,7 @@ const ProfileTypeFormSingleChoice: React.FC< return ( <> <div className={'profile-form-container'}> - <ProfileTypeProgress step={step} /> + <FormProgress step={step} formType={'profile'} /> <div className={'profile-question-label'}> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` diff --git a/src/components/ProfileType/profileTypeFinished.scss b/src/components/ProfileType/profileTypeFinished.scss index 5c04aa795846b0a105ee401c1e3247985f92fd38..9aa4e25053e8ac82478b106f00d38bacff39eece 100644 --- a/src/components/ProfileType/profileTypeFinished.scss +++ b/src/components/ProfileType/profileTypeFinished.scss @@ -2,28 +2,22 @@ @import '../../styles/base/breakpoint'; .profile-type-finished-card { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: 2rem 1.25rem; + margin: auto; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; color: $white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; width: 80%; text-align: center; - padding: 0.5rem 1rem 1rem; + padding: 1rem; @media (min-width: $width-tablet) { width: 50%; - min-height: 28.75rem; } @media (min-width: $width-large-desktop) { width: 40%; - min-height: 28.75rem; } - button.profile-type-finished-button{ + button.profile-type-finished-button { margin-top: 2.875rem; } } @@ -32,4 +26,4 @@ } .profile-type-finished-description { margin-top: 1.875rem; -} \ No newline at end of file +} diff --git a/src/components/ProfileType/profileTypeForm.scss b/src/components/ProfileType/profileTypeForm.scss index 363995f8e2d743265a3943e76749c788b3dce129..f6729209fca0abd76af27a1ae605fc828411bf62 100644 --- a/src/components/ProfileType/profileTypeForm.scss +++ b/src/components/ProfileType/profileTypeForm.scss @@ -5,11 +5,7 @@ .profile-form-container { color: $white; margin: 1rem 1rem 3.5rem; - width: 100%; max-width: 53rem; - @media (min-width: $width-tablet) { - margin: 1rem 1rem 0; - } .text, .number { font-size: 1.25rem; @@ -56,7 +52,7 @@ .radio_short, .radio_long, .checkbox { - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); margin: 0.5rem 0; display: flex; @@ -201,7 +197,7 @@ } ul { - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; color: $white; font-weight: normal; .MuiMenuItem-root { diff --git a/src/components/ProfileType/profileTypeView.scss b/src/components/ProfileType/profileTypeView.scss index 2723a89e3945cc5f2635e16e5a98ec3422ca0d39..188ab4423bbac201cf5203883e34fc1492598800 100644 --- a/src/components/ProfileType/profileTypeView.scss +++ b/src/components/ProfileType/profileTypeView.scss @@ -1,9 +1,10 @@ .profile-type-container { position: relative; - height: 100%; min-height: inherit; display: flex; - justify-content: center; + flex: 1; + flex-direction: column; + justify-content: space-between; label, input { cursor: pointer; diff --git a/src/components/Quiz/QuizCustomQuestionContent.spec.tsx b/src/components/Quiz/QuizCustomQuestionContent.spec.tsx index eb0aca3e52f7a5ad175d58c688c1f9a4037dc2f4..0960911e61d9e891e68b6ec0cd13485e195df7b4 100644 --- a/src/components/Quiz/QuizCustomQuestionContent.spec.tsx +++ b/src/components/Quiz/QuizCustomQuestionContent.spec.tsx @@ -1,15 +1,15 @@ -import React from 'react' +import Button from '@material-ui/core/Button' +import Loader from 'components/Loader/Loader' import { mount } from 'enzyme' +import React from 'react' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' -import { userChallengeData } from '../../../tests/__mocks__/userChallengeData.mock' -import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import { challengeStateData } from '../../../tests/__mocks__/challengeStateData.mock' -import Button from '@material-ui/core/Button' -import QuizExplanationModal from './QuizExplanationModal' -import QuizCustomQuestionContent from './QuizCustomQuestionContent' +import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import { questionEntity } from '../../../tests/__mocks__/quizData.mock' -import StyledSpinner from 'components/CommonKit/Spinner/StyledEcogestureSpinner' +import { userChallengeData } from '../../../tests/__mocks__/userChallengeData.mock' +import QuizCustomQuestionContent from './QuizCustomQuestionContent' +import QuizExplanationModal from './QuizExplanationModal' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -95,7 +95,7 @@ describe('QuizCustomQuestionContent component', () => { /> </Provider> ) - expect(wrapper.find(StyledSpinner).exists()).toBeTruthy() + expect(wrapper.find(Loader).exists()).toBeTruthy() }) it('should display QuizExplanationModal when click on Button', () => { const store = mockStore({ diff --git a/src/components/Quiz/QuizCustomQuestionContent.tsx b/src/components/Quiz/QuizCustomQuestionContent.tsx index bd42f8cb1c5e6d7a0811976e03db307f3815fce4..a5a38de7729980d4b2ac950bf59d1ba4d0c0cbf6 100644 --- a/src/components/Quiz/QuizCustomQuestionContent.tsx +++ b/src/components/Quiz/QuizCustomQuestionContent.tsx @@ -1,20 +1,20 @@ -import React, { useState } from 'react' -import './quizQuestion.scss' +import Button from '@material-ui/core/Button' import CloseIcon from 'assets/icons/ico/close.svg' import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton' -import Button from '@material-ui/core/Button' +import Loader from 'components/Loader/Loader' import QuizExplanationModal from 'components/Quiz/QuizExplanationModal' +import { Client, useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { UsageEventType } from 'enum/usageEvent.enum' +import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum' import { Answer, QuestionEntity, UserChallenge, UserQuiz } from 'models' +import React, { useState } from 'react' +import { useDispatch } from 'react-redux' import ChallengeService from 'services/challenge.service' import QuizService from 'services/quiz.service' -import { Client, useClient } from 'cozy-client' -import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum' -import { updateUserChallengeList } from 'store/challenge/challenge.actions' -import { useDispatch } from 'react-redux' -import StyledSpinner from 'components/CommonKit/Spinner/StyledEcogestureSpinner' import UsageEventService from 'services/usageEvent.service' -import { UsageEventType } from 'enum/usageEvent.enum' +import { updateUserChallengeList } from 'store/challenge/challenge.actions' +import './quizQuestion.scss' interface QuizCustomQuestionContent { userChallenge: UserChallenge @@ -100,7 +100,7 @@ const QuizCustomQuestionContent: React.FC<QuizCustomQuestionContent> = ({ {isLoading ? ( <div className={'question-loading'} aria-busy="true"> - <StyledSpinner /> + <Loader /> </div> ) : ( question && ( @@ -126,18 +126,18 @@ const QuizCustomQuestionContent: React.FC<QuizCustomQuestionContent> = ({ ) )} </div> - {userChoice && ( - <Button - aria-label={t('quiz.accessibility.button_validate')} - onClick={validateQuestion} - classes={{ - root: 'btn-secondary-negative', - label: 'text-16-normal', - }} - > - {t('quiz.button_validate')} - </Button> - )} + <Button + aria-label={t('quiz.accessibility.button_validate')} + onClick={validateQuestion} + disabled={!userChoice} + classes={{ + root: 'btn-secondary-negative', + label: 'text-16-normal', + }} + > + {t('quiz.button_validate')} + </Button> + <QuizExplanationModal open={openModal} answerIndex={answerIndex} diff --git a/src/components/Quiz/QuizQuestionContent.tsx b/src/components/Quiz/QuizQuestionContent.tsx index cbd096f86dac2bf5dfd7ca944a9231df3a6737f3..a8a79137db1fc037a1e9f478d896a0229a288889 100644 --- a/src/components/Quiz/QuizQuestionContent.tsx +++ b/src/components/Quiz/QuizQuestionContent.tsx @@ -115,18 +115,17 @@ const QuizQuestionContent: React.FC<QuizQuestionContent> = ({ } )} </div> - {userChoice && ( - <Button - aria-label={t('quiz.accessibility.button_validate')} - onClick={validateQuestion} - classes={{ - root: 'btn-secondary-negative', - label: 'text-16-normal', - }} - > - {t('quiz.button_validate')} - </Button> - )} + <Button + aria-label={t('quiz.accessibility.button_validate')} + onClick={validateQuestion} + disabled={!userChoice} + classes={{ + root: 'btn-secondary-negative', + label: 'text-16-normal', + }} + > + {t('quiz.button_validate')} + </Button> {openModal && ( <QuizExplanationModal open={openModal} diff --git a/src/components/Quiz/quizBegin.scss b/src/components/Quiz/quizBegin.scss index 33a7d565bfaac99e4303f85cad02c5b2ad970661..c1b59893cf0acceefa0ad75f1234e1c279f36fed 100644 --- a/src/components/Quiz/quizBegin.scss +++ b/src/components/Quiz/quizBegin.scss @@ -6,20 +6,25 @@ flex-direction: column; justify-content: center; align-items: center; + margin: auto; + padding: 1.5rem; } .quiz-begin-container { display: flex; flex-direction: column; align-items: center; - margin: 2rem 1rem; - padding: 1rem; + padding: 2rem 1rem; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; color: $white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); - height: 70vh; + background: $grey-linear-gradient-background; text-align: center; + + svg { + margin-top: -33%; + } + @media (min-width: $width-large-phone) { max-width: 60%; justify-content: space-evenly; diff --git a/src/components/Quiz/quizExplanationModal.scss b/src/components/Quiz/quizExplanationModal.scss index eb9a05c7af1bccfdb24a7fddf675cce02f0e793c..a5ad24d164c2b604e5379b75dfe47f81d8c9d5b6 100644 --- a/src/components/Quiz/quizExplanationModal.scss +++ b/src/components/Quiz/quizExplanationModal.scss @@ -5,16 +5,15 @@ flex-direction: column; justify-content: center; align-items: center; - padding: 1.5rem 0.5rem; text-align: center; - .quiz-modal-answer{ + .quiz-modal-answer { font-weight: bold; font-size: 1.7rem; text-transform: uppercase; margin-top: 0; margin-bottom: 1rem; &.correct { - color: $blue-light; + color: $gold-shadow; } &.wrong { color: $red-primary; @@ -27,7 +26,6 @@ button.btn-secondary-negative { width: auto; padding: 0.5rem 3rem; - margin: 2rem 0.25rem 0.5rem; border-color: $grey-bright; } } @@ -35,4 +33,3 @@ #accessibility-title { display: none; } - diff --git a/src/components/Quiz/quizFinish.scss b/src/components/Quiz/quizFinish.scss index 0608c2cbff1ec6926d2f64439cad540c200eea1a..79da8a18aaa1ac8f67814f4f6f6e346799c8b76b 100644 --- a/src/components/Quiz/quizFinish.scss +++ b/src/components/Quiz/quizFinish.scss @@ -2,29 +2,20 @@ @import '../../styles/base/breakpoint'; .quiz-finish-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: 3rem 1rem 1rem; + padding: 1.5rem; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; color: $white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); - height: 100%; - width: 80%; + background: $grey-linear-gradient-background; text-align: center; - padding: 0.5rem 1rem 2rem; - @media (min-width: $width-tablet) { - width: 50%; - } - @media (min-width: $width-large-desktop) { - width: 40%; - } + button.btn-secondary-negative { border-color: $grey-bright; - min-width: 11rem; + min-width: 15rem; + } + .button-start { + margin-top: 3rem; } } .score-final-title { diff --git a/src/components/Quiz/quizQuestion.scss b/src/components/Quiz/quizQuestion.scss index 048cdc97015e7ed82bff037ba6e47a057865cf9b..d0a3baa006a6430ba9946f10c5fec7b60b2de1c0 100644 --- a/src/components/Quiz/quizQuestion.scss +++ b/src/components/Quiz/quizQuestion.scss @@ -2,29 +2,22 @@ @import '../../styles/base/breakpoint'; .quiz-container { - text-align: center; .question-container { display: flex; flex-direction: column; justify-content: center; align-items: center; - margin: 3rem 1rem 1rem; - padding: 0.5rem 1rem; + padding: 1.5rem; box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55); border-radius: 4px; transition: all 300ms ease; color: $white; - background: linear-gradient(180deg, #323339 0%, #25262b 100%); + background: $grey-linear-gradient-background; position: relative; - width: 80%; @media (min-width: $width-large-phone) { - width: 60%; height: 45vh; } - @media (min-width: $width-large-desktop) { - width: 45%; - padding: 0.5rem 1rem 2rem; - } + .question-loading { min-height: 13.875rem; display: flex; @@ -79,7 +72,7 @@ } input[type='radio']:checked + label, label:hover { - background: $blue-light; + background: $blue-radial-gradient; color: $dark-light-2; border-color: $blue-light; } diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx index 0df72fa29592f663f831c2fd2a2e6a36f54200cf..849967efedf6c84eb54c2adcf6bc48a99e99727d 100644 --- a/src/components/Routes/Routes.tsx +++ b/src/components/Routes/Routes.tsx @@ -6,11 +6,12 @@ import DuelView from 'components/Duel/DuelView' import QuizView from 'components/Quiz/QuizView' import ExplorationView from 'components/Exploration/ExplorationView' import ActionView from 'components/Action/ActionView' -import UnSubscribe from 'components/Options/UnSubscribe' +import UnSubscribe from 'components/Options/Unsubscribe/UnSubscribe' import TermsView from 'components/Terms/TermsView' import { TermsStatus } from 'models' import EcogestureFormView from 'components/EcogestureForm/EcogestureFormView' import EcogestureSelection from 'components/EcogestureSelection/EcogestureSelection' +import SgeConnectView from 'components/Connection/SGEConnect/SgeConnectView' const ConsumptionView = lazy(() => import('components/Home/ConsumptionView')) @@ -21,7 +22,6 @@ const SingleEcogesture = lazy( () => import('components/Ecogesture/SingleEcogesture') ) const OptionsView = lazy(() => import('components/Options/OptionsView')) -const FAQView = lazy(() => import('components/FAQ/FAQView')) const LegalNoticeView = lazy( () => import('components/LegalNotice/LegalNoticeView') ) @@ -59,6 +59,7 @@ const Routes: React.FC<RouteProps> = ({ termsStatus }: RouteProps) => { <ConsumptionView fluidType={FluidType.MULTIFLUID} /> </Route> + <Route path={`/sge-connect`} component={SgeConnectView} /> <Route path={`/challenges/duel`} component={DuelView} /> <Route path={`/challenges/quiz`} component={QuizView} /> <Route path={`/challenges/exploration`} component={ExplorationView} /> @@ -70,7 +71,6 @@ const Routes: React.FC<RouteProps> = ({ termsStatus }: RouteProps) => { <Route path="/ecogesture/:id" component={SingleEcogesture} /> <Route path={`/ecogestures`} component={EcogestureView} /> <Route path={`/ecogestures`} component={EcogestureView} /> - <Route path={'/options/FAQ'} component={FAQView} /> <Route path={`/options/legalnotice`} component={LegalNoticeView} /> <Route path={`/options/gcu`} component={GCUView} /> <Route path={'/options/:connectParam'} exact component={OptionsView} /> diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx index 3db7ec06dd8dc8ef7969edfef773979b200ad6e6..46fbf339072415e059c44261e56031b6fc776cc8 100644 --- a/src/components/Splash/SplashRoot.tsx +++ b/src/components/Splash/SplashRoot.tsx @@ -1,63 +1,66 @@ -import React, { useState, useEffect, ReactNode, Dispatch } from 'react' -import { useClient } from 'cozy-client' +import * as Sentry from '@sentry/react' import classNames from 'classnames' -import { useDispatch } from 'react-redux' +import useExploration from 'components/Hooks/useExploration' +import { useClient } from 'cozy-client' import { FluidState } from 'enum/fluid.enum' - +import { UsageEventType } from 'enum/usageEvent.enum' +import { UserActionState } from 'enum/userAction.enum' +import { UserChallengeState } from 'enum/userChallenge.enum' +import { UserDuelState } from 'enum/userDuel.enum' +import { + UserExplorationID, + UserExplorationState, +} from 'enum/userExploration.enum' +import { DateTime } from 'luxon' +import { migrations } from 'migrations/migration.data' +import { MigrationService } from 'migrations/migration.service' +import { FluidStatus, TermsStatus, UserChallenge } from 'models' +import { InitSteps, InitStepsErrors } from 'models/initialisationSteps.model' +import { PartnersInfo } from 'models/partnersInfo.model' +import { ReleaseNotes } from 'models/releaseNotes.model' +import React, { Dispatch, ReactNode, useEffect, useState } from 'react' +import { useDispatch } from 'react-redux' +import ActionService from 'services/action.service' +import ChallengeService from 'services/challenge.service' +import CustomPupopService from 'services/customPopup.service' +import FluidService from 'services/fluid.service' +import InitializationService from 'services/initialization.service' +import PartnersInfoService from 'services/partnersInfo.service' +import UsageEventService from 'services/usageEvent.service' +import { + ChallengeActionTypes, + setChallengeConsumption, + setUserChallengeList, + updateUserChallengeList, +} from 'store/challenge/challenge.actions' +import { ChartActionTypes, setSelectedDate } from 'store/chart/chart.actions' import { + GlobalActionTypes, + setCustomPopup, + setFluidStatus, + setPartnersIssue, + showReleaseNotes, toggleAnalysisNotification, - toggleChallengeExplorationNotification, toggleChallengeActionNotification, toggleChallengeDuelNotification, - setFluidStatus, - GlobalActionTypes, + toggleChallengeExplorationNotification, updateTermValidation, - showReleaseNotes, - setPartnersIssue, } from 'store/global/global.actions' import { ProfileActionTypes, updateProfile, } from 'store/profile/profile.actions' +import { + ProfileEcogestureActionTypes, + updateProfileEcogestureSuccess, +} from 'store/profileEcogesture/profileEcogesture.actions' import { ProfileTypeActionTypes, updateProfileType, } from 'store/profileType/profileType.actions' -import { - setUserChallengeList, - setChallengeConsumption, - updateUserChallengeList, - ChallengeActionTypes, -} from 'store/challenge/challenge.actions' -import { ChartActionTypes, setSelectedDate } from 'store/chart/chart.actions' -import InitializationService from 'services/initialization.service' +import logApp from 'utils/logger' +import { getTodayDate } from 'utils/utils' import './splashRoot.scss' -import { UserChallengeState } from 'enum/userChallenge.enum' -import { UserDuelState } from 'enum/userDuel.enum' -import ChallengeService from 'services/challenge.service' -import useExploration from 'components/Hooks/useExploration' -import { - UserExplorationID, - UserExplorationState, -} from 'enum/userExploration.enum' -import { DateTime } from 'luxon' -import { UserActionState } from 'enum/userAction.enum' -import ActionService from 'services/action.service' -import { FluidStatus, TermsStatus, UserChallenge } from 'models' -import UsageEventService from 'services/usageEvent.service' -import { UsageEventType } from 'enum/usageEvent.enum' -import { MigrationService } from 'migrations/migration.service' -import { migrations } from 'migrations/migration.data' -import { ReleaseNotes } from 'models/releaseNotes.model' -import PartnersInfoService from 'services/partnersInfo.service' -import FluidService from 'services/fluid.service' -import { PartnersInfo } from 'models/partnersInfo.model' -import { - ProfileEcogestureActionTypes, - updateProfileEcogestureSuccess, -} from 'store/profileEcogesture/profileEcogesture.actions' -import { InitSteps, InitStepsErrors } from 'models/initialisationSteps.model' -import log from 'utils/logger' import SplashScreen from './SplashScreen' import SplashScreenError from './SplashScreenError' @@ -77,8 +80,8 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { splashStart: false, }) - const [initStep, setinitStep] = useState<InitSteps>(InitSteps.MIGRATION) - const [initStepErrors, setinitStepErrors] = useState<InitStepsErrors | null>( + const [initStep, setInitStep] = useState<InitSteps>(InitSteps.MIGRATION) + const [initStepErrors, setInitStepErrors] = useState<InitStepsErrors | null>( null ) const dispatch: Dispatch< @@ -107,21 +110,24 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { async function loadData() { const initializationService = new InitializationService( client, - setinitStep, - setinitStepErrors + setInitStep, + setInitStepErrors ) const partnersInfoService = new PartnersInfoService(client) - const ms = new MigrationService(client, setinitStepErrors) + const customPopupService = new CustomPupopService(client) + const ms = new MigrationService(client, setInitStepErrors) try { const migrationsResult: ReleaseNotes = await ms.runMigrations( migrations ) - // Init index - await initializationService.initIndex() // Init last release notes when they exist dispatch( - showReleaseNotes(migrationsResult.show, migrationsResult.notes) + showReleaseNotes( + migrationsResult.show, + migrationsResult.notes, + migrationsResult.redirectLink + ) ) //init Terms @@ -257,54 +263,70 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { }) } - // Check partnersInfo from backoffice - const partnersInfo: PartnersInfo | undefined = - await partnersInfoService.getPartnersInfo() - - // Get last partnersIssueDate - const today = DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day') - .toISO() + const today = getTodayDate().toISO() - // If notification is activated and konnector is connected, set FluidStatus to PARTNER_ISSUE - if (partnersInfo && partnersInfo.notification_activated) { - const fluidService = new FluidService(client) - const _updatedFluidStatus: FluidStatus[] = - await fluidService.getFluidStatus(partnersInfo) - let isConcernedByPartnerIssue = false - for (const fluid of _updatedFluidStatus) { - if (fluid.status === FluidState.PARTNER_ISSUE) - isConcernedByPartnerIssue = true + try { + // Check customPopup from backoffice + const customModalInfo = await customPopupService.getCustomPopup() + if ( + customModalInfo && + today !== profile?.customPopupDate.toISO() && + !profile?.isFirstConnection + ) { + dispatch(setCustomPopup(customModalInfo)) } - dispatch(setFluidStatus(_updatedFluidStatus)) - /* - * If the partnersIssueModal has not been seen today - * and the user is concerned by any one of the partners' issue - * enable the modal - */ + } catch (error) { + console.error('Error while checking customPopup informations') + } + + try { + // Check partnersInfo from backoffice + const partnersInfo: PartnersInfo | undefined = + await partnersInfoService.getPartnersInfo() + + // If notification is activated and konnector is connected, set FluidStatus to PARTNER_ISSUE if ( - today !== profile?.partnersIssueDate.toISO() && - isConcernedByPartnerIssue + partnersInfo?.notification_activated && + !profile?.isFirstConnection ) { - dispatch(setPartnersIssue(true)) + const fluidService = new FluidService(client) + const _updatedFluidStatus: FluidStatus[] = + await fluidService.getFluidStatus(partnersInfo) + let isConcernedByPartnerIssue = false + for (const fluid of _updatedFluidStatus) { + if (fluid.status === FluidState.PARTNER_ISSUE) + isConcernedByPartnerIssue = true + } + dispatch(setFluidStatus(_updatedFluidStatus)) + /* + * If the partnersIssueModal has not been seen today + * and the user is concerned by any one of the partners' issue + * enable the modal + */ + if ( + today !== profile?.partnersIssueDate.toISO() && + isConcernedByPartnerIssue + ) { + dispatch(setPartnersIssue(true)) + } } + } catch (error) { + console.error('Error while fetching partners informations') } if (subscribed) { - log.info('Initialization finished successfully !') + logApp.info('[Initialization] Finished successfully !') setState(prev => ({ ...prev, splashStart: true, })) } - } catch (err) { - if (err.message === 'Failed to fetch' && !initStepErrors) { - setinitStepErrors(InitStepsErrors.UNKNOWN_ERROR) + } catch (error: any) { + if (error.message === 'Failed to fetch' && !initStepErrors) { + setInitStepErrors(InitStepsErrors.UNKNOWN_ERROR) } - log.error(`[Initialization] Error : ${err}`) + logApp.error(`[Initialization] Error : ${error}`) + Sentry.captureException(JSON.stringify({ error })) } } if (!initStepErrors) loadData() diff --git a/src/components/Splash/SplashScreen.tsx b/src/components/Splash/SplashScreen.tsx index 55b861fd7a44b610273c40e694c5f8662ccbd363..53c526a4eeb671f210f8ed62ec53a7f393b6059b 100644 --- a/src/components/Splash/SplashScreen.tsx +++ b/src/components/Splash/SplashScreen.tsx @@ -1,20 +1,10 @@ -import React from 'react' -import Lottie from 'react-lottie' +import logoLoading from 'assets/anims/logoLoading.gif' import logos from 'assets/png/logos_partenaires.svg' - -import * as loadingData from 'assets/anims/splash.json' -import './splashScreen.scss' -import { InitSteps } from 'models/initialisationSteps.model' import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { InitSteps } from 'models/initialisationSteps.model' +import React from 'react' +import './splashScreen.scss' -const loadingOptions = { - loop: true, - autoplay: true, - animationData: loadingData, - rendererSettings: { - preserveAspectRatio: 'xMidYMid slice', - }, -} interface SplashScreenProps { initStep: InitSteps } @@ -32,7 +22,8 @@ const SplashScreen: React.FC<SplashScreenProps> = ({ <> <div className="splash-content"> <div className="splash-loader"> - <Lottie options={loadingOptions} height={200} width={200} /> + <img src={logoLoading} alt="Chargement" /> + <span>Ecolyo</span> <div className="splash-progress"> <div className="splash-progress-bar-container"> <div diff --git a/src/components/Splash/SplashScreenError.tsx b/src/components/Splash/SplashScreenError.tsx index 1f888197abeabc912b4bd41e435e9d18f8a9205d..baaa576c160104a2141f6adff56dcce9f3df30c3 100644 --- a/src/components/Splash/SplashScreenError.tsx +++ b/src/components/Splash/SplashScreenError.tsx @@ -1,19 +1,11 @@ -import React from 'react' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import Lottie from 'react-lottie' import Button from '@material-ui/core/Button' -import * as loadingData from 'assets/anims/splash.json' -import './splashScreen.scss' +import ecolyoIcon from 'assets/icons/ico/ecolyo.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { InitStepsErrors } from 'models/initialisationSteps.model' +import React from 'react' +import './splashScreen.scss' -const loadingOptions = { - loop: false, - autoplay: false, - animationData: loadingData, - rendererSettings: { - preserveAspectRatio: 'xMidYMid slice', - }, -} interface SplashScreenErrorProps { error: InitStepsErrors } @@ -25,7 +17,8 @@ const SplashScreenError: React.FC<SplashScreenErrorProps> = ({ <> <div className="splash-content"> <div className="splash-loader"> - <Lottie options={loadingOptions} height={200} width={200} /> + <StyledIcon icon={ecolyoIcon} size={130} className="error" /> + <span>Ecolyo</span> <div className="splash-error-text text-20-bold"> {t('splashscreen.error_loading')} </div> diff --git a/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap index cf5e36b845fc337d8040904117bf32f49b89a47b..ba2b5e5a00ba7ba62aa8c1713727299710424b82 100644 --- a/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap +++ b/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap @@ -10,5637 +10,13 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` <div className="splash-loader" > - <Lottie - ariaLabel="animation" - ariaRole="button" - eventListeners={Array []} - height={200} - isClickToPauseDisabled={false} - isPaused={false} - isStopped={false} - options={ - Object { - "animationData": Object { - "__complete": true, - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAIaElEQVR4Xu3VsZEdVRRF0fdJgBBQGkgGEAGEoBAgA8hAIUAEEIKskUsIkIEw5ehTJQuLUZWezpnXd8me+qd73d5wW/4RIHB5gdvl39ALEiCwhO4jIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ848ud6xfub9e2H336/3t5erD8/147f/XQBoX+64ahfuL9Zz9Z9/bjWernW+vI/L//3WuvVerd+vX233o5COeBlhX7AkZ7SI94f1l9rra/+55l+uz3/8B8B/56QgNCf0DGe+qPcH9YPa63fH3nOf9a79cz/1Z/WNYX+tO7xpJ/m/rD+WGt9/xEP+dPt+Xr1EX/nT0ICQg9BX2Hm/rBer7W+efRd7uuX24v186N/5w9iAkKPUZ8/JPRzbyj0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JPf36yX6/169ujwF+v17ev1+tG/8wcxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGewL9Mt+j7O/D7zgAAAABJRU5ErkJggg==", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAWBUlEQVR4Xu2dDXBcxX3A/3f6tCR/q/gLYzlYNoYABkKoxyZ20jIkMAEnBZpCiuWQkJkydTRJmCFDZOQWpqnbtG4yaRnCxIY0CaTtYDeljUsZ2xNsTSBQuxmSgmss2RhbkWzpsCXbsu5eZ59ORBb33r3dW51W9343w0wb7f7f7u+/P+++fV8J4QcBCJQ8gUTJ95AOQgACgugMAgjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIHrMxcOKH8vmZd8uTMet27LuL6DEZAt4eWSYJ2dx9QBp6D/udbmpskV0x6X7su4noJT4EvJ0yTSqlWRLyiOpq9wHp6D0sC/xue7K9PCNNC1ult8QxxL57iF7CQ8Brk9XiyVaRrNijRR/qe0oS0tr4ddlcwihi3zVEL8Eh4LVJg3i+uLeP7t4FM/qFf9wvIs0s50twQIgIopdQXkcv03N1LUT0oeKebB/MSPPSVmkvITSx7wqil8gQ8PZIqySkWUSmhnUpr+jZyp7IU+m0tCJ8aQwQRJ/gefTapEk8aR15Hm5D9OEYCD/BB0i2+Yg+AfPoL9GrpEmdU0cVfLibb+1PpjLdmdBZPxcShJ+AA2VEkxF9AuXP32TLSFOUJXqubu3eV9P/Z1tn1NzUcEruuDJl1nNPtqvr8WzameEbr1qIPl7kNY6bvUymZvC1GtXeK9qdKut/6In6mp++Uvve/7Zo5oD86YpuuXrOWZOQqk6HEr58ULZyHd4UYfHqIXrxWGsdKXuJbI3J8nz4QOfOJ859Z9u0qr/5p+mBx/74klOy7roemTV5UKt9IwurZX1SZNuiFtlmHISKY0oA0ccUr17w9+RO+BtsV+vVvrD01h1Tzm16ZkbVu33JSGHUUn7dh3q82spMIWMi5YlsQ/pIyItaqJCkFrWhpXow/x50kTWSlDWFyq0YPfezuoFNz8yoPNJVro2srjIjd1yVkjuvTBUqvDp2SjzZpcRPZ2QXl+m002G1AqJbxZk/WPZ8W8m9Ovuf9g54rqMUIvjoeJaFHw6/3xPZp+RH/PzjxHYJRLdNNBvPX4aLfyuqklr9p/7/VTYPd3YgMfCD/5pS+eTzU8VkBo/SFhvn8AHHUdv++0Rkl+dJeyIh7eVp2cfGXpSs6JdB9IjM/CV2UqaNKq4udymB1c3EQ2InZJqNJXhYs7p6y85+Z/u06h/vmixRz8EjdjOw2MqGPvnEktOyoqGv0FBR6u8eQir7PBl6sm7k/z0cwEtK7+KH/X8s+OUhgOghgLLL7J2ujKIXX6s5/6MXJ1eMvExW7LbNnjwoapa/ZcmpzEV1g9F2+orTyI9ybT8YNKKHiT50/7j/HPd4/d58u3Lghy9Orizm7B21r2qWX7mwXz6ysC9TU5EZV+k9T9Yt3uA/kssvBwFEd1D0Ybl3vFw7Zufetm1wQPqNjS3+Pf/8EF1vDGSfCBvzGb3/XGLwZ/9TU77jlRppe33ShJE7iOayuWdk2dyzcmNDn1w6c0APunlpRA9hx4w+DjO62kx77UB1dduvqn2xX2+vNB/ejtdUl+qU+IvqB+SauWcKueU2X08RHdHzjZHcf/f2+i9PLOiS2MF3Ks7839HKSUpmJfbbv6mY8DO2Gc3f1lL32S+qPydqY0/JP2/K+YH62nRh/9p5sr1xg6hbhvmxdNcbA2GiHzpWcborVVadyUh5qq/svVn5V+2VkupPIrQear+0+gegrirt/wOg/lO/xuz/lkzI4Lwp5wdn1KSrA0Lvbmzxb0Lih+h6YyBM9Ds3zvGX3fyKR6DpQz3SdF1P0AERnaW72WBEdDNuY1VLXb9/aHUXohsAZjMuBJq3V7ygPzOjG4y2AquoTb3NnzwWFCXV2PK+OxcLPGLpVEd0Q9GXP3BJ7DfViq1BHtGlsYW3GgflBNENRb/4rg8Ue5zH/niIbj4EED2AXfYFjIE7P4huPuhMa6qd+GfuHvpwXK4fM3owWUQPEn3oc0aBD7QguqmuhdXb9cW3wgLwYEsAHUQ3ED3Vl0xdsa7BygsjChv28auN6GY5R3QD0duPV3SsXD9/6Iuk/IpKANHNcCN6kOh7/dspn8v1Z0Q3G2w2av3zZzs662vTswJisXRn6a43zMKeXEN0PZY2S//gM0c65k09H7Sa4sEWRNcbbmGi73iltvO+v5oVNKvoHYjSWgSe+IOjvYvrz41+pddwDERHdK3xJGGib/mPqR0tW2Zyjq6H1EppRDfDyDl60Dl6yGukEN1ssNmo9djNnZ0rGvqCVlPM6MzoesMs7IEWRNdjabP0+hUnOj79wVTQaoon2BBdb7iFif7o92eeffwnU4Oei9Y7EKW1CNx3/clzf3xtb1VAJURHdK3xJDyiqserWKV5Jt2MNOfoQefoIa+R4hFVs8Fmoxaim1FE9CDR2/zvhOX8oimimw02G7XyPMHG0p2lu94w46UTeryKVZpHVc1IM6MHL915u4zZmBrTWohuhhfRDUS/fF1D0T5uaJbW0q2F6Ga5RXQD0XkW3Wyw2aiF6GYUER3RzUbOONVCdDPwiI7oZiNnnGrxOikz8IiO6GYjZxxrhb18gvfG5U4MoiP6OCprdmhE1+eG6IiuP2rGuQai6ycA0XMw89qkQTw5FISTXXf9gWazRpjo5WmZvrBVem0erxRiITqiT7hxHCb6YFoWLm2V9gnXqTFuMKKzdB/jIWY/PEt3faaIjuj6o2acayC6fgIQHdH1R80410B0/QQgOqLrj5pxrFFXmZF/Wxd8Cs519NzJQXREH0dt9Q/NLbD6zFQNREd0s5EzTrUQ3Qw8ohuIvvyBS+RIV7kZcWoVRADRzfAhuoHovErKbLDZqIXoZhQRPVj0XSKyKtefEd1ssNmo9fElp+Sh1V1BoXhnXAAZRDcQ/TN/PqfvpV9OqrUxcImhR4D3uuvxGi6N6Aai86UWs8FmoxZfajGjiOjBom8WkS/l+jOimw02G7U2f/JY97K5Z+oDYvHtNZbuesMs7Guqba/X/PrOjbOX6kWktA0CT//h4aOXTBuch+h6NJnRg2b0NmkST7bk+nP78YqOlevn89lkvbFmpfRPmtpTk6syU3MF8zxZt3iDbLVyoBILgujBoq8WT3bm+vNgOtHf8EcLa0psLEyI7oTd5y4iH21sEXW1hN8oAogeLDovn3BMl0UzB+TJO94ObBXPogcnDNFDBjOfZXLL9JUNffLozZ2BjeKBFkQ3GrFeyIcWW75Xf2TLT6fMNwpMJSMCf7L8ROddV6VmBVTmZpkQqszo4TP6NhG5PVeRf/957a/v/+Ysdt6NlDWrtOXOI50LZ5zPKbon8tTiFmkyi1z6tRA9TPQ90ioJeSRXkSNdZQeXP7Dg0tIfIu708IXPHzpbUeZVB7SIa+jM6GaD1WuTwJ13FZG3wZpxNamV7wst7LiHU2VGD5vRd8o0qZKeoCLc826irFmdWy87debBVV2TgmqzEYfoZiMrWytsQ+77L0x542vfrV9S0AGoHInAX9xy/Mjy+f1Bm5/7G1tkWaRAMS3EjJ4n8d5e/06rtbmKnTxVduSq+xaw814EeV74wqEzFUkv54yeEPm7RS3SXIRmTNhDIHp+0deIyHNBxS5f1yDv9iUn7ACYCA3P97KJhMinFrWIukLCL4AAoucTPc95OtfTx96tB1d1dd962amgJ9aE8/P8OUD0/Iwk7Dydy2wRABZY5Pl17T21lZnpOcN4sr1xg6hVF78QAogeYXh4e/3zv78NKsrLIiNANCyS77ZXnliLBhbRI3DK93VVdt8jQDQs8q3b3jl+1Zyzs4Oq8/XUaGARPRqn0OX72YFE56LPLgy6BzviESg2mkDem2RYtkceNIgeEZUX8iIKFYJNuYggNYrleYhFfX2E3faIPBE9IihvaPddffQr59tNuKYeEWTEYuoba8+t7Qi8di4iHY0t0hAxXOyLIbrGEAi7eUaFueexOZ27909iCa/BNKjo/TecTN29rDfnP6rZOjzEosEZ0TVg5duUS/Un269oamCW0WCaq6iazbet7egvT3qBr+tiE04PMqLr8RJvr38HVs5n1FWojU/NfOO7z0/l/ndNriOLP3ZzZ+eKhr7AlRHPnuvDRXRNZvkeXU1n5PSV9zXUcVusJths8XzvhVPFeDecPltE12emZvXA77KpcP/5as2+z/3lbJ6mMmD743sOd19UNxh4uyuzuQFUvo9uBi3fuTobc2ZcI2zApcrT0rCwVXrNjhDfWszohrnPtwM/cD5xbNn9C+awhI8GOMqSXW2BNLZIa7SIlBpJANENx0O+6+oq7P6D1a/c+rW51xseIjbV1C77s/ccDn5wZYgE180LGBGIXgC8fA+7qNCP/ePM//6Hf516TQGHKfmq+e5nzwLgKywFjARELwCeqppvY06Vuf3heW++eqBqcYGHKsnq+W5zVZ3mDTKFpx7RC2SY3ZjbF3RrrAqf8eTUrQ/NS/zyUFVdgYcrqer5XviY7ez+8rSsZgOusNQjemH8/NreXv/FB4Gvm1Jl+gYSb374iwtmp/qSUywccsKHWPWBvv6NN3Xm/VCll5RrFj8s6h9SfgUQQPQC4I2smm8XHtl/S2tx/bnTj3/6qCQTErrC4aUSlgYn19HtgfRn9pBvtQ0fKe4ze2TJ+cSS1cHJjG4RZ5RLbnGe2dU5+Vc+0pXON5OrK5O8p93iwGRGtwvTn9X3yDJJ+LfIhj1i6Z+z3/XI3Mn7D1bNsd8K9yLedvmpE1++sWtmhJax+RYBkm4RZnRdYhHK53vwZTiE58m7a74+73ipX3rL97rmEUi5xTXC+DIpgugm1CLUyffqqZEh/vrZ6Xs2/8v0FRHCTqgi6o63TbccO3L5rHNRvmaT8pKymh32sUkxoo8NVz+qjuy/eKP6hTUtcz+cb8k/hs21Glptum2+7di5mopMlOU6klul//5giD7GgHVkV+ftn/jqxem3jlcsHeNmjWn4e6/teedz1/fMjXiQ/V5SmpjJI9IyLIbohuB0qkXdoPNXAZ68++1t036+6UczbtI5hgtl1VL97z/19tFLpg3Oi9geNt4igiq0GKIXSjBifR3ZVcjOnrI9v/fl+Zf09iWjnN9GbMXYFfvYpae7Hv5YV01Z0quNdBRPtpdnpIlbWyPRKrgQoheMMHoA/zp7tewST66OUmsizO7qIwubbnlHZxbnIZUoybdcBtEtA80XLntTzeagb67nqn+6v+zVe78xS17+3+rr8sUv5t/XrzjRseaK1MwIN8AMNyvledK8eIP/zXl+RSSA6EWEPfJQUZ5lH900tTPf9I3Zl433cl4t07+6qjsZcUd9uBtsuo3TWFOHRfRxhJ89b1evj14QtRlqOf/Mzrq2Bx+/6HeLfSnu2nln+r5yY3f3vKnnI7dX9Uu90LEiLc2cj0fNsv1yiG6fqVbE7FJevQftSzoVM54ceeL5Ka89+nT96rEWXl0Tf+T3f3NCV3ARSSVEmha1+O/C5zeOBBB9HOGPWsqrZ9rVubvWbDmWwivB1684efCDs89E2jy8ACW76o6MrKFmILpD6TCd3VUXbApvukTPouxIiDQzizs0sBDdrWQMt8Z/KEbN7hEvw43shRJ+20t1r274Xv11upt26gmzu5ed7J09OX2pIZmN5WnZzLm4Ib0xrMaMPoZwCw2d3ZlX5++hj7wGHCf1izeqX37w8d+ZcuBoxQ1BbVF3s911dergHVempmnuoo8MuXswLU1LW/3PSvNzkACiO5iUC87dh77Lrr1ZNzJGz+myXd98drq3dceUa4f/0VDn31+44WTn9RefMZ291SH2i0hzY4v//D0/hwkgusPJuUD4NmkQzxd+rWmT1bJ+z56qN2tSg4unVqcLubW2w/OklRtfTDNR/HqIXnzmBR0x+3ppdWfZKpNA3Qeko/ew3s7+iOMguAl0B+ogugNJMGlC9i02TbozvKHoCG6SJIfqILpDyTBpSnaGj7yk1xR9d0JkM5fKTDLjVh1Edysfxq3xhc9IkySkOWyXPoro6pbVhMhWNtmM0+FcRUR3LiWFNSj7KOya7Mbd++6yCxE9pa7dD6ZlK5fJCsuBi7UR3cWsWGpTrvP4HKLv9jzZyg66JeiOhkF0RxNjs1nZW2vVxl1z9wGR3sN+9K3M3jYpux0L0d3Oj/XWnXxaVs64V16yHpiAThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQL/Dwaci1WTPknFAAAAAElFTkSuQmCC", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - }, - ], - "chars": Array [ - Object { - "ch": "E", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "o": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "v": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "E", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "E", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 58.1, - }, - Object { - "ch": "c", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 39.683, - -48.575, - ], - Array [ - 31.083000000000002, - -51.45, - ], - Array [ - 20.316000000000003, - -50.8, - ], - Array [ - 11.891, - -46.391000000000005, - ], - Array [ - 6.325, - -39, - ], - Array [ - 3.7, - -29.116, - ], - Array [ - 4.275, - -17.533, - ], - Array [ - 8.15, - -8.341000000000001, - ], - Array [ - 14.508000000000001, - -2.216, - ], - Array [ - 22.883000000000003, - 0.7, - ], - Array [ - 33.2, - 0.07499999999999996, - ], - Array [ - 42.55, - -4.3999999999999995, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 41.315999999999995, - -11.2, - ], - Array [ - 39.35, - -10.941, - ], - Array [ - 37.383, - -9.332999999999998, - ], - Array [ - 34.35, - -7.491, - ], - Array [ - 29.766000000000002, - -6.2, - ], - Array [ - 23.291, - -6.625, - ], - Array [ - 18.116, - -9.558, - ], - Array [ - 14.6, - -14.791, - ], - Array [ - 12.85, - -22.283, - ], - Array [ - 13.174999999999999, - -30.932999999999996, - ], - Array [ - 15.441, - -37.683, - ], - Array [ - 19.6, - -42.291, - ], - Array [ - 25.583000000000002, - -44.5, - ], - Array [ - 31.491, - -44.291, - ], - Array [ - 35.15, - -43, - ], - Array [ - 37.690999999999995, - -41.541, - ], - Array [ - 39.4, - -40.5, - ], - Array [ - 40.782999999999994, - -40.599999999999994, - ], - Array [ - 41.583, - -41.283, - ], - ], - "o": Array [ - Array [ - 42.1, - -46.95, - ], - Array [ - 34.216, - -50.875, - ], - Array [ - 23.716, - -51.45, - ], - Array [ - 14.383000000000001, - -48.2, - ], - Array [ - 7.8580000000000005, - -41.758, - ], - Array [ - 4.2250000000000005, - -32.599999999999994, - ], - Array [ - 3.7, - -21.216, - ], - Array [ - 6.574999999999999, - -11.066, - ], - Array [ - 12.15, - -3.908, - ], - Array [ - 19.941000000000003, - 0.11599999999999988, - ], - Array [ - 29.716, - 0.7, - ], - Array [ - 39.8, - -2.425, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 41.883, - -10.916, - ], - Array [ - 39.949999999999996, - -11.2, - ], - Array [ - 38.15, - -9.908000000000001, - ], - Array [ - 35.516000000000005, - -8.065999999999999, - ], - Array [ - 31.550000000000004, - -6.457999999999999, - ], - Array [ - 25.333000000000002, - -6.2, - ], - Array [ - 19.658, - -8.325, - ], - Array [ - 15.583000000000002, - -12.791, - ], - Array [ - 13.200000000000001, - -19.558, - ], - Array [ - 12.85, - -28.283, - ], - Array [ - 14.475, - -35.666, - ], - Array [ - 18.008000000000003, - -41.016, - ], - Array [ - 23.4, - -44.058, - ], - Array [ - 29.916, - -44.5, - ], - Array [ - 34.058, - -43.458, - ], - Array [ - 36.949999999999996, - -42, - ], - Array [ - 38.858, - -40.708, - ], - Array [ - 40.4, - -40.5, - ], - Array [ - 41.315999999999995, - -41, - ], - Array [ - 41.85, - -41.65, - ], - ], - "v": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 36.95, - -49.725, - ], - Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, - ], - Array [ - 41.85, - -41.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "c", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "c", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 46.7, - }, - Object { - "ch": "o", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 20.758, - -50.833, - ], - Array [ - 12.25, - -46.616, - ], - Array [ - 6.433, - -39.341, - ], - Array [ - 3.6, - -29.316000000000003, - ], - Array [ - 4.166, - -17.75, - ], - Array [ - 8.05, - -8.616, - ], - Array [ - 14.790999999999999, - -2.341, - ], - Array [ - 24.1, - 0.7, - ], - Array [ - 34.841, - 0.09099999999999997, - ], - Array [ - 43.340999999999994, - -4.083, - ], - Array [ - 49.108000000000004, - -11.350000000000001, - ], - Array [ - 51.9, - -21.35, - ], - Array [ - 51.341, - -32.908, - ], - Array [ - 47.507999999999996, - -42.083, - ], - Array [ - 40.808, - -48.366, - ], - Array [ - 31.5, - -51.45, - ], - ], - "o": Array [ - Array [ - 14.790999999999999, - -48.366, - ], - Array [ - 8.05, - -42.083, - ], - Array [ - 4.166, - -32.908, - ], - Array [ - 3.6, - -21.35, - ], - Array [ - 6.433, - -11.350000000000001, - ], - Array [ - 12.25, - -4.083, - ], - Array [ - 20.758, - 0.09099999999999997, - ], - Array [ - 31.5, - 0.7, - ], - Array [ - 40.808, - -2.341, - ], - Array [ - 47.507999999999996, - -8.616, - ], - Array [ - 51.341, - -17.75, - ], - Array [ - 51.9, - -29.316000000000003, - ], - Array [ - 49.108000000000004, - -39.341, - ], - Array [ - 43.340999999999994, - -46.616, - ], - Array [ - 34.841, - -50.833, - ], - Array [ - 24.1, - -51.45, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "hd": false, - "ind": 1, - "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 23.066, - -6.683, - ], - Array [ - 17.775, - -9.658000000000001, - ], - Array [ - 14.341, - -14.883, - ], - Array [ - 12.8, - -22.3, - ], - Array [ - 13.108, - -30.991, - ], - Array [ - 15.274999999999999, - -37.766, - ], - Array [ - 19.333, - -42.283, - ], - Array [ - 25.266000000000002, - -44.45, - ], - Array [ - 36.533, - -42.766, - ], - Array [ - 42.7, - -31.333000000000002, - ], - Array [ - 41.466, - -14.625, - ], - Array [ - 32.8, - -6.25, - ], - ], - "o": Array [ - Array [ - 19.333, - -8.416, - ], - Array [ - 15.274999999999999, - -12.891, - ], - Array [ - 13.108, - -19.616, - ], - Array [ - 12.8, - -28.3, - ], - Array [ - 14.341, - -35.758, - ], - Array [ - 17.775, - -41.033, - ], - Array [ - 23.066, - -44.016, - ], - Array [ - 32.8, - -44.45, - ], - Array [ - 41.466, - -36.033, - ], - Array [ - 42.7, - -19.3, - ], - Array [ - 36.533, - -7.925000000000001, - ], - Array [ - 25.266000000000002, - -6.25, - ], - ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, - ], - Array [ - 27.8, - -6.25, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "o": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, - }, - Object { - "ch": "y", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 42.208, - -50.475, - ], - Array [ - 40.900000000000006, - -49.333, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.983, - -15.433, - ], - Array [ - 26.283, - -13.216, - ], - Array [ - 25.691000000000003, - -13.966, - ], - Array [ - 25, - -16.165999999999997, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.633, - -49.691, - ], - Array [ - 9.166, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 20.575, - 16.95, - ], - Array [ - 21.849999999999998, - 15.616, - ], - ], - "o": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 42.733, - -50.65, - ], - Array [ - 41.241, - -49.775, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.25, - -16.183, - ], - Array [ - 26.516, - -13.966, - ], - Array [ - 25.883, - -13.216, - ], - Array [ - 25.258000000000003, - -15.433, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 10.950000000000001, - -49.266, - ], - Array [ - 9.766, - -50.458000000000006, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 19.883, - 17.15, - ], - Array [ - 21.474999999999998, - 16.150000000000002, - ], - Array [ - 22.15, - 14.95, - ], - ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 21.025, - 16.55, - ], - Array [ - 22.15, - 14.95, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "default": Object { - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAIaElEQVR4Xu3VsZEdVRRF0fdJgBBQGkgGEAGEoBAgA8hAIUAEEIKskUsIkIEw5ehTJQuLUZWezpnXd8me+qd73d5wW/4RIHB5gdvl39ALEiCwhO4jIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ848ud6xfub9e2H336/3t5erD8/147f/XQBoX+64ahfuL9Zz9Z9/bjWernW+vI/L//3WuvVerd+vX233o5COeBlhX7AkZ7SI94f1l9rra/+55l+uz3/8B8B/56QgNCf0DGe+qPcH9YPa63fH3nOf9a79cz/1Z/WNYX+tO7xpJ/m/rD+WGt9/xEP+dPt+Xr1EX/nT0ICQg9BX2Hm/rBer7W+efRd7uuX24v186N/5w9iAkKPUZ8/JPRzbyj0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JPf36yX6/169ujwF+v17ev1+tG/8wcxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGewL9Mt+j7O/D7zgAAAABJRU5ErkJggg==", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAWBUlEQVR4Xu2dDXBcxX3A/3f6tCR/q/gLYzlYNoYABkKoxyZ20jIkMAEnBZpCiuWQkJkydTRJmCFDZOQWpqnbtG4yaRnCxIY0CaTtYDeljUsZ2xNsTSBQuxmSgmss2RhbkWzpsCXbsu5eZ59ORBb33r3dW51W9343w0wb7f7f7u+/P+++fV8J4QcBCJQ8gUTJ95AOQgACgugMAgjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIHrMxcOKH8vmZd8uTMet27LuL6DEZAt4eWSYJ2dx9QBp6D/udbmpskV0x6X7su4noJT4EvJ0yTSqlWRLyiOpq9wHp6D0sC/xue7K9PCNNC1ult8QxxL57iF7CQ8Brk9XiyVaRrNijRR/qe0oS0tr4ddlcwihi3zVEL8Eh4LVJg3i+uLeP7t4FM/qFf9wvIs0s50twQIgIopdQXkcv03N1LUT0oeKebB/MSPPSVmkvITSx7wqil8gQ8PZIqySkWUSmhnUpr+jZyp7IU+m0tCJ8aQwQRJ/gefTapEk8aR15Hm5D9OEYCD/BB0i2+Yg+AfPoL9GrpEmdU0cVfLibb+1PpjLdmdBZPxcShJ+AA2VEkxF9AuXP32TLSFOUJXqubu3eV9P/Z1tn1NzUcEruuDJl1nNPtqvr8WzameEbr1qIPl7kNY6bvUymZvC1GtXeK9qdKut/6In6mp++Uvve/7Zo5oD86YpuuXrOWZOQqk6HEr58ULZyHd4UYfHqIXrxWGsdKXuJbI3J8nz4QOfOJ859Z9u0qr/5p+mBx/74klOy7roemTV5UKt9IwurZX1SZNuiFtlmHISKY0oA0ccUr17w9+RO+BtsV+vVvrD01h1Tzm16ZkbVu33JSGHUUn7dh3q82spMIWMi5YlsQ/pIyItaqJCkFrWhpXow/x50kTWSlDWFyq0YPfezuoFNz8yoPNJVro2srjIjd1yVkjuvTBUqvDp2SjzZpcRPZ2QXl+m002G1AqJbxZk/WPZ8W8m9Ovuf9g54rqMUIvjoeJaFHw6/3xPZp+RH/PzjxHYJRLdNNBvPX4aLfyuqklr9p/7/VTYPd3YgMfCD/5pS+eTzU8VkBo/SFhvn8AHHUdv++0Rkl+dJeyIh7eVp2cfGXpSs6JdB9IjM/CV2UqaNKq4udymB1c3EQ2InZJqNJXhYs7p6y85+Z/u06h/vmixRz8EjdjOw2MqGPvnEktOyoqGv0FBR6u8eQir7PBl6sm7k/z0cwEtK7+KH/X8s+OUhgOghgLLL7J2ujKIXX6s5/6MXJ1eMvExW7LbNnjwoapa/ZcmpzEV1g9F2+orTyI9ybT8YNKKHiT50/7j/HPd4/d58u3Lghy9Orizm7B21r2qWX7mwXz6ysC9TU5EZV+k9T9Yt3uA/kssvBwFEd1D0Ybl3vFw7Zufetm1wQPqNjS3+Pf/8EF1vDGSfCBvzGb3/XGLwZ/9TU77jlRppe33ShJE7iOayuWdk2dyzcmNDn1w6c0APunlpRA9hx4w+DjO62kx77UB1dduvqn2xX2+vNB/ejtdUl+qU+IvqB+SauWcKueU2X08RHdHzjZHcf/f2+i9PLOiS2MF3Ks7839HKSUpmJfbbv6mY8DO2Gc3f1lL32S+qPydqY0/JP2/K+YH62nRh/9p5sr1xg6hbhvmxdNcbA2GiHzpWcborVVadyUh5qq/svVn5V+2VkupPIrQear+0+gegrirt/wOg/lO/xuz/lkzI4Lwp5wdn1KSrA0Lvbmzxb0Lih+h6YyBM9Ds3zvGX3fyKR6DpQz3SdF1P0AERnaW72WBEdDNuY1VLXb9/aHUXohsAZjMuBJq3V7ygPzOjG4y2AquoTb3NnzwWFCXV2PK+OxcLPGLpVEd0Q9GXP3BJ7DfViq1BHtGlsYW3GgflBNENRb/4rg8Ue5zH/niIbj4EED2AXfYFjIE7P4huPuhMa6qd+GfuHvpwXK4fM3owWUQPEn3oc0aBD7QguqmuhdXb9cW3wgLwYEsAHUQ3ED3Vl0xdsa7BygsjChv28auN6GY5R3QD0duPV3SsXD9/6Iuk/IpKANHNcCN6kOh7/dspn8v1Z0Q3G2w2av3zZzs662vTswJisXRn6a43zMKeXEN0PZY2S//gM0c65k09H7Sa4sEWRNcbbmGi73iltvO+v5oVNKvoHYjSWgSe+IOjvYvrz41+pddwDERHdK3xJGGib/mPqR0tW2Zyjq6H1EppRDfDyDl60Dl6yGukEN1ssNmo9djNnZ0rGvqCVlPM6MzoesMs7IEWRNdjabP0+hUnOj79wVTQaoon2BBdb7iFif7o92eeffwnU4Oei9Y7EKW1CNx3/clzf3xtb1VAJURHdK3xJDyiqserWKV5Jt2MNOfoQefoIa+R4hFVs8Fmoxaim1FE9CDR2/zvhOX8oimimw02G7XyPMHG0p2lu94w46UTeryKVZpHVc1IM6MHL915u4zZmBrTWohuhhfRDUS/fF1D0T5uaJbW0q2F6Ga5RXQD0XkW3Wyw2aiF6GYUER3RzUbOONVCdDPwiI7oZiNnnGrxOikz8IiO6GYjZxxrhb18gvfG5U4MoiP6OCprdmhE1+eG6IiuP2rGuQai6ycA0XMw89qkQTw5FISTXXf9gWazRpjo5WmZvrBVem0erxRiITqiT7hxHCb6YFoWLm2V9gnXqTFuMKKzdB/jIWY/PEt3faaIjuj6o2acayC6fgIQHdH1R80410B0/QQgOqLrj5pxrFFXmZF/Wxd8Cs519NzJQXREH0dt9Q/NLbD6zFQNREd0s5EzTrUQ3Qw8ohuIvvyBS+RIV7kZcWoVRADRzfAhuoHovErKbLDZqIXoZhQRPVj0XSKyKtefEd1ssNmo9fElp+Sh1V1BoXhnXAAZRDcQ/TN/PqfvpV9OqrUxcImhR4D3uuvxGi6N6Aai86UWs8FmoxZfajGjiOjBom8WkS/l+jOimw02G7U2f/JY97K5Z+oDYvHtNZbuesMs7Guqba/X/PrOjbOX6kWktA0CT//h4aOXTBuch+h6NJnRg2b0NmkST7bk+nP78YqOlevn89lkvbFmpfRPmtpTk6syU3MF8zxZt3iDbLVyoBILgujBoq8WT3bm+vNgOtHf8EcLa0psLEyI7oTd5y4iH21sEXW1hN8oAogeLDovn3BMl0UzB+TJO94ObBXPogcnDNFDBjOfZXLL9JUNffLozZ2BjeKBFkQ3GrFeyIcWW75Xf2TLT6fMNwpMJSMCf7L8ROddV6VmBVTmZpkQqszo4TP6NhG5PVeRf/957a/v/+Ysdt6NlDWrtOXOI50LZ5zPKbon8tTiFmkyi1z6tRA9TPQ90ioJeSRXkSNdZQeXP7Dg0tIfIu708IXPHzpbUeZVB7SIa+jM6GaD1WuTwJ13FZG3wZpxNamV7wst7LiHU2VGD5vRd8o0qZKeoCLc826irFmdWy87debBVV2TgmqzEYfoZiMrWytsQ+77L0x542vfrV9S0AGoHInAX9xy/Mjy+f1Bm5/7G1tkWaRAMS3EjJ4n8d5e/06rtbmKnTxVduSq+xaw814EeV74wqEzFUkv54yeEPm7RS3SXIRmTNhDIHp+0deIyHNBxS5f1yDv9iUn7ACYCA3P97KJhMinFrWIukLCL4AAoucTPc95OtfTx96tB1d1dd962amgJ9aE8/P8OUD0/Iwk7Dydy2wRABZY5Pl17T21lZnpOcN4sr1xg6hVF78QAogeYXh4e/3zv78NKsrLIiNANCyS77ZXnliLBhbRI3DK93VVdt8jQDQs8q3b3jl+1Zyzs4Oq8/XUaGARPRqn0OX72YFE56LPLgy6BzviESg2mkDem2RYtkceNIgeEZUX8iIKFYJNuYggNYrleYhFfX2E3faIPBE9IihvaPddffQr59tNuKYeEWTEYuoba8+t7Qi8di4iHY0t0hAxXOyLIbrGEAi7eUaFueexOZ27909iCa/BNKjo/TecTN29rDfnP6rZOjzEosEZ0TVg5duUS/Un269oamCW0WCaq6iazbet7egvT3qBr+tiE04PMqLr8RJvr38HVs5n1FWojU/NfOO7z0/l/ndNriOLP3ZzZ+eKhr7AlRHPnuvDRXRNZvkeXU1n5PSV9zXUcVusJths8XzvhVPFeDecPltE12emZvXA77KpcP/5as2+z/3lbJ6mMmD743sOd19UNxh4uyuzuQFUvo9uBi3fuTobc2ZcI2zApcrT0rCwVXrNjhDfWszohrnPtwM/cD5xbNn9C+awhI8GOMqSXW2BNLZIa7SIlBpJANENx0O+6+oq7P6D1a/c+rW51xseIjbV1C77s/ccDn5wZYgE180LGBGIXgC8fA+7qNCP/ePM//6Hf516TQGHKfmq+e5nzwLgKywFjARELwCeqppvY06Vuf3heW++eqBqcYGHKsnq+W5zVZ3mDTKFpx7RC2SY3ZjbF3RrrAqf8eTUrQ/NS/zyUFVdgYcrqer5XviY7ez+8rSsZgOusNQjemH8/NreXv/FB4Gvm1Jl+gYSb374iwtmp/qSUywccsKHWPWBvv6NN3Xm/VCll5RrFj8s6h9SfgUQQPQC4I2smm8XHtl/S2tx/bnTj3/6qCQTErrC4aUSlgYn19HtgfRn9pBvtQ0fKe4ze2TJ+cSS1cHJjG4RZ5RLbnGe2dU5+Vc+0pXON5OrK5O8p93iwGRGtwvTn9X3yDJJ+LfIhj1i6Z+z3/XI3Mn7D1bNsd8K9yLedvmpE1++sWtmhJax+RYBkm4RZnRdYhHK53vwZTiE58m7a74+73ipX3rL97rmEUi5xTXC+DIpgugm1CLUyffqqZEh/vrZ6Xs2/8v0FRHCTqgi6o63TbccO3L5rHNRvmaT8pKymh32sUkxoo8NVz+qjuy/eKP6hTUtcz+cb8k/hs21Glptum2+7di5mopMlOU6klul//5giD7GgHVkV+ftn/jqxem3jlcsHeNmjWn4e6/teedz1/fMjXiQ/V5SmpjJI9IyLIbohuB0qkXdoPNXAZ68++1t036+6UczbtI5hgtl1VL97z/19tFLpg3Oi9geNt4igiq0GKIXSjBifR3ZVcjOnrI9v/fl+Zf09iWjnN9GbMXYFfvYpae7Hv5YV01Z0quNdBRPtpdnpIlbWyPRKrgQoheMMHoA/zp7tewST66OUmsizO7qIwubbnlHZxbnIZUoybdcBtEtA80XLntTzeagb67nqn+6v+zVe78xS17+3+rr8sUv5t/XrzjRseaK1MwIN8AMNyvledK8eIP/zXl+RSSA6EWEPfJQUZ5lH900tTPf9I3Zl433cl4t07+6qjsZcUd9uBtsuo3TWFOHRfRxhJ89b1evj14QtRlqOf/Mzrq2Bx+/6HeLfSnu2nln+r5yY3f3vKnnI7dX9Uu90LEiLc2cj0fNsv1yiG6fqVbE7FJevQftSzoVM54ceeL5Ka89+nT96rEWXl0Tf+T3f3NCV3ARSSVEmha1+O/C5zeOBBB9HOGPWsqrZ9rVubvWbDmWwivB1684efCDs89E2jy8ACW76o6MrKFmILpD6TCd3VUXbApvukTPouxIiDQzizs0sBDdrWQMt8Z/KEbN7hEvw43shRJ+20t1r274Xv11upt26gmzu5ed7J09OX2pIZmN5WnZzLm4Ib0xrMaMPoZwCw2d3ZlX5++hj7wGHCf1izeqX37w8d+ZcuBoxQ1BbVF3s911dergHVempmnuoo8MuXswLU1LW/3PSvNzkACiO5iUC87dh77Lrr1ZNzJGz+myXd98drq3dceUa4f/0VDn31+44WTn9RefMZ291SH2i0hzY4v//D0/hwkgusPJuUD4NmkQzxd+rWmT1bJ+z56qN2tSg4unVqcLubW2w/OklRtfTDNR/HqIXnzmBR0x+3ppdWfZKpNA3Qeko/ew3s7+iOMguAl0B+ogugNJMGlC9i02TbozvKHoCG6SJIfqILpDyTBpSnaGj7yk1xR9d0JkM5fKTDLjVh1Edysfxq3xhc9IkySkOWyXPoro6pbVhMhWNtmM0+FcRUR3LiWFNSj7KOya7Mbd++6yCxE9pa7dD6ZlK5fJCsuBi7UR3cWsWGpTrvP4HKLv9jzZyg66JeiOhkF0RxNjs1nZW2vVxl1z9wGR3sN+9K3M3jYpux0L0d3Oj/XWnXxaVs64V16yHpiAThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQL/Dwaci1WTPknFAAAAAElFTkSuQmCC", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - }, - ], - "chars": Array [ - Object { - "ch": "E", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "o": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "v": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "E", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "E", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 58.1, - }, - Object { - "ch": "c", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 39.683, - -48.575, - ], - Array [ - 31.083000000000002, - -51.45, - ], - Array [ - 20.316000000000003, - -50.8, - ], - Array [ - 11.891, - -46.391000000000005, - ], - Array [ - 6.325, - -39, - ], - Array [ - 3.7, - -29.116, - ], - Array [ - 4.275, - -17.533, - ], - Array [ - 8.15, - -8.341000000000001, - ], - Array [ - 14.508000000000001, - -2.216, - ], - Array [ - 22.883000000000003, - 0.7, - ], - Array [ - 33.2, - 0.07499999999999996, - ], - Array [ - 42.55, - -4.3999999999999995, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 41.315999999999995, - -11.2, - ], - Array [ - 39.35, - -10.941, - ], - Array [ - 37.383, - -9.332999999999998, - ], - Array [ - 34.35, - -7.491, - ], - Array [ - 29.766000000000002, - -6.2, - ], - Array [ - 23.291, - -6.625, - ], - Array [ - 18.116, - -9.558, - ], - Array [ - 14.6, - -14.791, - ], - Array [ - 12.85, - -22.283, - ], - Array [ - 13.174999999999999, - -30.932999999999996, - ], - Array [ - 15.441, - -37.683, - ], - Array [ - 19.6, - -42.291, - ], - Array [ - 25.583000000000002, - -44.5, - ], - Array [ - 31.491, - -44.291, - ], - Array [ - 35.15, - -43, - ], - Array [ - 37.690999999999995, - -41.541, - ], - Array [ - 39.4, - -40.5, - ], - Array [ - 40.782999999999994, - -40.599999999999994, - ], - Array [ - 41.583, - -41.283, - ], - ], - "o": Array [ - Array [ - 42.1, - -46.95, - ], - Array [ - 34.216, - -50.875, - ], - Array [ - 23.716, - -51.45, - ], - Array [ - 14.383000000000001, - -48.2, - ], - Array [ - 7.8580000000000005, - -41.758, - ], - Array [ - 4.2250000000000005, - -32.599999999999994, - ], - Array [ - 3.7, - -21.216, - ], - Array [ - 6.574999999999999, - -11.066, - ], - Array [ - 12.15, - -3.908, - ], - Array [ - 19.941000000000003, - 0.11599999999999988, - ], - Array [ - 29.716, - 0.7, - ], - Array [ - 39.8, - -2.425, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 41.883, - -10.916, - ], - Array [ - 39.949999999999996, - -11.2, - ], - Array [ - 38.15, - -9.908000000000001, - ], - Array [ - 35.516000000000005, - -8.065999999999999, - ], - Array [ - 31.550000000000004, - -6.457999999999999, - ], - Array [ - 25.333000000000002, - -6.2, - ], - Array [ - 19.658, - -8.325, - ], - Array [ - 15.583000000000002, - -12.791, - ], - Array [ - 13.200000000000001, - -19.558, - ], - Array [ - 12.85, - -28.283, - ], - Array [ - 14.475, - -35.666, - ], - Array [ - 18.008000000000003, - -41.016, - ], - Array [ - 23.4, - -44.058, - ], - Array [ - 29.916, - -44.5, - ], - Array [ - 34.058, - -43.458, - ], - Array [ - 36.949999999999996, - -42, - ], - Array [ - 38.858, - -40.708, - ], - Array [ - 40.4, - -40.5, - ], - Array [ - 41.315999999999995, - -41, - ], - Array [ - 41.85, - -41.65, - ], - ], - "v": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 36.95, - -49.725, - ], - Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, - ], - Array [ - 41.85, - -41.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "c", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "c", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 46.7, - }, - Object { - "ch": "o", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 20.758, - -50.833, - ], - Array [ - 12.25, - -46.616, - ], - Array [ - 6.433, - -39.341, - ], - Array [ - 3.6, - -29.316000000000003, - ], - Array [ - 4.166, - -17.75, - ], - Array [ - 8.05, - -8.616, - ], - Array [ - 14.790999999999999, - -2.341, - ], - Array [ - 24.1, - 0.7, - ], - Array [ - 34.841, - 0.09099999999999997, - ], - Array [ - 43.340999999999994, - -4.083, - ], - Array [ - 49.108000000000004, - -11.350000000000001, - ], - Array [ - 51.9, - -21.35, - ], - Array [ - 51.341, - -32.908, - ], - Array [ - 47.507999999999996, - -42.083, - ], - Array [ - 40.808, - -48.366, - ], - Array [ - 31.5, - -51.45, - ], - ], - "o": Array [ - Array [ - 14.790999999999999, - -48.366, - ], - Array [ - 8.05, - -42.083, - ], - Array [ - 4.166, - -32.908, - ], - Array [ - 3.6, - -21.35, - ], - Array [ - 6.433, - -11.350000000000001, - ], - Array [ - 12.25, - -4.083, - ], - Array [ - 20.758, - 0.09099999999999997, - ], - Array [ - 31.5, - 0.7, - ], - Array [ - 40.808, - -2.341, - ], - Array [ - 47.507999999999996, - -8.616, - ], - Array [ - 51.341, - -17.75, - ], - Array [ - 51.9, - -29.316000000000003, - ], - Array [ - 49.108000000000004, - -39.341, - ], - Array [ - 43.340999999999994, - -46.616, - ], - Array [ - 34.841, - -50.833, - ], - Array [ - 24.1, - -51.45, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "hd": false, - "ind": 1, - "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 23.066, - -6.683, - ], - Array [ - 17.775, - -9.658000000000001, - ], - Array [ - 14.341, - -14.883, - ], - Array [ - 12.8, - -22.3, - ], - Array [ - 13.108, - -30.991, - ], - Array [ - 15.274999999999999, - -37.766, - ], - Array [ - 19.333, - -42.283, - ], - Array [ - 25.266000000000002, - -44.45, - ], - Array [ - 36.533, - -42.766, - ], - Array [ - 42.7, - -31.333000000000002, - ], - Array [ - 41.466, - -14.625, - ], - Array [ - 32.8, - -6.25, - ], - ], - "o": Array [ - Array [ - 19.333, - -8.416, - ], - Array [ - 15.274999999999999, - -12.891, - ], - Array [ - 13.108, - -19.616, - ], - Array [ - 12.8, - -28.3, - ], - Array [ - 14.341, - -35.758, - ], - Array [ - 17.775, - -41.033, - ], - Array [ - 23.066, - -44.016, - ], - Array [ - 32.8, - -44.45, - ], - Array [ - 41.466, - -36.033, - ], - Array [ - 42.7, - -19.3, - ], - Array [ - 36.533, - -7.925000000000001, - ], - Array [ - 25.266000000000002, - -6.25, - ], - ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, - ], - Array [ - 27.8, - -6.25, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "o": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, - }, - Object { - "ch": "y", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 42.208, - -50.475, - ], - Array [ - 40.900000000000006, - -49.333, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.983, - -15.433, - ], - Array [ - 26.283, - -13.216, - ], - Array [ - 25.691000000000003, - -13.966, - ], - Array [ - 25, - -16.165999999999997, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.633, - -49.691, - ], - Array [ - 9.166, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 20.575, - 16.95, - ], - Array [ - 21.849999999999998, - 15.616, - ], - ], - "o": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 42.733, - -50.65, - ], - Array [ - 41.241, - -49.775, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.25, - -16.183, - ], - Array [ - 26.516, - -13.966, - ], - Array [ - 25.883, - -13.216, - ], - Array [ - 25.258000000000003, - -15.433, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 10.950000000000001, - -49.266, - ], - Array [ - 9.766, - -50.458000000000006, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 19.883, - 17.15, - ], - Array [ - 21.474999999999998, - 16.150000000000002, - ], - Array [ - 22.15, - 14.95, - ], - ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 21.025, - 16.55, - ], - Array [ - 22.15, - 14.95, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, - }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], - }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "masksProperties": Array [ - Object { - "inv": false, - "mode": "a", - "nm": "Masque 1", - "o": Object { - "a": 0, - "ix": 3, - "k": 100, - }, - "pt": Object { - "a": 0, - "ix": 1, - "k": Object { - "c": true, - "i": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "o": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "v": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - }, - }, - "x": Object { - "a": 0, - "ix": 4, - "k": 0, - }, - }, - ], - "nm": "compo barre", - "op": 13.2, - "refId": "comp_0", - "sr": 0.55, - "st": 0, - "ty": 0, - "w": 120, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 250, - 250, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "bouclier", - "op": 13, - "refId": "image_1", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "markers": Array [], - "meta": Object { - "a": "", - "d": "", - "g": "LottieFiles AE 0.1.20", - "k": "", - "tc": "", - }, - "nm": "splash illu", - "op": 13, - "v": "5.5.7", - "w": 500, - }, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, - }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], - }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "masksProperties": Array [ - Object { - "inv": false, - "mode": "a", - "nm": "Masque 1", - "o": Object { - "a": 0, - "ix": 3, - "k": 100, - }, - "pt": Object { - "a": 0, - "ix": 1, - "k": Object { - "c": true, - "i": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "o": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "v": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - }, - }, - "x": Object { - "a": 0, - "ix": 4, - "k": 0, - }, - }, - ], - "nm": "compo barre", - "op": 13.2, - "refId": "comp_0", - "sr": 0.55, - "st": 0, - "ty": 0, - "w": 120, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 250, - 250, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "bouclier", - "op": 13, - "refId": "image_1", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "markers": Array [], - "meta": Object { - "a": "", - "d": "", - "g": "LottieFiles AE 0.1.20", - "k": "", - "tc": "", - }, - "nm": "splash illu", - "op": 13, - "v": "5.5.7", - "w": 500, - }, - "autoplay": true, - "loop": true, - "rendererSettings": Object { - "preserveAspectRatio": "xMidYMid slice", - }, - } - } - speed={1} - title="" - width={200} - > - <div - aria-label="animation" - onClick={[Function]} - role="button" - style={ - Object { - "height": "200px", - "margin": "0 auto", - "outline": "none", - "overflow": "hidden", - "width": "200px", - } - } - tabIndex="0" - title="" - /> - </Lottie> + <img + alt="Chargement" + src="test-file-stub" + /> + <span> + Ecolyo + </span> <div className="splash-progress" > diff --git a/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap index 3fc2f550d4c42eac3f8972b809c4844cea7ab23d..6d44191383bb9b2f569f87cefeb07095ba298227 100644 --- a/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap +++ b/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap @@ -10,5637 +10,42 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` <div className="splash-loader" > - <Lottie - ariaLabel="animation" - ariaRole="button" - eventListeners={Array []} - height={200} - isClickToPauseDisabled={false} - isPaused={false} - isStopped={false} - options={ - Object { - "animationData": Object { - "__complete": true, - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAIaElEQVR4Xu3VsZEdVRRF0fdJgBBQGkgGEAGEoBAgA8hAIUAEEIKskUsIkIEw5ehTJQuLUZWezpnXd8me+qd73d5wW/4RIHB5gdvl39ALEiCwhO4jIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ848ud6xfub9e2H336/3t5erD8/147f/XQBoX+64ahfuL9Zz9Z9/bjWernW+vI/L//3WuvVerd+vX233o5COeBlhX7AkZ7SI94f1l9rra/+55l+uz3/8B8B/56QgNCf0DGe+qPcH9YPa63fH3nOf9a79cz/1Z/WNYX+tO7xpJ/m/rD+WGt9/xEP+dPt+Xr1EX/nT0ICQg9BX2Hm/rBer7W+efRd7uuX24v186N/5w9iAkKPUZ8/JPRzbyj0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JPf36yX6/169ujwF+v17ev1+tG/8wcxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGewL9Mt+j7O/D7zgAAAABJRU5ErkJggg==", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAWBUlEQVR4Xu2dDXBcxX3A/3f6tCR/q/gLYzlYNoYABkKoxyZ20jIkMAEnBZpCiuWQkJkydTRJmCFDZOQWpqnbtG4yaRnCxIY0CaTtYDeljUsZ2xNsTSBQuxmSgmss2RhbkWzpsCXbsu5eZ59ORBb33r3dW51W9343w0wb7f7f7u+/P+++fV8J4QcBCJQ8gUTJ95AOQgACgugMAgjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIHrMxcOKH8vmZd8uTMet27LuL6DEZAt4eWSYJ2dx9QBp6D/udbmpskV0x6X7su4noJT4EvJ0yTSqlWRLyiOpq9wHp6D0sC/xue7K9PCNNC1ult8QxxL57iF7CQ8Brk9XiyVaRrNijRR/qe0oS0tr4ddlcwihi3zVEL8Eh4LVJg3i+uLeP7t4FM/qFf9wvIs0s50twQIgIopdQXkcv03N1LUT0oeKebB/MSPPSVmkvITSx7wqil8gQ8PZIqySkWUSmhnUpr+jZyp7IU+m0tCJ8aQwQRJ/gefTapEk8aR15Hm5D9OEYCD/BB0i2+Yg+AfPoL9GrpEmdU0cVfLibb+1PpjLdmdBZPxcShJ+AA2VEkxF9AuXP32TLSFOUJXqubu3eV9P/Z1tn1NzUcEruuDJl1nNPtqvr8WzameEbr1qIPl7kNY6bvUymZvC1GtXeK9qdKut/6In6mp++Uvve/7Zo5oD86YpuuXrOWZOQqk6HEr58ULZyHd4UYfHqIXrxWGsdKXuJbI3J8nz4QOfOJ859Z9u0qr/5p+mBx/74klOy7roemTV5UKt9IwurZX1SZNuiFtlmHISKY0oA0ccUr17w9+RO+BtsV+vVvrD01h1Tzm16ZkbVu33JSGHUUn7dh3q82spMIWMi5YlsQ/pIyItaqJCkFrWhpXow/x50kTWSlDWFyq0YPfezuoFNz8yoPNJVro2srjIjd1yVkjuvTBUqvDp2SjzZpcRPZ2QXl+m002G1AqJbxZk/WPZ8W8m9Ovuf9g54rqMUIvjoeJaFHw6/3xPZp+RH/PzjxHYJRLdNNBvPX4aLfyuqklr9p/7/VTYPd3YgMfCD/5pS+eTzU8VkBo/SFhvn8AHHUdv++0Rkl+dJeyIh7eVp2cfGXpSs6JdB9IjM/CV2UqaNKq4udymB1c3EQ2InZJqNJXhYs7p6y85+Z/u06h/vmixRz8EjdjOw2MqGPvnEktOyoqGv0FBR6u8eQir7PBl6sm7k/z0cwEtK7+KH/X8s+OUhgOghgLLL7J2ujKIXX6s5/6MXJ1eMvExW7LbNnjwoapa/ZcmpzEV1g9F2+orTyI9ybT8YNKKHiT50/7j/HPd4/d58u3Lghy9Orizm7B21r2qWX7mwXz6ysC9TU5EZV+k9T9Yt3uA/kssvBwFEd1D0Ybl3vFw7Zufetm1wQPqNjS3+Pf/8EF1vDGSfCBvzGb3/XGLwZ/9TU77jlRppe33ShJE7iOayuWdk2dyzcmNDn1w6c0APunlpRA9hx4w+DjO62kx77UB1dduvqn2xX2+vNB/ejtdUl+qU+IvqB+SauWcKueU2X08RHdHzjZHcf/f2+i9PLOiS2MF3Ks7839HKSUpmJfbbv6mY8DO2Gc3f1lL32S+qPydqY0/JP2/K+YH62nRh/9p5sr1xg6hbhvmxdNcbA2GiHzpWcborVVadyUh5qq/svVn5V+2VkupPIrQear+0+gegrirt/wOg/lO/xuz/lkzI4Lwp5wdn1KSrA0Lvbmzxb0Lih+h6YyBM9Ds3zvGX3fyKR6DpQz3SdF1P0AERnaW72WBEdDNuY1VLXb9/aHUXohsAZjMuBJq3V7ygPzOjG4y2AquoTb3NnzwWFCXV2PK+OxcLPGLpVEd0Q9GXP3BJ7DfViq1BHtGlsYW3GgflBNENRb/4rg8Ue5zH/niIbj4EED2AXfYFjIE7P4huPuhMa6qd+GfuHvpwXK4fM3owWUQPEn3oc0aBD7QguqmuhdXb9cW3wgLwYEsAHUQ3ED3Vl0xdsa7BygsjChv28auN6GY5R3QD0duPV3SsXD9/6Iuk/IpKANHNcCN6kOh7/dspn8v1Z0Q3G2w2av3zZzs662vTswJisXRn6a43zMKeXEN0PZY2S//gM0c65k09H7Sa4sEWRNcbbmGi73iltvO+v5oVNKvoHYjSWgSe+IOjvYvrz41+pddwDERHdK3xJGGib/mPqR0tW2Zyjq6H1EppRDfDyDl60Dl6yGukEN1ssNmo9djNnZ0rGvqCVlPM6MzoesMs7IEWRNdjabP0+hUnOj79wVTQaoon2BBdb7iFif7o92eeffwnU4Oei9Y7EKW1CNx3/clzf3xtb1VAJURHdK3xJDyiqserWKV5Jt2MNOfoQefoIa+R4hFVs8Fmoxaim1FE9CDR2/zvhOX8oimimw02G7XyPMHG0p2lu94w46UTeryKVZpHVc1IM6MHL915u4zZmBrTWohuhhfRDUS/fF1D0T5uaJbW0q2F6Ga5RXQD0XkW3Wyw2aiF6GYUER3RzUbOONVCdDPwiI7oZiNnnGrxOikz8IiO6GYjZxxrhb18gvfG5U4MoiP6OCprdmhE1+eG6IiuP2rGuQai6ycA0XMw89qkQTw5FISTXXf9gWazRpjo5WmZvrBVem0erxRiITqiT7hxHCb6YFoWLm2V9gnXqTFuMKKzdB/jIWY/PEt3faaIjuj6o2acayC6fgIQHdH1R80410B0/QQgOqLrj5pxrFFXmZF/Wxd8Cs519NzJQXREH0dt9Q/NLbD6zFQNREd0s5EzTrUQ3Qw8ohuIvvyBS+RIV7kZcWoVRADRzfAhuoHovErKbLDZqIXoZhQRPVj0XSKyKtefEd1ssNmo9fElp+Sh1V1BoXhnXAAZRDcQ/TN/PqfvpV9OqrUxcImhR4D3uuvxGi6N6Aai86UWs8FmoxZfajGjiOjBom8WkS/l+jOimw02G7U2f/JY97K5Z+oDYvHtNZbuesMs7Guqba/X/PrOjbOX6kWktA0CT//h4aOXTBuch+h6NJnRg2b0NmkST7bk+nP78YqOlevn89lkvbFmpfRPmtpTk6syU3MF8zxZt3iDbLVyoBILgujBoq8WT3bm+vNgOtHf8EcLa0psLEyI7oTd5y4iH21sEXW1hN8oAogeLDovn3BMl0UzB+TJO94ObBXPogcnDNFDBjOfZXLL9JUNffLozZ2BjeKBFkQ3GrFeyIcWW75Xf2TLT6fMNwpMJSMCf7L8ROddV6VmBVTmZpkQqszo4TP6NhG5PVeRf/957a/v/+Ysdt6NlDWrtOXOI50LZ5zPKbon8tTiFmkyi1z6tRA9TPQ90ioJeSRXkSNdZQeXP7Dg0tIfIu708IXPHzpbUeZVB7SIa+jM6GaD1WuTwJ13FZG3wZpxNamV7wst7LiHU2VGD5vRd8o0qZKeoCLc826irFmdWy87debBVV2TgmqzEYfoZiMrWytsQ+77L0x542vfrV9S0AGoHInAX9xy/Mjy+f1Bm5/7G1tkWaRAMS3EjJ4n8d5e/06rtbmKnTxVduSq+xaw814EeV74wqEzFUkv54yeEPm7RS3SXIRmTNhDIHp+0deIyHNBxS5f1yDv9iUn7ACYCA3P97KJhMinFrWIukLCL4AAoucTPc95OtfTx96tB1d1dd962amgJ9aE8/P8OUD0/Iwk7Dydy2wRABZY5Pl17T21lZnpOcN4sr1xg6hVF78QAogeYXh4e/3zv78NKsrLIiNANCyS77ZXnliLBhbRI3DK93VVdt8jQDQs8q3b3jl+1Zyzs4Oq8/XUaGARPRqn0OX72YFE56LPLgy6BzviESg2mkDem2RYtkceNIgeEZUX8iIKFYJNuYggNYrleYhFfX2E3faIPBE9IihvaPddffQr59tNuKYeEWTEYuoba8+t7Qi8di4iHY0t0hAxXOyLIbrGEAi7eUaFueexOZ27909iCa/BNKjo/TecTN29rDfnP6rZOjzEosEZ0TVg5duUS/Un269oamCW0WCaq6iazbet7egvT3qBr+tiE04PMqLr8RJvr38HVs5n1FWojU/NfOO7z0/l/ndNriOLP3ZzZ+eKhr7AlRHPnuvDRXRNZvkeXU1n5PSV9zXUcVusJths8XzvhVPFeDecPltE12emZvXA77KpcP/5as2+z/3lbJ6mMmD743sOd19UNxh4uyuzuQFUvo9uBi3fuTobc2ZcI2zApcrT0rCwVXrNjhDfWszohrnPtwM/cD5xbNn9C+awhI8GOMqSXW2BNLZIa7SIlBpJANENx0O+6+oq7P6D1a/c+rW51xseIjbV1C77s/ccDn5wZYgE180LGBGIXgC8fA+7qNCP/ePM//6Hf516TQGHKfmq+e5nzwLgKywFjARELwCeqppvY06Vuf3heW++eqBqcYGHKsnq+W5zVZ3mDTKFpx7RC2SY3ZjbF3RrrAqf8eTUrQ/NS/zyUFVdgYcrqer5XviY7ez+8rSsZgOusNQjemH8/NreXv/FB4Gvm1Jl+gYSb374iwtmp/qSUywccsKHWPWBvv6NN3Xm/VCll5RrFj8s6h9SfgUQQPQC4I2smm8XHtl/S2tx/bnTj3/6qCQTErrC4aUSlgYn19HtgfRn9pBvtQ0fKe4ze2TJ+cSS1cHJjG4RZ5RLbnGe2dU5+Vc+0pXON5OrK5O8p93iwGRGtwvTn9X3yDJJ+LfIhj1i6Z+z3/XI3Mn7D1bNsd8K9yLedvmpE1++sWtmhJax+RYBkm4RZnRdYhHK53vwZTiE58m7a74+73ipX3rL97rmEUi5xTXC+DIpgugm1CLUyffqqZEh/vrZ6Xs2/8v0FRHCTqgi6o63TbccO3L5rHNRvmaT8pKymh32sUkxoo8NVz+qjuy/eKP6hTUtcz+cb8k/hs21Glptum2+7di5mopMlOU6klul//5giD7GgHVkV+ftn/jqxem3jlcsHeNmjWn4e6/teedz1/fMjXiQ/V5SmpjJI9IyLIbohuB0qkXdoPNXAZ68++1t036+6UczbtI5hgtl1VL97z/19tFLpg3Oi9geNt4igiq0GKIXSjBifR3ZVcjOnrI9v/fl+Zf09iWjnN9GbMXYFfvYpae7Hv5YV01Z0quNdBRPtpdnpIlbWyPRKrgQoheMMHoA/zp7tewST66OUmsizO7qIwubbnlHZxbnIZUoybdcBtEtA80XLntTzeagb67nqn+6v+zVe78xS17+3+rr8sUv5t/XrzjRseaK1MwIN8AMNyvledK8eIP/zXl+RSSA6EWEPfJQUZ5lH900tTPf9I3Zl433cl4t07+6qjsZcUd9uBtsuo3TWFOHRfRxhJ89b1evj14QtRlqOf/Mzrq2Bx+/6HeLfSnu2nln+r5yY3f3vKnnI7dX9Uu90LEiLc2cj0fNsv1yiG6fqVbE7FJevQftSzoVM54ceeL5Ka89+nT96rEWXl0Tf+T3f3NCV3ARSSVEmha1+O/C5zeOBBB9HOGPWsqrZ9rVubvWbDmWwivB1684efCDs89E2jy8ACW76o6MrKFmILpD6TCd3VUXbApvukTPouxIiDQzizs0sBDdrWQMt8Z/KEbN7hEvw43shRJ+20t1r274Xv11upt26gmzu5ed7J09OX2pIZmN5WnZzLm4Ib0xrMaMPoZwCw2d3ZlX5++hj7wGHCf1izeqX37w8d+ZcuBoxQ1BbVF3s911dergHVempmnuoo8MuXswLU1LW/3PSvNzkACiO5iUC87dh77Lrr1ZNzJGz+myXd98drq3dceUa4f/0VDn31+44WTn9RefMZ291SH2i0hzY4v//D0/hwkgusPJuUD4NmkQzxd+rWmT1bJ+z56qN2tSg4unVqcLubW2w/OklRtfTDNR/HqIXnzmBR0x+3ppdWfZKpNA3Qeko/ew3s7+iOMguAl0B+ogugNJMGlC9i02TbozvKHoCG6SJIfqILpDyTBpSnaGj7yk1xR9d0JkM5fKTDLjVh1Edysfxq3xhc9IkySkOWyXPoro6pbVhMhWNtmM0+FcRUR3LiWFNSj7KOya7Mbd++6yCxE9pa7dD6ZlK5fJCsuBi7UR3cWsWGpTrvP4HKLv9jzZyg66JeiOhkF0RxNjs1nZW2vVxl1z9wGR3sN+9K3M3jYpux0L0d3Oj/XWnXxaVs64V16yHpiAThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQL/Dwaci1WTPknFAAAAAElFTkSuQmCC", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - }, - ], - "chars": Array [ - Object { - "ch": "E", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "o": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "v": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "E", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "E", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 58.1, - }, - Object { - "ch": "c", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 39.683, - -48.575, - ], - Array [ - 31.083000000000002, - -51.45, - ], - Array [ - 20.316000000000003, - -50.8, - ], - Array [ - 11.891, - -46.391000000000005, - ], - Array [ - 6.325, - -39, - ], - Array [ - 3.7, - -29.116, - ], - Array [ - 4.275, - -17.533, - ], - Array [ - 8.15, - -8.341000000000001, - ], - Array [ - 14.508000000000001, - -2.216, - ], - Array [ - 22.883000000000003, - 0.7, - ], - Array [ - 33.2, - 0.07499999999999996, - ], - Array [ - 42.55, - -4.3999999999999995, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 41.315999999999995, - -11.2, - ], - Array [ - 39.35, - -10.941, - ], - Array [ - 37.383, - -9.332999999999998, - ], - Array [ - 34.35, - -7.491, - ], - Array [ - 29.766000000000002, - -6.2, - ], - Array [ - 23.291, - -6.625, - ], - Array [ - 18.116, - -9.558, - ], - Array [ - 14.6, - -14.791, - ], - Array [ - 12.85, - -22.283, - ], - Array [ - 13.174999999999999, - -30.932999999999996, - ], - Array [ - 15.441, - -37.683, - ], - Array [ - 19.6, - -42.291, - ], - Array [ - 25.583000000000002, - -44.5, - ], - Array [ - 31.491, - -44.291, - ], - Array [ - 35.15, - -43, - ], - Array [ - 37.690999999999995, - -41.541, - ], - Array [ - 39.4, - -40.5, - ], - Array [ - 40.782999999999994, - -40.599999999999994, - ], - Array [ - 41.583, - -41.283, - ], - ], - "o": Array [ - Array [ - 42.1, - -46.95, - ], - Array [ - 34.216, - -50.875, - ], - Array [ - 23.716, - -51.45, - ], - Array [ - 14.383000000000001, - -48.2, - ], - Array [ - 7.8580000000000005, - -41.758, - ], - Array [ - 4.2250000000000005, - -32.599999999999994, - ], - Array [ - 3.7, - -21.216, - ], - Array [ - 6.574999999999999, - -11.066, - ], - Array [ - 12.15, - -3.908, - ], - Array [ - 19.941000000000003, - 0.11599999999999988, - ], - Array [ - 29.716, - 0.7, - ], - Array [ - 39.8, - -2.425, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 41.883, - -10.916, - ], - Array [ - 39.949999999999996, - -11.2, - ], - Array [ - 38.15, - -9.908000000000001, - ], - Array [ - 35.516000000000005, - -8.065999999999999, - ], - Array [ - 31.550000000000004, - -6.457999999999999, - ], - Array [ - 25.333000000000002, - -6.2, - ], - Array [ - 19.658, - -8.325, - ], - Array [ - 15.583000000000002, - -12.791, - ], - Array [ - 13.200000000000001, - -19.558, - ], - Array [ - 12.85, - -28.283, - ], - Array [ - 14.475, - -35.666, - ], - Array [ - 18.008000000000003, - -41.016, - ], - Array [ - 23.4, - -44.058, - ], - Array [ - 29.916, - -44.5, - ], - Array [ - 34.058, - -43.458, - ], - Array [ - 36.949999999999996, - -42, - ], - Array [ - 38.858, - -40.708, - ], - Array [ - 40.4, - -40.5, - ], - Array [ - 41.315999999999995, - -41, - ], - Array [ - 41.85, - -41.65, - ], - ], - "v": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 36.95, - -49.725, - ], - Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, - ], - Array [ - 41.85, - -41.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "c", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "c", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 46.7, - }, - Object { - "ch": "o", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 20.758, - -50.833, - ], - Array [ - 12.25, - -46.616, - ], - Array [ - 6.433, - -39.341, - ], - Array [ - 3.6, - -29.316000000000003, - ], - Array [ - 4.166, - -17.75, - ], - Array [ - 8.05, - -8.616, - ], - Array [ - 14.790999999999999, - -2.341, - ], - Array [ - 24.1, - 0.7, - ], - Array [ - 34.841, - 0.09099999999999997, - ], - Array [ - 43.340999999999994, - -4.083, - ], - Array [ - 49.108000000000004, - -11.350000000000001, - ], - Array [ - 51.9, - -21.35, - ], - Array [ - 51.341, - -32.908, - ], - Array [ - 47.507999999999996, - -42.083, - ], - Array [ - 40.808, - -48.366, - ], - Array [ - 31.5, - -51.45, - ], - ], - "o": Array [ - Array [ - 14.790999999999999, - -48.366, - ], - Array [ - 8.05, - -42.083, - ], - Array [ - 4.166, - -32.908, - ], - Array [ - 3.6, - -21.35, - ], - Array [ - 6.433, - -11.350000000000001, - ], - Array [ - 12.25, - -4.083, - ], - Array [ - 20.758, - 0.09099999999999997, - ], - Array [ - 31.5, - 0.7, - ], - Array [ - 40.808, - -2.341, - ], - Array [ - 47.507999999999996, - -8.616, - ], - Array [ - 51.341, - -17.75, - ], - Array [ - 51.9, - -29.316000000000003, - ], - Array [ - 49.108000000000004, - -39.341, - ], - Array [ - 43.340999999999994, - -46.616, - ], - Array [ - 34.841, - -50.833, - ], - Array [ - 24.1, - -51.45, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "hd": false, - "ind": 1, - "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 23.066, - -6.683, - ], - Array [ - 17.775, - -9.658000000000001, - ], - Array [ - 14.341, - -14.883, - ], - Array [ - 12.8, - -22.3, - ], - Array [ - 13.108, - -30.991, - ], - Array [ - 15.274999999999999, - -37.766, - ], - Array [ - 19.333, - -42.283, - ], - Array [ - 25.266000000000002, - -44.45, - ], - Array [ - 36.533, - -42.766, - ], - Array [ - 42.7, - -31.333000000000002, - ], - Array [ - 41.466, - -14.625, - ], - Array [ - 32.8, - -6.25, - ], - ], - "o": Array [ - Array [ - 19.333, - -8.416, - ], - Array [ - 15.274999999999999, - -12.891, - ], - Array [ - 13.108, - -19.616, - ], - Array [ - 12.8, - -28.3, - ], - Array [ - 14.341, - -35.758, - ], - Array [ - 17.775, - -41.033, - ], - Array [ - 23.066, - -44.016, - ], - Array [ - 32.8, - -44.45, - ], - Array [ - 41.466, - -36.033, - ], - Array [ - 42.7, - -19.3, - ], - Array [ - 36.533, - -7.925000000000001, - ], - Array [ - 25.266000000000002, - -6.25, - ], - ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, - ], - Array [ - 27.8, - -6.25, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "o": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, - }, - Object { - "ch": "y", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 42.208, - -50.475, - ], - Array [ - 40.900000000000006, - -49.333, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.983, - -15.433, - ], - Array [ - 26.283, - -13.216, - ], - Array [ - 25.691000000000003, - -13.966, - ], - Array [ - 25, - -16.165999999999997, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.633, - -49.691, - ], - Array [ - 9.166, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 20.575, - 16.95, - ], - Array [ - 21.849999999999998, - 15.616, - ], - ], - "o": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 42.733, - -50.65, - ], - Array [ - 41.241, - -49.775, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.25, - -16.183, - ], - Array [ - 26.516, - -13.966, - ], - Array [ - 25.883, - -13.216, - ], - Array [ - 25.258000000000003, - -15.433, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 10.950000000000001, - -49.266, - ], - Array [ - 9.766, - -50.458000000000006, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 19.883, - 17.15, - ], - Array [ - 21.474999999999998, - 16.150000000000002, - ], - Array [ - 22.15, - 14.95, - ], - ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 21.025, - 16.55, - ], - Array [ - 22.15, - 14.95, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "default": Object { - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAIaElEQVR4Xu3VsZEdVRRF0fdJgBBQGkgGEAGEoBAgA8hAIUAEEIKskUsIkIEw5ehTJQuLUZWezpnXd8me+qd73d5wW/4RIHB5gdvl39ALEiCwhO4jIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ848ud6xfub9e2H336/3t5erD8/147f/XQBoX+64ahfuL9Zz9Z9/bjWernW+vI/L//3WuvVerd+vX233o5COeBlhX7AkZ7SI94f1l9rra/+55l+uz3/8B8B/56QgNCf0DGe+qPcH9YPa63fH3nOf9a79cz/1Z/WNYX+tO7xpJ/m/rD+WGt9/xEP+dPt+Xr1EX/nT0ICQg9BX2Hm/rBer7W+efRd7uuX24v186N/5w9iAkKPUZ8/JPRzbyj0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JPf36yX6/169ujwF+v17ev1+tG/8wcxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGewL9Mt+j7O/D7zgAAAABJRU5ErkJggg==", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAWBUlEQVR4Xu2dDXBcxX3A/3f6tCR/q/gLYzlYNoYABkKoxyZ20jIkMAEnBZpCiuWQkJkydTRJmCFDZOQWpqnbtG4yaRnCxIY0CaTtYDeljUsZ2xNsTSBQuxmSgmss2RhbkWzpsCXbsu5eZ59ORBb33r3dW51W9343w0wb7f7f7u+/P+++fV8J4QcBCJQ8gUTJ95AOQgACgugMAgjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIHrMxcOKH8vmZd8uTMet27LuL6DEZAt4eWSYJ2dx9QBp6D/udbmpskV0x6X7su4noJT4EvJ0yTSqlWRLyiOpq9wHp6D0sC/xue7K9PCNNC1ult8QxxL57iF7CQ8Brk9XiyVaRrNijRR/qe0oS0tr4ddlcwihi3zVEL8Eh4LVJg3i+uLeP7t4FM/qFf9wvIs0s50twQIgIopdQXkcv03N1LUT0oeKebB/MSPPSVmkvITSx7wqil8gQ8PZIqySkWUSmhnUpr+jZyp7IU+m0tCJ8aQwQRJ/gefTapEk8aR15Hm5D9OEYCD/BB0i2+Yg+AfPoL9GrpEmdU0cVfLibb+1PpjLdmdBZPxcShJ+AA2VEkxF9AuXP32TLSFOUJXqubu3eV9P/Z1tn1NzUcEruuDJl1nNPtqvr8WzameEbr1qIPl7kNY6bvUymZvC1GtXeK9qdKut/6In6mp++Uvve/7Zo5oD86YpuuXrOWZOQqk6HEr58ULZyHd4UYfHqIXrxWGsdKXuJbI3J8nz4QOfOJ859Z9u0qr/5p+mBx/74klOy7roemTV5UKt9IwurZX1SZNuiFtlmHISKY0oA0ccUr17w9+RO+BtsV+vVvrD01h1Tzm16ZkbVu33JSGHUUn7dh3q82spMIWMi5YlsQ/pIyItaqJCkFrWhpXow/x50kTWSlDWFyq0YPfezuoFNz8yoPNJVro2srjIjd1yVkjuvTBUqvDp2SjzZpcRPZ2QXl+m002G1AqJbxZk/WPZ8W8m9Ovuf9g54rqMUIvjoeJaFHw6/3xPZp+RH/PzjxHYJRLdNNBvPX4aLfyuqklr9p/7/VTYPd3YgMfCD/5pS+eTzU8VkBo/SFhvn8AHHUdv++0Rkl+dJeyIh7eVp2cfGXpSs6JdB9IjM/CV2UqaNKq4udymB1c3EQ2InZJqNJXhYs7p6y85+Z/u06h/vmixRz8EjdjOw2MqGPvnEktOyoqGv0FBR6u8eQir7PBl6sm7k/z0cwEtK7+KH/X8s+OUhgOghgLLL7J2ujKIXX6s5/6MXJ1eMvExW7LbNnjwoapa/ZcmpzEV1g9F2+orTyI9ybT8YNKKHiT50/7j/HPd4/d58u3Lghy9Orizm7B21r2qWX7mwXz6ysC9TU5EZV+k9T9Yt3uA/kssvBwFEd1D0Ybl3vFw7Zufetm1wQPqNjS3+Pf/8EF1vDGSfCBvzGb3/XGLwZ/9TU77jlRppe33ShJE7iOayuWdk2dyzcmNDn1w6c0APunlpRA9hx4w+DjO62kx77UB1dduvqn2xX2+vNB/ejtdUl+qU+IvqB+SauWcKueU2X08RHdHzjZHcf/f2+i9PLOiS2MF3Ks7839HKSUpmJfbbv6mY8DO2Gc3f1lL32S+qPydqY0/JP2/K+YH62nRh/9p5sr1xg6hbhvmxdNcbA2GiHzpWcborVVadyUh5qq/svVn5V+2VkupPIrQear+0+gegrirt/wOg/lO/xuz/lkzI4Lwp5wdn1KSrA0Lvbmzxb0Lih+h6YyBM9Ds3zvGX3fyKR6DpQz3SdF1P0AERnaW72WBEdDNuY1VLXb9/aHUXohsAZjMuBJq3V7ygPzOjG4y2AquoTb3NnzwWFCXV2PK+OxcLPGLpVEd0Q9GXP3BJ7DfViq1BHtGlsYW3GgflBNENRb/4rg8Ue5zH/niIbj4EED2AXfYFjIE7P4huPuhMa6qd+GfuHvpwXK4fM3owWUQPEn3oc0aBD7QguqmuhdXb9cW3wgLwYEsAHUQ3ED3Vl0xdsa7BygsjChv28auN6GY5R3QD0duPV3SsXD9/6Iuk/IpKANHNcCN6kOh7/dspn8v1Z0Q3G2w2av3zZzs662vTswJisXRn6a43zMKeXEN0PZY2S//gM0c65k09H7Sa4sEWRNcbbmGi73iltvO+v5oVNKvoHYjSWgSe+IOjvYvrz41+pddwDERHdK3xJGGib/mPqR0tW2Zyjq6H1EppRDfDyDl60Dl6yGukEN1ssNmo9djNnZ0rGvqCVlPM6MzoesMs7IEWRNdjabP0+hUnOj79wVTQaoon2BBdb7iFif7o92eeffwnU4Oei9Y7EKW1CNx3/clzf3xtb1VAJURHdK3xJDyiqserWKV5Jt2MNOfoQefoIa+R4hFVs8Fmoxaim1FE9CDR2/zvhOX8oimimw02G7XyPMHG0p2lu94w46UTeryKVZpHVc1IM6MHL915u4zZmBrTWohuhhfRDUS/fF1D0T5uaJbW0q2F6Ga5RXQD0XkW3Wyw2aiF6GYUER3RzUbOONVCdDPwiI7oZiNnnGrxOikz8IiO6GYjZxxrhb18gvfG5U4MoiP6OCprdmhE1+eG6IiuP2rGuQai6ycA0XMw89qkQTw5FISTXXf9gWazRpjo5WmZvrBVem0erxRiITqiT7hxHCb6YFoWLm2V9gnXqTFuMKKzdB/jIWY/PEt3faaIjuj6o2acayC6fgIQHdH1R80410B0/QQgOqLrj5pxrFFXmZF/Wxd8Cs519NzJQXREH0dt9Q/NLbD6zFQNREd0s5EzTrUQ3Qw8ohuIvvyBS+RIV7kZcWoVRADRzfAhuoHovErKbLDZqIXoZhQRPVj0XSKyKtefEd1ssNmo9fElp+Sh1V1BoXhnXAAZRDcQ/TN/PqfvpV9OqrUxcImhR4D3uuvxGi6N6Aai86UWs8FmoxZfajGjiOjBom8WkS/l+jOimw02G7U2f/JY97K5Z+oDYvHtNZbuesMs7Guqba/X/PrOjbOX6kWktA0CT//h4aOXTBuch+h6NJnRg2b0NmkST7bk+nP78YqOlevn89lkvbFmpfRPmtpTk6syU3MF8zxZt3iDbLVyoBILgujBoq8WT3bm+vNgOtHf8EcLa0psLEyI7oTd5y4iH21sEXW1hN8oAogeLDovn3BMl0UzB+TJO94ObBXPogcnDNFDBjOfZXLL9JUNffLozZ2BjeKBFkQ3GrFeyIcWW75Xf2TLT6fMNwpMJSMCf7L8ROddV6VmBVTmZpkQqszo4TP6NhG5PVeRf/957a/v/+Ysdt6NlDWrtOXOI50LZ5zPKbon8tTiFmkyi1z6tRA9TPQ90ioJeSRXkSNdZQeXP7Dg0tIfIu708IXPHzpbUeZVB7SIa+jM6GaD1WuTwJ13FZG3wZpxNamV7wst7LiHU2VGD5vRd8o0qZKeoCLc826irFmdWy87debBVV2TgmqzEYfoZiMrWytsQ+77L0x542vfrV9S0AGoHInAX9xy/Mjy+f1Bm5/7G1tkWaRAMS3EjJ4n8d5e/06rtbmKnTxVduSq+xaw814EeV74wqEzFUkv54yeEPm7RS3SXIRmTNhDIHp+0deIyHNBxS5f1yDv9iUn7ACYCA3P97KJhMinFrWIukLCL4AAoucTPc95OtfTx96tB1d1dd962amgJ9aE8/P8OUD0/Iwk7Dydy2wRABZY5Pl17T21lZnpOcN4sr1xg6hVF78QAogeYXh4e/3zv78NKsrLIiNANCyS77ZXnliLBhbRI3DK93VVdt8jQDQs8q3b3jl+1Zyzs4Oq8/XUaGARPRqn0OX72YFE56LPLgy6BzviESg2mkDem2RYtkceNIgeEZUX8iIKFYJNuYggNYrleYhFfX2E3faIPBE9IihvaPddffQr59tNuKYeEWTEYuoba8+t7Qi8di4iHY0t0hAxXOyLIbrGEAi7eUaFueexOZ27909iCa/BNKjo/TecTN29rDfnP6rZOjzEosEZ0TVg5duUS/Un269oamCW0WCaq6iazbet7egvT3qBr+tiE04PMqLr8RJvr38HVs5n1FWojU/NfOO7z0/l/ndNriOLP3ZzZ+eKhr7AlRHPnuvDRXRNZvkeXU1n5PSV9zXUcVusJths8XzvhVPFeDecPltE12emZvXA77KpcP/5as2+z/3lbJ6mMmD743sOd19UNxh4uyuzuQFUvo9uBi3fuTobc2ZcI2zApcrT0rCwVXrNjhDfWszohrnPtwM/cD5xbNn9C+awhI8GOMqSXW2BNLZIa7SIlBpJANENx0O+6+oq7P6D1a/c+rW51xseIjbV1C77s/ccDn5wZYgE180LGBGIXgC8fA+7qNCP/ePM//6Hf516TQGHKfmq+e5nzwLgKywFjARELwCeqppvY06Vuf3heW++eqBqcYGHKsnq+W5zVZ3mDTKFpx7RC2SY3ZjbF3RrrAqf8eTUrQ/NS/zyUFVdgYcrqer5XviY7ez+8rSsZgOusNQjemH8/NreXv/FB4Gvm1Jl+gYSb374iwtmp/qSUywccsKHWPWBvv6NN3Xm/VCll5RrFj8s6h9SfgUQQPQC4I2smm8XHtl/S2tx/bnTj3/6qCQTErrC4aUSlgYn19HtgfRn9pBvtQ0fKe4ze2TJ+cSS1cHJjG4RZ5RLbnGe2dU5+Vc+0pXON5OrK5O8p93iwGRGtwvTn9X3yDJJ+LfIhj1i6Z+z3/XI3Mn7D1bNsd8K9yLedvmpE1++sWtmhJax+RYBkm4RZnRdYhHK53vwZTiE58m7a74+73ipX3rL97rmEUi5xTXC+DIpgugm1CLUyffqqZEh/vrZ6Xs2/8v0FRHCTqgi6o63TbccO3L5rHNRvmaT8pKymh32sUkxoo8NVz+qjuy/eKP6hTUtcz+cb8k/hs21Glptum2+7di5mopMlOU6klul//5giD7GgHVkV+ftn/jqxem3jlcsHeNmjWn4e6/teedz1/fMjXiQ/V5SmpjJI9IyLIbohuB0qkXdoPNXAZ68++1t036+6UczbtI5hgtl1VL97z/19tFLpg3Oi9geNt4igiq0GKIXSjBifR3ZVcjOnrI9v/fl+Zf09iWjnN9GbMXYFfvYpae7Hv5YV01Z0quNdBRPtpdnpIlbWyPRKrgQoheMMHoA/zp7tewST66OUmsizO7qIwubbnlHZxbnIZUoybdcBtEtA80XLntTzeagb67nqn+6v+zVe78xS17+3+rr8sUv5t/XrzjRseaK1MwIN8AMNyvledK8eIP/zXl+RSSA6EWEPfJQUZ5lH900tTPf9I3Zl433cl4t07+6qjsZcUd9uBtsuo3TWFOHRfRxhJ89b1evj14QtRlqOf/Mzrq2Bx+/6HeLfSnu2nln+r5yY3f3vKnnI7dX9Uu90LEiLc2cj0fNsv1yiG6fqVbE7FJevQftSzoVM54ceeL5Ka89+nT96rEWXl0Tf+T3f3NCV3ARSSVEmha1+O/C5zeOBBB9HOGPWsqrZ9rVubvWbDmWwivB1684efCDs89E2jy8ACW76o6MrKFmILpD6TCd3VUXbApvukTPouxIiDQzizs0sBDdrWQMt8Z/KEbN7hEvw43shRJ+20t1r274Xv11upt26gmzu5ed7J09OX2pIZmN5WnZzLm4Ib0xrMaMPoZwCw2d3ZlX5++hj7wGHCf1izeqX37w8d+ZcuBoxQ1BbVF3s911dergHVempmnuoo8MuXswLU1LW/3PSvNzkACiO5iUC87dh77Lrr1ZNzJGz+myXd98drq3dceUa4f/0VDn31+44WTn9RefMZ291SH2i0hzY4v//D0/hwkgusPJuUD4NmkQzxd+rWmT1bJ+z56qN2tSg4unVqcLubW2w/OklRtfTDNR/HqIXnzmBR0x+3ppdWfZKpNA3Qeko/ew3s7+iOMguAl0B+ogugNJMGlC9i02TbozvKHoCG6SJIfqILpDyTBpSnaGj7yk1xR9d0JkM5fKTDLjVh1Edysfxq3xhc9IkySkOWyXPoro6pbVhMhWNtmM0+FcRUR3LiWFNSj7KOya7Mbd++6yCxE9pa7dD6ZlK5fJCsuBi7UR3cWsWGpTrvP4HKLv9jzZyg66JeiOhkF0RxNjs1nZW2vVxl1z9wGR3sN+9K3M3jYpux0L0d3Oj/XWnXxaVs64V16yHpiAThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQL/Dwaci1WTPknFAAAAAElFTkSuQmCC", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - }, - ], - "chars": Array [ - Object { - "ch": "E", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "o": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - "v": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "E", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "E", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 58.1, - }, - Object { - "ch": "c", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 39.683, - -48.575, - ], - Array [ - 31.083000000000002, - -51.45, - ], - Array [ - 20.316000000000003, - -50.8, - ], - Array [ - 11.891, - -46.391000000000005, - ], - Array [ - 6.325, - -39, - ], - Array [ - 3.7, - -29.116, - ], - Array [ - 4.275, - -17.533, - ], - Array [ - 8.15, - -8.341000000000001, - ], - Array [ - 14.508000000000001, - -2.216, - ], - Array [ - 22.883000000000003, - 0.7, - ], - Array [ - 33.2, - 0.07499999999999996, - ], - Array [ - 42.55, - -4.3999999999999995, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 41.315999999999995, - -11.2, - ], - Array [ - 39.35, - -10.941, - ], - Array [ - 37.383, - -9.332999999999998, - ], - Array [ - 34.35, - -7.491, - ], - Array [ - 29.766000000000002, - -6.2, - ], - Array [ - 23.291, - -6.625, - ], - Array [ - 18.116, - -9.558, - ], - Array [ - 14.6, - -14.791, - ], - Array [ - 12.85, - -22.283, - ], - Array [ - 13.174999999999999, - -30.932999999999996, - ], - Array [ - 15.441, - -37.683, - ], - Array [ - 19.6, - -42.291, - ], - Array [ - 25.583000000000002, - -44.5, - ], - Array [ - 31.491, - -44.291, - ], - Array [ - 35.15, - -43, - ], - Array [ - 37.690999999999995, - -41.541, - ], - Array [ - 39.4, - -40.5, - ], - Array [ - 40.782999999999994, - -40.599999999999994, - ], - Array [ - 41.583, - -41.283, - ], - ], - "o": Array [ - Array [ - 42.1, - -46.95, - ], - Array [ - 34.216, - -50.875, - ], - Array [ - 23.716, - -51.45, - ], - Array [ - 14.383000000000001, - -48.2, - ], - Array [ - 7.8580000000000005, - -41.758, - ], - Array [ - 4.2250000000000005, - -32.599999999999994, - ], - Array [ - 3.7, - -21.216, - ], - Array [ - 6.574999999999999, - -11.066, - ], - Array [ - 12.15, - -3.908, - ], - Array [ - 19.941000000000003, - 0.11599999999999988, - ], - Array [ - 29.716, - 0.7, - ], - Array [ - 39.8, - -2.425, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 41.883, - -10.916, - ], - Array [ - 39.949999999999996, - -11.2, - ], - Array [ - 38.15, - -9.908000000000001, - ], - Array [ - 35.516000000000005, - -8.065999999999999, - ], - Array [ - 31.550000000000004, - -6.457999999999999, - ], - Array [ - 25.333000000000002, - -6.2, - ], - Array [ - 19.658, - -8.325, - ], - Array [ - 15.583000000000002, - -12.791, - ], - Array [ - 13.200000000000001, - -19.558, - ], - Array [ - 12.85, - -28.283, - ], - Array [ - 14.475, - -35.666, - ], - Array [ - 18.008000000000003, - -41.016, - ], - Array [ - 23.4, - -44.058, - ], - Array [ - 29.916, - -44.5, - ], - Array [ - 34.058, - -43.458, - ], - Array [ - 36.949999999999996, - -42, - ], - Array [ - 38.858, - -40.708, - ], - Array [ - 40.4, - -40.5, - ], - Array [ - 41.315999999999995, - -41, - ], - Array [ - 41.85, - -41.65, - ], - ], - "v": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 36.95, - -49.725, - ], - Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, - ], - Array [ - 41.85, - -41.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "c", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "c", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 46.7, - }, - Object { - "ch": "o", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 20.758, - -50.833, - ], - Array [ - 12.25, - -46.616, - ], - Array [ - 6.433, - -39.341, - ], - Array [ - 3.6, - -29.316000000000003, - ], - Array [ - 4.166, - -17.75, - ], - Array [ - 8.05, - -8.616, - ], - Array [ - 14.790999999999999, - -2.341, - ], - Array [ - 24.1, - 0.7, - ], - Array [ - 34.841, - 0.09099999999999997, - ], - Array [ - 43.340999999999994, - -4.083, - ], - Array [ - 49.108000000000004, - -11.350000000000001, - ], - Array [ - 51.9, - -21.35, - ], - Array [ - 51.341, - -32.908, - ], - Array [ - 47.507999999999996, - -42.083, - ], - Array [ - 40.808, - -48.366, - ], - Array [ - 31.5, - -51.45, - ], - ], - "o": Array [ - Array [ - 14.790999999999999, - -48.366, - ], - Array [ - 8.05, - -42.083, - ], - Array [ - 4.166, - -32.908, - ], - Array [ - 3.6, - -21.35, - ], - Array [ - 6.433, - -11.350000000000001, - ], - Array [ - 12.25, - -4.083, - ], - Array [ - 20.758, - 0.09099999999999997, - ], - Array [ - 31.5, - 0.7, - ], - Array [ - 40.808, - -2.341, - ], - Array [ - 47.507999999999996, - -8.616, - ], - Array [ - 51.341, - -17.75, - ], - Array [ - 51.9, - -29.316000000000003, - ], - Array [ - 49.108000000000004, - -39.341, - ], - Array [ - 43.340999999999994, - -46.616, - ], - Array [ - 34.841, - -50.833, - ], - Array [ - 24.1, - -51.45, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "hd": false, - "ind": 1, - "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 23.066, - -6.683, - ], - Array [ - 17.775, - -9.658000000000001, - ], - Array [ - 14.341, - -14.883, - ], - Array [ - 12.8, - -22.3, - ], - Array [ - 13.108, - -30.991, - ], - Array [ - 15.274999999999999, - -37.766, - ], - Array [ - 19.333, - -42.283, - ], - Array [ - 25.266000000000002, - -44.45, - ], - Array [ - 36.533, - -42.766, - ], - Array [ - 42.7, - -31.333000000000002, - ], - Array [ - 41.466, - -14.625, - ], - Array [ - 32.8, - -6.25, - ], - ], - "o": Array [ - Array [ - 19.333, - -8.416, - ], - Array [ - 15.274999999999999, - -12.891, - ], - Array [ - 13.108, - -19.616, - ], - Array [ - 12.8, - -28.3, - ], - Array [ - 14.341, - -35.758, - ], - Array [ - 17.775, - -41.033, - ], - Array [ - 23.066, - -44.016, - ], - Array [ - 32.8, - -44.45, - ], - Array [ - 41.466, - -36.033, - ], - Array [ - 42.7, - -19.3, - ], - Array [ - 36.533, - -7.925000000000001, - ], - Array [ - 25.266000000000002, - -6.25, - ], - ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, - ], - Array [ - 27.8, - -6.25, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "o": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, - }, - Object { - "ch": "y", - "data": Object { - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 100, - 100, - ], - }, - }, - "op": 99999, - "shapes": Array [ - Object { - "_render": true, - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "_render": true, - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 42.208, - -50.475, - ], - Array [ - 40.900000000000006, - -49.333, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.983, - -15.433, - ], - Array [ - 26.283, - -13.216, - ], - Array [ - 25.691000000000003, - -13.966, - ], - Array [ - 25, - -16.165999999999997, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.633, - -49.691, - ], - Array [ - 9.166, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 20.575, - 16.95, - ], - Array [ - 21.849999999999998, - 15.616, - ], - ], - "o": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 42.733, - -50.65, - ], - Array [ - 41.241, - -49.775, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.25, - -16.183, - ], - Array [ - 26.516, - -13.966, - ], - Array [ - 25.883, - -13.216, - ], - Array [ - 25.258000000000003, - -15.433, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 10.950000000000001, - -49.266, - ], - Array [ - 9.766, - -50.458000000000006, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 19.883, - 17.15, - ], - Array [ - 21.474999999999998, - 16.150000000000002, - ], - Array [ - 22.15, - 14.95, - ], - ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 21.025, - 16.55, - ], - Array [ - 22.15, - 14.95, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - Object { - "_render": true, - "a": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "k": 100, - }, - "p": Object { - "a": 0, - "k": Array [ - 0, - 0, - ], - }, - "r": Object { - "a": 0, - "k": 0, - }, - "s": Object { - "a": 0, - "k": Array [ - 77, - 77, - ], - }, - "sa": Object { - "a": 0, - "k": 0, - }, - "sk": Object { - "a": 0, - "k": 0, - }, - "ty": "tr", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", - }, - Object { - "_render": true, - "ty": "no", - }, - ], - "sr": 1, - "st": 0, - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, - }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], - }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "masksProperties": Array [ - Object { - "inv": false, - "mode": "a", - "nm": "Masque 1", - "o": Object { - "a": 0, - "ix": 3, - "k": 100, - }, - "pt": Object { - "a": 0, - "ix": 1, - "k": Object { - "c": true, - "i": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "o": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "v": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - }, - }, - "x": Object { - "a": 0, - "ix": 4, - "k": 0, - }, - }, - ], - "nm": "compo barre", - "op": 13.2, - "refId": "comp_0", - "sr": 0.55, - "st": 0, - "ty": 0, - "w": 120, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 250, - 250, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "bouclier", - "op": 13, - "refId": "image_1", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "markers": Array [], - "meta": Object { - "a": "", - "d": "", - "g": "LottieFiles AE 0.1.20", - "k": "", - "tc": "", - }, - "nm": "splash illu", - "op": 13, - "v": "5.5.7", - "w": 500, - }, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, - }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], - }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "keyframeMetadata": [Function], - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": null, - "to": null, - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": null, - "to": null, - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "masksProperties": Array [ - Object { - "inv": false, - "mode": "a", - "nm": "Masque 1", - "o": Object { - "a": 0, - "ix": 3, - "k": 100, - }, - "pt": Object { - "a": 0, - "ix": 1, - "k": Object { - "c": true, - "i": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "o": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - "v": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - }, - }, - "x": Object { - "a": 0, - "ix": 4, - "k": 0, - }, - }, - ], - "nm": "compo barre", - "op": 13.2, - "refId": "comp_0", - "sr": 0.55, - "st": 0, - "ty": 0, - "w": 120, - }, - Object { - "ao": 0, - "bm": 0, - "completed": true, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 250, - 250, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "bouclier", - "op": 13, - "refId": "image_1", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "markers": Array [], - "meta": Object { - "a": "", - "d": "", - "g": "LottieFiles AE 0.1.20", - "k": "", - "tc": "", - }, - "nm": "splash illu", - "op": 13, - "v": "5.5.7", - "w": 500, - }, - "autoplay": false, - "loop": false, - "rendererSettings": Object { - "preserveAspectRatio": "xMidYMid slice", - }, - } - } - speed={1} - title="" - width={200} + <StyledIcon + className="error" + icon="test-file-stub" + size={130} > - <div - aria-label="animation" - onClick={[Function]} - role="button" - style={ - Object { - "height": "200px", - "margin": "0 auto", - "outline": "none", - "overflow": "hidden", - "width": "200px", - } - } - tabIndex="0" - title="" - /> - </Lottie> + <Icon + aria-hidden={true} + className="error" + icon="test-file-stub" + size={130} + spin={false} + > + <Component + aria-hidden={true} + className="error styles__icon___23x3R" + height={130} + style={Object {}} + width={130} + > + <svg + aria-hidden={true} + className="error styles__icon___23x3R" + height={130} + style={Object {}} + width={130} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </StyledIcon> + <span> + Ecolyo + </span> <div className="splash-error-text text-20-bold" > diff --git a/src/components/Splash/splashScreen.scss b/src/components/Splash/splashScreen.scss index 65590c61b478b3c9bf1ee81c1703264240650a8a..af366e848959e8ef7596c9ccae85c4545a97f575 100644 --- a/src/components/Splash/splashScreen.scss +++ b/src/components/Splash/splashScreen.scss @@ -8,6 +8,21 @@ .splash-loader { width: 100%; margin-top: 20vh; + display: flex; + flex-direction: column; + align-items: center; + + .error { + margin-bottom: 1rem; + } + + span { + color: $white; + font-size: 3rem; + margin: 0; + letter-spacing: -0.02em; + font-weight: 400; + } } .splash-logos-container { margin-top: auto; diff --git a/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap b/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap index 984a939bc105ea35a603b7ffe688585ceb598387..121ce5fb7f93af1ee052881204a280f803903324 100644 --- a/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap +++ b/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap @@ -574,9 +574,6 @@ exports[`CGUModal component should be rendered correctly 1`] = ` <li> gcu.content.part5_3_list2 </li> - <li> - gcu.content.part5_3_list3 - </li> </ul> <p class="text-14-normal" @@ -626,6 +623,11 @@ exports[`CGUModal component should be rendered correctly 1`] = ` > gcu.content.part6_4 </p> + <p + class="text-14-normal" + > + gcu.content.part6_5 + </p> <div class="gcu-content-part-title text-15-normal" > @@ -1204,9 +1206,6 @@ exports[`CGUModal component should be rendered correctly 1`] = ` <li> gcu.content.part5_3_list2 </li> - <li> - gcu.content.part5_3_list3 - </li> </ul> <p className="text-14-normal" @@ -1256,6 +1255,11 @@ exports[`CGUModal component should be rendered correctly 1`] = ` > gcu.content.part6_4 </p> + <p + className="text-14-normal" + > + gcu.content.part6_5 + </p> <div className="gcu-content-part-title text-15-normal" > diff --git a/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap b/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap index 90d1f60bddd967df923ea3fce4da2c342f9b74fe..dc4900b2bf7398f986951e870de27fcbb7c2de24 100644 --- a/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap +++ b/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap @@ -548,56 +548,62 @@ exports[`LegalNoticeModal component should be rendered correctly 1`] = ` </li> <li> legal.part2-2 + </li> + <li> + legal.part2-3 <ul> <li> - legal.part2-2-1 + legal.part2-3-1 </li> <li> - legal.part2-2-2 + legal.part2-3-2 </li> <li> - legal.part2-2-3 + legal.part2-3-3 </li> <li> - legal.part2-2-4 + legal.part2-3-4 </li> <li> - legal.part2-2-5 + legal.part2-3-5 </li> </ul> </li> <li> - legal.part2-3 + legal.part2-4 </li> </ul> <p> - legal.part2-4 + legal.part2-5 + </p> + <p> + legal.part2-6 </p> <ul> <li> - legal.part2-4-1 + legal.part2-6-1 </li> <li> - legal.part2-4-2 + legal.part2-6-2 </li> <li> - legal.part2-4-3 + legal.part2-6-3 </li> </ul> <p> - legal.part2-5 + legal.part2-7 </p> <p> - legal.part2-6 + legal.part2-8 </p> <p> - legal.part2-7 + legal.part2-9 </p> <p> - legal.part2-8 + legal.part2-10 </p> <p> - legal.part2-9 + legal.part2-11 </p> </div> <div @@ -1158,56 +1164,62 @@ exports[`LegalNoticeModal component should be rendered correctly 1`] = ` </li> <li> legal.part2-2 + </li> + <li> + legal.part2-3 <ul> <li> - legal.part2-2-1 + legal.part2-3-1 </li> <li> - legal.part2-2-2 + legal.part2-3-2 </li> <li> - legal.part2-2-3 + legal.part2-3-3 </li> <li> - legal.part2-2-4 + legal.part2-3-4 </li> <li> - legal.part2-2-5 + legal.part2-3-5 </li> </ul> </li> <li> - legal.part2-3 + legal.part2-4 </li> </ul> <p> - legal.part2-4 + legal.part2-5 + </p> + <p> + legal.part2-6 </p> <ul> <li> - legal.part2-4-1 + legal.part2-6-1 </li> <li> - legal.part2-4-2 + legal.part2-6-2 </li> <li> - legal.part2-4-3 + legal.part2-6-3 </li> </ul> <p> - legal.part2-5 + legal.part2-7 </p> <p> - legal.part2-6 + legal.part2-8 </p> <p> - legal.part2-7 + legal.part2-9 </p> <p> - legal.part2-8 + legal.part2-10 </p> <p> - legal.part2-9 + legal.part2-11 </p> </div> <div diff --git a/src/components/Terms/termsView.scss b/src/components/Terms/termsView.scss index 580e95b0505d7a383ec832c13459ffe26d29a151..e7ccf1b1656d98024398c8d07b2d8ac48e969a5e 100644 --- a/src/components/Terms/termsView.scss +++ b/src/components/Terms/termsView.scss @@ -1,4 +1,5 @@ @import 'src/styles/base/color'; +@import 'src/styles/base/mixins'; .terms-wrapper { padding: 0rem 1.5rem 0 1.5rem; @@ -25,55 +26,8 @@ .dataShare-content-root { width: inherit; } +@include checkBox(); -.checkbox { - margin: 0.5rem 0; - display: flex; - align-items: center; - &:first-of-type { - margin-top: 1.5rem; - } - input { - margin: 0.5rem 1rem 0.5rem 0.5rem; - appearance: none; - -moz-appearance: none; - -webkit-appearance: none; - width: 1.45rem; - height: 1.45rem; - min-width: 1.45rem; - min-height: 1.45rem; - background: $dark-background; - position: relative; - border: solid 2px $gold-shadow; - cursor: pointer; - } -} -.answer-checked { - input { - &:before, - &:after { - content: ''; - position: absolute; - display: inline-block; - background: $gold-shadow; - border-radius: 0.5rem; - } - &:before { - width: 3px; - height: 12px; - left: 10px; - top: 4px; - transform: rotate(41deg); - } - &:after { - width: 3px; - height: 6px; - left: 5px; - top: 8px; - transform: rotate(133deg); - } - } -} .terms-footer { max-width: 45rem; width: 100%; diff --git a/src/components/TotalConsumption/TotalConsumption.tsx b/src/components/TotalConsumption/TotalConsumption.tsx index 53fcde843a814f94bb656306306725b15bc0ec68..5f9855ca023ae44e37f1197e4ce746eaacbbb1c0 100644 --- a/src/components/TotalConsumption/TotalConsumption.tsx +++ b/src/components/TotalConsumption/TotalConsumption.tsx @@ -30,10 +30,13 @@ const TotalConsumption: React.FC<TotalConsumptionProps> = ({ useEffect(() => { const calculateTotalValue = async () => { const consumptionService = new ConsumptionService(client) - const activateHalfHourLoad = await consumptionService.checkDoctypeEntries( - FluidType.ELECTRICITY, - TimeStep.HALF_AN_HOUR - ) + const activateHalfHourLoad = + fluidType === FluidType.ELECTRICITY + ? await consumptionService.checkDoctypeEntries( + FluidType.ELECTRICITY, + TimeStep.HALF_AN_HOUR + ) + : false const converterService = new ConverterService() let total = 0 diff --git a/src/constants/config.json b/src/constants/config.json index 490b05a52c0c8270376e9b449a0806e47d8b17a4..fd957b43a5bcfa518884bd656152eeac2496b932 100644 --- a/src/constants/config.json +++ b/src/constants/config.json @@ -4,13 +4,12 @@ "fluidTypeId": 0, "name": "enedis", "coefficient": 0.174, - "startDate": "2021-08-01T00:00:00.000", "dataDelayOffset": 3, "konnectorConfig": { "name": "Enedis", - "oauth": true, - "slug": "enedisgrandlyon", + "oauth": false, + "slug": "enedissgegrandlyon", "siteLink": "https://mon-compte-client.enedis.fr/", "activation": "https://mon-compte-particulier.enedis.fr/donnees/" } @@ -44,5 +43,5 @@ } } ], - "termsVersion": "2.0.0" + "termsVersion": "3.0.0" } diff --git a/src/db/challengeEntity.json b/src/db/challengeEntity.json index 790d0a8694e373b808eb51c673ff8bfb04ec8c1e..a8c0710add127ab2dc8b1356da8b59c0237200c9 100644 --- a/src/db/challengeEntity.json +++ b/src/db/challengeEntity.json @@ -1,7 +1,8 @@ [ { "_id": "CHALLENGE0001", - "title": "Simone Veille", + "title": "Simone VEILLE", + "title_line_return": "Simone\nVEILLE", "description": "foobar", "target": 15, "relationships": { @@ -23,7 +24,8 @@ }, { "_id": "CHALLENGE0002", - "title": "Jean-Jacques Ruisseau", + "title": "Jean-Jacques RUISSEAU", + "title_line_return": "Jean-Jacques\nRUISSEAU", "description": "foobar", "target": 15, "relationships": { @@ -45,7 +47,8 @@ }, { "_id": "CHALLENGE0003", - "title": "Usain Volt", + "title": "Usain VOLT", + "title_line_return": "Usain\nVOLT", "description": "foobar", "target": 15, "relationships": { @@ -67,7 +70,8 @@ }, { "_id": "CHALLENGE0004", - "title": "Bernard Piv'eau", + "title": "Bernard PIV'EAU", + "title_line_return": "Bernard\nPIV'EAU", "description": "foobar", "target": 15, "relationships": { @@ -93,7 +97,8 @@ }, { "_id": "CHALLENGE0005", - "title": "Maria SharapoWatt", + "title": "Maria SHARAPOWATT", + "title_line_return": "Maria\nSHARAPOWATT", "description": "foobar", "target": 15, "relationships": { diff --git a/src/db/duelEntity.json b/src/db/duelEntity.json index c8a41ec42eee1cf897eec933bae215c7fdf9132b..65f25650d9567ae38205b37030c9afe96fdd005c 100644 --- a/src/db/duelEntity.json +++ b/src/db/duelEntity.json @@ -1,31 +1,31 @@ [ { "_id": "DUEL001", - "title": "Simone Veille", + "title": "Simone VEILLE", "description": "Je vous défie de consommer moins que #CONSUMPTION € dans les #DURATION prochains jours", "duration": { "days": 7 } }, { "_id": "DUEL002", - "title": "Jean-Jacques Ruisseau", + "title": "Jean-Jacques RUISSEAU", "description": "Je vous défie de consommer moins que #CONSUMPTION € dans les #DURATION prochains jours", "duration": { "days": 14 } }, { "_id": "DUEL003", - "title": "Usain Volt", + "title": "Usain VOLT", "description": "Je vous défie de consommer moins que #CONSUMPTION € dans les #DURATION prochains jours", "duration": { "days": 14 } }, { "_id": "DUEL004", - "title": "Bernard Piv'eau", + "title": "Bernard PIV'EAU", "description": "Je vous défie de consommer moins que #CONSUMPTION € dans les #DURATION prochains jours", "duration": { "days": 21 } }, { "_id": "DUEL005", - "title": "Maria SharapoWatt", + "title": "Maria SHARAPOWATT", "description": "Je vous défie de consommer moins que #CONSUMPTION € dans les #DURATION prochains jours", "duration": { "days": 28 } } diff --git a/src/db/explorationEntity.json b/src/db/explorationEntity.json index 7261e7650432ac1b8446e75f32e4ac535f231dc1..218d3a5e4adb4e9188949387e3b0703c8a08872d 100644 --- a/src/db/explorationEntity.json +++ b/src/db/explorationEntity.json @@ -9,19 +9,19 @@ "date": null, "ecogesture_id": "", "fluid_condition": [], - "message_success": "Vous avez complété votre profil. Vous bénéficierez d'une analyse de vos consommations davantage personnalisée et d'un nouveau mode de tri des écogestes." + "message_success": "Vous avez complété votre profil. Vous bénéficierez d'une analyse de vos consommations davantage personnalisée et d'un nouveau mode de tri des astuces." }, { "_id": "EXPLORATION002", "state": 0, - "description": "Consultez l'écogeste Professeur Celsius pour remporter 5 étoiles.", + "description": "Consultez l'astuce Professeur Celsius pour remporter 5 étoiles.", "complementary_description": "", "target": 1, "type": 3, "date": null, "ecogesture_id": "ECOGESTURE0037", "fluid_condition": [], - "message_success": "Vous avez consulté l'écogestes Professeur Celsius et être prêts pour adopter de bons comportements en hiver." + "message_success": "Vous avez consulté l'astuce Professeur Celsius et être prêts pour adopter de bons comportements en hiver." }, { "_id": "EXPLORATION003", @@ -38,8 +38,8 @@ { "_id": "EXPLORATION004", "state": 0, - "description": "Dévérouillez la consultation des données électricité à la demi-heure pour remporter 5 étoiles.", - "complementary_description": "Si c'est est déjà fait, allez simplement consulter ces données.", + "description": "Consultez vos données électriques au pas de temps demi-heure.", + "complementary_description": "", "target": 1, "type": 1, "date": null, @@ -50,14 +50,14 @@ { "_id": "EXPLORATION004_0", "state": 0, - "description": "Consultez l'écogestes Lord Kelvin pour remporter 5 étoiles.", + "description": "Consultez l'astuce Lord Kelvin pour remporter 5 étoiles.", "complementary_description": "", "target": 1, "type": 3, "date": null, "ecogesture_id": "ECOGESTURE0031", "fluid_condition": [], - "message_success": "Vous avez consulté l'écogeste Professeur Kelvin et êtes prêts à adopter des bonnes pratiques en hiver." + "message_success": "Vous avez consulté l'astuce Professeur Kelvin et êtes prêts à adopter des bonnes pratiques en hiver." }, { "_id": "EXPLORATION005", diff --git a/src/doctypes/remote/org.ecolyo.agent.custom.popup.ts b/src/doctypes/remote/org.ecolyo.agent.custom.popup.ts new file mode 100644 index 0000000000000000000000000000000000000000..093dbc23b6da2063202b9b511ce3ca665e81fe4b --- /dev/null +++ b/src/doctypes/remote/org.ecolyo.agent.custom.popup.ts @@ -0,0 +1,4 @@ +export const REMOTE_ORG_ECOLYO_AGENT_CUSTOM_POPUP = + '/remote/org.ecolyo.agent.custom.popup' +export const REMOTE_ORG_ECOLYO_AGENT_CUSTOM_POPUP_REC = + '/remote/org.ecolyo.agent.custom.popup.rec' diff --git a/src/doctypes/remote/org.ecolyo.agent.partners.info.ts b/src/doctypes/remote/org.ecolyo.agent.partners.info.ts new file mode 100644 index 0000000000000000000000000000000000000000..b3b3be25a55d4bbfacd278ac0a44be25f561a13b --- /dev/null +++ b/src/doctypes/remote/org.ecolyo.agent.partners.info.ts @@ -0,0 +1,4 @@ +export const REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO = + '/remote/org.ecolyo.agent.partners.info' +export const REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC = + '/remote/org.ecolyo.agent.partners.info.rec' diff --git a/src/doctypes/remote/org.ecolyo.agent.prices.ts b/src/doctypes/remote/org.ecolyo.agent.prices.ts new file mode 100644 index 0000000000000000000000000000000000000000..e58bf65a636aea17c8eed022e4b7657ce6399d88 --- /dev/null +++ b/src/doctypes/remote/org.ecolyo.agent.prices.ts @@ -0,0 +1,3 @@ +export const REMOTE_ORG_ECOLYO_AGENT_PRICES = '/remote/org.ecolyo.agent.prices' +export const REMOTE_ORG_ECOLYO_AGENT_PRICES_REC = + '/remote/org.ecolyo.agent.prices.rec' diff --git a/src/doctypes/remote/org.ecolyo.agent.ts b/src/doctypes/remote/org.ecolyo.agent.ts new file mode 100644 index 0000000000000000000000000000000000000000..42e36a0ca6a80dfbf84d0a747d80e60c2744f302 --- /dev/null +++ b/src/doctypes/remote/org.ecolyo.agent.ts @@ -0,0 +1,2 @@ +export const REMOTE_ORG_ECOLYO_AGENT = '/remote/org.ecolyo.agent' +export const REMOTE_ORG_ECOLYO_AGENT_REC = '/remote/org.ecolyo.agent.rec' diff --git a/src/enum/fluidSlug.enum.ts b/src/enum/fluidSlug.enum.ts index 33db5dcd220a3fba1853921169d00c72e481b614..6f9ec91414be1866c7d071a6e02e880c5d07c36f 100644 --- a/src/enum/fluidSlug.enum.ts +++ b/src/enum/fluidSlug.enum.ts @@ -1,5 +1,5 @@ export enum FluidSlugType { - ELECTRICITY = 'enedisgrandlyon', + ELECTRICITY = 'enedissgegrandlyon', WATER = 'eglgrandlyon', GAS = 'grdfgrandlyon', } diff --git a/src/enum/konnectorError.enum.ts b/src/enum/konnectorError.enum.ts new file mode 100644 index 0000000000000000000000000000000000000000..17411d2a0e1933974511cc809049cd73329631f8 --- /dev/null +++ b/src/enum/konnectorError.enum.ts @@ -0,0 +1,7 @@ +export enum KonnectorError { + LOGIN_FAILED = 'LOGIN_FAILED', + USER_ACTION_NEEDED = 'USER_ACTION_NEEDED', + TERMS_VERSION_MISMATCH = 'TERMS_VERSION_MISMATCH', + UNKNOWN_ERROR = 'UNKNOWN_ERROR', + CRITICAL = 'exit status 1', +} diff --git a/src/enum/sgeStep.enum.ts b/src/enum/sgeStep.enum.ts new file mode 100644 index 0000000000000000000000000000000000000000..393a577799812b4824c8245511559f6ae0d8e30d --- /dev/null +++ b/src/enum/sgeStep.enum.ts @@ -0,0 +1,5 @@ +export enum SgeStep { + IdentityAndPDL, + Address, + Consent, +} diff --git a/src/locales/fr.json b/src/locales/fr.json index 3388e838944e6fcda861a5bbfdae63b34709061c..55c1acf179684751c2c212106ddfb0741df88a08 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -6,22 +6,22 @@ "title_exploration": "Exploration", "title_action": "Action", "title_duel": "Duel final", - "title_ecogesture": "Écogeste", - "title_ecogestures": "Écogestes", - "title_ecogestures_choice": "Choix des écogestes", + "title_ecogesture": "Astuce", + "title_ecogestures": "Astuces", + "title_ecogestures_choice": "Sélection des astuces", "title_options": "Options", "title_analysis": "Analyse", "title_profiletype": "Ajuster mon profil", - "title_faq": "FAQ", "title_legal_notice": "Mentions légales", "title_gcu": "CGU", + "title_sge_connect": "Connexion à l'électricité", "accessibility": { "loading": "Chargement" } }, "FLUID": { "ELECTRICITY": { - "NAME": "Electricité", + "NAME": "Électricité", "LABEL": "Électricité", "UNIT": "kWh", "ADD": "Ajouter l'électricité", @@ -54,11 +54,11 @@ "duration": "Durée : %{smart_count} jours", "result": "Résultat", "finished": "Défi terminé !", - "details": "Détail de l'écogeste", + "details": "Détail de l'astuce", "apply": "J'applique cette action", "other": "Je choisis une autre action", "resultText1": "Cela n'a pas été trop difficile ?", - "resultText2": "Jetez un coup d'Å“il dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre écogeste.", + "resultText2": "Jetez un coup d'Å“il dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.", "resultText3": "Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.", "resultText4": "Dans tous les cas, bravo, vous remportez...", "ok": "Ok" @@ -79,7 +79,7 @@ "challenge": "Défis terminés en", "user_consumption": "Votre conso", "average_home": "Conso moyenne d'un profil similaire", - "ideal_home": "Conso idéale pour votre profil", + "average_home_description": "Le comparatif ici présenté est calculé sur la base d'un profil similaire au vôtre. Il s'agit d'un calcul et non d'une comparaison avec les autres utilisateurs de l'application. Sont pris en compte l'ensemble des informations entrées dans votre profil\u00a0: mode de chauffage, âge du logement et éventuels travaux de rénovation, etc. Ce modèle a été créé avec l'Agence Locale de l'Energie sur la base de chiffres issues du Schéma Directeur des Energies de la Métropole de Lyon et de Chiffres-clé publiés par l'ADEME (l'Agence de l'Environnement et de la Maîtrise de l'Energie).", "approximative_description": "Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil", "not_connected": "Non connecté", "no_data_2": "Données non disponibles", @@ -131,31 +131,46 @@ "text1": "Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.", "text2": "Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).", "text3": "C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.", - "text4": "Vous avez choisi une puissance maximum dans votre offre d’éléctricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. ", + "text4": "Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. ", "text5": "Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage." }, "auth": { - "enedisgrandlyon": { - "connect": { - "label1": "Je me connecte à mon", - "label2": "compte Enedis" + "enedissgegrandlyon": { + "title": "Ecolyo doit se connecter à l’électricité", + "bill": "Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion", + "connect": "Je me connecte à l'électricité", + "accessibility": { + "connect": "Se connecter" }, - "no_account": { - "title": "Ecolyo doit se connecter à votre compte Enedis", - "subtitle1": "Si vous n’avez pas de compte Enedis", - "button_create_account": "Je crée mon compte Enedis", - "subtitle2": "Si vous avez déjà un compte Enedis,", - "subtitle2_info": "votre accord est nécessaire pour connecter Enedis et Ecolyo", - "info": "Enedis est responsable de votre compteur Linky et en charge de relever vos consommations." + "identityTitle": "Nom inscrit sur la facture", + "firstName": "Prénom", + "lastName": "Nom", + "pdlTitle": "Numéro de votre compteur électrique (PDL)", + "pdlLabel": "N° (14 chiffres)", + "pdlHint": "Où trouver le n° de PDL\u00a0?", + "pdlModal": { + "txt1": "Où trouver le n° de PDL ou PRM ?", + "txt2": "Le numéro de PDL ou PRM se compose de 14 chiffres.", + "txt3": "Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.", + "txt4": "Si vous avez un compteur Linky, appuyez sur le bouton “+†et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :" }, - "title_with_account": "Votre compte Enedis a bien été créé ?", - "with_account": { - "title": "Votre compte Enedis a bien été créé ?", - "subtitle1": "Plus qu’à donner votre accord pour connecter Enedis et Ecolyo !", - "subtitle2": "Si vous n’avez pas de compte Enedis", - "button_create_account": "Je crée mon compte", - "subtitle2_info": "En cas de soucis pour créer votre compte ou pour vous y connecter, un guide en pas-à -pas est disponible pour vous y aider.", - "button_goto_guide": "Voir le guide" + "addressTitle": "Adresse du titulaire", + "address": "Numéro et voie", + "zipCode": "Code postal", + "city": "Ville", + "headConsent": "Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.", + "textConsent": "Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes\u00a0: ", + "consentLi1": "L'historique et le relevé de vos consommations quotidiennes en kWh", + "consentLi2": "L'historique et le relevé de vos consommations au pas de temps 30 minutes", + "consentLi3": "Les puissances maximales atteintes quotidiennement", + "consentLi4": "Les données contractuelles (début de contrat et puissance souscrite)", + "consentCheck1": "Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un\u00a0an</span>", + "consentCheck2": "J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente", + "modalHint": { + "accessibility": "Titre de la modale", + "title": "Où trouver le n° de PDL\u00a0?", + "button": "J'ai compris", + "button-accessibility": "Bouton valider" } }, "grdfgrandlyon": { @@ -222,7 +237,7 @@ "duelDone": "du duel final" }, "locked": { - "desc": "À débloquer en terminant le challenge précédent" + "desc": "À débloquer en terminant le défi précédent" } }, "card_done": { @@ -234,16 +249,15 @@ "final_defi_view": "Revoir le duel final" }, "card_last": { - "title": " Tous les défis ont été terminés", + "title": "Tous les défis sont terminés", "message1": "Nous travaillons actuellement à vous proposer de nouveaux défis.", - "message2": "Vous pouvez donner votre avis sur ce que vous aimeriez", "button": "Suggérer une idée de défi" }, "card_unlocked": { - "button_launch": "Lancer le challenge" + "button_launch": "Lancer le défi" }, "accessibility": { - "button_launch": "Lancer le challenge", + "button_launch": "Lancer le défi", "button_goto_konnector": "Aller aux connecteurs", "button_slider_previous": "Précédent", "button_slider_next": "Suivant" @@ -269,9 +283,10 @@ }, "partners_issue_modal": { "title": "Un problème dans la récupération de vos données", - "text_1": "Ces partenaires nous indiquent qu’ils subissent en ce moment un soucis technique :", + "text_1": "Ces partenaires nous indiquent qu’ils subissent en ce moment un soucis technique\u00a0:", "text_2": "La visualisation de vos consommations peut s’en trouver affectée.", - "button_validate": "J'ai compris" + "button_validate": "J'ai compris", + "ok": "Ok" } }, "consumption_details": { @@ -293,7 +308,7 @@ "dataModal": { "list_title": "3 raisons possibles :", "item1": "le lien entre Ecolyo et le fournisseur de données est rompu : une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.", - "item2": "un problème technique chez votre gestionnaire : se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.", + "item2": "un problème technique chez votre gestionnaire\u00a0: se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.", "item3": "vous n'aviez tout simplement pas de compteur communicant à l'époque !" }, "modal": { @@ -309,8 +324,8 @@ }, "release_notes_modal": { "title": "Du nouveau sur Ecolyo !", - "message": "Les mises à jour suivantes ont été effectuées sur votre application :", - "go_back": "Retour", + "message": "Les mises à jour suivantes ont été effectuées sur votre application\u00a0:", + "go_back": "J'ai compris", "accessibility": { "window_title": "Fenêtre de notifications", "button_go_back": "J'ai compris" @@ -354,10 +369,10 @@ } }, "last_duel_modal": { - "title": "Félicitations !", - "subtitle": "Vous avez terminé tous les défis !", - "message1": "Nous travaillons actuellement à vous proposer de nouveaux défis.", - "message2": "Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle jaune." + "title": "Félicitations !", + "subtitle": "Vous avez terminé tous les défis !", + "message1": "Nous travaillons actuellement à vous proposer de nouveaux défis.", + "message2": "Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle jaune." }, "duel_empty_value_modal": { "title": "Oups !", @@ -371,7 +386,7 @@ "ecogesture": { "title_tab_0": "Objectifs", "title_tab_1": "Je fais déjà ", - "title_tab_2": "Tous", + "title_tab_2": "Toutes", "MENU_TITLE": "Filtrer", "ALL": "Tous les usages", "HEATING": "Chauffage", @@ -380,69 +395,69 @@ "COLD_WATER": "Eau froide", "ELECTRICITY_SPECIFIC": "Électricité courante", "COOKING": "Cuisson", - "selection": "Sélectionner les écogestes les plus adaptés à votre consommation", - "selection_2": "vus sur", + "selection": "Sélectionner les astuces les plus adaptées à votre consommation", + "selection_2": "vues sur", "button_selection": "Continuer ma sélection", - "no_ecogesture": "Aucun écogeste ne correspond à votre filtrage", + "no_ecogesture": "Aucune astuce ne correspond à votre filtrage", "no_ecogesture_filter": { - "text1": "Nous n'avons pas trouvé d'écogestes adaptés à votre profil dans cette catégorie.", - "text2": "En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d'éco-gestes vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \"Tous les écogestes\"." + "text1": "Nous n'avons pas trouvé d'astuces adaptées à votre profil dans cette catégorie.", + "text2": "En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d’astuces vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \"Toutes les astuces\"." }, "adjust_profil": { - "description": "Pour une sélection d’écogestes adaptée à votre consommation, vous pouvez ajuster votre profil.", + "description": "Pour une sélection d’astuces adaptée à votre consommation, vous pouvez ajuster votre profil.", "button_go_to_profil": "Ajuster mon profil" }, "accessibility": { "window_title": "Fenêtre d'information'", "button_go_to_profil": "Aller à la page de profil", - "button_close": "Fermer la fenetre", + "button_close": "Fermer la fenêtre", "button_selection": "Aller à la page de sélection" }, "doing": "Je fais déjà ", "objective": "Objectif", "emptyList": { - "obj1": "Les écogestes sont des actions qui vous permettent de réduire vos consommations et donc vos factures.", - "obj1_done": "Aucun écogeste n’est indiqué comme objectif actuellement.", + "obj1": "Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes.", + "obj1_done": "Aucune astuce n’a été sélectionnée comme objectif actuellement.", "obj2": "Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà .", - "obj2_done": "Vous pouvez consulter tous les écogestes et ajouter les gestes que vous souhaitez garder en objectif dans cette section.", - "doing1": "Aucun écogeste n’est indiqué comme déjà appliqué actuellement.", - "doing1_done": "Aucun écogeste n’est indiqué comme déjà appliqué actuellement.", - "doing2": "Vous pouvez consulter tous les écogestes et ajouter les gestes que vous mettez déjà en pratique dans cette section.", - "doing2_done": "Vous pouvez consulter tous les écogestes et ajouter les gestes que vous mettez déjà en pratique dans cette section.", - "btn1": "Voir tous les écogestes", + "obj2_done": "Vous pouvez consulter toutes les astuces et ajouter celles que vous souhaitez garder en objectif dans cette section.", + "doing1": "Aucune astuce n’a été sélectionnée dans la catégorie appliquée actuellement.", + "doing1_done": "Aucune astuce n’est indiquée comme déjà appliquée actuellement.", + "doing2": "Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.", + "doing2_done": "Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.", + "btn1": "Voir toutes les astuces", "btn2": "Sélectionner" }, "initModal": { - "title": "Sélectionner mes écogestes", - "text1": "Les écogestes sont des actions qui vous permettent de réduire vos consommations et donc vos factures.", - "text2": "Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà .", - "text3": "Afin de savoir quels écogestes correspondent à votre consommation, merci de répondre à quelques rapides questions.", + "title": "Sélectionner mes astuces", + "text1": "Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes ", + "text2": "Vous pouvez sélectionner celles à mettre en objectifs et celles que vous appliquez déjà .", + "text3": "Afin de pré-sélectionner les astuces correspondant à votre consommation, merci de répondre à quelques rapides questions.", "btn1": "Plus tard", "btn2": "C'est parti !" }, - "reinit": "Réinitialiser ma sélection d'écogestes", + "reinit": "Réinitialiser ma sélection", "reinitModal": { "title_part1": "Cette action", - "title_part2": "supprimera tous les écogestes", - "title_part3": "sélectionnés dans", + "title_part2": "supprimera votre liste d’astuces", + "title_part3": "sélectionnées dans", "title_part4": "“Objectifsâ€", "title_part5": "et", "title_part6": "“Je fais déjà â€", - "text1": "Vous pourrez ensuite faire une nouvelle sélection d’écogestes adaptés à votre consommation.", - "text2": "Souhaitez-vous réinitialiser votre sélection d’écogestes ?", + "text1": "Vous pourrez ensuite faire une nouvelle sélection adaptée à votre consommation.", + "text2": "Souhaitez-vous réinitialiser votre sélection d’astuces\u00a0?", "btn1": "Non", "btn2": "Réinitialiser" } }, "ecogesture_modal": { - "title_ecogesture": "Écogeste", + "title_ecogesture": "Astuce", "title_action": "Action", "efficiency": "Efficacité", "show_less": "Voir moins d’infos", "show_more": "Voir plus d’infos", "select_action": "Je choisis cette action", "accessibility": { - "window_title_ecogesture": "Fenêtre ecogeste", + "window_title_ecogesture": "Fenêtre astuce", "window_title_action": "Fenêtre action", "button_close": "Fermer la fenêtre", "button_select_action": "Sélectionner cette action", @@ -450,8 +465,8 @@ } }, "ecogesture_info_modal": { - "header": "Comment sont choisis les écogestes adaptés à mon profil ?", - "text": "Les écogestes adaptés à votre profil sont aujourd'hui choisis en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.", + "header": "Comment sont choisis les astuces adaptées à mon profil\u00a0?", + "text": "Les astuces adaptés à votre profil sont aujourd'hui choisies en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.", "button_close": "J'ai compris", "accessibility": { "window_title": "Fenêtre d'information", @@ -467,7 +482,7 @@ }, "warming_fluid": { "title": "Source chauffage", - "question": "Quelle source d’énergie principale utilisez-vous pour votre chauffage ?", + "question": "Quelle source d’énergie principale utilisez-vous pour votre chauffage\u00a0?", "0": "Électricité", "2": "Gaz", "3": "Bois", @@ -475,14 +490,14 @@ }, "hot_water_type": { "title": "Eau chaude", - "question": "Quel est votre type de production d’eau chaude ?", + "question": "Quel est votre type de production d’eau chaude\u00a0?", "individual": "Individuelle", "collective": "Collective" } }, "ecogesture_profile": { "equipments": { - "question": "Quels équipements possédez-vous ?", + "question": "Quels équipements possédez-vous\u00a0?", "hint": "Plusieurs réponses possibles", "air_conditioning": "Climatisation", "computer": "Ordinateur", @@ -505,28 +520,28 @@ } }, "ecogesture_selection": { - "header": "Sélection des écogestes", - "title": "Vous avez parcouru un groupe de %{smart_count} écogestes", - "text": "Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard ?", + "header": "Sélection des astuces", + "title": "Vous avez parcouru un groupe de %{smart_count} astuces", + "text": "Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard\u00a0?", "title_final": "Félicitations !", - "text_final_1": "Vous avez terminé la sélection des écogestes adaptés à votre consommation.", + "text_final_1": "Vous avez terminé la sélection des astuces adaptées à votre consommation.", "text_final_2": "Vous pouvez les retrouver dans les sections “Objectifs†et “Je fais déjà †selon que vous les pratiquiez déjà ou non.", "button_go_to_ecogesture": "Plus tard", "button_ok": "J'ai compris", "button_continue": "Poursuivre", "button_objective": "Objectif", "button_doing": "Je fais déjà ", - "button_skip": "Pas interessé", + "button_skip": "Pas intéressé", "accessibility": { "window_title": "Fenêtre d'information'", - "button_close": "Fermer la fenetre", - "button_go_to_ecogesture": "Retourner aux ecogestes", + "button_close": "Fermer la fenêtre", + "button_go_to_ecogesture": "Retourner aux astuces", "button_continue": "Poursuivre", "button_ok": "Fermer la sélection" }, "selectionModal": { - "title": "Des écogestes correspondants à votre profil ont été trouvés !", - "text": "À vous de choisir ceux que vous souhaitez mettre en objectif et ceux que vous faites déjà .", + "title": "Des astuces correspondant à votre profil ont été trouvées\u00a0!", + "text": "À vous de choisir celles que vous souhaitez mettre en objectif et celles que vous faites déjà .", "button_close": "C'est parti !" } }, @@ -554,39 +569,20 @@ "error_page": { "main": "Erreur", "back": "Retour", - "no_ecogesture": "Oups ! Nous n'avons pas trouvé l'écogeste demandé." + "no_ecogesture": "Oups ! Nous n'avons pas trouvé l'astuce demandée." }, - "faq": { - "title_faq": "Foire aux questions", - "read_faq": "Lire la FAQ", - "accessibility": { - "button_toggle_detail": "Afficher ou masquer le détail de la question" - } + + "help": { + "title_help": "Besoin d'aide ?", + "read_help": "Accéder au Service d'Assistance Utilisateur" }, "feedback": { - "title": "Partagez-nous vos retours", - "type": "Motif du retour :", - "suggest_faq": "Avez-vous pensé à consulter la ", - "description": "Description :", - "description_placeholder": "Vos remarques", - "send": "Envoyer", - "ok": "Ok", - "type_bug": "Bug", - "type_idea": "Idée", - "type_other": "Autre", - "success_sending": "Nous vous remercions pour votre retour.", - "warning": "Attention !", - "error_empty_description": "Le champ de description est vide.", - "error_sending": "Erreur lors de l'envoi, veuillez essayer ultérieurement.", - "upload": "Joindre une image", - "imageLabel": "Image :", + "title": "Vous allez contacter le Service Assistance Utilisateur du Grand Lyon.", + "subtitle": "Pas de panique, c'est bien l'équipe Ecolyo qui traitera votre demande !", + "later": "Plus tard", + "lets_go": "J'y vais", "accessibility": { "window_title": "Fenêtre de partage de retours", - "select_type_bug": "Sélectionner le motif bug", - "select_type_idea": "Sélectionner le motif idée", - "select_type_other": "Sélectionner le motif autre", - "button_send": "Envoyer le retour", - "button_ok": "Valider", "button_close": "Fermer la fenêtre de partage de retours" } }, @@ -596,17 +592,17 @@ "title2Update": "Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.", "part1": "Pour le bon fonctionnement du service, nous avons besoin de l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon.", "part2": "Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.", - "part3": "La Métropole de Lyon utilisera cet email afin de vous tenir informé·e :", + "part3": "La Métropole de Lyon utilisera cet email afin de vous tenir informé·e\u00a0:", "item1": "En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.", "item2": "En cas de problème majeur avec la gestion de votre compte.", "item3": "De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.", "part4": "Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole de Lyon sur leur contenu.", - "part5": "Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu. ", - "part6": "Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service.", + "part5": "Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elle conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.", + "part6": "Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.", "part7": "Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.", "part8": "Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :", "part9": "Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ", - "part10": "ou en ligne, au moyen du formulaire disponible à l'adresse suivante : ", + "part10": "ou en ligne, au moyen du formulaire disponible à l'adresse suivante\u00a0: ", "link1": "<a href=\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>", "validDataConsent": "Je consens au traitement de mes données tel que décrit ci-dessus.", "validCGU": "Je valide les <span class=\"action\">Conditions Générales d’Utilisation</span> ", @@ -623,47 +619,47 @@ "gcu": { "title": "Conditions générales d’utilisation du service", "subtitle": "Envie de prendre le temps de relire ces CGU ces Conditions Générales d’Utilisation plus tard ? Vous pourrez les retrouver dans la page Options du service.", - "version": "3.0 du 27.06.2022", + "version": "Version du 12.12.2022", "content": { "title1": "Ecolyo, késako ?", - "part1_1": "Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des éco-gestes vous sont aussi proposés afin de vous permettre de réduire vos consommations.", + "part1_1": "Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.", "part1_2": "C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à -dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.", "part1_3": "Tous les termes « techniques » sont définis en bas de page.", "title2": "Quelles fonctionnalités le service propose-t-il ?", "part2_1": "La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).", - "part2_2": "Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages : ", + "part2_2": "Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages\u00a0: ", "part2_2_list1": "Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.", - "part2_2_list2": "Écogestes : Une liste d’écogestes à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.", + "part2_2_list2": "Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.", "part2_2_list3": "Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.", - "part2_3": "Pour la page Analyse ainsi que pour la partie personnalisation des éco-gestes, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.", - "part2_4": "Dernière page : la page Options dans laquelle vous pourrez retrouver les connecteurs - services vous permettant d’aller récupérer vos données d’électricité, de gaz et d’eau - , une foire aux questions, et de quoi ajuster votre profil.", + "part2_3": "Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.", + "part2_4": "Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.", "title3": "Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?", "part3_1": "Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).", "part3_2": "Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau du Grand Lyon.", - "part3_3": "Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines ! Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois ! Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.", - "part3_4": "Il vous faudra donc avoir un compte chez Enedis, GRDF et Eau du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.", + "part3_3": "Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.", + "part3_4": "Il vous faudra donc avoir un compte chez GRDF et Eau du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.", "title4": "Ecolyo se trouve dans un cloud personnel Grand Lyon, qu’est-ce que cela signifie ?", "part4_1": "Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cloud Personnel Grand Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maitrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.", "part4_2": "Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\">ici</a>.", "title5": "Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?", - "part5_1": "Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos connecteurs dans la page Options. À ce moment-là , et à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour les données électriques (chez Enedis), elle est par défaut de 6 mois. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale).", - "part5_2": "Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de cette donnée se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.", + "part5_1": "Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là , pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement\u00a0? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.", + "part5_2": "Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.", "part5_3": "Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : ", - "part5_3_list1": "Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la Page Options.", - "part5_3_list2": "Attention : lors de la désinstallation du connecteur qui collecte vos données au sein du cloud, celui-ci ne va plus aller chercher vos données. Par contre, votre consentement chez le partenaire fournisseur est toujours actif jusqu’à votre révocation de consentement auprès de ce dernier. Pour révoquer votre consentement, il vous faudra contacter ou agir directement chez le partenaire en question : Enedis pour l’électricité ou GRDF pour le gaz. Pour l’électricité, vous pouvez peut supprimer votre consentement à partager vos données en écrivant directement à dataconnect(at)enedis.fr. Pour le gaz, il vous faudra vous connecter à <a href=\"https://monespace.grdf.fr/monespace/connexion\">votre espace GRDF</a> et supprimer le consentement donné à la Métropole de Lyon dans la partie « Suivi de Consommations » puis « Données Consultées ». Au terme de la durée initiale de validité du consentement de 6 mois ou de la durée que vous aurez définie librement, votre consentement sera considéré comme révolu. Tout nouveau transfert de données sera donc soumis à nouveau au recueil préalable de votre consentement.", - "part5_3_list3": "Pour supprimer l’ensemble de vos données ainsi que votre espace personnel Grand Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.", + "part5_3_list1": "Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).", + "part5_3_list2": "Pour supprimer l’ensemble de vos données ainsi que votre espace personnel Grand Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.", "part5_4": "Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.", - "part5_5": "Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau du Grand Lyon, un jeton d’identification Enedis et/ou GRDF ainsi que vos numéros de compteurs sont stockés dans votre cloud personnel – sans droit de regard de la Métropole de Lyon.", + "part5_5": "Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.", "title6": "Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?", "part6_1": "Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Grand Lyon.", "part6_2": "Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.", - "part6_3": "La Métropole de Lyon n’a accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon. Elle utilise cet email afin de vous tenir informé·e :", + "part6_3": "La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon. Elle utilise cet email afin de vous tenir informé·e :", "part6_3_list1": "En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. ", "part6_3_list2": "En cas de problème majeur avec la gestion de votre compte.", "part6_3_list3": "De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.", - "part6_4": "Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.", + "part6_4": "Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.", + "part6_5": "Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.", "title8": "Encore des questions ?", - "part8_1": "N’hésitez pas à consulter la FAQ présente dans le service (page Options) ou à nous contacter via le formulaire de contact (la petite bulle jaune) présente sur l’ensemble des pages.", + "part8_1": "N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.", "part8_2": "Dernière option, contactez-nous directement à <a href=\"mailto:ecolyo@grandlyon.com\">ecolyo(at)grandlyon.com</a>.", "title9": "LEXIQUE", "part9_1_title": "Cloud personnel Grand Lyon : ", @@ -737,6 +733,7 @@ "konnector_modal": { "loading_data": "Veuillez patienter, vos données sont en cours de chargement.", "loading_data_update": "Veuillez patienter, vos données sont en cours de mise à jour.", + "logging_txt": "Nous vérifions vos informations d'identité", "success_txt": "Félicitations !", "success_data_electricity": "Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.", "success_data_water": "Vos données de consommation d'eau sont maintenant connectées à Ecolyo.", @@ -745,18 +742,30 @@ "success_data_update_water": "Vos données de consommation d'eau sont maintenant à jour dans Ecolyo.", "success_data_update_gas": "Vos données de consommation de gaz sont maintenant à jour dans Ecolyo.", "error_txt": "Aïe !", + "mismatch": { + "title": "Vos données n'ont pas pu être récupérées.", + "text1": "Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.", + "text2": "Reconfigurer mon connecteur ?", + "text3": "La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées." + }, "error_data_electricity": "Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.", "error_data_water": "Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.", "error_credentials_water": "Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).", + "error_credentials_electricity": "Il semblerait que les nom(s) et adresse ne concordent pas avec le numéro de votre compteur.", + "error_credentials_electricity_2": "Nous ne pouvons vous donner accès aux données de consommation.", "error_credentials_update_water": "Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.", "error_credentials_update_electricity": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", "error_credentials_update_gas": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", - "error_data_gas": "Un problème est survenu. Vos données de consommmation de gaz ne seront pas chargées.", + "error_data_gas": "Un problème est survenu. Vos données de consommation de gaz ne seront pas chargées.", "error_data_update_electricity": "Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.", "error_data_update_water": "Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.", "error_data_update_gas": "Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.", "error_data_2": "Merci de réessayer plus tard.", "button_validate": "Ok", + "button_understood": "J'ai compris", + "button_come_back_later": "Revenir plus tard", + "show_common_error": "Voir les erreurs récurrentes", + "show_common_error_list": "<span style=\"text-align:left; font-weight:700;\">Le problème peut provenir des cas suivants :</span> <ul style=\"text-align:left;\"><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span style=\"color:#E3B82A; font-weight:700;\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li> Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li> Avez-vous bien entré le <span style=\"color:#E3B82A; font-weight:700;\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p style=\"text-align:center; font-style: italic; font-weight:400; font-size: 0.9rem;\">Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div style=\"text-align:center; font-weight:700;\">Avez-vous pensez à vérifier ces informations ?</div>", "accessibility": { "window_title": "Fenêtre d'attente de connexion", "button_close": "Fermer la fenêtre" @@ -772,11 +781,13 @@ "2": "Veuillez re-donner votre accord pour que GRDF nous transmette vos données de consommation." }, "text2": { - "0": "Voulez-vous donner votre accord sur votre compte ENEDIS maintenant ?", + "0": "Souhaitez-vous renouveler votre accord dès maintenant pour un an ?", "2": "Voulez-vous donner votre accord sur votre compte GRDF maintenant ?" }, "later": "Plus tard", - "go": "J'y vais" + "go": "J'y vais", + "no": "Non", + "yes": "Oui" }, "delete_grdf_modal": { "text1": "La suppression de la connexion avec GRDF s’accompagne de la suppression de votre consentement à partager vos données gaz avec Ecolyo.", @@ -787,8 +798,8 @@ }, "legal": { "read_legal": "Lire les mentions légales", - "title_legal": "Mentions légales", - "version": "V3.0 du 27.06.2022", + "title_legal": "Mentions légales & CGU", + "version": "Version du 12.12.2022", "site": "Site du service Ecolyo : <a href=\"https://ecolyo.com/\"> https://ecolyo.com/</a>", "adress": "Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03", "phone": "Tél : (33) 4 78 63 40 40", @@ -800,32 +811,34 @@ "p3b": "Photographies : ", "p3": "sauf mention contraire, les photos sont la propriété de la Métropole de Lyon", "p4b": "Conception et Charte graphique : ", - "p4": "Florent Dufier - <a href=\"https://florentdufier.myportfolio.com/\">https://florentdufier.myportfolio.com/</a>", + "p4": "Florent Dufier", "p5b": "Réalisation technique : ", "p5": "Métropole de Lyon, Sopra Steria", "p6b": "Maintenance technique : ", "p6": "Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques", "title1": "Crédits", - "part1": "Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, eslint-config-cozy-app, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-lottie, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les biliothèques et frameworks libres suivants: enzyme, enzyme-adapter-react-16, jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, Sonarqube.", + "part1": "Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, eslint-config-cozy-app, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: enzyme, enzyme-adapter-react-16, jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.", "title2": "Traitement des données personnelles et droit d’accès, de modification et de suppression", "part2": "Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : ", - "part2-1": "Les partenaires du service Ecolyo – Enedis, GRDF et Eau du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de l’usager et à leur transmission sur la plateforme de cloud personnel, après consentement de l’usager ;", - "part2-2": "La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : ", - "part2-2-1": "Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;", - "part2-2-2": "Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.", - "part2-2-3": "Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.", - "part2-2-4": "Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\"https://ecolyo.com/cloud_statistiques.html\">ici</a>).", - "part2-2-5": "La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.", - "part2-3": "L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.", - "part2-4": "L’utilisateur est donc le seul à accéder :", - "part2-4-1": "À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.", - "part2-4-2": "À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.", - "part2-4-3": "À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.", - "part2-5": "Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\">aux mentions légales et CGU du cloud personnel métropolitain.</a> ", - "part2-6": "Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données auprès d’Enedis et de GRDF.", - "part2-7": "Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :", - "part2-8": "Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>", - "part2-9": "L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».", + "part2-1": "Les partenaires du service GRDF et Eau du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.", + "part2-2": "Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.", + "part2-3": "La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : ", + "part2-3-1": "Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;", + "part2-3-2": "Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;", + "part2-3-3": "Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.", + "part2-3-4": "Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.", + "part2-3-5": "Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\"https://ecolyo.com/cloud_statistiques.html\">ici</a>).", + "part2-4": "La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.", + "part2-5": "L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.", + "part2-6": "L’utilisateur est donc le seul à accéder :", + "part2-6-1": "À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.", + "part2-6-2": "À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.", + "part2-6-3": "À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.", + "part2-7": "Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\">aux mentions légales et CGU du cloud personnel métropolitain.</a> ", + "part2-8": "Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.", + "part2-9": "Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :", + "part2-10": "Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>", + "part2-11": "L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».", "title3": "Dispositions légales", "part3-1": "Les divers éléments du site web (la forme, la mise en page, le fonds, la structure …) sont protégés par le droit des dessins et modèles, le droit d’auteur, le droit des marques ainsi que le droit à l’image et ils ne peuvent être copiés ou imités en tout ou partie sauf autorisation expresse de la Métropole de Lyon.", "part3-2": "Toute personne ne respectant pas les dispositions légales applicables se rend coupable du délit de contrefaçon et est passible des sanctions pénales prévues par la loi.", @@ -852,7 +865,7 @@ "navigation": { "consumption": "Conso", "challenges": "Défis", - "ecogestures": "Écogestes", + "ecogestures": "Astuces", "options": "Options", "analysis": "Analyse" }, @@ -865,7 +878,7 @@ "welcomeModal": { "title": "Vous êtes à mi-chemin !", "part1": "Votre cloud personnel a bien été créé.", - "part2": "Il vous faut maintenant créer ou vous connecter à votre compte chez le gestionnaire de votre compteur communicant afin de donner votre accord pour relier Ecolyo à l’électricité (Enedis), au gaz (GRDF) ou à l’eau (Eau du Grand Lyon).", + "part2": "Il vous faut maintenant donner votre accord pour connecter vos compteurs au service.", "button_valid": "Ok", "accessibility": { "window_title": "Fenêtre de bienvenue", @@ -893,21 +906,6 @@ } }, "partner_connection_steps": { - "electricity": { - "step1": { - "info1": "Munissez-vous d’une <span>facture d’électricité</span> et d’un zeste de patience.", - "info2": "" - }, - "step2": { - "info1": "Si le contrat d’électricité est à votre nom, privilégiez l’identification <span>France connect.</span>", - "info2": "Sinon, munissez-vous de la <span>pièce d’identité du titulaire du contrat.</span>" - }, - "step3": { - "info1": "Une fois votre compte créé, <span>revenez sur Ecolyo</span> pour finaliser la connexion.", - "info2": "" - }, - "button_validate": "Aller sur Enedis" - }, "water": { "step1": { "info1": "Munissez-vous d’une <span>facture d'eau</span> et d’un zeste de patience.", @@ -935,7 +933,7 @@ "accessibility": { "window_title": "Fenêtre d'information sur la création de compte.", "button_validate": "Aller sur le site du partenaire.", - "button_close": "Fermer la fenètre.", + "button_close": "Fermer la fenêtre.", "button_previous": "Précédent", "button_next": "Suivant" } @@ -956,11 +954,11 @@ "profile": { "report": { "title_alert": "Alerte fuite d'eau", - "title_bilan": "Bilan et conseils", + "title_bilan": "Notification par mail", "switch_label_bilan": "Je reçois la lettre mensuelle contenant un bilan et des conseils sur ma consommation.", "switch_label_alert": "Être prévenu d’un dépassement anormal de ma consommation d’eau", "input_label_alert": "Si ma consommation d’eau quotidienne dépasse :", - "input_label_subtext_alert": "(Votre consommation quotidienne maximum sur les 6 derniers mois : ", + "input_label_subtext_alert": "Votre consommation quotidienne maximum sur les 6 derniers mois\u00a0: ", "activate": "Activer", "deactivate": "Désactiver" }, @@ -971,10 +969,10 @@ } }, "profile_type": { - "title_profile": "Profil de consommation", + "title_profile": "Mes données", "read_profile": "Ajuster mon profil", "button_update_profile": "J'ajuste mon profil", - "your_profile": "Votre profil", + "your_profile": "Mon profil", "multi_choices": "Plusieurs réponses possibles", "housing_type": { "title": "Logement", @@ -1055,7 +1053,7 @@ }, "ventilation": { "title": "Ventilation double flux", - "question": "Etes-vous équipé d'une ventilation double flux ?", + "question": "Êtes-vous équipé d'une ventilation double flux ?", "yes": "Oui", "no": "Non", "unknown": "Je ne sais pas", @@ -1063,7 +1061,7 @@ }, "heater_replacement": { "title": "Pompe à chaleur ou poêle à bois", - "question": "Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois ?", + "question": "Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois\u00a0?", "yes": "Oui", "no": "Non", "unknown": "Je ne sais pas", @@ -1134,8 +1132,8 @@ }, "finished": { "title": "Terminé !", - "label1": "Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage.", - "label2": "Nous pourrons aussi vous proposer des écogestes adaptés à votre profil.", + "label1": "Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage\u00a0!", + "label2": "Nous pourrons aussi vous proposer des astuces pour maîtriser vos consommations adaptées à votre profil.", "button_validate": "OK" }, "accessibility": { @@ -1144,9 +1142,44 @@ "button_previous": "Retour à la section précédente", "button_update_profile": "Ouvrir la page de mise à jour du profil", "button_toggle_detail_profile": "Afficher ou masquer le détail du profil", + "button_toggle_export": "Afficher ou masquer l'export des données'", + "button_toggle_average_home": "Afficher ou masquer les informations sur le comparatif'", "button_validate": "Valider" } }, + "export": { + "title_export": "Télécharger mes données", + "text1": "Vous allez télécharger l'historique mensuel de vos fluides sélectionnés", + "fluid_select": "Pour quel(s) fluide(s) souhaitez vous exporter vos données ?", + "no_data": "Vous n'avez aucune donnée de fluide...", + "button_download": "Télécharger", + "month": "Mois", + "year": "Année", + "consumption": "Consommation", + "button_close": "Fermer la fenêtre", + "modal_start": { + "accessibility_title": "Commencer le téléchargement", + "text1": "Vous allez télécharger des données personnelles, Ecolyo n’est plus responsable de celles-ci une fois téléchargées", + "text2": "Les données seront téléchargées sous forme de document excel (.xls)", + "text3": "Lancer le téléchargement\u00a0?", + "button_cancel": "Annuler" + }, + "modal_loading": { + "accessibility_title": "Téléchargement en cours", + "text1": "Données en cours de téléchargement", + "text2": "Veuillez ne pas quitter l’application pendant la récupération et le téléchargement de vos données", + "button_cancel": "Annuler le téléchargement" + }, + "modal_done": { + "accessibility_title": "Téléchargement terminé", + "text1": "Vos données ont bien été téléchargées !", + "text2": "Vous pouvez maintenant retrouver l’historique de vos données sur votre appareil", + "error1": "Aïe !", + "error2": "Il semblerait qu’une erreur se soit produite lors du téléchargement de vos données.", + "button_close": "Fermer", + "button_close_error": "Revenir plus tard" + } + }, "quiz": { "explanation": "Répondez correctement aux 5 questions et remportez 5 des 15 étoiles nécessaires pour débloquer le duel final", "score_final": "SCORE FINAL", @@ -1156,7 +1189,7 @@ "earn": "Vous remportez", "button_go_back": "Retour", "button_end_quiz": "Youpi !", - "button_try_again": "Rééssayer", + "button_try_again": "Réessayer", "button_validate": "Valider", "next": "Suivant", "consumption_question": "Question sur votre consommation", @@ -1171,7 +1204,7 @@ }, "splashscreen": { "error_loading": "Une erreur est survenue", - "button_reload": "Rééssayer", + "button_reload": "Réessayer", "accessibility": { "button_reload": "Recharger la page" }, @@ -1179,12 +1212,12 @@ "consent_error": "Vérification de vos consentements pour partager vos données avec Ecolyo", "profile_error": "Chargement de votre profil utilisateur", "profileType_error": "Chargement de votre profil de consommation.", - "ecogesture_error": "Chargement de vos écogestes", + "ecogesture_error": "Chargement des astuces de consommation", "challenges_error": "Actualisation de votre progression dans les défis", "analysis_error": "Chargement de votre analyse mensuelle", "index_error": "Chargement des index", "prices_error": "Mise à jour des prix", - "consos_error": "Test de la connexion à vos données de consommation", + "consos_error": "Connexion à vos données de consommation", "partners_error": "Récupération de l'état des services partenaires", "unknown_error": "Veuillez vérifier votre connexion internet", "network_error": "Erreur de réseau", @@ -1192,40 +1225,14 @@ "0": "Mise à jour de l'application", "1": "Vérification de vos consentements pour partager vos données avec Ecolyo", "2": "Chargement de votre profil", - "3": "Chargement de vos écogestes", + "3": "Chargement des astuces de consommations", "4": "Actualisation de votre progression dans les défis", "5": "Mise à jour des prix", - "6": "Test de la connexion à vos données de consommation" + "6": "Connexion à vos données de consommation" } }, "timestep": { "today": "Aujourd'hui", - "activate": { - "enedis": { - "consent_active": { - "title": "La visualisation par 1/2 heure n’est pas activée", - "info": "Pour les visualiser, il vous faut activer l’<span>enregistrement</span> de votre consommation horaire sur votre compte Enedis", - "label1": "Activer sur mon compte Enedis", - "accessibility": { - "button_activate": "Aller sur mon compte Enedis" - } - }, - "no_consent_active": { - "title": "La visualisation par 1/2 heure n’est pas activée", - "info": "Il semble que votre consentement ait expiré, il vous faut ré-activer l’enregistrement de votre consommation horaire sur votre compte Enedis", - "label1": "Ré-activer sur mon compte Enedis", - "accessibility": { - "button_activate": "Aller sur mon compte Enedis" - }, - "text_analysis": "Pour bénéficier d’une analyse approfondie de votre consommation électrique, il vous faut activer l’enregistrement de votre consommation horaire sur votre compte Enedis" - }, - "consent_activated": { - "title": "La récupération de vos données s’effectuera cette nuit.", - "title_2": "À demain !", - "info": "Si vous n’avez pas réussi à activer l'enregistrement de votre consommation horaire, vous pouvez ré-essayer." - } - } - }, "year": { "period": "5 ans", "comparelabel": "Comparer à l'année précédente" @@ -1244,7 +1251,10 @@ }, "half_an_hour": { "period": "Jour", - "comparelabel": "Comparer à la journée précédente" + "comparelabel": "Comparer à la journée précédente", + "gather_data_title": "La récupération de vos données demi-horaires prend environ 24h.", + "gather_data_subtitle": "Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\nÀ demain !", + "analysis_waiting_data": "Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A\u00a0bientôt\u00a0!" }, "accessibility": { "button_zoom_in": "Sélectionner le pas de temps précédent", @@ -1252,7 +1262,7 @@ } }, "unsubscribe": { - "title": "Etes-vous sûr de ne plus vouloir recevoir notre email mensuel ?", + "title": "Êtes-vous sûr de ne plus vouloir recevoir notre email mensuel ?", "content": "Dans ce cas, vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.", "button_text": "Oui, je me désabonne", "button_accessibility": "Bouton de désinscription" diff --git a/src/migrations/migration.data.ts b/src/migrations/migration.data.ts index d9ed8ddc31cc1717d55ed4f4fbe542693ece0831..62fa67e93d9445a8cf05988f2079321975815433 100644 --- a/src/migrations/migration.data.ts +++ b/src/migrations/migration.data.ts @@ -249,7 +249,7 @@ export const migrations: Migration[] = [ releaseNotes: null, docTypes: PROFILETYPE_DOCTYPE, run: async (_client: Client, docs: any[]): Promise<any[]> => { - function checkDate(d1, d2) { + function checkDate(d1: string, d2: string) { const dtd1: DateTime = DateTime.fromISO(d1) const dtd2: DateTime = DateTime.fromISO(d2) return dtd1.year === dtd2.year && dtd1.month === dtd2.month @@ -281,7 +281,7 @@ export const migrations: Migration[] = [ docTypes: FLUIDPRICES_DOCTYPE, isCreate: true, isDeprecated: true, - run: async (_client: Client, docs: any[]): Promise<any> => { + run: async (): Promise<any> => { return [] }, }, @@ -491,7 +491,7 @@ export const migrations: Migration[] = [ releaseNotes: null, docTypes: FLUIDPRICES_DOCTYPE, isDeprecated: true, - run: async (_client: Client, docs: any[]): Promise<any> => { + run: async (): Promise<any> => { return [] }, }, @@ -531,4 +531,20 @@ export const migrations: Migration[] = [ }) }, }, + { + baseSchemaVersion: 20, + targetSchemaVersion: 21, + appVersion: '2.0.0', + description: 'Inform user of the new SGE konnector', + releaseNotes: { + title: + "Le parcours d'accès aux données de consommation électrique évolue\u00a0!", + description: + "Pour continuer à accéder à vos données d'électricité, merci de vous reconnecter via ce nouveau parcours. Aucune donnée ne sera perdue, et vos données seront à nouveau mises à jour quotidiennement. <p>Pourquoi ce changement ?</p> Pour faciliter l'accès aux données de consommation au plus grand nombre. Plus besoin de se créer un compte Enedis, l'accès aux données en est facilité. N'hésitez pas à en parler autour de vous ! :)", + }, + redirectLink: '/consumption/electricity', + docTypes: '', + run: async (): Promise<any> => {}, + isEmpty: true, + }, ] diff --git a/src/migrations/migration.service.spec.ts b/src/migrations/migration.service.spec.ts index b7ec09378803f8ce99fa428ea2593ef361207ee5..7fe06c9f97f3428d9d696a64167737b0d08b6507 100644 --- a/src/migrations/migration.service.spec.ts +++ b/src/migrations/migration.service.spec.ts @@ -4,16 +4,29 @@ import mockClient from '../../tests/__mocks__/client' import { MigrationService } from './migration.service' import { Migration, MigrationResult } from './migration.type' import * as Migrate from './migration' -import { - MIGRATION_RESULT_COMPLETE, - MIGRATION_RESULT_FAILED, -} from './migration.data' +import { MIGRATION_RESULT_FAILED } from './migration.data' +import { Client, QueryResult } from 'cozy-client' +import { Notes } from 'models/releaseNotes.model' +import { Schema } from 'models/schema.models' const migrateSpy = jest.spyOn(Migrate, 'migrate') describe('Migration service', () => { - const ms = new MigrationService(mockClient) - - it('should run migrations', () => { + const ms = new MigrationService(mockClient, jest.fn()) + const releaseNotes: Notes = { + title: '', + description: '', + } + beforeEach(() => { + migrateSpy.mockClear() + }) + it('should run migrations', async () => { + const schema: Schema = { _id: '1', version: 0 } + const mockQueryResult: QueryResult<Schema[]> = { + data: [schema], + bookmark: '', + next: false, + skip: 0, + } const migrations: Migration[] = [ { baseSchemaVersion: 0, @@ -21,7 +34,8 @@ describe('Migration service', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, - run: (docs: any[]): Profile[] => { + releaseNotes: releaseNotes, + run: async (client: Client, docs: any[]): Promise<Profile[]> => { return docs.map(doc => { if (doc.mailToken) { delete doc.mailToken @@ -31,11 +45,19 @@ describe('Migration service', () => { }, }, ] - ms.runMigrations(migrations) + mockClient.query.mockResolvedValue(mockQueryResult) + await ms.runMigrations(migrations) expect(migrateSpy).toBeCalledTimes(1) }) - it('should run migrations with one fail', () => { + it('should run migrations with one fail', async () => { + const schema: Schema = { _id: '1', version: 0 } + const mockQueryResult: QueryResult<Schema[]> = { + data: [schema], + bookmark: '', + next: false, + skip: 0, + } const migrations: Migration[] = [ { baseSchemaVersion: 0, @@ -43,7 +65,8 @@ describe('Migration service', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, - run: (docs: any[]): Profile[] => { + releaseNotes: releaseNotes, + run: async (client: Client, docs: any[]): Promise<Profile[]> => { return [] }, }, @@ -53,12 +76,20 @@ describe('Migration service', () => { errors: [], } const migrateSpyOneFail = migrateSpy.mockResolvedValueOnce(result) - ms.runMigrations(migrations) + mockClient.query.mockResolvedValue(mockQueryResult) + + await ms.runMigrations(migrations) expect(migrateSpyOneFail).toBeCalledTimes(2) }) - it('should not run migrations with two fail', () => { - migrateSpy.mockClear() + it('should not run migrations with two fail', async () => { + const schema: Schema = { _id: '1', version: 0 } + const mockQueryResult: QueryResult<Schema[]> = { + data: [schema], + bookmark: '', + next: false, + skip: 0, + } const migrations: Migration[] = [ { baseSchemaVersion: 0, @@ -66,7 +97,8 @@ describe('Migration service', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, - run: (docs: any[]): Profile[] => { + releaseNotes: releaseNotes, + run: async (client: Client, docs: any[]): Promise<Profile[]> => { return [] }, }, @@ -75,17 +107,28 @@ describe('Migration service', () => { type: MIGRATION_RESULT_FAILED, errors: [], } + mockClient.query.mockResolvedValue(mockQueryResult) const migrateSpyTwoFailsKo = jest .spyOn(Migrate, 'migrate') .mockResolvedValueOnce(result) .mockResolvedValueOnce(result) - ms.runMigrations(migrations) - expect(migrateSpyTwoFailsKo).toBeCalledTimes(1) - expect(migrateSpy).toBeCalledTimes(1) + try { + await ms.runMigrations(migrations) + expect(migrateSpyTwoFailsKo).toBeCalledTimes(1) + expect(migrateSpy).toBeCalledTimes(1) + } catch (error) { + expect(error).toEqual(new Error()) + } }) - it('should run migrations with two fail', () => { - migrateSpy.mockClear() + it('should skip migrations if schema number is up to date', async () => { + const schema: Schema = { _id: '1', version: 1 } + const mockQueryResult: QueryResult<Schema[]> = { + data: [schema], + bookmark: '', + next: false, + skip: 0, + } const migrations: Migration[] = [ { baseSchemaVersion: 0, @@ -93,25 +136,53 @@ describe('Migration service', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, - run: (docs: any[]): Profile[] => { + releaseNotes: releaseNotes, + run: async (client: Client, docs: any[]): Promise<Profile[]> => { return [] }, }, ] - const result: MigrationResult = { - type: MIGRATION_RESULT_FAILED, - errors: [], - } - const resultOk: MigrationResult = { - type: MIGRATION_RESULT_COMPLETE, - errors: [], + mockClient.query.mockResolvedValue(mockQueryResult) + + await ms.runMigrations(migrations) + expect(migrateSpy).toBeCalledTimes(0) + }) + it('should run 2 migrations properly from a fresh instance and dont show releasenotes', async () => { + const schema: Schema = { _id: '1', version: 0 } + const mockQueryResult: QueryResult<Schema[]> = { + data: [schema], + bookmark: '', + next: false, + skip: 0, } - const migrateSpyTwoFails = jest - .spyOn(Migrate, 'migrate') - .mockResolvedValueOnce(result) - .mockResolvedValueOnce(resultOk) - ms.runMigrations(migrations) - expect(migrateSpyTwoFails).toBeCalledTimes(1) - expect(migrateSpy).toBeCalledTimes(1) + const migrations: Migration[] = [ + { + baseSchemaVersion: 0, + targetSchemaVersion: 1, + appVersion: '1.2.4', + description: 'Removing mailToken from profil', + docTypes: PROFILE_DOCTYPE, + releaseNotes: releaseNotes, + run: async (client: Client, docs: any[]): Promise<Profile[]> => { + return [] + }, + }, + { + baseSchemaVersion: 1, + targetSchemaVersion: 2, + appVersion: '1.2.4', + description: 'Removing mailToken from profil', + docTypes: PROFILE_DOCTYPE, + releaseNotes: releaseNotes, + run: async (client: Client, docs: any[]): Promise<Profile[]> => { + return [] + }, + }, + ] + mockClient.query.mockResolvedValue(mockQueryResult) + + const res = await ms.runMigrations(migrations) + expect(migrateSpy).toBeCalledTimes(2) + expect(res.show).toBeFalsy() }) }) diff --git a/src/migrations/migration.service.ts b/src/migrations/migration.service.ts index 5d65dddbc2f7796e067b492a96957be7bfb34cde..2e151a8711bac0f96340e88887ca313564bc256d 100644 --- a/src/migrations/migration.service.ts +++ b/src/migrations/migration.service.ts @@ -1,13 +1,16 @@ -import { Client } from 'cozy-client' -import { Migration, MigrationResult } from './migration.type' -import { migrationLog, migrate } from './migration' +import * as Sentry from '@sentry/react' +import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' +import { SCHEMAS_DOCTYPE } from 'doctypes/com-grandlyon-ecolyo-schemas' +import { InitStepsErrors } from 'models/initialisationSteps.model' +import { ReleaseNotes } from 'models/releaseNotes.model' +import { Schema } from 'models/schema.models' +import logApp from 'utils/logger' +import { migrate, migrationLog } from './migration' import { MIGRATION_RESULT_COMPLETE, MIGRATION_RESULT_FAILED, } from './migration.data' -import log from 'utils/logger' -import { ReleaseNotes } from 'models/releaseNotes.model' -import { InitStepsErrors } from 'models/initialisationSteps.model' +import { Migration, MigrationResult } from './migration.type' export class MigrationService { private readonly _client: Client @@ -23,9 +26,19 @@ export class MigrationService { this._client = _client this._setinitStepError = _setinitStepError } + /** + * Return schema version + * @param _client cozyClient + * @returns Promise<number> Version number of schema + */ + public async currentSchemaVersion(_client: Client): Promise<number> { + const query: QueryDefinition = Q(SCHEMAS_DOCTYPE) + const data: QueryResult<Schema[]> = await _client.query(query.limitBy(1)) + return data?.data[0]?.version || 0 + } - async runMigrations(migrations: Migration[]): Promise<ReleaseNotes> { - log.info('[Migration] Running migrations...') + public async runMigrations(migrations: Migration[]): Promise<ReleaseNotes> { + logApp.info('[Migration] Running migrations...') let releaseStatus = false const releaseNotes: ReleaseNotes = { show: releaseStatus, @@ -35,38 +48,58 @@ export class MigrationService { description: '', }, ], + redirectLink: '', } - for (const migration of migrations) { - // First attempt - const migrationResult: MigrationResult = await migrate( - migration, - this._client - ) - log.info(migrationLog(migration, migrationResult)) + const currentVersion = await this.currentSchemaVersion(this._client) + const targetVersion = migrations[migrations.length - 1].targetSchemaVersion + + // Prevent Migration service to run every migration if not needed + if (currentVersion != targetVersion) { + const startMigrationIndex = + migrations.length - (targetVersion - currentVersion) + const migrationsToRun = migrations.splice(startMigrationIndex) + + for (const migration of migrationsToRun) { + // First attempt + const migrationResult: MigrationResult = await migrate( + migration, + this._client + ) + logApp.info(migrationLog(migration, migrationResult)) - if (migrationResult.type === MIGRATION_RESULT_FAILED) { - // Retry in case of failure - const result = await migrate(migration, this._client) - if (result.type === MIGRATION_RESULT_FAILED) { - // Error in case of second failure - this._setinitStepError(InitStepsErrors.MIGRATION_ERROR) - log.error(migrationLog(migration, result)) - throw new Error() - } else { - log.info(migrationLog(migration, result)) + if (migrationResult.type === MIGRATION_RESULT_FAILED) { + // Retry in case of failure + const result = await migrate(migration, this._client) + if (result.type === MIGRATION_RESULT_FAILED) { + // Error in case of second failure + this._setinitStepError(InitStepsErrors.MIGRATION_ERROR) + logApp.error(migrationLog(migration, result)) + Sentry.captureException(migrationLog(migration, result)) + throw new Error() + } else { + logApp.info(migrationLog(migration, result)) + } } - } - if ( - migration.releaseNotes !== null && - migrationResult.type === MIGRATION_RESULT_COMPLETE - ) { - releaseNotes.notes.push(migration.releaseNotes) - releaseStatus = true + if ( + migration.releaseNotes !== null && + migrationResult.type === MIGRATION_RESULT_COMPLETE + ) { + releaseNotes.notes.push(migration.releaseNotes) + releaseStatus = true + if (migration.redirectLink) { + releaseNotes.redirectLink = migration.redirectLink + } + } } + releaseNotes.show = releaseStatus + // In case of first instance, don't show release notes + if (startMigrationIndex === 0) releaseNotes.show = false + logApp.info('[Migration] Done') + return releaseNotes + } else { + logApp.info('[Migration] Skipped Migration Process, already up-to-date') + return releaseNotes } - releaseNotes.show = releaseStatus - log.info('[Migration] Done') - return releaseNotes } } diff --git a/src/migrations/migration.spec.ts b/src/migrations/migration.spec.ts index 3da001c93bff29afdb2c9af86276bb1bfcbd35bb..69e6de6ddb0c6d44737cf6981ffa7d62ac002c68 100644 --- a/src/migrations/migration.spec.ts +++ b/src/migrations/migration.spec.ts @@ -1,4 +1,4 @@ -import { Client, QueryResult } from 'cozy-client' +import { QueryResult } from 'cozy-client' import { FLUIDPRICES_DOCTYPE, PROFILE_DOCTYPE } from 'doctypes' import { FluidPrice, Profile } from 'models' import { Schema } from 'models/schema.models' @@ -19,6 +19,7 @@ describe('migration logger', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, + releaseNotes: null, run: async (mockClient, docs: any[]): Promise<Profile[]> => { return docs.map(doc => { if (doc.mailToken) { @@ -61,6 +62,7 @@ describe('migration', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, + releaseNotes: null, run: async (mockClient, docs: any[]): Promise<Profile[]> => { return docs.map(doc => { if (doc.GCUApprovalDate) { @@ -155,6 +157,7 @@ describe('migration', () => { appVersion: '1.2.4', description: 'Removing mailToken from profil', docTypes: PROFILE_DOCTYPE, + releaseNotes: null, run: async (mockClient, docs: any[]): Promise<Profile[]> => { return [] }, @@ -201,7 +204,7 @@ describe('migration create', () => { docTypes: FLUIDPRICES_DOCTYPE, releaseNotes: null, isCreate: true, - run: async (tmpMock, docs: any[]): Promise<FluidPrice[]> => { + run: async (): Promise<FluidPrice[]> => { return [] }, } diff --git a/src/migrations/migration.ts b/src/migrations/migration.ts index d3f8b76da7d415214f6cc26360d32b436d03bcca..5e278a5798991974fce2e7c0f0bfeea226590b9b 100644 --- a/src/migrations/migration.ts +++ b/src/migrations/migration.ts @@ -1,18 +1,19 @@ -import { - Migration, - MigrationQueryOptions, - MigrationResult, -} from './migration.type' +import * as Sentry from '@sentry/react' import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' import { SCHEMAS_DOCTYPE } from 'doctypes/com-grandlyon-ecolyo-schemas' -import log from 'utils/logger' +import { Schema } from 'models/schema.models' +import logApp from 'utils/logger' import { MIGRATION_RESULT_COMPLETE, MIGRATION_RESULT_FAILED, MIGRATION_RESULT_NOOP, SCHEMA_INITIAL_VERSION, } from './migration.data' -import { Schema } from 'models/schema.models' +import { + Migration, + MigrationQueryOptions, + MigrationResult, +} from './migration.type' function migrationNoop(): MigrationResult { return { type: MIGRATION_RESULT_NOOP, errors: [] } @@ -64,7 +65,7 @@ async function updateSchemaVersion( _client: Client, targetSchemaVersion: number ): Promise<void> { - log.info('[Migration] Update schema version') + logApp.info('[Migration] Update schema version') const query: QueryDefinition = Q(SCHEMAS_DOCTYPE) const data: QueryResult<Schema[]> = await _client.query(query.limitBy(1)) const doc = data.data[0] @@ -79,11 +80,11 @@ async function updateSchemaVersion( * @returns Promise<MigrationResult> */ async function save(_client: Client, docs: any[]): Promise<MigrationResult> { - log.info('[Migration] Saving docs...') + logApp.info('[Migration] Saving docs...') const migrationResult: MigrationResult = migrationNoop() if (docs.length) { - log.info('[Migration] Saving docs...') + logApp.info('[Migration] Saving docs...') docs.forEach(async doc => { if (doc.deleteAction) { await _client.destroy(doc) @@ -93,7 +94,7 @@ async function save(_client: Client, docs: any[]): Promise<MigrationResult> { await _client.save(doc) } }) - log.info('[Migration] Docs saved') + logApp.info('[Migration] Docs saved') migrationResult.type = migrationResult.errors.length ? MIGRATION_RESULT_FAILED : MIGRATION_RESULT_COMPLETE @@ -114,7 +115,7 @@ const schemaExist = async (_client: Client): Promise<boolean> => { } const initSchemaDoctype = async (_client: Client) => { - log.info('[Migration] Init doctype') + logApp.info('[Migration] Init doctype') await _client.create(SCHEMAS_DOCTYPE, { version: SCHEMA_INITIAL_VERSION, }) @@ -130,6 +131,13 @@ export async function migrate( migration: Migration, _client: Client ): Promise<MigrationResult> { + if (migration.isEmpty) { + updateSchemaVersion(_client, migration.targetSchemaVersion) + return { + errors: [], + type: 'MigrationComplete', + } + } if (!(await schemaExist(_client))) { await initSchemaDoctype(_client) } @@ -168,11 +176,12 @@ export async function migrate( await updateSchemaVersion(_client, migration.targetSchemaVersion) break } - } catch (err) { - console.error(err) + } catch (error: any) { + console.error(error) + Sentry.captureException(JSON.stringify({ error })) result = { type: MIGRATION_RESULT_FAILED, - errors: [err.toString()], + errors: [error.toString()], } } diff --git a/src/migrations/migration.type.ts b/src/migrations/migration.type.ts index 505363b2f1ec2dc3a33e373f3473742fcd48478e..1ee3c97765b38cd236e8dee76213289f1fbf03f8 100644 --- a/src/migrations/migration.type.ts +++ b/src/migrations/migration.type.ts @@ -4,7 +4,7 @@ import { Notes } from 'models/releaseNotes.model' type SchemaVersion = number export type MigrationData = { - errors: string[] + errors: any[] } export interface MigrationNoop extends MigrationData { type: 'MigrationNoop' @@ -26,10 +26,12 @@ export type Migration = { targetSchemaVersion: SchemaVersion description: string releaseNotes: Notes | null + redirectLink?: string docTypes: string isCreate?: boolean isDeprecated?: boolean queryOptions?: MigrationQueryOptions + isEmpty?: boolean appVersion: string run: (_client: Client, docs: any[]) => Promise<any[]> } diff --git a/src/models/account.model.ts b/src/models/account.model.ts index 0e6ede6d7865eb4c45c99eca0d0e4dd1a64966bf..87b5d1ee8aed46020552ccfd97c48c2207f8517d 100644 --- a/src/models/account.model.ts +++ b/src/models/account.model.ts @@ -1,20 +1,24 @@ +/* eslint-disable camelcase */ export interface Account extends AccountAttributes { _id: string id?: string _rev?: string _type?: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any cozyMetadata?: Record<string, any> } +export interface SgeConsentData { + consentId: number + expirationDate: string +} export interface AccountAttributes { account_type: string - auth?: AccountAuthData + auth?: AccountAuthData | AccountSgeData oauth?: AccountOAuthData identifier?: string state?: string | null name?: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any + data?: SgeConsentData oauth_callback_results?: Record<string, any> } @@ -30,3 +34,12 @@ export interface AccountOAuthData { expires_at?: string token_type?: string } + +export interface AccountSgeData { + pointId: string + address: string + firstname: string + lastname: string + postalCode: string + city: string +} diff --git a/src/models/challenge.model.ts b/src/models/challenge.model.ts index c7d720aadc9a2f4fc94467cf0143811b32cb061a..cfda80f6d0607587eba13b20c72c0ba039aa4427 100644 --- a/src/models/challenge.model.ts +++ b/src/models/challenge.model.ts @@ -44,6 +44,7 @@ export interface ChallengeProgress { export interface UserChallengeEntity { id: string title: string + title_line_return?: string description: string state: UserChallengeState target: number diff --git a/src/models/config.model.ts b/src/models/config.model.ts index 1a20aca95a1aead43e3caa664458385198b2089a..121b79ed624ddec8625dde974c258685585d19d0 100644 --- a/src/models/config.model.ts +++ b/src/models/config.model.ts @@ -1,7 +1,9 @@ +import { FluidSlugType } from 'enum/fluidSlug.enum' + export interface KonnectorConfig { name: string oauth: boolean - slug: string + slug: FluidSlugType cron?: string lastKnownCredentials?: string siteLink: string diff --git a/src/models/customPopup.model.ts b/src/models/customPopup.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..be4016d18ddf56b0b5b0700482ee14e15edbc8c9 --- /dev/null +++ b/src/models/customPopup.model.ts @@ -0,0 +1,6 @@ +export interface CustomPopup { + popupEnabled: boolean + description: string + title: string + endDate: string +} diff --git a/src/models/exploration.model.ts b/src/models/exploration.model.ts index b07f5294ca8f7b1c01eac3aa191ee5f1a43f3d61..6cd6e208121d089067285a3a363e1b3361009771 100644 --- a/src/models/exploration.model.ts +++ b/src/models/exploration.model.ts @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ import { UserExplorationState, UserExplorationType, diff --git a/src/models/faq.model.ts b/src/models/faq.model.ts deleted file mode 100644 index f44da78b3fc8e8f5941080ba65dea384f26a5627..0000000000000000000000000000000000000000 --- a/src/models/faq.model.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface FAQQuestion { - summary: string - details: JSX.Element -} - -export interface FAQSection { - section: string - questions: FAQQuestion[] -} diff --git a/src/models/global.model.ts b/src/models/global.model.ts index afc5f92b5d4d8e15b44f06699755fa5c901afd3a..4fef5e1e9e6743aa2650c297b0da25ce1d6e47ca 100644 --- a/src/models/global.model.ts +++ b/src/models/global.model.ts @@ -1,8 +1,10 @@ import { FluidType } from 'enum/fluid.enum' import { ScreenType } from 'enum/screen.enum' import { TermsStatus } from 'models' +import { CustomPopup } from './customPopup.model' import { FluidStatus } from './fluid.model' import { ReleaseNotes } from './releaseNotes.model' +import { SgeStore } from './sgeStore.model' export interface GlobalState { screenType: ScreenType @@ -14,6 +16,8 @@ export interface GlobalState { termsStatus: TermsStatus fluidStatus: FluidStatus[] fluidTypes: FluidType[] + customPopupModal: CustomPopup openPartnersIssueModal: boolean shouldRefreshConsent: boolean + sgeConnect: SgeStore } diff --git a/src/models/index.ts b/src/models/index.ts index 8afa1090ea31fc75f9ae9e356e01b6e3457f1fe4..ae7e808314d0b5193a975aeee5cc5973fd3659c9 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -9,7 +9,6 @@ export * from './dataload.model' export * from './duel.model' export * from './ecogesture.model' export * from './exploration.model' -export * from './faq.model' export * from './fluid.model' export * from './fluidPrice.model' export * from './global.model' diff --git a/src/models/initialisationSteps.model.ts b/src/models/initialisationSteps.model.ts index e139357efe2ce57f7e159f5c1abc6c87c5e8f61e..8f2516a387c622fb4e58e642d3d84ef8aeff4de4 100644 --- a/src/models/initialisationSteps.model.ts +++ b/src/models/initialisationSteps.model.ts @@ -15,8 +15,6 @@ export enum InitStepsErrors { ECOGESTURE_ERROR = 'ecogesture_error', CHALLENGES_ERROR = 'challenges_error', ANALYSIS_ERROR = 'analysis_error', - INDEX_ERROR = 'index_error', - PRICES_ERROR = 'prices_error', CONSOS_ERROR = 'consos_error', PARTNERS_ERROR = 'partners_error', NETWORK_ERROR = 'network_error', diff --git a/src/models/partnersInfo.model.ts b/src/models/partnersInfo.model.ts index 4104584679938c76460fb70c49cd1fa40931deeb..5f3ae266cdbc1f342807eea53b6ab0ce052a2c98 100644 --- a/src/models/partnersInfo.model.ts +++ b/src/models/partnersInfo.model.ts @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ export interface PartnersInfo { grdf_failure: boolean enedis_failure: boolean diff --git a/src/models/profile.model.ts b/src/models/profile.model.ts index 0a4b3e71219df3f233a5c2e7402a63e7e9f94d7f..8478e1b66d91beaa0375949e09b4deb3e277445a 100644 --- a/src/models/profile.model.ts +++ b/src/models/profile.model.ts @@ -25,6 +25,7 @@ export interface ProfileEntity { partnersIssueDate: string haveSeenEcogestureModal: boolean activateHalfHourDate: string + customPopupDate: string _id?: string _rev?: string } @@ -36,9 +37,11 @@ export interface Profile | 'monthlyAnalysisDate' | 'partnersIssueDate' | 'activateHalfHourDate' + | 'customPopupDate' > { lastConnectionDate: DateTime monthlyAnalysisDate: DateTime partnersIssueDate: DateTime + customPopupDate: DateTime activateHalfHourDate: DateTime } diff --git a/src/models/releaseNotes.model.ts b/src/models/releaseNotes.model.ts index 79c8688a90296d75c89a08b3f814d26f2a9b2012..a1253d3692f101e9b13fc91a65a628d7da397432 100644 --- a/src/models/releaseNotes.model.ts +++ b/src/models/releaseNotes.model.ts @@ -1,6 +1,7 @@ export interface ReleaseNotes { show: boolean notes: Notes[] + redirectLink?: string } export interface Notes { diff --git a/src/models/sgeStore.model.ts b/src/models/sgeStore.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..59b30d9f42f3b5e912b4ad5b43838ce240e8f84e --- /dev/null +++ b/src/models/sgeStore.model.ts @@ -0,0 +1,12 @@ +export interface SgeStore { + currentStep: number + firstName: string + lastName: string + pdl: number | null + address: string + zipCode: number | null + city: string + dataConsent: boolean + pdlConfirm: boolean + shouldLaunchAccount: boolean +} diff --git a/src/models/trigger.model.ts b/src/models/trigger.model.ts index a8066eb4d9b971cb526c72eca3fa75b4a6beb064..a0c30ff3454409758689609e1653d73355e9ffe7 100644 --- a/src/models/trigger.model.ts +++ b/src/models/trigger.model.ts @@ -1,10 +1,10 @@ +/* eslint-disable camelcase */ export interface Trigger extends TriggerAttributes { _id: string domain?: string prefix?: string debounce?: string options?: string | null - // eslint-disable-next-line @typescript-eslint/no-explicit-any cozyMetadata?: Record<string, any> } diff --git a/src/models/userInstanceSettings.model.ts b/src/models/userInstanceSettings.model.ts index d1e2936a942ee9e57a37a016ea0868168fc96ae8..4202bb58fae14c72c0c7b7068bc306bd66821f26 100644 --- a/src/models/userInstanceSettings.model.ts +++ b/src/models/userInstanceSettings.model.ts @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ export interface UserInstanceSettingsAttributes { auth_mode?: string auto_update?: boolean diff --git a/src/services/account.service.spec.ts b/src/services/account.service.spec.ts index b2bb202c90164bc13b905d4c0c0cc0a27e7048c0..c52dfac07ef6af8d05f3d14f6d6da1b07b62ade5 100644 --- a/src/services/account.service.spec.ts +++ b/src/services/account.service.spec.ts @@ -86,7 +86,7 @@ describe('Account service', () => { expect(result).toBe(null) }) it('should return the account linked to oldest trigger when several account', async () => { - const mockType = 'enedisgrandlyon' + const mockType = 'enedissgegrandlyon' const mockAccounts = accountsData mockAccounts[1].account_type = mockType mockAccounts[2].account_type = mockType @@ -107,7 +107,7 @@ describe('Account service', () => { describe('getAccountsByType method', () => { it('should return all accounts for a type when several account', async () => { - const mockType = 'enedisgrandlyon' + const mockType = 'enedissgegrandlyon' const mockAccounts = accountsData mockAccounts[1].account_type = mockType mockAccounts[2].account_type = mockType diff --git a/src/services/account.service.ts b/src/services/account.service.ts index f813c6dfe11a40a5e81f47569dce5b0748224382..4c79724e0d43383c521879e0494fc630ade7d367 100644 --- a/src/services/account.service.ts +++ b/src/services/account.service.ts @@ -1,21 +1,27 @@ -import { Client, QueryDefinition, Q, QueryResult } from 'cozy-client' +import * as Sentry from '@sentry/react' +import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' +import { + createAccount, + deleteAccount, + fetchAccount, + updateAccount, +} from 'cozy-harvest-lib/dist/connections/accounts' +import { build } from 'cozy-harvest-lib/dist/helpers/accounts' +import logger from 'cozy-logger' +import { ACCOUNTS_DOCTYPE } from 'doctypes' +import { DateTime } from 'luxon' import { Account, AccountAttributes, AccountAuthData, + AccountSgeData, Konnector, Trigger, } from 'models' -import { ACCOUNTS_DOCTYPE } from 'doctypes' -import { build } from 'cozy-harvest-lib/dist/helpers/accounts' -import { - createAccount, - fetchAccount, - deleteAccount, - updateAccount, -} from 'cozy-harvest-lib/dist/connections/accounts' +import logApp from 'utils/logger' import TriggerService from './triggers.service' -import { DateTime } from 'luxon' + +const logStack = logger.namespace('accountService') export default class AccountService { private _client: Client @@ -26,14 +32,14 @@ export default class AccountService { private buildAccountAttributes( konnector: Konnector, - authData: AccountAuthData + authData: AccountAuthData | AccountSgeData ): AccountAttributes { return build(konnector, authData) } public async createAccount( konnector: Konnector, - accountAuthData: AccountAuthData + accountAuthData: AccountAuthData | AccountSgeData ): Promise<Account> { const accountAttributes = this.buildAccountAttributes( konnector, @@ -47,16 +53,19 @@ export default class AccountService { const account: Account = await fetchAccount(this._client, id) return account } catch (error) { - console.log(error) + const errorMessage = `Get account failed :${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw new Error('Get account failed') } } public async getAccountByType(type: string): Promise<Account | null> { try { - const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase - .where({ account_type: type }) + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE).where({ + account_type: type, + }) // .indexFields(['account_type']) const { data: accounts }: QueryResult<Account[]> = await this._client.query(query) @@ -92,23 +101,29 @@ export default class AccountService { } else { return accounts[0] ? accounts[0] : null } - } catch (err) { - console.error(`Error GetAccountByType: ${err}`) + } catch (error) { + const errorMessage = `Error GetAccountByType: ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) return null } } public async getAccountsByType(type: string): Promise<Account[]> { try { - const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase - .where({ account_type: type }) + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE).where({ + account_type: type, + }) // .indexFields(['account_type']) const { data: accounts }: QueryResult<Account[]> = await this._client.query(query) return accounts - } catch (err) { - console.error(`Error: GetAccountsByType: ${err}`) + } catch (error) { + const errorMessage = `Error: GetAccountsByType: ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) return [] } } @@ -118,7 +133,10 @@ export default class AccountService { const updatedAccount: Account = await updateAccount(this._client, account) return updatedAccount } catch (error) { - console.log(error) + const errorMessage = `Update account failed: ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw new Error('Update account failed') } } @@ -128,14 +146,16 @@ export default class AccountService { await deleteAccount(this._client, account) return true } catch (error) { - console.log(error) - throw new Error('Delete account failed') + const errorMessage = `Delete account failed` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + throw new Error(errorMessage) } } public async createIndexAccount(): Promise<[]> { const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase .where({ account_type: 'index' }) // .indexFields(['account_type']) .limitBy(1) diff --git a/src/services/challenge.service.ts b/src/services/challenge.service.ts index f08afb593d08dbcc00a9aa2489594f27f4932cee..fb7c042a7eb0a63983263c6bfdcb8e35a14359f5 100644 --- a/src/services/challenge.service.ts +++ b/src/services/challenge.service.ts @@ -1,43 +1,48 @@ -import { Client, QueryDefinition, QueryResult, Q } from 'cozy-client' -import { DateTime } from 'luxon' +import * as Sentry from '@sentry/react' +import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' +import logger from 'cozy-logger' import { CHALLENGE_DOCTYPE, USERCHALLENGE_DOCTYPE } from 'doctypes' +import { FluidState, FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' +import { UserActionState } from 'enum/userAction.enum' +import { + UserChallengeState, + UserChallengeSuccess, + UserChallengeUpdateFlag, +} from 'enum/userChallenge.enum' +import { UserDuelState } from 'enum/userDuel.enum' +import { UserExplorationState } from 'enum/userExploration.enum' +import { DateTime } from 'luxon' import { ChallengeEntity, - UserChallenge, - UserChallengeEntity, - DuelEntity, - UserDuel, Datachart, Dataload, + DuelEntity, + Ecogesture, + ExplorationEntity, + FluidStatus, QuizEntity, Relation, - TimePeriod, - UserQuiz, - UserExploration, - ExplorationEntity, RelationEntitiesObject, - FluidStatus, - Ecogesture, + TimePeriod, UserAction, + UserChallenge, + UserChallengeEntity, + UserDuel, + UserExploration, + UserQuiz, } from 'models' -import { - UserChallengeState, - UserChallengeSuccess, - UserChallengeUpdateFlag, -} from 'enum/userChallenge.enum' -import { TimeStep } from 'enum/timeStep.enum' -import { UserDuelState } from 'enum/userDuel.enum' +import ConsumptionDataManager from 'services/consumption.service' import DuelService from 'services/duel.service' import QuizService from 'services/quiz.service' -import ConsumptionDataManager from 'services/consumption.service' -import { getRelationship, getRelationshipHasMany } from 'utils/utils' import { getLagDays } from 'utils/date' -import ExplorationService from './exploration.service' -import { FluidState, FluidType } from 'enum/fluid.enum' -import { UserExplorationState } from 'enum/userExploration.enum' -import { UserActionState } from 'enum/userAction.enum' -import ActionService from './action.service' +import logApp from 'utils/logger' import { getRoundFloat } from 'utils/math' +import { getRelationship, getRelationshipHasMany } from 'utils/utils' +import ActionService from './action.service' +import ExplorationService from './exploration.service' + +const logStack = logger.namespace('challengeService') export default class ChallengeService { private readonly _client: Client @@ -473,9 +478,14 @@ export default class ChallengeService { await this._client.destroy(challengeEntity[index]) } return true - } catch (err) { - console.log(err) - throw err + } catch (error) { + const errorMessage = `deleteAllChallengeEntities :${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + throw error } } @@ -494,9 +504,9 @@ export default class ChallengeService { return userChallenges } - /* + /** * Retrieve dataloads for ongoing duel - * sucess return: UserChallenge, Dataload[] + * success return: UserChallenge, Dataload[] * failure throw error */ public async initChallengeDuelProgress( @@ -527,10 +537,12 @@ export default class ChallengeService { ) return { updatedUserChallenge, dataloads } } catch (error) { - console.log( - 'Challenge service error on initChallengeDuelProgress : ', + const errorMessage = `Challenge service error on initChallengeDuelProgress: ${JSON.stringify( error - ) + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -564,7 +576,12 @@ export default class ChallengeService { this.parseUserChallengeEntityToUserChallenge(updatedUserChallengeEntity) return updatedUserChallenge } catch (error) { - console.log('Challenge service error on startUserChallenge : ', error) + const errorMessage = `Challenge service error on startUserChallenge: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -770,7 +787,12 @@ export default class ChallengeService { this.parseUserChallengeEntityToUserChallenge(userChallengeEntity) return result } catch (error) { - console.log('Update user challenge error : ', error) + const errorMessage = `Update user challenge error: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } diff --git a/src/services/connection.service.ts b/src/services/connection.service.ts index 5c9a4829dee9dd1e0c090e04f82929c137958605..0a1f855ba4c2f6baa514bf5748bd78d8a4f35d15 100644 --- a/src/services/connection.service.ts +++ b/src/services/connection.service.ts @@ -1,8 +1,20 @@ import { Client } from 'cozy-client' -import { Account, AccountAuthData, Konnector, Trigger } from 'models' +import { + Account, + AccountAuthData, + AccountSgeData, + Konnector, + Trigger, +} from 'models' import AccountService from 'services/account.service' import TriggerService from 'services/triggers.service' import KonnectorService from 'services/konnector.service' +import { SgeStore } from 'models/sgeStore.model' +import logger from 'cozy-logger' +import * as Sentry from '@sentry/react' +import logApp from 'utils/logger' + +const logStack = logger.namespace('connectionService') export default class ConnectionService { private _client: Client @@ -13,8 +25,8 @@ export default class ConnectionService { public async connectNewUser( konnectorId: string, - login: string, - password: string + eglAuthData?: AccountAuthData, + sgeAuthData?: SgeStore ): Promise<{ account: Account; trigger: Trigger }> { // Retrieve konnector const konnectorService = new KonnectorService(this._client) @@ -22,12 +34,29 @@ export default class ConnectionService { konnectorId ) if (!konnector || !konnector.slug) { - throw new Error(`Could not find konnector for ${konnectorId}`) + const errorMessage = `Could not find konnector for ${konnectorId}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + throw new Error(errorMessage) } // Creation of the account linked to the konnector retrieved - const accountAuthData: AccountAuthData = { - login: login, - password: password, + let accountAuthData: AccountAuthData | AccountSgeData + if (eglAuthData) { + accountAuthData = { + login: eglAuthData.login, + password: eglAuthData.password, + } as AccountAuthData + } else { + // No login and password for Sge account + accountAuthData = { + pointId: sgeAuthData?.pdl ? sgeAuthData.pdl.toString() : '', + firstname: sgeAuthData?.firstName, + lastname: sgeAuthData?.lastName, + address: sgeAuthData?.address, + postalCode: sgeAuthData?.zipCode ? sgeAuthData.zipCode.toString() : '', + city: sgeAuthData?.city, + } as AccountSgeData } const accountService = new AccountService(this._client) const account: Account = await accountService.createAccount( @@ -35,7 +64,11 @@ export default class ConnectionService { accountAuthData ) if (!account || !account._id) { - throw new Error(`Error during account creation`) + const errorMessage = `Error during account creation` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + throw new Error(errorMessage) } // creation of the trigger for the konnector retrieve and the created account const triggersServices = new TriggerService(this._client) @@ -44,7 +77,11 @@ export default class ConnectionService { konnector ) if (!trigger) { - throw new Error(`Error during trigger creation`) + const errorMessage = `Error during trigger creation` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + throw new Error(errorMessage) } return { account: account, diff --git a/src/services/consumption.service.spec.ts b/src/services/consumption.service.spec.ts index 4b69dd97648bd26e976824462fd1b709eaa931eb..b8757e23e964ab656f16744efe1ac05abc54d10c 100644 --- a/src/services/consumption.service.spec.ts +++ b/src/services/consumption.service.spec.ts @@ -153,6 +153,7 @@ describe('Consumption service', () => { FluidType.WATER, FluidType.GAS, ] + for (const fluidType of fluidTypes) { mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison) @@ -309,6 +310,7 @@ describe('Consumption service', () => { FluidType.WATER, FluidType.GAS, ] + for (const fluidtype of fluidTypes) { mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison) @@ -401,6 +403,24 @@ describe('Consumption service', () => { }) }) + describe('getExportableFluids method', () => { + it('should return the array of fluidtypes that have entries', async () => { + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] + mockGetEntries.mockResolvedValueOnce({ data: [1] }) + mockGetEntries.mockResolvedValueOnce({ data: [] }) + mockGetEntries.mockResolvedValueOnce({ data: [1] }) + const result = await consumptionDataManager.getExportableFluids( + fluidTypes, + TimeStep.MONTH + ) + expect(result).toStrictEqual([FluidType.ELECTRICITY, FluidType.GAS]) + }) + }) + describe('fetchAllFirstDateData method', () => { it('should return the latest date data of one fluid', async () => { const fluidTypes: FluidType[] = [FluidType.ELECTRICITY] diff --git a/src/services/consumption.service.ts b/src/services/consumption.service.ts index cdb594de248c046f0e8dc517a550da1ca6f08cfc..535e8857f51c31a890bd29c4f6328c86f6b9dfc2 100644 --- a/src/services/consumption.service.ts +++ b/src/services/consumption.service.ts @@ -20,7 +20,6 @@ import ConsumptionValidatorService from 'services/consumptionValidator.service' import ConverterService from 'services/converter.service' import QueryRunnerService from 'services/queryRunner.service' -// eslint-disable-next-line @typescript-eslint/interface-name-prefix export interface ISingleFluidChartData { chartData: Datachart | null chartFluid: FluidType @@ -47,6 +46,7 @@ export default class ConsumptionDataManager { * @param fluidStatus FluidStatus[] * @param compareTimePeriod - Optional TimePeriod * @param isHome - Optional boolean + * @param isExport - Optional boolean * @returns DataChart | null */ public async getGraphData( @@ -55,14 +55,16 @@ export default class ConsumptionDataManager { fluidTypes: FluidType[], fluidStatus?: FluidStatus[], compareTimePeriod?: TimePeriod, - isHome?: boolean + isHome?: boolean, + isExport?: boolean ): Promise<Datachart | null> { const InputisValid: boolean = this._consumptionValidatorService.ValidateGetGraphData( timePeriod, timeStep, fluidTypes, - compareTimePeriod + compareTimePeriod, + isExport ) if (!InputisValid) return null if (fluidTypes.length === 1 && !isHome) { @@ -329,38 +331,56 @@ export default class ConsumptionDataManager { return result } + public async getExportableFluids( + fluidTypes: FluidType[], + timeStep: TimeStep + ): Promise<FluidType[]> { + const exportableFluids: FluidType[] = [] + for (const fluidType of fluidTypes) { + if (await this.checkDoctypeEntries(fluidType, timeStep)) { + exportableFluids.push(fluidType) + } + } + return exportableFluids + } + public async fetchAllFirstDateData( - fluidTypes: FluidType[] + fluidTypes: FluidType[], + timeStep?: TimeStep ): Promise<(DateTime | null)[]> { let firstDay = null const firstDays = [] - if (fluidTypes.length === 1) { + for (const fluidType of fluidTypes) { firstDay = - (await this._queryRunnerService.getFirstDateData(fluidTypes[0])) || null + (await this._queryRunnerService.getFirstDateData( + fluidType, + timeStep + )) || null firstDays.push(firstDay) - } else if (fluidTypes.length > 1) { - for (const fluidType of fluidTypes) { - firstDay = - (await this._queryRunnerService.getFirstDateData(fluidType)) || null - firstDays.push(firstDay) - } } return firstDays } public async fetchAllLastDateData( - fluidTypes: FluidType[] + fluidTypes: FluidType[], + timeStep?: TimeStep ): Promise<(DateTime | null)[]> { let lastDay = null const lastDays = [] if (fluidTypes.length === 1) { lastDay = - (await this._queryRunnerService.getLastDateData(fluidTypes[0])) || null + (await this._queryRunnerService.getLastDateData( + fluidTypes[0], + timeStep + )) || null lastDays.push(lastDay) } else if (fluidTypes.length > 1) { for (const fluidType of fluidTypes) { lastDay = - (await this._queryRunnerService.getLastDateData(fluidType)) || null + (await this._queryRunnerService.getLastDateData( + fluidType, + timeStep + )) || null lastDays.push(lastDay) } } @@ -381,25 +401,6 @@ export default class ConsumptionDataManager { return false } - public async checkEnedisHalHourConsent( - selectedDate: DateTime - ): Promise<boolean> { - const timePeriod = { - startDate: selectedDate.minus({ days: 3 }).startOf('day'), - endDate: selectedDate, - } - const data = await this._queryRunnerService.fetchFluidData( - timePeriod, - TimeStep.HALF_AN_HOUR, - FluidType.ELECTRICITY - ) - - if (data && data.length > 0) { - return true - } - return false - } - private aggregateGraphData( singleFluidCharts: ISingleFluidChartData[] //,withComparison: boolean = true diff --git a/src/services/consumptionFormatter.service.spec.ts b/src/services/consumptionFormatter.service.spec.ts index 293661219a71c39b02c1b53d47e5f37392e2cc40..085dab6fb05aa93daec27a81908119c69e7c82c5 100644 --- a/src/services/consumptionFormatter.service.spec.ts +++ b/src/services/consumptionFormatter.service.spec.ts @@ -1,10 +1,10 @@ -import ConsumptionFormatterService from './consumptionFormatter.service' +import { DataloadState } from 'enum/dataload.enum' +import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' import { Dataload, FluidStatus, TimePeriod } from 'models' -import { DataloadState } from 'enum/dataload.enum' -import { FluidType } from 'enum/fluid.enum' import { fluidStatusConnectedData } from '../../tests/__mocks__/fluidStatusData.mock' +import ConsumptionFormatterService from './consumptionFormatter.service' const localSpy = jest.spyOn(DateTime, 'local') @@ -121,10 +121,10 @@ describe('ConsumptionFormatter service', () => { }) it('should return a formattedData for HALF_AN_HOUR', () => { mockTimePeriod = { - startDate: DateTime.fromISO('2020-10-01T00:00:00.000Z', { + startDate: DateTime.fromISO('2020-10-01T00:30:00.000Z', { zone: 'utc', }), - endDate: DateTime.fromISO('2020-10-01T01:00:00.000Z', { + endDate: DateTime.fromISO('2020-10-01T01:30:00.000Z', { zone: 'utc', }), } @@ -309,7 +309,7 @@ describe('ConsumptionFormatter service', () => { ) expect(result).toEqual(expectedResult) }) - it('sould return EMPTY state because data.date < firstFluidDataDate for day timestep', () => { + it('sould return VALID state because data.date < firstFluidDataDate for day timestep', () => { fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( '2020-10-20T00:00:00.000Z', { @@ -318,7 +318,7 @@ describe('ConsumptionFormatter service', () => { ) const expectedResult: Dataload = { ...mockData, - state: DataloadState.EMPTY, + state: DataloadState.VALID, } const result: Dataload = consumptionFormatterService.defineDataloadState( mockData, @@ -328,7 +328,7 @@ describe('ConsumptionFormatter service', () => { ) expect(result).toEqual(expectedResult) }) - it('sould return EMPTY state because data.date < start of month of firstFluidDataDate for month timestep', () => { + it('sould return VALID state because data.date < start of month of firstFluidDataDate for month timestep', () => { fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( '2020-11-01T00:00:00.000Z', { @@ -337,7 +337,7 @@ describe('ConsumptionFormatter service', () => { ) const expectedResult: Dataload = { ...mockData, - state: DataloadState.EMPTY, + state: DataloadState.VALID, } const result: Dataload = consumptionFormatterService.defineDataloadState( mockData, @@ -347,7 +347,7 @@ describe('ConsumptionFormatter service', () => { ) expect(result).toEqual(expectedResult) }) - it('sould return EMPTY state because data.date < start of year firstFluidDataDate for year timestep', () => { + it('sould return VALID state because data.date < start of year firstFluidDataDate for year timestep', () => { fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( '2021-10-20T00:00:00.000Z', { @@ -356,7 +356,7 @@ describe('ConsumptionFormatter service', () => { ) const expectedResult: Dataload = { ...mockData, - state: DataloadState.EMPTY, + state: DataloadState.VALID, } const result: Dataload = consumptionFormatterService.defineDataloadState( mockData, diff --git a/src/services/consumptionFormatter.service.ts b/src/services/consumptionFormatter.service.ts index 33f4e5d99ca25b03e5b1adee2dd6604219b28aad..36c32a784e0f51da74ccb45ed2279132b19a8b54 100644 --- a/src/services/consumptionFormatter.service.ts +++ b/src/services/consumptionFormatter.service.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/interface-name-prefix */ import { DataloadState } from 'enum/dataload.enum' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' @@ -18,13 +17,16 @@ export default class ConsumptionFormatterService { ): Dataload[] { // Sort data data.sort((dataA, dataB) => compareDates(dataA.date, dataB.date)) - // Set status of data and complete missing/empty data const filledData = [] let parsingDate = timePeriod.startDate - + let endDate = timePeriod.endDate + if (timeStep === TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ minutes: 30 }) + endDate = endDate.minus({ minutes: 30 }) + } const dateChartService = new DateChartService() - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate) ) @@ -44,7 +46,6 @@ export default class ConsumptionFormatterService { filledData.push({ ...newElement }) parsingDate = parsingDate.plus(this.getTimeFromStepTime(timeStep)) } - return filledData } @@ -64,6 +65,11 @@ export default class ConsumptionFormatterService { if (!fluidStatus) { return data } + + if (data.value !== -1) { + return { ...data, state: DataloadState.VALID } + } + // Define state in function of first and last fluid data date if ( fluidStatus.firstDataDate && @@ -189,7 +195,6 @@ export default class ConsumptionFormatterService { switch (timeStep) { case TimeStep.HALF_AN_HOUR: return { minutes: 30 } - case TimeStep.HALF_AN_HOUR: case TimeStep.DAY: return { days: 1 } case TimeStep.MONTH: diff --git a/src/services/consumptionValidator.service.ts b/src/services/consumptionValidator.service.ts index 675baa4f179b51e58cfdba5cb43f82f8f8c50bca..618e402dfb9298e34a6b677798f01f1a34aca5cc 100644 --- a/src/services/consumptionValidator.service.ts +++ b/src/services/consumptionValidator.service.ts @@ -8,7 +8,8 @@ export default class ConsumptionValidatorService { timePeriod: TimePeriod, timeStep: TimeStep, fluidTypes: FluidType[], - compareTimePeriod?: TimePeriod + compareTimePeriod?: TimePeriod, + isExport?: boolean ): boolean { if (fluidTypes.length === 0) return false if (!this.ValidateTimePeriod(timePeriod)) return false @@ -21,7 +22,8 @@ export default class ConsumptionValidatorService { return false } - if (!this.ValidateTimePeriodLength(timePeriod, timeStep)) return false + if (!isExport && !this.ValidateTimePeriodLength(timePeriod, timeStep)) + return false if (compareTimePeriod) { if (!this.ValidateTimePeriod(compareTimePeriod)) return false diff --git a/src/services/customPopup.service.test.ts b/src/services/customPopup.service.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..7b30e3b92329b3185f0fe33978da9d737eca13cd --- /dev/null +++ b/src/services/customPopup.service.test.ts @@ -0,0 +1,32 @@ +import mockClient from '../../tests/__mocks__/client' +import { mockCustomPopup } from '../../tests/__mocks__/customPopup.mock' +import CustomPupopService from './customPopup.service' + +jest.mock('services/environment.service', () => { + return jest.fn(() => { + return { + isProduction: () => true, + } + }) +}) + +describe('PartnersInfo service', () => { + const customPupopService = new CustomPupopService(mockClient) + + it('should return customPopup data', async () => { + mockClient.getStackClient().fetchJSON.mockResolvedValueOnce(mockCustomPopup) + const result = await customPupopService.getCustomPopup() + expect(result).toBe(mockCustomPopup) + }) + + it('should return an error', async () => { + mockClient.getStackClient().fetchJSON.mockRejectedValue(new Error()) + let res + try { + res = await customPupopService.getCustomPopup() + expect(true).toBe(false) + } catch (error) { + expect(res).toBe(undefined) + } + }) +}) diff --git a/src/services/customPopup.service.ts b/src/services/customPopup.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..1eee45690bf3851ca28cd1f33dff3a13f48dfde0 --- /dev/null +++ b/src/services/customPopup.service.ts @@ -0,0 +1,45 @@ +import * as Sentry from '@sentry/react' +import { Client } from 'cozy-client' +import logger from 'cozy-logger' +import { + REMOTE_ORG_ECOLYO_AGENT_CUSTOM_POPUP, + REMOTE_ORG_ECOLYO_AGENT_CUSTOM_POPUP_REC, +} from 'doctypes/remote/org.ecolyo.agent.custom.popup' +import { CustomPopup } from 'models/customPopup.model' +import logApp from 'utils/logger' +import EnvironmentService from './environment.service' + +const logStack = logger.namespace('customPopupService') + +export default class CustomPupopService { + private readonly _client: Client + constructor(_client: Client) { + this._client = _client + } + + /** + * Get information from backoffice about the status of custom popup + * On success, respond the customPopup + * Else, throw an error + */ + public async getCustomPopup(): Promise<CustomPopup | undefined> { + const env = new EnvironmentService() + const remoteUrl = env.isProduction() + ? REMOTE_ORG_ECOLYO_AGENT_CUSTOM_POPUP + : REMOTE_ORG_ECOLYO_AGENT_CUSTOM_POPUP_REC + try { + logApp.info('[Initialization] Getting CustomPopup') + const result = await this._client + .getStackClient() + .fetchJSON('GET', remoteUrl) + return result as CustomPopup + } catch (error) { + const errorMessage = `getCustomPopup: Failed to get custom popup:${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + } + } +} diff --git a/src/services/dateChart.service.ts b/src/services/dateChart.service.ts index 6552c7e26ee6a2de0391699086b833958c447007..8e97757b0fba44980828c71cd96c0b389521ef81 100644 --- a/src/services/dateChart.service.ts +++ b/src/services/dateChart.service.ts @@ -1,8 +1,7 @@ -import { DateTime, Interval } from 'luxon' - import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' -import { Datachart, Dataload, FluidConfig, TimePeriod } from 'models' +import { DateTime, Interval } from 'luxon' +import { FluidConfig, TimePeriod } from 'models' import ConfigService from './fluidConfig.service' export default class DateChartService { @@ -152,7 +151,7 @@ export default class DateChartService { date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && - Math.abs(date1.minute - date2.minute) < 30 + Math.abs(date1.minute - date2.minute) === 0 ) default: throw new Error('TimeStep unknown') diff --git a/src/services/duel.service.ts b/src/services/duel.service.ts index 867b53c8eecee4d72ecbcc8d04701aba002085ae..be3409ffbd2282f035fc7ce321c8efa7a5a1784a 100644 --- a/src/services/duel.service.ts +++ b/src/services/duel.service.ts @@ -1,21 +1,26 @@ -import { Client, QueryDefinition, QueryResult, Q } from 'cozy-client' +import * as Sentry from '@sentry/react' +import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' +import logger from 'cozy-logger' import { DUEL_DOCTYPE } from 'doctypes/com-grandlyon-ecolyo-duel' -import { UserDuelState } from 'enum/userDuel.enum' -import { DateTime, Duration } from 'luxon' -import ConsumptionService from './consumption.service' -import PerformanceService from './performanceIndicator.service' import { FluidState, FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' +import { UserDuelState } from 'enum/userDuel.enum' +import { DateTime, Duration } from 'luxon' import { - UserDuel, - DuelEntity, - TimePeriod, - PerformanceIndicator, Datachart, Dataload, + DuelEntity, + FluidStatus, + PerformanceIndicator, + TimePeriod, + UserDuel, } from 'models' -import { FluidStatus } from 'models' +import logApp from 'utils/logger' import { getRoundFloat } from 'utils/math' +import ConsumptionService from './consumption.service' +import PerformanceService from './performanceIndicator.service' + +const logStack = logger.namespace('duelService') export default class DuelService { private readonly _client: Client @@ -149,9 +154,12 @@ export default class DuelService { await this._client.destroy(dueles[index]) } return true - } catch (err) { - console.log(err) - throw err + } catch (error) { + const errorMessage = `deleteAllDuelEntities:${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + throw error } } diff --git a/src/services/ecogesture.service.ts b/src/services/ecogesture.service.ts index 393699d1b05cc5f4fe7172349b980811283f739c..d3bc02cfc06627a571650c8c3944418ac4989b43 100644 --- a/src/services/ecogesture.service.ts +++ b/src/services/ecogesture.service.ts @@ -1,12 +1,16 @@ -import { Client, QueryDefinition, QueryResult, Q } from 'cozy-client' +import * as Sentry from '@sentry/react' +import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' import { ECOGESTURE_DOCTYPE } from 'doctypes' -import { Usage } from 'enum/ecogesture.enum' +import { Season, Usage } from 'enum/ecogesture.enum' import { FluidType } from 'enum/fluid.enum' import { IndividualOrCollective, WarmingType } from 'enum/profileType.enum' -import { Season } from 'enum/ecogesture.enum' +import { orderBy } from 'lodash' import { Ecogesture } from 'models' import { ProfileEcogesture } from 'models/profileEcogesture.model' -import { orderBy } from 'lodash' +import logApp from 'utils/logger' +import logger from 'cozy-logger' + +const logStack = logger.namespace('ecogestureService') export default class EcogestureService { private readonly _client: Client @@ -65,7 +69,12 @@ export default class EcogestureService { } return true } catch (error) { - console.log('Error deleteAllEcogestures: ', error) + const errorMessage = `Error deleteAllEcogestures: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -83,7 +92,12 @@ export default class EcogestureService { } return true } catch (error) { - console.log('Error reinitAllEcogestures: ', error) + const errorMessage = `Error reinitAllEcogestures: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } diff --git a/src/services/enedisMonthlyAnalysisData.service.ts b/src/services/enedisMonthlyAnalysisData.service.ts index ce18173c4f017cd31cdb401e2f50674c0bbc3071..f8a2af62788fcfaaee295a1f3f3a2e3910c7e090 100644 --- a/src/services/enedisMonthlyAnalysisData.service.ts +++ b/src/services/enedisMonthlyAnalysisData.service.ts @@ -1,5 +1,6 @@ -import { Client, QueryDefinition, QueryResult, Q } from 'cozy-client' - +import * as Sentry from '@sentry/react' +import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' +import logger from 'cozy-logger' import { ENEDIS_MAXPOWER_DOCTYPE, ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE, @@ -12,7 +13,9 @@ import { EnedisMonthlyAnalysisData, } from 'models/enedisMonthlyAnalysis' import { MaxPowerEntity } from 'models/maxPower.model' +import logApp from 'utils/logger' +const logStack = logger.namespace('enedisMonthlyAnalysisDataService') export default class EnedisMonthlyAnalysisDataService { private readonly _client: Client @@ -136,7 +139,12 @@ export default class EnedisMonthlyAnalysisDataService { ) return EnedisMonthlyAnalysis } catch (error) { - console.log('Error creating new EnedisMonthlyAnalysis: ', error) + const errorMessage = `Error creating new EnedisMonthlyAnalysis: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } diff --git a/src/services/environement.service.spec.ts b/src/services/environement.service.spec.ts index 3ff3841ee62c17f275984abf4c19ce5230eee7ff..02799398bd98156abbeeaa72b1c30edffc3345a0 100644 --- a/src/services/environement.service.spec.ts +++ b/src/services/environement.service.spec.ts @@ -1,15 +1,20 @@ import EnvironmentService from './environment.service' +declare const global: { + __IS_ALPHA__: boolean + __DEVELOPMENT__: boolean +} + describe('Environement service', () => { const environmentService = new EnvironmentService() - describe('isProduction method', () => { + describe('isProduction()', () => { it('should return true and prod url', async () => { global.__IS_ALPHA__ = false const result = environmentService.isProduction() expect(result).toEqual(true) const url = environmentService.getPublicURL() - expect(url).toEqual('https://ecolyo-agent.grandlyon.com') + expect(url).toEqual('https://ecolyo-agent.apps.grandlyon.com') }) it('should return false and rec url, alpha case', async () => { @@ -20,4 +25,47 @@ describe('Environement service', () => { expect(url).toEqual('https://ecolyo-agent-rec.grandlyon.com') }) }) + + describe('isAlpha()', () => { + it('should return false', () => { + global.__IS_ALPHA__ = false + expect(environmentService.isAlpha()).toBe(false) + }) + it('should return true', () => { + global.__IS_ALPHA__ = true + expect(environmentService.isAlpha()).toBe(true) + }) + }) + + describe('isLocal()', () => { + it('should return false', () => { + global.__DEVELOPMENT__ = false + expect(environmentService.isLocal()).toBe(false) + }) + it('should return true', () => { + global.__DEVELOPMENT__ = true + expect(environmentService.isLocal()).toBe(true) + }) + }) + + describe('isDev()', () => { + it('should return false', () => { + global.__DEVELOPMENT__ = false + global.__IS_ALPHA__ = false + expect(environmentService.isDev()).toBe(false) + }) + it('should return true', () => { + global.__DEVELOPMENT__ = true + global.__IS_ALPHA__ = false + expect(environmentService.isDev()).toBe(true) + + global.__DEVELOPMENT__ = false + global.__IS_ALPHA__ = true + expect(environmentService.isDev()).toBe(true) + + global.__DEVELOPMENT__ = true + global.__IS_ALPHA__ = true + expect(environmentService.isDev()).toBe(true) + }) + }) }) diff --git a/src/services/environment.service.ts b/src/services/environment.service.ts index 116c1bcc9e0e09afbb2128774fdb9710927f33a8..ab969e750bb0058e5db0e7ed7852414d2b84e3bb 100644 --- a/src/services/environment.service.ts +++ b/src/services/environment.service.ts @@ -2,11 +2,19 @@ declare const __IS_ALPHA__: boolean declare const __DEVELOPMENT__: boolean export default class EnvironmentService { - private isAlpha() { - if (__IS_ALPHA__) { - return __IS_ALPHA__ - } - return false + public isAlpha() { + return __IS_ALPHA__ + } + + public isLocal() { + return __DEVELOPMENT__ + } + + /** + * Returns true for local OR alpha + */ + public isDev() { + return __IS_ALPHA__ || __DEVELOPMENT__ } public isProduction() { @@ -15,15 +23,12 @@ export default class EnvironmentService { } return false } + public getPublicURL() { if (!this.isAlpha()) { - return 'https://ecolyo-agent.grandlyon.com' + return 'https://ecolyo-agent.apps.grandlyon.com' } else { return 'https://ecolyo-agent-rec.grandlyon.com' } } - - public isLocal() { - return __DEVELOPMENT__ - } } diff --git a/src/services/exploration.service.ts b/src/services/exploration.service.ts index bd5dfa119cc753ac8dc680906c203317fabca346..1bc61c88c8ded0ec3b84af5f13c2bfb30144f64b 100644 --- a/src/services/exploration.service.ts +++ b/src/services/exploration.service.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/camelcase */ import { Client, QueryDefinition, QueryResult, Q } from 'cozy-client' import { EXPLORATION_DOCTYPE } from 'doctypes' import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum' @@ -213,7 +212,6 @@ export default class ExplorationService { case UserExplorationID.EXPLORATION002: case UserExplorationID.EXPLORATION004_0: case UserExplorationID.EXPLORATION005: - case UserExplorationID.EXPLORATION007: case UserExplorationID.EXPLORATION004: case UserExplorationID.EXPLORATION003: case UserExplorationID.EXPLORATION008: diff --git a/src/services/fluid.service.spec.ts b/src/services/fluid.service.spec.ts index 062014b5cbe5f7212079f08311af489529e39fb9..3386a9e185d6e3a7a0cfcccb9d015aa4e4f676bd 100644 --- a/src/services/fluid.service.spec.ts +++ b/src/services/fluid.service.spec.ts @@ -93,8 +93,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -179,8 +179,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -265,8 +265,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -351,8 +351,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -438,8 +438,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -533,8 +533,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -567,8 +567,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -601,8 +601,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -635,8 +635,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -673,8 +673,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -730,8 +730,8 @@ describe('FLuid service', () => { isUpdating: false, konnectorConfig: { name: 'Enedis', - oauth: true, - slug: 'enedisgrandlyon', + oauth: false, + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, diff --git a/src/services/fluid.service.ts b/src/services/fluid.service.ts index 69800a4d508587701fbd9927f6843ff5a6dfcd72..36d865381cf38a3d9897295b67b38217c476c85a 100644 --- a/src/services/fluid.service.ts +++ b/src/services/fluid.service.ts @@ -108,7 +108,6 @@ export default class FluidService { konnectorService.getKonnector( fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug ), - konnectorService.getKonnector( fluidConfig[FluidType.WATER].konnectorConfig.slug ), diff --git a/src/services/fluidsPrices.service.ts b/src/services/fluidsPrices.service.ts index c4c4c3615ea8d5e7f2e4c342ef19a37be1649d7a..91dea069893fa1b05968be1ef058284c99588676 100644 --- a/src/services/fluidsPrices.service.ts +++ b/src/services/fluidsPrices.service.ts @@ -1,10 +1,15 @@ -import { Q, Client, QueryDefinition, QueryResult } from 'cozy-client' +import * as Sentry from '@sentry/react' +import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' +import logger from 'cozy-logger' import { FLUIDPRICES_DOCTYPE } from 'doctypes' import { FluidType } from 'enum/fluid.enum' import { DateTime } from 'luxon' import { FluidPrice } from 'models' +import logApp from 'utils/logger' import ConfigService from './fluidConfig.service' +const logStack = logger.namespace('fluidPricesService') + export default class FluidPricesService { private readonly _client: Client @@ -105,6 +110,10 @@ export default class FluidPricesService { } return true } catch (error) { + const errorMessage = `deleteAllFluidsPrices: ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) return false } } @@ -139,7 +148,12 @@ export default class FluidPricesService { await this._client.create(FLUIDPRICES_DOCTYPE, newPrice) return createdPrice } catch (error) { - console.log('Error creating new createdPrice: ', error) + const errorMessage = `'Error creating new createdPrice: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } diff --git a/src/services/initialization.service.spec.ts b/src/services/initialization.service.spec.ts index e782eedb8fc165277f36494c357ee67a8b2e6e61..ba4cc353721c95b0bd7e5c48075a534591007763 100644 --- a/src/services/initialization.service.spec.ts +++ b/src/services/initialization.service.spec.ts @@ -175,39 +175,6 @@ describe('Initialization service', () => { mockClient.create.mockClear() }) - describe('initIndex method', () => { - beforeEach(() => { - mockCreateIndexKonnector.mockClear() - mockCreateIndexAccount.mockClear() - }) - it('should return true when all indexes created', async () => { - const mockQueryResult: QueryResult<boolean> = { - data: true, - bookmark: '', - next: false, - skip: 0, - } - mockClient.query.mockResolvedValueOnce(mockQueryResult) - mockCreateIndexKonnector.mockResolvedValueOnce(mockQueryResult) - mockCreateIndexAccount.mockResolvedValueOnce(mockQueryResult) - await expect(initializationService.initIndex()).resolves.toBe(true) - }) - it('should throw error when an index is not created', async () => { - const mockQueryResult: QueryResult<boolean> = { - data: true, - bookmark: '', - next: false, - skip: 0, - } - mockClient.query.mockResolvedValueOnce(mockQueryResult) - mockCreateIndexKonnector.mockRejectedValueOnce(new Error()) - mockCreateIndexAccount.mockResolvedValueOnce(mockQueryResult) - await expect(initializationService.initIndex()).rejects.toThrow( - new Error() - ) - }) - }) - describe('initProfile method', () => { beforeEach(() => { mockGetProfile.mockClear() diff --git a/src/services/initialization.service.ts b/src/services/initialization.service.ts index 77553f5021d696eebf4cde7855088794ea63ca98..2ff22d6eda74a41820c0dbf07cf0294e293a6494 100644 --- a/src/services/initialization.service.ts +++ b/src/services/initialization.service.ts @@ -1,4 +1,6 @@ -import { Client, Q, QueryDefinition } from 'cozy-client' +import * as Sentry from '@sentry/react' +import { Client } from 'cozy-client' +import logger from 'cozy-logger' import challengeEntityData from 'db/challengeEntity.json' import duelEntityData from 'db/duelEntity.json' import ecogestureData from 'db/ecogestureData.json' @@ -9,22 +11,15 @@ import { CHALLENGE_DOCTYPE, DUEL_DOCTYPE, ECOGESTURE_DOCTYPE, - EGL_DAY_DOCTYPE, - EGL_MONTH_DOCTYPE, - EGL_YEAR_DOCTYPE, - ENEDIS_DAY_DOCTYPE, - ENEDIS_MINUTE_DOCTYPE, - ENEDIS_MONTH_DOCTYPE, - ENEDIS_YEAR_DOCTYPE, EXPLORATION_DOCTYPE, - GRDF_DAY_DOCTYPE, - GRDF_MONTH_DOCTYPE, - GRDF_YEAR_DOCTYPE, PROFILE_DOCTYPE, QUIZ_DOCTYPE, } from 'doctypes' +import { + REMOTE_ORG_ECOLYO_AGENT_PRICES, + REMOTE_ORG_ECOLYO_AGENT_PRICES_REC, +} from 'doctypes/remote/org.ecolyo.agent.prices' import { FluidType } from 'enum/fluid.enum' -import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' import { Dataload, @@ -38,25 +33,25 @@ import { import { InitSteps, InitStepsErrors } from 'models/initialisationSteps.model' import { ProfileEcogesture } from 'models/profileEcogesture.model' import React from 'react' -import AccountService from 'services/account.service' import ChallengeService from 'services/challenge.service' import DuelService from 'services/duel.service' import EcogestureService from 'services/ecogesture.service' import ExplorationService from 'services/exploration.service' import FluidService from 'services/fluid.service' -import KonnectorService from 'services/konnector.service' import KonnectorStatusService from 'services/konnectorStatus.service' import ProfileService from 'services/profile.service' import QuizService from 'services/quiz.service' import { getActualAnalysisDate } from 'utils/date' import { hashFile } from 'utils/hash' -import log from 'utils/logger' +import logApp from 'utils/logger' import EnvironmentService from './environment.service' import FluidPricesService from './fluidsPrices.service' import ProfileEcogestureService from './profileEcogesture.service' import ProfileTypeEntityService from './profileTypeEntity.service' import TermsService from './terms.service' +const logStack = logger.namespace('initializationService') + export default class InitializationService { private readonly _client: Client private readonly _setinitStep: React.Dispatch<React.SetStateAction<InitSteps>> @@ -76,89 +71,10 @@ export default class InitializationService { this._setinitStepError = _setinitStepError } - /* - * Call a query with where clause to create the index if not exist - */ - private async createIndex( - doctype: string, - timestep: TimeStep - ): Promise<object> { - const getMongoSelector = () => { - switch (timestep) { - case TimeStep.YEAR: - return { - year: { - $lte: 9999, - }, - } - case TimeStep.MONTH: - return { - year: { - $lte: 9999, - }, - month: { - $lte: 12, - }, - } - case TimeStep.DAY: - case TimeStep.HALF_AN_HOUR: - return { - year: { - $lte: 9999, - }, - month: { - $lte: 12, - }, - day: { - $lte: 31, - }, - } - default: - return {} - } - } - const query: QueryDefinition = Q(doctype) - .where(getMongoSelector()) - .limitBy(1) - return await this._client.query(query) - } - - /* - * create index for each Doctype - * sucess return: true - * failure throw error - */ - public async initIndex(): Promise<boolean> { - try { - const accountService = new AccountService(this._client) - const konnectorService = new KonnectorService(this._client) - await Promise.all([ - this.createIndex(EGL_YEAR_DOCTYPE, TimeStep.YEAR), - this.createIndex(EGL_MONTH_DOCTYPE, TimeStep.MONTH), - this.createIndex(EGL_DAY_DOCTYPE, TimeStep.DAY), - this.createIndex(ENEDIS_YEAR_DOCTYPE, TimeStep.YEAR), - this.createIndex(ENEDIS_MONTH_DOCTYPE, TimeStep.MONTH), - this.createIndex(ENEDIS_DAY_DOCTYPE, TimeStep.DAY), - this.createIndex(ENEDIS_MINUTE_DOCTYPE, TimeStep.HALF_AN_HOUR), - this.createIndex(GRDF_YEAR_DOCTYPE, TimeStep.YEAR), - this.createIndex(GRDF_MONTH_DOCTYPE, TimeStep.MONTH), - this.createIndex(GRDF_DAY_DOCTYPE, TimeStep.DAY), - konnectorService.createIndexKonnector(), - accountService.createIndexAccount(), - ]) - log.info('[Initialization] Indexes created') - return true - } catch (error) { - this._setinitStepError(InitStepsErrors.INDEX_ERROR) - log.error('Initialization error - initIndex: ', error) - throw error - } - } - - /* + /** * Check if profil exist * If not, the profil is created - * sucess return: profil + * success return: profil * failure return: null */ public async initProfile(): Promise<Profile | null> { @@ -173,13 +89,13 @@ export default class InitializationService { profileData[0] ) if (newProfile) { - log.info('[Initialization] Profile created') + logApp.info('[Initialization] Profile created') } else { this._setinitStepError(InitStepsErrors.PROFILE_ERROR) throw new Error('initProfile: Profile not created') } } else { - log.info('[Initialization] Profile loaded') + logApp.info('[Initialization] Profile loaded') } const updatedProfile = await profileService.updateProfile({ lastConnectionDate: DateTime.local().setZone('utc', { @@ -189,26 +105,37 @@ export default class InitializationService { return updatedProfile } catch (error) { this._setinitStepError(InitStepsErrors.PROFILE_ERROR) - log.error('Initialization error - initProfile: ', error) + + const errorMessage = `Initialization error - initProfile: :${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } - /* + /** * Check if profileType exist * If not, the profileType is created - * sucess return: profileType + * success return: profileType * failure return: null */ public async initProfileType(): Promise<ProfileType | null> { const profileTypeEntityService = new ProfileTypeEntityService(this._client) try { const loadedProfileType = await profileTypeEntityService.getProfileType() - log.info('[Initialization] ProfileType loaded') + logApp.info('[Initialization] ProfileType loaded') return loadedProfileType } catch (error) { this._setinitStepError(InitStepsErrors.PROFILETYPE_ERROR) - log.error('Initialization error - initProfileType: ', error) + const errorMessage = `Initialization error - initProfileType: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -217,11 +144,16 @@ export default class InitializationService { try { const loadedProfileEcogesture = await profileEcogestureService.getProfileEcogesture() - log.info('[Initialization] ProfileEcogesture loaded') + logApp.info('[Initialization] ProfileEcogesture loaded') return loadedProfileEcogesture } catch (error) { this._setinitStepError(InitStepsErrors.PROFILETYPE_ERROR) - log.error('Initialization error - initProfileEcogesture: ', error) + const errorMessage = `Initialization error - initProfileEcogesture: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -249,11 +181,16 @@ export default class InitializationService { 'initEcogesture: Created ecogesture type entities does not match' ) } - log.info('[Initialization] Ecogesture list created') + logApp.info('[Initialization] Ecogesture list created') return hashEcogestureType } catch (error) { this._setinitStepError(InitStepsErrors.ECOGESTURE_ERROR) - log.error('Initialization error - initEcogesture: ', error) + const errorMessage = `Initialization error - initEcogesture: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -285,16 +222,21 @@ export default class InitializationService { 'initEcogesture: Created ecogesture type entities does not match' ) } - log.info('[Initialization] Ecogesture updated') + logApp.info('[Initialization] Ecogesture updated') return hashEcogestureType } catch (error) { this._setinitStepError(InitStepsErrors.ECOGESTURE_ERROR) - log.error('Initialization error - initEcogesture: ', error) + const errorMessage = `Initialization error - initEcogesture: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } else { // Doctype already up to date - log.info('[Initialization] Ecogesture already up-to-date') + logApp.info('[Initialization] Ecogesture already up-to-date') return hashEcogestureType } } @@ -304,7 +246,7 @@ export default class InitializationService { // Populate data if none ecogesture exists const loadedPrices = await fpService.getAllPrices() if (loadedPrices?.length) { - log.info('[Initialization] FluidPrices db already created') + logApp.info('[Initialization] FluidPrices db already created') return true } else { try { @@ -316,8 +258,8 @@ export default class InitializationService { const allPrices: FluidPrice[] = [] const env = new EnvironmentService() const remoteUrl = env.isProduction() - ? `/remote/org.ecolyo.backoffice.prices` - : `/remote/org.ecolyo.backoffice.prices.rec` + ? REMOTE_ORG_ECOLYO_AGENT_PRICES + : REMOTE_ORG_ECOLYO_AGENT_PRICES_REC for (const fluid of fluidTypes) { const prices = await this._client @@ -328,13 +270,14 @@ export default class InitializationService { for (const price of allPrices) { await fpService.createPrice(price) } - - log.info('[Initialization] FluidPrices db created successfully') - return true - } catch (err) { - this._setinitStepError(InitStepsErrors.PRICES_ERROR) - - log.error('Initialization error - initFluidPrices: ', err) + throw new Error('test') + } catch (error) { + const errorMessage = `Initialization error - initFluidPrices: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) return false } } @@ -361,11 +304,16 @@ export default class InitializationService { 'initChallengeEntity: Created challenge entities does not match' ) } - log.info('[Initialization] Challenge entities created') + logApp.info('[Initialization] Challenge entities created') return challengeHash } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initChallengeEntity: ', error) + const errorMessage = `Initialization error - initChallengeEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -387,16 +335,21 @@ export default class InitializationService { 'initChallengeEntity: Created challenge entities does not match' ) } - log.info('[Initialization] Challenge entities updated') + logApp.info('[Initialization] Challenge entities updated') return challengeHash } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initChallengeEntity: ', error) + const errorMessage = `Initialization error - initChallengeEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } else { // Doctype already up to date - log.info('[Initialization] Challenge Entity loaded') + logApp.info('[Initialization] Challenge Entity loaded') return challengeHash } } @@ -420,11 +373,16 @@ export default class InitializationService { 'initDuelEntity: Created duel entities does not match' ) } - log.info('[Initialization] UserDuel entities created') + logApp.info('[Initialization] UserDuel entities created') return hashDuelEntity } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initDuelEntity: ', error) + const errorMessage = `Initialization error - initDuelEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -446,16 +404,21 @@ export default class InitializationService { 'initDuelEntity: Created duel entities does not match' ) } - log.info('[Initialization] UserDuel entities updated') + logApp.info('[Initialization] UserDuel entities updated') return hashDuelEntity } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initDuelEntity: ', error) + const errorMessage = `Initialization error - initDuelEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } else { // Doctype already up to date - log.info('[Initialization] Duel Entity loaded') + logApp.info('[Initialization] Duel Entity loaded') return hashDuelEntity } } @@ -480,11 +443,16 @@ export default class InitializationService { ) } - log.info('[Initialization] Quiz entities created') + logApp.info('[Initialization] Quiz entities created') return quizHash } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initQuizEntity: ', error) + const errorMessage = `Initialization error - initQuizEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -506,16 +474,21 @@ export default class InitializationService { 'initQuizEntity: Created quiz entities does not match' ) } - log.info('[Initialization] Quiz entities updated') + logApp.info('[Initialization] Quiz entities updated') return quizHash } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initQuizEntity: ', error) + const errorMessage = `Initialization error - initQuizEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } else { // Doctype already up to date - log.info('[Initialization] Quiz Entity loaded') + logApp.info('[Initialization] Quiz Entity loaded') return quizHash } } @@ -543,11 +516,16 @@ export default class InitializationService { 'initExplorationEntity: Created exploration entities does not match' ) } - log.info('[Initialization] Exploration entities created') + logApp.info('[Initialization] Exploration entities created') return explorationHash } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initExplorationEntity: ', error) + const errorMessage = `Initialization error - initExplorationEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -572,16 +550,21 @@ export default class InitializationService { 'initExplorationEntity: Created exploration entities does not match' ) } - log.info('[Initialization] Exploration entities updated') + logApp.info('[Initialization] Exploration entities updated') return explorationHash } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initExplorationEntity: ', error) + const errorMessage = `Initialization error - initExplorationEntity: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } else { // Doctype already up to date - log.info('[Initialization] Exploration Entity loaded') + logApp.info('[Initialization] Exploration Entity loaded') return explorationHash } } @@ -601,7 +584,9 @@ export default class InitializationService { haveSeenLastAnalysis: profile.haveSeenLastAnalysis, } } else { - log.info('[Initialization] Analysis information from profile updated') + logApp.info( + '[Initialization] Analysis information from profile updated' + ) return { monthlyAnalysisDate: actualAnalysisDate, haveSeenLastAnalysis: profile.isFirstConnection ? true : false, @@ -609,14 +594,19 @@ export default class InitializationService { } } catch (error) { this._setinitStepError(InitStepsErrors.ANALYSIS_ERROR) - log.error('Initialization error - initAnalysis: ', error) + const errorMessage = `Initialization error - initAnalysis: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } - /* + /** * Check if FluidTypes exist - * sucess return: FluidType[] + * success return: FluidType[] * failure throw error */ public async initFluidTypes(): Promise<FluidType[]> { @@ -624,7 +614,7 @@ export default class InitializationService { try { const fluidtypes = await kss.getKonnectorAccountStatus() if (fluidtypes) { - log.info('[Initialization] Fluid Types loaded') + logApp.info('[Initialization] Fluid Types loaded') return fluidtypes } else { this._setinitStepError(InitStepsErrors.CONSOS_ERROR) @@ -632,14 +622,20 @@ export default class InitializationService { } } catch (error) { this._setinitStepError(InitStepsErrors.CONSOS_ERROR) - log.error('Initialization error - initFluidTypes: ', error) + logApp.error('Initialization error - : ', error) + const errorMessage = `Initialization error - initFluidTypes: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } - /* + /** * For each fluid get the trigger status and the last data date - * sucess return: FluidStatus[] + * success return: FluidStatus[] * failure throw error */ public async initFluidStatus(): Promise<FluidStatus[]> { @@ -648,7 +644,7 @@ export default class InitializationService { this._setinitStep(InitSteps.CONSOS) const fluidStatus = await fs.getFluidStatus() if (fluidStatus) { - log.info('[Initialization] Fluid Status loaded') + logApp.info('[Initialization] Fluid Status loaded') return fluidStatus } else { this._setinitStepError(InitStepsErrors.CONSOS_ERROR) @@ -656,14 +652,19 @@ export default class InitializationService { } } catch (error) { this._setinitStepError(InitStepsErrors.CONSOS_ERROR) - log.error('Initialization error - initFluidStatus: ', error) + const errorMessage = `Initialization error - initFluidStatus: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } - /* + /** * Build the userChallengeList - * sucess return: UserChallenge[] + * success return: UserChallenge[] * failure throw error */ public async initUserChallenges( @@ -675,7 +676,7 @@ export default class InitializationService { fluidStatus ) if (userChallengeList) { - log.info('[Initialization] Challenges loaded') + logApp.info('[Initialization] Challenges loaded') return userChallengeList } else { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) @@ -683,14 +684,19 @@ export default class InitializationService { } } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error - initUserChallenges: ', error) + const errorMessage = `Initialization error - initUserChallenges: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } - /* + /** * Retrieve dataloads for ongoing duel - * sucess return: UserChallenge, Dataload[] + * success return: UserChallenge, Dataload[] * failure throw error */ public async initDuelProgress(userChallenge: UserChallenge): Promise<{ @@ -704,7 +710,10 @@ export default class InitializationService { return { updatedUserChallenge, dataloads } } catch (error) { this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) - log.error('Initialization error: ', error) + const errorMessage = `Initialization error - : ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } @@ -726,36 +735,41 @@ export default class InitializationService { if (isLastConsentValidated) { termsStatus.accepted = true termsStatus.versionType = 'init' - log.info( + logApp.info( '[Initialization] Last Consent successfully loaded and valid' ) } else { termsStatus.versionType = 'init' termsStatus.accepted = false - log.info('[Initialization] Consent not up-to-date') + logApp.info('[Initialization] Consent not up-to-date') } } else { const versionType = await termService.getTermsVersionType() if (versionType === 'minor') { termsStatus.accepted = false termsStatus.versionType = 'minor' - log.info('[Initialization] Minor Terms update detected') + logApp.info('[Initialization] Minor Terms update detected') } else { termsStatus.accepted = false termsStatus.versionType = 'major' - log.info('[Initialization] Major Terms update detected') + logApp.info('[Initialization] Major Terms update detected') } } } else { termsStatus.accepted = false termsStatus.versionType = 'init' - log.info('[Initialization] Init first terms') + logApp.info('[Initialization] Init first terms') } return termsStatus } catch (error) { this._setinitStepError(InitStepsErrors.CONSENT_ERROR) - log.error('Initialization error - initConsent: ', error) + const errorMessage = `Initialization error - initConsent: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } diff --git a/src/services/konnector.service.spec.ts b/src/services/konnector.service.spec.ts index f5c683ac4c29066aa7441d0065f97c33a9e29797..2e72db7c9615093a8c421e29dca55f409462391e 100644 --- a/src/services/konnector.service.spec.ts +++ b/src/services/konnector.service.spec.ts @@ -30,7 +30,7 @@ describe('KonnectorService service', () => { skip: 0, } mockClient.query.mockResolvedValueOnce(mockQueryResult) - const result = await konnectorService.getKonnector('enedisgrandlyon') + const result = await konnectorService.getKonnector('enedissgegrandlyon') expect(result).toEqual(konnectorsData[0]) }) @@ -42,7 +42,7 @@ describe('KonnectorService service', () => { skip: 0, } mockClient.query.mockResolvedValueOnce(mockQueryResult) - const result = await konnectorService.getKonnector('enedisgrandlyon') + const result = await konnectorService.getKonnector('enedissgegrandlyon') expect(result).toBeNull() }) }) diff --git a/src/services/mail.service.ts b/src/services/mail.service.ts index dd9a3822cf3449d3e830691c8766ef5f5ac57add..9528efdfd535ffc35a8cdb970e43be48b9ea0346 100644 --- a/src/services/mail.service.ts +++ b/src/services/mail.service.ts @@ -1,7 +1,9 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - +import * as Sentry from '@sentry/react' import { Client } from 'cozy-client' +import logger from 'cozy-logger' +import logApp from 'utils/logger' +const logStack = logger.namespace('mailService') export default class MailService { public async SendMail( client: Client, @@ -11,9 +13,11 @@ export default class MailService { const jobCollection = client.collection('io.cozy.jobs') jobCollection.create('sendmail', mailInfo) } catch (error) { - // eslint-disable-next-line no-console - console.log(error) - throw new Error('Failed to send mail') + const errorMessage = `Failed to send mail` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + throw new Error(errorMessage) } } } diff --git a/src/services/partnersInfo.service.spec.ts b/src/services/partnersInfo.service.spec.ts index 07f198a26194f7349aac3c43233fe84a3febb10f..ffb46973ef0254e7772d44917dfe3565a880f38f 100644 --- a/src/services/partnersInfo.service.spec.ts +++ b/src/services/partnersInfo.service.spec.ts @@ -10,20 +10,34 @@ jest.mock('services/environment.service', () => { }) }) +/* eslint-disable camelcase */ +const mockPartnersInfo: PartnersInfo = { + egl_failure: true, + enedis_failure: true, + grdf_failure: true, + notification_activated: true, +} + describe('PartnersInfo service', () => { const partnersInfoService = new PartnersInfoService(mockClient) - it('should return partnersInfo', async () => { + it('should return partnersInfoData', async () => { + mockClient + .getStackClient() + .fetchJSON.mockResolvedValueOnce(mockPartnersInfo) const result: PartnersInfo | undefined = await partnersInfoService.getPartnersInfo() - expect(result).toEqual(undefined) + expect(result).toEqual(mockPartnersInfo) }) + it('should return an error', async () => { - mockClient.query.mockRejectedValue(new Error()) + mockClient.getStackClient().fetchJSON.mockRejectedValue(new Error()) + let res try { - await partnersInfoService.getPartnersInfo() + res = await partnersInfoService.getPartnersInfo() + expect(true).toBe(false) } catch (error) { - expect(error).rejects.toThrow(new Error()) + expect(res).toBe(undefined) } }) }) diff --git a/src/services/partnersInfo.service.ts b/src/services/partnersInfo.service.ts index 52d4642637e56e75a579b4408eec0ee94aaebf19..867f42f41710c64ccd0cca0d2f536a790da0dd9d 100644 --- a/src/services/partnersInfo.service.ts +++ b/src/services/partnersInfo.service.ts @@ -1,14 +1,23 @@ +import * as Sentry from '@sentry/react' import { Client } from 'cozy-client' +import logger from 'cozy-logger' +import { + REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO, + REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC, +} from 'doctypes/remote/org.ecolyo.agent.partners.info' import { PartnersInfo } from 'models/partnersInfo.model' +import logApp from 'utils/logger' import EnvironmentService from './environment.service' +const logStack = logger.namespace('partnersInfoService') + export default class PartnersInfoService { private readonly _client: Client constructor(_client: Client) { this._client = _client } - /* + /** * Get information from backoffice about the status of partners' service * On success, respond the partnersInfo * Else, throw an error @@ -16,15 +25,21 @@ export default class PartnersInfoService { public async getPartnersInfo(): Promise<PartnersInfo | undefined> { const env = new EnvironmentService() const remoteUrl = env.isProduction() - ? `/remote/org.ecolyo.backoffice.partners.info` - : `/remote/org.ecolyo.backoffice.partners.info.rec` + ? REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO + : REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC try { + logApp.info('[Initialization] Getting PartnersInfo') const result = await this._client .getStackClient() .fetchJSON('GET', remoteUrl) return result as PartnersInfo } catch (error) { - console.error(`getPartnersInfo: Failed to get partners info:${error}`) + const errorMessage = `getPartnersInfo: Failed to get partners info: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) } } } diff --git a/src/services/profile.service.spec.ts b/src/services/profile.service.spec.ts index 5cb4f6d59de94024c224a8e096a3f6b67afb4501..e5b97cc26c71c7ea3c098b85ec0ab83e8d596838 100644 --- a/src/services/profile.service.spec.ts +++ b/src/services/profile.service.spec.ts @@ -63,6 +63,7 @@ describe('UserProfile service', () => { ...profileData, monthlyAnalysisDate: '2020-11-03T00:00:00.000Z', partnersIssueDate: '2020-11-03T00:00:00.000Z', + customPopupDate: '2020-11-03T00:00:00.000Z', } // eslint-disable-next-line @typescript-eslint/no-explicit-any const mockQueryResult: QueryResult<any[]> = { @@ -92,6 +93,9 @@ describe('UserProfile service', () => { partnersIssueDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { zone: 'utc', }), + customPopupDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { + zone: 'utc', + }), haveSeenLastAnalysis: false, } const result = await profileService.updateProfile({ diff --git a/src/services/profile.service.ts b/src/services/profile.service.ts index cee6ea3843d0e000a08e6d42315e1bd4f8c524df..5bd07d1d7969ed05694177b5fe06fa3da8778366 100644 --- a/src/services/profile.service.ts +++ b/src/services/profile.service.ts @@ -9,6 +9,13 @@ export default class ProfileService { constructor(_client: Client) { this._client = _client } + + private getDate(date: string): DateTime { + return DateTime.fromISO(date, { + zone: 'utc', + }) + } + /** * Retrieve Profile from the ProfileEntity * @param {ProfileEntity} profileEntity @@ -19,22 +26,12 @@ export default class ProfileService { ...profileEntity, monthlyAnalysisDate: typeof profileEntity.monthlyAnalysisDate === 'string' - ? DateTime.fromISO(profileEntity.monthlyAnalysisDate, { - zone: 'utc', - }) + ? this.getDate(profileEntity.monthlyAnalysisDate) : profileEntity.monthlyAnalysisDate, - lastConnectionDate: DateTime.fromISO(profileEntity.lastConnectionDate, { - zone: 'utc', - }), - partnersIssueDate: DateTime.fromISO(profileEntity.partnersIssueDate, { - zone: 'utc', - }), - activateHalfHourDate: DateTime.fromISO( - profileEntity.activateHalfHourDate, - { - zone: 'utc', - } - ), + lastConnectionDate: this.getDate(profileEntity.lastConnectionDate), + partnersIssueDate: this.getDate(profileEntity.partnersIssueDate), + activateHalfHourDate: this.getDate(profileEntity.activateHalfHourDate), + customPopupDate: this.getDate(profileEntity.customPopupDate), } return profile } diff --git a/src/services/profileType.service.ts b/src/services/profileType.service.ts index 23a52afccfe73abe460ca8975f08eaff18ab0c0d..3aab00466cb866d4b3e60bba663f1bd975fef282 100644 --- a/src/services/profileType.service.ts +++ b/src/services/profileType.service.ts @@ -1,29 +1,33 @@ -import { - DetailsMonthlyForecast, - FluidForecast, - MonthlyForecast, - ProfileType, -} from 'models/profileType.model' -import { DateTime } from 'luxon' -import heatingData from 'constants/consumptionConstants/heating.json' -import cookingData from 'constants/consumptionConstants/cooking.json' -import elecSpeData from 'constants/consumptionConstants/electricSpecific.json' +import * as Sentry from '@sentry/react' import coldWaterData from 'constants/consumptionConstants/coldWater.json' +import cookingData from 'constants/consumptionConstants/cooking.json' import EcsData from 'constants/consumptionConstants/ecs.json' +import elecSpeData from 'constants/consumptionConstants/electricSpecific.json' +import heatingData from 'constants/consumptionConstants/heating.json' +import { Client } from 'cozy-client' +import logger from 'cozy-logger' +import { FluidType } from 'enum/fluid.enum' import { ConstructionYear, Floor, - IndividualOrCollective, HotWaterEquipment, HousingType, IndividualInsulationWork, + IndividualOrCollective, OutsideFacingWalls, ThreeChoicesAnswer, } from 'enum/profileType.enum' -import { FluidType } from 'enum/fluid.enum' +import { DateTime } from 'luxon' +import { + DetailsMonthlyForecast, + FluidForecast, + MonthlyForecast, + ProfileType, +} from 'models/profileType.model' +import logApp from 'utils/logger' import ConverterService from './converter.service' -import { Client } from 'cozy-client' -import log from 'utils/logger' + +const logStack = logger.namespace('profileTypeService') export default class ProfileTypeService { private readonly profileType: ProfileType @@ -31,7 +35,7 @@ export default class ProfileTypeService { private readonly year: number constructor(profileType: ProfileType, _client: Client, year: number) { - log.info( + logApp.info( '[ProfileType] Analysis loaded profileType related to: ', profileType.updateDate ? profileType.updateDate.toString() @@ -514,7 +518,10 @@ export default class ProfileTypeService { return monthDju } } catch (error) { - console.log('errFetch', error) + const errorMessage = `fetchDju error : ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) return heatingData.dju_average_by_month[month - 1] } } diff --git a/src/services/profileTypeEntity.service.ts b/src/services/profileTypeEntity.service.ts index d059662167a1efdb24bfa79a3e707e54b2fd69ac..361d60fa00ca35818b1db34aec9528b6edc7b673 100644 --- a/src/services/profileTypeEntity.service.ts +++ b/src/services/profileTypeEntity.service.ts @@ -1,10 +1,13 @@ +import * as Sentry from '@sentry/react' import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' -import { ProfileType, TimePeriod } from 'models' +import logger from 'cozy-logger' +import profileTypeData from 'db/profileTypeData.json' import { PROFILETYPE_DOCTYPE } from 'doctypes' import { DateTime } from 'luxon' -import profileTypeData from 'db/profileTypeData.json' -import log from 'utils/logger' +import { ProfileType, TimePeriod } from 'models' +import logApp from 'utils/logger' +const logStack = logger.namespace('profileTypeEntityService') export default class ProfileTypeEntityService { private readonly _client: Client @@ -34,15 +37,15 @@ export default class ProfileTypeEntityService { if (result) { return this.parseProfileTypeEntityToProfileType(profileType) } else { - log.debug('No profileType found for: ', date.toString()) - log.debug( + logApp.debug('No profileType found for: ', date.toString()) + logApp.debug( 'Checking if user has already filled a profileType and uses it as default' ) const query: QueryDefinition = Q(PROFILETYPE_DOCTYPE) const data: QueryResult<ProfileType[]> = await this._client.query(query) if (data.data.length) { const loadedProfileType: ProfileType = data.data[0] - log.debug( + logApp.debug( 'found oldest profileType filled by user : ', loadedProfileType ) @@ -53,7 +56,7 @@ export default class ProfileTypeEntityService { ...profileTypeData[0].profileType, updateDate: date, } - log.debug('No profileType were found, loading default profileType') + logApp.debug('No profileType were found, loading default profileType') return loadedProfileType } } @@ -159,6 +162,10 @@ export default class ProfileTypeEntityService { } return true } catch (error) { + const errorMessage = `deleteProfileTypes: ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) return false } } diff --git a/src/services/queryRunner.service.spec.ts b/src/services/queryRunner.service.spec.ts index d31b29f14b017a83ed22c399cd5bd589ad1dc8b6..1df6754513965e79afd155b966282dc5889d0d6d 100644 --- a/src/services/queryRunner.service.spec.ts +++ b/src/services/queryRunner.service.spec.ts @@ -1,15 +1,15 @@ import { QueryResult } from 'cozy-client' +import { DataloadState } from 'enum/dataload.enum' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' import { Dataload, DataloadEntity } from 'models' -import QueryRunner from './queryRunner.service' import mockClient from '../../tests/__mocks__/client' -import { loadYearData } from '../../tests/__mocks__/loadYearData.mock' -import { loadMonthData } from '../../tests/__mocks__/loadMonthData.mock' import { loadDayData } from '../../tests/__mocks__/loadDayData.mock' import { loadMinuteData } from '../../tests/__mocks__/loadMinuteData.mock' -import { DataloadState } from 'enum/dataload.enum' +import { loadMonthData } from '../../tests/__mocks__/loadMonthData.mock' +import { loadYearData } from '../../tests/__mocks__/loadYearData.mock' +import QueryRunner from './queryRunner.service' describe('queryRunner service', () => { const queryRunner = new QueryRunner(mockClient) @@ -244,20 +244,12 @@ describe('queryRunner service', () => { date: DateTime.fromISO('2020-11-02T00:00:00.000Z', { zone: 'utc', }), - value: 4.5, - state: DataloadState.VALID, - valueDetail: null, - }, - { - date: DateTime.fromISO('2020-11-02T00:30:00.000Z', { - zone: 'utc', - }), value: 1.33, state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-11-02T01:00:00.000Z', { + date: DateTime.fromISO('2020-11-02T00:30:00.000Z', { zone: 'utc', }), value: 3.22, @@ -265,7 +257,7 @@ describe('queryRunner service', () => { valueDetail: null, }, { - date: DateTime.fromISO('2020-11-02T01:30:00.000Z', { + date: DateTime.fromISO('2020-11-02T01:00:00.000Z', { zone: 'utc', }), value: 7.82, @@ -273,7 +265,7 @@ describe('queryRunner service', () => { valueDetail: null, }, { - date: DateTime.fromISO('2020-11-02T02:00:00.000Z', { + date: DateTime.fromISO('2020-11-02T01:30:00.000Z', { zone: 'utc', }), value: 1.23, diff --git a/src/services/queryRunner.service.ts b/src/services/queryRunner.service.ts index 4df247207173205cb1fabd42bc7af6dfbdab6b0e..044708f409d169f07a339ea2774a9e17ec241121 100644 --- a/src/services/queryRunner.service.ts +++ b/src/services/queryRunner.service.ts @@ -1,25 +1,22 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { Client, QueryDefinition, Q } from 'cozy-client' -import { DateTime, Interval } from 'luxon' +import { Client, Q, QueryDefinition } from 'cozy-client' import { + EGL_DAY_DOCTYPE, + EGL_MONTH_DOCTYPE, + EGL_YEAR_DOCTYPE, ENEDIS_DAY_DOCTYPE, + ENEDIS_MINUTE_DOCTYPE, ENEDIS_MONTH_DOCTYPE, ENEDIS_YEAR_DOCTYPE, GRDF_DAY_DOCTYPE, GRDF_MONTH_DOCTYPE, GRDF_YEAR_DOCTYPE, - EGL_DAY_DOCTYPE, - EGL_MONTH_DOCTYPE, - EGL_YEAR_DOCTYPE, - ENEDIS_MINUTE_DOCTYPE, } from 'doctypes' - +import { DataloadState } from 'enum/dataload.enum' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' +import { DateTime, Interval } from 'luxon' import { Dataload, TimePeriod } from 'models' -import { QueryResult } from 'cozy-client/types/types' -import log from 'utils/logger' -import { DataloadState } from 'enum/dataload.enum' +import logApp from 'utils/logger' export default class QueryRunner { // TODO to be clean up @@ -45,7 +42,6 @@ export default class QueryRunner { limit: number ) { const doctype = this.getRelevantDoctype(fluidType, timeStep) - return Q(doctype) .where(this.getPredicate(timePeriod, timeStep)) .limitBy(limit) @@ -72,19 +68,27 @@ export default class QueryRunner { .sortBy([{ load: 'desc' }]) } - private buildFirstDateQuery(fluidType: FluidType, limit: number) { - const doctype = this.getRelevantDoctype(fluidType, TimeStep.DAY) + private buildFirstDateQuery( + fluidType: FluidType, + limit: number, + timeStep?: TimeStep + ) { + const doctype = this.getRelevantDoctype(fluidType, timeStep || TimeStep.DAY) return Q(doctype) - .where({}) + .where({ year: { $ne: null }, month: { $ne: null }, day: { $ne: null } }) .indexFields(['year', 'month', 'day']) .sortBy([{ year: 'asc' }, { month: 'asc' }, { day: 'asc' }]) .limitBy(limit) } - private buildLastDateQuery(fluidType: FluidType, limit: number) { - const doctype = this.getRelevantDoctype(fluidType, TimeStep.DAY) + private buildLastDateQuery( + fluidType: FluidType, + limit: number, + timeStep?: TimeStep + ) { + const doctype = this.getRelevantDoctype(fluidType, timeStep || TimeStep.DAY) return Q(doctype) - .where({}) + .where({ year: { $ne: null }, month: { $ne: null }, day: { $ne: null } }) .indexFields(['year', 'month', 'day']) .sortBy([{ year: 'desc' }, { month: 'desc' }, { day: 'desc' }]) .limitBy(limit) @@ -97,39 +101,53 @@ export default class QueryRunner { } catch (error) { // log stuff // throw new Error('Fetch data failed in query runner') - log.error('QueryRunner error: ', error) + logApp.error('QueryRunner error: ', error) } return result } - private filterDataList(data: any, timePeriod: TimePeriod) { + private filterDataList( + data: any, + timePeriod: TimePeriod, + timeStep: TimeStep + ) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timeStep === TimeStep.HALF_AN_HOUR) { + timePeriod.startDate = timePeriod.startDate.plus({ minutes: 30 }) + timePeriod.endDate = timePeriod.endDate.plus({ minutes: 30 }) + } const filteredResult = data.data.filter((entry: any) => this.withinDateBoundaries( DateTime.local( entry.year, - entry.month === 0 ? 1 : entry.month, - entry.day === 0 ? 1 : entry.day + entry.month || 1, + entry.day || 1, + entry.hour, + entry.minute ).setZone('utc', { keepLocalTime: true, }), timePeriod ) ) - return filteredResult } - private mapDataList(data: any): Dataload[] { + private mapDataList(data: any, timeStep?: TimeStep): Dataload[] { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + const minusValue = timeStep === TimeStep.HALF_AN_HOUR ? 30 : 0 const mappedResult = data.map((entry: any) => ({ date: DateTime.local( entry.year, - entry.month == 0 ? 1 : entry.month, - entry.day === 0 ? 1 : entry.day, + entry.month || 1, + entry.day || 1, entry.hour, entry.minute - ).setZone('utc', { - keepLocalTime: true, - }), + ) + .setZone('utc', { + keepLocalTime: true, + }) + .minus({ minutes: minusValue }), value: entry.load, state: DataloadState.VALID, price: entry.price, @@ -182,7 +200,6 @@ export default class QueryRunner { private getPredicate(timePeriod: TimePeriod, timeStep: TimeStep) { let predicate = {} - switch (timeStep) { case TimeStep.HALF_AN_HOUR: predicate = { @@ -193,7 +210,7 @@ export default class QueryRunner { $eq: timePeriod.startDate.month, }, day: { - $eq: timePeriod.startDate.day, + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1], }, } break @@ -237,7 +254,6 @@ export default class QueryRunner { private getRelevantDoctype(fluidType: FluidType, timeStep: TimeStep) { let doctype = '' - switch (fluidType) { case FluidType.ELECTRICITY: { @@ -320,8 +336,11 @@ export default class QueryRunner { const result = await this.fetchData(query) if (result?.data) { - const filteredResult = this.filterDataList(result, timePeriod) - const mappedResult: Dataload[] = this.mapDataList(filteredResult) + const filteredResult = this.filterDataList(result, timePeriod, timeStep) + const mappedResult: Dataload[] = this.mapDataList( + filteredResult, + timeStep + ) return mappedResult } return null @@ -357,7 +376,7 @@ export default class QueryRunner { if (timeStep === TimeStep.HALF_AN_HOUR) { const lastDayOfPreviousMonth = { startDate: maxTimePeriod.startDate.plus({ day: -1 }), - endDate: maxTimePeriod.startDate.plus({ day: -1 }).endOf('days'), + endDate: maxTimePeriod.startDate.plus({ day: -1 }).endOf('day'), } const lastDayOfPreviousMonthQuery: QueryDefinition = this.buildMaxQuery( timeStep, @@ -376,8 +395,12 @@ export default class QueryRunner { ) } if (result?.data) { - const filteredResult = this.filterDataList(result, maxTimePeriod) - const mappedResult = this.mapDataList(filteredResult) + const filteredResult = this.filterDataList( + result, + maxTimePeriod, + timeStep + ) + const mappedResult = this.mapDataList(filteredResult, timeStep) if (withDate) { return mappedResult && mappedResult[0] && mappedResult[0] } @@ -387,21 +410,26 @@ export default class QueryRunner { } public async getFirstDateData( - fluidType: FluidType + fluidType: FluidType, + timeStep?: TimeStep ): Promise<DateTime | null> { - const query: QueryDefinition = this.buildFirstDateQuery(fluidType, 1) + const query: QueryDefinition = this.buildFirstDateQuery( + fluidType, + 1, + timeStep + ) const result = await this.fetchData(query) if ( result?.data[0]?.year && result?.data[0]?.month && - result?.data[0]?.day + result?.data[0]?.day >= 0 ) { return DateTime.local( result.data[0].year, result.data[0].month, - result.data[0].day, - result.data[0].hour ? result.data[0].hour : 0, - result.data[0].minute ? result.data[0].minute : 0 + result.data[0].day || 1, + result.data[0].hour || 0, + result.data[0].minute || 0 ).setZone('utc', { keepLocalTime: true, }) @@ -409,20 +437,27 @@ export default class QueryRunner { return null } - public async getLastDateData(fluidType: FluidType): Promise<DateTime | null> { - const query: QueryDefinition = this.buildLastDateQuery(fluidType, 1) + public async getLastDateData( + fluidType: FluidType, + timeStep?: TimeStep + ): Promise<DateTime | null> { + const query: QueryDefinition = this.buildLastDateQuery( + fluidType, + 1, + timeStep + ) const result = await this.fetchData(query) if ( result?.data[0]?.year && result?.data[0]?.month && - result?.data[0]?.day + result?.data[0]?.day >= 0 ) { return DateTime.local( result.data[0].year, result.data[0].month, - result.data[0].day, - result.data[0].hour ? result.data[0].hour : 0, - result.data[0].minute ? result.data[0].minute : 0 + result.data[0].day || 1, + result.data[0].hour || 0, + result.data[0].minute || 0 ).setZone('utc', { keepLocalTime: true, }) @@ -433,7 +468,7 @@ export default class QueryRunner { public async getEntries(fluidType: FluidType, timeStep: TimeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep) try { - const query = Q(doctype).where({}) + const query = Q(doctype).where({}).limitBy(1) const result = await this._client.query(query) return result } catch (error) { diff --git a/src/services/quiz.service.ts b/src/services/quiz.service.ts index a44dd35faa96fe8da5afc0a3cc8e4ebc24246e21..8f6aa656e7543b081b4063f0e77d488fb6552c09 100644 --- a/src/services/quiz.service.ts +++ b/src/services/quiz.service.ts @@ -23,7 +23,7 @@ import { } from 'enum/userQuiz.enum' import { shuffle } from 'lodash' import { formatNumberValues } from 'utils/utils' -import log from 'utils/logger' +import logApp from 'utils/logger' export default class QuizService { private readonly _client: Client @@ -509,7 +509,7 @@ export default class QuizService { singleFluid: boolean ): Promise<number> { const consumptionService = new ConsumptionDataManager(this._client) - log.info('GetAverageOnGivenPeriod is about to call getgraphdata') + logApp.info('GetAverageOnGivenPeriod is about to call getgraphdata') const graphData = await consumptionService.getGraphData( interval, timeStep, diff --git a/src/services/terms.service.ts b/src/services/terms.service.ts index d4cfd9539aee7a5d79bdcd8bb38fa0e0d7425f1c..bb063f147f4557ab2e27a7d1b1a1cb083086472f 100644 --- a/src/services/terms.service.ts +++ b/src/services/terms.service.ts @@ -1,9 +1,13 @@ +import * as Sentry from '@sentry/react' import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' - +import logger from 'cozy-logger' import { TERMS_DOCTYPE } from 'doctypes' import { DateTime } from 'luxon' import { Term, VersionType } from 'models' +import logApp from 'utils/logger' import config from '../constants/config.json' + +const logStack = logger.namespace('termsService') export default class TermsService { private _client: Client @@ -83,7 +87,10 @@ export default class TermsService { await this._client.create(TERMS_DOCTYPE, newTerm) return createdTerm } catch (error) { - console.log('Error creating new term: ', error) + const errorMessage = `Error creating new term: ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw error } } diff --git a/src/services/triggers.service.spec.ts b/src/services/triggers.service.spec.ts index 46ff93de25401813253bd16e18f446317ffc9414..549f87c6f458230066fad718c225b89e13de259a 100644 --- a/src/services/triggers.service.spec.ts +++ b/src/services/triggers.service.spec.ts @@ -97,7 +97,7 @@ describe('TriggerService service', () => { const mockResult = { data: { attributes: { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase current_state: triggerStateData, }, }, @@ -110,7 +110,7 @@ describe('TriggerService service', () => { it('should return null when current_state is empty', async () => { const mockResult = { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase data: { attributes: { current_state: null } }, } mockClient.getStackClient().fetchJSON.mockResolvedValueOnce(mockResult) diff --git a/src/services/triggers.service.ts b/src/services/triggers.service.ts index fae71f7d70999a8ab541182628d46b007dc6c559..830b22746f0c4f0994b349dea8d529fb2a2d4035 100644 --- a/src/services/triggers.service.ts +++ b/src/services/triggers.service.ts @@ -1,4 +1,9 @@ +import * as Sentry from '@sentry/react' import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' +import triggersMutations from 'cozy-harvest-lib/dist/connections/triggers' +import { buildAttributes } from 'cozy-harvest-lib/dist/helpers/triggers' +import logger from 'cozy-logger' +import { TRIGGERS_DOCTYPE } from 'doctypes' import { Account, Konnector, @@ -6,10 +11,10 @@ import { TriggerAttributes, TriggerState, } from 'models' -import { buildAttributes } from 'cozy-harvest-lib/dist/helpers/triggers' -import triggersMutations from 'cozy-harvest-lib/dist/connections/triggers' import ConfigService from 'services/fluidConfig.service' -import { TRIGGERS_DOCTYPE } from 'doctypes' +import logApp from 'utils/logger' + +const logStack = logger.namespace('triggersService') export default class TriggerService { private _client: Client @@ -81,7 +86,7 @@ export default class TriggerService { const triggerState = await this._client .getStackClient() .fetchJSON('GET', `/jobs/triggers/${trigger._id}`) - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase return triggerState.data.attributes.current_state ? triggerState.data.attributes.current_state : null @@ -95,7 +100,10 @@ export default class TriggerService { await this._client.destroy(trigger) return true } catch (error) { - console.log(error) + const errorMessage = `Delete trigger failed: ${JSON.stringify(error)}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) throw new Error('Delete trigger failed') } } diff --git a/src/services/usageEvent.service.ts b/src/services/usageEvent.service.ts index 4297186503a3d73d9c62ab710aa0b6f5e749c4c4..6ab397dddc94aded55f52890a8a6c70860ede6ce 100644 --- a/src/services/usageEvent.service.ts +++ b/src/services/usageEvent.service.ts @@ -1,10 +1,12 @@ +import * as Sentry from '@sentry/react' import { Client, + MongoSelector, + Q, QueryDefinition, QueryResult, - Q, - MongoSelector, } from 'cozy-client' +import logger from 'cozy-logger' import { USAGEEVENT_DOCTYPE } from 'doctypes' import { UsageEventType } from 'enum/usageEvent.enum' import { DateTime } from 'luxon' @@ -14,6 +16,9 @@ import { UsageEventCreationEntity, UsageEventEntity, } from 'models' +import logApp from 'utils/logger' + +const logStack = logger.namespace('usageEventService') export default class UsageEventService { /** @@ -92,11 +97,13 @@ export default class UsageEventService { const { data: savedEvent } = await client.save(updatedEvent) return savedEvent } - } catch (err) { - console.log( - 'UsageEvent service error on udpateConnectionAttemptEvent : ', - err - ) + } catch (error) { + const errorMessage = `UsageEvent service error on udpateConnectionAttemptEvent: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) } } @@ -117,10 +124,12 @@ export default class UsageEventService { aggregated: true, }) } catch (error) { - console.log( - 'UsageEvent service error on updateUsageEventsAggregated : ', + const errorMessage = `UsageEvent service error on updateUsageEventsAggregated: ${JSON.stringify( error - ) + )}` + logStack('error', errorMessage) + logApp.error(errorMessage) + Sentry.captureException(errorMessage) } } return true diff --git a/src/store/global/global.action.spec.ts b/src/store/global/global.action.spec.ts index 1695a6e0ca852ac3840304c2144e4bcc20d8373f..a06bc8a6698db1b24ef6e3958f8d64e02aaccd9b 100644 --- a/src/store/global/global.action.spec.ts +++ b/src/store/global/global.action.spec.ts @@ -1,4 +1,5 @@ import { ScreenType } from 'enum/screen.enum' +import { mockCustomPopup } from '../../../tests/__mocks__/customPopup.mock' import { mockInitialGlobalState } from '../../../tests/__mocks__/store' import { CHANGE_SCREEN_TYPE, @@ -13,6 +14,8 @@ import { toggleChallengeDuelNotification, toggleAnalysisNotification, setFluidStatus, + SET_CUSTOM_POPUP, + setCustomPopup, } from './global.actions' describe('global actions', () => { @@ -75,4 +78,13 @@ describe('global actions', () => { } expect(setFluidStatus(fluidStatus)).toEqual(expectedAction) }) + + it('should set customPopup', () => { + const payload = mockCustomPopup + const expectedAction = { + type: SET_CUSTOM_POPUP, + payload, + } + expect(setCustomPopup(payload)).toEqual(expectedAction) + }) }) diff --git a/src/store/global/global.actions.ts b/src/store/global/global.actions.ts index 294d00f0a458c5eb7156ac7377d99f8cc3799b5a..49af36746e21f37acb0e68a5bd6bea35dd9a0b95 100644 --- a/src/store/global/global.actions.ts +++ b/src/store/global/global.actions.ts @@ -1,7 +1,9 @@ import { FluidType } from 'enum/fluid.enum' import { ScreenType } from 'enum/screen.enum' import { FluidConnection, FluidStatus, TermsStatus } from 'models' +import { CustomPopup } from 'models/customPopup.model' import { Notes } from 'models/releaseNotes.model' +import { SgeStore } from 'models/sgeStore.model' export const CHANGE_SCREEN_TYPE = 'CHANGE_SCREEN_TYPE' export const SHOW_RELEASE_NOTES = 'SHOW_RELEASE_NOTES' @@ -16,7 +18,9 @@ export const SET_FLUID_STATUS = 'SET_FLUID_STATUS' export const UPDATE_FLUID_CONNECTION = 'UPDATE_FLUID_CONNECTION' export const UPDATE_TERMS_VALIDATION = 'UPDATE_TERMS_VALIDATION' export const SET_PARTNERS_ISSUE = 'SET_PARTNERS_ISSUE' +export const SET_CUSTOM_POPUP = 'SET_CUSTOM_POPUP' export const SET_SHOULD_REFRESH_CONSENT = 'SET_SHOULD_REFRESH_CONSENT' +export const UPDATE_SGE_CONNECT = 'UPDATE_SGE_CONNECT' interface ChangeScreenType { type: typeof CHANGE_SCREEN_TYPE payload?: ScreenType @@ -59,7 +63,7 @@ interface UpdateTermValidation { interface ShowReleaseNotes { type: typeof SHOW_RELEASE_NOTES - payload?: { show: boolean; notes: Notes[] } + payload?: { show: boolean; notes: Notes[]; redirectLink?: string } } interface SetPartnersIssue { @@ -67,10 +71,19 @@ interface SetPartnersIssue { payload?: boolean } +interface SetCustomPopup { + type: typeof SET_CUSTOM_POPUP + payload: CustomPopup +} + interface SetShouldRefreshConsent { type: typeof SET_SHOULD_REFRESH_CONSENT payload?: boolean } +interface UpdateSGEConnect { + type: typeof UPDATE_SGE_CONNECT + payload?: SgeStore +} export type GlobalActionTypes = | ChangeScreenType @@ -83,7 +96,9 @@ export type GlobalActionTypes = | UpdateTermValidation | ShowReleaseNotes | SetPartnersIssue + | SetCustomPopup | SetShouldRefreshConsent + | UpdateSGEConnect export function changeScreenType(screenType: ScreenType): GlobalActionTypes { return { @@ -94,11 +109,12 @@ export function changeScreenType(screenType: ScreenType): GlobalActionTypes { export function showReleaseNotes( show: boolean, - notes: Notes[] + notes: Notes[], + redirectLink?: string ): GlobalActionTypes { return { type: SHOW_RELEASE_NOTES, - payload: { show, notes }, + payload: { show, notes, redirectLink }, } } @@ -169,6 +185,16 @@ export function setPartnersIssue( payload: openPartnersIssueModal, } } + +export function setCustomPopup( + customPopupModal: CustomPopup +): GlobalActionTypes { + return { + type: SET_CUSTOM_POPUP, + payload: customPopupModal, + } +} + export function setShouldRefreshConsent( shouldRefreshConsent: boolean ): GlobalActionTypes { @@ -177,3 +203,10 @@ export function setShouldRefreshConsent( payload: shouldRefreshConsent, } } + +export function updateSgeStore(sgeStore: SgeStore): GlobalActionTypes { + return { + type: UPDATE_SGE_CONNECT, + payload: sgeStore, + } +} diff --git a/src/store/global/global.reducer.spec.ts b/src/store/global/global.reducer.spec.ts index 23cb3d1d1343eef67f175990ec2a368c0bfa059c..b2fcbc29422955ce7a94b48902f5422d87921056 100644 --- a/src/store/global/global.reducer.spec.ts +++ b/src/store/global/global.reducer.spec.ts @@ -6,6 +6,7 @@ import { TOGGLE_CHALLENGE_DUEL_NOTIFICATION, TOGGLE_ANALYSIS_NOTIFICATION, SET_FLUID_STATUS, + SET_CUSTOM_POPUP, } from './global.actions' import { ScreenType } from 'enum/screen.enum' import { FluidStatus } from 'models' @@ -15,6 +16,7 @@ import { konnectorsData } from '../../../tests/__mocks__/konnectorsData.mock' import { accountsData } from '../../../tests/__mocks__/accountsData.mock' import { triggersData } from '../../../tests/__mocks__/triggersData.mock' import { mockInitialGlobalState } from '../../../tests/__mocks__/store' +import { mockCustomPopup } from '../../../tests/__mocks__/customPopup.mock' const mockDataDates: (DateTime | null)[] = [ DateTime.local().setZone('utc', { @@ -30,7 +32,6 @@ const mockDataDates: (DateTime | null)[] = [ describe('global reducer', () => { it('should return the initial state', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any const result = globalReducer(undefined as any, { type: 'default' }) expect(result).toEqual(mockInitialGlobalState) }) @@ -142,7 +143,7 @@ describe('global reducer', () => { konnectorConfig: { name: 'Enedis', oauth: true, - slug: 'enedisgrandlyon', + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-particulier.enedis.fr/donnees/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, @@ -209,4 +210,17 @@ describe('global reducer', () => { }) expect(result).toEqual(mockInitialGlobalState) }) + + it('should handle SET_CUSTOM_POPUP with payload', () => { + const result = { + ...mockInitialGlobalState, + customPopupModal: mockCustomPopup, + } + expect( + globalReducer(mockInitialGlobalState, { + type: SET_CUSTOM_POPUP, + payload: mockCustomPopup, + }).customPopupModal + ).toBe(result.customPopupModal) + }) }) diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts index 143410b6af1e659743062bf72b53a20353230365..855bf9ac131cefac73ba9650fd104a5fbd06a727 100644 --- a/src/store/global/global.reducer.ts +++ b/src/store/global/global.reducer.ts @@ -1,21 +1,24 @@ +import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' +import { ScreenType } from 'enum/screen.enum' +import { FluidStatus, GlobalState } from 'models' import { Reducer } from 'redux' import { CHANGE_SCREEN_TYPE, - TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION, + GlobalActionTypes, + SET_CUSTOM_POPUP, + SET_FLUID_STATUS, + SET_PARTNERS_ISSUE, + SET_SHOULD_REFRESH_CONSENT, + SHOW_RELEASE_NOTES, + TOGGLE_ANALYSIS_NOTIFICATION, TOGGLE_CHALLENGE_ACTION_NOTIFICATION, TOGGLE_CHALLENGE_DUEL_NOTIFICATION, - TOGGLE_ANALYSIS_NOTIFICATION, - SET_FLUID_STATUS, + TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION, UPDATE_FLUID_CONNECTION, - GlobalActionTypes, + UPDATE_SGE_CONNECT, UPDATE_TERMS_VALIDATION, - SHOW_RELEASE_NOTES, - SET_PARTNERS_ISSUE, - SET_SHOULD_REFRESH_CONSENT, } from 'store/global/global.actions' -import { FluidStatus, GlobalState } from 'models' -import { ScreenType } from 'enum/screen.enum' -import { FluidState, FluidType } from 'enum/fluid.enum' const initialState: GlobalState = { screenType: ScreenType.MOBILE, @@ -52,7 +55,7 @@ const initialState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -73,7 +76,7 @@ const initialState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -94,7 +97,7 @@ const initialState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -102,8 +105,25 @@ const initialState: GlobalState = { }, ], fluidTypes: [], + customPopupModal: { + popupEnabled: false, + title: '', + description: '', + }, openPartnersIssueModal: false, shouldRefreshConsent: false, + sgeConnect: { + currentStep: 0, + firstName: '', + lastName: '', + pdl: null, + address: '', + zipCode: null, + city: '', + dataConsent: false, + pdlConfirm: false, + shouldLaunchAccount: false, + }, } const getFluidTypesFromStatus = (fluidStatus: FluidStatus[]): FluidType[] => { @@ -192,6 +212,11 @@ export const globalReducer: Reducer<GlobalState> = ( openPartnersIssueModal: action.payload, } : state + case SET_CUSTOM_POPUP: + return { + ...state, + customPopupModal: action.payload, + } case SET_SHOULD_REFRESH_CONSENT: return action.payload != undefined ? { @@ -215,7 +240,13 @@ export const globalReducer: Reducer<GlobalState> = ( } else { return state } - + case UPDATE_SGE_CONNECT: + if (action.payload != undefined) + return { + ...state, + sgeConnect: action.payload, + } + return state default: return state } diff --git a/src/store/index.ts b/src/store/index.ts index 670d74d464eb86d305f3c090be9a50072285d95c..c7e28758b3055e2cb11a7fe17c3a8a3784788f71 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { createStore, combineReducers, @@ -25,6 +24,7 @@ import { ChartState } from 'models/chart.model' import { Client } from 'cozy-client' import { ProfileEcogesture } from 'models/profileEcogesture.model' import { profileEcogestureReducer } from './profileEcogesture/profileEcogesture.reducer' +import * as Sentry from '@sentry/react' export interface EcolyoState { global: GlobalState @@ -51,6 +51,8 @@ export interface AppStore { cozy: never } +const sentryReduxEnhancer = Sentry.createReduxEnhancer({}) + const configureStore = ( client: Client, persistedState: any @@ -64,8 +66,11 @@ const configureStore = ( cozy: client.reducer(), persistedState, }), - // eslint-disable-next-line prefer-spread - composeEnhancers(applyMiddleware.apply(null, middlewares)) + composeEnhancers( + // eslint-disable-next-line prefer-spread + applyMiddleware.apply(null, middlewares), + sentryReduxEnhancer + ) ) return store } diff --git a/src/store/profile/profile.reducer.ts b/src/store/profile/profile.reducer.ts index 29f92540519b2612bae94dde63e2d4f5e6411e05..d0c26e31f1d335be1e9326fb50fefe6c16593a2b 100644 --- a/src/store/profile/profile.reducer.ts +++ b/src/store/profile/profile.reducer.ts @@ -16,6 +16,7 @@ const initialState: Profile = { isFirstConnection: false, partnersIssueDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), lastConnectionDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + customPopupDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), haveSeenLastAnalysis: true, sendAnalysisNotification: true, sendConsumptionAlert: false, diff --git a/src/store/profileType/profileType.reducer.spec.ts b/src/store/profileType/profileType.reducer.spec.ts index 243bcce57f6be41cbc2aa8e6622ad4435352d7c8..ac723528428d2b3d828d14536b6b01b63b518976 100644 --- a/src/store/profileType/profileType.reducer.spec.ts +++ b/src/store/profileType/profileType.reducer.spec.ts @@ -5,7 +5,6 @@ import { profileTypeData } from '../../../tests/__mocks__/profileType.mock' describe('profile reducer', () => { it('should return the initial state', () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any const result = profileTypeReducer(undefined as any, { type: 'default' }) expect(result).toEqual(mockInitialProfileTypeState) }) diff --git a/src/store/profileType/profileType.reducer.ts b/src/store/profileType/profileType.reducer.ts index 95a0dc1937eda85ef6ec8edc0b8295ca2478409c..a5debb195e059fabf8567d50e406887ea45b5c43 100644 --- a/src/store/profileType/profileType.reducer.ts +++ b/src/store/profileType/profileType.reducer.ts @@ -40,6 +40,7 @@ const initialState: ProfileType = { hotWaterFluid: FluidType.ELECTRICITY, cookingFluid: FluidType.ELECTRICITY, updateDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + equipments: [], } export const profileTypeReducer: Reducer<ProfileType> = ( diff --git a/src/styles/base/_color.scss b/src/styles/base/_color.scss index 8e6b7a884acf9aa1f24c963438205008fb903821..ed06067df8c0d8dd47eb15042d6a4eda5546a9ea 100644 --- a/src/styles/base/_color.scss +++ b/src/styles/base/_color.scss @@ -3,13 +3,14 @@ $dark: #242633; $dark-2: #1b1c22; $dark-light: #25262b; $dark-light-2: #121212; +$dark-light-3: #323339; $dark-3: #181819; $dark-background: radial-gradient( 60.65% 30.62% at 50% 3.13%, #2a2b30 0%, #1b1c22 100% ); - +$bottom-bar-grey: #32343d; /** RED **/ $red-primary: #d25959; @@ -18,6 +19,7 @@ $gold: #b2901b; $gold-40: rgba(227, 184, 42, 0.4); $gold-light: #deaf0e; $gold-shadow: #e3b82a; +$gold-euro: #f1c017; /** ORANGE **/ $orange: #ec9d41; @@ -55,8 +57,8 @@ $soft-grey: #a0a0a0; $grey-dark: #7b7b7b; $grey-linear-gradient-background: linear-gradient( 180deg, - rgb(50, 51, 57) 0%, - rgb(37, 38, 43) 100% + #323339 0%, + #25262b 100% ); $grey-linear-gradient-background-hover: linear-gradient( 180deg, diff --git a/src/styles/base/_layout.scss b/src/styles/base/_layout.scss index 78f6fb950cceaa5783949454e1b89d4cc1458004..ec8ecb32b158d73e194171773c8b290dfa7134cf 100644 --- a/src/styles/base/_layout.scss +++ b/src/styles/base/_layout.scss @@ -3,11 +3,11 @@ @import '../base/z-index'; html { - background: $dark-2; + background: $dark-light-2; } body { - background: $dark-2; + background: $dark-light-2; overflow: unset !important; } @@ -27,15 +27,12 @@ body { align-items: center; justify-content: center; margin-left: 0; - @media #{$large-phone} { - margin-left: 1.25rem; - } } [role='banner'] .coz-bar-container { background-color: $white; @media #{$large-phone} { - padding: 0 0 0 0; + padding: 0.6rem 0 0 0; background-color: unset; } } @@ -66,9 +63,9 @@ body { } .header-top { background: radial-gradient( - 74.83% 76.97% at 50% 13.64%, - #343641 0%, - #1b1c22 100% + circle, + rgba(52, 54, 65, 1) 0%, + rgba(27, 28, 34, 1) 100% ); width: 100%; .header-text { diff --git a/src/styles/base/_mixins.scss b/src/styles/base/_mixins.scss index ebfefb8f4bfdc81ef48abd3c0f21ef652aeddc3b..11c9aa1fd4cd0ed0b919837852fc0f54b09e01af 100644 --- a/src/styles/base/_mixins.scss +++ b/src/styles/base/_mixins.scss @@ -23,5 +23,56 @@ } &:disabled { cursor: not-allowed; + opacity: 0.5; + } +} +@mixin checkBox() { + .checkbox { + margin: 0.5rem 0; + display: flex; + align-items: center; + &:first-of-type { + margin-top: 1.5rem; + } + input { + margin: 0.5rem 1rem 0.5rem 0.5rem; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + width: 1.45rem; + height: 1.45rem; + min-width: 1.45rem; + min-height: 1.45rem; + background: $dark-background; + position: relative; + border: solid 2px $gold-shadow; + cursor: pointer; + } + } + .answer-checked { + input { + &:before, + &:after { + content: ''; + position: absolute; + display: inline-block; + background: $gold-shadow; + border-radius: 0.5rem; + } + &:before { + width: 3px; + height: 12px; + left: 10px; + top: 4px; + transform: rotate(41deg); + } + &:after { + width: 3px; + height: 6px; + left: 5px; + top: 8px; + transform: rotate(133deg); + } + } } } diff --git a/src/styles/components/_buttons.scss b/src/styles/components/_buttons.scss index a5bab7174f8dcf8572ef1c1cf1b0aa365aa22ee8..2ee92640a5609bd65b3d529211c06e7ef607e34d 100644 --- a/src/styles/components/_buttons.scss +++ b/src/styles/components/_buttons.scss @@ -70,9 +70,8 @@ button { } } &.btn-duel-active { - @include button($blue, $dark-light-2, none, $blue) { - background-color: darken($blue, 30%); - } + border-radius: 4px !important; + @include button($blue-radial-gradient, $dark-light-2, none); } &.btn-duel-on { @include button($dark-light-2, $white, 1px solid $blue, $dark-background) { @@ -80,12 +79,16 @@ button { } } &.btn-profile-next { - @include button($gold-shadow, #000000, none, $multi-color-radial-gradient) { + @include button( + $gold-shadow, + #000000, + 1px solid $gold-shadow, + $multi-color-radial-gradient + ) { background-color: darken($gold-shadow, 12%); } } &.btn-profile-back { - @include button(none, $soft-grey, none, none) { - } + @include button(none, $grey-bright, 1px solid $grey-bright, none); } } diff --git a/src/styles/components/_card.scss b/src/styles/components/_card.scss index fb7a468e5662544707aeb1c477812a52bc7e45b7..5f37c3c5dc07455a2eae4387f044200bf829819d 100644 --- a/src/styles/components/_card.scss +++ b/src/styles/components/_card.scss @@ -5,7 +5,7 @@ box-sizing: border-box; box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75); border-radius: 4px; - margin: 10px 0px 20px 0px; + margin-top: 1rem; padding: 16px; &:hover { background: $grey-linear-gradient-background-hover; diff --git a/src/styles/components/_dialog.scss b/src/styles/components/_dialog.scss index c5e3008f1bf428406068623344daa5e66df26316..07c66d82be9a5d588af12064854bd233f896d936 100644 --- a/src/styles/components/_dialog.scss +++ b/src/styles/components/_dialog.scss @@ -24,7 +24,7 @@ div.modal-paper { margin: 0; } @media #{$large-phone} { - padding: 1rem; + padding: 1rem 1rem 1.5rem; width: 85%; max-width: 35rem; margin: 0; diff --git a/src/styles/index.css b/src/styles/index.css index 12bc8275f8f7f3920e5f52331cefe9b3d1f9c663..8ab6ce1cff1ddfb8986f684c802ca0717039d5fe 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -16,11 +16,11 @@ /** SCROLLBAR **/ @import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap'); html { - background: #1b1c22; + background: #121212; } body { - background: #1b1c22; + background: #121212; overflow: unset !important; } @@ -52,7 +52,7 @@ body { } @media only screen and (max-width: 768px) { [role='banner'] .coz-bar-container { - padding: 0 0 0 0; + padding: 0.6rem 0 0 0; background-color: unset; } } @@ -87,11 +87,7 @@ body { } } .header .header-top { - background: radial-gradient( - 74.83% 76.97% at 50% 13.64%, - #343641 0%, - #1b1c22 100% - ); + background: radial-gradient(circle, rgb(52, 54, 65) 0%, rgb(27, 28, 34) 100%); width: 100%; } .header .header-top .header-text { @@ -607,96 +603,80 @@ p { font-size: 1.5rem; line-height: 120%; } -/* line 52, src/styles/base/_typography.scss */ .text-24-normal, -.text-24-normal-uppercase, -.text-24-normal-150 { +.text-24-normal-150, +.text-24-normal-uppercase { font-weight: normal; } -/* line 55, src/styles/base/_typography.scss */ .text-24-normal-uppercase { text-transform: uppercase; } -/* line 59, src/styles/base/_typography.scss */ .text-24-normal-150 { line-height: 150%; } -/* line 64, src/styles/base/_typography.scss */ .text-24-bold, -.text-24-bold-uppercase, -.text-24-bold-capitalize { +.text-24-bold-capitalize, +.text-24-bold-uppercase { font-weight: 700; } -/* line 67, src/styles/base/_typography.scss */ .text-24-bold-uppercase { text-transform: uppercase; } -/* line 71, src/styles/base/_typography.scss */ .text-24-bold-capitalize { text-transform: capitalize; } -/* line 76, src/styles/base/_typography.scss */ .text-24-italic { font-style: italic; font-weight: normal; } -/* line 48, src/styles/base/_typography.scss */ .text-26, -.text-26-normal, -.text-26-normal-uppercase, -.text-26-normal-150, +.text-26-italic, .text-26-bold, -.text-26-bold-uppercase, .text-26-bold-capitalize, -.text-26-italic { +.text-26-bold-uppercase, +.text-26-normal, +.text-26-normal-150, +.text-26-normal-uppercase { font-style: normal; font-size: 1.625rem; line-height: 120%; } -/* line 52, src/styles/base/_typography.scss */ .text-26-normal, -.text-26-normal-uppercase, -.text-26-normal-150 { +.text-26-normal-150, +.text-26-normal-uppercase { font-weight: normal; } -/* line 55, src/styles/base/_typography.scss */ .text-26-normal-uppercase { text-transform: uppercase; } -/* line 59, src/styles/base/_typography.scss */ .text-26-normal-150 { line-height: 150%; } -/* line 64, src/styles/base/_typography.scss */ .text-26-bold, -.text-26-bold-uppercase, -.text-26-bold-capitalize { +.text-26-bold-capitalize, +.text-26-bold-uppercase { font-weight: 700; } -/* line 67, src/styles/base/_typography.scss */ .text-26-bold-uppercase { text-transform: uppercase; } -/* line 71, src/styles/base/_typography.scss */ .text-26-bold-capitalize { text-transform: capitalize; } -/* line 76, src/styles/base/_typography.scss */ .text-26-italic { font-style: italic; font-weight: normal; } -/* line 48, src/styles/base/_typography.scss */ .text-28, -.text-28-normal, -.text-28-normal-uppercase, -.text-28-normal-150, +.text-28-italic, .text-28-bold, -.text-28-bold-uppercase, .text-28-bold-capitalize, -.text-28-italic { +.text-28-bold-uppercase, +.text-28-normal, +.text-28-normal-150, +.text-28-normal-uppercase { font-style: normal; font-size: 1.75rem; line-height: 120%; @@ -1498,6 +1478,9 @@ div.modal-paper.no-padding { div.modal-paper.blue-border { border: 1px solid rgba(88, 255, 255, 0.2509803922); } +div.modal-paper.blue-light-border { + border: 1px solid #61f0f2; +} div.modal-paper.yellow-border { border: 1px solid rgba(227, 184, 42, 0.4); } diff --git a/src/styles/index.css.map b/src/styles/index.css.map index 43e4f91032c182c88b68a4977026db7edd39c0df..6b13903acfebfb59681513a4e856accd459301b8 100644 --- a/src/styles/index.css.map +++ b/src/styles/index.css.map @@ -1 +1,22 @@ -{"version":3,"sourceRoot":"","sources":["index.scss","base/_color.scss","base/_layout.scss","base/_z-index.scss","base/_typography.scss","base/_typo-variables.scss","components/_barchart.scss","components/_buttons.scss","base/_mixins.scss","components/_card.scss","components/_dialog.scss","components/_expansion-panel.scss","components/_link.scss"],"names":[],"mappings":"AAAA;AACQ;AACR;AACQ;AACR;ACJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;ADhIQ;AEZR;EACE,YDHO;;;ACMT;EACE,YDPO;ECQP;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;EACE,kBDaM;;ACZN;EAFF;IAGI;IACA;;;;AAIJ;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,SCxDS;EDyDT;EACA;EACA;;AACA;EAVF;IAWI;;;AAEF;EACE;EAKA;;AACA;EACE;EACA,ODvBQ;;AC0BZ;EACE;EACA;EACA;;AACA;EAJF;IAKI;;;AAEF;EAPF;IAQI;;;AAEF;EACE;EACA;;AACA;EACE;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA,ODlDM;;ACoDR;EACE;;AAEF;EACE;IACE;IACA,OD1DI;;EC4DN;IACE;;EAEF;IACE;;;;AAOV;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OD9EY;;AC+EZ;EACE;EACA;EACA;;AAEF;EACE;EACA;;;AAIJ;AACE;AAIA;AAIA;;AAPA;EACE;;AAGF;EACE,YDHc;;ACMhB;EACE,YDNc;;;AAnJlB;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AAhJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AG5IA;EACE,aCLU;;;ADQZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE,OHsCU;EGrCV,aChBU;;;ADmBZ;EACE;EACA,aCrBU;EDsBV;EACA;EACA;EACA;;;AAGF;EACE,aC7BU;ED8BV;EACA;EACA;EACA;EAEA;EACA;EACA,OHeY;EGdZ;;;AAEF;EACE,OHtBY;EGuBZ;EACA;;;AAIA;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AAKN;AACA;EACE,aCrFU;EDsFV;EACA;EACA;EACA;EACA,OHtCY;;;AGwCd;EACE,aC7FU;ED8FV;EACA;EACA;EACA;EACA,OH9CY;;;AGgDd;EACE,aCrGU;EDsGV;EACA;EACA;EACA;EACA,OHtDY;;;AGwDd;EACE,aC7GU;ED8GV;EACA;EACA;EACA;EACA,OH9DY;;;AGgEd;EACE,aCrHU;EDsHV;EACA;EACA;EACA;EACA,OHtEY;;;AGyEd;AACA;EACE,aC/HU;EDgIV;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAGJ;EACE,aCzIU;ED0IV;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;AACA;EACE,aCrJU;EDsJV;EACA;EACA;EACA;EACA,OHtGY;;;AApDd;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AK7IA;EACE,OLkDU;;AKjDV;EACE,MLgDQ;;AK/CR;EACE,ML4CQ;;AKzCZ;EACE;EACA;EACA;;;AAGJ;EACE,MLoCU;;AKnCV;EACE,MLgCU;;;AK3BZ;AAAA;EACE;;;AAGJ;EACE;;AACA;EACE;;;AAGJ;EACE;;;AAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;;AAGJ;EACE,MLuBe;;AKtBf;EACE,MLmBS;EKlBT;;;AAIJ;EACE,MLiBuB;;AKhBvB;EACE,MLciB;EKbjB;;;AAIJ;EACE,MLmBgB;;AKlBhB;EACE,MLeU;EKdV;;;AAIJ;EACE,MLawB;;AKZxB;EACE,MLUkB;EKTlB;;;AAIJ;EACE,MLHc;;AKId;EACE,MLPQ;EKQR;;;AAIJ;EACE,MLTsB;;AKUtB;EACE,MLZgB;EKahB;;;AAIJ;EACE,MLRgB;;AKShB;EACE,MLXU;EKYV;;AAGA;EACE;;;AAIN;EACE,MLpFW;;AKqFX;EACE,MLtFS;EKuFT;;AAGA;EACE;;;AAIN;EACE,ML1HK;EK2HL;;AACA;EACE,MLpCU;EKqCV;;AAGA;EACE;;;AAKN;EACE,ML5CwB;;AK6CxB;EACE,ML/CkB;EKgDlB;;;AAGJ;EACE;EACA,QLvDY;;;AKyDd;EACE,MLzEmB;;AK0EnB;EACE,ML3EiB;EK4EjB;;;AAGJ;EACE,ML/DoB;;AKgEpB;EACE,MLjEkB;EKkElB;;;AAGJ;AACA;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;;AAIJ;AACA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;ALxRF;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AM5IE;ECEA,YPiH4B;EOhH5B,kBPYY;EOXZ,QDHyC;ECIzC;EACA;EACA;EACA;EACA;;AACA;EACE,ODV8B;;ACYhC;EDXI;;ACiBJ;EACE;;ADfF;ECHA,YDQI;ECPJ,kBDII;ECHJ,QDKI;ECJJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPIU;;AOFZ;EDDI;;AACA;EACE;;ACKN;EACE;;ADFF;EChBA,YDqBI;ECpBJ,kBDiBI;EChBJ,QDkBI;ECjBJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPIU;;AOFZ;EDYI;;AACA;EACE;;ACRN;EACE;;ADWF;EC7BA,YDkCI;ECjCJ,kBD8BI;EC7BJ,QD+BI;EC9BJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPqCU;;AOnCZ;EDyBI;;AACA;EACE;;ACrBN;EACE;;ADwBF;EC1CA,YD+CI;EC9CJ,kBD2CI;EC1CJ,QD4CI;EC3CJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPqCU;;AOnCZ;EDsCI;;AACA;EACE;;AClCN;EACE;;ADqCF;ECvDA,YPFa;EOGb,kBPHa;EOIb,QDyDI;ECxDJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPiCI;;AO/BN;EDmDI;;AC7CJ;EACE;;AD+CF;ECjEA,YPmBK;EOlBL,kBPkBK;EOjBL,QDgEwC;EC/DxC;EACA;EACA;EACA;EACA;;AACA;EACE,OPXW;;AOab;EDwDI;;AClDJ;EACE;;ADoDF;ECtEA;EACA,kBPHa;EOIb,QDqEyC;ECpEzC;EACA;EACA;EACA;EACA;;AACA;EACE,OPiCI;;AO/BN;ED6DI;;ACvDJ;EACE;;ADyDF;EC3EA,YPiH4B;EOhH5B,kBPYY;EOXZ,QD0EyC;ECzEzC;EACA;EACA;EACA;EACA;;AACA;EACE,ODmE8B;;ACjEhC;EDkEI;;AC5DJ;EACE;;AD8DF;EChFA,YDiF0C;EChF1C,kBDgFkB;EC/ElB,QD+EoC;EC9EpC;EACA;EACA;EACA;EACA;;AACA;EACE,OPsCQ;;AO9BV;EACE;;;APxBJ;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AQ9IA;EACE,YRoDgC;EQnDhC;EACA;EACA;EACA;EACA;;AACA;EACE,YRkDoC;;AQhDtC;EACE;;;ARbJ;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AS5IE;EACE;;;AAIJ;EACE,YT6CgC;ES5ChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OT4BM;;AS3BN;EAZF;IAaI;IACA;;;AAEF;EAhBF;IAiBI;IACA;IACA;IACA;;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA,SP3CO;;;AO+CX;EACE,YTKgC;ESJhC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTZM;ESaN;EACA;;AACA;EACE,YT5DW;;;AAJf;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AU9IA;EACE;EACA,OVgDY;EU/CZ,YVkDgC;EUjDhC;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;;AACA;EACE;;AAGJ;EACE;EACA;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AVlDF;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AW/IA;EACE,OXgBW;;AWfX;EACE,OXcS;;;AWVb;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AAEF;EACE,OXiCY;;;ADlCd;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EAME;EACA,kBCzDa","file":"index.css"} \ No newline at end of file +{ + "version": 3, + "sourceRoot": "", + "sources": [ + "index.scss", + "base/_color.scss", + "base/_layout.scss", + "base/_z-index.scss", + "base/_typography.scss", + "base/_typo-variables.scss", + "components/_barchart.scss", + "components/_buttons.scss", + "base/_mixins.scss", + "components/_card.scss", + "components/_dialog.scss", + "components/_expansion-panel.scss", + "components/_link.scss" + ], + "names": [], + "mappings": "AAAA;AACQ;AACR;AACQ;AACR;ACJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;ADhIQ;AEZR;EACE,YDDa;;;ACIf;EACE,YDLa;ECMb;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;EACE,kBDaM;;ACZN;EAFF;IAGI;IACA;;;;AAIJ;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA,SCxDS;EDyDT;EACA;EACA;;AACA;EAVF;IAWI;;;AAEF;EACE;EAKA;;AACA;EACE;EACA,ODvBQ;;AC0BZ;EACE;EACA;EACA;;AACA;EAJF;IAKI;;;AAEF;EAPF;IAQI;;;AAEF;EACE;EACA;;AACA;EACE;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA,ODlDM;;ACoDR;EACE;;AAEF;EACE;IACE;IACA,OD1DI;;EC4DN;IACE;;EAEF;IACE;;;;AAOV;EACE;EACA;EACA;EACA;EACA;EACA;EACA,OD9EY;;AC+EZ;EACE;EACA;EACA;;AAEF;EACE;EACA;;;AAIJ;AACE;AAIA;AAIA;;AAPA;EACE;;AAGF;EACE,YDHc;;ACMhB;EACE,YDNc;;;AAnJlB;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AAhJA;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AG5IA;EACE,aCLU;;;ADQZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE,OHsCU;EGrCV,aChBU;;;ADmBZ;EACE;EACA,aCrBU;EDsBV;EACA;EACA;EACA;;;AAGF;EACE,aC7BU;ED8BV;EACA;EACA;EACA;EAEA;EACA;EACA,OHeY;EGdZ;;;AAEF;EACE,OHtBY;EGuBZ;EACA;;;AAIA;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AA/BJ;EACE;EACA,WC/CQ;EDgDR;;AACA;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;;AACA;EAEE;;AAEF;EAEE;;AAGJ;EAEE;EACA;;;AAKN;AACA;EACE,aCrFU;EDsFV;EACA;EACA;EACA;EACA,OHtCY;;;AGwCd;EACE,aC7FU;ED8FV;EACA;EACA;EACA;EACA,OH9CY;;;AGgDd;EACE,aCrGU;EDsGV;EACA;EACA;EACA;EACA,OHtDY;;;AGwDd;EACE,aC7GU;ED8GV;EACA;EACA;EACA;EACA,OH9DY;;;AGgEd;EACE,aCrHU;EDsHV;EACA;EACA;EACA;EACA,OHtEY;;;AGyEd;AACA;EACE,aC/HU;EDgIV;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAGJ;EACE,aCzIU;ED0IV;EACA;EACA;EACA;;AACA;EANF;IAOI;;;;AAIJ;AACA;EACE,aCrJU;EDsJV;EACA;EACA;EACA;EACA,OHtGY;;;AApDd;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AK7IA;EACE,OLkDU;;AKjDV;EACE,MLgDQ;;AK/CR;EACE,ML4CQ;;AKzCZ;EACE;EACA;EACA;;;AAGJ;EACE,MLoCU;;AKnCV;EACE,MLgCU;;;AK3BZ;AAAA;EACE;;;AAGJ;EACE;;AACA;EACE;;;AAGJ;EACE;;;AAUA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;;AAGJ;EACE,MLuBe;;AKtBf;EACE,MLmBS;EKlBT;;;AAIJ;EACE,MLiBuB;;AKhBvB;EACE,MLciB;EKbjB;;;AAIJ;EACE,MLmBgB;;AKlBhB;EACE,MLeU;EKdV;;;AAIJ;EACE,MLawB;;AKZxB;EACE,MLUkB;EKTlB;;;AAIJ;EACE,MLHc;;AKId;EACE,MLPQ;EKQR;;;AAIJ;EACE,MLTsB;;AKUtB;EACE,MLZgB;EKahB;;;AAIJ;EACE,MLRgB;;AKShB;EACE,MLXU;EKYV;;AAGA;EACE;;;AAIN;EACE,MLpFW;;AKqFX;EACE,MLtFS;EKuFT;;AAGA;EACE;;;AAIN;EACE,ML1HK;EK2HL;;AACA;EACE,MLpCU;EKqCV;;AAGA;EACE;;;AAKN;EACE,ML5CwB;;AK6CxB;EACE,ML/CkB;EKgDlB;;;AAGJ;EACE;EACA,QLvDY;;;AKyDd;EACE,MLzEmB;;AK0EnB;EACE,ML3EiB;EK4EjB;;;AAGJ;EACE,ML/DoB;;AKgEpB;EACE,MLjEkB;EKkElB;;;AAGJ;AACA;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAEF;EACE;IACE;IACA;;EAEF;IACE;IACA;;EAEF;IACE;IACA;;;AAIJ;AACA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;ALxRF;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AM5IE;ECEA,YPiH4B;EOhH5B,kBPYY;EOXZ,QDHyC;ECIzC;EACA;EACA;EACA;EACA;;AACA;EACE,ODV8B;;ACYhC;EDXI;;ACiBJ;EACE;;ADfF;ECHA,YDQI;ECPJ,kBDII;ECHJ,QDKI;ECJJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPIU;;AOFZ;EDDI;;AACA;EACE;;ACKN;EACE;;ADFF;EChBA,YDqBI;ECpBJ,kBDiBI;EChBJ,QDkBI;ECjBJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPIU;;AOFZ;EDYI;;AACA;EACE;;ACRN;EACE;;ADWF;EC7BA,YDkCI;ECjCJ,kBD8BI;EC7BJ,QD+BI;EC9BJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPqCU;;AOnCZ;EDyBI;;AACA;EACE;;ACrBN;EACE;;ADwBF;EC1CA,YD+CI;EC9CJ,kBD2CI;EC1CJ,QD4CI;EC3CJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPqCU;;AOnCZ;EDsCI;;AACA;EACE;;AClCN;EACE;;ADqCF;ECvDA,YPFa;EOGb,kBPHa;EOIb,QDyDI;ECxDJ;EACA;EACA;EACA;EACA;;AACA;EACE,OPiCI;;AO/BN;EDmDI;;AC7CJ;EACE;;AD+CF;ECjEA,YPmBK;EOlBL,kBPkBK;EOjBL,QDgEwC;EC/DxC;EACA;EACA;EACA;EACA;;AACA;EACE,OPXW;;AOab;EDwDI;;AClDJ;EACE;;ADoDF;ECtEA;EACA,kBPHa;EOIb,QDqEyC;ECpEzC;EACA;EACA;EACA;EACA;;AACA;EACE,OPiCI;;AO/BN;ED6DI;;ACvDJ;EACE;;ADyDF;EC3EA,YPiH4B;EOhH5B,kBPYY;EOXZ,QD0EyC;ECzEzC;EACA;EACA;EACA;EACA;;AACA;EACE,ODmE8B;;ACjEhC;EDkEI;;AC5DJ;EACE;;AD8DF;EChFA,YDiF0C;EChF1C,kBDgFkB;EC/ElB,QD+EoC;EC9EpC;EACA;EACA;EACA;EACA;;AACA;EACE,OPsCQ;;AO9BV;EACE;;;APxBJ;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AQ9IA;EACE,YRoDgC;EQnDhC;EACA;EACA;EACA;EACA;;AACA;EACE,YRkDoC;;AQhDtC;EACE;;;ARbJ;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AS5IE;EACE;;;AAIJ;EACE,YT6CgC;ES5ChC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OT4BM;;AS3BN;EAZF;IAaI;IACA;;;AAEF;EAhBF;IAiBI;IACA;IACA;IACA;;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;;AAEF;EACE;EACA;EACA;EACA;EACA,SP9CO;;;AOkDX;EACE,YTEgC;ESDhC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTfM;ESgBN;EACA;;AACA;EACE,YT/DW;;;AAJf;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AU9IA;EACE;EACA,OVgDY;EU/CZ,YVkDgC;EUjDhC;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;EACA;EACA;;AAEF;EACE;;AACA;EACE;;AAGJ;EACE;EACA;;AAEF;EACE;;;AAGJ;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AVlDF;AAYA;AAGA;AAMA;AAGA;AAmBA;AAIA;AAIA;AAoBA;AA0BA;AA+CA;AW/IA;EACE,OXgBW;;AWfX;EACE,OXcS;;;AWVb;EACE;EACA;;AACA;EACE;;;AAGJ;EACE;;;AAEF;EACE,OXiCY;;;ADlCd;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EAME;EACA,kBCzDa", + "file": "index.css" +} diff --git a/src/styles/index.scss b/src/styles/index.scss index 6e47ddb514e9faab0bc57307ebb88ca09e5d2b70..8a59dff68acd362e56d2e14aed640426395ff42c 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -17,6 +17,7 @@ @import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap'); :root { + white-space: pre-line; --blue: #{$blue}; --blue40: #{$blue-40}; --blueBackground: #{$blue-radial-gradient}; @@ -62,6 +63,6 @@ background-color: $default-background; } -// .app-content { -// background-color: $default-background; -// } +.accordion-icon { + color: $white; +} diff --git a/src/targets/browser/index.ejs b/src/targets/browser/index.ejs index a30958e2e1852957cfaf60fe21636ceb27c1ee43..3e33cbc8b7c8394f7e2733f647e0bfe7bae03b36 100644 --- a/src/targets/browser/index.ejs +++ b/src/targets/browser/index.ejs @@ -21,6 +21,8 @@ <!-- PWA Colors --> <meta name="theme-color" content="#343641" /> <meta name="background-color" content="#121212" /> + <!-- PWA iOS title --> + <meta name="apple-mobile-web-app-title" content="Ecolyo"> <% _.forEach(htmlWebpackPlugin.files.css, function(file) { %> <link rel="stylesheet" href="<%- file %>"> diff --git a/src/targets/browser/index.tsx b/src/targets/browser/index.tsx index d1e86be12e9e35ea6b5cd2946f0e108a69ec9e14..f6ae853033dc29899b76261c543dbedfb47c23c9 100644 --- a/src/targets/browser/index.tsx +++ b/src/targets/browser/index.tsx @@ -1,26 +1,29 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-var-requires */ -/* global cozy */ declare let cozy: any declare let __PIWIK_TRACKER_URL__: string declare let __PIWIK_SITEID__: number +declare let __SENTRY_DSN__: string declare let Piwik: any -import '../../styles/index.scss' - -import React from 'react' -import { render } from 'react-dom' +import * as Sentry from '@sentry/react' +import { BrowserTracing } from '@sentry/tracing' import CozyClient, { Client, CozyProvider } from 'cozy-client' -import { Provider } from 'react-redux' -import configureStore from 'store' -import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n' import { handleOAuthResponse } from 'cozy-harvest-lib/dist/helpers/oauth' -import { memoize } from 'lodash' -import manifest from '../../../manifest.webapp' +import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n' import schema from 'doctypes' import { createBrowserHistory, History } from 'history' +import { memoize } from 'lodash' +import React from 'react' +import { render } from 'react-dom' +import { Provider } from 'react-redux' import { HashRouter } from 'react-router-dom' +import EnvironmentService from 'services/environment.service' +import configureStore from 'store' +import logApp from 'utils/logger' import MatomoTracker from 'utils/matomoTracker' +import manifest from '../../../manifest.webapp' +import '../../styles/index.scss' const setupApp = memoize(() => { const history: History = createBrowserHistory() @@ -47,6 +50,9 @@ const setupApp = memoize(() => { const persistedState: any = {} const store: any = configureStore(client, persistedState) + const envService = new EnvironmentService() + const isLocal = envService.isLocal() + const development = envService.isDev() cozy.bar.init({ appName: data.app.name, @@ -71,6 +77,21 @@ const setupApp = memoize(() => { }) } + Sentry.init({ + dsn: __SENTRY_DSN__, + integrations: [new BrowserTracing()], + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + // Set to 0 for local development + tracesSampleRate: isLocal ? 0 : 1.0, + + // Custom settings below + release: client.appMetadata.version, + environment: development ? 'development' : 'production', + // cast because init is somehow missing dsn property + } as Sentry.BrowserOptions) + return { root, store, client, locale, polyglot, history, tracker } }) @@ -102,7 +123,13 @@ if (!isSafari && 'serviceWorker' in navigator) { navigator.serviceWorker .register('/serviceWorker.js') .then(reg => console.log('service worker registered', reg.scope)) - .catch(err => console.log('service worker not registered', err)) + .catch(error => { + const errorMessage = `service worker not registered: ${JSON.stringify( + error + )}` + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + }) }) } diff --git a/src/targets/services/aggregatorUsageEvents.ts b/src/targets/services/aggregatorUsageEvents.ts index c9473a704dc67b98b1bbe708fc16b2106ec3189b..fbdbf208f27aef9a4d46fa81939868c9d25c87a8 100644 --- a/src/targets/services/aggregatorUsageEvents.ts +++ b/src/targets/services/aggregatorUsageEvents.ts @@ -21,8 +21,9 @@ import ProfileTypeEntityService from 'services/profileTypeEntity.service' import TermsService from 'services/terms.service' import { WarmingType } from 'enum/profileType.enum' import { FluidSlugType } from 'enum/fluidSlug.enum' +import * as Sentry from '@sentry/react' -const log = logger.namespace('aggregatorUsageEvents') +const logStack = logger.namespace('aggregatorUsageEvents') interface AggregatorUsageEventsProps { client: Client @@ -50,7 +51,7 @@ const sendIndicator = async ( ): Promise<boolean> => { try { const environmentService = new EnvironmentService() - log( + logStack( 'info', environmentService.isProduction() ? 'Sending data to dacc' @@ -72,10 +73,11 @@ const sendIndicator = async ( ) return true } catch (error) { - log( + logStack( 'error', `Error while sending indicator ${indicator.measureName} to remote doctype: ${error.message}` ) + Sentry.captureException(JSON.stringify({ error })) throw error } } @@ -171,9 +173,9 @@ const handleQuizStars = async (events: UsageEvent[], client: Client) => { measureName: DaccEvent.QUIZ_STARS, startDate: event.startDate ? event.startDate.toISODate() : '', value: parseInt(event.result ? event.result : '0'), - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { challenge_id: event.context ? event.context : '' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { quiz_id: event.target ? event.target : '' }, } const result = await sendIndicator(indicator, client) @@ -203,9 +205,9 @@ const calculSessionTime = async (events: UsageEvent[], client: Client) => { measureName: DaccEvent.SESSION_DURATION, startDate: startSessionDate.toISODate(), value: duration === undefined ? 0 : duration, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { number_pages: navigationCount.toString() }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { session_type: isFirstConnection ? 'first' : 'any' }, } await sendIndicator(sessionIndicator, client) @@ -229,9 +231,9 @@ const calculSessionTime = async (events: UsageEvent[], client: Client) => { measureName: DaccEvent.SESSION_DURATION, startDate: startSessionDate.toISODate(), value: duration === undefined ? 0 : duration, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { number_pages: navigationCount.toString() }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { session_type: isFirstConnection ? 'first' : 'any' }, } await sendIndicator(sessionIndicator, client) @@ -259,9 +261,9 @@ const calculPeriodBetweenFirstConnectionAndFirstChallenge = async ( value: challengeLaunchEvents[0].eventDate.diff( firstConnectionEvent.eventDate ).seconds, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { start_event: 'first_session' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { end_event: 'first_challenge' }, group3: { params: '' }, } @@ -307,9 +309,9 @@ const calculPeriodBetweenChallenge = async ( value: event.eventDate.diff( allEndedChallengeEvents[previousEndedChallengeIndex].eventDate ).seconds, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { start_event: 'first_session' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { end_event: 'first_challenge' }, group3: { params: event.target + ':' + prevChallengeId }, } @@ -353,7 +355,7 @@ const calculateConnectedKonnectorPerDay = async (client: Client) => { const connectedKonnectors = fluidStatus.filter( fluid => fluid.status === FluidState.DONE ) - log('info', 'calculateConnectedKonnectorPerDay') + logStack('info', 'calculateConnectedKonnectorPerDay') if (connectedKonnectors.length > 0) { const konnectorfluidTypes: FluidType[] = [] for (const konnector of connectedKonnectors) { @@ -485,7 +487,7 @@ const getConsumptionValue = async ( * @group [{ slug }, { seniority (in month) }, { profile (ECS, chauffage, etc...) }], */ const calculateConsumptionVariation = async (client: Client) => { - log('info', `calculateConsumptionVariation`) + logStack('info', `calculateConsumptionVariation`) const consumptionData = await getConsumptionValue(client, [ FluidType.ELECTRICITY, FluidType.GAS, @@ -527,12 +529,12 @@ const calculateConsumptionVariation = async (client: Client) => { consumptionData[fluidType].percentageVariation ? consumptionData[fluidType].percentageVariation : 0, // in percent - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { fluid_type: FluidType[fluidType].toLowerCase() }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { seniority: Math.round(seniority).toString() }, group3: { - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase fluid_usage: await buildProfileWithFuildType( client, getFluidType(FluidType[fluidType]) @@ -561,7 +563,7 @@ const calculateConsumptionVariation = async (client: Client) => { }) if (events.length > 0 && consumptionVariationIndicator.value !== 0) { - log( + logStack( 'info', `Send variation indicator : ${JSON.stringify( consumptionVariationIndicator @@ -575,7 +577,7 @@ const calculateConsumptionVariation = async (client: Client) => { } const sendConnectionCount = async (client: Client) => { - log('info', `sendConnectionCount`) + logStack('info', `sendConnectionCount`) // Get daily connexion const events: UsageEvent[] = await UsageEventService.getEvents(client, { type: UsageEventType.CONNECTION_EVENT, @@ -616,7 +618,7 @@ const sendConnectionCount = async (client: Client) => { .toISODate(), value: uniqueDates, } - log( + logStack( 'info', `Send connectionMonthly indicator : ${JSON.stringify(connectionMonthly)}` ) @@ -624,7 +626,7 @@ const sendConnectionCount = async (client: Client) => { } const sendProfileCount = async (client: Client) => { - log('info', `sendProfileCount`) + logStack('info', `sendProfileCount`) // Get profile setEvents const events: UsageEvent[] = await UsageEventService.getEvents(client, { type: UsageEventType.PROFILE_SET_EVENT, @@ -648,7 +650,7 @@ const sendProfileCount = async (client: Client) => { } const sendEmailSubscription = async (client: Client) => { - log('info', `sendEmailSubscription`) + logStack('info', `sendEmailSubscription`) const profile = await new ProfileService(client).getProfile() if (profile?.sendAnalysisNotification) { const cameBackFromEmail: Indicator = { @@ -661,7 +663,7 @@ const sendEmailSubscription = async (client: Client) => { .startOf('day') .toISODate(), value: profile.sendAnalysisNotification ? 1 : 0, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { event_type: 'subscribed' }, } await sendIndicator(cameBackFromEmail, client) @@ -673,7 +675,7 @@ const sendEmailSubscription = async (client: Client) => { * @param client CozyClient */ const sendHalfHourConsumption = async (client: Client) => { - log('info', `sendHalfHourConsumption`) + logStack('info', `sendHalfHourConsumption`) const consumptionService = new ConsumptionService(client) const data = await consumptionService.getLastHourData( @@ -684,9 +686,9 @@ const sendHalfHourConsumption = async (client: Client) => { const halfHourConsumption: Indicator = { createdBy: 'ecolyo', measureName: DaccEvent.FLUID_DATA_GRANULARITY, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { fluid_type: 'electricity' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { granularity: 'half_hour' }, startDate: DateTime.local() .setZone('utc', { @@ -704,7 +706,7 @@ const sendHalfHourConsumption = async (client: Client) => { * @param client CozyClient */ const sendKonnectorEvents = async (client: Client) => { - log('info', `sendKonnectorEvents`) + logStack('info', `sendKonnectorEvents`) const slugs = Object.values(FluidSlugType) const today = DateTime.local().setZone('utc', { keepLocalTime: true, @@ -772,7 +774,7 @@ const sendKonnectorEvents = async (client: Client) => { const konnectorSuccess: Indicator = { createdBy: 'ecolyo', measureName: DaccEvent.PARTNER_SUCESS_MONTHLY, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { fluid_type: slug }, startDate: DateTime.local() .setZone('utc', { @@ -796,7 +798,7 @@ const sendKonnectorEvents = async (client: Client) => { * @param client CozyClient */ const sendKonnectorAttemptsMonthly = async (client: Client) => { - log('info', `sendkonnectorAttemptsMonthly`) + logStack('info', `sendkonnectorAttemptsMonthly`) const slugs = Object.values(FluidSlugType) const today = DateTime.local().setZone('utc', { keepLocalTime: true, @@ -815,7 +817,7 @@ const sendKonnectorAttemptsMonthly = async (client: Client) => { }, true ) - log('info', ` : ${JSON.stringify(konnectorEvents)}`) + logStack('info', ` : ${JSON.stringify(konnectorEvents)}`) // Check if there is a success (will be false or true since the event is triggered only for the first connexion) const success: boolean = @@ -824,7 +826,7 @@ const sendKonnectorAttemptsMonthly = async (client: Client) => { const konnectorAttempts: Indicator = { createdBy: 'ecolyo', measureName: DaccEvent.UNINITIALIZED_KONNECTOR_ATTEMPTS_MONTHLY, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { slug: slug }, group2: { success: success }, startDate: DateTime.local() @@ -991,9 +993,9 @@ const aggregateEvents = async ( value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { start_event: 'start_challenge' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { end_event: 'end_challenge' }, group3: { params: event.target ? event.target : '' }, } @@ -1016,9 +1018,9 @@ const aggregateEvents = async ( value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { start_event: 'start_exploration' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { end_event: 'end_exploration' }, group3: { params: event.context + ':' + event.target }, } @@ -1038,9 +1040,9 @@ const aggregateEvents = async ( value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { start_event: 'start_action' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { end_event: 'end_action' }, group3: { params: event.target + ':' + event.context }, } @@ -1060,9 +1062,9 @@ const aggregateEvents = async ( value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { start_event: 'start_duel' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { end_event: 'end_duel' }, group3: { params: event.target + ':' + event.context + ':' + event.result, @@ -1105,9 +1107,9 @@ const aggregateEvents = async ( value: event.startDate ? event.eventDate.diff(event.startDate, ['seconds']).seconds : 0, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { start_event: 'start_duel' }, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group2: { end_event: 'start_duel' }, group3: { params: event.target + ':' + event.context + ':' + starNumbers, @@ -1135,7 +1137,7 @@ const aggregateEvents = async ( measureName: DaccEvent.SUMMARY_SUBSCRIPTION_MONTHLY, startDate: event.eventDate.toISODate(), value: 1, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line camelcase group1: { event_type: 'email' }, } const result = await sendIndicator(cameBackFromEmail, client) @@ -1153,11 +1155,11 @@ const aggregateEvents = async ( const AggregatorUsageEvents = async ({ client, }: AggregatorUsageEventsProps) => { - log('info', 'Launch service') - log('info', 'Dacc consent validation...') + logStack('info', 'Launch service') + logStack('info', 'Dacc consent validation...') const termService = new TermsService(client) if (!(await termService.getLastTerm())) { - log('info', 'Exit: no consent available') + logStack('info', 'Exit: no consent available') return } @@ -1176,10 +1178,10 @@ const AggregatorUsageEvents = async ({ result: 'firstConnection', }) if (events.length > 0) { - log('info', `Fetching Sessions`) + logStack('info', `Fetching Sessions`) calculSessionTime(events, client) for (const eventType of Object.values(UsageEventType)) { - log('info', `Fetching ${eventType}`) + logStack('info', `Fetching ${eventType}`) const filteredEvents: UsageEvent[] = events.filter( event => event.type === eventType ) @@ -1215,7 +1217,7 @@ const AggregatorUsageEvents = async ({ } const uniqueReadUsageEvents: UsageEvent[] = uniq(readUsageEvents) - log( + logStack( 'info', `Tag aggregated usage: total of ${uniqueReadUsageEvents.length} events` ) @@ -1230,11 +1232,12 @@ const AggregatorUsageEvents = async ({ errorEvent.forEach(el => { error += `${el.doctype}, ` }) - log('error', error) + logStack('error', error) + Sentry.captureException(JSON.stringify({ error })) throw error } - log('info', 'End of service') + logStack('info', 'End of service') } runService(AggregatorUsageEvents) diff --git a/src/targets/services/consumptionAlert.ts b/src/targets/services/consumptionAlert.ts index 44c288a08bf78d073cd023ac2558299425af9f83..668306c107dc461601ff8750aeaa0a75f6993611 100644 --- a/src/targets/services/consumptionAlert.ts +++ b/src/targets/services/consumptionAlert.ts @@ -12,7 +12,7 @@ import ConsumptionService from 'services/consumption.service' import { getPreviousMonthName } from 'utils/utils' import EnvironmentService from 'services/environment.service' -const log = logger.namespace('alert') +const logStack = logger.namespace('alert') interface ConsumptionAlertProps { client: Client @@ -20,7 +20,7 @@ interface ConsumptionAlertProps { // Only monitoring WATER fluid for now const consumptionAlert = async ({ client }: ConsumptionAlertProps) => { - log('info', 'Fetching user profile...') + logStack('info', 'Fetching user profile...') const upm = new ProfileService(client) const consumptionService = new ConsumptionService(client) const userProfil = await upm.getProfile() @@ -29,7 +29,7 @@ const consumptionAlert = async ({ client }: ConsumptionAlertProps) => { !userProfil.sendConsumptionAlert || userProfil.waterDailyConsumptionLimit === 0 ) { - log( + logStack( 'info', 'End of process - Alert report notification is disabled or lack informations from user profile to run' ) @@ -38,9 +38,9 @@ const consumptionAlert = async ({ client }: ConsumptionAlertProps) => { let username = '' - log('info', 'water limit is :' + userProfil.waterDailyConsumptionLimit) + logStack('info', 'water limit is :' + userProfil.waterDailyConsumptionLimit) - log('info', 'Fetching fluid data...') + logStack('info', 'Fetching fluid data...') // Retrieve public name from the stack const settings = await client .getStackClient() @@ -59,25 +59,24 @@ const consumptionAlert = async ({ client }: ConsumptionAlertProps) => { let alertDay: DateTime = DateTime.local().setZone('utc', { keepLocalTime: true, }) + if (fetchedData && fetchedData.length > 0) { fetchedData.forEach(element => { - if (element.value) { + if (element.value > lastDayValue) { lastDayValue = element.value - } - if (element.date) { alertDay = element.date } }) } if (lastDayValue <= userProfil.waterDailyConsumptionLimit) { - log( + logStack( 'info', 'End of process - Limit consumption set by the user has not been passed.' ) return } - log('info', 'Creation of mail...') + logStack('info', 'Creation of mail...') const mailService = new MailService() const environmentService = new EnvironmentService() @@ -103,7 +102,7 @@ const consumptionAlert = async ({ client }: ConsumptionAlertProps) => { ], } - log('info', 'Sending mail...') + logStack('info', 'Sending mail...') mailService.SendMail(client, mailData) } diff --git a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts index e512b63d28d6773174bd8c09b7db5d2b25f5899e..3f9a56f5067212532b5652b798e69f526cb9a81c 100644 --- a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts +++ b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts @@ -1,20 +1,21 @@ -import logger from 'cozy-logger' +import * as Sentry from '@sentry/react' import { Client } from 'cozy-client' -import { DateTime } from 'luxon' -import { Datachart, DataloadEntity, TimePeriod } from 'models' -import { runService } from './service' -import { FluidType } from 'enum/fluid.enum' -import { TimeStep } from 'enum/timeStep.enum' -import ConsumptionService from 'services/consumption.service' -import { EnedisMonthlyAnalysisData } from 'models/enedisMonthlyAnalysis' -import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service' +import logger from 'cozy-logger' import { ENEDIS_MINUTE_DOCTYPE, ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE, } from 'doctypes' +import { FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' import { union } from 'lodash' +import { DateTime } from 'luxon' +import { Datachart, DataloadEntity, TimePeriod } from 'models' +import { EnedisMonthlyAnalysisData } from 'models/enedisMonthlyAnalysis' +import ConsumptionService from 'services/consumption.service' +import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service' +import { runService } from './service' -const log = logger.namespace('report') +const logStack = logger.namespace('report') interface EnedisMonthlyProps { client: Client @@ -35,7 +36,7 @@ const getMinMonthlyLoad = ( const filteredTotal = totalArray.filter(val => val !== -1 && val !== 0) const talonCons = Math.min(...filteredTotal) const minCons = talonCons * 48 * numberofDaysInMonth - log('info', `Minimum value is ${minCons} `) + logStack('info', `Minimum value is ${minCons} `) return minCons } @@ -87,7 +88,7 @@ const getMonthMaxPower = async ( client: Client ) => { const emas = new EnedisMonthlyAnalysisDataService(client) - log('info', `Fetching max power for month ${month} of year ${year}`) + logStack('info', `Fetching max power for month ${month} of year ${year}`) const data = await emas.getMaxPowerByDate(year, month) const maxPowerArray: number[] = [] if (data?.length) { @@ -109,7 +110,10 @@ const getEnedisMonthAnalysisData = async ( month: number, year: number ): Promise<EnedisMonthlyAnalysisData | undefined> => { - log('info', `Getting enedis analysis data for month ${month} of year ${year}`) + logStack( + 'info', + `Getting enedis analysis data for month ${month} of year ${year}` + ) const timePeriod = { startDate: DateTime.fromObject({ month: month, year: year }).startOf( @@ -197,7 +201,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ const lastEnedisMonthlyAnalysis = await emas.getLastEnedisMonthlyAnalysis() if (firstMinuteData && firstMinuteData[0]) { //First creates the analysis of the month - 1 - log('info', 'Fetching last Enedis monthly Analysis...') + logStack('info', 'Fetching last Enedis monthly Analysis...') const firstMinuteDate = DateTime.fromObject({ year: firstMinuteData[0].year, month: firstMinuteData[0].month, @@ -217,12 +221,17 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ if (data) { const created = await emas.createEnedisMonthlyAnalysisData(data) if (created) { - log('success', 'Created successfully ! ') + logStack('success', 'Created successfully ! ') } else { - log('error', 'Failed to create last Enedis monthly Analysis ') + logStack('error', 'Failed to create last Enedis monthly Analysis') + Sentry.captureException( + JSON.stringify({ + error: 'Failed to create last Enedis monthly Analysis ', + }) + ) } } - log('info', 'Getting first endis half hour data date') + logStack('info', 'Getting first endis half hour data date') if (lastEnedisMonthlyAnalysis.length > 0) { //If user has more than one entry (already synced), fetch the full history @@ -233,10 +242,10 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ firstEnedisMonthlyAnalysis[0]?.month === firstMinuteData[0].month && firstEnedisMonthlyAnalysis[0]?.year === firstMinuteData[0].year ) { - log('info', 'Every Enedis Anlysis already synchronized') + logStack('info', 'Every Enedis Anlysis already synchronized') return } else if (firstEnedisMonthlyAnalysis) { - log( + logStack( 'info', 'Doctype is partially completed, fetiching all available history' ) @@ -263,7 +272,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ } } else { //If user only have the last analysis available, fetch one year history - log( + logStack( 'info', 'Doctype is empty, fetching history for one year maximum or until first enedis minute date' ) @@ -288,7 +297,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ } } } else { - log( + logStack( 'info', 'Enedis Minute is not activated or there is no data yet in this doctype' ) diff --git a/src/targets/services/fluidsPrices.ts b/src/targets/services/fluidsPrices.ts index f8ba71ff41315bb690c8f18d97ab91454dd64509..4f4c1137cee6ae0244fef384fa2dee0d953a6e0f 100644 --- a/src/targets/services/fluidsPrices.ts +++ b/src/targets/services/fluidsPrices.ts @@ -1,16 +1,22 @@ -import logger from 'cozy-logger' +import * as Sentry from '@sentry/react' import { Client } from 'cozy-client' -import { runService } from './service' +import logger from 'cozy-logger' +import { EGL_DAY_DOCTYPE, ENEDIS_DAY_DOCTYPE, GRDF_DAY_DOCTYPE } from 'doctypes' +import { + REMOTE_ORG_ECOLYO_AGENT_PRICES, + REMOTE_ORG_ECOLYO_AGENT_PRICES_REC, +} from 'doctypes/remote/org.ecolyo.agent.prices' +import { FluidType } from 'enum/fluid.enum' +import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' -import FluidPricesService from 'services/fluidsPrices.service' import { DataloadEntity, FluidPrice, TimePeriod } from 'models' import ConsumptionDataManager from 'services/consumption.service' -import { TimeStep } from 'enum/timeStep.enum' -import { ENEDIS_DAY_DOCTYPE, GRDF_DAY_DOCTYPE, EGL_DAY_DOCTYPE } from 'doctypes' -import { FluidType } from 'enum/fluid.enum' -import QueryRunner from 'services/queryRunner.service' import EnvironmentService from 'services/environment.service' -const log = logger.namespace('fluidPrices') +import FluidPricesService from 'services/fluidsPrices.service' +import QueryRunner from 'services/queryRunner.service' +import { runService } from './service' + +const logStack = logger.namespace('fluidPrices') interface PricesProps { client: Client @@ -22,8 +28,8 @@ const getRemotePricesByfluid = async ( ): Promise<FluidPrice[]> => { const env = new EnvironmentService() const remoteUrl = env.isProduction() - ? `/remote/org.ecolyo.backoffice.prices` - : `/remote/org.ecolyo.backoffice.prices.rec` + ? REMOTE_ORG_ECOLYO_AGENT_PRICES + : REMOTE_ORG_ECOLYO_AGENT_PRICES_REC const prices = await client .getStackClient() .fetchJSON('GET', `${remoteUrl}?fluidtype=${fluidType}`) @@ -44,7 +50,8 @@ const synchroPricesToUpdate = async ( const remotePrices = await getRemotePricesByfluid(client, fluidType) let firstEditedPrice: string | null = null await Promise.all( - remotePrices.map(async remotePrice => { + remotePrices.map(remotePrice => { + //eslint-disable-next-line no-async-promise-executor return new Promise<void>(async resolve => { try { //Check if price exist in database @@ -56,7 +63,10 @@ const synchroPricesToUpdate = async ( remotePrice.UpdatedAt && existingPrice.UpdatedAt < remotePrice.UpdatedAt ) { - log('debug', `Price exist in db but not up to date, updating it`) + logStack( + 'debug', + `Price exist in db but not up to date, updating it` + ) //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation if (firstEditedPrice === null) { firstEditedPrice = remotePrice.startDate @@ -78,10 +88,10 @@ const synchroPricesToUpdate = async ( UpdatedAt: remotePrice.UpdatedAt, }) } else { - log('debug', `Price up to date`) + logStack('debug', `Price up to date`) } } else { - log('debug', `Price doesn't exist in db, creating new price`) + logStack('debug', `Price doesn't exist in db, creating new price`) //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation if (firstEditedPrice === null) { firstEditedPrice = remotePrice.startDate @@ -92,8 +102,9 @@ const synchroPricesToUpdate = async ( //create price in db await fps.createPrice(remotePrice) } - } catch (err) { - log('error', `Error: ${err}`) + } catch (error) { + logStack('error', `Error: ${error}`) + Sentry.captureException(JSON.stringify({ error })) } finally { resolve() } @@ -133,7 +144,10 @@ const getTimePeriod = async ( endDate: date.endOf('year'), } default: - log('error', 'Unhandled time period') + logStack('error', 'Unhandled time period') + Sentry.captureException( + JSON.stringify({ error: 'Unhandled time period' }) + ) throw Error('Unhandled time period') } } @@ -146,12 +160,13 @@ const aggregatePrices = async ( fluidType: FluidType ) => { const tsa = [TimeStep.MONTH, TimeStep.YEAR] - log( + logStack( 'debug', `Aggregation started for fluid: ${fluidType}, from ${firstDate} ` ) await Promise.all( tsa.map(async ts => { + // eslint-disable-next-line no-async-promise-executor return new Promise<void>(async resolve => { let date: DateTime = DateTime.local() Object.assign(date, firstDate) @@ -179,15 +194,16 @@ const aggregatePrices = async ( date = date.plus({ month: 1 }).startOf('month') } } while (date < today) - } catch (err) { - log('info', `Error : ${err}`) + } catch (error) { + logStack('info', `Error : ${error}`) + Sentry.captureException(JSON.stringify({ error })) } finally { resolve() } }) }) ) - log('debug', `Aggregation done`) + logStack('debug', `Aggregation done`) } const getDoctypeTypeByFluid = (fluidType: FluidType): string => { @@ -200,7 +216,8 @@ const getDoctypeTypeByFluid = (fluidType: FluidType): string => { if (fluidType === FluidType.WATER) { return EGL_DAY_DOCTYPE } - log('error', 'Unkown FluidType') + logStack('error', 'Unkown FluidType') + Sentry.captureException({ error: 'Unkown FluidType Doctype' }) throw new Error() } @@ -211,8 +228,8 @@ const getTimeSetByFluid = (fluidType: FluidType): TimeStep[] => { if (fluidType === FluidType.GAS || fluidType === FluidType.WATER) { return [TimeStep.DAY] } - - log('error', 'Unkown FluidType') + logStack('error', 'Unkown FluidType') + Sentry.captureException({ error: 'Unkown FluidType' }) throw new Error() } @@ -228,7 +245,7 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { const prices = await fluidsPricesService.getAllPrices() // Prices data exsit if (prices.length > 0) { - log('debug', 'fluidPrices data found') + logStack('debug', 'fluidPrices data found') const firstMinuteData = await cdm.getFirstDataDateFromDoctypeWithPrice( getDoctypeTypeByFluid(fluidType) ) @@ -285,6 +302,7 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { // Hourly and daily prices await Promise.all( tsa.map(async timeStep => { + // eslint-disable-next-line no-async-promise-executor return new Promise<void>(async resolve => { let date: DateTime = DateTime.local().setZone('utc', { keepLocalTime: true, @@ -323,8 +341,9 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { date = date.plus({ month: 1 }).startOf('month') } } while (date < today) - } catch (err) { - log('error', `ERROR : ${err} `) + } catch (error) { + logStack('error', `ERROR : ${error} `) + Sentry.captureException(JSON.stringify({ error })) } finally { resolve() } @@ -334,22 +353,22 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { // Call aggregation method await aggregatePrices(qr, cdm, firstDate, today, fluidType) - } else log('info', `No data found for fluid ${fluidType}`) - } else log('info', 'No fluidesPrices data') + } else logStack('info', `No data found for fluid ${fluidType}`) + } else logStack('info', 'No fluidesPrices data') } const processPrices = async ({ client }: PricesProps) => { - log('info', `Processing electricity data...`) + logStack('info', `Processing electricity data...`) const elec = applyPrices(client, FluidType.ELECTRICITY) - log('info', `Electricity data done`) - log('info', `Processing gas data...`) + logStack('info', `Electricity data done`) + logStack('info', `Processing gas data...`) const gas = applyPrices(client, FluidType.GAS) - log('info', `Gas data done`) - log('info', `Processing water data...`) + logStack('info', `Gas data done`) + logStack('info', `Processing water data...`) const water = applyPrices(client, FluidType.WATER) - log('info', `Water data done`) + logStack('info', `Water data done`) await Promise.all([elec, gas, water]) - log('info', `processPrices done`) + logStack('info', `processPrices done`) } runService(processPrices) diff --git a/src/targets/services/monthlyReportNotification.ts b/src/targets/services/monthlyReportNotification.ts index d41bec8bbe2b79ae41b148c2ae8acd7e95a84513..33bca041bb55e546a208afce0b1a586ef6f51629 100644 --- a/src/targets/services/monthlyReportNotification.ts +++ b/src/targets/services/monthlyReportNotification.ts @@ -1,5 +1,10 @@ +import * as Sentry from '@sentry/react' import { Client } from 'cozy-client' import logger from 'cozy-logger' +import { + REMOTE_ORG_ECOLYO_AGENT, + REMOTE_ORG_ECOLYO_AGENT_REC, +} from 'doctypes/remote/org.ecolyo.agent' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' import get from 'lodash/get' @@ -15,7 +20,7 @@ import { getMonthNameWithPrep } from 'utils/utils' import { runService } from './service' const monthlyReportTemplate = require('notifications/monthlyReport.hbs') -const log = logger.namespace('report') +const logStack = logger.namespace('report') interface MonthlyReportNotificationProps { client: Client @@ -42,13 +47,12 @@ const getConsumptionValue = async ( endDate: analysisDate.minus({ month: 2 }).endOf('month'), }, } - const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators( + return consumptionService.getPerformanceIndicators( periods.timePeriod, TimeStep.MONTH, fluidType, periods.comparisonTimePeriod ) - return fetchedPerformanceIndicators } /** @@ -57,7 +61,7 @@ const getConsumptionValue = async ( * @returns string */ const buildConsumptionText = async (client: Client) => { - log('info', 'Building consumption text...') + logStack('info', 'Building consumption text...') const consumption = await getConsumptionValue(client, [ FluidType.ELECTRICITY, FluidType.GAS, @@ -133,7 +137,7 @@ const getMonthlyReport = async ( ): Promise<MonthlyReport> => { try { const environmentService = new EnvironmentService() - log( + logStack( 'info', environmentService.isProduction() ? 'Fetching data from BO prod' @@ -145,12 +149,13 @@ const getMonthlyReport = async ( .fetchJSON( 'GET', environmentService.isProduction() - ? `/remote/org.ecolyo.backoffice?year=${year}&month=${month}` - : `/remote/org.ecolyo.backoffice.rec?year=${year}&month=${month}` + ? `${REMOTE_ORG_ECOLYO_AGENT}?year=${year}&month=${month}` + : `${REMOTE_ORG_ECOLYO_AGENT_REC}?year=${year}&month=${month}` ) return result } catch (error) { - log('error', error) + logStack('error', JSON.stringify(error)) + Sentry.captureException(JSON.stringify({ error })) return { year: parseInt(year), month: parseInt(month), @@ -168,26 +173,28 @@ const getMonthlyReport = async ( const monthlyReportNotification = async ({ client, }: MonthlyReportNotificationProps) => { - log('info', 'Fetching user profile...') + logStack('info', 'Fetching user profile...') const upm = new ProfileService(client) let userProfil = await upm.getProfile() if (!userProfil || !userProfil.sendAnalysisNotification) { - log('info', 'End of process - Report Notification disabled in user profile') + logStack( + 'info', + 'End of process - Report Notification disabled in user profile' + ) return } // Init mail token for user in case he don't have one if (!userProfil.mailToken || userProfil.mailToken === '') { - const token: string = require('crypto') - .randomBytes(48) - .toString('hex') + const token: string = require('crypto').randomBytes(48).toString('hex') try { await upm.updateProfile({ mailToken: token, }) } catch (error) { - log('error', 'Update mailToken user profile error : ' + error) + logStack('error', 'Update mailToken user profile error : ' + error) + Sentry.captureException(JSON.stringify({ error })) throw error } } @@ -195,7 +202,7 @@ const monthlyReportNotification = async ({ let username = '' let url = '' - log('info', 'Fetching data for mail...') + logStack('info', 'Fetching data for mail...') // Retrieve public name from the stack const settings = await client .getStackClient() @@ -212,7 +219,7 @@ const monthlyReportNotification = async ({ url = appLink } - log('info', 'Creation of mail...') + logStack('info', 'Creation of mail...') const mailService = new MailService() const today = DateTime.local().setZone('utc', { @@ -301,7 +308,7 @@ const monthlyReportNotification = async ({ }, ], } - log('info', 'Sending mail...') + logStack('info', 'Sending mail...') mailService.SendMail(client, mailData) } diff --git a/src/targets/vendor/assets/android-chrome-192x192.png b/src/targets/vendor/assets/android-chrome-192x192.png index 484cf8d5b725602c0769ca600c1e4394cb7628f0..8099efe9e64a487c65cd43124539328bb7ca600f 100644 Binary files a/src/targets/vendor/assets/android-chrome-192x192.png and b/src/targets/vendor/assets/android-chrome-192x192.png differ diff --git a/src/targets/vendor/assets/android-chrome-512x512.png b/src/targets/vendor/assets/android-chrome-512x512.png index 35d99717937073d405f90c5a5e029d4ce57548ae..3a9c589993c73d602e95ab9e1c4ab20fbfbdad47 100644 Binary files a/src/targets/vendor/assets/android-chrome-512x512.png and b/src/targets/vendor/assets/android-chrome-512x512.png differ diff --git a/src/targets/vendor/assets/apple-touch-icon.png b/src/targets/vendor/assets/apple-touch-icon.png index 6e9f08491e80c9b5b19817c83ab15140f032525a..8099efe9e64a487c65cd43124539328bb7ca600f 100644 Binary files a/src/targets/vendor/assets/apple-touch-icon.png and b/src/targets/vendor/assets/apple-touch-icon.png differ diff --git a/src/targets/vendor/assets/favicon-16x16.ico b/src/targets/vendor/assets/favicon-16x16.ico index 9de53fc215d7c5f6237dc683a227df9bef053ced..29787005e1efcabcff52a2fd4c3ca4db9c869453 100644 Binary files a/src/targets/vendor/assets/favicon-16x16.ico and b/src/targets/vendor/assets/favicon-16x16.ico differ diff --git a/src/targets/vendor/assets/favicon-16x16.png b/src/targets/vendor/assets/favicon-16x16.png index a8fefecc1d2c2d1e5970cdc0bcd110a19edeea31..29787005e1efcabcff52a2fd4c3ca4db9c869453 100644 Binary files a/src/targets/vendor/assets/favicon-16x16.png and b/src/targets/vendor/assets/favicon-16x16.png differ diff --git a/src/targets/vendor/assets/favicon-32x32.png b/src/targets/vendor/assets/favicon-32x32.png index 6cc0fb12ad9afd1702985556560b2bc30a19fe86..c065b0c2909a48cf49774d75ef8271a0c251aef3 100644 Binary files a/src/targets/vendor/assets/favicon-32x32.png and b/src/targets/vendor/assets/favicon-32x32.png differ diff --git a/src/targets/vendor/assets/icon.svg b/src/targets/vendor/assets/icon.svg index 7c0e38096960afb18746a2285ee2533ede3f46ef..077a6aa23aa138ccb4af6706c31b479742eabf6a 100644 --- a/src/targets/vendor/assets/icon.svg +++ b/src/targets/vendor/assets/icon.svg @@ -1,6 +1,27 @@ -<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M8.01323 15.059C14.8544 12.3888 14.3227 8.59276 13.9682 2.93081C11.7705 2.8343 9.82099 2.15873 8.01323 1.03278C6.20546 2.15873 4.25592 2.8343 2.05825 2.93081C1.70378 8.59276 1.17209 12.3888 8.01323 15.059Z" fill="#1B1C22"/> -<path d="M8.01325 0L7.54979 0.288665C5.85495 1.34429 4.05006 1.96586 2.01981 2.05502L1.23259 2.08959L1.18335 2.87604C1.16873 3.10958 1.15353 3.34193 1.13842 3.57294C0.97583 6.05878 0.823332 8.39029 1.50758 10.3994C2.29645 12.7158 4.12651 14.483 7.69452 15.8756L8.01325 16V15.059C1.44034 12.4935 1.67345 8.88869 2.01622 3.58822C2.03021 3.37192 2.04438 3.1528 2.05827 2.93081C4.25595 2.8343 6.20549 2.15873 8.01325 1.03277V0Z" fill="#FFC600"/> -<path d="M8.01323 0L8.4767 0.288665C10.1715 1.34429 11.9764 1.96586 14.0067 2.05502L14.7939 2.08959L14.8431 2.87604C14.8578 3.10958 14.873 3.34193 14.8881 3.57294C15.0507 6.05878 15.2032 8.39029 14.5189 10.3994C13.73 12.7158 11.9 14.483 8.33197 15.8756L8.01323 16V15.059C14.5862 12.4935 14.353 8.88869 14.0103 3.58822C13.9963 3.37192 13.9821 3.1528 13.9682 2.93081C11.7705 2.8343 9.821 2.15873 8.01323 1.03277V0Z" fill="#DB8300"/> -<path d="M5.85148 5.51416H6.16248C6.28668 5.51416 6.4058 5.56292 6.49363 5.64973C6.58146 5.73653 6.6308 5.85427 6.6308 5.97703V10.6758H5.38316V5.97703C5.38316 5.85427 5.4325 5.73653 5.52033 5.64973C5.60815 5.56292 5.72727 5.51416 5.85148 5.51416ZM8.01233 7.80214H8.32333C8.44754 7.80214 8.56666 7.85091 8.65448 7.93771C8.74231 8.02452 8.79165 8.14225 8.79165 8.26502V10.6758H7.54401V8.26502C7.54401 8.14225 7.59335 8.02452 7.68118 7.93771C7.76901 7.85091 7.88813 7.80214 8.01233 7.80214ZM10.302 6.91708H10.613C10.7372 6.91708 10.8563 6.96584 10.9441 7.05265C11.032 7.13945 11.0813 7.25719 11.0813 7.37995V10.6758H9.83366V7.37995C9.83366 7.25719 9.883 7.13945 9.97083 7.05265C10.0587 6.96584 10.1778 6.91708 10.302 6.91708Z" fill="#FFC600"/> -</svg> +<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M15.482 30.8986C15.8087 31.0338 16.1913 31.0338 16.518 30.8986C29.9643 25.3372 29.4176 17.5471 28.6963 6.14473C28.6499 5.41154 28.0705 4.83408 27.3552 4.76585C23.5052 4.39858 20.0149 3.15649 16.749 1.20703C16.2866 0.930988 15.7134 0.930988 15.251 1.20704C11.9851 3.15649 8.49482 4.39858 4.64475 4.76585C3.92946 4.83408 3.35013 5.41154 3.30374 6.14473C2.58237 17.5471 2.03569 25.3372 15.482 30.8986Z" fill="url(#paint0_radial_14017_3981)"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M27.9568 5.90039C28.3484 11.9678 28.6003 16.5478 27.2038 20.3682C25.8732 24.0084 22.9098 27.2291 16.0001 30.0528C9.09051 27.2291 6.12711 24.0084 4.7965 20.3682C3.40001 16.5478 3.65191 11.9678 4.0435 5.90039C8.38981 5.45722 12.3341 4.07779 16.0001 1.96244C19.6662 4.07779 23.6105 5.45722 27.9568 5.90039ZM16.5652 31.8919C16.2088 32.036 15.7915 32.036 15.435 31.8919C0.823247 25.9826 1.35837 17.7147 2.14057 5.62899L2.14972 5.48771C2.20032 4.70565 2.83231 4.08969 3.61263 4.0169C7.81269 3.62516 11.6202 2.30026 15.183 0.220837C15.6875 -0.0736124 16.3127 -0.0736124 16.8172 0.220837C20.38 2.30026 24.1876 3.62516 28.3877 4.0169C29.168 4.08968 29.8 4.70565 29.8506 5.48771L29.8597 5.62898C30.6419 17.7146 31.177 25.9826 16.5652 31.8919Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M27.9568 5.90039C28.3484 11.9678 28.6003 16.5478 27.2038 20.3682C25.8732 24.0084 22.9098 27.2291 16.0001 30.0528C9.09051 27.2291 6.12711 24.0084 4.7965 20.3682C3.40001 16.5478 3.65191 11.9678 4.0435 5.90039C8.38981 5.45722 12.3341 4.07779 16.0001 1.96244C19.6662 4.07779 23.6105 5.45722 27.9568 5.90039ZM16.5652 31.8919C16.2088 32.036 15.7915 32.036 15.435 31.8919C0.823247 25.9826 1.35837 17.7147 2.14057 5.62899L2.14972 5.48771C2.20032 4.70565 2.83231 4.08969 3.61263 4.0169C7.81269 3.62516 11.6202 2.30026 15.183 0.220837C15.6875 -0.0736124 16.3127 -0.0736124 16.8172 0.220837C20.38 2.30026 24.1876 3.62516 28.3877 4.0169C29.168 4.08968 29.8 4.70565 29.8506 5.48771L29.8597 5.62898C30.6419 17.7146 31.177 25.9826 16.5652 31.8919Z" fill="url(#paint1_linear_14017_3981)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M16.0005 32C16.1938 31.9999 16.3871 31.9639 16.5652 31.8919C31.177 25.9826 30.6419 17.7147 29.8597 5.62899L29.8505 5.48771C29.7999 4.70565 29.1679 4.08968 28.3876 4.0169C24.1875 3.62516 20.38 2.30026 16.8172 0.220837C16.5651 0.0736826 16.2828 7.02434e-05 16.0005 0V1.96267C19.6664 4.07789 23.6106 5.45724 27.9567 5.90039C28.3483 11.9678 28.6002 16.5478 27.2037 20.3682C25.8732 24.0083 22.9098 27.2289 16.0005 30.0527V32Z" fill="#DB8300"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M16.0005 32C16.1938 31.9999 16.3871 31.9639 16.5652 31.8919C31.177 25.9826 30.6419 17.7147 29.8597 5.62899L29.8505 5.48771C29.7999 4.70565 29.1679 4.08968 28.3876 4.0169C24.1875 3.62516 20.38 2.30026 16.8172 0.220837C16.5651 0.0736826 16.2828 7.02434e-05 16.0005 0V1.96267C19.6664 4.07789 23.6106 5.45724 27.9567 5.90039C28.3483 11.9678 28.6002 16.5478 27.2037 20.3682C25.8732 24.0083 22.9098 27.2289 16.0005 30.0527V32Z" fill="url(#paint2_linear_14017_3981)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M10 10.342C10 9.60082 10.6008 9 11.342 9C12.0831 9 12.684 9.60082 12.684 10.342V19.7441C12.684 19.9513 12.516 20.1192 12.3088 20.1192H10.3751C10.168 20.1192 10 19.9513 10 19.7441V10.342ZM14.7927 15.1355C14.7927 14.3944 15.3936 13.7935 16.1347 13.7935C16.8759 13.7935 17.4767 14.3944 17.4767 15.1355V19.7449C17.4767 19.9521 17.3087 20.12 17.1016 20.12H15.1679C14.9607 20.12 14.7927 19.9521 14.7927 19.7449V15.1355ZM20.9283 11.876C20.1872 11.876 19.5864 12.4768 19.5864 13.2179V19.7444C19.5864 19.9516 19.7543 20.1195 19.9615 20.1195H21.8952C22.1024 20.1195 22.2703 19.9516 22.2703 19.7444V13.2179C22.2703 12.4768 21.6695 11.876 20.9283 11.876Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M10 10.342C10 9.60082 10.6008 9 11.342 9C12.0831 9 12.684 9.60082 12.684 10.342V19.7441C12.684 19.9513 12.516 20.1192 12.3088 20.1192H10.3751C10.168 20.1192 10 19.9513 10 19.7441V10.342ZM14.7927 15.1355C14.7927 14.3944 15.3936 13.7935 16.1347 13.7935C16.8759 13.7935 17.4767 14.3944 17.4767 15.1355V19.7449C17.4767 19.9521 17.3087 20.12 17.1016 20.12H15.1679C14.9607 20.12 14.7927 19.9521 14.7927 19.7449V15.1355ZM20.9283 11.876C20.1872 11.876 19.5864 12.4768 19.5864 13.2179V19.7444C19.5864 19.9516 19.7543 20.1195 19.9615 20.1195H21.8952C22.1024 20.1195 22.2703 19.9516 22.2703 19.7444V13.2179C22.2703 12.4768 21.6695 11.876 20.9283 11.876Z" fill="url(#paint3_linear_14017_3981)"/> +<defs> +<radialGradient id="paint0_radial_14017_3981" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(9.41216 4.60801) rotate(72.9422) scale(22.4583 23.0619)"> +<stop stop-color="#2B2D37"/> +<stop offset="1" stop-color="#15161B"/> +</radialGradient> +<linearGradient id="paint1_linear_14017_3981" x1="15.4252" y1="30.9664" x2="5.17216" y2="3.75272" gradientUnits="userSpaceOnUse"> +<stop stop-color="#CB6E00"/> +<stop offset="1" stop-color="#FFC600" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint2_linear_14017_3981" x1="24.8159" y1="31.0623" x2="16" y2="1.74059" gradientUnits="userSpaceOnUse"> +<stop stop-color="#793A00"/> +<stop offset="1" stop-color="#DB8300" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint3_linear_14017_3981" x1="22.2703" y1="19.7366" x2="10.5751" y2="9.00004" gradientUnits="userSpaceOnUse"> +<stop stop-color="#DB8300"/> +<stop offset="1" stop-color="#FFC600"/> +</linearGradient> +</defs> +</svg> \ No newline at end of file diff --git a/src/targets/vendor/assets/offline.html b/src/targets/vendor/assets/offline.html index 4962d28bf1449b87fb09e3cdc313956f6d4006c1..7e4c5e3733ad8de929ff0899bbccbe23a168775c 100644 --- a/src/targets/vendor/assets/offline.html +++ b/src/targets/vendor/assets/offline.html @@ -1,69 +1,83 @@ <!DOCTYPE html> <html lang="en"> - <head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta - name="description" - content="Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre la consommation énergétique globale de votre foyer." - /> - <link rel="stylesheet" href="./style.css" /> - <link - href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&display=swap" - rel="stylesheet" - /> - <link rel="icon" href="assets/ecolyo-icon.svg" /> - <title>Ecolyo</title> - <style type="text/css"> - * { - margin: 0; - line-height: 1; - font-family: "Lato", sans-serif; - color: white; - } - html, - body { - height: 100%; - margin: auto; - background: #121212; - - } - p { - margin-top: 1rem; - } - .container{ - height: 100%; - display: flex; - align-items: center; - text-align: center; - justify-content: center; - } - .text-16-white { - font-weight: 900; - font-size: 1rem; - color: white; - } - - </style> - </head> - <body> - <nav></nav> - <div class="container"> - <section> - <svg width="80" height="80" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path d="M8.01323 15.059C14.8544 12.3888 14.3227 8.59276 13.9682 2.93081C11.7705 2.8343 9.82099 2.15873 8.01323 1.03278C6.20546 2.15873 4.25592 2.8343 2.05825 2.93081C1.70378 8.59276 1.17209 12.3888 8.01323 15.059Z" fill="#1B1C22"/> - <path d="M8.01325 0L7.54979 0.288665C5.85495 1.34429 4.05006 1.96586 2.01981 2.05502L1.23259 2.08959L1.18335 2.87604C1.16873 3.10958 1.15353 3.34193 1.13842 3.57294C0.97583 6.05878 0.823332 8.39029 1.50758 10.3994C2.29645 12.7158 4.12651 14.483 7.69452 15.8756L8.01325 16V15.059C1.44034 12.4935 1.67345 8.88869 2.01622 3.58822C2.03021 3.37192 2.04438 3.1528 2.05827 2.93081C4.25595 2.8343 6.20549 2.15873 8.01325 1.03277V0Z" fill="#FFC600"/> - <path d="M8.01323 0L8.4767 0.288665C10.1715 1.34429 11.9764 1.96586 14.0067 2.05502L14.7939 2.08959L14.8431 2.87604C14.8578 3.10958 14.873 3.34193 14.8881 3.57294C15.0507 6.05878 15.2032 8.39029 14.5189 10.3994C13.73 12.7158 11.9 14.483 8.33197 15.8756L8.01323 16V15.059C14.5862 12.4935 14.353 8.88869 14.0103 3.58822C13.9963 3.37192 13.9821 3.1528 13.9682 2.93081C11.7705 2.8343 9.821 2.15873 8.01323 1.03277V0Z" fill="#DB8300"/> - <path d="M5.85148 5.51416H6.16248C6.28668 5.51416 6.4058 5.56292 6.49363 5.64973C6.58146 5.73653 6.6308 5.85427 6.6308 5.97703V10.6758H5.38316V5.97703C5.38316 5.85427 5.4325 5.73653 5.52033 5.64973C5.60815 5.56292 5.72727 5.51416 5.85148 5.51416ZM8.01233 7.80214H8.32333C8.44754 7.80214 8.56666 7.85091 8.65448 7.93771C8.74231 8.02452 8.79165 8.14225 8.79165 8.26502V10.6758H7.54401V8.26502C7.54401 8.14225 7.59335 8.02452 7.68118 7.93771C7.76901 7.85091 7.88813 7.80214 8.01233 7.80214ZM10.302 6.91708H10.613C10.7372 6.91708 10.8563 6.96584 10.9441 7.05265C11.032 7.13945 11.0813 7.25719 11.0813 7.37995V10.6758H9.83366V7.37995C9.83366 7.25719 9.883 7.13945 9.97083 7.05265C10.0587 6.96584 10.1778 6.91708 10.302 6.91708Z" fill="#FFC600"/> - </svg> - <p class="text-16-white"> - Hors ligne - </p> - <p class="text-16-white"> - Vérifiez votre connexion pour lancer Ecolyo. - </p> - </section> - </div> - <footer></footer> - </body> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <meta + name="description" + content="Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre la consommation énergétique globale de votre foyer." + /> + <link rel="stylesheet" href="./style.css" /> + <link + href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&display=swap" + rel="stylesheet" + /> + <link rel="icon" href="assets/icon.svg" /> + <title>Ecolyo</title> + <style type="text/css"> + * { + margin: 0; + line-height: 1; + font-family: 'Lato', sans-serif; + color: white; + } + html, + body { + height: 100%; + margin: auto; + background: #121212; + } + p { + margin-top: 1rem; + } + .container { + height: 100%; + display: flex; + align-items: center; + text-align: center; + justify-content: center; + } + .text-16-white { + font-weight: 900; + font-size: 1rem; + color: white; + } + </style> + </head> + <body> + <nav></nav> + <div class="container"> + <section> + <svg + width="80" + height="80" + viewBox="0 0 16 16" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M8.01323 15.059C14.8544 12.3888 14.3227 8.59276 13.9682 2.93081C11.7705 2.8343 9.82099 2.15873 8.01323 1.03278C6.20546 2.15873 4.25592 2.8343 2.05825 2.93081C1.70378 8.59276 1.17209 12.3888 8.01323 15.059Z" + fill="#1B1C22" + /> + <path + d="M8.01325 0L7.54979 0.288665C5.85495 1.34429 4.05006 1.96586 2.01981 2.05502L1.23259 2.08959L1.18335 2.87604C1.16873 3.10958 1.15353 3.34193 1.13842 3.57294C0.97583 6.05878 0.823332 8.39029 1.50758 10.3994C2.29645 12.7158 4.12651 14.483 7.69452 15.8756L8.01325 16V15.059C1.44034 12.4935 1.67345 8.88869 2.01622 3.58822C2.03021 3.37192 2.04438 3.1528 2.05827 2.93081C4.25595 2.8343 6.20549 2.15873 8.01325 1.03277V0Z" + fill="#FFC600" + /> + <path + d="M8.01323 0L8.4767 0.288665C10.1715 1.34429 11.9764 1.96586 14.0067 2.05502L14.7939 2.08959L14.8431 2.87604C14.8578 3.10958 14.873 3.34193 14.8881 3.57294C15.0507 6.05878 15.2032 8.39029 14.5189 10.3994C13.73 12.7158 11.9 14.483 8.33197 15.8756L8.01323 16V15.059C14.5862 12.4935 14.353 8.88869 14.0103 3.58822C13.9963 3.37192 13.9821 3.1528 13.9682 2.93081C11.7705 2.8343 9.821 2.15873 8.01323 1.03277V0Z" + fill="#DB8300" + /> + <path + d="M5.85148 5.51416H6.16248C6.28668 5.51416 6.4058 5.56292 6.49363 5.64973C6.58146 5.73653 6.6308 5.85427 6.6308 5.97703V10.6758H5.38316V5.97703C5.38316 5.85427 5.4325 5.73653 5.52033 5.64973C5.60815 5.56292 5.72727 5.51416 5.85148 5.51416ZM8.01233 7.80214H8.32333C8.44754 7.80214 8.56666 7.85091 8.65448 7.93771C8.74231 8.02452 8.79165 8.14225 8.79165 8.26502V10.6758H7.54401V8.26502C7.54401 8.14225 7.59335 8.02452 7.68118 7.93771C7.76901 7.85091 7.88813 7.80214 8.01233 7.80214ZM10.302 6.91708H10.613C10.7372 6.91708 10.8563 6.96584 10.9441 7.05265C11.032 7.13945 11.0813 7.25719 11.0813 7.37995V10.6758H9.83366V7.37995C9.83366 7.25719 9.883 7.13945 9.97083 7.05265C10.0587 6.96584 10.1778 6.91708 10.302 6.91708Z" + fill="#FFC600" + /> + </svg> + <p class="text-16-white">Hors ligne</p> + <p class="text-16-white"> + Vérifiez votre connexion pour lancer Ecolyo. + </p> + </section> + </div> + <footer></footer> + </body> </html> diff --git a/src/targets/vendor/assets/safari-pinned-tab.svg b/src/targets/vendor/assets/safari-pinned-tab.svg index 7c0e38096960afb18746a2285ee2533ede3f46ef..86ecc043a096ea79cba52125e977db6f36e31002 100644 --- a/src/targets/vendor/assets/safari-pinned-tab.svg +++ b/src/targets/vendor/assets/safari-pinned-tab.svg @@ -1,6 +1,27 @@ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M8.01323 15.059C14.8544 12.3888 14.3227 8.59276 13.9682 2.93081C11.7705 2.8343 9.82099 2.15873 8.01323 1.03278C6.20546 2.15873 4.25592 2.8343 2.05825 2.93081C1.70378 8.59276 1.17209 12.3888 8.01323 15.059Z" fill="#1B1C22"/> -<path d="M8.01325 0L7.54979 0.288665C5.85495 1.34429 4.05006 1.96586 2.01981 2.05502L1.23259 2.08959L1.18335 2.87604C1.16873 3.10958 1.15353 3.34193 1.13842 3.57294C0.97583 6.05878 0.823332 8.39029 1.50758 10.3994C2.29645 12.7158 4.12651 14.483 7.69452 15.8756L8.01325 16V15.059C1.44034 12.4935 1.67345 8.88869 2.01622 3.58822C2.03021 3.37192 2.04438 3.1528 2.05827 2.93081C4.25595 2.8343 6.20549 2.15873 8.01325 1.03277V0Z" fill="#FFC600"/> -<path d="M8.01323 0L8.4767 0.288665C10.1715 1.34429 11.9764 1.96586 14.0067 2.05502L14.7939 2.08959L14.8431 2.87604C14.8578 3.10958 14.873 3.34193 14.8881 3.57294C15.0507 6.05878 15.2032 8.39029 14.5189 10.3994C13.73 12.7158 11.9 14.483 8.33197 15.8756L8.01323 16V15.059C14.5862 12.4935 14.353 8.88869 14.0103 3.58822C13.9963 3.37192 13.9821 3.1528 13.9682 2.93081C11.7705 2.8343 9.821 2.15873 8.01323 1.03277V0Z" fill="#DB8300"/> -<path d="M5.85148 5.51416H6.16248C6.28668 5.51416 6.4058 5.56292 6.49363 5.64973C6.58146 5.73653 6.6308 5.85427 6.6308 5.97703V10.6758H5.38316V5.97703C5.38316 5.85427 5.4325 5.73653 5.52033 5.64973C5.60815 5.56292 5.72727 5.51416 5.85148 5.51416ZM8.01233 7.80214H8.32333C8.44754 7.80214 8.56666 7.85091 8.65448 7.93771C8.74231 8.02452 8.79165 8.14225 8.79165 8.26502V10.6758H7.54401V8.26502C7.54401 8.14225 7.59335 8.02452 7.68118 7.93771C7.76901 7.85091 7.88813 7.80214 8.01233 7.80214ZM10.302 6.91708H10.613C10.7372 6.91708 10.8563 6.96584 10.9441 7.05265C11.032 7.13945 11.0813 7.25719 11.0813 7.37995V10.6758H9.83366V7.37995C9.83366 7.25719 9.883 7.13945 9.97083 7.05265C10.0587 6.96584 10.1778 6.91708 10.302 6.91708Z" fill="#FFC600"/> +<path d="M7.71752 15.9459C7.89575 16.018 8.1044 16.018 8.28262 15.9459C15.617 12.9798 15.3188 8.82513 14.9253 2.74386C14.9 2.35282 14.584 2.04484 14.1938 2.00845C12.0938 1.81258 10.19 1.15013 8.40862 0.110419C8.15637 -0.0368062 7.84377 -0.0368062 7.59152 0.110419C5.81012 1.15013 3.90634 1.81258 1.80631 2.00845C1.41616 2.04484 1.10016 2.35282 1.07486 2.74386C0.68138 8.82513 0.383192 12.9798 7.71752 15.9459Z" fill="url(#paint0_radial_14017_3992)"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M13.9784 2.9502C14.1742 5.98388 14.3001 8.2739 13.6019 10.1841C12.9366 12.0042 11.4549 13.6145 8.00007 15.0264C4.54525 13.6145 3.06355 12.0042 2.39825 10.1841C1.70001 8.2739 1.82595 5.98388 2.02175 2.9502C4.1949 2.72861 6.16707 2.03889 8.00007 0.981219C9.83308 2.03889 11.8052 2.72861 13.9784 2.9502ZM8.28262 15.9459C8.1044 16.018 7.89575 16.018 7.71752 15.9459C0.411623 12.9913 0.679183 8.85733 1.07029 2.81449L1.07486 2.74386C1.10016 2.35282 1.41616 2.04484 1.80631 2.00845C3.90634 1.81258 5.81012 1.15013 7.59152 0.110419C7.84377 -0.0368062 8.15637 -0.0368062 8.40862 0.110419C10.19 1.15013 12.0938 1.81258 14.1938 2.00845C14.584 2.04484 14.9 2.35282 14.9253 2.74386L14.9299 2.81449C15.321 8.85732 15.5885 12.9913 8.28262 15.9459Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M13.9784 2.9502C14.1742 5.98388 14.3001 8.2739 13.6019 10.1841C12.9366 12.0042 11.4549 13.6145 8.00007 15.0264C4.54525 13.6145 3.06355 12.0042 2.39825 10.1841C1.70001 8.2739 1.82595 5.98388 2.02175 2.9502C4.1949 2.72861 6.16707 2.03889 8.00007 0.981219C9.83308 2.03889 11.8052 2.72861 13.9784 2.9502ZM8.28262 15.9459C8.1044 16.018 7.89575 16.018 7.71752 15.9459C0.411623 12.9913 0.679183 8.85733 1.07029 2.81449L1.07486 2.74386C1.10016 2.35282 1.41616 2.04484 1.80631 2.00845C3.90634 1.81258 5.81012 1.15013 7.59152 0.110419C7.84377 -0.0368062 8.15637 -0.0368062 8.40862 0.110419C10.19 1.15013 12.0938 1.81258 14.1938 2.00845C14.584 2.04484 14.9 2.35282 14.9253 2.74386L14.9299 2.81449C15.321 8.85732 15.5885 12.9913 8.28262 15.9459Z" fill="url(#paint1_linear_14017_3992)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M8.00049 16C8.09714 16 8.19379 15.982 8.28284 15.9459C15.5887 12.9913 15.3212 8.85733 14.9301 2.8145L14.9255 2.74386C14.9002 2.35282 14.5842 2.04484 14.194 2.00845C12.094 1.81258 10.1902 1.15013 8.40884 0.110419C8.28277 0.0368413 8.14163 3.51217e-05 8.00049 0V0.981335C9.83344 2.03895 11.8055 2.72862 13.9786 2.9502C14.1744 5.98388 14.3004 8.2739 13.6021 10.1841C12.9368 12.0042 11.4552 13.6145 8.00049 15.0263V16Z" fill="#DB8300"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M8.00049 16C8.09714 16 8.19379 15.982 8.28284 15.9459C15.5887 12.9913 15.3212 8.85733 14.9301 2.8145L14.9255 2.74386C14.9002 2.35282 14.5842 2.04484 14.194 2.00845C12.094 1.81258 10.1902 1.15013 8.40884 0.110419C8.28277 0.0368413 8.14163 3.51217e-05 8.00049 0V0.981335C9.83344 2.03895 11.8055 2.72862 13.9786 2.9502C14.1744 5.98388 14.3004 8.2739 13.6021 10.1841C12.9368 12.0042 11.4552 13.6145 8.00049 15.0263V16Z" fill="url(#paint2_linear_14017_3992)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M5 5.67099C5 5.30041 5.30041 5 5.67099 5C6.04156 5 6.34198 5.30041 6.34198 5.67099V10.3721C6.34198 10.4756 6.258 10.5596 6.15441 10.5596H5.18756C5.08398 10.5596 5 10.4756 5 10.3721V5.67099ZM7.39637 8.06776C7.39637 7.69718 7.69678 7.39677 8.06735 7.39677C8.43793 7.39677 8.73834 7.69718 8.73834 8.06776V10.3724C8.73834 10.476 8.65437 10.56 8.55078 10.56H7.58393C7.48034 10.56 7.39637 10.476 7.39637 10.3724V8.06776ZM10.4642 6.43798C10.0936 6.43798 9.79318 6.73839 9.79318 7.10897V10.3722C9.79318 10.4758 9.87715 10.5598 9.98074 10.5598H10.9476C11.0512 10.5598 11.1352 10.4758 11.1352 10.3722V7.10897C11.1352 6.73839 10.8347 6.43798 10.4642 6.43798Z" fill="#FFC600"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M5 5.67099C5 5.30041 5.30041 5 5.67099 5C6.04156 5 6.34198 5.30041 6.34198 5.67099V10.3721C6.34198 10.4756 6.258 10.5596 6.15441 10.5596H5.18756C5.08398 10.5596 5 10.4756 5 10.3721V5.67099ZM7.39637 8.06776C7.39637 7.69718 7.69678 7.39677 8.06735 7.39677C8.43793 7.39677 8.73834 7.69718 8.73834 8.06776V10.3724C8.73834 10.476 8.65437 10.56 8.55078 10.56H7.58393C7.48034 10.56 7.39637 10.476 7.39637 10.3724V8.06776ZM10.4642 6.43798C10.0936 6.43798 9.79318 6.73839 9.79318 7.10897V10.3722C9.79318 10.4758 9.87715 10.5598 9.98074 10.5598H10.9476C11.0512 10.5598 11.1352 10.4758 11.1352 10.3722V7.10897C11.1352 6.73839 10.8347 6.43798 10.4642 6.43798Z" fill="url(#paint3_linear_14017_3992)"/> +<defs> +<radialGradient id="paint0_radial_14017_3992" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(4.40671 1.92427) rotate(72.5777) scale(12.0014 12.5544)"> +<stop stop-color="#2B2D37"/> +<stop offset="1" stop-color="#15161B"/> +</radialGradient> +<linearGradient id="paint1_linear_14017_3992" x1="7.7126" y1="15.4832" x2="2.58608" y2="1.87636" gradientUnits="userSpaceOnUse"> +<stop stop-color="#CB6E00"/> +<stop offset="1" stop-color="#FFC600" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint2_linear_14017_3992" x1="12.4082" y1="15.5311" x2="8.00024" y2="0.870295" gradientUnits="userSpaceOnUse"> +<stop stop-color="#793A00"/> +<stop offset="1" stop-color="#DB8300" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint3_linear_14017_3992" x1="11.1352" y1="10.3683" x2="5.28757" y2="5.00002" gradientUnits="userSpaceOnUse"> +<stop stop-color="#DB8300"/> +<stop offset="1" stop-color="#FFC600"/> +</linearGradient> +</defs> </svg> diff --git a/src/targets/vendor/assets/serviceWorker.js b/src/targets/vendor/assets/serviceWorker.js index 0f14f5b13d69bb7fad30392b70a118150352a9ce..51dc9b97b60f013203eabb07d760dfee02265eca 100644 --- a/src/targets/vendor/assets/serviceWorker.js +++ b/src/targets/vendor/assets/serviceWorker.js @@ -1,3 +1,4 @@ +/* eslint-disable no-undef */ const staticCacheName = 'ecolyo-v1' const urlsToCache = ['index.html', 'offline.html'] @@ -12,7 +13,11 @@ self.addEventListener('install', event => { // Listen for requests self.addEventListener('fetch', event => { - if (event.request.url.indexOf('statweb') !== -1) { + // Exception for Matomo & Sentry + if ( + event.request.url.includes('statweb') || + event.request.url.includes('grandlyon.errors') + ) { return false } diff --git a/src/types/cozy-ui.d.ts b/src/types/cozy-ui.d.ts index a13bfbd3f043d8493ea441d5efba5c0b0cce5896..e45466e6769d12c9dcce14662af7d6754bd4e218 100644 --- a/src/types/cozy-ui.d.ts +++ b/src/types/cozy-ui.d.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/interface-name-prefix */ -/* eslint-disable @typescript-eslint/no-explicit-any */ declare module 'cozy-ui/transpiled/react/Icon' declare module 'cozy-ui/transpiled/react/Spinner' declare module 'cozy-ui/transpiled/react/Layout' diff --git a/src/types/custom.d.ts b/src/types/custom.d.ts index 7112effa625990e5b6011188a0044ae5092e2bc6..8dbc0480a1c5a9a63f17a3107ad1a6acffec6805 100644 --- a/src/types/custom.d.ts +++ b/src/types/custom.d.ts @@ -7,4 +7,9 @@ declare module '*.svg' { export default content } +declare module '*.gif' { + const content: string + export default content +} + declare module '*.webapp' diff --git a/src/utils/decoreText.tsx b/src/utils/decoreText.tsx index 595da24170a76bf2f801bd2061cc094eb0f7755b..ebf8d62132f65a943e503a3f2538259c12219fa2 100644 --- a/src/utils/decoreText.tsx +++ b/src/utils/decoreText.tsx @@ -18,6 +18,16 @@ export const decoreText = (line: string, action?: () => void) => { {line.substring(indexEnd + 4, line.length)} </> ) + } else if (line.includes('<p>')) { + const indexStart = line.indexOf('<p>') + const indexEnd = line.indexOf('</p>') + return ( + <> + {line.substring(0, indexStart)} + <p>{line.substring(indexStart + 3, indexEnd)}</p> + {line.substring(indexEnd + 4, line.length)} + </> + ) } else if (line.includes('<span>')) { const indexStart = line.indexOf('<span>') const indexEnd = line.indexOf('</span>') diff --git a/src/utils/logger.js b/src/utils/logger.js index 7494134c7470e33cc8460af95d095d3e2a77425b..af75208f69a125e25b1cc7184a29139f77ea07d6 100644 --- a/src/utils/logger.js +++ b/src/utils/logger.js @@ -2,8 +2,9 @@ import minilog_ from '@cozy/minilog' const inBrowser = typeof window !== 'undefined' +// eslint-disable-next-line no-undef const minilog = (inBrowser && window.minilog) || minilog_ -const log = minilog('ecolyo') +const logApp = minilog('ecolyo') -export default log +export default logApp diff --git a/src/utils/matomoTracker.ts b/src/utils/matomoTracker.ts index 5de0aad9e3b474075ca1e47b72600cd030d2e662..3cc3aaf0b5f2c4fc2356439f290af8b832ee979b 100644 --- a/src/utils/matomoTracker.ts +++ b/src/utils/matomoTracker.ts @@ -1,5 +1,5 @@ -import { History, Location, UnregisterCallback } from 'history' import { readCozyDataFromDOM } from 'cozy-ui/transpiled/react/helpers/appDataset' +import { History, Location, UnregisterCallback } from 'history' interface InitSettings { cozyUrl: string @@ -52,7 +52,7 @@ export default class MatomoTracker { MatomoTracker.push(['setSiteId', this.siteId]) MatomoTracker.push(['setReferrerUrl', 'https://ecolyo.com']) MatomoTracker.push(['setTrackerUrl', `${this.url + this.phpFilename}`]) - MatomoTracker.push(['enableLinkTracking']) + MatomoTracker.push(['HeatmapSessionRecording::disable']) } return { push: MatomoTracker.push, diff --git a/src/utils/picto.spec.ts b/src/utils/picto.spec.ts index 68ca4e3e300e03d252a1e6d2b693437fc19670c8..29258cd1f3fa72e1fa161772f2963c19bd50bac8 100644 --- a/src/utils/picto.spec.ts +++ b/src/utils/picto.spec.ts @@ -115,11 +115,11 @@ describe('picto utilis test', () => { describe('getPartnerPicto test', () => { it('should return enedis logo icon', () => { - const result = getPartnerPicto('enedisgrandlyon', false) + const result = getPartnerPicto('enedissgegrandlyon', false) expect(result).toBe(iconEnedisLogo) }) it('should return white enedis logo icon', () => { - const result = getPartnerPicto('enedisgrandlyon', true) + const result = getPartnerPicto('enedissgegrandlyon', true) expect(result).toBe(iconEnedisWhiteLogo) }) it('should return egl logo icon', () => { diff --git a/src/utils/utils.spec.ts b/src/utils/utils.spec.ts index f6bbc82d9918194147df543af36baae722c6bde9..0d32300e771140ca2d521e080d2d43cbce2f8161 100644 --- a/src/utils/utils.spec.ts +++ b/src/utils/utils.spec.ts @@ -1,7 +1,12 @@ import { DateTime } from 'luxon' import { Season } from 'enum/ecogesture.enum' import { FluidType } from 'enum/fluid.enum' -import { formatNumberValues, getFluidType, getSeason } from './utils' +import { + formatNumberValues, + getChallengeTitleWithLineReturn, + getFluidType, + getSeason, +} from './utils' describe('utilis utilis test', () => { describe('getFluidType test', () => { @@ -72,4 +77,15 @@ describe('utilis utilis test', () => { expect(result).toBe(Season.NONE) }) }) + + describe('getChallengeTitleWithLineReturn test', () => { + it('should return Simone\\nVEILLE', () => { + expect(getChallengeTitleWithLineReturn('CHALLENGE0001')).toBe( + 'Simone\nVEILLE' + ) + }) + it('should return undefined', () => { + expect(getChallengeTitleWithLineReturn('CHALLENGE0000')).toBe(undefined) + }) + }) }) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 2a7a70595f8270beb83fd52d3b0f4f375caef892..f26e1776661809f1d0811bcd5ed9d199ae1a0aa9 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -4,6 +4,7 @@ import { FluidState, FluidType } from '../enum/fluid.enum' import { KonnectorUpdate } from '../enum/konnectorUpdate.enum' import { DateTime, Interval } from 'luxon' import { Season } from 'enum/ecogesture.enum' +import challengeData from '../db/challengeEntity.json' export function getFluidType(type: string) { switch (type.toUpperCase()) { @@ -120,6 +121,7 @@ export const importIconbyId = async (id: string, pathType: string) => { importedChallengeIcon = await import( /* webpackMode: "eager" */ `assets/icons/visu/${pathType}/${id}.svg` ) + // eslint-disable-next-line no-empty } catch (e) {} if (importedChallengeIcon) { return importedChallengeIcon.default @@ -222,3 +224,27 @@ export const getSeason = (): Season => { return Season.NONE } } + +/** + * Returns the challenge title with line return ( \n ). The result is coming from challengeEntity.json + * @param userChallengeId EXPLORATION001 + * @returns Simone\nVEILLE + */ +export const getChallengeTitleWithLineReturn = (userChallengeId: string) => { + for (const chalModel of challengeData) { + if (chalModel._id === userChallengeId) { + return chalModel.title_line_return + } + } +} + +/** + * Returns today's date, example: 2022-09-28T00:00:00.000Z + * @returns DateTime + */ +export const getTodayDate = () => + DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .startOf('day') diff --git a/tests/__mocks__/accountsData.mock.ts b/tests/__mocks__/accountsData.mock.ts index ba83fe802f2ddcdfc4066e9150105ef33a4ddce7..7b0a6ea948ef619c4360e29ea7525413433db07e 100644 --- a/tests/__mocks__/accountsData.mock.ts +++ b/tests/__mocks__/accountsData.mock.ts @@ -1,11 +1,11 @@ -/* eslint-disable @typescript-eslint/camelcase */ +/* eslint-disable camelcase */ import { Account } from 'models' export const accountsData: Account[] = [ { _id: '88e68b8450cee09fe2f077610901094d', _rev: '1-88e68b8450cee09fe2f077610901094d', - account_type: 'enedisgrandlyon', + account_type: 'enedissgegrandlyon', name: '', oauth: { access_token: 'MY_ACCESS_TOCKEN', diff --git a/tests/__mocks__/client.ts b/tests/__mocks__/client.ts index 3118714bde4d0e47cbbd4358e1feb0094b10d814..f2b7101ee47a8d7a424ac76549ec3a75e3f2b27c 100644 --- a/tests/__mocks__/client.ts +++ b/tests/__mocks__/client.ts @@ -1,6 +1,6 @@ import { Client } from 'cozy-client' -const mockClient = ({ +const mockClient = { query: jest.fn(), create: jest.fn(), save: jest.fn().mockReturnValue({ @@ -20,6 +20,6 @@ const mockClient = ({ options: { uri: 'http://cozy.tools:8080', // NOSONAR }, -} as unknown) as jest.Mocked<Client> +} as unknown as jest.Mocked<Client> export default mockClient diff --git a/tests/__mocks__/customPopup.mock.ts b/tests/__mocks__/customPopup.mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..6576af638fc9d3cdf80094416d55b37722bc3c63 --- /dev/null +++ b/tests/__mocks__/customPopup.mock.ts @@ -0,0 +1,22 @@ +import { CustomPopup } from 'models/customPopup.model' + +export const mockCustomPopup: CustomPopup = { + popupEnabled: true, + title: 'Bold title', + description: 'Interesting description', + endDate: '2099-10-04T15:10:53.219+02:00', +} + +export const mockCustomPopupOff: CustomPopup = { + popupEnabled: false, + title: '', + description: '', + endDate: '2099-10-04T15:10:53.219+02:00', +} + +export const mockCustomPopupOutdated: CustomPopup = { + popupEnabled: true, + title: 'Hello', + description: 'Friend', + endDate: '2000-10-04T15:10:53.219+02:00', +} diff --git a/tests/__mocks__/explorationData.mock.ts b/tests/__mocks__/explorationData.mock.ts index faffcfda2130cfcf4dd07773bdb3a23cd47fbce3..dbc5c702d614817a7284f879841a0df6991b7d40 100644 --- a/tests/__mocks__/explorationData.mock.ts +++ b/tests/__mocks__/explorationData.mock.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/camelcase */ +/* eslint-disable camelcase */ import { UserExplorationState, UserExplorationType, @@ -35,14 +35,14 @@ export const explorationEntity4: ExplorationEntity = { export const explorationEntity4_0: ExplorationEntity = { id: 'EXPLORATION004_0', state: UserExplorationState.UNLOCKED, - description: 'Consulter l\'écogeste "Lord Kelvin"', + description: 'Consulter l\'astuce "Lord Kelvin"', complementary_description: '', target: 1, type: UserExplorationType.ECOGESTURE, date: null, ecogesture_id: 'ECOGESTURE0031', fluid_condition: [], - message_success: 'Vous avez consulté l\'écogeste "Lord Kelvin"', + message_success: 'Vous avez consulté l\'astuce "Lord Kelvin"', } export const explorationDefault: UserExploration = { id: '', @@ -104,7 +104,7 @@ export const userExploration4: UserExploration = { export const userExploration4_0: UserExploration = { id: 'EXPLORATION004_0', state: 0, - description: 'Consulter l\'écogeste "Lord Kelvin"', + description: 'Consulter l\'astuce "Lord Kelvin"', complementary_description: '', target: 1, type: 0, @@ -112,7 +112,7 @@ export const userExploration4_0: UserExploration = { ecogesture_id: 'ECOGESTURE0031', fluid_condition: [], progress: 0, - message_success: 'Vous avez consulté l\'écogeste "Lord Kelvin"', + message_success: 'Vous avez consulté l\'astuce "Lord Kelvin"', } export const allExplorationEntities: ExplorationEntity[] = [ { @@ -131,7 +131,7 @@ export const allExplorationEntities: ExplorationEntity[] = [ { id: 'EXPLORATION002', state: 0, - description: "Consultez l'écogeste Professeur Celsius", + description: "Consultez l'astuce Professeur Celsius", complementary_description: '', target: 1, type: UserExplorationType.ECOGESTURE, diff --git a/tests/__mocks__/faq.mock.tsx b/tests/__mocks__/faq.mock.tsx deleted file mode 100644 index 145c90a29efd7d12b2524d96a051d9f6552572dc..0000000000000000000000000000000000000000 --- a/tests/__mocks__/faq.mock.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable react/no-unescaped-entities */ -import { FAQSection } from 'models' -import React from 'react' - -export const faqData: FAQSection[] = [ - { - section: 'Mes données', - questions: [ - { - summary: 'Comment accéder à mes données électricité ?', - details: ( - <div> - Rendez-vous dans la partie Options du service et cliquer sur le - bouton "Se connecter à l\'électricité". Suivez la procédure (en vous - créant un compte Enedis si nécessaire). Une fois votre consentement - donné, vos données de consommation seront récupérées. - </div> - ), - }, - { - summary: 'Comment accéder à mes données gaz ?', - details: ( - <div> - Rendez-vous dans la partie Options du service et cliquez sur le - bouton "Se connecter au gaz". Suivez la procédure (en vous créant un - compte GRDF si nécessaire). Une fois votre consentement donné, vos - données de consommation seront récupérées.', - </div> - ), - }, - ], - }, - { - section: 'Contenu du service', - questions: [ - { - summary: - 'Pourquoi les prix affichés sont-ils différents de ceux indiqués sur ma facture ?', - details: ( - <div> - <p> - Le prix de votre électricité ou de votre gaz dépend de l'offre - choisie auprès de votre fournisseur. N’ayant pas accès à cette - information, Ecolyo affiche un prix moyen par fluide. - </p> - <p>Tarifs moyens retenus :</p> - </div> - ), - }, - ], - }, -] diff --git a/tests/__mocks__/fluidStatusData.mock.ts b/tests/__mocks__/fluidStatusData.mock.ts index e9495d91ad3d8e71ce43308f0098bb7512ec301b..e9c340eba480380d237fdcc29665989eeab09d5b 100644 --- a/tests/__mocks__/fluidStatusData.mock.ts +++ b/tests/__mocks__/fluidStatusData.mock.ts @@ -1,8 +1,9 @@ +/* eslint-disable camelcase */ import { FluidState } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' import { DateTime } from 'luxon' import { FluidStatus } from 'models' import { PartnersInfo } from 'models/partnersInfo.model' -/* eslint-disable @typescript-eslint/camelcase */ export const fluidStatusData: FluidStatus[] = [ { @@ -24,7 +25,7 @@ export const fluidStatusData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -49,7 +50,7 @@ export const fluidStatusData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -74,7 +75,7 @@ export const fluidStatusData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -108,13 +109,24 @@ export const fluidStatusConnectedData: FluidStatus[] = [ shouldLaunchKonnector: false, isUpdating: false, konnector: null, - account: null, + account: { + _id: 'test', + account_type: 'test', + auth: { + pointId: 'testid', + address: 'address', + firstname: 'Jane', + lastname: 'Doe', + postalCode: '69200', + city: 'Lyon', + }, + }, trigger: null, triggerState: null, konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -139,7 +151,7 @@ export const fluidStatusConnectedData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -164,10 +176,57 @@ export const fluidStatusConnectedData: FluidStatus[] = [ konnectorConfig: { name: '', oauth: true, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, }, }, ] +export const SgeStatusWithAccout: FluidStatus = { + fluidType: 0, + status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), + lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { + zone: 'utc', + }), + connection: { + shouldLaunchKonnector: false, + isUpdating: false, + konnector: null, + account: { + _id: '88e68b8450cee09fe2f077610901094d', + _rev: '1-88e68b8450cee09fe2f077610901094d', + account_type: 'enedissgegrandlyon', + name: '', + oauth: { + access_token: 'MY_ACCESS_TOCKEN', + expires_at: '2020-10-09T08:00:00.285910671+02:00', + refresh_token: '', + token_type: 'Bearer', + }, + oauth_callback_results: { + issued_at: '1592232569642', + refresh_token_issued_at: '1592232569642', + scope: '/my_eneids_scope', + usage_points_id: '', + }, + cozyMetadata: { + createdAt: '2020-11-10T16:42:11.132Z', + metadataVersion: 1, + updatedAt: '2020-11-10T16:42:11.132Z', + }, + }, + trigger: null, + triggerState: null, + konnectorConfig: { + name: '', + oauth: false, + slug: FluidSlugType.ELECTRICITY, + siteLink: '', + activation: '', + }, + }, +} diff --git a/tests/__mocks__/globalStateData.mock.ts b/tests/__mocks__/globalStateData.mock.ts index 4b8de03a74274e1cd9df2f8a74c4df7e440c3210..7f57f724b5cd20c78232b43538a5eff0c8dcd535 100644 --- a/tests/__mocks__/globalStateData.mock.ts +++ b/tests/__mocks__/globalStateData.mock.ts @@ -1,4 +1,5 @@ import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' import { ScreenType } from 'enum/screen.enum' import { GlobalState } from 'models' @@ -33,7 +34,7 @@ export const globalStateData: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -54,7 +55,7 @@ export const globalStateData: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -75,7 +76,7 @@ export const globalStateData: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -84,4 +85,16 @@ export const globalStateData: GlobalState = { ], fluidTypes: [], shouldRefreshConsent: false, + sgeConnect: { + currentStep: 0, + firstName: '', + lastName: '', + pdl: null, + address: '', + zipCode: null, + city: '', + dataConsent: false, + pdlConfirm: false, + shouldLaunchAccount: false, + }, } diff --git a/tests/__mocks__/konnectorsData.mock.ts b/tests/__mocks__/konnectorsData.mock.ts index b1a2498685116a6c09802648a464bba217fb34fb..455fcb57b49f3f907162b69386df2ecd6d0e1515 100644 --- a/tests/__mocks__/konnectorsData.mock.ts +++ b/tests/__mocks__/konnectorsData.mock.ts @@ -2,9 +2,9 @@ import { Konnector } from 'models' export const konnectorsData: Konnector[] = [ { - _id: 'io.cozy.konnectors/enedisgrandlyon', + _id: 'io.cozy.konnectors/enedissgegrandlyon', name: 'Enedis', - slug: 'enedisgrandlyon', + slug: 'enedissgegrandlyon', state: 'ready', }, { diff --git a/tests/__mocks__/mockConfig.mock.ts b/tests/__mocks__/mockConfig.mock.ts index 5cede83e872fa85290a48038c65befd1b95a421b..a972bca615479316b7db30ca771cab53f5ddd25f 100644 --- a/tests/__mocks__/mockConfig.mock.ts +++ b/tests/__mocks__/mockConfig.mock.ts @@ -10,7 +10,7 @@ const mockConfig = { konnectorConfig: { name: 'Enedis', oauth: true, - slug: 'enedisgrandlyon', + slug: 'enedissgegrandlyon', siteLink: 'https://mon-compte-client.enedis.fr/', activation: 'https://mon-compte-particulier.enedis.fr/donnees/', }, diff --git a/tests/__mocks__/profile.mock.ts b/tests/__mocks__/profile.mock.ts index f235a0c213b5d3552e433a20347b92d7b6358152..27df89d8f7ed281b3d3ec8b029e5626f4e41af79 100644 --- a/tests/__mocks__/profile.mock.ts +++ b/tests/__mocks__/profile.mock.ts @@ -34,4 +34,7 @@ export const profileData: Profile = { activateHalfHourDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { zone: 'utc', }), + customPopupDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { + zone: 'utc', + }), } diff --git a/tests/__mocks__/profileType.mock.ts b/tests/__mocks__/profileType.mock.ts index 52197f89c178db115de01ef5dae64f43f7f60d36..7262c68221dc88bd38669be611993480d7f97eb0 100644 --- a/tests/__mocks__/profileType.mock.ts +++ b/tests/__mocks__/profileType.mock.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/camelcase */ import { FluidType } from 'enum/fluid.enum' import { ConstructionYear, @@ -43,6 +42,7 @@ export const profileTypeData: ProfileType = { zone: 'utc', }), warmingFluid: 2, + equipments: [], } export const mockProfileType: ProfileType = { @@ -65,6 +65,7 @@ export const mockProfileType: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockEstimatedConsumption = 3182 export const mockCorrectedConsumption = 3500 @@ -101,6 +102,7 @@ export const mockProfileType1: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockEstimatedConsumption1 = 6450 export const mockCorrectedConsumption1 = 6450 @@ -129,6 +131,7 @@ export const mockProfileType2: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockEstimatedConsumption2 = 16560 export const mockCorrectedConsumption2 = 15411 @@ -155,6 +158,7 @@ export const mockTestProfile1: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockMonthlyForecastJanuaryTestProfile1: MonthlyForecast = { fluidForecast: [ @@ -219,6 +223,7 @@ export const mockTestProfile2: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = { @@ -284,6 +289,7 @@ export const mockTestProfile3: ProfileType = { updateDate: DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc', }), + equipments: [], } export const mockMonthlyForecastJanuaryTestProfile3: MonthlyForecast = { diff --git a/tests/__mocks__/store.ts b/tests/__mocks__/store.ts index 74f61acc8ef2376b703c69b199126a9d3eee09be..f6b9cea2d9ceb8eb592d85cd37c00310c98d3931 100644 --- a/tests/__mocks__/store.ts +++ b/tests/__mocks__/store.ts @@ -1,6 +1,6 @@ -/* eslint-disable @typescript-eslint/camelcase */ - +/* eslint-disable camelcase */ import { FluidState, FluidType } from 'enum/fluid.enum' +import { FluidSlugType } from 'enum/fluidSlug.enum' import { ConstructionYear, Floor, @@ -39,8 +39,16 @@ export const mockInitialGlobalState: GlobalState = { accepted: false, versionType: 'init', }, + customPopupModal: { + popupEnabled: false, + title: '', + description: '', + }, openPartnersIssueModal: false, - releaseNotes: { show: false, notes: [{ description: '', title: '' }] }, + releaseNotes: { + show: false, + notes: [{ description: '', title: '' }], + }, fluidStatus: [ { fluidType: FluidType.ELECTRICITY, @@ -57,7 +65,7 @@ export const mockInitialGlobalState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.ELECTRICITY, siteLink: '', activation: '', }, @@ -78,7 +86,7 @@ export const mockInitialGlobalState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.WATER, siteLink: '', activation: '', }, @@ -99,7 +107,7 @@ export const mockInitialGlobalState: GlobalState = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -108,12 +116,60 @@ export const mockInitialGlobalState: GlobalState = { ], fluidTypes: [], shouldRefreshConsent: false, + sgeConnect: { + address: '', + city: '', + currentStep: 0, + dataConsent: false, + firstName: '', + lastName: '', + pdl: null, + pdlConfirm: false, + zipCode: null, + shouldLaunchAccount: false, + }, } export const mockExpiredElec: FluidStatus = { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, firstDataDate: null, lastDataDate: null, + connection: { + shouldLaunchKonnector: false, + isUpdating: false, + konnector: null, + account: { + _id: '1', + account_type: 'test', + data: { + consentId: 1, + expirationDate: '1999-08-08', + }, + }, + trigger: null, + triggerState: { + trigger_id: '0', + status: '', + last_executed_job_id: '', + last_execution: '', + last_manual_execution: '', + last_manual_job_id: '', + last_error: 'USER_ACTION_NEEDED.OAUTH_OUTDATED', + }, + konnectorConfig: { + name: '', + oauth: false, + slug: FluidSlugType.ELECTRICITY, + siteLink: '', + activation: '', + }, + }, +} +export const mockExpiredGas: FluidStatus = { + fluidType: FluidType.GAS, + status: FluidState.ERROR_LOGIN_FAILED, + firstDataDate: null, + lastDataDate: null, connection: { shouldLaunchKonnector: false, isUpdating: false, @@ -132,7 +188,7 @@ export const mockExpiredElec: FluidStatus = { konnectorConfig: { name: '', oauth: false, - slug: '', + slug: FluidSlugType.GAS, siteLink: '', activation: '', }, @@ -162,6 +218,7 @@ export const mockInitialProfileState: Profile = { }, haveSeenEcogestureModal: false, activateHalfHourDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + customPopupDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), } export const mockInitialProfileTypeState: ProfileType = { @@ -185,14 +242,13 @@ export const mockInitialProfileTypeState: ProfileType = { hotWaterFluid: FluidType.ELECTRICITY, cookingFluid: FluidType.ELECTRICITY, updateDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), + equipments: [], } export const mockInitialChartState: ChartState = { - selectedDate: DateTime.local() - .endOf('minute') - .setZone('utc', { - keepLocalTime: true, - }), + selectedDate: DateTime.local().endOf('minute').setZone('utc', { + keepLocalTime: true, + }), currentTimeStep: TimeStep.WEEK, currentIndex: 0, currentDatachart: { actualData: [], comparisonData: null }, @@ -222,7 +278,6 @@ export const mockInitialEcolyoState = { const middlewares = [thunkMiddleware.withExtraArgument({ mockClient })] const mockStore = configureStore(middlewares) -// eslint-disable-next-line @typescript-eslint/no-explicit-any const mockedStore: any = mockStore({ ecolyo: mockInitialEcolyoState, }) diff --git a/tests/__mocks__/testUtils.ts b/tests/__mocks__/testUtils.ts index 2fe27298a9e9e930caf3ac30bf4e2f52489aaaa7..6b779ccf6faab7c684fa756df3415156264a349d 100644 --- a/tests/__mocks__/testUtils.ts +++ b/tests/__mocks__/testUtils.ts @@ -1,7 +1,6 @@ import { ReactWrapper } from 'enzyme' import { act } from 'react-dom/test-utils' -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const waitForComponentToPaint = async <TP extends any = {}>( wrapper: ReactWrapper<TP> ): Promise<void> => { diff --git a/tests/__mocks__/triggersData.mock.ts b/tests/__mocks__/triggersData.mock.ts index c10a77c9b8073519e8f8c9ca5ec200c810204785..5ca88daa41cbffb2be3f0048f47b99503051848f 100644 --- a/tests/__mocks__/triggersData.mock.ts +++ b/tests/__mocks__/triggersData.mock.ts @@ -12,7 +12,7 @@ export const triggersData: Trigger[] = [ options: null, message: { account: '88e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedissgegrandlyon', }, cozyMetadata: { doctypeVersion: '1', @@ -78,7 +78,7 @@ export const triggersEnedisData: Trigger[] = [ options: null, message: { account: '88e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedissgegrandlyon', }, cozyMetadata: { doctypeVersion: '1', @@ -99,7 +99,7 @@ export const triggersEnedisData: Trigger[] = [ options: null, message: { account: '90e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedissgegrandlyon', }, cozyMetadata: { doctypeVersion: '1', @@ -120,7 +120,7 @@ export const triggersEnedisData: Trigger[] = [ options: null, message: { account: '89e68b8450cee09fe2f077610901094d', - konnector: 'enedisgrandlyon', + konnector: 'enedissgegrandlyon', }, cozyMetadata: { doctypeVersion: '1', diff --git a/tests/__mocks__/userChallengeData.mock.ts b/tests/__mocks__/userChallengeData.mock.ts index aa8418c77050be99b4006c8d8ae20dbc6edd0ea9..b250eca1efeb87dba5bf98744ba0a02e3ad1fa00 100644 --- a/tests/__mocks__/userChallengeData.mock.ts +++ b/tests/__mocks__/userChallengeData.mock.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/camelcase */ +/* eslint-disable camelcase */ import { UserActionState } from 'enum/userAction.enum' import { UserChallengeState, @@ -386,7 +386,7 @@ export const userChallengeExplo4_0: UserChallenge = { exploration: { id: 'EXPLORATION004_0', state: 0, - description: 'Consulter l\'écogeste "Lord Kelvin"', + description: 'Consulter l\'astuce "Lord Kelvin"', complementary_description: '', target: 1, type: 0, @@ -394,7 +394,7 @@ export const userChallengeExplo4_0: UserChallenge = { ecogesture_id: 'ECOGESTURE0031', fluid_condition: [], progress: 0, - message_success: 'Vous avez consulté l\'écogeste "Lord Kelvin"', + message_success: 'Vous avez consulté l\'astuce "Lord Kelvin"', }, action: { ecogesture: null, @@ -422,7 +422,7 @@ export const userChallengeExplo2OnGoing: UserChallenge = { exploration: { id: 'EXPLORATION002', state: 1, - description: "Consultez l'écogeste Professeur Celsius", + description: "Consultez l'astuce Professeur Celsius", complementary_description: '', target: 1, type: 3, diff --git a/yarn.lock b/yarn.lock index 7fe45941f3e7ea89a73ce97be1a39a8a36772bc4..c74079f909bcba14d7a9348598a33066a829cedf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,7 +31,14 @@ request "^2.88.0" ws "^6.0.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== @@ -132,7 +139,7 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/eslint-parser@^7.16.3": +"@babel/eslint-parser@7.18.9", "@babel/eslint-parser@^7.16.3": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz#255a63796819a97b7578751bb08ab9f2a375a031" integrity sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ== @@ -141,15 +148,6 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/eslint-parser@^7.17.0": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz#e14dee36c010edfb0153cf900c2b0815e82e3245" - integrity sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A== - dependencies: - eslint-scope "^5.1.1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.0" - "@babel/generator@^7.16.8", "@babel/generator@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a" @@ -484,7 +482,7 @@ "@babel/traverse" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/highlight@^7.18.6": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -1657,6 +1655,21 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@eslint/eslintrc@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" @@ -1672,11 +1685,44 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" + integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@humanwhocodes/config-array@^0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" + integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -1686,7 +1732,17 @@ debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.1": +"@humanwhocodes/gitignore-to-minimatch@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" + integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -1768,6 +1824,13 @@ "@types/node" "*" jest-mock "^26.6.2" +"@jest/expect-utils@^29.0.3": + version "29.0.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.0.3.tgz#f5bb86f5565bf2dacfca31ccbd887684936045b2" + integrity sha512-i1xUkau7K/63MpdwiRqaxgZOjxYs4f0WMTGJnYwUKubsNRZSeQbLorS7+I4uXVF9KQ5r61BUPAUMZ7Lf66l64Q== + dependencies: + jest-get-type "^29.0.0" + "@jest/fake-timers@^25.1.0": version "25.5.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185" @@ -1832,12 +1895,12 @@ optionalDependencies: node-notifier "^8.0.0" -"@jest/schemas@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" - integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== dependencies: - "@sinclair/typebox" "^0.23.3" + "@sinclair/typebox" "^0.24.1" "@jest/source-map@^26.6.2": version "26.6.2" @@ -1911,6 +1974,18 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^29.0.3": + version "29.0.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.0.3.tgz#0be78fdddb1a35aeb2041074e55b860561c8ef63" + integrity sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -1956,6 +2031,24 @@ resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0" integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw== +"@material-ui/core@4.12.3": + version "4.12.3" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.3.tgz#80d665caf0f1f034e52355c5450c0e38b099d3ca" + integrity sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.4" + "@material-ui/system" "^4.12.1" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + "@material-ui/core@~4.12.0": version "4.12.4" resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73" @@ -1974,7 +2067,18 @@ react-is "^16.8.0 || ^17.0.0" react-transition-group "^4.4.0" -"@material-ui/styles@^4.11.3", "@material-ui/styles@^4.11.5": +"@material-ui/lab@^4.0.0-alpha.61": + version "4.0.0-alpha.61" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz#9bf8eb389c0c26c15e40933cc114d4ad85e3d978" + integrity sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.3" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@material-ui/styles@^4.11.3", "@material-ui/styles@^4.11.4", "@material-ui/styles@^4.11.5": version "4.11.5" resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.5.tgz#19f84457df3aafd956ac863dbe156b1d88e2bbfb" integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== @@ -1996,7 +2100,7 @@ jss-plugin-vendor-prefixer "^10.5.1" prop-types "^15.7.2" -"@material-ui/system@^4.12.2": +"@material-ui/system@^4.12.1", "@material-ui/system@^4.12.2": version "4.12.2" resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.2.tgz#f5c389adf3fce4146edd489bf4082d461d86aa8b" integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw== @@ -2011,7 +2115,7 @@ resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== -"@material-ui/utils@^4.11.3": +"@material-ui/utils@^4.11.2", "@material-ui/utils@^4.11.3": version "4.11.3" resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.3.tgz#232bd86c4ea81dab714f21edad70b7fdf0253942" integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg== @@ -2215,6 +2319,16 @@ "@react-spring/core" "9.0.0-rc.3" "@react-spring/shared" "9.0.0-rc.3" +"@sentry/browser@7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.21.1.tgz#bffa3ea19050c06400107d2297b9802f9719f98b" + integrity sha512-cS2Jz2+fs9+4pJqLJPtYqGyY97ywJDWAWIR1Yla3hs1QQuH6m0Nz3ojZD1gE2eKH9mHwkGbnNAh+hHcrYrfGzw== + dependencies: + "@sentry/core" "7.21.1" + "@sentry/types" "7.21.1" + "@sentry/utils" "7.21.1" + tslib "^1.9.3" + "@sentry/browser@^6.0.1": version "6.19.7" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.19.7.tgz#a40b6b72d911b5f1ed70ed3b4e7d4d4e625c0b5f" @@ -2236,6 +2350,15 @@ "@sentry/utils" "6.19.7" tslib "^1.9.3" +"@sentry/core@7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.21.1.tgz#d0423282d90875625802dfe380f9657e9242b72b" + integrity sha512-Og5wEEsy24fNvT/T7IKjcV4EvVK5ryY2kxbJzKY6GU2eX+i+aBl+n/vp7U0Es351C/AlTkS+0NOUsp2TQQFxZA== + dependencies: + "@sentry/types" "7.21.1" + "@sentry/utils" "7.21.1" + tslib "^1.9.3" + "@sentry/hub@6.19.7": version "6.19.7" resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.19.7.tgz#58ad7776bbd31e9596a8ec46365b45cd8b9cfd11" @@ -2254,11 +2377,37 @@ "@sentry/types" "6.19.7" tslib "^1.9.3" +"@sentry/react@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.21.1.tgz#275e6fd46212f608f382c7dde46d21e748f93491" + integrity sha512-w91PIUyX07mErKgrBQA+7ID8zFKrYDUYSOrFSHufg5DdPq4EpHiNDe/Yngg3e9ELhtr1AbCnEvx9wlvqLi3nZQ== + dependencies: + "@sentry/browser" "7.21.1" + "@sentry/types" "7.21.1" + "@sentry/utils" "7.21.1" + hoist-non-react-statics "^3.3.2" + tslib "^1.9.3" + +"@sentry/tracing@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.21.1.tgz#db02643e84960f1ea14b35fe75a93fc0bbca1fcb" + integrity sha512-b1BTPsRaNQpohzegoz59KGuBl+To651vEq0vMS4tCzSyIdxkYso3JCrjDdEqW/2MliQYANNVrUai2bmwmU9h1g== + dependencies: + "@sentry/core" "7.21.1" + "@sentry/types" "7.21.1" + "@sentry/utils" "7.21.1" + tslib "^1.9.3" + "@sentry/types@6.19.7": version "6.19.7" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.7.tgz#c6b337912e588083fc2896eb012526cf7cfec7c7" integrity sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg== +"@sentry/types@7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.21.1.tgz#408a7b95a66ddc30c4359979594e03bee8f9fbdc" + integrity sha512-3/IKnd52Ol21amQvI+kz+WB76s8/LR5YvFJzMgIoI2S8d82smIr253zGijRXxHPEif8kMLX4Yt+36VzrLxg6+A== + "@sentry/utils@6.19.7": version "6.19.7" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.19.7.tgz#6edd739f8185fd71afe49cbe351c1bbf5e7b7c79" @@ -2267,15 +2416,23 @@ "@sentry/types" "6.19.7" tslib "^1.9.3" +"@sentry/utils@7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.21.1.tgz#96582345178015fd32fe9159c25c44ccf2f99d2a" + integrity sha512-F0W0AAi8tgtTx6ApZRI2S9HbXEA9ENX1phTZgdNNWcMFm1BNbc21XEwLqwXBNjub5nlA6CE8xnjXRgdZKx4kzQ== + dependencies: + "@sentry/types" "7.21.1" + tslib "^1.9.3" + "@simbathesailor/use-what-changed@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@simbathesailor/use-what-changed/-/use-what-changed-2.0.0.tgz#7f82d78f92c8588b5fadd702065dde93bd781403" integrity sha512-ulBNrPSvfho9UN6zS2fii3AsdEcp2fMaKeqUZZeCNPaZbB6aXyTUhpEN9atjMAbu/eyK3AY8L4SYJUG62Ekocw== -"@sinclair/typebox@^0.23.3": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" - integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== +"@sinclair/typebox@^0.24.1": + version "0.24.43" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.43.tgz#2e2bce0e5e493aaf639beed0cd6c88cfde7dd3d7" + integrity sha512-1orQTvtazZmsPeBroJjysvsOQCYV2yjWlebkSY38pl5vr2tdLjEJ+LoxITlGNZaH2RE19WlAwQMkH/7C14wLfw== "@sindresorhus/fnv1a@^1.2.0": version "1.2.0" @@ -2361,221 +2518,215 @@ dependencies: classnames "*" -"@types/d3-array@^1": - version "1.2.9" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.9.tgz#c7dc78992cd8ca5c850243a265fd257ea56df1fa" - integrity sha512-E/7RgPr2ylT5dWG0CswMi9NpFcjIEDqLcUSBgNHe/EMahfqYaTx4zhcggG3khqoEB/leY4Vl6nTSbwLUPjXceA== +"@types/d3-array@^2": + version "2.12.3" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.12.3.tgz#8d16d51fb04ad5a5a8ebe14eb8263a579f1efdd1" + integrity sha512-hN879HLPTVqZV3FQEXy7ptt083UXwguNbnxdTGzVW4y4KjX5uyNKljrQixZcSJfLyFirbpUokxpXtvR+N5+KIg== -"@types/d3-axis@^1": - version "1.0.16" - resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-1.0.16.tgz#93d7a28795c2f8b0e2fd550fcc4d29b7f174e693" - integrity sha512-p7085weOmo4W+DzlRRVC/7OI/jugaKbVa6WMQGCQscaMylcbuaVEGk7abJLNyGVFLeCBNrHTdDiqRGnzvL0nXQ== +"@types/d3-axis@^2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-2.1.3.tgz#348cca877f6643030aa8c866d08ccae06821a0e2" + integrity sha512-QjXjwZ0xzyrW2ndkmkb09ErgWDEYtbLBKGui73QLMFm3woqWpxptfD5Y7vqQdybMcu7WEbjZ5q+w2w5+uh2IjA== dependencies: - "@types/d3-selection" "^1" + "@types/d3-selection" "^2" -"@types/d3-brush@^1": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-1.1.5.tgz#c7cfb58decbfd53ad3e47f0376345e3640a68186" - integrity sha512-4zGkBafJf5zCsBtLtvDj/pNMo5X9+Ii/1hUz0GvQ+wEwelUBm2AbIDAzJnp2hLDFF307o0fhxmmocHclhXC+tw== +"@types/d3-brush@^2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-2.1.2.tgz#c75890d1ccaef24fba1811daae3f896c1806418b" + integrity sha512-DnZmjdK1ycX1CMiW9r5E3xSf1tL+bp3yob1ON8bf0xB0/odfmGXeYOTafU+2SmU1F0/dvcqaO4SMjw62onOu6A== dependencies: - "@types/d3-selection" "^1" - -"@types/d3-chord@^1": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-1.0.11.tgz#5760765db1b1a4b936c0d9355a821dde9dd25da2" - integrity sha512-0DdfJ//bxyW3G9Nefwq/LDgazSKNN8NU0lBT3Cza6uVuInC2awMNsAcv1oKyRFLn9z7kXClH5XjwpveZjuz2eg== + "@types/d3-selection" "^2" -"@types/d3-collection@*": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-collection/-/d3-collection-1.0.10.tgz#bca161e336156968f267c077f7f2bfa8ff224e58" - integrity sha512-54Fdv8u5JbuXymtmXm2SYzi1x/Svt+jfWBU5junkhrCewL92VjqtCBDn97coBRVwVFmYNnVTNDyV8gQyPYfm+A== +"@types/d3-chord@^2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-2.0.3.tgz#3009b792b754da964d893b4269d1fe7757f21370" + integrity sha512-koIqSNQLPRQPXt7c55hgRF6Lr9Ps72r1+Biv55jdYR+SHJ463MsB2lp4ktzttFNmrQw/9yWthf/OmSUj5dNXKw== -"@types/d3-color@^1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.4.2.tgz#944f281d04a0f06e134ea96adbb68303515b2784" - integrity sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA== +"@types/d3-color@^2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-2.0.3.tgz#8bc4589073c80e33d126345542f588056511fe82" + integrity sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w== -"@types/d3-contour@^1": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-1.3.3.tgz#44529d498bbc1db78b195d75e1c9bb889edd647a" - integrity sha512-LxwmGIfVJIc1cKs7ZFRQ1FbtXpfH7QTXYRdMIJsFP71uCMdF6jJ0XZakYDX6Hn4yZkLf+7V8FgD34yCcok+5Ww== +"@types/d3-contour@^2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-2.0.4.tgz#2fc5aa8949c1a1d12d183633603923025e3d14fd" + integrity sha512-WMac1xV/mXAgkgr5dUvzsBV5OrgNZDBDpJk9s3v2SadTqGgDRirKABb2Ek2H1pFlYVH4Oly9XJGnuzxKDduqWA== dependencies: - "@types/d3-array" "^1" + "@types/d3-array" "^2" "@types/geojson" "*" -"@types/d3-dispatch@^1": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz#c5a180f1e251de853b399cfbfbb6dd7f8bf842ae" - integrity sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ== +"@types/d3-delaunay@^5": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-5.3.1.tgz#47ae03af6b78cb3aa39d3d3c42ca71daca488aef" + integrity sha512-F6itHi2DxdatHil1rJ2yEFUNhejj8+0Acd55LZ6Ggwbdoks0+DxVY2cawNj16sjCBiWvubVlh6eBMVsYRNGLew== -"@types/d3-drag@^1": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-1.2.5.tgz#0b1b852cb41577075aa625ae6149379ea6c34dfd" - integrity sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw== +"@types/d3-dispatch@^2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-2.0.1.tgz#d7dc50f9b679996ccf70f3c79dbbf99505a93107" + integrity sha512-eT2K8uG3rXkmRiCpPn0rNrekuSLdBfV83vbTvfZliA5K7dbeaqWS/CBHtJ9SQoF8aDTsWSY4A0RU67U/HcKdJQ== + +"@types/d3-drag@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-2.0.2.tgz#ed538d24456c839967a9ac7aab5e1b63b28bac7f" + integrity sha512-m9USoFaTgVw2mmE7vLjWTApT9dMxMlql/dl3Gj503x+1a2n6K455iDWydqy2dfCpkUBCoF82yRGDgcSk9FUEyQ== dependencies: - "@types/d3-selection" "^1" + "@types/d3-selection" "^2" -"@types/d3-dsv@^1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-1.2.1.tgz#1524fee9f19d689c2f76aa0e24e230762bf96994" - integrity sha512-LLmJmjiqp/fTNEdij5bIwUJ6P6TVNk5hKM9/uk5RPO2YNgEu9XvKO0dJ7Iqd3psEdmZN1m7gB1bOsjr4HmO2BA== +"@types/d3-dsv@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-2.0.2.tgz#e10fa57576b50ded27e261db9984b9a92efec2f3" + integrity sha512-T4aL2ZzaILkLGKbxssipYVRs8334PSR9FQzTGftZbc3jIPGkiXXS7qUCh8/q8UWFzxBZQ92dvR0v7+AM9wL2PA== -"@types/d3-ease@^1": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.11.tgz#c4728639f5703dcb75b216dfa0860b2720f26898" - integrity sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA== +"@types/d3-ease@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-2.0.2.tgz#e6fadfffcf5e93bca1629699ad8ee0f61d2129fb" + integrity sha512-29Y73Tg6o6aL+3/S/kEun84m5BO4bjRNau6pMWv9N9rZHcJv/O/07mW6EjqxrePZZS64fj0wiB5LMHr4Jzf3eQ== -"@types/d3-fetch@^1": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-1.2.2.tgz#b93bfe248b8b761af82f4dac57959c989f67da3e" - integrity sha512-rtFs92GugtV/NpiJQd0WsmGLcg52tIL0uF0bKbbJg231pR9JEb6HT4AUwrtuLq3lOeKdLBhsjV14qb0pMmd0Aw== +"@types/d3-fetch@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-2.0.2.tgz#628c65d14b3a0d02fe1b9c2f3098b81a47e370bc" + integrity sha512-sllsCSWrNdSvzOJWN5RnxkmtvW9pCttONGajSxHX9FUQ9kOkGE391xlz6VDBdZxLnpwjp3I+mipbwsaCjq4m5A== dependencies: - "@types/d3-dsv" "^1" + "@types/d3-dsv" "^2" -"@types/d3-force@^1": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-1.2.4.tgz#6e274c72288c2db08fbdb8f5b87b9aa83e55a9e8" - integrity sha512-fkorLTKvt6AQbFBQwn4aq7h9rJ4c7ZVcPMGB8X6eFFveAyMZcv7t7m6wgF4Eg93rkPgPORU7sAho1QSHNcZu6w== +"@types/d3-force@^2": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-2.1.4.tgz#98919b87db8a0ca5011d189c598d69251d20344d" + integrity sha512-1XVRc2QbeUSL1FRVE53Irdz7jY+drTwESHIMVirCwkAAMB/yVC8ezAfx/1Alq0t0uOnphoyhRle1ht5CuPgSJQ== -"@types/d3-format@^1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.4.2.tgz#ea17bf559b71d9afd569ae9bfe4c544dab863baa" - integrity sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ== +"@types/d3-format@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-2.0.2.tgz#97b2ac314430ae9f7768cc9efba8b23b63af82ef" + integrity sha512-OhQPuTeeMhD9A0Ksqo4q1S9Z1Q57O/t4tTPBxBQxRB4IERnxeoEYLPe72fA/GYpPSUrfKZVOgLHidkxwbzLdJA== -"@types/d3-geo@^1": - version "1.12.3" - resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.12.3.tgz#512ebe735cb1cdf5f87ad59608416e2e9e868c5a" - integrity sha512-yZbPb7/5DyL/pXkeOmZ7L5ySpuGr4H48t1cuALjnJy5sXQqmSSAYBiwa6Ya/XpWKX2rJqGDDubmh3nOaopOpeA== +"@types/d3-geo@^2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-2.0.3.tgz#4af0f33c9e796aad6c3fc0dd8cadda9886d1fea9" + integrity sha512-kFwLEMXq1mGJ2Eho7KrOUYvLcc2YTDeKj+kTFt87JlEbRQ0rgo8ZENNb5vTYmZrJ2xL/vVM5M7yqVZGOPH2JFg== dependencies: "@types/geojson" "*" -"@types/d3-hierarchy@^1": - version "1.1.8" - resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz#50657f420d565a06c0b950a4b82eee0a369f2dea" - integrity sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg== +"@types/d3-hierarchy@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-2.0.2.tgz#afd09d509c36e8cd4907333556f8b591f23589e9" + integrity sha512-6PlBRwbjUPPt0ZFq/HTUyOAdOF3p73EUYots74lHMUyAVtdFSOS/hAeNXtEIM9i7qRDntuIblXxHGUMb9MuNRA== -"@types/d3-interpolate@^1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz#88902a205f682773a517612299a44699285eed7b" - integrity sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg== +"@types/d3-interpolate@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz#78eddf7278b19e48e8652603045528d46897aba0" + integrity sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw== dependencies: - "@types/d3-color" "^1" + "@types/d3-color" "^2" -"@types/d3-path@^1": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" - integrity sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ== +"@types/d3-path@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.2.tgz#6052f38f6186319769dfabab61b5514b0e02c75c" + integrity sha512-3YHpvDw9LzONaJzejXLOwZ3LqwwkoXb9LI2YN7Hbd6pkGo5nIlJ09ul4bQhBN4hQZJKmUpX8HkVqbzgUKY48cg== -"@types/d3-polygon@^1": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-1.0.8.tgz#127ee83fccda5bf57384011da90f31367fea1530" - integrity sha512-1TOJPXCBJC9V3+K3tGbTqD/CsqLyv/YkTXAcwdsZzxqw5cvpdnCuDl42M4Dvi8XzMxZNCT9pL4ibrK2n4VmAcw== +"@types/d3-polygon@^2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-2.0.1.tgz#c2056594f85b512bc2b4f741caddd4b5448bc115" + integrity sha512-X3XTIwBxlzRIWe4yaD1KsmcfItjSPLTGL04QDyP08jyHDVsnz3+NZJMwtD4vCaTAVpGSjbqS+jrBo8cO2V/xMA== -"@types/d3-quadtree@^1": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-1.0.9.tgz#c7c3b795b5af06e5b043d1d34e754a434b3bae59" - integrity sha512-5E0OJJn2QVavITFEc1AQlI8gLcIoDZcTKOD3feKFckQVmFV4CXhqRFt83tYNVNIN4ZzRkjlAMavJa1ldMhf5rA== +"@types/d3-quadtree@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-2.0.2.tgz#e3cd92b4e05318f98b0a16e780ba99ce7b13eb77" + integrity sha512-KgWL4jlz8QJJZX01E4HKXJ9FLU94RTuObsAYqsPp8YOAcYDmEgJIQJ+ojZcnKUAnrUb78ik8JBKWas5XZPqJnQ== -"@types/d3-random@^1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.3.tgz#8f7fdc23f92d1561e0694eb49567e8ab50537a19" - integrity sha512-XXR+ZbFCoOd4peXSMYJzwk0/elP37WWAzS/DG+90eilzVbUSsgKhBcWqylGWe+lA2ubgr7afWAOBaBxRgMUrBQ== +"@types/d3-random@^2": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-2.2.1.tgz#551edbb71cb317dea2cf9c76ebe059d311eefacb" + integrity sha512-5vvxn6//poNeOxt1ZwC7QU//dG9QqABjy1T7fP/xmFHY95GnaOw3yABf29hiu5SR1Oo34XcpyHFbzod+vemQjA== -"@types/d3-scale-chromatic@^1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.5.1.tgz#e2b7c3401e5c13809f831911eb820e444f4fc67a" - integrity sha512-7FtJYrmXTEWLykShjYhoGuDNR/Bda0+tstZMkFj4RRxUEryv16AGh3be21tqg84B6KfEwiZyEpBcTyPyU+GWjg== +"@types/d3-scale-chromatic@^2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.1.tgz#495cbbae7273e0d0ff564cdc19aa6d2b9928da83" + integrity sha512-3EuZlbPu+pvclZcb1DhlymTWT2W+lYsRKBjvkH2ojDbCWDYavifqu1vYX9WGzlPgCgcS4Alhk1+zapXbGEGylQ== -"@types/d3-scale@^2": - version "2.2.6" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-2.2.6.tgz#28540b4dfc99d978970e873e4138a6bea2ea6ab8" - integrity sha512-CHu34T5bGrJOeuhGxyiz9Xvaa9PlsIaQoOqjDg7zqeGj2x0rwPhGquiy03unigvcMxmvY0hEaAouT0LOFTLpIw== +"@types/d3-scale@^3": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" + integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== dependencies: - "@types/d3-time" "^1" + "@types/d3-time" "^2" -"@types/d3-selection@^1": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.4.3.tgz#36928bbe64eb8e0bbcbaa01fb05c21ff6c71fa93" - integrity sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA== +"@types/d3-selection@^2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-2.0.1.tgz#bc2816c96faff285d204dda72b79734d4f37d583" + integrity sha512-3mhtPnGE+c71rl/T5HMy+ykg7migAZ4T6gzU0HxpgBFKcasBrSnwRbYV1/UZR6o5fkpySxhWxAhd7yhjj8jL7g== -"@types/d3-shape@^1": - version "1.3.8" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.3.8.tgz#c3c15ec7436b4ce24e38de517586850f1fea8e89" - integrity sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg== +"@types/d3-shape@^2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3" + integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ== dependencies: - "@types/d3-path" "^1" + "@types/d3-path" "^2" -"@types/d3-time-format@^2": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.3.1.tgz#87a30e4513b9d1d53b920327a361f87255bf3372" - integrity sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA== +"@types/d3-time-format@^3": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-3.0.1.tgz#1680fb6c41ab3a85db261ede296626668592246a" + integrity sha512-5GIimz5IqaRsdnxs4YlyTZPwAMfALu/wA4jqSiuqgdbCxUZ2WjrnwANqOtoBJQgeaUTdYNfALJO0Yb0YrDqduA== -"@types/d3-time@^1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.1.1.tgz#6cf3a4242c3bbac00440dfb8ba7884f16bedfcbf" - integrity sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw== +"@types/d3-time@^2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" + integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== -"@types/d3-timer@^1": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-1.0.10.tgz#329c51c2c931f44ed0acff78b8c84571acf0ed21" - integrity sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg== +"@types/d3-timer@^2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-2.0.1.tgz#ffb6620d290624f3726aa362c0c8a4b44c8d7200" + integrity sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA== -"@types/d3-transition@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.3.2.tgz#ed59beca7b4d679cfa52f88a6a50e5bbeb7e0a3c" - integrity sha512-J+a3SuF/E7wXbOSN19p8ZieQSFIm5hU2Egqtndbc54LXaAEOpLfDx4sBu/PKAKzHOdgKK1wkMhINKqNh4aoZAg== +"@types/d3-transition@^2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-2.0.2.tgz#d5ba1c26a3daeb0c5527d573d44b4c5ca9fae027" + integrity sha512-376TICEykdXOEA9uUIYpjshEkxfGwCPnkHUl8+6gphzKbf5NMnUhKT7wR59Yxrd9wtJ/rmE3SVLx6/8w4eY6Zg== dependencies: - "@types/d3-selection" "^1" - -"@types/d3-voronoi@*": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz#7bbc210818a3a5c5e0bafb051420df206617c9e5" - integrity sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ== + "@types/d3-selection" "^2" -"@types/d3-zoom@^1": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.8.3.tgz#00237900c6fdc2bb4fe82679ee4d74eb8fbe7b3c" - integrity sha512-3kHkL6sPiDdbfGhzlp5gIHyu3kULhtnHTTAl3UBZVtWB1PzcLL8vdmz5mTx7plLiUqOA2Y+yT2GKjt/TdA2p7Q== - dependencies: - "@types/d3-interpolate" "^1" - "@types/d3-selection" "^1" - -"@types/d3@^5.7.2": - version "5.16.4" - resolved "https://registry.yarnpkg.com/@types/d3/-/d3-5.16.4.tgz#a7dc24a3dc1c19922eee72ba16144fd5bcea987a" - integrity sha512-2u0O9iP1MubFiQ+AhR1id4Egs+07BLtvRATG6IL2Gs9+KzdrfaxCKNq5hxEyw1kxwsqB/lCgr108XuHcKtb/5w== - dependencies: - "@types/d3-array" "^1" - "@types/d3-axis" "^1" - "@types/d3-brush" "^1" - "@types/d3-chord" "^1" - "@types/d3-collection" "*" - "@types/d3-color" "^1" - "@types/d3-contour" "^1" - "@types/d3-dispatch" "^1" - "@types/d3-drag" "^1" - "@types/d3-dsv" "^1" - "@types/d3-ease" "^1" - "@types/d3-fetch" "^1" - "@types/d3-force" "^1" - "@types/d3-format" "^1" - "@types/d3-geo" "^1" - "@types/d3-hierarchy" "^1" - "@types/d3-interpolate" "^1" - "@types/d3-path" "^1" - "@types/d3-polygon" "^1" - "@types/d3-quadtree" "^1" - "@types/d3-random" "^1" - "@types/d3-scale" "^2" - "@types/d3-scale-chromatic" "^1" - "@types/d3-selection" "^1" - "@types/d3-shape" "^1" - "@types/d3-time" "^1" - "@types/d3-time-format" "^2" - "@types/d3-timer" "^1" - "@types/d3-transition" "^1" - "@types/d3-voronoi" "*" - "@types/d3-zoom" "^1" +"@types/d3-zoom@^2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-2.0.3.tgz#9eef8763600fa8be11b8cb0ed9144a395df6dffb" + integrity sha512-9X9uDYKk2U8w775OHj36s9Q7GkNAnJKGw6+sbkP5DpHSjELwKvTGzEK6+IISYfLpJRL/V3mRXMhgDnnJ5LkwJg== + dependencies: + "@types/d3-interpolate" "^2" + "@types/d3-selection" "^2" + +"@types/d3@^6.0.0": + version "6.7.5" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-6.7.5.tgz#6ae8034ea21db10fa3e31db1f670c5887d91d8a3" + integrity sha512-TUZ6zuT/KIvbHSv81kwAiO5gG5aTuoiLGnWR/KxHJ15Idy/xmGUXaaF5zMG+UMIsndcGlSHTmrvwRgdvZlNKaA== + dependencies: + "@types/d3-array" "^2" + "@types/d3-axis" "^2" + "@types/d3-brush" "^2" + "@types/d3-chord" "^2" + "@types/d3-color" "^2" + "@types/d3-contour" "^2" + "@types/d3-delaunay" "^5" + "@types/d3-dispatch" "^2" + "@types/d3-drag" "^2" + "@types/d3-dsv" "^2" + "@types/d3-ease" "^2" + "@types/d3-fetch" "^2" + "@types/d3-force" "^2" + "@types/d3-format" "^2" + "@types/d3-geo" "^2" + "@types/d3-hierarchy" "^2" + "@types/d3-interpolate" "^2" + "@types/d3-path" "^2" + "@types/d3-polygon" "^2" + "@types/d3-quadtree" "^2" + "@types/d3-random" "^2" + "@types/d3-scale" "^3" + "@types/d3-scale-chromatic" "^2" + "@types/d3-selection" "^2" + "@types/d3-shape" "^2" + "@types/d3-time" "^2" + "@types/d3-time-format" "^3" + "@types/d3-timer" "^2" + "@types/d3-transition" "^2" + "@types/d3-zoom" "^2" "@types/enzyme@^3.10.8": version "3.10.12" @@ -2598,6 +2749,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe" integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ== +"@types/file-saver@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" + integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ== + "@types/geojson@*": version "7946.0.8" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" @@ -2666,13 +2822,13 @@ jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/jest@^28.0.0": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.3.tgz#52f3f3e50ce59191ff5fbb1084896cc0cf30c9ce" - integrity sha512-Tsbjk8Y2hkBaY/gJsataeb4q9Mubw9EOz7+4RjPkzD5KjTvHHs7cpws22InaoXxAVAhF5HfFbzJjo6oKWqSZLw== +"@types/jest@^29.0.0": + version "29.0.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.0.3.tgz#b61a5ed100850686b8d3c5e28e3a1926b2001b59" + integrity sha512-F6ukyCTwbfsEX5F2YmVYmM5TcTHy1q9P5rWlRbrk56KyMh3v9xRGUO3aa8+SkvMi0SHXtASJv1283enXimC0Og== dependencies: - jest-matcher-utils "^28.0.0" - pretty-format "^28.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" @@ -2684,10 +2840,10 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== -"@types/luxon@^2.0.0": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.3.2.tgz#8a3f2cdd4858ce698b56cd8597d9243b8e9d3c65" - integrity sha512-WOehptuhKIXukSUUkRgGbj2c997Uv/iUgYgII8U7XLJqq9W2oF0kQ6frEznRQbdurioz+L/cdaIm4GutTQfgmA== +"@types/luxon@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.0.1.tgz#2b1657096473e24b049bdedf3710f99645f3a17f" + integrity sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ== "@types/minimatch@*": version "3.0.5" @@ -2842,14 +2998,36 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.19.0", "@typescript-eslint/eslint-plugin@^5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.0.tgz#524a11e15c09701733033c96943ecf33f55d9ca1" - integrity sha512-lvhRJ2pGe2V9MEU46ELTdiHgiAFZPKtLhiU5wlnaYpMc2+c1R8fh8i80ZAa665drvjHKUJyRRGg3gEm1If54ow== +"@types/yargs@^17.0.8": + version "17.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" + integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.0.tgz#8f159c4cdb3084eb5d4b72619a2ded942aa109e5" + integrity sha512-X3In41twSDnYRES7hO2xna4ZC02SY05UN9sGW//eL1P5k4CKfvddsdC2hOq0O3+WU1wkCPQkiTY9mzSnXKkA0w== + dependencies: + "@typescript-eslint/scope-manager" "5.36.0" + "@typescript-eslint/type-utils" "5.36.0" + "@typescript-eslint/utils" "5.36.0" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/eslint-plugin@^5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz#5ccdd5d9004120f28fc6e717fb4b5c9bddcfbc04" + integrity sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og== dependencies: - "@typescript-eslint/scope-manager" "5.30.0" - "@typescript-eslint/type-utils" "5.30.0" - "@typescript-eslint/utils" "5.30.0" + "@typescript-eslint/scope-manager" "5.37.0" + "@typescript-eslint/type-utils" "5.37.0" + "@typescript-eslint/utils" "5.37.0" debug "^4.3.4" functional-red-black-tree "^1.0.1" ignore "^5.2.0" @@ -2857,69 +3035,180 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.10.0", "@typescript-eslint/parser@^5.19.0", "@typescript-eslint/parser@^5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.0.tgz#a2184fb5f8ef2bf1db0ae61a43907e2e32aa1b8f" - integrity sha512-2oYYUws5o2liX6SrFQ5RB88+PuRymaM2EU02/9Ppoyu70vllPnHVO7ioxDdq/ypXHA277R04SVjxvwI8HmZpzA== +"@typescript-eslint/parser@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.0.tgz#c08883073fb65acaafd268a987fd2314ce80c789" + integrity sha512-dlBZj7EGB44XML8KTng4QM0tvjI8swDh8MdpE5NX5iHWgWEfIuqSfSE+GPeCrCdj7m4tQLuevytd57jNDXJ2ZA== dependencies: - "@typescript-eslint/scope-manager" "5.30.0" - "@typescript-eslint/types" "5.30.0" - "@typescript-eslint/typescript-estree" "5.30.0" + "@typescript-eslint/scope-manager" "5.36.0" + "@typescript-eslint/types" "5.36.0" + "@typescript-eslint/typescript-estree" "5.36.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.0.tgz#bf585ee801ab4ad84db2f840174e171a6bb002c7" - integrity sha512-3TZxvlQcK5fhTBw5solQucWSJvonXf5yua5nx8OqK94hxdrT7/6W3/CS42MLd/f1BmlmmbGEgQcTHHCktUX5bQ== +"@typescript-eslint/parser@^5.10.0": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.5.tgz#f667c34e4e4c299d98281246c9b1e68c03a92522" + integrity sha512-zj251pcPXI8GO9NDKWWmygP6+UjwWmrdf9qMW/L/uQJBM/0XbU2inxe5io/234y/RCvwpKEYjZ6c1YrXERkK4Q== dependencies: - "@typescript-eslint/types" "5.30.0" - "@typescript-eslint/visitor-keys" "5.30.0" + "@typescript-eslint/scope-manager" "5.30.5" + "@typescript-eslint/types" "5.30.5" + "@typescript-eslint/typescript-estree" "5.30.5" + debug "^4.3.4" -"@typescript-eslint/type-utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.0.tgz#98f3af926a5099153f092d4dad87148df21fbaae" - integrity sha512-GF8JZbZqSS+azehzlv/lmQQ3EU3VfWYzCczdZjJRxSEeXDQkqFhCBgFhallLDbPwQOEQ4MHpiPfkjKk7zlmeNg== +"@typescript-eslint/parser@^5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.37.0.tgz#c382077973f3a4ede7453fb14cadcad3970cbf3b" + integrity sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw== dependencies: - "@typescript-eslint/utils" "5.30.0" + "@typescript-eslint/scope-manager" "5.37.0" + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/typescript-estree" "5.37.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.5.tgz#7f90b9d6800552c856a5f3644f5e55dd1469d964" + integrity sha512-NJ6F+YHHFT/30isRe2UTmIGGAiXKckCyMnIV58cE3JkHmaD6e5zyEYm5hBDv0Wbin+IC0T1FWJpD3YqHUG/Ydg== + dependencies: + "@typescript-eslint/types" "5.30.5" + "@typescript-eslint/visitor-keys" "5.30.5" + +"@typescript-eslint/scope-manager@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.0.tgz#f4f859913add160318c0a5daccd3a030d1311530" + integrity sha512-PZUC9sz0uCzRiuzbkh6BTec7FqgwXW03isumFVkuPw/Ug/6nbAqPUZaRy4w99WCOUuJTjhn3tMjsM94NtEj64g== + dependencies: + "@typescript-eslint/types" "5.36.0" + "@typescript-eslint/visitor-keys" "5.36.0" + +"@typescript-eslint/scope-manager@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz#044980e4f1516a774a418dafe701a483a6c9f9ca" + integrity sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q== + dependencies: + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/visitor-keys" "5.37.0" + +"@typescript-eslint/type-utils@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.0.tgz#5d2f94a36a298ae240ceca54b3bc230be9a99f0a" + integrity sha512-W/E3yJFqRYsjPljJ2gy0YkoqLJyViWs2DC6xHkXcWyhkIbCDdaVnl7mPLeQphVI+dXtY05EcXFzWLXhq8Mm/lQ== + dependencies: + "@typescript-eslint/typescript-estree" "5.36.0" + "@typescript-eslint/utils" "5.36.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/type-utils@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz#43ed2f567ada49d7e33a6e4b6f9babd060445fe5" + integrity sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ== + dependencies: + "@typescript-eslint/typescript-estree" "5.37.0" + "@typescript-eslint/utils" "5.37.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.0.tgz#db7d81d585a3da3801432a9c1d2fafbff125e110" - integrity sha512-vfqcBrsRNWw/LBXyncMF/KrUTYYzzygCSsVqlZ1qGu1QtGs6vMkt3US0VNSQ05grXi5Yadp3qv5XZdYLjpp8ag== +"@typescript-eslint/types@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.5.tgz#36a0c05a72af3623cdf9ee8b81ea743b7de75a98" + integrity sha512-kZ80w/M2AvsbRvOr3PjaNh6qEW1LFqs2pLdo2s5R38B2HYXG8Z0PP48/4+j1QHJFL3ssHIbJ4odPRS8PlHrFfw== + +"@typescript-eslint/types@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.0.tgz#cde7b94d1c09a4f074f46db99e7bd929fb0a5559" + integrity sha512-3JJuLL1r3ljRpFdRPeOtgi14Vmpx+2JcR6gryeORmW3gPBY7R1jNYoq4yBN1L//ONZjMlbJ7SCIwugOStucYiQ== + +"@typescript-eslint/types@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.37.0.tgz#09e4870a5f3af7af3f84e08d792644a87d232261" + integrity sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA== -"@typescript-eslint/typescript-estree@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.0.tgz#4565ee8a6d2ac368996e20b2344ea0eab1a8f0bb" - integrity sha512-hDEawogreZB4n1zoqcrrtg/wPyyiCxmhPLpZ6kmWfKF5M5G0clRLaEexpuWr31fZ42F96SlD/5xCt1bT5Qm4Nw== +"@typescript-eslint/typescript-estree@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.5.tgz#c520e4eba20551c4ec76af8d344a42eb6c9767bb" + integrity sha512-qGTc7QZC801kbYjAr4AgdOfnokpwStqyhSbiQvqGBLixniAKyH+ib2qXIVo4P9NgGzwyfD9I0nlJN7D91E1VpQ== dependencies: - "@typescript-eslint/types" "5.30.0" - "@typescript-eslint/visitor-keys" "5.30.0" + "@typescript-eslint/types" "5.30.5" + "@typescript-eslint/visitor-keys" "5.30.5" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.0.tgz#1dac771fead5eab40d31860716de219356f5f754" - integrity sha512-0bIgOgZflLKIcZsWvfklsaQTM3ZUbmtH0rJ1hKyV3raoUYyeZwcjQ8ZUJTzS7KnhNcsVT1Rxs7zeeMHEhGlltw== +"@typescript-eslint/typescript-estree@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.0.tgz#0acce61b4850bdb0e578f0884402726680608789" + integrity sha512-EW9wxi76delg/FS9+WV+fkPdwygYzRrzEucdqFVWXMQWPOjFy39mmNNEmxuO2jZHXzSQTXzhxiU1oH60AbIw9A== + dependencies: + "@typescript-eslint/types" "5.36.0" + "@typescript-eslint/visitor-keys" "5.36.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz#956dcf5c98363bcb97bdd5463a0a86072ff79355" + integrity sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA== + dependencies: + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/visitor-keys" "5.37.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.0.tgz#104c864ecc1448417606359275368bf3872bbabb" + integrity sha512-wAlNhXXYvAAUBbRmoJDywF/j2fhGLBP4gnreFvYvFbtlsmhMJ4qCKVh/Z8OP4SgGR3xbciX2nmG639JX0uw1OQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.36.0" + "@typescript-eslint/types" "5.36.0" + "@typescript-eslint/typescript-estree" "5.36.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/utils@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.37.0.tgz#7784cb8e91390c4f90ccaffd24a0cf9874df81b2" + integrity sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.30.0" - "@typescript-eslint/types" "5.30.0" - "@typescript-eslint/typescript-estree" "5.30.0" + "@typescript-eslint/scope-manager" "5.37.0" + "@typescript-eslint/types" "5.37.0" + "@typescript-eslint/typescript-estree" "5.37.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.0.tgz#07721d23daca2ec4c2da7f1e660d41cd78bacac3" - integrity sha512-6WcIeRk2DQ3pHKxU1Ni0qMXJkjO/zLjBymlYBy/53qxe7yjEFSvzKLDToJjURUhSl2Fzhkl4SMXQoETauF74cw== +"@typescript-eslint/visitor-keys@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.5.tgz#d4bb969202019d5d5d849a0aaedc7370cc044b14" + integrity sha512-D+xtGo9HUMELzWIUqcQc0p2PO4NyvTrgIOK/VnSH083+8sq0tiLozNRKuLarwHYGRuA6TVBQSuuLwJUDWd3aaA== + dependencies: + "@typescript-eslint/types" "5.30.5" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@5.36.0": + version "5.36.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.0.tgz#565d35a5ca00d00a406a942397ead2cb190663ba" + integrity sha512-pdqSJwGKueOrpjYIex0T39xarDt1dn4p7XJ+6FqBWugNQwXlNGC5h62qayAIYZ/RPPtD+ButDWmpXT1eGtiaYg== + dependencies: + "@typescript-eslint/types" "5.36.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@5.37.0": + version "5.37.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz#7b72dd343295ea11e89b624995abc7103c554eee" + integrity sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA== dependencies: - "@typescript-eslint/types" "5.30.0" + "@typescript-eslint/types" "5.37.0" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.9.0": @@ -3111,7 +3400,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -3126,7 +3415,7 @@ acorn@^6.0.2, acorn@^6.0.7, acorn@^6.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1: +acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -3136,11 +3425,21 @@ acorn@^8.2.4, acorn@^8.7.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== +adler-32@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2" + integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3181,7 +3480,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.3, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3191,6 +3490,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -3758,10 +4067,10 @@ babel-preset-cozy-app@1.9.2: browserslist-config-cozy "^0.3.1" lodash "4.17.19" -babel-preset-cozy-app@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-cozy-app/-/babel-preset-cozy-app-2.0.2.tgz#057da4ac68b1340a58cde18dbd40e67e04f3b998" - integrity sha512-D7+LE5zVDFhD9fxfhjERr2qxfxf+pc8w6RWe5mV/bS5Hz2iULNlScslg2Pbz+U5gHQtxysxmwQYz8ufjZmfFbg== +babel-preset-cozy-app@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-preset-cozy-app/-/babel-preset-cozy-app-2.0.3.tgz#7056c783383e88f1787908642e4926c10cf95116" + integrity sha512-Cgcx+B9QbrLWvYQ7stV9tQq5Q0tVV99OuW8tzvBYNhXDvQ7rT8V6OL8LHN5AtFAkcKn7keNXEorxY8nHtU9q6g== dependencies: "@babel/core" "7.16.12" "@babel/eslint-parser" "^7.16.3" @@ -4298,13 +4607,6 @@ caller-callsite@^2.0.0: dependencies: callsites "^2.0.0" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g== - dependencies: - callsites "^0.2.0" - caller-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" @@ -4312,11 +4614,6 @@ caller-path@^2.0.0: dependencies: caller-callsite "^2.0.0" -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A== - callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" @@ -4376,6 +4673,14 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +cfb@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44" + integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA== + dependencies: + adler-32 "~1.3.0" + crc-32 "~1.2.0" + chalk@1.1.3, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -4387,15 +4692,6 @@ chalk@1.1.3, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@3, chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -4404,6 +4700,15 @@ chalk@3, chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^4.0.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -4525,7 +4830,7 @@ chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chownr@^1.0.1, chownr@^1.1.1: +chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -4545,6 +4850,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251" + integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -4553,11 +4863,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - cjs-module-lexer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" @@ -4728,6 +5033,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== +codepage@~1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab" + integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA== + collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" @@ -5258,25 +5568,25 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cozy-app-publish@0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/cozy-app-publish/-/cozy-app-publish-0.25.0.tgz#7f70efb15cc9369b219e49decc6cb792feb58a2d" - integrity sha512-tlXX1Hj+C1E0udH4hrMRw/VHop2dbLKdI2NH1DKUGVEhhNKVG52IJ2C7L2MBhHFAC0Nd0tu7voszrm7TYDBDeQ== +cozy-app-publish@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/cozy-app-publish/-/cozy-app-publish-0.27.2.tgz#5b81565733821bd74f7768b22e08343e58061817" + integrity sha512-mWoEsnhq6OsJMyIMR2uTnlU00Wvinpgsa+NJGHqcJ0nApaKOAek/5rZWrPZlrl91iskK5iL75Mie/GctVyvrbA== dependencies: argparse "^1.0.10" - chalk "2.4.2" - cross-spawn "6.0.5" - fs-extra "7.0.1" - lodash "4.17.19" - node-fetch "2.6.0" - prompt "1.0.0" - request "2.88.0" - tar "4.4.13" + chalk "^2.4.2" + cross-spawn "^6.0.5" + fs-extra "^7.0.1" + lodash "^4.17.19" + node-fetch "^2.6.1" + prompt "^1.0.0" + request "^2.88.0" + tar "^4.4.13" -cozy-app-publish@^0.30.0: - version "0.30.4" - resolved "https://registry.yarnpkg.com/cozy-app-publish/-/cozy-app-publish-0.30.4.tgz#a76e7f06b4cfcfa6cc4efb581e1297ec9865c02b" - integrity sha512-/Jw6JibxavJ9t3YOuCNpDWhVY6+f1LEN9xZ1+4UX8fMcWdwXYSrxan0VYQzm9sBGym1jGp9Y9wC92+DTO4SD3Q== +cozy-app-publish@^0.31.0: + version "0.31.0" + resolved "https://registry.yarnpkg.com/cozy-app-publish/-/cozy-app-publish-0.31.0.tgz#c32a2307ce4c52a52d3f559a9df93f4c9ba1257f" + integrity sha512-JXU1z5LtjNIQXsNY9xmFQWjMOkBR4pxoESXYrOONAlsdNvDlaKY46AayT8dz/fzlIIr85ibEoU9fvuno2SmDtA== dependencies: argparse "^2.0.1" chalk "^2.4.2" @@ -5289,10 +5599,10 @@ cozy-app-publish@^0.30.0: tar "^6.1.11" verror "^1.10.1" -cozy-bar@8.7.5: - version "8.7.5" - resolved "https://registry.yarnpkg.com/cozy-bar/-/cozy-bar-8.7.5.tgz#c7be797cbe2578e8a8b8ceebd33c7bff3f092218" - integrity sha512-p73V3BKapJn85JRKtXHfkLEai77T7ydYeNZ+g2vfJDpq9zXAy/elq9AOMVFCvoB2M56XGH+obZK0S7qMmW61rQ== +cozy-bar@8.9.2: + version "8.9.2" + resolved "https://registry.yarnpkg.com/cozy-bar/-/cozy-bar-8.9.2.tgz#f2205022d86d5a4acfb5f98740072e03c6ea8475" + integrity sha512-gkU1W7CW15iz5f8uT1kLOrK023OQrRsW/7zWWyVpdkcXsoxXfCNM9lcz92s4TtMqCVhttCJtw/BxX7bqjee62g== dependencies: hammerjs "2.0.8" lodash.debounce "4.0.8" @@ -5349,16 +5659,16 @@ cozy-client@29.1.2: sift "^6.0.0" url-search-params-polyfill "^8.0.0" -cozy-client@32.2.1: - version "32.2.1" - resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-32.2.1.tgz#f9f981febc4b20fd3652ab591d6c40612a95a94d" - integrity sha512-OjmMcgavxVFMYApdNU+20J5SPXCbBXYKZ10+RigfZBTYgHdxcW1YY/Dr6gfEGUIPo25ZiRoSKbqbwpML7VZ1sQ== +cozy-client@33.2.0: + version "33.2.0" + resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-33.2.0.tgz#276835cce8b230c56631b3cfa98611ea900079d8" + integrity sha512-z+oA0Ri+m4vsAE1Gznab+vSP8j/uEa0zv9+qzB5ORIJvQ0QNHuLBWDoy+0FT4Rz4z+qLqDXxYyVVDBuwps4atQ== dependencies: "@cozy/minilog" "1.0.0" "@types/jest" "^26.0.20" "@types/lodash" "^4.14.170" btoa "^1.2.1" - cozy-stack-client "^32.2.0" + cozy-stack-client "^33.2.0" json-stable-stringify "^1.0.1" lodash "^4.17.13" microee "^0.0.6" @@ -5397,7 +5707,7 @@ cozy-client@^29.1.2: sift "^6.0.0" url-search-params-polyfill "^8.0.0" -cozy-device-helper@>=2.1.0, cozy-device-helper@^2.1.0, cozy-device-helper@^2.2.1: +cozy-device-helper@>=2.1.0, cozy-device-helper@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-2.2.1.tgz#d5822afd818919fa871527e6f78b0265fc1e009b" integrity sha512-1zVQag2OI+6sEGEC70w77urnk4GpWa/ncvCYuyrOOgib4bH6v2YbBrymOD9T3MH0yVF/LVMnXnugSHQfhNLVhA== @@ -5411,6 +5721,13 @@ cozy-device-helper@^1.7.5: dependencies: lodash "^4.17.19" +cozy-device-helper@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-2.5.0.tgz#4a5b18ad07a2c66c468988ae9daee014ba876e5b" + integrity sha512-+KKX6obYg8UmdmPvBuZDFMfzdSMOSKbnCf6ZIJTkW3Xs95aDZYhh/6x61Ok5+oTusHBL/khd6A+P1Qx5tL7mrw== + dependencies: + lodash "^4.17.19" + cozy-doctypes@^1.83.8: version "1.83.8" resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.83.8.tgz#99ec864059034bd032f6f01e322b57fea130a5d3" @@ -5422,6 +5739,17 @@ cozy-doctypes@^1.83.8: lodash "^4.17.19" prop-types "^15.7.2" +cozy-doctypes@^1.85.3: + version "1.85.3" + resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.85.3.tgz#9a59856161a4e54af248bec8ed6b1e8752bbbcff" + integrity sha512-ISHGpC4tlzcN4P8MzKV3vbsWmx6AfPIZjO60KSHNfHuD1TFfOaAWKQXpg2Eo4KWExImzRXmrs1uMTuYFEdYZTA== + dependencies: + cozy-logger "^1.9.1" + date-fns "^1.30.1" + es6-promise-pool "^2.5.0" + lodash "^4.17.19" + prop-types "^15.7.2" + cozy-flags@>2.8.6, cozy-flags@^2.8.7: version "2.9.0" resolved "https://registry.yarnpkg.com/cozy-flags/-/cozy-flags-2.9.0.tgz#9f458c0eb71f549a2ae12198d55de89434bff96b" @@ -5429,16 +5757,16 @@ cozy-flags@>2.8.6, cozy-flags@^2.8.7: dependencies: microee "^0.0.6" -cozy-harvest-lib@9.18.1: - version "9.18.1" - resolved "https://registry.yarnpkg.com/cozy-harvest-lib/-/cozy-harvest-lib-9.18.1.tgz#ba8034a3c20c1f4ec60ee41ea2af7f62ad862eb5" - integrity sha512-VpHAf/UDhTxY4Qj7EBhKhVbuiO3PJpe5HTiWkSwWG+UdWrNzbMECv9inH7htLKvpT4H1mxgAg2h7olKYSDlVQQ== +cozy-harvest-lib@9.26.14: + version "9.26.14" + resolved "https://registry.yarnpkg.com/cozy-harvest-lib/-/cozy-harvest-lib-9.26.14.tgz#bcf1466d9c35f34224ebe6a009372aabf1dd6f6e" + integrity sha512-IfDe0IdGdbuVPspx76ytcX6g1DJXBYq+v27V03tTCU1y3IVkOCs2+6clW2sZeDbMvo+FVIjd6+RJKaXzWeTbWA== dependencies: "@cozy/minilog" "^1.0.0" "@sentry/browser" "^6.0.1" cozy-bi-auth "0.0.25" - cozy-doctypes "^1.83.8" - cozy-logger "^1.9.0" + cozy-doctypes "^1.85.3" + cozy-logger "^1.9.1" date-fns "^1.30.1" final-form "^4.18.5" lodash "^4.17.19" @@ -5551,13 +5879,21 @@ cozy-logger@>1.7.0, cozy-logger@^1.3.0, cozy-logger@^1.8.0, cozy-logger@^1.9.0: chalk "^2.4.2" json-stringify-safe "5.0.1" -cozy-realtime@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/cozy-realtime/-/cozy-realtime-4.2.1.tgz#b42fe82057bd1aae4f227d7987f207eacb169984" - integrity sha512-YuyT8DfzInyzt5dW4Acb+nxU0lIMQ4aGveZyx2pTjpYVpRf8xYDz0zPkcxVugfEgSstZBfFtcXKS1+9i4QcjMw== +cozy-logger@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/cozy-logger/-/cozy-logger-1.9.1.tgz#d5eb5a007eae6b4612fc6cc5a82fd70fe8c435bb" + integrity sha512-9P8A4chfSsdx5P32upo9SDx+ZyQj1RuFuggHd6BgVbcFo7folCulk6TCFRFEekT2fIYHbT2nRDc0RTOdz98lYw== + dependencies: + chalk "^2.4.2" + json-stringify-safe "5.0.1" + +cozy-realtime@4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/cozy-realtime/-/cozy-realtime-4.2.8.tgz#25954c6a9038019c742757617f75e82a33e7de13" + integrity sha512-HMZLTO/A8jqjvsBDlCrwzug+DdwoNIbkw5IvSSE0VPobdIiOo5q3W8WyLbCu9fwC7GijE/Nyfsk1PCfh10a16Q== dependencies: "@cozy/minilog" "^1.0.0" - cozy-device-helper "^2.2.1" + cozy-device-helper "^2.5.0" cozy-release@1.10.0: version "1.10.0" @@ -5566,10 +5902,10 @@ cozy-release@1.10.0: dependencies: exec-sh "0.3.2" -cozy-scripts@5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-5.13.0.tgz#a7f18dff151ebdc11ef9cb71b6d641a17e90d20a" - integrity sha512-2Z9cnliIxnRh5hcnpe6nIfHOxGNSNUlEWa9Q607PNUPmvMj6OP2xAYKg5knyc4RjtNBPafbsJgaGdtf+Rj0EoQ== +cozy-scripts@6.3.10: + version "6.3.10" + resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-6.3.10.tgz#16028dee93b0d9f0d886204c13a2a7299f6c96b8" + integrity sha512-aUB1yYvNwXgyxjlYP8FSEYICQ3Y8nwPhTFP4dZyat4zwbcU+97+IbZIfVjjaX+IWpzg/qG94VCVrCyu/Rummfw== dependencies: "@babel/core" "7.9.0" "@babel/polyfill" "^7.10.4" @@ -5582,16 +5918,16 @@ cozy-scripts@5.13.0: chalk "3" commander "2.19.0" copy-webpack-plugin "4.6.0" - cozy-app-publish "0.25.0" + cozy-app-publish "^0.27.2" cozy-release "1.10.0" cross-spawn "6.0.5" css-loader "2.1.0" css-mqpacker "7.0.0" csswring "7.0.0" duplicate-package-checker-webpack-plugin "^3.0.0" - eslint "5.9.0" + eslint "^7.32.0" eslint-config-cozy-app "1.5.0" - eslint-loader "2.1.2" + eslint-loader "^4.0.2" eslint-plugin-prettier "3.1.2" eslint-plugin-react "7.19.0" eslint-plugin-react-hooks "4.0.4" @@ -5635,21 +5971,23 @@ cozy-stack-client@^29.1.0, cozy-stack-client@^29.2.0: mime "^2.4.0" qs "^6.7.0" -cozy-stack-client@^32.2.0: - version "32.2.0" - resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-32.2.0.tgz#7ba1abfea74568be90578a35dce4b6041420f1ce" - integrity sha512-rvuK8Jc1nNGXz7OJdazgEtbkbg69U3yq0wvhCj+DzVr1cFrHy6nNJekZXmQJbTKycuKb17zHKSooHsrXrlxjNg== +cozy-stack-client@^33.2.0: + version "33.2.0" + resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-33.2.0.tgz#97b80514d68da2b6392f74d280f9867165b7d606" + integrity sha512-50vTnZvjCEYGx5nN+2rLhf63JZICNq9bXKY0QUFmfuMBfOTdD4EGw+EVA0YGxQYaz3E3FLrmMuIw5TtLzCDgcA== dependencies: detect-node "^2.0.4" mime "^2.4.0" qs "^6.7.0" -cozy-ui@68.9.1: - version "68.9.1" - resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-68.9.1.tgz#c26a1c9a78bd553c437eac713fdf0b9b952a874f" - integrity sha512-eBg1gcufo2VLylrtmkS54tVglBtIwgTijfR9xphuDq/QZcN/RBBXhsOTzcVRPh0jKrag11o8egUzX52fnNlpUw== +cozy-ui@75.4.1: + version "75.4.1" + resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-75.4.1.tgz#7185d6994ed96e84ab6651eb982dc8b28990898e" + integrity sha512-WfpLTA6pHP1AeM6W1YPyWkWCVjWMr+B1gNOF6Y996OAyNU1rS1hv5kIXBUPqkgf9XD0ixvCuDGIz9eNRh8K8CQ== dependencies: "@babel/runtime" "^7.3.4" + "@material-ui/core" "4.12.3" + "@material-ui/lab" "^4.0.0-alpha.61" "@popperjs/core" "^2.4.4" bundlemon "^1.3.2" chart.js "3.7.1" @@ -5660,7 +5998,7 @@ cozy-ui@68.9.1: hammerjs "^2.0.8" intersection-observer "0.11.0" mime-types "2.1.35" - mui-bottom-sheet "https://github.com/cozy/mui-bottom-sheet.git#v1.0.6" + mui-bottom-sheet "https://github.com/cozy/mui-bottom-sheet.git#v1.0.9" node-polyglot "^2.2.2" normalize.css "^8.0.0" piwik-react-router "0.12.1" @@ -5673,6 +6011,11 @@ cozy-ui@68.9.1: react-swipeable-views "^0.13.3" rooks "^5.11.2" +crc-32@~1.2.0, crc-32@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -5917,253 +6260,249 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== -d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== +d3-array@2, d3-array@^2.3.0, d3-array@^2.5.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" -d3-axis@1: - version "1.0.12" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" - integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== +d3-axis@2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-2.1.0.tgz#978db534092711117d032fad5d733d206307f6a0" + integrity sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw== -d3-brush@1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" - integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== +d3-brush@2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-2.1.0.tgz#adadfbb104e8937af142e9a6e2028326f0471065" + integrity sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ== dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" + d3-dispatch "1 - 2" + d3-drag "2" + d3-interpolate "1 - 2" + d3-selection "2" + d3-transition "2" -d3-chord@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" - integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== +d3-chord@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-2.0.0.tgz#32491b5665391180560f738e5c1ccd1e3c47ebae" + integrity sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig== dependencies: - d3-array "1" - d3-path "1" + d3-path "1 - 2" -d3-collection@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== +"d3-color@1 - 2", d3-color@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" + integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== +d3-contour@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-2.0.0.tgz#80ee834988563e3bea9d99ddde72c0f8c089ea40" + integrity sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA== + dependencies: + d3-array "2" -d3-contour@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" - integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== +d3-delaunay@5: + version "5.3.0" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-5.3.0.tgz#b47f05c38f854a4e7b3cea80e0bb12e57398772d" + integrity sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w== dependencies: - d3-array "^1.1.1" + delaunator "4" -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== +"d3-dispatch@1 - 2", d3-dispatch@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf" + integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA== -d3-drag@1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" - integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== +d3-drag@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-2.0.0.tgz#9eaf046ce9ed1c25c88661911c1d5a4d8eb7ea6d" + integrity sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w== dependencies: - d3-dispatch "1" - d3-selection "1" + d3-dispatch "1 - 2" + d3-selection "2" -d3-dsv@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" - integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== +"d3-dsv@1 - 2", d3-dsv@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-2.0.0.tgz#b37b194b6df42da513a120d913ad1be22b5fe7c5" + integrity sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w== dependencies: commander "2" iconv-lite "0.4" rw "1" -d3-ease@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== +"d3-ease@1 - 2", d3-ease@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-2.0.0.tgz#fd1762bfca00dae4bacea504b1d628ff290ac563" + integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ== -d3-fetch@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" - integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== +d3-fetch@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-2.0.0.tgz#ecd7ef2128d9847a3b41b548fec80918d645c064" + integrity sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw== dependencies: - d3-dsv "1" + d3-dsv "1 - 2" -d3-force@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== +d3-force@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-2.1.1.tgz#f20ccbf1e6c9e80add1926f09b51f686a8bc0937" + integrity sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew== dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" + d3-dispatch "1 - 2" + d3-quadtree "1 - 2" + d3-timer "1 - 2" -d3-format@1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" - integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== +"d3-format@1 - 2", d3-format@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" + integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== -d3-geo@1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" - integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== +d3-geo@2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-2.0.2.tgz#c065c1b71fe8c5f1be657e5f43d9bdd010383c40" + integrity sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA== dependencies: - d3-array "1" + d3-array "^2.5.0" -d3-hierarchy@1: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== +d3-hierarchy@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz#dab88a58ca3e7a1bc6cab390e89667fcc6d20218" + integrity sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw== -d3-interpolate@1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== +"d3-interpolate@1 - 2", "d3-interpolate@1.2.0 - 2", d3-interpolate@2: + version "2.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" + integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== dependencies: - d3-color "1" + d3-color "1 - 2" -d3-path@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== +"d3-path@1 - 2", d3-path@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" + integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== -d3-polygon@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" - integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== +d3-polygon@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-2.0.0.tgz#13608ef042fbec625ba1598327564f03c0396d8e" + integrity sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ== -d3-quadtree@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" - integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== +"d3-quadtree@1 - 2", d3-quadtree@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d" + integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw== -d3-random@1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" - integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== +d3-random@2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-2.2.2.tgz#5eebd209ef4e45a2b362b019c1fb21c2c98cbb6e" + integrity sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw== -d3-scale-chromatic@1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" - integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== +d3-scale-chromatic@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz#c13f3af86685ff91323dc2f0ebd2dabbd72d8bab" + integrity sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA== dependencies: - d3-color "1" - d3-interpolate "1" + d3-color "1 - 2" + d3-interpolate "1 - 2" -d3-scale@2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" - integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== +d3-scale@3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" + integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== dependencies: - d3-array "^1.2.0" - d3-collection "1" - d3-format "1" - d3-interpolate "1" - d3-time "1" - d3-time-format "2" + d3-array "^2.3.0" + d3-format "1 - 2" + d3-interpolate "1.2.0 - 2" + d3-time "^2.1.1" + d3-time-format "2 - 3" -d3-selection@1, d3-selection@^1.1.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" - integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== +d3-selection@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-2.0.0.tgz#94a11638ea2141b7565f883780dabc7ef6a61066" + integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA== -d3-shape@1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== +d3-shape@2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f" + integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== dependencies: - d3-path "1" + d3-path "1 - 2" -d3-time-format@2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" - integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== +"d3-time-format@2 - 3", d3-time-format@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" + integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== dependencies: - d3-time "1" - -d3-time@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" - integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== - -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + d3-time "1 - 2" -d3-transition@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" - integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== +"d3-time@1 - 2", d3-time@2, d3-time@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" + integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" + d3-array "2" -d3-voronoi@1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== +"d3-timer@1 - 2", d3-timer@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6" + integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA== -d3-zoom@1: - version "1.8.3" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" - integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== +d3-transition@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-2.0.0.tgz#366ef70c22ef88d1e34105f507516991a291c94c" + integrity sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog== dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" + d3-color "1 - 2" + d3-dispatch "1 - 2" + d3-ease "1 - 2" + d3-interpolate "1 - 2" + d3-timer "1 - 2" -d3@^5.15.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" - integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== - dependencies: - d3-array "1" - d3-axis "1" - d3-brush "1" - d3-chord "1" - d3-collection "1" - d3-color "1" - d3-contour "1" - d3-dispatch "1" - d3-drag "1" - d3-dsv "1" - d3-ease "1" - d3-fetch "1" - d3-force "1" - d3-format "1" - d3-geo "1" - d3-hierarchy "1" - d3-interpolate "1" - d3-path "1" - d3-polygon "1" - d3-quadtree "1" - d3-random "1" - d3-scale "2" - d3-scale-chromatic "1" - d3-selection "1" - d3-shape "1" - d3-time "1" - d3-time-format "2" - d3-timer "1" - d3-transition "1" - d3-voronoi "1" - d3-zoom "1" +d3-zoom@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-2.0.0.tgz#f04d0afd05518becce879d04709c47ecd93fba54" + integrity sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw== + dependencies: + d3-dispatch "1 - 2" + d3-drag "2" + d3-interpolate "1 - 2" + d3-selection "2" + d3-transition "2" + +d3@^6.0.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-6.7.0.tgz#adac458597b4a2cafe8e08cf30948af0c95cd61f" + integrity sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g== + dependencies: + d3-array "2" + d3-axis "2" + d3-brush "2" + d3-chord "2" + d3-color "2" + d3-contour "2" + d3-delaunay "5" + d3-dispatch "2" + d3-drag "2" + d3-dsv "2" + d3-ease "2" + d3-fetch "2" + d3-force "2" + d3-format "2" + d3-geo "2" + d3-hierarchy "2" + d3-interpolate "2" + d3-path "2" + d3-polygon "2" + d3-quadtree "2" + d3-random "2" + d3-scale "3" + d3-scale-chromatic "2" + d3-selection "2" + d3-shape "2" + d3-time "2" + d3-time-format "3" + d3-timer "2" + d3-transition "2" + d3-zoom "2" dargs@^7.0.0: version "7.0.0" @@ -6352,6 +6691,11 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" +delaunator@4: + version "4.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957" + integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -6415,10 +6759,10 @@ diff-sequences@^26.6.2: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff-sequences@^29.0.0: + version "29.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" + integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== diffie-hellman@^5.0.0: version "5.0.3" @@ -6519,15 +6863,6 @@ dom-serializer@^1.0.1, dom-serializer@^1.3.2: domhandler "^4.2.0" entities "^2.0.0" -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -6543,7 +6878,7 @@ domelementtype@1, domelementtype@^1.3.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: +domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -6576,13 +6911,6 @@ domhandler@^4.0, domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhan dependencies: domelementtype "^2.2.0" -domhandler@^5.0.1, domhandler@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - domready@1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/domready/-/domready-1.0.8.tgz#91f252e597b65af77e745ae24dd0185d5e26d58c" @@ -6605,15 +6933,6 @@ domutils@^2.0.0, domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -6761,6 +7080,13 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -6776,11 +7102,6 @@ entities@^3.0.1: resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== -entities@^4.2.0, entities@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.0.tgz#62915f08d67353bb4eb67e3d62641a4059aec656" - integrity sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg== - enzyme-adapter-react-16@1.15.6: version "1.15.6" resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz#fd677a658d62661ac5afd7f7f541f141f8085901" @@ -6994,23 +7315,22 @@ eslint-config-cozy-app@1.5.0: eslint-plugin-vue "5.2.3" prettier "1.18.2" -eslint-config-cozy-app@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-cozy-app/-/eslint-config-cozy-app-4.2.0.tgz#d6e41ebe7e924e885c78926ef497030550a383e1" - integrity sha512-naYjf9j2idGbfzrEbtCjg0Xb5J5Cgb/JhV88+S5gzK67YHEZm12FZ0pDVUwarj7+kDa64wfEaznhDHWRJb0gyw== - dependencies: - "@babel/eslint-parser" "^7.17.0" - "@typescript-eslint/eslint-plugin" "^5.19.0" - "@typescript-eslint/parser" "^5.19.0" - eslint "^8.13.0" - eslint-config-prettier "^8.5.0" - eslint-plugin-prettier "^4.0.0" - eslint-plugin-promise "^6.0.0" - eslint-plugin-react "^7.29.4" - eslint-plugin-react-hooks "^4.5.0" - eslint-plugin-vue "^8.6.0" - prettier "^2.6.2" - typescript "^4.6.3" +eslint-config-cozy-app@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-cozy-app/-/eslint-config-cozy-app-5.1.0.tgz#17cf39c01edf587512164aaf340a139f65bc9bb7" + integrity sha512-S5dILPftGUzbFJM8bLCegTqj6kHyU+9mXMoa+jd06ARenvcqE8TQuDhGLhI6z/EdpIlXBNBED/eBQZ+fyyhDXQ== + dependencies: + "@babel/eslint-parser" "7.18.9" + "@typescript-eslint/eslint-plugin" "5.36.0" + "@typescript-eslint/parser" "5.36.0" + eslint "8.23.0" + eslint-config-prettier "8.5.0" + eslint-plugin-prettier "4.2.1" + eslint-plugin-promise "6.0.1" + eslint-plugin-react "7.31.1" + eslint-plugin-react-hooks "4.6.0" + prettier "2.7.1" + typescript "4.8.2" eslint-config-prettier@4.3.0: version "4.3.0" @@ -7019,21 +7339,21 @@ eslint-config-prettier@4.3.0: dependencies: get-stdin "^6.0.0" -eslint-config-prettier@^8.5.0: +eslint-config-prettier@8.5.0, eslint-config-prettier@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -eslint-loader@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.2.tgz#453542a1230d6ffac90e4e7cb9cadba9d851be68" - integrity sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg== +eslint-loader@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-4.0.2.tgz#386a1e21bcb613b3cf2d252a3b708023ccfb41ec" + integrity sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw== dependencies: - loader-fs-cache "^1.0.0" - loader-utils "^1.0.2" - object-assign "^4.0.1" - object-hash "^1.1.4" - rimraf "^2.6.1" + find-cache-dir "^3.3.1" + fs-extra "^8.1.0" + loader-utils "^2.0.0" + object-hash "^2.0.3" + schema-utils "^2.6.5" eslint-plugin-prettier@3.1.2: version "3.1.2" @@ -7042,17 +7362,17 @@ eslint-plugin-prettier@3.1.2: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-prettier@^4.0.0, eslint-plugin-prettier@^4.2.1: +eslint-plugin-prettier@4.2.1, eslint-plugin-prettier@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-promise@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz#017652c07c9816413a41e11c30adc42c3d55ff18" - integrity sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw== +eslint-plugin-promise@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.1.tgz#a8cddf96a67c4059bdabf4d724a29572188ae423" + integrity sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw== eslint-plugin-react-hooks@2.3.0: version "2.3.0" @@ -7064,11 +7384,16 @@ eslint-plugin-react-hooks@4.0.4: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.4.tgz#aed33b4254a41b045818cacb047b81e6df27fa58" integrity sha512-equAdEIsUETLFNCmmCkiCGq6rkSK5MoJhXFPFYeUebcjKgBmWWcgVOqZyQC8Bv1BwVCnTq9tBxgJFgAJTWoJtA== -eslint-plugin-react-hooks@^4.2.0, eslint-plugin-react-hooks@^4.5.0: +eslint-plugin-react-hooks@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +eslint-plugin-react-hooks@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" + integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== + eslint-plugin-react@7.14.3: version "7.14.3" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13" @@ -7102,10 +7427,30 @@ eslint-plugin-react@7.19.0: string.prototype.matchall "^4.0.2" xregexp "^4.3.0" -eslint-plugin-react@7.30.1, eslint-plugin-react@^7.29.4: - version "7.30.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22" - integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== +eslint-plugin-react@7.31.1: + version "7.31.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz#d29793ed27743f3ed8a473c347b1bf5a0a8fb9af" + integrity sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg== + dependencies: + array-includes "^3.1.5" + array.prototype.flatmap "^1.3.0" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.1" + object.values "^1.1.5" + prop-types "^15.8.1" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.7" + +eslint-plugin-react@7.31.8: + version "7.31.8" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf" + integrity sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw== dependencies: array-includes "^3.1.5" array.prototype.flatmap "^1.3.0" @@ -7129,18 +7474,6 @@ eslint-plugin-vue@5.2.3: dependencies: vue-eslint-parser "^5.0.0" -eslint-plugin-vue@^8.6.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz#f13c53547a0c9d64588a675cc5ecc6ccaf63703f" - integrity sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg== - dependencies: - eslint-utils "^3.0.0" - natural-compare "^1.4.0" - nth-check "^2.0.1" - postcss-selector-parser "^6.0.9" - semver "^7.3.5" - vue-eslint-parser "^8.0.1" - eslint-scope@3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" @@ -7180,6 +7513,13 @@ eslint-utils@^1.3.1: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -7187,7 +7527,7 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== @@ -7244,54 +7584,101 @@ eslint@5.16.0: table "^5.2.3" text-table "^0.2.0" -eslint@5.9.0: - version "5.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.9.0.tgz#b234b6d15ef84b5849c6de2af43195a2d59d408e" - integrity sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w== +eslint@8.23.0: + version "8.23.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040" + integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA== dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.5.3" - chalk "^2.1.0" - cross-spawn "^6.0.5" + "@eslint/eslintrc" "^1.3.1" + "@humanwhocodes/config-array" "^0.10.4" + "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" + "@humanwhocodes/module-importer" "^1.0.1" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + globby "^11.1.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" debug "^4.0.1" - doctrine "^2.1.0" - eslint-scope "^4.0.0" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^4.0.0" - esquery "^1.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^2.0.0" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" + glob-parent "^5.1.2" + globals "^13.6.0" ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.1.0" - is-resolvable "^1.1.0" - js-yaml "^3.12.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.5" + levn "^0.4.1" + lodash.merge "^4.6.2" minimatch "^3.0.4" - mkdirp "^0.5.1" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" + optionator "^0.9.1" progress "^2.0.0" - regexpp "^2.0.1" - require-uncached "^1.0.3" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.0.2" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" text-table "^0.2.0" + v8-compile-cache "^2.0.3" -eslint@^8.13.0, eslint@^8.18.0, eslint@^8.7.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.18.0.tgz#78d565d16c993d0b73968c523c0446b13da784fd" - integrity sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA== +eslint@^8.18.0, eslint@^8.7.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.19.0.tgz#7342a3cbc4fbc5c106a1eefe0fd0b50b6b1a7d28" + integrity sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw== dependencies: "@eslint/eslintrc" "^1.3.0" "@humanwhocodes/config-array" "^0.9.2" @@ -7329,7 +7716,7 @@ eslint@^8.13.0, eslint@^8.18.0, eslint@^8.7.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^4.0.0, espree@^4.1.0: +espree@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== @@ -7347,6 +7734,15 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + espree@^9.0.0, espree@^9.3.2: version "9.3.2" resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" @@ -7356,6 +7752,15 @@ espree@^9.0.0, espree@^9.3.2: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" +espree@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" + integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -7501,6 +7906,17 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" +expect@^29.0.0: + version "29.0.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.0.3.tgz#6be65ddb945202f143c4e07c083f4f39f3bd326f" + integrity sha512-t8l5DTws3212VbmPL+tBFXhjRHLmctHB0oQbL8eUc6S7NzZtYUhycrFO9mkxA0ZUC6FAWdNi7JchJSkODtcu1Q== + dependencies: + "@jest/expect-utils" "^29.0.3" + jest-get-type "^29.0.0" + jest-matcher-utils "^29.0.3" + jest-message-util "^29.0.3" + jest-util "^29.0.3" + expose-loader@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/expose-loader/-/expose-loader-0.7.5.tgz#e29ea2d9aeeed3254a3faa1b35f502db9f9c3f6f" @@ -7621,7 +8037,18 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.2.4, fast-glob@^3.2.9: +fast-glob@^3.2.4: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -7702,14 +8129,6 @@ figures@^3.1.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w== - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - file-entry-cache@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" @@ -7732,6 +8151,11 @@ file-loader@3.0.1: loader-utils "^1.0.2" schema-utils "^1.0.0" +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + file-type@^16.5.0: version "16.5.3" resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz#474b7e88c74724046abb505e9b8ed4db30c4fc06" @@ -7793,15 +8217,6 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A== - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -7872,16 +8287,6 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== - dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -7969,6 +8374,11 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -7998,7 +8408,7 @@ fs-extra@7.0.1, fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.0.1: +fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -8007,7 +8417,7 @@ fs-extra@^8.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: +fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== @@ -8276,6 +8686,13 @@ globals@^13.15.0: dependencies: type-fest "^0.20.2" +globals@^13.6.0, globals@^13.9.0: + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + dependencies: + type-fest "^0.20.2" + globby@^11.0.1, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -8311,11 +8728,16 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -8373,7 +8795,7 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== -har-validator@~5.1.0, har-validator@~5.1.3: +har-validator@~5.1.3: version "5.1.5" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== @@ -8682,16 +9104,6 @@ htmlparser2@^7.0: domutils "^2.8.0" entities "^3.0.1" -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -8973,7 +9385,7 @@ ini@^1.3.2, ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^6.1.0, inquirer@^6.2.2: +inquirer@^6.2.2: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -9009,6 +9421,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + intersection-observer@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.11.0.tgz#f4ea067070326f68393ee161cc0a2ca4c0040c6f" @@ -9344,11 +9761,6 @@ is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-resolvable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -9600,15 +10012,15 @@ jest-diff@^26.0.0, jest-diff@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-diff@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" - integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== +jest-diff@^29.0.3: + version "29.0.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.0.3.tgz#41cc02409ad1458ae1bf7684129a3da2856341ac" + integrity sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg== dependencies: chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.1" + diff-sequences "^29.0.0" + jest-get-type "^29.0.0" + pretty-format "^29.0.3" jest-docblock@^26.0.0: version "26.0.0" @@ -9668,10 +10080,10 @@ jest-get-type@^26.3.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== +jest-get-type@^29.0.0: + version "29.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" + integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== jest-haste-map@^26.6.2: version "26.6.2" @@ -9746,15 +10158,15 @@ jest-matcher-utils@^26.6.2: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-matcher-utils@^28.0.0: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" - integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== +jest-matcher-utils@^29.0.3: + version "29.0.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.0.3.tgz#b8305fd3f9e27cdbc210b21fc7dbba92d4e54560" + integrity sha512-RsR1+cZ6p1hDV4GSCQTg+9qjeotQCgkaleIKLK7dm+U4V/H2bWedU3RAtLm8+mANzZ7eDV33dMar4pejd7047w== dependencies: chalk "^4.0.0" - jest-diff "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.1" + jest-diff "^29.0.3" + jest-get-type "^29.0.0" + pretty-format "^29.0.3" jest-message-util@^25.5.0: version "25.5.0" @@ -9785,6 +10197,21 @@ jest-message-util@^26.6.2: slash "^3.0.0" stack-utils "^2.0.2" +jest-message-util@^29.0.3: + version "29.0.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.0.3.tgz#f0254e1ffad21890c78355726202cc91d0a40ea8" + integrity sha512-7T8JiUTtDfppojosORAflABfLsLKMLkBHSWkjNQrjIltGoDzNGn7wEPOSfjqYAGTYME65esQzMJxGDjuLBKdOg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.0.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.0.3" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^25.1.0, jest-mock@^25.5.0: version "25.5.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a" @@ -9945,6 +10372,18 @@ jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" +jest-util@^29.0.3: + version "29.0.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.0.3.tgz#06d1d77f9a1bea380f121897d78695902959fbc0" + integrity sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ== + dependencies: + "@jest/types" "^29.0.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" @@ -10013,7 +10452,7 @@ js-levenshtein@^1.1.3: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@^3.13.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -10096,6 +10535,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -10402,14 +10846,6 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -loader-fs-cache@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9" - integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA== - dependencies: - find-cache-dir "^0.1.1" - mkdirp "^0.5.1" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -10552,12 +10988,17 @@ lodash.set@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + lodash.unionwith@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.unionwith/-/lodash.unionwith-4.6.0.tgz#74d140b5ca8146e6c643c3724f5152538d9ac1f0" integrity sha512-Hk8otPCkVM4UxRoft3E5dAREwExyXci6iVPCibHIEiG7neb9KAdWHYS75MYpVTvxDrnpp7WCJNZ84vAk7j7tVA== -lodash@4, lodash@^4.14.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0: +lodash@4, lodash@^4.14.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10609,11 +11050,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lottie-web@^5.1.3: - version "5.9.5" - resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.9.5.tgz#9c822064e641f3b2d01644636ed8bdbb876147d3" - integrity sha512-4GI1jC2+YV9DyTXEz4HnAuaoOMT6yBs9KxG50rsmM7eRjUhyBpbETSVuzHAkamfP+nyNuQ84jhQxDnfjBrJdQg== - lowdb@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" @@ -10657,10 +11093,10 @@ lunr@^2.3.6: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== -luxon@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.4.0.tgz#9435806545bb32d4234dab766ab8a3d54847a765" - integrity sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA== +luxon@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.0.4.tgz#d179e4e9f05e092241e7044f64aaa54796b03929" + integrity sha512-aV48rGUwP/Vydn8HT+5cdr26YYQiUZ42NM6ToMoaGKwYfWbfLeRkEu1wXWMHBZT6+KyLfcbbtVcoQFCbbPjKlw== make-cancellable-promise@^1.0.0: version "1.1.0" @@ -11041,7 +11477,7 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: +minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -11056,7 +11492,7 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" -minizlib@^1.2.1: +minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== @@ -11458,7 +11894,7 @@ mjml@^4.10.2: mjml-preset-core "4.12.0" mjml-validator "4.12.0" -mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1, mkdirp@~0.5.x: +mkdirp@0.x.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1, mkdirp@~0.5.x: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -11540,9 +11976,9 @@ msgpack5@^4.0.2: readable-stream "^2.3.6" safe-buffer "^5.1.2" -"mui-bottom-sheet@https://github.com/cozy/mui-bottom-sheet.git#v1.0.6": - version "1.0.6" - resolved "https://github.com/cozy/mui-bottom-sheet.git#494c40416ecde95732c864f9b921e7e545075aa5" +"mui-bottom-sheet@https://github.com/cozy/mui-bottom-sheet.git#v1.0.9": + version "1.0.8" + resolved "https://github.com/cozy/mui-bottom-sheet.git#3dc4c2a245ab39079bc2f73546bccf80847be14c" dependencies: "@juggle/resize-observer" "^3.1.3" jest-environment-jsdom-sixteen "^1.0.3" @@ -11671,11 +12107,6 @@ node-ensure@^0.0.0: resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== -node-fetch@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== - node-fetch@2.6.7, node-fetch@^2.0.0, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -11922,10 +12353,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^1.1.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" - integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-hash@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== object-hash@^3.0.0: version "3.0.0" @@ -12500,7 +12931,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -12565,13 +12996,6 @@ pkg-conf@^1.1.2: object-assign "^4.0.1" symbol "^0.2.1" -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg== - dependencies: - find-up "^1.0.0" - pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -12603,11 +13027,6 @@ pkginfo@0.x.x: resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" @@ -12711,7 +13130,7 @@ postcss-prefix-selector@^1.6.0: resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404" integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q== -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.9: +postcss-selector-parser@^6.0.0: version "6.0.10" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== @@ -12947,7 +13366,7 @@ prettier@1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== -prettier@^2.5.1, prettier@^2.6.2, prettier@^2.7.1: +prettier@2.7.1, prettier@^2.5.1, prettier@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== @@ -12978,13 +13397,12 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^28.0.0, pretty-format@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" - integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== +pretty-format@^29.0.0, pretty-format@^29.0.3: + version "29.0.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.0.3.tgz#23d5f8cabc9cbf209a77d49409d093d61166a811" + integrity sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q== dependencies: - "@jest/schemas" "^28.0.2" - ansi-regex "^5.0.1" + "@jest/schemas" "^29.0.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -13113,7 +13531,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -psl@^1.1.24, psl@^1.1.28, psl@^1.1.33: +psl@^1.1.28, psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -13386,14 +13804,6 @@ react-lifecycles-compat@^3.0.0: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-lottie@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/react-lottie/-/react-lottie-1.2.3.tgz#8544b96939e088658072eea5e12d912cdaa3acc1" - integrity sha512-qLCERxUr8M+4mm1LU0Ruxw5Y5Fn/OmYkGfnA+JDM/dZb3oKwVAJCjwnjkj9TMHtzR2U6sMEUD3ZZ1RaHagM7kA== - dependencies: - babel-runtime "^6.26.0" - lottie-web "^5.1.3" - react-markdown@^4.0.8, react-markdown@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.3.1.tgz#39f0633b94a027445b86c9811142d05381300f2f" @@ -13871,7 +14281,7 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.2.0: +regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -13981,32 +14391,6 @@ request-promise@^4.2.6: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -14038,6 +14422,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -14053,14 +14442,6 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg== -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w== - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -14080,11 +14461,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg== - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -14169,14 +14545,14 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@2.6.3, rimraf@~2.6.2: +rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" -rimraf@2.x.x, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2.x.x, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -14267,7 +14643,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -14418,7 +14794,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: +semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -14853,6 +15229,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + sshpk@^1.7.0: version "1.17.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" @@ -14906,7 +15289,7 @@ stack-utils@^1.0.1: dependencies: escape-string-regexp "^2.0.0" -stack-utils@^2.0.2: +stack-utils@^2.0.2, stack-utils@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== @@ -15051,7 +15434,7 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15413,7 +15796,7 @@ symbol@^0.2.1: resolved "https://registry.yarnpkg.com/symbol/-/symbol-0.2.3.tgz#3b9873b8a901e47c6efe21526a3ac372ef28bbc7" integrity sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA== -table@^5.0.2, table@^5.2.3: +table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== @@ -15423,23 +15806,34 @@ table@^5.0.2, table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" +table@^6.0.9: + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@4.4.13: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== +tar@^4.4.13: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" tar@^6.0.2, tar@^6.1.11: version "6.1.11" @@ -15682,14 +16076,6 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -15830,11 +16216,21 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.0.0, typescript@^4.3.5, typescript@^4.5.2, typescript@^4.5.4, typescript@^4.6.3: +typescript@4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.2.tgz#e3b33d5ccfb5914e4eeab6699cf208adee3fd790" + integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw== + +typescript@^4.0.0, typescript@^4.5.4: version "4.7.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typescript@^4.3.5, typescript@^4.5.2: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + uglify-js@3.4.x: version "3.4.10" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" @@ -16381,10 +16777,10 @@ web-resource-inliner@^5.0.0: node-fetch "^2.6.0" valid-data-url "^3.0.0" -webextension-polyfill@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.9.0.tgz#de6c1941d0ef1b0858b20e9c7b46bbc042c5a960" - integrity sha512-LTtHb0yR49xa9irkstDxba4GATDAcDw3ncnFH9RImoFwDlW47U95ME5sn5IiQX2ghfaECaf6xyXM8yvClIBkkw== +webextension-polyfill@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz#ccb28101c910ba8cf955f7e6a263e662d744dbb8" + integrity sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g== webidl-conversions@^3.0.0: version "3.0.1" @@ -16630,11 +17026,21 @@ winston@2.x: isstream "0.1.x" stack-trace "0.0.x" +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -16703,13 +17109,6 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA== - dependencies: - mkdirp "^0.5.1" - ws@^6.0.0, ws@^6.2.1: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -16727,6 +17126,19 @@ x-is-string@^0.1.0: resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" integrity sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w== +xlsx@^0.18.5: + version "0.18.5" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0" + integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ== + dependencies: + adler-32 "~1.3.0" + cfb "~1.2.1" + codepage "~1.15.0" + crc-32 "~1.2.1" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -16774,7 +17186,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==