diff --git a/.env.template b/.env.template index 130341b4bd..2483115899 100644 --- a/.env.template +++ b/.env.template @@ -1,6 +1,9 @@ # A trailing slash is required -DEV_HOST = "<>" -ALPHA_HOST = "<>" -PROD_HOST = "<>" -PLAUSIBLE_HOST = "<>" -PLAUSIBLE_DOMAIN = "<>" \ No newline at end of file +DEV_URL = "http://localhost:3000/" +ALPHA_URL = "https://titan.dev.eclair.ec-lyon.fr/" +PROD_URL = "https://myecl.fr/" +DEV_HOST = "http://localhost:8000/" +ALPHA_HOST = "https://hyperion.dev.eclair.ec-lyon.fr/" +PROD_HOST = "https://hyperion.myecl.fr/" +#PLAUSIBLE_HOST = "" +#PLAUSIBLE_DOMAIN = "" \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..ec354d578d --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ +### Subject of the issue + +Describe your issue here. + +### Your environment + +- Version of Hyperion +- Operating system + +### Steps to reproduce + +Tell us how to reproduce this issue. Please provide a working demo. + +### Expected behaviour + +Tell us what should happen + +### Actual behaviour + +Tell us what happens instead diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..239d17d7d7 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,73 @@ +# Description + +## Summary + + + +... + + + +## Issues/PR dependencies + + + +### Issues to be resolved + + + + +### Required PRs + + + + +## Changes Made + + + +- [x] ... +- [ ] ... + +## Additional Notes + + + + +
+ + +# Classification + + + +## Type of Change + +- [ ] 🐛 Bug fix (non-breaking change which fixes an issue) +- [ ] ✨ New feature (non-breaking change which adds functionality) +- [ ] 🔨 Refactor (non-breaking change that neither fixes a bug nor adds a feature) +- [ ] 🔧 Infra CI/CD (changes to configs of workflows) +- [ ] 💥 BREAKING CHANGE (fix or feature that require a new minimal version of the front-end) +- [ ] 😶‍🌫️ No impact for the end-users + +## Impact & Scope + +- [ ] Core functionality changes +- [ ] Single module changes +- [ ] Multiple modules changes +- [ ] Other: ... + +## Testing + +- [ ] 1. Tested this locally +- [ ] 2. Added/modified tests that pass the CI (or tested in a downstream fork) +- [ ] 3. Tested in a local client using a pre-prod backend +- [ ] 0. Untestable (exceptionally), will be tested in prod directly + +## Documentation + +- [ ] Updated [the docs](docs.myecl.fr) accordingly : +- [ ] `//` Comments +- [ ] No documentation needed + +
diff --git a/.github/PULL_REQUEST_TEMPLATE/Titan_PR_Template.md b/.github/PULL_REQUEST_TEMPLATE/Titan_PR_Template.md deleted file mode 100644 index 4f9c85a464..0000000000 --- a/.github/PULL_REQUEST_TEMPLATE/Titan_PR_Template.md +++ /dev/null @@ -1,16 +0,0 @@ -Goal of this PR : - -Description of the added features : -- [ ] - -Required unmerged PR : -- [ ] - -Images (if the PR changes the front) : - -| Desktop | Mobile | -| ------- | ------ | -| | | - -Other informations : -- diff --git a/.github/dependabot.yaml b/.github/dependabot.yml similarity index 96% rename from .github/dependabot.yaml rename to .github/dependabot.yml index a75470d0d9..6a08eabcc7 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yml @@ -1,16 +1,16 @@ -# Dependabot version updates -# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates - -version: 2 -updates: - # Maintain dependencies for GitHub Actions - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "monthly" - - # Maintain Python dependencies - - package-ecosystem: "pub" - directory: "/" - schedule: - interval: "monthly" +# Dependabot version updates +# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates + +version: 2 +updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + + # Maintain Python dependencies + - package-ecosystem: "pub" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 94fb1be737..4ff728e402 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,6 +47,11 @@ jobs: java-version: "23.x" cache: "gradle" + # Remove ^ to fix flutter version parsing + - name: Fix Flutter Version in Pubspec + run: | + sed -i 's/flutter: ^/flutter: /' pubspec.yaml + - name: Setup Flutter SDK uses: subosito/flutter-action@v2 with: diff --git a/.github/workflows/lintandformat.yml b/.github/workflows/lintandformat.yml index a62f510a16..7e5f4f4112 100644 --- a/.github/workflows/lintandformat.yml +++ b/.github/workflows/lintandformat.yml @@ -14,6 +14,11 @@ jobs: - name: Check out the code uses: actions/checkout@v4 + # Remove ^ to fix flutter version parsing + - name: Fix Flutter Version in Pubspec + run: | + sed -i 's/flutter: ^/flutter: /' pubspec.yaml + - uses: subosito/flutter-action@v2 with: channel: "stable" diff --git a/.github/workflows/release-mobile.yml b/.github/workflows/release-mobile.yml index 7623f778aa..44d53a3b4e 100644 --- a/.github/workflows/release-mobile.yml +++ b/.github/workflows/release-mobile.yml @@ -58,6 +58,11 @@ jobs: java-version: "23.x" cache: "gradle" + # Remove ^ to fix flutter version parsing + - name: Fix Flutter Version in Pubspec + run: | + sed -i 's/flutter: ^/flutter: /' pubspec.yaml + - name: Setup Flutter SDK uses: subosito/flutter-action@v2 with: @@ -77,7 +82,7 @@ jobs: printf "%s" "$CONFIG" > config.json env: CONFIG: ${{ vars.ALPHA_CONFIG }} - + - name: Configure Alpha config.json if: needs.extract-version.outputs.isAlpha == 'false' run: | diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index d3d3fdd774..946bfa5cb8 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -41,6 +41,11 @@ jobs: - name: Checkout 🛎️ uses: actions/checkout@v4 + # Remove ^ to fix flutter version parsing + - name: Fix Flutter Version in Pubspec + run: | + sed -i 's/flutter: ^/flutter: /' pubspec.yaml + - name: Setup Flutter SDK uses: subosito/flutter-action@v2 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c61edf75b3..2b0ce2403a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,7 @@ name: Test on: pull_request: - types: [opened, edited, ready_for_review, synchronize] + types: [opened, ready_for_review, synchronize] push: branches: - main @@ -17,6 +17,11 @@ jobs: - name: Check out the code uses: actions/checkout@v4 + # Remove ^ to fix flutter version parsing + - name: Fix Flutter Version in Pubspec + run: | + sed -i 's/flutter: ^/flutter: /' pubspec.yaml + - uses: subosito/flutter-action@v2 with: channel: "stable" diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..42bee81154 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dart-code.flutter", "oderwat.indent-rainbow"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index ad92582bd0..660bf06d65 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,16 @@ { - "editor.formatOnSave": true + "editor.tabSize": 2, + "indentRainbow.colors": [ + "rgba(0,0,255,0.15)", + "rgba(0,255,0,0.15)", + "rgba(255,0,0,0.15)", + "rgba(0,255,255,0.15)", + "rgba(255,0,255,0.15)", + "rgba(255,255,0,0.15)" + ], + "[dart]": { + "editor.formatOnSave": true, + "editor.formatOnType": true, + "editor.rulers": [80] + } } diff --git a/Dockerfile b/Dockerfile index e372ba52f0..cbb7592e15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,4 @@ -FROM nginx:1.28.0-alpine +FROM nginx:1.28.0-alpine3.21-slim COPY nginx.conf /etc/nginx/nginx.conf -COPY ./build/web/ /app/html \ No newline at end of file +COPY ./build/web/ /app/html +RUN find /app/html/ -type f -size +512c -regex '.*\.\(html\|css\|js\|json\|svg\|ttf\|otf\|woff2\|wasm\|mjs\|symbols\|yaml\|env\)' -exec gzip -k9 {} + \ No newline at end of file diff --git a/LICENSE b/LICENSE.md similarity index 100% rename from LICENSE rename to LICENSE.md diff --git a/README.md b/README.md index ba1c3887be..bee8dccf78 100644 --- a/README.md +++ b/README.md @@ -3,28 +3,213 @@ Titan is a cross platform frontend written in Flutter for an open-source project launched by ÉCLAIR, the computer science association of Ecole Centrale de Lyon. This project aims to provide students of business and engineering schools a digital tool to simplify the association process. Our builds of Titan are called MyECL and can be downloaded from the App Store and from the Google Play Store. +Titan is designed to be launched on Web, Android and iOS platforms. -## Setup environment +## 0. Prerequisites -Install Flutter: -https://docs.flutter.dev/get-started/install +- Git +- VS Code -Setup VS Code for Flutter development: -https://docs.flutter.dev/get-started/editor?tab=vscode +
+On Linux... -Titan is designed to be launched on Web, Android and iOS platforms. +Ensure these commmon packages are installed (adapt the command to your distro's package manager): + +```bash +sudo apt-get install -y git curl unzip zip xz-utils libglu1-mesa +``` + +
+ +## 1. Setup your Flutter environment + +Choose one way of installing Flutter: + +
+ + +### Using VS Code (recommended, even if you use another text editor) + + + +- Clone Titan +- Open Titan in VS Code +- **Install the recommended official Flutter extension** (id: `dart-code.flutter`) +- After installation, the extension prompts you to install automatically the Flutter SDK. + - Click **"Download SDK"**. + To feel organized, you may choose the folder with all your Git repositories. + - Then click **"Clone Flutter"**. + Wait a couple minutes. + +-
+ On Windows... + + If you get an error saying roughly: + + ``` + because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details. + ``` + + Then in a Powershell, run this to allow scripts executions for your user: + + ```ps1 + Set-ExecutionPolicy Unrestricted -Scope CurrentUser + ``` + +
+ +- After downloading (this takes a few minutes), click **"Add SDK to PATH"** + +
+ +
+ + +### Manually (the old way) + + + +Visit [Set up Flutter for your needs](https://docs.flutter.dev/install/custom), with amounts to visiting these two pages: + +- [Install Flutter manually](https://docs.flutter.dev/install/manual) +- [Flutter editor support](https://docs.flutter.dev/tools/editors) + +You're on your own. + +
+ +### Check your installation: + +- Open a terminal (Ctrl + J) +- Run `flutter doctor`: + +```bash +flutter doctor +``` + +> [!NOTE] +> You do not need to have it all green: having **Flutter** correctly installed, a **browser**, and VS Code **with the extensions** is enough, most people don't need more than that! + +> [!TIP] +> Remember, if you ever have any problem with Flutter, don't hesitate to troubleshoot using: +> +> ```bash +> flutter doctor +> ``` + +- Install Flutter: + https://docs.flutter.dev/get-started/install + +- Setup VS Code for Flutter development: + https://docs.flutter.dev/get-started/editor?tab=vscode + +## 2.Install dependencies + +
+If you already had Flutter installed... + +Upgrade Flutter to the latest stable version: + +```bash +flutter upgrade +``` + +Upgrade Pub, which is the package manager of the Dart language, used by the Flutter framework: + +```bash +flutter pub upgrade +``` + +
+ +Install the dependencies you'll need using Pub (referenced in the [pubspec.yaml](pubspec.yaml) file): + +```bash +flutter pub get +``` + +> [!INFO] +> If you need to remove all modules from your virtual environnement, run: +> +> ```bash +> flutter clean +> ``` + +## 3. Complete the dotenv (`.env`) + +> [!IMPORTANT] +> Copy the [`.env.template`](.env.template) file in a new `.env` file. + +```bash +cp .env.template .env +``` + +You may update [`.env`](.env) to match your Hyperion backends. +If you host a Plausible instance, you may set Plausible's URL to get a few analytics. + +> [!TIP] +> NB: a trailing slash is required at the end of every URL. + +## 4. Launch the client + +> [!WARNING] +> Beforehand, check that the Hyperion instance you want to connect to is up and running. + +The Flutter app needs a host device to run. Below we assume, for development purposes, that you are about to run the **web** version. +NB: a device is a platform that can run the Flutter app; thus a browser does count as a device! + +
+ + +### Using VS Code + + + +1. In the activity bar (the leftmost part), click the "Run and Debug" icon (the play button). +2. Click the green play button. +3. In the terminal, choose your device. + +
+
+ + +### Using the command-line interface + + + +```bash +flutter run --flavor alpha +``` + +More generally you can use: + +```bash +flutter run --flavor [ -d ] +``` + +- Where the flavor can be any of `dev`, `alpha`, or `prod` (whose policy is to only accept the prod client). +- Then in the interactive terminal, choose your device. + Alternatively you can add a flag `-d` to indicate non-interactively your favorite device, for instance: + +```bash +flutter run --flavor alpha -d chrome +flutter run --flavor dev -d web-server +``` + +
-## Configure Titan +### Check the app is running -Update [`.env`](.env) to match your Hyperion's backend: +Check that your Titan instance is up and running by waiting one minute until a browser window opens, or in the `web-server` case, by visiting yourself http://localhost:3000. -`PROD_HOST = "<>` +--- -You can also specify an other host for debuging: +
+ -`DEV_HOST = "<>` +# Beyond initial configuration -NB: a trailing slash is required. + ## Development diff --git a/android/app/build.gradle b/android/app/build.gradle index 84554a9f1a..d66d4e23f5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -74,9 +74,9 @@ def generateMainActivityTask = tasks.register("generateMainActivity") { preBuild.dependsOn(generateMainActivityTask) android { - compileSdkVersion flutter.compileSdkVersion - ndkVersion "27.0.12077973" + ndkVersion "29.0.14206865" namespace "${appIdPrefix}.titan" + compileSdk flutter.compileSdkVersion compileOptions { coreLibraryDesugaringEnabled true @@ -95,7 +95,8 @@ android { defaultConfig { applicationId "${appIdPrefix}.titan" minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion + minSdk flutter.minSdkVersion + targetSdk flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -151,6 +152,6 @@ dependencies { android { defaultConfig { - minSdkVersion flutter.minSdkVersion + minSdk flutter.minSdkVersion } } diff --git a/config/config-template.json b/config/config-template.json index ccb88521fc..a57723e87b 100644 --- a/config/config-template.json +++ b/config/config-template.json @@ -1,5 +1,6 @@ { "flavor": "", + // A trailing slash is required for the TITAN_URL "TITAN_URL": "http://localhost:3000", // A trailing slash is required for the BACKEND_HOST "BACKEND_HOST": "", diff --git a/lib/admin/providers/is_admin_provider.dart b/lib/admin/providers/is_admin_provider.dart index a883e1bd04..177732ee55 100644 --- a/lib/admin/providers/is_admin_provider.dart +++ b/lib/admin/providers/is_admin_provider.dart @@ -1,4 +1,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/loan/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; import 'package:titan/user/providers/user_provider.dart'; final isAdminProvider = StateProvider((ref) { @@ -7,3 +9,7 @@ final isAdminProvider = StateProvider((ref) { .map((e) => e.id) .contains("0a25cb76-4b63-4fd3-b939-da6d9feabf28"); }); + +final isLoanAdminProvider = StateProvider((ref) { + return hasUserPermission(ref, LoanPermissionConstants.manageLoaners); +}); diff --git a/lib/admin/providers/structure_provider.dart b/lib/admin/providers/structure_provider.dart index 1cd9308633..87e798e6c6 100644 --- a/lib/admin/providers/structure_provider.dart +++ b/lib/admin/providers/structure_provider.dart @@ -1,5 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/structure.dart'; +import 'package:titan/mypayment/class/structure.dart'; class StructureNotifier extends StateNotifier { StructureNotifier() : super(Structure.empty()); diff --git a/lib/admin/repositories/group_repository.dart b/lib/admin/repositories/group_repository.dart index 869937d95d..4720e81839 100644 --- a/lib/admin/repositories/group_repository.dart +++ b/lib/admin/repositories/group_repository.dart @@ -4,9 +4,6 @@ import 'package:titan/admin/class/simple_group.dart'; import 'package:titan/auth/providers/openid_provider.dart'; import 'package:titan/tools/repository/repository.dart'; import 'package:titan/user/class/simple_users.dart'; -import 'dart:convert'; -import 'package:http/http.dart' as http; -import 'package:titan/tools/exception.dart'; class GroupRepository extends Repository { @override @@ -44,18 +41,10 @@ class GroupRepository extends Repository { } Future deleteMember(Group group, SimpleUser user) async { - final response = await http.delete( - Uri.parse("${Repository.host}${ext}membership"), - headers: headers, - body: json.encode({"user_id": user.id, "group_id": group.id}), + return await delete( + "membership", + body: {"user_id": user.id, "group_id": group.id}, ); - if (response.statusCode == 204) { - return true; - } else if (response.statusCode == 403) { - throw AppException(ErrorType.tokenExpire, response.body); - } else { - throw AppException(ErrorType.notFound, "Failed to update item"); - } } } diff --git a/lib/admin/router.dart b/lib/admin/router.dart index 95fa2cbafb..36c8074fb5 100644 --- a/lib/admin/router.dart +++ b/lib/admin/router.dart @@ -3,6 +3,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/admin/providers/is_admin_provider.dart'; import 'package:titan/admin/ui/pages/groups/edit_group_page/edit_group_page.dart' deferred as edit_group_page; +import 'package:titan/admin/ui/pages/structure_page/structure_page.dart' + deferred as structure_page; +import 'package:titan/admin/ui/pages/structure_page/add_edit_structure_page/add_edit_structure_page.dart' + deferred as add_edit_structure_page; import 'package:titan/admin/ui/pages/main_page/main_page.dart' deferred as main_page; import 'package:titan/admin/ui/pages/groups/groups_page/groups_page.dart' @@ -11,12 +15,8 @@ import 'package:titan/admin/ui/pages/users_management_page/users_management_page deferred as users_managmement_page; import 'package:titan/admin/ui/pages/group_notifification_page/group_notification_page.dart' deferred as group_notification_page; -import 'package:titan/admin/ui/pages/structure_page/add_edit_structure_page/add_edit_structure_page.dart' - deferred as add_edit_structure_page; import 'package:titan/l10n/app_localizations.dart'; import 'package:titan/navigation/class/module.dart'; -import 'package:titan/admin/ui/pages/structure_page/structure_page.dart' - deferred as structure_page; import 'package:titan/admin/ui/pages/membership/association_membership_page/association_membership_page.dart' deferred as association_membership_page; import 'package:titan/admin/ui/pages/membership/association_membership_detail_page/association_membership_detail_page.dart' @@ -40,6 +40,7 @@ class AdminRouter { static const String groupNotification = '/group_notification'; static const String addGroup = '/add_group'; static const String editGroup = '/edit_group'; + static const String permissions = '/permissions'; static const String associationMemberships = '/association_memberships'; static const String detailAssociationMembership = '/detail_association_membership'; diff --git a/lib/admin/tools/functions.dart b/lib/admin/tools/functions.dart index 4c927c6c6d..882a1fdc80 100644 --- a/lib/admin/tools/functions.dart +++ b/lib/admin/tools/functions.dart @@ -36,3 +36,13 @@ bool _isValidEmail(String email) { ); return emailRegex.hasMatch(email.trim()); } + +String capitalizePermissionName(String permissionName) { + return permissionName + .split('_') + .map( + (word) => + word.isNotEmpty ? word[0].toUpperCase() + word.substring(1) : word, + ) + .join(' '); +} diff --git a/lib/admin/ui/pages/structure_page/add_edit_structure_page/add_edit_structure_page.dart b/lib/admin/ui/pages/structure_page/add_edit_structure_page/add_edit_structure_page.dart index 5ec47ef0e1..6096dae25f 100644 --- a/lib/admin/ui/pages/structure_page/add_edit_structure_page/add_edit_structure_page.dart +++ b/lib/admin/ui/pages/structure_page/add_edit_structure_page/add_edit_structure_page.dart @@ -7,8 +7,8 @@ import 'package:titan/admin/class/association_membership_simple.dart'; import 'package:titan/admin/providers/association_membership_list_provider.dart'; import 'package:titan/admin/providers/structure_manager_provider.dart'; import 'package:titan/admin/providers/structure_provider.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/providers/structure_list_provider.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/providers/structure_list_provider.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; diff --git a/lib/admin/ui/pages/structure_page/structure_page.dart b/lib/admin/ui/pages/structure_page/structure_page.dart index 3f302e0a6e..ea01a1b2a6 100644 --- a/lib/admin/ui/pages/structure_page/structure_page.dart +++ b/lib/admin/ui/pages/structure_page/structure_page.dart @@ -5,10 +5,11 @@ import 'package:titan/admin/admin.dart'; import 'package:titan/admin/router.dart'; import 'package:titan/admin/providers/structure_manager_provider.dart'; import 'package:titan/admin/providers/structure_provider.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/providers/bank_account_holder_provider.dart'; -import 'package:titan/paiement/providers/structure_list_provider.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/providers/bank_account_holder_provider.dart'; +import 'package:titan/mypayment/providers/structure_list_provider.dart'; import 'package:titan/tools/constants.dart'; +import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:titan/tools/ui/styleguide/bottom_modal_template.dart'; import 'package:titan/tools/ui/styleguide/button.dart'; @@ -17,7 +18,6 @@ import 'package:titan/tools/ui/styleguide/list_item.dart'; import 'package:titan/tools/ui/widgets/custom_dialog_box.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/ui/layouts/refresher.dart'; -import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/user/class/simple_users.dart'; import 'package:titan/user/providers/user_list_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; diff --git a/lib/admin/ui/pages/users_management_page/add_user_modal.dart b/lib/admin/ui/pages/users_management_page/add_user_modal.dart index 7f6173bce3..292ae4f002 100644 --- a/lib/admin/ui/pages/users_management_page/add_user_modal.dart +++ b/lib/admin/ui/pages/users_management_page/add_user_modal.dart @@ -10,7 +10,7 @@ import 'package:titan/admin/providers/all_groups_list_provider.dart'; import 'package:titan/admin/providers/user_invitation_provider.dart'; import 'package:titan/admin/tools/functions.dart' as admin_utils; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/ui/pages/main_page/account_card/device_dialog_box.dart'; +import 'package:titan/mypayment/ui/pages/main_page/account_card/device_dialog_box.dart'; import 'package:titan/tools/constants.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; diff --git a/lib/advert/tools/constants.dart b/lib/advert/tools/constants.dart index 43a97337d8..69ae97ed97 100644 --- a/lib/advert/tools/constants.dart +++ b/lib/advert/tools/constants.dart @@ -4,3 +4,8 @@ class AdvertColorConstants { static const Color redGradient1 = Color(0xFF9E131F); static const Color redGradient2 = Color(0xFF590512); } + +class AdvertPermissionConstants { + static const String accessAdvert = 'access_advert'; + static const String manageAdvertisers = 'manage_advertisers'; +} diff --git a/lib/amap/class/cash.dart b/lib/amap/class/cash.dart index 6bfdf9f253..b0d9c3b46d 100644 --- a/lib/amap/class/cash.dart +++ b/lib/amap/class/cash.dart @@ -1,29 +1,42 @@ import 'package:titan/user/class/simple_users.dart'; +import 'package:titan/tools/functions.dart'; class Cash { - Cash({required this.balance, required this.user}); - late final double balance; + Cash({ + required this.balance, + required this.user, + required this.lastOrderDate, + }); + late final int balance; late final SimpleUser user; + late final DateTime lastOrderDate; Cash.fromJson(Map json) { balance = json['balance']; user = SimpleUser.fromJson(json['user']); + lastOrderDate = processDateFromAPI(json['last_order_date']); } Map toJson() { final data = {}; data['balance'] = balance; + data['last_order_date'] = processDateToAPI(lastOrderDate); return data; } - Cash copyWith({SimpleUser? user, double? balance}) { - return Cash(user: user ?? this.user, balance: balance ?? this.balance); + Cash copyWith({SimpleUser? user, int? balance, DateTime? lastOrderDate}) { + return Cash( + user: user ?? this.user, + balance: balance ?? this.balance, + lastOrderDate: lastOrderDate ?? this.lastOrderDate, + ); } - static Cash empty() => Cash(user: SimpleUser.empty(), balance: 0); + static Cash empty() => + Cash(user: SimpleUser.empty(), balance: 0, lastOrderDate: DateTime.now()); @override String toString() { - return 'Cash{balance: $balance, user: $user}'; + return 'Cash{balance: $balance, user: $user, lastOrderDate: $lastOrderDate}'; } } diff --git a/lib/amap/class/delivery.dart b/lib/amap/class/delivery.dart index d823f5a514..dde1f6df51 100644 --- a/lib/amap/class/delivery.dart +++ b/lib/amap/class/delivery.dart @@ -6,12 +6,14 @@ enum DeliveryStatus { creation, available, locked, delivered } class Delivery { Delivery({ + required this.name, required this.deliveryDate, required this.products, required this.id, required this.status, this.expanded = false, }); + late final String name; late final bool expanded; late final DeliveryStatus status; late final DateTime deliveryDate; @@ -19,6 +21,7 @@ class Delivery { late final String id; Delivery.fromJson(Map json) { + name = json['name']; deliveryDate = processDateFromAPIWithoutHour(json['delivery_date']); products = List.from( json['products'].map((x) => Product.fromJson(x)), @@ -30,6 +33,7 @@ class Delivery { Map toJson() { final data = {}; + data['name'] = name; data['delivery_date'] = processDateToAPIWithoutHour(deliveryDate); data['products_ids'] = products.map((e) => e.id).toList(); data['status'] = deliveryStatusToString(status); @@ -38,6 +42,7 @@ class Delivery { } Delivery copyWith({ + String? name, DateTime? deliveryDate, List? products, bool? expanded, @@ -45,6 +50,7 @@ class Delivery { DeliveryStatus? status, }) { return Delivery( + name: name ?? this.name, deliveryDate: deliveryDate ?? this.deliveryDate, products: products ?? this.products, expanded: expanded ?? this.expanded, @@ -54,6 +60,7 @@ class Delivery { } static Delivery empty() => Delivery( + name: '', deliveryDate: DateTime.now(), products: [], expanded: false, @@ -63,6 +70,6 @@ class Delivery { @override String toString() { - return 'Delivery{deliveryDate: $deliveryDate, products: $products, id: $id, status: $status, expanded: $expanded}'; + return 'Delivery{name: $name, deliveryDate: $deliveryDate, products: $products, id: $id, status: $status, expanded: $expanded}'; } } diff --git a/lib/amap/class/order.dart b/lib/amap/class/order.dart index 42e7dd9007..8606946249 100644 --- a/lib/amap/class/order.dart +++ b/lib/amap/class/order.dart @@ -8,6 +8,7 @@ enum CollectionSlot { midDay, evening } class Order { Order({ required this.id, + required this.deliveryName, required this.deliveryId, required this.orderingDate, required this.deliveryDate, @@ -23,17 +24,19 @@ class Order { late final SimpleUser user; late final CollectionSlot collectionSlot; late final String id; + late final String deliveryName; late final DateTime orderingDate; late final DateTime deliveryDate; late final String deliveryId; late final List productsDetail; late final bool expanded; late final List products; - late final double amount, lastAmount; + late final int amount, lastAmount; late final List productsQuantity; Order.fromJson(Map json) { id = json['order_id']; + deliveryName = json['delivery_name']; deliveryId = json['delivery_id']; amount = json['amount']; lastAmount = amount; @@ -56,6 +59,7 @@ class Order { Map toJson() { final data = {}; data['order_id'] = id; + data['delivery_name'] = deliveryName; data['delivery_id'] = deliveryId; data['amount'] = amount; data['ordering_date'] = processDateToAPI(orderingDate); @@ -69,18 +73,20 @@ class Order { Order copyWith({ String? id, + String? deliveryName, DateTime? orderingDate, DateTime? deliveryDate, List? products, bool? expanded, String? deliveryId, - double? amount, - double? lastAmount, + int? amount, + int? lastAmount, CollectionSlot? collectionSlot, SimpleUser? user, }) { return Order( id: id ?? this.id, + deliveryName: deliveryName ?? this.deliveryName, orderingDate: orderingDate ?? this.orderingDate, deliveryDate: deliveryDate ?? this.deliveryDate, productsDetail: products != null @@ -102,6 +108,7 @@ class Order { static Order empty() { return Order( id: '', + deliveryName: '', orderingDate: DateTime.now(), deliveryDate: DateTime.now(), productsDetail: [], @@ -118,6 +125,6 @@ class Order { @override String toString() { - return 'Order{id: $id, orderingDate: $orderingDate, deliveryDate: $deliveryDate, productsDetail: $productsDetail, productsQuantity: $productsQuantity, deliveryId: $deliveryId, products: $products, amount: $amount, lastAmount: $lastAmount, collectionSlot: $collectionSlot, user: $user, expanded: $expanded}'; + return 'Order{id: $id, deliveryName: $deliveryName, orderingDate: $orderingDate, deliveryDate: $deliveryDate, productsDetail: $productsDetail, productsQuantity: $productsQuantity, deliveryId: $deliveryId, products: $products, amount: $amount, lastAmount: $lastAmount, collectionSlot: $collectionSlot, user: $user, expanded: $expanded}'; } } diff --git a/lib/amap/class/product.dart b/lib/amap/class/product.dart index c72bdcebea..39f3cf2f51 100644 --- a/lib/amap/class/product.dart +++ b/lib/amap/class/product.dart @@ -8,7 +8,7 @@ class Product { }); late final String id; late final String name; - late final double price; + late final int price; late final int quantity; late final String category; @@ -31,7 +31,7 @@ class Product { Product copyWith({ String? id, String? name, - double? price, + int? price, int? quantity, String? category, }) => Product( diff --git a/lib/amap/providers/cash_list_provider.dart b/lib/amap/providers/cash_list_provider.dart index 821028df80..f36094375f 100644 --- a/lib/amap/providers/cash_list_provider.dart +++ b/lib/amap/providers/cash_list_provider.dart @@ -18,7 +18,7 @@ class CashListProvider extends ListNotifier { return await add(cashRepository.createCash, cash); } - Future updateCash(Cash addedCash, double previousCashAmount) async { + Future updateCash(Cash addedCash, int previousCashAmount) async { return await update( cashRepository.updateCash, (cashList, c) => cashList diff --git a/lib/amap/providers/is_amap_admin_provider.dart b/lib/amap/providers/is_amap_admin_provider.dart index dbfaab9153..199184f937 100644 --- a/lib/amap/providers/is_amap_admin_provider.dart +++ b/lib/amap/providers/is_amap_admin_provider.dart @@ -1,9 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/amap/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; -final isAmapAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("70db65ee-d533-4f6b-9ffa-a4d70a17b7ef"); // admin_amap +final isAmapAdminProvider = Provider((ref) { + return hasUserPermission(ref, AMAPPermissionConstants.manageAMAP); }); diff --git a/lib/amap/providers/user_amount_provider.dart b/lib/amap/providers/user_amount_provider.dart index 1e244dce5b..70d456b5d7 100644 --- a/lib/amap/providers/user_amount_provider.dart +++ b/lib/amap/providers/user_amount_provider.dart @@ -14,7 +14,7 @@ class UserCashNotifier extends SingleNotifier { return await load(() async => amapUserRepository.getCashByUser(userId)); } - Future updateCash(double amount) async { + Future updateCash(int amount) async { state.when( data: (cash) { final newCash = cash.copyWith(balance: cash.balance + amount); diff --git a/lib/amap/tools/constants.dart b/lib/amap/tools/constants.dart index 65fc60d714..d0d6c9a4c8 100644 --- a/lib/amap/tools/constants.dart +++ b/lib/amap/tools/constants.dart @@ -20,3 +20,8 @@ class AMAPColorConstants extends ColorConstants { static const Color redGradient1 = Color(0xFF9E131F); static const Color redGradient2 = Color(0xFF590512); } + +class AMAPPermissionConstants { + static const String manageAMAP = 'manage_amap'; + static const String accessAMAP = 'access_amap'; +} diff --git a/lib/amap/ui/components/order_ui.dart b/lib/amap/ui/components/order_ui.dart index ca26eac62d..b9e5f8bee4 100644 --- a/lib/amap/ui/components/order_ui.dart +++ b/lib/amap/ui/components/order_ui.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:intl/intl.dart'; +import 'package:intl/intl.dart' as intl; import 'package:titan/amap/class/order.dart'; import 'package:titan/amap/providers/user_amount_provider.dart'; import 'package:titan/amap/providers/user_order_list_provider.dart'; @@ -39,10 +39,25 @@ class OrderUI extends HookConsumerWidget { displayToast(context, type, msg); } + final style = TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: AMAPColorConstants.textDark, + ); + + final tp = TextPainter( + text: TextSpan(text: order.deliveryName, style: style), + textDirection: TextDirection.ltr, + maxLines: isDetail ? 3 : 2, + ); + final maxTextWidth = isDetail ? 180.0 : 150.0; + tp.layout(maxWidth: maxTextWidth); + final lines = tp.computeLineMetrics().length; + return CardLayout( id: order.id, - width: 195, - height: isDetail ? 100 : 150, + width: 214, + height: isDetail ? 104 + 26.0 * lines : 144 + 26.0 * lines, colors: const [ AMAPColorConstants.lightGradient1, AMAPColorConstants.greenGradient1, @@ -55,14 +70,33 @@ class OrderUI extends HookConsumerWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - '${AppLocalizations.of(context)!.amapThe} ${DateFormat.yMd(locale).format(order.deliveryDate)}', - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: AMAPColorConstants.textDark, - ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: BoxConstraints(maxWidth: maxTextWidth), + child: Text( + order.deliveryName, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: AMAPColorConstants.textDark, + ), + maxLines: isDetail ? 3 : 2, + ), + ), + Text( + '${AppLocalizations.of(context)!.amapThe} ${intl.DateFormat.yMd(locale).format(order.deliveryDate)}', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: AMAPColorConstants.textDark, + ), + ), + ], ), + if (!isDetail) GestureDetector( onTap: () { @@ -90,7 +124,7 @@ class OrderUI extends HookConsumerWidget { ), const Spacer(), Text( - "${order.amount.toStringAsFixed(2)}€", + "${(order.amount / 100).toStringAsFixed(2)}€", style: const TextStyle( fontSize: 17, fontWeight: FontWeight.w700, diff --git a/lib/amap/ui/components/product_ui.dart b/lib/amap/ui/components/product_ui.dart index 68d2901568..a80a04b09f 100644 --- a/lib/amap/ui/components/product_ui.dart +++ b/lib/amap/ui/components/product_ui.dart @@ -60,7 +60,7 @@ class ProductCard extends StatelessWidget { ), const SizedBox(height: 4), AutoSizeText( - '${product.price.toStringAsFixed(2)} €', + '${(product.price / 100).toStringAsFixed(2)} €', maxLines: 1, minFontSize: 10, overflow: TextOverflow.ellipsis, diff --git a/lib/amap/ui/pages/admin_page/account_handler.dart b/lib/amap/ui/pages/admin_page/account_handler.dart index 3a4b9dff46..f3a084b4f4 100644 --- a/lib/amap/ui/pages/admin_page/account_handler.dart +++ b/lib/amap/ui/pages/admin_page/account_handler.dart @@ -49,7 +49,7 @@ class AccountHandler extends HookConsumerWidget { editingController: editingController, ), HorizontalListView( - height: 135, + height: 145, children: [ const SizedBox(width: 15), GestureDetector( @@ -69,7 +69,7 @@ class AccountHandler extends HookConsumerWidget { } }, child: CardLayout( - height: 100, + height: 110, width: 100, colors: const [ AMAPColorConstants.green1, diff --git a/lib/amap/ui/pages/admin_page/adding_user_card.dart b/lib/amap/ui/pages/admin_page/adding_user_card.dart index ae703a1a7a..ec5d137568 100644 --- a/lib/amap/ui/pages/admin_page/adding_user_card.dart +++ b/lib/amap/ui/pages/admin_page/adding_user_card.dart @@ -16,7 +16,9 @@ class AddingUserCard extends HookConsumerWidget { final cashNotifier = ref.watch(cashListProvider.notifier); return GestureDetector( onTap: () { - cashNotifier.addCash(Cash(balance: 0, user: user)); + cashNotifier.addCash( + Cash(balance: 0, user: user, lastOrderDate: DateTime.now()), + ); onAdd(); }, child: Container( diff --git a/lib/amap/ui/pages/admin_page/cash_container.dart b/lib/amap/ui/pages/admin_page/cash_container.dart index ddbc8290f8..cd1d2f89b1 100644 --- a/lib/amap/ui/pages/admin_page/cash_container.dart +++ b/lib/amap/ui/pages/admin_page/cash_container.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/amap/providers/cash_list_provider.dart'; @@ -13,8 +14,12 @@ class CashContainer extends HookConsumerWidget { final cash = ref.watch(cashListProvider); return AsyncChild( value: cash, - builder: (context, cash) => - Row(children: cash.map((e) => UserCashUi(cash: e)).toList()), + builder: (context, cash) => Row( + children: cash + .sorted((a, b) => b.lastOrderDate.isAfter(a.lastOrderDate) ? 1 : -1) + .map((e) => UserCashUi(cash: e)) + .toList(), + ), loaderColor: AMAPColorConstants.greenGradient2, ); } diff --git a/lib/amap/ui/pages/admin_page/delivery_handler.dart b/lib/amap/ui/pages/admin_page/delivery_handler.dart index 60be021992..27d7835128 100644 --- a/lib/amap/ui/pages/admin_page/delivery_handler.dart +++ b/lib/amap/ui/pages/admin_page/delivery_handler.dart @@ -32,7 +32,7 @@ class DeliveryHandler extends HookConsumerWidget { ), const SizedBox(height: 10), HorizontalListView( - height: 200, + height: 233, children: [ const SizedBox(width: 15, height: 195), GestureDetector( diff --git a/lib/amap/ui/pages/admin_page/delivery_ui.dart b/lib/amap/ui/pages/admin_page/delivery_ui.dart index 38f0da2991..e78a9a240c 100644 --- a/lib/amap/ui/pages/admin_page/delivery_ui.dart +++ b/lib/amap/ui/pages/admin_page/delivery_ui.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:intl/intl.dart'; +import 'package:intl/intl.dart' as intl; import 'package:titan/amap/class/delivery.dart'; import 'package:titan/amap/providers/delivery_id_provider.dart'; import 'package:titan/amap/providers/delivery_list_provider.dart'; @@ -48,9 +48,24 @@ class DeliveryUi extends HookConsumerWidget { displayToast(context, type, msg); } + final style = TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: AMAPColorConstants.textDark, + ); + + final tp = TextPainter( + text: TextSpan(text: delivery.name, style: style), + textDirection: TextDirection.ltr, + maxLines: 3, + ); + final maxTextWidth = 200.0; + tp.layout(maxWidth: maxTextWidth); + final lines = tp.computeLineMetrics().length; + return CardLayout( id: delivery.id, - height: 160, + height: 155 + 26.0 * (lines), width: 280, shadowColor: AMAPColorConstants.textDark.withValues(alpha: 0.2), padding: const EdgeInsets.all(10), @@ -69,13 +84,31 @@ class DeliveryUi extends HookConsumerWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - '${AppLocalizations.of(context)!.amapThe} ${DateFormat.yMd(locale).format(delivery.deliveryDate)}', - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: AMAPColorConstants.textDark, - ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: BoxConstraints(maxWidth: maxTextWidth), + child: Text( + delivery.name, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: AMAPColorConstants.textDark, + ), + maxLines: 3, + ), + ), + Text( + '${AppLocalizations.of(context)!.amapThe} ${intl.DateFormat.yMd(locale).format(delivery.deliveryDate)}', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: AMAPColorConstants.textDark, + ), + ), + ], ), GestureDetector( onTap: () { diff --git a/lib/amap/ui/pages/admin_page/user_cash_ui.dart b/lib/amap/ui/pages/admin_page/user_cash_ui.dart index 0f7f7a48e6..3aab6e6642 100644 --- a/lib/amap/ui/pages/admin_page/user_cash_ui.dart +++ b/lib/amap/ui/pages/admin_page/user_cash_ui.dart @@ -101,7 +101,7 @@ class UserCashUi extends HookConsumerWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AutoSizeText( - '${cash.balance.toStringAsFixed(2)} €', + '${(cash.balance / 100).toStringAsFixed(2)} €', maxLines: 1, minFontSize: 10, overflow: TextOverflow.ellipsis, @@ -163,9 +163,16 @@ class UserCashUi extends HookConsumerWidget { .read(cashListProvider.notifier) .updateCash( cash.copyWith( - balance: double.parse( - amount.text.replaceAll(',', '.'), - ), + balance: + (100 * + double.parse( + amount.text + .replaceAll( + ',', + '.', + ), + )) + .round(), ), cash.balance, ) diff --git a/lib/amap/ui/pages/admin_page/user_cash_ui_layout.dart b/lib/amap/ui/pages/admin_page/user_cash_ui_layout.dart index 96cfb08258..7d75e6384e 100644 --- a/lib/amap/ui/pages/admin_page/user_cash_ui_layout.dart +++ b/lib/amap/ui/pages/admin_page/user_cash_ui_layout.dart @@ -10,7 +10,7 @@ class UserCashUiLayout extends StatelessWidget { Widget build(BuildContext context) { return CardLayout( width: 150, - height: 100, + height: 110, colors: const [AMAPColorConstants.green1, AMAPColorConstants.textLight], shadowColor: AMAPColorConstants.textDark.withValues(alpha: 0.2), padding: const EdgeInsets.symmetric(horizontal: 17.0, vertical: 5), diff --git a/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart b/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart index 8c8a08ef01..21f824cde9 100644 --- a/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart +++ b/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart @@ -19,6 +19,7 @@ import 'package:titan/tools/ui/widgets/align_left_text.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:titan/tools/ui/widgets/date_entry.dart'; import 'package:titan/tools/ui/builders/waiting_button.dart'; +import 'package:titan/tools/ui/widgets/text_entry.dart'; import 'package:qlevar_router/qlevar_router.dart'; import 'package:titan/l10n/app_localizations.dart'; @@ -34,15 +35,19 @@ class AddEditDeliveryPage extends HookConsumerWidget { final dateController = useTextEditingController( text: isEdit ? DateFormat.yMd(locale).format(delivery.deliveryDate) : '', ); + final nameController = useTextEditingController(); final productList = ref.watch(productListProvider); final sortedProductsList = ref.watch(sortedByCategoryProductsProvider); final selected = ref.watch(selectedListProvider); final selectedNotifier = ref.watch(selectedListProvider.notifier); + final deliveryNotifier = ref.watch(deliveryListProvider.notifier); void displayToastWithContext(TypeMsg type, String msg) { displayToast(context, type, msg); } + final localizeWithContext = AppLocalizations.of(context)!; + return AmapTemplate( child: SingleChildScrollView( physics: const BouncingScrollPhysics(), @@ -62,6 +67,14 @@ class AddEditDeliveryPage extends HookConsumerWidget { AppLocalizations.of(context)!.amapAddDelivery, color: AMAPColorConstants.green2, ), + const SizedBox(height: 20), + TextEntry( + label: AppLocalizations.of(context)!.amapCommandName, + controller: nameController, + color: AMAPColorConstants.greenGradient2, + enabledColor: AMAPColorConstants.enabled, + ), + Container( margin: const EdgeInsets.symmetric(vertical: 30), child: DateEntry( @@ -97,7 +110,12 @@ class AddEditDeliveryPage extends HookConsumerWidget { style: const TextStyle( fontSize: 20, fontWeight: FontWeight.w800, - color: Colors.black, + color: Color.fromARGB( + 0, + 255, + 0, + 0, + ), ), ), ), @@ -135,6 +153,7 @@ class AddEditDeliveryPage extends HookConsumerWidget { if (formKey.currentState!.validate()) { final date = dateController.value.text; final del = Delivery( + name: nameController.text, id: isEdit ? delivery.id : '', products: products .where( @@ -148,22 +167,6 @@ class AddEditDeliveryPage extends HookConsumerWidget { status: DeliveryStatus.creation, ); await tokenExpireWrapper(ref, () async { - final deliveryNotifier = ref.watch( - deliveryListProvider.notifier, - ); - final editedCommandMsg = AppLocalizations.of( - context, - )!.amapEditedCommand; - final addedCommandMsg = AppLocalizations.of( - context, - )!.amapAddedCommand; - final editingErrorMsg = AppLocalizations.of( - context, - )!.amapEditingError; - final alreadyExistCommandMsg = - AppLocalizations.of( - context, - )!.amapAlreadyExistCommand; final value = isEdit ? await deliveryNotifier.updateDelivery( del, @@ -174,7 +177,7 @@ class AddEditDeliveryPage extends HookConsumerWidget { if (isEdit) { displayToastWithContext( TypeMsg.msg, - editedCommandMsg, + localizeWithContext.amapEditedCommand, ); } else { final deliveryOrdersNotifier = ref.watch( @@ -190,19 +193,19 @@ class AddEditDeliveryPage extends HookConsumerWidget { }); displayToastWithContext( TypeMsg.msg, - addedCommandMsg, + localizeWithContext.amapAddedCommand, ); } } else { if (isEdit) { displayToastWithContext( TypeMsg.error, - editingErrorMsg, + localizeWithContext.amapEditingError, ); } else { displayToastWithContext( TypeMsg.error, - alreadyExistCommandMsg, + localizeWithContext.amapAddingError, ); } } @@ -211,7 +214,7 @@ class AddEditDeliveryPage extends HookConsumerWidget { displayToast( context, TypeMsg.error, - AppLocalizations.of(context)!.amapAddingError, + localizeWithContext.amapIncorrectlyFilledForm, ); } }, diff --git a/lib/amap/ui/pages/delivery_pages/product_ui_check.dart b/lib/amap/ui/pages/delivery_pages/product_ui_check.dart index 73719a1ab1..036704793b 100644 --- a/lib/amap/ui/pages/delivery_pages/product_ui_check.dart +++ b/lib/amap/ui/pages/delivery_pages/product_ui_check.dart @@ -36,7 +36,7 @@ class ProductUi extends ConsumerWidget { width: 50, alignment: Alignment.centerRight, child: Text( - "${product.price.toStringAsFixed(2)}€", + "${(product.price / 100).toStringAsFixed(2)}€", style: const TextStyle(fontSize: 13), ), ), @@ -44,7 +44,7 @@ class ProductUi extends ConsumerWidget { Checkbox( value: isModification, checkColor: AMAPColorConstants.background, - activeColor: AMAPColorConstants.green2, + activeColor: const Color.fromARGB(223, 121, 164, 0), onChanged: (value) { onclick(); }, diff --git a/lib/amap/ui/pages/detail_delivery_page/detail_page.dart b/lib/amap/ui/pages/detail_delivery_page/detail_page.dart index 6aef738a04..7a6c8b380d 100644 --- a/lib/amap/ui/pages/detail_delivery_page/detail_page.dart +++ b/lib/amap/ui/pages/detail_delivery_page/detail_page.dart @@ -49,6 +49,13 @@ class DetailDeliveryPage extends HookConsumerWidget { padding: const EdgeInsets.all(30), child: Column( children: [ + Text( + delivery.name, + style: const TextStyle( + fontSize: 30, + fontWeight: FontWeight.bold, + ), + ), Text( "${AppLocalizations.of(context)!.amapDeliveryDate} : ${DateFormat.yMd(locale).format(delivery.deliveryDate)}", style: const TextStyle( diff --git a/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart b/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart index 0c8065e7f5..730a6e4d54 100644 --- a/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart +++ b/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart @@ -41,7 +41,7 @@ class DetailOrderUI extends HookConsumerWidget { return CardLayout( width: 250, - height: 145 + (20.0 * order.products.length), + height: 139 + (24.0 * order.products.length), colors: const [ AMAPColorConstants.lightGradient1, AMAPColorConstants.greenGradient1, @@ -83,7 +83,7 @@ class DetailOrderUI extends HookConsumerWidget { SizedBox( width: 90, child: Text( - "${product.quantity} (${(product.quantity * product.price).toStringAsFixed(2)}€)", + "${product.quantity} (${((product.quantity * product.price) / 100).toStringAsFixed(2)}€)", textAlign: TextAlign.right, style: const TextStyle( fontSize: 17, @@ -115,7 +115,7 @@ class DetailOrderUI extends HookConsumerWidget { ), const Spacer(), Text( - "${order.amount.toStringAsFixed(2)}€", + "${(order.amount / 100).toStringAsFixed(2)}€", style: const TextStyle( fontSize: 17, fontWeight: FontWeight.w700, @@ -128,7 +128,7 @@ class DetailOrderUI extends HookConsumerWidget { Row( children: [ Text( - "${AppLocalizations.of(context)!.amapAmount} : ${userCash.balance.toStringAsFixed(2)}€", + "${AppLocalizations.of(context)!.amapAmount} : ${(userCash.balance / 100).toStringAsFixed(2)}€", style: const TextStyle( fontSize: 17, fontWeight: FontWeight.w700, diff --git a/lib/amap/ui/pages/detail_delivery_page/product_detail_ui.dart b/lib/amap/ui/pages/detail_delivery_page/product_detail_ui.dart index 6376a197b3..1bde478c0b 100644 --- a/lib/amap/ui/pages/detail_delivery_page/product_detail_ui.dart +++ b/lib/amap/ui/pages/detail_delivery_page/product_detail_ui.dart @@ -18,7 +18,7 @@ class ProductDetailCard extends StatelessWidget { Widget build(BuildContext context) { return CardLayout( width: 130, - height: 100, + height: 104, colors: const [ AMAPColorConstants.lightGradient1, AMAPColorConstants.lightGradient2, @@ -53,7 +53,7 @@ class ProductDetailCard extends StatelessWidget { ), const SizedBox(height: 4), AutoSizeText( - '${(product.price * quantity).toStringAsFixed(2)} €', + '${((product.price * quantity) / 100).toStringAsFixed(2)} €', maxLines: 1, minFontSize: 10, overflow: TextOverflow.ellipsis, diff --git a/lib/amap/ui/pages/detail_page/detail_page.dart b/lib/amap/ui/pages/detail_page/detail_page.dart index 3e204b7226..c8d8fe1947 100644 --- a/lib/amap/ui/pages/detail_page/detail_page.dart +++ b/lib/amap/ui/pages/detail_page/detail_page.dart @@ -38,7 +38,7 @@ class DetailPage extends HookConsumerWidget { ), child: Column( children: [ - const SizedBox(height: 50), + const SizedBox(height: 110), AlignLeftText( padding: const EdgeInsets.symmetric(horizontal: 20), AppLocalizations.of(context)!.amapProducts, diff --git a/lib/amap/ui/pages/list_products_page/product_choice_button.dart b/lib/amap/ui/pages/list_products_page/product_choice_button.dart index 07fd6634da..54c17aeb59 100644 --- a/lib/amap/ui/pages/list_products_page/product_choice_button.dart +++ b/lib/amap/ui/pages/list_products_page/product_choice_button.dart @@ -118,7 +118,7 @@ class ProductChoiceButton extends HookConsumerWidget { } }, child: Text( - "${AppLocalizations.of(context)!.amapConfirm} (${order.amount.toStringAsFixed(2)}€)", + "${AppLocalizations.of(context)!.amapConfirm} (${(order.amount / 100).toStringAsFixed(2)}€)", style: TextStyle( fontSize: 20, fontWeight: FontWeight.w700, diff --git a/lib/amap/ui/pages/list_products_page/product_ui_list.dart b/lib/amap/ui/pages/list_products_page/product_ui_list.dart index 20da57a609..c3ac4888fc 100644 --- a/lib/amap/ui/pages/list_products_page/product_ui_list.dart +++ b/lib/amap/ui/pages/list_products_page/product_ui_list.dart @@ -40,7 +40,7 @@ class ProductUiInList extends ConsumerWidget { Container( alignment: Alignment.centerRight, child: Text( - "${p.price.toStringAsFixed(2)}€", + "${(p.price / 100).toStringAsFixed(2)}€", style: const TextStyle(fontSize: 15), ), ), diff --git a/lib/amap/ui/pages/main_page/delivery_ui.dart b/lib/amap/ui/pages/main_page/delivery_ui.dart index 903e3eb26a..58e3d6a3f2 100644 --- a/lib/amap/ui/pages/main_page/delivery_ui.dart +++ b/lib/amap/ui/pages/main_page/delivery_ui.dart @@ -27,7 +27,7 @@ class DeliveryUi extends HookConsumerWidget { child: Container( margin: const EdgeInsets.symmetric(vertical: 10.0), padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 8), - height: 50, + height: 70, width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(20), @@ -56,15 +56,38 @@ class DeliveryUi extends HookConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(width: 10), - Text( - '${AppLocalizations.of(context)!.amapThe} ${DateFormat.yMd(locale).format(delivery.deliveryDate)}', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: (selected && showSelected) - ? Colors.white - : AMAPColorConstants.textDark, - ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ConstrainedBox( + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context).size.width - 200, + ), + child: Text( + delivery.name, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: (selected && showSelected) + ? Colors.white + : AMAPColorConstants.textDark, + ), + ), + ), + Text( + '${AppLocalizations.of(context)!.amapThe} ${DateFormat.yMd(locale).format(delivery.deliveryDate)}', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: (selected && showSelected) + ? Colors.white + : AMAPColorConstants.textDark, + ), + ), + ], ), const Spacer(), Text( diff --git a/lib/amap/ui/pages/main_page/main_page.dart b/lib/amap/ui/pages/main_page/main_page.dart index 3f38eb0bee..b1130ba195 100644 --- a/lib/amap/ui/pages/main_page/main_page.dart +++ b/lib/amap/ui/pages/main_page/main_page.dart @@ -85,7 +85,7 @@ class AmapMainPage extends HookConsumerWidget { child: AsyncChild( value: balance, builder: (context, s) => Text( - "${AppLocalizations.of(context)!.amapAmount} : ${s.balance.toStringAsFixed(2)}€", + "${AppLocalizations.of(context)!.amapAmount} : ${(s.balance / 100).toStringAsFixed(2)}€", style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold, @@ -150,7 +150,11 @@ class AmapMainPage extends HookConsumerWidget { animation: animation, child: Container( width: double.infinity, - height: MediaQuery.of(context).size.height - 150, + height: + 350.0 + 90 * availableDeliveriesIds.length > + MediaQuery.of(context).size.height - 150 + ? 350.0 + 90 * availableDeliveriesIds.length + : MediaQuery.of(context).size.height - 150, decoration: BoxDecoration( gradient: const RadialGradient( colors: [ diff --git a/lib/amap/ui/pages/main_page/orders_section.dart b/lib/amap/ui/pages/main_page/orders_section.dart index f59c684f73..2258a57d2d 100644 --- a/lib/amap/ui/pages/main_page/orders_section.dart +++ b/lib/amap/ui/pages/main_page/orders_section.dart @@ -46,7 +46,7 @@ class OrderSection extends HookConsumerWidget { ), const SizedBox(height: 10), HorizontalListView( - height: 195, + height: 196, children: [ const SizedBox(width: 15), GestureDetector( diff --git a/lib/amap/ui/pages/product_pages/add_edit_product.dart b/lib/amap/ui/pages/product_pages/add_edit_product.dart index 5c716ce56c..254f2e999e 100644 --- a/lib/amap/ui/pages/product_pages/add_edit_product.dart +++ b/lib/amap/ui/pages/product_pages/add_edit_product.dart @@ -31,7 +31,9 @@ class AddEditProduct extends HookConsumerWidget { final categories = ref.watch(categoryListProvider); final nameController = useTextEditingController(text: product.name); final priceController = useTextEditingController( - text: isEdit ? product.price.toStringAsFixed(2).replaceAll('.', ',') : "", + text: isEdit + ? (product.price / 100).toStringAsFixed(2).replaceAll('.', ',') + : "", ); final beginState = isEdit ? product.category @@ -180,9 +182,15 @@ class AddEditProduct extends HookConsumerWidget { Product newProduct = Product( id: isEdit ? product.id : "", name: nameController.text, - price: double.parse( - priceController.text.replaceAll(',', '.'), - ), + price: + (100 * + double.parse( + priceController.text.replaceAll( + ',', + '.', + ), + )) + .round(), category: cate, quantity: 0, ); diff --git a/lib/auth/providers/openid_provider.dart b/lib/auth/providers/openid_provider.dart index d0c3bcf3c8..d57b76932e 100644 --- a/lib/auth/providers/openid_provider.dart +++ b/lib/auth/providers/openid_provider.dart @@ -119,7 +119,7 @@ class OpenIdTokenProvider final String tokenKey = "token"; final String refreshTokenKey = "refresh_token"; final String redirectURLScheme = "${getTitanPackageName()}://authorized"; - final String redirectURL = "${getTitanURL()}/static.html"; + final String redirectURL = "${getTitanURL()}static.html"; final AuthorizationServiceConfiguration authorizationServiceConfiguration = AuthorizationServiceConfiguration( authorizationEndpoint: "${Repository.host}auth/authorize", diff --git a/lib/booking/providers/is_admin_provider.dart b/lib/booking/providers/is_admin_provider.dart index 4cd58e778d..03bed8687b 100644 --- a/lib/booking/providers/is_admin_provider.dart +++ b/lib/booking/providers/is_admin_provider.dart @@ -1,9 +1,28 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/booking/providers/user_manager_list_provider.dart'; +import 'package:titan/booking/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; -final isAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("0a25cb76-4b63-4fd3-b939-da6d9feabf28"); +final isManagersAdminProvider = Provider((ref) { + return hasUserPermission(ref, BookingPermissionConstants.manageManagers); +}); + +final isRoomsAdminProvider = Provider((ref) { + return hasUserPermission(ref, BookingPermissionConstants.manageRooms); +}); + +final isBookingAdminProvider = Provider((ref) { + final isManagersAdmin = ref.watch(isManagersAdminProvider); + final isRoomsAdmin = ref.watch(isRoomsAdminProvider); + return isManagersAdmin || isRoomsAdmin; +}); + +final isManagerProvider = StateProvider((ref) { + final managers = ref.watch(userManagerListProvider); + final managersName = managers.when( + data: (managers) => managers.map((e) => e.name).toList(), + loading: () => [], + error: (error, stackTrace) => [], + ); + return managersName.isNotEmpty; }); diff --git a/lib/booking/providers/is_manager_provider.dart b/lib/booking/providers/is_manager_provider.dart deleted file mode 100644 index 58342860e6..0000000000 --- a/lib/booking/providers/is_manager_provider.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/booking/providers/user_manager_list_provider.dart'; - -final isManagerProvider = StateProvider((ref) { - final managers = ref.watch(userManagerListProvider); - final managersName = managers.when( - data: (managers) => managers.map((e) => e.name).toList(), - loading: () => [], - error: (error, stackTrace) => [], - ); - return managersName.isNotEmpty; -}); diff --git a/lib/booking/router.dart b/lib/booking/router.dart index 7821bb328b..76dd9fddc0 100644 --- a/lib/booking/router.dart +++ b/lib/booking/router.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/booking/providers/is_admin_provider.dart'; -import 'package:titan/booking/providers/is_manager_provider.dart'; import 'package:titan/booking/ui/pages/admin_pages/add_edit_manager_page.dart' deferred as add_edit_manager_page; import 'package:titan/booking/ui/pages/detail_pages/detail_booking.dart' @@ -56,7 +55,7 @@ class BookingRouter { path: admin, builder: () => admin_page.AdminPage(), middleware: [ - AdminMiddleware(ref, isAdminProvider), + AdminMiddleware(ref, isBookingAdminProvider), DeferredLoadingMiddleware(admin_page.loadLibrary), ], children: [ @@ -64,7 +63,7 @@ class BookingRouter { path: room, builder: () => add_edit_room_page.AddEditRoomPage(), middleware: [ - AdminMiddleware(ref, isAdminProvider), + AdminMiddleware(ref, isRoomsAdminProvider), DeferredLoadingMiddleware(add_edit_room_page.loadLibrary), ], ), @@ -72,7 +71,7 @@ class BookingRouter { path: manager, builder: () => add_edit_manager_page.AddEditManagerPage(), middleware: [ - AdminMiddleware(ref, isAdminProvider), + AdminMiddleware(ref, isManagersAdminProvider), DeferredLoadingMiddleware(add_edit_manager_page.loadLibrary), ], ), diff --git a/lib/booking/tools/constants.dart b/lib/booking/tools/constants.dart index d34e7df9f4..0607ac0ccb 100644 --- a/lib/booking/tools/constants.dart +++ b/lib/booking/tools/constants.dart @@ -9,3 +9,9 @@ final weekDaysOrdered = [ WeekDays.saturday, WeekDays.sunday, ]; + +class BookingPermissionConstants { + static const String accessBooking = 'access_booking'; + static const String manageManagers = 'manage_managers'; + static const String manageRooms = 'manage_rooms'; +} diff --git a/lib/booking/ui/calendar/appointment_data_source.dart b/lib/booking/ui/calendar/appointment_data_source.dart index db9c918741..d04312f4e6 100644 --- a/lib/booking/ui/calendar/appointment_data_source.dart +++ b/lib/booking/ui/calendar/appointment_data_source.dart @@ -16,7 +16,10 @@ class AppointmentDataSource extends CalendarDataSource { DateTime getEndTime(int index) => appointments![index].end; @override - Color getColor(int index) => generateColor(appointments![index].room.name); + Color getColor(int index) => + generateColor(appointments![index].room.name).withValues( + alpha: appointments![index].decision == Decision.pending ? 0.3 : 1.0, + ); @override String getSubject(int index) { diff --git a/lib/booking/ui/calendar/calendar.dart b/lib/booking/ui/calendar/calendar.dart index ee15f535c5..9f11f4f40f 100644 --- a/lib/booking/ui/calendar/calendar.dart +++ b/lib/booking/ui/calendar/calendar.dart @@ -1,14 +1,24 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:qlevar_router/qlevar_router.dart'; import 'package:titan/booking/class/booking.dart'; +import 'package:titan/booking/providers/booking_provider.dart'; import 'package:titan/booking/providers/confirmed_booking_list_provider.dart'; +import 'package:titan/booking/providers/manager_booking_list_provider.dart'; import 'package:titan/booking/providers/manager_confirmed_booking_list_provider.dart'; +import 'package:titan/booking/providers/selected_days_provider.dart'; +import 'package:titan/booking/providers/user_booking_list_provider.dart'; +import 'package:titan/booking/router.dart'; import 'package:titan/booking/ui/calendar/appointment_data_source.dart'; import 'package:titan/booking/ui/calendar/calendar_dialog.dart'; +import 'package:titan/l10n/app_localizations.dart'; import 'package:titan/navigation/providers/is_web_format_provider.dart'; import 'package:titan/tools/constants.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; +import 'package:titan/tools/functions.dart'; +import 'package:titan/tools/token_expire_wrapper.dart'; +import 'package:titan/tools/ui/widgets/custom_dialog_box.dart'; class Calendar extends HookConsumerWidget { final bool isManagerPage; @@ -17,20 +27,113 @@ class Calendar extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final bookings = isManagerPage - ? ref.watch(managerConfirmedBookingListProvider) + ? ref.watch(managerBookingListProvider) : ref.watch(confirmedBookingListProvider); + final bookingNotifier = ref.watch(bookingProvider.notifier); + final selectedDaysNotifier = ref.watch(selectedDaysProvider.notifier); + final bookingListNotifier = ref.watch(managerBookingListProvider.notifier); + final confirmedBookingListNotifier = ref.watch( + confirmedBookingListProvider.notifier, + ); final isWebFormat = ref.watch(isWebFormatProvider); + final managerConfirmedBookingListNotifier = ref.watch( + managerConfirmedBookingListProvider.notifier, + ); final CalendarController calendarController = CalendarController(); + void handleBooking(Booking booking) { + bookingNotifier.setBooking(booking); + final recurrentDays = SfCalendar.parseRRule( + booking.recurrenceRule, + booking.start, + ).weekDays; + selectedDaysNotifier.setSelectedDays(recurrentDays); + QR.to(BookingRouter.root + BookingRouter.manager + BookingRouter.addEdit); + } + + final localizeWithContext = AppLocalizations.of(context)!; + void calendarTapped(CalendarTapDetails details, BuildContext context) { if (details.targetElement == CalendarElement.appointment || details.targetElement == CalendarElement.agenda) { final Booking booking = details.appointments![0]; showDialog( context: context, - builder: (context) => isManagerPage - ? CalendarDialog(booking: booking, isManager: true) - : CalendarDialog(booking: booking, isManager: false), + builder: (context) => CalendarDialog( + booking: booking, + isManager: isManagerPage, + onEdit: () { + handleBooking(booking); + }, + onCopy: () { + handleBooking(booking.copyWith(id: "")); + }, + onConfirm: () async { + await showDialog( + context: context, + builder: (context) { + return CustomDialogBox( + title: localizeWithContext.bookingConfirm, + descriptions: localizeWithContext.bookingConfirmBooking, + onYes: () async { + await tokenExpireWrapper(ref, () async { + Booking newBooking = booking.copyWith( + decision: Decision.approved, + ); + bookingListNotifier + .toggleConfirmed(newBooking, Decision.approved) + .then((value) { + if (value) { + ref + .read(userBookingListProvider.notifier) + .loadUserBookings(); + confirmedBookingListNotifier.addBooking( + newBooking, + ); + managerConfirmedBookingListNotifier.addBooking( + newBooking, + ); + } + }); + }); + }, + ); + }, + ); + }, + onDecline: () async { + await showDialog( + context: context, + builder: (context) { + return CustomDialogBox( + title: localizeWithContext.bookingDecline, + descriptions: localizeWithContext.bookingDeclineBooking, + onYes: () async { + await tokenExpireWrapper(ref, () async { + Booking newBooking = booking.copyWith( + decision: Decision.declined, + ); + bookingListNotifier + .toggleConfirmed(newBooking, Decision.declined) + .then((value) { + if (value) { + ref + .read(userBookingListProvider.notifier) + .loadUserBookings(); + confirmedBookingListNotifier.deleteBooking( + newBooking, + ); + managerConfirmedBookingListNotifier + .deleteBooking(newBooking); + } + }); + }); + }, + ); + }, + ); + }, + ), ); } } @@ -43,7 +146,16 @@ class Calendar extends HookConsumerWidget { children: [ SfCalendar( onTap: (details) => calendarTapped(details, context), - dataSource: AppointmentDataSource(res), + dataSource: AppointmentDataSource( + !isManagerPage + ? res + : res + .where( + (booking) => + booking.decision != Decision.declined, + ) + .toList(), + ), controller: calendarController, view: CalendarView.week, selectionDecoration: BoxDecoration( diff --git a/lib/booking/ui/calendar/calendar_dialog.dart b/lib/booking/ui/calendar/calendar_dialog.dart index 819e8576f1..f07d22000e 100644 --- a/lib/booking/ui/calendar/calendar_dialog.dart +++ b/lib/booking/ui/calendar/calendar_dialog.dart @@ -4,20 +4,36 @@ import 'package:titan/booking/class/booking.dart'; import 'package:titan/booking/ui/calendar/calendar_dialog_button.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/l10n/app_localizations.dart'; +import 'package:titan/tools/ui/layouts/card_button.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; class CalendarDialog extends StatelessWidget { final Booking booking; + final Function()? onEdit, onConfirm, onDecline, onCopy; final bool isManager; const CalendarDialog({ super.key, required this.booking, - required this.isManager, + this.onEdit, + this.onConfirm, + this.onDecline, + this.onCopy, + this.isManager = false, }); @override Widget build(BuildContext context) { final locale = Localizations.localeOf(context); + final isNotEnded = booking.recurrenceRule.isNotEmpty + ? SfCalendar.parseRRule( + booking.recurrenceRule, + booking.start, + ).endDate!.isAfter(DateTime.now()) + : booking.end.isAfter(DateTime.now()); + final showButton = + (isNotEnded && booking.decision == Decision.pending) || isManager; + return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), child: Stack( @@ -116,6 +132,57 @@ class CalendarDialog extends StatelessWidget { ), ], ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (showButton) + GestureDetector( + onTap: onEdit, + child: CardButton( + color: Colors.white, + shadowColor: Colors.grey.withValues(alpha: 0.2), + child: HeroIcon( + HeroIcons.pencil, + color: Colors.black, + ), + ), + ), + if (showButton) const Spacer(), + GestureDetector( + onTap: onCopy, + child: CardButton( + color: Colors.white, + shadowColor: Colors.grey.withValues(alpha: 0.2), + child: HeroIcon( + HeroIcons.documentDuplicate, + color: Colors.black, + ), + ), + ), + const Spacer(), + GestureDetector( + onTap: onConfirm, + child: CardButton( + color: Colors.white, + shadowColor: Colors.grey.withValues(alpha: 0.2), + child: HeroIcon(HeroIcons.check, color: Colors.black), + ), + ), + const Spacer(), + GestureDetector( + onTap: onDecline, + child: CardButton( + color: Colors.black, + shadowColor: Colors.black.withValues(alpha: 0.2), + child: const HeroIcon( + HeroIcons.xMark, + color: Colors.white, + ), + ), + ), + ], + ), ], ], ), diff --git a/lib/booking/ui/pages/admin_pages/admin_page.dart b/lib/booking/ui/pages/admin_pages/admin_page.dart index 3cba6f3e47..f73b05eca0 100644 --- a/lib/booking/ui/pages/admin_pages/admin_page.dart +++ b/lib/booking/ui/pages/admin_pages/admin_page.dart @@ -5,6 +5,7 @@ import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/admin/providers/group_id_provider.dart'; import 'package:titan/booking/class/manager.dart'; +import 'package:titan/booking/providers/is_admin_provider.dart'; import 'package:titan/service/class/room.dart'; import 'package:titan/booking/providers/confirmed_booking_list_provider.dart'; import 'package:titan/booking/providers/manager_list_provider.dart'; @@ -28,6 +29,8 @@ class AdminPage extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { const double minCalendarHeight = 400; const double sumOfHeightOfOthersWidgets = 282; + final isRoomsAdmin = ref.watch(isRoomsAdminProvider); + final isManagersAdmin = ref.watch(isManagersAdminProvider); final roomList = ref.watch(roomListProvider); final roomNotifier = ref.watch(roomProvider.notifier); final managerNotifier = ref.watch(managerProvider.notifier); @@ -53,146 +56,150 @@ class AdminPage extends HookConsumerWidget { children: [ const SizedBox(height: 20), const Expanded(child: Calendar(isManagerPage: false)), - const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 30.0), - child: Align( - alignment: Alignment.centerLeft, - child: Text( - AppLocalizations.of(context)!.bookingRoom, - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: Color.fromARGB(255, 149, 149, 149), + if (isRoomsAdmin) ...[ + const SizedBox(height: 30), + Padding( + padding: EdgeInsets.symmetric(horizontal: 30.0), + child: Align( + alignment: Alignment.centerLeft, + child: Text( + AppLocalizations.of(context)!.bookingRoom, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Color.fromARGB(255, 149, 149, 149), + ), ), ), ), - ), - const SizedBox(height: 20), - roomList.when( - data: (List data) => SingleChildScrollView( - scrollDirection: Axis.horizontal, - physics: const BouncingScrollPhysics(), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - const SizedBox(width: 15), - ItemChip( - onTap: () { - roomNotifier.setRoom(Room.empty()); - managerIdNotifier.setId(""); - QR.to( - BookingRouter.root + - BookingRouter.admin + - BookingRouter.room, - ); - }, - child: const HeroIcon( - HeroIcons.plus, - color: Colors.black, - ), - ), - ...data.map( - (e) => ItemChip( + const SizedBox(height: 20), + roomList.when( + data: (List data) => SingleChildScrollView( + scrollDirection: Axis.horizontal, + physics: const BouncingScrollPhysics(), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const SizedBox(width: 15), + ItemChip( onTap: () { - roomNotifier.setRoom(e); - managerIdNotifier.setId(e.managerId); + roomNotifier.setRoom(Room.empty()); + managerIdNotifier.setId(""); QR.to( BookingRouter.root + BookingRouter.admin + BookingRouter.room, ); }, - child: Text( - capitalize(e.name), - style: const TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, + child: const HeroIcon( + HeroIcons.plus, + color: Colors.black, + ), + ), + ...data.map( + (e) => ItemChip( + onTap: () { + roomNotifier.setRoom(e); + managerIdNotifier.setId(e.managerId); + QR.to( + BookingRouter.root + + BookingRouter.admin + + BookingRouter.room, + ); + }, + child: Text( + capitalize(e.name), + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), ), ), - ), - const SizedBox(width: 15), - ], + const SizedBox(width: 15), + ], + ), ), + error: (Object error, StackTrace? stackTrace) { + return Center(child: Text('Error $error')); + }, + loading: () { + return const Center(child: CircularProgressIndicator()); + }, ), - error: (Object error, StackTrace? stackTrace) { - return Center(child: Text('Error $error')); - }, - loading: () { - return const Center(child: CircularProgressIndicator()); - }, - ), - const SizedBox(height: 20), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 30.0), - child: Align( - alignment: Alignment.centerLeft, - child: Text( - AppLocalizations.of(context)!.bookingManager, - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold, - color: Color.fromARGB(255, 149, 149, 149), + ], + if (isManagersAdmin) ...[ + const SizedBox(height: 20), + Padding( + padding: EdgeInsets.symmetric(horizontal: 30.0), + child: Align( + alignment: Alignment.centerLeft, + child: Text( + AppLocalizations.of(context)!.bookingManager, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Color.fromARGB(255, 149, 149, 149), + ), ), ), ), - ), - const SizedBox(height: 20), - managerList.when( - data: (List data) => SingleChildScrollView( - scrollDirection: Axis.horizontal, - physics: const BouncingScrollPhysics(), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - const SizedBox(width: 15), - ItemChip( - onTap: () { - managerNotifier.setManager(Manager.empty()); - groupIdNotifier.setId(""); - QR.to( - BookingRouter.root + - BookingRouter.admin + - BookingRouter.manager, - ); - }, - child: const HeroIcon( - HeroIcons.plus, - color: Colors.black, - ), - ), - ...data.map( - (e) => ItemChip( + const SizedBox(height: 20), + managerList.when( + data: (List data) => SingleChildScrollView( + scrollDirection: Axis.horizontal, + physics: const BouncingScrollPhysics(), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const SizedBox(width: 15), + ItemChip( onTap: () { - managerNotifier.setManager(e); - groupIdNotifier.setId(e.groupId); + managerNotifier.setManager(Manager.empty()); + groupIdNotifier.setId(""); QR.to( BookingRouter.root + BookingRouter.admin + BookingRouter.manager, ); }, - child: Text( - e.name, - style: const TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, + child: const HeroIcon( + HeroIcons.plus, + color: Colors.black, + ), + ), + ...data.map( + (e) => ItemChip( + onTap: () { + managerNotifier.setManager(e); + groupIdNotifier.setId(e.groupId); + QR.to( + BookingRouter.root + + BookingRouter.admin + + BookingRouter.manager, + ); + }, + child: Text( + e.name, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + ), ), ), ), - ), - const SizedBox(width: 15), - ], + const SizedBox(width: 15), + ], + ), ), + error: (Object error, StackTrace? stackTrace) { + return Center(child: Text('Error $error')); + }, + loading: () { + return const Center(child: CircularProgressIndicator()); + }, ), - error: (Object error, StackTrace? stackTrace) { - return Center(child: Text('Error $error')); - }, - loading: () { - return const Center(child: CircularProgressIndicator()); - }, - ), + ], const SizedBox(height: 20), ], ), diff --git a/lib/booking/ui/pages/main_page/main_page.dart b/lib/booking/ui/pages/main_page/main_page.dart index 98ae22f341..c0a11202a6 100644 --- a/lib/booking/ui/pages/main_page/main_page.dart +++ b/lib/booking/ui/pages/main_page/main_page.dart @@ -7,7 +7,6 @@ import 'package:titan/booking/class/booking.dart'; import 'package:titan/booking/providers/booking_provider.dart'; import 'package:titan/booking/providers/confirmed_booking_list_provider.dart'; import 'package:titan/booking/providers/is_admin_provider.dart'; -import 'package:titan/booking/providers/is_manager_provider.dart'; import 'package:titan/booking/providers/manager_booking_list_provider.dart'; import 'package:titan/booking/providers/selected_days_provider.dart'; import 'package:titan/booking/providers/user_booking_list_provider.dart'; @@ -35,7 +34,7 @@ class BookingMainPage extends HookConsumerWidget { const double minCalendarHeight = 400; const double sumOfHeightOfOthersWidgets = 361; final isManager = ref.watch(isManagerProvider); - final isAdmin = ref.watch(isAdminProvider); + final isAdmin = ref.watch(isBookingAdminProvider); final bookingsNotifier = ref.watch(userBookingListProvider.notifier); final confirmedBookingsNotifier = ref.watch( confirmedBookingListProvider.notifier, diff --git a/lib/booking/ui/pages/manager_page/list_booking.dart b/lib/booking/ui/pages/manager_page/list_booking.dart index c5a928de3f..e87a0670e2 100644 --- a/lib/booking/ui/pages/manager_page/list_booking.dart +++ b/lib/booking/ui/pages/manager_page/list_booking.dart @@ -192,12 +192,7 @@ class ListBooking extends HookConsumerWidget { ); }, onCopy: () { - bookingNotifier.setBooking(e.copyWith(id: "")); - QR.to( - BookingRouter.root + - BookingRouter.manager + - BookingRouter.addEdit, - ); + handleBooking(e.copyWith(id: "")); }, onDelete: () async {}, ), diff --git a/lib/centralassociation/class/asso.dart b/lib/centralassociation/class/asso.dart new file mode 100644 index 0000000000..275ae2de8a --- /dev/null +++ b/lib/centralassociation/class/asso.dart @@ -0,0 +1,27 @@ +import 'package:titan/centralassociation/class/link.dart'; + +class Asso { + Asso({required this.name, required this.description, required this.icon}); + late final String name; + late final String description; + late final List linkList; + late final String icon; + + Asso.fromJson(Map json) { + name = json["name"]; + description = json["description"]; + icon = json["icon"]; + linkList = List.from(json["links"].map((e) => Link.fromJson(e))); + } + + Asso.empty() { + name = ''; + description = ''; + linkList = []; + } + + @override + String toString() { + return 'Asso{name: $name, description: $description, link_list: $linkList, icon: $icon}'; + } +} diff --git a/lib/centralassociation/class/link.dart b/lib/centralassociation/class/link.dart new file mode 100644 index 0000000000..6fb41b5a88 --- /dev/null +++ b/lib/centralassociation/class/link.dart @@ -0,0 +1,12 @@ +class Link { + Link({required this.name, required this.url, required this.icon}); + late final String name; + late final String url; + late final String icon; + + Link.fromJson(Map l) { + name = l["name"]; + icon = l["icon"]; + url = l["url"]; + } +} diff --git a/lib/centralassociation/providers/centralassociation_asso_provider.dart b/lib/centralassociation/providers/centralassociation_asso_provider.dart new file mode 100644 index 0000000000..829f560c68 --- /dev/null +++ b/lib/centralassociation/providers/centralassociation_asso_provider.dart @@ -0,0 +1,29 @@ +import 'package:titan/centralassociation/class/asso.dart'; +import 'package:titan/centralassociation/class/link.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:titan/centralassociation/repositories/asso_repository.dart'; +import 'package:titan/tools/providers/list_notifier.dart'; +import 'package:titan/tools/token_expire_wrapper.dart'; + +class AssoNotifier extends ListNotifier { + AssoRepository assoRepository = AssoRepository(); + AssoNotifier() : super(const AsyncValue.loading()); + + late List allAssos = []; + late List allLinks = []; + + Future initState() async { + allAssos = await assoRepository.getAssoList(); + allLinks = allAssos.expand((element) => element.linkList).toList(); + state = AsyncValue.data(allAssos); + } +} + +final assoProvider = + StateNotifierProvider>>((ref) { + AssoNotifier notifier = AssoNotifier(); + tokenExpireWrapperAuth(ref, () async { + await notifier.initState(); + }); + return notifier; + }); diff --git a/lib/centralassociation/repositories/asso_repository.dart b/lib/centralassociation/repositories/asso_repository.dart new file mode 100644 index 0000000000..520f4e612b --- /dev/null +++ b/lib/centralassociation/repositories/asso_repository.dart @@ -0,0 +1,39 @@ +import 'package:http/http.dart' as http; +import 'package:titan/tools/logs/logger.dart'; +import 'dart:convert'; +import 'package:titan/centralassociation/class/asso.dart'; + +class AssoRepository { + static const String host = "https://assos.myecl.fr/assos_links.json"; + final Map headers = { + "Content-Type": "application/json; charset=UTF-8", + "Accept": "application/json", + }; + + static final Logger logger = Logger(); + void initLogger() { + logger.init(); + } + + Future> getAssoList() async { + try { + final response = await http.get(Uri.parse(host), headers: headers); + if (response.statusCode == 200) { + try { + final data = jsonDecode(response.body); + final test = data.map((asso) => Asso.fromJson(asso)).toList(); + return test; + } catch (e) { + logger.error("GET $host\nError while decoding response"); + return []; + } + } else { + logger.error("GET $host\n${response.statusCode} ${response.body}"); + return []; + } + } catch (e) { + logger.error("GET $host\nError while fetching response"); + return []; + } + } +} diff --git a/lib/centralassociation/router.dart b/lib/centralassociation/router.dart new file mode 100644 index 0000000000..61c8190f51 --- /dev/null +++ b/lib/centralassociation/router.dart @@ -0,0 +1,31 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:titan/centralassociation/ui/pages/main_page.dart' + deferred as main_page; +import 'package:titan/l10n/app_localizations.dart'; +import 'package:titan/navigation/class/module.dart'; +import 'package:titan/tools/middlewares/authenticated_middleware.dart'; +import 'package:titan/tools/middlewares/deferred_middleware.dart'; +import 'package:qlevar_router/qlevar_router.dart'; + +class CentralassociationRouter { + final Ref ref; + static const String root = '/centralassociation'; + static final Module module = Module( + getName: (context) => + AppLocalizations.of(context)!.moduleCentralassociation, + getDescription: (context) => + AppLocalizations.of(context)!.moduleCentralassociationDescription, + root: CentralassociationRouter.root, + ); + CentralassociationRouter(this.ref); + + QRoute route() => QRoute( + name: "centralassociation", + path: CentralassociationRouter.root, + builder: () => main_page.CentralassociationMainPage(), + middleware: [ + AuthenticatedMiddleware(ref), + DeferredLoadingMiddleware(main_page.loadLibrary), + ], + ); +} diff --git a/lib/centralassociation/tools/constants.dart b/lib/centralassociation/tools/constants.dart new file mode 100644 index 0000000000..d2d3841d12 --- /dev/null +++ b/lib/centralassociation/tools/constants.dart @@ -0,0 +1,8 @@ +class CentralassociationTextConstants { + static const String centralassociation = "Centralassociation"; + static const String close = 'Fermer'; + static const String error = "Erreur"; + static const String imagePath = "https://assos.myecl.fr/assets/svg_icons/"; + static const String openLink = 'Accéder au site'; + static const String unableToOpen = "Impossible d'ouvrir le lien"; +} diff --git a/lib/centralassociation/tools/functions.dart b/lib/centralassociation/tools/functions.dart new file mode 100644 index 0000000000..8f37ad331d --- /dev/null +++ b/lib/centralassociation/tools/functions.dart @@ -0,0 +1,10 @@ +import 'package:titan/centralassociation/tools/constants.dart'; +import 'package:url_launcher/url_launcher.dart'; + +void openLink(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication); + } else { + throw '${CentralassociationTextConstants.unableToOpen} $url'; + } +} diff --git a/lib/centralassociation/ui/centralassociation.dart b/lib/centralassociation/ui/centralassociation.dart new file mode 100644 index 0000000000..0ff86d6ba6 --- /dev/null +++ b/lib/centralassociation/ui/centralassociation.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:titan/tools/ui/widgets/top_bar.dart'; +import 'package:titan/centralassociation/router.dart'; + +class CentralassociationTemplate extends StatelessWidget { + final Widget child; + const CentralassociationTemplate({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + color: Colors.white, + child: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const TopBar(root: CentralassociationRouter.root), + Expanded(child: child), + ], + ), + ), + ), + ); + } +} diff --git a/lib/centralassociation/ui/pages/asso_list.dart b/lib/centralassociation/ui/pages/asso_list.dart new file mode 100644 index 0000000000..b6cdf09172 --- /dev/null +++ b/lib/centralassociation/ui/pages/asso_list.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:titan/centralassociation/class/asso.dart'; +import 'package:titan/centralassociation/ui/pages/link_card.dart'; + +class AssoList extends StatelessWidget { + final Asso asso; + const AssoList({super.key, required this.asso}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 30.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + asso.name, + style: const TextStyle(fontSize: 23, fontWeight: FontWeight.w900), + ), + const SizedBox(height: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: asso.linkList + .map((link) => LinkCard(link: link)) + .toList(), + ), + ], + ), + ); + } +} diff --git a/lib/centralassociation/ui/pages/link_card.dart b/lib/centralassociation/ui/pages/link_card.dart new file mode 100644 index 0000000000..8636240a26 --- /dev/null +++ b/lib/centralassociation/ui/pages/link_card.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/centralassociation/class/link.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:titan/centralassociation/tools/constants.dart'; +import 'package:titan/centralassociation/tools/functions.dart'; + +class LinkCard extends HookConsumerWidget { + final Link link; + const LinkCard({super.key, required this.link}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Container( + margin: const EdgeInsets.symmetric(vertical: 7), + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(20)), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withValues(alpha: 0.3), + blurRadius: 8, + spreadRadius: 2, + offset: const Offset(2, 3), + ), + ], + ), + height: 70, + child: TextButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)), + ), + overlayColor: WidgetStateProperty.all( + const Color.fromARGB(37, 0, 0, 0), + ), + ), + child: Row( + children: [ + Container( + margin: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 3), + width: 45, + height: 45, + child: link.icon.endsWith('.svg') + ? SvgPicture.network( + "${CentralassociationTextConstants.imagePath}${link.icon}", + ) + : Image.network( + "${CentralassociationTextConstants.imagePath}${link.icon}", + ), + ), + const SizedBox(width: 10), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + link.name, + style: const TextStyle(fontSize: 18, color: Colors.black), + ), + ], + ), + ), + ], + ), + onPressed: () { + openLink(link.url); + }, + ), + ); + } +} diff --git a/lib/centralassociation/ui/pages/main_page.dart b/lib/centralassociation/ui/pages/main_page.dart new file mode 100644 index 0000000000..c97c2dc959 --- /dev/null +++ b/lib/centralassociation/ui/pages/main_page.dart @@ -0,0 +1,27 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:flutter/material.dart'; +import 'package:titan/tools/ui/builders/async_child.dart'; +import 'package:titan/centralassociation/ui/centralassociation.dart'; +import 'package:titan/centralassociation/providers/centralassociation_asso_provider.dart'; +import 'package:titan/centralassociation/ui/pages/asso_list.dart'; + +class CentralassociationMainPage extends HookConsumerWidget { + const CentralassociationMainPage({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final assos = ref.watch(assoProvider); + + return CentralassociationTemplate( + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: AsyncChild( + value: assos, + builder: (context, assos) => Column( + children: [...assos.map((asso) => AssoList(asso: asso))], + ), + ), + ), + ); + } +} diff --git a/lib/cinema/providers/is_cinema_admin.dart b/lib/cinema/providers/is_cinema_admin.dart index 0e8f1e5afb..7795cb7c86 100644 --- a/lib/cinema/providers/is_cinema_admin.dart +++ b/lib/cinema/providers/is_cinema_admin.dart @@ -1,9 +1,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/cinema/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; -final isCinemaAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("ce5f36e6-5377-489f-9696-de70e2477300"); // admin_cinema +final isCinemaAdminProvider = Provider((ref) { + return hasUserPermission(ref, CinemaPermissionConstants.manageSessions); }); diff --git a/lib/cinema/tools/constants.dart b/lib/cinema/tools/constants.dart index 2b625d283a..1f69f12c0e 100644 --- a/lib/cinema/tools/constants.dart +++ b/lib/cinema/tools/constants.dart @@ -3,3 +3,8 @@ import 'package:flutter/material.dart'; class CinemaColorConstants { static const Color tmdbColor = Color(0xffe2b616); } + +class CinemaPermissionConstants { + static const String accessCinema = 'access_cinema'; + static const String manageSessions = 'manage_sessions'; +} diff --git a/lib/event/providers/is_admin_provider.dart b/lib/event/providers/is_admin_provider.dart index 393cc60a2b..6fce6207c1 100644 --- a/lib/event/providers/is_admin_provider.dart +++ b/lib/event/providers/is_admin_provider.dart @@ -1,9 +1,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/event/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; -final isEventAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("b0357687-2211-410a-9e2a-144519eeaafa"); // admin_calendar +final isEventAdminProvider = Provider((ref) { + return hasUserPermission(ref, EventPermissionConstants.manageEvents); }); diff --git a/lib/event/tools/constants.dart b/lib/event/tools/constants.dart index 9152f84640..06659a6c3b 100644 --- a/lib/event/tools/constants.dart +++ b/lib/event/tools/constants.dart @@ -7,3 +7,8 @@ const eventDayKeys = [ 'eventDaySat', 'eventDaySun', ]; + +class EventPermissionConstants { + static const String accessEvents = 'access_calendar'; + static const String manageEvents = 'manage_events'; +} diff --git a/lib/feed/providers/is_feed_admin_provider.dart b/lib/feed/providers/is_feed_admin_provider.dart index b8d80b3f24..861351f049 100644 --- a/lib/feed/providers/is_feed_admin_provider.dart +++ b/lib/feed/providers/is_feed_admin_provider.dart @@ -1,9 +1,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/feed/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; final isFeedAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("59e3c4c2-e60f-44b6-b0d2-fa1b248423bb"); // admin_feed + return hasUserPermission(ref, FeedPermissionsConstants.manageFeed); }); diff --git a/lib/feed/tools/constants.dart b/lib/feed/tools/constants.dart new file mode 100644 index 0000000000..33762bf5ca --- /dev/null +++ b/lib/feed/tools/constants.dart @@ -0,0 +1,4 @@ +class FeedPermissionsConstants { + static const String accessFeed = 'access_feed'; + static const String manageFeed = 'manage_feed'; +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a70c0f87cc..e1e6da9aff 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1,106 +1,33 @@ { - "@@locale": "en", - "dateToday": "Today", - "dateYesterday": "Yesterday", - "dateTomorrow": "Tomorrow", - "dateAt": "at", - "dateFrom": "from", - "dateTo": "to", - "dateBetweenDays": "to", - "dateStarting": "Starting", - "dateLast": "Last", - "dateUntil": "Until", - "feedFilterAll": "All", - "feedFilterPending": "Pending", - "feedFilterApproved": "Approved", - "feedFilterRejected": "Rejected", - "feedEmptyAll": "No events available", - "feedEmptyPending": "No events pending approval", - "feedEmptyApproved": "No approved events", - "feedEmptyRejected": "No rejected events", - "feedEventManagement": "Event Management", - "feedTitle": "Title", - "feedLocation": "Location", - "feedSGDate": "SG Date", - "feedSGExternalLink": "SG External link", - "feedCreateEvent": "Create an event", - "feedNotification": "Send a notification", - "feedPleaseSelectAnAssociation": "Please select an association", - "feedReject": "Reject", - "feedApprove": "Approve", - "feedEnded": "Ended", - "feedOngoing": "Ongoing", - "feedFilter": "Filter", - "feedAssociation": "Association", - "feedAssociationEvent": "{name} event", - "@feedAssociationEvent": { - "description": "Association event", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "feedEditEvent": "Edit event", - "feedManageAssociationEvents": "Manage association events", - "feedNews": "Calendar", - "feedNewsType": "News type", - "feedNoAssociationEvents": "No association events", - "feedApply": "Apply", - "feedAdmin": "Administration", - "feedCreateAnEvent": "Create an event", - "feedManageRequests": "Manage requests", - "feedNoNewsAvailable": "No news available", - "feedRefresh": "Refresh", - "feedPleaseProvideASGExternalLink": "Please provide a SG external link", - "feedPleaseProvideASGDate": "Please provide a SG date", - "feedShotgunIn": "Shotgun in {time}", - "@feedShotgunIn": { - "description": "Shotgun in time", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "feedVoteIn": "Vote in {time}", - "@feedVoteIn": { - "description": "Vote in time", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "feedCantOpenLink": "Can't open link", - "feedGetReady": "Get ready!", - "eventActionCampaign": "You can vote", - "eventActionEvent": "You are invited", - "eventActionCampaignSubtitle": "Vote now", - "eventActionEventSubtitle": "Answer the invitation", - "eventActionCampaignButton": "Vote", - "eventActionEventButton": "Reserve", - "eventActionCampaignValidated": "I voted!", - "eventActionEventValidated": "I'm coming!", + "moduleCentralassociation": "Centralassociation", + "moduleCentralassociationDescription": "Aggregator of association links", "adminAccountTypes": "Account types", "adminAdd": "Add", - "adminAddGroup": "Add group", - "adminAddMember": "Add member", + "adminAddAssociation": "Add association", "adminAddedGroup": "Group created", "adminAddedLoaner": "Lender added", "adminAddedMember": "Member added", + "adminAddedSchool": "School created", + "adminAddedStructure": "Structure added", + "adminAddGroup": "Add group", "adminAddingError": "Error while adding", "adminAddingMember": "Adding a member", "adminAddLoaningGroup": "Add loaning group", + "adminAddMember": "Add member", "adminAddSchool": "Add school", "adminAddStructure": "Add structure", - "adminAddedSchool": "School created", - "adminAddedStructure": "Structure added", - "adminEditedStructure": "Structure edited", + "adminAdmin": "Admin", "adminAdministration": "Administration", + "adminAssociationCreated": "Association created", + "adminAssociationCreationError": "Error while creating association", "adminAssociationMembership": "Membership", "adminAssociationMembershipName": "Membership name", + "adminAssociationMembershipsManagement": "Association memberships management", + "adminAssociationName": "Association name", + "adminAssociations": "Associations", "adminAssociationsMemberships": "Memberships", + "adminAssociationUpdated": "Association updated", + "adminAssociationUpdateError": "Error while updating association", "adminBankAccountHolder": "Bank account holder: {bankAccountHolder}", "@adminBankAccountHolder": { "description": "Displays the bank account holder's name", @@ -114,8 +41,12 @@ "adminBankDetails": "Bank details", "adminBic": "BIC", "adminBicError": "BIC must be 11 characters", + "adminChooseAssociationManagerGroup": "Choose a group to manage this association", + "adminChooseGroup": "Choose a group", + "adminChooseGroupManager": "Choose a group to manage this membership", "adminCity": "City", "adminClearFilters": "Clear filters", + "adminContent": "Content", "adminCountry": "Country", "adminCreateAssociationMembership": "Create membership", "adminCreatedAssociationMembership": "Membership created", @@ -127,141 +58,129 @@ "adminDeleteAssociationMemberConfirmation": "Are you sure you want to delete this member?", "adminDeleteAssociationMembership": "Delete membership?", "adminDeletedAssociationMembership": "Membership deleted", - "adminDeleteGroup": "Delete group?", "adminDeletedGroup": "Group deleted", - "adminDeleteSchool": "Delete school?", "adminDeletedSchool": "School deleted", + "adminDeleteGroup": "Delete group?", + "adminDeleteGroupConfirmation": "Are you sure you want to delete this group?", + "adminDeleteSchool": "Delete school?", + "adminDeleteUsers": "Delete users", "adminDeleting": "Deleting", "adminDeletingError": "Error while deleting", "adminDescription": "Description", "adminEdit": "Edit", - "adminEditStructure": "Edit structure", + "adminEditAssociation": "Edit association : {associationName}", + "@adminEditAssociation": { + "description": "Edit association", + "placeholders": { + "associationName": { + "type": "String" + } + } + }, + "adminEditedStructure": "Structure edited", + "adminEditGroup": "Edit group", "adminEditMembership": "Edit membership", - "adminEmptyDate": "Empty date", - "adminEmptyFieldError": "Name cannot be empty", + "adminEditStructure": "Edit structure", "adminEmailFailed": "Unable to send email to the following addresses", "adminEmailRegex": "Email Regex", + "adminEmptyDate": "Empty date", + "adminEmptyFieldError": "Name cannot be empty", "adminEmptyUser": "Empty user", "adminEndDate": "End date", "adminEndDateMaximal": "Maximum end date", "adminEndDateMinimal": "Minimum end date", "adminError": "Error", + "adminFailedToDeleteGroup": "Failed to delete group", + "adminFailedToInviteUsers": "Failed to invite users", + "adminFailedToSendNotification": "Failed to send notification", + "adminFailedToUpdateAssociationLogo": "Failed to update association logo", "adminFilters": "Filters", "adminGroup": "Group", + "adminGroupNotification": "Group notifications", "adminGroups": "Groups", + "adminGroupsManagement": "Groups management", "adminIban": "IBAN", "adminIbanError": "IBAN must be 27 characters", + "adminImportList": "Import a list", + "adminImportUsersDescription": "Import users from a CSV file. The CSV file must contain one email address per line.", + "adminInvite": "Invite", + "adminInvitedUsers": "Invited users", + "adminInviteUsers": "Invite users", + "adminInviteUsersCounter": "{count, plural, zero {No user} one {{count} user} other {{count} users}} in the CSV file", + "@adminInviteUsersCounter": { + "description": "Text with the number of users in the CSV file", + "placeholders": { + "count": { + "type": "int" + } + } + }, "adminLoaningGroup": "Loaning group", "adminLooking": "Searching", + "adminManageAssociations": "Manage associations", + "adminManageMembers": "Manage members", + "adminManagePaiementStructures": "Manage payment structures", "adminManager": "Structure administrator", + "adminManagerGroup": "Manager group : {groupName}", + "@adminManagerGroup": { + "description": "Manager group", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "adminManageUserGroups": "Manage user groups", + "adminManageUsersAssociationMemberships": "Manage users' association memberships", "adminMaximum": "Maximum", "adminMembers": "Members", "adminMembershipAddingError": "Error while adding (likely due to overlapping dates)", "adminMemberships": "Memberships", "adminMembershipUpdatingError": "Error while updating (likely due to overlapping dates)", "adminMinimum": "Minimum", - "adminModifyModuleVisibility": "Module visibility", + "adminModifyPermissions": "Modify permissions", "adminName": "Name", "adminNoGroup": "No group", "adminNoManager": "No manager selected", "adminNoMember": "No member", "adminNoMoreLoaner": "No lender available", "adminNoSchool": "No school", + "adminNotificationSent": "Notification sent", + "adminNotifyGroup": "Send a notification", + "adminPaiement": "Payment", + "adminPaiementModule": "Payment module", "adminRemoveGroupMember": "Remove member from group?", "adminResearch": "Search", "adminSchools": "Schools", + "adminSelectGroupAssociationManager": "Select a group to manage this association", + "adminSelectManager": "Select a manager", + "adminSend": "Send", + "adminSendNotificationToGroup": "Send notification to group", "adminShortId": "Short ID (3 letters)", "adminShortIdError": "Short ID must be 3 characters", "adminSiegeAddress": "Head office address", "adminSiret": "SIRET", "adminSiretError": "SIRET must be 14 digits", - "adminStreet": "Street and number", - "adminStructures": "Structures", "adminStartDate": "Start date", "adminStartDateMaximal": "Maximum start date", "adminStartDateMinimal": "Minimum start date", + "adminStreet": "Street and number", + "adminStructures": "Structures", + "adminTitle": "Title", + "adminTooHeavyLogo": "Logo too heavy, maximum size is 4MB", "adminUndefinedBankAccountHolder": "Bank account holder not defined", + "adminUpdatedAssociationLogo": "Association logo updated", "adminUpdatedAssociationMembership": "Membership updated", "adminUpdatedGroup": "Group updated", "adminUpdatedMembership": "Membership updated", "adminUpdatingError": "Error while updating", "adminUser": "User", - "adminValidateFilters": "Apply filters", - "adminVisibilities": "Visibilities", - "adminZipcode": "Zip code", - "adminGroupNotification": "Group notifications", - "adminNotifyGroup": "Send a notification", - "adminTitle": "Title", - "adminContent": "Content", - "adminSend": "Send", - "adminNotificationSent": "Notification sent", - "adminFailedToSendNotification": "Failed to send notification", - "adminGroupsManagement": "Groups management", - "adminEditGroup": "Edit group", - "adminManageMembers": "Manage members", - "adminDeleteGroupConfirmation": "Are you sure you want to delete this group?", - "adminFailedToDeleteGroup": "Failed to delete group", "adminUsersAndGroups": "Users and groups", "adminUsersManagement": "Users management", "adminUsersManagementDescription": "Manage users, groups, and associations", - "adminManageUserGroups": "Manage user groups", - "adminSendNotificationToGroup": "Send notification to group", - "adminPaiementModule": "Payment module", - "adminPaiement": "Payment", - "adminManagePaiementStructures": "Manage payment structures", - "adminManageUsersAssociationMemberships": "Manage users' association memberships", - "adminAssociationMembershipsManagement": "Association memberships management", - "adminChooseGroupManager": "Choose a group to manage this membership", - "adminSelectManager": "Select a manager", - "adminImportList": "Import a list", - "adminImportUsersDescription": "Import users from a CSV file. The CSV file must contain one email address per line.", - "adminFailedToInviteUsers": "Failed to invite users", - "adminDeleteUsers": "Delete users", - "adminAdmin": "Admin", - "adminAssociations": "Associations", - "adminManageAssociations": "Manage associations", - "adminAddAssociation": "Add association", - "adminAssociationName": "Association name", - "adminSelectGroupAssociationManager": "Select a group to manage this association", - "adminEditAssociation": "Edit association : {associationName}", - "@adminEditAssociation": { - "description": "Edit association", - "placeholders": { - "associationName": { - "type": "String" - } - } - }, - "adminManagerGroup": "Manager group : {groupName}", - "@adminManagerGroup": { - "description": "Manager group", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "adminAssociationCreated": "Association created", - "adminAssociationUpdated": "Association updated", - "adminAssociationCreationError": "Error while creating association", - "adminAssociationUpdateError": "Error while updating association", - "adminInvite": "Invite", - "adminInvitedUsers": "Invited users", - "adminInviteUsers": "Invite users", - "adminInviteUsersCounter": "{count, plural, zero {No user} one {{count} user} other {{count} users}} in the CSV file", - "@adminInviteUsersCounter": { - "description": "Text with the number of users in the CSV file", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "adminUpdatedAssociationLogo": "Association logo updated", - "adminTooHeavyLogo": "Logo too heavy, maximum size is 4MB", - "adminFailedToUpdateAssociationLogo": "Failed to update association logo", - "adminChooseGroup": "Choose a group", - "adminChooseAssociationManagerGroup": "Choose a group to manage this association", + "adminValidateFilters": "Apply filters", + "adminVisibilities": "Visibilities", + "adminZipcode": "Zip code", "advertAdd": "Add", "advertAddedAdvert": "Advert published", "advertAddedAnnouncer": "Announcer added", @@ -282,27 +201,27 @@ "advertInvalidNumber": "Please enter a number", "advertManagement": "Management", "advertModifyAnnouncingGroup": "Edit announcement group", + "advertMonthApr": "Apr", + "advertMonthAug": "Aug", + "advertMonthDec": "Dec", + "advertMonthFeb": "Feb", + "advertMonthJan": "Jan", + "advertMonthJul": "Jul", + "advertMonthJun": "Jun", + "advertMonthMar": "Mar", + "advertMonthMay": "May", + "advertMonthNov": "Nov", + "advertMonthOct": "Oct", + "advertMonthSep": "Sep", "advertNoMoreAnnouncer": "No more announcers available", + "advertNotification": "Send a notification", "advertNoValue": "Please enter a value", "advertPositiveNumber": "Please enter a positive number", "advertPublishToFeed": "Publish to feed?", - "advertNotification": "Send a notification", "advertRemovedAnnouncer": "Announcer removed", "advertRemovingError": "Error during removal", "advertTags": "Tags", "advertTitle": "Title", - "advertMonthJan": "Jan", - "advertMonthFeb": "Feb", - "advertMonthMar": "Mar", - "advertMonthApr": "Apr", - "advertMonthMay": "May", - "advertMonthJun": "Jun", - "advertMonthJul": "Jul", - "advertMonthAug": "Aug", - "advertMonthSep": "Sep", - "advertMonthOct": "Oct", - "advertMonthNov": "Nov", - "advertMonthDec": "Dec", "amapAccounts": "Accounts", "amapAdd": "Add", "amapAddDelivery": "Add delivery", @@ -310,13 +229,13 @@ "amapAddedOrder": "Order added", "amapAddedProduct": "Product added", "amapAddedUser": "User added", - "amapAddProduct": "Add product", - "amapAddUser": "Add user", "amapAddingACommand": "Add an order", "amapAddingCommand": "Add the order", "amapAddingError": "Error while adding", "amapAddingProduct": "Add a product", "amapAddOrder": "Add an order", + "amapAddProduct": "Add product", + "amapAddUser": "Add user", "amapAdmin": "Admin", "amapAlreadyExistCommand": "An order already exists for this date", "amapAmap": "Amap", @@ -327,14 +246,15 @@ "amapCategory": "Category", "amapCloseDelivery": "Lock", "amapCommandDate": "Order date", + "amapCommandName": "Order name", "amapCommandProducts": "Order products", "amapConfirm": "Confirm", "amapContact": "Association contacts", "amapCreateCategory": "Create category", "amapDelete": "Delete", + "amapDeletedDelivery": "Delivery deleted", "amapDeleteDelivery": "Delete delivery?", "amapDeleteDeliveryDescription": "Are you sure you want to delete this delivery?", - "amapDeletedDelivery": "Delivery deleted", "amapDeletedOrder": "Order deleted", "amapDeletedProduct": "Product deleted", "amapDeleteProduct": "Delete product?", @@ -354,12 +274,12 @@ "amapDeliveryHistory": "Delivery history", "amapDeliveryList": "Delivery list", "amapDeliveryLocked": "Delivery locked", - "amapDeliveryOn": "Delivery on", - "amapDeliveryOpened": "Delivery opened", "amapDeliveryNotArchived": "Delivery not archived", - "amapDeliveryNotLocked": "Delivery not locked", "amapDeliveryNotDelivered": "Delivery not completed", + "amapDeliveryNotLocked": "Delivery not locked", "amapDeliveryNotOpened": "Delivery not opened", + "amapDeliveryOn": "Delivery on", + "amapDeliveryOpened": "Delivery opened", "amapEditDelivery": "Edit delivery", "amapEditedCommand": "Order edited", "amapEditingError": "Error while editing", @@ -372,23 +292,24 @@ "amapExpectingNumber": "Please enter a number", "amapFillField": "Please fill out this field", "amapHandlingAccount": "Manage accounts", + "amapIncorrectlyFilledForm": "Form incorrectly filled", "amapLoading": "Loading...", "amapLoadingError": "Loading error", "amapLock": "Lock", "amapLocked": "Locked", "amapLockedDelivery": "Delivery locked", "amapLockedOrder": "Order locked", - "amapLooking": "Search", "amapLockingDelivery": "Lock delivery?", + "amapLooking": "Search", "amapMidDay": "Midday", "amapMyOrders": "My orders", "amapName": "Name", "amapNextStep": "Next step", - "amapNoProduct": "No product", "amapNoCurrentOrder": "No current order", "amapNoMoney": "Not enough money", "amapNoOpennedDelivery": "No open delivery", "amapNoOrder": "No order", + "amapNoProduct": "No product", "amapNoSelectedDelivery": "No delivery selected", "amapNotEnoughMoney": "Not enough money", "amapNotPlannedDelivery": "No scheduled delivery", @@ -405,8 +326,8 @@ "amapPresentation2": "\n\nFeel free to contact us if you have any issues!", "amapPrice": "Price", "amapProduct": "product", - "amapProducts": "Products", "amapProductInDelivery": "Product in an unfinished delivery", + "amapProducts": "Products", "amapQuantity": "Quantity", "amapRequiredDate": "Date is required", "amapSeeMore": "See more", @@ -422,14 +343,14 @@ "amapUsersNotFound": "No users found", "amapWaiting": "Pending", "bookingAdd": "Add", - "bookingAddBookingPage": "Request", - "bookingAddRoom": "Add room", "bookingAddBooking": "Add booking", + "bookingAddBookingPage": "Request", "bookingAddedBooking": "Request added", - "bookingAddedRoom": "Room added", "bookingAddedManager": "Manager added", + "bookingAddedRoom": "Room added", "bookingAddingError": "Error while adding", "bookingAddManager": "Add manager", + "bookingAddRoom": "Add room", "bookingAdminPage": "Admin", "bookingAllDay": "All day", "bookingBookedFor": "Booked for", @@ -449,23 +370,23 @@ "bookingDeclineBooking": "Decline the booking?", "bookingDeclined": "Declined", "bookingDelete": "Delete", - "bookingDeleting": "Deleting", "bookingDeleteBooking": "Deleting", "bookingDeleteBookingConfirmation": "Are you sure you want to delete this booking?", "bookingDeletedBooking": "Booking deleted", - "bookingDeletedRoom": "Room deleted", "bookingDeletedManager": "Manager deleted", - "bookingDeleteRoomConfirmation": "Are you sure you want to delete this room?\n\nThe room must have no current or upcoming bookings to be deleted", + "bookingDeletedRoom": "Room deleted", "bookingDeleteManagerConfirmation": "Are you sure you want to delete this manager?\n\nThe manager must not be associated with any room to be deleted", + "bookingDeleteRoomConfirmation": "Are you sure you want to delete this room?\n\nThe room must have no current or upcoming bookings to be deleted", + "bookingDeleting": "Deleting", "bookingDeletingBooking": "Delete the booking?", "bookingDeletingError": "Error while deleting", "bookingDeletingRoom": "Delete the room?", "bookingEdit": "Edit", "bookingEditBooking": "Edit a booking", - "bookingEditionError": "Error while editing", "bookingEditedBooking": "Booking edited", - "bookingEditedRoom": "Room edited", "bookingEditedManager": "Manager edited", + "bookingEditedRoom": "Room edited", + "bookingEditionError": "Error while editing", "bookingEditManager": "Edit or delete a manager", "bookingEditRoom": "Edit or delete a room", "bookingEndDate": "End date", @@ -476,8 +397,8 @@ "bookingHistoryPage": "History", "bookingIncorrectOrMissingFields": "Incorrect or missing fields", "bookingInterval": "Interval", - "bookingInvalidIntervalError": "Invalid interval", "bookingInvalidDates": "Invalid dates", + "bookingInvalidIntervalError": "Invalid interval", "bookingInvalidRoom": "Invalid room", "bookingKeysRequested": "Keys requested", "bookingManagement": "Management", @@ -488,17 +409,17 @@ "bookingNecessaryKey": "Key needed", "bookingNext": "Next", "bookingNo": "No", + "bookingNoAppointmentInReccurence": "No slot exists with these recurrence settings", "bookingNoCurrentBooking": "No current booking", "bookingNoDateError": "Please choose a date", - "bookingNoAppointmentInReccurence": "No slot exists with these recurrence settings", "bookingNoDaySelected": "No day selected", "bookingNoDescriptionError": "Please enter a description", "bookingNoKeys": "No keys", "bookingNoNoteError": "Please enter a note", "bookingNoPhoneRegistered": "Number not provided", "bookingNoReasonError": "Please enter a reason", - "bookingNoRoomFoundError": "No room registered", "bookingNoRoomFound": "No room found", + "bookingNoRoomFoundError": "No room registered", "bookingNote": "Note", "bookingOther": "Other", "bookingPending": "Pending", @@ -513,15 +434,15 @@ "bookingRoomName": "Room name", "bookingStartDate": "Start date", "bookingStartHour": "Start hour", - "bookingWeeks": "Weeks", - "bookingYes": "Yes", - "bookingWeekDayMon": "Monday", - "bookingWeekDayTue": "Tuesday", - "bookingWeekDayWed": "Wednesday", - "bookingWeekDayThu": "Thursday", "bookingWeekDayFri": "Friday", + "bookingWeekDayMon": "Monday", "bookingWeekDaySat": "Saturday", "bookingWeekDaySun": "Sunday", + "bookingWeekDayThu": "Thursday", + "bookingWeekDayTue": "Tuesday", + "bookingWeekDayWed": "Wednesday", + "bookingWeeks": "Weeks", + "bookingYes": "Yes", "cinemaAdd": "Add", "cinemaAddedSession": "Session added", "cinemaAddingError": "Error while adding", @@ -535,11 +456,11 @@ "cinemaEditingError": "Error while editing", "cinemaEditSession": "Edit the session", "cinemaEmptyUrl": "Please enter a URL", + "cinemaGenre": "Genre", "cinemaImportFromTMDB": "Import from TMDB", "cinemaIncomingSession": "Now showing", "cinemaIncorrectOrMissingFields": "Incorrect or missing fields", "cinemaInvalidUrl": "Invalid URL", - "cinemaGenre": "Genre", "cinemaName": "Name", "cinemaNoDateError": "Please enter a date", "cinemaNoDuration": "Please enter a duration", @@ -552,6 +473,16 @@ "cinemaStartHour": "Start hour", "cinemaTagline": "Tagline", "cinemaThe": "The", + "dateAt": "at", + "dateBetweenDays": "to", + "dateFrom": "from", + "dateLast": "Last", + "dateStarting": "Starting", + "dateTo": "to", + "dateToday": "Today", + "dateTomorrow": "Tomorrow", + "dateUntil": "Until", + "dateYesterday": "Yesterday", "drawerAdmin": "Administration", "drawerAndroidAppLink": "https://play.google.com/store/apps/details?id=fr.myecl.titan", "drawerCopied": "Copied!", @@ -561,19 +492,34 @@ "drawerLogOut": "Log out", "drawerOr": " or ", "drawerSettings": "Settings", + "eventActionCampaign": "You can vote", + "eventActionCampaignButton": "Vote", + "eventActionCampaignSubtitle": "Vote now", + "eventActionCampaignValidated": "I voted!", + "eventActionEvent": "You are invited", + "eventActionEventButton": "Reserve", + "eventActionEventSubtitle": "Answer the invitation", + "eventActionEventValidated": "I'm coming!", "eventAdd": "Add", - "eventAddEvent": "Add an event", "eventAddedEvent": "Event added", + "eventAddEvent": "Add an event", "eventAddingError": "Error while adding", "eventAllDay": "All day", "eventConfirm": "Confirm", - "eventConfirmEvent": "Confirm the event?", "eventConfirmation": "Confirmation", "eventConfirmed": "Confirmed", + "eventConfirmEvent": "Confirm the event?", "eventDates": "Dates", + "eventDayFri": "Friday", + "eventDayMon": "Monday", + "eventDaySat": "Saturday", + "eventDaySun": "Sunday", + "eventDayThu": "Thursday", + "eventDayTue": "Tuesday", + "eventDayWed": "Wednesday", "eventDecline": "Decline", - "eventDeclineEvent": "Decline the event?", "eventDeclined": "Declined", + "eventDeclineEvent": "Decline the event?", "eventDelete": "Delete", "eventDeleteConfirm": "Delete the event {name}?", "@eventDeleteConfirm": { @@ -590,12 +536,13 @@ "eventDeletingEvent": "Delete the event?", "eventDescription": "Description", "eventEdit": "Edit", - "eventEditEvent": "Edit an event", "eventEditedEvent": "Event edited", + "eventEditEvent": "Edit an event", "eventEditingError": "Error while editing", "eventEndDate": "End date", "eventEndHour": "End hour", "eventError": "Error", + "eventEventEvery": "Every", "eventEventList": "Event list", "eventEventType": "Event type", "eventEvery": "Every", @@ -618,8 +565,8 @@ "eventNoEvent": "No event", "eventNoNameError": "Please enter a name", "eventNoOrganizerError": "Please enter an organizer", - "eventNoPlaceError": "Please enter a location", "eventNoPhoneRegistered": "Number not provided", + "eventNoPlaceError": "Please enter a location", "eventNoRuleError": "Please enter a recurrence rule", "eventOrganizer": "Organizer", "eventOther": "Other", @@ -633,18 +580,74 @@ "eventStartDate": "Start date", "eventStartHour": "Start hour", "eventTitle": "Events", - "eventYes": "Yes", - "eventEventEvery": "Every", "eventWeeks": "weeks", - "eventDayMon": "Monday", - "eventDayTue": "Tuesday", - "eventDayWed": "Wednesday", - "eventDayThu": "Thursday", - "eventDayFri": "Friday", - "eventDaySat": "Saturday", - "eventDaySun": "Sunday", - "globalConfirm": "Confirm", + "eventYes": "Yes", + "feedAdmin": "Administration", + "feedApply": "Apply", + "feedApprove": "Approve", + "feedAssociation": "Association", + "feedAssociationEvent": "{name} event", + "@feedAssociationEvent": { + "description": "Association event", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "feedCantOpenLink": "Can't open link", + "feedCreateAnEvent": "Create an event", + "feedCreateEvent": "Create an event", + "feedEditEvent": "Edit event", + "feedEmptyAll": "No events available", + "feedEmptyApproved": "No approved events", + "feedEmptyPending": "No events pending approval", + "feedEmptyRejected": "No rejected events", + "feedEnded": "Ended", + "feedEventManagement": "Event Management", + "feedFilter": "Filter", + "feedFilterAll": "All", + "feedFilterApproved": "Approved", + "feedFilterPending": "Pending", + "feedFilterRejected": "Rejected", + "feedGetReady": "Get ready!", + "feedLocation": "Location", + "feedManageAssociationEvents": "Manage association events", + "feedManageRequests": "Manage requests", + "feedNews": "Calendar", + "feedNewsType": "News type", + "feedNoAssociationEvents": "No association events", + "feedNoNewsAvailable": "No news available", + "feedNotification": "Send a notification", + "feedOngoing": "Ongoing", + "feedPleaseProvideASGDate": "Please provide a SG date", + "feedPleaseProvideASGExternalLink": "Please provide a SG external link", + "feedPleaseSelectAnAssociation": "Please select an association", + "feedRefresh": "Refresh", + "feedReject": "Reject", + "feedSGDate": "SG Date", + "feedSGExternalLink": "SG External link", + "feedShotgunIn": "Shotgun in {time}", + "@feedShotgunIn": { + "description": "Shotgun in time", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "feedTitle": "Title", + "feedVoteIn": "Vote in {time}", + "@feedVoteIn": { + "description": "Vote in time", + "placeholders": { + "time": { + "type": "String" + } + } + }, "globalCancel": "Cancel", + "globalConfirm": "Confirm", "globalIrreversibleAction": "This action is irreversible", "globalOptionnal": "{text} (Optional)", "@globalOptionnal": { @@ -660,49 +663,49 @@ "homeIncomingEvents": "Upcoming events", "homeLastInfos": "Latest announcements", "homeNoEvents": "No events", - "homeTranslateDayShortMon": "Mon", - "homeTranslateDayShortTue": "Tue", - "homeTranslateDayShortWed": "Wed", - "homeTranslateDayShortThu": "Thu", "homeTranslateDayShortFri": "Fri", + "homeTranslateDayShortMon": "Mon", "homeTranslateDayShortSat": "Sat", "homeTranslateDayShortSun": "Sun", + "homeTranslateDayShortThu": "Thu", + "homeTranslateDayShortTue": "Tue", + "homeTranslateDayShortWed": "Wed", "loanAdd": "Add", - "loanAddLoan": "Add a loan", - "loanAddObject": "Add an object", "loanAddedLoan": "Loan added", "loanAddedObject": "Object added", "loanAddedRoom": "Room added", "loanAddingError": "Error while adding", + "loanAddLoan": "Add a loan", + "loanAddObject": "Add an object", "loanAdmin": "Administrator", - "loanAvailable": "Available", - "loanAvailableMultiple": "Available", - "loanBorrowed": "Borrowed", - "loanBorrowedMultiple": "Borrowed", "loanAnd": "and", "loanAssociation": "Association", + "loanAvailable": "Available", "loanAvailableItems": "Available items", + "loanAvailableMultiple": "Available", "loanBeginDate": "Loan start date", + "loanBorrowed": "Borrowed", + "loanBorrowedMultiple": "Borrowed", "loanBorrower": "Borrower", - "loanCaution": "Deposit", "loanCancel": "Cancel", + "loanCaution": "Deposit", "loanConfirm": "Confirm", "loanConfirmation": "Confirmation", "loanDates": "Dates", "loanDays": "Days", "loanDelay": "Extension delay", "loanDelete": "Delete", - "loanDeletingLoan": "Delete the loan?", "loanDeletedItem": "Object deleted", "loanDeletedLoan": "Loan deleted", "loanDeleting": "Deleting", "loanDeletingError": "Error while deleting", "loanDeletingItem": "Delete the object?", + "loanDeletingLoan": "Delete the loan?", "loanDuration": "Duration", "loanEdit": "Edit", + "loanEditedRoom": "Room edited", "loanEditItem": "Edit the object", "loanEditLoan": "Edit the loan", - "loanEditedRoom": "Room edited", "loanEndDate": "Loan end date", "loanEnded": "Ended", "loanEnterDate": "Please enter a date", @@ -710,11 +713,11 @@ "loanExtendingError": "Error while extending", "loanHistory": "History", "loanIncorrectOrMissingFields": "Some fields are missing or incorrect", - "loanInvalidNumber": "Please enter a number", "loanInvalidDates": "Dates are not valid", + "loanInvalidNumber": "Please enter a number", "loanItem": "Item", - "loanItems": "Items", "loanItemHandling": "Item management", + "loanItems": "Items", "loanItemSelected": "selected item", "loanItemsSelected": "selected items", "loanLendingDuration": "Possible loan duration", @@ -730,9 +733,8 @@ "loanNoItems": "No items", "loanNoItemSelected": "No item selected", "loanNoLoan": "No loan", - "loanNoReturnedDate": "No return date", - "loanQuantity": "Quantity", "loanNone": "None", + "loanNoReturnedDate": "No return date", "loanNote": "Note", "loanNoValue": "Please enter a value", "loanOnGoing": "Ongoing", @@ -741,6 +743,7 @@ "loanPaidCaution": "Deposit paid", "loanPositiveNumber": "Please enter a positive number", "loanPrevious": "Previous", + "loanQuantity": "Quantity", "loanReturned": "Returned", "loanReturnedLoan": "Returned loan", "loanReturningError": "Error while returning", @@ -754,6 +757,7 @@ "loanUpdatedLoan": "Loan updated", "loanUpdatingError": "Error while updating", "loanYes": "Yes", + "@@locale": "en", "loginAppName": "MyECL", "loginCreateAccount": "Create an account", "loginForgotPassword": "Forgot password?", @@ -769,19 +773,71 @@ "loginSignIn": "Sign in", "loginUpcomingEvents": "Upcoming events", "loginUpcomingScreenings": "Upcoming screenings", - "othersCheckInternetConnection": "Please check your internet connection", - "othersRetry": "Retry", - "othersTooOldVersion": "Your app version is too old.\n\nPlease update the app.", - "othersUnableToConnectToServer": "Unable to connect to the server", - "othersVersion": "Version", - "othersNoModule": "No modules available, please try again later 😢😢", + "moduleAdmin": "Admin", + "moduleAdminDescription": "Administration module for administrators", + "moduleAdvert": "Feed", + "moduleAdvertDescription": "View the latest feed", + "moduleAmap": "AMAP", + "moduleAmapDescription": "Order your AMAP basket", + "moduleBooking": "Booking", + "moduleBookingDescription": "Book a room", + "moduleCalendar": "Calendar", + "moduleCalendarDescription": "View the calendar of events", + "moduleCentralisation": "Centralisation", + "moduleCentralisationDescription": "Viw all links", + "moduleCinema": "Cinema", + "moduleCinemaDescription": "View the cinema schedule", + "moduleEvent": "Event", + "moduleEventDescription": "View events", + "moduleFeed": "Events", + "moduleFeedDescription": "View the latest events", + "moduleFlappyBird": "Flappy Bird", + "moduleFlappyBirdDescription": "Play Flappy Bird", + "moduleLoan": "Loan", + "moduleLoanDescription": "See your loans", + "moduleOthers": "Others", + "moduleOthersDescription": "Other modules", + "modulePayment": "Payment", + "modulePaymentDescription": "Pay and see your transactions", + "modulePh": "PH", + "modulePhDescription": "View the PH", + "modulePhonebook": "Phonebook", + "modulePhonebookDescription": "View the phonebook", + "modulePurchases": "Purchases", + "modulePurchasesDescription": "View your purchases", + "moduleRaffle": "Raffle", + "moduleRaffleDescription": "View the raffle", + "moduleRecommendation": "Recommendation", + "moduleRecommendationDescription": "View the recommendations", + "moduleSeedLibrary": "Seed Library", + "moduleSeedLibraryDescription": "View the seed library", + "moduleSettings": "Settings", + "moduleSettingsDescription": "Manage your settings", + "moduleStyleGuide": "StyleGuide", + "moduleStyleGuideDescription": "Style guide for developers", + "moduleVote": "Vote", + "moduleVoteDescription": "Vote for the campaigns", "othersAdmin": "Admin", + "othersCheckInternetConnection": "Please check your internet connection", "othersError": "An error occurred", - "othersNoValue": "Please enter a value", + "othersImageError": "Error adding the image", + "othersImageSizeTooBig": "Image size must not exceed 4 MB", "othersInvalidNumber": "Please enter a number", "othersNoDateError": "Please enter a date", - "othersImageSizeTooBig": "Image size must not exceed 4 MB", - "othersImageError": "Error adding the image", + "othersNoModule": "No modules available, please try again later 😢😢", + "othersNoValue": "Please enter a value", + "othersRetry": "Retry", + "othersTooOldVersion": "Your app version is too old.\n\nPlease update the app.", + "othersUnableToConnectToServer": "Unable to connect to the server: {url}", + "@othersUnableToConnectToServer": { + "description": "Error message when the app can't connect to the server, with the URL of the server", + "placeholders": { + "url": { + "type": "String" + } + } + }, + "othersVersion": "Version", "paiementAccept": "Accept", "paiementAccessPage": "Access the page", "paiementAdd": "Add", @@ -822,10 +878,10 @@ "paiementDeleteInvoice": "Delete invoice", "paiementDeleteSeller": "Delete seller", "paiementDeleteSellerDescription": "Are you sure you want to delete this seller?", - "paiementDeleteSuccessfully": "Successfully deleted", "paiementDeleteStore": "Delete store", "paiementDeleteStoreDescription": "Are you sure you want to delete this store?", "paiementDeleteStoreError": "Unable to delete the store", + "paiementDeleteSuccessfully": "Successfully deleted", "paiementDeletingSellerError": "Error while deleting seller", "paiementDeviceActivationReceived": "The activation request has been received, please check your email to finalize the process", "paiementDeviceNotActivated": "Device not activated", @@ -939,6 +995,9 @@ "paiementStats": "Stats", "paiementStoreBalance": "Store balance", "paiementStoreDeleted": "Store deleted", + "paiementStoreName": "Store name", + "paiementStores": "Stores", + "paiementStructureAdmin": "Structure administrator", "paiementStructureManagement": "{structure} management", "@paiementStructureManagement": { "description": "Gestion de la structure", @@ -948,9 +1007,6 @@ } } }, - "paiementStoreName": "Store name", - "paiementStores": "Stores", - "paiementStructureAdmin": "Structure administrator", "paiementSuccededTransaction": "Successful payment", "paiementSuccessfullyAddedStore": "Store successfully added", "paiementSuccessfullyModifiedStore": "Store successfully updated", @@ -970,25 +1026,21 @@ "paiementUnknownDevice": "Unknown device", "paiementValidUntil": "Valid until", "paiementYouAreTransferingStructureTo": "You are about to transfer the structure to ", + "phAdd": "Add", + "phAdded": "Added", + "phAddingFileError": "Add error", "phAddNewJournal": "Add a new journal", - "phNameField": "Name: ", - "phDateField": "Date: ", - "phDelete": "Are you sure you want to delete this journal?", - "phIrreversibleAction": "This action is irreversible", - "phToHeavyFile": "File too large", "phAddPdfFile": "Add a PDF file", - "phEditPdfFile": "Edit PDF file", - "phPhName": "PH name", "phDate": "Date", - "phAdded": "Added", + "phDateField": "Date: ", + "phDelete": "Are you sure you want to delete this journal?", + "phEdit": "Edit", "phEdited": "Edited", - "phAddingFileError": "Add error", + "phEditPdfFile": "Edit PDF file", + "phIrreversibleAction": "This action is irreversible", "phMissingInformatonsOrPdf": "Missing information or PDF file", - "phAdd": "Add", - "phEdit": "Edit", - "phSeePreviousJournal": "See previous journals", + "phNameField": "Name: ", "phNoJournalInDatabase": "No PH yet in database", - "phSuccesDowloading": "Successfully downloaded", "phonebookAdd": "Add", "phonebookAddAssociation": "Add an association", "phonebookAddAssociationGroupement": "Add an association groupement", @@ -1007,6 +1059,7 @@ "phonebookAssociationName": "Association name", "phonebookAssociations": "Associations", "phonebookCancel": "Cancel", + "phonebookChangeTermConfirm": "Are you sure you want to change the entire term?\nThis action is irreversible!", "phonebookChangeTermYear": "Switch to {year} term", "@phonebookChangeTermYear": { "description": "Change the term year of the association", @@ -1016,7 +1069,6 @@ } } }, - "phonebookChangeTermConfirm": "Are you sure you want to change the entire term?\nThis action is irreversible!", "phonebookClose": "Close", "phonebookConfirm": "Confirm", "phonebookCopied": "Copied to clipboard", @@ -1032,10 +1084,14 @@ } } }, + "phonebookDeactivating": "Deactivate the association?", "phonebookDeactivatingError": "Error during deactivation", - "phonebookDetail": "Details:", "phonebookDelete": "Delete", "phonebookDeleteAssociation": "Delete association", + "phonebookDeleteAssociationDescription": "This will erase all association history", + "phonebookDeletedAssociation": "Association deleted", + "phonebookDeletedMember": "Member deleted", + "phonebookDeleteRole": "Delete role", "phonebookDeleteSelectedAssociation": "Delete the association {association}?", "@phonebookDeleteSelectedAssociation": { "description": "Delete an association", @@ -1045,10 +1101,6 @@ } } }, - "phonebookDeleteAssociationDescription": "This will erase all association history", - "phonebookDeletedAssociation": "Association deleted", - "phonebookDeletedMember": "Member deleted", - "phonebookDeleteRole": "Delete role", "phonebookDeleteUserRole": "Delete the role of {name}?", "@phonebookDeleteUserRole": { "description": "Delete the role of a user", @@ -1058,17 +1110,17 @@ } } }, - "phonebookDeactivating": "Deactivate the association?", "phonebookDeleting": "Deleting", "phonebookDeletingError": "Error deleting", "phonebookDescription": "Description", + "phonebookDetail": "Details:", "phonebookEdit": "Edit", "phonebookEditAssociationGroupement": "Edit association groupement", "phonebookEditAssociationGroups": "Manage groups", "phonebookEditAssociationInfo": "Edit", "phonebookEditAssociationMembers": "Manage members", - "phonebookEditRole": "Edit role", "phonebookEditMembership": "Edit role", + "phonebookEditRole": "Edit role", "phonebookEmail": "Email:", "phonebookEmailCopied": "Email copied to clipboard", "phonebookEmptyApparentName": "Please enter a role name", @@ -1100,16 +1152,6 @@ } } }, - "phonebookTerm": "{year} term", - "@phonebookTerm": { - "description": "Term year of the association", - "placeholders": { - "year": { - "type": "int" - } - } - }, - "phonebookTermChangingError": "Error changing term", "phonebookMember": "Member", "phonebookMemberReordered": "Member reordered", "phonebookMembers": "Manage {association} members", @@ -1166,138 +1208,153 @@ "phonebookResearch": "Search", "phonebookRolePure": "Role", "phonebookSearchUser": "Search a user", + "phonebookSelectManagerGroup": "Select the manager group", + "phonebookTerm": "{year} term", + "@phonebookTerm": { + "description": "Term year of the association", + "placeholders": { + "year": { + "type": "int" + } + } + }, + "phonebookTermChangingError": "Error changing term", "phonebookTooHeavyAssociationPicture": "Image is too large (max 4MB)", - "phonebookUpdateGroups": "Update groups", "phonebookUpdatedAssociation": "Association updated", "phonebookUpdatedAssociationPicture": "Association picture has been changed", "phonebookUpdatedGroups": "Groups updated", "phonebookUpdatedMember": "Member updated", + "phonebookUpdateGroups": "Update groups", "phonebookUpdatingError": "Error during update", "phonebookValidation": "Validate", - "purchasesPurchases": "Purchases", - "purchasesResearch": "Search", + "phPhName": "PH name", + "phSeePreviousJournal": "See previous journals", + "phSuccesDowloading": "Successfully downloaded", + "phToHeavyFile": "File too large", + "purchasesAlreadyUsed": "Already used", + "purchasesCancel": "Cancel", + "purchasesHistory": "History", + "purchasesLeftScan": "Scans remaining", + "purchasesLoading": "Waiting for scan", + "purchasesNoPurchases": "No purchase", "purchasesNoPurchasesFound": "No purchases found", + "purchasesNoScannableProducts": "No scannable products", + "purchasesNoTagGiven": "Warning, no tag entered", "purchasesNoTickets": "No tickets", - "purchasesTicketsError": "Error loading tickets", - "purchasesPurchasesError": "Error loading purchases", - "purchasesNoPurchases": "No purchase", - "purchasesTimes": "times", - "purchasesAlreadyUsed": "Already used", "purchasesNotPaid": "Not validated", "purchasesPleaseSelectProduct": "Please select a product", + "purchasesPleaseSelectSeller": "Please select a seller", "purchasesProducts": "Products", - "purchasesCancel": "Cancel", - "purchasesValidate": "Validate", - "purchasesLeftScan": "Scans remaining", + "purchasesPurchases": "Purchases", + "purchasesPurchasesError": "Error loading purchases", + "purchasesResearch": "Search", + "purchasesScan": "Scan", "purchasesTag": "Tag", - "purchasesHistory": "History", - "purchasesPleaseSelectSeller": "Please select a seller", - "purchasesNoTagGiven": "Warning, no tag entered", "purchasesTickets": "Tickets", - "purchasesNoScannableProducts": "No scannable products", - "purchasesLoading": "Waiting for scan", - "purchasesScan": "Scan", - "raffleRaffle": "Raffle", - "rafflePrize": "Prize", - "rafflePrizes": "Prizes", - "raffleActualRaffles": "Current raffles", - "rafflePastRaffles": "Past raffles", - "raffleYourTickets": "All your tickets", - "raffleCreateMenu": "Creation menu", - "raffleNextRaffles": "Upcoming raffles", - "raffleNoTicket": "You have no ticket", - "raffleSeeRaffleDetail": "View prizes/tickets", - "raffleActualPrize": "Current prizes", - "raffleMajorPrize": "Major prizes", - "raffleTakeTickets": "Take your tickets", - "raffleNoTicketBuyable": "You cannot buy tickets right now", - "raffleNoCurrentPrize": "There are no prizes currently", - "raffleModifTombola": "You can modify your raffles or create new ones, all decisions must then be approved by admins", - "raffleCreateYourRaffle": "Your raffle creation menu", - "rafflePossiblePrice": "Possible prize", - "raffleInformation": "Information and statistics", + "purchasesTicketsError": "Error loading tickets", + "purchasesTimes": "times", + "purchasesValidate": "Validate", "raffleAccounts": "Accounts", + "raffleActualPrize": "Current prizes", + "raffleActualRaffles": "Current raffles", "raffleAdd": "Add", - "raffleUpdatedAmount": "Amount updated", - "raffleUpdatingError": "Error during update", - "raffleDeletedPrize": "Prize deleted", - "raffleDeletingError": "Error during deletion", - "raffleQuantity": "Quantity", - "raffleClose": "Close", - "raffleOpen": "Open", - "raffleAddTypeTicketSimple": "Add", - "raffleAddingError": "Error during addition", - "raffleEditTypeTicketSimple": "Edit", - "raffleFillField": "Field cannot be empty", - "raffleWaiting": "Loading", - "raffleEditingError": "Error during editing", "raffleAddedTicket": "Ticket added", - "raffleEditedTicket": "Ticket edited", - "raffleAlreadyExistTicket": "Ticket already exists", - "raffleNumberExpected": "An integer is expected", - "raffleDeletedTicket": "Ticket deleted", + "raffleAddingError": "Error during addition", + "raffleAddPackTicket": "Add ticket pack", "raffleAddPrize": "Add", - "raffleEditPrize": "Edit", - "raffleOpenRaffle": "Open raffle", - "raffleCloseRaffle": "Close raffle", - "raffleOpenRaffleDescription": "You are going to open the raffle, users will be able to buy tickets. You will no longer be able to modify the raffle. Are you sure you want to continue?", - "raffleCloseRaffleDescription": "You are going to close the raffle, users will no longer be able to buy tickets. Are you sure you want to continue?", - "raffleNoCurrentRaffle": "There is no ongoing raffle", - "raffleBoughtTicket": "Ticket purchased", - "raffleDrawingError": "Error during drawing", - "raffleInvalidPrice": "Price must be greater than 0", - "raffleMustBePositive": "Number must be strictly positive", - "raffleDraw": "Draw", - "raffleDrawn": "Drawn", - "raffleError": "Error", - "raffleGathered": "Collected", - "raffleTickets": "Tickets", - "raffleTicket": "ticket", - "raffleWinner": "Winner", - "raffleNoPrize": "No prize", + "raffleAddTypeTicketSimple": "Add", + "raffleAlreadyExistTicket": "Ticket already exists", + "raffleAmount": "Balance", + "raffleBoughtTicket": "Ticket purchased", + "raffleBuyThisTicket": "Buy this ticket", + "raffleClose": "Close", + "raffleCloseRaffle": "Close raffle", + "raffleCloseRaffleDescription": "You are going to close the raffle, users will no longer be able to buy tickets. Are you sure you want to continue?", + "raffleCreateMenu": "Creation menu", + "raffleCreateYourRaffle": "Your raffle creation menu", + "raffleDeletedPrize": "Prize deleted", + "raffleDeletedTicket": "Ticket deleted", "raffleDeletePrize": "Delete prize", "raffleDeletePrizeDescription": "You are going to delete the prize, are you sure you want to continue?", - "raffleDrawing": "Drawing", - "raffleDrawingDescription": "Draw the prize winner?", "raffleDeleteTicket": "Delete ticket", "raffleDeleteTicketDescription": "You are going to delete the ticket, are you sure you want to continue?", - "raffleWinningTickets": "Winning tickets", - "raffleNoWinningTicketYet": "Winning tickets will be displayed here", - "raffleName": "Name", + "raffleDeletingError": "Error during deletion", "raffleDescription": "Description", - "raffleBuyThisTicket": "Buy this ticket", + "raffleDraw": "Draw", + "raffleDrawing": "Drawing", + "raffleDrawingDescription": "Draw the prize winner?", + "raffleDrawingError": "Error during drawing", + "raffleDrawn": "Drawn", + "raffleEdit": "Edit", + "raffleEditedTicket": "Ticket edited", + "raffleEditingError": "Error during editing", + "raffleEditPrize": "Edit", + "raffleEditRaffle": "Edit raffle", + "raffleEditTypeTicketSimple": "Edit", + "raffleError": "Error", + "raffleFillField": "Field cannot be empty", + "raffleGathered": "Collected", + "raffleInformation": "Information and statistics", + "raffleInvalidPrice": "Price must be greater than 0", + "raffleLoading": "Loading", "raffleLockedRaffle": "Locked raffle", - "raffleUnavailableRaffle": "Unavailable raffle", - "raffleNotEnoughMoney": "You don't have enough money", - "raffleWinnable": "winnable", + "raffleMajorPrize": "Major prizes", + "raffleModifTombola": "You can modify your raffles or create new ones, all decisions must then be approved by admins", + "raffleMustBePositive": "Number must be strictly positive", + "raffleName": "Name", + "raffleNextRaffles": "Upcoming raffles", + "raffleNoCurrentPrize": "There are no prizes currently", + "raffleNoCurrentRaffle": "There is no ongoing raffle", "raffleNoDescription": "No description", - "raffleAmount": "Balance", - "raffleLoading": "Loading", - "raffleTicketNumber": "Number of tickets", + "raffleNoPrize": "No prize", + "raffleNotEnoughMoney": "You don't have enough money", + "raffleNoTicket": "You have no ticket", + "raffleNoTicketBuyable": "You cannot buy tickets right now", + "raffleNoWinningTicketYet": "Winning tickets will be displayed here", + "raffleNumberExpected": "An integer is expected", + "raffleOpen": "Open", + "raffleOpenRaffle": "Open raffle", + "raffleOpenRaffleDescription": "You are going to open the raffle, users will be able to buy tickets. You will no longer be able to modify the raffle. Are you sure you want to continue?", + "rafflePastRaffles": "Past raffles", + "rafflePossiblePrice": "Possible prize", "rafflePrice": "Price", - "raffleEditRaffle": "Edit raffle", - "raffleEdit": "Edit", - "raffleAddPackTicket": "Add ticket pack", - "recommendationRecommendation": "Recommendation", - "recommendationTitle": "Title", - "recommendationLogo": "Logo", - "recommendationCode": "Code", - "recommendationSummary": "Short summary", - "recommendationDescription": "Description", + "rafflePrize": "Prize", + "rafflePrizes": "Prizes", + "raffleQuantity": "Quantity", + "raffleRaffle": "Raffle", + "raffleSeeRaffleDetail": "View prizes/tickets", + "raffleTakeTickets": "Take your tickets", + "raffleTicket": "ticket", + "raffleTicketNumber": "Number of tickets", + "raffleTickets": "Tickets", + "raffleUnavailableRaffle": "Unavailable raffle", + "raffleUpdatedAmount": "Amount updated", + "raffleUpdatingError": "Error during update", + "raffleWaiting": "Loading", + "raffleWinnable": "winnable", + "raffleWinner": "Winner", + "raffleWinningTickets": "Winning tickets", + "raffleYourTickets": "All your tickets", "recommendationAdd": "Add", - "recommendationEdit": "Edit", - "recommendationDelete": "Delete", - "recommendationAddImage": "Please add an image", "recommendationAddedRecommendation": "Deal added", - "recommendationEditedRecommendation": "Deal updated", - "recommendationDeleteRecommendationConfirmation": "Are you sure you want to delete this deal?", + "recommendationAddImage": "Please add an image", + "recommendationAddingError": "Add failed", + "recommendationCode": "Code", + "recommendationCopiedCode": "Discount code copied", + "recommendationDelete": "Delete", + "recommendationDeletedRecommendation": "Deal deleted", "recommendationDeleteRecommendation": "Delete", + "recommendationDeleteRecommendationConfirmation": "Are you sure you want to delete this deal?", "recommendationDeletingRecommendationError": "Error during deletion", - "recommendationDeletedRecommendation": "Deal deleted", - "recommendationIncorrectOrMissingFields": "Incorrect or missing fields", + "recommendationDescription": "Description", + "recommendationEdit": "Edit", + "recommendationEditedRecommendation": "Deal updated", "recommendationEditingError": "Edit failed", - "recommendationAddingError": "Add failed", - "recommendationCopiedCode": "Discount code copied", + "recommendationIncorrectOrMissingFields": "Incorrect or missing fields", + "recommendationLogo": "Logo", + "recommendationRecommendation": "Recommendation", + "recommendationSummary": "Short summary", + "recommendationTitle": "Title", "seedLibraryAdd": "Add", "seedLibraryAddedPlant": "Plant added", "seedLibraryAddedSpecies": "Species added", @@ -1343,18 +1400,18 @@ "seedLibraryHelpSheets": "Plant sheets", "seedLibraryInformation": "Information:", "seedLibraryMaturationTime": "Maturation time", - "seedLibraryMonthJan": "January", + "seedLibraryMonthApr": "April", + "seedLibraryMonthAug": "August", + "seedLibraryMonthDec": "December", "seedLibraryMonthFeb": "February", + "seedLibraryMonthJan": "January", + "seedLibraryMonthJul": "July", + "seedLibraryMonthJun": "June", "seedLibraryMonthMar": "March", - "seedLibraryMonthApr": "April", "seedLibraryMonthMay": "May", - "seedLibraryMonthJun": "June", - "seedLibraryMonthJul": "July", - "seedLibraryMonthAug": "August", - "seedLibraryMonthSep": "September", - "seedLibraryMonthOct": "October", "seedLibraryMonthNov": "November", - "seedLibraryMonthDec": "December", + "seedLibraryMonthOct": "October", + "seedLibraryMonthSep": "September", "seedLibraryMyPlants": "My plants", "seedLibraryName": "Name", "seedLibraryNbSeedsRecommended": "Number of seeds recommended", @@ -1383,11 +1440,11 @@ "seedLibrarySaveChanges": "Save changes", "seedLibrarySeason": "Season:", "seedLibrarySeed": "Seed", - "seedLibrarySeeds": "seeds", "seedLibrarySeedDeposit": "Plant deposit", "seedLibrarySeedLibrary": "Seed library", - "seedLibrarySeedQuantitySimple": "Seed quantity", "seedLibrarySeedQuantity": "Seed quantity:", + "seedLibrarySeedQuantitySimple": "Seed quantity", + "seedLibrarySeeds": "seeds", "seedLibraryShowDeadPlants": "Show dead plants", "seedLibrarySpecies": "Species:", "seedLibrarySpeciesHelp": "Help on species", @@ -1397,15 +1454,15 @@ "seedLibrarySpring": "Spring", "seedLibraryStartMonth": "Start month:", "seedLibraryStock": "Available stock", - "seedLibrarySummer": "Summer", "seedLibraryStocks": "Stocks", + "seedLibrarySummer": "Summer", "seedLibraryTimeUntilMaturation": "Time until maturation:", "seedLibraryType": "Type:", "seedLibraryUnableToOpen": "Unable to open link", "seedLibraryUpdate": "Edit", "seedLibraryUpdatedInformation": "Information updated", - "seedLibraryUpdatedSpecies": "Species updated", "seedLibraryUpdatedPlant": "Plant updated", + "seedLibraryUpdatedSpecies": "Species updated", "seedLibraryUpdatingError": "Error updating", "seedLibraryWinter": "Winter", "seedLibraryWriteReference": "Please write the following reference: ", @@ -1418,36 +1475,64 @@ "settingsBugs": "Bugs", "settingsChangePassword": "Change password", "settingsChangingPassword": "Do you really want to change your password?", + "settingsChooseLanguage": "Choose a language", "settingsConfirmPassword": "Confirm password", + "settingsConnexion": "Connection", "settingsCopied": "Copied!", "settingsDarkMode": "Dark mode", "settingsDarkModeOff": "Off", "settingsDeleteLogs": "Delete logs?", + "settingsDeleteMyAccount": "Delete my account", + "settingsDeleteMyAccountDescription": "This action will send a request to the administrator to delete your account.", + "settingsDeleteMyAccountError": "Error sending account deletion request", "settingsDeleteNotificationLogs": "Delete notification logs?", + "settingsDeleting": "Deleting", + "settingsDeletionAsked": "Your account deletion request has been sent to the administrator.", "settingsDetelePersonalData": "Delete my personal data", "settingsDetelePersonalDataDesc": "This action notifies the administrator that you want to delete your personal data.", - "settingsDeleting": "Deleting", "settingsEdit": "Edit", "settingsEditAccount": "Edit account", + "settingsEditedAccount": "Account edited", "settingsEditPassword": "Edit password", "settingsEmail": "Email", "settingsEmptyField": "This field cannot be empty", "settingsErrorProfilePicture": "Error editing profile picture", "settingsErrorSendingDemand": "Error sending request", + "settingsEvent": "Event", "settingsEventsIcal": "Ical link for events", "settingsExpectingDate": "Expected birth date", + "settingsFailedToEditAccount": "Failed to edit account", "settingsFirstname": "First name", "settingsFloor": "Floor", "settingsHelp": "Help", + "settingsHyperionVersion": "Hyperion version", + "settingsIcal": "Ical link", "settingsIcalCopied": "Ical link copied!", + "settingsIcalLinkCopied": "Ical link copied", "settingsLanguage": "Language", "settingsLanguageVar": "English 🇬🇧", + "settingsLogOut": "Log out", + "settingsLogOutDescription": "Do you really want to log out?", + "settingsLogOutSuccess": "Logged out successfully", "settingsLogs": "Logs", + "settingsMinimalHyperionVersion": "Minimal Hyperion version", "settingsModules": "Modules", "settingsMyIcs": "My Ical link", "settingsName": "Last name", "settingsNewPassword": "New password", "settingsNickname": "Nickname", + "settingsNotificationCounter": "{active}/{total} active {active, plural, zero {notification} one {notification} other {notifications}}", + "@settingsNotificationCounter": { + "description": "Affiche le nombre de notifications actives sur le total des notifications disponibles, avec gestion du pluriel", + "placeholders": { + "active": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "settingsNotifications": "Notifications", "settingsOldPassword": "Old password", "settingsPasswordChanged": "Password changed", @@ -1455,6 +1540,8 @@ "settingsPersonalData": "Personal data", "settingsPersonalisation": "Personalization", "settingsPhone": "Phone", + "settingsPhoneNumber": "Phone number", + "settingsProfile": "Profile", "settingsProfilePicture": "Profile picture", "settingsPromo": "Promotion", "settingsRepportBug": "Report a bug", @@ -1462,58 +1549,29 @@ "settingsSecurity": "Security", "settingsSendedDemand": "Request sent", "settingsSettings": "Settings", + "settingsSynncWithCalendar": "Sync with calendar", "settingsTooHeavyProfilePicture": "Image is too large (max 4MB)", + "settingsTooRecentVersion": "Your version of the app is too recent, please contact the administrator to fix this issue", "settingsUpdatedProfile": "Profile updated", "settingsUpdatedProfilePicture": "Profile picture updated", "settingsUpdateNotification": "Update notifications", "settingsUpdatingError": "Error updating profile", - "settingsVersion": "Version", - "settingsPasswordStrength": "Password strength", - "settingsPasswordStrengthVeryWeak": "Very weak", - "settingsPasswordStrengthWeak": "Weak", - "settingsPasswordStrengthMedium": "Medium", - "settingsPasswordStrengthStrong": "Strong", - "settingsPasswordStrengthVeryStrong": "Very strong", - "settingsPhoneNumber": "Phone number", "settingsValidate": "Confirm", - "settingsEditedAccount": "Account edited", - "settingsFailedToEditAccount": "Failed to edit account", - "settingsChooseLanguage": "Choose a language", - "settingsNotificationCounter": "{active}/{total} active {active, plural, zero {notification} one {notification} other {notifications}}", - "@settingsNotificationCounter": { - "description": "Affiche le nombre de notifications actives sur le total des notifications disponibles, avec gestion du pluriel", - "placeholders": { - "active": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "settingsEvent": "Event", - "settingsIcal": "Ical link", - "settingsSynncWithCalendar": "Sync with calendar", - "settingsIcalLinkCopied": "Ical link copied", - "settingsProfile": "Profile", - "settingsConnexion": "Connection", - "settingsLogOut": "Log out", - "settingsLogOutDescription": "Do you really want to log out?", - "settingsLogOutSuccess": "Logged out successfully", - "settingsDeleteMyAccount": "Delete my account", - "settingsDeleteMyAccountDescription": "This action will send a request to the administrator to delete your account.", - "settingsDeletionAsked": "Your account deletion request has been sent to the administrator.", - "settingsDeleteMyAccountError": "Error sending account deletion request", + "settingsVersion": "Version", + "toolDateRequired": "Date required", + "toolInvalidNumber": "Invalid number", + "toolSuccess": "Success", "voteAdd": "Add", - "voteAddMember": "Add a member", "voteAddedPretendance": "List added", "voteAddedSection": "Section added", "voteAddingError": "Error adding", + "voteAddMember": "Add a member", "voteAddPretendance": "Add a list", "voteAddSection": "Add a section", "voteAll": "All", "voteAlreadyAddedMember": "Member already added", "voteAlreadyVoted": "Vote recorded", + "voteCanNotVote": "You cannot vote", "voteChooseList": "Choose a list", "voteClear": "Reset", "voteClearVotes": "Reset votes", @@ -1522,11 +1580,11 @@ "voteConfirmVote": "Confirm vote", "voteCountVote": "Count votes", "voteDelete": "Delete", + "voteDeleteAll": "Delete all", + "voteDeleteAllDescription": "Do you really want to delete everything?", "voteDeletedAll": "All deleted", "voteDeletedPipo": "Fake lists deleted", "voteDeletedSection": "Section deleted", - "voteDeleteAll": "Delete all", - "voteDeleteAllDescription": "Do you really want to delete everything?", "voteDeletePipo": "Delete fake lists", "voteDeletePipoDescription": "Do you really want to delete the fake lists?", "voteDeletePretendance": "Delete the list", @@ -1541,14 +1599,13 @@ "voteEditingError": "Error editing", "voteErrorClosingVotes": "Error closing votes", "voteErrorCountingVotes": "Error counting votes", - "voteErrorResetingVotes": "Error resetting votes", "voteErrorOpeningVotes": "Error opening votes", + "voteErrorResetingVotes": "Error resetting votes", "voteIncorrectOrMissingFields": "Incorrect or missing fields", "voteMembers": "Members", "voteName": "Name", "voteNoPretendanceList": "No list of candidates", "voteNoSection": "No section", - "voteCanNotVote": "You cannot vote", "voteNoSectionList": "No section", "voteNotOpenedVote": "Vote not opened", "voteOnGoingCount": "Counting in progress", @@ -1564,8 +1621,8 @@ "voteResetVote": "Reset votes", "voteResetVoteDescription": "What do you want to do?", "voteRole": "Role", - "voteSectionDescription": "Section description", "voteSection": "Section", + "voteSectionDescription": "Section description", "voteSectionName": "Section name", "voteSeeMore": "See more", "voteSelected": "Selected", @@ -1575,58 +1632,11 @@ "voteVoteFor": "Vote for ", "voteVoteNotStarted": "Vote not opened", "voteVoters": "Voting groups", - "voteVoteSuccess": "Vote recorded", "voteVotes": "Votes", "voteVotesClosed": "Votes closed", "voteVotesCounted": "Votes counted", "voteVotesOpened": "Votes opened", + "voteVoteSuccess": "Vote recorded", "voteWarning": "Warning", - "voteWarningMessage": "Selection will not be saved.\nDo you want to continue?", - "moduleAdvert": "Feed", - "moduleAmap": "AMAP", - "moduleBooking": "Booking", - "moduleCalendar": "Calendar", - "moduleCentralisation": "Centralisation", - "moduleCinema": "Cinema", - "moduleEvent": "Event", - "moduleFlappyBird": "Flappy Bird", - "moduleLoan": "Loan", - "modulePhonebook": "Phonebook", - "modulePurchases": "Purchases", - "moduleRaffle": "Raffle", - "moduleRecommendation": "Recommendation", - "moduleSeedLibrary": "Seed Library", - "moduleVote": "Vote", - "modulePh": "PH", - "moduleSettings": "Settings", - "moduleFeed": "Events", - "moduleStyleGuide": "StyleGuide", - "moduleAdmin": "Admin", - "moduleOthers": "Others", - "modulePayment": "Payment", - "moduleAdvertDescription": "View the latest feed", - "moduleAmapDescription": "Order your AMAP basket", - "moduleBookingDescription": "Book a room", - "moduleCalendarDescription": "View the calendar of events", - "moduleCentralisationDescription": "Viw all links", - "moduleCinemaDescription": "View the cinema schedule", - "moduleEventDescription": "View events", - "moduleFlappyBirdDescription": "Play Flappy Bird", - "moduleLoanDescription": "See your loans", - "modulePhonebookDescription": "View the phonebook", - "modulePurchasesDescription": "View your purchases", - "moduleRaffleDescription": "View the raffle", - "moduleRecommendationDescription": "View the recommendations", - "moduleSeedLibraryDescription": "View the seed library", - "moduleVoteDescription": "Vote for the campaigns", - "modulePhDescription": "View the PH", - "moduleSettingsDescription": "Manage your settings", - "moduleFeedDescription": "View the latest events", - "moduleStyleGuideDescription": "Style guide for developers", - "moduleAdminDescription": "Administration module for administrators", - "moduleOthersDescription": "Other modules", - "modulePaymentDescription": "Pay and see your transactions", - "toolInvalidNumber": "Invalid number", - "toolDateRequired": "Date required", - "toolSuccess": "Success" + "voteWarningMessage": "Selection will not be saved.\nDo you want to continue?" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index cb6ced5398..a20b9245fc 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1,106 +1,33 @@ { - "@@locale": "fr", - "dateToday": "Aujourd'hui", - "dateYesterday": "Hier", - "dateTomorrow": "Demain", - "dateAt": "à", - "dateFrom": "de", - "dateTo": "à", - "dateBetweenDays": "au", - "dateStarting": "Commence", - "dateLast": "", - "dateUntil": "Jusqu'au", - "feedFilterAll": "Tous", - "feedFilterPending": "En attente", - "feedFilterApproved": "Approuvés", - "feedFilterRejected": "Rejetés", - "feedEmptyAll": "Aucun événement disponible", - "feedEmptyPending": "Aucun événement en attente de validation", - "feedEmptyApproved": "Aucun événement approuvé", - "feedEmptyRejected": "Aucun événement rejeté", - "feedEventManagement": "Gestion des événements", - "feedTitle": "Titre", - "feedLocation": "Lieu", - "feedSGDate": "Date du SG", - "feedSGExternalLink": "Lien externe du SG", - "feedCreateEvent": "Créer l'événement", - "feedNotification": "Envoyer une notification", - "feedPleaseSelectAnAssociation": "Veuillez sélectionner une association", - "feedReject": "Rejeter", - "feedApprove": "Approuver", - "feedEnded": "Terminé", - "feedOngoing": "En cours", - "feedFilter": "Filtrer", - "feedAssociation": "Association", - "feedAssociationEvent": "Event de {name}", - "@feedAssociationEvent": { - "description": "Association event", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "feedEditEvent": "Modifier l'événement", - "feedManageAssociationEvents": "Gérer les événements de l'association", - "feedNews": "Calendrier", - "feedNewsType": "Type d'actualité", - "feedNoAssociationEvents": "Aucun événement d'association", - "feedApply": "Appliquer", - "feedAdmin": "Administration", - "feedCreateAnEvent": "Créer un événement", - "feedManageRequests": "Demandes de publication", - "feedNoNewsAvailable": "Aucune actualité disponible", - "feedRefresh": "Actualiser", - "feedPleaseProvideASGExternalLink": "Veuillez entrer un lien externe pour le SG", - "feedPleaseProvideASGDate": "Veuillez entrer une date de SG", - "feedShotgunIn": "Shotgun {time}", - "@feedShotgunIn": { - "description": "Placeholder pour le temps restant avant le shotgun", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "feedVoteIn": "Vote {time}", - "@feedVoteIn": { - "description": "Temps restant avant le vote", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "feedCantOpenLink": "Impossible d'ouvrir le lien", - "feedGetReady": "Prépare-toi !", - "eventActionCampaign": "Tu peux voter", - "eventActionEvent": "Tu es invité", - "eventActionCampaignSubtitle": "Votez maintenant", - "eventActionEventSubtitle": "Répondez à l'invitation", - "eventActionCampaignButton": "Voter", - "eventActionEventButton": "Réserver", - "eventActionCampaignValidated": "J'ai voté !", - "eventActionEventValidated": "Je viens !", + "moduleCentralassociation": "Centralassociation", + "moduleCentralassociationDescription": "Agrégateur des liens des associations", "adminAccountTypes": "Types de compte", "adminAdd": "Ajouter", - "adminAddGroup": "Ajouter un groupe", - "adminAddMember": "Ajouter un membre", + "adminAddAssociation": "Ajouter une association", "adminAddedGroup": "Groupe créé", "adminAddedLoaner": "Préteur ajouté", "adminAddedMember": "Membre ajouté", + "adminAddedSchool": "École créée", + "adminAddedStructure": "Structure ajoutée", + "adminAddGroup": "Ajouter un groupe", "adminAddingError": "Erreur lors de l'ajout", "adminAddingMember": "Ajout d'un membre", "adminAddLoaningGroup": "Ajouter un groupe de prêt", + "adminAddMember": "Ajouter un membre", "adminAddSchool": "Ajouter une école", "adminAddStructure": "Ajouter une structure", - "adminAddedSchool": "École créée", - "adminAddedStructure": "Structure ajoutée", - "adminEditedStructure": "Structure modifiée", + "adminAdmin": "Admin", "adminAdministration": "Administration", + "adminAssociationCreated": "Association créée", + "adminAssociationCreationError": "Échec de la création de l'association", "adminAssociationMembership": "Adhésion", "adminAssociationMembershipName": "Nom de l'adhésion", + "adminAssociationMembershipsManagement": "Gestion des adhésions", + "adminAssociationName": "Nom de l'association", + "adminAssociations": "Associations", "adminAssociationsMemberships": "Adhésions", + "adminAssociationUpdated": "Association mise à jour", + "adminAssociationUpdateError": "Échec de la mise à jour de l'association", "adminBankAccountHolder": "Titulaire du compte bancaire : {bankAccountHolder}", "@adminBankAccountHolder": { "description": "Displays the bank account holder's name", @@ -114,8 +41,12 @@ "adminBankDetails": "Coordonnées bancaires", "adminBic": "BIC", "adminBicError": "Le BIC doit faire 11 caractères", + "adminChooseAssociationManagerGroup": "Choisir un groupe gestionnaire pour l'association", + "adminChooseGroup": "Choisir un groupe", + "adminChooseGroupManager": "Groupe gestionnaire de l'adhésion", "adminCity": "Ville", "adminClearFilters": "Effacer les filtres", + "adminContent": "Contenu", "adminCountry": "Pays", "adminCreateAssociationMembership": "Créer une adhésion", "adminCreatedAssociationMembership": "Adhésion créée", @@ -127,149 +58,137 @@ "adminDeleteAssociationMemberConfirmation": "Êtes-vous sûr de vouloir supprimer ce membre ?", "adminDeleteAssociationMembership": "Supprimer l'adhésion ?", "adminDeletedAssociationMembership": "Adhésion supprimée", - "adminDeleteGroup": "Supprimer le groupe", "adminDeletedGroup": "Groupe supprimé", - "adminDeleteSchool": "Supprimer l'école ?", "adminDeletedSchool": "École supprimée", + "adminDeleteGroup": "Supprimer le groupe", + "adminDeleteGroupConfirmation": "Êtes-vous sûr de vouloir supprimer ce groupe ?", + "adminDeleteSchool": "Supprimer l'école ?", + "adminDeleteUsers": "Supprimer des utilisateurs", "adminDeleting": "Suppression", "adminDeletingError": "Erreur lors de la suppression", "adminDescription": "Description", "adminEdit": "Modifier", - "adminEditStructure": "Modifier la structure", + "adminEditAssociation": "Modifier l'association : {associationName}", + "@adminEditAssociation": { + "description": "Modifier les informations de l'association", + "placeholders": { + "associationName": { + "type": "String" + } + } + }, + "adminEditedStructure": "Structure modifiée", + "adminEditGroup": "Modifier le groupe", "adminEditMembership": "Modifier l'adhésion", - "adminEmptyDate": "Date vide", - "adminEmptyFieldError": "Le nom ne peut pas être vide", + "adminEditStructure": "Modifier la structure", "adminEmailFailed": "Impossible d'envoyer un mail aux adresses suivantes", "adminEmailRegex": "Email Regex", + "adminEmptyDate": "Date vide", + "adminEmptyFieldError": "Le nom ne peut pas être vide", "adminEmptyUser": "Utilisateur vide", "adminEndDate": "Date de fin", "adminEndDateMaximal": "Date de fin maximale", "adminEndDateMinimal": "Date de fin minimale", "adminError": "Erreur", + "adminFailedToDeleteGroup": "Échec de la suppression du groupe", + "adminFailedToInviteUsers": "Échec de l'invitation des utilisateurs", + "adminFailedToSendNotification": "Échec de l'envoi de la notification", + "adminFailedToUpdateAssociationLogo": "Échec de la mise à jour du logo de l'association", "adminFilters": "Filtres", "adminGroup": "Groupe", + "adminGroupNotification": "Notification de groupe", "adminGroups": "Groupes", + "adminGroupsManagement": "Gestion des groupes", "adminIban": "IBAN", "adminIbanError": "L'IBAN doit faire 27 caractères", + "adminImportList": "Importer une liste", + "adminImportUsersDescription": "Importer des utilisateurs depuis un fichier CSV. Le fichier CSV doit contenir une adresse email par ligne.", + "adminInvite": "Inviter", + "adminInvitedUsers": "Utilisateurs invités", + "adminInviteUsers": "Inviter des utilisateurs", + "adminInviteUsersCounter": "{count, plural, zero {Aucun utilisateur} one {{count} utilisateur} other {{count} utilisateurs}} dans le fichier CSV", + "@adminInviteUsersCounter": { + "description": "Text with the number of users in the CSV file", + "placeholders": { + "count": { + "type": "int" + } + } + }, "adminLoaningGroup": "Groupe de prêt", "adminLooking": "Recherche", + "adminManageAssociations": "Gérer les associations", + "adminManageMembers": "Gérer les membres", + "adminManagePaiementStructures": "Gérer les structures du module de paiement", "adminManager": "Administrateur de la structure", + "adminManagerGroup": "Groupe gestionnaire : {groupName}", + "@adminManagerGroup": { + "description": "Groupe qui gère l'association", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "adminManageUserGroups": "Gérer les groupes d'utilisateurs", + "adminManageUsersAssociationMemberships": "Gérer les adhésions des utilisateurs", "adminMaximum": "Maximum", "adminMembers": "Membres", "adminMembershipAddingError": "Erreur lors de l'ajout (surement dû à une superposition de dates)", "adminMemberships": "Adhésions", "adminMembershipUpdatingError": "Erreur lors de la modification (surement dû à une superposition de dates)", "adminMinimum": "Minimum", - "adminModifyModuleVisibility": "Visibilité des modules", + "adminModifyPermissions": "Modifier les permissions", "adminName": "Nom", "adminNoGroup": "Aucun groupe", "adminNoManager": "Aucun manager n'est sélectionné", "adminNoMember": "Aucun membre", "adminNoMoreLoaner": "Aucun prêteur n'est disponible", "adminNoSchool": "Sans école", + "adminNotificationSent": "Notification envoyée", + "adminNotifyGroup": "Notifier le groupe {groupName}", + "@adminNotifyGroup": { + "description": "Notifie les membres du groupe sélectionné", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "adminPaiement": "Paiement", + "adminPaiementModule": "Module de paiement", "adminRemoveGroupMember": "Supprimer le membre du groupe ?", "adminResearch": "Recherche", "adminSchools": "Écoles", + "adminSelectGroupAssociationManager": "Séléctionner roupe gestionnaire de l'association", + "adminSelectManager": "Sélectionner un gestionnaire", + "adminSend": "Envoyer", + "adminSendNotificationToGroup": "Envoyer une notification à un groupe", "adminShortId": "Short ID (3 lettres)", "adminShortIdError": "Le short ID doit faire 3 caractères", "adminSiegeAddress": "Adresse du siège", "adminSiret": "SIRET", "adminSiretError": "SIRET must be 14 digits", - "adminStreet": "Numéro et rue", - "adminStructures": "Structures", "adminStartDate": "Date de début", "adminStartDateMaximal": "Date de début maximale", "adminStartDateMinimal": "Date de début minimale", + "adminStreet": "Numéro et rue", + "adminStructures": "Structures", + "adminTitle": "Titre", + "adminTooHeavyLogo": "Le logo de l'association est trop lourd, il doit faire moins de 4 Mo", "adminUndefinedBankAccountHolder": "Titulaire du compte bancaire non défini", + "adminUpdatedAssociationLogo": "Logo de l'association mis à jour", "adminUpdatedAssociationMembership": "Adhésion modifiée", "adminUpdatedGroup": "Groupe modifié", "adminUpdatedMembership": "Adhésion modifiée", "adminUpdatingError": "Erreur lors de la modification", "adminUser": "Utilisateur", - "adminValidateFilters": "Valider les filtres", - "adminVisibilities": "Visibilités", - "adminZipcode": "Code postal", - "adminGroupNotification": "Notification de groupe", - "adminNotifyGroup": "Notifier le groupe {groupName}", - "@adminNotifyGroup": { - "description": "Notifie les membres du groupe sélectionné", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "adminTitle": "Titre", - "adminContent": "Contenu", - "adminSend": "Envoyer", - "adminNotificationSent": "Notification envoyée", - "adminFailedToSendNotification": "Échec de l'envoi de la notification", - "adminGroupsManagement": "Gestion des groupes", - "adminEditGroup": "Modifier le groupe", - "adminManageMembers": "Gérer les membres", - "adminDeleteGroupConfirmation": "Êtes-vous sûr de vouloir supprimer ce groupe ?", - "adminFailedToDeleteGroup": "Échec de la suppression du groupe", "adminUsersAndGroups": "Utilisateurs et groupes", "adminUsersManagement": "Gestion des utilisateurs", "adminUsersManagementDescription": "Gérer les utilisateurs de l'application", - "adminManageUserGroups": "Gérer les groupes d'utilisateurs", - "adminSendNotificationToGroup": "Envoyer une notification à un groupe", - "adminPaiementModule": "Module de paiement", - "adminPaiement": "Paiement", - "adminManagePaiementStructures": "Gérer les structures du module de paiement", - "adminManageUsersAssociationMemberships": "Gérer les adhésions des utilisateurs", - "adminAssociationMembershipsManagement": "Gestion des adhésions", - "adminChooseGroupManager": "Groupe gestionnaire de l'adhésion", - "adminSelectManager": "Sélectionner un gestionnaire", - "adminImportList": "Importer une liste", - "adminImportUsersDescription": "Importer des utilisateurs depuis un fichier CSV. Le fichier CSV doit contenir une adresse email par ligne.", - "adminFailedToInviteUsers": "Échec de l'invitation des utilisateurs", - "adminDeleteUsers": "Supprimer des utilisateurs", - "adminAdmin": "Admin", - "adminAssociations": "Associations", - "adminManageAssociations": "Gérer les associations", - "adminAddAssociation": "Ajouter une association", - "adminAssociationName": "Nom de l'association", - "adminSelectGroupAssociationManager": "Séléctionner roupe gestionnaire de l'association", - "adminEditAssociation": "Modifier l'association : {associationName}", - "@adminEditAssociation": { - "description": "Modifier les informations de l'association", - "placeholders": { - "associationName": { - "type": "String" - } - } - }, - "adminManagerGroup": "Groupe gestionnaire : {groupName}", - "@adminManagerGroup": { - "description": "Groupe qui gère l'association", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "adminAssociationCreated": "Association créée", - "adminAssociationUpdated": "Association mise à jour", - "adminAssociationCreationError": "Échec de la création de l'association", - "adminAssociationUpdateError": "Échec de la mise à jour de l'association", - "adminInvite": "Inviter", - "adminInvitedUsers": "Utilisateurs invités", - "adminInviteUsers": "Inviter des utilisateurs", - "adminInviteUsersCounter": "{count, plural, zero {Aucun utilisateur} one {{count} utilisateur} other {{count} utilisateurs}} dans le fichier CSV", - "@adminInviteUsersCounter": { - "description": "Text with the number of users in the CSV file", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "adminUpdatedAssociationLogo": "Logo de l'association mis à jour", - "adminTooHeavyLogo": "Le logo de l'association est trop lourd, il doit faire moins de 4 Mo", - "adminFailedToUpdateAssociationLogo": "Échec de la mise à jour du logo de l'association", - "adminChooseGroup": "Choisir un groupe", - "adminChooseAssociationManagerGroup": "Choisir un groupe gestionnaire pour l'association", + "adminValidateFilters": "Valider les filtres", + "adminVisibilities": "Visibilités", + "adminZipcode": "Code postal", "advertAdd": "Ajouter", "advertAddedAdvert": "Annonce publiée", "advertAddedAnnouncer": "Annonceur ajouté", @@ -290,27 +209,27 @@ "advertInvalidNumber": "Veuillez entrer un nombre", "advertManagement": "Gestion", "advertModifyAnnouncingGroup": "Modifier un groupe d'annonce", + "advertMonthApr": "Avr.", + "advertMonthAug": "Août", + "advertMonthDec": "Déc.", + "advertMonthFeb": "Févr.", + "advertMonthJan": "Janv", + "advertMonthJul": "Juill.", + "advertMonthJun": "Juin", + "advertMonthMar": "Mars", + "advertMonthMay": "Mai", + "advertMonthNov": "Nov.", + "advertMonthOct": "Oct.", + "advertMonthSep": "Sept.", "advertNoMoreAnnouncer": "Aucun annonceur n'est disponible", + "advertNotification": "Envoyer une notification", "advertNoValue": "Veuillez entrer une valeur", "advertPositiveNumber": "Veuillez entrer un nombre positif", "advertPublishToFeed": "Publier dans le feed", - "advertNotification": "Envoyer une notification", "advertRemovedAnnouncer": "Annonceur supprimé", "advertRemovingError": "Erreur lors de la suppression", "advertTags": "Tags", "advertTitle": "Titre", - "advertMonthJan": "Janv", - "advertMonthFeb": "Févr.", - "advertMonthMar": "Mars", - "advertMonthApr": "Avr.", - "advertMonthMay": "Mai", - "advertMonthJun": "Juin", - "advertMonthJul": "Juill.", - "advertMonthAug": "Août", - "advertMonthSep": "Sept.", - "advertMonthOct": "Oct.", - "advertMonthNov": "Nov.", - "advertMonthDec": "Déc.", "amapAccounts": "Comptes", "amapAdd": "Ajouter", "amapAddDelivery": "Ajouter une livraison", @@ -318,13 +237,13 @@ "amapAddedOrder": "Commande ajoutée", "amapAddedProduct": "Produit ajouté", "amapAddedUser": "Utilisateur ajouté", - "amapAddProduct": "Ajouter un produit", - "amapAddUser": "Ajouter un utilisateur", "amapAddingACommand": "Ajouter une commande", "amapAddingCommand": "Ajouter la commande", "amapAddingError": "Erreur lors de l'ajout", "amapAddingProduct": "Ajouter un produit", "amapAddOrder": "Ajouter une commande", + "amapAddProduct": "Ajouter un produit", + "amapAddUser": "Ajouter un utilisateur", "amapAdmin": "Admin", "amapAlreadyExistCommand": "Il existe déjà une commande à cette date", "amapAmap": "Amap", @@ -335,14 +254,15 @@ "amapCategory": "Catégorie", "amapCloseDelivery": "Verrouiller", "amapCommandDate": "Date de la commande", + "amapCommandName": "Nom de la commande", "amapCommandProducts": "Produits de la commande", "amapConfirm": "Confirmer", "amapContact": "Contacts associatifs ", "amapCreateCategory": "Créer une catégorie", "amapDelete": "Supprimer", + "amapDeletedDelivery": "Livraison supprimée", "amapDeleteDelivery": "Supprimer la livraison ?", "amapDeleteDeliveryDescription": "Voulez-vous vraiment supprimer cette livraison ?", - "amapDeletedDelivery": "Livraison supprimée", "amapDeletedOrder": "Commande supprimée", "amapDeletedProduct": "Produit supprimé", "amapDeleteProduct": "Supprimer le produit ?", @@ -362,12 +282,12 @@ "amapDeliveryHistory": "Historique des livraisons", "amapDeliveryList": "Liste des livraisons", "amapDeliveryLocked": "Livraison verrouillée", - "amapDeliveryOn": "Livraison le", - "amapDeliveryOpened": "Livraison ouverte", "amapDeliveryNotArchived": "Livraison non archivée", - "amapDeliveryNotLocked": "Livraison non verrouillée", "amapDeliveryNotDelivered": "Livraison non effectuée", + "amapDeliveryNotLocked": "Livraison non verrouillée", "amapDeliveryNotOpened": "Livraison non ouverte", + "amapDeliveryOn": "Livraison le", + "amapDeliveryOpened": "Livraison ouverte", "amapEditDelivery": "Modifier la livraison", "amapEditedCommand": "Commande modifiée", "amapEditingError": "Erreur lors de la modification", @@ -380,23 +300,24 @@ "amapExpectingNumber": "Veuillez entrer un nombre", "amapFillField": "Veuillez remplir ce champ", "amapHandlingAccount": "Gérer les comptes", + "amapIncorrectlyFilledForm": "Formulaire incorrectement rempli", "amapLoading": "Chargement...", "amapLoadingError": "Erreur lors du chargement", "amapLock": "Verrouiller", "amapLocked": "Verrouillée", "amapLockedDelivery": "Livraison verrouillée", "amapLockedOrder": "Commande verrouillée", - "amapLooking": "Rechercher", "amapLockingDelivery": "Verrouiller la livraison ?", + "amapLooking": "Rechercher", "amapMidDay": "Midi", "amapMyOrders": "Mes commandes", "amapName": "Nom", "amapNextStep": "Étape suivante", - "amapNoProduct": "Pas de produit", "amapNoCurrentOrder": "Pas de commande en cours", "amapNoMoney": "Pas assez d'argent", "amapNoOpennedDelivery": "Pas de livraison ouverte", "amapNoOrder": "Pas de commande", + "amapNoProduct": "Pas de produit", "amapNoSelectedDelivery": "Pas de livraison sélectionnée", "amapNotEnoughMoney": "Pas assez d'argent", "amapNotPlannedDelivery": "Pas de livraison planifiée", @@ -413,8 +334,8 @@ "amapPresentation2": "\n\nN'hésitez pas à nous contacter en cas de problème !", "amapPrice": "Prix", "amapProduct": "produit", - "amapProducts": "Produits", "amapProductInDelivery": "Produit dans une livraison non terminée", + "amapProducts": "Produits", "amapQuantity": "Quantité", "amapRequiredDate": "La date est requise", "amapSeeMore": "Voir plus", @@ -430,14 +351,14 @@ "amapUsersNotFound": "Aucun utilisateur trouvé", "amapWaiting": "En attente", "bookingAdd": "Ajouter", - "bookingAddBookingPage": "Demande", - "bookingAddRoom": "Ajouter une salle", "bookingAddBooking": "Ajouter une réservation", + "bookingAddBookingPage": "Demande", "bookingAddedBooking": "Demande ajoutée", - "bookingAddedRoom": "Salle ajoutée", "bookingAddedManager": "Gestionnaire ajouté", + "bookingAddedRoom": "Salle ajoutée", "bookingAddingError": "Erreur lors de l'ajout", "bookingAddManager": "Ajouter un gestionnaire", + "bookingAddRoom": "Ajouter une salle", "bookingAdminPage": "Administrateur", "bookingAllDay": "Toute la journée", "bookingBookedFor": "Réservé pour", @@ -457,23 +378,23 @@ "bookingDeclineBooking": "Refuser la réservation ?", "bookingDeclined": "Refusée", "bookingDelete": "Supprimer", - "bookingDeleting": "Suppression", "bookingDeleteBooking": "Suppression", "bookingDeleteBookingConfirmation": "Êtes-vous sûr de vouloir supprimer cette réservation ?", "bookingDeletedBooking": "Réservation supprimée", - "bookingDeletedRoom": "Salle supprimée", "bookingDeletedManager": "Gestionnaire supprimé", - "bookingDeleteRoomConfirmation": "Êtes-vous sûr de vouloir supprimer cette salle ?\n\nLa salle ne doit avoir aucune réservation en cours ou à venir pour être supprimée", + "bookingDeletedRoom": "Salle supprimée", "bookingDeleteManagerConfirmation": "Êtes-vous sûr de vouloir supprimer ce gestionnaire ?\n\nLe gestionnaire ne doit être associé à aucune salle pour pouvoir être supprimé", + "bookingDeleteRoomConfirmation": "Êtes-vous sûr de vouloir supprimer cette salle ?\n\nLa salle ne doit avoir aucune réservation en cours ou à venir pour être supprimée", + "bookingDeleting": "Suppression", "bookingDeletingBooking": "Supprimer la réservation ?", "bookingDeletingError": "Erreur lors de la suppression", "bookingDeletingRoom": "Supprimer la salle ?", "bookingEdit": "Modifier", "bookingEditBooking": "Modifier une réservation", - "bookingEditionError": "Erreur lors de la modification", "bookingEditedBooking": "Réservation modifiée", - "bookingEditedRoom": "Salle modifiée", "bookingEditedManager": "Gestionnaire modifié", + "bookingEditedRoom": "Salle modifiée", + "bookingEditionError": "Erreur lors de la modification", "bookingEditManager": "Modifier ou supprimer un gestionnaire", "bookingEditRoom": "Modifier ou supprimer une salle", "bookingEndDate": "Date de fin", @@ -484,8 +405,8 @@ "bookingHistoryPage": "Historique", "bookingIncorrectOrMissingFields": "Champs incorrects ou manquants", "bookingInterval": "Intervalle", - "bookingInvalidIntervalError": "Intervalle invalide", "bookingInvalidDates": "Dates invalides", + "bookingInvalidIntervalError": "Intervalle invalide", "bookingInvalidRoom": "Salle invalide", "bookingKeysRequested": "Clés demandées", "bookingManagement": "Gestion", @@ -496,17 +417,17 @@ "bookingNecessaryKey": "Clé nécessaire", "bookingNext": "Suivant", "bookingNo": "Non", + "bookingNoAppointmentInReccurence": "Aucun créneau existe avec ces paramètres de récurrence", "bookingNoCurrentBooking": "Pas de réservation en cours", "bookingNoDateError": "Veuillez choisir une date", - "bookingNoAppointmentInReccurence": "Aucun créneau existe avec ces paramètres de récurrence", "bookingNoDaySelected": "Aucun jour sélectionné", "bookingNoDescriptionError": "Veuillez entrer une description", "bookingNoKeys": "Aucune clé", "bookingNoNoteError": "Veuillez entrer une note", "bookingNoPhoneRegistered": "Numéro non renseigné", "bookingNoReasonError": "Veuillez entrer un motif", - "bookingNoRoomFoundError": "Aucune salle enregistrée", "bookingNoRoomFound": "Aucune salle trouvée", + "bookingNoRoomFoundError": "Aucune salle enregistrée", "bookingNote": "Note", "bookingOther": "Autre", "bookingPending": "En attente", @@ -521,15 +442,15 @@ "bookingRoomName": "Nom de la salle", "bookingStartDate": "Date de début", "bookingStartHour": "Heure de début", - "bookingWeeks": "Semaines", - "bookingYes": "Oui", - "bookingWeekDayMon": "Lundi", - "bookingWeekDayTue": "Mardi", - "bookingWeekDayWed": "Mercredi", - "bookingWeekDayThu": "Jeudi", "bookingWeekDayFri": "Vendredi", + "bookingWeekDayMon": "Lundi", "bookingWeekDaySat": "Samedi", "bookingWeekDaySun": "Dimanche", + "bookingWeekDayThu": "Jeudi", + "bookingWeekDayTue": "Mardi", + "bookingWeekDayWed": "Mercredi", + "bookingWeeks": "Semaines", + "bookingYes": "Oui", "cinemaAdd": "Ajouter", "cinemaAddedSession": "Séance ajoutée", "cinemaAddingError": "Erreur lors de l'ajout", @@ -543,11 +464,11 @@ "cinemaEditingError": "Erreur lors de la modification", "cinemaEditSession": "Modifier la séance", "cinemaEmptyUrl": "Veuillez entrer une URL", + "cinemaGenre": "Genre", "cinemaImportFromTMDB": "Importer depuis TMDB", "cinemaIncomingSession": "A l'affiche", "cinemaIncorrectOrMissingFields": "Champs incorrects ou manquants", "cinemaInvalidUrl": "URL invalide", - "cinemaGenre": "Genre", "cinemaName": "Nom", "cinemaNoDateError": "Veuillez entrer une date", "cinemaNoDuration": "Veuillez entrer une durée", @@ -560,6 +481,16 @@ "cinemaStartHour": "Heure de début", "cinemaTagline": "Slogan", "cinemaThe": "Le", + "dateAt": "à", + "dateBetweenDays": "au", + "dateFrom": "de", + "dateLast": "", + "dateStarting": "Commence", + "dateTo": "à", + "dateToday": "Aujourd'hui", + "dateTomorrow": "Demain", + "dateUntil": "Jusqu'au", + "dateYesterday": "Hier", "drawerAdmin": "Administration", "drawerAndroidAppLink": "https://play.google.com/store/apps/details?id=fr.myecl.titan", "drawerCopied": "Copié !", @@ -569,19 +500,34 @@ "drawerLogOut": "Déconnexion", "drawerOr": " ou ", "drawerSettings": "Paramètres", + "eventActionCampaign": "Tu peux voter", + "eventActionCampaignButton": "Voter", + "eventActionCampaignSubtitle": "Votez maintenant", + "eventActionCampaignValidated": "J'ai voté !", + "eventActionEvent": "Tu es invité", + "eventActionEventButton": "Réserver", + "eventActionEventSubtitle": "Répondez à l'invitation", + "eventActionEventValidated": "Je viens !", "eventAdd": "Ajouter", - "eventAddEvent": "Ajouter un événement", "eventAddedEvent": "Événement ajouté", + "eventAddEvent": "Ajouter un événement", "eventAddingError": "Erreur lors de l'ajout", "eventAllDay": "Toute la journée", "eventConfirm": "Confirmer", - "eventConfirmEvent": "Confirmer l'événement ?", "eventConfirmation": "Confirmation", "eventConfirmed": "Confirmé", + "eventConfirmEvent": "Confirmer l'événement ?", "eventDates": "Dates", + "eventDayFri": "Vendredi", + "eventDayMon": "Lundi", + "eventDaySat": "Samedi", + "eventDaySun": "Dimanche", + "eventDayThu": "Jeudi", + "eventDayTue": "Mardi", + "eventDayWed": "Mercredi", "eventDecline": "Refuser", - "eventDeclineEvent": "Refuser l'événement ?", "eventDeclined": "Refusé", + "eventDeclineEvent": "Refuser l'événement ?", "eventDelete": "Supprimer", "eventDeleteConfirm": "Supprimer l'event {name} ?", "@eventDeleteConfirm": { @@ -598,12 +544,13 @@ "eventDeletingEvent": "Supprimer l'événement ?", "eventDescription": "Description", "eventEdit": "Modifier", - "eventEditEvent": "Modifier un événement", "eventEditedEvent": "Événement modifié", + "eventEditEvent": "Modifier un événement", "eventEditingError": "Erreur lors de la modification", "eventEndDate": "Date de fin", "eventEndHour": "Heure de fin", "eventError": "Erreur", + "eventEventEvery": "Toutes les", "eventEventList": "Liste des événements", "eventEventType": "Type d'événement", "eventEvery": "Tous les", @@ -626,8 +573,8 @@ "eventNoEvent": "Aucun événement", "eventNoNameError": "Veuillez entrer un nom", "eventNoOrganizerError": "Veuillez entrer un organisateur", - "eventNoPlaceError": "Veuillez entrer un lieu", "eventNoPhoneRegistered": "Numéro non renseigné", + "eventNoPlaceError": "Veuillez entrer un lieu", "eventNoRuleError": "Veuillez entrer une règle de récurrence", "eventOrganizer": "Organisateur", "eventOther": "Autre", @@ -641,18 +588,74 @@ "eventStartDate": "Date de début", "eventStartHour": "Heure de début", "eventTitle": "Événements", - "eventYes": "Oui", - "eventEventEvery": "Toutes les", "eventWeeks": "semaines", - "eventDayMon": "Lundi", - "eventDayTue": "Mardi", - "eventDayWed": "Mercredi", - "eventDayThu": "Jeudi", - "eventDayFri": "Vendredi", - "eventDaySat": "Samedi", - "eventDaySun": "Dimanche", - "globalConfirm": "Confirmer", + "eventYes": "Oui", + "feedAdmin": "Administration", + "feedApply": "Appliquer", + "feedApprove": "Approuver", + "feedAssociation": "Association", + "feedAssociationEvent": "Event de {name}", + "@feedAssociationEvent": { + "description": "Association event", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "feedCantOpenLink": "Impossible d'ouvrir le lien", + "feedCreateAnEvent": "Créer un événement", + "feedCreateEvent": "Créer l'événement", + "feedEditEvent": "Modifier l'événement", + "feedEmptyAll": "Aucun événement disponible", + "feedEmptyApproved": "Aucun événement approuvé", + "feedEmptyPending": "Aucun événement en attente de validation", + "feedEmptyRejected": "Aucun événement rejeté", + "feedEnded": "Terminé", + "feedEventManagement": "Gestion des événements", + "feedFilter": "Filtrer", + "feedFilterAll": "Tous", + "feedFilterApproved": "Approuvés", + "feedFilterPending": "En attente", + "feedFilterRejected": "Rejetés", + "feedGetReady": "Prépare-toi !", + "feedLocation": "Lieu", + "feedManageAssociationEvents": "Gérer les événements de l'association", + "feedManageRequests": "Demandes de publication", + "feedNews": "Calendrier", + "feedNewsType": "Type d'actualité", + "feedNoAssociationEvents": "Aucun événement d'association", + "feedNoNewsAvailable": "Aucune actualité disponible", + "feedNotification": "Envoyer une notification", + "feedOngoing": "En cours", + "feedPleaseProvideASGDate": "Veuillez entrer une date de SG", + "feedPleaseProvideASGExternalLink": "Veuillez entrer un lien externe pour le SG", + "feedPleaseSelectAnAssociation": "Veuillez sélectionner une association", + "feedRefresh": "Actualiser", + "feedReject": "Rejeter", + "feedSGDate": "Date du SG", + "feedSGExternalLink": "Lien externe du SG", + "feedShotgunIn": "Shotgun {time}", + "@feedShotgunIn": { + "description": "Placeholder pour le temps restant avant le shotgun", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "feedTitle": "Titre", + "feedVoteIn": "Vote {time}", + "@feedVoteIn": { + "description": "Temps restant avant le vote", + "placeholders": { + "time": { + "type": "String" + } + } + }, "globalCancel": "Annuler", + "globalConfirm": "Confirmer", "globalIrreversibleAction": "Cette action est irréversible", "globalOptionnal": "{text} (Optionnel)", "@globalOptionnal": { @@ -668,49 +671,49 @@ "homeIncomingEvents": "Évènements à venir", "homeLastInfos": "Dernières annonces", "homeNoEvents": "Aucun évènement", - "homeTranslateDayShortMon": "Lun", - "homeTranslateDayShortTue": "Mar", - "homeTranslateDayShortWed": "Mer", - "homeTranslateDayShortThu": "Jeu", "homeTranslateDayShortFri": "Ven", + "homeTranslateDayShortMon": "Lun", "homeTranslateDayShortSat": "Sam", "homeTranslateDayShortSun": "Dim", + "homeTranslateDayShortThu": "Jeu", + "homeTranslateDayShortTue": "Mar", + "homeTranslateDayShortWed": "Mer", "loanAdd": "Ajouter", - "loanAddLoan": "Ajouter un prêt", - "loanAddObject": "Ajouter un objet", "loanAddedLoan": "Prêt ajouté", "loanAddedObject": "Objet ajouté", "loanAddedRoom": "Salle ajoutée", "loanAddingError": "Erreur lors de l'ajout", + "loanAddLoan": "Ajouter un prêt", + "loanAddObject": "Ajouter un objet", "loanAdmin": "Administrateur", - "loanAvailable": "Disponible", - "loanAvailableMultiple": "Disponibles", - "loanBorrowed": "Emprunté", - "loanBorrowedMultiple": "Empruntés", "loanAnd": "et", "loanAssociation": "Association", + "loanAvailable": "Disponible", "loanAvailableItems": "Objets disponibles", + "loanAvailableMultiple": "Disponibles", "loanBeginDate": "Date du début du prêt", + "loanBorrowed": "Emprunté", + "loanBorrowedMultiple": "Empruntés", "loanBorrower": "Emprunteur", - "loanCaution": "Caution", "loanCancel": "Annuler", + "loanCaution": "Caution", "loanConfirm": "Confirmer", "loanConfirmation": "Confirmation", "loanDates": "Dates", "loanDays": "Jours", "loanDelay": "Délai de la prolongation", "loanDelete": "Supprimer", - "loanDeletingLoan": "Supprimer le prêt ?", "loanDeletedItem": "Objet supprimé", "loanDeletedLoan": "Prêt supprimé", "loanDeleting": "Suppression", "loanDeletingError": "Erreur lors de la suppression", "loanDeletingItem": "Supprimer l'objet ?", + "loanDeletingLoan": "Supprimer le prêt ?", "loanDuration": "Durée", "loanEdit": "Modifier", + "loanEditedRoom": "Salle modifiée", "loanEditItem": "Modifier l'objet", "loanEditLoan": "Modifier le prêt", - "loanEditedRoom": "Salle modifiée", "loanEndDate": "Date de fin du prêt", "loanEnded": "Terminé", "loanEnterDate": "Veuillez entrer une date", @@ -718,11 +721,11 @@ "loanExtendingError": "Erreur lors de la prolongation", "loanHistory": "Historique", "loanIncorrectOrMissingFields": "Des champs sont manquants ou incorrects", - "loanInvalidNumber": "Veuillez entrer un nombre", "loanInvalidDates": "Les dates ne sont pas valides", + "loanInvalidNumber": "Veuillez entrer un nombre", "loanItem": "Objet", - "loanItems": "Objets", "loanItemHandling": "Gestion des objets", + "loanItems": "Objets", "loanItemSelected": "objet sélectionné", "loanItemsSelected": "objets sélectionnés", "loanLendingDuration": "Durée possible du prêt", @@ -738,9 +741,8 @@ "loanNoItems": "Aucun objet", "loanNoItemSelected": "Aucun objet sélectionné", "loanNoLoan": "Aucun prêt", - "loanNoReturnedDate": "Pas de date de retour", - "loanQuantity": "Quantité", "loanNone": "Aucun", + "loanNoReturnedDate": "Pas de date de retour", "loanNote": "Note", "loanNoValue": "Veuillez entrer une valeur", "loanOnGoing": "En cours", @@ -749,6 +751,7 @@ "loanPaidCaution": "Caution payée", "loanPositiveNumber": "Veuillez entrer un nombre positif", "loanPrevious": "Précédent", + "loanQuantity": "Quantité", "loanReturned": "Rendu", "loanReturnedLoan": "Prêt rendu", "loanReturningError": "Erreur lors du retour", @@ -762,6 +765,7 @@ "loanUpdatedLoan": "Prêt modifié", "loanUpdatingError": "Erreur lors de la modification", "loanYes": "Oui", + "@@locale": "fr", "loginAppName": "MyECL", "loginCreateAccount": "Créer un compte", "loginForgotPassword": "Mot de passe oublié ?", @@ -772,24 +776,76 @@ "loginMaterialLoans": "Gestion des prêts de matériel", "loginNewTermsElections": "L'élection des nouveaux mandats", "loginRaffles": "Tombolas", - "loginSignIn": "Se connecter", "loginRegister": "S'inscrire", "loginShortDescription": "L'application de l'associatif", + "loginSignIn": "Se connecter", "loginUpcomingEvents": "Les évènements à venir", "loginUpcomingScreenings": "Les prochaines séances", - "othersCheckInternetConnection": "Veuillez vérifier votre connexion internet", - "othersRetry": "Réessayer", - "othersTooOldVersion": "Votre version de l'application est trop ancienne.\n\nVeuillez mettre à jour l'application.", - "othersUnableToConnectToServer": "Impossible de se connecter au serveur", - "othersVersion": "Version", - "othersNoModule": "Aucun module disponible, veuillez réessayer ultérieurement 😢😢", + "moduleAdmin": "Admin", + "moduleAdminDescription": "Gérer les utilisateurs, groupes et structures", + "moduleAdvert": "Feed", + "moduleAdvertDescription": "Gérer les feeds", + "moduleAmap": "AMAP", + "moduleAmapDescription": "Gérer les livraisons et les produits", + "moduleBooking": "Réservation", + "moduleBookingDescription": "Gérer les réservations, les salles et les managers", + "moduleCalendar": "Calendrier", + "moduleCalendarDescription": "Consulter les événements et les activités", + "moduleCentralisation": "Centralisation", + "moduleCentralisationDescription": "Gérer la centralisation des données", + "moduleCinema": "Cinéma", + "moduleCinemaDescription": "Gérer les séances de cinéma", + "moduleEvent": "Événement", + "moduleEventDescription": "Gérer les événements et les participants", + "moduleFeed": "Events", + "moduleFeedDescription": "Consulter les événements", + "moduleFlappyBird": "Flappy Bird", + "moduleFlappyBirdDescription": "Jouer à Flappy Bird et consulter le classement", + "moduleLoan": "Prêt", + "moduleLoanDescription": "Gérer les prêts et les articles", + "moduleOthers": "Autres", + "moduleOthersDescription": "Afficher les autres modules", + "modulePayment": "Paiement", + "modulePaymentDescription": "Gérer les paiements, les statistiques et les appareils", + "modulePh": "PH", + "modulePhDescription": "Gérer les PH, les formulaires et les administrateurs", + "modulePhonebook": "Annuaire", + "modulePhonebookDescription": "Gérer les associations, les membres et les administrateurs", + "modulePurchases": "Achats", + "modulePurchasesDescription": "Gérer les achats, les tickets et l'historique", + "moduleRaffle": "Tombola", + "moduleRaffleDescription": "Gérer les tombolas, les prix et les tickets", + "moduleRecommendation": "Bons plans", + "moduleRecommendationDescription": "Gérer les recommandations, les informations et les administrateurs", + "moduleSeedLibrary": "Grainothèque", + "moduleSeedLibraryDescription": "Gérer les graines, les espèces et les stocks", + "moduleSettings": "Paramètres", + "moduleSettingsDescription": "Gérer les paramètres de l'application", + "moduleStyleGuide": "StyleGuide", + "moduleStyleGuideDescription": "Explore the UI components and styles used in Titan", + "moduleVote": "Vote", + "moduleVoteDescription": "Gérer les votes, les sections et les candidats", "othersAdmin": "Admin", + "othersCheckInternetConnection": "Veuillez vérifier votre connexion internet", "othersError": "Une erreur est survenue", - "othersNoValue": "Veuillez entrer une valeur", + "othersImageError": "Erreur lors de l'ajout de l'image", + "othersImageSizeTooBig": "La taille de l'image ne doit pas dépasser 4 Mio", "othersInvalidNumber": "Veuillez entrer un nombre", "othersNoDateError": "Veuillez entrer une date", - "othersImageSizeTooBig": "La taille de l'image ne doit pas dépasser 4 Mio", - "othersImageError": "Erreur lors de l'ajout de l'image", + "othersNoModule": "Aucun module disponible, veuillez réessayer ultérieurement 😢😢", + "othersNoValue": "Veuillez entrer une valeur", + "othersRetry": "Réessayer", + "othersTooOldVersion": "Votre version de l'application est trop ancienne.\n\nVeuillez mettre à jour l'application.", + "othersUnableToConnectToServer": "Impossible de se connecter au serveur : {url}", + "@othersUnableToConnectToServer": { + "description": "Message when the app can't connect to the server with the url of the server", + "placeholders": { + "url": { + "type": "String" + } + } + }, + "othersVersion": "Version", "paiementAccept": "Accepter", "paiementAccessPage": "Accéder à la page", "paiementAdd": "Ajouter", @@ -830,10 +886,10 @@ "paiementDeleteInvoice": "Supprimer la facture", "paiementDeleteSeller": "Supprimer le vendeur", "paiementDeleteSellerDescription": "Voulez-vous vraiment supprimer ce vendeur ?", - "paiementDeleteSuccessfully": "Supprimé avec succès", "paiementDeleteStore": "Supprimer le magasin", "paiementDeleteStoreDescription": "Voulez-vous vraiment supprimer ce magasin ?", "paiementDeleteStoreError": "Impossible de supprimer le magasin", + "paiementDeleteSuccessfully": "Supprimé avec succès", "paiementDeletingSellerError": "Erreur lors de la suppression du vendeur", "paiementDeviceActivationReceived": "La demande d'activation est prise en compte, veuilliez consulter votre boite mail pour finaliser la démarche", "paiementDeviceNotActivated": "Appareil non activé", @@ -947,6 +1003,9 @@ "paiementStats": "Stats", "paiementStoreBalance": "Solde du magasin", "paiementStoreDeleted": "Magasin supprimée", + "paiementStoreName": "Nom du magasin", + "paiementStores": "Magasins", + "paiementStructureAdmin": "Administrateur de la structure", "paiementStructureManagement": "Gestion de {structure}", "@paiementStructureManagement": { "description": "Gestion de la structure", @@ -956,9 +1015,6 @@ } } }, - "paiementStoreName": "Nom du magasin", - "paiementStores": "Magasins", - "paiementStructureAdmin": "Administrateur de la structure", "paiementSuccededTransaction": "Paiement réussi", "paiementSuccessfullyAddedStore": "Magasin ajoutée avec succès", "paiementSuccessfullyModifiedStore": "Magasin modifiée avec succès", @@ -978,25 +1034,21 @@ "paiementUnknownDevice": "Appareil inconnu", "paiementValidUntil": "Valide jusqu'à", "paiementYouAreTransferingStructureTo": "Vous êtes sur le point de transférer la structure à ", + "phAdd": "Ajouter", + "phAdded": "Ajouté", + "phAddingFileError": "Erreur d'ajout", "phAddNewJournal": "Ajouter un nouveau journal", - "phNameField": "Nom : ", - "phDateField": "Date : ", - "phDelete": "Voulez-vous vraiment supprimer ce journal ?", - "phIrreversibleAction": "Cette action est irréversible", - "phToHeavyFile": "Fichier trop volumineux", "phAddPdfFile": "Ajouter un fichier PDF", - "phEditPdfFile": "Modifier le fichier PDF", - "phPhName": "Nom du PH", "phDate": "Date", - "phAdded": "Ajouté", + "phDateField": "Date : ", + "phDelete": "Voulez-vous vraiment supprimer ce journal ?", + "phEdit": "Modifier", "phEdited": "Modifié", - "phAddingFileError": "Erreur d'ajout", + "phEditPdfFile": "Modifier le fichier PDF", + "phIrreversibleAction": "Cette action est irréversible", "phMissingInformatonsOrPdf": "Informations manquantes ou fichier PDF manquant", - "phAdd": "Ajouter", - "phEdit": "Modifier", - "phSeePreviousJournal": "Voir les anciens journaux", + "phNameField": "Nom : ", "phNoJournalInDatabase": "Pas encore de PH dans la base de donnée", - "phSuccesDowloading": "Téléchargé avec succès", "phonebookAdd": "Ajouter", "phonebookAddAssociation": "Ajouter une association", "phonebookAddAssociationGroupement": "Ajouter un groupement d'association", @@ -1015,6 +1067,7 @@ "phonebookAssociationName": "Nom de l'association", "phonebookAssociations": "Associations", "phonebookCancel": "Annuler", + "phonebookChangeTermConfirm": "Êtes-vous sûr de vouloir changer tout le mandat ?\nCette action est irréversible !", "phonebookChangeTermYear": "Passer au mandat {year}", "@phonebookChangeTermYear": { "description": "Permet de changer le mandat d'une association", @@ -1024,7 +1077,6 @@ } } }, - "phonebookChangeTermConfirm": "Êtes-vous sûr de vouloir changer tout le mandat ?\nCette action est irréversible !", "phonebookClose": "Fermer", "phonebookConfirm": "Confirmer", "phonebookCopied": "Copié dans le presse-papier", @@ -1040,10 +1092,14 @@ } } }, + "phonebookDeactivating": "Désactiver l'association ?", "phonebookDeactivatingError": "Erreur lors de la désactivation", - "phonebookDetail": "Détail :", "phonebookDelete": "Supprimer", "phonebookDeleteAssociation": "Supprimer l'association", + "phonebookDeleteAssociationDescription": "Ceci va supprimer l'historique de l'association", + "phonebookDeletedAssociation": "Association supprimée", + "phonebookDeletedMember": "Membre supprimé", + "phonebookDeleteRole": "Supprimer le rôle", "phonebookDeleteSelectedAssociation": "Supprimer l'association {association} ?", "@phonebookDeleteSelectedAssociation": { "description": "Permet de supprimer une association", @@ -1053,10 +1109,6 @@ } } }, - "phonebookDeleteAssociationDescription": "Ceci va supprimer l'historique de l'association", - "phonebookDeletedAssociation": "Association supprimée", - "phonebookDeletedMember": "Membre supprimé", - "phonebookDeleteRole": "Supprimer le rôle", "phonebookDeleteUserRole": "Supprimer le rôle de l'utilisateur {name} ?", "@phonebookDeleteUserRole": { "description": "Permet de supprimer le rôle d'un utilisateur dans une association", @@ -1066,17 +1118,17 @@ } } }, - "phonebookDeactivating": "Désactiver l'association ?", "phonebookDeleting": "Suppression", "phonebookDeletingError": "Erreur lors de la suppression", "phonebookDescription": "Description", + "phonebookDetail": "Détail :", "phonebookEdit": "Modifier", "phonebookEditAssociationGroupement": "Modifier le groupement d'association", "phonebookEditAssociationGroups": "Gérer les groupes", "phonebookEditAssociationInfo": "Modifier", "phonebookEditAssociationMembers": "Gérer les membres", - "phonebookEditRole": "Modifier le rôle", "phonebookEditMembership": "Modifier le rôle", + "phonebookEditRole": "Modifier le rôle", "phonebookEmail": "Email :", "phonebookEmailCopied": "Email copié dans le presse-papier", "phonebookEmptyApparentName": "Veuillez entrer un nom de role", @@ -1108,16 +1160,6 @@ } } }, - "phonebookTerm": "Mandat {year}", - "@phonebookTerm": { - "description": "Année de mandat d'une association", - "placeholders": { - "year": { - "type": "int" - } - } - }, - "phonebookTermChangingError": "Erreur lors du changement de mandat", "phonebookMember": "Membre", "phonebookMemberReordered": "Membre réordonné", "phonebookMembers": "Gérer les membres de {association}", @@ -1174,138 +1216,153 @@ "phonebookResearch": "Rechercher", "phonebookRolePure": "Rôle", "phonebookSearchUser": "Rechercher un utilisateur", + "phonebookSelectManagerGroup": "Sélectionner le groupe de managers", + "phonebookTerm": "Mandat {year}", + "@phonebookTerm": { + "description": "Année de mandat d'une association", + "placeholders": { + "year": { + "type": "int" + } + } + }, + "phonebookTermChangingError": "Erreur lors du changement de mandat", "phonebookTooHeavyAssociationPicture": "L'image est trop lourde (max 4Mo)", - "phonebookUpdateGroups": "Mettre à jour les groupes", "phonebookUpdatedAssociation": "Association modifiée", "phonebookUpdatedAssociationPicture": "La photo d'association a été changée", "phonebookUpdatedGroups": "Groupes mis à jour", "phonebookUpdatedMember": "Membre modifié", + "phonebookUpdateGroups": "Mettre à jour les groupes", "phonebookUpdatingError": "Erreur lors de la modification", "phonebookValidation": "Valider", - "purchasesPurchases": "Achats", - "purchasesResearch": "Rechercher", + "phPhName": "Nom du PH", + "phSeePreviousJournal": "Voir les anciens journaux", + "phSuccesDowloading": "Téléchargé avec succès", + "phToHeavyFile": "Fichier trop volumineux", + "purchasesAlreadyUsed": "Déjà utilisé", + "purchasesCancel": "Annuler", + "purchasesHistory": "Historique", + "purchasesLeftScan": "Scans restants", + "purchasesLoading": "En attente de scan", + "purchasesNoPurchases": "Aucun achat", "purchasesNoPurchasesFound": "Aucun achat trouvé", + "purchasesNoScannableProducts": "Aucun produit scannable", + "purchasesNoTagGiven": "Attention, aucun tag n'a été entré", "purchasesNoTickets": "Aucun ticket", - "purchasesTicketsError": "Erreur lors du chargement des tickets", - "purchasesPurchasesError": "Erreur lors du chargement des achats", - "purchasesNoPurchases": "Aucun achat", - "purchasesTimes": "fois", - "purchasesAlreadyUsed": "Déjà utilisé", "purchasesNotPaid": "Non validé", "purchasesPleaseSelectProduct": "Veuillez sélectionner un produit", + "purchasesPleaseSelectSeller": "Veuillez sélectionner un vendeur", "purchasesProducts": "Produits", - "purchasesCancel": "Annuler", - "purchasesValidate": "Valider", - "purchasesLeftScan": "Scans restants", + "purchasesPurchases": "Achats", + "purchasesPurchasesError": "Erreur lors du chargement des achats", + "purchasesResearch": "Rechercher", + "purchasesScan": "Scanner", "purchasesTag": "Tag", - "purchasesHistory": "Historique", - "purchasesPleaseSelectSeller": "Veuillez sélectionner un vendeur", - "purchasesNoTagGiven": "Attention, aucun tag n'a été entré", "purchasesTickets": "Tickets", - "purchasesNoScannableProducts": "Aucun produit scannable", - "purchasesLoading": "En attente de scan", - "purchasesScan": "Scanner", - "raffleRaffle": "Tombola", - "rafflePrize": "Lot", - "rafflePrizes": "Lots", - "raffleActualRaffles": "Tombola en cours", - "rafflePastRaffles": "Tombola passés", - "raffleYourTickets": "Tous vos tickets", - "raffleCreateMenu": "Menu de Création", - "raffleNextRaffles": "Prochaines tombolas", - "raffleNoTicket": "Vous n'avez pas de ticket", - "raffleSeeRaffleDetail": "Voir lots/tickets", - "raffleActualPrize": "Lots actuels", - "raffleMajorPrize": "Lot Majeurs", - "raffleTakeTickets": "Prendre vos tickets", - "raffleNoTicketBuyable": "Vous ne pouvez pas achetez de billets pour l'instant", - "raffleNoCurrentPrize": "Il n'y a aucun lots actuellement", - "raffleModifTombola": "Vous pouvez modifiez vos tombolas ou en créer de nouvelles, toute décision doit ensuite être prise par les admins", - "raffleCreateYourRaffle": "Votre menu de création de tombolas", - "rafflePossiblePrice": "Prix possible", - "raffleInformation": "Information et Statistiques", + "purchasesTicketsError": "Erreur lors du chargement des tickets", + "purchasesTimes": "fois", + "purchasesValidate": "Valider", "raffleAccounts": "Comptes", + "raffleActualPrize": "Lots actuels", + "raffleActualRaffles": "Tombola en cours", "raffleAdd": "Ajouter", - "raffleUpdatedAmount": "Montant mis à jour", - "raffleUpdatingError": "Erreur lors de la mise à jour", - "raffleDeletedPrize": "Lot supprimé", - "raffleDeletingError": "Erreur lors de la suppression", - "raffleQuantity": "Quantité", - "raffleClose": "Fermer", - "raffleOpen": "Ouvrir", - "raffleAddTypeTicketSimple": "Ajouter", - "raffleAddingError": "Erreur lors de l'ajout", - "raffleEditTypeTicketSimple": "Modifier", - "raffleFillField": "Le champ ne peut pas être vide", - "raffleWaiting": "Chargement", - "raffleEditingError": "Erreur lors de la modification", "raffleAddedTicket": "Ticket ajouté", - "raffleEditedTicket": "Ticket modifié", - "raffleAlreadyExistTicket": "Le ticket existe déjà", - "raffleNumberExpected": "Un entier est attendu", - "raffleDeletedTicket": "Ticket supprimé", + "raffleAddingError": "Erreur lors de l'ajout", + "raffleAddPackTicket": "Ajouter un pack de ticket", "raffleAddPrize": "Ajouter", - "raffleEditPrize": "Modifier", - "raffleOpenRaffle": "Ouvrir la tombola", - "raffleCloseRaffle": "Fermer la tombola", - "raffleOpenRaffleDescription": "Vous allez ouvrir la tombola, les utilisateurs pourront acheter des tickets. Vous ne pourrez plus modifier la tombola. Êtes-vous sûr de vouloir continuer ?", - "raffleCloseRaffleDescription": "Vous allez fermer la tombola, les utilisateurs ne pourront plus acheter de tickets. Êtes-vous sûr de vouloir continuer ?", - "raffleNoCurrentRaffle": "Il n'y a aucune tombola en cours", - "raffleBoughtTicket": "Ticket acheté", - "raffleDrawingError": "Erreur lors du tirage", - "raffleInvalidPrice": "Le prix doit être supérieur à 0", - "raffleMustBePositive": "Le nombre doit être strictement positif", - "raffleDraw": "Tirer", - "raffleDrawn": "Tiré", - "raffleError": "Erreur", - "raffleGathered": "Récolté", - "raffleTickets": "Tickets", - "raffleTicket": "ticket", - "raffleWinner": "Gagnant", - "raffleNoPrize": "Aucun lot", + "raffleAddTypeTicketSimple": "Ajouter", + "raffleAlreadyExistTicket": "Le ticket existe déjà", + "raffleAmount": "Solde", + "raffleBoughtTicket": "Ticket acheté", + "raffleBuyThisTicket": "Acheter ce ticket", + "raffleClose": "Fermer", + "raffleCloseRaffle": "Fermer la tombola", + "raffleCloseRaffleDescription": "Vous allez fermer la tombola, les utilisateurs ne pourront plus acheter de tickets. Êtes-vous sûr de vouloir continuer ?", + "raffleCreateMenu": "Menu de Création", + "raffleCreateYourRaffle": "Votre menu de création de tombolas", + "raffleDeletedPrize": "Lot supprimé", + "raffleDeletedTicket": "Ticket supprimé", "raffleDeletePrize": "Supprimer le lot", "raffleDeletePrizeDescription": "Vous allez supprimer le lot, êtes-vous sûr de vouloir continuer ?", - "raffleDrawing": "Tirage", - "raffleDrawingDescription": "Tirer le gagnant du lot ?", "raffleDeleteTicket": "Supprimer le ticket", "raffleDeleteTicketDescription": "Vous allez supprimer le ticket, êtes-vous sûr de vouloir continuer ?", - "raffleWinningTickets": "Tickets gagnants", - "raffleNoWinningTicketYet": "Les tickets gagnants seront affichés ici", - "raffleName": "Nom", + "raffleDeletingError": "Erreur lors de la suppression", "raffleDescription": "Description", - "raffleBuyThisTicket": "Acheter ce ticket", + "raffleDraw": "Tirer", + "raffleDrawing": "Tirage", + "raffleDrawingDescription": "Tirer le gagnant du lot ?", + "raffleDrawingError": "Erreur lors du tirage", + "raffleDrawn": "Tiré", + "raffleEdit": "Modifier", + "raffleEditedTicket": "Ticket modifié", + "raffleEditingError": "Erreur lors de la modification", + "raffleEditPrize": "Modifier", + "raffleEditRaffle": "Modifier la tombola", + "raffleEditTypeTicketSimple": "Modifier", + "raffleError": "Erreur", + "raffleFillField": "Le champ ne peut pas être vide", + "raffleGathered": "Récolté", + "raffleInformation": "Information et Statistiques", + "raffleInvalidPrice": "Le prix doit être supérieur à 0", + "raffleLoading": "Chargement", "raffleLockedRaffle": "Tombola verrouillée", - "raffleUnavailableRaffle": "Tombola indisponible", - "raffleNotEnoughMoney": "Vous n'avez pas assez d'argent", - "raffleWinnable": "gagnable", + "raffleMajorPrize": "Lot Majeurs", + "raffleModifTombola": "Vous pouvez modifiez vos tombolas ou en créer de nouvelles, toute décision doit ensuite être prise par les admins", + "raffleMustBePositive": "Le nombre doit être strictement positif", + "raffleName": "Nom", + "raffleNextRaffles": "Prochaines tombolas", + "raffleNoCurrentPrize": "Il n'y a aucun lots actuellement", + "raffleNoCurrentRaffle": "Il n'y a aucune tombola en cours", "raffleNoDescription": "Aucune description", - "raffleAmount": "Solde", - "raffleLoading": "Chargement", - "raffleTicketNumber": "Nombre de ticket", + "raffleNoPrize": "Aucun lot", + "raffleNotEnoughMoney": "Vous n'avez pas assez d'argent", + "raffleNoTicket": "Vous n'avez pas de ticket", + "raffleNoTicketBuyable": "Vous ne pouvez pas achetez de billets pour l'instant", + "raffleNoWinningTicketYet": "Les tickets gagnants seront affichés ici", + "raffleNumberExpected": "Un entier est attendu", + "raffleOpen": "Ouvrir", + "raffleOpenRaffle": "Ouvrir la tombola", + "raffleOpenRaffleDescription": "Vous allez ouvrir la tombola, les utilisateurs pourront acheter des tickets. Vous ne pourrez plus modifier la tombola. Êtes-vous sûr de vouloir continuer ?", + "rafflePastRaffles": "Tombola passés", + "rafflePossiblePrice": "Prix possible", "rafflePrice": "Prix", - "raffleEditRaffle": "Modifier la tombola", - "raffleEdit": "Modifier", - "raffleAddPackTicket": "Ajouter un pack de ticket", - "recommendationRecommendation": "Bons plans", - "recommendationTitle": "Titre", - "recommendationLogo": "Logo", - "recommendationCode": "Code", - "recommendationSummary": "Court résumé", - "recommendationDescription": "Description", + "rafflePrize": "Lot", + "rafflePrizes": "Lots", + "raffleQuantity": "Quantité", + "raffleRaffle": "Tombola", + "raffleSeeRaffleDetail": "Voir lots/tickets", + "raffleTakeTickets": "Prendre vos tickets", + "raffleTicket": "ticket", + "raffleTicketNumber": "Nombre de ticket", + "raffleTickets": "Tickets", + "raffleUnavailableRaffle": "Tombola indisponible", + "raffleUpdatedAmount": "Montant mis à jour", + "raffleUpdatingError": "Erreur lors de la mise à jour", + "raffleWaiting": "Chargement", + "raffleWinnable": "gagnable", + "raffleWinner": "Gagnant", + "raffleWinningTickets": "Tickets gagnants", + "raffleYourTickets": "Tous vos tickets", "recommendationAdd": "Ajouter", - "recommendationEdit": "Modifier", - "recommendationDelete": "Supprimer", - "recommendationAddImage": "Veuillez ajouter une image", "recommendationAddedRecommendation": "Bon plan ajouté", - "recommendationEditedRecommendation": "Bon plan modifié", - "recommendationDeleteRecommendationConfirmation": "Êtes-vous sûr de vouloir supprimer ce bon plan ?", + "recommendationAddImage": "Veuillez ajouter une image", + "recommendationAddingError": "Échec de l'ajout", + "recommendationCode": "Code", + "recommendationCopiedCode": "Code de réduction copié", + "recommendationDelete": "Supprimer", + "recommendationDeletedRecommendation": "Bon plan supprimé", "recommendationDeleteRecommendation": "Suppresion", + "recommendationDeleteRecommendationConfirmation": "Êtes-vous sûr de vouloir supprimer ce bon plan ?", "recommendationDeletingRecommendationError": "Erreur lors de la suppression", - "recommendationDeletedRecommendation": "Bon plan supprimé", - "recommendationIncorrectOrMissingFields": "Champs incorrects ou manquants", + "recommendationDescription": "Description", + "recommendationEdit": "Modifier", + "recommendationEditedRecommendation": "Bon plan modifié", "recommendationEditingError": "Échec de la modification", - "recommendationAddingError": "Échec de l'ajout", - "recommendationCopiedCode": "Code de réduction copié", + "recommendationIncorrectOrMissingFields": "Champs incorrects ou manquants", + "recommendationLogo": "Logo", + "recommendationRecommendation": "Bons plans", + "recommendationSummary": "Court résumé", + "recommendationTitle": "Titre", "seedLibraryAdd": "Ajouter", "seedLibraryAddedPlant": "Plante ajoutée", "seedLibraryAddedSpecies": "Espèce ajoutée", @@ -1351,18 +1408,18 @@ "seedLibraryHelpSheets": "Fiches sur les plantes", "seedLibraryInformation": "Informations :", "seedLibraryMaturationTime": "Temps de maturation", - "seedLibraryMonthJan": "Janvier", + "seedLibraryMonthApr": "Avril", + "seedLibraryMonthAug": "Août", + "seedLibraryMonthDec": "Décembre", "seedLibraryMonthFeb": "Février", + "seedLibraryMonthJan": "Janvier", + "seedLibraryMonthJul": "Juillet", + "seedLibraryMonthJun": "Juin", "seedLibraryMonthMar": "Mars", - "seedLibraryMonthApr": "Avril", "seedLibraryMonthMay": "Mai", - "seedLibraryMonthJun": "Juin", - "seedLibraryMonthJul": "Juillet", - "seedLibraryMonthAug": "Août", - "seedLibraryMonthSep": "Septembre", - "seedLibraryMonthOct": "Octobre", "seedLibraryMonthNov": "Novembre", - "seedLibraryMonthDec": "Décembre", + "seedLibraryMonthOct": "Octobre", + "seedLibraryMonthSep": "Septembre", "seedLibraryMyPlants": "Mes plantes", "seedLibraryName": "Nom", "seedLibraryNbSeedsRecommended": "Nombre de graines recommandées", @@ -1391,11 +1448,11 @@ "seedLibrarySaveChanges": "Sauvegarder les modifications", "seedLibrarySeason": "Saison :", "seedLibrarySeed": "Graine", - "seedLibrarySeeds": "graines", "seedLibrarySeedDeposit": "Dépôt de plantes", "seedLibrarySeedLibrary": "Grainothèque", - "seedLibrarySeedQuantitySimple": "Quantité de graines", "seedLibrarySeedQuantity": "Quantité de graines :", + "seedLibrarySeedQuantitySimple": "Quantité de graines", + "seedLibrarySeeds": "graines", "seedLibraryShowDeadPlants": "Afficher les plantes mortes", "seedLibrarySpecies": "Espèce :", "seedLibrarySpeciesHelp": "Aide sur l'espèce", @@ -1405,15 +1462,15 @@ "seedLibrarySpring": "Printemps", "seedLibraryStartMonth": "Mois de début :", "seedLibraryStock": "Stock disponible", - "seedLibrarySummer": "Été", "seedLibraryStocks": "Stocks", + "seedLibrarySummer": "Été", "seedLibraryTimeUntilMaturation": "Temps avant maturation :", "seedLibraryType": "Type :", "seedLibraryUnableToOpen": "Impossible d'ouvrir le lien", "seedLibraryUpdate": "Modifier", "seedLibraryUpdatedInformation": "Informations modifiées", - "seedLibraryUpdatedSpecies": "Espèce modifiée", "seedLibraryUpdatedPlant": "Plante modifiée", + "seedLibraryUpdatedSpecies": "Espèce modifiée", "seedLibraryUpdatingError": "Erreur lors de la modification", "seedLibraryWinter": "Hiver", "seedLibraryWriteReference": "Veuillez écrire la référence suivante : ", @@ -1426,35 +1483,63 @@ "settingsBugs": "Bugs", "settingsChangePassword": "Changer de mot de passe", "settingsChangingPassword": "Voulez-vous vraiment changer votre mot de passe ?", + "settingsChooseLanguage": "Choix de la langue", "settingsConfirmPassword": "Confirmer le mot de passe", + "settingsConnexion": "Connexion", "settingsCopied": "Copié !", "settingsDarkMode": "Mode sombre", "settingsDarkModeOff": "Désactivé", "settingsDeleteLogs": "Supprimer les logs ?", + "settingsDeleteMyAccount": "Supprimer mon compte", + "settingsDeleteMyAccountDescription": "Cette action notifie l'administrateur que vous souhaitez supprimer votre compte.", + "settingsDeleteMyAccountError": "Erreur lors de la demande de suppression de compte", "settingsDeleteNotificationLogs": "Supprimer les logs des notifications ?", + "settingsDeleting": "Suppresion", + "settingsDeletionAsked": "Demande de suppression de compte envoyée", "settingsDetelePersonalData": "Supprimer mes données personnelles", "settingsDetelePersonalDataDesc": "Cette action notifie l'administrateur que vous souhaitez supprimer vos données personnelles.", - "settingsDeleting": "Suppresion", "settingsEdit": "Modifier", "settingsEditAccount": "Modifier mon profil", + "settingsEditedAccount": "Compte modifié avec succès", "settingsEmail": "Email", "settingsEmptyField": "Ce champ ne peut pas être vide", "settingsErrorProfilePicture": "Erreur lors de la modification de la photo de profil", "settingsErrorSendingDemand": "Erreur lors de l'envoi de la demande", + "settingsEvent": "Événement", "settingsEventsIcal": "Lien Ical des événements", "settingsExpectingDate": "Date de naissance attendue", + "settingsFailedToEditAccount": "Échec de la modification du compte", "settingsFirstname": "Prénom", "settingsFloor": "Étage", "settingsHelp": "Aide", + "settingsHyperionVersion": "Version d'Hyperion", + "settingsIcal": "Lien Ical", "settingsIcalCopied": "Lien Ical copié !", + "settingsIcalLinkCopied": "Lien Ical copié dans le presse-papier", "settingsLanguage": "Langue", "settingsLanguageVar": "Français 🇫🇷", + "settingsLogOut": "Se déconnecter", + "settingsLogOutDescription": "Êtes-vous sûr de vouloir vous déconnecter ?", + "settingsLogOutSuccess": "Déconnexion réussie", "settingsLogs": "Logs", + "settingsMinimalHyperionVersion": "Version minimale d'Hyperion", "settingsModules": "Modules", "settingsMyIcs": "Mon lien Ical", "settingsName": "Nom", "settingsNewPassword": "Nouveau mot de passe", "settingsNickname": "Surnom", + "settingsNotificationCounter": "{active}/{total} {active, plural, zero {activée} one {activée} other {activées}}", + "@settingsNotificationCounter": { + "description": "Affiche le nombre de notifications actives sur le total des notifications disponibles, avec gestion du pluriel", + "placeholders": { + "active": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, "settingsNotifications": "Notifications", "settingsOldPassword": "Ancien mot de passe", "settingsPasswordChanged": "Mot de passe changé", @@ -1462,6 +1547,8 @@ "settingsPersonalData": "Données personnelles", "settingsPersonalisation": "Personnalisation", "settingsPhone": "Téléphone", + "settingsPhoneNumber": "Numéro de téléphone", + "settingsProfile": "Profil", "settingsProfilePicture": "Photo de profil", "settingsPromo": "Promotion", "settingsRepportBug": "Signaler un bug", @@ -1469,58 +1556,29 @@ "settingsSecurity": "Sécurité", "settingsSendedDemand": "Demande envoyée", "settingsSettings": "Paramètres", + "settingsSynncWithCalendar": "Synchroniser avec votre calendrier", "settingsTooHeavyProfilePicture": "L'image est trop lourde (max 4Mo)", + "settingsTooRecentVersion": "Votre version de l'application est trop récente, contactez un administrateur pour résoudre ce problème", "settingsUpdatedProfile": "Profil modifié", "settingsUpdatedProfilePicture": "Photo de profil modifiée", "settingsUpdateNotification": "Mettre à jour les notifications", "settingsUpdatingError": "Erreur lors de la modification du profil", - "settingsVersion": "Version", - "settingsPasswordStrength": "Force du mot de passe", - "settingsPasswordStrengthVeryWeak": "Très faible", - "settingsPasswordStrengthWeak": "Faible", - "settingsPasswordStrengthMedium": "Moyen", - "settingsPasswordStrengthStrong": "Fort", - "settingsPasswordStrengthVeryStrong": "Très fort", - "settingsPhoneNumber": "Numéro de téléphone", "settingsValidate": "Valider", - "settingsEditedAccount": "Compte modifié avec succès", - "settingsFailedToEditAccount": "Échec de la modification du compte", - "settingsChooseLanguage": "Choix de la langue", - "settingsNotificationCounter": "{active}/{total} {active, plural, zero {activée} one {activée} other {activées}}", - "@settingsNotificationCounter": { - "description": "Affiche le nombre de notifications actives sur le total des notifications disponibles, avec gestion du pluriel", - "placeholders": { - "active": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "settingsEvent": "Événement", - "settingsIcal": "Lien Ical", - "settingsSynncWithCalendar": "Synchroniser avec votre calendrier", - "settingsIcalLinkCopied": "Lien Ical copié dans le presse-papier", - "settingsProfile": "Profil", - "settingsConnexion": "Connexion", - "settingsLogOut": "Se déconnecter", - "settingsLogOutDescription": "Êtes-vous sûr de vouloir vous déconnecter ?", - "settingsLogOutSuccess": "Déconnexion réussie", - "settingsDeleteMyAccount": "Supprimer mon compte", - "settingsDeleteMyAccountDescription": "Cette action notifie l'administrateur que vous souhaitez supprimer votre compte.", - "settingsDeletionAsked": "Demande de suppression de compte envoyée", - "settingsDeleteMyAccountError": "Erreur lors de la demande de suppression de compte", + "settingsVersion": "Version", + "toolDateRequired": "Date requise", + "toolInvalidNumber": "Chiffre invalide", + "toolSuccess": "Succès", "voteAdd": "Ajouter", - "voteAddMember": "Ajouter un membre", "voteAddedPretendance": "Liste ajoutée", "voteAddedSection": "Section ajoutée", "voteAddingError": "Erreur lors de l'ajout", + "voteAddMember": "Ajouter un membre", "voteAddPretendance": "Ajouter une liste", "voteAddSection": "Ajouter une section", "voteAll": "Tous", "voteAlreadyAddedMember": "Membre déjà ajouté", "voteAlreadyVoted": "Vote enregistré", + "voteCanNotVote": "Vous ne pouvez pas voter", "voteChooseList": "Choisir une liste", "voteClear": "Réinitialiser", "voteClearVotes": "Réinitialiser les votes", @@ -1529,11 +1587,11 @@ "voteConfirmVote": "Confirmer le vote", "voteCountVote": "Dépouiller les votes", "voteDelete": "Supprimer", + "voteDeleteAll": "Supprimer tout", + "voteDeleteAllDescription": "Voulez-vous vraiment supprimer tout ?", "voteDeletedAll": "Tout supprimé", "voteDeletedPipo": "Listes pipos supprimées", "voteDeletedSection": "Section supprimée", - "voteDeleteAll": "Supprimer tout", - "voteDeleteAllDescription": "Voulez-vous vraiment supprimer tout ?", "voteDeletePipo": "Supprimer les listes pipos", "voteDeletePipoDescription": "Voulez-vous vraiment supprimer les listes pipos ?", "voteDeletePretendance": "Supprimer la liste", @@ -1548,14 +1606,13 @@ "voteEditingError": "Erreur lors de la modification", "voteErrorClosingVotes": "Erreur lors de la fermeture des votes", "voteErrorCountingVotes": "Erreur lors du dépouillement des votes", - "voteErrorResetingVotes": "Erreur lors de la réinitialisation des votes", "voteErrorOpeningVotes": "Erreur lors de l'ouverture des votes", + "voteErrorResetingVotes": "Erreur lors de la réinitialisation des votes", "voteIncorrectOrMissingFields": "Champs incorrects ou manquants", "voteMembers": "Membres", "voteName": "Nom", "voteNoPretendanceList": "Aucune liste de prétendance", "voteNoSection": "Aucune section", - "voteCanNotVote": "Vous ne pouvez pas voter", "voteNoSectionList": "Aucune section", "voteNotOpenedVote": "Vote non ouvert", "voteOnGoingCount": "Dépouillement en cours", @@ -1571,8 +1628,8 @@ "voteResetVote": "Réinitialiser les votes", "voteResetVoteDescription": "Que voulez-vous faire ?", "voteRole": "Rôle", - "voteSectionDescription": "Description de la section", "voteSection": "Section", + "voteSectionDescription": "Description de la section", "voteSectionName": "Nom de la section", "voteSeeMore": "Voir plus", "voteSelected": "Sélectionné", @@ -1582,58 +1639,11 @@ "voteVoteFor": "Voter pour ", "voteVoteNotStarted": "Vote non ouvert", "voteVoters": "Groupes votants", - "voteVoteSuccess": "Vote enregistré", "voteVotes": "Voix", "voteVotesClosed": "Votes clos", "voteVotesCounted": "Votes dépouillés", "voteVotesOpened": "Votes ouverts", + "voteVoteSuccess": "Vote enregistré", "voteWarning": "Attention", - "voteWarningMessage": "La sélection ne sera pas sauvegardée.\nVoulez-vous continuer ?", - "moduleAdvert": "Feed", - "moduleAdvertDescription": "Gérer les feeds", - "moduleAmap": "AMAP", - "moduleAmapDescription": "Gérer les livraisons et les produits", - "moduleBooking": "Réservation", - "moduleBookingDescription": "Gérer les réservations, les salles et les managers", - "moduleCalendar": "Calendrier", - "moduleCalendarDescription": "Consulter les événements et les activités", - "moduleCentralisation": "Centralisation", - "moduleCentralisationDescription": "Gérer la centralisation des données", - "moduleCinema": "Cinéma", - "moduleCinemaDescription": "Gérer les séances de cinéma", - "moduleEvent": "Événement", - "moduleEventDescription": "Gérer les événements et les participants", - "moduleFlappyBird": "Flappy Bird", - "moduleFlappyBirdDescription": "Jouer à Flappy Bird et consulter le classement", - "moduleLoan": "Prêt", - "moduleLoanDescription": "Gérer les prêts et les articles", - "modulePhonebook": "Annuaire", - "modulePhonebookDescription": "Gérer les associations, les membres et les administrateurs", - "modulePurchases": "Achats", - "modulePurchasesDescription": "Gérer les achats, les tickets et l'historique", - "moduleRaffle": "Tombola", - "moduleRaffleDescription": "Gérer les tombolas, les prix et les tickets", - "moduleRecommendation": "Bons plans", - "moduleRecommendationDescription": "Gérer les recommandations, les informations et les administrateurs", - "moduleSeedLibrary": "Grainothèque", - "moduleSeedLibraryDescription": "Gérer les graines, les espèces et les stocks", - "moduleVote": "Vote", - "moduleVoteDescription": "Gérer les votes, les sections et les candidats", - "modulePh": "PH", - "modulePhDescription": "Gérer les PH, les formulaires et les administrateurs", - "moduleSettings": "Paramètres", - "moduleSettingsDescription": "Gérer les paramètres de l'application", - "moduleFeed": "Events", - "moduleFeedDescription": "Consulter les événements", - "moduleStyleGuide": "StyleGuide", - "moduleStyleGuideDescription": "Explore the UI components and styles used in Titan", - "moduleAdmin": "Admin", - "moduleAdminDescription": "Gérer les utilisateurs, groupes et structures", - "moduleOthers": "Autres", - "moduleOthersDescription": "Afficher les autres modules", - "modulePayment": "Paiement", - "modulePaymentDescription": "Gérer les paiements, les statistiques et les appareils", - "toolInvalidNumber": "Chiffre invalide", - "toolDateRequired": "Date requise", - "toolSuccess": "Succès" + "voteWarningMessage": "La sélection ne sera pas sauvegardée.\nVoulez-vous continuer ?" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 760e6cec7b..c4742654ff 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -98,737 +98,611 @@ abstract class AppLocalizations { Locale('fr'), ]; - /// No description provided for @dateToday. + /// No description provided for @moduleCentralassociation. /// /// In fr, this message translates to: - /// **'Aujourd\'hui'** - String get dateToday; + /// **'Centralassociation'** + String get moduleCentralassociation; - /// No description provided for @dateYesterday. + /// No description provided for @moduleCentralassociationDescription. /// /// In fr, this message translates to: - /// **'Hier'** - String get dateYesterday; + /// **'Agrégateur des liens des associations'** + String get moduleCentralassociationDescription; - /// No description provided for @dateTomorrow. + /// No description provided for @adminAccountTypes. /// /// In fr, this message translates to: - /// **'Demain'** - String get dateTomorrow; + /// **'Types de compte'** + String get adminAccountTypes; - /// No description provided for @dateAt. + /// No description provided for @adminAdd. /// /// In fr, this message translates to: - /// **'à'** - String get dateAt; + /// **'Ajouter'** + String get adminAdd; - /// No description provided for @dateFrom. + /// No description provided for @adminAddAssociation. /// /// In fr, this message translates to: - /// **'de'** - String get dateFrom; + /// **'Ajouter une association'** + String get adminAddAssociation; - /// No description provided for @dateTo. + /// No description provided for @adminAddedGroup. /// /// In fr, this message translates to: - /// **'à'** - String get dateTo; + /// **'Groupe créé'** + String get adminAddedGroup; - /// No description provided for @dateBetweenDays. + /// No description provided for @adminAddedLoaner. /// /// In fr, this message translates to: - /// **'au'** - String get dateBetweenDays; + /// **'Préteur ajouté'** + String get adminAddedLoaner; - /// No description provided for @dateStarting. + /// No description provided for @adminAddedMember. /// /// In fr, this message translates to: - /// **'Commence'** - String get dateStarting; + /// **'Membre ajouté'** + String get adminAddedMember; - /// No description provided for @dateLast. + /// No description provided for @adminAddedSchool. /// /// In fr, this message translates to: - /// **''** - String get dateLast; + /// **'École créée'** + String get adminAddedSchool; - /// No description provided for @dateUntil. + /// No description provided for @adminAddedStructure. /// /// In fr, this message translates to: - /// **'Jusqu\'au'** - String get dateUntil; + /// **'Structure ajoutée'** + String get adminAddedStructure; - /// No description provided for @feedFilterAll. + /// No description provided for @adminAddGroup. /// /// In fr, this message translates to: - /// **'Tous'** - String get feedFilterAll; + /// **'Ajouter un groupe'** + String get adminAddGroup; - /// No description provided for @feedFilterPending. + /// No description provided for @adminAddingError. /// /// In fr, this message translates to: - /// **'En attente'** - String get feedFilterPending; + /// **'Erreur lors de l\'ajout'** + String get adminAddingError; - /// No description provided for @feedFilterApproved. + /// No description provided for @adminAddingMember. /// /// In fr, this message translates to: - /// **'Approuvés'** - String get feedFilterApproved; + /// **'Ajout d\'un membre'** + String get adminAddingMember; - /// No description provided for @feedFilterRejected. + /// No description provided for @adminAddLoaningGroup. /// /// In fr, this message translates to: - /// **'Rejetés'** - String get feedFilterRejected; + /// **'Ajouter un groupe de prêt'** + String get adminAddLoaningGroup; - /// No description provided for @feedEmptyAll. + /// No description provided for @adminAddMember. /// /// In fr, this message translates to: - /// **'Aucun événement disponible'** - String get feedEmptyAll; + /// **'Ajouter un membre'** + String get adminAddMember; - /// No description provided for @feedEmptyPending. + /// No description provided for @adminAddSchool. /// /// In fr, this message translates to: - /// **'Aucun événement en attente de validation'** - String get feedEmptyPending; + /// **'Ajouter une école'** + String get adminAddSchool; - /// No description provided for @feedEmptyApproved. + /// No description provided for @adminAddStructure. /// /// In fr, this message translates to: - /// **'Aucun événement approuvé'** - String get feedEmptyApproved; + /// **'Ajouter une structure'** + String get adminAddStructure; - /// No description provided for @feedEmptyRejected. + /// No description provided for @adminAdmin. /// /// In fr, this message translates to: - /// **'Aucun événement rejeté'** - String get feedEmptyRejected; + /// **'Admin'** + String get adminAdmin; - /// No description provided for @feedEventManagement. + /// No description provided for @adminAdministration. /// /// In fr, this message translates to: - /// **'Gestion des événements'** - String get feedEventManagement; + /// **'Administration'** + String get adminAdministration; - /// No description provided for @feedTitle. + /// No description provided for @adminAssociationCreated. /// /// In fr, this message translates to: - /// **'Titre'** - String get feedTitle; + /// **'Association créée'** + String get adminAssociationCreated; - /// No description provided for @feedLocation. + /// No description provided for @adminAssociationCreationError. /// /// In fr, this message translates to: - /// **'Lieu'** - String get feedLocation; + /// **'Échec de la création de l\'association'** + String get adminAssociationCreationError; - /// No description provided for @feedSGDate. + /// No description provided for @adminAssociationMembership. /// /// In fr, this message translates to: - /// **'Date du SG'** - String get feedSGDate; + /// **'Adhésion'** + String get adminAssociationMembership; - /// No description provided for @feedSGExternalLink. + /// No description provided for @adminAssociationMembershipName. /// /// In fr, this message translates to: - /// **'Lien externe du SG'** - String get feedSGExternalLink; + /// **'Nom de l\'adhésion'** + String get adminAssociationMembershipName; - /// No description provided for @feedCreateEvent. + /// No description provided for @adminAssociationMembershipsManagement. /// /// In fr, this message translates to: - /// **'Créer l\'événement'** - String get feedCreateEvent; + /// **'Gestion des adhésions'** + String get adminAssociationMembershipsManagement; - /// No description provided for @feedNotification. + /// No description provided for @adminAssociationName. /// /// In fr, this message translates to: - /// **'Envoyer une notification'** - String get feedNotification; + /// **'Nom de l\'association'** + String get adminAssociationName; - /// No description provided for @feedPleaseSelectAnAssociation. + /// No description provided for @adminAssociations. /// /// In fr, this message translates to: - /// **'Veuillez sélectionner une association'** - String get feedPleaseSelectAnAssociation; + /// **'Associations'** + String get adminAssociations; - /// No description provided for @feedReject. + /// No description provided for @adminAssociationsMemberships. /// /// In fr, this message translates to: - /// **'Rejeter'** - String get feedReject; + /// **'Adhésions'** + String get adminAssociationsMemberships; - /// No description provided for @feedApprove. + /// No description provided for @adminAssociationUpdated. /// /// In fr, this message translates to: - /// **'Approuver'** - String get feedApprove; + /// **'Association mise à jour'** + String get adminAssociationUpdated; - /// No description provided for @feedEnded. + /// No description provided for @adminAssociationUpdateError. /// /// In fr, this message translates to: - /// **'Terminé'** - String get feedEnded; + /// **'Échec de la mise à jour de l\'association'** + String get adminAssociationUpdateError; - /// No description provided for @feedOngoing. + /// Displays the bank account holder's name /// /// In fr, this message translates to: - /// **'En cours'** - String get feedOngoing; + /// **'Titulaire du compte bancaire : {bankAccountHolder}'** + String adminBankAccountHolder(String bankAccountHolder); - /// No description provided for @feedFilter. + /// No description provided for @adminBankAccountHolderModified. /// /// In fr, this message translates to: - /// **'Filtrer'** - String get feedFilter; + /// **'Titulaire du compte bancaire modifié'** + String get adminBankAccountHolderModified; - /// No description provided for @feedAssociation. + /// No description provided for @adminBankDetails. /// /// In fr, this message translates to: - /// **'Association'** - String get feedAssociation; + /// **'Coordonnées bancaires'** + String get adminBankDetails; - /// Association event + /// No description provided for @adminBic. /// /// In fr, this message translates to: - /// **'Event de {name}'** - String feedAssociationEvent(String name); + /// **'BIC'** + String get adminBic; - /// No description provided for @feedEditEvent. + /// No description provided for @adminBicError. /// /// In fr, this message translates to: - /// **'Modifier l\'événement'** - String get feedEditEvent; + /// **'Le BIC doit faire 11 caractères'** + String get adminBicError; - /// No description provided for @feedManageAssociationEvents. + /// No description provided for @adminChooseAssociationManagerGroup. /// /// In fr, this message translates to: - /// **'Gérer les événements de l\'association'** - String get feedManageAssociationEvents; + /// **'Choisir un groupe gestionnaire pour l\'association'** + String get adminChooseAssociationManagerGroup; - /// No description provided for @feedNews. + /// No description provided for @adminChooseGroup. /// /// In fr, this message translates to: - /// **'Calendrier'** - String get feedNews; + /// **'Choisir un groupe'** + String get adminChooseGroup; - /// No description provided for @feedNewsType. + /// No description provided for @adminChooseGroupManager. /// /// In fr, this message translates to: - /// **'Type d\'actualité'** - String get feedNewsType; + /// **'Groupe gestionnaire de l\'adhésion'** + String get adminChooseGroupManager; - /// No description provided for @feedNoAssociationEvents. + /// No description provided for @adminCity. /// /// In fr, this message translates to: - /// **'Aucun événement d\'association'** - String get feedNoAssociationEvents; + /// **'Ville'** + String get adminCity; - /// No description provided for @feedApply. + /// No description provided for @adminClearFilters. /// /// In fr, this message translates to: - /// **'Appliquer'** - String get feedApply; + /// **'Effacer les filtres'** + String get adminClearFilters; - /// No description provided for @feedAdmin. + /// No description provided for @adminContent. /// /// In fr, this message translates to: - /// **'Administration'** - String get feedAdmin; + /// **'Contenu'** + String get adminContent; - /// No description provided for @feedCreateAnEvent. + /// No description provided for @adminCountry. /// /// In fr, this message translates to: - /// **'Créer un événement'** - String get feedCreateAnEvent; + /// **'Pays'** + String get adminCountry; - /// No description provided for @feedManageRequests. + /// No description provided for @adminCreateAssociationMembership. /// /// In fr, this message translates to: - /// **'Demandes de publication'** - String get feedManageRequests; + /// **'Créer une adhésion'** + String get adminCreateAssociationMembership; - /// No description provided for @feedNoNewsAvailable. + /// No description provided for @adminCreatedAssociationMembership. /// /// In fr, this message translates to: - /// **'Aucune actualité disponible'** - String get feedNoNewsAvailable; + /// **'Adhésion créée'** + String get adminCreatedAssociationMembership; - /// No description provided for @feedRefresh. + /// No description provided for @adminCreationError. /// /// In fr, this message translates to: - /// **'Actualiser'** - String get feedRefresh; + /// **'Erreur lors de la création'** + String get adminCreationError; - /// No description provided for @feedPleaseProvideASGExternalLink. + /// No description provided for @adminDateError. /// /// In fr, this message translates to: - /// **'Veuillez entrer un lien externe pour le SG'** - String get feedPleaseProvideASGExternalLink; + /// **'La date de début doit être avant la date de fin'** + String get adminDateError; - /// No description provided for @feedPleaseProvideASGDate. + /// No description provided for @adminDefineAsBankAccountHolder. /// /// In fr, this message translates to: - /// **'Veuillez entrer une date de SG'** - String get feedPleaseProvideASGDate; + /// **'Définir comme titulaire du compte bancaire'** + String get adminDefineAsBankAccountHolder; - /// Placeholder pour le temps restant avant le shotgun + /// No description provided for @adminDelete. /// /// In fr, this message translates to: - /// **'Shotgun {time}'** - String feedShotgunIn(String time); + /// **'Supprimer'** + String get adminDelete; - /// Temps restant avant le vote + /// No description provided for @adminDeleteAssociationMember. /// /// In fr, this message translates to: - /// **'Vote {time}'** - String feedVoteIn(String time); + /// **'Supprimer le membre ?'** + String get adminDeleteAssociationMember; - /// No description provided for @feedCantOpenLink. + /// No description provided for @adminDeleteAssociationMemberConfirmation. /// /// In fr, this message translates to: - /// **'Impossible d\'ouvrir le lien'** - String get feedCantOpenLink; + /// **'Êtes-vous sûr de vouloir supprimer ce membre ?'** + String get adminDeleteAssociationMemberConfirmation; - /// No description provided for @feedGetReady. + /// No description provided for @adminDeleteAssociationMembership. /// /// In fr, this message translates to: - /// **'Prépare-toi !'** - String get feedGetReady; + /// **'Supprimer l\'adhésion ?'** + String get adminDeleteAssociationMembership; - /// No description provided for @eventActionCampaign. + /// No description provided for @adminDeletedAssociationMembership. /// /// In fr, this message translates to: - /// **'Tu peux voter'** - String get eventActionCampaign; + /// **'Adhésion supprimée'** + String get adminDeletedAssociationMembership; - /// No description provided for @eventActionEvent. + /// No description provided for @adminDeletedGroup. /// /// In fr, this message translates to: - /// **'Tu es invité'** - String get eventActionEvent; + /// **'Groupe supprimé'** + String get adminDeletedGroup; - /// No description provided for @eventActionCampaignSubtitle. + /// No description provided for @adminDeletedSchool. /// /// In fr, this message translates to: - /// **'Votez maintenant'** - String get eventActionCampaignSubtitle; + /// **'École supprimée'** + String get adminDeletedSchool; - /// No description provided for @eventActionEventSubtitle. + /// No description provided for @adminDeleteGroup. /// /// In fr, this message translates to: - /// **'Répondez à l\'invitation'** - String get eventActionEventSubtitle; + /// **'Supprimer le groupe'** + String get adminDeleteGroup; - /// No description provided for @eventActionCampaignButton. + /// No description provided for @adminDeleteGroupConfirmation. /// /// In fr, this message translates to: - /// **'Voter'** - String get eventActionCampaignButton; + /// **'Êtes-vous sûr de vouloir supprimer ce groupe ?'** + String get adminDeleteGroupConfirmation; - /// No description provided for @eventActionEventButton. + /// No description provided for @adminDeleteSchool. /// /// In fr, this message translates to: - /// **'Réserver'** - String get eventActionEventButton; + /// **'Supprimer l\'école ?'** + String get adminDeleteSchool; - /// No description provided for @eventActionCampaignValidated. + /// No description provided for @adminDeleteUsers. /// /// In fr, this message translates to: - /// **'J\'ai voté !'** - String get eventActionCampaignValidated; + /// **'Supprimer des utilisateurs'** + String get adminDeleteUsers; - /// No description provided for @eventActionEventValidated. + /// No description provided for @adminDeleting. /// /// In fr, this message translates to: - /// **'Je viens !'** - String get eventActionEventValidated; + /// **'Suppression'** + String get adminDeleting; - /// No description provided for @adminAccountTypes. + /// No description provided for @adminDeletingError. /// /// In fr, this message translates to: - /// **'Types de compte'** - String get adminAccountTypes; + /// **'Erreur lors de la suppression'** + String get adminDeletingError; - /// No description provided for @adminAdd. + /// No description provided for @adminDescription. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get adminAdd; + /// **'Description'** + String get adminDescription; - /// No description provided for @adminAddGroup. + /// No description provided for @adminEdit. /// /// In fr, this message translates to: - /// **'Ajouter un groupe'** - String get adminAddGroup; + /// **'Modifier'** + String get adminEdit; - /// No description provided for @adminAddMember. + /// Modifier les informations de l'association /// /// In fr, this message translates to: - /// **'Ajouter un membre'** - String get adminAddMember; + /// **'Modifier l\'association : {associationName}'** + String adminEditAssociation(String associationName); - /// No description provided for @adminAddedGroup. + /// No description provided for @adminEditedStructure. /// /// In fr, this message translates to: - /// **'Groupe créé'** - String get adminAddedGroup; + /// **'Structure modifiée'** + String get adminEditedStructure; - /// No description provided for @adminAddedLoaner. + /// No description provided for @adminEditGroup. /// /// In fr, this message translates to: - /// **'Préteur ajouté'** - String get adminAddedLoaner; + /// **'Modifier le groupe'** + String get adminEditGroup; - /// No description provided for @adminAddedMember. + /// No description provided for @adminEditMembership. /// /// In fr, this message translates to: - /// **'Membre ajouté'** - String get adminAddedMember; + /// **'Modifier l\'adhésion'** + String get adminEditMembership; - /// No description provided for @adminAddingError. + /// No description provided for @adminEditStructure. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get adminAddingError; + /// **'Modifier la structure'** + String get adminEditStructure; - /// No description provided for @adminAddingMember. + /// No description provided for @adminEmailFailed. /// /// In fr, this message translates to: - /// **'Ajout d\'un membre'** - String get adminAddingMember; + /// **'Impossible d\'envoyer un mail aux adresses suivantes'** + String get adminEmailFailed; - /// No description provided for @adminAddLoaningGroup. + /// No description provided for @adminEmailRegex. /// /// In fr, this message translates to: - /// **'Ajouter un groupe de prêt'** - String get adminAddLoaningGroup; + /// **'Email Regex'** + String get adminEmailRegex; - /// No description provided for @adminAddSchool. + /// No description provided for @adminEmptyDate. /// /// In fr, this message translates to: - /// **'Ajouter une école'** - String get adminAddSchool; + /// **'Date vide'** + String get adminEmptyDate; - /// No description provided for @adminAddStructure. + /// No description provided for @adminEmptyFieldError. /// /// In fr, this message translates to: - /// **'Ajouter une structure'** - String get adminAddStructure; + /// **'Le nom ne peut pas être vide'** + String get adminEmptyFieldError; - /// No description provided for @adminAddedSchool. + /// No description provided for @adminEmptyUser. /// /// In fr, this message translates to: - /// **'École créée'** - String get adminAddedSchool; + /// **'Utilisateur vide'** + String get adminEmptyUser; - /// No description provided for @adminAddedStructure. + /// No description provided for @adminEndDate. /// /// In fr, this message translates to: - /// **'Structure ajoutée'** - String get adminAddedStructure; + /// **'Date de fin'** + String get adminEndDate; - /// No description provided for @adminEditedStructure. + /// No description provided for @adminEndDateMaximal. /// /// In fr, this message translates to: - /// **'Structure modifiée'** - String get adminEditedStructure; + /// **'Date de fin maximale'** + String get adminEndDateMaximal; - /// No description provided for @adminAdministration. + /// No description provided for @adminEndDateMinimal. /// /// In fr, this message translates to: - /// **'Administration'** - String get adminAdministration; + /// **'Date de fin minimale'** + String get adminEndDateMinimal; - /// No description provided for @adminAssociationMembership. + /// No description provided for @adminError. /// /// In fr, this message translates to: - /// **'Adhésion'** - String get adminAssociationMembership; + /// **'Erreur'** + String get adminError; - /// No description provided for @adminAssociationMembershipName. + /// No description provided for @adminFailedToDeleteGroup. /// /// In fr, this message translates to: - /// **'Nom de l\'adhésion'** - String get adminAssociationMembershipName; + /// **'Échec de la suppression du groupe'** + String get adminFailedToDeleteGroup; - /// No description provided for @adminAssociationsMemberships. + /// No description provided for @adminFailedToInviteUsers. /// /// In fr, this message translates to: - /// **'Adhésions'** - String get adminAssociationsMemberships; + /// **'Échec de l\'invitation des utilisateurs'** + String get adminFailedToInviteUsers; - /// Displays the bank account holder's name + /// No description provided for @adminFailedToSendNotification. /// /// In fr, this message translates to: - /// **'Titulaire du compte bancaire : {bankAccountHolder}'** - String adminBankAccountHolder(String bankAccountHolder); + /// **'Échec de l\'envoi de la notification'** + String get adminFailedToSendNotification; - /// No description provided for @adminBankAccountHolderModified. + /// No description provided for @adminFailedToUpdateAssociationLogo. /// /// In fr, this message translates to: - /// **'Titulaire du compte bancaire modifié'** - String get adminBankAccountHolderModified; + /// **'Échec de la mise à jour du logo de l\'association'** + String get adminFailedToUpdateAssociationLogo; - /// No description provided for @adminBankDetails. + /// No description provided for @adminFilters. /// /// In fr, this message translates to: - /// **'Coordonnées bancaires'** - String get adminBankDetails; + /// **'Filtres'** + String get adminFilters; - /// No description provided for @adminBic. + /// No description provided for @adminGroup. /// /// In fr, this message translates to: - /// **'BIC'** - String get adminBic; + /// **'Groupe'** + String get adminGroup; - /// No description provided for @adminBicError. + /// No description provided for @adminGroupNotification. /// /// In fr, this message translates to: - /// **'Le BIC doit faire 11 caractères'** - String get adminBicError; + /// **'Notification de groupe'** + String get adminGroupNotification; - /// No description provided for @adminCity. + /// No description provided for @adminGroups. /// /// In fr, this message translates to: - /// **'Ville'** - String get adminCity; + /// **'Groupes'** + String get adminGroups; - /// No description provided for @adminClearFilters. + /// No description provided for @adminGroupsManagement. /// /// In fr, this message translates to: - /// **'Effacer les filtres'** - String get adminClearFilters; + /// **'Gestion des groupes'** + String get adminGroupsManagement; - /// No description provided for @adminCountry. + /// No description provided for @adminIban. /// /// In fr, this message translates to: - /// **'Pays'** - String get adminCountry; + /// **'IBAN'** + String get adminIban; - /// No description provided for @adminCreateAssociationMembership. + /// No description provided for @adminIbanError. /// /// In fr, this message translates to: - /// **'Créer une adhésion'** - String get adminCreateAssociationMembership; + /// **'L\'IBAN doit faire 27 caractères'** + String get adminIbanError; - /// No description provided for @adminCreatedAssociationMembership. + /// No description provided for @adminImportList. /// /// In fr, this message translates to: - /// **'Adhésion créée'** - String get adminCreatedAssociationMembership; - - /// No description provided for @adminCreationError. - /// - /// In fr, this message translates to: - /// **'Erreur lors de la création'** - String get adminCreationError; - - /// No description provided for @adminDateError. - /// - /// In fr, this message translates to: - /// **'La date de début doit être avant la date de fin'** - String get adminDateError; - - /// No description provided for @adminDefineAsBankAccountHolder. - /// - /// In fr, this message translates to: - /// **'Définir comme titulaire du compte bancaire'** - String get adminDefineAsBankAccountHolder; - - /// No description provided for @adminDelete. - /// - /// In fr, this message translates to: - /// **'Supprimer'** - String get adminDelete; - - /// No description provided for @adminDeleteAssociationMember. - /// - /// In fr, this message translates to: - /// **'Supprimer le membre ?'** - String get adminDeleteAssociationMember; - - /// No description provided for @adminDeleteAssociationMemberConfirmation. - /// - /// In fr, this message translates to: - /// **'Êtes-vous sûr de vouloir supprimer ce membre ?'** - String get adminDeleteAssociationMemberConfirmation; - - /// No description provided for @adminDeleteAssociationMembership. - /// - /// In fr, this message translates to: - /// **'Supprimer l\'adhésion ?'** - String get adminDeleteAssociationMembership; - - /// No description provided for @adminDeletedAssociationMembership. - /// - /// In fr, this message translates to: - /// **'Adhésion supprimée'** - String get adminDeletedAssociationMembership; - - /// No description provided for @adminDeleteGroup. - /// - /// In fr, this message translates to: - /// **'Supprimer le groupe'** - String get adminDeleteGroup; - - /// No description provided for @adminDeletedGroup. - /// - /// In fr, this message translates to: - /// **'Groupe supprimé'** - String get adminDeletedGroup; - - /// No description provided for @adminDeleteSchool. - /// - /// In fr, this message translates to: - /// **'Supprimer l\'école ?'** - String get adminDeleteSchool; - - /// No description provided for @adminDeletedSchool. - /// - /// In fr, this message translates to: - /// **'École supprimée'** - String get adminDeletedSchool; - - /// No description provided for @adminDeleting. - /// - /// In fr, this message translates to: - /// **'Suppression'** - String get adminDeleting; - - /// No description provided for @adminDeletingError. - /// - /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get adminDeletingError; - - /// No description provided for @adminDescription. - /// - /// In fr, this message translates to: - /// **'Description'** - String get adminDescription; - - /// No description provided for @adminEdit. - /// - /// In fr, this message translates to: - /// **'Modifier'** - String get adminEdit; - - /// No description provided for @adminEditStructure. - /// - /// In fr, this message translates to: - /// **'Modifier la structure'** - String get adminEditStructure; - - /// No description provided for @adminEditMembership. - /// - /// In fr, this message translates to: - /// **'Modifier l\'adhésion'** - String get adminEditMembership; - - /// No description provided for @adminEmptyDate. - /// - /// In fr, this message translates to: - /// **'Date vide'** - String get adminEmptyDate; - - /// No description provided for @adminEmptyFieldError. - /// - /// In fr, this message translates to: - /// **'Le nom ne peut pas être vide'** - String get adminEmptyFieldError; - - /// No description provided for @adminEmailFailed. - /// - /// In fr, this message translates to: - /// **'Impossible d\'envoyer un mail aux adresses suivantes'** - String get adminEmailFailed; + /// **'Importer une liste'** + String get adminImportList; - /// No description provided for @adminEmailRegex. + /// No description provided for @adminImportUsersDescription. /// /// In fr, this message translates to: - /// **'Email Regex'** - String get adminEmailRegex; + /// **'Importer des utilisateurs depuis un fichier CSV. Le fichier CSV doit contenir une adresse email par ligne.'** + String get adminImportUsersDescription; - /// No description provided for @adminEmptyUser. + /// No description provided for @adminInvite. /// /// In fr, this message translates to: - /// **'Utilisateur vide'** - String get adminEmptyUser; + /// **'Inviter'** + String get adminInvite; - /// No description provided for @adminEndDate. + /// No description provided for @adminInvitedUsers. /// /// In fr, this message translates to: - /// **'Date de fin'** - String get adminEndDate; + /// **'Utilisateurs invités'** + String get adminInvitedUsers; - /// No description provided for @adminEndDateMaximal. + /// No description provided for @adminInviteUsers. /// /// In fr, this message translates to: - /// **'Date de fin maximale'** - String get adminEndDateMaximal; + /// **'Inviter des utilisateurs'** + String get adminInviteUsers; - /// No description provided for @adminEndDateMinimal. + /// Text with the number of users in the CSV file /// /// In fr, this message translates to: - /// **'Date de fin minimale'** - String get adminEndDateMinimal; + /// **'{count, plural, zero {Aucun utilisateur} one {{count} utilisateur} other {{count} utilisateurs}} dans le fichier CSV'** + String adminInviteUsersCounter(int count); - /// No description provided for @adminError. + /// No description provided for @adminLoaningGroup. /// /// In fr, this message translates to: - /// **'Erreur'** - String get adminError; + /// **'Groupe de prêt'** + String get adminLoaningGroup; - /// No description provided for @adminFilters. + /// No description provided for @adminLooking. /// /// In fr, this message translates to: - /// **'Filtres'** - String get adminFilters; + /// **'Recherche'** + String get adminLooking; - /// No description provided for @adminGroup. + /// No description provided for @adminManageAssociations. /// /// In fr, this message translates to: - /// **'Groupe'** - String get adminGroup; + /// **'Gérer les associations'** + String get adminManageAssociations; - /// No description provided for @adminGroups. + /// No description provided for @adminManageMembers. /// /// In fr, this message translates to: - /// **'Groupes'** - String get adminGroups; + /// **'Gérer les membres'** + String get adminManageMembers; - /// No description provided for @adminIban. + /// No description provided for @adminManagePaiementStructures. /// /// In fr, this message translates to: - /// **'IBAN'** - String get adminIban; + /// **'Gérer les structures du module de paiement'** + String get adminManagePaiementStructures; - /// No description provided for @adminIbanError. + /// No description provided for @adminManager. /// /// In fr, this message translates to: - /// **'L\'IBAN doit faire 27 caractères'** - String get adminIbanError; + /// **'Administrateur de la structure'** + String get adminManager; - /// No description provided for @adminLoaningGroup. + /// Groupe qui gère l'association /// /// In fr, this message translates to: - /// **'Groupe de prêt'** - String get adminLoaningGroup; + /// **'Groupe gestionnaire : {groupName}'** + String adminManagerGroup(String groupName); - /// No description provided for @adminLooking. + /// No description provided for @adminManageUserGroups. /// /// In fr, this message translates to: - /// **'Recherche'** - String get adminLooking; + /// **'Gérer les groupes d\'utilisateurs'** + String get adminManageUserGroups; - /// No description provided for @adminManager. + /// No description provided for @adminManageUsersAssociationMemberships. /// /// In fr, this message translates to: - /// **'Administrateur de la structure'** - String get adminManager; + /// **'Gérer les adhésions des utilisateurs'** + String get adminManageUsersAssociationMemberships; /// No description provided for @adminMaximum. /// @@ -866,11 +740,11 @@ abstract class AppLocalizations { /// **'Minimum'** String get adminMinimum; - /// No description provided for @adminModifyModuleVisibility. + /// No description provided for @adminModifyPermissions. /// /// In fr, this message translates to: - /// **'Visibilité des modules'** - String get adminModifyModuleVisibility; + /// **'Modifier les permissions'** + String get adminModifyPermissions; /// No description provided for @adminName. /// @@ -908,6 +782,30 @@ abstract class AppLocalizations { /// **'Sans école'** String get adminNoSchool; + /// No description provided for @adminNotificationSent. + /// + /// In fr, this message translates to: + /// **'Notification envoyée'** + String get adminNotificationSent; + + /// Notifie les membres du groupe sélectionné + /// + /// In fr, this message translates to: + /// **'Notifier le groupe {groupName}'** + String adminNotifyGroup(String groupName); + + /// No description provided for @adminPaiement. + /// + /// In fr, this message translates to: + /// **'Paiement'** + String get adminPaiement; + + /// No description provided for @adminPaiementModule. + /// + /// In fr, this message translates to: + /// **'Module de paiement'** + String get adminPaiementModule; + /// No description provided for @adminRemoveGroupMember. /// /// In fr, this message translates to: @@ -926,47 +824,59 @@ abstract class AppLocalizations { /// **'Écoles'** String get adminSchools; - /// No description provided for @adminShortId. + /// No description provided for @adminSelectGroupAssociationManager. /// /// In fr, this message translates to: - /// **'Short ID (3 lettres)'** - String get adminShortId; + /// **'Séléctionner roupe gestionnaire de l\'association'** + String get adminSelectGroupAssociationManager; - /// No description provided for @adminShortIdError. + /// No description provided for @adminSelectManager. /// /// In fr, this message translates to: - /// **'Le short ID doit faire 3 caractères'** - String get adminShortIdError; + /// **'Sélectionner un gestionnaire'** + String get adminSelectManager; - /// No description provided for @adminSiegeAddress. + /// No description provided for @adminSend. /// /// In fr, this message translates to: - /// **'Adresse du siège'** - String get adminSiegeAddress; + /// **'Envoyer'** + String get adminSend; - /// No description provided for @adminSiret. + /// No description provided for @adminSendNotificationToGroup. /// /// In fr, this message translates to: - /// **'SIRET'** - String get adminSiret; + /// **'Envoyer une notification à un groupe'** + String get adminSendNotificationToGroup; - /// No description provided for @adminSiretError. + /// No description provided for @adminShortId. /// /// In fr, this message translates to: - /// **'SIRET must be 14 digits'** - String get adminSiretError; + /// **'Short ID (3 lettres)'** + String get adminShortId; - /// No description provided for @adminStreet. + /// No description provided for @adminShortIdError. /// /// In fr, this message translates to: - /// **'Numéro et rue'** - String get adminStreet; + /// **'Le short ID doit faire 3 caractères'** + String get adminShortIdError; - /// No description provided for @adminStructures. + /// No description provided for @adminSiegeAddress. /// /// In fr, this message translates to: - /// **'Structures'** - String get adminStructures; + /// **'Adresse du siège'** + String get adminSiegeAddress; + + /// No description provided for @adminSiret. + /// + /// In fr, this message translates to: + /// **'SIRET'** + String get adminSiret; + + /// No description provided for @adminSiretError. + /// + /// In fr, this message translates to: + /// **'SIRET must be 14 digits'** + String get adminSiretError; /// No description provided for @adminStartDate. /// @@ -986,12 +896,42 @@ abstract class AppLocalizations { /// **'Date de début minimale'** String get adminStartDateMinimal; + /// No description provided for @adminStreet. + /// + /// In fr, this message translates to: + /// **'Numéro et rue'** + String get adminStreet; + + /// No description provided for @adminStructures. + /// + /// In fr, this message translates to: + /// **'Structures'** + String get adminStructures; + + /// No description provided for @adminTitle. + /// + /// In fr, this message translates to: + /// **'Titre'** + String get adminTitle; + + /// No description provided for @adminTooHeavyLogo. + /// + /// In fr, this message translates to: + /// **'Le logo de l\'association est trop lourd, il doit faire moins de 4 Mo'** + String get adminTooHeavyLogo; + /// No description provided for @adminUndefinedBankAccountHolder. /// /// In fr, this message translates to: /// **'Titulaire du compte bancaire non défini'** String get adminUndefinedBankAccountHolder; + /// No description provided for @adminUpdatedAssociationLogo. + /// + /// In fr, this message translates to: + /// **'Logo de l\'association mis à jour'** + String get adminUpdatedAssociationLogo; + /// No description provided for @adminUpdatedAssociationMembership. /// /// In fr, this message translates to: @@ -1022,6 +962,24 @@ abstract class AppLocalizations { /// **'Utilisateur'** String get adminUser; + /// No description provided for @adminUsersAndGroups. + /// + /// In fr, this message translates to: + /// **'Utilisateurs et groupes'** + String get adminUsersAndGroups; + + /// No description provided for @adminUsersManagement. + /// + /// In fr, this message translates to: + /// **'Gestion des utilisateurs'** + String get adminUsersManagement; + + /// No description provided for @adminUsersManagementDescription. + /// + /// In fr, this message translates to: + /// **'Gérer les utilisateurs de l\'application'** + String get adminUsersManagementDescription; + /// No description provided for @adminValidateFilters. /// /// In fr, this message translates to: @@ -1040,1231 +998,949 @@ abstract class AppLocalizations { /// **'Code postal'** String get adminZipcode; - /// No description provided for @adminGroupNotification. + /// No description provided for @advertAdd. /// /// In fr, this message translates to: - /// **'Notification de groupe'** - String get adminGroupNotification; + /// **'Ajouter'** + String get advertAdd; - /// Notifie les membres du groupe sélectionné + /// No description provided for @advertAddedAdvert. /// /// In fr, this message translates to: - /// **'Notifier le groupe {groupName}'** - String adminNotifyGroup(String groupName); + /// **'Annonce publiée'** + String get advertAddedAdvert; - /// No description provided for @adminTitle. + /// No description provided for @advertAddedAnnouncer. /// /// In fr, this message translates to: - /// **'Titre'** - String get adminTitle; + /// **'Annonceur ajouté'** + String get advertAddedAnnouncer; - /// No description provided for @adminContent. + /// No description provided for @advertAddingError. /// /// In fr, this message translates to: - /// **'Contenu'** - String get adminContent; + /// **'Erreur lors de l\'ajout'** + String get advertAddingError; - /// No description provided for @adminSend. + /// No description provided for @advertAdmin. /// /// In fr, this message translates to: - /// **'Envoyer'** - String get adminSend; + /// **'Admin'** + String get advertAdmin; - /// No description provided for @adminNotificationSent. + /// No description provided for @advertAdvert. /// /// In fr, this message translates to: - /// **'Notification envoyée'** - String get adminNotificationSent; + /// **'Annonce'** + String get advertAdvert; - /// No description provided for @adminFailedToSendNotification. + /// No description provided for @advertChoosingAnnouncer. /// /// In fr, this message translates to: - /// **'Échec de l\'envoi de la notification'** - String get adminFailedToSendNotification; + /// **'Veuillez choisir un annonceur'** + String get advertChoosingAnnouncer; - /// No description provided for @adminGroupsManagement. + /// No description provided for @advertChoosingPoster. /// /// In fr, this message translates to: - /// **'Gestion des groupes'** - String get adminGroupsManagement; + /// **'Veuillez choisir une image'** + String get advertChoosingPoster; - /// No description provided for @adminEditGroup. + /// No description provided for @advertContent. /// /// In fr, this message translates to: - /// **'Modifier le groupe'** - String get adminEditGroup; + /// **'Contenu'** + String get advertContent; - /// No description provided for @adminManageMembers. + /// No description provided for @advertDeleteAdvert. /// /// In fr, this message translates to: - /// **'Gérer les membres'** - String get adminManageMembers; + /// **'Supprimer l\'annonce'** + String get advertDeleteAdvert; - /// No description provided for @adminDeleteGroupConfirmation. + /// No description provided for @advertDeleteAnnouncer. /// /// In fr, this message translates to: - /// **'Êtes-vous sûr de vouloir supprimer ce groupe ?'** - String get adminDeleteGroupConfirmation; + /// **'Supprimer l\'annonceur ?'** + String get advertDeleteAnnouncer; - /// No description provided for @adminFailedToDeleteGroup. + /// No description provided for @advertDeleting. /// /// In fr, this message translates to: - /// **'Échec de la suppression du groupe'** - String get adminFailedToDeleteGroup; + /// **'Suppression'** + String get advertDeleting; - /// No description provided for @adminUsersAndGroups. + /// No description provided for @advertEdit. /// /// In fr, this message translates to: - /// **'Utilisateurs et groupes'** - String get adminUsersAndGroups; + /// **'Modifier'** + String get advertEdit; - /// No description provided for @adminUsersManagement. + /// No description provided for @advertEditedAdvert. /// /// In fr, this message translates to: - /// **'Gestion des utilisateurs'** - String get adminUsersManagement; + /// **'Annonce modifiée'** + String get advertEditedAdvert; - /// No description provided for @adminUsersManagementDescription. + /// No description provided for @advertEditingError. /// /// In fr, this message translates to: - /// **'Gérer les utilisateurs de l\'application'** - String get adminUsersManagementDescription; + /// **'Erreur lors de la modification'** + String get advertEditingError; - /// No description provided for @adminManageUserGroups. + /// No description provided for @advertGroupAdvert. /// /// In fr, this message translates to: - /// **'Gérer les groupes d\'utilisateurs'** - String get adminManageUserGroups; + /// **'Groupe'** + String get advertGroupAdvert; - /// No description provided for @adminSendNotificationToGroup. + /// No description provided for @advertIncorrectOrMissingFields. /// /// In fr, this message translates to: - /// **'Envoyer une notification à un groupe'** - String get adminSendNotificationToGroup; + /// **'Champs incorrects ou manquants'** + String get advertIncorrectOrMissingFields; - /// No description provided for @adminPaiementModule. + /// No description provided for @advertInvalidNumber. /// /// In fr, this message translates to: - /// **'Module de paiement'** - String get adminPaiementModule; + /// **'Veuillez entrer un nombre'** + String get advertInvalidNumber; - /// No description provided for @adminPaiement. + /// No description provided for @advertManagement. /// /// In fr, this message translates to: - /// **'Paiement'** - String get adminPaiement; + /// **'Gestion'** + String get advertManagement; - /// No description provided for @adminManagePaiementStructures. + /// No description provided for @advertModifyAnnouncingGroup. /// /// In fr, this message translates to: - /// **'Gérer les structures du module de paiement'** - String get adminManagePaiementStructures; + /// **'Modifier un groupe d\'annonce'** + String get advertModifyAnnouncingGroup; - /// No description provided for @adminManageUsersAssociationMemberships. + /// No description provided for @advertMonthApr. /// /// In fr, this message translates to: - /// **'Gérer les adhésions des utilisateurs'** - String get adminManageUsersAssociationMemberships; + /// **'Avr.'** + String get advertMonthApr; - /// No description provided for @adminAssociationMembershipsManagement. + /// No description provided for @advertMonthAug. /// /// In fr, this message translates to: - /// **'Gestion des adhésions'** - String get adminAssociationMembershipsManagement; + /// **'Août'** + String get advertMonthAug; - /// No description provided for @adminChooseGroupManager. + /// No description provided for @advertMonthDec. /// /// In fr, this message translates to: - /// **'Groupe gestionnaire de l\'adhésion'** - String get adminChooseGroupManager; + /// **'Déc.'** + String get advertMonthDec; - /// No description provided for @adminSelectManager. + /// No description provided for @advertMonthFeb. /// /// In fr, this message translates to: - /// **'Sélectionner un gestionnaire'** - String get adminSelectManager; + /// **'Févr.'** + String get advertMonthFeb; - /// No description provided for @adminImportList. + /// No description provided for @advertMonthJan. /// /// In fr, this message translates to: - /// **'Importer une liste'** - String get adminImportList; + /// **'Janv'** + String get advertMonthJan; - /// No description provided for @adminImportUsersDescription. + /// No description provided for @advertMonthJul. /// /// In fr, this message translates to: - /// **'Importer des utilisateurs depuis un fichier CSV. Le fichier CSV doit contenir une adresse email par ligne.'** - String get adminImportUsersDescription; + /// **'Juill.'** + String get advertMonthJul; - /// No description provided for @adminFailedToInviteUsers. + /// No description provided for @advertMonthJun. /// /// In fr, this message translates to: - /// **'Échec de l\'invitation des utilisateurs'** - String get adminFailedToInviteUsers; + /// **'Juin'** + String get advertMonthJun; - /// No description provided for @adminDeleteUsers. + /// No description provided for @advertMonthMar. /// /// In fr, this message translates to: - /// **'Supprimer des utilisateurs'** - String get adminDeleteUsers; + /// **'Mars'** + String get advertMonthMar; - /// No description provided for @adminAdmin. + /// No description provided for @advertMonthMay. /// /// In fr, this message translates to: - /// **'Admin'** - String get adminAdmin; + /// **'Mai'** + String get advertMonthMay; - /// No description provided for @adminAssociations. + /// No description provided for @advertMonthNov. /// /// In fr, this message translates to: - /// **'Associations'** - String get adminAssociations; + /// **'Nov.'** + String get advertMonthNov; - /// No description provided for @adminManageAssociations. + /// No description provided for @advertMonthOct. /// /// In fr, this message translates to: - /// **'Gérer les associations'** - String get adminManageAssociations; + /// **'Oct.'** + String get advertMonthOct; - /// No description provided for @adminAddAssociation. + /// No description provided for @advertMonthSep. /// /// In fr, this message translates to: - /// **'Ajouter une association'** - String get adminAddAssociation; + /// **'Sept.'** + String get advertMonthSep; - /// No description provided for @adminAssociationName. + /// No description provided for @advertNoMoreAnnouncer. /// /// In fr, this message translates to: - /// **'Nom de l\'association'** - String get adminAssociationName; + /// **'Aucun annonceur n\'est disponible'** + String get advertNoMoreAnnouncer; - /// No description provided for @adminSelectGroupAssociationManager. + /// No description provided for @advertNotification. /// /// In fr, this message translates to: - /// **'Séléctionner roupe gestionnaire de l\'association'** - String get adminSelectGroupAssociationManager; + /// **'Envoyer une notification'** + String get advertNotification; - /// Modifier les informations de l'association + /// No description provided for @advertNoValue. /// /// In fr, this message translates to: - /// **'Modifier l\'association : {associationName}'** - String adminEditAssociation(String associationName); + /// **'Veuillez entrer une valeur'** + String get advertNoValue; - /// Groupe qui gère l'association + /// No description provided for @advertPositiveNumber. /// /// In fr, this message translates to: - /// **'Groupe gestionnaire : {groupName}'** - String adminManagerGroup(String groupName); + /// **'Veuillez entrer un nombre positif'** + String get advertPositiveNumber; - /// No description provided for @adminAssociationCreated. + /// No description provided for @advertPublishToFeed. /// /// In fr, this message translates to: - /// **'Association créée'** - String get adminAssociationCreated; + /// **'Publier dans le feed'** + String get advertPublishToFeed; - /// No description provided for @adminAssociationUpdated. + /// No description provided for @advertRemovedAnnouncer. /// /// In fr, this message translates to: - /// **'Association mise à jour'** - String get adminAssociationUpdated; + /// **'Annonceur supprimé'** + String get advertRemovedAnnouncer; - /// No description provided for @adminAssociationCreationError. + /// No description provided for @advertRemovingError. /// /// In fr, this message translates to: - /// **'Échec de la création de l\'association'** - String get adminAssociationCreationError; + /// **'Erreur lors de la suppression'** + String get advertRemovingError; - /// No description provided for @adminAssociationUpdateError. + /// No description provided for @advertTags. /// /// In fr, this message translates to: - /// **'Échec de la mise à jour de l\'association'** - String get adminAssociationUpdateError; + /// **'Tags'** + String get advertTags; - /// No description provided for @adminInvite. + /// No description provided for @advertTitle. /// /// In fr, this message translates to: - /// **'Inviter'** - String get adminInvite; + /// **'Titre'** + String get advertTitle; - /// No description provided for @adminInvitedUsers. + /// No description provided for @amapAccounts. /// /// In fr, this message translates to: - /// **'Utilisateurs invités'** - String get adminInvitedUsers; + /// **'Comptes'** + String get amapAccounts; - /// No description provided for @adminInviteUsers. + /// No description provided for @amapAdd. /// /// In fr, this message translates to: - /// **'Inviter des utilisateurs'** - String get adminInviteUsers; + /// **'Ajouter'** + String get amapAdd; - /// Text with the number of users in the CSV file + /// No description provided for @amapAddDelivery. /// /// In fr, this message translates to: - /// **'{count, plural, zero {Aucun utilisateur} one {{count} utilisateur} other {{count} utilisateurs}} dans le fichier CSV'** - String adminInviteUsersCounter(int count); + /// **'Ajouter une livraison'** + String get amapAddDelivery; - /// No description provided for @adminUpdatedAssociationLogo. + /// No description provided for @amapAddedCommand. /// /// In fr, this message translates to: - /// **'Logo de l\'association mis à jour'** - String get adminUpdatedAssociationLogo; + /// **'Commande ajoutée'** + String get amapAddedCommand; - /// No description provided for @adminTooHeavyLogo. + /// No description provided for @amapAddedOrder. /// /// In fr, this message translates to: - /// **'Le logo de l\'association est trop lourd, il doit faire moins de 4 Mo'** - String get adminTooHeavyLogo; + /// **'Commande ajoutée'** + String get amapAddedOrder; - /// No description provided for @adminFailedToUpdateAssociationLogo. + /// No description provided for @amapAddedProduct. /// /// In fr, this message translates to: - /// **'Échec de la mise à jour du logo de l\'association'** - String get adminFailedToUpdateAssociationLogo; + /// **'Produit ajouté'** + String get amapAddedProduct; - /// No description provided for @adminChooseGroup. + /// No description provided for @amapAddedUser. /// /// In fr, this message translates to: - /// **'Choisir un groupe'** - String get adminChooseGroup; + /// **'Utilisateur ajouté'** + String get amapAddedUser; - /// No description provided for @adminChooseAssociationManagerGroup. + /// No description provided for @amapAddingACommand. /// /// In fr, this message translates to: - /// **'Choisir un groupe gestionnaire pour l\'association'** - String get adminChooseAssociationManagerGroup; + /// **'Ajouter une commande'** + String get amapAddingACommand; - /// No description provided for @advertAdd. + /// No description provided for @amapAddingCommand. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get advertAdd; + /// **'Ajouter la commande'** + String get amapAddingCommand; - /// No description provided for @advertAddedAdvert. + /// No description provided for @amapAddingError. /// /// In fr, this message translates to: - /// **'Annonce publiée'** - String get advertAddedAdvert; + /// **'Erreur lors de l\'ajout'** + String get amapAddingError; - /// No description provided for @advertAddedAnnouncer. + /// No description provided for @amapAddingProduct. /// /// In fr, this message translates to: - /// **'Annonceur ajouté'** - String get advertAddedAnnouncer; + /// **'Ajouter un produit'** + String get amapAddingProduct; - /// No description provided for @advertAddingError. + /// No description provided for @amapAddOrder. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get advertAddingError; + /// **'Ajouter une commande'** + String get amapAddOrder; - /// No description provided for @advertAdmin. + /// No description provided for @amapAddProduct. /// /// In fr, this message translates to: - /// **'Admin'** - String get advertAdmin; + /// **'Ajouter un produit'** + String get amapAddProduct; - /// No description provided for @advertAdvert. + /// No description provided for @amapAddUser. /// /// In fr, this message translates to: - /// **'Annonce'** - String get advertAdvert; + /// **'Ajouter un utilisateur'** + String get amapAddUser; - /// No description provided for @advertChoosingAnnouncer. + /// No description provided for @amapAdmin. /// /// In fr, this message translates to: - /// **'Veuillez choisir un annonceur'** - String get advertChoosingAnnouncer; + /// **'Admin'** + String get amapAdmin; - /// No description provided for @advertChoosingPoster. + /// No description provided for @amapAlreadyExistCommand. /// /// In fr, this message translates to: - /// **'Veuillez choisir une image'** - String get advertChoosingPoster; + /// **'Il existe déjà une commande à cette date'** + String get amapAlreadyExistCommand; - /// No description provided for @advertContent. + /// No description provided for @amapAmap. /// /// In fr, this message translates to: - /// **'Contenu'** - String get advertContent; + /// **'Amap'** + String get amapAmap; - /// No description provided for @advertDeleteAdvert. + /// No description provided for @amapAmount. /// /// In fr, this message translates to: - /// **'Supprimer l\'annonce'** - String get advertDeleteAdvert; + /// **'Solde'** + String get amapAmount; - /// No description provided for @advertDeleteAnnouncer. + /// No description provided for @amapArchive. /// /// In fr, this message translates to: - /// **'Supprimer l\'annonceur ?'** - String get advertDeleteAnnouncer; + /// **'Archiver'** + String get amapArchive; - /// No description provided for @advertDeleting. + /// No description provided for @amapArchiveDelivery. /// /// In fr, this message translates to: - /// **'Suppression'** - String get advertDeleting; + /// **'Archiver'** + String get amapArchiveDelivery; - /// No description provided for @advertEdit. + /// No description provided for @amapArchivingDelivery. /// /// In fr, this message translates to: - /// **'Modifier'** - String get advertEdit; + /// **'Archivage de la livraison'** + String get amapArchivingDelivery; - /// No description provided for @advertEditedAdvert. + /// No description provided for @amapCategory. /// /// In fr, this message translates to: - /// **'Annonce modifiée'** - String get advertEditedAdvert; + /// **'Catégorie'** + String get amapCategory; - /// No description provided for @advertEditingError. + /// No description provided for @amapCloseDelivery. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get advertEditingError; + /// **'Verrouiller'** + String get amapCloseDelivery; - /// No description provided for @advertGroupAdvert. + /// No description provided for @amapCommandDate. /// /// In fr, this message translates to: - /// **'Groupe'** - String get advertGroupAdvert; + /// **'Date de la commande'** + String get amapCommandDate; - /// No description provided for @advertIncorrectOrMissingFields. + /// No description provided for @amapCommandName. /// /// In fr, this message translates to: - /// **'Champs incorrects ou manquants'** - String get advertIncorrectOrMissingFields; + /// **'Nom de la commande'** + String get amapCommandName; - /// No description provided for @advertInvalidNumber. + /// No description provided for @amapCommandProducts. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nombre'** - String get advertInvalidNumber; + /// **'Produits de la commande'** + String get amapCommandProducts; - /// No description provided for @advertManagement. + /// No description provided for @amapConfirm. /// /// In fr, this message translates to: - /// **'Gestion'** - String get advertManagement; + /// **'Confirmer'** + String get amapConfirm; - /// No description provided for @advertModifyAnnouncingGroup. + /// No description provided for @amapContact. /// /// In fr, this message translates to: - /// **'Modifier un groupe d\'annonce'** - String get advertModifyAnnouncingGroup; + /// **'Contacts associatifs '** + String get amapContact; - /// No description provided for @advertNoMoreAnnouncer. + /// No description provided for @amapCreateCategory. /// /// In fr, this message translates to: - /// **'Aucun annonceur n\'est disponible'** - String get advertNoMoreAnnouncer; + /// **'Créer une catégorie'** + String get amapCreateCategory; - /// No description provided for @advertNoValue. + /// No description provided for @amapDelete. /// /// In fr, this message translates to: - /// **'Veuillez entrer une valeur'** - String get advertNoValue; + /// **'Supprimer'** + String get amapDelete; - /// No description provided for @advertPositiveNumber. + /// No description provided for @amapDeletedDelivery. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nombre positif'** - String get advertPositiveNumber; - - /// No description provided for @advertPublishToFeed. + /// **'Livraison supprimée'** + String get amapDeletedDelivery; + + /// No description provided for @amapDeleteDelivery. /// /// In fr, this message translates to: - /// **'Publier dans le feed'** - String get advertPublishToFeed; + /// **'Supprimer la livraison ?'** + String get amapDeleteDelivery; - /// No description provided for @advertNotification. + /// No description provided for @amapDeleteDeliveryDescription. /// /// In fr, this message translates to: - /// **'Envoyer une notification'** - String get advertNotification; + /// **'Voulez-vous vraiment supprimer cette livraison ?'** + String get amapDeleteDeliveryDescription; - /// No description provided for @advertRemovedAnnouncer. + /// No description provided for @amapDeletedOrder. /// /// In fr, this message translates to: - /// **'Annonceur supprimé'** - String get advertRemovedAnnouncer; + /// **'Commande supprimée'** + String get amapDeletedOrder; - /// No description provided for @advertRemovingError. + /// No description provided for @amapDeletedProduct. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get advertRemovingError; + /// **'Produit supprimé'** + String get amapDeletedProduct; - /// No description provided for @advertTags. + /// No description provided for @amapDeleteProduct. /// /// In fr, this message translates to: - /// **'Tags'** - String get advertTags; + /// **'Supprimer le produit ?'** + String get amapDeleteProduct; - /// No description provided for @advertTitle. + /// No description provided for @amapDeleteProductDescription. /// /// In fr, this message translates to: - /// **'Titre'** - String get advertTitle; + /// **'Voulez-vous vraiment supprimer ce produit ?'** + String get amapDeleteProductDescription; - /// No description provided for @advertMonthJan. + /// No description provided for @amapDeleting. /// /// In fr, this message translates to: - /// **'Janv'** - String get advertMonthJan; + /// **'Suppression'** + String get amapDeleting; - /// No description provided for @advertMonthFeb. + /// No description provided for @amapDeletingDelivery. /// /// In fr, this message translates to: - /// **'Févr.'** - String get advertMonthFeb; + /// **'Supprimer la livraison ?'** + String get amapDeletingDelivery; - /// No description provided for @advertMonthMar. + /// No description provided for @amapDeletingError. /// /// In fr, this message translates to: - /// **'Mars'** - String get advertMonthMar; + /// **'Erreur lors de la suppression'** + String get amapDeletingError; - /// No description provided for @advertMonthApr. + /// No description provided for @amapDeletingOrder. /// /// In fr, this message translates to: - /// **'Avr.'** - String get advertMonthApr; + /// **'Supprimer la commande ?'** + String get amapDeletingOrder; - /// No description provided for @advertMonthMay. + /// No description provided for @amapDeletingProduct. /// /// In fr, this message translates to: - /// **'Mai'** - String get advertMonthMay; + /// **'Supprimer le produit ?'** + String get amapDeletingProduct; - /// No description provided for @advertMonthJun. + /// No description provided for @amapDeliver. /// /// In fr, this message translates to: - /// **'Juin'** - String get advertMonthJun; + /// **'Livraison teminée ?'** + String get amapDeliver; - /// No description provided for @advertMonthJul. + /// No description provided for @amapDeliveries. /// /// In fr, this message translates to: - /// **'Juill.'** - String get advertMonthJul; + /// **'Livraisons'** + String get amapDeliveries; - /// No description provided for @advertMonthAug. + /// No description provided for @amapDeliveringDelivery. /// /// In fr, this message translates to: - /// **'Août'** - String get advertMonthAug; + /// **'Toutes les commandes sont livrées ?'** + String get amapDeliveringDelivery; - /// No description provided for @advertMonthSep. + /// No description provided for @amapDelivery. /// /// In fr, this message translates to: - /// **'Sept.'** - String get advertMonthSep; + /// **'Livraison'** + String get amapDelivery; - /// No description provided for @advertMonthOct. + /// No description provided for @amapDeliveryArchived. /// /// In fr, this message translates to: - /// **'Oct.'** - String get advertMonthOct; + /// **'Livraison archivée'** + String get amapDeliveryArchived; - /// No description provided for @advertMonthNov. + /// No description provided for @amapDeliveryDate. /// /// In fr, this message translates to: - /// **'Nov.'** - String get advertMonthNov; + /// **'Date de livraison'** + String get amapDeliveryDate; - /// No description provided for @advertMonthDec. + /// No description provided for @amapDeliveryDelivered. /// /// In fr, this message translates to: - /// **'Déc.'** - String get advertMonthDec; + /// **'Livraison effectuée'** + String get amapDeliveryDelivered; - /// No description provided for @amapAccounts. + /// No description provided for @amapDeliveryHistory. /// /// In fr, this message translates to: - /// **'Comptes'** - String get amapAccounts; + /// **'Historique des livraisons'** + String get amapDeliveryHistory; - /// No description provided for @amapAdd. + /// No description provided for @amapDeliveryList. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get amapAdd; + /// **'Liste des livraisons'** + String get amapDeliveryList; - /// No description provided for @amapAddDelivery. + /// No description provided for @amapDeliveryLocked. /// /// In fr, this message translates to: - /// **'Ajouter une livraison'** - String get amapAddDelivery; + /// **'Livraison verrouillée'** + String get amapDeliveryLocked; - /// No description provided for @amapAddedCommand. + /// No description provided for @amapDeliveryNotArchived. /// /// In fr, this message translates to: - /// **'Commande ajoutée'** - String get amapAddedCommand; + /// **'Livraison non archivée'** + String get amapDeliveryNotArchived; - /// No description provided for @amapAddedOrder. + /// No description provided for @amapDeliveryNotDelivered. /// /// In fr, this message translates to: - /// **'Commande ajoutée'** - String get amapAddedOrder; + /// **'Livraison non effectuée'** + String get amapDeliveryNotDelivered; - /// No description provided for @amapAddedProduct. + /// No description provided for @amapDeliveryNotLocked. /// /// In fr, this message translates to: - /// **'Produit ajouté'** - String get amapAddedProduct; + /// **'Livraison non verrouillée'** + String get amapDeliveryNotLocked; - /// No description provided for @amapAddedUser. + /// No description provided for @amapDeliveryNotOpened. /// /// In fr, this message translates to: - /// **'Utilisateur ajouté'** - String get amapAddedUser; + /// **'Livraison non ouverte'** + String get amapDeliveryNotOpened; - /// No description provided for @amapAddProduct. + /// No description provided for @amapDeliveryOn. /// /// In fr, this message translates to: - /// **'Ajouter un produit'** - String get amapAddProduct; + /// **'Livraison le'** + String get amapDeliveryOn; - /// No description provided for @amapAddUser. + /// No description provided for @amapDeliveryOpened. /// /// In fr, this message translates to: - /// **'Ajouter un utilisateur'** - String get amapAddUser; + /// **'Livraison ouverte'** + String get amapDeliveryOpened; - /// No description provided for @amapAddingACommand. + /// No description provided for @amapEditDelivery. /// /// In fr, this message translates to: - /// **'Ajouter une commande'** - String get amapAddingACommand; + /// **'Modifier la livraison'** + String get amapEditDelivery; - /// No description provided for @amapAddingCommand. + /// No description provided for @amapEditedCommand. /// /// In fr, this message translates to: - /// **'Ajouter la commande'** - String get amapAddingCommand; + /// **'Commande modifiée'** + String get amapEditedCommand; - /// No description provided for @amapAddingError. + /// No description provided for @amapEditingError. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get amapAddingError; + /// **'Erreur lors de la modification'** + String get amapEditingError; - /// No description provided for @amapAddingProduct. + /// No description provided for @amapEditProduct. /// /// In fr, this message translates to: - /// **'Ajouter un produit'** - String get amapAddingProduct; + /// **'Modifier le produit'** + String get amapEditProduct; - /// No description provided for @amapAddOrder. + /// No description provided for @amapEndingDelivery. /// /// In fr, this message translates to: - /// **'Ajouter une commande'** - String get amapAddOrder; + /// **'Fin de la livraison'** + String get amapEndingDelivery; - /// No description provided for @amapAdmin. + /// No description provided for @amapError. /// /// In fr, this message translates to: - /// **'Admin'** - String get amapAdmin; + /// **'Erreur'** + String get amapError; - /// No description provided for @amapAlreadyExistCommand. + /// No description provided for @amapErrorLink. /// /// In fr, this message translates to: - /// **'Il existe déjà une commande à cette date'** - String get amapAlreadyExistCommand; + /// **'Erreur lors de l\'ouverture du lien'** + String get amapErrorLink; - /// No description provided for @amapAmap. + /// No description provided for @amapErrorLoadingUser. /// /// In fr, this message translates to: - /// **'Amap'** - String get amapAmap; + /// **'Erreur lors du chargement des utilisateurs'** + String get amapErrorLoadingUser; - /// No description provided for @amapAmount. + /// No description provided for @amapEvening. /// /// In fr, this message translates to: - /// **'Solde'** - String get amapAmount; + /// **'Soir'** + String get amapEvening; - /// No description provided for @amapArchive. + /// No description provided for @amapExpectingNumber. /// /// In fr, this message translates to: - /// **'Archiver'** - String get amapArchive; + /// **'Veuillez entrer un nombre'** + String get amapExpectingNumber; - /// No description provided for @amapArchiveDelivery. + /// No description provided for @amapFillField. /// /// In fr, this message translates to: - /// **'Archiver'** - String get amapArchiveDelivery; + /// **'Veuillez remplir ce champ'** + String get amapFillField; - /// No description provided for @amapArchivingDelivery. + /// No description provided for @amapHandlingAccount. /// /// In fr, this message translates to: - /// **'Archivage de la livraison'** - String get amapArchivingDelivery; + /// **'Gérer les comptes'** + String get amapHandlingAccount; - /// No description provided for @amapCategory. + /// No description provided for @amapIncorrectlyFilledForm. /// /// In fr, this message translates to: - /// **'Catégorie'** - String get amapCategory; + /// **'Formulaire incorrectement rempli'** + String get amapIncorrectlyFilledForm; - /// No description provided for @amapCloseDelivery. + /// No description provided for @amapLoading. /// /// In fr, this message translates to: - /// **'Verrouiller'** - String get amapCloseDelivery; + /// **'Chargement...'** + String get amapLoading; - /// No description provided for @amapCommandDate. + /// No description provided for @amapLoadingError. /// /// In fr, this message translates to: - /// **'Date de la commande'** - String get amapCommandDate; + /// **'Erreur lors du chargement'** + String get amapLoadingError; - /// No description provided for @amapCommandProducts. + /// No description provided for @amapLock. /// /// In fr, this message translates to: - /// **'Produits de la commande'** - String get amapCommandProducts; + /// **'Verrouiller'** + String get amapLock; - /// No description provided for @amapConfirm. + /// No description provided for @amapLocked. /// /// In fr, this message translates to: - /// **'Confirmer'** - String get amapConfirm; + /// **'Verrouillée'** + String get amapLocked; - /// No description provided for @amapContact. + /// No description provided for @amapLockedDelivery. /// /// In fr, this message translates to: - /// **'Contacts associatifs '** - String get amapContact; + /// **'Livraison verrouillée'** + String get amapLockedDelivery; - /// No description provided for @amapCreateCategory. + /// No description provided for @amapLockedOrder. /// /// In fr, this message translates to: - /// **'Créer une catégorie'** - String get amapCreateCategory; + /// **'Commande verrouillée'** + String get amapLockedOrder; - /// No description provided for @amapDelete. + /// No description provided for @amapLockingDelivery. /// /// In fr, this message translates to: - /// **'Supprimer'** - String get amapDelete; + /// **'Verrouiller la livraison ?'** + String get amapLockingDelivery; - /// No description provided for @amapDeleteDelivery. + /// No description provided for @amapLooking. /// /// In fr, this message translates to: - /// **'Supprimer la livraison ?'** - String get amapDeleteDelivery; + /// **'Rechercher'** + String get amapLooking; - /// No description provided for @amapDeleteDeliveryDescription. + /// No description provided for @amapMidDay. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer cette livraison ?'** - String get amapDeleteDeliveryDescription; + /// **'Midi'** + String get amapMidDay; - /// No description provided for @amapDeletedDelivery. + /// No description provided for @amapMyOrders. /// /// In fr, this message translates to: - /// **'Livraison supprimée'** - String get amapDeletedDelivery; + /// **'Mes commandes'** + String get amapMyOrders; - /// No description provided for @amapDeletedOrder. + /// No description provided for @amapName. /// /// In fr, this message translates to: - /// **'Commande supprimée'** - String get amapDeletedOrder; + /// **'Nom'** + String get amapName; - /// No description provided for @amapDeletedProduct. + /// No description provided for @amapNextStep. /// /// In fr, this message translates to: - /// **'Produit supprimé'** - String get amapDeletedProduct; + /// **'Étape suivante'** + String get amapNextStep; - /// No description provided for @amapDeleteProduct. + /// No description provided for @amapNoCurrentOrder. /// /// In fr, this message translates to: - /// **'Supprimer le produit ?'** - String get amapDeleteProduct; + /// **'Pas de commande en cours'** + String get amapNoCurrentOrder; - /// No description provided for @amapDeleteProductDescription. + /// No description provided for @amapNoMoney. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer ce produit ?'** - String get amapDeleteProductDescription; + /// **'Pas assez d\'argent'** + String get amapNoMoney; - /// No description provided for @amapDeleting. + /// No description provided for @amapNoOpennedDelivery. /// /// In fr, this message translates to: - /// **'Suppression'** - String get amapDeleting; + /// **'Pas de livraison ouverte'** + String get amapNoOpennedDelivery; - /// No description provided for @amapDeletingDelivery. + /// No description provided for @amapNoOrder. /// /// In fr, this message translates to: - /// **'Supprimer la livraison ?'** - String get amapDeletingDelivery; + /// **'Pas de commande'** + String get amapNoOrder; - /// No description provided for @amapDeletingError. + /// No description provided for @amapNoProduct. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get amapDeletingError; + /// **'Pas de produit'** + String get amapNoProduct; - /// No description provided for @amapDeletingOrder. + /// No description provided for @amapNoSelectedDelivery. /// /// In fr, this message translates to: - /// **'Supprimer la commande ?'** - String get amapDeletingOrder; + /// **'Pas de livraison sélectionnée'** + String get amapNoSelectedDelivery; - /// No description provided for @amapDeletingProduct. + /// No description provided for @amapNotEnoughMoney. /// /// In fr, this message translates to: - /// **'Supprimer le produit ?'** - String get amapDeletingProduct; + /// **'Pas assez d\'argent'** + String get amapNotEnoughMoney; - /// No description provided for @amapDeliver. + /// No description provided for @amapNotPlannedDelivery. /// /// In fr, this message translates to: - /// **'Livraison teminée ?'** - String get amapDeliver; + /// **'Pas de livraison planifiée'** + String get amapNotPlannedDelivery; - /// No description provided for @amapDeliveries. + /// No description provided for @amapOneOrder. /// /// In fr, this message translates to: - /// **'Livraisons'** - String get amapDeliveries; + /// **'commande'** + String get amapOneOrder; - /// No description provided for @amapDeliveringDelivery. + /// No description provided for @amapOpenDelivery. /// /// In fr, this message translates to: - /// **'Toutes les commandes sont livrées ?'** - String get amapDeliveringDelivery; + /// **'Ouvrir'** + String get amapOpenDelivery; - /// No description provided for @amapDelivery. + /// No description provided for @amapOpened. /// /// In fr, this message translates to: - /// **'Livraison'** - String get amapDelivery; + /// **'Ouverte'** + String get amapOpened; - /// No description provided for @amapDeliveryArchived. + /// No description provided for @amapOpenningDelivery. /// /// In fr, this message translates to: - /// **'Livraison archivée'** - String get amapDeliveryArchived; + /// **'Ouvrir la livraison ?'** + String get amapOpenningDelivery; - /// No description provided for @amapDeliveryDate. + /// No description provided for @amapOrder. /// /// In fr, this message translates to: - /// **'Date de livraison'** - String get amapDeliveryDate; + /// **'Commander'** + String get amapOrder; - /// No description provided for @amapDeliveryDelivered. + /// No description provided for @amapOrders. /// /// In fr, this message translates to: - /// **'Livraison effectuée'** - String get amapDeliveryDelivered; + /// **'Commandes'** + String get amapOrders; - /// No description provided for @amapDeliveryHistory. + /// No description provided for @amapPickChooseCategory. /// /// In fr, this message translates to: - /// **'Historique des livraisons'** - String get amapDeliveryHistory; + /// **'Veuillez entrer une valeur ou choisir une catégorie existante'** + String get amapPickChooseCategory; - /// No description provided for @amapDeliveryList. + /// No description provided for @amapPickDeliveryMoment. /// /// In fr, this message translates to: - /// **'Liste des livraisons'** - String get amapDeliveryList; + /// **'Choisissez un moment de livraison'** + String get amapPickDeliveryMoment; - /// No description provided for @amapDeliveryLocked. + /// No description provided for @amapPresentation. /// /// In fr, this message translates to: - /// **'Livraison verrouillée'** - String get amapDeliveryLocked; + /// **'Présentation'** + String get amapPresentation; - /// No description provided for @amapDeliveryOn. + /// No description provided for @amapPresentation1. /// /// In fr, this message translates to: - /// **'Livraison le'** - String get amapDeliveryOn; + /// **'L\'AMAP (association pour le maintien d\'une agriculture paysanne) est un service proposé par l\'association Planet&Co de l\'ECL. Vous pouvez ainsi recevoir des produits (paniers de fruits et légumes, jus, confitures...) directement sur le campus !\n\nLes commandes doivent être passées avant le vendredi 21h et sont livrées sur le campus le mardi de 13h à 13h45 (ou de 18h15 à 18h30 si vous ne pouvez pas passer le midi) dans le hall du M16.\n\nVous ne pouvez commander que si votre solde le permet. Vous pouvez recharger votre solde via la collecte Lydia ou bien avec un chèque que vous pouvez nous transmettre lors des permanences.\n\nLien vers la collecte Lydia pour le rechargement : '** + String get amapPresentation1; - /// No description provided for @amapDeliveryOpened. + /// No description provided for @amapPresentation2. /// /// In fr, this message translates to: - /// **'Livraison ouverte'** - String get amapDeliveryOpened; + /// **'\n\nN\'hésitez pas à nous contacter en cas de problème !'** + String get amapPresentation2; - /// No description provided for @amapDeliveryNotArchived. + /// No description provided for @amapPrice. /// /// In fr, this message translates to: - /// **'Livraison non archivée'** - String get amapDeliveryNotArchived; + /// **'Prix'** + String get amapPrice; - /// No description provided for @amapDeliveryNotLocked. + /// No description provided for @amapProduct. /// /// In fr, this message translates to: - /// **'Livraison non verrouillée'** - String get amapDeliveryNotLocked; + /// **'produit'** + String get amapProduct; - /// No description provided for @amapDeliveryNotDelivered. + /// No description provided for @amapProductInDelivery. /// /// In fr, this message translates to: - /// **'Livraison non effectuée'** - String get amapDeliveryNotDelivered; + /// **'Produit dans une livraison non terminée'** + String get amapProductInDelivery; - /// No description provided for @amapDeliveryNotOpened. + /// No description provided for @amapProducts. /// /// In fr, this message translates to: - /// **'Livraison non ouverte'** - String get amapDeliveryNotOpened; + /// **'Produits'** + String get amapProducts; - /// No description provided for @amapEditDelivery. + /// No description provided for @amapQuantity. /// /// In fr, this message translates to: - /// **'Modifier la livraison'** - String get amapEditDelivery; + /// **'Quantité'** + String get amapQuantity; - /// No description provided for @amapEditedCommand. + /// No description provided for @amapRequiredDate. /// /// In fr, this message translates to: - /// **'Commande modifiée'** - String get amapEditedCommand; + /// **'La date est requise'** + String get amapRequiredDate; - /// No description provided for @amapEditingError. + /// No description provided for @amapSeeMore. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get amapEditingError; + /// **'Voir plus'** + String get amapSeeMore; - /// No description provided for @amapEditProduct. + /// No description provided for @amapThe. /// /// In fr, this message translates to: - /// **'Modifier le produit'** - String get amapEditProduct; + /// **'Le'** + String get amapThe; - /// No description provided for @amapEndingDelivery. + /// No description provided for @amapUnlock. /// /// In fr, this message translates to: - /// **'Fin de la livraison'** - String get amapEndingDelivery; + /// **'Dévérouiller'** + String get amapUnlock; - /// No description provided for @amapError. + /// No description provided for @amapUnlockedDelivery. /// /// In fr, this message translates to: - /// **'Erreur'** - String get amapError; + /// **'Livraison dévérouillée'** + String get amapUnlockedDelivery; - /// No description provided for @amapErrorLink. + /// No description provided for @amapUnlockingDelivery. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ouverture du lien'** - String get amapErrorLink; + /// **'Dévérouiller la livraison ?'** + String get amapUnlockingDelivery; - /// No description provided for @amapErrorLoadingUser. + /// No description provided for @amapUpdate. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement des utilisateurs'** - String get amapErrorLoadingUser; + /// **'Modifier'** + String get amapUpdate; - /// No description provided for @amapEvening. + /// No description provided for @amapUpdatedAmount. /// /// In fr, this message translates to: - /// **'Soir'** - String get amapEvening; + /// **'Solde modifié'** + String get amapUpdatedAmount; - /// No description provided for @amapExpectingNumber. + /// No description provided for @amapUpdatedOrder. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nombre'** - String get amapExpectingNumber; + /// **'Commande modifiée'** + String get amapUpdatedOrder; - /// No description provided for @amapFillField. - /// - /// In fr, this message translates to: - /// **'Veuillez remplir ce champ'** - String get amapFillField; - - /// No description provided for @amapHandlingAccount. - /// - /// In fr, this message translates to: - /// **'Gérer les comptes'** - String get amapHandlingAccount; - - /// No description provided for @amapLoading. - /// - /// In fr, this message translates to: - /// **'Chargement...'** - String get amapLoading; - - /// No description provided for @amapLoadingError. - /// - /// In fr, this message translates to: - /// **'Erreur lors du chargement'** - String get amapLoadingError; - - /// No description provided for @amapLock. - /// - /// In fr, this message translates to: - /// **'Verrouiller'** - String get amapLock; - - /// No description provided for @amapLocked. - /// - /// In fr, this message translates to: - /// **'Verrouillée'** - String get amapLocked; - - /// No description provided for @amapLockedDelivery. - /// - /// In fr, this message translates to: - /// **'Livraison verrouillée'** - String get amapLockedDelivery; - - /// No description provided for @amapLockedOrder. - /// - /// In fr, this message translates to: - /// **'Commande verrouillée'** - String get amapLockedOrder; - - /// No description provided for @amapLooking. - /// - /// In fr, this message translates to: - /// **'Rechercher'** - String get amapLooking; - - /// No description provided for @amapLockingDelivery. - /// - /// In fr, this message translates to: - /// **'Verrouiller la livraison ?'** - String get amapLockingDelivery; - - /// No description provided for @amapMidDay. - /// - /// In fr, this message translates to: - /// **'Midi'** - String get amapMidDay; - - /// No description provided for @amapMyOrders. - /// - /// In fr, this message translates to: - /// **'Mes commandes'** - String get amapMyOrders; - - /// No description provided for @amapName. - /// - /// In fr, this message translates to: - /// **'Nom'** - String get amapName; - - /// No description provided for @amapNextStep. - /// - /// In fr, this message translates to: - /// **'Étape suivante'** - String get amapNextStep; - - /// No description provided for @amapNoProduct. - /// - /// In fr, this message translates to: - /// **'Pas de produit'** - String get amapNoProduct; - - /// No description provided for @amapNoCurrentOrder. - /// - /// In fr, this message translates to: - /// **'Pas de commande en cours'** - String get amapNoCurrentOrder; - - /// No description provided for @amapNoMoney. - /// - /// In fr, this message translates to: - /// **'Pas assez d\'argent'** - String get amapNoMoney; - - /// No description provided for @amapNoOpennedDelivery. - /// - /// In fr, this message translates to: - /// **'Pas de livraison ouverte'** - String get amapNoOpennedDelivery; - - /// No description provided for @amapNoOrder. - /// - /// In fr, this message translates to: - /// **'Pas de commande'** - String get amapNoOrder; - - /// No description provided for @amapNoSelectedDelivery. - /// - /// In fr, this message translates to: - /// **'Pas de livraison sélectionnée'** - String get amapNoSelectedDelivery; - - /// No description provided for @amapNotEnoughMoney. - /// - /// In fr, this message translates to: - /// **'Pas assez d\'argent'** - String get amapNotEnoughMoney; - - /// No description provided for @amapNotPlannedDelivery. - /// - /// In fr, this message translates to: - /// **'Pas de livraison planifiée'** - String get amapNotPlannedDelivery; - - /// No description provided for @amapOneOrder. - /// - /// In fr, this message translates to: - /// **'commande'** - String get amapOneOrder; - - /// No description provided for @amapOpenDelivery. - /// - /// In fr, this message translates to: - /// **'Ouvrir'** - String get amapOpenDelivery; - - /// No description provided for @amapOpened. - /// - /// In fr, this message translates to: - /// **'Ouverte'** - String get amapOpened; - - /// No description provided for @amapOpenningDelivery. - /// - /// In fr, this message translates to: - /// **'Ouvrir la livraison ?'** - String get amapOpenningDelivery; - - /// No description provided for @amapOrder. - /// - /// In fr, this message translates to: - /// **'Commander'** - String get amapOrder; - - /// No description provided for @amapOrders. - /// - /// In fr, this message translates to: - /// **'Commandes'** - String get amapOrders; - - /// No description provided for @amapPickChooseCategory. - /// - /// In fr, this message translates to: - /// **'Veuillez entrer une valeur ou choisir une catégorie existante'** - String get amapPickChooseCategory; - - /// No description provided for @amapPickDeliveryMoment. - /// - /// In fr, this message translates to: - /// **'Choisissez un moment de livraison'** - String get amapPickDeliveryMoment; - - /// No description provided for @amapPresentation. - /// - /// In fr, this message translates to: - /// **'Présentation'** - String get amapPresentation; - - /// No description provided for @amapPresentation1. - /// - /// In fr, this message translates to: - /// **'L\'AMAP (association pour le maintien d\'une agriculture paysanne) est un service proposé par l\'association Planet&Co de l\'ECL. Vous pouvez ainsi recevoir des produits (paniers de fruits et légumes, jus, confitures...) directement sur le campus !\n\nLes commandes doivent être passées avant le vendredi 21h et sont livrées sur le campus le mardi de 13h à 13h45 (ou de 18h15 à 18h30 si vous ne pouvez pas passer le midi) dans le hall du M16.\n\nVous ne pouvez commander que si votre solde le permet. Vous pouvez recharger votre solde via la collecte Lydia ou bien avec un chèque que vous pouvez nous transmettre lors des permanences.\n\nLien vers la collecte Lydia pour le rechargement : '** - String get amapPresentation1; - - /// No description provided for @amapPresentation2. - /// - /// In fr, this message translates to: - /// **'\n\nN\'hésitez pas à nous contacter en cas de problème !'** - String get amapPresentation2; - - /// No description provided for @amapPrice. - /// - /// In fr, this message translates to: - /// **'Prix'** - String get amapPrice; - - /// No description provided for @amapProduct. - /// - /// In fr, this message translates to: - /// **'produit'** - String get amapProduct; - - /// No description provided for @amapProducts. - /// - /// In fr, this message translates to: - /// **'Produits'** - String get amapProducts; - - /// No description provided for @amapProductInDelivery. - /// - /// In fr, this message translates to: - /// **'Produit dans une livraison non terminée'** - String get amapProductInDelivery; - - /// No description provided for @amapQuantity. - /// - /// In fr, this message translates to: - /// **'Quantité'** - String get amapQuantity; - - /// No description provided for @amapRequiredDate. - /// - /// In fr, this message translates to: - /// **'La date est requise'** - String get amapRequiredDate; - - /// No description provided for @amapSeeMore. - /// - /// In fr, this message translates to: - /// **'Voir plus'** - String get amapSeeMore; - - /// No description provided for @amapThe. - /// - /// In fr, this message translates to: - /// **'Le'** - String get amapThe; - - /// No description provided for @amapUnlock. - /// - /// In fr, this message translates to: - /// **'Dévérouiller'** - String get amapUnlock; - - /// No description provided for @amapUnlockedDelivery. - /// - /// In fr, this message translates to: - /// **'Livraison dévérouillée'** - String get amapUnlockedDelivery; - - /// No description provided for @amapUnlockingDelivery. - /// - /// In fr, this message translates to: - /// **'Dévérouiller la livraison ?'** - String get amapUnlockingDelivery; - - /// No description provided for @amapUpdate. - /// - /// In fr, this message translates to: - /// **'Modifier'** - String get amapUpdate; - - /// No description provided for @amapUpdatedAmount. - /// - /// In fr, this message translates to: - /// **'Solde modifié'** - String get amapUpdatedAmount; - - /// No description provided for @amapUpdatedOrder. - /// - /// In fr, this message translates to: - /// **'Commande modifiée'** - String get amapUpdatedOrder; - - /// No description provided for @amapUpdatedProduct. + /// No description provided for @amapUpdatedProduct. /// /// In fr, this message translates to: /// **'Produit modifié'** @@ -2294,35 +1970,23 @@ abstract class AppLocalizations { /// **'Ajouter'** String get bookingAdd; - /// No description provided for @bookingAddBookingPage. - /// - /// In fr, this message translates to: - /// **'Demande'** - String get bookingAddBookingPage; - - /// No description provided for @bookingAddRoom. - /// - /// In fr, this message translates to: - /// **'Ajouter une salle'** - String get bookingAddRoom; - /// No description provided for @bookingAddBooking. /// /// In fr, this message translates to: /// **'Ajouter une réservation'** String get bookingAddBooking; - /// No description provided for @bookingAddedBooking. + /// No description provided for @bookingAddBookingPage. /// /// In fr, this message translates to: - /// **'Demande ajoutée'** - String get bookingAddedBooking; + /// **'Demande'** + String get bookingAddBookingPage; - /// No description provided for @bookingAddedRoom. + /// No description provided for @bookingAddedBooking. /// /// In fr, this message translates to: - /// **'Salle ajoutée'** - String get bookingAddedRoom; + /// **'Demande ajoutée'** + String get bookingAddedBooking; /// No description provided for @bookingAddedManager. /// @@ -2330,6 +1994,12 @@ abstract class AppLocalizations { /// **'Gestionnaire ajouté'** String get bookingAddedManager; + /// No description provided for @bookingAddedRoom. + /// + /// In fr, this message translates to: + /// **'Salle ajoutée'** + String get bookingAddedRoom; + /// No description provided for @bookingAddingError. /// /// In fr, this message translates to: @@ -2342,6 +2012,12 @@ abstract class AppLocalizations { /// **'Ajouter un gestionnaire'** String get bookingAddManager; + /// No description provided for @bookingAddRoom. + /// + /// In fr, this message translates to: + /// **'Ajouter une salle'** + String get bookingAddRoom; + /// No description provided for @bookingAdminPage. /// /// In fr, this message translates to: @@ -2456,12 +2132,6 @@ abstract class AppLocalizations { /// **'Supprimer'** String get bookingDelete; - /// No description provided for @bookingDeleting. - /// - /// In fr, this message translates to: - /// **'Suppression'** - String get bookingDeleting; - /// No description provided for @bookingDeleteBooking. /// /// In fr, this message translates to: @@ -2480,17 +2150,23 @@ abstract class AppLocalizations { /// **'Réservation supprimée'** String get bookingDeletedBooking; + /// No description provided for @bookingDeletedManager. + /// + /// In fr, this message translates to: + /// **'Gestionnaire supprimé'** + String get bookingDeletedManager; + /// No description provided for @bookingDeletedRoom. /// /// In fr, this message translates to: /// **'Salle supprimée'** String get bookingDeletedRoom; - /// No description provided for @bookingDeletedManager. + /// No description provided for @bookingDeleteManagerConfirmation. /// /// In fr, this message translates to: - /// **'Gestionnaire supprimé'** - String get bookingDeletedManager; + /// **'Êtes-vous sûr de vouloir supprimer ce gestionnaire ?\n\nLe gestionnaire ne doit être associé à aucune salle pour pouvoir être supprimé'** + String get bookingDeleteManagerConfirmation; /// No description provided for @bookingDeleteRoomConfirmation. /// @@ -2498,11 +2174,11 @@ abstract class AppLocalizations { /// **'Êtes-vous sûr de vouloir supprimer cette salle ?\n\nLa salle ne doit avoir aucune réservation en cours ou à venir pour être supprimée'** String get bookingDeleteRoomConfirmation; - /// No description provided for @bookingDeleteManagerConfirmation. + /// No description provided for @bookingDeleting. /// /// In fr, this message translates to: - /// **'Êtes-vous sûr de vouloir supprimer ce gestionnaire ?\n\nLe gestionnaire ne doit être associé à aucune salle pour pouvoir être supprimé'** - String get bookingDeleteManagerConfirmation; + /// **'Suppression'** + String get bookingDeleting; /// No description provided for @bookingDeletingBooking. /// @@ -2534,29 +2210,29 @@ abstract class AppLocalizations { /// **'Modifier une réservation'** String get bookingEditBooking; - /// No description provided for @bookingEditionError. - /// - /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get bookingEditionError; - /// No description provided for @bookingEditedBooking. /// /// In fr, this message translates to: /// **'Réservation modifiée'** String get bookingEditedBooking; + /// No description provided for @bookingEditedManager. + /// + /// In fr, this message translates to: + /// **'Gestionnaire modifié'** + String get bookingEditedManager; + /// No description provided for @bookingEditedRoom. /// /// In fr, this message translates to: /// **'Salle modifiée'** String get bookingEditedRoom; - /// No description provided for @bookingEditedManager. + /// No description provided for @bookingEditionError. /// /// In fr, this message translates to: - /// **'Gestionnaire modifié'** - String get bookingEditedManager; + /// **'Erreur lors de la modification'** + String get bookingEditionError; /// No description provided for @bookingEditManager. /// @@ -2618,18 +2294,18 @@ abstract class AppLocalizations { /// **'Intervalle'** String get bookingInterval; - /// No description provided for @bookingInvalidIntervalError. - /// - /// In fr, this message translates to: - /// **'Intervalle invalide'** - String get bookingInvalidIntervalError; - /// No description provided for @bookingInvalidDates. /// /// In fr, this message translates to: /// **'Dates invalides'** String get bookingInvalidDates; + /// No description provided for @bookingInvalidIntervalError. + /// + /// In fr, this message translates to: + /// **'Intervalle invalide'** + String get bookingInvalidIntervalError; + /// No description provided for @bookingInvalidRoom. /// /// In fr, this message translates to: @@ -2690,6 +2366,12 @@ abstract class AppLocalizations { /// **'Non'** String get bookingNo; + /// No description provided for @bookingNoAppointmentInReccurence. + /// + /// In fr, this message translates to: + /// **'Aucun créneau existe avec ces paramètres de récurrence'** + String get bookingNoAppointmentInReccurence; + /// No description provided for @bookingNoCurrentBooking. /// /// In fr, this message translates to: @@ -2702,12 +2384,6 @@ abstract class AppLocalizations { /// **'Veuillez choisir une date'** String get bookingNoDateError; - /// No description provided for @bookingNoAppointmentInReccurence. - /// - /// In fr, this message translates to: - /// **'Aucun créneau existe avec ces paramètres de récurrence'** - String get bookingNoAppointmentInReccurence; - /// No description provided for @bookingNoDaySelected. /// /// In fr, this message translates to: @@ -2744,18 +2420,18 @@ abstract class AppLocalizations { /// **'Veuillez entrer un motif'** String get bookingNoReasonError; - /// No description provided for @bookingNoRoomFoundError. - /// - /// In fr, this message translates to: - /// **'Aucune salle enregistrée'** - String get bookingNoRoomFoundError; - /// No description provided for @bookingNoRoomFound. /// /// In fr, this message translates to: /// **'Aucune salle trouvée'** String get bookingNoRoomFound; + /// No description provided for @bookingNoRoomFoundError. + /// + /// In fr, this message translates to: + /// **'Aucune salle enregistrée'** + String get bookingNoRoomFoundError; + /// No description provided for @bookingNote. /// /// In fr, this message translates to: @@ -2840,17 +2516,11 @@ abstract class AppLocalizations { /// **'Heure de début'** String get bookingStartHour; - /// No description provided for @bookingWeeks. - /// - /// In fr, this message translates to: - /// **'Semaines'** - String get bookingWeeks; - - /// No description provided for @bookingYes. + /// No description provided for @bookingWeekDayFri. /// /// In fr, this message translates to: - /// **'Oui'** - String get bookingYes; + /// **'Vendredi'** + String get bookingWeekDayFri; /// No description provided for @bookingWeekDayMon. /// @@ -2858,17 +2528,17 @@ abstract class AppLocalizations { /// **'Lundi'** String get bookingWeekDayMon; - /// No description provided for @bookingWeekDayTue. + /// No description provided for @bookingWeekDaySat. /// /// In fr, this message translates to: - /// **'Mardi'** - String get bookingWeekDayTue; + /// **'Samedi'** + String get bookingWeekDaySat; - /// No description provided for @bookingWeekDayWed. + /// No description provided for @bookingWeekDaySun. /// /// In fr, this message translates to: - /// **'Mercredi'** - String get bookingWeekDayWed; + /// **'Dimanche'** + String get bookingWeekDaySun; /// No description provided for @bookingWeekDayThu. /// @@ -2876,23 +2546,29 @@ abstract class AppLocalizations { /// **'Jeudi'** String get bookingWeekDayThu; - /// No description provided for @bookingWeekDayFri. + /// No description provided for @bookingWeekDayTue. /// /// In fr, this message translates to: - /// **'Vendredi'** - String get bookingWeekDayFri; + /// **'Mardi'** + String get bookingWeekDayTue; - /// No description provided for @bookingWeekDaySat. + /// No description provided for @bookingWeekDayWed. /// /// In fr, this message translates to: - /// **'Samedi'** - String get bookingWeekDaySat; + /// **'Mercredi'** + String get bookingWeekDayWed; - /// No description provided for @bookingWeekDaySun. + /// No description provided for @bookingWeeks. /// /// In fr, this message translates to: - /// **'Dimanche'** - String get bookingWeekDaySun; + /// **'Semaines'** + String get bookingWeeks; + + /// No description provided for @bookingYes. + /// + /// In fr, this message translates to: + /// **'Oui'** + String get bookingYes; /// No description provided for @cinemaAdd. /// @@ -2972,6 +2648,12 @@ abstract class AppLocalizations { /// **'Veuillez entrer une URL'** String get cinemaEmptyUrl; + /// No description provided for @cinemaGenre. + /// + /// In fr, this message translates to: + /// **'Genre'** + String get cinemaGenre; + /// No description provided for @cinemaImportFromTMDB. /// /// In fr, this message translates to: @@ -2996,12 +2678,6 @@ abstract class AppLocalizations { /// **'URL invalide'** String get cinemaInvalidUrl; - /// No description provided for @cinemaGenre. - /// - /// In fr, this message translates to: - /// **'Genre'** - String get cinemaGenre; - /// No description provided for @cinemaName. /// /// In fr, this message translates to: @@ -3074,6 +2750,66 @@ abstract class AppLocalizations { /// **'Le'** String get cinemaThe; + /// No description provided for @dateAt. + /// + /// In fr, this message translates to: + /// **'à'** + String get dateAt; + + /// No description provided for @dateBetweenDays. + /// + /// In fr, this message translates to: + /// **'au'** + String get dateBetweenDays; + + /// No description provided for @dateFrom. + /// + /// In fr, this message translates to: + /// **'de'** + String get dateFrom; + + /// No description provided for @dateLast. + /// + /// In fr, this message translates to: + /// **''** + String get dateLast; + + /// No description provided for @dateStarting. + /// + /// In fr, this message translates to: + /// **'Commence'** + String get dateStarting; + + /// No description provided for @dateTo. + /// + /// In fr, this message translates to: + /// **'à'** + String get dateTo; + + /// No description provided for @dateToday. + /// + /// In fr, this message translates to: + /// **'Aujourd\'hui'** + String get dateToday; + + /// No description provided for @dateTomorrow. + /// + /// In fr, this message translates to: + /// **'Demain'** + String get dateTomorrow; + + /// No description provided for @dateUntil. + /// + /// In fr, this message translates to: + /// **'Jusqu\'au'** + String get dateUntil; + + /// No description provided for @dateYesterday. + /// + /// In fr, this message translates to: + /// **'Hier'** + String get dateYesterday; + /// No description provided for @drawerAdmin. /// /// In fr, this message translates to: @@ -3128,65 +2864,155 @@ abstract class AppLocalizations { /// **'Paramètres'** String get drawerSettings; + /// No description provided for @eventActionCampaign. + /// + /// In fr, this message translates to: + /// **'Tu peux voter'** + String get eventActionCampaign; + + /// No description provided for @eventActionCampaignButton. + /// + /// In fr, this message translates to: + /// **'Voter'** + String get eventActionCampaignButton; + + /// No description provided for @eventActionCampaignSubtitle. + /// + /// In fr, this message translates to: + /// **'Votez maintenant'** + String get eventActionCampaignSubtitle; + + /// No description provided for @eventActionCampaignValidated. + /// + /// In fr, this message translates to: + /// **'J\'ai voté !'** + String get eventActionCampaignValidated; + + /// No description provided for @eventActionEvent. + /// + /// In fr, this message translates to: + /// **'Tu es invité'** + String get eventActionEvent; + + /// No description provided for @eventActionEventButton. + /// + /// In fr, this message translates to: + /// **'Réserver'** + String get eventActionEventButton; + + /// No description provided for @eventActionEventSubtitle. + /// + /// In fr, this message translates to: + /// **'Répondez à l\'invitation'** + String get eventActionEventSubtitle; + + /// No description provided for @eventActionEventValidated. + /// + /// In fr, this message translates to: + /// **'Je viens !'** + String get eventActionEventValidated; + /// No description provided for @eventAdd. /// /// In fr, this message translates to: /// **'Ajouter'** String get eventAdd; + /// No description provided for @eventAddedEvent. + /// + /// In fr, this message translates to: + /// **'Événement ajouté'** + String get eventAddedEvent; + /// No description provided for @eventAddEvent. /// /// In fr, this message translates to: /// **'Ajouter un événement'** String get eventAddEvent; - /// No description provided for @eventAddedEvent. + /// No description provided for @eventAddingError. /// /// In fr, this message translates to: - /// **'Événement ajouté'** - String get eventAddedEvent; + /// **'Erreur lors de l\'ajout'** + String get eventAddingError; - /// No description provided for @eventAddingError. + /// No description provided for @eventAllDay. + /// + /// In fr, this message translates to: + /// **'Toute la journée'** + String get eventAllDay; + + /// No description provided for @eventConfirm. + /// + /// In fr, this message translates to: + /// **'Confirmer'** + String get eventConfirm; + + /// No description provided for @eventConfirmation. + /// + /// In fr, this message translates to: + /// **'Confirmation'** + String get eventConfirmation; + + /// No description provided for @eventConfirmed. + /// + /// In fr, this message translates to: + /// **'Confirmé'** + String get eventConfirmed; + + /// No description provided for @eventConfirmEvent. + /// + /// In fr, this message translates to: + /// **'Confirmer l\'événement ?'** + String get eventConfirmEvent; + + /// No description provided for @eventDates. + /// + /// In fr, this message translates to: + /// **'Dates'** + String get eventDates; + + /// No description provided for @eventDayFri. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get eventAddingError; + /// **'Vendredi'** + String get eventDayFri; - /// No description provided for @eventAllDay. + /// No description provided for @eventDayMon. /// /// In fr, this message translates to: - /// **'Toute la journée'** - String get eventAllDay; + /// **'Lundi'** + String get eventDayMon; - /// No description provided for @eventConfirm. + /// No description provided for @eventDaySat. /// /// In fr, this message translates to: - /// **'Confirmer'** - String get eventConfirm; + /// **'Samedi'** + String get eventDaySat; - /// No description provided for @eventConfirmEvent. + /// No description provided for @eventDaySun. /// /// In fr, this message translates to: - /// **'Confirmer l\'événement ?'** - String get eventConfirmEvent; + /// **'Dimanche'** + String get eventDaySun; - /// No description provided for @eventConfirmation. + /// No description provided for @eventDayThu. /// /// In fr, this message translates to: - /// **'Confirmation'** - String get eventConfirmation; + /// **'Jeudi'** + String get eventDayThu; - /// No description provided for @eventConfirmed. + /// No description provided for @eventDayTue. /// /// In fr, this message translates to: - /// **'Confirmé'** - String get eventConfirmed; + /// **'Mardi'** + String get eventDayTue; - /// No description provided for @eventDates. + /// No description provided for @eventDayWed. /// /// In fr, this message translates to: - /// **'Dates'** - String get eventDates; + /// **'Mercredi'** + String get eventDayWed; /// No description provided for @eventDecline. /// @@ -3194,18 +3020,18 @@ abstract class AppLocalizations { /// **'Refuser'** String get eventDecline; - /// No description provided for @eventDeclineEvent. - /// - /// In fr, this message translates to: - /// **'Refuser l\'événement ?'** - String get eventDeclineEvent; - /// No description provided for @eventDeclined. /// /// In fr, this message translates to: /// **'Refusé'** String get eventDeclined; + /// No description provided for @eventDeclineEvent. + /// + /// In fr, this message translates to: + /// **'Refuser l\'événement ?'** + String get eventDeclineEvent; + /// No description provided for @eventDelete. /// /// In fr, this message translates to: @@ -3254,18 +3080,18 @@ abstract class AppLocalizations { /// **'Modifier'** String get eventEdit; - /// No description provided for @eventEditEvent. - /// - /// In fr, this message translates to: - /// **'Modifier un événement'** - String get eventEditEvent; - /// No description provided for @eventEditedEvent. /// /// In fr, this message translates to: /// **'Événement modifié'** String get eventEditedEvent; + /// No description provided for @eventEditEvent. + /// + /// In fr, this message translates to: + /// **'Modifier un événement'** + String get eventEditEvent; + /// No description provided for @eventEditingError. /// /// In fr, this message translates to: @@ -3290,6 +3116,12 @@ abstract class AppLocalizations { /// **'Erreur'** String get eventError; + /// No description provided for @eventEventEvery. + /// + /// In fr, this message translates to: + /// **'Toutes les'** + String get eventEventEvery; + /// No description provided for @eventEventList. /// /// In fr, this message translates to: @@ -3323,260 +3155,446 @@ abstract class AppLocalizations { /// No description provided for @eventInterval. /// /// In fr, this message translates to: - /// **'Intervalle'** - String get eventInterval; + /// **'Intervalle'** + String get eventInterval; + + /// No description provided for @eventInvalidDates. + /// + /// In fr, this message translates to: + /// **'La date de fin doit être après la date de début'** + String get eventInvalidDates; + + /// No description provided for @eventInvalidIntervalError. + /// + /// In fr, this message translates to: + /// **'Veuillez entrer un intervalle valide'** + String get eventInvalidIntervalError; + + /// No description provided for @eventLocation. + /// + /// In fr, this message translates to: + /// **'Lieu'** + String get eventLocation; + + /// No description provided for @eventModifiedEvent. + /// + /// In fr, this message translates to: + /// **'Événement modifié'** + String get eventModifiedEvent; + + /// No description provided for @eventModifyingError. + /// + /// In fr, this message translates to: + /// **'Erreur lors de la modification'** + String get eventModifyingError; + + /// No description provided for @eventMyEvents. + /// + /// In fr, this message translates to: + /// **'Mes événements'** + String get eventMyEvents; + + /// No description provided for @eventName. + /// + /// In fr, this message translates to: + /// **'Nom'** + String get eventName; + + /// No description provided for @eventNext. + /// + /// In fr, this message translates to: + /// **'Suivant'** + String get eventNext; + + /// No description provided for @eventNo. + /// + /// In fr, this message translates to: + /// **'Non'** + String get eventNo; + + /// No description provided for @eventNoCurrentEvent. + /// + /// In fr, this message translates to: + /// **'Aucun événement en cours'** + String get eventNoCurrentEvent; + + /// No description provided for @eventNoDateError. + /// + /// In fr, this message translates to: + /// **'Veuillez entrer une date'** + String get eventNoDateError; + + /// No description provided for @eventNoDaySelected. + /// + /// In fr, this message translates to: + /// **'Aucun jour sélectionné'** + String get eventNoDaySelected; + + /// No description provided for @eventNoDescriptionError. + /// + /// In fr, this message translates to: + /// **'Veuillez entrer une description'** + String get eventNoDescriptionError; + + /// No description provided for @eventNoEvent. + /// + /// In fr, this message translates to: + /// **'Aucun événement'** + String get eventNoEvent; + + /// No description provided for @eventNoNameError. + /// + /// In fr, this message translates to: + /// **'Veuillez entrer un nom'** + String get eventNoNameError; + + /// No description provided for @eventNoOrganizerError. + /// + /// In fr, this message translates to: + /// **'Veuillez entrer un organisateur'** + String get eventNoOrganizerError; + + /// No description provided for @eventNoPhoneRegistered. + /// + /// In fr, this message translates to: + /// **'Numéro non renseigné'** + String get eventNoPhoneRegistered; + + /// No description provided for @eventNoPlaceError. + /// + /// In fr, this message translates to: + /// **'Veuillez entrer un lieu'** + String get eventNoPlaceError; + + /// No description provided for @eventNoRuleError. + /// + /// In fr, this message translates to: + /// **'Veuillez entrer une règle de récurrence'** + String get eventNoRuleError; + + /// No description provided for @eventOrganizer. + /// + /// In fr, this message translates to: + /// **'Organisateur'** + String get eventOrganizer; + + /// No description provided for @eventOther. + /// + /// In fr, this message translates to: + /// **'Autre'** + String get eventOther; + + /// No description provided for @eventPending. + /// + /// In fr, this message translates to: + /// **'En attente'** + String get eventPending; + + /// No description provided for @eventPrevious. + /// + /// In fr, this message translates to: + /// **'Précédent'** + String get eventPrevious; + + /// No description provided for @eventRecurrence. + /// + /// In fr, this message translates to: + /// **'Récurrence'** + String get eventRecurrence; + + /// No description provided for @eventRecurrenceDays. + /// + /// In fr, this message translates to: + /// **'Jours de récurrence'** + String get eventRecurrenceDays; + + /// No description provided for @eventRecurrenceEndDate. + /// + /// In fr, this message translates to: + /// **'Date de fin de la récurrence'** + String get eventRecurrenceEndDate; + + /// No description provided for @eventRecurrenceRule. + /// + /// In fr, this message translates to: + /// **'Règle de récurrence'** + String get eventRecurrenceRule; + + /// No description provided for @eventRoom. + /// + /// In fr, this message translates to: + /// **'Salle'** + String get eventRoom; + + /// No description provided for @eventStartDate. + /// + /// In fr, this message translates to: + /// **'Date de début'** + String get eventStartDate; + + /// No description provided for @eventStartHour. + /// + /// In fr, this message translates to: + /// **'Heure de début'** + String get eventStartHour; + + /// No description provided for @eventTitle. + /// + /// In fr, this message translates to: + /// **'Événements'** + String get eventTitle; - /// No description provided for @eventInvalidDates. + /// No description provided for @eventWeeks. /// /// In fr, this message translates to: - /// **'La date de fin doit être après la date de début'** - String get eventInvalidDates; + /// **'semaines'** + String get eventWeeks; - /// No description provided for @eventInvalidIntervalError. + /// No description provided for @eventYes. /// /// In fr, this message translates to: - /// **'Veuillez entrer un intervalle valide'** - String get eventInvalidIntervalError; + /// **'Oui'** + String get eventYes; - /// No description provided for @eventLocation. + /// No description provided for @feedAdmin. /// /// In fr, this message translates to: - /// **'Lieu'** - String get eventLocation; + /// **'Administration'** + String get feedAdmin; - /// No description provided for @eventModifiedEvent. + /// No description provided for @feedApply. /// /// In fr, this message translates to: - /// **'Événement modifié'** - String get eventModifiedEvent; + /// **'Appliquer'** + String get feedApply; - /// No description provided for @eventModifyingError. + /// No description provided for @feedApprove. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get eventModifyingError; + /// **'Approuver'** + String get feedApprove; - /// No description provided for @eventMyEvents. + /// No description provided for @feedAssociation. /// /// In fr, this message translates to: - /// **'Mes événements'** - String get eventMyEvents; + /// **'Association'** + String get feedAssociation; - /// No description provided for @eventName. + /// Association event /// /// In fr, this message translates to: - /// **'Nom'** - String get eventName; + /// **'Event de {name}'** + String feedAssociationEvent(String name); - /// No description provided for @eventNext. + /// No description provided for @feedCantOpenLink. /// /// In fr, this message translates to: - /// **'Suivant'** - String get eventNext; + /// **'Impossible d\'ouvrir le lien'** + String get feedCantOpenLink; - /// No description provided for @eventNo. + /// No description provided for @feedCreateAnEvent. /// /// In fr, this message translates to: - /// **'Non'** - String get eventNo; + /// **'Créer un événement'** + String get feedCreateAnEvent; - /// No description provided for @eventNoCurrentEvent. + /// No description provided for @feedCreateEvent. /// /// In fr, this message translates to: - /// **'Aucun événement en cours'** - String get eventNoCurrentEvent; + /// **'Créer l\'événement'** + String get feedCreateEvent; - /// No description provided for @eventNoDateError. + /// No description provided for @feedEditEvent. /// /// In fr, this message translates to: - /// **'Veuillez entrer une date'** - String get eventNoDateError; + /// **'Modifier l\'événement'** + String get feedEditEvent; - /// No description provided for @eventNoDaySelected. + /// No description provided for @feedEmptyAll. /// /// In fr, this message translates to: - /// **'Aucun jour sélectionné'** - String get eventNoDaySelected; + /// **'Aucun événement disponible'** + String get feedEmptyAll; - /// No description provided for @eventNoDescriptionError. + /// No description provided for @feedEmptyApproved. /// /// In fr, this message translates to: - /// **'Veuillez entrer une description'** - String get eventNoDescriptionError; + /// **'Aucun événement approuvé'** + String get feedEmptyApproved; - /// No description provided for @eventNoEvent. + /// No description provided for @feedEmptyPending. /// /// In fr, this message translates to: - /// **'Aucun événement'** - String get eventNoEvent; + /// **'Aucun événement en attente de validation'** + String get feedEmptyPending; - /// No description provided for @eventNoNameError. + /// No description provided for @feedEmptyRejected. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nom'** - String get eventNoNameError; + /// **'Aucun événement rejeté'** + String get feedEmptyRejected; - /// No description provided for @eventNoOrganizerError. + /// No description provided for @feedEnded. /// /// In fr, this message translates to: - /// **'Veuillez entrer un organisateur'** - String get eventNoOrganizerError; + /// **'Terminé'** + String get feedEnded; - /// No description provided for @eventNoPlaceError. + /// No description provided for @feedEventManagement. /// /// In fr, this message translates to: - /// **'Veuillez entrer un lieu'** - String get eventNoPlaceError; + /// **'Gestion des événements'** + String get feedEventManagement; - /// No description provided for @eventNoPhoneRegistered. + /// No description provided for @feedFilter. /// /// In fr, this message translates to: - /// **'Numéro non renseigné'** - String get eventNoPhoneRegistered; + /// **'Filtrer'** + String get feedFilter; - /// No description provided for @eventNoRuleError. + /// No description provided for @feedFilterAll. /// /// In fr, this message translates to: - /// **'Veuillez entrer une règle de récurrence'** - String get eventNoRuleError; + /// **'Tous'** + String get feedFilterAll; - /// No description provided for @eventOrganizer. + /// No description provided for @feedFilterApproved. /// /// In fr, this message translates to: - /// **'Organisateur'** - String get eventOrganizer; + /// **'Approuvés'** + String get feedFilterApproved; - /// No description provided for @eventOther. + /// No description provided for @feedFilterPending. /// /// In fr, this message translates to: - /// **'Autre'** - String get eventOther; + /// **'En attente'** + String get feedFilterPending; - /// No description provided for @eventPending. + /// No description provided for @feedFilterRejected. /// /// In fr, this message translates to: - /// **'En attente'** - String get eventPending; + /// **'Rejetés'** + String get feedFilterRejected; - /// No description provided for @eventPrevious. + /// No description provided for @feedGetReady. /// /// In fr, this message translates to: - /// **'Précédent'** - String get eventPrevious; + /// **'Prépare-toi !'** + String get feedGetReady; - /// No description provided for @eventRecurrence. + /// No description provided for @feedLocation. /// /// In fr, this message translates to: - /// **'Récurrence'** - String get eventRecurrence; + /// **'Lieu'** + String get feedLocation; - /// No description provided for @eventRecurrenceDays. + /// No description provided for @feedManageAssociationEvents. /// /// In fr, this message translates to: - /// **'Jours de récurrence'** - String get eventRecurrenceDays; + /// **'Gérer les événements de l\'association'** + String get feedManageAssociationEvents; - /// No description provided for @eventRecurrenceEndDate. + /// No description provided for @feedManageRequests. /// /// In fr, this message translates to: - /// **'Date de fin de la récurrence'** - String get eventRecurrenceEndDate; + /// **'Demandes de publication'** + String get feedManageRequests; - /// No description provided for @eventRecurrenceRule. + /// No description provided for @feedNews. /// /// In fr, this message translates to: - /// **'Règle de récurrence'** - String get eventRecurrenceRule; + /// **'Calendrier'** + String get feedNews; - /// No description provided for @eventRoom. + /// No description provided for @feedNewsType. /// /// In fr, this message translates to: - /// **'Salle'** - String get eventRoom; + /// **'Type d\'actualité'** + String get feedNewsType; - /// No description provided for @eventStartDate. + /// No description provided for @feedNoAssociationEvents. /// /// In fr, this message translates to: - /// **'Date de début'** - String get eventStartDate; + /// **'Aucun événement d\'association'** + String get feedNoAssociationEvents; - /// No description provided for @eventStartHour. + /// No description provided for @feedNoNewsAvailable. /// /// In fr, this message translates to: - /// **'Heure de début'** - String get eventStartHour; + /// **'Aucune actualité disponible'** + String get feedNoNewsAvailable; - /// No description provided for @eventTitle. + /// No description provided for @feedNotification. /// /// In fr, this message translates to: - /// **'Événements'** - String get eventTitle; + /// **'Envoyer une notification'** + String get feedNotification; - /// No description provided for @eventYes. + /// No description provided for @feedOngoing. /// /// In fr, this message translates to: - /// **'Oui'** - String get eventYes; + /// **'En cours'** + String get feedOngoing; - /// No description provided for @eventEventEvery. + /// No description provided for @feedPleaseProvideASGDate. /// /// In fr, this message translates to: - /// **'Toutes les'** - String get eventEventEvery; + /// **'Veuillez entrer une date de SG'** + String get feedPleaseProvideASGDate; - /// No description provided for @eventWeeks. + /// No description provided for @feedPleaseProvideASGExternalLink. /// /// In fr, this message translates to: - /// **'semaines'** - String get eventWeeks; + /// **'Veuillez entrer un lien externe pour le SG'** + String get feedPleaseProvideASGExternalLink; - /// No description provided for @eventDayMon. + /// No description provided for @feedPleaseSelectAnAssociation. /// /// In fr, this message translates to: - /// **'Lundi'** - String get eventDayMon; + /// **'Veuillez sélectionner une association'** + String get feedPleaseSelectAnAssociation; - /// No description provided for @eventDayTue. + /// No description provided for @feedRefresh. /// /// In fr, this message translates to: - /// **'Mardi'** - String get eventDayTue; + /// **'Actualiser'** + String get feedRefresh; - /// No description provided for @eventDayWed. + /// No description provided for @feedReject. /// /// In fr, this message translates to: - /// **'Mercredi'** - String get eventDayWed; + /// **'Rejeter'** + String get feedReject; - /// No description provided for @eventDayThu. + /// No description provided for @feedSGDate. /// /// In fr, this message translates to: - /// **'Jeudi'** - String get eventDayThu; + /// **'Date du SG'** + String get feedSGDate; - /// No description provided for @eventDayFri. + /// No description provided for @feedSGExternalLink. /// /// In fr, this message translates to: - /// **'Vendredi'** - String get eventDayFri; + /// **'Lien externe du SG'** + String get feedSGExternalLink; - /// No description provided for @eventDaySat. + /// Placeholder pour le temps restant avant le shotgun /// /// In fr, this message translates to: - /// **'Samedi'** - String get eventDaySat; + /// **'Shotgun {time}'** + String feedShotgunIn(String time); - /// No description provided for @eventDaySun. + /// No description provided for @feedTitle. /// /// In fr, this message translates to: - /// **'Dimanche'** - String get eventDaySun; + /// **'Titre'** + String get feedTitle; - /// No description provided for @globalConfirm. + /// Temps restant avant le vote /// /// In fr, this message translates to: - /// **'Confirmer'** - String get globalConfirm; + /// **'Vote {time}'** + String feedVoteIn(String time); /// No description provided for @globalCancel. /// @@ -3584,6 +3602,12 @@ abstract class AppLocalizations { /// **'Annuler'** String get globalCancel; + /// No description provided for @globalConfirm. + /// + /// In fr, this message translates to: + /// **'Confirmer'** + String get globalConfirm; + /// No description provided for @globalIrreversibleAction. /// /// In fr, this message translates to: @@ -3626,23 +3650,29 @@ abstract class AppLocalizations { /// **'Aucun évènement'** String get homeNoEvents; + /// No description provided for @homeTranslateDayShortFri. + /// + /// In fr, this message translates to: + /// **'Ven'** + String get homeTranslateDayShortFri; + /// No description provided for @homeTranslateDayShortMon. /// /// In fr, this message translates to: /// **'Lun'** String get homeTranslateDayShortMon; - /// No description provided for @homeTranslateDayShortTue. + /// No description provided for @homeTranslateDayShortSat. /// /// In fr, this message translates to: - /// **'Mar'** - String get homeTranslateDayShortTue; + /// **'Sam'** + String get homeTranslateDayShortSat; - /// No description provided for @homeTranslateDayShortWed. + /// No description provided for @homeTranslateDayShortSun. /// /// In fr, this message translates to: - /// **'Mer'** - String get homeTranslateDayShortWed; + /// **'Dim'** + String get homeTranslateDayShortSun; /// No description provided for @homeTranslateDayShortThu. /// @@ -3650,23 +3680,17 @@ abstract class AppLocalizations { /// **'Jeu'** String get homeTranslateDayShortThu; - /// No description provided for @homeTranslateDayShortFri. - /// - /// In fr, this message translates to: - /// **'Ven'** - String get homeTranslateDayShortFri; - - /// No description provided for @homeTranslateDayShortSat. + /// No description provided for @homeTranslateDayShortTue. /// /// In fr, this message translates to: - /// **'Sam'** - String get homeTranslateDayShortSat; + /// **'Mar'** + String get homeTranslateDayShortTue; - /// No description provided for @homeTranslateDayShortSun. + /// No description provided for @homeTranslateDayShortWed. /// /// In fr, this message translates to: - /// **'Dim'** - String get homeTranslateDayShortSun; + /// **'Mer'** + String get homeTranslateDayShortWed; /// No description provided for @loanAdd. /// @@ -3674,18 +3698,6 @@ abstract class AppLocalizations { /// **'Ajouter'** String get loanAdd; - /// No description provided for @loanAddLoan. - /// - /// In fr, this message translates to: - /// **'Ajouter un prêt'** - String get loanAddLoan; - - /// No description provided for @loanAddObject. - /// - /// In fr, this message translates to: - /// **'Ajouter un objet'** - String get loanAddObject; - /// No description provided for @loanAddedLoan. /// /// In fr, this message translates to: @@ -3710,35 +3722,23 @@ abstract class AppLocalizations { /// **'Erreur lors de l\'ajout'** String get loanAddingError; - /// No description provided for @loanAdmin. - /// - /// In fr, this message translates to: - /// **'Administrateur'** - String get loanAdmin; - - /// No description provided for @loanAvailable. - /// - /// In fr, this message translates to: - /// **'Disponible'** - String get loanAvailable; - - /// No description provided for @loanAvailableMultiple. + /// No description provided for @loanAddLoan. /// /// In fr, this message translates to: - /// **'Disponibles'** - String get loanAvailableMultiple; + /// **'Ajouter un prêt'** + String get loanAddLoan; - /// No description provided for @loanBorrowed. + /// No description provided for @loanAddObject. /// /// In fr, this message translates to: - /// **'Emprunté'** - String get loanBorrowed; + /// **'Ajouter un objet'** + String get loanAddObject; - /// No description provided for @loanBorrowedMultiple. + /// No description provided for @loanAdmin. /// /// In fr, this message translates to: - /// **'Empruntés'** - String get loanBorrowedMultiple; + /// **'Administrateur'** + String get loanAdmin; /// No description provided for @loanAnd. /// @@ -3752,29 +3752,47 @@ abstract class AppLocalizations { /// **'Association'** String get loanAssociation; + /// No description provided for @loanAvailable. + /// + /// In fr, this message translates to: + /// **'Disponible'** + String get loanAvailable; + /// No description provided for @loanAvailableItems. /// /// In fr, this message translates to: /// **'Objets disponibles'** String get loanAvailableItems; + /// No description provided for @loanAvailableMultiple. + /// + /// In fr, this message translates to: + /// **'Disponibles'** + String get loanAvailableMultiple; + /// No description provided for @loanBeginDate. /// /// In fr, this message translates to: /// **'Date du début du prêt'** String get loanBeginDate; - /// No description provided for @loanBorrower. + /// No description provided for @loanBorrowed. /// /// In fr, this message translates to: - /// **'Emprunteur'** - String get loanBorrower; + /// **'Emprunté'** + String get loanBorrowed; - /// No description provided for @loanCaution. + /// No description provided for @loanBorrowedMultiple. /// /// In fr, this message translates to: - /// **'Caution'** - String get loanCaution; + /// **'Empruntés'** + String get loanBorrowedMultiple; + + /// No description provided for @loanBorrower. + /// + /// In fr, this message translates to: + /// **'Emprunteur'** + String get loanBorrower; /// No description provided for @loanCancel. /// @@ -3782,6 +3800,12 @@ abstract class AppLocalizations { /// **'Annuler'** String get loanCancel; + /// No description provided for @loanCaution. + /// + /// In fr, this message translates to: + /// **'Caution'** + String get loanCaution; + /// No description provided for @loanConfirm. /// /// In fr, this message translates to: @@ -3818,12 +3842,6 @@ abstract class AppLocalizations { /// **'Supprimer'** String get loanDelete; - /// No description provided for @loanDeletingLoan. - /// - /// In fr, this message translates to: - /// **'Supprimer le prêt ?'** - String get loanDeletingLoan; - /// No description provided for @loanDeletedItem. /// /// In fr, this message translates to: @@ -3854,6 +3872,12 @@ abstract class AppLocalizations { /// **'Supprimer l\'objet ?'** String get loanDeletingItem; + /// No description provided for @loanDeletingLoan. + /// + /// In fr, this message translates to: + /// **'Supprimer le prêt ?'** + String get loanDeletingLoan; + /// No description provided for @loanDuration. /// /// In fr, this message translates to: @@ -3866,6 +3890,12 @@ abstract class AppLocalizations { /// **'Modifier'** String get loanEdit; + /// No description provided for @loanEditedRoom. + /// + /// In fr, this message translates to: + /// **'Salle modifiée'** + String get loanEditedRoom; + /// No description provided for @loanEditItem. /// /// In fr, this message translates to: @@ -3878,12 +3908,6 @@ abstract class AppLocalizations { /// **'Modifier le prêt'** String get loanEditLoan; - /// No description provided for @loanEditedRoom. - /// - /// In fr, this message translates to: - /// **'Salle modifiée'** - String get loanEditedRoom; - /// No description provided for @loanEndDate. /// /// In fr, this message translates to: @@ -3926,29 +3950,23 @@ abstract class AppLocalizations { /// **'Des champs sont manquants ou incorrects'** String get loanIncorrectOrMissingFields; - /// No description provided for @loanInvalidNumber. - /// - /// In fr, this message translates to: - /// **'Veuillez entrer un nombre'** - String get loanInvalidNumber; - /// No description provided for @loanInvalidDates. /// /// In fr, this message translates to: /// **'Les dates ne sont pas valides'** String get loanInvalidDates; - /// No description provided for @loanItem. + /// No description provided for @loanInvalidNumber. /// /// In fr, this message translates to: - /// **'Objet'** - String get loanItem; + /// **'Veuillez entrer un nombre'** + String get loanInvalidNumber; - /// No description provided for @loanItems. + /// No description provided for @loanItem. /// /// In fr, this message translates to: - /// **'Objets'** - String get loanItems; + /// **'Objet'** + String get loanItem; /// No description provided for @loanItemHandling. /// @@ -3956,6 +3974,12 @@ abstract class AppLocalizations { /// **'Gestion des objets'** String get loanItemHandling; + /// No description provided for @loanItems. + /// + /// In fr, this message translates to: + /// **'Objets'** + String get loanItems; + /// No description provided for @loanItemSelected. /// /// In fr, this message translates to: @@ -4046,24 +4070,18 @@ abstract class AppLocalizations { /// **'Aucun prêt'** String get loanNoLoan; - /// No description provided for @loanNoReturnedDate. - /// - /// In fr, this message translates to: - /// **'Pas de date de retour'** - String get loanNoReturnedDate; - - /// No description provided for @loanQuantity. - /// - /// In fr, this message translates to: - /// **'Quantité'** - String get loanQuantity; - /// No description provided for @loanNone. /// /// In fr, this message translates to: /// **'Aucun'** String get loanNone; + /// No description provided for @loanNoReturnedDate. + /// + /// In fr, this message translates to: + /// **'Pas de date de retour'** + String get loanNoReturnedDate; + /// No description provided for @loanNote. /// /// In fr, this message translates to: @@ -4112,6 +4130,12 @@ abstract class AppLocalizations { /// **'Précédent'** String get loanPrevious; + /// No description provided for @loanQuantity. + /// + /// In fr, this message translates to: + /// **'Quantité'** + String get loanQuantity; + /// No description provided for @loanReturned. /// /// In fr, this message translates to: @@ -4250,12 +4274,6 @@ abstract class AppLocalizations { /// **'Tombolas'** String get loginRaffles; - /// No description provided for @loginSignIn. - /// - /// In fr, this message translates to: - /// **'Se connecter'** - String get loginSignIn; - /// No description provided for @loginRegister. /// /// In fr, this message translates to: @@ -4268,6 +4286,12 @@ abstract class AppLocalizations { /// **'L\'application de l\'associatif'** String get loginShortDescription; + /// No description provided for @loginSignIn. + /// + /// In fr, this message translates to: + /// **'Se connecter'** + String get loginSignIn; + /// No description provided for @loginUpcomingEvents. /// /// In fr, this message translates to: @@ -4280,2393 +4304,2375 @@ abstract class AppLocalizations { /// **'Les prochaines séances'** String get loginUpcomingScreenings; - /// No description provided for @othersCheckInternetConnection. - /// - /// In fr, this message translates to: - /// **'Veuillez vérifier votre connexion internet'** - String get othersCheckInternetConnection; - - /// No description provided for @othersRetry. - /// - /// In fr, this message translates to: - /// **'Réessayer'** - String get othersRetry; - - /// No description provided for @othersTooOldVersion. - /// - /// In fr, this message translates to: - /// **'Votre version de l\'application est trop ancienne.\n\nVeuillez mettre à jour l\'application.'** - String get othersTooOldVersion; - - /// No description provided for @othersUnableToConnectToServer. + /// No description provided for @moduleAdmin. /// /// In fr, this message translates to: - /// **'Impossible de se connecter au serveur'** - String get othersUnableToConnectToServer; + /// **'Admin'** + String get moduleAdmin; - /// No description provided for @othersVersion. + /// No description provided for @moduleAdminDescription. /// /// In fr, this message translates to: - /// **'Version'** - String get othersVersion; + /// **'Gérer les utilisateurs, groupes et structures'** + String get moduleAdminDescription; - /// No description provided for @othersNoModule. + /// No description provided for @moduleAdvert. /// /// In fr, this message translates to: - /// **'Aucun module disponible, veuillez réessayer ultérieurement 😢😢'** - String get othersNoModule; + /// **'Feed'** + String get moduleAdvert; - /// No description provided for @othersAdmin. + /// No description provided for @moduleAdvertDescription. /// /// In fr, this message translates to: - /// **'Admin'** - String get othersAdmin; + /// **'Gérer les feeds'** + String get moduleAdvertDescription; - /// No description provided for @othersError. + /// No description provided for @moduleAmap. /// /// In fr, this message translates to: - /// **'Une erreur est survenue'** - String get othersError; + /// **'AMAP'** + String get moduleAmap; - /// No description provided for @othersNoValue. + /// No description provided for @moduleAmapDescription. /// /// In fr, this message translates to: - /// **'Veuillez entrer une valeur'** - String get othersNoValue; + /// **'Gérer les livraisons et les produits'** + String get moduleAmapDescription; - /// No description provided for @othersInvalidNumber. + /// No description provided for @moduleBooking. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nombre'** - String get othersInvalidNumber; + /// **'Réservation'** + String get moduleBooking; - /// No description provided for @othersNoDateError. + /// No description provided for @moduleBookingDescription. /// /// In fr, this message translates to: - /// **'Veuillez entrer une date'** - String get othersNoDateError; + /// **'Gérer les réservations, les salles et les managers'** + String get moduleBookingDescription; - /// No description provided for @othersImageSizeTooBig. + /// No description provided for @moduleCalendar. /// /// In fr, this message translates to: - /// **'La taille de l\'image ne doit pas dépasser 4 Mio'** - String get othersImageSizeTooBig; + /// **'Calendrier'** + String get moduleCalendar; - /// No description provided for @othersImageError. + /// No description provided for @moduleCalendarDescription. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout de l\'image'** - String get othersImageError; + /// **'Consulter les événements et les activités'** + String get moduleCalendarDescription; - /// No description provided for @paiementAccept. + /// No description provided for @moduleCentralisation. /// /// In fr, this message translates to: - /// **'Accepter'** - String get paiementAccept; + /// **'Centralisation'** + String get moduleCentralisation; - /// No description provided for @paiementAccessPage. + /// No description provided for @moduleCentralisationDescription. /// /// In fr, this message translates to: - /// **'Accéder à la page'** - String get paiementAccessPage; + /// **'Gérer la centralisation des données'** + String get moduleCentralisationDescription; - /// No description provided for @paiementAdd. + /// No description provided for @moduleCinema. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get paiementAdd; + /// **'Cinéma'** + String get moduleCinema; - /// No description provided for @paiementAddedSeller. + /// No description provided for @moduleCinemaDescription. /// /// In fr, this message translates to: - /// **'Vendeur ajouté'** - String get paiementAddedSeller; + /// **'Gérer les séances de cinéma'** + String get moduleCinemaDescription; - /// No description provided for @paiementAddingSellerError. + /// No description provided for @moduleEvent. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout du vendeur'** - String get paiementAddingSellerError; + /// **'Événement'** + String get moduleEvent; - /// No description provided for @paiementAddingStoreError. + /// No description provided for @moduleEventDescription. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout du magasin'** - String get paiementAddingStoreError; + /// **'Gérer les événements et les participants'** + String get moduleEventDescription; - /// No description provided for @paiementAddSeller. + /// No description provided for @moduleFeed. /// /// In fr, this message translates to: - /// **'Ajouter un vendeur'** - String get paiementAddSeller; + /// **'Events'** + String get moduleFeed; - /// No description provided for @paiementAddStore. + /// No description provided for @moduleFeedDescription. /// /// In fr, this message translates to: - /// **'Ajouter un magasin'** - String get paiementAddStore; + /// **'Consulter les événements'** + String get moduleFeedDescription; - /// No description provided for @paiementAddThisDevice. + /// No description provided for @moduleFlappyBird. /// /// In fr, this message translates to: - /// **'Ajouter cet appareil'** - String get paiementAddThisDevice; + /// **'Flappy Bird'** + String get moduleFlappyBird; - /// No description provided for @paiementAdmin. + /// No description provided for @moduleFlappyBirdDescription. /// /// In fr, this message translates to: - /// **'Administrateur'** - String get paiementAdmin; + /// **'Jouer à Flappy Bird et consulter le classement'** + String get moduleFlappyBirdDescription; - /// No description provided for @paiementAmount. + /// No description provided for @moduleLoan. /// /// In fr, this message translates to: - /// **'Montant'** - String get paiementAmount; + /// **'Prêt'** + String get moduleLoan; - /// No description provided for @paiementAskDeviceActivation. + /// No description provided for @moduleLoanDescription. /// /// In fr, this message translates to: - /// **'Demande d\'activation de l\'appareil'** - String get paiementAskDeviceActivation; + /// **'Gérer les prêts et les articles'** + String get moduleLoanDescription; - /// No description provided for @paiementAStore. + /// No description provided for @moduleOthers. /// /// In fr, this message translates to: - /// **'un magasin'** - String get paiementAStore; + /// **'Autres'** + String get moduleOthers; - /// No description provided for @paiementAt. + /// No description provided for @moduleOthersDescription. /// /// In fr, this message translates to: - /// **'à'** - String get paiementAt; + /// **'Afficher les autres modules'** + String get moduleOthersDescription; - /// No description provided for @paiementAuthenticationRequired. + /// No description provided for @modulePayment. /// /// In fr, this message translates to: - /// **'Authentification requise pour payer'** - String get paiementAuthenticationRequired; + /// **'Paiement'** + String get modulePayment; - /// No description provided for @paiementAuthentificationFailed. + /// No description provided for @modulePaymentDescription. /// /// In fr, this message translates to: - /// **'Échec de l\'authentification'** - String get paiementAuthentificationFailed; + /// **'Gérer les paiements, les statistiques et les appareils'** + String get modulePaymentDescription; - /// No description provided for @paiementBalanceAfterTopUp. + /// No description provided for @modulePh. /// /// In fr, this message translates to: - /// **'Solde après recharge :'** - String get paiementBalanceAfterTopUp; + /// **'PH'** + String get modulePh; - /// No description provided for @paiementBalanceAfterTransaction. + /// No description provided for @modulePhDescription. /// /// In fr, this message translates to: - /// **'Solde après paiement : '** - String get paiementBalanceAfterTransaction; + /// **'Gérer les PH, les formulaires et les administrateurs'** + String get modulePhDescription; - /// No description provided for @paiementBank. + /// No description provided for @modulePhonebook. /// /// In fr, this message translates to: - /// **'Encaisser'** - String get paiementBank; + /// **'Annuaire'** + String get modulePhonebook; - /// No description provided for @paiementBillingSpace. + /// No description provided for @modulePhonebookDescription. /// /// In fr, this message translates to: - /// **'Espace facturation'** - String get paiementBillingSpace; + /// **'Gérer les associations, les membres et les administrateurs'** + String get modulePhonebookDescription; - /// No description provided for @paiementCameraPermissionRequired. + /// No description provided for @modulePurchases. /// /// In fr, this message translates to: - /// **'Permission d\'accès à la caméra requise'** - String get paiementCameraPermissionRequired; + /// **'Achats'** + String get modulePurchases; - /// No description provided for @paiementCameraPerssionRequiredDescription. + /// No description provided for @modulePurchasesDescription. /// /// In fr, this message translates to: - /// **'Pour scanner un QR Code, vous devez autoriser l\'accès à la caméra.'** - String get paiementCameraPerssionRequiredDescription; + /// **'Gérer les achats, les tickets et l\'historique'** + String get modulePurchasesDescription; - /// No description provided for @paiementCanBank. + /// No description provided for @moduleRaffle. /// /// In fr, this message translates to: - /// **'Peut encaisser'** - String get paiementCanBank; + /// **'Tombola'** + String get moduleRaffle; - /// No description provided for @paiementCanCancelTransaction. + /// No description provided for @moduleRaffleDescription. /// /// In fr, this message translates to: - /// **'Peut annuler des transactions'** - String get paiementCanCancelTransaction; + /// **'Gérer les tombolas, les prix et les tickets'** + String get moduleRaffleDescription; - /// No description provided for @paiementCancel. + /// No description provided for @moduleRecommendation. /// /// In fr, this message translates to: - /// **'Annuler'** - String get paiementCancel; + /// **'Bons plans'** + String get moduleRecommendation; - /// No description provided for @paiementCancelled. + /// No description provided for @moduleRecommendationDescription. /// /// In fr, this message translates to: - /// **'Annulé'** - String get paiementCancelled; + /// **'Gérer les recommandations, les informations et les administrateurs'** + String get moduleRecommendationDescription; - /// No description provided for @paiementCancelledTransaction. + /// No description provided for @moduleSeedLibrary. /// /// In fr, this message translates to: - /// **'Paiement annulé'** - String get paiementCancelledTransaction; + /// **'Grainothèque'** + String get moduleSeedLibrary; - /// No description provided for @paiementCancelTransaction. + /// No description provided for @moduleSeedLibraryDescription. /// /// In fr, this message translates to: - /// **'Annuler la transaction'** - String get paiementCancelTransaction; + /// **'Gérer les graines, les espèces et les stocks'** + String get moduleSeedLibraryDescription; - /// No description provided for @paiementCancelTransactions. + /// No description provided for @moduleSettings. /// /// In fr, this message translates to: - /// **'Annuler les transactions'** - String get paiementCancelTransactions; + /// **'Paramètres'** + String get moduleSettings; - /// No description provided for @paiementCanManageSellers. + /// No description provided for @moduleSettingsDescription. /// /// In fr, this message translates to: - /// **'Peut gérer les vendeurs'** - String get paiementCanManageSellers; + /// **'Gérer les paramètres de l\'application'** + String get moduleSettingsDescription; - /// No description provided for @paiementCanSeeHistory. + /// No description provided for @moduleStyleGuide. /// /// In fr, this message translates to: - /// **'Peut voir l\'historique'** - String get paiementCanSeeHistory; + /// **'StyleGuide'** + String get moduleStyleGuide; - /// No description provided for @paiementCantLaunchURL. + /// No description provided for @moduleStyleGuideDescription. /// /// In fr, this message translates to: - /// **'Impossible d\'ouvrir le lien'** - String get paiementCantLaunchURL; + /// **'Explore the UI components and styles used in Titan'** + String get moduleStyleGuideDescription; - /// No description provided for @paiementClose. + /// No description provided for @moduleVote. /// /// In fr, this message translates to: - /// **'Fermer'** - String get paiementClose; + /// **'Vote'** + String get moduleVote; - /// No description provided for @paiementCreate. + /// No description provided for @moduleVoteDescription. /// /// In fr, this message translates to: - /// **'Créer'** - String get paiementCreate; + /// **'Gérer les votes, les sections et les candidats'** + String get moduleVoteDescription; - /// No description provided for @paiementCreateInvoice. + /// No description provided for @othersAdmin. /// /// In fr, this message translates to: - /// **'Créer une facture'** - String get paiementCreateInvoice; + /// **'Admin'** + String get othersAdmin; - /// No description provided for @paiementDecline. + /// No description provided for @othersCheckInternetConnection. /// /// In fr, this message translates to: - /// **'Refuser'** - String get paiementDecline; + /// **'Veuillez vérifier votre connexion internet'** + String get othersCheckInternetConnection; - /// No description provided for @paiementDeletedSeller. + /// No description provided for @othersError. /// /// In fr, this message translates to: - /// **'Vendeur supprimé'** - String get paiementDeletedSeller; + /// **'Une erreur est survenue'** + String get othersError; - /// No description provided for @paiementDeleteInvoice. + /// No description provided for @othersImageError. /// /// In fr, this message translates to: - /// **'Supprimer la facture'** - String get paiementDeleteInvoice; + /// **'Erreur lors de l\'ajout de l\'image'** + String get othersImageError; - /// No description provided for @paiementDeleteSeller. + /// No description provided for @othersImageSizeTooBig. /// - /// In fr, this message translates to: - /// **'Supprimer le vendeur'** - String get paiementDeleteSeller; + /// In fr, this message translates to: + /// **'La taille de l\'image ne doit pas dépasser 4 Mio'** + String get othersImageSizeTooBig; - /// No description provided for @paiementDeleteSellerDescription. + /// No description provided for @othersInvalidNumber. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer ce vendeur ?'** - String get paiementDeleteSellerDescription; + /// **'Veuillez entrer un nombre'** + String get othersInvalidNumber; - /// No description provided for @paiementDeleteSuccessfully. + /// No description provided for @othersNoDateError. /// /// In fr, this message translates to: - /// **'Supprimé avec succès'** - String get paiementDeleteSuccessfully; + /// **'Veuillez entrer une date'** + String get othersNoDateError; - /// No description provided for @paiementDeleteStore. + /// No description provided for @othersNoModule. /// /// In fr, this message translates to: - /// **'Supprimer le magasin'** - String get paiementDeleteStore; + /// **'Aucun module disponible, veuillez réessayer ultérieurement 😢😢'** + String get othersNoModule; - /// No description provided for @paiementDeleteStoreDescription. + /// No description provided for @othersNoValue. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer ce magasin ?'** - String get paiementDeleteStoreDescription; + /// **'Veuillez entrer une valeur'** + String get othersNoValue; - /// No description provided for @paiementDeleteStoreError. + /// No description provided for @othersRetry. /// /// In fr, this message translates to: - /// **'Impossible de supprimer le magasin'** - String get paiementDeleteStoreError; + /// **'Réessayer'** + String get othersRetry; - /// No description provided for @paiementDeletingSellerError. + /// No description provided for @othersTooOldVersion. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression du vendeur'** - String get paiementDeletingSellerError; + /// **'Votre version de l\'application est trop ancienne.\n\nVeuillez mettre à jour l\'application.'** + String get othersTooOldVersion; - /// No description provided for @paiementDeviceActivationReceived. + /// Message when the app can't connect to the server with the url of the server /// /// In fr, this message translates to: - /// **'La demande d\'activation est prise en compte, veuilliez consulter votre boite mail pour finaliser la démarche'** - String get paiementDeviceActivationReceived; + /// **'Impossible de se connecter au serveur : {url}'** + String othersUnableToConnectToServer(String url); - /// No description provided for @paiementDeviceNotActivated. + /// No description provided for @othersVersion. /// /// In fr, this message translates to: - /// **'Appareil non activé'** - String get paiementDeviceNotActivated; + /// **'Version'** + String get othersVersion; - /// No description provided for @paiementDeviceNotActivatedDescription. + /// No description provided for @paiementAccept. /// /// In fr, this message translates to: - /// **'Votre appareil n\'est pas encore activé. \nPour l\'activer, veuillez vous rendre sur la page des appareils.'** - String get paiementDeviceNotActivatedDescription; + /// **'Accepter'** + String get paiementAccept; - /// No description provided for @paiementDeviceNotRegistered. + /// No description provided for @paiementAccessPage. /// /// In fr, this message translates to: - /// **'Appareil non enregistré'** - String get paiementDeviceNotRegistered; + /// **'Accéder à la page'** + String get paiementAccessPage; - /// No description provided for @paiementDeviceNotRegisteredDescription. + /// No description provided for @paiementAdd. /// /// In fr, this message translates to: - /// **'Votre appareil n\'est pas encore enregistré. \nPour l\'enregistrer, veuillez vous rendre sur la page des appareils.'** - String get paiementDeviceNotRegisteredDescription; + /// **'Ajouter'** + String get paiementAdd; - /// No description provided for @paiementDeviceRecoveryError. + /// No description provided for @paiementAddedSeller. /// /// In fr, this message translates to: - /// **'Erreur lors de la récupération de l\'appareil'** - String get paiementDeviceRecoveryError; + /// **'Vendeur ajouté'** + String get paiementAddedSeller; - /// No description provided for @paiementDeviceRevoked. + /// No description provided for @paiementAddingSellerError. /// /// In fr, this message translates to: - /// **'Appareil révoqué'** - String get paiementDeviceRevoked; + /// **'Erreur lors de l\'ajout du vendeur'** + String get paiementAddingSellerError; - /// No description provided for @paiementDeviceRevokingError. + /// No description provided for @paiementAddingStoreError. /// /// In fr, this message translates to: - /// **'Erreur lors de la révocation de l\'appareil'** - String get paiementDeviceRevokingError; + /// **'Erreur lors de l\'ajout du magasin'** + String get paiementAddingStoreError; - /// No description provided for @paiementDevices. + /// No description provided for @paiementAddSeller. /// /// In fr, this message translates to: - /// **'Appareils'** - String get paiementDevices; + /// **'Ajouter un vendeur'** + String get paiementAddSeller; - /// No description provided for @paiementDoneTransaction. + /// No description provided for @paiementAddStore. /// /// In fr, this message translates to: - /// **'Transaction effectuée'** - String get paiementDoneTransaction; + /// **'Ajouter un magasin'** + String get paiementAddStore; - /// No description provided for @paiementDownload. + /// No description provided for @paiementAddThisDevice. /// /// In fr, this message translates to: - /// **'Télécharger'** - String get paiementDownload; + /// **'Ajouter cet appareil'** + String get paiementAddThisDevice; - /// Modifier le magasin + /// No description provided for @paiementAdmin. /// /// In fr, this message translates to: - /// **'Modifier le magasin {store}'** - String paiementEditStore(String store); + /// **'Administrateur'** + String get paiementAdmin; - /// No description provided for @paiementErrorDeleting. + /// No description provided for @paiementAmount. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get paiementErrorDeleting; + /// **'Montant'** + String get paiementAmount; - /// No description provided for @paiementErrorUpdatingStatus. + /// No description provided for @paiementAskDeviceActivation. /// /// In fr, this message translates to: - /// **'Erreur lors de la mise à jour du statut'** - String get paiementErrorUpdatingStatus; + /// **'Demande d\'activation de l\'appareil'** + String get paiementAskDeviceActivation; - /// Text with a date range + /// No description provided for @paiementAStore. /// /// In fr, this message translates to: - /// **'Du {from} au {to}'** - String paiementFromTo(DateTime from, DateTime to); + /// **'un magasin'** + String get paiementAStore; - /// No description provided for @paiementGetBalanceError. + /// No description provided for @paiementAt. /// /// In fr, this message translates to: - /// **'Erreur lors de la récupération du solde : '** - String get paiementGetBalanceError; + /// **'à'** + String get paiementAt; - /// No description provided for @paiementGetTransactionsError. + /// No description provided for @paiementAuthenticationRequired. /// /// In fr, this message translates to: - /// **'Erreur lors de la récupération des transactions : '** - String get paiementGetTransactionsError; + /// **'Authentification requise pour payer'** + String get paiementAuthenticationRequired; - /// No description provided for @paiementHandOver. + /// No description provided for @paiementAuthentificationFailed. /// /// In fr, this message translates to: - /// **'Passation'** - String get paiementHandOver; + /// **'Échec de l\'authentification'** + String get paiementAuthentificationFailed; - /// No description provided for @paiementHistory. + /// No description provided for @paiementBalanceAfterTopUp. /// /// In fr, this message translates to: - /// **'Historique'** - String get paiementHistory; + /// **'Solde après recharge :'** + String get paiementBalanceAfterTopUp; - /// No description provided for @paiementInvoiceCreatedSuccessfully. + /// No description provided for @paiementBalanceAfterTransaction. /// /// In fr, this message translates to: - /// **'Facture créée avec succès'** - String get paiementInvoiceCreatedSuccessfully; + /// **'Solde après paiement : '** + String get paiementBalanceAfterTransaction; - /// No description provided for @paiementInvoices. + /// No description provided for @paiementBank. /// /// In fr, this message translates to: - /// **'Factures'** - String get paiementInvoices; + /// **'Encaisser'** + String get paiementBank; - /// Text with the number of invoices per page + /// No description provided for @paiementBillingSpace. /// /// In fr, this message translates to: - /// **'{quantity} factures/page'** - String paiementInvoicesPerPage(int quantity); + /// **'Espace facturation'** + String get paiementBillingSpace; - /// No description provided for @paiementLastTransactions. + /// No description provided for @paiementCameraPermissionRequired. /// /// In fr, this message translates to: - /// **'Dernières transactions'** - String get paiementLastTransactions; + /// **'Permission d\'accès à la caméra requise'** + String get paiementCameraPermissionRequired; - /// No description provided for @paiementLimitedTo. + /// No description provided for @paiementCameraPerssionRequiredDescription. /// /// In fr, this message translates to: - /// **'Limité à'** - String get paiementLimitedTo; + /// **'Pour scanner un QR Code, vous devez autoriser l\'accès à la caméra.'** + String get paiementCameraPerssionRequiredDescription; - /// No description provided for @paiementManagement. + /// No description provided for @paiementCanBank. /// /// In fr, this message translates to: - /// **'Gestion'** - String get paiementManagement; + /// **'Peut encaisser'** + String get paiementCanBank; - /// No description provided for @paiementManageSellers. + /// No description provided for @paiementCanCancelTransaction. /// /// In fr, this message translates to: - /// **'Gérer les vendeurs'** - String get paiementManageSellers; + /// **'Peut annuler des transactions'** + String get paiementCanCancelTransaction; - /// No description provided for @paiementMarkPaid. + /// No description provided for @paiementCancel. /// /// In fr, this message translates to: - /// **'Marquer comme payé'** - String get paiementMarkPaid; + /// **'Annuler'** + String get paiementCancel; - /// No description provided for @paiementMarkReceived. + /// No description provided for @paiementCancelled. /// /// In fr, this message translates to: - /// **'Marquer comme reçu'** - String get paiementMarkReceived; + /// **'Annulé'** + String get paiementCancelled; - /// No description provided for @paiementMarkUnpaid. + /// No description provided for @paiementCancelledTransaction. /// /// In fr, this message translates to: - /// **'Marquer comme non payé'** - String get paiementMarkUnpaid; + /// **'Paiement annulé'** + String get paiementCancelledTransaction; - /// No description provided for @paiementMaxAmount. + /// No description provided for @paiementCancelTransaction. /// /// In fr, this message translates to: - /// **'Le montant maximum de votre portefeuille est de'** - String get paiementMaxAmount; + /// **'Annuler la transaction'** + String get paiementCancelTransaction; - /// No description provided for @paiementMean. + /// No description provided for @paiementCancelTransactions. /// /// In fr, this message translates to: - /// **'Moyenne : '** - String get paiementMean; + /// **'Annuler les transactions'** + String get paiementCancelTransactions; - /// No description provided for @paiementModify. + /// No description provided for @paiementCanManageSellers. /// /// In fr, this message translates to: - /// **'Modifier'** - String get paiementModify; + /// **'Peut gérer les vendeurs'** + String get paiementCanManageSellers; - /// No description provided for @paiementModifyingStoreError. + /// No description provided for @paiementCanSeeHistory. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification du magasin'** - String get paiementModifyingStoreError; + /// **'Peut voir l\'historique'** + String get paiementCanSeeHistory; - /// No description provided for @paiementModifySuccessfully. + /// No description provided for @paiementCantLaunchURL. /// /// In fr, this message translates to: - /// **'Modifié avec succès'** - String get paiementModifySuccessfully; + /// **'Impossible d\'ouvrir le lien'** + String get paiementCantLaunchURL; - /// No description provided for @paiementNewCGU. + /// No description provided for @paiementClose. /// /// In fr, this message translates to: - /// **'Nouvelles Conditions Générales d\'Utilisation'** - String get paiementNewCGU; + /// **'Fermer'** + String get paiementClose; - /// No description provided for @paiementNext. + /// No description provided for @paiementCreate. /// /// In fr, this message translates to: - /// **'Suivant'** - String get paiementNext; + /// **'Créer'** + String get paiementCreate; - /// No description provided for @paiementNextAccountable. + /// No description provided for @paiementCreateInvoice. /// /// In fr, this message translates to: - /// **'Prochain responsable'** - String get paiementNextAccountable; + /// **'Créer une facture'** + String get paiementCreateInvoice; - /// No description provided for @paiementNoInvoiceToCreate. + /// No description provided for @paiementDecline. /// /// In fr, this message translates to: - /// **'Aucune facture à créer'** - String get paiementNoInvoiceToCreate; + /// **'Refuser'** + String get paiementDecline; - /// No description provided for @paiementNoMembership. + /// No description provided for @paiementDeletedSeller. /// /// In fr, this message translates to: - /// **'Aucune adhésion'** - String get paiementNoMembership; + /// **'Vendeur supprimé'** + String get paiementDeletedSeller; - /// No description provided for @paiementNoMembershipDescription. + /// No description provided for @paiementDeleteInvoice. /// /// In fr, this message translates to: - /// **'Ce produit n\'est pas disponnible pour les non-adhérents. Confirmer l\'encaissement ?'** - String get paiementNoMembershipDescription; + /// **'Supprimer la facture'** + String get paiementDeleteInvoice; - /// No description provided for @paiementNoThanks. + /// No description provided for @paiementDeleteSeller. /// /// In fr, this message translates to: - /// **'Non merci'** - String get paiementNoThanks; + /// **'Supprimer le vendeur'** + String get paiementDeleteSeller; - /// No description provided for @paiementNoTransaction. + /// No description provided for @paiementDeleteSellerDescription. /// /// In fr, this message translates to: - /// **'Aucune transaction'** - String get paiementNoTransaction; + /// **'Voulez-vous vraiment supprimer ce vendeur ?'** + String get paiementDeleteSellerDescription; - /// No description provided for @paiementNoTransactionForThisMonth. + /// No description provided for @paiementDeleteStore. /// /// In fr, this message translates to: - /// **'Aucune transaction pour ce mois'** - String get paiementNoTransactionForThisMonth; + /// **'Supprimer le magasin'** + String get paiementDeleteStore; - /// No description provided for @paiementOf. + /// No description provided for @paiementDeleteStoreDescription. /// /// In fr, this message translates to: - /// **'de'** - String get paiementOf; + /// **'Voulez-vous vraiment supprimer ce magasin ?'** + String get paiementDeleteStoreDescription; - /// No description provided for @paiementPaid. + /// No description provided for @paiementDeleteStoreError. /// /// In fr, this message translates to: - /// **'Payé'** - String get paiementPaid; + /// **'Impossible de supprimer le magasin'** + String get paiementDeleteStoreError; - /// No description provided for @paiementPay. + /// No description provided for @paiementDeleteSuccessfully. /// /// In fr, this message translates to: - /// **'Payer'** - String get paiementPay; + /// **'Supprimé avec succès'** + String get paiementDeleteSuccessfully; - /// No description provided for @paiementPayment. + /// No description provided for @paiementDeletingSellerError. /// /// In fr, this message translates to: - /// **'Paiement'** - String get paiementPayment; + /// **'Erreur lors de la suppression du vendeur'** + String get paiementDeletingSellerError; - /// No description provided for @paiementPayWithHA. + /// No description provided for @paiementDeviceActivationReceived. /// /// In fr, this message translates to: - /// **'Payer avec HelloAsso'** - String get paiementPayWithHA; + /// **'La demande d\'activation est prise en compte, veuilliez consulter votre boite mail pour finaliser la démarche'** + String get paiementDeviceActivationReceived; - /// No description provided for @paiementPending. + /// No description provided for @paiementDeviceNotActivated. /// /// In fr, this message translates to: - /// **'En attente'** - String get paiementPending; + /// **'Appareil non activé'** + String get paiementDeviceNotActivated; - /// No description provided for @paiementPersonalBalance. + /// No description provided for @paiementDeviceNotActivatedDescription. /// /// In fr, this message translates to: - /// **'Solde personnel'** - String get paiementPersonalBalance; + /// **'Votre appareil n\'est pas encore activé. \nPour l\'activer, veuillez vous rendre sur la page des appareils.'** + String get paiementDeviceNotActivatedDescription; - /// No description provided for @paiementPleaseAcceptPopup. + /// No description provided for @paiementDeviceNotRegistered. /// /// In fr, this message translates to: - /// **'Veuillez autoriser les popups'** - String get paiementPleaseAcceptPopup; + /// **'Appareil non enregistré'** + String get paiementDeviceNotRegistered; - /// No description provided for @paiementPleaseAcceptTOS. + /// No description provided for @paiementDeviceNotRegisteredDescription. /// /// In fr, this message translates to: - /// **'Veuillez accepter les Conditions Générales d\'Utilisation.'** - String get paiementPleaseAcceptTOS; + /// **'Votre appareil n\'est pas encore enregistré. \nPour l\'enregistrer, veuillez vous rendre sur la page des appareils.'** + String get paiementDeviceNotRegisteredDescription; - /// No description provided for @paiementPleaseAddDevice. + /// No description provided for @paiementDeviceRecoveryError. /// /// In fr, this message translates to: - /// **'Veuillez ajouter cet appareil pour payer'** - String get paiementPleaseAddDevice; + /// **'Erreur lors de la récupération de l\'appareil'** + String get paiementDeviceRecoveryError; - /// No description provided for @paiementPleaseAuthenticate. + /// No description provided for @paiementDeviceRevoked. /// /// In fr, this message translates to: - /// **'Veuillez vous authentifier'** - String get paiementPleaseAuthenticate; + /// **'Appareil révoqué'** + String get paiementDeviceRevoked; - /// No description provided for @paiementPleaseEnterMinAmount. + /// No description provided for @paiementDeviceRevokingError. /// /// In fr, this message translates to: - /// **'Veuillez entrer un montant supérieur à 1'** - String get paiementPleaseEnterMinAmount; + /// **'Erreur lors de la révocation de l\'appareil'** + String get paiementDeviceRevokingError; - /// No description provided for @paiementPleaseEnterValidAmount. + /// No description provided for @paiementDevices. /// /// In fr, this message translates to: - /// **'Veuillez entrer un montant valide'** - String get paiementPleaseEnterValidAmount; + /// **'Appareils'** + String get paiementDevices; - /// No description provided for @paiementProceedSuccessfully. + /// No description provided for @paiementDoneTransaction. /// /// In fr, this message translates to: - /// **'Paiement effectué avec succès'** - String get paiementProceedSuccessfully; + /// **'Transaction effectuée'** + String get paiementDoneTransaction; - /// No description provided for @paiementQRCodeAlreadyUsed. + /// No description provided for @paiementDownload. /// /// In fr, this message translates to: - /// **'QR Code déjà utilisé'** - String get paiementQRCodeAlreadyUsed; + /// **'Télécharger'** + String get paiementDownload; - /// No description provided for @paiementReactivateRevokedDeviceDescription. + /// Modifier le magasin /// /// In fr, this message translates to: - /// **'Votre appareil a été révoqué. \nPour le réactiver, veuillez vous rendre sur la page des appareils.'** - String get paiementReactivateRevokedDeviceDescription; + /// **'Modifier le magasin {store}'** + String paiementEditStore(String store); - /// No description provided for @paiementReceived. + /// No description provided for @paiementErrorDeleting. /// /// In fr, this message translates to: - /// **'Reçu'** - String get paiementReceived; + /// **'Erreur lors de la suppression'** + String get paiementErrorDeleting; - /// No description provided for @paiementRefund. + /// No description provided for @paiementErrorUpdatingStatus. /// /// In fr, this message translates to: - /// **'Remboursement'** - String get paiementRefund; + /// **'Erreur lors de la mise à jour du statut'** + String get paiementErrorUpdatingStatus; - /// No description provided for @paiementRefundAction. + /// Text with a date range /// /// In fr, this message translates to: - /// **'Rembourser'** - String get paiementRefundAction; + /// **'Du {from} au {to}'** + String paiementFromTo(DateTime from, DateTime to); - /// No description provided for @paiementRefundedThe. + /// No description provided for @paiementGetBalanceError. /// /// In fr, this message translates to: - /// **'Remboursé le'** - String get paiementRefundedThe; + /// **'Erreur lors de la récupération du solde : '** + String get paiementGetBalanceError; - /// No description provided for @paiementRevokeDevice. + /// No description provided for @paiementGetTransactionsError. /// /// In fr, this message translates to: - /// **'Révoquer l\'appareil ?'** - String get paiementRevokeDevice; + /// **'Erreur lors de la récupération des transactions : '** + String get paiementGetTransactionsError; - /// No description provided for @paiementRevokeDeviceDescription. + /// No description provided for @paiementHandOver. /// /// In fr, this message translates to: - /// **'Vous ne pourrez plus utiliser cet appareil pour les paiements'** - String get paiementRevokeDeviceDescription; + /// **'Passation'** + String get paiementHandOver; - /// No description provided for @paiementRightsOf. + /// No description provided for @paiementHistory. /// /// In fr, this message translates to: - /// **'Droits de'** - String get paiementRightsOf; + /// **'Historique'** + String get paiementHistory; - /// No description provided for @paiementRightsUpdated. + /// No description provided for @paiementInvoiceCreatedSuccessfully. /// /// In fr, this message translates to: - /// **'Droits mis à jour'** - String get paiementRightsUpdated; + /// **'Facture créée avec succès'** + String get paiementInvoiceCreatedSuccessfully; - /// No description provided for @paiementRightsUpdateError. + /// No description provided for @paiementInvoices. /// /// In fr, this message translates to: - /// **'Erreur lors de la mise à jour des droits'** - String get paiementRightsUpdateError; + /// **'Factures'** + String get paiementInvoices; - /// No description provided for @paiementScan. + /// Text with the number of invoices per page /// /// In fr, this message translates to: - /// **'Scanner'** - String get paiementScan; + /// **'{quantity} factures/page'** + String paiementInvoicesPerPage(int quantity); - /// No description provided for @paiementScanAlreadyUsedQRCode. + /// No description provided for @paiementLastTransactions. /// /// In fr, this message translates to: - /// **'QR Code déjà utilisé'** - String get paiementScanAlreadyUsedQRCode; + /// **'Dernières transactions'** + String get paiementLastTransactions; - /// No description provided for @paiementScanCode. + /// No description provided for @paiementLimitedTo. /// /// In fr, this message translates to: - /// **'Scanner un code'** - String get paiementScanCode; + /// **'Limité à'** + String get paiementLimitedTo; - /// No description provided for @paiementScanNoMembership. + /// No description provided for @paiementManagement. /// /// In fr, this message translates to: - /// **'Pas d\'adhésion'** - String get paiementScanNoMembership; + /// **'Gestion'** + String get paiementManagement; - /// No description provided for @paiementScanNoMembershipConfirmation. + /// No description provided for @paiementManageSellers. /// /// In fr, this message translates to: - /// **'Ce produit n\'est pas disponnible pour les non-adhérents. Confirmer l\'encaissement ?'** - String get paiementScanNoMembershipConfirmation; + /// **'Gérer les vendeurs'** + String get paiementManageSellers; - /// No description provided for @paiementSeeHistory. + /// No description provided for @paiementMarkPaid. /// /// In fr, this message translates to: - /// **'Voir l\'historique'** - String get paiementSeeHistory; + /// **'Marquer comme payé'** + String get paiementMarkPaid; - /// No description provided for @paiementSelectStructure. + /// No description provided for @paiementMarkReceived. /// /// In fr, this message translates to: - /// **'Choisir une structure'** - String get paiementSelectStructure; + /// **'Marquer comme reçu'** + String get paiementMarkReceived; - /// No description provided for @paiementSellerError. + /// No description provided for @paiementMarkUnpaid. /// /// In fr, this message translates to: - /// **'Vous n\'êtes pas vendeur de ce magasin'** - String get paiementSellerError; + /// **'Marquer comme non payé'** + String get paiementMarkUnpaid; - /// No description provided for @paiementSellerRigths. + /// No description provided for @paiementMaxAmount. /// /// In fr, this message translates to: - /// **'Droits du vendeur'** - String get paiementSellerRigths; + /// **'Le montant maximum de votre portefeuille est de'** + String get paiementMaxAmount; - /// No description provided for @paiementSellersOf. + /// No description provided for @paiementMean. /// /// In fr, this message translates to: - /// **'Les vendeurs de'** - String get paiementSellersOf; + /// **'Moyenne : '** + String get paiementMean; - /// No description provided for @paiementSettings. + /// No description provided for @paiementModify. /// /// In fr, this message translates to: - /// **'Paramètres'** - String get paiementSettings; + /// **'Modifier'** + String get paiementModify; - /// No description provided for @paiementSpent. + /// No description provided for @paiementModifyingStoreError. /// /// In fr, this message translates to: - /// **'Déboursé'** - String get paiementSpent; + /// **'Erreur lors de la modification du magasin'** + String get paiementModifyingStoreError; - /// No description provided for @paiementStats. + /// No description provided for @paiementModifySuccessfully. /// /// In fr, this message translates to: - /// **'Stats'** - String get paiementStats; + /// **'Modifié avec succès'** + String get paiementModifySuccessfully; - /// No description provided for @paiementStoreBalance. + /// No description provided for @paiementNewCGU. /// /// In fr, this message translates to: - /// **'Solde du magasin'** - String get paiementStoreBalance; + /// **'Nouvelles Conditions Générales d\'Utilisation'** + String get paiementNewCGU; - /// No description provided for @paiementStoreDeleted. + /// No description provided for @paiementNext. /// /// In fr, this message translates to: - /// **'Magasin supprimée'** - String get paiementStoreDeleted; + /// **'Suivant'** + String get paiementNext; - /// Gestion de la structure + /// No description provided for @paiementNextAccountable. /// /// In fr, this message translates to: - /// **'Gestion de {structure}'** - String paiementStructureManagement(String structure); + /// **'Prochain responsable'** + String get paiementNextAccountable; - /// No description provided for @paiementStoreName. + /// No description provided for @paiementNoInvoiceToCreate. /// /// In fr, this message translates to: - /// **'Nom du magasin'** - String get paiementStoreName; + /// **'Aucune facture à créer'** + String get paiementNoInvoiceToCreate; - /// No description provided for @paiementStores. + /// No description provided for @paiementNoMembership. /// /// In fr, this message translates to: - /// **'Magasins'** - String get paiementStores; + /// **'Aucune adhésion'** + String get paiementNoMembership; - /// No description provided for @paiementStructureAdmin. + /// No description provided for @paiementNoMembershipDescription. /// /// In fr, this message translates to: - /// **'Administrateur de la structure'** - String get paiementStructureAdmin; + /// **'Ce produit n\'est pas disponnible pour les non-adhérents. Confirmer l\'encaissement ?'** + String get paiementNoMembershipDescription; - /// No description provided for @paiementSuccededTransaction. + /// No description provided for @paiementNoThanks. /// /// In fr, this message translates to: - /// **'Paiement réussi'** - String get paiementSuccededTransaction; + /// **'Non merci'** + String get paiementNoThanks; - /// No description provided for @paiementSuccessfullyAddedStore. + /// No description provided for @paiementNoTransaction. /// /// In fr, this message translates to: - /// **'Magasin ajoutée avec succès'** - String get paiementSuccessfullyAddedStore; + /// **'Aucune transaction'** + String get paiementNoTransaction; - /// No description provided for @paiementSuccessfullyModifiedStore. + /// No description provided for @paiementNoTransactionForThisMonth. /// /// In fr, this message translates to: - /// **'Magasin modifiée avec succès'** - String get paiementSuccessfullyModifiedStore; + /// **'Aucune transaction pour ce mois'** + String get paiementNoTransactionForThisMonth; - /// No description provided for @paiementThe. + /// No description provided for @paiementOf. /// /// In fr, this message translates to: - /// **'Le'** - String get paiementThe; + /// **'de'** + String get paiementOf; - /// No description provided for @paiementThisDevice. + /// No description provided for @paiementPaid. /// /// In fr, this message translates to: - /// **'(cet appareil)'** - String get paiementThisDevice; + /// **'Payé'** + String get paiementPaid; - /// No description provided for @paiementTopUp. + /// No description provided for @paiementPay. /// /// In fr, this message translates to: - /// **'Recharge'** - String get paiementTopUp; + /// **'Payer'** + String get paiementPay; - /// No description provided for @paiementTopUpAction. + /// No description provided for @paiementPayment. /// /// In fr, this message translates to: - /// **'Recharger'** - String get paiementTopUpAction; + /// **'Paiement'** + String get paiementPayment; - /// No description provided for @paiementTotalDuringPeriod. + /// No description provided for @paiementPayWithHA. /// /// In fr, this message translates to: - /// **'Total sur la période'** - String get paiementTotalDuringPeriod; + /// **'Payer avec HelloAsso'** + String get paiementPayWithHA; - /// No description provided for @paiementTransaction. + /// No description provided for @paiementPending. /// /// In fr, this message translates to: - /// **'ransaction'** - String get paiementTransaction; + /// **'En attente'** + String get paiementPending; - /// No description provided for @paiementTransactionCancelled. + /// No description provided for @paiementPersonalBalance. /// /// In fr, this message translates to: - /// **'Transaction annulée'** - String get paiementTransactionCancelled; + /// **'Solde personnel'** + String get paiementPersonalBalance; - /// No description provided for @paiementTransactionCancelledDescription. + /// No description provided for @paiementPleaseAcceptPopup. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment annuler la transaction de'** - String get paiementTransactionCancelledDescription; + /// **'Veuillez autoriser les popups'** + String get paiementPleaseAcceptPopup; - /// No description provided for @paiementTransactionCancelledError. + /// No description provided for @paiementPleaseAcceptTOS. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'annulation de la transaction'** - String get paiementTransactionCancelledError; + /// **'Veuillez accepter les Conditions Générales d\'Utilisation.'** + String get paiementPleaseAcceptTOS; - /// No description provided for @paiementTransferStructure. + /// No description provided for @paiementPleaseAddDevice. /// /// In fr, this message translates to: - /// **'Transfert de structure'** - String get paiementTransferStructure; + /// **'Veuillez ajouter cet appareil pour payer'** + String get paiementPleaseAddDevice; - /// No description provided for @paiementTransferStructureDescription. + /// No description provided for @paiementPleaseAuthenticate. /// /// In fr, this message translates to: - /// **'Le nouveau responsable aura accès à toutes les fonctionnalités de gestion de la structure. Vous allez recevoir un email pour valider ce transfert. Le lien ne sera actif que pendant 20 minutes. Cette action est irréversible. Êtes-vous sûr de vouloir continuer ?'** - String get paiementTransferStructureDescription; + /// **'Veuillez vous authentifier'** + String get paiementPleaseAuthenticate; - /// No description provided for @paiementTransferStructureError. + /// No description provided for @paiementPleaseEnterMinAmount. /// /// In fr, this message translates to: - /// **'Erreur lors du transfert de la structure'** - String get paiementTransferStructureError; + /// **'Veuillez entrer un montant supérieur à 1'** + String get paiementPleaseEnterMinAmount; - /// No description provided for @paiementTransferStructureSuccess. + /// No description provided for @paiementPleaseEnterValidAmount. /// /// In fr, this message translates to: - /// **'Transfert de structure demandé avec succès'** - String get paiementTransferStructureSuccess; + /// **'Veuillez entrer un montant valide'** + String get paiementPleaseEnterValidAmount; - /// No description provided for @paiementUnknownDevice. + /// No description provided for @paiementProceedSuccessfully. /// /// In fr, this message translates to: - /// **'Appareil inconnu'** - String get paiementUnknownDevice; + /// **'Paiement effectué avec succès'** + String get paiementProceedSuccessfully; - /// No description provided for @paiementValidUntil. + /// No description provided for @paiementQRCodeAlreadyUsed. /// /// In fr, this message translates to: - /// **'Valide jusqu\'à'** - String get paiementValidUntil; + /// **'QR Code déjà utilisé'** + String get paiementQRCodeAlreadyUsed; - /// No description provided for @paiementYouAreTransferingStructureTo. + /// No description provided for @paiementReactivateRevokedDeviceDescription. /// /// In fr, this message translates to: - /// **'Vous êtes sur le point de transférer la structure à '** - String get paiementYouAreTransferingStructureTo; + /// **'Votre appareil a été révoqué. \nPour le réactiver, veuillez vous rendre sur la page des appareils.'** + String get paiementReactivateRevokedDeviceDescription; - /// No description provided for @phAddNewJournal. + /// No description provided for @paiementReceived. /// /// In fr, this message translates to: - /// **'Ajouter un nouveau journal'** - String get phAddNewJournal; + /// **'Reçu'** + String get paiementReceived; - /// No description provided for @phNameField. + /// No description provided for @paiementRefund. /// /// In fr, this message translates to: - /// **'Nom : '** - String get phNameField; + /// **'Remboursement'** + String get paiementRefund; - /// No description provided for @phDateField. + /// No description provided for @paiementRefundAction. /// /// In fr, this message translates to: - /// **'Date : '** - String get phDateField; + /// **'Rembourser'** + String get paiementRefundAction; - /// No description provided for @phDelete. + /// No description provided for @paiementRefundedThe. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer ce journal ?'** - String get phDelete; + /// **'Remboursé le'** + String get paiementRefundedThe; - /// No description provided for @phIrreversibleAction. + /// No description provided for @paiementRevokeDevice. /// /// In fr, this message translates to: - /// **'Cette action est irréversible'** - String get phIrreversibleAction; + /// **'Révoquer l\'appareil ?'** + String get paiementRevokeDevice; - /// No description provided for @phToHeavyFile. + /// No description provided for @paiementRevokeDeviceDescription. /// /// In fr, this message translates to: - /// **'Fichier trop volumineux'** - String get phToHeavyFile; + /// **'Vous ne pourrez plus utiliser cet appareil pour les paiements'** + String get paiementRevokeDeviceDescription; - /// No description provided for @phAddPdfFile. + /// No description provided for @paiementRightsOf. /// /// In fr, this message translates to: - /// **'Ajouter un fichier PDF'** - String get phAddPdfFile; + /// **'Droits de'** + String get paiementRightsOf; - /// No description provided for @phEditPdfFile. + /// No description provided for @paiementRightsUpdated. /// /// In fr, this message translates to: - /// **'Modifier le fichier PDF'** - String get phEditPdfFile; + /// **'Droits mis à jour'** + String get paiementRightsUpdated; - /// No description provided for @phPhName. + /// No description provided for @paiementRightsUpdateError. /// /// In fr, this message translates to: - /// **'Nom du PH'** - String get phPhName; + /// **'Erreur lors de la mise à jour des droits'** + String get paiementRightsUpdateError; - /// No description provided for @phDate. + /// No description provided for @paiementScan. /// /// In fr, this message translates to: - /// **'Date'** - String get phDate; + /// **'Scanner'** + String get paiementScan; - /// No description provided for @phAdded. + /// No description provided for @paiementScanAlreadyUsedQRCode. /// /// In fr, this message translates to: - /// **'Ajouté'** - String get phAdded; + /// **'QR Code déjà utilisé'** + String get paiementScanAlreadyUsedQRCode; - /// No description provided for @phEdited. + /// No description provided for @paiementScanCode. /// /// In fr, this message translates to: - /// **'Modifié'** - String get phEdited; + /// **'Scanner un code'** + String get paiementScanCode; - /// No description provided for @phAddingFileError. + /// No description provided for @paiementScanNoMembership. /// /// In fr, this message translates to: - /// **'Erreur d\'ajout'** - String get phAddingFileError; + /// **'Pas d\'adhésion'** + String get paiementScanNoMembership; - /// No description provided for @phMissingInformatonsOrPdf. + /// No description provided for @paiementScanNoMembershipConfirmation. /// /// In fr, this message translates to: - /// **'Informations manquantes ou fichier PDF manquant'** - String get phMissingInformatonsOrPdf; + /// **'Ce produit n\'est pas disponnible pour les non-adhérents. Confirmer l\'encaissement ?'** + String get paiementScanNoMembershipConfirmation; - /// No description provided for @phAdd. + /// No description provided for @paiementSeeHistory. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get phAdd; + /// **'Voir l\'historique'** + String get paiementSeeHistory; - /// No description provided for @phEdit. + /// No description provided for @paiementSelectStructure. /// /// In fr, this message translates to: - /// **'Modifier'** - String get phEdit; + /// **'Choisir une structure'** + String get paiementSelectStructure; - /// No description provided for @phSeePreviousJournal. + /// No description provided for @paiementSellerError. /// /// In fr, this message translates to: - /// **'Voir les anciens journaux'** - String get phSeePreviousJournal; + /// **'Vous n\'êtes pas vendeur de ce magasin'** + String get paiementSellerError; - /// No description provided for @phNoJournalInDatabase. + /// No description provided for @paiementSellerRigths. /// /// In fr, this message translates to: - /// **'Pas encore de PH dans la base de donnée'** - String get phNoJournalInDatabase; + /// **'Droits du vendeur'** + String get paiementSellerRigths; - /// No description provided for @phSuccesDowloading. + /// No description provided for @paiementSellersOf. /// /// In fr, this message translates to: - /// **'Téléchargé avec succès'** - String get phSuccesDowloading; + /// **'Les vendeurs de'** + String get paiementSellersOf; - /// No description provided for @phonebookAdd. + /// No description provided for @paiementSettings. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get phonebookAdd; + /// **'Paramètres'** + String get paiementSettings; - /// No description provided for @phonebookAddAssociation. + /// No description provided for @paiementSpent. /// /// In fr, this message translates to: - /// **'Ajouter une association'** - String get phonebookAddAssociation; + /// **'Déboursé'** + String get paiementSpent; - /// No description provided for @phonebookAddAssociationGroupement. + /// No description provided for @paiementStats. /// /// In fr, this message translates to: - /// **'Ajouter un groupement d\'association'** - String get phonebookAddAssociationGroupement; + /// **'Stats'** + String get paiementStats; - /// No description provided for @phonebookAddedAssociation. + /// No description provided for @paiementStoreBalance. /// /// In fr, this message translates to: - /// **'Association ajoutée'** - String get phonebookAddedAssociation; + /// **'Solde du magasin'** + String get paiementStoreBalance; - /// No description provided for @phonebookAddedMember. + /// No description provided for @paiementStoreDeleted. /// /// In fr, this message translates to: - /// **'Membre ajouté'** - String get phonebookAddedMember; + /// **'Magasin supprimée'** + String get paiementStoreDeleted; - /// No description provided for @phonebookAddingError. + /// No description provided for @paiementStoreName. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get phonebookAddingError; + /// **'Nom du magasin'** + String get paiementStoreName; - /// No description provided for @phonebookAddMember. + /// No description provided for @paiementStores. /// /// In fr, this message translates to: - /// **'Ajouter un membre'** - String get phonebookAddMember; + /// **'Magasins'** + String get paiementStores; - /// No description provided for @phonebookAddRole. + /// No description provided for @paiementStructureAdmin. /// /// In fr, this message translates to: - /// **'Ajouter un rôle'** - String get phonebookAddRole; + /// **'Administrateur de la structure'** + String get paiementStructureAdmin; - /// No description provided for @phonebookAdmin. + /// Gestion de la structure /// /// In fr, this message translates to: - /// **'Admin'** - String get phonebookAdmin; + /// **'Gestion de {structure}'** + String paiementStructureManagement(String structure); - /// No description provided for @phonebookAll. + /// No description provided for @paiementSuccededTransaction. /// /// In fr, this message translates to: - /// **'Toutes'** - String get phonebookAll; + /// **'Paiement réussi'** + String get paiementSuccededTransaction; - /// No description provided for @phonebookApparentName. + /// No description provided for @paiementSuccessfullyAddedStore. /// /// In fr, this message translates to: - /// **'Nom public du rôle :'** - String get phonebookApparentName; + /// **'Magasin ajoutée avec succès'** + String get paiementSuccessfullyAddedStore; - /// No description provided for @phonebookAssociation. + /// No description provided for @paiementSuccessfullyModifiedStore. /// /// In fr, this message translates to: - /// **'Association'** - String get phonebookAssociation; + /// **'Magasin modifiée avec succès'** + String get paiementSuccessfullyModifiedStore; - /// No description provided for @phonebookAssociationDetail. + /// No description provided for @paiementThe. /// /// In fr, this message translates to: - /// **'Détail de l\'association :'** - String get phonebookAssociationDetail; + /// **'Le'** + String get paiementThe; - /// No description provided for @phonebookAssociationGroupement. + /// No description provided for @paiementThisDevice. /// /// In fr, this message translates to: - /// **'Groupement d\'association'** - String get phonebookAssociationGroupement; + /// **'(cet appareil)'** + String get paiementThisDevice; - /// No description provided for @phonebookAssociationKind. + /// No description provided for @paiementTopUp. /// /// In fr, this message translates to: - /// **'Type d\'association :'** - String get phonebookAssociationKind; + /// **'Recharge'** + String get paiementTopUp; - /// No description provided for @phonebookAssociationName. + /// No description provided for @paiementTopUpAction. /// /// In fr, this message translates to: - /// **'Nom de l\'association'** - String get phonebookAssociationName; + /// **'Recharger'** + String get paiementTopUpAction; - /// No description provided for @phonebookAssociations. + /// No description provided for @paiementTotalDuringPeriod. /// /// In fr, this message translates to: - /// **'Associations'** - String get phonebookAssociations; + /// **'Total sur la période'** + String get paiementTotalDuringPeriod; - /// No description provided for @phonebookCancel. + /// No description provided for @paiementTransaction. /// /// In fr, this message translates to: - /// **'Annuler'** - String get phonebookCancel; + /// **'ransaction'** + String get paiementTransaction; - /// Permet de changer le mandat d'une association + /// No description provided for @paiementTransactionCancelled. /// /// In fr, this message translates to: - /// **'Passer au mandat {year}'** - String phonebookChangeTermYear(int year); + /// **'Transaction annulée'** + String get paiementTransactionCancelled; - /// No description provided for @phonebookChangeTermConfirm. + /// No description provided for @paiementTransactionCancelledDescription. /// /// In fr, this message translates to: - /// **'Êtes-vous sûr de vouloir changer tout le mandat ?\nCette action est irréversible !'** - String get phonebookChangeTermConfirm; + /// **'Voulez-vous vraiment annuler la transaction de'** + String get paiementTransactionCancelledDescription; - /// No description provided for @phonebookClose. + /// No description provided for @paiementTransactionCancelledError. /// /// In fr, this message translates to: - /// **'Fermer'** - String get phonebookClose; + /// **'Erreur lors de l\'annulation de la transaction'** + String get paiementTransactionCancelledError; - /// No description provided for @phonebookConfirm. + /// No description provided for @paiementTransferStructure. /// /// In fr, this message translates to: - /// **'Confirmer'** - String get phonebookConfirm; + /// **'Transfert de structure'** + String get paiementTransferStructure; - /// No description provided for @phonebookCopied. + /// No description provided for @paiementTransferStructureDescription. /// /// In fr, this message translates to: - /// **'Copié dans le presse-papier'** - String get phonebookCopied; + /// **'Le nouveau responsable aura accès à toutes les fonctionnalités de gestion de la structure. Vous allez recevoir un email pour valider ce transfert. Le lien ne sera actif que pendant 20 minutes. Cette action est irréversible. Êtes-vous sûr de vouloir continuer ?'** + String get paiementTransferStructureDescription; - /// No description provided for @phonebookDeactivateAssociation. + /// No description provided for @paiementTransferStructureError. /// /// In fr, this message translates to: - /// **'Désactiver l\'association'** - String get phonebookDeactivateAssociation; + /// **'Erreur lors du transfert de la structure'** + String get paiementTransferStructureError; - /// No description provided for @phonebookDeactivatedAssociation. + /// No description provided for @paiementTransferStructureSuccess. /// /// In fr, this message translates to: - /// **'Association désactivée'** - String get phonebookDeactivatedAssociation; + /// **'Transfert de structure demandé avec succès'** + String get paiementTransferStructureSuccess; - /// No description provided for @phonebookDeactivatedAssociationWarning. + /// No description provided for @paiementUnknownDevice. /// /// In fr, this message translates to: - /// **'Attention, cette association est désactivée, vous ne pouvez pas la modifier'** - String get phonebookDeactivatedAssociationWarning; + /// **'Appareil inconnu'** + String get paiementUnknownDevice; - /// Permet de désactiver une association + /// No description provided for @paiementValidUntil. /// /// In fr, this message translates to: - /// **'Désactiver l\'association {association} ?'** - String phonebookDeactivateSelectedAssociation(String association); + /// **'Valide jusqu\'à'** + String get paiementValidUntil; - /// No description provided for @phonebookDeactivatingError. + /// No description provided for @paiementYouAreTransferingStructureTo. /// /// In fr, this message translates to: - /// **'Erreur lors de la désactivation'** - String get phonebookDeactivatingError; + /// **'Vous êtes sur le point de transférer la structure à '** + String get paiementYouAreTransferingStructureTo; - /// No description provided for @phonebookDetail. + /// No description provided for @phAdd. /// /// In fr, this message translates to: - /// **'Détail :'** - String get phonebookDetail; + /// **'Ajouter'** + String get phAdd; - /// No description provided for @phonebookDelete. + /// No description provided for @phAdded. /// /// In fr, this message translates to: - /// **'Supprimer'** - String get phonebookDelete; + /// **'Ajouté'** + String get phAdded; - /// No description provided for @phonebookDeleteAssociation. + /// No description provided for @phAddingFileError. /// /// In fr, this message translates to: - /// **'Supprimer l\'association'** - String get phonebookDeleteAssociation; + /// **'Erreur d\'ajout'** + String get phAddingFileError; - /// Permet de supprimer une association + /// No description provided for @phAddNewJournal. /// /// In fr, this message translates to: - /// **'Supprimer l\'association {association} ?'** - String phonebookDeleteSelectedAssociation(String association); + /// **'Ajouter un nouveau journal'** + String get phAddNewJournal; - /// No description provided for @phonebookDeleteAssociationDescription. + /// No description provided for @phAddPdfFile. /// /// In fr, this message translates to: - /// **'Ceci va supprimer l\'historique de l\'association'** - String get phonebookDeleteAssociationDescription; + /// **'Ajouter un fichier PDF'** + String get phAddPdfFile; - /// No description provided for @phonebookDeletedAssociation. + /// No description provided for @phDate. /// /// In fr, this message translates to: - /// **'Association supprimée'** - String get phonebookDeletedAssociation; + /// **'Date'** + String get phDate; - /// No description provided for @phonebookDeletedMember. + /// No description provided for @phDateField. /// /// In fr, this message translates to: - /// **'Membre supprimé'** - String get phonebookDeletedMember; + /// **'Date : '** + String get phDateField; - /// No description provided for @phonebookDeleteRole. + /// No description provided for @phDelete. /// /// In fr, this message translates to: - /// **'Supprimer le rôle'** - String get phonebookDeleteRole; + /// **'Voulez-vous vraiment supprimer ce journal ?'** + String get phDelete; - /// Permet de supprimer le rôle d'un utilisateur dans une association + /// No description provided for @phEdit. /// /// In fr, this message translates to: - /// **'Supprimer le rôle de l\'utilisateur {name} ?'** - String phonebookDeleteUserRole(String name); + /// **'Modifier'** + String get phEdit; - /// No description provided for @phonebookDeactivating. + /// No description provided for @phEdited. /// /// In fr, this message translates to: - /// **'Désactiver l\'association ?'** - String get phonebookDeactivating; + /// **'Modifié'** + String get phEdited; - /// No description provided for @phonebookDeleting. + /// No description provided for @phEditPdfFile. /// /// In fr, this message translates to: - /// **'Suppression'** - String get phonebookDeleting; + /// **'Modifier le fichier PDF'** + String get phEditPdfFile; - /// No description provided for @phonebookDeletingError. + /// No description provided for @phIrreversibleAction. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get phonebookDeletingError; + /// **'Cette action est irréversible'** + String get phIrreversibleAction; - /// No description provided for @phonebookDescription. + /// No description provided for @phMissingInformatonsOrPdf. /// /// In fr, this message translates to: - /// **'Description'** - String get phonebookDescription; + /// **'Informations manquantes ou fichier PDF manquant'** + String get phMissingInformatonsOrPdf; - /// No description provided for @phonebookEdit. + /// No description provided for @phNameField. /// /// In fr, this message translates to: - /// **'Modifier'** - String get phonebookEdit; + /// **'Nom : '** + String get phNameField; - /// No description provided for @phonebookEditAssociationGroupement. + /// No description provided for @phNoJournalInDatabase. /// /// In fr, this message translates to: - /// **'Modifier le groupement d\'association'** - String get phonebookEditAssociationGroupement; + /// **'Pas encore de PH dans la base de donnée'** + String get phNoJournalInDatabase; - /// No description provided for @phonebookEditAssociationGroups. + /// No description provided for @phonebookAdd. /// /// In fr, this message translates to: - /// **'Gérer les groupes'** - String get phonebookEditAssociationGroups; + /// **'Ajouter'** + String get phonebookAdd; - /// No description provided for @phonebookEditAssociationInfo. + /// No description provided for @phonebookAddAssociation. /// /// In fr, this message translates to: - /// **'Modifier'** - String get phonebookEditAssociationInfo; + /// **'Ajouter une association'** + String get phonebookAddAssociation; - /// No description provided for @phonebookEditAssociationMembers. + /// No description provided for @phonebookAddAssociationGroupement. /// /// In fr, this message translates to: - /// **'Gérer les membres'** - String get phonebookEditAssociationMembers; + /// **'Ajouter un groupement d\'association'** + String get phonebookAddAssociationGroupement; - /// No description provided for @phonebookEditRole. + /// No description provided for @phonebookAddedAssociation. /// /// In fr, this message translates to: - /// **'Modifier le rôle'** - String get phonebookEditRole; + /// **'Association ajoutée'** + String get phonebookAddedAssociation; - /// No description provided for @phonebookEditMembership. + /// No description provided for @phonebookAddedMember. /// /// In fr, this message translates to: - /// **'Modifier le rôle'** - String get phonebookEditMembership; + /// **'Membre ajouté'** + String get phonebookAddedMember; - /// No description provided for @phonebookEmail. + /// No description provided for @phonebookAddingError. /// /// In fr, this message translates to: - /// **'Email :'** - String get phonebookEmail; + /// **'Erreur lors de l\'ajout'** + String get phonebookAddingError; - /// No description provided for @phonebookEmailCopied. + /// No description provided for @phonebookAddMember. /// /// In fr, this message translates to: - /// **'Email copié dans le presse-papier'** - String get phonebookEmailCopied; + /// **'Ajouter un membre'** + String get phonebookAddMember; - /// No description provided for @phonebookEmptyApparentName. + /// No description provided for @phonebookAddRole. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nom de role'** - String get phonebookEmptyApparentName; + /// **'Ajouter un rôle'** + String get phonebookAddRole; - /// No description provided for @phonebookEmptyFieldError. + /// No description provided for @phonebookAdmin. /// /// In fr, this message translates to: - /// **'Un champ n\'est pas rempli'** - String get phonebookEmptyFieldError; + /// **'Admin'** + String get phonebookAdmin; - /// No description provided for @phonebookEmptyKindError. + /// No description provided for @phonebookAll. /// /// In fr, this message translates to: - /// **'Veuillez choisir un type d\'association'** - String get phonebookEmptyKindError; + /// **'Toutes'** + String get phonebookAll; - /// No description provided for @phonebookEmptyMember. + /// No description provided for @phonebookApparentName. /// /// In fr, this message translates to: - /// **'Aucun membre sélectionné'** - String get phonebookEmptyMember; + /// **'Nom public du rôle :'** + String get phonebookApparentName; - /// No description provided for @phonebookErrorAssociationLoading. + /// No description provided for @phonebookAssociation. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement de l\'association'** - String get phonebookErrorAssociationLoading; + /// **'Association'** + String get phonebookAssociation; - /// No description provided for @phonebookErrorAssociationNameEmpty. + /// No description provided for @phonebookAssociationDetail. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nom d\'association'** - String get phonebookErrorAssociationNameEmpty; + /// **'Détail de l\'association :'** + String get phonebookAssociationDetail; - /// No description provided for @phonebookErrorAssociationPicture. + /// No description provided for @phonebookAssociationGroupement. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification de la photo d\'association'** - String get phonebookErrorAssociationPicture; + /// **'Groupement d\'association'** + String get phonebookAssociationGroupement; - /// No description provided for @phonebookErrorKindsLoading. + /// No description provided for @phonebookAssociationKind. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement des types d\'association'** - String get phonebookErrorKindsLoading; + /// **'Type d\'association :'** + String get phonebookAssociationKind; - /// No description provided for @phonebookErrorLoadAssociationList. + /// No description provided for @phonebookAssociationName. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement de la liste des associations'** - String get phonebookErrorLoadAssociationList; + /// **'Nom de l\'association'** + String get phonebookAssociationName; - /// No description provided for @phonebookErrorLoadAssociationMember. + /// No description provided for @phonebookAssociations. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement des membres de l\'association'** - String get phonebookErrorLoadAssociationMember; + /// **'Associations'** + String get phonebookAssociations; - /// No description provided for @phonebookErrorLoadAssociationPicture. + /// No description provided for @phonebookCancel. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement de la photo d\'association'** - String get phonebookErrorLoadAssociationPicture; + /// **'Annuler'** + String get phonebookCancel; - /// No description provided for @phonebookErrorLoadProfilePicture. + /// No description provided for @phonebookChangeTermConfirm. /// /// In fr, this message translates to: - /// **'Erreur'** - String get phonebookErrorLoadProfilePicture; + /// **'Êtes-vous sûr de vouloir changer tout le mandat ?\nCette action est irréversible !'** + String get phonebookChangeTermConfirm; - /// No description provided for @phonebookErrorRoleTagsLoading. + /// Permet de changer le mandat d'une association /// /// In fr, this message translates to: - /// **'Erreur lors du chargement des tags de rôle'** - String get phonebookErrorRoleTagsLoading; + /// **'Passer au mandat {year}'** + String phonebookChangeTermYear(int year); - /// No description provided for @phonebookExistingMembership. + /// No description provided for @phonebookClose. /// /// In fr, this message translates to: - /// **'Ce membre est déjà dans le mandat actuel'** - String get phonebookExistingMembership; + /// **'Fermer'** + String get phonebookClose; - /// No description provided for @phonebookFilter. + /// No description provided for @phonebookConfirm. /// /// In fr, this message translates to: - /// **'Filtrer'** - String get phonebookFilter; + /// **'Confirmer'** + String get phonebookConfirm; - /// No description provided for @phonebookFilterDescription. + /// No description provided for @phonebookCopied. /// /// In fr, this message translates to: - /// **'Filtrer les associations par type'** - String get phonebookFilterDescription; + /// **'Copié dans le presse-papier'** + String get phonebookCopied; - /// No description provided for @phonebookFirstname. + /// No description provided for @phonebookDeactivateAssociation. /// /// In fr, this message translates to: - /// **'Prénom :'** - String get phonebookFirstname; + /// **'Désactiver l\'association'** + String get phonebookDeactivateAssociation; - /// No description provided for @phonebookGroupementDeleted. + /// No description provided for @phonebookDeactivatedAssociation. /// /// In fr, this message translates to: - /// **'Groupement d\'association supprimé'** - String get phonebookGroupementDeleted; + /// **'Association désactivée'** + String get phonebookDeactivatedAssociation; - /// No description provided for @phonebookGroupementDeleteError. + /// No description provided for @phonebookDeactivatedAssociationWarning. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression du groupement d\'association'** - String get phonebookGroupementDeleteError; + /// **'Attention, cette association est désactivée, vous ne pouvez pas la modifier'** + String get phonebookDeactivatedAssociationWarning; - /// No description provided for @phonebookGroupementName. + /// Permet de désactiver une association /// /// In fr, this message translates to: - /// **'Nom du groupement'** - String get phonebookGroupementName; + /// **'Désactiver l\'association {association} ?'** + String phonebookDeactivateSelectedAssociation(String association); - /// Permet de gérer les groupes d'une association + /// No description provided for @phonebookDeactivating. /// /// In fr, this message translates to: - /// **'Gérer les groupes de {association}'** - String phonebookGroups(String association); + /// **'Désactiver l\'association ?'** + String get phonebookDeactivating; - /// Année de mandat d'une association + /// No description provided for @phonebookDeactivatingError. /// /// In fr, this message translates to: - /// **'Mandat {year}'** - String phonebookTerm(int year); + /// **'Erreur lors de la désactivation'** + String get phonebookDeactivatingError; - /// No description provided for @phonebookTermChangingError. + /// No description provided for @phonebookDelete. /// /// In fr, this message translates to: - /// **'Erreur lors du changement de mandat'** - String get phonebookTermChangingError; + /// **'Supprimer'** + String get phonebookDelete; - /// No description provided for @phonebookMember. + /// No description provided for @phonebookDeleteAssociation. /// /// In fr, this message translates to: - /// **'Membre'** - String get phonebookMember; + /// **'Supprimer l\'association'** + String get phonebookDeleteAssociation; - /// No description provided for @phonebookMemberReordered. + /// No description provided for @phonebookDeleteAssociationDescription. /// /// In fr, this message translates to: - /// **'Membre réordonné'** - String get phonebookMemberReordered; + /// **'Ceci va supprimer l\'historique de l\'association'** + String get phonebookDeleteAssociationDescription; - /// Permet de gérer les membres d'une association + /// No description provided for @phonebookDeletedAssociation. /// /// In fr, this message translates to: - /// **'Gérer les membres de {association}'** - String phonebookMembers(String association); + /// **'Association supprimée'** + String get phonebookDeletedAssociation; - /// No description provided for @phonebookMembershipAssociationError. + /// No description provided for @phonebookDeletedMember. /// /// In fr, this message translates to: - /// **'Veuillez choisir une association'** - String get phonebookMembershipAssociationError; + /// **'Membre supprimé'** + String get phonebookDeletedMember; - /// No description provided for @phonebookMembershipRole. + /// No description provided for @phonebookDeleteRole. /// /// In fr, this message translates to: - /// **'Rôle :'** - String get phonebookMembershipRole; + /// **'Supprimer le rôle'** + String get phonebookDeleteRole; - /// No description provided for @phonebookMembershipRoleError. + /// Permet de supprimer une association /// /// In fr, this message translates to: - /// **'Veuillez choisir un rôle'** - String get phonebookMembershipRoleError; + /// **'Supprimer l\'association {association} ?'** + String phonebookDeleteSelectedAssociation(String association); - /// Permet de modifier le rôle d'un membre dans une association + /// Permet de supprimer le rôle d'un utilisateur dans une association /// /// In fr, this message translates to: - /// **'Modifier le rôle de {name}'** - String phonebookModifyMembership(String name); + /// **'Supprimer le rôle de l\'utilisateur {name} ?'** + String phonebookDeleteUserRole(String name); - /// No description provided for @phonebookName. + /// No description provided for @phonebookDeleting. /// /// In fr, this message translates to: - /// **'Nom :'** - String get phonebookName; + /// **'Suppression'** + String get phonebookDeleting; - /// No description provided for @phonebookNameCopied. + /// No description provided for @phonebookDeletingError. /// /// In fr, this message translates to: - /// **'Nom et prénom copié dans le presse-papier'** - String get phonebookNameCopied; + /// **'Erreur lors de la suppression'** + String get phonebookDeletingError; - /// No description provided for @phonebookNamePure. + /// No description provided for @phonebookDescription. /// /// In fr, this message translates to: - /// **'Nom'** - String get phonebookNamePure; + /// **'Description'** + String get phonebookDescription; - /// No description provided for @phonebookNewTerm. + /// No description provided for @phonebookDetail. /// /// In fr, this message translates to: - /// **'Nouveau mandat'** - String get phonebookNewTerm; + /// **'Détail :'** + String get phonebookDetail; - /// No description provided for @phonebookNewTermConfirmed. + /// No description provided for @phonebookEdit. /// /// In fr, this message translates to: - /// **'Mandat changé'** - String get phonebookNewTermConfirmed; + /// **'Modifier'** + String get phonebookEdit; - /// No description provided for @phonebookNickname. + /// No description provided for @phonebookEditAssociationGroupement. /// /// In fr, this message translates to: - /// **'Surnom :'** - String get phonebookNickname; + /// **'Modifier le groupement d\'association'** + String get phonebookEditAssociationGroupement; - /// No description provided for @phonebookNicknameCopied. + /// No description provided for @phonebookEditAssociationGroups. /// /// In fr, this message translates to: - /// **'Surnom copié dans le presse-papier'** - String get phonebookNicknameCopied; + /// **'Gérer les groupes'** + String get phonebookEditAssociationGroups; - /// No description provided for @phonebookNoAssociationFound. + /// No description provided for @phonebookEditAssociationInfo. /// /// In fr, this message translates to: - /// **'Aucune association trouvée'** - String get phonebookNoAssociationFound; + /// **'Modifier'** + String get phonebookEditAssociationInfo; - /// No description provided for @phonebookNoMember. + /// No description provided for @phonebookEditAssociationMembers. /// /// In fr, this message translates to: - /// **'Aucun membre'** - String get phonebookNoMember; + /// **'Gérer les membres'** + String get phonebookEditAssociationMembers; - /// No description provided for @phonebookNoMemberRole. + /// No description provided for @phonebookEditMembership. /// /// In fr, this message translates to: - /// **'Aucun role trouvé'** - String get phonebookNoMemberRole; + /// **'Modifier le rôle'** + String get phonebookEditMembership; - /// No description provided for @phonebookNoRoleTags. + /// No description provided for @phonebookEditRole. /// /// In fr, this message translates to: - /// **'Aucun tag de rôle trouvé'** - String get phonebookNoRoleTags; + /// **'Modifier le rôle'** + String get phonebookEditRole; - /// No description provided for @phonebookPhone. + /// No description provided for @phonebookEmail. /// /// In fr, this message translates to: - /// **'Téléphone :'** - String get phonebookPhone; + /// **'Email :'** + String get phonebookEmail; - /// No description provided for @phonebookPhonebook. + /// No description provided for @phonebookEmailCopied. /// /// In fr, this message translates to: - /// **'Annuaire'** - String get phonebookPhonebook; + /// **'Email copié dans le presse-papier'** + String get phonebookEmailCopied; - /// No description provided for @phonebookPhonebookSearch. + /// No description provided for @phonebookEmptyApparentName. /// /// In fr, this message translates to: - /// **'Rechercher'** - String get phonebookPhonebookSearch; + /// **'Veuillez entrer un nom de role'** + String get phonebookEmptyApparentName; - /// No description provided for @phonebookPhonebookSearchAssociation. + /// No description provided for @phonebookEmptyFieldError. /// /// In fr, this message translates to: - /// **'Association'** - String get phonebookPhonebookSearchAssociation; + /// **'Un champ n\'est pas rempli'** + String get phonebookEmptyFieldError; - /// No description provided for @phonebookPhonebookSearchField. + /// No description provided for @phonebookEmptyKindError. /// /// In fr, this message translates to: - /// **'Rechercher :'** - String get phonebookPhonebookSearchField; + /// **'Veuillez choisir un type d\'association'** + String get phonebookEmptyKindError; - /// No description provided for @phonebookPhonebookSearchName. + /// No description provided for @phonebookEmptyMember. /// /// In fr, this message translates to: - /// **'Nom/Prénom/Surnom'** - String get phonebookPhonebookSearchName; + /// **'Aucun membre sélectionné'** + String get phonebookEmptyMember; - /// No description provided for @phonebookPhonebookSearchRole. + /// No description provided for @phonebookErrorAssociationLoading. /// /// In fr, this message translates to: - /// **'Poste'** - String get phonebookPhonebookSearchRole; + /// **'Erreur lors du chargement de l\'association'** + String get phonebookErrorAssociationLoading; - /// No description provided for @phonebookPresidentRoleTag. + /// No description provided for @phonebookErrorAssociationNameEmpty. /// /// In fr, this message translates to: - /// **'Prez\''** - String get phonebookPresidentRoleTag; + /// **'Veuillez entrer un nom d\'association'** + String get phonebookErrorAssociationNameEmpty; - /// No description provided for @phonebookPromoNotGiven. + /// No description provided for @phonebookErrorAssociationPicture. /// /// In fr, this message translates to: - /// **'Promo non renseignée'** - String get phonebookPromoNotGiven; + /// **'Erreur lors de la modification de la photo d\'association'** + String get phonebookErrorAssociationPicture; - /// Année de promotion d'un membre + /// No description provided for @phonebookErrorKindsLoading. /// /// In fr, this message translates to: - /// **'Promotion {year}'** - String phonebookPromotion(int year); + /// **'Erreur lors du chargement des types d\'association'** + String get phonebookErrorKindsLoading; - /// No description provided for @phonebookReorderingError. + /// No description provided for @phonebookErrorLoadAssociationList. /// /// In fr, this message translates to: - /// **'Erreur lors du réordonnement'** - String get phonebookReorderingError; + /// **'Erreur lors du chargement de la liste des associations'** + String get phonebookErrorLoadAssociationList; - /// No description provided for @phonebookResearch. + /// No description provided for @phonebookErrorLoadAssociationMember. /// /// In fr, this message translates to: - /// **'Rechercher'** - String get phonebookResearch; + /// **'Erreur lors du chargement des membres de l\'association'** + String get phonebookErrorLoadAssociationMember; - /// No description provided for @phonebookRolePure. + /// No description provided for @phonebookErrorLoadAssociationPicture. /// /// In fr, this message translates to: - /// **'Rôle'** - String get phonebookRolePure; + /// **'Erreur lors du chargement de la photo d\'association'** + String get phonebookErrorLoadAssociationPicture; - /// No description provided for @phonebookSearchUser. + /// No description provided for @phonebookErrorLoadProfilePicture. /// /// In fr, this message translates to: - /// **'Rechercher un utilisateur'** - String get phonebookSearchUser; + /// **'Erreur'** + String get phonebookErrorLoadProfilePicture; - /// No description provided for @phonebookTooHeavyAssociationPicture. + /// No description provided for @phonebookErrorRoleTagsLoading. /// /// In fr, this message translates to: - /// **'L\'image est trop lourde (max 4Mo)'** - String get phonebookTooHeavyAssociationPicture; + /// **'Erreur lors du chargement des tags de rôle'** + String get phonebookErrorRoleTagsLoading; - /// No description provided for @phonebookUpdateGroups. + /// No description provided for @phonebookExistingMembership. /// /// In fr, this message translates to: - /// **'Mettre à jour les groupes'** - String get phonebookUpdateGroups; + /// **'Ce membre est déjà dans le mandat actuel'** + String get phonebookExistingMembership; - /// No description provided for @phonebookUpdatedAssociation. + /// No description provided for @phonebookFilter. /// /// In fr, this message translates to: - /// **'Association modifiée'** - String get phonebookUpdatedAssociation; + /// **'Filtrer'** + String get phonebookFilter; - /// No description provided for @phonebookUpdatedAssociationPicture. + /// No description provided for @phonebookFilterDescription. /// /// In fr, this message translates to: - /// **'La photo d\'association a été changée'** - String get phonebookUpdatedAssociationPicture; + /// **'Filtrer les associations par type'** + String get phonebookFilterDescription; - /// No description provided for @phonebookUpdatedGroups. + /// No description provided for @phonebookFirstname. /// /// In fr, this message translates to: - /// **'Groupes mis à jour'** - String get phonebookUpdatedGroups; + /// **'Prénom :'** + String get phonebookFirstname; - /// No description provided for @phonebookUpdatedMember. + /// No description provided for @phonebookGroupementDeleted. /// /// In fr, this message translates to: - /// **'Membre modifié'** - String get phonebookUpdatedMember; + /// **'Groupement d\'association supprimé'** + String get phonebookGroupementDeleted; - /// No description provided for @phonebookUpdatingError. + /// No description provided for @phonebookGroupementDeleteError. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get phonebookUpdatingError; + /// **'Erreur lors de la suppression du groupement d\'association'** + String get phonebookGroupementDeleteError; - /// No description provided for @phonebookValidation. + /// No description provided for @phonebookGroupementName. /// /// In fr, this message translates to: - /// **'Valider'** - String get phonebookValidation; + /// **'Nom du groupement'** + String get phonebookGroupementName; - /// No description provided for @purchasesPurchases. + /// Permet de gérer les groupes d'une association /// /// In fr, this message translates to: - /// **'Achats'** - String get purchasesPurchases; + /// **'Gérer les groupes de {association}'** + String phonebookGroups(String association); - /// No description provided for @purchasesResearch. + /// No description provided for @phonebookMember. /// /// In fr, this message translates to: - /// **'Rechercher'** - String get purchasesResearch; + /// **'Membre'** + String get phonebookMember; - /// No description provided for @purchasesNoPurchasesFound. + /// No description provided for @phonebookMemberReordered. /// /// In fr, this message translates to: - /// **'Aucun achat trouvé'** - String get purchasesNoPurchasesFound; + /// **'Membre réordonné'** + String get phonebookMemberReordered; - /// No description provided for @purchasesNoTickets. + /// Permet de gérer les membres d'une association /// /// In fr, this message translates to: - /// **'Aucun ticket'** - String get purchasesNoTickets; + /// **'Gérer les membres de {association}'** + String phonebookMembers(String association); - /// No description provided for @purchasesTicketsError. + /// No description provided for @phonebookMembershipAssociationError. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement des tickets'** - String get purchasesTicketsError; + /// **'Veuillez choisir une association'** + String get phonebookMembershipAssociationError; - /// No description provided for @purchasesPurchasesError. + /// No description provided for @phonebookMembershipRole. /// /// In fr, this message translates to: - /// **'Erreur lors du chargement des achats'** - String get purchasesPurchasesError; + /// **'Rôle :'** + String get phonebookMembershipRole; - /// No description provided for @purchasesNoPurchases. + /// No description provided for @phonebookMembershipRoleError. /// /// In fr, this message translates to: - /// **'Aucun achat'** - String get purchasesNoPurchases; + /// **'Veuillez choisir un rôle'** + String get phonebookMembershipRoleError; - /// No description provided for @purchasesTimes. + /// Permet de modifier le rôle d'un membre dans une association /// /// In fr, this message translates to: - /// **'fois'** - String get purchasesTimes; + /// **'Modifier le rôle de {name}'** + String phonebookModifyMembership(String name); - /// No description provided for @purchasesAlreadyUsed. + /// No description provided for @phonebookName. /// /// In fr, this message translates to: - /// **'Déjà utilisé'** - String get purchasesAlreadyUsed; + /// **'Nom :'** + String get phonebookName; - /// No description provided for @purchasesNotPaid. + /// No description provided for @phonebookNameCopied. /// /// In fr, this message translates to: - /// **'Non validé'** - String get purchasesNotPaid; + /// **'Nom et prénom copié dans le presse-papier'** + String get phonebookNameCopied; - /// No description provided for @purchasesPleaseSelectProduct. + /// No description provided for @phonebookNamePure. /// /// In fr, this message translates to: - /// **'Veuillez sélectionner un produit'** - String get purchasesPleaseSelectProduct; + /// **'Nom'** + String get phonebookNamePure; - /// No description provided for @purchasesProducts. + /// No description provided for @phonebookNewTerm. /// /// In fr, this message translates to: - /// **'Produits'** - String get purchasesProducts; + /// **'Nouveau mandat'** + String get phonebookNewTerm; - /// No description provided for @purchasesCancel. + /// No description provided for @phonebookNewTermConfirmed. /// /// In fr, this message translates to: - /// **'Annuler'** - String get purchasesCancel; + /// **'Mandat changé'** + String get phonebookNewTermConfirmed; - /// No description provided for @purchasesValidate. + /// No description provided for @phonebookNickname. /// /// In fr, this message translates to: - /// **'Valider'** - String get purchasesValidate; + /// **'Surnom :'** + String get phonebookNickname; - /// No description provided for @purchasesLeftScan. + /// No description provided for @phonebookNicknameCopied. /// /// In fr, this message translates to: - /// **'Scans restants'** - String get purchasesLeftScan; + /// **'Surnom copié dans le presse-papier'** + String get phonebookNicknameCopied; - /// No description provided for @purchasesTag. + /// No description provided for @phonebookNoAssociationFound. /// /// In fr, this message translates to: - /// **'Tag'** - String get purchasesTag; + /// **'Aucune association trouvée'** + String get phonebookNoAssociationFound; - /// No description provided for @purchasesHistory. + /// No description provided for @phonebookNoMember. /// /// In fr, this message translates to: - /// **'Historique'** - String get purchasesHistory; + /// **'Aucun membre'** + String get phonebookNoMember; - /// No description provided for @purchasesPleaseSelectSeller. + /// No description provided for @phonebookNoMemberRole. /// /// In fr, this message translates to: - /// **'Veuillez sélectionner un vendeur'** - String get purchasesPleaseSelectSeller; + /// **'Aucun role trouvé'** + String get phonebookNoMemberRole; - /// No description provided for @purchasesNoTagGiven. + /// No description provided for @phonebookNoRoleTags. /// /// In fr, this message translates to: - /// **'Attention, aucun tag n\'a été entré'** - String get purchasesNoTagGiven; + /// **'Aucun tag de rôle trouvé'** + String get phonebookNoRoleTags; - /// No description provided for @purchasesTickets. + /// No description provided for @phonebookPhone. /// /// In fr, this message translates to: - /// **'Tickets'** - String get purchasesTickets; + /// **'Téléphone :'** + String get phonebookPhone; - /// No description provided for @purchasesNoScannableProducts. + /// No description provided for @phonebookPhonebook. /// /// In fr, this message translates to: - /// **'Aucun produit scannable'** - String get purchasesNoScannableProducts; + /// **'Annuaire'** + String get phonebookPhonebook; - /// No description provided for @purchasesLoading. + /// No description provided for @phonebookPhonebookSearch. /// /// In fr, this message translates to: - /// **'En attente de scan'** - String get purchasesLoading; + /// **'Rechercher'** + String get phonebookPhonebookSearch; - /// No description provided for @purchasesScan. + /// No description provided for @phonebookPhonebookSearchAssociation. /// /// In fr, this message translates to: - /// **'Scanner'** - String get purchasesScan; + /// **'Association'** + String get phonebookPhonebookSearchAssociation; - /// No description provided for @raffleRaffle. + /// No description provided for @phonebookPhonebookSearchField. /// /// In fr, this message translates to: - /// **'Tombola'** - String get raffleRaffle; + /// **'Rechercher :'** + String get phonebookPhonebookSearchField; - /// No description provided for @rafflePrize. + /// No description provided for @phonebookPhonebookSearchName. /// /// In fr, this message translates to: - /// **'Lot'** - String get rafflePrize; + /// **'Nom/Prénom/Surnom'** + String get phonebookPhonebookSearchName; - /// No description provided for @rafflePrizes. + /// No description provided for @phonebookPhonebookSearchRole. /// /// In fr, this message translates to: - /// **'Lots'** - String get rafflePrizes; + /// **'Poste'** + String get phonebookPhonebookSearchRole; - /// No description provided for @raffleActualRaffles. + /// No description provided for @phonebookPresidentRoleTag. /// /// In fr, this message translates to: - /// **'Tombola en cours'** - String get raffleActualRaffles; + /// **'Prez\''** + String get phonebookPresidentRoleTag; - /// No description provided for @rafflePastRaffles. + /// No description provided for @phonebookPromoNotGiven. /// /// In fr, this message translates to: - /// **'Tombola passés'** - String get rafflePastRaffles; + /// **'Promo non renseignée'** + String get phonebookPromoNotGiven; - /// No description provided for @raffleYourTickets. + /// Année de promotion d'un membre /// /// In fr, this message translates to: - /// **'Tous vos tickets'** - String get raffleYourTickets; + /// **'Promotion {year}'** + String phonebookPromotion(int year); - /// No description provided for @raffleCreateMenu. + /// No description provided for @phonebookReorderingError. /// /// In fr, this message translates to: - /// **'Menu de Création'** - String get raffleCreateMenu; + /// **'Erreur lors du réordonnement'** + String get phonebookReorderingError; - /// No description provided for @raffleNextRaffles. + /// No description provided for @phonebookResearch. /// /// In fr, this message translates to: - /// **'Prochaines tombolas'** - String get raffleNextRaffles; + /// **'Rechercher'** + String get phonebookResearch; - /// No description provided for @raffleNoTicket. + /// No description provided for @phonebookRolePure. /// /// In fr, this message translates to: - /// **'Vous n\'avez pas de ticket'** - String get raffleNoTicket; + /// **'Rôle'** + String get phonebookRolePure; - /// No description provided for @raffleSeeRaffleDetail. + /// No description provided for @phonebookSearchUser. /// /// In fr, this message translates to: - /// **'Voir lots/tickets'** - String get raffleSeeRaffleDetail; + /// **'Rechercher un utilisateur'** + String get phonebookSearchUser; - /// No description provided for @raffleActualPrize. + /// No description provided for @phonebookSelectManagerGroup. /// /// In fr, this message translates to: - /// **'Lots actuels'** - String get raffleActualPrize; + /// **'Sélectionner le groupe de managers'** + String get phonebookSelectManagerGroup; - /// No description provided for @raffleMajorPrize. + /// Année de mandat d'une association /// /// In fr, this message translates to: - /// **'Lot Majeurs'** - String get raffleMajorPrize; + /// **'Mandat {year}'** + String phonebookTerm(int year); - /// No description provided for @raffleTakeTickets. + /// No description provided for @phonebookTermChangingError. /// /// In fr, this message translates to: - /// **'Prendre vos tickets'** - String get raffleTakeTickets; + /// **'Erreur lors du changement de mandat'** + String get phonebookTermChangingError; - /// No description provided for @raffleNoTicketBuyable. + /// No description provided for @phonebookTooHeavyAssociationPicture. /// /// In fr, this message translates to: - /// **'Vous ne pouvez pas achetez de billets pour l\'instant'** - String get raffleNoTicketBuyable; + /// **'L\'image est trop lourde (max 4Mo)'** + String get phonebookTooHeavyAssociationPicture; - /// No description provided for @raffleNoCurrentPrize. + /// No description provided for @phonebookUpdatedAssociation. /// /// In fr, this message translates to: - /// **'Il n\'y a aucun lots actuellement'** - String get raffleNoCurrentPrize; + /// **'Association modifiée'** + String get phonebookUpdatedAssociation; - /// No description provided for @raffleModifTombola. + /// No description provided for @phonebookUpdatedAssociationPicture. /// /// In fr, this message translates to: - /// **'Vous pouvez modifiez vos tombolas ou en créer de nouvelles, toute décision doit ensuite être prise par les admins'** - String get raffleModifTombola; + /// **'La photo d\'association a été changée'** + String get phonebookUpdatedAssociationPicture; - /// No description provided for @raffleCreateYourRaffle. + /// No description provided for @phonebookUpdatedGroups. /// /// In fr, this message translates to: - /// **'Votre menu de création de tombolas'** - String get raffleCreateYourRaffle; + /// **'Groupes mis à jour'** + String get phonebookUpdatedGroups; - /// No description provided for @rafflePossiblePrice. + /// No description provided for @phonebookUpdatedMember. /// /// In fr, this message translates to: - /// **'Prix possible'** - String get rafflePossiblePrice; + /// **'Membre modifié'** + String get phonebookUpdatedMember; - /// No description provided for @raffleInformation. + /// No description provided for @phonebookUpdateGroups. /// /// In fr, this message translates to: - /// **'Information et Statistiques'** - String get raffleInformation; + /// **'Mettre à jour les groupes'** + String get phonebookUpdateGroups; - /// No description provided for @raffleAccounts. + /// No description provided for @phonebookUpdatingError. /// /// In fr, this message translates to: - /// **'Comptes'** - String get raffleAccounts; + /// **'Erreur lors de la modification'** + String get phonebookUpdatingError; - /// No description provided for @raffleAdd. + /// No description provided for @phonebookValidation. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get raffleAdd; + /// **'Valider'** + String get phonebookValidation; - /// No description provided for @raffleUpdatedAmount. + /// No description provided for @phPhName. /// /// In fr, this message translates to: - /// **'Montant mis à jour'** - String get raffleUpdatedAmount; + /// **'Nom du PH'** + String get phPhName; - /// No description provided for @raffleUpdatingError. + /// No description provided for @phSeePreviousJournal. /// /// In fr, this message translates to: - /// **'Erreur lors de la mise à jour'** - String get raffleUpdatingError; + /// **'Voir les anciens journaux'** + String get phSeePreviousJournal; - /// No description provided for @raffleDeletedPrize. + /// No description provided for @phSuccesDowloading. /// /// In fr, this message translates to: - /// **'Lot supprimé'** - String get raffleDeletedPrize; + /// **'Téléchargé avec succès'** + String get phSuccesDowloading; - /// No description provided for @raffleDeletingError. + /// No description provided for @phToHeavyFile. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get raffleDeletingError; + /// **'Fichier trop volumineux'** + String get phToHeavyFile; - /// No description provided for @raffleQuantity. + /// No description provided for @purchasesAlreadyUsed. /// /// In fr, this message translates to: - /// **'Quantité'** - String get raffleQuantity; + /// **'Déjà utilisé'** + String get purchasesAlreadyUsed; - /// No description provided for @raffleClose. + /// No description provided for @purchasesCancel. /// /// In fr, this message translates to: - /// **'Fermer'** - String get raffleClose; + /// **'Annuler'** + String get purchasesCancel; - /// No description provided for @raffleOpen. + /// No description provided for @purchasesHistory. /// /// In fr, this message translates to: - /// **'Ouvrir'** - String get raffleOpen; + /// **'Historique'** + String get purchasesHistory; - /// No description provided for @raffleAddTypeTicketSimple. + /// No description provided for @purchasesLeftScan. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get raffleAddTypeTicketSimple; + /// **'Scans restants'** + String get purchasesLeftScan; - /// No description provided for @raffleAddingError. + /// No description provided for @purchasesLoading. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get raffleAddingError; + /// **'En attente de scan'** + String get purchasesLoading; - /// No description provided for @raffleEditTypeTicketSimple. + /// No description provided for @purchasesNoPurchases. /// /// In fr, this message translates to: - /// **'Modifier'** - String get raffleEditTypeTicketSimple; + /// **'Aucun achat'** + String get purchasesNoPurchases; - /// No description provided for @raffleFillField. + /// No description provided for @purchasesNoPurchasesFound. /// /// In fr, this message translates to: - /// **'Le champ ne peut pas être vide'** - String get raffleFillField; + /// **'Aucun achat trouvé'** + String get purchasesNoPurchasesFound; - /// No description provided for @raffleWaiting. + /// No description provided for @purchasesNoScannableProducts. /// /// In fr, this message translates to: - /// **'Chargement'** - String get raffleWaiting; + /// **'Aucun produit scannable'** + String get purchasesNoScannableProducts; - /// No description provided for @raffleEditingError. + /// No description provided for @purchasesNoTagGiven. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get raffleEditingError; + /// **'Attention, aucun tag n\'a été entré'** + String get purchasesNoTagGiven; - /// No description provided for @raffleAddedTicket. + /// No description provided for @purchasesNoTickets. /// /// In fr, this message translates to: - /// **'Ticket ajouté'** - String get raffleAddedTicket; + /// **'Aucun ticket'** + String get purchasesNoTickets; - /// No description provided for @raffleEditedTicket. + /// No description provided for @purchasesNotPaid. /// /// In fr, this message translates to: - /// **'Ticket modifié'** - String get raffleEditedTicket; + /// **'Non validé'** + String get purchasesNotPaid; - /// No description provided for @raffleAlreadyExistTicket. + /// No description provided for @purchasesPleaseSelectProduct. /// /// In fr, this message translates to: - /// **'Le ticket existe déjà'** - String get raffleAlreadyExistTicket; + /// **'Veuillez sélectionner un produit'** + String get purchasesPleaseSelectProduct; - /// No description provided for @raffleNumberExpected. + /// No description provided for @purchasesPleaseSelectSeller. /// /// In fr, this message translates to: - /// **'Un entier est attendu'** - String get raffleNumberExpected; + /// **'Veuillez sélectionner un vendeur'** + String get purchasesPleaseSelectSeller; - /// No description provided for @raffleDeletedTicket. + /// No description provided for @purchasesProducts. /// /// In fr, this message translates to: - /// **'Ticket supprimé'** - String get raffleDeletedTicket; + /// **'Produits'** + String get purchasesProducts; - /// No description provided for @raffleAddPrize. + /// No description provided for @purchasesPurchases. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get raffleAddPrize; + /// **'Achats'** + String get purchasesPurchases; - /// No description provided for @raffleEditPrize. + /// No description provided for @purchasesPurchasesError. /// /// In fr, this message translates to: - /// **'Modifier'** - String get raffleEditPrize; + /// **'Erreur lors du chargement des achats'** + String get purchasesPurchasesError; - /// No description provided for @raffleOpenRaffle. + /// No description provided for @purchasesResearch. /// /// In fr, this message translates to: - /// **'Ouvrir la tombola'** - String get raffleOpenRaffle; + /// **'Rechercher'** + String get purchasesResearch; - /// No description provided for @raffleCloseRaffle. + /// No description provided for @purchasesScan. /// /// In fr, this message translates to: - /// **'Fermer la tombola'** - String get raffleCloseRaffle; + /// **'Scanner'** + String get purchasesScan; - /// No description provided for @raffleOpenRaffleDescription. + /// No description provided for @purchasesTag. /// /// In fr, this message translates to: - /// **'Vous allez ouvrir la tombola, les utilisateurs pourront acheter des tickets. Vous ne pourrez plus modifier la tombola. Êtes-vous sûr de vouloir continuer ?'** - String get raffleOpenRaffleDescription; + /// **'Tag'** + String get purchasesTag; - /// No description provided for @raffleCloseRaffleDescription. + /// No description provided for @purchasesTickets. /// /// In fr, this message translates to: - /// **'Vous allez fermer la tombola, les utilisateurs ne pourront plus acheter de tickets. Êtes-vous sûr de vouloir continuer ?'** - String get raffleCloseRaffleDescription; + /// **'Tickets'** + String get purchasesTickets; - /// No description provided for @raffleNoCurrentRaffle. + /// No description provided for @purchasesTicketsError. /// /// In fr, this message translates to: - /// **'Il n\'y a aucune tombola en cours'** - String get raffleNoCurrentRaffle; + /// **'Erreur lors du chargement des tickets'** + String get purchasesTicketsError; - /// No description provided for @raffleBoughtTicket. + /// No description provided for @purchasesTimes. /// /// In fr, this message translates to: - /// **'Ticket acheté'** - String get raffleBoughtTicket; + /// **'fois'** + String get purchasesTimes; - /// No description provided for @raffleDrawingError. + /// No description provided for @purchasesValidate. /// /// In fr, this message translates to: - /// **'Erreur lors du tirage'** - String get raffleDrawingError; + /// **'Valider'** + String get purchasesValidate; - /// No description provided for @raffleInvalidPrice. + /// No description provided for @raffleAccounts. /// /// In fr, this message translates to: - /// **'Le prix doit être supérieur à 0'** - String get raffleInvalidPrice; + /// **'Comptes'** + String get raffleAccounts; - /// No description provided for @raffleMustBePositive. + /// No description provided for @raffleActualPrize. /// /// In fr, this message translates to: - /// **'Le nombre doit être strictement positif'** - String get raffleMustBePositive; + /// **'Lots actuels'** + String get raffleActualPrize; - /// No description provided for @raffleDraw. + /// No description provided for @raffleActualRaffles. /// /// In fr, this message translates to: - /// **'Tirer'** - String get raffleDraw; + /// **'Tombola en cours'** + String get raffleActualRaffles; - /// No description provided for @raffleDrawn. + /// No description provided for @raffleAdd. /// /// In fr, this message translates to: - /// **'Tiré'** - String get raffleDrawn; + /// **'Ajouter'** + String get raffleAdd; - /// No description provided for @raffleError. + /// No description provided for @raffleAddedTicket. /// /// In fr, this message translates to: - /// **'Erreur'** - String get raffleError; + /// **'Ticket ajouté'** + String get raffleAddedTicket; - /// No description provided for @raffleGathered. + /// No description provided for @raffleAddingError. /// /// In fr, this message translates to: - /// **'Récolté'** - String get raffleGathered; + /// **'Erreur lors de l\'ajout'** + String get raffleAddingError; - /// No description provided for @raffleTickets. + /// No description provided for @raffleAddPackTicket. /// /// In fr, this message translates to: - /// **'Tickets'** - String get raffleTickets; + /// **'Ajouter un pack de ticket'** + String get raffleAddPackTicket; - /// No description provided for @raffleTicket. + /// No description provided for @raffleAddPrize. /// /// In fr, this message translates to: - /// **'ticket'** - String get raffleTicket; + /// **'Ajouter'** + String get raffleAddPrize; - /// No description provided for @raffleWinner. + /// No description provided for @raffleAddTypeTicketSimple. /// /// In fr, this message translates to: - /// **'Gagnant'** - String get raffleWinner; + /// **'Ajouter'** + String get raffleAddTypeTicketSimple; - /// No description provided for @raffleNoPrize. + /// No description provided for @raffleAlreadyExistTicket. /// /// In fr, this message translates to: - /// **'Aucun lot'** - String get raffleNoPrize; + /// **'Le ticket existe déjà'** + String get raffleAlreadyExistTicket; - /// No description provided for @raffleDeletePrize. + /// No description provided for @raffleAmount. /// /// In fr, this message translates to: - /// **'Supprimer le lot'** - String get raffleDeletePrize; + /// **'Solde'** + String get raffleAmount; - /// No description provided for @raffleDeletePrizeDescription. + /// No description provided for @raffleBoughtTicket. /// /// In fr, this message translates to: - /// **'Vous allez supprimer le lot, êtes-vous sûr de vouloir continuer ?'** - String get raffleDeletePrizeDescription; + /// **'Ticket acheté'** + String get raffleBoughtTicket; - /// No description provided for @raffleDrawing. + /// No description provided for @raffleBuyThisTicket. /// /// In fr, this message translates to: - /// **'Tirage'** - String get raffleDrawing; + /// **'Acheter ce ticket'** + String get raffleBuyThisTicket; - /// No description provided for @raffleDrawingDescription. + /// No description provided for @raffleClose. /// /// In fr, this message translates to: - /// **'Tirer le gagnant du lot ?'** - String get raffleDrawingDescription; + /// **'Fermer'** + String get raffleClose; - /// No description provided for @raffleDeleteTicket. + /// No description provided for @raffleCloseRaffle. /// /// In fr, this message translates to: - /// **'Supprimer le ticket'** - String get raffleDeleteTicket; + /// **'Fermer la tombola'** + String get raffleCloseRaffle; - /// No description provided for @raffleDeleteTicketDescription. + /// No description provided for @raffleCloseRaffleDescription. /// /// In fr, this message translates to: - /// **'Vous allez supprimer le ticket, êtes-vous sûr de vouloir continuer ?'** - String get raffleDeleteTicketDescription; + /// **'Vous allez fermer la tombola, les utilisateurs ne pourront plus acheter de tickets. Êtes-vous sûr de vouloir continuer ?'** + String get raffleCloseRaffleDescription; - /// No description provided for @raffleWinningTickets. + /// No description provided for @raffleCreateMenu. /// /// In fr, this message translates to: - /// **'Tickets gagnants'** - String get raffleWinningTickets; + /// **'Menu de Création'** + String get raffleCreateMenu; - /// No description provided for @raffleNoWinningTicketYet. + /// No description provided for @raffleCreateYourRaffle. /// /// In fr, this message translates to: - /// **'Les tickets gagnants seront affichés ici'** - String get raffleNoWinningTicketYet; + /// **'Votre menu de création de tombolas'** + String get raffleCreateYourRaffle; - /// No description provided for @raffleName. + /// No description provided for @raffleDeletedPrize. /// /// In fr, this message translates to: - /// **'Nom'** - String get raffleName; + /// **'Lot supprimé'** + String get raffleDeletedPrize; - /// No description provided for @raffleDescription. + /// No description provided for @raffleDeletedTicket. /// /// In fr, this message translates to: - /// **'Description'** - String get raffleDescription; + /// **'Ticket supprimé'** + String get raffleDeletedTicket; - /// No description provided for @raffleBuyThisTicket. + /// No description provided for @raffleDeletePrize. /// /// In fr, this message translates to: - /// **'Acheter ce ticket'** - String get raffleBuyThisTicket; + /// **'Supprimer le lot'** + String get raffleDeletePrize; - /// No description provided for @raffleLockedRaffle. + /// No description provided for @raffleDeletePrizeDescription. /// /// In fr, this message translates to: - /// **'Tombola verrouillée'** - String get raffleLockedRaffle; + /// **'Vous allez supprimer le lot, êtes-vous sûr de vouloir continuer ?'** + String get raffleDeletePrizeDescription; - /// No description provided for @raffleUnavailableRaffle. + /// No description provided for @raffleDeleteTicket. /// /// In fr, this message translates to: - /// **'Tombola indisponible'** - String get raffleUnavailableRaffle; + /// **'Supprimer le ticket'** + String get raffleDeleteTicket; - /// No description provided for @raffleNotEnoughMoney. + /// No description provided for @raffleDeleteTicketDescription. /// /// In fr, this message translates to: - /// **'Vous n\'avez pas assez d\'argent'** - String get raffleNotEnoughMoney; + /// **'Vous allez supprimer le ticket, êtes-vous sûr de vouloir continuer ?'** + String get raffleDeleteTicketDescription; - /// No description provided for @raffleWinnable. + /// No description provided for @raffleDeletingError. /// /// In fr, this message translates to: - /// **'gagnable'** - String get raffleWinnable; + /// **'Erreur lors de la suppression'** + String get raffleDeletingError; - /// No description provided for @raffleNoDescription. + /// No description provided for @raffleDescription. /// /// In fr, this message translates to: - /// **'Aucune description'** - String get raffleNoDescription; + /// **'Description'** + String get raffleDescription; - /// No description provided for @raffleAmount. + /// No description provided for @raffleDraw. /// /// In fr, this message translates to: - /// **'Solde'** - String get raffleAmount; + /// **'Tirer'** + String get raffleDraw; - /// No description provided for @raffleLoading. + /// No description provided for @raffleDrawing. /// /// In fr, this message translates to: - /// **'Chargement'** - String get raffleLoading; + /// **'Tirage'** + String get raffleDrawing; - /// No description provided for @raffleTicketNumber. + /// No description provided for @raffleDrawingDescription. /// /// In fr, this message translates to: - /// **'Nombre de ticket'** - String get raffleTicketNumber; + /// **'Tirer le gagnant du lot ?'** + String get raffleDrawingDescription; - /// No description provided for @rafflePrice. + /// No description provided for @raffleDrawingError. /// /// In fr, this message translates to: - /// **'Prix'** - String get rafflePrice; + /// **'Erreur lors du tirage'** + String get raffleDrawingError; - /// No description provided for @raffleEditRaffle. + /// No description provided for @raffleDrawn. /// /// In fr, this message translates to: - /// **'Modifier la tombola'** - String get raffleEditRaffle; + /// **'Tiré'** + String get raffleDrawn; /// No description provided for @raffleEdit. /// @@ -6674,2045 +6680,2051 @@ abstract class AppLocalizations { /// **'Modifier'** String get raffleEdit; - /// No description provided for @raffleAddPackTicket. + /// No description provided for @raffleEditedTicket. /// /// In fr, this message translates to: - /// **'Ajouter un pack de ticket'** - String get raffleAddPackTicket; + /// **'Ticket modifié'** + String get raffleEditedTicket; - /// No description provided for @recommendationRecommendation. + /// No description provided for @raffleEditingError. /// /// In fr, this message translates to: - /// **'Bons plans'** - String get recommendationRecommendation; + /// **'Erreur lors de la modification'** + String get raffleEditingError; - /// No description provided for @recommendationTitle. + /// No description provided for @raffleEditPrize. /// /// In fr, this message translates to: - /// **'Titre'** - String get recommendationTitle; + /// **'Modifier'** + String get raffleEditPrize; - /// No description provided for @recommendationLogo. + /// No description provided for @raffleEditRaffle. /// /// In fr, this message translates to: - /// **'Logo'** - String get recommendationLogo; + /// **'Modifier la tombola'** + String get raffleEditRaffle; - /// No description provided for @recommendationCode. + /// No description provided for @raffleEditTypeTicketSimple. /// /// In fr, this message translates to: - /// **'Code'** - String get recommendationCode; + /// **'Modifier'** + String get raffleEditTypeTicketSimple; - /// No description provided for @recommendationSummary. + /// No description provided for @raffleError. /// /// In fr, this message translates to: - /// **'Court résumé'** - String get recommendationSummary; + /// **'Erreur'** + String get raffleError; - /// No description provided for @recommendationDescription. + /// No description provided for @raffleFillField. /// /// In fr, this message translates to: - /// **'Description'** - String get recommendationDescription; + /// **'Le champ ne peut pas être vide'** + String get raffleFillField; - /// No description provided for @recommendationAdd. + /// No description provided for @raffleGathered. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get recommendationAdd; + /// **'Récolté'** + String get raffleGathered; - /// No description provided for @recommendationEdit. + /// No description provided for @raffleInformation. /// /// In fr, this message translates to: - /// **'Modifier'** - String get recommendationEdit; + /// **'Information et Statistiques'** + String get raffleInformation; - /// No description provided for @recommendationDelete. + /// No description provided for @raffleInvalidPrice. /// /// In fr, this message translates to: - /// **'Supprimer'** - String get recommendationDelete; + /// **'Le prix doit être supérieur à 0'** + String get raffleInvalidPrice; - /// No description provided for @recommendationAddImage. + /// No description provided for @raffleLoading. /// /// In fr, this message translates to: - /// **'Veuillez ajouter une image'** - String get recommendationAddImage; + /// **'Chargement'** + String get raffleLoading; - /// No description provided for @recommendationAddedRecommendation. + /// No description provided for @raffleLockedRaffle. /// /// In fr, this message translates to: - /// **'Bon plan ajouté'** - String get recommendationAddedRecommendation; + /// **'Tombola verrouillée'** + String get raffleLockedRaffle; - /// No description provided for @recommendationEditedRecommendation. + /// No description provided for @raffleMajorPrize. /// /// In fr, this message translates to: - /// **'Bon plan modifié'** - String get recommendationEditedRecommendation; + /// **'Lot Majeurs'** + String get raffleMajorPrize; - /// No description provided for @recommendationDeleteRecommendationConfirmation. + /// No description provided for @raffleModifTombola. /// /// In fr, this message translates to: - /// **'Êtes-vous sûr de vouloir supprimer ce bon plan ?'** - String get recommendationDeleteRecommendationConfirmation; + /// **'Vous pouvez modifiez vos tombolas ou en créer de nouvelles, toute décision doit ensuite être prise par les admins'** + String get raffleModifTombola; - /// No description provided for @recommendationDeleteRecommendation. + /// No description provided for @raffleMustBePositive. /// /// In fr, this message translates to: - /// **'Suppresion'** - String get recommendationDeleteRecommendation; + /// **'Le nombre doit être strictement positif'** + String get raffleMustBePositive; - /// No description provided for @recommendationDeletingRecommendationError. + /// No description provided for @raffleName. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get recommendationDeletingRecommendationError; + /// **'Nom'** + String get raffleName; - /// No description provided for @recommendationDeletedRecommendation. + /// No description provided for @raffleNextRaffles. /// /// In fr, this message translates to: - /// **'Bon plan supprimé'** - String get recommendationDeletedRecommendation; + /// **'Prochaines tombolas'** + String get raffleNextRaffles; - /// No description provided for @recommendationIncorrectOrMissingFields. + /// No description provided for @raffleNoCurrentPrize. /// /// In fr, this message translates to: - /// **'Champs incorrects ou manquants'** - String get recommendationIncorrectOrMissingFields; + /// **'Il n\'y a aucun lots actuellement'** + String get raffleNoCurrentPrize; - /// No description provided for @recommendationEditingError. + /// No description provided for @raffleNoCurrentRaffle. /// /// In fr, this message translates to: - /// **'Échec de la modification'** - String get recommendationEditingError; + /// **'Il n\'y a aucune tombola en cours'** + String get raffleNoCurrentRaffle; - /// No description provided for @recommendationAddingError. + /// No description provided for @raffleNoDescription. /// /// In fr, this message translates to: - /// **'Échec de l\'ajout'** - String get recommendationAddingError; + /// **'Aucune description'** + String get raffleNoDescription; - /// No description provided for @recommendationCopiedCode. + /// No description provided for @raffleNoPrize. /// /// In fr, this message translates to: - /// **'Code de réduction copié'** - String get recommendationCopiedCode; + /// **'Aucun lot'** + String get raffleNoPrize; - /// No description provided for @seedLibraryAdd. + /// No description provided for @raffleNotEnoughMoney. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get seedLibraryAdd; + /// **'Vous n\'avez pas assez d\'argent'** + String get raffleNotEnoughMoney; - /// No description provided for @seedLibraryAddedPlant. + /// No description provided for @raffleNoTicket. /// /// In fr, this message translates to: - /// **'Plante ajoutée'** - String get seedLibraryAddedPlant; + /// **'Vous n\'avez pas de ticket'** + String get raffleNoTicket; - /// No description provided for @seedLibraryAddedSpecies. + /// No description provided for @raffleNoTicketBuyable. /// /// In fr, this message translates to: - /// **'Espèce ajoutée'** - String get seedLibraryAddedSpecies; + /// **'Vous ne pouvez pas achetez de billets pour l\'instant'** + String get raffleNoTicketBuyable; - /// No description provided for @seedLibraryAddingError. + /// No description provided for @raffleNoWinningTicketYet. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get seedLibraryAddingError; + /// **'Les tickets gagnants seront affichés ici'** + String get raffleNoWinningTicketYet; - /// No description provided for @seedLibraryAddPlant. + /// No description provided for @raffleNumberExpected. /// /// In fr, this message translates to: - /// **'Déposer une plante'** - String get seedLibraryAddPlant; + /// **'Un entier est attendu'** + String get raffleNumberExpected; - /// No description provided for @seedLibraryAddSpecies. + /// No description provided for @raffleOpen. /// /// In fr, this message translates to: - /// **'Ajouter une espèce'** - String get seedLibraryAddSpecies; + /// **'Ouvrir'** + String get raffleOpen; - /// No description provided for @seedLibraryAll. + /// No description provided for @raffleOpenRaffle. /// /// In fr, this message translates to: - /// **'Toutes'** - String get seedLibraryAll; + /// **'Ouvrir la tombola'** + String get raffleOpenRaffle; - /// No description provided for @seedLibraryAncestor. + /// No description provided for @raffleOpenRaffleDescription. /// /// In fr, this message translates to: - /// **'Ancêtre'** - String get seedLibraryAncestor; + /// **'Vous allez ouvrir la tombola, les utilisateurs pourront acheter des tickets. Vous ne pourrez plus modifier la tombola. Êtes-vous sûr de vouloir continuer ?'** + String get raffleOpenRaffleDescription; - /// No description provided for @seedLibraryAround. + /// No description provided for @rafflePastRaffles. /// /// In fr, this message translates to: - /// **'environ'** - String get seedLibraryAround; + /// **'Tombola passés'** + String get rafflePastRaffles; - /// No description provided for @seedLibraryAutumn. + /// No description provided for @rafflePossiblePrice. /// /// In fr, this message translates to: - /// **'Automne'** - String get seedLibraryAutumn; + /// **'Prix possible'** + String get rafflePossiblePrice; - /// No description provided for @seedLibraryBorrowedPlant. + /// No description provided for @rafflePrice. /// /// In fr, this message translates to: - /// **'Plante empruntée'** - String get seedLibraryBorrowedPlant; + /// **'Prix'** + String get rafflePrice; - /// No description provided for @seedLibraryBorrowingDate. + /// No description provided for @rafflePrize. /// /// In fr, this message translates to: - /// **'Date d\'emprunt :'** - String get seedLibraryBorrowingDate; + /// **'Lot'** + String get rafflePrize; - /// No description provided for @seedLibraryBorrowPlant. + /// No description provided for @rafflePrizes. /// /// In fr, this message translates to: - /// **'Emprunter la plante'** - String get seedLibraryBorrowPlant; + /// **'Lots'** + String get rafflePrizes; - /// No description provided for @seedLibraryCard. + /// No description provided for @raffleQuantity. /// /// In fr, this message translates to: - /// **'Carte'** - String get seedLibraryCard; + /// **'Quantité'** + String get raffleQuantity; - /// No description provided for @seedLibraryChoosingAncestor. + /// No description provided for @raffleRaffle. /// /// In fr, this message translates to: - /// **'Veuillez choisir un ancêtre'** - String get seedLibraryChoosingAncestor; + /// **'Tombola'** + String get raffleRaffle; - /// No description provided for @seedLibraryChoosingSpecies. + /// No description provided for @raffleSeeRaffleDetail. /// /// In fr, this message translates to: - /// **'Veuillez choisir une espèce'** - String get seedLibraryChoosingSpecies; + /// **'Voir lots/tickets'** + String get raffleSeeRaffleDetail; - /// No description provided for @seedLibraryChoosingSpeciesOrAncestor. + /// No description provided for @raffleTakeTickets. /// /// In fr, this message translates to: - /// **'Veuillez choisir une espèce ou un ancêtre'** - String get seedLibraryChoosingSpeciesOrAncestor; + /// **'Prendre vos tickets'** + String get raffleTakeTickets; + + /// No description provided for @raffleTicket. + /// + /// In fr, this message translates to: + /// **'ticket'** + String get raffleTicket; - /// No description provided for @seedLibraryContact. + /// No description provided for @raffleTicketNumber. /// /// In fr, this message translates to: - /// **'Contact :'** - String get seedLibraryContact; + /// **'Nombre de ticket'** + String get raffleTicketNumber; - /// No description provided for @seedLibraryDays. + /// No description provided for @raffleTickets. /// /// In fr, this message translates to: - /// **'jours'** - String get seedLibraryDays; + /// **'Tickets'** + String get raffleTickets; - /// No description provided for @seedLibraryDeadMsg. + /// No description provided for @raffleUnavailableRaffle. /// /// In fr, this message translates to: - /// **'Voulez-vous déclarer la plante morte ?'** - String get seedLibraryDeadMsg; + /// **'Tombola indisponible'** + String get raffleUnavailableRaffle; - /// No description provided for @seedLibraryDeadPlant. + /// No description provided for @raffleUpdatedAmount. /// /// In fr, this message translates to: - /// **'Plante morte'** - String get seedLibraryDeadPlant; + /// **'Montant mis à jour'** + String get raffleUpdatedAmount; - /// No description provided for @seedLibraryDeathDate. + /// No description provided for @raffleUpdatingError. /// /// In fr, this message translates to: - /// **'Date de mort'** - String get seedLibraryDeathDate; + /// **'Erreur lors de la mise à jour'** + String get raffleUpdatingError; - /// No description provided for @seedLibraryDeletedSpecies. + /// No description provided for @raffleWaiting. /// /// In fr, this message translates to: - /// **'Espèce supprimée'** - String get seedLibraryDeletedSpecies; + /// **'Chargement'** + String get raffleWaiting; - /// No description provided for @seedLibraryDeleteSpecies. + /// No description provided for @raffleWinnable. /// /// In fr, this message translates to: - /// **'Supprimer l\'espèce ?'** - String get seedLibraryDeleteSpecies; + /// **'gagnable'** + String get raffleWinnable; - /// No description provided for @seedLibraryDeleting. + /// No description provided for @raffleWinner. /// /// In fr, this message translates to: - /// **'Suppression'** - String get seedLibraryDeleting; + /// **'Gagnant'** + String get raffleWinner; - /// No description provided for @seedLibraryDeletingError. + /// No description provided for @raffleWinningTickets. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get seedLibraryDeletingError; + /// **'Tickets gagnants'** + String get raffleWinningTickets; - /// No description provided for @seedLibraryDepositNotAvailable. + /// No description provided for @raffleYourTickets. /// /// In fr, this message translates to: - /// **'Le dépôt de plantes n\'est pas possible sans emprunter une plante au préalable'** - String get seedLibraryDepositNotAvailable; + /// **'Tous vos tickets'** + String get raffleYourTickets; - /// No description provided for @seedLibraryDescription. + /// No description provided for @recommendationAdd. /// /// In fr, this message translates to: - /// **'Description'** - String get seedLibraryDescription; + /// **'Ajouter'** + String get recommendationAdd; - /// No description provided for @seedLibraryDifficulty. + /// No description provided for @recommendationAddedRecommendation. /// /// In fr, this message translates to: - /// **'Difficulté :'** - String get seedLibraryDifficulty; + /// **'Bon plan ajouté'** + String get recommendationAddedRecommendation; - /// No description provided for @seedLibraryEdit. + /// No description provided for @recommendationAddImage. /// /// In fr, this message translates to: - /// **'Modifier'** - String get seedLibraryEdit; + /// **'Veuillez ajouter une image'** + String get recommendationAddImage; - /// No description provided for @seedLibraryEditedPlant. + /// No description provided for @recommendationAddingError. /// /// In fr, this message translates to: - /// **'Plante modifiée'** - String get seedLibraryEditedPlant; + /// **'Échec de l\'ajout'** + String get recommendationAddingError; - /// No description provided for @seedLibraryEditInformation. + /// No description provided for @recommendationCode. /// /// In fr, this message translates to: - /// **'Modifier les informations'** - String get seedLibraryEditInformation; + /// **'Code'** + String get recommendationCode; - /// No description provided for @seedLibraryEditingError. + /// No description provided for @recommendationCopiedCode. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get seedLibraryEditingError; + /// **'Code de réduction copié'** + String get recommendationCopiedCode; - /// No description provided for @seedLibraryEditSpecies. + /// No description provided for @recommendationDelete. /// /// In fr, this message translates to: - /// **'Modifier l\'espèce'** - String get seedLibraryEditSpecies; + /// **'Supprimer'** + String get recommendationDelete; - /// No description provided for @seedLibraryEmptyDifficultyError. + /// No description provided for @recommendationDeletedRecommendation. /// /// In fr, this message translates to: - /// **'Veuillez choisir une difficulté'** - String get seedLibraryEmptyDifficultyError; + /// **'Bon plan supprimé'** + String get recommendationDeletedRecommendation; - /// No description provided for @seedLibraryEmptyFieldError. + /// No description provided for @recommendationDeleteRecommendation. /// /// In fr, this message translates to: - /// **'Veuillez remplir tous les champs'** - String get seedLibraryEmptyFieldError; + /// **'Suppresion'** + String get recommendationDeleteRecommendation; - /// No description provided for @seedLibraryEmptyTypeError. + /// No description provided for @recommendationDeleteRecommendationConfirmation. /// /// In fr, this message translates to: - /// **'Veuillez choisir un type de plante'** - String get seedLibraryEmptyTypeError; + /// **'Êtes-vous sûr de vouloir supprimer ce bon plan ?'** + String get recommendationDeleteRecommendationConfirmation; - /// No description provided for @seedLibraryEndMonth. + /// No description provided for @recommendationDeletingRecommendationError. /// /// In fr, this message translates to: - /// **'Mois de fin :'** - String get seedLibraryEndMonth; + /// **'Erreur lors de la suppression'** + String get recommendationDeletingRecommendationError; - /// No description provided for @seedLibraryFacebookUrl. + /// No description provided for @recommendationDescription. /// /// In fr, this message translates to: - /// **'Lien Facebook'** - String get seedLibraryFacebookUrl; + /// **'Description'** + String get recommendationDescription; - /// No description provided for @seedLibraryFilters. + /// No description provided for @recommendationEdit. /// /// In fr, this message translates to: - /// **'Filtres'** - String get seedLibraryFilters; + /// **'Modifier'** + String get recommendationEdit; - /// No description provided for @seedLibraryForum. + /// No description provided for @recommendationEditedRecommendation. /// /// In fr, this message translates to: - /// **'Oskour maman j\'ai tué ma plante - Forum d\'aide'** - String get seedLibraryForum; + /// **'Bon plan modifié'** + String get recommendationEditedRecommendation; - /// No description provided for @seedLibraryForumUrl. + /// No description provided for @recommendationEditingError. /// /// In fr, this message translates to: - /// **'Lien Forum'** - String get seedLibraryForumUrl; + /// **'Échec de la modification'** + String get recommendationEditingError; - /// No description provided for @seedLibraryHelpSheets. + /// No description provided for @recommendationIncorrectOrMissingFields. /// /// In fr, this message translates to: - /// **'Fiches sur les plantes'** - String get seedLibraryHelpSheets; + /// **'Champs incorrects ou manquants'** + String get recommendationIncorrectOrMissingFields; - /// No description provided for @seedLibraryInformation. + /// No description provided for @recommendationLogo. /// /// In fr, this message translates to: - /// **'Informations :'** - String get seedLibraryInformation; + /// **'Logo'** + String get recommendationLogo; - /// No description provided for @seedLibraryMaturationTime. + /// No description provided for @recommendationRecommendation. /// /// In fr, this message translates to: - /// **'Temps de maturation'** - String get seedLibraryMaturationTime; + /// **'Bons plans'** + String get recommendationRecommendation; - /// No description provided for @seedLibraryMonthJan. + /// No description provided for @recommendationSummary. /// /// In fr, this message translates to: - /// **'Janvier'** - String get seedLibraryMonthJan; + /// **'Court résumé'** + String get recommendationSummary; - /// No description provided for @seedLibraryMonthFeb. + /// No description provided for @recommendationTitle. /// /// In fr, this message translates to: - /// **'Février'** - String get seedLibraryMonthFeb; + /// **'Titre'** + String get recommendationTitle; - /// No description provided for @seedLibraryMonthMar. + /// No description provided for @seedLibraryAdd. /// /// In fr, this message translates to: - /// **'Mars'** - String get seedLibraryMonthMar; + /// **'Ajouter'** + String get seedLibraryAdd; - /// No description provided for @seedLibraryMonthApr. + /// No description provided for @seedLibraryAddedPlant. /// /// In fr, this message translates to: - /// **'Avril'** - String get seedLibraryMonthApr; + /// **'Plante ajoutée'** + String get seedLibraryAddedPlant; - /// No description provided for @seedLibraryMonthMay. + /// No description provided for @seedLibraryAddedSpecies. /// /// In fr, this message translates to: - /// **'Mai'** - String get seedLibraryMonthMay; + /// **'Espèce ajoutée'** + String get seedLibraryAddedSpecies; - /// No description provided for @seedLibraryMonthJun. + /// No description provided for @seedLibraryAddingError. /// /// In fr, this message translates to: - /// **'Juin'** - String get seedLibraryMonthJun; + /// **'Erreur lors de l\'ajout'** + String get seedLibraryAddingError; - /// No description provided for @seedLibraryMonthJul. + /// No description provided for @seedLibraryAddPlant. /// /// In fr, this message translates to: - /// **'Juillet'** - String get seedLibraryMonthJul; + /// **'Déposer une plante'** + String get seedLibraryAddPlant; - /// No description provided for @seedLibraryMonthAug. + /// No description provided for @seedLibraryAddSpecies. /// /// In fr, this message translates to: - /// **'Août'** - String get seedLibraryMonthAug; + /// **'Ajouter une espèce'** + String get seedLibraryAddSpecies; - /// No description provided for @seedLibraryMonthSep. + /// No description provided for @seedLibraryAll. /// /// In fr, this message translates to: - /// **'Septembre'** - String get seedLibraryMonthSep; + /// **'Toutes'** + String get seedLibraryAll; - /// No description provided for @seedLibraryMonthOct. + /// No description provided for @seedLibraryAncestor. /// /// In fr, this message translates to: - /// **'Octobre'** - String get seedLibraryMonthOct; + /// **'Ancêtre'** + String get seedLibraryAncestor; - /// No description provided for @seedLibraryMonthNov. + /// No description provided for @seedLibraryAround. /// /// In fr, this message translates to: - /// **'Novembre'** - String get seedLibraryMonthNov; + /// **'environ'** + String get seedLibraryAround; - /// No description provided for @seedLibraryMonthDec. + /// No description provided for @seedLibraryAutumn. /// /// In fr, this message translates to: - /// **'Décembre'** - String get seedLibraryMonthDec; + /// **'Automne'** + String get seedLibraryAutumn; - /// No description provided for @seedLibraryMyPlants. + /// No description provided for @seedLibraryBorrowedPlant. /// /// In fr, this message translates to: - /// **'Mes plantes'** - String get seedLibraryMyPlants; + /// **'Plante empruntée'** + String get seedLibraryBorrowedPlant; - /// No description provided for @seedLibraryName. + /// No description provided for @seedLibraryBorrowingDate. /// /// In fr, this message translates to: - /// **'Nom'** - String get seedLibraryName; + /// **'Date d\'emprunt :'** + String get seedLibraryBorrowingDate; - /// No description provided for @seedLibraryNbSeedsRecommended. + /// No description provided for @seedLibraryBorrowPlant. /// /// In fr, this message translates to: - /// **'Nombre de graines recommandées'** - String get seedLibraryNbSeedsRecommended; + /// **'Emprunter la plante'** + String get seedLibraryBorrowPlant; - /// No description provided for @seedLibraryNbSeedsRecommendedError. + /// No description provided for @seedLibraryCard. /// /// In fr, this message translates to: - /// **'Veuillez entrer un nombre de graines recommandé supérieur à 0'** - String get seedLibraryNbSeedsRecommendedError; + /// **'Carte'** + String get seedLibraryCard; - /// No description provided for @seedLibraryNoDateError. + /// No description provided for @seedLibraryChoosingAncestor. /// /// In fr, this message translates to: - /// **'Veuillez entrer une date'** - String get seedLibraryNoDateError; + /// **'Veuillez choisir un ancêtre'** + String get seedLibraryChoosingAncestor; - /// No description provided for @seedLibraryNoFilteredPlants. + /// No description provided for @seedLibraryChoosingSpecies. /// /// In fr, this message translates to: - /// **'Aucune plante ne correspond à votre recherche. Essayez d\'autres filtres.'** - String get seedLibraryNoFilteredPlants; + /// **'Veuillez choisir une espèce'** + String get seedLibraryChoosingSpecies; - /// No description provided for @seedLibraryNoMorePlant. + /// No description provided for @seedLibraryChoosingSpeciesOrAncestor. /// /// In fr, this message translates to: - /// **'Aucune plante n\'est disponible'** - String get seedLibraryNoMorePlant; + /// **'Veuillez choisir une espèce ou un ancêtre'** + String get seedLibraryChoosingSpeciesOrAncestor; - /// No description provided for @seedLibraryNoPersonalPlants. + /// No description provided for @seedLibraryContact. /// /// In fr, this message translates to: - /// **'Vous n\'avez pas encore de plantes dans votre grainothèque. Vous pouvez en ajouter en allant dans les stocks.'** - String get seedLibraryNoPersonalPlants; + /// **'Contact :'** + String get seedLibraryContact; - /// No description provided for @seedLibraryNoSpecies. + /// No description provided for @seedLibraryDays. /// /// In fr, this message translates to: - /// **'Aucune espèce trouvée'** - String get seedLibraryNoSpecies; + /// **'jours'** + String get seedLibraryDays; - /// No description provided for @seedLibraryNoStockPlants. + /// No description provided for @seedLibraryDeadMsg. /// /// In fr, this message translates to: - /// **'Aucune plante disponible dans le stock'** - String get seedLibraryNoStockPlants; + /// **'Voulez-vous déclarer la plante morte ?'** + String get seedLibraryDeadMsg; - /// No description provided for @seedLibraryNotes. + /// No description provided for @seedLibraryDeadPlant. /// /// In fr, this message translates to: - /// **'Notes'** - String get seedLibraryNotes; + /// **'Plante morte'** + String get seedLibraryDeadPlant; - /// No description provided for @seedLibraryOk. + /// No description provided for @seedLibraryDeathDate. /// /// In fr, this message translates to: - /// **'OK'** - String get seedLibraryOk; + /// **'Date de mort'** + String get seedLibraryDeathDate; - /// No description provided for @seedLibraryPlantationPeriod. + /// No description provided for @seedLibraryDeletedSpecies. /// /// In fr, this message translates to: - /// **'Période de plantation :'** - String get seedLibraryPlantationPeriod; + /// **'Espèce supprimée'** + String get seedLibraryDeletedSpecies; - /// No description provided for @seedLibraryPlantationType. + /// No description provided for @seedLibraryDeleteSpecies. /// /// In fr, this message translates to: - /// **'Type de plantation :'** - String get seedLibraryPlantationType; + /// **'Supprimer l\'espèce ?'** + String get seedLibraryDeleteSpecies; - /// No description provided for @seedLibraryPlantDetail. + /// No description provided for @seedLibraryDeleting. /// /// In fr, this message translates to: - /// **'Détail de la plante'** - String get seedLibraryPlantDetail; + /// **'Suppression'** + String get seedLibraryDeleting; - /// No description provided for @seedLibraryPlantingDate. + /// No description provided for @seedLibraryDeletingError. /// /// In fr, this message translates to: - /// **'Date de plantation'** - String get seedLibraryPlantingDate; + /// **'Erreur lors de la suppression'** + String get seedLibraryDeletingError; - /// No description provided for @seedLibraryPlantingNow. + /// No description provided for @seedLibraryDepositNotAvailable. /// /// In fr, this message translates to: - /// **'Je la plante maintenant'** - String get seedLibraryPlantingNow; + /// **'Le dépôt de plantes n\'est pas possible sans emprunter une plante au préalable'** + String get seedLibraryDepositNotAvailable; - /// No description provided for @seedLibraryPrefix. + /// No description provided for @seedLibraryDescription. /// /// In fr, this message translates to: - /// **'Préfixe'** - String get seedLibraryPrefix; + /// **'Description'** + String get seedLibraryDescription; - /// No description provided for @seedLibraryPrefixError. + /// No description provided for @seedLibraryDifficulty. /// /// In fr, this message translates to: - /// **'Prefixe déjà utilisé'** - String get seedLibraryPrefixError; + /// **'Difficulté :'** + String get seedLibraryDifficulty; - /// No description provided for @seedLibraryPrefixLengthError. + /// No description provided for @seedLibraryEdit. /// /// In fr, this message translates to: - /// **'Le préfixe doit faire 3 caractères'** - String get seedLibraryPrefixLengthError; + /// **'Modifier'** + String get seedLibraryEdit; - /// No description provided for @seedLibraryPropagationMethod. + /// No description provided for @seedLibraryEditedPlant. /// /// In fr, this message translates to: - /// **'Méthode de propagation :'** - String get seedLibraryPropagationMethod; + /// **'Plante modifiée'** + String get seedLibraryEditedPlant; - /// No description provided for @seedLibraryReference. + /// No description provided for @seedLibraryEditInformation. /// /// In fr, this message translates to: - /// **'Référence :'** - String get seedLibraryReference; + /// **'Modifier les informations'** + String get seedLibraryEditInformation; - /// No description provided for @seedLibraryRemovedPlant. + /// No description provided for @seedLibraryEditingError. /// /// In fr, this message translates to: - /// **'Plante supprimée'** - String get seedLibraryRemovedPlant; + /// **'Erreur lors de la modification'** + String get seedLibraryEditingError; - /// No description provided for @seedLibraryRemovingError. + /// No description provided for @seedLibraryEditSpecies. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get seedLibraryRemovingError; + /// **'Modifier l\'espèce'** + String get seedLibraryEditSpecies; - /// No description provided for @seedLibraryResearch. + /// No description provided for @seedLibraryEmptyDifficultyError. /// /// In fr, this message translates to: - /// **'Recherche'** - String get seedLibraryResearch; + /// **'Veuillez choisir une difficulté'** + String get seedLibraryEmptyDifficultyError; - /// No description provided for @seedLibrarySaveChanges. + /// No description provided for @seedLibraryEmptyFieldError. /// /// In fr, this message translates to: - /// **'Sauvegarder les modifications'** - String get seedLibrarySaveChanges; + /// **'Veuillez remplir tous les champs'** + String get seedLibraryEmptyFieldError; - /// No description provided for @seedLibrarySeason. + /// No description provided for @seedLibraryEmptyTypeError. /// /// In fr, this message translates to: - /// **'Saison :'** - String get seedLibrarySeason; + /// **'Veuillez choisir un type de plante'** + String get seedLibraryEmptyTypeError; - /// No description provided for @seedLibrarySeed. + /// No description provided for @seedLibraryEndMonth. /// /// In fr, this message translates to: - /// **'Graine'** - String get seedLibrarySeed; + /// **'Mois de fin :'** + String get seedLibraryEndMonth; - /// No description provided for @seedLibrarySeeds. + /// No description provided for @seedLibraryFacebookUrl. /// /// In fr, this message translates to: - /// **'graines'** - String get seedLibrarySeeds; + /// **'Lien Facebook'** + String get seedLibraryFacebookUrl; - /// No description provided for @seedLibrarySeedDeposit. + /// No description provided for @seedLibraryFilters. /// /// In fr, this message translates to: - /// **'Dépôt de plantes'** - String get seedLibrarySeedDeposit; + /// **'Filtres'** + String get seedLibraryFilters; - /// No description provided for @seedLibrarySeedLibrary. + /// No description provided for @seedLibraryForum. /// /// In fr, this message translates to: - /// **'Grainothèque'** - String get seedLibrarySeedLibrary; + /// **'Oskour maman j\'ai tué ma plante - Forum d\'aide'** + String get seedLibraryForum; - /// No description provided for @seedLibrarySeedQuantitySimple. + /// No description provided for @seedLibraryForumUrl. /// /// In fr, this message translates to: - /// **'Quantité de graines'** - String get seedLibrarySeedQuantitySimple; + /// **'Lien Forum'** + String get seedLibraryForumUrl; - /// No description provided for @seedLibrarySeedQuantity. + /// No description provided for @seedLibraryHelpSheets. /// /// In fr, this message translates to: - /// **'Quantité de graines :'** - String get seedLibrarySeedQuantity; + /// **'Fiches sur les plantes'** + String get seedLibraryHelpSheets; - /// No description provided for @seedLibraryShowDeadPlants. + /// No description provided for @seedLibraryInformation. /// /// In fr, this message translates to: - /// **'Afficher les plantes mortes'** - String get seedLibraryShowDeadPlants; + /// **'Informations :'** + String get seedLibraryInformation; - /// No description provided for @seedLibrarySpecies. + /// No description provided for @seedLibraryMaturationTime. /// /// In fr, this message translates to: - /// **'Espèce :'** - String get seedLibrarySpecies; + /// **'Temps de maturation'** + String get seedLibraryMaturationTime; - /// No description provided for @seedLibrarySpeciesHelp. + /// No description provided for @seedLibraryMonthApr. /// /// In fr, this message translates to: - /// **'Aide sur l\'espèce'** - String get seedLibrarySpeciesHelp; + /// **'Avril'** + String get seedLibraryMonthApr; - /// No description provided for @seedLibrarySpeciesPlural. + /// No description provided for @seedLibraryMonthAug. /// /// In fr, this message translates to: - /// **'Espèces'** - String get seedLibrarySpeciesPlural; + /// **'Août'** + String get seedLibraryMonthAug; - /// No description provided for @seedLibrarySpeciesSimple. + /// No description provided for @seedLibraryMonthDec. /// /// In fr, this message translates to: - /// **'Espèce'** - String get seedLibrarySpeciesSimple; + /// **'Décembre'** + String get seedLibraryMonthDec; - /// No description provided for @seedLibrarySpeciesType. + /// No description provided for @seedLibraryMonthFeb. /// /// In fr, this message translates to: - /// **'Type d\'espèce :'** - String get seedLibrarySpeciesType; + /// **'Février'** + String get seedLibraryMonthFeb; - /// No description provided for @seedLibrarySpring. + /// No description provided for @seedLibraryMonthJan. /// /// In fr, this message translates to: - /// **'Printemps'** - String get seedLibrarySpring; + /// **'Janvier'** + String get seedLibraryMonthJan; - /// No description provided for @seedLibraryStartMonth. + /// No description provided for @seedLibraryMonthJul. /// /// In fr, this message translates to: - /// **'Mois de début :'** - String get seedLibraryStartMonth; + /// **'Juillet'** + String get seedLibraryMonthJul; - /// No description provided for @seedLibraryStock. + /// No description provided for @seedLibraryMonthJun. /// /// In fr, this message translates to: - /// **'Stock disponible'** - String get seedLibraryStock; + /// **'Juin'** + String get seedLibraryMonthJun; - /// No description provided for @seedLibrarySummer. + /// No description provided for @seedLibraryMonthMar. /// /// In fr, this message translates to: - /// **'Été'** - String get seedLibrarySummer; + /// **'Mars'** + String get seedLibraryMonthMar; - /// No description provided for @seedLibraryStocks. + /// No description provided for @seedLibraryMonthMay. /// /// In fr, this message translates to: - /// **'Stocks'** - String get seedLibraryStocks; + /// **'Mai'** + String get seedLibraryMonthMay; - /// No description provided for @seedLibraryTimeUntilMaturation. + /// No description provided for @seedLibraryMonthNov. /// - /// In fr, this message translates to: - /// **'Temps avant maturation :'** - String get seedLibraryTimeUntilMaturation; + /// In fr, this message translates to: + /// **'Novembre'** + String get seedLibraryMonthNov; - /// No description provided for @seedLibraryType. + /// No description provided for @seedLibraryMonthOct. /// /// In fr, this message translates to: - /// **'Type :'** - String get seedLibraryType; + /// **'Octobre'** + String get seedLibraryMonthOct; - /// No description provided for @seedLibraryUnableToOpen. + /// No description provided for @seedLibraryMonthSep. /// /// In fr, this message translates to: - /// **'Impossible d\'ouvrir le lien'** - String get seedLibraryUnableToOpen; + /// **'Septembre'** + String get seedLibraryMonthSep; - /// No description provided for @seedLibraryUpdate. + /// No description provided for @seedLibraryMyPlants. /// /// In fr, this message translates to: - /// **'Modifier'** - String get seedLibraryUpdate; + /// **'Mes plantes'** + String get seedLibraryMyPlants; - /// No description provided for @seedLibraryUpdatedInformation. + /// No description provided for @seedLibraryName. /// /// In fr, this message translates to: - /// **'Informations modifiées'** - String get seedLibraryUpdatedInformation; + /// **'Nom'** + String get seedLibraryName; - /// No description provided for @seedLibraryUpdatedSpecies. + /// No description provided for @seedLibraryNbSeedsRecommended. /// /// In fr, this message translates to: - /// **'Espèce modifiée'** - String get seedLibraryUpdatedSpecies; + /// **'Nombre de graines recommandées'** + String get seedLibraryNbSeedsRecommended; - /// No description provided for @seedLibraryUpdatedPlant. + /// No description provided for @seedLibraryNbSeedsRecommendedError. /// /// In fr, this message translates to: - /// **'Plante modifiée'** - String get seedLibraryUpdatedPlant; + /// **'Veuillez entrer un nombre de graines recommandé supérieur à 0'** + String get seedLibraryNbSeedsRecommendedError; - /// No description provided for @seedLibraryUpdatingError. + /// No description provided for @seedLibraryNoDateError. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get seedLibraryUpdatingError; + /// **'Veuillez entrer une date'** + String get seedLibraryNoDateError; - /// No description provided for @seedLibraryWinter. + /// No description provided for @seedLibraryNoFilteredPlants. /// /// In fr, this message translates to: - /// **'Hiver'** - String get seedLibraryWinter; + /// **'Aucune plante ne correspond à votre recherche. Essayez d\'autres filtres.'** + String get seedLibraryNoFilteredPlants; - /// No description provided for @seedLibraryWriteReference. + /// No description provided for @seedLibraryNoMorePlant. /// /// In fr, this message translates to: - /// **'Veuillez écrire la référence suivante : '** - String get seedLibraryWriteReference; + /// **'Aucune plante n\'est disponible'** + String get seedLibraryNoMorePlant; - /// No description provided for @settingsAccount. + /// No description provided for @seedLibraryNoPersonalPlants. /// /// In fr, this message translates to: - /// **'Compte'** - String get settingsAccount; + /// **'Vous n\'avez pas encore de plantes dans votre grainothèque. Vous pouvez en ajouter en allant dans les stocks.'** + String get seedLibraryNoPersonalPlants; - /// No description provided for @settingsAddProfilePicture. + /// No description provided for @seedLibraryNoSpecies. /// /// In fr, this message translates to: - /// **'Ajouter une photo'** - String get settingsAddProfilePicture; + /// **'Aucune espèce trouvée'** + String get seedLibraryNoSpecies; - /// No description provided for @settingsAdmin. + /// No description provided for @seedLibraryNoStockPlants. /// /// In fr, this message translates to: - /// **'Administrateur'** - String get settingsAdmin; + /// **'Aucune plante disponible dans le stock'** + String get seedLibraryNoStockPlants; - /// No description provided for @settingsAskHelp. + /// No description provided for @seedLibraryNotes. /// /// In fr, this message translates to: - /// **'Demander de l\'aide'** - String get settingsAskHelp; + /// **'Notes'** + String get seedLibraryNotes; - /// No description provided for @settingsAssociation. + /// No description provided for @seedLibraryOk. /// /// In fr, this message translates to: - /// **'Association'** - String get settingsAssociation; + /// **'OK'** + String get seedLibraryOk; - /// No description provided for @settingsBirthday. + /// No description provided for @seedLibraryPlantationPeriod. /// /// In fr, this message translates to: - /// **'Date de naissance'** - String get settingsBirthday; + /// **'Période de plantation :'** + String get seedLibraryPlantationPeriod; - /// No description provided for @settingsBugs. + /// No description provided for @seedLibraryPlantationType. /// /// In fr, this message translates to: - /// **'Bugs'** - String get settingsBugs; + /// **'Type de plantation :'** + String get seedLibraryPlantationType; - /// No description provided for @settingsChangePassword. + /// No description provided for @seedLibraryPlantDetail. /// /// In fr, this message translates to: - /// **'Changer de mot de passe'** - String get settingsChangePassword; + /// **'Détail de la plante'** + String get seedLibraryPlantDetail; - /// No description provided for @settingsChangingPassword. + /// No description provided for @seedLibraryPlantingDate. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment changer votre mot de passe ?'** - String get settingsChangingPassword; + /// **'Date de plantation'** + String get seedLibraryPlantingDate; - /// No description provided for @settingsConfirmPassword. + /// No description provided for @seedLibraryPlantingNow. /// /// In fr, this message translates to: - /// **'Confirmer le mot de passe'** - String get settingsConfirmPassword; + /// **'Je la plante maintenant'** + String get seedLibraryPlantingNow; - /// No description provided for @settingsCopied. + /// No description provided for @seedLibraryPrefix. /// /// In fr, this message translates to: - /// **'Copié !'** - String get settingsCopied; + /// **'Préfixe'** + String get seedLibraryPrefix; - /// No description provided for @settingsDarkMode. + /// No description provided for @seedLibraryPrefixError. /// /// In fr, this message translates to: - /// **'Mode sombre'** - String get settingsDarkMode; + /// **'Prefixe déjà utilisé'** + String get seedLibraryPrefixError; - /// No description provided for @settingsDarkModeOff. + /// No description provided for @seedLibraryPrefixLengthError. /// /// In fr, this message translates to: - /// **'Désactivé'** - String get settingsDarkModeOff; + /// **'Le préfixe doit faire 3 caractères'** + String get seedLibraryPrefixLengthError; - /// No description provided for @settingsDeleteLogs. + /// No description provided for @seedLibraryPropagationMethod. /// /// In fr, this message translates to: - /// **'Supprimer les logs ?'** - String get settingsDeleteLogs; + /// **'Méthode de propagation :'** + String get seedLibraryPropagationMethod; - /// No description provided for @settingsDeleteNotificationLogs. + /// No description provided for @seedLibraryReference. /// /// In fr, this message translates to: - /// **'Supprimer les logs des notifications ?'** - String get settingsDeleteNotificationLogs; + /// **'Référence :'** + String get seedLibraryReference; - /// No description provided for @settingsDetelePersonalData. + /// No description provided for @seedLibraryRemovedPlant. /// /// In fr, this message translates to: - /// **'Supprimer mes données personnelles'** - String get settingsDetelePersonalData; + /// **'Plante supprimée'** + String get seedLibraryRemovedPlant; - /// No description provided for @settingsDetelePersonalDataDesc. + /// No description provided for @seedLibraryRemovingError. /// /// In fr, this message translates to: - /// **'Cette action notifie l\'administrateur que vous souhaitez supprimer vos données personnelles.'** - String get settingsDetelePersonalDataDesc; + /// **'Erreur lors de la suppression'** + String get seedLibraryRemovingError; - /// No description provided for @settingsDeleting. + /// No description provided for @seedLibraryResearch. /// /// In fr, this message translates to: - /// **'Suppresion'** - String get settingsDeleting; + /// **'Recherche'** + String get seedLibraryResearch; - /// No description provided for @settingsEdit. + /// No description provided for @seedLibrarySaveChanges. /// /// In fr, this message translates to: - /// **'Modifier'** - String get settingsEdit; + /// **'Sauvegarder les modifications'** + String get seedLibrarySaveChanges; - /// No description provided for @settingsEditAccount. + /// No description provided for @seedLibrarySeason. /// /// In fr, this message translates to: - /// **'Modifier mon profil'** - String get settingsEditAccount; + /// **'Saison :'** + String get seedLibrarySeason; - /// No description provided for @settingsEmail. + /// No description provided for @seedLibrarySeed. /// /// In fr, this message translates to: - /// **'Email'** - String get settingsEmail; + /// **'Graine'** + String get seedLibrarySeed; - /// No description provided for @settingsEmptyField. + /// No description provided for @seedLibrarySeedDeposit. /// /// In fr, this message translates to: - /// **'Ce champ ne peut pas être vide'** - String get settingsEmptyField; + /// **'Dépôt de plantes'** + String get seedLibrarySeedDeposit; - /// No description provided for @settingsErrorProfilePicture. + /// No description provided for @seedLibrarySeedLibrary. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification de la photo de profil'** - String get settingsErrorProfilePicture; + /// **'Grainothèque'** + String get seedLibrarySeedLibrary; - /// No description provided for @settingsErrorSendingDemand. + /// No description provided for @seedLibrarySeedQuantity. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'envoi de la demande'** - String get settingsErrorSendingDemand; + /// **'Quantité de graines :'** + String get seedLibrarySeedQuantity; - /// No description provided for @settingsEventsIcal. + /// No description provided for @seedLibrarySeedQuantitySimple. /// /// In fr, this message translates to: - /// **'Lien Ical des événements'** - String get settingsEventsIcal; + /// **'Quantité de graines'** + String get seedLibrarySeedQuantitySimple; - /// No description provided for @settingsExpectingDate. + /// No description provided for @seedLibrarySeeds. /// /// In fr, this message translates to: - /// **'Date de naissance attendue'** - String get settingsExpectingDate; + /// **'graines'** + String get seedLibrarySeeds; - /// No description provided for @settingsFirstname. + /// No description provided for @seedLibraryShowDeadPlants. /// /// In fr, this message translates to: - /// **'Prénom'** - String get settingsFirstname; + /// **'Afficher les plantes mortes'** + String get seedLibraryShowDeadPlants; - /// No description provided for @settingsFloor. + /// No description provided for @seedLibrarySpecies. /// /// In fr, this message translates to: - /// **'Étage'** - String get settingsFloor; + /// **'Espèce :'** + String get seedLibrarySpecies; - /// No description provided for @settingsHelp. + /// No description provided for @seedLibrarySpeciesHelp. /// /// In fr, this message translates to: - /// **'Aide'** - String get settingsHelp; + /// **'Aide sur l\'espèce'** + String get seedLibrarySpeciesHelp; - /// No description provided for @settingsIcalCopied. + /// No description provided for @seedLibrarySpeciesPlural. /// /// In fr, this message translates to: - /// **'Lien Ical copié !'** - String get settingsIcalCopied; + /// **'Espèces'** + String get seedLibrarySpeciesPlural; - /// No description provided for @settingsLanguage. + /// No description provided for @seedLibrarySpeciesSimple. /// /// In fr, this message translates to: - /// **'Langue'** - String get settingsLanguage; + /// **'Espèce'** + String get seedLibrarySpeciesSimple; - /// No description provided for @settingsLanguageVar. + /// No description provided for @seedLibrarySpeciesType. /// /// In fr, this message translates to: - /// **'Français 🇫🇷'** - String get settingsLanguageVar; + /// **'Type d\'espèce :'** + String get seedLibrarySpeciesType; - /// No description provided for @settingsLogs. + /// No description provided for @seedLibrarySpring. /// /// In fr, this message translates to: - /// **'Logs'** - String get settingsLogs; + /// **'Printemps'** + String get seedLibrarySpring; - /// No description provided for @settingsModules. + /// No description provided for @seedLibraryStartMonth. /// /// In fr, this message translates to: - /// **'Modules'** - String get settingsModules; + /// **'Mois de début :'** + String get seedLibraryStartMonth; - /// No description provided for @settingsMyIcs. + /// No description provided for @seedLibraryStock. /// /// In fr, this message translates to: - /// **'Mon lien Ical'** - String get settingsMyIcs; + /// **'Stock disponible'** + String get seedLibraryStock; - /// No description provided for @settingsName. + /// No description provided for @seedLibraryStocks. /// /// In fr, this message translates to: - /// **'Nom'** - String get settingsName; + /// **'Stocks'** + String get seedLibraryStocks; - /// No description provided for @settingsNewPassword. + /// No description provided for @seedLibrarySummer. /// /// In fr, this message translates to: - /// **'Nouveau mot de passe'** - String get settingsNewPassword; + /// **'Été'** + String get seedLibrarySummer; - /// No description provided for @settingsNickname. + /// No description provided for @seedLibraryTimeUntilMaturation. /// /// In fr, this message translates to: - /// **'Surnom'** - String get settingsNickname; + /// **'Temps avant maturation :'** + String get seedLibraryTimeUntilMaturation; - /// No description provided for @settingsNotifications. + /// No description provided for @seedLibraryType. /// /// In fr, this message translates to: - /// **'Notifications'** - String get settingsNotifications; + /// **'Type :'** + String get seedLibraryType; - /// No description provided for @settingsOldPassword. + /// No description provided for @seedLibraryUnableToOpen. /// /// In fr, this message translates to: - /// **'Ancien mot de passe'** - String get settingsOldPassword; + /// **'Impossible d\'ouvrir le lien'** + String get seedLibraryUnableToOpen; - /// No description provided for @settingsPasswordChanged. + /// No description provided for @seedLibraryUpdate. /// /// In fr, this message translates to: - /// **'Mot de passe changé'** - String get settingsPasswordChanged; + /// **'Modifier'** + String get seedLibraryUpdate; - /// No description provided for @settingsPasswordsNotMatch. + /// No description provided for @seedLibraryUpdatedInformation. /// /// In fr, this message translates to: - /// **'Les mots de passe ne correspondent pas'** - String get settingsPasswordsNotMatch; + /// **'Informations modifiées'** + String get seedLibraryUpdatedInformation; - /// No description provided for @settingsPersonalData. + /// No description provided for @seedLibraryUpdatedPlant. /// /// In fr, this message translates to: - /// **'Données personnelles'** - String get settingsPersonalData; + /// **'Plante modifiée'** + String get seedLibraryUpdatedPlant; - /// No description provided for @settingsPersonalisation. + /// No description provided for @seedLibraryUpdatedSpecies. /// /// In fr, this message translates to: - /// **'Personnalisation'** - String get settingsPersonalisation; + /// **'Espèce modifiée'** + String get seedLibraryUpdatedSpecies; - /// No description provided for @settingsPhone. + /// No description provided for @seedLibraryUpdatingError. /// /// In fr, this message translates to: - /// **'Téléphone'** - String get settingsPhone; + /// **'Erreur lors de la modification'** + String get seedLibraryUpdatingError; - /// No description provided for @settingsProfilePicture. + /// No description provided for @seedLibraryWinter. /// /// In fr, this message translates to: - /// **'Photo de profil'** - String get settingsProfilePicture; + /// **'Hiver'** + String get seedLibraryWinter; - /// No description provided for @settingsPromo. + /// No description provided for @seedLibraryWriteReference. /// /// In fr, this message translates to: - /// **'Promotion'** - String get settingsPromo; + /// **'Veuillez écrire la référence suivante : '** + String get seedLibraryWriteReference; - /// No description provided for @settingsRepportBug. + /// No description provided for @settingsAccount. /// /// In fr, this message translates to: - /// **'Signaler un bug'** - String get settingsRepportBug; + /// **'Compte'** + String get settingsAccount; - /// No description provided for @settingsSave. + /// No description provided for @settingsAddProfilePicture. /// /// In fr, this message translates to: - /// **'Enregistrer'** - String get settingsSave; + /// **'Ajouter une photo'** + String get settingsAddProfilePicture; - /// No description provided for @settingsSecurity. + /// No description provided for @settingsAdmin. /// /// In fr, this message translates to: - /// **'Sécurité'** - String get settingsSecurity; + /// **'Administrateur'** + String get settingsAdmin; - /// No description provided for @settingsSendedDemand. + /// No description provided for @settingsAskHelp. /// /// In fr, this message translates to: - /// **'Demande envoyée'** - String get settingsSendedDemand; + /// **'Demander de l\'aide'** + String get settingsAskHelp; - /// No description provided for @settingsSettings. + /// No description provided for @settingsAssociation. /// /// In fr, this message translates to: - /// **'Paramètres'** - String get settingsSettings; + /// **'Association'** + String get settingsAssociation; - /// No description provided for @settingsTooHeavyProfilePicture. + /// No description provided for @settingsBirthday. /// /// In fr, this message translates to: - /// **'L\'image est trop lourde (max 4Mo)'** - String get settingsTooHeavyProfilePicture; + /// **'Date de naissance'** + String get settingsBirthday; - /// No description provided for @settingsUpdatedProfile. + /// No description provided for @settingsBugs. /// /// In fr, this message translates to: - /// **'Profil modifié'** - String get settingsUpdatedProfile; + /// **'Bugs'** + String get settingsBugs; - /// No description provided for @settingsUpdatedProfilePicture. + /// No description provided for @settingsChangePassword. /// /// In fr, this message translates to: - /// **'Photo de profil modifiée'** - String get settingsUpdatedProfilePicture; + /// **'Changer de mot de passe'** + String get settingsChangePassword; - /// No description provided for @settingsUpdateNotification. + /// No description provided for @settingsChangingPassword. /// /// In fr, this message translates to: - /// **'Mettre à jour les notifications'** - String get settingsUpdateNotification; + /// **'Voulez-vous vraiment changer votre mot de passe ?'** + String get settingsChangingPassword; - /// No description provided for @settingsUpdatingError. + /// No description provided for @settingsChooseLanguage. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification du profil'** - String get settingsUpdatingError; + /// **'Choix de la langue'** + String get settingsChooseLanguage; - /// No description provided for @settingsVersion. + /// No description provided for @settingsConfirmPassword. /// /// In fr, this message translates to: - /// **'Version'** - String get settingsVersion; + /// **'Confirmer le mot de passe'** + String get settingsConfirmPassword; - /// No description provided for @settingsPasswordStrength. + /// No description provided for @settingsConnexion. /// /// In fr, this message translates to: - /// **'Force du mot de passe'** - String get settingsPasswordStrength; + /// **'Connexion'** + String get settingsConnexion; - /// No description provided for @settingsPasswordStrengthVeryWeak. + /// No description provided for @settingsCopied. /// /// In fr, this message translates to: - /// **'Très faible'** - String get settingsPasswordStrengthVeryWeak; + /// **'Copié !'** + String get settingsCopied; - /// No description provided for @settingsPasswordStrengthWeak. + /// No description provided for @settingsDarkMode. /// /// In fr, this message translates to: - /// **'Faible'** - String get settingsPasswordStrengthWeak; + /// **'Mode sombre'** + String get settingsDarkMode; - /// No description provided for @settingsPasswordStrengthMedium. + /// No description provided for @settingsDarkModeOff. /// /// In fr, this message translates to: - /// **'Moyen'** - String get settingsPasswordStrengthMedium; + /// **'Désactivé'** + String get settingsDarkModeOff; - /// No description provided for @settingsPasswordStrengthStrong. + /// No description provided for @settingsDeleteLogs. /// /// In fr, this message translates to: - /// **'Fort'** - String get settingsPasswordStrengthStrong; + /// **'Supprimer les logs ?'** + String get settingsDeleteLogs; - /// No description provided for @settingsPasswordStrengthVeryStrong. + /// No description provided for @settingsDeleteMyAccount. /// /// In fr, this message translates to: - /// **'Très fort'** - String get settingsPasswordStrengthVeryStrong; + /// **'Supprimer mon compte'** + String get settingsDeleteMyAccount; - /// No description provided for @settingsPhoneNumber. + /// No description provided for @settingsDeleteMyAccountDescription. /// /// In fr, this message translates to: - /// **'Numéro de téléphone'** - String get settingsPhoneNumber; + /// **'Cette action notifie l\'administrateur que vous souhaitez supprimer votre compte.'** + String get settingsDeleteMyAccountDescription; - /// No description provided for @settingsValidate. + /// No description provided for @settingsDeleteMyAccountError. /// /// In fr, this message translates to: - /// **'Valider'** - String get settingsValidate; + /// **'Erreur lors de la demande de suppression de compte'** + String get settingsDeleteMyAccountError; - /// No description provided for @settingsEditedAccount. + /// No description provided for @settingsDeleteNotificationLogs. /// /// In fr, this message translates to: - /// **'Compte modifié avec succès'** - String get settingsEditedAccount; + /// **'Supprimer les logs des notifications ?'** + String get settingsDeleteNotificationLogs; - /// No description provided for @settingsFailedToEditAccount. + /// No description provided for @settingsDeleting. /// /// In fr, this message translates to: - /// **'Échec de la modification du compte'** - String get settingsFailedToEditAccount; + /// **'Suppresion'** + String get settingsDeleting; - /// No description provided for @settingsChooseLanguage. + /// No description provided for @settingsDeletionAsked. /// /// In fr, this message translates to: - /// **'Choix de la langue'** - String get settingsChooseLanguage; + /// **'Demande de suppression de compte envoyée'** + String get settingsDeletionAsked; - /// Affiche le nombre de notifications actives sur le total des notifications disponibles, avec gestion du pluriel + /// No description provided for @settingsDetelePersonalData. /// /// In fr, this message translates to: - /// **'{active}/{total} {active, plural, zero {activée} one {activée} other {activées}}'** - String settingsNotificationCounter(int active, int total); + /// **'Supprimer mes données personnelles'** + String get settingsDetelePersonalData; - /// No description provided for @settingsEvent. + /// No description provided for @settingsDetelePersonalDataDesc. /// /// In fr, this message translates to: - /// **'Événement'** - String get settingsEvent; + /// **'Cette action notifie l\'administrateur que vous souhaitez supprimer vos données personnelles.'** + String get settingsDetelePersonalDataDesc; - /// No description provided for @settingsIcal. + /// No description provided for @settingsEdit. /// /// In fr, this message translates to: - /// **'Lien Ical'** - String get settingsIcal; + /// **'Modifier'** + String get settingsEdit; - /// No description provided for @settingsSynncWithCalendar. + /// No description provided for @settingsEditAccount. /// /// In fr, this message translates to: - /// **'Synchroniser avec votre calendrier'** - String get settingsSynncWithCalendar; + /// **'Modifier mon profil'** + String get settingsEditAccount; - /// No description provided for @settingsIcalLinkCopied. + /// No description provided for @settingsEditedAccount. /// /// In fr, this message translates to: - /// **'Lien Ical copié dans le presse-papier'** - String get settingsIcalLinkCopied; + /// **'Compte modifié avec succès'** + String get settingsEditedAccount; - /// No description provided for @settingsProfile. + /// No description provided for @settingsEmail. /// /// In fr, this message translates to: - /// **'Profil'** - String get settingsProfile; + /// **'Email'** + String get settingsEmail; - /// No description provided for @settingsConnexion. + /// No description provided for @settingsEmptyField. /// /// In fr, this message translates to: - /// **'Connexion'** - String get settingsConnexion; + /// **'Ce champ ne peut pas être vide'** + String get settingsEmptyField; - /// No description provided for @settingsLogOut. + /// No description provided for @settingsErrorProfilePicture. /// /// In fr, this message translates to: - /// **'Se déconnecter'** - String get settingsLogOut; + /// **'Erreur lors de la modification de la photo de profil'** + String get settingsErrorProfilePicture; - /// No description provided for @settingsLogOutDescription. + /// No description provided for @settingsErrorSendingDemand. /// /// In fr, this message translates to: - /// **'Êtes-vous sûr de vouloir vous déconnecter ?'** - String get settingsLogOutDescription; + /// **'Erreur lors de l\'envoi de la demande'** + String get settingsErrorSendingDemand; - /// No description provided for @settingsLogOutSuccess. + /// No description provided for @settingsEvent. /// - /// In fr, this message translates to: - /// **'Déconnexion réussie'** - String get settingsLogOutSuccess; + /// In fr, this message translates to: + /// **'Événement'** + String get settingsEvent; - /// No description provided for @settingsDeleteMyAccount. + /// No description provided for @settingsEventsIcal. /// /// In fr, this message translates to: - /// **'Supprimer mon compte'** - String get settingsDeleteMyAccount; + /// **'Lien Ical des événements'** + String get settingsEventsIcal; - /// No description provided for @settingsDeleteMyAccountDescription. + /// No description provided for @settingsExpectingDate. /// /// In fr, this message translates to: - /// **'Cette action notifie l\'administrateur que vous souhaitez supprimer votre compte.'** - String get settingsDeleteMyAccountDescription; + /// **'Date de naissance attendue'** + String get settingsExpectingDate; - /// No description provided for @settingsDeletionAsked. + /// No description provided for @settingsFailedToEditAccount. /// /// In fr, this message translates to: - /// **'Demande de suppression de compte envoyée'** - String get settingsDeletionAsked; + /// **'Échec de la modification du compte'** + String get settingsFailedToEditAccount; - /// No description provided for @settingsDeleteMyAccountError. + /// No description provided for @settingsFirstname. /// /// In fr, this message translates to: - /// **'Erreur lors de la demande de suppression de compte'** - String get settingsDeleteMyAccountError; + /// **'Prénom'** + String get settingsFirstname; - /// No description provided for @voteAdd. + /// No description provided for @settingsFloor. /// /// In fr, this message translates to: - /// **'Ajouter'** - String get voteAdd; + /// **'Étage'** + String get settingsFloor; - /// No description provided for @voteAddMember. + /// No description provided for @settingsHelp. /// /// In fr, this message translates to: - /// **'Ajouter un membre'** - String get voteAddMember; + /// **'Aide'** + String get settingsHelp; - /// No description provided for @voteAddedPretendance. + /// No description provided for @settingsHyperionVersion. /// /// In fr, this message translates to: - /// **'Liste ajoutée'** - String get voteAddedPretendance; + /// **'Version d\'Hyperion'** + String get settingsHyperionVersion; - /// No description provided for @voteAddedSection. + /// No description provided for @settingsIcal. /// /// In fr, this message translates to: - /// **'Section ajoutée'** - String get voteAddedSection; + /// **'Lien Ical'** + String get settingsIcal; - /// No description provided for @voteAddingError. + /// No description provided for @settingsIcalCopied. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ajout'** - String get voteAddingError; + /// **'Lien Ical copié !'** + String get settingsIcalCopied; - /// No description provided for @voteAddPretendance. + /// No description provided for @settingsIcalLinkCopied. /// /// In fr, this message translates to: - /// **'Ajouter une liste'** - String get voteAddPretendance; + /// **'Lien Ical copié dans le presse-papier'** + String get settingsIcalLinkCopied; - /// No description provided for @voteAddSection. + /// No description provided for @settingsLanguage. /// /// In fr, this message translates to: - /// **'Ajouter une section'** - String get voteAddSection; + /// **'Langue'** + String get settingsLanguage; - /// No description provided for @voteAll. + /// No description provided for @settingsLanguageVar. /// /// In fr, this message translates to: - /// **'Tous'** - String get voteAll; + /// **'Français 🇫🇷'** + String get settingsLanguageVar; - /// No description provided for @voteAlreadyAddedMember. + /// No description provided for @settingsLogOut. /// /// In fr, this message translates to: - /// **'Membre déjà ajouté'** - String get voteAlreadyAddedMember; + /// **'Se déconnecter'** + String get settingsLogOut; - /// No description provided for @voteAlreadyVoted. + /// No description provided for @settingsLogOutDescription. /// /// In fr, this message translates to: - /// **'Vote enregistré'** - String get voteAlreadyVoted; + /// **'Êtes-vous sûr de vouloir vous déconnecter ?'** + String get settingsLogOutDescription; - /// No description provided for @voteChooseList. + /// No description provided for @settingsLogOutSuccess. /// /// In fr, this message translates to: - /// **'Choisir une liste'** - String get voteChooseList; + /// **'Déconnexion réussie'** + String get settingsLogOutSuccess; - /// No description provided for @voteClear. + /// No description provided for @settingsLogs. /// /// In fr, this message translates to: - /// **'Réinitialiser'** - String get voteClear; + /// **'Logs'** + String get settingsLogs; - /// No description provided for @voteClearVotes. + /// No description provided for @settingsMinimalHyperionVersion. /// /// In fr, this message translates to: - /// **'Réinitialiser les votes'** - String get voteClearVotes; + /// **'Version minimale d\'Hyperion'** + String get settingsMinimalHyperionVersion; - /// No description provided for @voteClosedVote. + /// No description provided for @settingsModules. /// /// In fr, this message translates to: - /// **'Votes clos'** - String get voteClosedVote; + /// **'Modules'** + String get settingsModules; - /// No description provided for @voteCloseVote. + /// No description provided for @settingsMyIcs. /// /// In fr, this message translates to: - /// **'Fermer les votes'** - String get voteCloseVote; + /// **'Mon lien Ical'** + String get settingsMyIcs; - /// No description provided for @voteConfirmVote. + /// No description provided for @settingsName. /// /// In fr, this message translates to: - /// **'Confirmer le vote'** - String get voteConfirmVote; + /// **'Nom'** + String get settingsName; - /// No description provided for @voteCountVote. + /// No description provided for @settingsNewPassword. /// /// In fr, this message translates to: - /// **'Dépouiller les votes'** - String get voteCountVote; + /// **'Nouveau mot de passe'** + String get settingsNewPassword; - /// No description provided for @voteDelete. + /// No description provided for @settingsNickname. /// /// In fr, this message translates to: - /// **'Supprimer'** - String get voteDelete; + /// **'Surnom'** + String get settingsNickname; - /// No description provided for @voteDeletedAll. + /// Affiche le nombre de notifications actives sur le total des notifications disponibles, avec gestion du pluriel /// /// In fr, this message translates to: - /// **'Tout supprimé'** - String get voteDeletedAll; + /// **'{active}/{total} {active, plural, zero {activée} one {activée} other {activées}}'** + String settingsNotificationCounter(int active, int total); - /// No description provided for @voteDeletedPipo. + /// No description provided for @settingsNotifications. /// /// In fr, this message translates to: - /// **'Listes pipos supprimées'** - String get voteDeletedPipo; + /// **'Notifications'** + String get settingsNotifications; - /// No description provided for @voteDeletedSection. + /// No description provided for @settingsOldPassword. /// /// In fr, this message translates to: - /// **'Section supprimée'** - String get voteDeletedSection; + /// **'Ancien mot de passe'** + String get settingsOldPassword; - /// No description provided for @voteDeleteAll. + /// No description provided for @settingsPasswordChanged. /// /// In fr, this message translates to: - /// **'Supprimer tout'** - String get voteDeleteAll; + /// **'Mot de passe changé'** + String get settingsPasswordChanged; - /// No description provided for @voteDeleteAllDescription. + /// No description provided for @settingsPasswordsNotMatch. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer tout ?'** - String get voteDeleteAllDescription; + /// **'Les mots de passe ne correspondent pas'** + String get settingsPasswordsNotMatch; - /// No description provided for @voteDeletePipo. + /// No description provided for @settingsPersonalData. /// /// In fr, this message translates to: - /// **'Supprimer les listes pipos'** - String get voteDeletePipo; + /// **'Données personnelles'** + String get settingsPersonalData; - /// No description provided for @voteDeletePipoDescription. + /// No description provided for @settingsPersonalisation. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer les listes pipos ?'** - String get voteDeletePipoDescription; + /// **'Personnalisation'** + String get settingsPersonalisation; - /// No description provided for @voteDeletePretendance. + /// No description provided for @settingsPhone. /// /// In fr, this message translates to: - /// **'Supprimer la liste'** - String get voteDeletePretendance; + /// **'Téléphone'** + String get settingsPhone; - /// No description provided for @voteDeletePretendanceDesc. + /// No description provided for @settingsPhoneNumber. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer cette liste ?'** - String get voteDeletePretendanceDesc; + /// **'Numéro de téléphone'** + String get settingsPhoneNumber; - /// No description provided for @voteDeleteSection. + /// No description provided for @settingsProfile. /// /// In fr, this message translates to: - /// **'Supprimer la section'** - String get voteDeleteSection; + /// **'Profil'** + String get settingsProfile; - /// No description provided for @voteDeleteSectionDescription. + /// No description provided for @settingsProfilePicture. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment supprimer cette section ?'** - String get voteDeleteSectionDescription; + /// **'Photo de profil'** + String get settingsProfilePicture; - /// No description provided for @voteDeletingError. + /// No description provided for @settingsPromo. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get voteDeletingError; + /// **'Promotion'** + String get settingsPromo; - /// No description provided for @voteDescription. + /// No description provided for @settingsRepportBug. /// /// In fr, this message translates to: - /// **'Description'** - String get voteDescription; + /// **'Signaler un bug'** + String get settingsRepportBug; - /// No description provided for @voteEdit. + /// No description provided for @settingsSave. /// /// In fr, this message translates to: - /// **'Modifier'** - String get voteEdit; + /// **'Enregistrer'** + String get settingsSave; - /// No description provided for @voteEditedPretendance. + /// No description provided for @settingsSecurity. /// /// In fr, this message translates to: - /// **'Liste modifiée'** - String get voteEditedPretendance; + /// **'Sécurité'** + String get settingsSecurity; - /// No description provided for @voteEditedSection. + /// No description provided for @settingsSendedDemand. /// /// In fr, this message translates to: - /// **'Section modifiée'** - String get voteEditedSection; + /// **'Demande envoyée'** + String get settingsSendedDemand; - /// No description provided for @voteEditingError. + /// No description provided for @settingsSettings. /// /// In fr, this message translates to: - /// **'Erreur lors de la modification'** - String get voteEditingError; + /// **'Paramètres'** + String get settingsSettings; - /// No description provided for @voteErrorClosingVotes. + /// No description provided for @settingsSynncWithCalendar. /// /// In fr, this message translates to: - /// **'Erreur lors de la fermeture des votes'** - String get voteErrorClosingVotes; + /// **'Synchroniser avec votre calendrier'** + String get settingsSynncWithCalendar; - /// No description provided for @voteErrorCountingVotes. + /// No description provided for @settingsTooHeavyProfilePicture. /// /// In fr, this message translates to: - /// **'Erreur lors du dépouillement des votes'** - String get voteErrorCountingVotes; + /// **'L\'image est trop lourde (max 4Mo)'** + String get settingsTooHeavyProfilePicture; - /// No description provided for @voteErrorResetingVotes. + /// No description provided for @settingsTooRecentVersion. /// /// In fr, this message translates to: - /// **'Erreur lors de la réinitialisation des votes'** - String get voteErrorResetingVotes; + /// **'Votre version de l\'application est trop récente, contactez un administrateur pour résoudre ce problème'** + String get settingsTooRecentVersion; - /// No description provided for @voteErrorOpeningVotes. + /// No description provided for @settingsUpdatedProfile. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'ouverture des votes'** - String get voteErrorOpeningVotes; + /// **'Profil modifié'** + String get settingsUpdatedProfile; - /// No description provided for @voteIncorrectOrMissingFields. + /// No description provided for @settingsUpdatedProfilePicture. /// /// In fr, this message translates to: - /// **'Champs incorrects ou manquants'** - String get voteIncorrectOrMissingFields; + /// **'Photo de profil modifiée'** + String get settingsUpdatedProfilePicture; - /// No description provided for @voteMembers. + /// No description provided for @settingsUpdateNotification. /// /// In fr, this message translates to: - /// **'Membres'** - String get voteMembers; + /// **'Mettre à jour les notifications'** + String get settingsUpdateNotification; - /// No description provided for @voteName. + /// No description provided for @settingsUpdatingError. /// /// In fr, this message translates to: - /// **'Nom'** - String get voteName; + /// **'Erreur lors de la modification du profil'** + String get settingsUpdatingError; - /// No description provided for @voteNoPretendanceList. + /// No description provided for @settingsValidate. /// /// In fr, this message translates to: - /// **'Aucune liste de prétendance'** - String get voteNoPretendanceList; + /// **'Valider'** + String get settingsValidate; - /// No description provided for @voteNoSection. + /// No description provided for @settingsVersion. /// /// In fr, this message translates to: - /// **'Aucune section'** - String get voteNoSection; + /// **'Version'** + String get settingsVersion; - /// No description provided for @voteCanNotVote. + /// No description provided for @toolDateRequired. /// /// In fr, this message translates to: - /// **'Vous ne pouvez pas voter'** - String get voteCanNotVote; + /// **'Date requise'** + String get toolDateRequired; - /// No description provided for @voteNoSectionList. + /// No description provided for @toolInvalidNumber. /// /// In fr, this message translates to: - /// **'Aucune section'** - String get voteNoSectionList; + /// **'Chiffre invalide'** + String get toolInvalidNumber; - /// No description provided for @voteNotOpenedVote. + /// No description provided for @toolSuccess. /// /// In fr, this message translates to: - /// **'Vote non ouvert'** - String get voteNotOpenedVote; + /// **'Succès'** + String get toolSuccess; - /// No description provided for @voteOnGoingCount. + /// No description provided for @voteAdd. /// /// In fr, this message translates to: - /// **'Dépouillement en cours'** - String get voteOnGoingCount; + /// **'Ajouter'** + String get voteAdd; - /// No description provided for @voteOpenVote. + /// No description provided for @voteAddedPretendance. /// /// In fr, this message translates to: - /// **'Ouvrir les votes'** - String get voteOpenVote; + /// **'Liste ajoutée'** + String get voteAddedPretendance; - /// No description provided for @votePipo. + /// No description provided for @voteAddedSection. /// /// In fr, this message translates to: - /// **'Pipo'** - String get votePipo; + /// **'Section ajoutée'** + String get voteAddedSection; - /// No description provided for @votePretendance. + /// No description provided for @voteAddingError. /// /// In fr, this message translates to: - /// **'Listes'** - String get votePretendance; + /// **'Erreur lors de l\'ajout'** + String get voteAddingError; - /// No description provided for @votePretendanceDeleted. + /// No description provided for @voteAddMember. /// /// In fr, this message translates to: - /// **'Prétendance supprimée'** - String get votePretendanceDeleted; + /// **'Ajouter un membre'** + String get voteAddMember; - /// No description provided for @votePretendanceNotDeleted. + /// No description provided for @voteAddPretendance. /// /// In fr, this message translates to: - /// **'Erreur lors de la suppression'** - String get votePretendanceNotDeleted; + /// **'Ajouter une liste'** + String get voteAddPretendance; - /// No description provided for @voteProgram. + /// No description provided for @voteAddSection. /// /// In fr, this message translates to: - /// **'Programme'** - String get voteProgram; + /// **'Ajouter une section'** + String get voteAddSection; - /// No description provided for @votePublish. + /// No description provided for @voteAll. /// /// In fr, this message translates to: - /// **'Publier'** - String get votePublish; + /// **'Tous'** + String get voteAll; - /// No description provided for @votePublishVoteDescription. + /// No description provided for @voteAlreadyAddedMember. /// /// In fr, this message translates to: - /// **'Voulez-vous vraiment publier les votes ?'** - String get votePublishVoteDescription; + /// **'Membre déjà ajouté'** + String get voteAlreadyAddedMember; - /// No description provided for @voteResetedVotes. + /// No description provided for @voteAlreadyVoted. /// /// In fr, this message translates to: - /// **'Votes réinitialisés'** - String get voteResetedVotes; + /// **'Vote enregistré'** + String get voteAlreadyVoted; - /// No description provided for @voteResetVote. + /// No description provided for @voteCanNotVote. /// /// In fr, this message translates to: - /// **'Réinitialiser les votes'** - String get voteResetVote; + /// **'Vous ne pouvez pas voter'** + String get voteCanNotVote; - /// No description provided for @voteResetVoteDescription. + /// No description provided for @voteChooseList. /// /// In fr, this message translates to: - /// **'Que voulez-vous faire ?'** - String get voteResetVoteDescription; + /// **'Choisir une liste'** + String get voteChooseList; - /// No description provided for @voteRole. + /// No description provided for @voteClear. /// /// In fr, this message translates to: - /// **'Rôle'** - String get voteRole; + /// **'Réinitialiser'** + String get voteClear; - /// No description provided for @voteSectionDescription. + /// No description provided for @voteClearVotes. /// /// In fr, this message translates to: - /// **'Description de la section'** - String get voteSectionDescription; + /// **'Réinitialiser les votes'** + String get voteClearVotes; - /// No description provided for @voteSection. + /// No description provided for @voteClosedVote. /// /// In fr, this message translates to: - /// **'Section'** - String get voteSection; + /// **'Votes clos'** + String get voteClosedVote; - /// No description provided for @voteSectionName. + /// No description provided for @voteCloseVote. /// /// In fr, this message translates to: - /// **'Nom de la section'** - String get voteSectionName; + /// **'Fermer les votes'** + String get voteCloseVote; - /// No description provided for @voteSeeMore. + /// No description provided for @voteConfirmVote. /// /// In fr, this message translates to: - /// **'Voir plus'** - String get voteSeeMore; + /// **'Confirmer le vote'** + String get voteConfirmVote; - /// No description provided for @voteSelected. + /// No description provided for @voteCountVote. /// /// In fr, this message translates to: - /// **'Sélectionné'** - String get voteSelected; + /// **'Dépouiller les votes'** + String get voteCountVote; - /// No description provided for @voteShowVotes. + /// No description provided for @voteDelete. /// /// In fr, this message translates to: - /// **'Voir les votes'** - String get voteShowVotes; + /// **'Supprimer'** + String get voteDelete; - /// No description provided for @voteVote. + /// No description provided for @voteDeleteAll. /// /// In fr, this message translates to: - /// **'Vote'** - String get voteVote; + /// **'Supprimer tout'** + String get voteDeleteAll; - /// No description provided for @voteVoteError. + /// No description provided for @voteDeleteAllDescription. /// /// In fr, this message translates to: - /// **'Erreur lors de l\'enregistrement du vote'** - String get voteVoteError; + /// **'Voulez-vous vraiment supprimer tout ?'** + String get voteDeleteAllDescription; - /// No description provided for @voteVoteFor. + /// No description provided for @voteDeletedAll. /// /// In fr, this message translates to: - /// **'Voter pour '** - String get voteVoteFor; + /// **'Tout supprimé'** + String get voteDeletedAll; - /// No description provided for @voteVoteNotStarted. + /// No description provided for @voteDeletedPipo. /// /// In fr, this message translates to: - /// **'Vote non ouvert'** - String get voteVoteNotStarted; + /// **'Listes pipos supprimées'** + String get voteDeletedPipo; - /// No description provided for @voteVoters. + /// No description provided for @voteDeletedSection. /// /// In fr, this message translates to: - /// **'Groupes votants'** - String get voteVoters; + /// **'Section supprimée'** + String get voteDeletedSection; - /// No description provided for @voteVoteSuccess. + /// No description provided for @voteDeletePipo. /// /// In fr, this message translates to: - /// **'Vote enregistré'** - String get voteVoteSuccess; + /// **'Supprimer les listes pipos'** + String get voteDeletePipo; - /// No description provided for @voteVotes. + /// No description provided for @voteDeletePipoDescription. /// /// In fr, this message translates to: - /// **'Voix'** - String get voteVotes; + /// **'Voulez-vous vraiment supprimer les listes pipos ?'** + String get voteDeletePipoDescription; - /// No description provided for @voteVotesClosed. + /// No description provided for @voteDeletePretendance. /// /// In fr, this message translates to: - /// **'Votes clos'** - String get voteVotesClosed; + /// **'Supprimer la liste'** + String get voteDeletePretendance; - /// No description provided for @voteVotesCounted. + /// No description provided for @voteDeletePretendanceDesc. /// /// In fr, this message translates to: - /// **'Votes dépouillés'** - String get voteVotesCounted; + /// **'Voulez-vous vraiment supprimer cette liste ?'** + String get voteDeletePretendanceDesc; - /// No description provided for @voteVotesOpened. + /// No description provided for @voteDeleteSection. /// /// In fr, this message translates to: - /// **'Votes ouverts'** - String get voteVotesOpened; + /// **'Supprimer la section'** + String get voteDeleteSection; - /// No description provided for @voteWarning. + /// No description provided for @voteDeleteSectionDescription. /// /// In fr, this message translates to: - /// **'Attention'** - String get voteWarning; + /// **'Voulez-vous vraiment supprimer cette section ?'** + String get voteDeleteSectionDescription; - /// No description provided for @voteWarningMessage. + /// No description provided for @voteDeletingError. /// /// In fr, this message translates to: - /// **'La sélection ne sera pas sauvegardée.\nVoulez-vous continuer ?'** - String get voteWarningMessage; + /// **'Erreur lors de la suppression'** + String get voteDeletingError; - /// No description provided for @moduleAdvert. + /// No description provided for @voteDescription. /// /// In fr, this message translates to: - /// **'Feed'** - String get moduleAdvert; + /// **'Description'** + String get voteDescription; - /// No description provided for @moduleAdvertDescription. + /// No description provided for @voteEdit. /// /// In fr, this message translates to: - /// **'Gérer les feeds'** - String get moduleAdvertDescription; + /// **'Modifier'** + String get voteEdit; - /// No description provided for @moduleAmap. + /// No description provided for @voteEditedPretendance. /// /// In fr, this message translates to: - /// **'AMAP'** - String get moduleAmap; + /// **'Liste modifiée'** + String get voteEditedPretendance; - /// No description provided for @moduleAmapDescription. + /// No description provided for @voteEditedSection. /// /// In fr, this message translates to: - /// **'Gérer les livraisons et les produits'** - String get moduleAmapDescription; + /// **'Section modifiée'** + String get voteEditedSection; - /// No description provided for @moduleBooking. + /// No description provided for @voteEditingError. /// /// In fr, this message translates to: - /// **'Réservation'** - String get moduleBooking; + /// **'Erreur lors de la modification'** + String get voteEditingError; - /// No description provided for @moduleBookingDescription. + /// No description provided for @voteErrorClosingVotes. /// /// In fr, this message translates to: - /// **'Gérer les réservations, les salles et les managers'** - String get moduleBookingDescription; + /// **'Erreur lors de la fermeture des votes'** + String get voteErrorClosingVotes; - /// No description provided for @moduleCalendar. + /// No description provided for @voteErrorCountingVotes. /// /// In fr, this message translates to: - /// **'Calendrier'** - String get moduleCalendar; + /// **'Erreur lors du dépouillement des votes'** + String get voteErrorCountingVotes; - /// No description provided for @moduleCalendarDescription. + /// No description provided for @voteErrorOpeningVotes. /// /// In fr, this message translates to: - /// **'Consulter les événements et les activités'** - String get moduleCalendarDescription; + /// **'Erreur lors de l\'ouverture des votes'** + String get voteErrorOpeningVotes; - /// No description provided for @moduleCentralisation. + /// No description provided for @voteErrorResetingVotes. /// /// In fr, this message translates to: - /// **'Centralisation'** - String get moduleCentralisation; + /// **'Erreur lors de la réinitialisation des votes'** + String get voteErrorResetingVotes; - /// No description provided for @moduleCentralisationDescription. + /// No description provided for @voteIncorrectOrMissingFields. /// /// In fr, this message translates to: - /// **'Gérer la centralisation des données'** - String get moduleCentralisationDescription; + /// **'Champs incorrects ou manquants'** + String get voteIncorrectOrMissingFields; - /// No description provided for @moduleCinema. + /// No description provided for @voteMembers. /// /// In fr, this message translates to: - /// **'Cinéma'** - String get moduleCinema; + /// **'Membres'** + String get voteMembers; - /// No description provided for @moduleCinemaDescription. + /// No description provided for @voteName. /// /// In fr, this message translates to: - /// **'Gérer les séances de cinéma'** - String get moduleCinemaDescription; + /// **'Nom'** + String get voteName; - /// No description provided for @moduleEvent. + /// No description provided for @voteNoPretendanceList. /// /// In fr, this message translates to: - /// **'Événement'** - String get moduleEvent; + /// **'Aucune liste de prétendance'** + String get voteNoPretendanceList; - /// No description provided for @moduleEventDescription. + /// No description provided for @voteNoSection. /// /// In fr, this message translates to: - /// **'Gérer les événements et les participants'** - String get moduleEventDescription; + /// **'Aucune section'** + String get voteNoSection; - /// No description provided for @moduleFlappyBird. + /// No description provided for @voteNoSectionList. /// /// In fr, this message translates to: - /// **'Flappy Bird'** - String get moduleFlappyBird; + /// **'Aucune section'** + String get voteNoSectionList; - /// No description provided for @moduleFlappyBirdDescription. + /// No description provided for @voteNotOpenedVote. /// /// In fr, this message translates to: - /// **'Jouer à Flappy Bird et consulter le classement'** - String get moduleFlappyBirdDescription; + /// **'Vote non ouvert'** + String get voteNotOpenedVote; - /// No description provided for @moduleLoan. + /// No description provided for @voteOnGoingCount. /// /// In fr, this message translates to: - /// **'Prêt'** - String get moduleLoan; + /// **'Dépouillement en cours'** + String get voteOnGoingCount; - /// No description provided for @moduleLoanDescription. + /// No description provided for @voteOpenVote. /// /// In fr, this message translates to: - /// **'Gérer les prêts et les articles'** - String get moduleLoanDescription; + /// **'Ouvrir les votes'** + String get voteOpenVote; - /// No description provided for @modulePhonebook. + /// No description provided for @votePipo. /// /// In fr, this message translates to: - /// **'Annuaire'** - String get modulePhonebook; + /// **'Pipo'** + String get votePipo; - /// No description provided for @modulePhonebookDescription. + /// No description provided for @votePretendance. /// /// In fr, this message translates to: - /// **'Gérer les associations, les membres et les administrateurs'** - String get modulePhonebookDescription; + /// **'Listes'** + String get votePretendance; - /// No description provided for @modulePurchases. + /// No description provided for @votePretendanceDeleted. /// /// In fr, this message translates to: - /// **'Achats'** - String get modulePurchases; + /// **'Prétendance supprimée'** + String get votePretendanceDeleted; - /// No description provided for @modulePurchasesDescription. + /// No description provided for @votePretendanceNotDeleted. /// /// In fr, this message translates to: - /// **'Gérer les achats, les tickets et l\'historique'** - String get modulePurchasesDescription; + /// **'Erreur lors de la suppression'** + String get votePretendanceNotDeleted; - /// No description provided for @moduleRaffle. + /// No description provided for @voteProgram. /// /// In fr, this message translates to: - /// **'Tombola'** - String get moduleRaffle; + /// **'Programme'** + String get voteProgram; - /// No description provided for @moduleRaffleDescription. + /// No description provided for @votePublish. /// /// In fr, this message translates to: - /// **'Gérer les tombolas, les prix et les tickets'** - String get moduleRaffleDescription; + /// **'Publier'** + String get votePublish; - /// No description provided for @moduleRecommendation. + /// No description provided for @votePublishVoteDescription. /// /// In fr, this message translates to: - /// **'Bons plans'** - String get moduleRecommendation; + /// **'Voulez-vous vraiment publier les votes ?'** + String get votePublishVoteDescription; - /// No description provided for @moduleRecommendationDescription. + /// No description provided for @voteResetedVotes. /// /// In fr, this message translates to: - /// **'Gérer les recommandations, les informations et les administrateurs'** - String get moduleRecommendationDescription; + /// **'Votes réinitialisés'** + String get voteResetedVotes; - /// No description provided for @moduleSeedLibrary. + /// No description provided for @voteResetVote. /// /// In fr, this message translates to: - /// **'Grainothèque'** - String get moduleSeedLibrary; + /// **'Réinitialiser les votes'** + String get voteResetVote; - /// No description provided for @moduleSeedLibraryDescription. + /// No description provided for @voteResetVoteDescription. /// /// In fr, this message translates to: - /// **'Gérer les graines, les espèces et les stocks'** - String get moduleSeedLibraryDescription; + /// **'Que voulez-vous faire ?'** + String get voteResetVoteDescription; - /// No description provided for @moduleVote. + /// No description provided for @voteRole. /// /// In fr, this message translates to: - /// **'Vote'** - String get moduleVote; + /// **'Rôle'** + String get voteRole; - /// No description provided for @moduleVoteDescription. + /// No description provided for @voteSection. /// /// In fr, this message translates to: - /// **'Gérer les votes, les sections et les candidats'** - String get moduleVoteDescription; + /// **'Section'** + String get voteSection; - /// No description provided for @modulePh. + /// No description provided for @voteSectionDescription. /// /// In fr, this message translates to: - /// **'PH'** - String get modulePh; + /// **'Description de la section'** + String get voteSectionDescription; - /// No description provided for @modulePhDescription. + /// No description provided for @voteSectionName. /// /// In fr, this message translates to: - /// **'Gérer les PH, les formulaires et les administrateurs'** - String get modulePhDescription; + /// **'Nom de la section'** + String get voteSectionName; - /// No description provided for @moduleSettings. + /// No description provided for @voteSeeMore. /// /// In fr, this message translates to: - /// **'Paramètres'** - String get moduleSettings; + /// **'Voir plus'** + String get voteSeeMore; - /// No description provided for @moduleSettingsDescription. + /// No description provided for @voteSelected. /// /// In fr, this message translates to: - /// **'Gérer les paramètres de l\'application'** - String get moduleSettingsDescription; + /// **'Sélectionné'** + String get voteSelected; - /// No description provided for @moduleFeed. + /// No description provided for @voteShowVotes. /// /// In fr, this message translates to: - /// **'Events'** - String get moduleFeed; + /// **'Voir les votes'** + String get voteShowVotes; - /// No description provided for @moduleFeedDescription. + /// No description provided for @voteVote. /// /// In fr, this message translates to: - /// **'Consulter les événements'** - String get moduleFeedDescription; + /// **'Vote'** + String get voteVote; - /// No description provided for @moduleStyleGuide. + /// No description provided for @voteVoteError. /// /// In fr, this message translates to: - /// **'StyleGuide'** - String get moduleStyleGuide; + /// **'Erreur lors de l\'enregistrement du vote'** + String get voteVoteError; - /// No description provided for @moduleStyleGuideDescription. + /// No description provided for @voteVoteFor. /// /// In fr, this message translates to: - /// **'Explore the UI components and styles used in Titan'** - String get moduleStyleGuideDescription; + /// **'Voter pour '** + String get voteVoteFor; - /// No description provided for @moduleAdmin. + /// No description provided for @voteVoteNotStarted. /// /// In fr, this message translates to: - /// **'Admin'** - String get moduleAdmin; + /// **'Vote non ouvert'** + String get voteVoteNotStarted; - /// No description provided for @moduleAdminDescription. + /// No description provided for @voteVoters. /// /// In fr, this message translates to: - /// **'Gérer les utilisateurs, groupes et structures'** - String get moduleAdminDescription; + /// **'Groupes votants'** + String get voteVoters; - /// No description provided for @moduleOthers. + /// No description provided for @voteVotes. /// /// In fr, this message translates to: - /// **'Autres'** - String get moduleOthers; + /// **'Voix'** + String get voteVotes; - /// No description provided for @moduleOthersDescription. + /// No description provided for @voteVotesClosed. /// /// In fr, this message translates to: - /// **'Afficher les autres modules'** - String get moduleOthersDescription; + /// **'Votes clos'** + String get voteVotesClosed; - /// No description provided for @modulePayment. + /// No description provided for @voteVotesCounted. /// /// In fr, this message translates to: - /// **'Paiement'** - String get modulePayment; + /// **'Votes dépouillés'** + String get voteVotesCounted; - /// No description provided for @modulePaymentDescription. + /// No description provided for @voteVotesOpened. /// /// In fr, this message translates to: - /// **'Gérer les paiements, les statistiques et les appareils'** - String get modulePaymentDescription; + /// **'Votes ouverts'** + String get voteVotesOpened; - /// No description provided for @toolInvalidNumber. + /// No description provided for @voteVoteSuccess. /// /// In fr, this message translates to: - /// **'Chiffre invalide'** - String get toolInvalidNumber; + /// **'Vote enregistré'** + String get voteVoteSuccess; - /// No description provided for @toolDateRequired. + /// No description provided for @voteWarning. /// /// In fr, this message translates to: - /// **'Date requise'** - String get toolDateRequired; + /// **'Attention'** + String get voteWarning; - /// No description provided for @toolSuccess. + /// No description provided for @voteWarningMessage. /// /// In fr, this message translates to: - /// **'Succès'** - String get toolSuccess; + /// **'La sélection ne sera pas sauvegardée.\nVoulez-vous continuer ?'** + String get voteWarningMessage; } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 6657a2dd8b..9a1c102be6 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -9,242 +9,94 @@ class AppLocalizationsEn extends AppLocalizations { AppLocalizationsEn([String locale = 'en']) : super(locale); @override - String get dateToday => 'Today'; - - @override - String get dateYesterday => 'Yesterday'; - - @override - String get dateTomorrow => 'Tomorrow'; - - @override - String get dateAt => 'at'; - - @override - String get dateFrom => 'from'; - - @override - String get dateTo => 'to'; - - @override - String get dateBetweenDays => 'to'; - - @override - String get dateStarting => 'Starting'; - - @override - String get dateLast => 'Last'; - - @override - String get dateUntil => 'Until'; - - @override - String get feedFilterAll => 'All'; - - @override - String get feedFilterPending => 'Pending'; - - @override - String get feedFilterApproved => 'Approved'; - - @override - String get feedFilterRejected => 'Rejected'; - - @override - String get feedEmptyAll => 'No events available'; - - @override - String get feedEmptyPending => 'No events pending approval'; - - @override - String get feedEmptyApproved => 'No approved events'; - - @override - String get feedEmptyRejected => 'No rejected events'; - - @override - String get feedEventManagement => 'Event Management'; - - @override - String get feedTitle => 'Title'; - - @override - String get feedLocation => 'Location'; - - @override - String get feedSGDate => 'SG Date'; - - @override - String get feedSGExternalLink => 'SG External link'; - - @override - String get feedCreateEvent => 'Create an event'; - - @override - String get feedNotification => 'Send a notification'; - - @override - String get feedPleaseSelectAnAssociation => 'Please select an association'; - - @override - String get feedReject => 'Reject'; - - @override - String get feedApprove => 'Approve'; - - @override - String get feedEnded => 'Ended'; - - @override - String get feedOngoing => 'Ongoing'; - - @override - String get feedFilter => 'Filter'; - - @override - String get feedAssociation => 'Association'; - - @override - String feedAssociationEvent(String name) { - return '$name event'; - } - - @override - String get feedEditEvent => 'Edit event'; - - @override - String get feedManageAssociationEvents => 'Manage association events'; - - @override - String get feedNews => 'Calendar'; - - @override - String get feedNewsType => 'News type'; - - @override - String get feedNoAssociationEvents => 'No association events'; - - @override - String get feedApply => 'Apply'; - - @override - String get feedAdmin => 'Administration'; + String get moduleCentralassociation => 'Centralassociation'; @override - String get feedCreateAnEvent => 'Create an event'; - - @override - String get feedManageRequests => 'Manage requests'; + String get moduleCentralassociationDescription => + 'Aggregator of association links'; @override - String get feedNoNewsAvailable => 'No news available'; - - @override - String get feedRefresh => 'Refresh'; - - @override - String get feedPleaseProvideASGExternalLink => - 'Please provide a SG external link'; - - @override - String get feedPleaseProvideASGDate => 'Please provide a SG date'; - - @override - String feedShotgunIn(String time) { - return 'Shotgun in $time'; - } - - @override - String feedVoteIn(String time) { - return 'Vote in $time'; - } - - @override - String get feedCantOpenLink => 'Can\'t open link'; - - @override - String get feedGetReady => 'Get ready!'; + String get adminAccountTypes => 'Account types'; @override - String get eventActionCampaign => 'You can vote'; + String get adminAdd => 'Add'; @override - String get eventActionEvent => 'You are invited'; + String get adminAddAssociation => 'Add association'; @override - String get eventActionCampaignSubtitle => 'Vote now'; + String get adminAddedGroup => 'Group created'; @override - String get eventActionEventSubtitle => 'Answer the invitation'; + String get adminAddedLoaner => 'Lender added'; @override - String get eventActionCampaignButton => 'Vote'; + String get adminAddedMember => 'Member added'; @override - String get eventActionEventButton => 'Reserve'; + String get adminAddedSchool => 'School created'; @override - String get eventActionCampaignValidated => 'I voted!'; + String get adminAddedStructure => 'Structure added'; @override - String get eventActionEventValidated => 'I\'m coming!'; + String get adminAddGroup => 'Add group'; @override - String get adminAccountTypes => 'Account types'; + String get adminAddingError => 'Error while adding'; @override - String get adminAdd => 'Add'; + String get adminAddingMember => 'Adding a member'; @override - String get adminAddGroup => 'Add group'; + String get adminAddLoaningGroup => 'Add loaning group'; @override String get adminAddMember => 'Add member'; @override - String get adminAddedGroup => 'Group created'; - - @override - String get adminAddedLoaner => 'Lender added'; + String get adminAddSchool => 'Add school'; @override - String get adminAddedMember => 'Member added'; + String get adminAddStructure => 'Add structure'; @override - String get adminAddingError => 'Error while adding'; + String get adminAdmin => 'Admin'; @override - String get adminAddingMember => 'Adding a member'; + String get adminAdministration => 'Administration'; @override - String get adminAddLoaningGroup => 'Add loaning group'; + String get adminAssociationCreated => 'Association created'; @override - String get adminAddSchool => 'Add school'; + String get adminAssociationCreationError => + 'Error while creating association'; @override - String get adminAddStructure => 'Add structure'; + String get adminAssociationMembership => 'Membership'; @override - String get adminAddedSchool => 'School created'; + String get adminAssociationMembershipName => 'Membership name'; @override - String get adminAddedStructure => 'Structure added'; + String get adminAssociationMembershipsManagement => + 'Association memberships management'; @override - String get adminEditedStructure => 'Structure edited'; + String get adminAssociationName => 'Association name'; @override - String get adminAdministration => 'Administration'; + String get adminAssociations => 'Associations'; @override - String get adminAssociationMembership => 'Membership'; + String get adminAssociationsMemberships => 'Memberships'; @override - String get adminAssociationMembershipName => 'Membership name'; + String get adminAssociationUpdated => 'Association updated'; @override - String get adminAssociationsMemberships => 'Memberships'; + String get adminAssociationUpdateError => 'Error while updating association'; @override String adminBankAccountHolder(String bankAccountHolder) { @@ -263,12 +115,26 @@ class AppLocalizationsEn extends AppLocalizations { @override String get adminBicError => 'BIC must be 11 characters'; + @override + String get adminChooseAssociationManagerGroup => + 'Choose a group to manage this association'; + + @override + String get adminChooseGroup => 'Choose a group'; + + @override + String get adminChooseGroupManager => + 'Choose a group to manage this membership'; + @override String get adminCity => 'City'; @override String get adminClearFilters => 'Clear filters'; + @override + String get adminContent => 'Content'; + @override String get adminCountry => 'Country'; @@ -303,17 +169,24 @@ class AppLocalizationsEn extends AppLocalizations { @override String get adminDeletedAssociationMembership => 'Membership deleted'; + @override + String get adminDeletedGroup => 'Group deleted'; + + @override + String get adminDeletedSchool => 'School deleted'; + @override String get adminDeleteGroup => 'Delete group?'; @override - String get adminDeletedGroup => 'Group deleted'; + String get adminDeleteGroupConfirmation => + 'Are you sure you want to delete this group?'; @override String get adminDeleteSchool => 'Delete school?'; @override - String get adminDeletedSchool => 'School deleted'; + String get adminDeleteUsers => 'Delete users'; @override String get adminDeleting => 'Deleting'; @@ -328,16 +201,21 @@ class AppLocalizationsEn extends AppLocalizations { String get adminEdit => 'Edit'; @override - String get adminEditStructure => 'Edit structure'; + String adminEditAssociation(String associationName) { + return 'Edit association : $associationName'; + } @override - String get adminEditMembership => 'Edit membership'; + String get adminEditedStructure => 'Structure edited'; @override - String get adminEmptyDate => 'Empty date'; + String get adminEditGroup => 'Edit group'; @override - String get adminEmptyFieldError => 'Name cannot be empty'; + String get adminEditMembership => 'Edit membership'; + + @override + String get adminEditStructure => 'Edit structure'; @override String get adminEmailFailed => @@ -346,6 +224,12 @@ class AppLocalizationsEn extends AppLocalizations { @override String get adminEmailRegex => 'Email Regex'; + @override + String get adminEmptyDate => 'Empty date'; + + @override + String get adminEmptyFieldError => 'Name cannot be empty'; + @override String get adminEmptyUser => 'Empty user'; @@ -362,308 +246,250 @@ class AppLocalizationsEn extends AppLocalizations { String get adminError => 'Error'; @override - String get adminFilters => 'Filters'; - - @override - String get adminGroup => 'Group'; - - @override - String get adminGroups => 'Groups'; - - @override - String get adminIban => 'IBAN'; - - @override - String get adminIbanError => 'IBAN must be 27 characters'; - - @override - String get adminLoaningGroup => 'Loaning group'; - - @override - String get adminLooking => 'Searching'; - - @override - String get adminManager => 'Structure administrator'; - - @override - String get adminMaximum => 'Maximum'; - - @override - String get adminMembers => 'Members'; - - @override - String get adminMembershipAddingError => - 'Error while adding (likely due to overlapping dates)'; - - @override - String get adminMemberships => 'Memberships'; - - @override - String get adminMembershipUpdatingError => - 'Error while updating (likely due to overlapping dates)'; - - @override - String get adminMinimum => 'Minimum'; - - @override - String get adminModifyModuleVisibility => 'Module visibility'; - - @override - String get adminName => 'Name'; - - @override - String get adminNoGroup => 'No group'; - - @override - String get adminNoManager => 'No manager selected'; + String get adminFailedToDeleteGroup => 'Failed to delete group'; @override - String get adminNoMember => 'No member'; + String get adminFailedToInviteUsers => 'Failed to invite users'; @override - String get adminNoMoreLoaner => 'No lender available'; + String get adminFailedToSendNotification => 'Failed to send notification'; @override - String get adminNoSchool => 'No school'; + String get adminFailedToUpdateAssociationLogo => + 'Failed to update association logo'; @override - String get adminRemoveGroupMember => 'Remove member from group?'; + String get adminFilters => 'Filters'; @override - String get adminResearch => 'Search'; + String get adminGroup => 'Group'; @override - String get adminSchools => 'Schools'; + String get adminGroupNotification => 'Group notifications'; @override - String get adminShortId => 'Short ID (3 letters)'; + String get adminGroups => 'Groups'; @override - String get adminShortIdError => 'Short ID must be 3 characters'; + String get adminGroupsManagement => 'Groups management'; @override - String get adminSiegeAddress => 'Head office address'; + String get adminIban => 'IBAN'; @override - String get adminSiret => 'SIRET'; + String get adminIbanError => 'IBAN must be 27 characters'; @override - String get adminSiretError => 'SIRET must be 14 digits'; + String get adminImportList => 'Import a list'; @override - String get adminStreet => 'Street and number'; + String get adminImportUsersDescription => + 'Import users from a CSV file. The CSV file must contain one email address per line.'; @override - String get adminStructures => 'Structures'; + String get adminInvite => 'Invite'; @override - String get adminStartDate => 'Start date'; + String get adminInvitedUsers => 'Invited users'; @override - String get adminStartDateMaximal => 'Maximum start date'; + String get adminInviteUsers => 'Invite users'; @override - String get adminStartDateMinimal => 'Minimum start date'; + String adminInviteUsersCounter(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count users', + one: '$count user', + zero: 'No user', + ); + return '$_temp0 in the CSV file'; + } @override - String get adminUndefinedBankAccountHolder => - 'Bank account holder not defined'; + String get adminLoaningGroup => 'Loaning group'; @override - String get adminUpdatedAssociationMembership => 'Membership updated'; + String get adminLooking => 'Searching'; @override - String get adminUpdatedGroup => 'Group updated'; + String get adminManageAssociations => 'Manage associations'; @override - String get adminUpdatedMembership => 'Membership updated'; + String get adminManageMembers => 'Manage members'; @override - String get adminUpdatingError => 'Error while updating'; + String get adminManagePaiementStructures => 'Manage payment structures'; @override - String get adminUser => 'User'; + String get adminManager => 'Structure administrator'; @override - String get adminValidateFilters => 'Apply filters'; + String adminManagerGroup(String groupName) { + return 'Manager group : $groupName'; + } @override - String get adminVisibilities => 'Visibilities'; + String get adminManageUserGroups => 'Manage user groups'; @override - String get adminZipcode => 'Zip code'; + String get adminManageUsersAssociationMemberships => + 'Manage users\' association memberships'; @override - String get adminGroupNotification => 'Group notifications'; + String get adminMaximum => 'Maximum'; @override - String adminNotifyGroup(String groupName) { - return 'Send a notification'; - } + String get adminMembers => 'Members'; @override - String get adminTitle => 'Title'; + String get adminMembershipAddingError => + 'Error while adding (likely due to overlapping dates)'; @override - String get adminContent => 'Content'; + String get adminMemberships => 'Memberships'; @override - String get adminSend => 'Send'; + String get adminMembershipUpdatingError => + 'Error while updating (likely due to overlapping dates)'; @override - String get adminNotificationSent => 'Notification sent'; + String get adminMinimum => 'Minimum'; @override - String get adminFailedToSendNotification => 'Failed to send notification'; + String get adminModifyPermissions => 'Modify permissions'; @override - String get adminGroupsManagement => 'Groups management'; + String get adminName => 'Name'; @override - String get adminEditGroup => 'Edit group'; + String get adminNoGroup => 'No group'; @override - String get adminManageMembers => 'Manage members'; + String get adminNoManager => 'No manager selected'; @override - String get adminDeleteGroupConfirmation => - 'Are you sure you want to delete this group?'; + String get adminNoMember => 'No member'; @override - String get adminFailedToDeleteGroup => 'Failed to delete group'; + String get adminNoMoreLoaner => 'No lender available'; @override - String get adminUsersAndGroups => 'Users and groups'; + String get adminNoSchool => 'No school'; @override - String get adminUsersManagement => 'Users management'; + String get adminNotificationSent => 'Notification sent'; @override - String get adminUsersManagementDescription => - 'Manage users, groups, and associations'; + String adminNotifyGroup(String groupName) { + return 'Send a notification'; + } @override - String get adminManageUserGroups => 'Manage user groups'; + String get adminPaiement => 'Payment'; @override - String get adminSendNotificationToGroup => 'Send notification to group'; + String get adminPaiementModule => 'Payment module'; @override - String get adminPaiementModule => 'Payment module'; + String get adminRemoveGroupMember => 'Remove member from group?'; @override - String get adminPaiement => 'Payment'; + String get adminResearch => 'Search'; @override - String get adminManagePaiementStructures => 'Manage payment structures'; + String get adminSchools => 'Schools'; @override - String get adminManageUsersAssociationMemberships => - 'Manage users\' association memberships'; + String get adminSelectGroupAssociationManager => + 'Select a group to manage this association'; @override - String get adminAssociationMembershipsManagement => - 'Association memberships management'; + String get adminSelectManager => 'Select a manager'; @override - String get adminChooseGroupManager => - 'Choose a group to manage this membership'; + String get adminSend => 'Send'; @override - String get adminSelectManager => 'Select a manager'; + String get adminSendNotificationToGroup => 'Send notification to group'; @override - String get adminImportList => 'Import a list'; + String get adminShortId => 'Short ID (3 letters)'; @override - String get adminImportUsersDescription => - 'Import users from a CSV file. The CSV file must contain one email address per line.'; + String get adminShortIdError => 'Short ID must be 3 characters'; @override - String get adminFailedToInviteUsers => 'Failed to invite users'; + String get adminSiegeAddress => 'Head office address'; @override - String get adminDeleteUsers => 'Delete users'; + String get adminSiret => 'SIRET'; @override - String get adminAdmin => 'Admin'; + String get adminSiretError => 'SIRET must be 14 digits'; @override - String get adminAssociations => 'Associations'; + String get adminStartDate => 'Start date'; @override - String get adminManageAssociations => 'Manage associations'; + String get adminStartDateMaximal => 'Maximum start date'; @override - String get adminAddAssociation => 'Add association'; + String get adminStartDateMinimal => 'Minimum start date'; @override - String get adminAssociationName => 'Association name'; + String get adminStreet => 'Street and number'; @override - String get adminSelectGroupAssociationManager => - 'Select a group to manage this association'; + String get adminStructures => 'Structures'; @override - String adminEditAssociation(String associationName) { - return 'Edit association : $associationName'; - } + String get adminTitle => 'Title'; @override - String adminManagerGroup(String groupName) { - return 'Manager group : $groupName'; - } + String get adminTooHeavyLogo => 'Logo too heavy, maximum size is 4MB'; @override - String get adminAssociationCreated => 'Association created'; + String get adminUndefinedBankAccountHolder => + 'Bank account holder not defined'; @override - String get adminAssociationUpdated => 'Association updated'; + String get adminUpdatedAssociationLogo => 'Association logo updated'; @override - String get adminAssociationCreationError => - 'Error while creating association'; + String get adminUpdatedAssociationMembership => 'Membership updated'; @override - String get adminAssociationUpdateError => 'Error while updating association'; + String get adminUpdatedGroup => 'Group updated'; @override - String get adminInvite => 'Invite'; + String get adminUpdatedMembership => 'Membership updated'; @override - String get adminInvitedUsers => 'Invited users'; + String get adminUpdatingError => 'Error while updating'; @override - String get adminInviteUsers => 'Invite users'; + String get adminUser => 'User'; @override - String adminInviteUsersCounter(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count users', - one: '$count user', - zero: 'No user', - ); - return '$_temp0 in the CSV file'; - } + String get adminUsersAndGroups => 'Users and groups'; @override - String get adminUpdatedAssociationLogo => 'Association logo updated'; + String get adminUsersManagement => 'Users management'; @override - String get adminTooHeavyLogo => 'Logo too heavy, maximum size is 4MB'; + String get adminUsersManagementDescription => + 'Manage users, groups, and associations'; @override - String get adminFailedToUpdateAssociationLogo => - 'Failed to update association logo'; + String get adminValidateFilters => 'Apply filters'; @override - String get adminChooseGroup => 'Choose a group'; + String get adminVisibilities => 'Visibilities'; @override - String get adminChooseAssociationManagerGroup => - 'Choose a group to manage this association'; + String get adminZipcode => 'Zip code'; @override String get advertAdd => 'Add'; @@ -726,67 +552,67 @@ class AppLocalizationsEn extends AppLocalizations { String get advertModifyAnnouncingGroup => 'Edit announcement group'; @override - String get advertNoMoreAnnouncer => 'No more announcers available'; + String get advertMonthApr => 'Apr'; @override - String get advertNoValue => 'Please enter a value'; + String get advertMonthAug => 'Aug'; @override - String get advertPositiveNumber => 'Please enter a positive number'; + String get advertMonthDec => 'Dec'; @override - String get advertPublishToFeed => 'Publish to feed?'; + String get advertMonthFeb => 'Feb'; @override - String get advertNotification => 'Send a notification'; + String get advertMonthJan => 'Jan'; @override - String get advertRemovedAnnouncer => 'Announcer removed'; + String get advertMonthJul => 'Jul'; @override - String get advertRemovingError => 'Error during removal'; + String get advertMonthJun => 'Jun'; @override - String get advertTags => 'Tags'; + String get advertMonthMar => 'Mar'; @override - String get advertTitle => 'Title'; + String get advertMonthMay => 'May'; @override - String get advertMonthJan => 'Jan'; + String get advertMonthNov => 'Nov'; @override - String get advertMonthFeb => 'Feb'; + String get advertMonthOct => 'Oct'; @override - String get advertMonthMar => 'Mar'; + String get advertMonthSep => 'Sep'; @override - String get advertMonthApr => 'Apr'; + String get advertNoMoreAnnouncer => 'No more announcers available'; @override - String get advertMonthMay => 'May'; + String get advertNotification => 'Send a notification'; @override - String get advertMonthJun => 'Jun'; + String get advertNoValue => 'Please enter a value'; @override - String get advertMonthJul => 'Jul'; + String get advertPositiveNumber => 'Please enter a positive number'; @override - String get advertMonthAug => 'Aug'; + String get advertPublishToFeed => 'Publish to feed?'; @override - String get advertMonthSep => 'Sep'; + String get advertRemovedAnnouncer => 'Announcer removed'; @override - String get advertMonthOct => 'Oct'; + String get advertRemovingError => 'Error during removal'; @override - String get advertMonthNov => 'Nov'; + String get advertTags => 'Tags'; @override - String get advertMonthDec => 'Dec'; + String get advertTitle => 'Title'; @override String get amapAccounts => 'Accounts'; @@ -809,12 +635,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get amapAddedUser => 'User added'; - @override - String get amapAddProduct => 'Add product'; - - @override - String get amapAddUser => 'Add user'; - @override String get amapAddingACommand => 'Add an order'; @@ -830,6 +650,12 @@ class AppLocalizationsEn extends AppLocalizations { @override String get amapAddOrder => 'Add an order'; + @override + String get amapAddProduct => 'Add product'; + + @override + String get amapAddUser => 'Add user'; + @override String get amapAdmin => 'Admin'; @@ -860,6 +686,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get amapCommandDate => 'Order date'; + @override + String get amapCommandName => 'Order name'; + @override String get amapCommandProducts => 'Order products'; @@ -875,6 +704,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get amapDelete => 'Delete'; + @override + String get amapDeletedDelivery => 'Delivery deleted'; + @override String get amapDeleteDelivery => 'Delete delivery?'; @@ -882,9 +714,6 @@ class AppLocalizationsEn extends AppLocalizations { String get amapDeleteDeliveryDescription => 'Are you sure you want to delete this delivery?'; - @override - String get amapDeletedDelivery => 'Delivery deleted'; - @override String get amapDeletedOrder => 'Order deleted'; @@ -944,22 +773,22 @@ class AppLocalizationsEn extends AppLocalizations { String get amapDeliveryLocked => 'Delivery locked'; @override - String get amapDeliveryOn => 'Delivery on'; + String get amapDeliveryNotArchived => 'Delivery not archived'; @override - String get amapDeliveryOpened => 'Delivery opened'; + String get amapDeliveryNotDelivered => 'Delivery not completed'; @override - String get amapDeliveryNotArchived => 'Delivery not archived'; + String get amapDeliveryNotLocked => 'Delivery not locked'; @override - String get amapDeliveryNotLocked => 'Delivery not locked'; + String get amapDeliveryNotOpened => 'Delivery not opened'; @override - String get amapDeliveryNotDelivered => 'Delivery not completed'; + String get amapDeliveryOn => 'Delivery on'; @override - String get amapDeliveryNotOpened => 'Delivery not opened'; + String get amapDeliveryOpened => 'Delivery opened'; @override String get amapEditDelivery => 'Edit delivery'; @@ -997,6 +826,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get amapHandlingAccount => 'Manage accounts'; + @override + String get amapIncorrectlyFilledForm => 'Form incorrectly filled'; + @override String get amapLoading => 'Loading...'; @@ -1016,10 +848,10 @@ class AppLocalizationsEn extends AppLocalizations { String get amapLockedOrder => 'Order locked'; @override - String get amapLooking => 'Search'; + String get amapLockingDelivery => 'Lock delivery?'; @override - String get amapLockingDelivery => 'Lock delivery?'; + String get amapLooking => 'Search'; @override String get amapMidDay => 'Midday'; @@ -1033,9 +865,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get amapNextStep => 'Next step'; - @override - String get amapNoProduct => 'No product'; - @override String get amapNoCurrentOrder => 'No current order'; @@ -1048,6 +877,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get amapNoOrder => 'No order'; + @override + String get amapNoProduct => 'No product'; + @override String get amapNoSelectedDelivery => 'No delivery selected'; @@ -1100,10 +932,10 @@ class AppLocalizationsEn extends AppLocalizations { String get amapProduct => 'product'; @override - String get amapProducts => 'Products'; + String get amapProductInDelivery => 'Product in an unfinished delivery'; @override - String get amapProductInDelivery => 'Product in an unfinished delivery'; + String get amapProducts => 'Products'; @override String get amapQuantity => 'Quantity'; @@ -1151,22 +983,19 @@ class AppLocalizationsEn extends AppLocalizations { String get bookingAdd => 'Add'; @override - String get bookingAddBookingPage => 'Request'; - - @override - String get bookingAddRoom => 'Add room'; + String get bookingAddBooking => 'Add booking'; @override - String get bookingAddBooking => 'Add booking'; + String get bookingAddBookingPage => 'Request'; @override String get bookingAddedBooking => 'Request added'; @override - String get bookingAddedRoom => 'Room added'; + String get bookingAddedManager => 'Manager added'; @override - String get bookingAddedManager => 'Manager added'; + String get bookingAddedRoom => 'Room added'; @override String get bookingAddingError => 'Error while adding'; @@ -1174,6 +1003,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get bookingAddManager => 'Add manager'; + @override + String get bookingAddRoom => 'Add room'; + @override String get bookingAdminPage => 'Admin'; @@ -1231,9 +1063,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get bookingDelete => 'Delete'; - @override - String get bookingDeleting => 'Deleting'; - @override String get bookingDeleteBooking => 'Deleting'; @@ -1244,19 +1073,22 @@ class AppLocalizationsEn extends AppLocalizations { @override String get bookingDeletedBooking => 'Booking deleted'; + @override + String get bookingDeletedManager => 'Manager deleted'; + @override String get bookingDeletedRoom => 'Room deleted'; @override - String get bookingDeletedManager => 'Manager deleted'; + String get bookingDeleteManagerConfirmation => + 'Are you sure you want to delete this manager?\n\nThe manager must not be associated with any room to be deleted'; @override String get bookingDeleteRoomConfirmation => 'Are you sure you want to delete this room?\n\nThe room must have no current or upcoming bookings to be deleted'; @override - String get bookingDeleteManagerConfirmation => - 'Are you sure you want to delete this manager?\n\nThe manager must not be associated with any room to be deleted'; + String get bookingDeleting => 'Deleting'; @override String get bookingDeletingBooking => 'Delete the booking?'; @@ -1274,16 +1106,16 @@ class AppLocalizationsEn extends AppLocalizations { String get bookingEditBooking => 'Edit a booking'; @override - String get bookingEditionError => 'Error while editing'; + String get bookingEditedBooking => 'Booking edited'; @override - String get bookingEditedBooking => 'Booking edited'; + String get bookingEditedManager => 'Manager edited'; @override String get bookingEditedRoom => 'Room edited'; @override - String get bookingEditedManager => 'Manager edited'; + String get bookingEditionError => 'Error while editing'; @override String get bookingEditManager => 'Edit or delete a manager'; @@ -1316,10 +1148,10 @@ class AppLocalizationsEn extends AppLocalizations { String get bookingInterval => 'Interval'; @override - String get bookingInvalidIntervalError => 'Invalid interval'; + String get bookingInvalidDates => 'Invalid dates'; @override - String get bookingInvalidDates => 'Invalid dates'; + String get bookingInvalidIntervalError => 'Invalid interval'; @override String get bookingInvalidRoom => 'Invalid room'; @@ -1352,14 +1184,14 @@ class AppLocalizationsEn extends AppLocalizations { String get bookingNo => 'No'; @override - String get bookingNoCurrentBooking => 'No current booking'; + String get bookingNoAppointmentInReccurence => + 'No slot exists with these recurrence settings'; @override - String get bookingNoDateError => 'Please choose a date'; + String get bookingNoCurrentBooking => 'No current booking'; @override - String get bookingNoAppointmentInReccurence => - 'No slot exists with these recurrence settings'; + String get bookingNoDateError => 'Please choose a date'; @override String get bookingNoDaySelected => 'No day selected'; @@ -1380,10 +1212,10 @@ class AppLocalizationsEn extends AppLocalizations { String get bookingNoReasonError => 'Please enter a reason'; @override - String get bookingNoRoomFoundError => 'No room registered'; + String get bookingNoRoomFound => 'No room found'; @override - String get bookingNoRoomFound => 'No room found'; + String get bookingNoRoomFoundError => 'No room registered'; @override String get bookingNote => 'Note'; @@ -1428,31 +1260,31 @@ class AppLocalizationsEn extends AppLocalizations { String get bookingStartHour => 'Start hour'; @override - String get bookingWeeks => 'Weeks'; - - @override - String get bookingYes => 'Yes'; + String get bookingWeekDayFri => 'Friday'; @override String get bookingWeekDayMon => 'Monday'; @override - String get bookingWeekDayTue => 'Tuesday'; + String get bookingWeekDaySat => 'Saturday'; @override - String get bookingWeekDayWed => 'Wednesday'; + String get bookingWeekDaySun => 'Sunday'; @override String get bookingWeekDayThu => 'Thursday'; @override - String get bookingWeekDayFri => 'Friday'; + String get bookingWeekDayTue => 'Tuesday'; @override - String get bookingWeekDaySat => 'Saturday'; + String get bookingWeekDayWed => 'Wednesday'; @override - String get bookingWeekDaySun => 'Sunday'; + String get bookingWeeks => 'Weeks'; + + @override + String get bookingYes => 'Yes'; @override String get cinemaAdd => 'Add'; @@ -1493,6 +1325,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get cinemaEmptyUrl => 'Please enter a URL'; + @override + String get cinemaGenre => 'Genre'; + @override String get cinemaImportFromTMDB => 'Import from TMDB'; @@ -1505,9 +1340,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get cinemaInvalidUrl => 'Invalid URL'; - @override - String get cinemaGenre => 'Genre'; - @override String get cinemaName => 'Name'; @@ -1544,6 +1376,36 @@ class AppLocalizationsEn extends AppLocalizations { @override String get cinemaThe => 'The'; + @override + String get dateAt => 'at'; + + @override + String get dateBetweenDays => 'to'; + + @override + String get dateFrom => 'from'; + + @override + String get dateLast => 'Last'; + + @override + String get dateStarting => 'Starting'; + + @override + String get dateTo => 'to'; + + @override + String get dateToday => 'Today'; + + @override + String get dateTomorrow => 'Tomorrow'; + + @override + String get dateUntil => 'Until'; + + @override + String get dateYesterday => 'Yesterday'; + @override String get drawerAdmin => 'Administration'; @@ -1575,14 +1437,38 @@ class AppLocalizationsEn extends AppLocalizations { String get drawerSettings => 'Settings'; @override - String get eventAdd => 'Add'; + String get eventActionCampaign => 'You can vote'; @override - String get eventAddEvent => 'Add an event'; + String get eventActionCampaignButton => 'Vote'; + + @override + String get eventActionCampaignSubtitle => 'Vote now'; + + @override + String get eventActionCampaignValidated => 'I voted!'; + + @override + String get eventActionEvent => 'You are invited'; + + @override + String get eventActionEventButton => 'Reserve'; + + @override + String get eventActionEventSubtitle => 'Answer the invitation'; + + @override + String get eventActionEventValidated => 'I\'m coming!'; + + @override + String get eventAdd => 'Add'; @override String get eventAddedEvent => 'Event added'; + @override + String get eventAddEvent => 'Add an event'; + @override String get eventAddingError => 'Error while adding'; @@ -1592,27 +1478,48 @@ class AppLocalizationsEn extends AppLocalizations { @override String get eventConfirm => 'Confirm'; - @override - String get eventConfirmEvent => 'Confirm the event?'; - @override String get eventConfirmation => 'Confirmation'; @override String get eventConfirmed => 'Confirmed'; + @override + String get eventConfirmEvent => 'Confirm the event?'; + @override String get eventDates => 'Dates'; @override - String get eventDecline => 'Decline'; + String get eventDayFri => 'Friday'; @override - String get eventDeclineEvent => 'Decline the event?'; + String get eventDayMon => 'Monday'; + + @override + String get eventDaySat => 'Saturday'; + + @override + String get eventDaySun => 'Sunday'; + + @override + String get eventDayThu => 'Thursday'; + + @override + String get eventDayTue => 'Tuesday'; + + @override + String get eventDayWed => 'Wednesday'; + + @override + String get eventDecline => 'Decline'; @override String get eventDeclined => 'Declined'; + @override + String get eventDeclineEvent => 'Decline the event?'; + @override String get eventDelete => 'Delete'; @@ -1640,10 +1547,10 @@ class AppLocalizationsEn extends AppLocalizations { String get eventEdit => 'Edit'; @override - String get eventEditEvent => 'Edit an event'; + String get eventEditedEvent => 'Event edited'; @override - String get eventEditedEvent => 'Event edited'; + String get eventEditEvent => 'Edit an event'; @override String get eventEditingError => 'Error while editing'; @@ -1657,6 +1564,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get eventError => 'Error'; + @override + String get eventEventEvery => 'Every'; + @override String get eventEventList => 'Event list'; @@ -1725,10 +1635,10 @@ class AppLocalizationsEn extends AppLocalizations { String get eventNoOrganizerError => 'Please enter an organizer'; @override - String get eventNoPlaceError => 'Please enter a location'; + String get eventNoPhoneRegistered => 'Number not provided'; @override - String get eventNoPhoneRegistered => 'Number not provided'; + String get eventNoPlaceError => 'Please enter a location'; @override String get eventNoRuleError => 'Please enter a recurrence rule'; @@ -1769,41 +1679,144 @@ class AppLocalizationsEn extends AppLocalizations { @override String get eventTitle => 'Events'; + @override + String get eventWeeks => 'weeks'; + @override String get eventYes => 'Yes'; @override - String get eventEventEvery => 'Every'; + String get feedAdmin => 'Administration'; + + @override + String get feedApply => 'Apply'; + + @override + String get feedApprove => 'Approve'; + + @override + String get feedAssociation => 'Association'; + + @override + String feedAssociationEvent(String name) { + return '$name event'; + } + + @override + String get feedCantOpenLink => 'Can\'t open link'; + + @override + String get feedCreateAnEvent => 'Create an event'; + + @override + String get feedCreateEvent => 'Create an event'; + + @override + String get feedEditEvent => 'Edit event'; + + @override + String get feedEmptyAll => 'No events available'; + + @override + String get feedEmptyApproved => 'No approved events'; + + @override + String get feedEmptyPending => 'No events pending approval'; + + @override + String get feedEmptyRejected => 'No rejected events'; + + @override + String get feedEnded => 'Ended'; + + @override + String get feedEventManagement => 'Event Management'; + + @override + String get feedFilter => 'Filter'; + + @override + String get feedFilterAll => 'All'; + + @override + String get feedFilterApproved => 'Approved'; + + @override + String get feedFilterPending => 'Pending'; + + @override + String get feedFilterRejected => 'Rejected'; + + @override + String get feedGetReady => 'Get ready!'; + + @override + String get feedLocation => 'Location'; + + @override + String get feedManageAssociationEvents => 'Manage association events'; + + @override + String get feedManageRequests => 'Manage requests'; + + @override + String get feedNews => 'Calendar'; + + @override + String get feedNewsType => 'News type'; + + @override + String get feedNoAssociationEvents => 'No association events'; + + @override + String get feedNoNewsAvailable => 'No news available'; + + @override + String get feedNotification => 'Send a notification'; + + @override + String get feedOngoing => 'Ongoing'; + + @override + String get feedPleaseProvideASGDate => 'Please provide a SG date'; + + @override + String get feedPleaseProvideASGExternalLink => + 'Please provide a SG external link'; @override - String get eventWeeks => 'weeks'; + String get feedPleaseSelectAnAssociation => 'Please select an association'; @override - String get eventDayMon => 'Monday'; + String get feedRefresh => 'Refresh'; @override - String get eventDayTue => 'Tuesday'; + String get feedReject => 'Reject'; @override - String get eventDayWed => 'Wednesday'; + String get feedSGDate => 'SG Date'; @override - String get eventDayThu => 'Thursday'; + String get feedSGExternalLink => 'SG External link'; @override - String get eventDayFri => 'Friday'; + String feedShotgunIn(String time) { + return 'Shotgun in $time'; + } @override - String get eventDaySat => 'Saturday'; + String get feedTitle => 'Title'; @override - String get eventDaySun => 'Sunday'; + String feedVoteIn(String time) { + return 'Vote in $time'; + } @override - String get globalConfirm => 'Confirm'; + String get globalCancel => 'Cancel'; @override - String get globalCancel => 'Cancel'; + String get globalConfirm => 'Confirm'; @override String get globalIrreversibleAction => 'This action is irreversible'; @@ -1829,35 +1842,29 @@ class AppLocalizationsEn extends AppLocalizations { String get homeNoEvents => 'No events'; @override - String get homeTranslateDayShortMon => 'Mon'; + String get homeTranslateDayShortFri => 'Fri'; @override - String get homeTranslateDayShortTue => 'Tue'; + String get homeTranslateDayShortMon => 'Mon'; @override - String get homeTranslateDayShortWed => 'Wed'; + String get homeTranslateDayShortSat => 'Sat'; @override - String get homeTranslateDayShortThu => 'Thu'; + String get homeTranslateDayShortSun => 'Sun'; @override - String get homeTranslateDayShortFri => 'Fri'; + String get homeTranslateDayShortThu => 'Thu'; @override - String get homeTranslateDayShortSat => 'Sat'; + String get homeTranslateDayShortTue => 'Tue'; @override - String get homeTranslateDayShortSun => 'Sun'; + String get homeTranslateDayShortWed => 'Wed'; @override String get loanAdd => 'Add'; - @override - String get loanAddLoan => 'Add a loan'; - - @override - String get loanAddObject => 'Add an object'; - @override String get loanAddedLoan => 'Loan added'; @@ -1871,41 +1878,47 @@ class AppLocalizationsEn extends AppLocalizations { String get loanAddingError => 'Error while adding'; @override - String get loanAdmin => 'Administrator'; + String get loanAddLoan => 'Add a loan'; @override - String get loanAvailable => 'Available'; + String get loanAddObject => 'Add an object'; @override - String get loanAvailableMultiple => 'Available'; + String get loanAdmin => 'Administrator'; @override - String get loanBorrowed => 'Borrowed'; + String get loanAnd => 'and'; @override - String get loanBorrowedMultiple => 'Borrowed'; + String get loanAssociation => 'Association'; @override - String get loanAnd => 'and'; + String get loanAvailable => 'Available'; @override - String get loanAssociation => 'Association'; + String get loanAvailableItems => 'Available items'; @override - String get loanAvailableItems => 'Available items'; + String get loanAvailableMultiple => 'Available'; @override String get loanBeginDate => 'Loan start date'; @override - String get loanBorrower => 'Borrower'; + String get loanBorrowed => 'Borrowed'; @override - String get loanCaution => 'Deposit'; + String get loanBorrowedMultiple => 'Borrowed'; + + @override + String get loanBorrower => 'Borrower'; @override String get loanCancel => 'Cancel'; + @override + String get loanCaution => 'Deposit'; + @override String get loanConfirm => 'Confirm'; @@ -1924,9 +1937,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get loanDelete => 'Delete'; - @override - String get loanDeletingLoan => 'Delete the loan?'; - @override String get loanDeletedItem => 'Object deleted'; @@ -1942,6 +1952,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get loanDeletingItem => 'Delete the object?'; + @override + String get loanDeletingLoan => 'Delete the loan?'; + @override String get loanDuration => 'Duration'; @@ -1949,13 +1962,13 @@ class AppLocalizationsEn extends AppLocalizations { String get loanEdit => 'Edit'; @override - String get loanEditItem => 'Edit the object'; + String get loanEditedRoom => 'Room edited'; @override - String get loanEditLoan => 'Edit the loan'; + String get loanEditItem => 'Edit the object'; @override - String get loanEditedRoom => 'Room edited'; + String get loanEditLoan => 'Edit the loan'; @override String get loanEndDate => 'Loan end date'; @@ -1980,19 +1993,19 @@ class AppLocalizationsEn extends AppLocalizations { 'Some fields are missing or incorrect'; @override - String get loanInvalidNumber => 'Please enter a number'; + String get loanInvalidDates => 'Dates are not valid'; @override - String get loanInvalidDates => 'Dates are not valid'; + String get loanInvalidNumber => 'Please enter a number'; @override String get loanItem => 'Item'; @override - String get loanItems => 'Items'; + String get loanItemHandling => 'Item management'; @override - String get loanItemHandling => 'Item management'; + String get loanItems => 'Items'; @override String get loanItemSelected => 'selected item'; @@ -2040,13 +2053,10 @@ class AppLocalizationsEn extends AppLocalizations { String get loanNoLoan => 'No loan'; @override - String get loanNoReturnedDate => 'No return date'; - - @override - String get loanQuantity => 'Quantity'; + String get loanNone => 'None'; @override - String get loanNone => 'None'; + String get loanNoReturnedDate => 'No return date'; @override String get loanNote => 'Note'; @@ -2072,6 +2082,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get loanPrevious => 'Previous'; + @override + String get loanQuantity => 'Quantity'; + @override String get loanReturned => 'Returned'; @@ -2141,15 +2154,15 @@ class AppLocalizationsEn extends AppLocalizations { @override String get loginRaffles => 'Raffles'; - @override - String get loginSignIn => 'Sign in'; - @override String get loginRegister => 'Register'; @override String get loginShortDescription => 'The associative application'; + @override + String get loginSignIn => 'Sign in'; + @override String get loginUpcomingEvents => 'Upcoming events'; @@ -2157,46 +2170,181 @@ class AppLocalizationsEn extends AppLocalizations { String get loginUpcomingScreenings => 'Upcoming screenings'; @override - String get othersCheckInternetConnection => - 'Please check your internet connection'; + String get moduleAdmin => 'Admin'; @override - String get othersRetry => 'Retry'; + String get moduleAdminDescription => + 'Administration module for administrators'; @override - String get othersTooOldVersion => - 'Your app version is too old.\n\nPlease update the app.'; + String get moduleAdvert => 'Feed'; @override - String get othersUnableToConnectToServer => 'Unable to connect to the server'; + String get moduleAdvertDescription => 'View the latest feed'; @override - String get othersVersion => 'Version'; + String get moduleAmap => 'AMAP'; @override - String get othersNoModule => - 'No modules available, please try again later 😢😢'; + String get moduleAmapDescription => 'Order your AMAP basket'; + + @override + String get moduleBooking => 'Booking'; + + @override + String get moduleBookingDescription => 'Book a room'; + + @override + String get moduleCalendar => 'Calendar'; + + @override + String get moduleCalendarDescription => 'View the calendar of events'; + + @override + String get moduleCentralisation => 'Centralisation'; + + @override + String get moduleCentralisationDescription => 'Viw all links'; + + @override + String get moduleCinema => 'Cinema'; + + @override + String get moduleCinemaDescription => 'View the cinema schedule'; + + @override + String get moduleEvent => 'Event'; + + @override + String get moduleEventDescription => 'View events'; + + @override + String get moduleFeed => 'Events'; + + @override + String get moduleFeedDescription => 'View the latest events'; + + @override + String get moduleFlappyBird => 'Flappy Bird'; + + @override + String get moduleFlappyBirdDescription => 'Play Flappy Bird'; + + @override + String get moduleLoan => 'Loan'; + + @override + String get moduleLoanDescription => 'See your loans'; + + @override + String get moduleOthers => 'Others'; + + @override + String get moduleOthersDescription => 'Other modules'; + + @override + String get modulePayment => 'Payment'; + + @override + String get modulePaymentDescription => 'Pay and see your transactions'; + + @override + String get modulePh => 'PH'; + + @override + String get modulePhDescription => 'View the PH'; + + @override + String get modulePhonebook => 'Phonebook'; + + @override + String get modulePhonebookDescription => 'View the phonebook'; + + @override + String get modulePurchases => 'Purchases'; + + @override + String get modulePurchasesDescription => 'View your purchases'; + + @override + String get moduleRaffle => 'Raffle'; + + @override + String get moduleRaffleDescription => 'View the raffle'; + + @override + String get moduleRecommendation => 'Recommendation'; + + @override + String get moduleRecommendationDescription => 'View the recommendations'; + + @override + String get moduleSeedLibrary => 'Seed Library'; + + @override + String get moduleSeedLibraryDescription => 'View the seed library'; + + @override + String get moduleSettings => 'Settings'; + + @override + String get moduleSettingsDescription => 'Manage your settings'; + + @override + String get moduleStyleGuide => 'StyleGuide'; + + @override + String get moduleStyleGuideDescription => 'Style guide for developers'; + + @override + String get moduleVote => 'Vote'; + + @override + String get moduleVoteDescription => 'Vote for the campaigns'; @override String get othersAdmin => 'Admin'; + @override + String get othersCheckInternetConnection => + 'Please check your internet connection'; + @override String get othersError => 'An error occurred'; + @override + String get othersImageError => 'Error adding the image'; + + @override + String get othersImageSizeTooBig => 'Image size must not exceed 4 MB'; + + @override + String get othersInvalidNumber => 'Please enter a number'; + + @override + String get othersNoDateError => 'Please enter a date'; + + @override + String get othersNoModule => + 'No modules available, please try again later 😢😢'; + @override String get othersNoValue => 'Please enter a value'; @override - String get othersInvalidNumber => 'Please enter a number'; + String get othersRetry => 'Retry'; @override - String get othersNoDateError => 'Please enter a date'; + String get othersTooOldVersion => + 'Your app version is too old.\n\nPlease update the app.'; @override - String get othersImageSizeTooBig => 'Image size must not exceed 4 MB'; + String othersUnableToConnectToServer(String url) { + return 'Unable to connect to the server: $url'; + } @override - String get othersImageError => 'Error adding the image'; + String get othersVersion => 'Version'; @override String get paiementAccept => 'Accept'; @@ -2320,9 +2468,6 @@ class AppLocalizationsEn extends AppLocalizations { String get paiementDeleteSellerDescription => 'Are you sure you want to delete this seller?'; - @override - String get paiementDeleteSuccessfully => 'Successfully deleted'; - @override String get paiementDeleteStore => 'Delete store'; @@ -2333,6 +2478,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get paiementDeleteStoreError => 'Unable to delete the store'; + @override + String get paiementDeleteSuccessfully => 'Successfully deleted'; + @override String get paiementDeletingSellerError => 'Error while deleting seller'; @@ -2607,11 +2755,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get paiementStoreDeleted => 'Store deleted'; - @override - String paiementStructureManagement(String structure) { - return '$structure management'; - } - @override String get paiementStoreName => 'Store name'; @@ -2621,6 +2764,11 @@ class AppLocalizationsEn extends AppLocalizations { @override String get paiementStructureAdmin => 'Structure administrator'; + @override + String paiementStructureManagement(String structure) { + return '$structure management'; + } + @override String get paiementSuccededTransaction => 'Successful payment'; @@ -2685,62 +2833,50 @@ class AppLocalizationsEn extends AppLocalizations { 'You are about to transfer the structure to '; @override - String get phAddNewJournal => 'Add a new journal'; - - @override - String get phNameField => 'Name: '; - - @override - String get phDateField => 'Date: '; + String get phAdd => 'Add'; @override - String get phDelete => 'Are you sure you want to delete this journal?'; + String get phAdded => 'Added'; @override - String get phIrreversibleAction => 'This action is irreversible'; + String get phAddingFileError => 'Add error'; @override - String get phToHeavyFile => 'File too large'; + String get phAddNewJournal => 'Add a new journal'; @override String get phAddPdfFile => 'Add a PDF file'; @override - String get phEditPdfFile => 'Edit PDF file'; + String get phDate => 'Date'; @override - String get phPhName => 'PH name'; + String get phDateField => 'Date: '; @override - String get phDate => 'Date'; + String get phDelete => 'Are you sure you want to delete this journal?'; @override - String get phAdded => 'Added'; + String get phEdit => 'Edit'; @override String get phEdited => 'Edited'; @override - String get phAddingFileError => 'Add error'; - - @override - String get phMissingInformatonsOrPdf => 'Missing information or PDF file'; + String get phEditPdfFile => 'Edit PDF file'; @override - String get phAdd => 'Add'; + String get phIrreversibleAction => 'This action is irreversible'; @override - String get phEdit => 'Edit'; + String get phMissingInformatonsOrPdf => 'Missing information or PDF file'; @override - String get phSeePreviousJournal => 'See previous journals'; + String get phNameField => 'Name: '; @override String get phNoJournalInDatabase => 'No PH yet in database'; - @override - String get phSuccesDowloading => 'Successfully downloaded'; - @override String get phonebookAdd => 'Add'; @@ -2796,15 +2932,15 @@ class AppLocalizationsEn extends AppLocalizations { @override String get phonebookCancel => 'Cancel'; + @override + String get phonebookChangeTermConfirm => + 'Are you sure you want to change the entire term?\nThis action is irreversible!'; + @override String phonebookChangeTermYear(int year) { return 'Switch to $year term'; } - @override - String get phonebookChangeTermConfirm => - 'Are you sure you want to change the entire term?\nThis action is irreversible!'; - @override String get phonebookClose => 'Close'; @@ -2830,10 +2966,10 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get phonebookDeactivatingError => 'Error during deactivation'; + String get phonebookDeactivating => 'Deactivate the association?'; @override - String get phonebookDetail => 'Details:'; + String get phonebookDeactivatingError => 'Error during deactivation'; @override String get phonebookDelete => 'Delete'; @@ -2841,11 +2977,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get phonebookDeleteAssociation => 'Delete association'; - @override - String phonebookDeleteSelectedAssociation(String association) { - return 'Delete the association $association?'; - } - @override String get phonebookDeleteAssociationDescription => 'This will erase all association history'; @@ -2860,12 +2991,14 @@ class AppLocalizationsEn extends AppLocalizations { String get phonebookDeleteRole => 'Delete role'; @override - String phonebookDeleteUserRole(String name) { - return 'Delete the role of $name?'; + String phonebookDeleteSelectedAssociation(String association) { + return 'Delete the association $association?'; } @override - String get phonebookDeactivating => 'Deactivate the association?'; + String phonebookDeleteUserRole(String name) { + return 'Delete the role of $name?'; + } @override String get phonebookDeleting => 'Deleting'; @@ -2876,6 +3009,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get phonebookDescription => 'Description'; + @override + String get phonebookDetail => 'Details:'; + @override String get phonebookEdit => 'Edit'; @@ -2893,10 +3029,10 @@ class AppLocalizationsEn extends AppLocalizations { String get phonebookEditAssociationMembers => 'Manage members'; @override - String get phonebookEditRole => 'Edit role'; + String get phonebookEditMembership => 'Edit role'; @override - String get phonebookEditMembership => 'Edit role'; + String get phonebookEditRole => 'Edit role'; @override String get phonebookEmail => 'Email:'; @@ -2977,14 +3113,6 @@ class AppLocalizationsEn extends AppLocalizations { return 'Manage $association groups'; } - @override - String phonebookTerm(int year) { - return '$year term'; - } - - @override - String get phonebookTermChangingError => 'Error changing term'; - @override String get phonebookMember => 'Member'; @@ -3089,11 +3217,19 @@ class AppLocalizationsEn extends AppLocalizations { String get phonebookSearchUser => 'Search a user'; @override - String get phonebookTooHeavyAssociationPicture => - 'Image is too large (max 4MB)'; + String get phonebookSelectManagerGroup => 'Select the manager group'; @override - String get phonebookUpdateGroups => 'Update groups'; + String phonebookTerm(int year) { + return '$year term'; + } + + @override + String get phonebookTermChangingError => 'Error changing term'; + + @override + String get phonebookTooHeavyAssociationPicture => + 'Image is too large (max 4MB)'; @override String get phonebookUpdatedAssociation => 'Association updated'; @@ -3109,391 +3245,406 @@ class AppLocalizationsEn extends AppLocalizations { String get phonebookUpdatedMember => 'Member updated'; @override - String get phonebookUpdatingError => 'Error during update'; + String get phonebookUpdateGroups => 'Update groups'; @override - String get phonebookValidation => 'Validate'; + String get phonebookUpdatingError => 'Error during update'; @override - String get purchasesPurchases => 'Purchases'; + String get phonebookValidation => 'Validate'; @override - String get purchasesResearch => 'Search'; + String get phPhName => 'PH name'; @override - String get purchasesNoPurchasesFound => 'No purchases found'; + String get phSeePreviousJournal => 'See previous journals'; @override - String get purchasesNoTickets => 'No tickets'; + String get phSuccesDowloading => 'Successfully downloaded'; @override - String get purchasesTicketsError => 'Error loading tickets'; + String get phToHeavyFile => 'File too large'; @override - String get purchasesPurchasesError => 'Error loading purchases'; + String get purchasesAlreadyUsed => 'Already used'; @override - String get purchasesNoPurchases => 'No purchase'; + String get purchasesCancel => 'Cancel'; @override - String get purchasesTimes => 'times'; + String get purchasesHistory => 'History'; @override - String get purchasesAlreadyUsed => 'Already used'; + String get purchasesLeftScan => 'Scans remaining'; @override - String get purchasesNotPaid => 'Not validated'; + String get purchasesLoading => 'Waiting for scan'; @override - String get purchasesPleaseSelectProduct => 'Please select a product'; + String get purchasesNoPurchases => 'No purchase'; @override - String get purchasesProducts => 'Products'; + String get purchasesNoPurchasesFound => 'No purchases found'; @override - String get purchasesCancel => 'Cancel'; + String get purchasesNoScannableProducts => 'No scannable products'; @override - String get purchasesValidate => 'Validate'; + String get purchasesNoTagGiven => 'Warning, no tag entered'; @override - String get purchasesLeftScan => 'Scans remaining'; + String get purchasesNoTickets => 'No tickets'; @override - String get purchasesTag => 'Tag'; + String get purchasesNotPaid => 'Not validated'; @override - String get purchasesHistory => 'History'; + String get purchasesPleaseSelectProduct => 'Please select a product'; @override String get purchasesPleaseSelectSeller => 'Please select a seller'; @override - String get purchasesNoTagGiven => 'Warning, no tag entered'; + String get purchasesProducts => 'Products'; @override - String get purchasesTickets => 'Tickets'; + String get purchasesPurchases => 'Purchases'; @override - String get purchasesNoScannableProducts => 'No scannable products'; + String get purchasesPurchasesError => 'Error loading purchases'; @override - String get purchasesLoading => 'Waiting for scan'; + String get purchasesResearch => 'Search'; @override String get purchasesScan => 'Scan'; @override - String get raffleRaffle => 'Raffle'; + String get purchasesTag => 'Tag'; @override - String get rafflePrize => 'Prize'; + String get purchasesTickets => 'Tickets'; @override - String get rafflePrizes => 'Prizes'; + String get purchasesTicketsError => 'Error loading tickets'; @override - String get raffleActualRaffles => 'Current raffles'; + String get purchasesTimes => 'times'; @override - String get rafflePastRaffles => 'Past raffles'; + String get purchasesValidate => 'Validate'; @override - String get raffleYourTickets => 'All your tickets'; + String get raffleAccounts => 'Accounts'; @override - String get raffleCreateMenu => 'Creation menu'; + String get raffleActualPrize => 'Current prizes'; @override - String get raffleNextRaffles => 'Upcoming raffles'; + String get raffleActualRaffles => 'Current raffles'; @override - String get raffleNoTicket => 'You have no ticket'; + String get raffleAdd => 'Add'; @override - String get raffleSeeRaffleDetail => 'View prizes/tickets'; + String get raffleAddedTicket => 'Ticket added'; @override - String get raffleActualPrize => 'Current prizes'; + String get raffleAddingError => 'Error during addition'; @override - String get raffleMajorPrize => 'Major prizes'; + String get raffleAddPackTicket => 'Add ticket pack'; @override - String get raffleTakeTickets => 'Take your tickets'; + String get raffleAddPrize => 'Add'; @override - String get raffleNoTicketBuyable => 'You cannot buy tickets right now'; + String get raffleAddTypeTicketSimple => 'Add'; @override - String get raffleNoCurrentPrize => 'There are no prizes currently'; + String get raffleAlreadyExistTicket => 'Ticket already exists'; @override - String get raffleModifTombola => - 'You can modify your raffles or create new ones, all decisions must then be approved by admins'; + String get raffleAmount => 'Balance'; @override - String get raffleCreateYourRaffle => 'Your raffle creation menu'; + String get raffleBoughtTicket => 'Ticket purchased'; @override - String get rafflePossiblePrice => 'Possible prize'; + String get raffleBuyThisTicket => 'Buy this ticket'; @override - String get raffleInformation => 'Information and statistics'; + String get raffleClose => 'Close'; @override - String get raffleAccounts => 'Accounts'; + String get raffleCloseRaffle => 'Close raffle'; @override - String get raffleAdd => 'Add'; + String get raffleCloseRaffleDescription => + 'You are going to close the raffle, users will no longer be able to buy tickets. Are you sure you want to continue?'; @override - String get raffleUpdatedAmount => 'Amount updated'; + String get raffleCreateMenu => 'Creation menu'; @override - String get raffleUpdatingError => 'Error during update'; + String get raffleCreateYourRaffle => 'Your raffle creation menu'; @override String get raffleDeletedPrize => 'Prize deleted'; @override - String get raffleDeletingError => 'Error during deletion'; - - @override - String get raffleQuantity => 'Quantity'; + String get raffleDeletedTicket => 'Ticket deleted'; @override - String get raffleClose => 'Close'; + String get raffleDeletePrize => 'Delete prize'; @override - String get raffleOpen => 'Open'; + String get raffleDeletePrizeDescription => + 'You are going to delete the prize, are you sure you want to continue?'; @override - String get raffleAddTypeTicketSimple => 'Add'; + String get raffleDeleteTicket => 'Delete ticket'; @override - String get raffleAddingError => 'Error during addition'; + String get raffleDeleteTicketDescription => + 'You are going to delete the ticket, are you sure you want to continue?'; @override - String get raffleEditTypeTicketSimple => 'Edit'; + String get raffleDeletingError => 'Error during deletion'; @override - String get raffleFillField => 'Field cannot be empty'; + String get raffleDescription => 'Description'; @override - String get raffleWaiting => 'Loading'; + String get raffleDraw => 'Draw'; @override - String get raffleEditingError => 'Error during editing'; + String get raffleDrawing => 'Drawing'; @override - String get raffleAddedTicket => 'Ticket added'; + String get raffleDrawingDescription => 'Draw the prize winner?'; @override - String get raffleEditedTicket => 'Ticket edited'; + String get raffleDrawingError => 'Error during drawing'; @override - String get raffleAlreadyExistTicket => 'Ticket already exists'; + String get raffleDrawn => 'Drawn'; @override - String get raffleNumberExpected => 'An integer is expected'; + String get raffleEdit => 'Edit'; @override - String get raffleDeletedTicket => 'Ticket deleted'; + String get raffleEditedTicket => 'Ticket edited'; @override - String get raffleAddPrize => 'Add'; + String get raffleEditingError => 'Error during editing'; @override String get raffleEditPrize => 'Edit'; @override - String get raffleOpenRaffle => 'Open raffle'; + String get raffleEditRaffle => 'Edit raffle'; @override - String get raffleCloseRaffle => 'Close raffle'; + String get raffleEditTypeTicketSimple => 'Edit'; @override - String get raffleOpenRaffleDescription => - 'You are going to open the raffle, users will be able to buy tickets. You will no longer be able to modify the raffle. Are you sure you want to continue?'; + String get raffleError => 'Error'; @override - String get raffleCloseRaffleDescription => - 'You are going to close the raffle, users will no longer be able to buy tickets. Are you sure you want to continue?'; + String get raffleFillField => 'Field cannot be empty'; + + @override + String get raffleGathered => 'Collected'; @override - String get raffleNoCurrentRaffle => 'There is no ongoing raffle'; + String get raffleInformation => 'Information and statistics'; @override - String get raffleBoughtTicket => 'Ticket purchased'; + String get raffleInvalidPrice => 'Price must be greater than 0'; @override - String get raffleDrawingError => 'Error during drawing'; + String get raffleLoading => 'Loading'; @override - String get raffleInvalidPrice => 'Price must be greater than 0'; + String get raffleLockedRaffle => 'Locked raffle'; @override - String get raffleMustBePositive => 'Number must be strictly positive'; + String get raffleMajorPrize => 'Major prizes'; @override - String get raffleDraw => 'Draw'; + String get raffleModifTombola => + 'You can modify your raffles or create new ones, all decisions must then be approved by admins'; @override - String get raffleDrawn => 'Drawn'; + String get raffleMustBePositive => 'Number must be strictly positive'; @override - String get raffleError => 'Error'; + String get raffleName => 'Name'; @override - String get raffleGathered => 'Collected'; + String get raffleNextRaffles => 'Upcoming raffles'; @override - String get raffleTickets => 'Tickets'; + String get raffleNoCurrentPrize => 'There are no prizes currently'; @override - String get raffleTicket => 'ticket'; + String get raffleNoCurrentRaffle => 'There is no ongoing raffle'; @override - String get raffleWinner => 'Winner'; + String get raffleNoDescription => 'No description'; @override String get raffleNoPrize => 'No prize'; @override - String get raffleDeletePrize => 'Delete prize'; + String get raffleNotEnoughMoney => 'You don\'t have enough money'; @override - String get raffleDeletePrizeDescription => - 'You are going to delete the prize, are you sure you want to continue?'; + String get raffleNoTicket => 'You have no ticket'; @override - String get raffleDrawing => 'Drawing'; + String get raffleNoTicketBuyable => 'You cannot buy tickets right now'; @override - String get raffleDrawingDescription => 'Draw the prize winner?'; + String get raffleNoWinningTicketYet => + 'Winning tickets will be displayed here'; @override - String get raffleDeleteTicket => 'Delete ticket'; + String get raffleNumberExpected => 'An integer is expected'; @override - String get raffleDeleteTicketDescription => - 'You are going to delete the ticket, are you sure you want to continue?'; + String get raffleOpen => 'Open'; @override - String get raffleWinningTickets => 'Winning tickets'; + String get raffleOpenRaffle => 'Open raffle'; @override - String get raffleNoWinningTicketYet => - 'Winning tickets will be displayed here'; + String get raffleOpenRaffleDescription => + 'You are going to open the raffle, users will be able to buy tickets. You will no longer be able to modify the raffle. Are you sure you want to continue?'; @override - String get raffleName => 'Name'; + String get rafflePastRaffles => 'Past raffles'; @override - String get raffleDescription => 'Description'; + String get rafflePossiblePrice => 'Possible prize'; @override - String get raffleBuyThisTicket => 'Buy this ticket'; + String get rafflePrice => 'Price'; @override - String get raffleLockedRaffle => 'Locked raffle'; + String get rafflePrize => 'Prize'; @override - String get raffleUnavailableRaffle => 'Unavailable raffle'; + String get rafflePrizes => 'Prizes'; @override - String get raffleNotEnoughMoney => 'You don\'t have enough money'; + String get raffleQuantity => 'Quantity'; @override - String get raffleWinnable => 'winnable'; + String get raffleRaffle => 'Raffle'; @override - String get raffleNoDescription => 'No description'; + String get raffleSeeRaffleDetail => 'View prizes/tickets'; @override - String get raffleAmount => 'Balance'; + String get raffleTakeTickets => 'Take your tickets'; @override - String get raffleLoading => 'Loading'; + String get raffleTicket => 'ticket'; @override String get raffleTicketNumber => 'Number of tickets'; @override - String get rafflePrice => 'Price'; + String get raffleTickets => 'Tickets'; @override - String get raffleEditRaffle => 'Edit raffle'; + String get raffleUnavailableRaffle => 'Unavailable raffle'; @override - String get raffleEdit => 'Edit'; + String get raffleUpdatedAmount => 'Amount updated'; @override - String get raffleAddPackTicket => 'Add ticket pack'; + String get raffleUpdatingError => 'Error during update'; @override - String get recommendationRecommendation => 'Recommendation'; + String get raffleWaiting => 'Loading'; @override - String get recommendationTitle => 'Title'; + String get raffleWinnable => 'winnable'; @override - String get recommendationLogo => 'Logo'; + String get raffleWinner => 'Winner'; @override - String get recommendationCode => 'Code'; + String get raffleWinningTickets => 'Winning tickets'; @override - String get recommendationSummary => 'Short summary'; + String get raffleYourTickets => 'All your tickets'; @override - String get recommendationDescription => 'Description'; + String get recommendationAdd => 'Add'; @override - String get recommendationAdd => 'Add'; + String get recommendationAddedRecommendation => 'Deal added'; @override - String get recommendationEdit => 'Edit'; + String get recommendationAddImage => 'Please add an image'; @override - String get recommendationDelete => 'Delete'; + String get recommendationAddingError => 'Add failed'; @override - String get recommendationAddImage => 'Please add an image'; + String get recommendationCode => 'Code'; @override - String get recommendationAddedRecommendation => 'Deal added'; + String get recommendationCopiedCode => 'Discount code copied'; @override - String get recommendationEditedRecommendation => 'Deal updated'; + String get recommendationDelete => 'Delete'; @override - String get recommendationDeleteRecommendationConfirmation => - 'Are you sure you want to delete this deal?'; + String get recommendationDeletedRecommendation => 'Deal deleted'; @override String get recommendationDeleteRecommendation => 'Delete'; + @override + String get recommendationDeleteRecommendationConfirmation => + 'Are you sure you want to delete this deal?'; + @override String get recommendationDeletingRecommendationError => 'Error during deletion'; @override - String get recommendationDeletedRecommendation => 'Deal deleted'; + String get recommendationDescription => 'Description'; + + @override + String get recommendationEdit => 'Edit'; + + @override + String get recommendationEditedRecommendation => 'Deal updated'; + + @override + String get recommendationEditingError => 'Edit failed'; @override String get recommendationIncorrectOrMissingFields => 'Incorrect or missing fields'; @override - String get recommendationEditingError => 'Edit failed'; + String get recommendationLogo => 'Logo'; @override - String get recommendationAddingError => 'Add failed'; + String get recommendationRecommendation => 'Recommendation'; @override - String get recommendationCopiedCode => 'Discount code copied'; + String get recommendationSummary => 'Short summary'; + + @override + String get recommendationTitle => 'Title'; @override String get seedLibraryAdd => 'Add'; @@ -3633,40 +3784,40 @@ class AppLocalizationsEn extends AppLocalizations { String get seedLibraryMaturationTime => 'Maturation time'; @override - String get seedLibraryMonthJan => 'January'; - - @override - String get seedLibraryMonthFeb => 'February'; + String get seedLibraryMonthApr => 'April'; @override - String get seedLibraryMonthMar => 'March'; + String get seedLibraryMonthAug => 'August'; @override - String get seedLibraryMonthApr => 'April'; + String get seedLibraryMonthDec => 'December'; @override - String get seedLibraryMonthMay => 'May'; + String get seedLibraryMonthFeb => 'February'; @override - String get seedLibraryMonthJun => 'June'; + String get seedLibraryMonthJan => 'January'; @override String get seedLibraryMonthJul => 'July'; @override - String get seedLibraryMonthAug => 'August'; + String get seedLibraryMonthJun => 'June'; @override - String get seedLibraryMonthSep => 'September'; + String get seedLibraryMonthMar => 'March'; @override - String get seedLibraryMonthOct => 'October'; + String get seedLibraryMonthMay => 'May'; @override String get seedLibraryMonthNov => 'November'; @override - String get seedLibraryMonthDec => 'December'; + String get seedLibraryMonthOct => 'October'; + + @override + String get seedLibraryMonthSep => 'September'; @override String get seedLibraryMyPlants => 'My plants'; @@ -3755,20 +3906,20 @@ class AppLocalizationsEn extends AppLocalizations { @override String get seedLibrarySeed => 'Seed'; - @override - String get seedLibrarySeeds => 'seeds'; - @override String get seedLibrarySeedDeposit => 'Plant deposit'; @override String get seedLibrarySeedLibrary => 'Seed library'; + @override + String get seedLibrarySeedQuantity => 'Seed quantity:'; + @override String get seedLibrarySeedQuantitySimple => 'Seed quantity'; @override - String get seedLibrarySeedQuantity => 'Seed quantity:'; + String get seedLibrarySeeds => 'seeds'; @override String get seedLibraryShowDeadPlants => 'Show dead plants'; @@ -3798,10 +3949,10 @@ class AppLocalizationsEn extends AppLocalizations { String get seedLibraryStock => 'Available stock'; @override - String get seedLibrarySummer => 'Summer'; + String get seedLibraryStocks => 'Stocks'; @override - String get seedLibraryStocks => 'Stocks'; + String get seedLibrarySummer => 'Summer'; @override String get seedLibraryTimeUntilMaturation => 'Time until maturation:'; @@ -3819,10 +3970,10 @@ class AppLocalizationsEn extends AppLocalizations { String get seedLibraryUpdatedInformation => 'Information updated'; @override - String get seedLibraryUpdatedSpecies => 'Species updated'; + String get seedLibraryUpdatedPlant => 'Plant updated'; @override - String get seedLibraryUpdatedPlant => 'Plant updated'; + String get seedLibraryUpdatedSpecies => 'Species updated'; @override String get seedLibraryUpdatingError => 'Error updating'; @@ -3862,9 +4013,15 @@ class AppLocalizationsEn extends AppLocalizations { String get settingsChangingPassword => 'Do you really want to change your password?'; + @override + String get settingsChooseLanguage => 'Choose a language'; + @override String get settingsConfirmPassword => 'Confirm password'; + @override + String get settingsConnexion => 'Connection'; + @override String get settingsCopied => 'Copied!'; @@ -3878,230 +4035,222 @@ class AppLocalizationsEn extends AppLocalizations { String get settingsDeleteLogs => 'Delete logs?'; @override - String get settingsDeleteNotificationLogs => 'Delete notification logs?'; - - @override - String get settingsDetelePersonalData => 'Delete my personal data'; - - @override - String get settingsDetelePersonalDataDesc => - 'This action notifies the administrator that you want to delete your personal data.'; - - @override - String get settingsDeleting => 'Deleting'; - - @override - String get settingsEdit => 'Edit'; + String get settingsDeleteMyAccount => 'Delete my account'; @override - String get settingsEditAccount => 'Edit account'; + String get settingsDeleteMyAccountDescription => + 'This action will send a request to the administrator to delete your account.'; @override - String get settingsEmail => 'Email'; + String get settingsDeleteMyAccountError => + 'Error sending account deletion request'; @override - String get settingsEmptyField => 'This field cannot be empty'; + String get settingsDeleteNotificationLogs => 'Delete notification logs?'; @override - String get settingsErrorProfilePicture => 'Error editing profile picture'; + String get settingsDeleting => 'Deleting'; @override - String get settingsErrorSendingDemand => 'Error sending request'; + String get settingsDeletionAsked => + 'Your account deletion request has been sent to the administrator.'; @override - String get settingsEventsIcal => 'Ical link for events'; + String get settingsDetelePersonalData => 'Delete my personal data'; @override - String get settingsExpectingDate => 'Expected birth date'; + String get settingsDetelePersonalDataDesc => + 'This action notifies the administrator that you want to delete your personal data.'; @override - String get settingsFirstname => 'First name'; + String get settingsEdit => 'Edit'; @override - String get settingsFloor => 'Floor'; + String get settingsEditAccount => 'Edit account'; @override - String get settingsHelp => 'Help'; + String get settingsEditedAccount => 'Account edited'; @override - String get settingsIcalCopied => 'Ical link copied!'; + String get settingsEmail => 'Email'; @override - String get settingsLanguage => 'Language'; + String get settingsEmptyField => 'This field cannot be empty'; @override - String get settingsLanguageVar => 'English 🇬🇧'; + String get settingsErrorProfilePicture => 'Error editing profile picture'; @override - String get settingsLogs => 'Logs'; + String get settingsErrorSendingDemand => 'Error sending request'; @override - String get settingsModules => 'Modules'; + String get settingsEvent => 'Event'; @override - String get settingsMyIcs => 'My Ical link'; + String get settingsEventsIcal => 'Ical link for events'; @override - String get settingsName => 'Last name'; + String get settingsExpectingDate => 'Expected birth date'; @override - String get settingsNewPassword => 'New password'; + String get settingsFailedToEditAccount => 'Failed to edit account'; @override - String get settingsNickname => 'Nickname'; + String get settingsFirstname => 'First name'; @override - String get settingsNotifications => 'Notifications'; + String get settingsFloor => 'Floor'; @override - String get settingsOldPassword => 'Old password'; + String get settingsHelp => 'Help'; @override - String get settingsPasswordChanged => 'Password changed'; + String get settingsHyperionVersion => 'Hyperion version'; @override - String get settingsPasswordsNotMatch => 'Passwords do not match'; + String get settingsIcal => 'Ical link'; @override - String get settingsPersonalData => 'Personal data'; + String get settingsIcalCopied => 'Ical link copied!'; @override - String get settingsPersonalisation => 'Personalization'; + String get settingsIcalLinkCopied => 'Ical link copied'; @override - String get settingsPhone => 'Phone'; + String get settingsLanguage => 'Language'; @override - String get settingsProfilePicture => 'Profile picture'; + String get settingsLanguageVar => 'English 🇬🇧'; @override - String get settingsPromo => 'Promotion'; + String get settingsLogOut => 'Log out'; @override - String get settingsRepportBug => 'Report a bug'; + String get settingsLogOutDescription => 'Do you really want to log out?'; @override - String get settingsSave => 'Save'; + String get settingsLogOutSuccess => 'Logged out successfully'; @override - String get settingsSecurity => 'Security'; + String get settingsLogs => 'Logs'; @override - String get settingsSendedDemand => 'Request sent'; + String get settingsMinimalHyperionVersion => 'Minimal Hyperion version'; @override - String get settingsSettings => 'Settings'; + String get settingsModules => 'Modules'; @override - String get settingsTooHeavyProfilePicture => 'Image is too large (max 4MB)'; + String get settingsMyIcs => 'My Ical link'; @override - String get settingsUpdatedProfile => 'Profile updated'; + String get settingsName => 'Last name'; @override - String get settingsUpdatedProfilePicture => 'Profile picture updated'; + String get settingsNewPassword => 'New password'; @override - String get settingsUpdateNotification => 'Update notifications'; + String get settingsNickname => 'Nickname'; @override - String get settingsUpdatingError => 'Error updating profile'; + String settingsNotificationCounter(int active, int total) { + String _temp0 = intl.Intl.pluralLogic( + active, + locale: localeName, + other: 'notifications', + one: 'notification', + zero: 'notification', + ); + return '$active/$total active $_temp0'; + } @override - String get settingsVersion => 'Version'; + String get settingsNotifications => 'Notifications'; @override - String get settingsPasswordStrength => 'Password strength'; + String get settingsOldPassword => 'Old password'; @override - String get settingsPasswordStrengthVeryWeak => 'Very weak'; + String get settingsPasswordChanged => 'Password changed'; @override - String get settingsPasswordStrengthWeak => 'Weak'; + String get settingsPasswordsNotMatch => 'Passwords do not match'; @override - String get settingsPasswordStrengthMedium => 'Medium'; + String get settingsPersonalData => 'Personal data'; @override - String get settingsPasswordStrengthStrong => 'Strong'; + String get settingsPersonalisation => 'Personalization'; @override - String get settingsPasswordStrengthVeryStrong => 'Very strong'; + String get settingsPhone => 'Phone'; @override String get settingsPhoneNumber => 'Phone number'; @override - String get settingsValidate => 'Confirm'; + String get settingsProfile => 'Profile'; @override - String get settingsEditedAccount => 'Account edited'; + String get settingsProfilePicture => 'Profile picture'; @override - String get settingsFailedToEditAccount => 'Failed to edit account'; + String get settingsPromo => 'Promotion'; @override - String get settingsChooseLanguage => 'Choose a language'; + String get settingsRepportBug => 'Report a bug'; @override - String settingsNotificationCounter(int active, int total) { - String _temp0 = intl.Intl.pluralLogic( - active, - locale: localeName, - other: 'notifications', - one: 'notification', - zero: 'notification', - ); - return '$active/$total active $_temp0'; - } + String get settingsSave => 'Save'; @override - String get settingsEvent => 'Event'; + String get settingsSecurity => 'Security'; @override - String get settingsIcal => 'Ical link'; + String get settingsSendedDemand => 'Request sent'; + + @override + String get settingsSettings => 'Settings'; @override String get settingsSynncWithCalendar => 'Sync with calendar'; @override - String get settingsIcalLinkCopied => 'Ical link copied'; + String get settingsTooHeavyProfilePicture => 'Image is too large (max 4MB)'; @override - String get settingsProfile => 'Profile'; + String get settingsTooRecentVersion => + 'Your version of the app is too recent, please contact the administrator to fix this issue'; @override - String get settingsConnexion => 'Connection'; + String get settingsUpdatedProfile => 'Profile updated'; @override - String get settingsLogOut => 'Log out'; + String get settingsUpdatedProfilePicture => 'Profile picture updated'; @override - String get settingsLogOutDescription => 'Do you really want to log out?'; + String get settingsUpdateNotification => 'Update notifications'; @override - String get settingsLogOutSuccess => 'Logged out successfully'; + String get settingsUpdatingError => 'Error updating profile'; @override - String get settingsDeleteMyAccount => 'Delete my account'; + String get settingsValidate => 'Confirm'; @override - String get settingsDeleteMyAccountDescription => - 'This action will send a request to the administrator to delete your account.'; + String get settingsVersion => 'Version'; @override - String get settingsDeletionAsked => - 'Your account deletion request has been sent to the administrator.'; + String get toolDateRequired => 'Date required'; @override - String get settingsDeleteMyAccountError => - 'Error sending account deletion request'; + String get toolInvalidNumber => 'Invalid number'; @override - String get voteAdd => 'Add'; + String get toolSuccess => 'Success'; @override - String get voteAddMember => 'Add a member'; + String get voteAdd => 'Add'; @override String get voteAddedPretendance => 'List added'; @@ -4112,6 +4261,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get voteAddingError => 'Error adding'; + @override + String get voteAddMember => 'Add a member'; + @override String get voteAddPretendance => 'Add a list'; @@ -4127,6 +4279,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get voteAlreadyVoted => 'Vote recorded'; + @override + String get voteCanNotVote => 'You cannot vote'; + @override String get voteChooseList => 'Choose a list'; @@ -4152,20 +4307,20 @@ class AppLocalizationsEn extends AppLocalizations { String get voteDelete => 'Delete'; @override - String get voteDeletedAll => 'All deleted'; + String get voteDeleteAll => 'Delete all'; @override - String get voteDeletedPipo => 'Fake lists deleted'; + String get voteDeleteAllDescription => + 'Do you really want to delete everything?'; @override - String get voteDeletedSection => 'Section deleted'; + String get voteDeletedAll => 'All deleted'; @override - String get voteDeleteAll => 'Delete all'; + String get voteDeletedPipo => 'Fake lists deleted'; @override - String get voteDeleteAllDescription => - 'Do you really want to delete everything?'; + String get voteDeletedSection => 'Section deleted'; @override String get voteDeletePipo => 'Delete fake lists'; @@ -4213,10 +4368,10 @@ class AppLocalizationsEn extends AppLocalizations { String get voteErrorCountingVotes => 'Error counting votes'; @override - String get voteErrorResetingVotes => 'Error resetting votes'; + String get voteErrorOpeningVotes => 'Error opening votes'; @override - String get voteErrorOpeningVotes => 'Error opening votes'; + String get voteErrorResetingVotes => 'Error resetting votes'; @override String get voteIncorrectOrMissingFields => 'Incorrect or missing fields'; @@ -4233,9 +4388,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get voteNoSection => 'No section'; - @override - String get voteCanNotVote => 'You cannot vote'; - @override String get voteNoSectionList => 'No section'; @@ -4283,10 +4435,10 @@ class AppLocalizationsEn extends AppLocalizations { String get voteRole => 'Role'; @override - String get voteSectionDescription => 'Section description'; + String get voteSection => 'Section'; @override - String get voteSection => 'Section'; + String get voteSectionDescription => 'Section description'; @override String get voteSectionName => 'Section name'; @@ -4315,9 +4467,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get voteVoters => 'Voting groups'; - @override - String get voteVoteSuccess => 'Vote recorded'; - @override String get voteVotes => 'Votes'; @@ -4330,152 +4479,13 @@ class AppLocalizationsEn extends AppLocalizations { @override String get voteVotesOpened => 'Votes opened'; + @override + String get voteVoteSuccess => 'Vote recorded'; + @override String get voteWarning => 'Warning'; @override String get voteWarningMessage => 'Selection will not be saved.\nDo you want to continue?'; - - @override - String get moduleAdvert => 'Feed'; - - @override - String get moduleAdvertDescription => 'View the latest feed'; - - @override - String get moduleAmap => 'AMAP'; - - @override - String get moduleAmapDescription => 'Order your AMAP basket'; - - @override - String get moduleBooking => 'Booking'; - - @override - String get moduleBookingDescription => 'Book a room'; - - @override - String get moduleCalendar => 'Calendar'; - - @override - String get moduleCalendarDescription => 'View the calendar of events'; - - @override - String get moduleCentralisation => 'Centralisation'; - - @override - String get moduleCentralisationDescription => 'Viw all links'; - - @override - String get moduleCinema => 'Cinema'; - - @override - String get moduleCinemaDescription => 'View the cinema schedule'; - - @override - String get moduleEvent => 'Event'; - - @override - String get moduleEventDescription => 'View events'; - - @override - String get moduleFlappyBird => 'Flappy Bird'; - - @override - String get moduleFlappyBirdDescription => 'Play Flappy Bird'; - - @override - String get moduleLoan => 'Loan'; - - @override - String get moduleLoanDescription => 'See your loans'; - - @override - String get modulePhonebook => 'Phonebook'; - - @override - String get modulePhonebookDescription => 'View the phonebook'; - - @override - String get modulePurchases => 'Purchases'; - - @override - String get modulePurchasesDescription => 'View your purchases'; - - @override - String get moduleRaffle => 'Raffle'; - - @override - String get moduleRaffleDescription => 'View the raffle'; - - @override - String get moduleRecommendation => 'Recommendation'; - - @override - String get moduleRecommendationDescription => 'View the recommendations'; - - @override - String get moduleSeedLibrary => 'Seed Library'; - - @override - String get moduleSeedLibraryDescription => 'View the seed library'; - - @override - String get moduleVote => 'Vote'; - - @override - String get moduleVoteDescription => 'Vote for the campaigns'; - - @override - String get modulePh => 'PH'; - - @override - String get modulePhDescription => 'View the PH'; - - @override - String get moduleSettings => 'Settings'; - - @override - String get moduleSettingsDescription => 'Manage your settings'; - - @override - String get moduleFeed => 'Events'; - - @override - String get moduleFeedDescription => 'View the latest events'; - - @override - String get moduleStyleGuide => 'StyleGuide'; - - @override - String get moduleStyleGuideDescription => 'Style guide for developers'; - - @override - String get moduleAdmin => 'Admin'; - - @override - String get moduleAdminDescription => - 'Administration module for administrators'; - - @override - String get moduleOthers => 'Others'; - - @override - String get moduleOthersDescription => 'Other modules'; - - @override - String get modulePayment => 'Payment'; - - @override - String get modulePaymentDescription => 'Pay and see your transactions'; - - @override - String get toolInvalidNumber => 'Invalid number'; - - @override - String get toolDateRequired => 'Date required'; - - @override - String get toolSuccess => 'Success'; } diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 18af78314c..bfaa4b1320 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -9,244 +9,94 @@ class AppLocalizationsFr extends AppLocalizations { AppLocalizationsFr([String locale = 'fr']) : super(locale); @override - String get dateToday => 'Aujourd\'hui'; - - @override - String get dateYesterday => 'Hier'; - - @override - String get dateTomorrow => 'Demain'; - - @override - String get dateAt => 'à'; - - @override - String get dateFrom => 'de'; - - @override - String get dateTo => 'à'; - - @override - String get dateBetweenDays => 'au'; - - @override - String get dateStarting => 'Commence'; - - @override - String get dateLast => ''; - - @override - String get dateUntil => 'Jusqu\'au'; - - @override - String get feedFilterAll => 'Tous'; - - @override - String get feedFilterPending => 'En attente'; - - @override - String get feedFilterApproved => 'Approuvés'; - - @override - String get feedFilterRejected => 'Rejetés'; - - @override - String get feedEmptyAll => 'Aucun événement disponible'; - - @override - String get feedEmptyPending => 'Aucun événement en attente de validation'; - - @override - String get feedEmptyApproved => 'Aucun événement approuvé'; - - @override - String get feedEmptyRejected => 'Aucun événement rejeté'; - - @override - String get feedEventManagement => 'Gestion des événements'; - - @override - String get feedTitle => 'Titre'; - - @override - String get feedLocation => 'Lieu'; - - @override - String get feedSGDate => 'Date du SG'; - - @override - String get feedSGExternalLink => 'Lien externe du SG'; - - @override - String get feedCreateEvent => 'Créer l\'événement'; - - @override - String get feedNotification => 'Envoyer une notification'; - - @override - String get feedPleaseSelectAnAssociation => - 'Veuillez sélectionner une association'; - - @override - String get feedReject => 'Rejeter'; - - @override - String get feedApprove => 'Approuver'; - - @override - String get feedEnded => 'Terminé'; - - @override - String get feedOngoing => 'En cours'; - - @override - String get feedFilter => 'Filtrer'; - - @override - String get feedAssociation => 'Association'; - - @override - String feedAssociationEvent(String name) { - return 'Event de $name'; - } - - @override - String get feedEditEvent => 'Modifier l\'événement'; + String get moduleCentralassociation => 'Centralassociation'; @override - String get feedManageAssociationEvents => - 'Gérer les événements de l\'association'; - - @override - String get feedNews => 'Calendrier'; - - @override - String get feedNewsType => 'Type d\'actualité'; - - @override - String get feedNoAssociationEvents => 'Aucun événement d\'association'; - - @override - String get feedApply => 'Appliquer'; - - @override - String get feedAdmin => 'Administration'; - - @override - String get feedCreateAnEvent => 'Créer un événement'; - - @override - String get feedManageRequests => 'Demandes de publication'; - - @override - String get feedNoNewsAvailable => 'Aucune actualité disponible'; + String get moduleCentralassociationDescription => + 'Agrégateur des liens des associations'; @override - String get feedRefresh => 'Actualiser'; - - @override - String get feedPleaseProvideASGExternalLink => - 'Veuillez entrer un lien externe pour le SG'; - - @override - String get feedPleaseProvideASGDate => 'Veuillez entrer une date de SG'; - - @override - String feedShotgunIn(String time) { - return 'Shotgun $time'; - } - - @override - String feedVoteIn(String time) { - return 'Vote $time'; - } - - @override - String get feedCantOpenLink => 'Impossible d\'ouvrir le lien'; - - @override - String get feedGetReady => 'Prépare-toi !'; + String get adminAccountTypes => 'Types de compte'; @override - String get eventActionCampaign => 'Tu peux voter'; + String get adminAdd => 'Ajouter'; @override - String get eventActionEvent => 'Tu es invité'; + String get adminAddAssociation => 'Ajouter une association'; @override - String get eventActionCampaignSubtitle => 'Votez maintenant'; + String get adminAddedGroup => 'Groupe créé'; @override - String get eventActionEventSubtitle => 'Répondez à l\'invitation'; + String get adminAddedLoaner => 'Préteur ajouté'; @override - String get eventActionCampaignButton => 'Voter'; + String get adminAddedMember => 'Membre ajouté'; @override - String get eventActionEventButton => 'Réserver'; + String get adminAddedSchool => 'École créée'; @override - String get eventActionCampaignValidated => 'J\'ai voté !'; + String get adminAddedStructure => 'Structure ajoutée'; @override - String get eventActionEventValidated => 'Je viens !'; + String get adminAddGroup => 'Ajouter un groupe'; @override - String get adminAccountTypes => 'Types de compte'; + String get adminAddingError => 'Erreur lors de l\'ajout'; @override - String get adminAdd => 'Ajouter'; + String get adminAddingMember => 'Ajout d\'un membre'; @override - String get adminAddGroup => 'Ajouter un groupe'; + String get adminAddLoaningGroup => 'Ajouter un groupe de prêt'; @override String get adminAddMember => 'Ajouter un membre'; @override - String get adminAddedGroup => 'Groupe créé'; - - @override - String get adminAddedLoaner => 'Préteur ajouté'; + String get adminAddSchool => 'Ajouter une école'; @override - String get adminAddedMember => 'Membre ajouté'; + String get adminAddStructure => 'Ajouter une structure'; @override - String get adminAddingError => 'Erreur lors de l\'ajout'; + String get adminAdmin => 'Admin'; @override - String get adminAddingMember => 'Ajout d\'un membre'; + String get adminAdministration => 'Administration'; @override - String get adminAddLoaningGroup => 'Ajouter un groupe de prêt'; + String get adminAssociationCreated => 'Association créée'; @override - String get adminAddSchool => 'Ajouter une école'; + String get adminAssociationCreationError => + 'Échec de la création de l\'association'; @override - String get adminAddStructure => 'Ajouter une structure'; + String get adminAssociationMembership => 'Adhésion'; @override - String get adminAddedSchool => 'École créée'; + String get adminAssociationMembershipName => 'Nom de l\'adhésion'; @override - String get adminAddedStructure => 'Structure ajoutée'; + String get adminAssociationMembershipsManagement => 'Gestion des adhésions'; @override - String get adminEditedStructure => 'Structure modifiée'; + String get adminAssociationName => 'Nom de l\'association'; @override - String get adminAdministration => 'Administration'; + String get adminAssociations => 'Associations'; @override - String get adminAssociationMembership => 'Adhésion'; + String get adminAssociationsMemberships => 'Adhésions'; @override - String get adminAssociationMembershipName => 'Nom de l\'adhésion'; + String get adminAssociationUpdated => 'Association mise à jour'; @override - String get adminAssociationsMemberships => 'Adhésions'; + String get adminAssociationUpdateError => + 'Échec de la mise à jour de l\'association'; @override String adminBankAccountHolder(String bankAccountHolder) { @@ -266,12 +116,25 @@ class AppLocalizationsFr extends AppLocalizations { @override String get adminBicError => 'Le BIC doit faire 11 caractères'; + @override + String get adminChooseAssociationManagerGroup => + 'Choisir un groupe gestionnaire pour l\'association'; + + @override + String get adminChooseGroup => 'Choisir un groupe'; + + @override + String get adminChooseGroupManager => 'Groupe gestionnaire de l\'adhésion'; + @override String get adminCity => 'Ville'; @override String get adminClearFilters => 'Effacer les filtres'; + @override + String get adminContent => 'Contenu'; + @override String get adminCountry => 'Pays'; @@ -308,17 +171,24 @@ class AppLocalizationsFr extends AppLocalizations { @override String get adminDeletedAssociationMembership => 'Adhésion supprimée'; + @override + String get adminDeletedGroup => 'Groupe supprimé'; + + @override + String get adminDeletedSchool => 'École supprimée'; + @override String get adminDeleteGroup => 'Supprimer le groupe'; @override - String get adminDeletedGroup => 'Groupe supprimé'; + String get adminDeleteGroupConfirmation => + 'Êtes-vous sûr de vouloir supprimer ce groupe ?'; @override String get adminDeleteSchool => 'Supprimer l\'école ?'; @override - String get adminDeletedSchool => 'École supprimée'; + String get adminDeleteUsers => 'Supprimer des utilisateurs'; @override String get adminDeleting => 'Suppression'; @@ -333,16 +203,21 @@ class AppLocalizationsFr extends AppLocalizations { String get adminEdit => 'Modifier'; @override - String get adminEditStructure => 'Modifier la structure'; + String adminEditAssociation(String associationName) { + return 'Modifier l\'association : $associationName'; + } @override - String get adminEditMembership => 'Modifier l\'adhésion'; + String get adminEditedStructure => 'Structure modifiée'; @override - String get adminEmptyDate => 'Date vide'; + String get adminEditGroup => 'Modifier le groupe'; @override - String get adminEmptyFieldError => 'Le nom ne peut pas être vide'; + String get adminEditMembership => 'Modifier l\'adhésion'; + + @override + String get adminEditStructure => 'Modifier la structure'; @override String get adminEmailFailed => @@ -351,6 +226,12 @@ class AppLocalizationsFr extends AppLocalizations { @override String get adminEmailRegex => 'Email Regex'; + @override + String get adminEmptyDate => 'Date vide'; + + @override + String get adminEmptyFieldError => 'Le nom ne peut pas être vide'; + @override String get adminEmptyUser => 'Utilisateur vide'; @@ -367,139 +248,143 @@ class AppLocalizationsFr extends AppLocalizations { String get adminError => 'Erreur'; @override - String get adminFilters => 'Filtres'; - - @override - String get adminGroup => 'Groupe'; - - @override - String get adminGroups => 'Groupes'; - - @override - String get adminIban => 'IBAN'; - - @override - String get adminIbanError => 'L\'IBAN doit faire 27 caractères'; + String get adminFailedToDeleteGroup => 'Échec de la suppression du groupe'; @override - String get adminLoaningGroup => 'Groupe de prêt'; + String get adminFailedToInviteUsers => + 'Échec de l\'invitation des utilisateurs'; @override - String get adminLooking => 'Recherche'; + String get adminFailedToSendNotification => + 'Échec de l\'envoi de la notification'; @override - String get adminManager => 'Administrateur de la structure'; + String get adminFailedToUpdateAssociationLogo => + 'Échec de la mise à jour du logo de l\'association'; @override - String get adminMaximum => 'Maximum'; + String get adminFilters => 'Filtres'; @override - String get adminMembers => 'Membres'; + String get adminGroup => 'Groupe'; @override - String get adminMembershipAddingError => - 'Erreur lors de l\'ajout (surement dû à une superposition de dates)'; + String get adminGroupNotification => 'Notification de groupe'; @override - String get adminMemberships => 'Adhésions'; + String get adminGroups => 'Groupes'; @override - String get adminMembershipUpdatingError => - 'Erreur lors de la modification (surement dû à une superposition de dates)'; + String get adminGroupsManagement => 'Gestion des groupes'; @override - String get adminMinimum => 'Minimum'; + String get adminIban => 'IBAN'; @override - String get adminModifyModuleVisibility => 'Visibilité des modules'; + String get adminIbanError => 'L\'IBAN doit faire 27 caractères'; @override - String get adminName => 'Nom'; + String get adminImportList => 'Importer une liste'; @override - String get adminNoGroup => 'Aucun groupe'; + String get adminImportUsersDescription => + 'Importer des utilisateurs depuis un fichier CSV. Le fichier CSV doit contenir une adresse email par ligne.'; @override - String get adminNoManager => 'Aucun manager n\'est sélectionné'; + String get adminInvite => 'Inviter'; @override - String get adminNoMember => 'Aucun membre'; + String get adminInvitedUsers => 'Utilisateurs invités'; @override - String get adminNoMoreLoaner => 'Aucun prêteur n\'est disponible'; + String get adminInviteUsers => 'Inviter des utilisateurs'; @override - String get adminNoSchool => 'Sans école'; + String adminInviteUsersCounter(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count utilisateurs', + one: '$count utilisateur', + zero: 'Aucun utilisateur', + ); + return '$_temp0 dans le fichier CSV'; + } @override - String get adminRemoveGroupMember => 'Supprimer le membre du groupe ?'; + String get adminLoaningGroup => 'Groupe de prêt'; @override - String get adminResearch => 'Recherche'; + String get adminLooking => 'Recherche'; @override - String get adminSchools => 'Écoles'; + String get adminManageAssociations => 'Gérer les associations'; @override - String get adminShortId => 'Short ID (3 lettres)'; + String get adminManageMembers => 'Gérer les membres'; @override - String get adminShortIdError => 'Le short ID doit faire 3 caractères'; + String get adminManagePaiementStructures => + 'Gérer les structures du module de paiement'; @override - String get adminSiegeAddress => 'Adresse du siège'; + String get adminManager => 'Administrateur de la structure'; @override - String get adminSiret => 'SIRET'; + String adminManagerGroup(String groupName) { + return 'Groupe gestionnaire : $groupName'; + } @override - String get adminSiretError => 'SIRET must be 14 digits'; + String get adminManageUserGroups => 'Gérer les groupes d\'utilisateurs'; @override - String get adminStreet => 'Numéro et rue'; + String get adminManageUsersAssociationMemberships => + 'Gérer les adhésions des utilisateurs'; @override - String get adminStructures => 'Structures'; + String get adminMaximum => 'Maximum'; @override - String get adminStartDate => 'Date de début'; + String get adminMembers => 'Membres'; @override - String get adminStartDateMaximal => 'Date de début maximale'; + String get adminMembershipAddingError => + 'Erreur lors de l\'ajout (surement dû à une superposition de dates)'; @override - String get adminStartDateMinimal => 'Date de début minimale'; + String get adminMemberships => 'Adhésions'; @override - String get adminUndefinedBankAccountHolder => - 'Titulaire du compte bancaire non défini'; + String get adminMembershipUpdatingError => + 'Erreur lors de la modification (surement dû à une superposition de dates)'; @override - String get adminUpdatedAssociationMembership => 'Adhésion modifiée'; + String get adminMinimum => 'Minimum'; @override - String get adminUpdatedGroup => 'Groupe modifié'; + String get adminModifyPermissions => 'Modifier les permissions'; @override - String get adminUpdatedMembership => 'Adhésion modifiée'; + String get adminName => 'Nom'; @override - String get adminUpdatingError => 'Erreur lors de la modification'; + String get adminNoGroup => 'Aucun groupe'; @override - String get adminUser => 'Utilisateur'; + String get adminNoManager => 'Aucun manager n\'est sélectionné'; @override - String get adminValidateFilters => 'Valider les filtres'; + String get adminNoMember => 'Aucun membre'; @override - String get adminVisibilities => 'Visibilités'; + String get adminNoMoreLoaner => 'Aucun prêteur n\'est disponible'; @override - String get adminZipcode => 'Code postal'; + String get adminNoSchool => 'Sans école'; @override - String get adminGroupNotification => 'Notification de groupe'; + String get adminNotificationSent => 'Notification envoyée'; @override String adminNotifyGroup(String groupName) { @@ -507,172 +392,111 @@ class AppLocalizationsFr extends AppLocalizations { } @override - String get adminTitle => 'Titre'; - - @override - String get adminContent => 'Contenu'; - - @override - String get adminSend => 'Envoyer'; - - @override - String get adminNotificationSent => 'Notification envoyée'; - - @override - String get adminFailedToSendNotification => - 'Échec de l\'envoi de la notification'; - - @override - String get adminGroupsManagement => 'Gestion des groupes'; - - @override - String get adminEditGroup => 'Modifier le groupe'; - - @override - String get adminManageMembers => 'Gérer les membres'; - - @override - String get adminDeleteGroupConfirmation => - 'Êtes-vous sûr de vouloir supprimer ce groupe ?'; - - @override - String get adminFailedToDeleteGroup => 'Échec de la suppression du groupe'; - - @override - String get adminUsersAndGroups => 'Utilisateurs et groupes'; - - @override - String get adminUsersManagement => 'Gestion des utilisateurs'; - - @override - String get adminUsersManagementDescription => - 'Gérer les utilisateurs de l\'application'; - - @override - String get adminManageUserGroups => 'Gérer les groupes d\'utilisateurs'; - - @override - String get adminSendNotificationToGroup => - 'Envoyer une notification à un groupe'; + String get adminPaiement => 'Paiement'; @override String get adminPaiementModule => 'Module de paiement'; @override - String get adminPaiement => 'Paiement'; + String get adminRemoveGroupMember => 'Supprimer le membre du groupe ?'; @override - String get adminManagePaiementStructures => - 'Gérer les structures du module de paiement'; + String get adminResearch => 'Recherche'; @override - String get adminManageUsersAssociationMemberships => - 'Gérer les adhésions des utilisateurs'; + String get adminSchools => 'Écoles'; @override - String get adminAssociationMembershipsManagement => 'Gestion des adhésions'; + String get adminSelectGroupAssociationManager => + 'Séléctionner roupe gestionnaire de l\'association'; @override - String get adminChooseGroupManager => 'Groupe gestionnaire de l\'adhésion'; + String get adminSelectManager => 'Sélectionner un gestionnaire'; @override - String get adminSelectManager => 'Sélectionner un gestionnaire'; + String get adminSend => 'Envoyer'; @override - String get adminImportList => 'Importer une liste'; + String get adminSendNotificationToGroup => + 'Envoyer une notification à un groupe'; @override - String get adminImportUsersDescription => - 'Importer des utilisateurs depuis un fichier CSV. Le fichier CSV doit contenir une adresse email par ligne.'; + String get adminShortId => 'Short ID (3 lettres)'; @override - String get adminFailedToInviteUsers => - 'Échec de l\'invitation des utilisateurs'; + String get adminShortIdError => 'Le short ID doit faire 3 caractères'; @override - String get adminDeleteUsers => 'Supprimer des utilisateurs'; + String get adminSiegeAddress => 'Adresse du siège'; @override - String get adminAdmin => 'Admin'; + String get adminSiret => 'SIRET'; @override - String get adminAssociations => 'Associations'; + String get adminSiretError => 'SIRET must be 14 digits'; @override - String get adminManageAssociations => 'Gérer les associations'; + String get adminStartDate => 'Date de début'; @override - String get adminAddAssociation => 'Ajouter une association'; + String get adminStartDateMaximal => 'Date de début maximale'; @override - String get adminAssociationName => 'Nom de l\'association'; + String get adminStartDateMinimal => 'Date de début minimale'; @override - String get adminSelectGroupAssociationManager => - 'Séléctionner roupe gestionnaire de l\'association'; + String get adminStreet => 'Numéro et rue'; @override - String adminEditAssociation(String associationName) { - return 'Modifier l\'association : $associationName'; - } + String get adminStructures => 'Structures'; @override - String adminManagerGroup(String groupName) { - return 'Groupe gestionnaire : $groupName'; - } + String get adminTitle => 'Titre'; @override - String get adminAssociationCreated => 'Association créée'; + String get adminTooHeavyLogo => + 'Le logo de l\'association est trop lourd, il doit faire moins de 4 Mo'; @override - String get adminAssociationUpdated => 'Association mise à jour'; + String get adminUndefinedBankAccountHolder => + 'Titulaire du compte bancaire non défini'; @override - String get adminAssociationCreationError => - 'Échec de la création de l\'association'; + String get adminUpdatedAssociationLogo => 'Logo de l\'association mis à jour'; @override - String get adminAssociationUpdateError => - 'Échec de la mise à jour de l\'association'; + String get adminUpdatedAssociationMembership => 'Adhésion modifiée'; @override - String get adminInvite => 'Inviter'; + String get adminUpdatedGroup => 'Groupe modifié'; @override - String get adminInvitedUsers => 'Utilisateurs invités'; + String get adminUpdatedMembership => 'Adhésion modifiée'; @override - String get adminInviteUsers => 'Inviter des utilisateurs'; + String get adminUpdatingError => 'Erreur lors de la modification'; @override - String adminInviteUsersCounter(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count utilisateurs', - one: '$count utilisateur', - zero: 'Aucun utilisateur', - ); - return '$_temp0 dans le fichier CSV'; - } + String get adminUser => 'Utilisateur'; @override - String get adminUpdatedAssociationLogo => 'Logo de l\'association mis à jour'; + String get adminUsersAndGroups => 'Utilisateurs et groupes'; @override - String get adminTooHeavyLogo => - 'Le logo de l\'association est trop lourd, il doit faire moins de 4 Mo'; + String get adminUsersManagement => 'Gestion des utilisateurs'; @override - String get adminFailedToUpdateAssociationLogo => - 'Échec de la mise à jour du logo de l\'association'; + String get adminUsersManagementDescription => + 'Gérer les utilisateurs de l\'application'; @override - String get adminChooseGroup => 'Choisir un groupe'; + String get adminValidateFilters => 'Valider les filtres'; @override - String get adminChooseAssociationManagerGroup => - 'Choisir un groupe gestionnaire pour l\'association'; + String get adminVisibilities => 'Visibilités'; + + @override + String get adminZipcode => 'Code postal'; @override String get advertAdd => 'Ajouter'; @@ -735,67 +559,67 @@ class AppLocalizationsFr extends AppLocalizations { String get advertModifyAnnouncingGroup => 'Modifier un groupe d\'annonce'; @override - String get advertNoMoreAnnouncer => 'Aucun annonceur n\'est disponible'; + String get advertMonthApr => 'Avr.'; @override - String get advertNoValue => 'Veuillez entrer une valeur'; + String get advertMonthAug => 'Août'; @override - String get advertPositiveNumber => 'Veuillez entrer un nombre positif'; + String get advertMonthDec => 'Déc.'; @override - String get advertPublishToFeed => 'Publier dans le feed'; + String get advertMonthFeb => 'Févr.'; @override - String get advertNotification => 'Envoyer une notification'; + String get advertMonthJan => 'Janv'; @override - String get advertRemovedAnnouncer => 'Annonceur supprimé'; + String get advertMonthJul => 'Juill.'; @override - String get advertRemovingError => 'Erreur lors de la suppression'; + String get advertMonthJun => 'Juin'; @override - String get advertTags => 'Tags'; + String get advertMonthMar => 'Mars'; @override - String get advertTitle => 'Titre'; + String get advertMonthMay => 'Mai'; @override - String get advertMonthJan => 'Janv'; + String get advertMonthNov => 'Nov.'; @override - String get advertMonthFeb => 'Févr.'; + String get advertMonthOct => 'Oct.'; @override - String get advertMonthMar => 'Mars'; + String get advertMonthSep => 'Sept.'; @override - String get advertMonthApr => 'Avr.'; + String get advertNoMoreAnnouncer => 'Aucun annonceur n\'est disponible'; @override - String get advertMonthMay => 'Mai'; + String get advertNotification => 'Envoyer une notification'; @override - String get advertMonthJun => 'Juin'; + String get advertNoValue => 'Veuillez entrer une valeur'; @override - String get advertMonthJul => 'Juill.'; + String get advertPositiveNumber => 'Veuillez entrer un nombre positif'; @override - String get advertMonthAug => 'Août'; + String get advertPublishToFeed => 'Publier dans le feed'; @override - String get advertMonthSep => 'Sept.'; + String get advertRemovedAnnouncer => 'Annonceur supprimé'; @override - String get advertMonthOct => 'Oct.'; + String get advertRemovingError => 'Erreur lors de la suppression'; @override - String get advertMonthNov => 'Nov.'; + String get advertTags => 'Tags'; @override - String get advertMonthDec => 'Déc.'; + String get advertTitle => 'Titre'; @override String get amapAccounts => 'Comptes'; @@ -818,12 +642,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get amapAddedUser => 'Utilisateur ajouté'; - @override - String get amapAddProduct => 'Ajouter un produit'; - - @override - String get amapAddUser => 'Ajouter un utilisateur'; - @override String get amapAddingACommand => 'Ajouter une commande'; @@ -839,6 +657,12 @@ class AppLocalizationsFr extends AppLocalizations { @override String get amapAddOrder => 'Ajouter une commande'; + @override + String get amapAddProduct => 'Ajouter un produit'; + + @override + String get amapAddUser => 'Ajouter un utilisateur'; + @override String get amapAdmin => 'Admin'; @@ -870,6 +694,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get amapCommandDate => 'Date de la commande'; + @override + String get amapCommandName => 'Nom de la commande'; + @override String get amapCommandProducts => 'Produits de la commande'; @@ -885,6 +712,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get amapDelete => 'Supprimer'; + @override + String get amapDeletedDelivery => 'Livraison supprimée'; + @override String get amapDeleteDelivery => 'Supprimer la livraison ?'; @@ -892,9 +722,6 @@ class AppLocalizationsFr extends AppLocalizations { String get amapDeleteDeliveryDescription => 'Voulez-vous vraiment supprimer cette livraison ?'; - @override - String get amapDeletedDelivery => 'Livraison supprimée'; - @override String get amapDeletedOrder => 'Commande supprimée'; @@ -954,22 +781,22 @@ class AppLocalizationsFr extends AppLocalizations { String get amapDeliveryLocked => 'Livraison verrouillée'; @override - String get amapDeliveryOn => 'Livraison le'; + String get amapDeliveryNotArchived => 'Livraison non archivée'; @override - String get amapDeliveryOpened => 'Livraison ouverte'; + String get amapDeliveryNotDelivered => 'Livraison non effectuée'; @override - String get amapDeliveryNotArchived => 'Livraison non archivée'; + String get amapDeliveryNotLocked => 'Livraison non verrouillée'; @override - String get amapDeliveryNotLocked => 'Livraison non verrouillée'; + String get amapDeliveryNotOpened => 'Livraison non ouverte'; @override - String get amapDeliveryNotDelivered => 'Livraison non effectuée'; + String get amapDeliveryOn => 'Livraison le'; @override - String get amapDeliveryNotOpened => 'Livraison non ouverte'; + String get amapDeliveryOpened => 'Livraison ouverte'; @override String get amapEditDelivery => 'Modifier la livraison'; @@ -1008,6 +835,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get amapHandlingAccount => 'Gérer les comptes'; + @override + String get amapIncorrectlyFilledForm => 'Formulaire incorrectement rempli'; + @override String get amapLoading => 'Chargement...'; @@ -1027,10 +857,10 @@ class AppLocalizationsFr extends AppLocalizations { String get amapLockedOrder => 'Commande verrouillée'; @override - String get amapLooking => 'Rechercher'; + String get amapLockingDelivery => 'Verrouiller la livraison ?'; @override - String get amapLockingDelivery => 'Verrouiller la livraison ?'; + String get amapLooking => 'Rechercher'; @override String get amapMidDay => 'Midi'; @@ -1044,9 +874,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get amapNextStep => 'Étape suivante'; - @override - String get amapNoProduct => 'Pas de produit'; - @override String get amapNoCurrentOrder => 'Pas de commande en cours'; @@ -1059,6 +886,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get amapNoOrder => 'Pas de commande'; + @override + String get amapNoProduct => 'Pas de produit'; + @override String get amapNoSelectedDelivery => 'Pas de livraison sélectionnée'; @@ -1111,10 +941,10 @@ class AppLocalizationsFr extends AppLocalizations { String get amapProduct => 'produit'; @override - String get amapProducts => 'Produits'; + String get amapProductInDelivery => 'Produit dans une livraison non terminée'; @override - String get amapProductInDelivery => 'Produit dans une livraison non terminée'; + String get amapProducts => 'Produits'; @override String get amapQuantity => 'Quantité'; @@ -1162,22 +992,19 @@ class AppLocalizationsFr extends AppLocalizations { String get bookingAdd => 'Ajouter'; @override - String get bookingAddBookingPage => 'Demande'; - - @override - String get bookingAddRoom => 'Ajouter une salle'; + String get bookingAddBooking => 'Ajouter une réservation'; @override - String get bookingAddBooking => 'Ajouter une réservation'; + String get bookingAddBookingPage => 'Demande'; @override String get bookingAddedBooking => 'Demande ajoutée'; @override - String get bookingAddedRoom => 'Salle ajoutée'; + String get bookingAddedManager => 'Gestionnaire ajouté'; @override - String get bookingAddedManager => 'Gestionnaire ajouté'; + String get bookingAddedRoom => 'Salle ajoutée'; @override String get bookingAddingError => 'Erreur lors de l\'ajout'; @@ -1185,6 +1012,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get bookingAddManager => 'Ajouter un gestionnaire'; + @override + String get bookingAddRoom => 'Ajouter une salle'; + @override String get bookingAdminPage => 'Administrateur'; @@ -1242,9 +1072,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get bookingDelete => 'Supprimer'; - @override - String get bookingDeleting => 'Suppression'; - @override String get bookingDeleteBooking => 'Suppression'; @@ -1255,19 +1082,22 @@ class AppLocalizationsFr extends AppLocalizations { @override String get bookingDeletedBooking => 'Réservation supprimée'; + @override + String get bookingDeletedManager => 'Gestionnaire supprimé'; + @override String get bookingDeletedRoom => 'Salle supprimée'; @override - String get bookingDeletedManager => 'Gestionnaire supprimé'; + String get bookingDeleteManagerConfirmation => + 'Êtes-vous sûr de vouloir supprimer ce gestionnaire ?\n\nLe gestionnaire ne doit être associé à aucune salle pour pouvoir être supprimé'; @override String get bookingDeleteRoomConfirmation => 'Êtes-vous sûr de vouloir supprimer cette salle ?\n\nLa salle ne doit avoir aucune réservation en cours ou à venir pour être supprimée'; @override - String get bookingDeleteManagerConfirmation => - 'Êtes-vous sûr de vouloir supprimer ce gestionnaire ?\n\nLe gestionnaire ne doit être associé à aucune salle pour pouvoir être supprimé'; + String get bookingDeleting => 'Suppression'; @override String get bookingDeletingBooking => 'Supprimer la réservation ?'; @@ -1285,16 +1115,16 @@ class AppLocalizationsFr extends AppLocalizations { String get bookingEditBooking => 'Modifier une réservation'; @override - String get bookingEditionError => 'Erreur lors de la modification'; + String get bookingEditedBooking => 'Réservation modifiée'; @override - String get bookingEditedBooking => 'Réservation modifiée'; + String get bookingEditedManager => 'Gestionnaire modifié'; @override String get bookingEditedRoom => 'Salle modifiée'; @override - String get bookingEditedManager => 'Gestionnaire modifié'; + String get bookingEditionError => 'Erreur lors de la modification'; @override String get bookingEditManager => 'Modifier ou supprimer un gestionnaire'; @@ -1328,10 +1158,10 @@ class AppLocalizationsFr extends AppLocalizations { String get bookingInterval => 'Intervalle'; @override - String get bookingInvalidIntervalError => 'Intervalle invalide'; + String get bookingInvalidDates => 'Dates invalides'; @override - String get bookingInvalidDates => 'Dates invalides'; + String get bookingInvalidIntervalError => 'Intervalle invalide'; @override String get bookingInvalidRoom => 'Salle invalide'; @@ -1364,14 +1194,14 @@ class AppLocalizationsFr extends AppLocalizations { String get bookingNo => 'Non'; @override - String get bookingNoCurrentBooking => 'Pas de réservation en cours'; + String get bookingNoAppointmentInReccurence => + 'Aucun créneau existe avec ces paramètres de récurrence'; @override - String get bookingNoDateError => 'Veuillez choisir une date'; + String get bookingNoCurrentBooking => 'Pas de réservation en cours'; @override - String get bookingNoAppointmentInReccurence => - 'Aucun créneau existe avec ces paramètres de récurrence'; + String get bookingNoDateError => 'Veuillez choisir une date'; @override String get bookingNoDaySelected => 'Aucun jour sélectionné'; @@ -1392,10 +1222,10 @@ class AppLocalizationsFr extends AppLocalizations { String get bookingNoReasonError => 'Veuillez entrer un motif'; @override - String get bookingNoRoomFoundError => 'Aucune salle enregistrée'; + String get bookingNoRoomFound => 'Aucune salle trouvée'; @override - String get bookingNoRoomFound => 'Aucune salle trouvée'; + String get bookingNoRoomFoundError => 'Aucune salle enregistrée'; @override String get bookingNote => 'Note'; @@ -1440,31 +1270,31 @@ class AppLocalizationsFr extends AppLocalizations { String get bookingStartHour => 'Heure de début'; @override - String get bookingWeeks => 'Semaines'; - - @override - String get bookingYes => 'Oui'; + String get bookingWeekDayFri => 'Vendredi'; @override String get bookingWeekDayMon => 'Lundi'; @override - String get bookingWeekDayTue => 'Mardi'; + String get bookingWeekDaySat => 'Samedi'; @override - String get bookingWeekDayWed => 'Mercredi'; + String get bookingWeekDaySun => 'Dimanche'; @override String get bookingWeekDayThu => 'Jeudi'; @override - String get bookingWeekDayFri => 'Vendredi'; + String get bookingWeekDayTue => 'Mardi'; @override - String get bookingWeekDaySat => 'Samedi'; + String get bookingWeekDayWed => 'Mercredi'; @override - String get bookingWeekDaySun => 'Dimanche'; + String get bookingWeeks => 'Semaines'; + + @override + String get bookingYes => 'Oui'; @override String get cinemaAdd => 'Ajouter'; @@ -1505,6 +1335,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get cinemaEmptyUrl => 'Veuillez entrer une URL'; + @override + String get cinemaGenre => 'Genre'; + @override String get cinemaImportFromTMDB => 'Importer depuis TMDB'; @@ -1515,10 +1348,7 @@ class AppLocalizationsFr extends AppLocalizations { String get cinemaIncorrectOrMissingFields => 'Champs incorrects ou manquants'; @override - String get cinemaInvalidUrl => 'URL invalide'; - - @override - String get cinemaGenre => 'Genre'; + String get cinemaInvalidUrl => 'URL invalide'; @override String get cinemaName => 'Nom'; @@ -1556,6 +1386,36 @@ class AppLocalizationsFr extends AppLocalizations { @override String get cinemaThe => 'Le'; + @override + String get dateAt => 'à'; + + @override + String get dateBetweenDays => 'au'; + + @override + String get dateFrom => 'de'; + + @override + String get dateLast => ''; + + @override + String get dateStarting => 'Commence'; + + @override + String get dateTo => 'à'; + + @override + String get dateToday => 'Aujourd\'hui'; + + @override + String get dateTomorrow => 'Demain'; + + @override + String get dateUntil => 'Jusqu\'au'; + + @override + String get dateYesterday => 'Hier'; + @override String get drawerAdmin => 'Administration'; @@ -1587,14 +1447,38 @@ class AppLocalizationsFr extends AppLocalizations { String get drawerSettings => 'Paramètres'; @override - String get eventAdd => 'Ajouter'; + String get eventActionCampaign => 'Tu peux voter'; @override - String get eventAddEvent => 'Ajouter un événement'; + String get eventActionCampaignButton => 'Voter'; + + @override + String get eventActionCampaignSubtitle => 'Votez maintenant'; + + @override + String get eventActionCampaignValidated => 'J\'ai voté !'; + + @override + String get eventActionEvent => 'Tu es invité'; + + @override + String get eventActionEventButton => 'Réserver'; + + @override + String get eventActionEventSubtitle => 'Répondez à l\'invitation'; + + @override + String get eventActionEventValidated => 'Je viens !'; + + @override + String get eventAdd => 'Ajouter'; @override String get eventAddedEvent => 'Événement ajouté'; + @override + String get eventAddEvent => 'Ajouter un événement'; + @override String get eventAddingError => 'Erreur lors de l\'ajout'; @@ -1604,27 +1488,48 @@ class AppLocalizationsFr extends AppLocalizations { @override String get eventConfirm => 'Confirmer'; - @override - String get eventConfirmEvent => 'Confirmer l\'événement ?'; - @override String get eventConfirmation => 'Confirmation'; @override String get eventConfirmed => 'Confirmé'; + @override + String get eventConfirmEvent => 'Confirmer l\'événement ?'; + @override String get eventDates => 'Dates'; @override - String get eventDecline => 'Refuser'; + String get eventDayFri => 'Vendredi'; @override - String get eventDeclineEvent => 'Refuser l\'événement ?'; + String get eventDayMon => 'Lundi'; + + @override + String get eventDaySat => 'Samedi'; + + @override + String get eventDaySun => 'Dimanche'; + + @override + String get eventDayThu => 'Jeudi'; + + @override + String get eventDayTue => 'Mardi'; + + @override + String get eventDayWed => 'Mercredi'; + + @override + String get eventDecline => 'Refuser'; @override String get eventDeclined => 'Refusé'; + @override + String get eventDeclineEvent => 'Refuser l\'événement ?'; + @override String get eventDelete => 'Supprimer'; @@ -1652,10 +1557,10 @@ class AppLocalizationsFr extends AppLocalizations { String get eventEdit => 'Modifier'; @override - String get eventEditEvent => 'Modifier un événement'; + String get eventEditedEvent => 'Événement modifié'; @override - String get eventEditedEvent => 'Événement modifié'; + String get eventEditEvent => 'Modifier un événement'; @override String get eventEditingError => 'Erreur lors de la modification'; @@ -1669,6 +1574,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get eventError => 'Erreur'; + @override + String get eventEventEvery => 'Toutes les'; + @override String get eventEventList => 'Liste des événements'; @@ -1739,10 +1647,10 @@ class AppLocalizationsFr extends AppLocalizations { String get eventNoOrganizerError => 'Veuillez entrer un organisateur'; @override - String get eventNoPlaceError => 'Veuillez entrer un lieu'; + String get eventNoPhoneRegistered => 'Numéro non renseigné'; @override - String get eventNoPhoneRegistered => 'Numéro non renseigné'; + String get eventNoPlaceError => 'Veuillez entrer un lieu'; @override String get eventNoRuleError => 'Veuillez entrer une règle de récurrence'; @@ -1783,42 +1691,147 @@ class AppLocalizationsFr extends AppLocalizations { @override String get eventTitle => 'Événements'; + @override + String get eventWeeks => 'semaines'; + @override String get eventYes => 'Oui'; @override - String get eventEventEvery => 'Toutes les'; + String get feedAdmin => 'Administration'; @override - String get eventWeeks => 'semaines'; + String get feedApply => 'Appliquer'; @override - String get eventDayMon => 'Lundi'; + String get feedApprove => 'Approuver'; @override - String get eventDayTue => 'Mardi'; + String get feedAssociation => 'Association'; @override - String get eventDayWed => 'Mercredi'; + String feedAssociationEvent(String name) { + return 'Event de $name'; + } @override - String get eventDayThu => 'Jeudi'; + String get feedCantOpenLink => 'Impossible d\'ouvrir le lien'; @override - String get eventDayFri => 'Vendredi'; + String get feedCreateAnEvent => 'Créer un événement'; @override - String get eventDaySat => 'Samedi'; + String get feedCreateEvent => 'Créer l\'événement'; @override - String get eventDaySun => 'Dimanche'; + String get feedEditEvent => 'Modifier l\'événement'; @override - String get globalConfirm => 'Confirmer'; + String get feedEmptyAll => 'Aucun événement disponible'; + + @override + String get feedEmptyApproved => 'Aucun événement approuvé'; + + @override + String get feedEmptyPending => 'Aucun événement en attente de validation'; + + @override + String get feedEmptyRejected => 'Aucun événement rejeté'; + + @override + String get feedEnded => 'Terminé'; + + @override + String get feedEventManagement => 'Gestion des événements'; + + @override + String get feedFilter => 'Filtrer'; + + @override + String get feedFilterAll => 'Tous'; + + @override + String get feedFilterApproved => 'Approuvés'; + + @override + String get feedFilterPending => 'En attente'; + + @override + String get feedFilterRejected => 'Rejetés'; + + @override + String get feedGetReady => 'Prépare-toi !'; + + @override + String get feedLocation => 'Lieu'; + + @override + String get feedManageAssociationEvents => + 'Gérer les événements de l\'association'; + + @override + String get feedManageRequests => 'Demandes de publication'; + + @override + String get feedNews => 'Calendrier'; + + @override + String get feedNewsType => 'Type d\'actualité'; + + @override + String get feedNoAssociationEvents => 'Aucun événement d\'association'; + + @override + String get feedNoNewsAvailable => 'Aucune actualité disponible'; + + @override + String get feedNotification => 'Envoyer une notification'; + + @override + String get feedOngoing => 'En cours'; + + @override + String get feedPleaseProvideASGDate => 'Veuillez entrer une date de SG'; + + @override + String get feedPleaseProvideASGExternalLink => + 'Veuillez entrer un lien externe pour le SG'; + + @override + String get feedPleaseSelectAnAssociation => + 'Veuillez sélectionner une association'; + + @override + String get feedRefresh => 'Actualiser'; + + @override + String get feedReject => 'Rejeter'; + + @override + String get feedSGDate => 'Date du SG'; + + @override + String get feedSGExternalLink => 'Lien externe du SG'; + + @override + String feedShotgunIn(String time) { + return 'Shotgun $time'; + } + + @override + String get feedTitle => 'Titre'; + + @override + String feedVoteIn(String time) { + return 'Vote $time'; + } @override String get globalCancel => 'Annuler'; + @override + String get globalConfirm => 'Confirmer'; + @override String get globalIrreversibleAction => 'Cette action est irréversible'; @@ -1843,35 +1856,29 @@ class AppLocalizationsFr extends AppLocalizations { String get homeNoEvents => 'Aucun évènement'; @override - String get homeTranslateDayShortMon => 'Lun'; + String get homeTranslateDayShortFri => 'Ven'; @override - String get homeTranslateDayShortTue => 'Mar'; + String get homeTranslateDayShortMon => 'Lun'; @override - String get homeTranslateDayShortWed => 'Mer'; + String get homeTranslateDayShortSat => 'Sam'; @override - String get homeTranslateDayShortThu => 'Jeu'; + String get homeTranslateDayShortSun => 'Dim'; @override - String get homeTranslateDayShortFri => 'Ven'; + String get homeTranslateDayShortThu => 'Jeu'; @override - String get homeTranslateDayShortSat => 'Sam'; + String get homeTranslateDayShortTue => 'Mar'; @override - String get homeTranslateDayShortSun => 'Dim'; + String get homeTranslateDayShortWed => 'Mer'; @override String get loanAdd => 'Ajouter'; - @override - String get loanAddLoan => 'Ajouter un prêt'; - - @override - String get loanAddObject => 'Ajouter un objet'; - @override String get loanAddedLoan => 'Prêt ajouté'; @@ -1885,19 +1892,13 @@ class AppLocalizationsFr extends AppLocalizations { String get loanAddingError => 'Erreur lors de l\'ajout'; @override - String get loanAdmin => 'Administrateur'; - - @override - String get loanAvailable => 'Disponible'; - - @override - String get loanAvailableMultiple => 'Disponibles'; + String get loanAddLoan => 'Ajouter un prêt'; @override - String get loanBorrowed => 'Emprunté'; + String get loanAddObject => 'Ajouter un objet'; @override - String get loanBorrowedMultiple => 'Empruntés'; + String get loanAdmin => 'Administrateur'; @override String get loanAnd => 'et'; @@ -1905,21 +1906,33 @@ class AppLocalizationsFr extends AppLocalizations { @override String get loanAssociation => 'Association'; + @override + String get loanAvailable => 'Disponible'; + @override String get loanAvailableItems => 'Objets disponibles'; + @override + String get loanAvailableMultiple => 'Disponibles'; + @override String get loanBeginDate => 'Date du début du prêt'; @override - String get loanBorrower => 'Emprunteur'; + String get loanBorrowed => 'Emprunté'; @override - String get loanCaution => 'Caution'; + String get loanBorrowedMultiple => 'Empruntés'; + + @override + String get loanBorrower => 'Emprunteur'; @override String get loanCancel => 'Annuler'; + @override + String get loanCaution => 'Caution'; + @override String get loanConfirm => 'Confirmer'; @@ -1938,9 +1951,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get loanDelete => 'Supprimer'; - @override - String get loanDeletingLoan => 'Supprimer le prêt ?'; - @override String get loanDeletedItem => 'Objet supprimé'; @@ -1956,6 +1966,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get loanDeletingItem => 'Supprimer l\'objet ?'; + @override + String get loanDeletingLoan => 'Supprimer le prêt ?'; + @override String get loanDuration => 'Durée'; @@ -1963,13 +1976,13 @@ class AppLocalizationsFr extends AppLocalizations { String get loanEdit => 'Modifier'; @override - String get loanEditItem => 'Modifier l\'objet'; + String get loanEditedRoom => 'Salle modifiée'; @override - String get loanEditLoan => 'Modifier le prêt'; + String get loanEditItem => 'Modifier l\'objet'; @override - String get loanEditedRoom => 'Salle modifiée'; + String get loanEditLoan => 'Modifier le prêt'; @override String get loanEndDate => 'Date de fin du prêt'; @@ -1994,19 +2007,19 @@ class AppLocalizationsFr extends AppLocalizations { 'Des champs sont manquants ou incorrects'; @override - String get loanInvalidNumber => 'Veuillez entrer un nombre'; + String get loanInvalidDates => 'Les dates ne sont pas valides'; @override - String get loanInvalidDates => 'Les dates ne sont pas valides'; + String get loanInvalidNumber => 'Veuillez entrer un nombre'; @override String get loanItem => 'Objet'; @override - String get loanItems => 'Objets'; + String get loanItemHandling => 'Gestion des objets'; @override - String get loanItemHandling => 'Gestion des objets'; + String get loanItems => 'Objets'; @override String get loanItemSelected => 'objet sélectionné'; @@ -2054,13 +2067,10 @@ class AppLocalizationsFr extends AppLocalizations { String get loanNoLoan => 'Aucun prêt'; @override - String get loanNoReturnedDate => 'Pas de date de retour'; - - @override - String get loanQuantity => 'Quantité'; + String get loanNone => 'Aucun'; @override - String get loanNone => 'Aucun'; + String get loanNoReturnedDate => 'Pas de date de retour'; @override String get loanNote => 'Note'; @@ -2086,6 +2096,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get loanPrevious => 'Précédent'; + @override + String get loanQuantity => 'Quantité'; + @override String get loanReturned => 'Rendu'; @@ -2155,15 +2168,15 @@ class AppLocalizationsFr extends AppLocalizations { @override String get loginRaffles => 'Tombolas'; - @override - String get loginSignIn => 'Se connecter'; - @override String get loginRegister => 'S\'inscrire'; @override String get loginShortDescription => 'L\'application de l\'associatif'; + @override + String get loginSignIn => 'Se connecter'; + @override String get loginUpcomingEvents => 'Les évènements à venir'; @@ -2171,35 +2184,169 @@ class AppLocalizationsFr extends AppLocalizations { String get loginUpcomingScreenings => 'Les prochaines séances'; @override - String get othersCheckInternetConnection => - 'Veuillez vérifier votre connexion internet'; + String get moduleAdmin => 'Admin'; @override - String get othersRetry => 'Réessayer'; + String get moduleAdminDescription => + 'Gérer les utilisateurs, groupes et structures'; @override - String get othersTooOldVersion => - 'Votre version de l\'application est trop ancienne.\n\nVeuillez mettre à jour l\'application.'; + String get moduleAdvert => 'Feed'; @override - String get othersUnableToConnectToServer => - 'Impossible de se connecter au serveur'; + String get moduleAdvertDescription => 'Gérer les feeds'; @override - String get othersVersion => 'Version'; + String get moduleAmap => 'AMAP'; @override - String get othersNoModule => - 'Aucun module disponible, veuillez réessayer ultérieurement 😢😢'; + String get moduleAmapDescription => 'Gérer les livraisons et les produits'; + + @override + String get moduleBooking => 'Réservation'; + + @override + String get moduleBookingDescription => + 'Gérer les réservations, les salles et les managers'; + + @override + String get moduleCalendar => 'Calendrier'; + + @override + String get moduleCalendarDescription => + 'Consulter les événements et les activités'; + + @override + String get moduleCentralisation => 'Centralisation'; + + @override + String get moduleCentralisationDescription => + 'Gérer la centralisation des données'; + + @override + String get moduleCinema => 'Cinéma'; + + @override + String get moduleCinemaDescription => 'Gérer les séances de cinéma'; + + @override + String get moduleEvent => 'Événement'; + + @override + String get moduleEventDescription => + 'Gérer les événements et les participants'; + + @override + String get moduleFeed => 'Events'; + + @override + String get moduleFeedDescription => 'Consulter les événements'; + + @override + String get moduleFlappyBird => 'Flappy Bird'; + + @override + String get moduleFlappyBirdDescription => + 'Jouer à Flappy Bird et consulter le classement'; + + @override + String get moduleLoan => 'Prêt'; + + @override + String get moduleLoanDescription => 'Gérer les prêts et les articles'; + + @override + String get moduleOthers => 'Autres'; + + @override + String get moduleOthersDescription => 'Afficher les autres modules'; + + @override + String get modulePayment => 'Paiement'; + + @override + String get modulePaymentDescription => + 'Gérer les paiements, les statistiques et les appareils'; + + @override + String get modulePh => 'PH'; + + @override + String get modulePhDescription => + 'Gérer les PH, les formulaires et les administrateurs'; + + @override + String get modulePhonebook => 'Annuaire'; + + @override + String get modulePhonebookDescription => + 'Gérer les associations, les membres et les administrateurs'; + + @override + String get modulePurchases => 'Achats'; + + @override + String get modulePurchasesDescription => + 'Gérer les achats, les tickets et l\'historique'; + + @override + String get moduleRaffle => 'Tombola'; + + @override + String get moduleRaffleDescription => + 'Gérer les tombolas, les prix et les tickets'; + + @override + String get moduleRecommendation => 'Bons plans'; + + @override + String get moduleRecommendationDescription => + 'Gérer les recommandations, les informations et les administrateurs'; + + @override + String get moduleSeedLibrary => 'Grainothèque'; + + @override + String get moduleSeedLibraryDescription => + 'Gérer les graines, les espèces et les stocks'; + + @override + String get moduleSettings => 'Paramètres'; + + @override + String get moduleSettingsDescription => + 'Gérer les paramètres de l\'application'; + + @override + String get moduleStyleGuide => 'StyleGuide'; + + @override + String get moduleStyleGuideDescription => + 'Explore the UI components and styles used in Titan'; + + @override + String get moduleVote => 'Vote'; + + @override + String get moduleVoteDescription => + 'Gérer les votes, les sections et les candidats'; @override String get othersAdmin => 'Admin'; + @override + String get othersCheckInternetConnection => + 'Veuillez vérifier votre connexion internet'; + @override String get othersError => 'Une erreur est survenue'; @override - String get othersNoValue => 'Veuillez entrer une valeur'; + String get othersImageError => 'Erreur lors de l\'ajout de l\'image'; + + @override + String get othersImageSizeTooBig => + 'La taille de l\'image ne doit pas dépasser 4 Mio'; @override String get othersInvalidNumber => 'Veuillez entrer un nombre'; @@ -2208,11 +2355,26 @@ class AppLocalizationsFr extends AppLocalizations { String get othersNoDateError => 'Veuillez entrer une date'; @override - String get othersImageSizeTooBig => - 'La taille de l\'image ne doit pas dépasser 4 Mio'; + String get othersNoModule => + 'Aucun module disponible, veuillez réessayer ultérieurement 😢😢'; @override - String get othersImageError => 'Erreur lors de l\'ajout de l\'image'; + String get othersNoValue => 'Veuillez entrer une valeur'; + + @override + String get othersRetry => 'Réessayer'; + + @override + String get othersTooOldVersion => + 'Votre version de l\'application est trop ancienne.\n\nVeuillez mettre à jour l\'application.'; + + @override + String othersUnableToConnectToServer(String url) { + return 'Impossible de se connecter au serveur : $url'; + } + + @override + String get othersVersion => 'Version'; @override String get paiementAccept => 'Accepter'; @@ -2339,9 +2501,6 @@ class AppLocalizationsFr extends AppLocalizations { String get paiementDeleteSellerDescription => 'Voulez-vous vraiment supprimer ce vendeur ?'; - @override - String get paiementDeleteSuccessfully => 'Supprimé avec succès'; - @override String get paiementDeleteStore => 'Supprimer le magasin'; @@ -2352,6 +2511,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get paiementDeleteStoreError => 'Impossible de supprimer le magasin'; + @override + String get paiementDeleteSuccessfully => 'Supprimé avec succès'; + @override String get paiementDeletingSellerError => 'Erreur lors de la suppression du vendeur'; @@ -2636,11 +2798,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get paiementStoreDeleted => 'Magasin supprimée'; - @override - String paiementStructureManagement(String structure) { - return 'Gestion de $structure'; - } - @override String get paiementStoreName => 'Nom du magasin'; @@ -2650,6 +2807,11 @@ class AppLocalizationsFr extends AppLocalizations { @override String get paiementStructureAdmin => 'Administrateur de la structure'; + @override + String paiementStructureManagement(String structure) { + return 'Gestion de $structure'; + } + @override String get paiementSuccededTransaction => 'Paiement réussi'; @@ -2715,62 +2877,50 @@ class AppLocalizationsFr extends AppLocalizations { 'Vous êtes sur le point de transférer la structure à '; @override - String get phAddNewJournal => 'Ajouter un nouveau journal'; - - @override - String get phNameField => 'Nom : '; - - @override - String get phDateField => 'Date : '; - - @override - String get phDelete => 'Voulez-vous vraiment supprimer ce journal ?'; - - @override - String get phIrreversibleAction => 'Cette action est irréversible'; + String get phAdd => 'Ajouter'; @override - String get phToHeavyFile => 'Fichier trop volumineux'; + String get phAdded => 'Ajouté'; @override - String get phAddPdfFile => 'Ajouter un fichier PDF'; + String get phAddingFileError => 'Erreur d\'ajout'; @override - String get phEditPdfFile => 'Modifier le fichier PDF'; + String get phAddNewJournal => 'Ajouter un nouveau journal'; @override - String get phPhName => 'Nom du PH'; + String get phAddPdfFile => 'Ajouter un fichier PDF'; @override String get phDate => 'Date'; @override - String get phAdded => 'Ajouté'; + String get phDateField => 'Date : '; @override - String get phEdited => 'Modifié'; + String get phDelete => 'Voulez-vous vraiment supprimer ce journal ?'; @override - String get phAddingFileError => 'Erreur d\'ajout'; + String get phEdit => 'Modifier'; @override - String get phMissingInformatonsOrPdf => - 'Informations manquantes ou fichier PDF manquant'; + String get phEdited => 'Modifié'; @override - String get phAdd => 'Ajouter'; + String get phEditPdfFile => 'Modifier le fichier PDF'; @override - String get phEdit => 'Modifier'; + String get phIrreversibleAction => 'Cette action est irréversible'; @override - String get phSeePreviousJournal => 'Voir les anciens journaux'; + String get phMissingInformatonsOrPdf => + 'Informations manquantes ou fichier PDF manquant'; @override - String get phNoJournalInDatabase => 'Pas encore de PH dans la base de donnée'; + String get phNameField => 'Nom : '; @override - String get phSuccesDowloading => 'Téléchargé avec succès'; + String get phNoJournalInDatabase => 'Pas encore de PH dans la base de donnée'; @override String get phonebookAdd => 'Ajouter'; @@ -2827,15 +2977,15 @@ class AppLocalizationsFr extends AppLocalizations { @override String get phonebookCancel => 'Annuler'; + @override + String get phonebookChangeTermConfirm => + 'Êtes-vous sûr de vouloir changer tout le mandat ?\nCette action est irréversible !'; + @override String phonebookChangeTermYear(int year) { return 'Passer au mandat $year'; } - @override - String get phonebookChangeTermConfirm => - 'Êtes-vous sûr de vouloir changer tout le mandat ?\nCette action est irréversible !'; - @override String get phonebookClose => 'Fermer'; @@ -2861,10 +3011,10 @@ class AppLocalizationsFr extends AppLocalizations { } @override - String get phonebookDeactivatingError => 'Erreur lors de la désactivation'; + String get phonebookDeactivating => 'Désactiver l\'association ?'; @override - String get phonebookDetail => 'Détail :'; + String get phonebookDeactivatingError => 'Erreur lors de la désactivation'; @override String get phonebookDelete => 'Supprimer'; @@ -2872,11 +3022,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get phonebookDeleteAssociation => 'Supprimer l\'association'; - @override - String phonebookDeleteSelectedAssociation(String association) { - return 'Supprimer l\'association $association ?'; - } - @override String get phonebookDeleteAssociationDescription => 'Ceci va supprimer l\'historique de l\'association'; @@ -2891,12 +3036,14 @@ class AppLocalizationsFr extends AppLocalizations { String get phonebookDeleteRole => 'Supprimer le rôle'; @override - String phonebookDeleteUserRole(String name) { - return 'Supprimer le rôle de l\'utilisateur $name ?'; + String phonebookDeleteSelectedAssociation(String association) { + return 'Supprimer l\'association $association ?'; } @override - String get phonebookDeactivating => 'Désactiver l\'association ?'; + String phonebookDeleteUserRole(String name) { + return 'Supprimer le rôle de l\'utilisateur $name ?'; + } @override String get phonebookDeleting => 'Suppression'; @@ -2907,6 +3054,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get phonebookDescription => 'Description'; + @override + String get phonebookDetail => 'Détail :'; + @override String get phonebookEdit => 'Modifier'; @@ -2924,10 +3074,10 @@ class AppLocalizationsFr extends AppLocalizations { String get phonebookEditAssociationMembers => 'Gérer les membres'; @override - String get phonebookEditRole => 'Modifier le rôle'; + String get phonebookEditMembership => 'Modifier le rôle'; @override - String get phonebookEditMembership => 'Modifier le rôle'; + String get phonebookEditRole => 'Modifier le rôle'; @override String get phonebookEmail => 'Email :'; @@ -3011,15 +3161,6 @@ class AppLocalizationsFr extends AppLocalizations { return 'Gérer les groupes de $association'; } - @override - String phonebookTerm(int year) { - return 'Mandat $year'; - } - - @override - String get phonebookTermChangingError => - 'Erreur lors du changement de mandat'; - @override String get phonebookMember => 'Membre'; @@ -3124,11 +3265,21 @@ class AppLocalizationsFr extends AppLocalizations { String get phonebookSearchUser => 'Rechercher un utilisateur'; @override - String get phonebookTooHeavyAssociationPicture => - 'L\'image est trop lourde (max 4Mo)'; + String get phonebookSelectManagerGroup => + 'Sélectionner le groupe de managers'; @override - String get phonebookUpdateGroups => 'Mettre à jour les groupes'; + String phonebookTerm(int year) { + return 'Mandat $year'; + } + + @override + String get phonebookTermChangingError => + 'Erreur lors du changement de mandat'; + + @override + String get phonebookTooHeavyAssociationPicture => + 'L\'image est trop lourde (max 4Mo)'; @override String get phonebookUpdatedAssociation => 'Association modifiée'; @@ -3144,392 +3295,407 @@ class AppLocalizationsFr extends AppLocalizations { String get phonebookUpdatedMember => 'Membre modifié'; @override - String get phonebookUpdatingError => 'Erreur lors de la modification'; + String get phonebookUpdateGroups => 'Mettre à jour les groupes'; @override - String get phonebookValidation => 'Valider'; + String get phonebookUpdatingError => 'Erreur lors de la modification'; @override - String get purchasesPurchases => 'Achats'; + String get phonebookValidation => 'Valider'; @override - String get purchasesResearch => 'Rechercher'; + String get phPhName => 'Nom du PH'; @override - String get purchasesNoPurchasesFound => 'Aucun achat trouvé'; + String get phSeePreviousJournal => 'Voir les anciens journaux'; @override - String get purchasesNoTickets => 'Aucun ticket'; + String get phSuccesDowloading => 'Téléchargé avec succès'; @override - String get purchasesTicketsError => 'Erreur lors du chargement des tickets'; + String get phToHeavyFile => 'Fichier trop volumineux'; @override - String get purchasesPurchasesError => 'Erreur lors du chargement des achats'; + String get purchasesAlreadyUsed => 'Déjà utilisé'; @override - String get purchasesNoPurchases => 'Aucun achat'; + String get purchasesCancel => 'Annuler'; @override - String get purchasesTimes => 'fois'; + String get purchasesHistory => 'Historique'; @override - String get purchasesAlreadyUsed => 'Déjà utilisé'; + String get purchasesLeftScan => 'Scans restants'; @override - String get purchasesNotPaid => 'Non validé'; + String get purchasesLoading => 'En attente de scan'; @override - String get purchasesPleaseSelectProduct => 'Veuillez sélectionner un produit'; + String get purchasesNoPurchases => 'Aucun achat'; @override - String get purchasesProducts => 'Produits'; + String get purchasesNoPurchasesFound => 'Aucun achat trouvé'; @override - String get purchasesCancel => 'Annuler'; + String get purchasesNoScannableProducts => 'Aucun produit scannable'; @override - String get purchasesValidate => 'Valider'; + String get purchasesNoTagGiven => 'Attention, aucun tag n\'a été entré'; @override - String get purchasesLeftScan => 'Scans restants'; + String get purchasesNoTickets => 'Aucun ticket'; @override - String get purchasesTag => 'Tag'; + String get purchasesNotPaid => 'Non validé'; @override - String get purchasesHistory => 'Historique'; + String get purchasesPleaseSelectProduct => 'Veuillez sélectionner un produit'; @override String get purchasesPleaseSelectSeller => 'Veuillez sélectionner un vendeur'; @override - String get purchasesNoTagGiven => 'Attention, aucun tag n\'a été entré'; + String get purchasesProducts => 'Produits'; @override - String get purchasesTickets => 'Tickets'; + String get purchasesPurchases => 'Achats'; @override - String get purchasesNoScannableProducts => 'Aucun produit scannable'; + String get purchasesPurchasesError => 'Erreur lors du chargement des achats'; @override - String get purchasesLoading => 'En attente de scan'; + String get purchasesResearch => 'Rechercher'; @override String get purchasesScan => 'Scanner'; @override - String get raffleRaffle => 'Tombola'; + String get purchasesTag => 'Tag'; @override - String get rafflePrize => 'Lot'; + String get purchasesTickets => 'Tickets'; @override - String get rafflePrizes => 'Lots'; + String get purchasesTicketsError => 'Erreur lors du chargement des tickets'; @override - String get raffleActualRaffles => 'Tombola en cours'; + String get purchasesTimes => 'fois'; @override - String get rafflePastRaffles => 'Tombola passés'; + String get purchasesValidate => 'Valider'; @override - String get raffleYourTickets => 'Tous vos tickets'; + String get raffleAccounts => 'Comptes'; @override - String get raffleCreateMenu => 'Menu de Création'; + String get raffleActualPrize => 'Lots actuels'; @override - String get raffleNextRaffles => 'Prochaines tombolas'; + String get raffleActualRaffles => 'Tombola en cours'; @override - String get raffleNoTicket => 'Vous n\'avez pas de ticket'; + String get raffleAdd => 'Ajouter'; @override - String get raffleSeeRaffleDetail => 'Voir lots/tickets'; + String get raffleAddedTicket => 'Ticket ajouté'; @override - String get raffleActualPrize => 'Lots actuels'; + String get raffleAddingError => 'Erreur lors de l\'ajout'; @override - String get raffleMajorPrize => 'Lot Majeurs'; + String get raffleAddPackTicket => 'Ajouter un pack de ticket'; @override - String get raffleTakeTickets => 'Prendre vos tickets'; + String get raffleAddPrize => 'Ajouter'; @override - String get raffleNoTicketBuyable => - 'Vous ne pouvez pas achetez de billets pour l\'instant'; + String get raffleAddTypeTicketSimple => 'Ajouter'; @override - String get raffleNoCurrentPrize => 'Il n\'y a aucun lots actuellement'; + String get raffleAlreadyExistTicket => 'Le ticket existe déjà'; @override - String get raffleModifTombola => - 'Vous pouvez modifiez vos tombolas ou en créer de nouvelles, toute décision doit ensuite être prise par les admins'; + String get raffleAmount => 'Solde'; @override - String get raffleCreateYourRaffle => 'Votre menu de création de tombolas'; + String get raffleBoughtTicket => 'Ticket acheté'; @override - String get rafflePossiblePrice => 'Prix possible'; + String get raffleBuyThisTicket => 'Acheter ce ticket'; @override - String get raffleInformation => 'Information et Statistiques'; + String get raffleClose => 'Fermer'; @override - String get raffleAccounts => 'Comptes'; + String get raffleCloseRaffle => 'Fermer la tombola'; @override - String get raffleAdd => 'Ajouter'; + String get raffleCloseRaffleDescription => + 'Vous allez fermer la tombola, les utilisateurs ne pourront plus acheter de tickets. Êtes-vous sûr de vouloir continuer ?'; @override - String get raffleUpdatedAmount => 'Montant mis à jour'; + String get raffleCreateMenu => 'Menu de Création'; @override - String get raffleUpdatingError => 'Erreur lors de la mise à jour'; + String get raffleCreateYourRaffle => 'Votre menu de création de tombolas'; @override String get raffleDeletedPrize => 'Lot supprimé'; @override - String get raffleDeletingError => 'Erreur lors de la suppression'; + String get raffleDeletedTicket => 'Ticket supprimé'; @override - String get raffleQuantity => 'Quantité'; + String get raffleDeletePrize => 'Supprimer le lot'; @override - String get raffleClose => 'Fermer'; + String get raffleDeletePrizeDescription => + 'Vous allez supprimer le lot, êtes-vous sûr de vouloir continuer ?'; @override - String get raffleOpen => 'Ouvrir'; + String get raffleDeleteTicket => 'Supprimer le ticket'; @override - String get raffleAddTypeTicketSimple => 'Ajouter'; + String get raffleDeleteTicketDescription => + 'Vous allez supprimer le ticket, êtes-vous sûr de vouloir continuer ?'; @override - String get raffleAddingError => 'Erreur lors de l\'ajout'; + String get raffleDeletingError => 'Erreur lors de la suppression'; @override - String get raffleEditTypeTicketSimple => 'Modifier'; + String get raffleDescription => 'Description'; @override - String get raffleFillField => 'Le champ ne peut pas être vide'; + String get raffleDraw => 'Tirer'; @override - String get raffleWaiting => 'Chargement'; + String get raffleDrawing => 'Tirage'; @override - String get raffleEditingError => 'Erreur lors de la modification'; + String get raffleDrawingDescription => 'Tirer le gagnant du lot ?'; @override - String get raffleAddedTicket => 'Ticket ajouté'; + String get raffleDrawingError => 'Erreur lors du tirage'; + + @override + String get raffleDrawn => 'Tiré'; + + @override + String get raffleEdit => 'Modifier'; @override String get raffleEditedTicket => 'Ticket modifié'; @override - String get raffleAlreadyExistTicket => 'Le ticket existe déjà'; + String get raffleEditingError => 'Erreur lors de la modification'; @override - String get raffleNumberExpected => 'Un entier est attendu'; + String get raffleEditPrize => 'Modifier'; @override - String get raffleDeletedTicket => 'Ticket supprimé'; + String get raffleEditRaffle => 'Modifier la tombola'; @override - String get raffleAddPrize => 'Ajouter'; + String get raffleEditTypeTicketSimple => 'Modifier'; @override - String get raffleEditPrize => 'Modifier'; + String get raffleError => 'Erreur'; @override - String get raffleOpenRaffle => 'Ouvrir la tombola'; + String get raffleFillField => 'Le champ ne peut pas être vide'; @override - String get raffleCloseRaffle => 'Fermer la tombola'; + String get raffleGathered => 'Récolté'; @override - String get raffleOpenRaffleDescription => - 'Vous allez ouvrir la tombola, les utilisateurs pourront acheter des tickets. Vous ne pourrez plus modifier la tombola. Êtes-vous sûr de vouloir continuer ?'; + String get raffleInformation => 'Information et Statistiques'; @override - String get raffleCloseRaffleDescription => - 'Vous allez fermer la tombola, les utilisateurs ne pourront plus acheter de tickets. Êtes-vous sûr de vouloir continuer ?'; + String get raffleInvalidPrice => 'Le prix doit être supérieur à 0'; @override - String get raffleNoCurrentRaffle => 'Il n\'y a aucune tombola en cours'; + String get raffleLoading => 'Chargement'; @override - String get raffleBoughtTicket => 'Ticket acheté'; + String get raffleLockedRaffle => 'Tombola verrouillée'; @override - String get raffleDrawingError => 'Erreur lors du tirage'; + String get raffleMajorPrize => 'Lot Majeurs'; @override - String get raffleInvalidPrice => 'Le prix doit être supérieur à 0'; + String get raffleModifTombola => + 'Vous pouvez modifiez vos tombolas ou en créer de nouvelles, toute décision doit ensuite être prise par les admins'; @override String get raffleMustBePositive => 'Le nombre doit être strictement positif'; @override - String get raffleDraw => 'Tirer'; + String get raffleName => 'Nom'; @override - String get raffleDrawn => 'Tiré'; + String get raffleNextRaffles => 'Prochaines tombolas'; @override - String get raffleError => 'Erreur'; + String get raffleNoCurrentPrize => 'Il n\'y a aucun lots actuellement'; @override - String get raffleGathered => 'Récolté'; + String get raffleNoCurrentRaffle => 'Il n\'y a aucune tombola en cours'; @override - String get raffleTickets => 'Tickets'; + String get raffleNoDescription => 'Aucune description'; @override - String get raffleTicket => 'ticket'; + String get raffleNoPrize => 'Aucun lot'; @override - String get raffleWinner => 'Gagnant'; + String get raffleNotEnoughMoney => 'Vous n\'avez pas assez d\'argent'; + + @override + String get raffleNoTicket => 'Vous n\'avez pas de ticket'; @override - String get raffleNoPrize => 'Aucun lot'; + String get raffleNoTicketBuyable => + 'Vous ne pouvez pas achetez de billets pour l\'instant'; @override - String get raffleDeletePrize => 'Supprimer le lot'; + String get raffleNoWinningTicketYet => + 'Les tickets gagnants seront affichés ici'; @override - String get raffleDeletePrizeDescription => - 'Vous allez supprimer le lot, êtes-vous sûr de vouloir continuer ?'; + String get raffleNumberExpected => 'Un entier est attendu'; @override - String get raffleDrawing => 'Tirage'; + String get raffleOpen => 'Ouvrir'; @override - String get raffleDrawingDescription => 'Tirer le gagnant du lot ?'; + String get raffleOpenRaffle => 'Ouvrir la tombola'; @override - String get raffleDeleteTicket => 'Supprimer le ticket'; + String get raffleOpenRaffleDescription => + 'Vous allez ouvrir la tombola, les utilisateurs pourront acheter des tickets. Vous ne pourrez plus modifier la tombola. Êtes-vous sûr de vouloir continuer ?'; @override - String get raffleDeleteTicketDescription => - 'Vous allez supprimer le ticket, êtes-vous sûr de vouloir continuer ?'; + String get rafflePastRaffles => 'Tombola passés'; @override - String get raffleWinningTickets => 'Tickets gagnants'; + String get rafflePossiblePrice => 'Prix possible'; @override - String get raffleNoWinningTicketYet => - 'Les tickets gagnants seront affichés ici'; + String get rafflePrice => 'Prix'; @override - String get raffleName => 'Nom'; + String get rafflePrize => 'Lot'; @override - String get raffleDescription => 'Description'; + String get rafflePrizes => 'Lots'; @override - String get raffleBuyThisTicket => 'Acheter ce ticket'; + String get raffleQuantity => 'Quantité'; @override - String get raffleLockedRaffle => 'Tombola verrouillée'; + String get raffleRaffle => 'Tombola'; @override - String get raffleUnavailableRaffle => 'Tombola indisponible'; + String get raffleSeeRaffleDetail => 'Voir lots/tickets'; @override - String get raffleNotEnoughMoney => 'Vous n\'avez pas assez d\'argent'; + String get raffleTakeTickets => 'Prendre vos tickets'; @override - String get raffleWinnable => 'gagnable'; + String get raffleTicket => 'ticket'; @override - String get raffleNoDescription => 'Aucune description'; + String get raffleTicketNumber => 'Nombre de ticket'; @override - String get raffleAmount => 'Solde'; + String get raffleTickets => 'Tickets'; @override - String get raffleLoading => 'Chargement'; + String get raffleUnavailableRaffle => 'Tombola indisponible'; @override - String get raffleTicketNumber => 'Nombre de ticket'; + String get raffleUpdatedAmount => 'Montant mis à jour'; @override - String get rafflePrice => 'Prix'; + String get raffleUpdatingError => 'Erreur lors de la mise à jour'; @override - String get raffleEditRaffle => 'Modifier la tombola'; + String get raffleWaiting => 'Chargement'; @override - String get raffleEdit => 'Modifier'; + String get raffleWinnable => 'gagnable'; @override - String get raffleAddPackTicket => 'Ajouter un pack de ticket'; + String get raffleWinner => 'Gagnant'; @override - String get recommendationRecommendation => 'Bons plans'; + String get raffleWinningTickets => 'Tickets gagnants'; @override - String get recommendationTitle => 'Titre'; + String get raffleYourTickets => 'Tous vos tickets'; @override - String get recommendationLogo => 'Logo'; + String get recommendationAdd => 'Ajouter'; @override - String get recommendationCode => 'Code'; + String get recommendationAddedRecommendation => 'Bon plan ajouté'; @override - String get recommendationSummary => 'Court résumé'; + String get recommendationAddImage => 'Veuillez ajouter une image'; @override - String get recommendationDescription => 'Description'; + String get recommendationAddingError => 'Échec de l\'ajout'; @override - String get recommendationAdd => 'Ajouter'; + String get recommendationCode => 'Code'; @override - String get recommendationEdit => 'Modifier'; + String get recommendationCopiedCode => 'Code de réduction copié'; @override String get recommendationDelete => 'Supprimer'; @override - String get recommendationAddImage => 'Veuillez ajouter une image'; - - @override - String get recommendationAddedRecommendation => 'Bon plan ajouté'; + String get recommendationDeletedRecommendation => 'Bon plan supprimé'; @override - String get recommendationEditedRecommendation => 'Bon plan modifié'; + String get recommendationDeleteRecommendation => 'Suppresion'; @override String get recommendationDeleteRecommendationConfirmation => 'Êtes-vous sûr de vouloir supprimer ce bon plan ?'; - @override - String get recommendationDeleteRecommendation => 'Suppresion'; - @override String get recommendationDeletingRecommendationError => 'Erreur lors de la suppression'; @override - String get recommendationDeletedRecommendation => 'Bon plan supprimé'; + String get recommendationDescription => 'Description'; + + @override + String get recommendationEdit => 'Modifier'; + + @override + String get recommendationEditedRecommendation => 'Bon plan modifié'; + + @override + String get recommendationEditingError => 'Échec de la modification'; @override String get recommendationIncorrectOrMissingFields => 'Champs incorrects ou manquants'; @override - String get recommendationEditingError => 'Échec de la modification'; + String get recommendationLogo => 'Logo'; @override - String get recommendationAddingError => 'Échec de l\'ajout'; + String get recommendationRecommendation => 'Bons plans'; @override - String get recommendationCopiedCode => 'Code de réduction copié'; + String get recommendationSummary => 'Court résumé'; + + @override + String get recommendationTitle => 'Titre'; @override String get seedLibraryAdd => 'Ajouter'; @@ -3671,40 +3837,40 @@ class AppLocalizationsFr extends AppLocalizations { String get seedLibraryMaturationTime => 'Temps de maturation'; @override - String get seedLibraryMonthJan => 'Janvier'; - - @override - String get seedLibraryMonthFeb => 'Février'; + String get seedLibraryMonthApr => 'Avril'; @override - String get seedLibraryMonthMar => 'Mars'; + String get seedLibraryMonthAug => 'Août'; @override - String get seedLibraryMonthApr => 'Avril'; + String get seedLibraryMonthDec => 'Décembre'; @override - String get seedLibraryMonthMay => 'Mai'; + String get seedLibraryMonthFeb => 'Février'; @override - String get seedLibraryMonthJun => 'Juin'; + String get seedLibraryMonthJan => 'Janvier'; @override String get seedLibraryMonthJul => 'Juillet'; @override - String get seedLibraryMonthAug => 'Août'; + String get seedLibraryMonthJun => 'Juin'; @override - String get seedLibraryMonthSep => 'Septembre'; + String get seedLibraryMonthMar => 'Mars'; @override - String get seedLibraryMonthOct => 'Octobre'; + String get seedLibraryMonthMay => 'Mai'; @override String get seedLibraryMonthNov => 'Novembre'; @override - String get seedLibraryMonthDec => 'Décembre'; + String get seedLibraryMonthOct => 'Octobre'; + + @override + String get seedLibraryMonthSep => 'Septembre'; @override String get seedLibraryMyPlants => 'Mes plantes'; @@ -3795,20 +3961,20 @@ class AppLocalizationsFr extends AppLocalizations { @override String get seedLibrarySeed => 'Graine'; - @override - String get seedLibrarySeeds => 'graines'; - @override String get seedLibrarySeedDeposit => 'Dépôt de plantes'; @override String get seedLibrarySeedLibrary => 'Grainothèque'; + @override + String get seedLibrarySeedQuantity => 'Quantité de graines :'; + @override String get seedLibrarySeedQuantitySimple => 'Quantité de graines'; @override - String get seedLibrarySeedQuantity => 'Quantité de graines :'; + String get seedLibrarySeeds => 'graines'; @override String get seedLibraryShowDeadPlants => 'Afficher les plantes mortes'; @@ -3838,10 +4004,10 @@ class AppLocalizationsFr extends AppLocalizations { String get seedLibraryStock => 'Stock disponible'; @override - String get seedLibrarySummer => 'Été'; + String get seedLibraryStocks => 'Stocks'; @override - String get seedLibraryStocks => 'Stocks'; + String get seedLibrarySummer => 'Été'; @override String get seedLibraryTimeUntilMaturation => 'Temps avant maturation :'; @@ -3859,10 +4025,10 @@ class AppLocalizationsFr extends AppLocalizations { String get seedLibraryUpdatedInformation => 'Informations modifiées'; @override - String get seedLibraryUpdatedSpecies => 'Espèce modifiée'; + String get seedLibraryUpdatedPlant => 'Plante modifiée'; @override - String get seedLibraryUpdatedPlant => 'Plante modifiée'; + String get seedLibraryUpdatedSpecies => 'Espèce modifiée'; @override String get seedLibraryUpdatingError => 'Erreur lors de la modification'; @@ -3902,9 +4068,15 @@ class AppLocalizationsFr extends AppLocalizations { String get settingsChangingPassword => 'Voulez-vous vraiment changer votre mot de passe ?'; + @override + String get settingsChooseLanguage => 'Choix de la langue'; + @override String get settingsConfirmPassword => 'Confirmer le mot de passe'; + @override + String get settingsConnexion => 'Connexion'; + @override String get settingsCopied => 'Copié !'; @@ -3917,10 +4089,28 @@ class AppLocalizationsFr extends AppLocalizations { @override String get settingsDeleteLogs => 'Supprimer les logs ?'; + @override + String get settingsDeleteMyAccount => 'Supprimer mon compte'; + + @override + String get settingsDeleteMyAccountDescription => + 'Cette action notifie l\'administrateur que vous souhaitez supprimer votre compte.'; + + @override + String get settingsDeleteMyAccountError => + 'Erreur lors de la demande de suppression de compte'; + @override String get settingsDeleteNotificationLogs => 'Supprimer les logs des notifications ?'; + @override + String get settingsDeleting => 'Suppresion'; + + @override + String get settingsDeletionAsked => + 'Demande de suppression de compte envoyée'; + @override String get settingsDetelePersonalData => 'Supprimer mes données personnelles'; @@ -3928,15 +4118,15 @@ class AppLocalizationsFr extends AppLocalizations { String get settingsDetelePersonalDataDesc => 'Cette action notifie l\'administrateur que vous souhaitez supprimer vos données personnelles.'; - @override - String get settingsDeleting => 'Suppresion'; - @override String get settingsEdit => 'Modifier'; @override String get settingsEditAccount => 'Modifier mon profil'; + @override + String get settingsEditedAccount => 'Compte modifié avec succès'; + @override String get settingsEmail => 'Email'; @@ -3951,12 +4141,19 @@ class AppLocalizationsFr extends AppLocalizations { String get settingsErrorSendingDemand => 'Erreur lors de l\'envoi de la demande'; + @override + String get settingsEvent => 'Événement'; + @override String get settingsEventsIcal => 'Lien Ical des événements'; @override String get settingsExpectingDate => 'Date de naissance attendue'; + @override + String get settingsFailedToEditAccount => + 'Échec de la modification du compte'; + @override String get settingsFirstname => 'Prénom'; @@ -3967,189 +4164,156 @@ class AppLocalizationsFr extends AppLocalizations { String get settingsHelp => 'Aide'; @override - String get settingsIcalCopied => 'Lien Ical copié !'; - - @override - String get settingsLanguage => 'Langue'; - - @override - String get settingsLanguageVar => 'Français 🇫🇷'; - - @override - String get settingsLogs => 'Logs'; - - @override - String get settingsModules => 'Modules'; - - @override - String get settingsMyIcs => 'Mon lien Ical'; - - @override - String get settingsName => 'Nom'; - - @override - String get settingsNewPassword => 'Nouveau mot de passe'; - - @override - String get settingsNickname => 'Surnom'; - - @override - String get settingsNotifications => 'Notifications'; - - @override - String get settingsOldPassword => 'Ancien mot de passe'; + String get settingsHyperionVersion => 'Version d\'Hyperion'; @override - String get settingsPasswordChanged => 'Mot de passe changé'; + String get settingsIcal => 'Lien Ical'; @override - String get settingsPasswordsNotMatch => - 'Les mots de passe ne correspondent pas'; + String get settingsIcalCopied => 'Lien Ical copié !'; @override - String get settingsPersonalData => 'Données personnelles'; + String get settingsIcalLinkCopied => 'Lien Ical copié dans le presse-papier'; @override - String get settingsPersonalisation => 'Personnalisation'; + String get settingsLanguage => 'Langue'; @override - String get settingsPhone => 'Téléphone'; + String get settingsLanguageVar => 'Français 🇫🇷'; @override - String get settingsProfilePicture => 'Photo de profil'; + String get settingsLogOut => 'Se déconnecter'; @override - String get settingsPromo => 'Promotion'; + String get settingsLogOutDescription => + 'Êtes-vous sûr de vouloir vous déconnecter ?'; @override - String get settingsRepportBug => 'Signaler un bug'; + String get settingsLogOutSuccess => 'Déconnexion réussie'; @override - String get settingsSave => 'Enregistrer'; + String get settingsLogs => 'Logs'; @override - String get settingsSecurity => 'Sécurité'; + String get settingsMinimalHyperionVersion => 'Version minimale d\'Hyperion'; @override - String get settingsSendedDemand => 'Demande envoyée'; + String get settingsModules => 'Modules'; @override - String get settingsSettings => 'Paramètres'; + String get settingsMyIcs => 'Mon lien Ical'; @override - String get settingsTooHeavyProfilePicture => - 'L\'image est trop lourde (max 4Mo)'; + String get settingsName => 'Nom'; @override - String get settingsUpdatedProfile => 'Profil modifié'; + String get settingsNewPassword => 'Nouveau mot de passe'; @override - String get settingsUpdatedProfilePicture => 'Photo de profil modifiée'; + String get settingsNickname => 'Surnom'; @override - String get settingsUpdateNotification => 'Mettre à jour les notifications'; + String settingsNotificationCounter(int active, int total) { + String _temp0 = intl.Intl.pluralLogic( + active, + locale: localeName, + other: 'activées', + one: 'activée', + zero: 'activée', + ); + return '$active/$total $_temp0'; + } @override - String get settingsUpdatingError => - 'Erreur lors de la modification du profil'; + String get settingsNotifications => 'Notifications'; @override - String get settingsVersion => 'Version'; + String get settingsOldPassword => 'Ancien mot de passe'; @override - String get settingsPasswordStrength => 'Force du mot de passe'; + String get settingsPasswordChanged => 'Mot de passe changé'; @override - String get settingsPasswordStrengthVeryWeak => 'Très faible'; + String get settingsPasswordsNotMatch => + 'Les mots de passe ne correspondent pas'; @override - String get settingsPasswordStrengthWeak => 'Faible'; + String get settingsPersonalData => 'Données personnelles'; @override - String get settingsPasswordStrengthMedium => 'Moyen'; + String get settingsPersonalisation => 'Personnalisation'; @override - String get settingsPasswordStrengthStrong => 'Fort'; + String get settingsPhone => 'Téléphone'; @override - String get settingsPasswordStrengthVeryStrong => 'Très fort'; + String get settingsPhoneNumber => 'Numéro de téléphone'; @override - String get settingsPhoneNumber => 'Numéro de téléphone'; + String get settingsProfile => 'Profil'; @override - String get settingsValidate => 'Valider'; + String get settingsProfilePicture => 'Photo de profil'; @override - String get settingsEditedAccount => 'Compte modifié avec succès'; + String get settingsPromo => 'Promotion'; @override - String get settingsFailedToEditAccount => - 'Échec de la modification du compte'; + String get settingsRepportBug => 'Signaler un bug'; @override - String get settingsChooseLanguage => 'Choix de la langue'; + String get settingsSave => 'Enregistrer'; @override - String settingsNotificationCounter(int active, int total) { - String _temp0 = intl.Intl.pluralLogic( - active, - locale: localeName, - other: 'activées', - one: 'activée', - zero: 'activée', - ); - return '$active/$total $_temp0'; - } + String get settingsSecurity => 'Sécurité'; @override - String get settingsEvent => 'Événement'; + String get settingsSendedDemand => 'Demande envoyée'; @override - String get settingsIcal => 'Lien Ical'; + String get settingsSettings => 'Paramètres'; @override String get settingsSynncWithCalendar => 'Synchroniser avec votre calendrier'; @override - String get settingsIcalLinkCopied => 'Lien Ical copié dans le presse-papier'; + String get settingsTooHeavyProfilePicture => + 'L\'image est trop lourde (max 4Mo)'; @override - String get settingsProfile => 'Profil'; + String get settingsTooRecentVersion => + 'Votre version de l\'application est trop récente, contactez un administrateur pour résoudre ce problème'; @override - String get settingsConnexion => 'Connexion'; + String get settingsUpdatedProfile => 'Profil modifié'; @override - String get settingsLogOut => 'Se déconnecter'; + String get settingsUpdatedProfilePicture => 'Photo de profil modifiée'; @override - String get settingsLogOutDescription => - 'Êtes-vous sûr de vouloir vous déconnecter ?'; + String get settingsUpdateNotification => 'Mettre à jour les notifications'; @override - String get settingsLogOutSuccess => 'Déconnexion réussie'; + String get settingsUpdatingError => + 'Erreur lors de la modification du profil'; @override - String get settingsDeleteMyAccount => 'Supprimer mon compte'; + String get settingsValidate => 'Valider'; @override - String get settingsDeleteMyAccountDescription => - 'Cette action notifie l\'administrateur que vous souhaitez supprimer votre compte.'; + String get settingsVersion => 'Version'; @override - String get settingsDeletionAsked => - 'Demande de suppression de compte envoyée'; + String get toolDateRequired => 'Date requise'; @override - String get settingsDeleteMyAccountError => - 'Erreur lors de la demande de suppression de compte'; + String get toolInvalidNumber => 'Chiffre invalide'; @override - String get voteAdd => 'Ajouter'; + String get toolSuccess => 'Succès'; @override - String get voteAddMember => 'Ajouter un membre'; + String get voteAdd => 'Ajouter'; @override String get voteAddedPretendance => 'Liste ajoutée'; @@ -4160,6 +4324,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get voteAddingError => 'Erreur lors de l\'ajout'; + @override + String get voteAddMember => 'Ajouter un membre'; + @override String get voteAddPretendance => 'Ajouter une liste'; @@ -4175,6 +4342,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get voteAlreadyVoted => 'Vote enregistré'; + @override + String get voteCanNotVote => 'Vous ne pouvez pas voter'; + @override String get voteChooseList => 'Choisir une liste'; @@ -4200,20 +4370,20 @@ class AppLocalizationsFr extends AppLocalizations { String get voteDelete => 'Supprimer'; @override - String get voteDeletedAll => 'Tout supprimé'; + String get voteDeleteAll => 'Supprimer tout'; @override - String get voteDeletedPipo => 'Listes pipos supprimées'; + String get voteDeleteAllDescription => + 'Voulez-vous vraiment supprimer tout ?'; @override - String get voteDeletedSection => 'Section supprimée'; + String get voteDeletedAll => 'Tout supprimé'; @override - String get voteDeleteAll => 'Supprimer tout'; + String get voteDeletedPipo => 'Listes pipos supprimées'; @override - String get voteDeleteAllDescription => - 'Voulez-vous vraiment supprimer tout ?'; + String get voteDeletedSection => 'Section supprimée'; @override String get voteDeletePipo => 'Supprimer les listes pipos'; @@ -4261,11 +4431,11 @@ class AppLocalizationsFr extends AppLocalizations { String get voteErrorCountingVotes => 'Erreur lors du dépouillement des votes'; @override - String get voteErrorResetingVotes => - 'Erreur lors de la réinitialisation des votes'; + String get voteErrorOpeningVotes => 'Erreur lors de l\'ouverture des votes'; @override - String get voteErrorOpeningVotes => 'Erreur lors de l\'ouverture des votes'; + String get voteErrorResetingVotes => + 'Erreur lors de la réinitialisation des votes'; @override String get voteIncorrectOrMissingFields => 'Champs incorrects ou manquants'; @@ -4282,9 +4452,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get voteNoSection => 'Aucune section'; - @override - String get voteCanNotVote => 'Vous ne pouvez pas voter'; - @override String get voteNoSectionList => 'Aucune section'; @@ -4332,10 +4499,10 @@ class AppLocalizationsFr extends AppLocalizations { String get voteRole => 'Rôle'; @override - String get voteSectionDescription => 'Description de la section'; + String get voteSection => 'Section'; @override - String get voteSection => 'Section'; + String get voteSectionDescription => 'Description de la section'; @override String get voteSectionName => 'Nom de la section'; @@ -4364,9 +4531,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String get voteVoters => 'Groupes votants'; - @override - String get voteVoteSuccess => 'Vote enregistré'; - @override String get voteVotes => 'Voix'; @@ -4379,167 +4543,13 @@ class AppLocalizationsFr extends AppLocalizations { @override String get voteVotesOpened => 'Votes ouverts'; + @override + String get voteVoteSuccess => 'Vote enregistré'; + @override String get voteWarning => 'Attention'; @override String get voteWarningMessage => 'La sélection ne sera pas sauvegardée.\nVoulez-vous continuer ?'; - - @override - String get moduleAdvert => 'Feed'; - - @override - String get moduleAdvertDescription => 'Gérer les feeds'; - - @override - String get moduleAmap => 'AMAP'; - - @override - String get moduleAmapDescription => 'Gérer les livraisons et les produits'; - - @override - String get moduleBooking => 'Réservation'; - - @override - String get moduleBookingDescription => - 'Gérer les réservations, les salles et les managers'; - - @override - String get moduleCalendar => 'Calendrier'; - - @override - String get moduleCalendarDescription => - 'Consulter les événements et les activités'; - - @override - String get moduleCentralisation => 'Centralisation'; - - @override - String get moduleCentralisationDescription => - 'Gérer la centralisation des données'; - - @override - String get moduleCinema => 'Cinéma'; - - @override - String get moduleCinemaDescription => 'Gérer les séances de cinéma'; - - @override - String get moduleEvent => 'Événement'; - - @override - String get moduleEventDescription => - 'Gérer les événements et les participants'; - - @override - String get moduleFlappyBird => 'Flappy Bird'; - - @override - String get moduleFlappyBirdDescription => - 'Jouer à Flappy Bird et consulter le classement'; - - @override - String get moduleLoan => 'Prêt'; - - @override - String get moduleLoanDescription => 'Gérer les prêts et les articles'; - - @override - String get modulePhonebook => 'Annuaire'; - - @override - String get modulePhonebookDescription => - 'Gérer les associations, les membres et les administrateurs'; - - @override - String get modulePurchases => 'Achats'; - - @override - String get modulePurchasesDescription => - 'Gérer les achats, les tickets et l\'historique'; - - @override - String get moduleRaffle => 'Tombola'; - - @override - String get moduleRaffleDescription => - 'Gérer les tombolas, les prix et les tickets'; - - @override - String get moduleRecommendation => 'Bons plans'; - - @override - String get moduleRecommendationDescription => - 'Gérer les recommandations, les informations et les administrateurs'; - - @override - String get moduleSeedLibrary => 'Grainothèque'; - - @override - String get moduleSeedLibraryDescription => - 'Gérer les graines, les espèces et les stocks'; - - @override - String get moduleVote => 'Vote'; - - @override - String get moduleVoteDescription => - 'Gérer les votes, les sections et les candidats'; - - @override - String get modulePh => 'PH'; - - @override - String get modulePhDescription => - 'Gérer les PH, les formulaires et les administrateurs'; - - @override - String get moduleSettings => 'Paramètres'; - - @override - String get moduleSettingsDescription => - 'Gérer les paramètres de l\'application'; - - @override - String get moduleFeed => 'Events'; - - @override - String get moduleFeedDescription => 'Consulter les événements'; - - @override - String get moduleStyleGuide => 'StyleGuide'; - - @override - String get moduleStyleGuideDescription => - 'Explore the UI components and styles used in Titan'; - - @override - String get moduleAdmin => 'Admin'; - - @override - String get moduleAdminDescription => - 'Gérer les utilisateurs, groupes et structures'; - - @override - String get moduleOthers => 'Autres'; - - @override - String get moduleOthersDescription => 'Afficher les autres modules'; - - @override - String get modulePayment => 'Paiement'; - - @override - String get modulePaymentDescription => - 'Gérer les paiements, les statistiques et les appareils'; - - @override - String get toolInvalidNumber => 'Chiffre invalide'; - - @override - String get toolDateRequired => 'Date requise'; - - @override - String get toolSuccess => 'Succès'; } diff --git a/lib/l10n/sort_arb.py b/lib/l10n/sort_arb.py new file mode 100644 index 0000000000..8d799cd4d6 --- /dev/null +++ b/lib/l10n/sort_arb.py @@ -0,0 +1,20 @@ +import json + +file_names = [ + "app_en.arb", + "app_fr.arb", +] +for file_name in file_names: + with open(f"lib/l10n/{file_name}", "r", encoding="utf-8") as f: + content: dict = json.load(f) + sorted_content = dict( + sorted( + content.items(), + key=lambda item: ( + item[0].lower().replace("@", "") + + ("a" if item[0].startswith("@") else "") + ), + ) + ) + with open(f"lib/l10n/{file_name}", "w", encoding="utf-8") as f: + json.dump(sorted_content, f, ensure_ascii=False, indent=2) diff --git a/lib/loan/tools/constants.dart b/lib/loan/tools/constants.dart index b4e6a9c3b9..76a7100276 100644 --- a/lib/loan/tools/constants.dart +++ b/lib/loan/tools/constants.dart @@ -6,3 +6,8 @@ class LoanColorConstants { static const Color redGradient2 = Color.fromARGB(255, 172, 32, 10); static const Color urgentRed = Color.fromARGB(255, 99, 13, 0); } + +class LoanPermissionConstants { + static const String accessLoans = 'access_loan'; + static const String manageLoaners = 'manage_loaners'; +} diff --git a/lib/login/class/account_type.dart b/lib/login/class/account_type.dart deleted file mode 100644 index 06a2f386e7..0000000000 --- a/lib/login/class/account_type.dart +++ /dev/null @@ -1 +0,0 @@ -enum AccountType { student, formerstudent, staff, admin, association } diff --git a/lib/login/router.dart b/lib/login/router.dart index 2ac01f366f..419ecef09a 100644 --- a/lib/login/router.dart +++ b/lib/login/router.dart @@ -10,6 +10,7 @@ import 'package:qlevar_router/qlevar_router.dart'; class LoginRouter { final Ref ref; static const String root = '/login'; + static const String mailReceived = '/mail_received'; LoginRouter(this.ref); QRoute route() => QRoute( diff --git a/lib/login/tools/functions.dart b/lib/login/tools/functions.dart deleted file mode 100644 index 7c34e55d06..0000000000 --- a/lib/login/tools/functions.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:titan/login/class/account_type.dart'; - -String accountTypeToID(AccountType type) { - switch (type) { - case AccountType.student: - return '39691052-2ae5-4e12-99d0-7a9f5f2b0136'; - case AccountType.formerstudent: - return 'ab4c7503-41b3-11ee-8177-089798f1a4a5'; - case AccountType.staff: - return '703056c4-be9d-475c-aa51-b7fc62a96aaa'; - case AccountType.admin: - return '0a25cb76-4b63-4fd3-b939-da6d9feabf28'; - case AccountType.association: - return '29751438-103c-42f2-b09b-33fbb20758a7'; - } -} diff --git a/lib/main.dart b/lib/main.dart index 521d92ddda..b4c7e08808 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -26,13 +26,13 @@ import 'package:timeago/timeago.dart' as timeago; import 'package:app_links/app_links.dart'; void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await setHyperionHost(); QR.setUrlStrategy(); // We set the default page type to QMaterialPage // See https://pub.dev/packages/qlevar_router#page-transition // We should not use a combination of QMaterialPage and QCupertinoPage QR.settings.pagesType = const QMaterialPage(); - - WidgetsFlutterBinding.ensureInitialized(); if (!kIsWeb) { await Firebase.initializeApp(); FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); diff --git a/lib/paiement/class/create_device.dart b/lib/mypayment/class/create_device.dart similarity index 100% rename from lib/paiement/class/create_device.dart rename to lib/mypayment/class/create_device.dart diff --git a/lib/paiement/class/funding_url.dart b/lib/mypayment/class/funding_url.dart similarity index 100% rename from lib/paiement/class/funding_url.dart rename to lib/mypayment/class/funding_url.dart diff --git a/lib/paiement/class/history.dart b/lib/mypayment/class/history.dart similarity index 97% rename from lib/paiement/class/history.dart rename to lib/mypayment/class/history.dart index 5c154ab190..0c98f64e42 100644 --- a/lib/paiement/class/history.dart +++ b/lib/mypayment/class/history.dart @@ -1,4 +1,4 @@ -import 'package:titan/paiement/class/history_refund.dart'; +import 'package:titan/mypayment/class/history_refund.dart'; import 'package:titan/tools/functions.dart'; enum HistoryType { transfer, received, given, refundCredited, refundDebited } diff --git a/lib/paiement/class/history_interval.dart b/lib/mypayment/class/history_interval.dart similarity index 100% rename from lib/paiement/class/history_interval.dart rename to lib/mypayment/class/history_interval.dart diff --git a/lib/paiement/class/history_refund.dart b/lib/mypayment/class/history_refund.dart similarity index 100% rename from lib/paiement/class/history_refund.dart rename to lib/mypayment/class/history_refund.dart diff --git a/lib/paiement/class/init_info.dart b/lib/mypayment/class/init_info.dart similarity index 100% rename from lib/paiement/class/init_info.dart rename to lib/mypayment/class/init_info.dart diff --git a/lib/paiement/class/invoice.dart b/lib/mypayment/class/invoice.dart similarity index 96% rename from lib/paiement/class/invoice.dart rename to lib/mypayment/class/invoice.dart index 14806ff274..cbd70d5fce 100644 --- a/lib/paiement/class/invoice.dart +++ b/lib/mypayment/class/invoice.dart @@ -1,5 +1,5 @@ -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/class/structure.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/class/structure.dart'; import 'package:titan/tools/functions.dart'; class InvoiceDetail { diff --git a/lib/paiement/class/qr_code_data.dart b/lib/mypayment/class/qr_code_data.dart similarity index 100% rename from lib/paiement/class/qr_code_data.dart rename to lib/mypayment/class/qr_code_data.dart diff --git a/lib/paiement/class/qr_code_signature_data.dart b/lib/mypayment/class/qr_code_signature_data.dart similarity index 100% rename from lib/paiement/class/qr_code_signature_data.dart rename to lib/mypayment/class/qr_code_signature_data.dart diff --git a/lib/paiement/class/refund.dart b/lib/mypayment/class/refund.dart similarity index 100% rename from lib/paiement/class/refund.dart rename to lib/mypayment/class/refund.dart diff --git a/lib/paiement/class/seller.dart b/lib/mypayment/class/seller.dart similarity index 100% rename from lib/paiement/class/seller.dart rename to lib/mypayment/class/seller.dart diff --git a/lib/paiement/class/store.dart b/lib/mypayment/class/store.dart similarity index 96% rename from lib/paiement/class/store.dart rename to lib/mypayment/class/store.dart index f67e86768c..b28fe46c9b 100644 --- a/lib/paiement/class/store.dart +++ b/lib/mypayment/class/store.dart @@ -1,4 +1,4 @@ -import 'package:titan/paiement/class/structure.dart'; +import 'package:titan/mypayment/class/structure.dart'; class StoreSimple { final String id; diff --git a/lib/paiement/class/structure.dart b/lib/mypayment/class/structure.dart similarity index 100% rename from lib/paiement/class/structure.dart rename to lib/mypayment/class/structure.dart diff --git a/lib/paiement/class/tos.dart b/lib/mypayment/class/tos.dart similarity index 100% rename from lib/paiement/class/tos.dart rename to lib/mypayment/class/tos.dart diff --git a/lib/paiement/class/transaction.dart b/lib/mypayment/class/transaction.dart similarity index 97% rename from lib/paiement/class/transaction.dart rename to lib/mypayment/class/transaction.dart index fbd2865fe1..2e3775ba30 100644 --- a/lib/paiement/class/transaction.dart +++ b/lib/mypayment/class/transaction.dart @@ -1,4 +1,4 @@ -import 'package:titan/paiement/class/history.dart'; +import 'package:titan/mypayment/class/history.dart'; import 'package:titan/tools/functions.dart'; enum TransactionType { direct, request, refund } diff --git a/lib/paiement/class/transfert.dart b/lib/mypayment/class/transfert.dart similarity index 94% rename from lib/paiement/class/transfert.dart rename to lib/mypayment/class/transfert.dart index 00e642e011..b2ff648603 100644 --- a/lib/paiement/class/transfert.dart +++ b/lib/mypayment/class/transfert.dart @@ -1,4 +1,4 @@ -import 'package:titan/paiement/tools/functions.dart'; +import 'package:titan/mypayment/tools/functions.dart'; class Transfer { final int amount; diff --git a/lib/paiement/class/user_store.dart b/lib/mypayment/class/user_store.dart similarity index 95% rename from lib/paiement/class/user_store.dart rename to lib/mypayment/class/user_store.dart index f0d3db3c3c..d6ff673e6d 100644 --- a/lib/paiement/class/user_store.dart +++ b/lib/mypayment/class/user_store.dart @@ -1,5 +1,5 @@ -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/class/structure.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/class/structure.dart'; class UserStore extends Store { final bool canBank; diff --git a/lib/paiement/class/wallet.dart b/lib/mypayment/class/wallet.dart similarity index 96% rename from lib/paiement/class/wallet.dart rename to lib/mypayment/class/wallet.dart index 2a4e5760fc..55a72e1e89 100644 --- a/lib/paiement/class/wallet.dart +++ b/lib/mypayment/class/wallet.dart @@ -1,4 +1,4 @@ -import 'package:titan/paiement/class/store.dart'; +import 'package:titan/mypayment/class/store.dart'; import 'package:titan/user/class/user.dart'; enum WalletType { user, store } diff --git a/lib/paiement/class/wallet_device.dart b/lib/mypayment/class/wallet_device.dart similarity index 100% rename from lib/paiement/class/wallet_device.dart rename to lib/mypayment/class/wallet_device.dart diff --git a/lib/paiement/providers/bank_account_holder_provider.dart b/lib/mypayment/providers/bank_account_holder_provider.dart similarity index 88% rename from lib/paiement/providers/bank_account_holder_provider.dart rename to lib/mypayment/providers/bank_account_holder_provider.dart index 62240d4735..d620c0e6c6 100644 --- a/lib/paiement/providers/bank_account_holder_provider.dart +++ b/lib/mypayment/providers/bank_account_holder_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/repositories/bank_account_holder_repository.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/repositories/bank_account_holder_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class BankAccountHolderNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/barcode_provider.dart b/lib/mypayment/providers/barcode_provider.dart similarity index 88% rename from lib/paiement/providers/barcode_provider.dart rename to lib/mypayment/providers/barcode_provider.dart index 6b7589119f..30d9329e67 100644 --- a/lib/paiement/providers/barcode_provider.dart +++ b/lib/mypayment/providers/barcode_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/qr_code_data.dart'; +import 'package:titan/mypayment/class/qr_code_data.dart'; class BarcodeNotifier extends StateNotifier { BarcodeNotifier() : super(null); diff --git a/lib/paiement/providers/bypass_provider.dart b/lib/mypayment/providers/bypass_provider.dart similarity index 100% rename from lib/paiement/providers/bypass_provider.dart rename to lib/mypayment/providers/bypass_provider.dart diff --git a/lib/paiement/providers/device_list_provider.dart b/lib/mypayment/providers/device_list_provider.dart similarity index 88% rename from lib/paiement/providers/device_list_provider.dart rename to lib/mypayment/providers/device_list_provider.dart index 7b79980aa4..9afa7e4416 100644 --- a/lib/paiement/providers/device_list_provider.dart +++ b/lib/mypayment/providers/device_list_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/wallet_device.dart'; -import 'package:titan/paiement/repositories/devices_repository.dart'; +import 'package:titan/mypayment/class/wallet_device.dart'; +import 'package:titan/mypayment/repositories/devices_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class DeviceListNotifier extends ListNotifier { diff --git a/lib/paiement/providers/device_provider.dart b/lib/mypayment/providers/device_provider.dart similarity index 84% rename from lib/paiement/providers/device_provider.dart rename to lib/mypayment/providers/device_provider.dart index c18a8bd02c..99322e1d78 100644 --- a/lib/paiement/providers/device_provider.dart +++ b/lib/mypayment/providers/device_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/create_device.dart'; -import 'package:titan/paiement/class/wallet_device.dart'; -import 'package:titan/paiement/repositories/devices_repository.dart'; +import 'package:titan/mypayment/class/create_device.dart'; +import 'package:titan/mypayment/class/wallet_device.dart'; +import 'package:titan/mypayment/repositories/devices_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class DeviceNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/fund_amount_provider.dart b/lib/mypayment/providers/fund_amount_provider.dart similarity index 100% rename from lib/paiement/providers/fund_amount_provider.dart rename to lib/mypayment/providers/fund_amount_provider.dart diff --git a/lib/paiement/providers/funding_url_provider.dart b/lib/mypayment/providers/funding_url_provider.dart similarity index 80% rename from lib/paiement/providers/funding_url_provider.dart rename to lib/mypayment/providers/funding_url_provider.dart index ec8492130a..3421f42f80 100644 --- a/lib/paiement/providers/funding_url_provider.dart +++ b/lib/mypayment/providers/funding_url_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/funding_url.dart'; -import 'package:titan/paiement/class/init_info.dart'; -import 'package:titan/paiement/repositories/funding_repository.dart'; +import 'package:titan/mypayment/class/funding_url.dart'; +import 'package:titan/mypayment/class/init_info.dart'; +import 'package:titan/mypayment/repositories/funding_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class FundingUrlNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/has_accepted_tos_provider.dart b/lib/mypayment/providers/has_accepted_tos_provider.dart similarity index 91% rename from lib/paiement/providers/has_accepted_tos_provider.dart rename to lib/mypayment/providers/has_accepted_tos_provider.dart index ec6033e4e0..00d5437b60 100644 --- a/lib/paiement/providers/has_accepted_tos_provider.dart +++ b/lib/mypayment/providers/has_accepted_tos_provider.dart @@ -1,5 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/providers/tos_provider.dart'; +import 'package:titan/mypayment/providers/tos_provider.dart'; class HasAcceptedTosNotifier extends StateNotifier { final bool defaultValue; diff --git a/lib/mypayment/providers/history_export_csv_provider.dart b/lib/mypayment/providers/history_export_csv_provider.dart new file mode 100644 index 0000000000..3a1ccd3506 --- /dev/null +++ b/lib/mypayment/providers/history_export_csv_provider.dart @@ -0,0 +1,27 @@ +import 'dart:typed_data'; + +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/providers/selected_interval_provider.dart'; +import 'package:titan/mypayment/repositories/csv_stores_repository.dart'; + +class HistoryExportCsvNotifier extends FamilyAsyncNotifier { + @override + Future build(Store store) async { + final interval = ref.watch(selectedIntervalProvider); + final CsvStoresRepository csvStoresRepository = ref.watch( + csvStoresRepositoryProvider, + ); + + return await csvStoresRepository.exportStoreHistory( + store, + interval.start, + interval.end, + ); + } +} + +final historyExportCsvProvider = + AsyncNotifierProvider.family( + HistoryExportCsvNotifier.new, + ); diff --git a/lib/paiement/providers/invoice_list_provider.dart b/lib/mypayment/providers/invoice_list_provider.dart similarity index 93% rename from lib/paiement/providers/invoice_list_provider.dart rename to lib/mypayment/providers/invoice_list_provider.dart index 391b2f1a72..9adbda31cf 100644 --- a/lib/paiement/providers/invoice_list_provider.dart +++ b/lib/mypayment/providers/invoice_list_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/invoice.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/repositories/invoices_repository.dart'; +import 'package:titan/mypayment/class/invoice.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/repositories/invoices_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class InvoiceListNotifier extends ListNotifier { diff --git a/lib/paiement/providers/invoice_pdf_provider.dart b/lib/mypayment/providers/invoice_pdf_provider.dart similarity index 87% rename from lib/paiement/providers/invoice_pdf_provider.dart rename to lib/mypayment/providers/invoice_pdf_provider.dart index 09af8adc58..fcee6c6aa1 100644 --- a/lib/paiement/providers/invoice_pdf_provider.dart +++ b/lib/mypayment/providers/invoice_pdf_provider.dart @@ -1,7 +1,7 @@ import 'dart:typed_data'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/repositories/invoice_pdf_repository.dart'; +import 'package:titan/mypayment/repositories/invoice_pdf_repository.dart'; class InvoicePdfNotifier extends FamilyAsyncNotifier { @override diff --git a/lib/paiement/providers/invoice_provider.dart b/lib/mypayment/providers/invoice_provider.dart similarity index 84% rename from lib/paiement/providers/invoice_provider.dart rename to lib/mypayment/providers/invoice_provider.dart index 33921ba96e..8a3754a727 100644 --- a/lib/paiement/providers/invoice_provider.dart +++ b/lib/mypayment/providers/invoice_provider.dart @@ -1,5 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/invoice.dart'; +import 'package:titan/mypayment/class/invoice.dart'; class InvoiceNotifier extends StateNotifier { InvoiceNotifier() : super(Invoice.empty()); diff --git a/lib/paiement/providers/is_payment_admin.dart b/lib/mypayment/providers/is_payment_admin.dart similarity index 79% rename from lib/paiement/providers/is_payment_admin.dart rename to lib/mypayment/providers/is_payment_admin.dart index 32ef97b276..77130fb8be 100644 --- a/lib/paiement/providers/is_payment_admin.dart +++ b/lib/mypayment/providers/is_payment_admin.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/providers/bank_account_holder_provider.dart'; -import 'package:titan/paiement/providers/my_structures_provider.dart'; +import 'package:titan/mypayment/providers/bank_account_holder_provider.dart'; +import 'package:titan/mypayment/providers/my_structures_provider.dart'; final isStructureAdminProvider = StateProvider((ref) { final myStructures = ref.watch(myStructuresProvider); diff --git a/lib/paiement/providers/key_service_provider.dart b/lib/mypayment/providers/key_service_provider.dart similarity index 67% rename from lib/paiement/providers/key_service_provider.dart rename to lib/mypayment/providers/key_service_provider.dart index 657890dd06..558fbafb01 100644 --- a/lib/paiement/providers/key_service_provider.dart +++ b/lib/mypayment/providers/key_service_provider.dart @@ -1,4 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/tools/key_service.dart'; +import 'package:titan/mypayment/tools/key_service.dart'; final keyServiceProvider = Provider((ref) => KeyService()); diff --git a/lib/paiement/providers/last_time_scanned.dart b/lib/mypayment/providers/last_time_scanned.dart similarity index 100% rename from lib/paiement/providers/last_time_scanned.dart rename to lib/mypayment/providers/last_time_scanned.dart diff --git a/lib/paiement/providers/last_used_store_id_provider.dart b/lib/mypayment/providers/last_used_store_id_provider.dart similarity index 100% rename from lib/paiement/providers/last_used_store_id_provider.dart rename to lib/mypayment/providers/last_used_store_id_provider.dart diff --git a/lib/paiement/providers/my_history_provider.dart b/lib/mypayment/providers/my_history_provider.dart similarity index 85% rename from lib/paiement/providers/my_history_provider.dart rename to lib/mypayment/providers/my_history_provider.dart index 95117f0759..7c5fdd1aec 100644 --- a/lib/paiement/providers/my_history_provider.dart +++ b/lib/mypayment/providers/my_history_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/repositories/users_me_repository.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/repositories/users_me_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class MyHistoryNotifier extends ListNotifier { diff --git a/lib/paiement/providers/my_stores_provider.dart b/lib/mypayment/providers/my_stores_provider.dart similarity index 84% rename from lib/paiement/providers/my_stores_provider.dart rename to lib/mypayment/providers/my_stores_provider.dart index 7f59b7058f..6d6c7e16f3 100644 --- a/lib/paiement/providers/my_stores_provider.dart +++ b/lib/mypayment/providers/my_stores_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/user_store.dart'; -import 'package:titan/paiement/repositories/users_me_repository.dart'; +import 'package:titan/mypayment/class/user_store.dart'; +import 'package:titan/mypayment/repositories/users_me_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class MyStoresNotifier extends ListNotifier { diff --git a/lib/paiement/providers/my_structures_provider.dart b/lib/mypayment/providers/my_structures_provider.dart similarity index 70% rename from lib/paiement/providers/my_structures_provider.dart rename to lib/mypayment/providers/my_structures_provider.dart index 4d6a478061..9d59b287f1 100644 --- a/lib/paiement/providers/my_structures_provider.dart +++ b/lib/mypayment/providers/my_structures_provider.dart @@ -1,9 +1,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/providers/structure_list_provider.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/providers/structure_list_provider.dart'; import 'package:titan/user/providers/user_provider.dart'; -final myStructuresProvider = StateProvider((ref) { +final myStructuresProvider = StateProvider>((ref) { final user = ref.watch(userProvider); final structures = ref.watch(structureListProvider); return structures.when( diff --git a/lib/paiement/providers/my_wallet_provider.dart b/lib/mypayment/providers/my_wallet_provider.dart similarity index 84% rename from lib/paiement/providers/my_wallet_provider.dart rename to lib/mypayment/providers/my_wallet_provider.dart index 70d2199995..e92d5bdea2 100644 --- a/lib/paiement/providers/my_wallet_provider.dart +++ b/lib/mypayment/providers/my_wallet_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/wallet.dart'; -import 'package:titan/paiement/repositories/users_me_repository.dart'; +import 'package:titan/mypayment/class/wallet.dart'; +import 'package:titan/mypayment/repositories/users_me_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class MyWalletNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/new_admin_provider.dart b/lib/mypayment/providers/new_admin_provider.dart similarity index 100% rename from lib/paiement/providers/new_admin_provider.dart rename to lib/mypayment/providers/new_admin_provider.dart diff --git a/lib/paiement/providers/ongoing_transaction.dart b/lib/mypayment/providers/ongoing_transaction.dart similarity index 90% rename from lib/paiement/providers/ongoing_transaction.dart rename to lib/mypayment/providers/ongoing_transaction.dart index 38ca4178d3..c626f9fc78 100644 --- a/lib/paiement/providers/ongoing_transaction.dart +++ b/lib/mypayment/providers/ongoing_transaction.dart @@ -1,5 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/transaction.dart'; +import 'package:titan/mypayment/class/transaction.dart'; class OngoingTransaction extends StateNotifier> { OngoingTransaction() : super(const AsyncValue.loading()); diff --git a/lib/paiement/providers/pay_amount_provider.dart b/lib/mypayment/providers/pay_amount_provider.dart similarity index 100% rename from lib/paiement/providers/pay_amount_provider.dart rename to lib/mypayment/providers/pay_amount_provider.dart diff --git a/lib/paiement/providers/refund_amount_provider.dart b/lib/mypayment/providers/refund_amount_provider.dart similarity index 100% rename from lib/paiement/providers/refund_amount_provider.dart rename to lib/mypayment/providers/refund_amount_provider.dart diff --git a/lib/paiement/providers/register_provider.dart b/lib/mypayment/providers/register_provider.dart similarity index 90% rename from lib/paiement/providers/register_provider.dart rename to lib/mypayment/providers/register_provider.dart index 32f37bf786..8d1730d2b5 100644 --- a/lib/paiement/providers/register_provider.dart +++ b/lib/mypayment/providers/register_provider.dart @@ -1,5 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/repositories/users_me_repository.dart'; +import 'package:titan/mypayment/repositories/users_me_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class RegisterNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/scan_provider.dart b/lib/mypayment/providers/scan_provider.dart similarity index 83% rename from lib/paiement/providers/scan_provider.dart rename to lib/mypayment/providers/scan_provider.dart index da897202f8..1c3a79d5e5 100644 --- a/lib/paiement/providers/scan_provider.dart +++ b/lib/mypayment/providers/scan_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/qr_code_data.dart'; -import 'package:titan/paiement/class/transaction.dart'; -import 'package:titan/paiement/repositories/stores_repository.dart'; +import 'package:titan/mypayment/class/qr_code_data.dart'; +import 'package:titan/mypayment/class/transaction.dart'; +import 'package:titan/mypayment/repositories/stores_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class ScanNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/selected_interval_provider.dart b/lib/mypayment/providers/selected_interval_provider.dart similarity index 90% rename from lib/paiement/providers/selected_interval_provider.dart rename to lib/mypayment/providers/selected_interval_provider.dart index 0bebb48dbd..177307ca7b 100644 --- a/lib/paiement/providers/selected_interval_provider.dart +++ b/lib/mypayment/providers/selected_interval_provider.dart @@ -1,5 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/history_interval.dart'; +import 'package:titan/mypayment/class/history_interval.dart'; class SelectedIntervalNotifier extends StateNotifier { SelectedIntervalNotifier() : super(HistoryInterval.currentMonth()); diff --git a/lib/paiement/providers/selected_store_history.dart b/lib/mypayment/providers/selected_store_history.dart similarity index 79% rename from lib/paiement/providers/selected_store_history.dart rename to lib/mypayment/providers/selected_store_history.dart index ec1a479a60..b71c0d106b 100644 --- a/lib/paiement/providers/selected_store_history.dart +++ b/lib/mypayment/providers/selected_store_history.dart @@ -1,9 +1,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/providers/selected_interval_provider.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/repositories/stores_repository.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/providers/selected_interval_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/repositories/stores_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class SellerHistoryNotifier extends ListNotifier { diff --git a/lib/mypayment/providers/selected_store_provider.dart b/lib/mypayment/providers/selected_store_provider.dart new file mode 100644 index 0000000000..f361304982 --- /dev/null +++ b/lib/mypayment/providers/selected_store_provider.dart @@ -0,0 +1,51 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/mypayment/class/user_store.dart'; +import 'package:titan/mypayment/providers/my_stores_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class SelectedStoreNotifier extends StateNotifier { + SelectedStoreNotifier(super.store); + + void updateStore(UserStore store) { + state = store; + SharedPreferences.getInstance().then((pref) { + pref.setString('selectedStoreId', store.id); + }); + } +} + +class LoadSelectedStoreIdProvider extends StateNotifier { + LoadSelectedStoreIdProvider() : super(null); + + void loadSelectedStoreId() { + SharedPreferences.getInstance().then((pref) { + state = pref.getString('selectedStoreId'); + }); + } +} + +final loadSelectedStoreIdProvider = + StateNotifierProvider((ref) { + LoadSelectedStoreIdProvider loadSelectedStoreIdProvider = + LoadSelectedStoreIdProvider(); + loadSelectedStoreIdProvider.loadSelectedStoreId(); + return loadSelectedStoreIdProvider; + }); + +final selectedStoreProvider = + StateNotifierProvider((ref) { + final myStores = ref.watch(myStoresProvider); + final selectedStoreId = ref.watch(loadSelectedStoreIdProvider); + final store = myStores.maybeWhen( + orElse: () => UserStore.empty(), + data: (value) { + if (value.isEmpty) return UserStore.empty(); + if (selectedStoreId == null) return value.first; + return value.firstWhere( + (store) => store.id == selectedStoreId, + orElse: () => value.first, + ); + }, + ); + return SelectedStoreNotifier(store); + }); diff --git a/lib/paiement/providers/selected_structure_provider.dart b/lib/mypayment/providers/selected_structure_provider.dart similarity index 88% rename from lib/paiement/providers/selected_structure_provider.dart rename to lib/mypayment/providers/selected_structure_provider.dart index 40ab07ec42..5d71340b15 100644 --- a/lib/paiement/providers/selected_structure_provider.dart +++ b/lib/mypayment/providers/selected_structure_provider.dart @@ -1,5 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/structure.dart'; +import 'package:titan/mypayment/class/structure.dart'; class SelectedStructureNotifier extends StateNotifier { SelectedStructureNotifier() : super(Structure.empty()); diff --git a/lib/paiement/providers/selected_transactions_provider.dart b/lib/mypayment/providers/selected_transactions_provider.dart similarity index 89% rename from lib/paiement/providers/selected_transactions_provider.dart rename to lib/mypayment/providers/selected_transactions_provider.dart index 1d08192ca8..da9b72c395 100644 --- a/lib/paiement/providers/selected_transactions_provider.dart +++ b/lib/mypayment/providers/selected_transactions_provider.dart @@ -1,6 +1,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; class SelectedTransactionsNotifier extends StateNotifier> { SelectedTransactionsNotifier(super.history); diff --git a/lib/paiement/providers/seller_rights_list_providder.dart b/lib/mypayment/providers/seller_rights_list_providder.dart similarity index 100% rename from lib/paiement/providers/seller_rights_list_providder.dart rename to lib/mypayment/providers/seller_rights_list_providder.dart diff --git a/lib/paiement/providers/should_display_tos_dialog.dart b/lib/mypayment/providers/should_display_tos_dialog.dart similarity index 91% rename from lib/paiement/providers/should_display_tos_dialog.dart rename to lib/mypayment/providers/should_display_tos_dialog.dart index 705db627a4..608754149e 100644 --- a/lib/paiement/providers/should_display_tos_dialog.dart +++ b/lib/mypayment/providers/should_display_tos_dialog.dart @@ -1,5 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/providers/tos_provider.dart'; +import 'package:titan/mypayment/providers/tos_provider.dart'; class ShouldDisplayTosDialog extends StateNotifier { final bool defaultValue; diff --git a/lib/paiement/providers/store_provider.dart b/lib/mypayment/providers/store_provider.dart similarity index 85% rename from lib/paiement/providers/store_provider.dart rename to lib/mypayment/providers/store_provider.dart index 7bdf42f00b..3ed06dd969 100644 --- a/lib/paiement/providers/store_provider.dart +++ b/lib/mypayment/providers/store_provider.dart @@ -1,5 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/store.dart'; +import 'package:titan/mypayment/class/store.dart'; class StoreProvider extends StateNotifier { StoreProvider() : super(Store.empty()); diff --git a/lib/paiement/providers/store_sellers_list_provider.dart b/lib/mypayment/providers/store_sellers_list_provider.dart similarity index 92% rename from lib/paiement/providers/store_sellers_list_provider.dart rename to lib/mypayment/providers/store_sellers_list_provider.dart index 87d4f9f741..3c51c73484 100644 --- a/lib/paiement/providers/store_sellers_list_provider.dart +++ b/lib/mypayment/providers/store_sellers_list_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/seller.dart'; -import 'package:titan/paiement/repositories/store_sellers_repository.dart'; +import 'package:titan/mypayment/class/seller.dart'; +import 'package:titan/mypayment/repositories/store_sellers_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class StoreSellerListNotifier extends ListNotifier { diff --git a/lib/paiement/providers/stores_list_provider.dart b/lib/mypayment/providers/stores_list_provider.dart similarity index 84% rename from lib/paiement/providers/stores_list_provider.dart rename to lib/mypayment/providers/stores_list_provider.dart index 6965832847..dcead7bc49 100644 --- a/lib/paiement/providers/stores_list_provider.dart +++ b/lib/mypayment/providers/stores_list_provider.dart @@ -1,9 +1,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/repositories/stores_repository.dart'; -import 'package:titan/paiement/repositories/structures_repository.dart'; -import 'package:titan/paiement/repositories/users_me_repository.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/repositories/stores_repository.dart'; +import 'package:titan/mypayment/repositories/structures_repository.dart'; +import 'package:titan/mypayment/repositories/users_me_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class StoreListNotifier extends ListNotifier { diff --git a/lib/paiement/providers/structure_list_provider.dart b/lib/mypayment/providers/structure_list_provider.dart similarity index 92% rename from lib/paiement/providers/structure_list_provider.dart rename to lib/mypayment/providers/structure_list_provider.dart index d400787fc5..3aa842e03e 100644 --- a/lib/paiement/providers/structure_list_provider.dart +++ b/lib/mypayment/providers/structure_list_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/repositories/structures_repository.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/repositories/structures_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; class StructureListNotifier extends ListNotifier { diff --git a/lib/paiement/providers/tos_provider.dart b/lib/mypayment/providers/tos_provider.dart similarity index 85% rename from lib/paiement/providers/tos_provider.dart rename to lib/mypayment/providers/tos_provider.dart index e7bf5da34e..dd6e659d29 100644 --- a/lib/paiement/providers/tos_provider.dart +++ b/lib/mypayment/providers/tos_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/tos.dart'; -import 'package:titan/paiement/repositories/tos_repository.dart'; +import 'package:titan/mypayment/class/tos.dart'; +import 'package:titan/mypayment/repositories/tos_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class TOSNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/transaction_provider.dart b/lib/mypayment/providers/transaction_provider.dart similarity index 88% rename from lib/paiement/providers/transaction_provider.dart rename to lib/mypayment/providers/transaction_provider.dart index 92d708283d..bf66118a89 100644 --- a/lib/paiement/providers/transaction_provider.dart +++ b/lib/mypayment/providers/transaction_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/refund.dart'; -import 'package:titan/paiement/repositories/transaction_repository.dart'; +import 'package:titan/mypayment/class/refund.dart'; +import 'package:titan/mypayment/repositories/transaction_repository.dart'; import 'package:titan/tools/providers/single_notifier.dart'; class TransactionNotifier extends SingleNotifier { diff --git a/lib/paiement/providers/transfer_structure_provider.dart b/lib/mypayment/providers/transfer_structure_provider.dart similarity index 84% rename from lib/paiement/providers/transfer_structure_provider.dart rename to lib/mypayment/providers/transfer_structure_provider.dart index 4daee97c89..a6f67da1e6 100644 --- a/lib/paiement/providers/transfer_structure_provider.dart +++ b/lib/mypayment/providers/transfer_structure_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/repositories/structures_repository.dart'; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/repositories/structures_repository.dart'; class TransferStructureNotifier extends StateNotifier { final StructuresRepository structuresRepository; diff --git a/lib/paiement/repositories/bank_account_holder_repository.dart b/lib/mypayment/repositories/bank_account_holder_repository.dart similarity index 94% rename from lib/paiement/repositories/bank_account_holder_repository.dart rename to lib/mypayment/repositories/bank_account_holder_repository.dart index 1c69ed3e52..103a6a5b64 100644 --- a/lib/paiement/repositories/bank_account_holder_repository.dart +++ b/lib/mypayment/repositories/bank_account_holder_repository.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/structure.dart'; +import 'package:titan/mypayment/class/structure.dart'; import 'package:titan/tools/exception.dart'; import 'package:titan/tools/repository/repository.dart'; diff --git a/lib/mypayment/repositories/csv_stores_repository.dart b/lib/mypayment/repositories/csv_stores_repository.dart new file mode 100644 index 0000000000..c578380d56 --- /dev/null +++ b/lib/mypayment/repositories/csv_stores_repository.dart @@ -0,0 +1,32 @@ +import 'package:flutter/services.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/auth/providers/openid_provider.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/tools/functions.dart'; +import 'package:titan/tools/repository/csv_repository.dart'; + +class CsvStoresRepository extends CsvRepository { + @override + //ignore: overridden_fields + final ext = "mypayment/stores/"; + + Future exportStoreHistory( + Store store, + DateTime startDate, + DateTime endDate, + ) async { + final queryParams = { + 'start_date': processDateToAPI(startDate), + 'end_date': processDateToAPI(endDate), + }; + + final queryString = Uri(queryParameters: queryParams).query; + + return await getCsv(store.id, suffix: "/history/data-export?$queryString"); + } +} + +final csvStoresRepositoryProvider = Provider((ref) { + final token = ref.watch(tokenProvider); + return CsvStoresRepository()..setToken(token); +}); diff --git a/lib/paiement/repositories/devices_repository.dart b/lib/mypayment/repositories/devices_repository.dart similarity index 89% rename from lib/paiement/repositories/devices_repository.dart rename to lib/mypayment/repositories/devices_repository.dart index 977879a41f..b437f66881 100644 --- a/lib/paiement/repositories/devices_repository.dart +++ b/lib/mypayment/repositories/devices_repository.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/create_device.dart'; -import 'package:titan/paiement/class/wallet_device.dart'; +import 'package:titan/mypayment/class/create_device.dart'; +import 'package:titan/mypayment/class/wallet_device.dart'; import 'package:titan/tools/repository/repository.dart'; class DevicesRepository extends Repository { diff --git a/lib/paiement/repositories/funding_repository.dart b/lib/mypayment/repositories/funding_repository.dart similarity index 81% rename from lib/paiement/repositories/funding_repository.dart rename to lib/mypayment/repositories/funding_repository.dart index 94011224a5..dd6dd32510 100644 --- a/lib/paiement/repositories/funding_repository.dart +++ b/lib/mypayment/repositories/funding_repository.dart @@ -1,8 +1,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/funding_url.dart'; -import 'package:titan/paiement/class/init_info.dart'; -import 'package:titan/paiement/class/transfert.dart'; +import 'package:titan/mypayment/class/funding_url.dart'; +import 'package:titan/mypayment/class/init_info.dart'; +import 'package:titan/mypayment/class/transfert.dart'; import 'package:titan/tools/repository/repository.dart'; class FundingRepository extends Repository { diff --git a/lib/paiement/repositories/invoice_pdf_repository.dart b/lib/mypayment/repositories/invoice_pdf_repository.dart similarity index 92% rename from lib/paiement/repositories/invoice_pdf_repository.dart rename to lib/mypayment/repositories/invoice_pdf_repository.dart index afb36f7e7a..545c9ab331 100644 --- a/lib/paiement/repositories/invoice_pdf_repository.dart +++ b/lib/mypayment/repositories/invoice_pdf_repository.dart @@ -7,7 +7,7 @@ import 'package:titan/tools/repository/pdf_repository.dart'; class InvoicePdfRepository extends PdfRepository { @override // ignore: overridden_fields - final String ext = "mypayment/invoices/"; + final ext = "mypayment/invoices/"; Future getInvoicePdf(String invoiceId) async { return await getPdf(invoiceId); diff --git a/lib/paiement/repositories/invoices_repository.dart b/lib/mypayment/repositories/invoices_repository.dart similarity index 97% rename from lib/paiement/repositories/invoices_repository.dart rename to lib/mypayment/repositories/invoices_repository.dart index 4197cbed2a..dd0309e089 100644 --- a/lib/paiement/repositories/invoices_repository.dart +++ b/lib/mypayment/repositories/invoices_repository.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/invoice.dart'; +import 'package:titan/mypayment/class/invoice.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/repository/repository.dart'; diff --git a/lib/paiement/repositories/store_sellers_repository.dart b/lib/mypayment/repositories/store_sellers_repository.dart similarity index 95% rename from lib/paiement/repositories/store_sellers_repository.dart rename to lib/mypayment/repositories/store_sellers_repository.dart index 810cf139e5..7b3f14dd4d 100644 --- a/lib/paiement/repositories/store_sellers_repository.dart +++ b/lib/mypayment/repositories/store_sellers_repository.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/seller.dart'; +import 'package:titan/mypayment/class/seller.dart'; import 'package:titan/tools/repository/repository.dart'; class SellerStoreRepository extends Repository { diff --git a/lib/paiement/repositories/stores_repository.dart b/lib/mypayment/repositories/stores_repository.dart similarity index 88% rename from lib/paiement/repositories/stores_repository.dart rename to lib/mypayment/repositories/stores_repository.dart index 7fa3f50b58..257e975fcc 100644 --- a/lib/paiement/repositories/stores_repository.dart +++ b/lib/mypayment/repositories/stores_repository.dart @@ -1,9 +1,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/class/qr_code_data.dart'; -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/class/transaction.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/class/qr_code_data.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/class/transaction.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/repository/repository.dart'; diff --git a/lib/paiement/repositories/structures_repository.dart b/lib/mypayment/repositories/structures_repository.dart similarity index 93% rename from lib/paiement/repositories/structures_repository.dart rename to lib/mypayment/repositories/structures_repository.dart index 45ff5fc36c..dd5f6734b6 100644 --- a/lib/paiement/repositories/structures_repository.dart +++ b/lib/mypayment/repositories/structures_repository.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/class/structure.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/class/structure.dart'; import 'package:titan/tools/repository/repository.dart'; class StructuresRepository extends Repository { diff --git a/lib/paiement/repositories/tos_repository.dart b/lib/mypayment/repositories/tos_repository.dart similarity index 92% rename from lib/paiement/repositories/tos_repository.dart rename to lib/mypayment/repositories/tos_repository.dart index 64f3185d07..26776ad4d5 100644 --- a/lib/paiement/repositories/tos_repository.dart +++ b/lib/mypayment/repositories/tos_repository.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/tos.dart'; +import 'package:titan/mypayment/class/tos.dart'; import 'package:titan/tools/repository/repository.dart'; class TosRepository extends Repository { diff --git a/lib/paiement/repositories/transaction_repository.dart b/lib/mypayment/repositories/transaction_repository.dart similarity index 93% rename from lib/paiement/repositories/transaction_repository.dart rename to lib/mypayment/repositories/transaction_repository.dart index f6d96906fd..3b51a888b9 100644 --- a/lib/paiement/repositories/transaction_repository.dart +++ b/lib/mypayment/repositories/transaction_repository.dart @@ -1,6 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/refund.dart'; +import 'package:titan/mypayment/class/refund.dart'; import 'package:titan/tools/repository/repository.dart'; class TransactionsRepository extends Repository { diff --git a/lib/paiement/repositories/users_me_repository.dart b/lib/mypayment/repositories/users_me_repository.dart similarity index 86% rename from lib/paiement/repositories/users_me_repository.dart rename to lib/mypayment/repositories/users_me_repository.dart index e33b64b005..86048b05c4 100644 --- a/lib/paiement/repositories/users_me_repository.dart +++ b/lib/mypayment/repositories/users_me_repository.dart @@ -1,8 +1,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/class/user_store.dart'; -import 'package:titan/paiement/class/wallet.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/class/user_store.dart'; +import 'package:titan/mypayment/class/wallet.dart'; import 'package:titan/tools/repository/repository.dart'; class UsersMeRepository extends Repository { diff --git a/lib/paiement/router.dart b/lib/mypayment/router.dart similarity index 78% rename from lib/paiement/router.dart rename to lib/mypayment/router.dart index 4895966a5a..bf9aef6ea9 100644 --- a/lib/paiement/router.dart +++ b/lib/mypayment/router.dart @@ -1,30 +1,30 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/navigation/class/module.dart'; -import 'package:titan/paiement/providers/is_payment_admin.dart'; -import 'package:titan/paiement/ui/pages/structure_admin_page/structure_admin_page.dart' - deferred as structure_stores_page; -import 'package:titan/paiement/ui/pages/fund_page/web_view_modal.dart' +import 'package:titan/mypayment/providers/is_payment_admin.dart'; +import 'package:titan/mypayment/ui/pages/structure_admin_page/structure_admin_page.dart' + deferred as structure_admin_page; +import 'package:titan/mypayment/ui/pages/fund_page/web_view_modal.dart' deferred as fund_page; -import 'package:titan/paiement/ui/pages/invoices_admin_page/invoices_admin_page.dart' +import 'package:titan/mypayment/ui/pages/invoices_admin_page/invoices_admin_page.dart' deferred as invoices_admin_page; -import 'package:titan/paiement/ui/pages/invoices_structure_page/invoices_structure_page.dart' +import 'package:titan/mypayment/ui/pages/invoices_structure_page/invoices_structure_page.dart' deferred as structure_invoices_page; -import 'package:titan/paiement/ui/pages/store_pages/add_edit_store.dart' +import 'package:titan/mypayment/ui/pages/store_pages/add_edit_store.dart' deferred as add_edit_page; -import 'package:titan/paiement/ui/pages/store_admin_page/store_admin_page.dart' +import 'package:titan/mypayment/ui/pages/store_admin_page/store_admin_page.dart' deferred as store_admin_page; -import 'package:titan/paiement/ui/pages/devices_page/devices_page.dart' +import 'package:titan/mypayment/ui/pages/devices_page/devices_page.dart' deferred as devices_page; -import 'package:titan/paiement/ui/pages/main_page/main_page.dart' +import 'package:titan/mypayment/ui/pages/main_page/main_page.dart' deferred as main_page; -import 'package:titan/paiement/ui/pages/stats_page/stats_page.dart' +import 'package:titan/mypayment/ui/pages/stats_page/stats_page.dart' deferred as stats_page; -import 'package:titan/paiement/ui/pages/store_stats_page/store_stats_page.dart' +import 'package:titan/mypayment/ui/pages/store_stats_page/store_stats_page.dart' deferred as store_stats_page; -import 'package:titan/paiement/ui/pages/transfer_structure_page/transfer_structure_page.dart' +import 'package:titan/mypayment/ui/pages/transfer_structure_page/transfer_structure_page.dart' deferred as transfer_structure_page; +import 'package:titan/navigation/class/module.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/middlewares/admin_middleware.dart'; import 'package:titan/tools/middlewares/authenticated_middleware.dart'; @@ -33,7 +33,7 @@ import 'package:qlevar_router/qlevar_router.dart'; class PaymentRouter { final Ref ref; - static const String root = '/payment'; + static const String root = '/mypayment'; static const String stats = '/stats'; static const String devices = '/devices'; static const String structureStores = '/structureStores'; @@ -53,7 +53,7 @@ class PaymentRouter { PaymentRouter(this.ref); QRoute route() => QRoute( - name: "paiement", + name: "mypayment", path: PaymentRouter.root, builder: () => main_page.PaymentMainPage(), middleware: [ @@ -98,9 +98,9 @@ class PaymentRouter { ), QRoute( path: PaymentRouter.structureStores, - builder: () => structure_stores_page.StructureStoresPage(), + builder: () => structure_admin_page.StructureStorePage(), middleware: [ - DeferredLoadingMiddleware(structure_stores_page.loadLibrary), + DeferredLoadingMiddleware(structure_admin_page.loadLibrary), AdminMiddleware(ref, isStructureAdminProvider), ], children: [ diff --git a/lib/paiement/tools/functions.dart b/lib/mypayment/tools/functions.dart similarity index 96% rename from lib/paiement/tools/functions.dart rename to lib/mypayment/tools/functions.dart index d5dc5925bf..85affa0bbc 100644 --- a/lib/paiement/tools/functions.dart +++ b/lib/mypayment/tools/functions.dart @@ -2,11 +2,11 @@ import 'dart:convert'; import 'dart:math' as math; import 'package:flutter/material.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/class/qr_code_data.dart'; -import 'package:titan/paiement/class/qr_code_signature_data.dart'; -import 'package:titan/paiement/class/wallet_device.dart'; -import 'package:titan/paiement/tools/key_service.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/class/qr_code_data.dart'; +import 'package:titan/mypayment/class/qr_code_signature_data.dart'; +import 'package:titan/mypayment/class/wallet_device.dart'; +import 'package:titan/mypayment/tools/key_service.dart'; enum TransferType { helloAsso, check, cash, bankTransfer } diff --git a/lib/paiement/tools/key_service.dart b/lib/mypayment/tools/key_service.dart similarity index 100% rename from lib/paiement/tools/key_service.dart rename to lib/mypayment/tools/key_service.dart diff --git a/lib/paiement/tools/platform_info.dart b/lib/mypayment/tools/platform_info.dart similarity index 100% rename from lib/paiement/tools/platform_info.dart rename to lib/mypayment/tools/platform_info.dart diff --git a/lib/paiement/ui/components/digit_fade_in_animation.dart b/lib/mypayment/ui/components/digit_fade_in_animation.dart similarity index 100% rename from lib/paiement/ui/components/digit_fade_in_animation.dart rename to lib/mypayment/ui/components/digit_fade_in_animation.dart diff --git a/lib/paiement/ui/components/keyboard.dart b/lib/mypayment/ui/components/keyboard.dart similarity index 100% rename from lib/paiement/ui/components/keyboard.dart rename to lib/mypayment/ui/components/keyboard.dart diff --git a/lib/paiement/ui/components/transaction_card.dart b/lib/mypayment/ui/components/transaction_card.dart similarity index 98% rename from lib/paiement/ui/components/transaction_card.dart rename to lib/mypayment/ui/components/transaction_card.dart index 5c033d2cbc..a086e42b20 100644 --- a/lib/paiement/ui/components/transaction_card.dart +++ b/lib/mypayment/ui/components/transaction_card.dart @@ -4,9 +4,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:heroicons/heroicons.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/tools/functions.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/tools/functions.dart'; class TransactionCard extends ConsumerWidget { final History transaction; diff --git a/lib/paiement/ui/paiement.dart b/lib/mypayment/ui/mypayment.dart similarity index 94% rename from lib/paiement/ui/paiement.dart rename to lib/mypayment/ui/mypayment.dart index c1f2773542..3e25e72956 100644 --- a/lib/paiement/ui/paiement.dart +++ b/lib/mypayment/ui/mypayment.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/router.dart'; import 'package:titan/tools/ui/widgets/top_bar.dart'; import 'package:titan/tools/constants.dart'; +import 'package:titan/mypayment/router.dart'; class PaymentTemplate extends HookConsumerWidget { final Widget child; diff --git a/lib/paiement/ui/pages/devices_page/add_device_button.dart b/lib/mypayment/ui/pages/devices_page/add_device_button.dart similarity index 100% rename from lib/paiement/ui/pages/devices_page/add_device_button.dart rename to lib/mypayment/ui/pages/devices_page/add_device_button.dart diff --git a/lib/mypayment/ui/pages/devices_page/device_item.dart b/lib/mypayment/ui/pages/devices_page/device_item.dart new file mode 100644 index 0000000000..2d659f5f51 --- /dev/null +++ b/lib/mypayment/ui/pages/devices_page/device_item.dart @@ -0,0 +1,93 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:heroicons/heroicons.dart'; +import 'package:titan/mypayment/class/wallet_device.dart'; +import 'package:titan/mypayment/tools/functions.dart'; + +class DeviceItem extends ConsumerWidget { + final WalletDevice device; + final bool isActual; + final Future Function() onRevoke; + const DeviceItem({ + super.key, + required this.device, + required this.isActual, + required this.onRevoke, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 30), + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(15)), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + spreadRadius: 1, + blurRadius: 8, + offset: const Offset(0, 4), + ), + ], + ), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(15)), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: Container( + color: Colors.grey.shade200.withValues(alpha: 0.5), + child: SizedBox( + height: isActual ? 80 : 70, + child: Row( + children: [ + const SizedBox(width: 20), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + device.name, + style: const TextStyle( + color: Color(0xff204550), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + if (isActual) + const Text( + '(cet appareil)', + style: TextStyle( + color: Color(0xff204550), + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox(width: 10), + Spacer(), + getStatusTag(device.status), + if (device.status != WalletDeviceStatus.revoked) ...[ + const SizedBox(width: 20), + GestureDetector( + onTap: onRevoke, + child: const HeroIcon( + HeroIcons.trash, + size: 25, + color: Color(0xff204550), + ), + ), + ], + const SizedBox(width: 20), + ], + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/mypayment/ui/pages/devices_page/devices_page.dart b/lib/mypayment/ui/pages/devices_page/devices_page.dart new file mode 100644 index 0000000000..4331a6639f --- /dev/null +++ b/lib/mypayment/ui/pages/devices_page/devices_page.dart @@ -0,0 +1,329 @@ +import 'dart:convert'; + +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/mypayment/class/create_device.dart'; +import 'package:titan/mypayment/class/wallet_device.dart'; +import 'package:titan/mypayment/providers/device_list_provider.dart'; +import 'package:titan/mypayment/providers/device_provider.dart'; +import 'package:titan/mypayment/providers/has_accepted_tos_provider.dart'; +import 'package:titan/mypayment/providers/key_service_provider.dart'; +import 'package:titan/mypayment/tools/functions.dart'; +import 'package:titan/mypayment/ui/pages/devices_page/add_device_button.dart'; +import 'package:titan/mypayment/ui/pages/devices_page/device_item.dart'; +import 'package:titan/mypayment/ui/pages/main_page/account_card/device_dialog_box.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; +import 'package:titan/tools/functions.dart'; +import 'package:titan/tools/token_expire_wrapper.dart'; +import 'package:titan/tools/ui/builders/async_child.dart'; +import 'package:titan/tools/ui/layouts/refresher.dart'; +import 'package:titan/tools/ui/widgets/custom_dialog_box.dart'; + +class DevicesPage extends HookConsumerWidget { + const DevicesPage({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final devices = ref.watch(deviceListProvider); + final devicesNotifier = ref.read(deviceListProvider.notifier); + final deviceNotifier = ref.read(deviceProvider.notifier); + final keyService = ref.watch(keyServiceProvider); + final deviceKey = keyService.getKeyId(); + final displayAddDevice = useState(true); + final hasAcceptedToS = ref.watch(hasAcceptedTosProvider); + final showRovokedDevices = useState(false); + + void displayToastWithContext(TypeMsg type, String msg) { + displayToast(context, type, msg); + } + + Future getDeviceName() async { + final deviceInfo = DeviceInfoPlugin(); + if (Theme.of(context).platform == TargetPlatform.android) { + return deviceInfo.androidInfo.then((info) => info.model); + } else if (Theme.of(context).platform == TargetPlatform.iOS) { + return deviceInfo.iosInfo.then((info) => info.utsname.machine); + } else { + return Future.value("Unknown Device"); + } + } + + return PaymentTemplate( + child: Refresher( + controller: ScrollController(), + onRefresh: () async { + await devicesNotifier.getDeviceList(); + }, + child: FutureBuilder( + future: deviceKey, + builder: (context, snapshot) { + return AsyncChild( + value: devices, + builder: (context, devices) { + final activeDevices = devices + .where( + (device) => device.status != WalletDeviceStatus.revoked, + ) + .toList(); + + final inactiveDevices = devices + .where( + (device) => device.status == WalletDeviceStatus.revoked, + ) + .toList(); + + activeDevices.sort((a, b) { + if (a.id == snapshot.data) return -1; + if (b.id == snapshot.data) return 1; + return statusOrder(a.status).compareTo(statusOrder(b.status)); + }); + + inactiveDevices.sort((a, b) { + if (a.id == snapshot.data) return -1; + if (b.id == snapshot.data) return 1; + return statusOrder(a.status).compareTo(statusOrder(b.status)); + }); + + final firstDevice = devices + .where((element) => element.id == snapshot.data) + .firstOrNull; + + final shouldDisplayAddDevice = + (snapshot.data == null || + firstDevice == null || + firstDevice.status == WalletDeviceStatus.revoked) && + displayAddDevice.value; + + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (shouldDisplayAddDevice && !kIsWeb) + AddDeviceButton( + onTap: () async { + if (!hasAcceptedToS) { + displayToastWithContext( + TypeMsg.error, + "Veuillez accepter les Conditions Générales d'Utilisation.", + ); + return; + } + final name = await getDeviceName(); + final keyPair = await keyService.generateKeyPair(); + final publicKey = + (await keyPair.extractPublicKey()).bytes; + final base64PublicKey = base64Encode(publicKey); + final body = CreateDevice( + name: name, + ed25519PublicKey: base64PublicKey, + ); + final value = await deviceNotifier.registerDevice( + body, + ); + if (value != null) { + await keyService.saveKeyPair(keyPair); + await keyService.saveKeyId(value); + await devicesNotifier.getDeviceList(); + displayAddDevice.value = false; + if (context.mounted) { + await showDialog( + context: context, + builder: (context) { + return DeviceDialogBox( + title: + 'Demande d\'activation de l\'appareil', + descriptions: + "La demande d'activation est prise en compte, veuillez consulter votre boite mail pour finaliser la démarche", + buttonText: "Ok", + onClick: () { + Navigator.of(context).pop(); + }, + ); + }, + ); + } + } + }, + ), + // Afficher les appareils actifs + ...activeDevices.map((device) { + return DeviceItem( + device: device, + isActual: device.id == snapshot.data, + onRevoke: () async { + if (!hasAcceptedToS) { + displayToastWithContext( + TypeMsg.error, + "Veuillez accepter les Conditions Générales d'Utilisation.", + ); + return; + } + await showDialog( + context: context, + builder: (context) { + return CustomDialogBox( + title: "Révoquer l'appareil ?", + descriptions: + "Vous ne pourrez plus utiliser cet appareil pour les paiements", + onYes: () async { + tokenExpireWrapper(ref, () async { + final value = await devicesNotifier + .revokeDevice( + device.copyWith( + status: WalletDeviceStatus.revoked, + ), + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Appareil révoqué", + ); + final savedId = await keyService + .getKeyId(); + if (savedId == device.id) { + await keyService.clear(); + } + } else { + displayToastWithContext( + TypeMsg.error, + "Erreur lors de la révocation de l'appareil", + ); + } + }); + }, + ); + }, + ); + }, + ); + }), + + if (inactiveDevices.isNotEmpty) ...[ + GestureDetector( + onTap: () { + showRovokedDevices.value = !showRovokedDevices.value; + }, + child: Container( + margin: const EdgeInsets.only( + bottom: 10, + top: 20, + left: 30, + right: 30, + ), + width: double.infinity, + height: 70, + decoration: BoxDecoration( + gradient: RadialGradient( + colors: const [ + Color.fromARGB(255, 9, 103, 103), + Color(0xff017f80), + Color.fromARGB(255, 4, 84, 84), + ], + center: Alignment.topLeft, + radius: 1.5, + ), + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Color(0xff017f80).withValues(alpha: 0.2), + spreadRadius: 1, + blurRadius: 3, + offset: const Offset( + 0, + 1, + ), // changes position of shadow + ), + ], + ), + child: Center( + child: Text( + showRovokedDevices.value + ? 'Masquer les appareils revoqués' + : 'Afficher les appareils revoqués', + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + if (showRovokedDevices.value) ...[ + const Padding( + padding: EdgeInsets.all(16.0), + child: Text( + 'Appareils révoqués', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ), + ...inactiveDevices.map((device) { + return DeviceItem( + device: device, + isActual: device.id == snapshot.data, + onRevoke: () async { + if (!hasAcceptedToS) { + displayToastWithContext( + TypeMsg.error, + "Veuillez accepter les Conditions Générales d'Utilisation.", + ); + return; + } + await showDialog( + context: context, + builder: (context) { + return CustomDialogBox( + title: "Révoquer l'appareil ?", + descriptions: + "Vous ne pourrez plus utiliser cet appareil pour les paiements", + onYes: () async { + tokenExpireWrapper(ref, () async { + final value = await devicesNotifier + .revokeDevice( + device.copyWith( + status: + WalletDeviceStatus.revoked, + ), + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Appareil révoqué", + ); + final savedId = await keyService + .getKeyId(); + if (savedId == device.id) { + await keyService.clear(); + } + } else { + displayToastWithContext( + TypeMsg.error, + "Erreur lors de la révocation de l'appareil", + ); + } + }); + }, + ); + }, + ); + }, + ); + }), + ], + ], + ], + ); + }, + ); + }, + ), + ), + ); + } +} diff --git a/lib/paiement/ui/pages/fund_page/confirm_button.dart b/lib/mypayment/ui/pages/fund_page/confirm_button.dart similarity index 92% rename from lib/paiement/ui/pages/fund_page/confirm_button.dart rename to lib/mypayment/ui/pages/fund_page/confirm_button.dart index 06e19bcd4b..8f1ea99086 100644 --- a/lib/paiement/ui/pages/fund_page/confirm_button.dart +++ b/lib/mypayment/ui/pages/fund_page/confirm_button.dart @@ -5,12 +5,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/init_info.dart'; -import 'package:titan/paiement/providers/fund_amount_provider.dart'; -import 'package:titan/paiement/providers/funding_url_provider.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; -import 'package:titan/paiement/providers/my_wallet_provider.dart'; -import 'package:titan/paiement/providers/tos_provider.dart'; +import 'package:titan/mypayment/class/init_info.dart'; +import 'package:titan/mypayment/providers/fund_amount_provider.dart'; +import 'package:titan/mypayment/providers/funding_url_provider.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; +import 'package:titan/mypayment/providers/my_wallet_provider.dart'; +import 'package:titan/mypayment/providers/tos_provider.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/ui/builders/waiting_button.dart'; import 'package:universal_html/html.dart' as html; @@ -38,8 +38,8 @@ class ConfirmFundButton extends ConsumerWidget { ); final redirectUrl = kIsWeb - ? "${getTitanURL()}/payment" - : "${getTitanURLScheme()}://payment"; + ? "${getTitanURL()}mypayment" // ? + : "${getTitanURLScheme()}://mypayment"; final amountToAdd = double.tryParse(fundAmount.replaceAll(",", ".")) ?? 0; final minValidFundAmount = diff --git a/lib/paiement/ui/pages/fund_page/fund_page.dart b/lib/mypayment/ui/pages/fund_page/fund_page.dart similarity index 92% rename from lib/paiement/ui/pages/fund_page/fund_page.dart rename to lib/mypayment/ui/pages/fund_page/fund_page.dart index 47c4836662..46797d17da 100644 --- a/lib/paiement/ui/pages/fund_page/fund_page.dart +++ b/lib/mypayment/ui/pages/fund_page/fund_page.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/fund_amount_provider.dart'; -import 'package:titan/paiement/providers/my_wallet_provider.dart'; -import 'package:titan/paiement/providers/tos_provider.dart'; -import 'package:titan/paiement/ui/components/digit_fade_in_animation.dart'; -import 'package:titan/paiement/ui/components/keyboard.dart'; -import 'package:titan/paiement/ui/pages/fund_page/confirm_button.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; +import 'package:titan/mypayment/providers/fund_amount_provider.dart'; +import 'package:titan/mypayment/providers/my_wallet_provider.dart'; +import 'package:titan/mypayment/providers/tos_provider.dart'; +import 'package:titan/mypayment/ui/components/digit_fade_in_animation.dart'; +import 'package:titan/mypayment/ui/components/keyboard.dart'; +import 'package:titan/mypayment/ui/pages/fund_page/confirm_button.dart'; class FundPage extends ConsumerWidget { const FundPage({super.key}); diff --git a/lib/paiement/ui/pages/fund_page/web_view_modal.dart b/lib/mypayment/ui/pages/fund_page/web_view_modal.dart similarity index 100% rename from lib/paiement/ui/pages/fund_page/web_view_modal.dart rename to lib/mypayment/ui/pages/fund_page/web_view_modal.dart diff --git a/lib/paiement/ui/pages/invoices_admin_page/invoice_card.dart b/lib/mypayment/ui/pages/invoices_admin_page/invoice_card.dart similarity index 97% rename from lib/paiement/ui/pages/invoices_admin_page/invoice_card.dart rename to lib/mypayment/ui/pages/invoices_admin_page/invoice_card.dart index cc7bc7e989..c504dd3fa4 100644 --- a/lib/paiement/ui/pages/invoices_admin_page/invoice_card.dart +++ b/lib/mypayment/ui/pages/invoices_admin_page/invoice_card.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/invoice.dart'; -import 'package:titan/paiement/providers/invoice_list_provider.dart'; -import 'package:titan/paiement/providers/invoice_pdf_provider.dart'; +import 'package:titan/mypayment/class/invoice.dart'; +import 'package:titan/mypayment/providers/invoice_list_provider.dart'; +import 'package:titan/mypayment/providers/invoice_pdf_provider.dart'; import 'package:titan/tools/constants.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/ui/styleguide/bottom_modal_template.dart'; diff --git a/lib/paiement/ui/pages/invoices_admin_page/invoices_admin_page.dart b/lib/mypayment/ui/pages/invoices_admin_page/invoices_admin_page.dart similarity index 96% rename from lib/paiement/ui/pages/invoices_admin_page/invoices_admin_page.dart rename to lib/mypayment/ui/pages/invoices_admin_page/invoices_admin_page.dart index 45e2fa5e18..6ec048f413 100644 --- a/lib/paiement/ui/pages/invoices_admin_page/invoices_admin_page.dart +++ b/lib/mypayment/ui/pages/invoices_admin_page/invoices_admin_page.dart @@ -6,10 +6,10 @@ import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/admin/providers/structure_provider.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/invoice_list_provider.dart'; -import 'package:titan/paiement/providers/structure_list_provider.dart'; -import 'package:titan/paiement/ui/pages/invoices_admin_page/invoice_card.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/providers/invoice_list_provider.dart'; +import 'package:titan/mypayment/providers/structure_list_provider.dart'; +import 'package:titan/mypayment/ui/pages/invoices_admin_page/invoice_card.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/constants.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; diff --git a/lib/paiement/ui/pages/invoices_structure_page/invoices_structure_page.dart b/lib/mypayment/ui/pages/invoices_structure_page/invoices_structure_page.dart similarity index 92% rename from lib/paiement/ui/pages/invoices_structure_page/invoices_structure_page.dart rename to lib/mypayment/ui/pages/invoices_structure_page/invoices_structure_page.dart index 1edec34da4..39272555fa 100644 --- a/lib/paiement/ui/pages/invoices_structure_page/invoices_structure_page.dart +++ b/lib/mypayment/ui/pages/invoices_structure_page/invoices_structure_page.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/providers/invoice_list_provider.dart'; -import 'package:titan/paiement/providers/selected_structure_provider.dart'; -import 'package:titan/paiement/ui/pages/invoices_admin_page/invoice_card.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/providers/invoice_list_provider.dart'; +import 'package:titan/mypayment/providers/selected_structure_provider.dart'; +import 'package:titan/mypayment/ui/pages/invoices_admin_page/invoice_card.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/constants.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; diff --git a/lib/paiement/ui/pages/main_page/account_card/account_card.dart b/lib/mypayment/ui/pages/main_page/account_card/account_card.dart similarity index 89% rename from lib/paiement/ui/pages/main_page/account_card/account_card.dart rename to lib/mypayment/ui/pages/main_page/account_card/account_card.dart index 318baaf465..a085f385cf 100644 --- a/lib/paiement/ui/pages/main_page/account_card/account_card.dart +++ b/lib/mypayment/ui/pages/main_page/account_card/account_card.dart @@ -4,20 +4,20 @@ import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/wallet_device.dart'; -import 'package:titan/paiement/providers/device_list_provider.dart'; -import 'package:titan/paiement/providers/device_provider.dart'; -import 'package:titan/paiement/providers/fund_amount_provider.dart'; -import 'package:titan/paiement/providers/has_accepted_tos_provider.dart'; -import 'package:titan/paiement/providers/key_service_provider.dart'; -import 'package:titan/paiement/providers/my_wallet_provider.dart'; -import 'package:titan/paiement/providers/pay_amount_provider.dart'; -import 'package:titan/paiement/router.dart'; -import 'package:titan/paiement/ui/pages/fund_page/fund_page.dart'; -import 'package:titan/paiement/ui/pages/main_page/account_card/device_dialog_box.dart'; -import 'package:titan/paiement/ui/pages/main_page/main_card_button.dart'; -import 'package:titan/paiement/ui/pages/main_page/main_card_template.dart'; -import 'package:titan/paiement/ui/pages/pay_page/pay_page.dart'; +import 'package:titan/mypayment/class/wallet_device.dart'; +import 'package:titan/mypayment/providers/device_list_provider.dart'; +import 'package:titan/mypayment/providers/device_provider.dart'; +import 'package:titan/mypayment/providers/fund_amount_provider.dart'; +import 'package:titan/mypayment/providers/has_accepted_tos_provider.dart'; +import 'package:titan/mypayment/providers/key_service_provider.dart'; +import 'package:titan/mypayment/providers/my_wallet_provider.dart'; +import 'package:titan/mypayment/providers/pay_amount_provider.dart'; +import 'package:titan/mypayment/router.dart'; +import 'package:titan/mypayment/ui/pages/fund_page/fund_page.dart'; +import 'package:titan/mypayment/ui/pages/main_page/account_card/device_dialog_box.dart'; +import 'package:titan/mypayment/ui/pages/main_page/main_card_button.dart'; +import 'package:titan/mypayment/ui/pages/main_page/main_card_template.dart'; +import 'package:titan/mypayment/ui/pages/pay_page/pay_page.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; diff --git a/lib/paiement/ui/pages/main_page/account_card/day_divider.dart b/lib/mypayment/ui/pages/main_page/account_card/day_divider.dart similarity index 100% rename from lib/paiement/ui/pages/main_page/account_card/day_divider.dart rename to lib/mypayment/ui/pages/main_page/account_card/day_divider.dart diff --git a/lib/paiement/ui/pages/main_page/account_card/device_dialog_box.dart b/lib/mypayment/ui/pages/main_page/account_card/device_dialog_box.dart similarity index 100% rename from lib/paiement/ui/pages/main_page/account_card/device_dialog_box.dart rename to lib/mypayment/ui/pages/main_page/account_card/device_dialog_box.dart diff --git a/lib/paiement/ui/pages/main_page/account_card/last_transactions.dart b/lib/mypayment/ui/pages/main_page/account_card/last_transactions.dart similarity index 92% rename from lib/paiement/ui/pages/main_page/account_card/last_transactions.dart rename to lib/mypayment/ui/pages/main_page/account_card/last_transactions.dart index c361dd963b..f0ffda9776 100644 --- a/lib/paiement/ui/pages/main_page/account_card/last_transactions.dart +++ b/lib/mypayment/ui/pages/main_page/account_card/last_transactions.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; -import 'package:titan/paiement/ui/pages/main_page/account_card/day_divider.dart'; -import 'package:titan/paiement/ui/components/transaction_card.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; +import 'package:titan/mypayment/ui/pages/main_page/account_card/day_divider.dart'; +import 'package:titan/mypayment/ui/components/transaction_card.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:timeago/timeago.dart' as timeago; diff --git a/lib/paiement/ui/pages/main_page/flip_card.dart b/lib/mypayment/ui/pages/main_page/flip_card.dart similarity index 93% rename from lib/paiement/ui/pages/main_page/flip_card.dart rename to lib/mypayment/ui/pages/main_page/flip_card.dart index 451c29f7a8..5d8c405ee7 100644 --- a/lib/paiement/ui/pages/main_page/flip_card.dart +++ b/lib/mypayment/ui/pages/main_page/flip_card.dart @@ -2,8 +2,8 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; -import 'package:titan/paiement/providers/my_wallet_provider.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; +import 'package:titan/mypayment/providers/my_wallet_provider.dart'; class FlipCard extends HookConsumerWidget { final Widget front; diff --git a/lib/paiement/ui/pages/main_page/main_card_button.dart b/lib/mypayment/ui/pages/main_page/main_card_button.dart similarity index 100% rename from lib/paiement/ui/pages/main_page/main_card_button.dart rename to lib/mypayment/ui/pages/main_page/main_card_button.dart diff --git a/lib/paiement/ui/pages/main_page/main_card_template.dart b/lib/mypayment/ui/pages/main_page/main_card_template.dart similarity index 97% rename from lib/paiement/ui/pages/main_page/main_card_template.dart rename to lib/mypayment/ui/pages/main_page/main_card_template.dart index 21f435083f..d93af67602 100644 --- a/lib/paiement/ui/pages/main_page/main_card_template.dart +++ b/lib/mypayment/ui/pages/main_page/main_card_template.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; -import 'package:titan/paiement/ui/pages/main_page/main_card_button.dart'; +import 'package:titan/mypayment/ui/pages/main_page/main_card_button.dart'; class MainCardTemplate extends StatelessWidget { final List actionButtons; diff --git a/lib/paiement/ui/pages/main_page/main_page.dart b/lib/mypayment/ui/pages/main_page/main_page.dart similarity index 86% rename from lib/paiement/ui/pages/main_page/main_page.dart rename to lib/mypayment/ui/pages/main_page/main_page.dart index 2738ca2131..753c86652d 100644 --- a/lib/paiement/ui/pages/main_page/main_page.dart +++ b/lib/mypayment/ui/pages/main_page/main_page.dart @@ -3,21 +3,21 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; import 'package:titan/navigation/ui/scroll_to_hide_navbar.dart'; -import 'package:titan/paiement/providers/has_accepted_tos_provider.dart'; -import 'package:titan/paiement/providers/my_wallet_provider.dart'; -import 'package:titan/paiement/providers/tos_provider.dart'; -import 'package:titan/paiement/providers/is_payment_admin.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; -import 'package:titan/paiement/providers/my_stores_provider.dart'; -import 'package:titan/paiement/providers/register_provider.dart'; -import 'package:titan/paiement/providers/should_display_tos_dialog.dart'; -import 'package:titan/paiement/ui/pages/main_page/account_card/account_card.dart'; -import 'package:titan/paiement/ui/pages/main_page/tos_dialog.dart'; -import 'package:titan/paiement/ui/pages/main_page/account_card/last_transactions.dart'; -import 'package:titan/paiement/ui/pages/main_page/flip_card.dart'; -import 'package:titan/paiement/ui/pages/main_page/seller_card/store_card.dart'; -import 'package:titan/paiement/ui/pages/main_page/seller_card/store_list.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/providers/is_payment_admin.dart'; +import 'package:titan/mypayment/providers/has_accepted_tos_provider.dart'; +import 'package:titan/mypayment/providers/my_wallet_provider.dart'; +import 'package:titan/mypayment/providers/tos_provider.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; +import 'package:titan/mypayment/providers/my_stores_provider.dart'; +import 'package:titan/mypayment/providers/register_provider.dart'; +import 'package:titan/mypayment/providers/should_display_tos_dialog.dart'; +import 'package:titan/mypayment/ui/pages/main_page/account_card/account_card.dart'; +import 'package:titan/mypayment/ui/pages/main_page/tos_dialog.dart'; +import 'package:titan/mypayment/ui/pages/main_page/account_card/last_transactions.dart'; +import 'package:titan/mypayment/ui/pages/main_page/flip_card.dart'; +import 'package:titan/mypayment/ui/pages/main_page/seller_card/store_card.dart'; +import 'package:titan/mypayment/ui/pages/main_page/seller_card/store_list.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/providers/path_forwarding_provider.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; @@ -46,7 +46,7 @@ class PaymentMainPage extends HookConsumerWidget { final mySellersNotifier = ref.read(myStoresProvider.notifier); final myHistoryNotifier = ref.read(myHistoryProvider.notifier); final myWalletNotifier = ref.read(myWalletProvider.notifier); - final isAdmin = ref.watch(isStructureAdminProvider); + final isStructureAdmin = ref.watch(isStructureAdminProvider); final flipped = useState(true); ref.listen(pathForwardingProvider, (previous, next) async { @@ -152,7 +152,7 @@ class PaymentMainPage extends HookConsumerWidget { AsyncChild( value: mySellers, builder: (context, mySellers) { - if (mySellers.isEmpty && !isAdmin) { + if (mySellers.isEmpty && !isStructureAdmin) { return SizedBox( height: 250, width: MediaQuery.of(context).size.width, diff --git a/lib/paiement/ui/pages/main_page/seller_card/admin_invoice_card.dart b/lib/mypayment/ui/pages/main_page/seller_card/admin_invoice_card.dart similarity index 94% rename from lib/paiement/ui/pages/main_page/seller_card/admin_invoice_card.dart rename to lib/mypayment/ui/pages/main_page/seller_card/admin_invoice_card.dart index a6bde2e160..a892ef4cdf 100644 --- a/lib/paiement/ui/pages/main_page/seller_card/admin_invoice_card.dart +++ b/lib/mypayment/ui/pages/main_page/seller_card/admin_invoice_card.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/invoice_list_provider.dart'; -import 'package:titan/paiement/router.dart'; import 'package:qlevar_router/qlevar_router.dart'; import 'package:titan/tools/constants.dart'; +import 'package:titan/mypayment/providers/invoice_list_provider.dart'; +import 'package:titan/mypayment/router.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; class InvoiceAdminCard extends ConsumerWidget { diff --git a/lib/paiement/ui/pages/main_page/seller_card/store_card.dart b/lib/mypayment/ui/pages/main_page/seller_card/store_card.dart similarity index 88% rename from lib/paiement/ui/pages/main_page/seller_card/store_card.dart rename to lib/mypayment/ui/pages/main_page/seller_card/store_card.dart index ee7c0faf09..2daec3db34 100644 --- a/lib/paiement/ui/pages/main_page/seller_card/store_card.dart +++ b/lib/mypayment/ui/pages/main_page/seller_card/store_card.dart @@ -3,14 +3,14 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/barcode_provider.dart'; -import 'package:titan/paiement/providers/ongoing_transaction.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/router.dart'; -import 'package:titan/paiement/ui/pages/main_page/main_card_button.dart'; -import 'package:titan/paiement/ui/pages/main_page/main_card_template.dart'; -import 'package:titan/paiement/ui/pages/scan_page/scan_page.dart'; import 'package:titan/tools/ui/styleguide/bottom_modal_template.dart'; +import 'package:titan/mypayment/providers/barcode_provider.dart'; +import 'package:titan/mypayment/providers/ongoing_transaction.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/router.dart'; +import 'package:titan/mypayment/ui/pages/main_page/main_card_button.dart'; +import 'package:titan/mypayment/ui/pages/main_page/main_card_template.dart'; +import 'package:titan/mypayment/ui/pages/scan_page/scan_page.dart'; import 'package:titan/user/providers/user_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; diff --git a/lib/paiement/ui/pages/main_page/seller_card/store_divider.dart b/lib/mypayment/ui/pages/main_page/seller_card/store_divider.dart similarity index 100% rename from lib/paiement/ui/pages/main_page/seller_card/store_divider.dart rename to lib/mypayment/ui/pages/main_page/seller_card/store_divider.dart diff --git a/lib/paiement/ui/pages/main_page/seller_card/store_list.dart b/lib/mypayment/ui/pages/main_page/seller_card/store_list.dart similarity index 84% rename from lib/paiement/ui/pages/main_page/seller_card/store_list.dart rename to lib/mypayment/ui/pages/main_page/seller_card/store_list.dart index 7208083b63..442366e68f 100644 --- a/lib/paiement/ui/pages/main_page/seller_card/store_list.dart +++ b/lib/mypayment/ui/pages/main_page/seller_card/store_list.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/user_store.dart'; -import 'package:titan/paiement/providers/is_payment_admin.dart'; -import 'package:titan/paiement/providers/my_stores_provider.dart'; -import 'package:titan/paiement/ui/pages/main_page/seller_card/admin_invoice_card.dart'; -import 'package:titan/paiement/ui/pages/main_page/seller_card/structure_admin_card.dart'; -import 'package:titan/paiement/ui/pages/main_page/seller_card/store_divider.dart'; -import 'package:titan/paiement/ui/pages/main_page/seller_card/store_seller_card.dart'; +import 'package:titan/mypayment/class/user_store.dart'; +import 'package:titan/mypayment/providers/is_payment_admin.dart'; +import 'package:titan/mypayment/providers/my_stores_provider.dart'; +import 'package:titan/mypayment/ui/pages/main_page/seller_card/admin_invoice_card.dart'; +import 'package:titan/mypayment/ui/pages/main_page/seller_card/store_divider.dart'; +import 'package:titan/mypayment/ui/pages/main_page/seller_card/store_seller_card.dart'; +import 'package:titan/mypayment/ui/pages/main_page/seller_card/structure_admin_card.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; class StoreList extends ConsumerWidget { diff --git a/lib/paiement/ui/pages/main_page/seller_card/store_seller_card.dart b/lib/mypayment/ui/pages/main_page/seller_card/store_seller_card.dart similarity index 93% rename from lib/paiement/ui/pages/main_page/seller_card/store_seller_card.dart rename to lib/mypayment/ui/pages/main_page/seller_card/store_seller_card.dart index 93d35d6768..177c0145b7 100644 --- a/lib/paiement/ui/pages/main_page/seller_card/store_seller_card.dart +++ b/lib/mypayment/ui/pages/main_page/seller_card/store_seller_card.dart @@ -2,8 +2,8 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:heroicons/heroicons.dart'; -import 'package:titan/paiement/class/user_store.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/class/user_store.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; class StoreSellerCard extends ConsumerWidget { final UserStore store; diff --git a/lib/paiement/ui/pages/main_page/seller_card/structure_admin_card.dart b/lib/mypayment/ui/pages/main_page/seller_card/structure_admin_card.dart similarity index 91% rename from lib/paiement/ui/pages/main_page/seller_card/structure_admin_card.dart rename to lib/mypayment/ui/pages/main_page/seller_card/structure_admin_card.dart index c89fcb8964..3529568c8b 100644 --- a/lib/paiement/ui/pages/main_page/seller_card/structure_admin_card.dart +++ b/lib/mypayment/ui/pages/main_page/seller_card/structure_admin_card.dart @@ -3,14 +3,14 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/invoice_list_provider.dart'; -import 'package:titan/paiement/providers/my_structures_provider.dart'; -import 'package:titan/paiement/providers/selected_structure_provider.dart'; -import 'package:titan/paiement/router.dart'; import 'package:qlevar_router/qlevar_router.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/styleguide/bottom_modal_template.dart'; import 'package:titan/tools/ui/styleguide/button.dart'; +import 'package:titan/mypayment/providers/invoice_list_provider.dart'; +import 'package:titan/mypayment/providers/my_structures_provider.dart'; +import 'package:titan/mypayment/providers/selected_structure_provider.dart'; +import 'package:titan/mypayment/router.dart'; class StructureAdminCard extends ConsumerWidget { const StructureAdminCard({super.key}); @@ -61,8 +61,8 @@ class StructureAdminCard extends ConsumerWidget { ], ), ), - onTap: () { - showCustomBottomModal( + onTap: () async { + await showCustomBottomModal( context: context, modal: BottomModalTemplate( title: structure.name, diff --git a/lib/paiement/ui/pages/main_page/tos_dialog.dart b/lib/mypayment/ui/pages/main_page/tos_dialog.dart similarity index 100% rename from lib/paiement/ui/pages/main_page/tos_dialog.dart rename to lib/mypayment/ui/pages/main_page/tos_dialog.dart diff --git a/lib/paiement/ui/pages/pay_page/confirm_button.dart b/lib/mypayment/ui/pages/pay_page/confirm_button.dart similarity index 94% rename from lib/paiement/ui/pages/pay_page/confirm_button.dart rename to lib/mypayment/ui/pages/pay_page/confirm_button.dart index b2c36140cb..2fb6b68121 100644 --- a/lib/paiement/ui/pages/pay_page/confirm_button.dart +++ b/lib/mypayment/ui/pages/pay_page/confirm_button.dart @@ -7,12 +7,12 @@ import 'package:local_auth_android/local_auth_android.dart'; import 'package:local_auth_darwin/local_auth_darwin.dart'; import 'package:titan/event/tools/functions.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/key_service_provider.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; -import 'package:titan/paiement/providers/my_wallet_provider.dart'; -import 'package:titan/paiement/providers/pay_amount_provider.dart'; -import 'package:titan/paiement/ui/pages/pay_page/info_card.dart'; -import 'package:titan/paiement/ui/pages/pay_page/qr_code.dart'; +import 'package:titan/mypayment/providers/key_service_provider.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; +import 'package:titan/mypayment/providers/my_wallet_provider.dart'; +import 'package:titan/mypayment/providers/pay_amount_provider.dart'; +import 'package:titan/mypayment/ui/pages/pay_page/info_card.dart'; +import 'package:titan/mypayment/ui/pages/pay_page/qr_code.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; import 'package:titan/tools/ui/layouts/add_edit_button_layout.dart'; diff --git a/lib/paiement/ui/pages/pay_page/info_card.dart b/lib/mypayment/ui/pages/pay_page/info_card.dart similarity index 100% rename from lib/paiement/ui/pages/pay_page/info_card.dart rename to lib/mypayment/ui/pages/pay_page/info_card.dart diff --git a/lib/paiement/ui/pages/pay_page/pay_page.dart b/lib/mypayment/ui/pages/pay_page/pay_page.dart similarity index 92% rename from lib/paiement/ui/pages/pay_page/pay_page.dart rename to lib/mypayment/ui/pages/pay_page/pay_page.dart index 208e802698..29ef5e135d 100644 --- a/lib/paiement/ui/pages/pay_page/pay_page.dart +++ b/lib/mypayment/ui/pages/pay_page/pay_page.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/my_wallet_provider.dart'; -import 'package:titan/paiement/providers/pay_amount_provider.dart'; -import 'package:titan/paiement/ui/pages/pay_page/confirm_button.dart'; -import 'package:titan/paiement/ui/components/digit_fade_in_animation.dart'; -import 'package:titan/paiement/ui/components/keyboard.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; +import 'package:titan/mypayment/providers/my_wallet_provider.dart'; +import 'package:titan/mypayment/providers/pay_amount_provider.dart'; +import 'package:titan/mypayment/ui/pages/pay_page/confirm_button.dart'; +import 'package:titan/mypayment/ui/components/digit_fade_in_animation.dart'; +import 'package:titan/mypayment/ui/components/keyboard.dart'; class PayPage extends ConsumerWidget { const PayPage({super.key}); diff --git a/lib/mypayment/ui/pages/pay_page/qr_code.dart b/lib/mypayment/ui/pages/pay_page/qr_code.dart new file mode 100644 index 0000000000..dee8cdeb55 --- /dev/null +++ b/lib/mypayment/ui/pages/pay_page/qr_code.dart @@ -0,0 +1,59 @@ +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:titan/mypayment/providers/key_service_provider.dart'; +import 'package:titan/mypayment/providers/pay_amount_provider.dart'; +import 'package:titan/mypayment/tools/functions.dart'; +import 'package:titan/tools/ui/widgets/loader.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:uuid/uuid.dart'; + +class QrCode extends ConsumerWidget { + const QrCode({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final payAmount = ref.watch(payAmountProvider); + final id = const Uuid().v4(); + final keyService = ref.watch(keyServiceProvider); + return FutureBuilder( + future: getQRCodeContent(id, payAmount, keyService, true), + builder: (context, snapshot) { + switch (snapshot) { + case AsyncSnapshot(:final error?): + if (kDebugMode) { + debugPrint('Could not load QR code: $error'); + } + return Center(child: Text('Erreur lors du chargement du QR code')); + case AsyncSnapshot(:final data?): + return Center( + child: QrImageView( + data: data, + version: QrVersions.auto, + size: min( + MediaQuery.of(context).size.width * 0.8, + MediaQuery.of(context).size.height * 0.8, + ), + eyeStyle: const QrEyeStyle( + color: Colors.black, + eyeShape: QrEyeShape.square, + ), + dataModuleStyle: const QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.square, + color: Colors.black, + ), + ), + ); + case AsyncSnapshot(): + return SizedBox( + width: MediaQuery.of(context).size.width * 0.8, + height: MediaQuery.of(context).size.width * 0.8, + child: const Loader(), + ); + } + }, + ); + } +} diff --git a/lib/paiement/ui/pages/scan_page/cancel_button.dart b/lib/mypayment/ui/pages/scan_page/cancel_button.dart similarity index 100% rename from lib/paiement/ui/pages/scan_page/cancel_button.dart rename to lib/mypayment/ui/pages/scan_page/cancel_button.dart diff --git a/lib/paiement/ui/pages/scan_page/scan_overlay_shape.dart b/lib/mypayment/ui/pages/scan_page/scan_overlay_shape.dart similarity index 100% rename from lib/paiement/ui/pages/scan_page/scan_overlay_shape.dart rename to lib/mypayment/ui/pages/scan_page/scan_overlay_shape.dart diff --git a/lib/paiement/ui/pages/scan_page/scan_page.dart b/lib/mypayment/ui/pages/scan_page/scan_page.dart similarity index 97% rename from lib/paiement/ui/pages/scan_page/scan_page.dart rename to lib/mypayment/ui/pages/scan_page/scan_page.dart index 39a38ac68f..6ae87ffb16 100644 --- a/lib/paiement/ui/pages/scan_page/scan_page.dart +++ b/lib/mypayment/ui/pages/scan_page/scan_page.dart @@ -4,13 +4,13 @@ import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/barcode_provider.dart'; -import 'package:titan/paiement/providers/bypass_provider.dart'; -import 'package:titan/paiement/providers/ongoing_transaction.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/providers/transaction_provider.dart'; -import 'package:titan/paiement/ui/pages/scan_page/cancel_button.dart'; -import 'package:titan/paiement/ui/pages/scan_page/scanner.dart'; +import 'package:titan/mypayment/providers/barcode_provider.dart'; +import 'package:titan/mypayment/providers/bypass_provider.dart'; +import 'package:titan/mypayment/providers/ongoing_transaction.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/providers/transaction_provider.dart'; +import 'package:titan/mypayment/ui/pages/scan_page/cancel_button.dart'; +import 'package:titan/mypayment/ui/pages/scan_page/scanner.dart'; import 'package:titan/tools/exception.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; diff --git a/lib/paiement/ui/pages/scan_page/scanner.dart b/lib/mypayment/ui/pages/scan_page/scanner.dart similarity index 94% rename from lib/paiement/ui/pages/scan_page/scanner.dart rename to lib/mypayment/ui/pages/scan_page/scanner.dart index 69223197e7..f82dbd38d0 100644 --- a/lib/paiement/ui/pages/scan_page/scanner.dart +++ b/lib/mypayment/ui/pages/scan_page/scanner.dart @@ -6,13 +6,13 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/barcode_provider.dart'; -import 'package:titan/paiement/providers/bypass_provider.dart'; -import 'package:titan/paiement/providers/last_time_scanned.dart'; -import 'package:titan/paiement/providers/ongoing_transaction.dart'; -import 'package:titan/paiement/providers/scan_provider.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/ui/pages/scan_page/scan_overlay_shape.dart'; +import 'package:titan/mypayment/providers/barcode_provider.dart'; +import 'package:titan/mypayment/providers/bypass_provider.dart'; +import 'package:titan/mypayment/providers/last_time_scanned.dart'; +import 'package:titan/mypayment/providers/ongoing_transaction.dart'; +import 'package:titan/mypayment/providers/scan_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/ui/pages/scan_page/scan_overlay_shape.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/widgets/custom_dialog_box.dart'; diff --git a/lib/paiement/ui/pages/stats_page/description_shape.dart b/lib/mypayment/ui/pages/stats_page/description_shape.dart similarity index 100% rename from lib/paiement/ui/pages/stats_page/description_shape.dart rename to lib/mypayment/ui/pages/stats_page/description_shape.dart diff --git a/lib/paiement/ui/pages/stats_page/month_bar.dart b/lib/mypayment/ui/pages/stats_page/month_bar.dart similarity index 93% rename from lib/paiement/ui/pages/stats_page/month_bar.dart rename to lib/mypayment/ui/pages/stats_page/month_bar.dart index 6c1d0e40c5..77c84347a3 100644 --- a/lib/paiement/ui/pages/stats_page/month_bar.dart +++ b/lib/mypayment/ui/pages/stats_page/month_bar.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; class MonthBar extends HookConsumerWidget { final DateTime currentMonth; diff --git a/lib/paiement/ui/pages/stats_page/month_section_summary.dart b/lib/mypayment/ui/pages/stats_page/month_section_summary.dart similarity index 100% rename from lib/paiement/ui/pages/stats_page/month_section_summary.dart rename to lib/mypayment/ui/pages/stats_page/month_section_summary.dart diff --git a/lib/paiement/ui/pages/stats_page/stats_page.dart b/lib/mypayment/ui/pages/stats_page/stats_page.dart similarity index 85% rename from lib/paiement/ui/pages/stats_page/stats_page.dart rename to lib/mypayment/ui/pages/stats_page/stats_page.dart index 6bf7cb9db7..fa1cbdb27f 100644 --- a/lib/paiement/ui/pages/stats_page/stats_page.dart +++ b/lib/mypayment/ui/pages/stats_page/stats_page.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; -import 'package:titan/paiement/ui/pages/stats_page/month_bar.dart'; -import 'package:titan/paiement/ui/pages/stats_page/sum_up_chart.dart'; -import 'package:titan/paiement/ui/pages/stats_page/transactions_detail.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; +import 'package:titan/mypayment/ui/pages/stats_page/month_bar.dart'; +import 'package:titan/mypayment/ui/pages/stats_page/sum_up_chart.dart'; +import 'package:titan/mypayment/ui/pages/stats_page/transactions_detail.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/ui/layouts/refresher.dart'; class StatsPage extends HookConsumerWidget { diff --git a/lib/paiement/ui/pages/stats_page/sum_up_card.dart b/lib/mypayment/ui/pages/stats_page/sum_up_card.dart similarity index 95% rename from lib/paiement/ui/pages/stats_page/sum_up_card.dart rename to lib/mypayment/ui/pages/stats_page/sum_up_card.dart index 2ce69c285d..d8833725ab 100644 --- a/lib/paiement/ui/pages/stats_page/sum_up_card.dart +++ b/lib/mypayment/ui/pages/stats_page/sum_up_card.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:titan/paiement/ui/pages/stats_page/description_shape.dart'; +import 'package:titan/mypayment/ui/pages/stats_page/description_shape.dart'; class SumUpCard extends StatelessWidget { final String title; diff --git a/lib/paiement/ui/pages/stats_page/sum_up_chart.dart b/lib/mypayment/ui/pages/stats_page/sum_up_chart.dart similarity index 95% rename from lib/paiement/ui/pages/stats_page/sum_up_chart.dart rename to lib/mypayment/ui/pages/stats_page/sum_up_chart.dart index 83f83f80e5..5d65b1cbc5 100644 --- a/lib/paiement/ui/pages/stats_page/sum_up_chart.dart +++ b/lib/mypayment/ui/pages/stats_page/sum_up_chart.dart @@ -3,12 +3,12 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/providers/my_history_provider.dart'; -import 'package:titan/paiement/providers/selected_transactions_provider.dart'; -import 'package:titan/paiement/ui/pages/stats_page/month_section_summary.dart'; -import 'package:titan/paiement/ui/pages/stats_page/transaction_chart.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/providers/my_history_provider.dart'; +import 'package:titan/mypayment/providers/selected_transactions_provider.dart'; +import 'package:titan/mypayment/ui/pages/stats_page/month_section_summary.dart'; +import 'package:titan/mypayment/ui/pages/stats_page/transaction_chart.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; class SumUpChart extends HookConsumerWidget { diff --git a/lib/paiement/ui/pages/stats_page/transaction_chart.dart b/lib/mypayment/ui/pages/stats_page/transaction_chart.dart similarity index 93% rename from lib/paiement/ui/pages/stats_page/transaction_chart.dart rename to lib/mypayment/ui/pages/stats_page/transaction_chart.dart index 1dcd4ee712..9c8d0b0104 100644 --- a/lib/paiement/ui/pages/stats_page/transaction_chart.dart +++ b/lib/mypayment/ui/pages/stats_page/transaction_chart.dart @@ -4,11 +4,11 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/providers/selected_transactions_provider.dart'; -import 'package:titan/paiement/tools/functions.dart'; -import 'package:titan/paiement/ui/pages/stats_page/sum_up_card.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/providers/selected_transactions_provider.dart'; +import 'package:titan/mypayment/tools/functions.dart'; +import 'package:titan/mypayment/ui/pages/stats_page/sum_up_card.dart'; class TransactionChart extends HookConsumerWidget { final Map> transactionPerStore; diff --git a/lib/paiement/ui/pages/stats_page/transactions_detail.dart b/lib/mypayment/ui/pages/stats_page/transactions_detail.dart similarity index 81% rename from lib/paiement/ui/pages/stats_page/transactions_detail.dart rename to lib/mypayment/ui/pages/stats_page/transactions_detail.dart index e7ec2d0dbf..a6fcab6422 100644 --- a/lib/paiement/ui/pages/stats_page/transactions_detail.dart +++ b/lib/mypayment/ui/pages/stats_page/transactions_detail.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/providers/selected_transactions_provider.dart'; -import 'package:titan/paiement/ui/components/transaction_card.dart'; +import 'package:titan/mypayment/providers/selected_transactions_provider.dart'; +import 'package:titan/mypayment/ui/components/transaction_card.dart'; class TransactionsDetail extends ConsumerWidget { final DateTime currentMonth; diff --git a/lib/paiement/ui/pages/store_admin_page/right_check_box.dart b/lib/mypayment/ui/pages/store_admin_page/right_check_box.dart similarity index 90% rename from lib/paiement/ui/pages/store_admin_page/right_check_box.dart rename to lib/mypayment/ui/pages/store_admin_page/right_check_box.dart index 16ca35a351..f7aff4bf8a 100644 --- a/lib/paiement/ui/pages/store_admin_page/right_check_box.dart +++ b/lib/mypayment/ui/pages/store_admin_page/right_check_box.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/providers/seller_rights_list_providder.dart'; +import 'package:titan/mypayment/providers/seller_rights_list_providder.dart'; class RightCheckBox extends ConsumerWidget { final int index; diff --git a/lib/paiement/ui/pages/store_admin_page/search_result.dart b/lib/mypayment/ui/pages/store_admin_page/search_result.dart similarity index 92% rename from lib/paiement/ui/pages/store_admin_page/search_result.dart rename to lib/mypayment/ui/pages/store_admin_page/search_result.dart index 8ffc540fb2..23ec496418 100644 --- a/lib/paiement/ui/pages/store_admin_page/search_result.dart +++ b/lib/mypayment/ui/pages/store_admin_page/search_result.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/seller.dart'; -import 'package:titan/paiement/providers/new_admin_provider.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/providers/seller_rights_list_providder.dart'; -import 'package:titan/paiement/providers/store_sellers_list_provider.dart'; -import 'package:titan/paiement/ui/pages/store_admin_page/right_check_box.dart'; -import 'package:titan/paiement/ui/pages/store_admin_page/seller_right_dialog.dart'; +import 'package:titan/mypayment/class/seller.dart'; +import 'package:titan/mypayment/providers/new_admin_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/providers/seller_rights_list_providder.dart'; +import 'package:titan/mypayment/providers/store_sellers_list_provider.dart'; +import 'package:titan/mypayment/ui/pages/store_admin_page/right_check_box.dart'; +import 'package:titan/mypayment/ui/pages/store_admin_page/seller_right_dialog.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; diff --git a/lib/paiement/ui/pages/store_admin_page/seller_right_card.dart b/lib/mypayment/ui/pages/store_admin_page/seller_right_card.dart similarity index 98% rename from lib/paiement/ui/pages/store_admin_page/seller_right_card.dart rename to lib/mypayment/ui/pages/store_admin_page/seller_right_card.dart index 65272ec9dc..8db850ebf6 100644 --- a/lib/paiement/ui/pages/store_admin_page/seller_right_card.dart +++ b/lib/mypayment/ui/pages/store_admin_page/seller_right_card.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:heroicons/heroicons.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/seller.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/providers/store_sellers_list_provider.dart'; +import 'package:titan/mypayment/class/seller.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/providers/store_sellers_list_provider.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/layouts/add_edit_button_layout.dart'; diff --git a/lib/paiement/ui/pages/store_admin_page/seller_right_dialog.dart b/lib/mypayment/ui/pages/store_admin_page/seller_right_dialog.dart similarity index 100% rename from lib/paiement/ui/pages/store_admin_page/seller_right_dialog.dart rename to lib/mypayment/ui/pages/store_admin_page/seller_right_dialog.dart diff --git a/lib/paiement/ui/pages/store_admin_page/store_admin_page.dart b/lib/mypayment/ui/pages/store_admin_page/store_admin_page.dart similarity index 94% rename from lib/paiement/ui/pages/store_admin_page/store_admin_page.dart rename to lib/mypayment/ui/pages/store_admin_page/store_admin_page.dart index 67e3ea4b97..edc3c8e15d 100644 --- a/lib/paiement/ui/pages/store_admin_page/store_admin_page.dart +++ b/lib/mypayment/ui/pages/store_admin_page/store_admin_page.dart @@ -3,11 +3,11 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/providers/store_sellers_list_provider.dart'; -import 'package:titan/paiement/ui/pages/store_admin_page/search_result.dart'; -import 'package:titan/paiement/ui/pages/store_admin_page/seller_right_card.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/providers/store_sellers_list_provider.dart'; +import 'package:titan/mypayment/ui/pages/store_admin_page/search_result.dart'; +import 'package:titan/mypayment/ui/pages/store_admin_page/seller_right_card.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:titan/tools/ui/layouts/card_button.dart'; diff --git a/lib/paiement/ui/pages/store_pages/add_edit_store.dart b/lib/mypayment/ui/pages/store_pages/add_edit_store.dart similarity index 92% rename from lib/paiement/ui/pages/store_pages/add_edit_store.dart rename to lib/mypayment/ui/pages/store_pages/add_edit_store.dart index 5efe7a9783..ae4f485560 100644 --- a/lib/paiement/ui/pages/store_pages/add_edit_store.dart +++ b/lib/mypayment/ui/pages/store_pages/add_edit_store.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/store.dart' as store_class; -import 'package:titan/paiement/class/structure.dart'; -import 'package:titan/paiement/providers/my_stores_provider.dart'; -import 'package:titan/paiement/providers/selected_structure_provider.dart'; -import 'package:titan/paiement/providers/store_provider.dart'; -import 'package:titan/paiement/providers/stores_list_provider.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/class/store.dart' as store_class; +import 'package:titan/mypayment/class/structure.dart'; +import 'package:titan/mypayment/providers/my_stores_provider.dart'; +import 'package:titan/mypayment/providers/selected_structure_provider.dart'; +import 'package:titan/mypayment/providers/store_provider.dart'; +import 'package:titan/mypayment/providers/stores_list_provider.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/ui/builders/waiting_button.dart'; import 'package:titan/tools/ui/layouts/add_edit_button_layout.dart'; diff --git a/lib/paiement/ui/pages/store_stats_page/refund_page.dart b/lib/mypayment/ui/pages/store_stats_page/refund_page.dart similarity index 93% rename from lib/paiement/ui/pages/store_stats_page/refund_page.dart rename to lib/mypayment/ui/pages/store_stats_page/refund_page.dart index 4a9c5346a0..5a0212770f 100644 --- a/lib/paiement/ui/pages/store_stats_page/refund_page.dart +++ b/lib/mypayment/ui/pages/store_stats_page/refund_page.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/class/refund.dart'; -import 'package:titan/paiement/providers/refund_amount_provider.dart'; -import 'package:titan/paiement/providers/selected_store_history.dart'; -import 'package:titan/paiement/providers/transaction_provider.dart'; -import 'package:titan/paiement/ui/components/digit_fade_in_animation.dart'; -import 'package:titan/paiement/ui/components/keyboard.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/class/refund.dart'; +import 'package:titan/mypayment/providers/refund_amount_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_history.dart'; +import 'package:titan/mypayment/providers/transaction_provider.dart'; +import 'package:titan/mypayment/ui/components/digit_fade_in_animation.dart'; +import 'package:titan/mypayment/ui/components/keyboard.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; import 'package:titan/tools/ui/builders/waiting_button.dart'; diff --git a/lib/paiement/ui/pages/store_stats_page/store_stats_page.dart b/lib/mypayment/ui/pages/store_stats_page/store_stats_page.dart similarity index 73% rename from lib/paiement/ui/pages/store_stats_page/store_stats_page.dart rename to lib/mypayment/ui/pages/store_stats_page/store_stats_page.dart index c3323ed507..2d665caa48 100644 --- a/lib/paiement/ui/pages/store_stats_page/store_stats_page.dart +++ b/lib/mypayment/ui/pages/store_stats_page/store_stats_page.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/providers/selected_interval_provider.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/ui/pages/store_stats_page/interval_selector.dart'; -import 'package:titan/paiement/ui/pages/store_stats_page/store_transactions_detail.dart'; -import 'package:titan/paiement/ui/pages/store_stats_page/summary_card.dart'; -import 'package:titan/paiement/ui/paiement.dart'; -import 'package:titan/paiement/providers/selected_store_history.dart'; +import 'package:titan/mypayment/providers/selected_interval_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/ui/pages/store_stats_page/tool_bar.dart'; +import 'package:titan/mypayment/ui/pages/store_stats_page/store_transactions_detail.dart'; +import 'package:titan/mypayment/ui/pages/store_stats_page/summary_card.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; +import 'package:titan/mypayment/providers/selected_store_history.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:titan/tools/ui/layouts/refresher.dart'; @@ -19,6 +19,7 @@ class StoreStatsPage extends ConsumerWidget { final selectedHistory = ref.watch(sellerHistoryProvider); final selectedHistoryNotifier = ref.read(sellerHistoryProvider.notifier); final selectedInterval = ref.watch(selectedIntervalProvider); + return PaymentTemplate( child: Refresher( controller: ScrollController(), @@ -37,7 +38,7 @@ class StoreStatsPage extends ConsumerWidget { return Column( children: [ const SizedBox(height: 20), - const IntervalSelector(), + ToolBar(), const SizedBox(height: 20), SummaryCard(history: sortedByDate), const SizedBox(height: 20), diff --git a/lib/paiement/ui/pages/store_stats_page/store_transactions_detail.dart b/lib/mypayment/ui/pages/store_stats_page/store_transactions_detail.dart similarity index 81% rename from lib/paiement/ui/pages/store_stats_page/store_transactions_detail.dart rename to lib/mypayment/ui/pages/store_stats_page/store_transactions_detail.dart index d7be584b45..b1ec561902 100644 --- a/lib/paiement/ui/pages/store_stats_page/store_transactions_detail.dart +++ b/lib/mypayment/ui/pages/store_stats_page/store_transactions_detail.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/class/history.dart'; -import 'package:titan/paiement/providers/refund_amount_provider.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/ui/components/transaction_card.dart'; -import 'package:titan/paiement/ui/pages/store_stats_page/refund_page.dart'; +import 'package:titan/mypayment/class/history.dart'; +import 'package:titan/mypayment/providers/refund_amount_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/ui/components/transaction_card.dart'; +import 'package:titan/mypayment/ui/pages/store_stats_page/refund_page.dart'; class StoreTransactionsDetail extends ConsumerWidget { final List history; diff --git a/lib/paiement/ui/pages/store_stats_page/summary_card.dart b/lib/mypayment/ui/pages/store_stats_page/summary_card.dart similarity index 98% rename from lib/paiement/ui/pages/store_stats_page/summary_card.dart rename to lib/mypayment/ui/pages/store_stats_page/summary_card.dart index 507cb5b92f..96fa2aafa5 100644 --- a/lib/paiement/ui/pages/store_stats_page/summary_card.dart +++ b/lib/mypayment/ui/pages/store_stats_page/summary_card.dart @@ -4,8 +4,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:heroicons/heroicons.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/history.dart'; import 'package:titan/tools/providers/locale_notifier.dart'; +import 'package:titan/mypayment/class/history.dart'; class SummaryCard extends ConsumerWidget { final List history; diff --git a/lib/mypayment/ui/pages/store_stats_page/tool_bar.dart b/lib/mypayment/ui/pages/store_stats_page/tool_bar.dart new file mode 100644 index 0000000000..44641527ce --- /dev/null +++ b/lib/mypayment/ui/pages/store_stats_page/tool_bar.dart @@ -0,0 +1,303 @@ +import 'package:flutter/material.dart'; +import 'dart:typed_data'; + +import 'package:file_saver/file_saver.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:heroicons/heroicons.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:intl/intl.dart'; +import 'package:titan/mypayment/providers/history_export_csv_provider.dart'; +import 'package:titan/mypayment/providers/selected_interval_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_history.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/tools/functions.dart'; + +class ToolBar extends ConsumerWidget { + const ToolBar({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final now = DateTime.now(); + final selectedStore = ref.watch(selectedStoreProvider); + final selectedHistoryNotifier = ref.read(sellerHistoryProvider.notifier); + final selectedInterval = ref.watch(selectedIntervalProvider); + final selectedIntervalNotifier = ref.read( + selectedIntervalProvider.notifier, + ); + + void displayMyPaymentToastWithContext(TypeMsg type, String msg) { + displayToast(context, type, msg); + } + + Future getDate(DateTime initialDate) async { + return await showDatePicker( + context: context, + initialDate: initialDate, + firstDate: now.subtract(const Duration(days: 365 * 5)), + lastDate: now, + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.light().copyWith( + colorScheme: const ColorScheme.light( + primary: Color(0xff017f80), + onPrimary: Colors.white, + surface: Colors.white, + onSurface: Colors.black, + ), + dialogTheme: DialogThemeData(backgroundColor: Colors.white), + ), + child: child!, + ); + }, + ); + } + + Future getTime(DateTime initialDate) async { + return await showTimePicker( + context: context, + initialTime: TimeOfDay.fromDateTime(initialDate), + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.light().copyWith( + colorScheme: const ColorScheme.light( + primary: Color(0xff017f80), + onPrimary: Colors.white, + surface: Colors.white, + onSurface: Colors.black, + ), + dialogTheme: DialogThemeData(backgroundColor: Colors.white), + ), + child: child!, + ); + }, + ); + } + + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + GestureDetector( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), + decoration: BoxDecoration( + color: Color(0xff017f80).withAlpha(50), + borderRadius: BorderRadius.circular(10), + ), + child: Text( + DateFormat( + "dd MMM yyyy", + "fr_FR", + ).format(selectedInterval.start), + style: TextStyle( + color: const Color(0xff204550), + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ), + onTap: () async { + final date = await getDate(selectedInterval.start); + if (date != null) { + selectedIntervalNotifier.updateStart(date); + await selectedHistoryNotifier.getHistory( + selectedStore.id, + date, + selectedInterval.end, + ); + } + }, + ), + SizedBox(width: 5), + GestureDetector( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), + decoration: BoxDecoration( + color: Color(0xff017f80).withAlpha(50), + borderRadius: BorderRadius.circular(10), + ), + child: Text( + DateFormat( + "HH:mm", + "fr_FR", + ).format(selectedInterval.start), + style: TextStyle( + color: const Color(0xff204550), + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ), + onTap: () async { + final time = await getTime(selectedInterval.start); + if (time != null) { + final date = DateTime( + selectedInterval.start.year, + selectedInterval.start.month, + selectedInterval.start.day, + time.hour, + time.minute, + ); + selectedIntervalNotifier.updateStart(date); + await selectedHistoryNotifier.getHistory( + selectedStore.id, + date, + selectedInterval.end, + ); + } + }, + ), + ], + ), + SizedBox(width: 5), + HeroIcon( + HeroIcons.arrowRight, + color: const Color(0xff204550), + size: 20, + ), + SizedBox(width: 5), + Row( + children: [ + GestureDetector( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), + decoration: BoxDecoration( + color: Color(0xff017f80).withAlpha(50), + borderRadius: BorderRadius.circular(10), + ), + child: Text( + DateFormat( + "dd MMM yyyy", + "fr_FR", + ).format(selectedInterval.end), + style: TextStyle( + color: const Color(0xff204550), + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ), + onTap: () async { + final date = await getDate(selectedInterval.end); + if (date != null) { + selectedIntervalNotifier.updateEnd(date); + await selectedHistoryNotifier.getHistory( + selectedStore.id, + selectedInterval.start, + date, + ); + } + }, + ), + SizedBox(width: 5), + GestureDetector( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), + decoration: BoxDecoration( + color: Color(0xff017f80).withAlpha(50), + borderRadius: BorderRadius.circular(10), + ), + child: Text( + DateFormat( + "HH:mm", + "fr_FR", + ).format(selectedInterval.end), + style: TextStyle( + color: const Color(0xff204550), + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ), + onTap: () async { + final time = await getTime(selectedInterval.end); + if (time != null) { + final date = DateTime( + selectedInterval.end.year, + selectedInterval.end.month, + selectedInterval.end.day, + time.hour, + time.minute, + ); + selectedIntervalNotifier.updateEnd(date); + await selectedHistoryNotifier.getHistory( + selectedStore.id, + selectedInterval.start, + date, + ); + } + }, + ), + ], + ), + ], + ), + ), + const SizedBox(height: 10), + ElevatedButton.icon( + onPressed: () async { + late final Uint8List csvBytes; + + try { + csvBytes = await ref.read( + historyExportCsvProvider(selectedStore).future, + ); + } catch (e) { + displayMyPaymentToastWithContext(TypeMsg.error, e.toString()); + return; + } + + final fileName = + "Store_history_${selectedStore.name.replaceAll(" ", "_")}"; + + final path = kIsWeb + ? await FileSaver.instance.saveFile( + name: fileName, + bytes: csvBytes, + ext: "csv", + mimeType: MimeType.csv, + ) + : await FileSaver.instance.saveAs( + name: fileName, + bytes: csvBytes, + ext: "csv", + mimeType: MimeType.csv, + ); + + if (!context.mounted) return; + + if (path != null) { + displayMyPaymentToastWithContext( + TypeMsg.msg, + "Exportation CSV réussie !", + ); + } + }, + icon: const Icon(Icons.download), + label: const Text('Exporter CSV'), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xff017f80), + foregroundColor: Colors.white, + ), + ), + ], + ); + } +} diff --git a/lib/paiement/ui/pages/structure_admin_page/add_store_card.dart b/lib/mypayment/ui/pages/structure_admin_page/add_store_card.dart similarity index 90% rename from lib/paiement/ui/pages/structure_admin_page/add_store_card.dart rename to lib/mypayment/ui/pages/structure_admin_page/add_store_card.dart index c43c414c4b..e52b3d925c 100644 --- a/lib/paiement/ui/pages/structure_admin_page/add_store_card.dart +++ b/lib/mypayment/ui/pages/structure_admin_page/add_store_card.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/providers/store_provider.dart'; -import 'package:titan/paiement/router.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/providers/store_provider.dart'; +import 'package:titan/mypayment/router.dart'; import 'package:qlevar_router/qlevar_router.dart'; class AddStoreCard extends ConsumerWidget { diff --git a/lib/paiement/ui/pages/structure_admin_page/admin_store_card.dart b/lib/mypayment/ui/pages/structure_admin_page/admin_store_card.dart similarity index 95% rename from lib/paiement/ui/pages/structure_admin_page/admin_store_card.dart rename to lib/mypayment/ui/pages/structure_admin_page/admin_store_card.dart index 1f81751a1b..84d78d95c7 100644 --- a/lib/paiement/ui/pages/structure_admin_page/admin_store_card.dart +++ b/lib/mypayment/ui/pages/structure_admin_page/admin_store_card.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/store.dart'; -import 'package:titan/paiement/providers/store_provider.dart'; -import 'package:titan/paiement/providers/stores_list_provider.dart'; -import 'package:titan/paiement/router.dart'; +import 'package:titan/mypayment/class/store.dart'; +import 'package:titan/mypayment/providers/store_provider.dart'; +import 'package:titan/mypayment/providers/stores_list_provider.dart'; +import 'package:titan/mypayment/router.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:titan/tools/ui/builders/waiting_button.dart'; diff --git a/lib/paiement/ui/pages/structure_admin_page/structure_admin_page.dart b/lib/mypayment/ui/pages/structure_admin_page/structure_admin_page.dart similarity index 79% rename from lib/paiement/ui/pages/structure_admin_page/structure_admin_page.dart rename to lib/mypayment/ui/pages/structure_admin_page/structure_admin_page.dart index 420614ac27..3b5b78ce2b 100644 --- a/lib/paiement/ui/pages/structure_admin_page/structure_admin_page.dart +++ b/lib/mypayment/ui/pages/structure_admin_page/structure_admin_page.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/selected_structure_provider.dart'; -import 'package:titan/paiement/providers/stores_list_provider.dart'; -import 'package:titan/paiement/ui/pages/structure_admin_page/add_store_card.dart'; -import 'package:titan/paiement/ui/pages/structure_admin_page/admin_store_card.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/providers/selected_structure_provider.dart'; +import 'package:titan/mypayment/providers/stores_list_provider.dart'; +import 'package:titan/mypayment/ui/pages/structure_admin_page/add_store_card.dart'; +import 'package:titan/mypayment/ui/pages/structure_admin_page/admin_store_card.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:titan/tools/ui/layouts/refresher.dart'; import 'package:titan/tools/ui/widgets/align_left_text.dart'; -class StructureStoresPage extends ConsumerWidget { - const StructureStoresPage({super.key}); +class StructureStorePage extends ConsumerWidget { + const StructureStorePage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/lib/paiement/ui/pages/transfer_structure_page/search_result.dart b/lib/mypayment/ui/pages/transfer_structure_page/search_result.dart similarity index 96% rename from lib/paiement/ui/pages/transfer_structure_page/search_result.dart rename to lib/mypayment/ui/pages/transfer_structure_page/search_result.dart index 558201fcb1..946f6dc985 100644 --- a/lib/paiement/ui/pages/transfer_structure_page/search_result.dart +++ b/lib/mypayment/ui/pages/transfer_structure_page/search_result.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/paiement/providers/transfer_structure_provider.dart'; +import 'package:titan/mypayment/providers/selected_store_provider.dart'; +import 'package:titan/mypayment/providers/transfer_structure_provider.dart'; import 'package:titan/tools/constants.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; diff --git a/lib/paiement/ui/pages/transfer_structure_page/transfer_structure_page.dart b/lib/mypayment/ui/pages/transfer_structure_page/transfer_structure_page.dart similarity index 95% rename from lib/paiement/ui/pages/transfer_structure_page/transfer_structure_page.dart rename to lib/mypayment/ui/pages/transfer_structure_page/transfer_structure_page.dart index def4355d33..f3ddf4c296 100644 --- a/lib/paiement/ui/pages/transfer_structure_page/transfer_structure_page.dart +++ b/lib/mypayment/ui/pages/transfer_structure_page/transfer_structure_page.dart @@ -3,8 +3,8 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/ui/pages/transfer_structure_page/search_result.dart'; -import 'package:titan/paiement/ui/paiement.dart'; +import 'package:titan/mypayment/ui/pages/transfer_structure_page/search_result.dart'; +import 'package:titan/mypayment/ui/mypayment.dart'; import 'package:titan/tools/ui/widgets/styled_search_bar.dart'; import 'package:titan/user/providers/user_list_provider.dart'; diff --git a/lib/navigation/providers/email_popup_state_provider.dart b/lib/navigation/providers/email_popup_state_provider.dart new file mode 100644 index 0000000000..4915e580f9 --- /dev/null +++ b/lib/navigation/providers/email_popup_state_provider.dart @@ -0,0 +1,18 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class EmailPopupStateProvider extends StateNotifier { + EmailPopupStateProvider() : super(false); + + void open() { + state = true; + } + + void close() { + state = false; + } +} + +final emailPopupStateProvider = + StateNotifierProvider((ref) { + return EmailPopupStateProvider(); + }); diff --git a/lib/others/ui/loading_page.dart b/lib/others/ui/loading_page.dart index e0c98dc3dc..6be5c01179 100644 --- a/lib/others/ui/loading_page.dart +++ b/lib/others/ui/loading_page.dart @@ -4,9 +4,11 @@ import 'package:titan/auth/providers/openid_provider.dart'; import 'package:titan/login/router.dart'; import 'package:titan/router.dart'; import 'package:titan/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; import 'package:titan/tools/providers/path_forwarding_provider.dart'; import 'package:titan/tools/ui/widgets/loader.dart'; import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/version/providers/minimal_hyperion_version_provider.dart'; import 'package:titan/version/providers/titan_version_provider.dart'; import 'package:titan/version/providers/version_verifier_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -18,32 +20,45 @@ class LoadingPage extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final versionVerifier = ref.watch(versionVerifierProvider); final titanVersion = ref.watch(titanVersionProvider); + final minimalHyperionVersion = ref.watch(minimalHyperionVersionProvider); final isLoggedIn = ref.watch(isLoggedInProvider); final check = versionVerifier.whenData( (value) => value.minimalTitanVersion <= titanVersion, ); final pathForwarding = ref.read(pathForwardingProvider); + final isHyperionVersionCompatible = versionVerifier.whenData( + (value) => isVersionCompatible(value.version, minimalHyperionVersion), + ); check.when( data: (value) { if (!value) { QR.to(AppRouter.update); } - if (!isLoggedIn) { - QR.to(LoginRouter.root); - } - final user = ref.watch(asyncUserProvider); - user.when( - data: (data) { - QR.to(pathForwarding.path); - }, - error: (error, s) { - QR.to(LoginRouter.root); + isHyperionVersionCompatible.when( + data: (value) { + if (!value) { + QR.to(AppRouter.rollback); + } + if (!isLoggedIn) { + QR.to(LoginRouter.root); + } + final user = ref.watch(asyncUserProvider); + user.when( + data: (_) { + QR.to(pathForwarding.path); + }, + error: (error, _) { + QR.to(LoginRouter.root); + }, + loading: () {}, + ); }, + error: (error, _) => QR.to(AppRouter.noInternet), loading: () {}, ); }, + error: (error, _) => QR.to(AppRouter.noInternet), loading: () {}, - error: (error, stack) => QR.to(AppRouter.noInternet), ); return const Scaffold( backgroundColor: ColorConstants.background, diff --git a/lib/others/ui/no_internet_page.dart b/lib/others/ui/no_internet_page.dart index 41fa322577..bf8bd3c872 100644 --- a/lib/others/ui/no_internet_page.dart +++ b/lib/others/ui/no_internet_page.dart @@ -6,6 +6,7 @@ import 'package:titan/home/router.dart'; import 'package:titan/tools/constants.dart'; import 'package:qlevar_router/qlevar_router.dart'; import 'package:titan/l10n/app_localizations.dart'; +import 'package:titan/tools/repository/repository.dart'; class NoInternetPage extends HookConsumerWidget { const NoInternetPage({super.key}); @@ -27,7 +28,9 @@ class NoInternetPage extends HookConsumerWidget { const SizedBox(height: 20), Center( child: Text( - AppLocalizations.of(context)!.othersUnableToConnectToServer, + AppLocalizations.of( + context, + )!.othersUnableToConnectToServer(Repository.host), textAlign: TextAlign.center, style: const TextStyle(fontSize: 20), ), diff --git a/lib/others/ui/no_module.dart b/lib/others/ui/no_module.dart index d08943dc5d..30ab2c004d 100644 --- a/lib/others/ui/no_module.dart +++ b/lib/others/ui/no_module.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/super_admin/providers/module_root_list_provider.dart'; import 'package:titan/tools/constants.dart'; +import 'package:titan/super_admin/providers/permission_name_list_provider.dart'; import 'package:titan/tools/providers/path_forwarding_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; import 'package:titan/l10n/app_localizations.dart'; @@ -12,9 +12,9 @@ class NoModulePage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final moduleVisibilityList = ref.watch(moduleRootListProvider); + final permissionsNamesList = ref.watch(permissionsNamesListProvider); final pathForwarding = ref.read(pathForwardingProvider); - moduleVisibilityList.maybeWhen( + permissionsNamesList.maybeWhen( data: (data) { QR.to(pathForwarding.path); }, diff --git a/lib/others/ui/rollback_page.dart b/lib/others/ui/rollback_page.dart new file mode 100644 index 0000000000..e56badb9a4 --- /dev/null +++ b/lib/others/ui/rollback_page.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:heroicons/heroicons.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/l10n/app_localizations.dart'; +import 'package:titan/tools/functions.dart'; +import 'package:titan/tools/repository/repository.dart'; +import 'package:titan/version/providers/minimal_hyperion_version_provider.dart'; +import 'package:titan/version/providers/titan_version_provider.dart'; +import 'package:titan/version/providers/version_verifier_provider.dart'; + +class RollbackPage extends HookConsumerWidget { + const RollbackPage({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final minimalHyperionVersion = ref.watch(minimalHyperionVersionProvider); + final versionVerifier = ref.watch(versionVerifierProvider); + final titanVersion = ref.watch(titanVersionProvider); + + final localizeWithContext = AppLocalizations.of(context)!; + + return Scaffold( + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Column( + children: [ + const Spacer(flex: 2), + const HeroIcon(HeroIcons.rocketLaunch, size: 100), + const SizedBox(height: 50), + Center( + child: Text( + localizeWithContext.settingsTooRecentVersion, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 20), + ), + ), + const Spacer(flex: 3), + Text( + "${localizeWithContext.settingsVersion} $titanVersion, flavor ${getAppFlavor()}", + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.w500, + color: Colors.black, + ), + ), + const SizedBox(height: 20), + Text( + "${localizeWithContext.settingsMinimalHyperionVersion} : $minimalHyperionVersion", + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.w500, + color: Colors.black, + ), + ), + const SizedBox(height: 20), + Text( + "${localizeWithContext.settingsHyperionVersion} (${Repository.host}) : ${versionVerifier.whenOrNull(data: (value) { + return value.version; + })}", + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.w500, + color: Colors.black, + ), + ), + const SizedBox(height: 20), + ], + ), + ), + ); + } +} diff --git a/lib/paiement/providers/selected_store_provider.dart b/lib/paiement/providers/selected_store_provider.dart deleted file mode 100644 index 43c6cdb59a..0000000000 --- a/lib/paiement/providers/selected_store_provider.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/paiement/class/user_store.dart'; -import 'package:titan/paiement/providers/last_used_store_id_provider.dart'; -import 'package:titan/paiement/providers/my_stores_provider.dart'; - -class SelectedStoreNotifier extends StateNotifier { - final LastUsedStoreIdNotifier lastUsedStoreIdNotifier; - SelectedStoreNotifier(this.lastUsedStoreIdNotifier, super.store); - - void updateStore(UserStore store) { - state = store; - lastUsedStoreIdNotifier.saveLastUsedStoreIdToSharedPreferences(store.id); - } -} - -final selectedStoreProvider = - StateNotifierProvider((ref) { - final myStores = ref.watch(myStoresProvider); - final lastUsedStoreId = ref.read(lastUsedStoreIdProvider); - final lastUsedStoreIdNotifier = ref.read( - lastUsedStoreIdProvider.notifier, - ); - final store = myStores.maybeWhen( - orElse: () => UserStore.empty(), - data: (value) { - if (value.isEmpty) { - return UserStore.empty(); - } - return value.firstWhere( - (store) => store.id == lastUsedStoreId, - orElse: () => value.first, - ); - }, - ); - return SelectedStoreNotifier(lastUsedStoreIdNotifier, store); - }); diff --git a/lib/paiement/ui/pages/devices_page/device_item.dart b/lib/paiement/ui/pages/devices_page/device_item.dart deleted file mode 100644 index 8d844aa0ee..0000000000 --- a/lib/paiement/ui/pages/devices_page/device_item.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:heroicons/heroicons.dart'; -import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/wallet_device.dart'; -import 'package:titan/paiement/tools/functions.dart'; - -class DeviceItem extends ConsumerWidget { - final WalletDevice device; - final bool isActual; - final Future Function() onRevoke; - const DeviceItem({ - super.key, - required this.device, - required this.isActual, - required this.onRevoke, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 30), - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(15)), - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), - child: Container( - color: Colors.grey.shade200.withValues(alpha: 0.5), - child: SizedBox( - height: isActual ? 80 : 70, - child: Row( - children: [ - const SizedBox(width: 20), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - device.name, - style: const TextStyle( - color: Color(0xff204550), - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - if (isActual) - Text( - AppLocalizations.of(context)!.paiementThisDevice, - style: TextStyle( - color: Color(0xff204550), - fontSize: 15, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - const SizedBox(width: 10), - Spacer(), - getStatusTag(device.status), - if (device.status != WalletDeviceStatus.revoked) ...[ - const SizedBox(width: 20), - GestureDetector( - onTap: onRevoke, - child: const HeroIcon( - HeroIcons.trash, - size: 25, - color: Color(0xff204550), - ), - ), - ], - const SizedBox(width: 20), - ], - ), - ), - ), - ), - ), - ); - } -} diff --git a/lib/paiement/ui/pages/devices_page/devices_page.dart b/lib/paiement/ui/pages/devices_page/devices_page.dart deleted file mode 100644 index c34c6e1b07..0000000000 --- a/lib/paiement/ui/pages/devices_page/devices_page.dart +++ /dev/null @@ -1,223 +0,0 @@ -import 'dart:convert'; - -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/l10n/app_localizations.dart'; -import 'package:titan/paiement/class/create_device.dart'; -import 'package:titan/paiement/class/wallet_device.dart'; -import 'package:titan/paiement/providers/device_list_provider.dart'; -import 'package:titan/paiement/providers/device_provider.dart'; -import 'package:titan/paiement/providers/has_accepted_tos_provider.dart'; -import 'package:titan/paiement/providers/key_service_provider.dart'; -import 'package:titan/paiement/tools/functions.dart'; -import 'package:titan/paiement/ui/pages/devices_page/add_device_button.dart'; -import 'package:titan/paiement/ui/pages/devices_page/device_item.dart'; -import 'package:titan/paiement/ui/pages/main_page/account_card/device_dialog_box.dart'; -import 'package:titan/paiement/ui/paiement.dart'; -import 'package:titan/tools/functions.dart'; -import 'package:titan/tools/token_expire_wrapper.dart'; -import 'package:titan/tools/ui/builders/async_child.dart'; -import 'package:titan/tools/ui/layouts/refresher.dart'; -import 'package:titan/tools/ui/widgets/custom_dialog_box.dart'; - -class DevicesPage extends HookConsumerWidget { - const DevicesPage({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final devices = ref.watch(deviceListProvider); - final devicesNotifier = ref.read(deviceListProvider.notifier); - final deviceNotifier = ref.read(deviceProvider.notifier); - final keyService = ref.watch(keyServiceProvider); - final deviceKey = keyService.getKeyId(); - final displayAddDevice = useState(true); - final hasAcceptedToS = ref.watch(hasAcceptedTosProvider); - - void displayToastWithContext(TypeMsg type, String msg) { - displayToast(context, type, msg); - } - - Future getDeviceName() async { - final deviceInfo = DeviceInfoPlugin(); - if (Theme.of(context).platform == TargetPlatform.android) { - return deviceInfo.androidInfo.then((info) => info.model); - } else if (Theme.of(context).platform == TargetPlatform.iOS) { - return deviceInfo.iosInfo.then((info) => info.utsname.machine); - } else { - return Future.value( - AppLocalizations.of(context)!.paiementUnknownDevice, - ); - } - } - - return PaymentTemplate( - child: Refresher( - controller: ScrollController(), - onRefresh: () async { - await devicesNotifier.getDeviceList(); - }, - child: FutureBuilder( - future: deviceKey, - builder: (context, snapshot) { - return AsyncChild( - value: devices, - builder: (context, devices) { - final sortedDevices = devices.toList() - ..sort((a, b) { - if (a.id == snapshot.data) return -1; - if (b.id == snapshot.data) return 1; - return statusOrder( - a.status, - ).compareTo(statusOrder(b.status)); - }); - - final firstDevice = - devices.map((e) => e.id).contains(snapshot.data) - ? devices - .where((element) => element.id == snapshot.data) - .first - : null; - - final shouldDisplayAddDevice = - (snapshot.data == null || - firstDevice == null || - firstDevice.status == WalletDeviceStatus.revoked) && - displayAddDevice.value; - - if (firstDevice != null) { - sortedDevices.remove(firstDevice); - sortedDevices.insert(0, firstDevice); - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (shouldDisplayAddDevice && !kIsWeb) - AddDeviceButton( - onTap: () async { - if (!hasAcceptedToS) { - displayToastWithContext( - TypeMsg.error, - AppLocalizations.of( - context, - )!.paiementPleaseAcceptTOS, - ); - return; - } - final name = await getDeviceName(); - final keyPair = await keyService.generateKeyPair(); - final publicKey = - (await keyPair.extractPublicKey()).bytes; - final base64PublicKey = base64Encode(publicKey); - final body = CreateDevice( - name: name, - ed25519PublicKey: base64PublicKey, - ); - final value = await deviceNotifier.registerDevice( - body, - ); - if (value != null) { - await keyService.saveKeyPair(keyPair); - await keyService.saveKeyId(value); - await devicesNotifier.getDeviceList(); - displayAddDevice.value = false; - if (context.mounted) { - await showDialog( - context: context, - builder: (context) { - return DeviceDialogBox( - title: AppLocalizations.of( - context, - )!.paiementAskDeviceActivation, - descriptions: AppLocalizations.of( - context, - )!.paiementDeviceActivationReceived, - buttonText: "Ok", - onClick: () { - Navigator.of(context).pop(); - }, - ); - }, - ); - } - } - }, - ), - ...sortedDevices.map((device) { - return DeviceItem( - device: device, - isActual: device.id == snapshot.data, - onRevoke: () async { - if (!hasAcceptedToS) { - displayToastWithContext( - TypeMsg.error, - AppLocalizations.of( - context, - )!.paiementPleaseAcceptTOS, - ); - return; - } - await showDialog( - context: context, - builder: (context) { - return CustomDialogBox( - title: AppLocalizations.of( - context, - )!.paiementRevokeDevice, - descriptions: AppLocalizations.of( - context, - )!.paiementRevokeDeviceDescription, - onYes: () async { - tokenExpireWrapper(ref, () async { - final deviceRevokedMsg = - AppLocalizations.of( - context, - )!.paiementDeviceRevoked; - final deviceRevokingErrorMsg = - AppLocalizations.of( - context, - )!.paiementDeviceRevokingError; - final value = await devicesNotifier - .revokeDevice( - device.copyWith( - status: WalletDeviceStatus.revoked, - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - deviceRevokedMsg, - ); - final savedId = await keyService - .getKeyId(); - if (savedId == device.id) { - await keyService.clear(); - } - } else { - displayToastWithContext( - TypeMsg.error, - deviceRevokingErrorMsg, - ); - } - }); - }, - ); - }, - ); - }, - ); - }), - SizedBox(height: 80), - ], - ); - }, - ); - }, - ), - ), - ); - } -} diff --git a/lib/paiement/ui/pages/pay_page/qr_code.dart b/lib/paiement/ui/pages/pay_page/qr_code.dart deleted file mode 100644 index d26710fe01..0000000000 --- a/lib/paiement/ui/pages/pay_page/qr_code.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/paiement/providers/key_service_provider.dart'; -import 'package:titan/paiement/providers/pay_amount_provider.dart'; -import 'package:titan/paiement/tools/functions.dart'; -import 'package:titan/tools/ui/widgets/loader.dart'; -import 'package:qr_flutter/qr_flutter.dart'; -import 'package:uuid/uuid.dart'; - -class QrCode extends ConsumerWidget { - const QrCode({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final payAmount = ref.watch(payAmountProvider); - final id = const Uuid().v4(); - final keyService = ref.watch(keyServiceProvider); - return FutureBuilder( - future: getQRCodeContent(id, payAmount, keyService, true), - builder: (context, snapshot) { - if (snapshot.data == null) { - return SizedBox( - width: MediaQuery.of(context).size.width * 0.8, - height: MediaQuery.of(context).size.width * 0.8, - child: const Loader(), - ); - } - return Center( - child: QrImageView( - data: snapshot.data!, - version: QrVersions.auto, - size: min( - MediaQuery.of(context).size.width * 0.8, - MediaQuery.of(context).size.height * 0.8, - ), - eyeStyle: const QrEyeStyle( - color: Colors.black, - eyeShape: QrEyeShape.square, - ), - dataModuleStyle: const QrDataModuleStyle( - dataModuleShape: QrDataModuleShape.square, - color: Colors.black, - ), - ), - ); - }, - ); - } -} diff --git a/lib/paiement/ui/pages/store_stats_page/interval_selector.dart b/lib/paiement/ui/pages/store_stats_page/interval_selector.dart deleted file mode 100644 index 18ba1a626f..0000000000 --- a/lib/paiement/ui/pages/store_stats_page/interval_selector.dart +++ /dev/null @@ -1,240 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:heroicons/heroicons.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:intl/intl.dart'; -import 'package:titan/paiement/providers/selected_interval_provider.dart'; -import 'package:titan/paiement/providers/selected_store_history.dart'; -import 'package:titan/paiement/providers/selected_store_provider.dart'; -import 'package:titan/tools/providers/locale_notifier.dart'; - -class IntervalSelector extends ConsumerWidget { - const IntervalSelector({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final now = DateTime.now(); - final locale = ref.watch(localeProvider); - final selectedStore = ref.watch(selectedStoreProvider); - final selectedHistoryNotifier = ref.read(sellerHistoryProvider.notifier); - final selectedInterval = ref.watch(selectedIntervalProvider); - final selectedIntervalNotifier = ref.read( - selectedIntervalProvider.notifier, - ); - - Future getDate(DateTime initialDate) async { - return await showDatePicker( - context: context, - initialDate: initialDate, - firstDate: now.subtract(const Duration(days: 365 * 5)), - lastDate: now, - builder: (BuildContext context, Widget? child) { - return Theme( - data: ThemeData.light().copyWith( - colorScheme: const ColorScheme.light( - primary: Color(0xff017f80), - onPrimary: Colors.white, - surface: Colors.white, - onSurface: Colors.black, - ), - dialogTheme: DialogThemeData(backgroundColor: Colors.white), - ), - child: child!, - ); - }, - ); - } - - Future getTime(DateTime initialDate) async { - return await showTimePicker( - context: context, - initialTime: TimeOfDay.fromDateTime(initialDate), - builder: (BuildContext context, Widget? child) { - return Theme( - data: ThemeData.light().copyWith( - colorScheme: const ColorScheme.light( - primary: Color(0xff017f80), - onPrimary: Colors.white, - surface: Colors.white, - onSurface: Colors.black, - ), - dialogTheme: DialogThemeData(backgroundColor: Colors.white), - ), - child: child!, - ); - }, - ); - } - - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 20.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - children: [ - GestureDetector( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 5, - ), - decoration: BoxDecoration( - color: Color(0xff017f80).withAlpha(50), - borderRadius: BorderRadius.circular(10), - ), - child: Text( - DateFormat.yMd( - locale.toString(), - ).format(selectedInterval.start), - style: TextStyle( - color: const Color(0xff204550), - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ), - ), - onTap: () async { - final date = await getDate(selectedInterval.start); - if (date != null) { - selectedIntervalNotifier.updateStart(date); - await selectedHistoryNotifier.getHistory( - selectedStore.id, - date, - selectedInterval.end, - ); - } - }, - ), - SizedBox(width: 5), - GestureDetector( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 5, - ), - decoration: BoxDecoration( - color: Color(0xff017f80).withAlpha(50), - borderRadius: BorderRadius.circular(10), - ), - child: Text( - DateFormat.Hm( - locale.toString(), - ).format(selectedInterval.start), - style: TextStyle( - color: const Color(0xff204550), - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ), - ), - onTap: () async { - final time = await getTime(selectedInterval.start); - if (time != null) { - final date = DateTime( - selectedInterval.start.year, - selectedInterval.start.month, - selectedInterval.start.day, - time.hour, - time.minute, - ); - selectedIntervalNotifier.updateStart(date); - await selectedHistoryNotifier.getHistory( - selectedStore.id, - date, - selectedInterval.end, - ); - } - }, - ), - ], - ), - SizedBox(width: 5), - HeroIcon( - HeroIcons.arrowRight, - color: const Color(0xff204550), - size: 20, - ), - SizedBox(width: 5), - Row( - children: [ - GestureDetector( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 5, - ), - decoration: BoxDecoration( - color: Color(0xff017f80).withAlpha(50), - borderRadius: BorderRadius.circular(10), - ), - child: Text( - DateFormat.yMd( - locale.toString(), - ).format(selectedInterval.end), - style: TextStyle( - color: const Color(0xff204550), - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ), - ), - onTap: () async { - final date = await getDate(selectedInterval.end); - if (date != null) { - selectedIntervalNotifier.updateEnd(date); - await selectedHistoryNotifier.getHistory( - selectedStore.id, - selectedInterval.start, - date, - ); - } - }, - ), - SizedBox(width: 5), - GestureDetector( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 5, - vertical: 5, - ), - decoration: BoxDecoration( - color: Color(0xff017f80).withAlpha(50), - borderRadius: BorderRadius.circular(10), - ), - child: Text( - DateFormat.Hm( - locale.toString(), - ).format(selectedInterval.end), - style: TextStyle( - color: const Color(0xff204550), - fontWeight: FontWeight.bold, - fontSize: 14, - ), - ), - ), - onTap: () async { - final time = await getTime(selectedInterval.end); - if (time != null) { - final date = DateTime( - selectedInterval.end.year, - selectedInterval.end.month, - selectedInterval.end.day, - time.hour, - time.minute, - ); - selectedIntervalNotifier.updateEnd(date); - await selectedHistoryNotifier.getHistory( - selectedStore.id, - selectedInterval.start, - date, - ); - } - }, - ), - ], - ), - ], - ), - ); - } -} diff --git a/lib/ph/providers/is_ph_admin_provider.dart b/lib/ph/providers/is_ph_admin_provider.dart index 0497d8ace7..f7cd57c24a 100644 --- a/lib/ph/providers/is_ph_admin_provider.dart +++ b/lib/ph/providers/is_ph_admin_provider.dart @@ -1,9 +1,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/ph/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; final isPhAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("4ec5ae77-f955-4309-96a5-19cc3c8be71c"); // admin_ph + return hasUserPermission(ref, PhPermissionConstants.managePh); }); diff --git a/lib/ph/tools/constants.dart b/lib/ph/tools/constants.dart new file mode 100644 index 0000000000..2c42eceb86 --- /dev/null +++ b/lib/ph/tools/constants.dart @@ -0,0 +1,4 @@ +class PhPermissionConstants { + static const String accessPh = "access_ph"; + static const String managePh = "manage_ph"; +} diff --git a/lib/phonebook/class/association_groupement.dart b/lib/phonebook/class/association_groupement.dart index 67b84e765e..975117f5fb 100644 --- a/lib/phonebook/class/association_groupement.dart +++ b/lib/phonebook/class/association_groupement.dart @@ -1,26 +1,37 @@ class AssociationGroupement { - AssociationGroupement({required this.id, required this.name}); + AssociationGroupement({ + required this.id, + required this.name, + required this.managerGroupId, + }); late final String id; late final String name; + late final String managerGroupId; AssociationGroupement.fromJson(Map json) { id = json['id']; name = json['name']; + managerGroupId = json['manager_group_id']; } Map toJson() { - final data = {'id': id, 'name': name}; + final data = { + 'id': id, + 'name': name, + 'manager_group_id': managerGroupId, + }; return data; } AssociationGroupement.empty() { id = ""; name = ""; + managerGroupId = ""; } @override String toString() { - return 'AssociationGroupement(kinds: $id, name: $name)'; + return 'AssociationGroupement(kinds: $id, name: $name, managerGroupId: $managerGroupId)'; } } diff --git a/lib/phonebook/providers/association_filtered_list_provider.dart b/lib/phonebook/providers/association_filtered_list_provider.dart index ae533612ba..9d6ee198b3 100644 --- a/lib/phonebook/providers/association_filtered_list_provider.dart +++ b/lib/phonebook/providers/association_filtered_list_provider.dart @@ -30,8 +30,7 @@ final associationFilteredListProvider = Provider>((ref) { .toList(); } return associationGroupements.maybeWhen( - data: (groupements) => - sortedAssociationByKind(filteredAssociations, groupements), + data: (kinds) => sortedAssociationByKind(filteredAssociations, kinds), orElse: () => filteredAssociations, ); }, diff --git a/lib/phonebook/providers/association_groupement_list_provider.dart b/lib/phonebook/providers/association_groupement_list_provider.dart index e61666d9df..ba41d858c1 100644 --- a/lib/phonebook/providers/association_groupement_list_provider.dart +++ b/lib/phonebook/providers/association_groupement_list_provider.dart @@ -4,6 +4,7 @@ import 'package:titan/phonebook/class/association_groupement.dart'; import 'package:titan/phonebook/repositories/association_groupement_repository.dart'; import 'package:titan/tools/providers/list_notifier.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; +import 'package:titan/user/providers/user_provider.dart'; class AssociationGroupementListNotifier extends ListNotifier { @@ -71,3 +72,18 @@ final associationGroupementListProvider = }); return notifier; }); + +final groupementAdminProvider = Provider>((ref) { + final associationGroupements = ref.watch(associationGroupementListProvider); + final me = ref.watch(userProvider); + return associationGroupements.maybeWhen( + data: (groupements) { + return groupements.where((groupement) { + return me.groups.any( + (userGroup) => userGroup.id == groupement.managerGroupId, + ); + }).toList(); + }, + orElse: () => [], + ); +}); diff --git a/lib/phonebook/providers/association_member_sorted_list_provider.dart b/lib/phonebook/providers/association_member_sorted_list_provider.dart index b41782785e..f12f66db0b 100644 --- a/lib/phonebook/providers/association_member_sorted_list_provider.dart +++ b/lib/phonebook/providers/association_member_sorted_list_provider.dart @@ -11,7 +11,7 @@ final associationMemberSortedListProvider = Provider>(( final association = ref.watch(associationProvider); return memberListProvider.maybeWhen( data: (members) { - return sortedMembers(members, association); + return sortedMembers(members, association.id, association.mandateYear); }, orElse: () => List.empty(), ); diff --git a/lib/phonebook/providers/is_phonebook_admin_provider.dart b/lib/phonebook/providers/is_phonebook_admin_provider.dart index 3ab06abd8d..1f7c108442 100644 --- a/lib/phonebook/providers/is_phonebook_admin_provider.dart +++ b/lib/phonebook/providers/is_phonebook_admin_provider.dart @@ -1,46 +1,41 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/admin/providers/is_admin_provider.dart'; -import 'package:titan/phonebook/class/complete_member.dart'; +import 'package:titan/phonebook/providers/association_groupement_list_provider.dart'; import 'package:titan/phonebook/providers/association_member_list_provider.dart'; import 'package:titan/phonebook/providers/association_provider.dart'; -import 'package:titan/phonebook/providers/roles_tags_provider.dart'; -import 'package:titan/phonebook/tools/function.dart'; +import 'package:titan/phonebook/tools/constant.dart'; +import 'package:titan/tools/functions.dart'; import 'package:titan/user/providers/user_provider.dart'; -final isPhonebookAdminProvider = StateProvider((ref) { - final user = ref.watch(userProvider); - return user.groups - .map((e) => e.id) - .contains("d3f91313-d7e5-49c6-b01f-c19932a7e09b"); // admin_phonebook -}); - -final hasPhonebookAdminAccessProvider = StateProvider((ref) { - final isPhonebookAdmin = ref.watch(isPhonebookAdminProvider); - final isAdmin = ref.watch(isAdminProvider); - return isPhonebookAdmin || isAdmin; +final isPhonebookAdminProvider = Provider((ref) { + return hasUserPermission(ref, PhonebookPermissionConstants.managePhonebook); }); final isAssociationPresidentProvider = Provider((ref) { final association = ref.watch(associationProvider); - final rolesTags = ref.watch(rolesTagsProvider); final membersList = ref.watch(associationMemberListProvider); final me = ref.watch(userProvider); + bool isPresident = false; + membersList.whenData((members) { + if (members.map((e) => e.member.id).contains(me.id)) { + if (members + .firstWhere((completeMember) => completeMember.member.id == me.id) + .memberships + .firstWhere( + (membership) => membership.associationId == association.id, + ) + .rolesTags + .contains(PhonebookTextConstants.presidentRoleTag)) { + isPresident = true; + } + } + }); + return isPresident; +}); - return membersList.maybeWhen( - data: (members) { - final member = members.firstWhere( - (m) => m.member.id == me.id, - orElse: () => CompleteMember.empty(), - ); - if (member.member.id == "") return false; - final membership = getMembershipForAssociation(member, association); - return rolesTags.maybeWhen( - data: (tags) { - return membership.rolesTags.contains(tags.first); - }, - orElse: () => false, - ); - }, - orElse: () => false, - ); +final hasPhonebookAdminAccessProvider = Provider((ref) { + final isPhonebookAdmin = ref.watch(isPhonebookAdminProvider); + final isAnyGroupementAdmin = ref.watch(groupementAdminProvider); + final isAdmin = ref.watch(isAdminProvider); + return isPhonebookAdmin || isAdmin || isAnyGroupementAdmin.isNotEmpty; }); diff --git a/lib/phonebook/router.dart b/lib/phonebook/router.dart index c62e6c4282..ea436274b4 100644 --- a/lib/phonebook/router.dart +++ b/lib/phonebook/router.dart @@ -6,14 +6,14 @@ import 'package:titan/navigation/class/module.dart'; import 'package:titan/phonebook/providers/is_phonebook_admin_provider.dart'; import 'package:titan/phonebook/ui/pages/add_edit_groupement_page/groupement_add_edit_page.dart' deferred as groupement_add_edit_page; -import 'package:titan/phonebook/ui/pages/admin_page/admin_page.dart' - deferred as admin_page; import 'package:titan/phonebook/ui/pages/association_add_edit_page/association_add_edit_page.dart' deferred as association_add_edit_page; import 'package:titan/phonebook/ui/pages/association_groups_page/association_groups_page.dart' deferred as association_groups_page; import 'package:titan/phonebook/ui/pages/association_members_page/association_members_page.dart' deferred as association_members_page; +import 'package:titan/phonebook/ui/pages/admin_page/admin_page.dart' + deferred as admin_page; import 'package:titan/phonebook/ui/pages/association_page/association_page.dart' deferred as association_page; import 'package:titan/phonebook/ui/pages/main_page/main_page.dart' diff --git a/lib/phonebook/tools/constant.dart b/lib/phonebook/tools/constant.dart new file mode 100644 index 0000000000..176284c497 --- /dev/null +++ b/lib/phonebook/tools/constant.dart @@ -0,0 +1,8 @@ +class PhonebookPermissionConstants { + static const String accessPhonebook = 'access_phonebook'; + static const String managePhonebook = 'manage_phonebook'; +} + +class PhonebookTextConstants { + static const String presidentRoleTag = 'president'; +} diff --git a/lib/phonebook/tools/function.dart b/lib/phonebook/tools/function.dart index 0b0d535fcd..7993146e74 100644 --- a/lib/phonebook/tools/function.dart +++ b/lib/phonebook/tools/function.dart @@ -1,8 +1,11 @@ import 'package:diacritic/diacritic.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/phonebook/class/association.dart'; import 'package:titan/phonebook/class/association_groupement.dart'; import 'package:titan/phonebook/class/complete_member.dart'; import 'package:titan/phonebook/class/membership.dart'; +import 'package:titan/phonebook/providers/roles_tags_provider.dart'; Membership getMembershipForAssociation( CompleteMember member, @@ -12,22 +15,28 @@ Membership getMembershipForAssociation( (element) => element.associationId == association.id && element.mandateYear == association.mandateYear, - orElse: () => Membership.empty(), ); } -int getPosition(CompleteMember member, Association association) { - final membership = getMembershipForAssociation(member, association); +int getPosition(CompleteMember member, String associationId, int year) { + Membership membership = member.memberships.firstWhere( + (element) => + element.associationId == associationId && element.mandateYear == year, + ); return membership.order; } List sortedMembers( List members, - Association association, + String associationId, + int year, ) { return members..sort( - (a, b) => - getPosition(a, association).compareTo(getPosition(b, association)), + (a, b) => getPosition( + a, + associationId, + year, + ).compareTo(getPosition(b, associationId, year)), ); } @@ -51,3 +60,27 @@ List sortedAssociationByKind( // Flatten the sorted map values into a single list return sortedByGroupement.values.expand((list) => list).toList(); } + +Color getColorFromTagList(WidgetRef ref, List tags) { + final rolesTags = ref.watch(rolesTagsProvider); + return rolesTags.maybeWhen( + orElse: () => Colors.white, + data: (data) { + int index = 3; + for (String tag in tags) { + if (data.indexOf(tag) < index) { + index = data.indexOf(tag); + } + } + switch (index) { + case 0: + return const Color.fromARGB(255, 251, 109, 16); + case 1: + return const Color.fromARGB(255, 252, 145, 74); + case 2: + return const Color.fromARGB(255, 253, 193, 153); + } + return Colors.white; + }, + ); +} diff --git a/lib/phonebook/ui/pages/add_edit_groupement_page/groupement_add_edit_page.dart b/lib/phonebook/ui/pages/add_edit_groupement_page/groupement_add_edit_page.dart index fadafbc7b8..2cf5c62a10 100644 --- a/lib/phonebook/ui/pages/add_edit_groupement_page/groupement_add_edit_page.dart +++ b/lib/phonebook/ui/pages/add_edit_groupement_page/groupement_add_edit_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/admin/providers/group_list_provider.dart'; import 'package:titan/l10n/app_localizations.dart'; import 'package:titan/phonebook/class/association_groupement.dart'; import 'package:titan/phonebook/providers/association_groupement_list_provider.dart'; @@ -12,8 +13,11 @@ import 'package:titan/tools/constants.dart'; import 'package:titan/tools/functions.dart'; import 'package:titan/tools/token_expire_wrapper.dart'; import 'package:qlevar_router/qlevar_router.dart'; +import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:titan/tools/ui/styleguide/button.dart'; +import 'package:titan/tools/ui/styleguide/item_chip.dart'; import 'package:titan/tools/ui/styleguide/text_entry.dart'; +import 'package:titan/tools/ui/widgets/align_left_text.dart'; class AssociationGroupementAddEditPage extends HookConsumerWidget { const AssociationGroupementAddEditPage({super.key}); @@ -25,11 +29,14 @@ class AssociationGroupementAddEditPage extends HookConsumerWidget { associationGroupementListProvider.notifier, ); final name = useTextEditingController(text: associationGroupement.name); + final groups = ref.watch(allGroupListProvider); void displayToastWithContext(TypeMsg type, String msg) { displayToast(context, type, msg); } + final selectedGroup = useState(associationGroupement.managerGroupId); + AppLocalizations localizeWithContext = AppLocalizations.of(context)!; return PhonebookTemplate( @@ -58,6 +65,42 @@ class AssociationGroupementAddEditPage extends HookConsumerWidget { canBeEmpty: false, ), const SizedBox(height: 20), + AlignLeftText( + localizeWithContext.phonebookSelectManagerGroup, + fontSize: 16, + fontWeight: FontWeight.w500, + ), + AsyncChild( + value: groups, + builder: (context, groupList) => SizedBox( + height: 40, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + final group = groupList[index]; + return ItemChip( + selected: selectedGroup.value == group.id, + onTap: () { + if (selectedGroup.value != group.id) { + selectedGroup.value = group.id; + } else { + selectedGroup.value = ""; + } + }, + child: Text( + group.name, + style: TextStyle( + color: selectedGroup.value == group.id + ? Colors.white + : Colors.black, + ), + ), + ); + }, + itemCount: groupList.length, + ), + ), + ), Button( text: associationGroupement.id != "" ? localizeWithContext.phonebookEdit @@ -77,6 +120,7 @@ class AssociationGroupementAddEditPage extends HookConsumerWidget { AssociationGroupement( id: associationGroupement.id, name: name.text, + managerGroupId: selectedGroup.value, ), ); if (value) { @@ -95,7 +139,11 @@ class AssociationGroupementAddEditPage extends HookConsumerWidget { } final value = await associaitonGroupementListNotifier .createAssociationGroupement( - AssociationGroupement(id: "", name: name.text), + AssociationGroupement( + id: "", + name: name.text, + managerGroupId: selectedGroup.value, + ), ); if (value) { displayToastWithContext( diff --git a/lib/phonebook/ui/pages/admin_page/admin_page.dart b/lib/phonebook/ui/pages/admin_page/admin_page.dart index fa5bd81bfb..9bd78a4491 100644 --- a/lib/phonebook/ui/pages/admin_page/admin_page.dart +++ b/lib/phonebook/ui/pages/admin_page/admin_page.dart @@ -37,8 +37,8 @@ class AdminPage extends HookConsumerWidget { ); final associationFilteredList = ref.watch(associationFilteredListProvider); final roleNotifier = ref.watch(rolesTagsProvider.notifier); - final isPhonebookAdmin = ref.watch(isPhonebookAdminProvider); final isAdmin = ref.watch(isAdminProvider); + final isPhonebookAdmin = ref.watch(isPhonebookAdminProvider); final localizeWithContext = AppLocalizations.of(context)!; diff --git a/lib/phonebook/ui/pages/main_page/main_page.dart b/lib/phonebook/ui/pages/main_page/main_page.dart index 892d1af527..3e6a1c513b 100644 --- a/lib/phonebook/ui/pages/main_page/main_page.dart +++ b/lib/phonebook/ui/pages/main_page/main_page.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/admin/providers/is_admin_provider.dart'; import 'package:titan/advert/ui/components/special_action_button.dart'; import 'package:titan/phonebook/providers/association_filtered_list_provider.dart'; import 'package:titan/phonebook/providers/association_groupement_provider.dart'; @@ -23,8 +22,7 @@ class PhonebookMainPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final isPhonebookAdmin = ref.watch(isPhonebookAdminProvider); - final isAdmin = ref.watch(isAdminProvider); + final adminAcces = ref.watch(hasPhonebookAdminAccessProvider); final associationListNotifier = ref.watch(associationListProvider.notifier); final associationList = ref.watch(associationListProvider); final associationGroupementList = ref.watch( @@ -55,7 +53,7 @@ class PhonebookMainPage extends HookConsumerWidget { Row( children: [ Expanded(child: AssociationResearchBar()), - if (isPhonebookAdmin || isAdmin) ...[ + if (adminAcces) ...[ SizedBox(width: 10), SpecialActionButton( icon: HeroIcon(HeroIcons.userGroup, color: Colors.white), diff --git a/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart b/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart index 86eeba0b48..48c8818f82 100644 --- a/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart +++ b/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/phonebook/class/membership.dart'; +import 'package:titan/phonebook/providers/association_groupement_list_provider.dart'; import 'package:titan/phonebook/providers/association_member_list_provider.dart'; import 'package:titan/phonebook/providers/association_provider.dart'; import 'package:titan/phonebook/providers/membership_provider.dart'; @@ -39,6 +40,10 @@ class MembershipEditorPage extends HookConsumerWidget { ); final associationMembers = ref.watch(associationMemberListProvider); final isPhonebookAdmin = ref.watch(isPhonebookAdminProvider); + final groupementAdminProviderList = ref.watch(groupementAdminProvider); + final isGroupementAdmin = groupementAdminProviderList.any( + (groupement) => groupement.id == association.groupementId, + ); void displayToastWithContext(TypeMsg type, String msg) { displayToast(context, type, msg); @@ -183,7 +188,10 @@ class MembershipEditorPage extends HookConsumerWidget { .map( (tag) => ToggleListItem( title: tag, - onTap: tagList.first == tag && !isPhonebookAdmin + onTap: + tagList.first == tag && + !isPhonebookAdmin && + !isGroupementAdmin ? () {} : () { final tags = [...selectedTags.value]; diff --git a/lib/phonebook/ui/phonebook.dart b/lib/phonebook/ui/phonebook.dart index 628d3c1a43..c7575b606d 100644 --- a/lib/phonebook/ui/phonebook.dart +++ b/lib/phonebook/ui/phonebook.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:qlevar_router/qlevar_router.dart'; import 'package:titan/phonebook/providers/association_groupement_provider.dart'; import 'package:titan/phonebook/router.dart'; -import 'package:titan/tools/constants.dart'; import 'package:titan/tools/ui/widgets/top_bar.dart'; +import 'package:qlevar_router/qlevar_router.dart'; +import 'package:titan/tools/constants.dart'; class PhonebookTemplate extends HookConsumerWidget { final Widget child; diff --git a/lib/purchases/class/product.dart b/lib/purchases/class/product.dart index 3aa82361d7..5c3ef4cd16 100644 --- a/lib/purchases/class/product.dart +++ b/lib/purchases/class/product.dart @@ -8,6 +8,7 @@ class Product { required this.descriptionFR, required this.descriptionEN, required this.ticketGenerators, + required this.year, }); late final String id; @@ -16,6 +17,7 @@ class Product { late final String? descriptionFR; late final String? descriptionEN; late final List ticketGenerators; + late final int year; Product.fromJson(Map json) { id = json['id']; @@ -26,6 +28,7 @@ class Product { ticketGenerators = List.from( (json['tickets'] as List).map((x) => TicketGenerator.fromJson(x)), ); + year = json['year']; } Map toJson() { @@ -36,6 +39,7 @@ class Product { 'description_fr': descriptionFR, 'description_en': descriptionEN, 'tickets': ticketGenerators.map((x) => x.toJson()).toList(), + 'year': year, }; return data; } @@ -47,6 +51,7 @@ class Product { String? descriptionFR, String? descriptionEN, List? ticketGenerators, + int? year, }) { return Product( id: id ?? this.id, @@ -55,6 +60,7 @@ class Product { descriptionFR: descriptionFR ?? this.descriptionFR, descriptionEN: descriptionEN ?? this.descriptionEN, ticketGenerators: ticketGenerators ?? this.ticketGenerators, + year: year ?? this.year, ); } @@ -65,10 +71,11 @@ class Product { descriptionFR = ""; descriptionEN = ""; ticketGenerators = []; + year = 1970; } @override String toString() { - return 'Product(id: $id, nameFR: $nameFR, nameEN: $nameEN, descriptionFR: $descriptionFR, descriptionEN: $descriptionEN, ticketGenerators: $ticketGenerators)'; + return 'Product(id: $id, nameFR: $nameFR, nameEN: $nameEN, descriptionFR: $descriptionFR, descriptionEN: $descriptionEN, ticketGenerators: $ticketGenerators, year: $year)'; } } diff --git a/lib/purchases/providers/purchase_list_provider.dart b/lib/purchases/providers/purchase_list_provider.dart index 3ad91fb6f3..c8db7d67fd 100644 --- a/lib/purchases/providers/purchase_list_provider.dart +++ b/lib/purchases/providers/purchase_list_provider.dart @@ -24,13 +24,13 @@ class PurchaseListNotifier extends ListNotifier { orElse: () => [], data: (value) { for (Purchase purchase in value) { - if (!years.contains(purchase.purchasedOn.year)) { - years.add(purchase.purchasedOn.year); + if (!years.contains(purchase.product.year)) { + years.add(purchase.product.year); } } }, ); - return years; + return years.reversed.toList(); } } diff --git a/lib/purchases/repositories/user_purchase_repository.dart b/lib/purchases/repositories/user_purchase_repository.dart index 4406e3a825..a9d4e708d1 100644 --- a/lib/purchases/repositories/user_purchase_repository.dart +++ b/lib/purchases/repositories/user_purchase_repository.dart @@ -8,7 +8,7 @@ class UserPurchaseRepository extends Repository { Future> getPurchaseList() async { return List.from( - (await getList(suffix: "purchases/")).map((x) => Purchase.fromJson(x)), + (await getList(suffix: "purchases/all")).map((x) => Purchase.fromJson(x)), ); } } diff --git a/lib/purchases/ui/pages/history_page/history_page.dart b/lib/purchases/ui/pages/history_page/history_page.dart index a75b81d0ff..d3b74868bd 100644 --- a/lib/purchases/ui/pages/history_page/history_page.dart +++ b/lib/purchases/ui/pages/history_page/history_page.dart @@ -37,7 +37,7 @@ class HistoryPage extends HookConsumerWidget { List years = purchasesListNotifier.getPurchasesYears(); children.addAll( purchases.map((purchase) { - if (purchase.purchasedOn.year == selectedYear.value) { + if (purchase.product.year == selectedYear.value) { return PurchaseCard( purchase: purchase, onClicked: () { diff --git a/lib/purchases/ui/pages/scan_page/qr_code_scanner.dart b/lib/purchases/ui/pages/scan_page/qr_code_scanner.dart index ae1c4b5ed8..0b2dfec656 100644 --- a/lib/purchases/ui/pages/scan_page/qr_code_scanner.dart +++ b/lib/purchases/ui/pages/scan_page/qr_code_scanner.dart @@ -10,7 +10,7 @@ class QRCodeScannerScreen extends StatefulWidget { required this.scanner, }); - final Function onScan; + final Function(String) onScan; final AsyncValue scanner; @override @@ -46,10 +46,13 @@ class QRCodeScannerScreenState extends State { ); }, onDetect: (BarcodeCapture capture) async { + final rawValue = capture.barcodes.firstOrNull?.rawValue; setState(() { - qrCode = capture.barcodes.first.rawValue; + qrCode = rawValue; }); - widget.onScan(qrCode!); + if (rawValue != null) { + widget.onScan(rawValue); + } }, ); } diff --git a/lib/purchases/ui/pages/scan_page/scan_dialog.dart b/lib/purchases/ui/pages/scan_page/scan_dialog.dart index 88d64a70cb..a209d90d6b 100644 --- a/lib/purchases/ui/pages/scan_page/scan_dialog.dart +++ b/lib/purchases/ui/pages/scan_page/scan_dialog.dart @@ -196,72 +196,68 @@ class ScanDialog extends HookConsumerWidget { ), ), const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Row( - children: [ - GestureDetector( - onTap: () { - scannerNotifier.reset(); - }, - child: const SizedBox( - width: 100, - child: AddEditButtonLayout( - color: Colors.red, - child: Text( - "Annuler", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 20, + if (data.qrCodeSecret != "") + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, + ), + child: Row( + children: [ + GestureDetector( + onTap: () { + scannerNotifier.reset(); + }, + child: const SizedBox( + width: 100, + child: AddEditButtonLayout( + color: Colors.red, + child: Text( + "Annuler", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 20, + ), ), ), ), ), - ), - const Spacer(), - GestureDetector( - onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await ticketListNotifier - .consumeTicket( - sellerId, - data, - ticket.id, - tag, + const Spacer(), + GestureDetector( + onTap: () async { + await tokenExpireWrapper(ref, () async { + await (ticketListNotifier.consumeTicket( + sellerId, + data, + ticket.id, + tag == "" ? "no tag" : tag, + )).then((_) { + displayToastWithContext( + TypeMsg.msg, + "Scan validé", ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - "Scan validé", - ); - scannerNotifier.reset(); - } else { - displayToastWithContext( - TypeMsg.error, - "Erreur lors de la validation", - ); - } - }); - }, - child: const SizedBox( - width: 100, - child: AddEditButtonLayout( - color: Colors.green, - child: Text( - "Valider", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 20, + scannerNotifier.reset(); + }); + }); + }, + child: const SizedBox( + width: 100, + child: AddEditButtonLayout( + color: Colors.green, + child: Text( + "Suivant", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 20, + ), ), ), ), ), - ), - ], + ], + ), ), - ), ], ); }, diff --git a/lib/raffle/providers/is_raffle_admin.dart b/lib/raffle/providers/is_raffle_admin.dart index 8aca22f6d8..1e71bf087f 100644 --- a/lib/raffle/providers/is_raffle_admin.dart +++ b/lib/raffle/providers/is_raffle_admin.dart @@ -1,9 +1,17 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/raffle/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; -final isRaffleAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("0a25cb76-4b63-4fd3-b939-da6d9feabf28"); +final isRaffleAdminProvider = Provider((ref) { + return hasUserPermission(ref, RafflePermissionConstants.manageRaffle); +}); + +final isRaffleCashManagerProvider = Provider((ref) { + return hasUserPermission(ref, RafflePermissionConstants.manageCash); +}); + +final hasRaffleAdminAccessProvider = Provider((ref) { + final isRaffleAdmin = ref.watch(isRaffleAdminProvider); + final isRaffleCashManager = ref.watch(isRaffleCashManagerProvider); + return isRaffleAdmin || isRaffleCashManager; }); diff --git a/lib/raffle/router.dart b/lib/raffle/router.dart index 600bfcb165..0685a4c8fa 100644 --- a/lib/raffle/router.dart +++ b/lib/raffle/router.dart @@ -52,7 +52,7 @@ class RaffleRouter { path: admin, builder: () => admin_module_page.AdminModulePage(), middleware: [ - AdminMiddleware(ref, isRaffleAdminProvider), + AdminMiddleware(ref, hasRaffleAdminAccessProvider), DeferredLoadingMiddleware(admin_module_page.loadLibrary), ], ), diff --git a/lib/raffle/tools/constants.dart b/lib/raffle/tools/constants.dart index 64eea5565f..2ec7e90377 100644 --- a/lib/raffle/tools/constants.dart +++ b/lib/raffle/tools/constants.dart @@ -15,3 +15,9 @@ class RaffleColorConstants extends ColorConstants { static const Color redGradient3 = Color.fromARGB(255, 255, 34, 34); static const Color ticketBack = Color(0xff000031); } + +class RafflePermissionConstants { + static const String accessRaffle = "access_raffle"; + static const String manageRaffle = "manage_raffle"; + static const String manageCash = "manage_cash"; +} diff --git a/lib/recommendation/providers/is_recommendation_admin_provider.dart b/lib/recommendation/providers/is_recommendation_admin_provider.dart index 391e7acaed..358b4e5a6a 100644 --- a/lib/recommendation/providers/is_recommendation_admin_provider.dart +++ b/lib/recommendation/providers/is_recommendation_admin_provider.dart @@ -1,9 +1,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/recommendation/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; final isRecommendationAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("389215b2-ea45-4991-adc1-4d3e471541cf"); // admin_recommandation + return hasUserPermission( + ref, + RecommendationPermissionConstants.manageRecommendations, + ); }); diff --git a/lib/recommendation/tools/constants.dart b/lib/recommendation/tools/constants.dart index 8b13789179..c270753d38 100644 --- a/lib/recommendation/tools/constants.dart +++ b/lib/recommendation/tools/constants.dart @@ -1 +1,4 @@ - +class RecommendationPermissionConstants { + static const String accessRecommendations = "access_recommendation"; + static const String manageRecommendations = "manage_recommendation"; +} diff --git a/lib/router.dart b/lib/router.dart index fbb4d55e90..a6a98a5865 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -20,8 +20,9 @@ import 'package:titan/others/ui/no_internet_page.dart' import 'package:titan/navigation/ui/all_module_page.dart' deferred as all_module_page; import 'package:titan/others/ui/no_module.dart' deferred as no_module_page; +import 'package:titan/others/ui/rollback_page.dart' deferred as rollback_page; import 'package:titan/others/ui/update_page.dart' deferred as update_page; -import 'package:titan/paiement/router.dart'; +import 'package:titan/mypayment/router.dart'; import 'package:titan/phonebook/router.dart'; import 'package:titan/ph/router.dart'; import 'package:titan/purchases/router.dart'; @@ -36,6 +37,7 @@ import 'package:titan/tools/ui/styleguide/router.dart'; import 'package:titan/vote/router.dart'; import 'package:qlevar_router/qlevar_router.dart'; +import 'package:titan/centralassociation/router.dart'; final appRouterProvider = Provider((ref) => AppRouter(ref)); @@ -48,6 +50,7 @@ class AppRouter { static const String noInternet = '/no_internet'; static const String noModule = '/no_module'; static const String allModules = '/all_modules'; + static const String rollback = '/rollback'; AppRouter(this.ref) { routes = [ @@ -91,10 +94,17 @@ class AppRouter { FadeTransition(opacity: animation, child: child), ), ), + QRoute( + path: rollback, + builder: () => rollback_page.RollbackPage(), + middleware: [DeferredLoadingMiddleware(rollback_page.loadLibrary)], + ), + AdminRouter(ref).route(), AdvertRouter(ref).route(), AmapRouter(ref).route(), BookingRouter(ref).route(), CentralisationRouter(ref).route(), + CentralassociationRouter(ref).route(), CinemaRouter(ref).route(), EventRouter(ref).route(), FlappyBirdRouter(ref).route(), @@ -112,7 +122,6 @@ class AppRouter { StyleGuideRouter(ref).route(), VoteRouter(ref).route(), SeedLibraryRouter(ref).route(), - AdminRouter(ref).route(), SuperAdminRouter(ref).route(), ]; } diff --git a/lib/seed-library/providers/is_seed_library_admin_provider.dart b/lib/seed-library/providers/is_seed_library_admin_provider.dart index 8561852d46..7a2b5ef6fa 100644 --- a/lib/seed-library/providers/is_seed_library_admin_provider.dart +++ b/lib/seed-library/providers/is_seed_library_admin_provider.dart @@ -1,9 +1,10 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/seed-library/tools/constants.dart'; +import 'package:titan/tools/functions.dart'; final isSeedLibraryAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("09153d2a-14f4-49a4-be57-5d0f265261b9"); // admin_seed_library + return hasUserPermission( + ref, + SeedLibraryPermissionConstants.manageSeedLibrary, + ); }); diff --git a/lib/seed-library/tools/constants.dart b/lib/seed-library/tools/constants.dart index 2ab55152f6..2e1230b3d1 100644 --- a/lib/seed-library/tools/constants.dart +++ b/lib/seed-library/tools/constants.dart @@ -142,3 +142,8 @@ class SeedLibraryColorConstants { static const Color greenGradient1 = Color(0xff79a400); static const Color textDark = Color(0xff255000); } + +class SeedLibraryPermissionConstants { + static const String accessSeedLibrary = "access_seed_library"; + static const String manageSeedLibrary = "manage_seed_library"; +} diff --git a/lib/settings/providers/module_list_provider.dart b/lib/settings/providers/module_list_provider.dart index 542f7cdf4c..c67d280ce9 100644 --- a/lib/settings/providers/module_list_provider.dart +++ b/lib/settings/providers/module_list_provider.dart @@ -1,38 +1,58 @@ +import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/admin/router.dart'; import 'package:titan/admin/providers/is_admin_provider.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; +import 'package:titan/admin/router.dart'; import 'package:titan/advert/router.dart'; -import 'package:titan/super_admin/providers/all_my_module_roots_list_provider.dart'; import 'package:titan/amap/router.dart'; import 'package:titan/booking/router.dart'; import 'package:titan/centralisation/router.dart'; import 'package:titan/cinema/router.dart'; import 'package:titan/event/router.dart'; +import 'package:titan/feed/router.dart'; import 'package:titan/loan/router.dart'; +import 'package:titan/mypayment/router.dart'; import 'package:titan/navigation/class/module.dart'; -import 'package:collection/collection.dart'; -import 'package:titan/home/router.dart'; -import 'package:titan/paiement/router.dart'; -import 'package:titan/ph/router.dart'; import 'package:titan/phonebook/router.dart'; +import 'package:titan/ph/router.dart'; import 'package:titan/purchases/router.dart'; import 'package:titan/raffle/router.dart'; import 'package:titan/recommendation/router.dart'; import 'package:titan/seed-library/router.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:titan/settings/router.dart'; import 'package:titan/super_admin/providers/is_super_admin_provider.dart'; import 'package:titan/super_admin/router.dart'; +import 'package:titan/user/providers/user_provider.dart'; import 'package:titan/vote/router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:titan/centralassociation/router.dart'; final modulesProvider = StateNotifierProvider>(( ref, ) { - final myModulesRoot = ref - .watch(allMyModuleRootList) - .map((root) => '/$root') - .toList(); + final me = ref.watch(userProvider); + final modulesPermissionNames = ref.watch(moduleGroupedPermissionsProvider); + final permissions = ref.watch(mappedPermissionsProvider); + List myModulesRoot = []; + for (String module in modulesPermissionNames.keys) { + final accessPermissions = modulesPermissionNames[module]!.firstWhere( + (p) => p.startsWith("access_"), + orElse: () => "", + ); + if (accessPermissions != "") { + final hasAccess = + me.groups.any( + (g) => permissions[accessPermissions]!.authorizedGroupIds.contains( + g.id, + ), + ) || + permissions[accessPermissions]!.authorizedAccountTypes.contains( + me.accountType.type, + ); + if (hasAccess) myModulesRoot.add("/$module"); + } + } final isAdmin = ref.watch(isAdminProvider); final isSuperAdmin = ref.watch(isSuperAdminProvider); @@ -52,11 +72,12 @@ class ModulesNotifier extends StateNotifier> { final bool isSuperAdmin; final eq = const DeepCollectionEquality.unordered(); List allModules = [ - HomeRouter.module, + FeedRouter.module, AdvertRouter.module, AmapRouter.module, BookingRouter.module, CentralisationRouter.module, + CentralassociationRouter.module, CinemaRouter.module, EventRouter.module, LoanRouter.module, @@ -102,6 +123,7 @@ class ModulesNotifier extends StateNotifier> { Future loadModules(List roots) async { final prefs = await SharedPreferences.getInstance(); + await prefs.reload(); List modulesName = prefs.getStringList(dbModule) ?? []; List allSavedModulesName = prefs.getStringList(dbAllModules) ?? []; final allModulesName = allModules.map((e) => e.root.toString()).toList(); diff --git a/lib/settings/tools/functions.dart b/lib/settings/tools/functions.dart index 47bf664eed..6167b769f9 100644 --- a/lib/settings/tools/functions.dart +++ b/lib/settings/tools/functions.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/settings/class/notification_topic.dart'; import 'package:titan/settings/providers/module_list_provider.dart'; +import 'package:url_launcher/url_launcher.dart'; Map> groupNotificationTopicsByModuleRoot( List topics, @@ -37,3 +38,11 @@ Map> groupNotificationTopicsByModuleRoot( return result; } + +void openLink(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url), mode: LaunchMode.inAppBrowserView); + } else { + throw 'Unable to open: $url'; + } +} diff --git a/lib/super_admin/class/module_visibility.dart b/lib/super_admin/class/module_visibility.dart deleted file mode 100644 index b4f8452b8d..0000000000 --- a/lib/super_admin/class/module_visibility.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:titan/super_admin/class/account_type.dart'; - -class ModuleVisibility { - ModuleVisibility({ - required this.root, - required this.allowedGroupIds, - required this.allowedAccountTypes, - }); - late final String root; - late final List allowedGroupIds; - late final List allowedAccountTypes; - - ModuleVisibility.fromJson(Map json) { - root = json['root']; - allowedGroupIds = List.from(json['allowed_group_ids']); - allowedAccountTypes = List.from( - json['allowed_account_types'], - ).map((x) => AccountType(type: x)).toList(); - } - - Map toJson() { - final data = {}; - data['root'] = root; - data['allowed_group_ids'] = allowedGroupIds; - data['allowed_account_types'] = allowedAccountTypes; - return data; - } - - ModuleVisibility copyWith({ - String? root, - List? allowedGroupIds, - List? allowedAccountTypes, - }) => ModuleVisibility( - root: root ?? this.root, - allowedGroupIds: allowedGroupIds ?? this.allowedGroupIds, - allowedAccountTypes: allowedAccountTypes ?? this.allowedAccountTypes, - ); - - ModuleVisibility.empty() { - root = ''; - allowedGroupIds = []; - allowedAccountTypes = []; - } - - @override - String toString() { - return 'ModuleVisibility(root: $root, allowedGroupIds: $allowedGroupIds, allowedAccounTypes: $allowedAccountTypes)'; - } -} diff --git a/lib/super_admin/class/permissions.dart b/lib/super_admin/class/permissions.dart new file mode 100644 index 0000000000..df8c7d0037 --- /dev/null +++ b/lib/super_admin/class/permissions.dart @@ -0,0 +1,114 @@ +class GroupPermission { + GroupPermission({required this.permissionName, required this.groupId}); + late final String permissionName; + late final String groupId; + GroupPermission.fromJson(Map json) { + permissionName = json['permission_name']; + groupId = json['group_id']; + } + Map toJson() { + final data = {}; + data['permission_name'] = permissionName; + data['group_id'] = groupId; + return data; + } + + @override + String toString() => + 'GroupPermission(permissionName: $permissionName, groupId: $groupId)'; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is GroupPermission && + permissionName == other.permissionName && + groupId == other.groupId; + + @override + int get hashCode => permissionName.hashCode ^ groupId.hashCode; +} + +class AccountTypePermission { + AccountTypePermission({ + required this.permissionName, + required this.accountType, + }); + + late final String permissionName; + late final String accountType; + + AccountTypePermission.fromJson(Map json) { + permissionName = json['permission_name']; + accountType = json['account_type']; + } + + Map toJson() { + final data = {}; + data['permission_name'] = permissionName; + data['account_type'] = accountType; + return data; + } + + @override + String toString() => + 'AccountTypePermission(permissionName: $permissionName, accountType: $accountType)'; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is AccountTypePermission && + permissionName == other.permissionName && + accountType == other.accountType; + + @override + int get hashCode => permissionName.hashCode ^ accountType.hashCode; +} + +class CorePermission { + CorePermission({ + required this.permissionName, + required this.authorizedAccountTypes, + required this.authorizedGroupIds, + }); + + late final String permissionName; + late final List authorizedAccountTypes; + late final List authorizedGroupIds; + + CorePermission.fromJson(Map json) { + permissionName = json['permission_name']; + authorizedAccountTypes = List.from(json['account_types']); + authorizedGroupIds = List.from(json['groups']); + } + + Map toJson() { + final data = {}; + data['permission_name'] = permissionName; + data['account_types'] = authorizedAccountTypes; + data['groups'] = authorizedGroupIds; + return data; + } + + CorePermission copyWith({ + String? permissionName, + List? authorizedAccountTypes, + List? authorizedGroupIds, + }) { + return CorePermission( + permissionName: permissionName ?? this.permissionName, + authorizedAccountTypes: + authorizedAccountTypes ?? this.authorizedAccountTypes, + authorizedGroupIds: authorizedGroupIds ?? this.authorizedGroupIds, + ); + } + + CorePermission.empty() { + permissionName = ''; + authorizedAccountTypes = []; + authorizedGroupIds = []; + } + + @override + String toString() => + 'CorePermission(permissionName: $permissionName, authorizedAccountTypes: $authorizedAccountTypes, authorizedGroupIds: $authorizedGroupIds)'; +} diff --git a/lib/super_admin/providers/all_my_module_roots_list_provider.dart b/lib/super_admin/providers/all_my_module_roots_list_provider.dart deleted file mode 100644 index f9a90bd7fd..0000000000 --- a/lib/super_admin/providers/all_my_module_roots_list_provider.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/super_admin/providers/module_root_list_provider.dart'; - -final allMyModuleRootList = Provider>((ref) { - return ref - .watch(moduleRootListProvider) - .maybeWhen(data: (data) => data, orElse: () => []); -}); diff --git a/lib/super_admin/providers/is_expanded_list_provider.dart b/lib/super_admin/providers/is_expanded_list_provider.dart index c2297526ac..bf4d1be44b 100644 --- a/lib/super_admin/providers/is_expanded_list_provider.dart +++ b/lib/super_admin/providers/is_expanded_list_provider.dart @@ -1,10 +1,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/super_admin/class/module_visibility.dart'; -import 'package:titan/super_admin/providers/module_visibility_list_provider.dart'; +import 'package:titan/super_admin/providers/permission_name_list_provider.dart'; class IsExpandedListProvider extends StateNotifier> { - IsExpandedListProvider(List modules) - : super(List.generate(modules.length, (index) => false)); + IsExpandedListProvider(List permissionsNames) + : super(List.generate(permissionsNames.length, (index) => false)); void toggle(int i) { var copy = state.toList(); @@ -15,7 +14,7 @@ class IsExpandedListProvider extends StateNotifier> { final isExpandedListProvider = StateNotifierProvider>((ref) { - final modules = ref.read(moduleVisibilityListProvider); + final modules = ref.read(permissionsNamesListProvider); return modules.maybeWhen( data: (data) => IsExpandedListProvider(data), orElse: () { diff --git a/lib/super_admin/providers/module_root_list_provider.dart b/lib/super_admin/providers/module_root_list_provider.dart deleted file mode 100644 index e55fce6485..0000000000 --- a/lib/super_admin/providers/module_root_list_provider.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/super_admin/repositories/module_visibility_repository.dart'; -import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/tools/providers/list_notifier.dart'; -import 'package:titan/tools/token_expire_wrapper.dart'; -import 'package:titan/user/providers/user_provider.dart'; - -class ModuleListNotifier extends ListNotifier { - ModuleVisibilityRepository repository = ModuleVisibilityRepository(); - ModuleListNotifier({required String token}) - : super(const AsyncValue.loading()) { - repository.setToken(token); - } - - Future>> loadMyModuleRoots() async { - return await loadList(repository.getAccessibleModule); - } -} - -final moduleRootListProvider = - StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - final userProvider = ref.watch(asyncUserProvider); - ModuleListNotifier notifier = ModuleListNotifier(token: token); - userProvider.maybeWhen( - data: (data) => tokenExpireWrapperAuth(ref, () async { - await notifier.loadMyModuleRoots(); - }), - orElse: () {}, - ); - return notifier; - }); diff --git a/lib/super_admin/providers/module_visibility_list_provider.dart b/lib/super_admin/providers/module_visibility_list_provider.dart deleted file mode 100644 index 5917c76b7e..0000000000 --- a/lib/super_admin/providers/module_visibility_list_provider.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/super_admin/class/module_visibility.dart'; -import 'package:titan/super_admin/repositories/module_visibility_repository.dart'; -import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/tools/providers/list_notifier.dart'; -import 'package:titan/tools/token_expire_wrapper.dart'; - -class ModuleVisibilityListNotifier extends ListNotifier { - ModuleVisibilityRepository repository = ModuleVisibilityRepository(); - ModuleVisibilityListNotifier({required String token}) - : super(const AsyncValue.loading()) { - repository.setToken(token); - } - - Future>> loadModuleVisibility() async { - return await loadList(repository.getModuleVisibilityList); - } - - Future addGroupToModule( - ModuleVisibility moduleVisibility, - String allowedGroupId, - ) async { - return await update( - (moduleVisibility) async => - repository.addGroupToModule(moduleVisibility.root, allowedGroupId), - (list, moduleVisibility) => list - ..[list.indexWhere((m) => m.root == moduleVisibility.root)] = - moduleVisibility, - moduleVisibility, - ); - } - - Future deleteGroupAccessForModule( - ModuleVisibility moduleVisibility, - String allowedGroupId, - ) async { - return await update( - (moduleVisibility) async => repository.deleteGroupAccessForModule( - moduleVisibility.root, - allowedGroupId, - ), - (list, moduleVisibility) => list - ..[list.indexWhere((m) => m.root == moduleVisibility.root)] = - moduleVisibility, - moduleVisibility, - ); - } - - Future addAccountTypeToModule( - ModuleVisibility moduleVisibility, - String allowedAccountType, - ) async { - return await update( - (moduleVisibility) async => repository.addAccountTypeToModule( - moduleVisibility.root, - allowedAccountType, - ), - (list, moduleVisibility) => list - ..[list.indexWhere((m) => m.root == moduleVisibility.root)] = - moduleVisibility, - moduleVisibility, - ); - } - - Future deleteAccountTypeAccessForModule( - ModuleVisibility moduleVisibility, - String allowedAccountType, - ) async { - return await update( - (moduleVisibility) async => repository.deleteAccountTypeAccessForModule( - moduleVisibility.root, - allowedAccountType, - ), - (list, moduleVisibility) => list - ..[list.indexWhere((m) => m.root == moduleVisibility.root)] = - moduleVisibility, - moduleVisibility, - ); - } - - void setState(List modules) { - state = AsyncValue.data(modules); - } -} - -final moduleVisibilityListProvider = - StateNotifierProvider< - ModuleVisibilityListNotifier, - AsyncValue> - >((ref) { - final token = ref.watch(tokenProvider); - ModuleVisibilityListNotifier notifier = ModuleVisibilityListNotifier( - token: token, - ); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadModuleVisibility(); - }); - return notifier; - }); diff --git a/lib/super_admin/providers/permission_name_list_provider.dart b/lib/super_admin/providers/permission_name_list_provider.dart new file mode 100644 index 0000000000..d56a2e27cb --- /dev/null +++ b/lib/super_admin/providers/permission_name_list_provider.dart @@ -0,0 +1,32 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:titan/super_admin/repositories/permission_repository.dart'; +import 'package:titan/auth/providers/openid_provider.dart'; +import 'package:titan/tools/providers/list_notifier.dart'; +import 'package:titan/tools/token_expire_wrapper.dart'; + +class PermissionsNamesListNotifier extends ListNotifier { + PermissionRepository repository = PermissionRepository(); + PermissionsNamesListNotifier({required String token}) + : super(const AsyncValue.loading()) { + repository.setToken(token); + } + + Future>> loadPermissionsNamesList() async { + return await loadList(repository.getPermissionsNamesList); + } +} + +final permissionsNamesListProvider = + StateNotifierProvider< + PermissionsNamesListNotifier, + AsyncValue> + >((ref) { + final token = ref.watch(tokenProvider); + PermissionsNamesListNotifier notifier = PermissionsNamesListNotifier( + token: token, + ); + tokenExpireWrapperAuth(ref, () async { + await notifier.loadPermissionsNamesList(); + }); + return notifier; + }); diff --git a/lib/super_admin/providers/permissions_list_provider.dart b/lib/super_admin/providers/permissions_list_provider.dart new file mode 100644 index 0000000000..fe4cde180e --- /dev/null +++ b/lib/super_admin/providers/permissions_list_provider.dart @@ -0,0 +1,183 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:titan/super_admin/class/permissions.dart'; +import 'package:titan/super_admin/providers/permission_name_list_provider.dart'; +import 'package:titan/super_admin/repositories/permission_repository.dart'; +import 'package:titan/auth/providers/openid_provider.dart'; +import 'package:titan/tools/providers/list_notifier.dart'; +import 'package:titan/tools/token_expire_wrapper.dart'; + +class PermissionsNotifier extends ListNotifier { + PermissionRepository repository = PermissionRepository(); + PermissionsNotifier({required String token}) + : super(const AsyncValue.loading()) { + repository.setToken(token); + } + + Future>> loadPermissions() async { + return await loadList(repository.getAllPermissions); + } + + Future addGroupPermission(GroupPermission newPermission) async { + final permission = CorePermission( + permissionName: newPermission.permissionName, + authorizedGroupIds: [newPermission.groupId], + authorizedAccountTypes: [], + ); + return await update( + (_) async => repository.addGroupPermission(newPermission), + (permissions, newPermission) { + final permission = permissions.firstWhere( + (p) => p.permissionName == newPermission.permissionName, + orElse: () => CorePermission.empty(), + ); + if (permission.permissionName.isEmpty) { + permission.permissionName = newPermission.permissionName; + permission.authorizedGroupIds.add( + newPermission.authorizedGroupIds.first, + ); + permissions.add(permission); + } else { + permission.authorizedGroupIds.add( + newPermission.authorizedGroupIds.first, + ); + } + return permissions; + }, + permission, + ); + } + + Future deleteGroupPermission(GroupPermission groupPermission) async { + final permissions = CorePermission( + permissionName: groupPermission.permissionName, + authorizedGroupIds: [groupPermission.groupId], + authorizedAccountTypes: [], + ); + return await update( + (moduleVisibility) async => + repository.deleteGroupPermission(groupPermission), + (permissions, groupPermission) { + final permission = permissions.firstWhere( + (p) => p.permissionName == groupPermission.permissionName, + orElse: () => CorePermission.empty(), + ); + if (permission.permissionName.isNotEmpty) { + permission.authorizedGroupIds.removeWhere( + (id) => id == groupPermission.authorizedGroupIds.first, + ); + } + return permissions; + }, + permissions, + ); + } + + Future addAccountTypePermission( + AccountTypePermission newPermission, + ) async { + final permission = CorePermission( + permissionName: newPermission.permissionName, + authorizedGroupIds: [], + authorizedAccountTypes: [newPermission.accountType], + ); + return await update( + (_) async => repository.addAccountTypePermission(newPermission), + (permissions, permission) { + final perm = permissions.firstWhere( + (p) => p.permissionName == permission.permissionName, + orElse: () => CorePermission.empty(), + ); + if (perm.permissionName.isEmpty) { + perm.permissionName = permission.permissionName; + perm.authorizedAccountTypes.add( + permission.authorizedAccountTypes.first, + ); + permissions.add(perm); + } else { + perm.authorizedAccountTypes.add( + permission.authorizedAccountTypes.first, + ); + } + return permissions; + }, + permission, + ); + } + + Future deleteAccountTypePermission( + AccountTypePermission accountTypePermission, + ) async { + final permission = CorePermission( + permissionName: accountTypePermission.permissionName, + authorizedGroupIds: [], + authorizedAccountTypes: [accountTypePermission.accountType], + ); + + return await update( + (moduleVisibility) async => + repository.deleteAccountTypePermission(accountTypePermission), + (permissions, accountTypePermission) { + final perm = permissions.firstWhere( + (p) => p.permissionName == accountTypePermission.permissionName, + orElse: () => CorePermission.empty(), + ); + if (perm.permissionName.isNotEmpty) { + perm.authorizedAccountTypes.removeWhere( + (at) => at == accountTypePermission.authorizedAccountTypes.first, + ); + } + return permissions; + }, + permission, + ); + } +} + +final permissionsProvider = + StateNotifierProvider< + PermissionsNotifier, + AsyncValue> + >((ref) { + final token = ref.watch(tokenProvider); + PermissionsNotifier notifier = PermissionsNotifier(token: token); + tokenExpireWrapperAuth(ref, () async { + await notifier.loadPermissions(); + }); + return notifier; + }); + +final mappedPermissionsProvider = Provider>((ref) { + final permissionsAsync = ref.watch(permissionsProvider); + return permissionsAsync.maybeWhen( + data: (permissions) { + final Map mappedPermissions = {}; + for (var permission in permissions) { + mappedPermissions[permission.permissionName] = permission; + } + return mappedPermissions; + }, + orElse: () => {}, + ); +}); + +final moduleGroupedPermissionsProvider = Provider>>(( + ref, +) { + final permissionsNames = ref.watch(permissionsNamesListProvider); + return permissionsNames.maybeWhen( + data: (names) { + final Map> modulesPermissions = {}; + + for (var permissionName in names) { + final moduleName = permissionName.split('.').first; + if (!modulesPermissions.containsKey(moduleName)) { + modulesPermissions[moduleName] = [permissionName.split('.')[1]]; + } else { + modulesPermissions[moduleName]!.add(permissionName.split('.')[1]); + } + } + return modulesPermissions; + }, + orElse: () => {}, + ); +}); diff --git a/lib/super_admin/repositories/module_visibility_repository.dart b/lib/super_admin/repositories/module_visibility_repository.dart deleted file mode 100644 index 08fcfb1770..0000000000 --- a/lib/super_admin/repositories/module_visibility_repository.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:titan/super_admin/class/module_visibility.dart'; -import 'package:titan/tools/repository/repository.dart'; - -class ModuleVisibilityRepository extends Repository { - @override - // ignore: overridden_fields - final ext = "module-visibility/"; - - Future> getModuleVisibilityList() async { - return List.from( - (await getList()).map((x) => ModuleVisibility.fromJson(x)), - ); - } - - Future> getAccessibleModule() async { - return List.from(await getList(suffix: "me")); - } - - Future addGroupToModule(String root, String allowedGroupId) async { - await create({'root': root, 'allowed_group_id': allowedGroupId}); - return true; - } - - Future addAccountTypeToModule( - String root, - String allowedAccounTypes, - ) async { - await create({'root': root, 'allowed_account_type': allowedAccounTypes}); - return true; - } - - Future deleteGroupAccessForModule( - String root, - String allowedGroupId, - ) async { - return await delete("$root/groups/$allowedGroupId"); - } - - Future deleteAccountTypeAccessForModule( - String root, - String allowedAccounTypes, - ) async { - return await delete("$root/account-types/$allowedAccounTypes"); - } -} diff --git a/lib/super_admin/repositories/permission_repository.dart b/lib/super_admin/repositories/permission_repository.dart new file mode 100644 index 0000000000..345b1b7f8a --- /dev/null +++ b/lib/super_admin/repositories/permission_repository.dart @@ -0,0 +1,40 @@ +import 'package:titan/super_admin/class/permissions.dart'; +import 'package:titan/tools/repository/repository.dart'; + +class PermissionRepository extends Repository { + @override + // ignore: overridden_fields + final ext = "permissions/"; + + Future> getAllPermissions() async { + return List.from( + (await getList()).map((e) => CorePermission.fromJson(e)), + ); + } + + Future> getPermissionsNamesList() async { + return List.from(await getList(suffix: "list")); + } + + Future addGroupPermission(GroupPermission groupPermission) async { + await create(groupPermission.toJson()); + return true; + } + + Future addAccountTypePermission( + AccountTypePermission accountTypePermission, + ) async { + await create(accountTypePermission.toJson()); + return true; + } + + Future deleteGroupPermission(GroupPermission groupPermission) async { + return await delete("", body: groupPermission.toJson()); + } + + Future deleteAccountTypePermission( + AccountTypePermission accountTypePermission, + ) async { + return await delete("", body: accountTypePermission.toJson()); + } +} diff --git a/lib/super_admin/router.dart b/lib/super_admin/router.dart index 1ebec9c866..3f337760b6 100644 --- a/lib/super_admin/router.dart +++ b/lib/super_admin/router.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/super_admin/providers/is_super_admin_provider.dart'; +import 'package:titan/super_admin/ui/pages/permissions/permissions.dart' + deferred as permissions; -import 'package:titan/super_admin/ui/pages/edit_module_visibility/edit_module_visibility.dart' - deferred as edit_module_visibility; import 'package:titan/super_admin/ui/pages/schools/school_page/school_page.dart' deferred as school_page; import 'package:titan/super_admin/ui/pages/schools/add_school_page/add_school_page.dart' @@ -30,7 +30,7 @@ class SuperAdminRouter { static const String editSchool = '/edit_school'; static const String structures = '/structures'; static const String addEditStructure = '/add_edit_structure'; - static const String editModuleVisibility = '/edit_module_visibility'; + static const String editPermissions = '/edit_permissions'; static const String associationMemberships = '/association_memberships'; static const String detailAssociationMembership = '/detail_association_membership'; @@ -57,11 +57,9 @@ class SuperAdminRouter { ), children: [ QRoute( - path: editModuleVisibility, - builder: () => edit_module_visibility.EditModulesVisibilityPage(), - middleware: [ - DeferredLoadingMiddleware(edit_module_visibility.loadLibrary), - ], + path: editPermissions, + builder: () => permissions.PermissionsPage(), + middleware: [DeferredLoadingMiddleware(permissions.loadLibrary)], ), QRoute( path: schools, diff --git a/lib/super_admin/ui/pages/edit_module_visibility/edit_module_visibility.dart b/lib/super_admin/ui/pages/edit_module_visibility/edit_module_visibility.dart deleted file mode 100644 index 86809dbae9..0000000000 --- a/lib/super_admin/ui/pages/edit_module_visibility/edit_module_visibility.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/super_admin/providers/all_account_types_list_provider.dart'; -import 'package:titan/admin/providers/all_groups_list_provider.dart'; -import 'package:titan/super_admin/providers/module_visibility_list_provider.dart'; -import 'package:titan/super_admin/ui/admin.dart'; -import 'package:titan/super_admin/ui/pages/edit_module_visibility/modules_expansion_panel.dart'; -import 'package:titan/tools/constants.dart'; -import 'package:titan/tools/ui/builders/async_child.dart'; -import 'package:titan/tools/ui/widgets/loader.dart'; -import 'package:titan/l10n/app_localizations.dart'; - -class EditModulesVisibilityPage extends HookConsumerWidget { - const EditModulesVisibilityPage({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final modulesProvider = ref.watch(moduleVisibilityListProvider); - final groups = ref.watch(allGroupList); - final accountTypes = ref.watch(allAccountTypes); - return SuperAdminTemplate( - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 20), - child: SingleChildScrollView( - physics: const BouncingScrollPhysics(), - child: Column( - children: [ - SizedBox( - child: Column( - children: [ - Align( - alignment: Alignment.centerLeft, - child: Text( - AppLocalizations.of( - context, - )!.adminModifyModuleVisibility, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w700, - color: ColorConstants.gradient1, - ), - ), - ), - const SizedBox(height: 30), - AsyncChild( - value: modulesProvider, - builder: (context, modules) => - modules.isEmpty || - groups.isEmpty || - accountTypes.isEmpty - ? const Loader() - : ModulesExpansionPanel( - modules: modules, - accountTypes: accountTypes, - ), - ), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/super_admin/ui/pages/edit_module_visibility/modules_expansion_panel.dart b/lib/super_admin/ui/pages/edit_module_visibility/modules_expansion_panel.dart deleted file mode 100644 index 7cee25b697..0000000000 --- a/lib/super_admin/ui/pages/edit_module_visibility/modules_expansion_panel.dart +++ /dev/null @@ -1,219 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:heroicons/heroicons.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:titan/super_admin/class/account_type.dart'; -import 'package:titan/super_admin/class/module_visibility.dart'; -import 'package:titan/super_admin/providers/all_account_types_list_provider.dart'; -import 'package:titan/admin/providers/all_groups_list_provider.dart'; -import 'package:titan/super_admin/providers/is_expanded_list_provider.dart'; -import 'package:titan/super_admin/providers/module_visibility_list_provider.dart'; -import 'package:titan/l10n/app_localizations.dart'; - -class ModulesExpansionPanel extends HookConsumerWidget { - final List modules; - final List accountTypes; - - const ModulesExpansionPanel({ - super.key, - required this.modules, - required this.accountTypes, - }); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final modulesNotifier = ref.watch(moduleVisibilityListProvider.notifier); - final groups = ref.watch(allGroupList); - final accountTypes = ref.watch(allAccountTypes); - final isExpandedList = ref.watch(isExpandedListProvider); - final isExpandedListNotifier = ref.watch(isExpandedListProvider.notifier); - return ExpansionPanelList( - expansionCallback: (i, isOpen) { - isExpandedListNotifier.toggle(i); - }, - children: modules - .map( - (moduleVisibility) => ExpansionPanel( - canTapOnHeader: true, - isExpanded: isExpandedList[modules.indexOf(moduleVisibility)], - headerBuilder: (context, isOpen) => Container( - padding: const EdgeInsets.symmetric(vertical: 10), - child: Text( - moduleVisibility.root, - style: const TextStyle( - color: Color.fromARGB(255, 0, 0, 0), - fontSize: 22, - fontWeight: FontWeight.w800, - ), - textAlign: TextAlign.center, - ), - ), - body: Column( - children: [ - Column( - children: [ - const Divider(), - Text( - AppLocalizations.of(context)!.adminAccountTypes, - style: TextStyle( - color: Color.fromARGB(255, 0, 0, 0), - fontSize: 20, - fontWeight: FontWeight.w800, - ), - ), - ...accountTypes.map( - (accountType) => Container( - padding: const EdgeInsets.symmetric( - vertical: 10, - horizontal: 20, - ), - child: Row( - children: [ - Text( - accountType.type, - style: const TextStyle( - color: Color.fromARGB(255, 0, 0, 0), - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - const Spacer(), - moduleVisibility.allowedAccountTypes.contains( - accountType, - ) - ? GestureDetector( - onTap: () async { - final newModuleVisibility = - moduleVisibility.copyWith( - allowedAccountTypes: - moduleVisibility - .allowedAccountTypes - .where( - (type) => - type != accountType, - ) - .toList(), - ); - await modulesNotifier - .deleteAccountTypeAccessForModule( - newModuleVisibility, - accountType.type, - ); - }, - child: const HeroIcon( - HeroIcons.eye, - size: 40, - ), - ) - : GestureDetector( - onTap: () async { - final newModuleVisibility = - moduleVisibility.copyWith( - allowedAccountTypes: - moduleVisibility - .allowedAccountTypes + - [accountType], - ); - await modulesNotifier - .addAccountTypeToModule( - newModuleVisibility, - accountType.type, - ); - }, - child: const HeroIcon( - HeroIcons.eyeSlash, - size: 40, - ), - ), - ], - ), - ), - ), - ], - ), - const Divider(), - Column( - children: [ - Text( - AppLocalizations.of(context)!.adminGroups, - style: const TextStyle( - color: Color.fromARGB(255, 0, 0, 0), - fontSize: 20, - fontWeight: FontWeight.w900, - ), - ), - ...groups.map( - (group) => Container( - padding: const EdgeInsets.symmetric( - vertical: 10, - horizontal: 20, - ), - child: Row( - children: [ - Text( - group.name, - style: const TextStyle( - color: Color.fromARGB(255, 0, 0, 0), - fontSize: 20, - fontWeight: FontWeight.w500, - ), - ), - const Spacer(), - moduleVisibility.allowedGroupIds.contains( - group.id, - ) - ? GestureDetector( - onTap: () async { - final newModuleVisibility = - moduleVisibility.copyWith( - allowedGroupIds: moduleVisibility - .allowedGroupIds - .where( - (groupId) => - groupId != group.id, - ) - .toList(), - ); - await modulesNotifier - .deleteGroupAccessForModule( - newModuleVisibility, - group.id, - ); - }, - child: const HeroIcon( - HeroIcons.eye, - size: 40, - ), - ) - : GestureDetector( - onTap: () async { - final newModuleVisibility = - moduleVisibility.copyWith( - allowedGroupIds: - moduleVisibility - .allowedGroupIds + - [group.id], - ); - await modulesNotifier.addGroupToModule( - newModuleVisibility, - group.id, - ); - }, - child: const HeroIcon( - HeroIcons.eyeSlash, - size: 40, - ), - ), - ], - ), - ), - ), - ], - ), - ], - ), - ), - ) - .toList(), - ); - } -} diff --git a/lib/super_admin/ui/pages/main_page/main_page.dart b/lib/super_admin/ui/pages/main_page/main_page.dart index 9f1cc07850..7d8ad870f9 100644 --- a/lib/super_admin/ui/pages/main_page/main_page.dart +++ b/lib/super_admin/ui/pages/main_page/main_page.dart @@ -36,9 +36,7 @@ class SuperAdminMainPage extends HookConsumerWidget { children: [ GestureDetector( onTap: () { - QR.to( - SuperAdminRouter.root + SuperAdminRouter.editModuleVisibility, - ); + QR.to(SuperAdminRouter.root + SuperAdminRouter.editPermissions); }, child: MenuCardUi( text: AppLocalizations.of(context)!.adminVisibilities, diff --git a/lib/super_admin/ui/pages/permissions/module_expansion_panel.dart b/lib/super_admin/ui/pages/permissions/module_expansion_panel.dart new file mode 100644 index 0000000000..686d0199d4 --- /dev/null +++ b/lib/super_admin/ui/pages/permissions/module_expansion_panel.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/admin/class/simple_group.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; +import 'package:titan/super_admin/ui/pages/permissions/permission_expansion_panel.dart'; +import 'package:titan/super_admin/class/account_type.dart'; + +class ModuleExpansionPanel extends HookConsumerWidget { + final List permissionsNames; + final List groups; + final List accountTypes; + + const ModuleExpansionPanel({ + super.key, + required this.permissionsNames, + required this.groups, + required this.accountTypes, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final isExpanded = useState>( + List.generate(permissionsNames.length, (index) => false), + ); + final modulesPermissionNames = ref.watch(moduleGroupedPermissionsProvider); + + return ExpansionPanelList( + expansionCallback: (i, isOpen) { + isExpanded.value[i] = isOpen; + isExpanded.value = List.from(isExpanded.value); + }, + children: modulesPermissionNames.keys.map((module) { + final index = modulesPermissionNames.keys.toList().indexOf(module); + return ExpansionPanel( + canTapOnHeader: true, + isExpanded: isExpanded.value[index], + headerBuilder: (context, isOpen) => Container( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Text( + module, + style: const TextStyle( + color: Color.fromARGB(255, 0, 0, 0), + fontSize: 22, + fontWeight: FontWeight.w800, + ), + textAlign: TextAlign.center, + ), + ), + body: isExpanded.value[index] + ? PermissionsExpansionPanel( + permissionNames: modulesPermissionNames[module]!, + accountTypes: accountTypes, + groups: groups, + ) + : const SizedBox.shrink(), + ); + }).toList(), + ); + } +} diff --git a/lib/super_admin/ui/pages/permissions/permission_expansion_panel.dart b/lib/super_admin/ui/pages/permissions/permission_expansion_panel.dart new file mode 100644 index 0000000000..809a8ad6be --- /dev/null +++ b/lib/super_admin/ui/pages/permissions/permission_expansion_panel.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/l10n/app_localizations.dart'; +import 'package:titan/super_admin/class/permissions.dart'; +import 'package:titan/admin/class/simple_group.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; +import 'package:titan/admin/tools/functions.dart'; +import 'package:titan/super_admin/ui/pages/permissions/permission_row.dart'; +import 'package:titan/super_admin/class/account_type.dart'; + +class PermissionsExpansionPanel extends HookConsumerWidget { + const PermissionsExpansionPanel({ + super.key, + required this.permissionNames, + required this.accountTypes, + required this.groups, + }); + final List permissionNames; + final List accountTypes; + final List groups; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final permissionExpanded = useState>( + List.generate(permissionNames.length, (index) => false), + ); + final permissions = ref.watch(mappedPermissionsProvider); + + final permissionsProviderNotifier = ref.read(permissionsProvider.notifier); + + final localizeWithContext = AppLocalizations.of(context)!; + + return ExpansionPanelList( + expansionCallback: (i, isOpen) { + permissionExpanded.value[i] = isOpen; + permissionExpanded.value = List.from(permissionExpanded.value); + }, + children: permissionNames.map((permissionName) { + final index = permissionNames.indexOf(permissionName); + return ExpansionPanel( + canTapOnHeader: true, + isExpanded: permissionExpanded.value[index], + headerBuilder: (context, isOpen) => ListTile( + title: Text( + capitalizePermissionName(permissionName), + style: const TextStyle( + color: Color.fromARGB(255, 0, 0, 0), + fontSize: 18, + fontWeight: FontWeight.w600, + ), + ), + ), + body: permissionExpanded.value[index] + ? Column( + children: [ + Text( + localizeWithContext.adminAccountTypes, + style: TextStyle( + color: Color.fromARGB(255, 0, 0, 0), + fontSize: 20, + fontWeight: FontWeight.w800, + ), + ), + ...accountTypes.map((accountType) { + final permission = AccountTypePermission( + permissionName: permissionName, + accountType: accountType.type, + ); + final isAuthorized = permissions[permissionName]! + .authorizedAccountTypes + .contains(accountType.type); + return PermissionRow( + label: accountType.type, + isAuthorized: isAuthorized, + onUnauthorize: () async { + await permissionsProviderNotifier + .deleteAccountTypePermission(permission); + }, + onAuthorize: () async { + await permissionsProviderNotifier + .addAccountTypePermission(permission); + }, + ); + }), + const Divider(), + Text( + localizeWithContext.adminGroups, + style: TextStyle( + color: Color.fromARGB(255, 0, 0, 0), + fontSize: 20, + fontWeight: FontWeight.w900, + ), + ), + ...groups.map((group) { + final permission = GroupPermission( + permissionName: permissionName, + groupId: group.id, + ); + final isAuthorized = permissions[permissionName]! + .authorizedGroupIds + .contains(group.id); + return PermissionRow( + label: group.name, + isAuthorized: isAuthorized, + onUnauthorize: () async { + await permissionsProviderNotifier + .deleteGroupPermission(permission); + }, + onAuthorize: () async { + await permissionsProviderNotifier.addGroupPermission( + permission, + ); + }, + ); + }), + ], + ) + : const SizedBox.shrink(), + ); + }).toList(), + ); + } +} diff --git a/lib/super_admin/ui/pages/permissions/permission_row.dart b/lib/super_admin/ui/pages/permissions/permission_row.dart new file mode 100644 index 0000000000..6ad32062ce --- /dev/null +++ b/lib/super_admin/ui/pages/permissions/permission_row.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:heroicons/heroicons.dart'; + +class PermissionRow extends StatelessWidget { + final String label; + final bool isAuthorized; + final VoidCallback onAuthorize; + final VoidCallback onUnauthorize; + + const PermissionRow({ + super.key, + required this.label, + required this.isAuthorized, + required this.onAuthorize, + required this.onUnauthorize, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20), + child: Row( + children: [ + Text( + label, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + const Spacer(), + GestureDetector( + onTap: isAuthorized ? onUnauthorize : onAuthorize, + child: HeroIcon( + isAuthorized ? HeroIcons.check : HeroIcons.xMark, + size: 40, + color: isAuthorized ? Colors.green : Colors.red, + ), + ), + ], + ), + ); + } +} diff --git a/lib/super_admin/ui/pages/permissions/permissions.dart b/lib/super_admin/ui/pages/permissions/permissions.dart new file mode 100644 index 0000000000..c522d7165c --- /dev/null +++ b/lib/super_admin/ui/pages/permissions/permissions.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/admin/providers/group_list_provider.dart'; +import 'package:titan/l10n/app_localizations.dart'; +import 'package:titan/super_admin/providers/account_types_list_provider.dart'; +import 'package:titan/super_admin/providers/permission_name_list_provider.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; +import 'package:titan/super_admin/ui/admin.dart'; +import 'package:titan/super_admin/ui/pages/permissions/module_expansion_panel.dart'; +import 'package:titan/tools/constants.dart'; +import 'package:titan/tools/ui/builders/async_child.dart'; +import 'package:tuple/tuple.dart'; + +class PermissionsPage extends HookConsumerWidget { + const PermissionsPage({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final permissionsNames = ref.watch(permissionsNamesListProvider); + final permissions = ref.watch(permissionsProvider); + final groups = ref.watch(allGroupListProvider); + final accountTypes = ref.watch(allAccountTypesListProvider); + + final localizeWithContext = AppLocalizations.of(context)!; + + return SuperAdminTemplate( + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 20), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + children: [ + SizedBox( + child: Column( + children: [ + Align( + alignment: Alignment.centerLeft, + child: Text( + localizeWithContext.adminModifyPermissions, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w700, + color: ColorConstants.gradient1, + ), + ), + ), + const SizedBox(height: 30), + Async4Children( + values: Tuple4( + permissionsNames, + permissions, + groups, + accountTypes, + ), + builder: + ( + context, + permissionsNames, + permissions, + groups, + accountTypes, + ) => ModuleExpansionPanel( + permissionsNames: permissionsNames, + groups: groups, + accountTypes: accountTypes, + ), + ), + const SizedBox(height: 80), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/tools/constants.dart b/lib/tools/constants.dart index 05dc3eae01..1968657f0b 100644 --- a/lib/tools/constants.dart +++ b/lib/tools/constants.dart @@ -19,13 +19,6 @@ class ColorConstants { static const Color mainBorder = Color(0xFF950303); } -const String previousEmailRegex = - r'^[\w\-.]*@((ecl\d{2})|(alternance\d{4})|(master)|(auditeur)).ec-lyon.fr$'; - -const String previousStaffEmailRegex = r'^[\w\-.]*@ec-lyon.fr$'; - -const String studentRegex = r'^[\w\-.]*@etu(-enise)?.ec-lyon.fr$'; - const String unableToOpen = 'Impossible d\'ouvrir le lien'; const int maxHyperionFileSize = 4194304; diff --git a/lib/tools/functions.dart b/lib/tools/functions.dart index 88809f8f5b..288bf1adce 100644 --- a/lib/tools/functions.dart +++ b/lib/tools/functions.dart @@ -3,10 +3,16 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:intl/intl.dart'; import 'package:titan/l10n/app_localizations.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; import 'package:titan/tools/constants.dart'; import 'package:titan/tools/plausible/plausible.dart'; +import 'package:titan/tools/repository/repository.dart'; +import 'package:titan/version/repositories/version_repository.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; import 'package:toastification/toastification.dart'; +import 'package:titan/user/providers/user_provider.dart'; +import 'package:yaml/yaml.dart'; /// Parses CSV content with automatic separator detection /// Supports common separators: comma, semicolon, tab, pipe @@ -476,20 +482,18 @@ int generateIntFromString(String s) { return s.codeUnits.reduce((value, element) => value + 100 * element); } -bool isEmailInValid(String email) { - final regex = RegExp(previousEmailRegex); - return regex.hasMatch(email); -} - -bool isStudent(String email) { - final regex = RegExp(studentRegex); - return regex.hasMatch(email); +bool hasUserPermission(Ref ref, String permission) { + final me = ref.watch(userProvider); + final permissions = ref.watch(mappedPermissionsProvider); + return me.groups.any( + (g) => permissions[permission]!.authorizedGroupIds.contains(g.id), + ) || + permissions[permission]!.authorizedAccountTypes.contains( + me.accountType.type, + ); } -bool isNotStaff(String email) { - final regex = RegExp(previousStaffEmailRegex); - return !regex.hasMatch(email); -} +/// getAppFlavor and functions depending on it String getAppFlavor() { if (appFlavor != null) { @@ -549,6 +553,9 @@ String getTitanURL() { if (titanUrl.isEmpty) { throw StateError("Could not find TITAN_URL in config.json"); } + if (titanUrl[titanUrl.length - 1] != "/") { + throw StateError("TITAN_URL in config.json should end with a /"); + } return titanUrl; } @@ -588,3 +595,59 @@ String getAppName() { String getTitanLogo() { return "assets/images/logo_${getAppFlavor()}.png"; } + +/// Start of functions to choose back-end + +bool isVersionCompatible(String currentVersion, String minimalVersion) { + final [major, minor, patch] = currentVersion + .split('.') + .map(int.parse) + .toList(); + final [minimalMajor, minimalMinor, minimalPatch] = minimalVersion + .split('.') + .map(int.parse) + .toList(); + if (major < minimalMajor || + (major == minimalMajor && minor < minimalMinor) || + (major == minimalMajor && + minor == minimalMinor && + patch < minimalPatch)) { + return false; + } + return true; +} + +Future getMinimalHyperionVersion() async { + final String pubspecString = await rootBundle.loadString("pubspec.yaml"); + final YamlMap pubspec = loadYaml(pubspecString); + final String minimalHyperionVersion = pubspec["minimal_hyperion_version"]; + return minimalHyperionVersion; +} + +Future setHyperionAndGetVersion(String flavor) async { + Repository.host = getTitanHost(); // set Titan's back-end + final String hyperionVersion = await VersionRepository().getVersion().then( + (value) => value.version, + ); + return hyperionVersion; +} + +Future setHyperionHost() async { + final String flavor = getAppFlavor(); + final String minimalHyperionVersion = await getMinimalHyperionVersion(); + + try { + if (!isVersionCompatible( + await setHyperionAndGetVersion(flavor), + minimalHyperionVersion, + )) { + if (flavor != "alpha") { + await setHyperionAndGetVersion("alpha"); + } + } + } catch (_) { + return; + } +} + +/// End of functions to choose back-end and functions depending on getAppFlavor diff --git a/lib/tools/middlewares/admin_middleware.dart b/lib/tools/middlewares/admin_middleware.dart index 95f279711a..7cc287714c 100644 --- a/lib/tools/middlewares/admin_middleware.dart +++ b/lib/tools/middlewares/admin_middleware.dart @@ -3,7 +3,7 @@ import 'package:titan/router.dart'; import 'package:qlevar_router/qlevar_router.dart'; class AdminMiddleware extends QMiddleware { - final ProviderBase isAdminProvider; + final ProviderListenable isAdminProvider; final Ref ref; AdminMiddleware(this.ref, this.isAdminProvider); diff --git a/lib/tools/middlewares/authenticated_middleware.dart b/lib/tools/middlewares/authenticated_middleware.dart index 4f4c54ce37..6d3030d963 100644 --- a/lib/tools/middlewares/authenticated_middleware.dart +++ b/lib/tools/middlewares/authenticated_middleware.dart @@ -2,10 +2,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; -import 'package:titan/feed/router.dart'; import 'package:titan/login/router.dart'; import 'package:titan/router.dart'; +import 'package:titan/settings/providers/module_list_provider.dart'; +import 'package:titan/tools/functions.dart'; import 'package:titan/tools/providers/path_forwarding_provider.dart'; +import 'package:titan/version/providers/minimal_hyperion_version_provider.dart'; import 'package:titan/version/providers/titan_version_provider.dart'; import 'package:titan/version/providers/version_verifier_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -26,34 +28,56 @@ class AuthenticatedMiddleware extends QMiddleware { final pathForwardingNotifier = ref.watch(pathForwardingProvider.notifier); final versionVerifier = ref.watch(versionVerifierProvider); final titanVersion = ref.watch(titanVersionProvider); + final minimalHyperionVersion = ref.watch(minimalHyperionVersionProvider); final isLoggedIn = ref.watch(isLoggedInProvider); final check = versionVerifier.whenData( (value) => value.minimalTitanVersion <= titanVersion, ); + final modules = ref.watch(modulesProvider); if (!pathForwardingNotifier.state.isLoggedIn && path != LoginRouter.root && path != "/") { pathForwardingNotifier.forward(path); } + final isHyperionVersionCompatible = versionVerifier.whenData( + (value) => isVersionCompatible(value.version, minimalHyperionVersion), + ); return check.when( data: (value) { if (!value) { return AppRouter.update; } - if (!isLoggedIn) { - return LoginRouter.root; - } - if (!pathForwardingNotifier.state.isLoggedIn) { - pathForwardingNotifier.login(); - } - if (pathForwardingNotifier.state.path == "/") { - pathForwardingNotifier.forward(FeedRouter.root); - return FeedRouter.root; - } - if (pathForwardingNotifier.state.path != path) { - return pathForwardingNotifier.state.path; - } - return null; + return isHyperionVersionCompatible.when( + data: (value) { + if (!value) { + return AppRouter.rollback; + } + if (path == LoginRouter.root && + !pathForwardingNotifier.state.isLoggedIn && + !isLoggedIn) { + return null; + } + if (!isLoggedIn) { + return LoginRouter.root; + } + if (!pathForwardingNotifier.state.isLoggedIn) { + pathForwardingNotifier.login(); + } + if (pathForwardingNotifier.state.path == "/") { + if (modules.isEmpty) { + return AppRouter.noModule; + } + pathForwardingNotifier.forward(modules.first.root); + return modules.first.root; + } + if (pathForwardingNotifier.state.path != path) { + return pathForwardingNotifier.state.path; + } + return null; + }, + loading: () => AppRouter.loading, + error: (error, stack) => AppRouter.noInternet, + ); }, loading: () => AppRouter.loading, error: (error, stack) => AppRouter.noInternet, diff --git a/lib/tools/repository/csv_repository.dart b/lib/tools/repository/csv_repository.dart new file mode 100644 index 0000000000..cfdc84e0b7 --- /dev/null +++ b/lib/tools/repository/csv_repository.dart @@ -0,0 +1,67 @@ +import 'dart:convert'; + +import 'package:flutter/services.dart'; +import 'package:titan/tools/exception.dart'; +import 'package:titan/tools/logs/log.dart'; +import 'package:titan/tools/repository/repository.dart'; +import 'package:http/http.dart' as http; + +abstract class CsvRepository extends Repository { + static const String expiredTokenDetail = "Could not validate credentials"; + + Future getCsv(String id, {String suffix = ""}) async { + try { + final response = await http.get( + Uri.parse("${Repository.host}$ext$id$suffix"), + headers: headers, + ); + if (response.statusCode == 200) { + try { + return response.bodyBytes; + } catch (e) { + Repository.logger.writeLog( + Log( + message: "GET $ext$id$suffix\nError while decoding response", + level: LogLevel.error, + ), + ); + rethrow; + } + } else if (response.statusCode == 403) { + Repository.logger.writeLog( + Log( + message: + "GET $ext$id$suffix\n${response.statusCode} ${response.body}", + level: LogLevel.error, + ), + ); + String resp = utf8.decode(response.body.runes.toList()); + final decoded = json.decode(resp); + if (decoded["detail"] == expiredTokenDetail) { + throw AppException(ErrorType.tokenExpire, decoded["detail"]); + } else { + throw AppException(ErrorType.notFound, decoded["detail"]); + } + } else { + Repository.logger.writeLog( + Log( + message: + "GET $ext$id$suffix\n${response.statusCode} ${response.body}", + level: LogLevel.error, + ), + ); + throw AppException(ErrorType.notFound, response.body); + } + } on AppException { + rethrow; + } catch (e) { + Repository.logger.writeLog( + Log( + message: "GET $ext$id$suffix\nCould not load the csv", + level: LogLevel.error, + ), + ); + rethrow; + } + } +} diff --git a/lib/tools/repository/repository.dart b/lib/tools/repository/repository.dart index f5eb0f3693..01ae7ec3a1 100644 --- a/lib/tools/repository/repository.dart +++ b/lib/tools/repository/repository.dart @@ -4,13 +4,12 @@ import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import 'package:titan/tools/cache/cache_manager.dart'; import 'package:titan/tools/exception.dart'; -import 'package:titan/tools/functions.dart'; import 'package:titan/tools/logs/logger.dart'; abstract class Repository { - static final String host = getTitanHost(); + static String host = ""; // see lib/main.dart static const String expiredTokenDetail = "Could not validate credentials"; - final String ext = ""; + final ext = ""; final Map headers = { "Content-Type": "application/json; charset=UTF-8", "Accept": "application/json", @@ -229,10 +228,11 @@ abstract class Repository { } /// DELETE ext/id/suffix - Future delete(String tId, {String suffix = ""}) async { + Future delete(String tId, {String suffix = "", dynamic body}) async { final response = await http.delete( Uri.parse(host + ext + tId + suffix), headers: headers, + body: body != null ? jsonEncode(body) : null, ); if (response.statusCode == 204) { return true; diff --git a/lib/tools/ui/builders/async_child.dart b/lib/tools/ui/builders/async_child.dart index 74c0b69ab2..45a3692573 100644 --- a/lib/tools/ui/builders/async_child.dart +++ b/lib/tools/ui/builders/async_child.dart @@ -176,7 +176,12 @@ class Async4Children extends StatelessWidget { }); @override Widget build(BuildContext context) { - List listValues = [values.item1, values.item2, values.item3]; + List listValues = [ + values.item1, + values.item2, + values.item3, + values.item4, + ]; if (listValues.any((value) => value.hasError || value.isLoading)) { return handleLoadingAndError( listValues, diff --git a/lib/tools/ui/layouts/app_template.dart b/lib/tools/ui/layouts/app_template.dart index d9dfa6094b..1497178d83 100644 --- a/lib/tools/ui/layouts/app_template.dart +++ b/lib/tools/ui/layouts/app_template.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:titan/auth/providers/openid_provider.dart'; import 'package:titan/navigation/ui/navigation_template.dart'; +import 'package:titan/tools/functions.dart'; +import 'package:titan/version/providers/minimal_hyperion_version_provider.dart'; import 'package:titan/version/providers/titan_version_provider.dart'; import 'package:titan/version/providers/version_verifier_provider.dart'; @@ -13,20 +15,32 @@ class AppTemplate extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final versionVerifier = ref.watch(versionVerifierProvider); final titanVersion = ref.watch(titanVersionProvider); + final minimalHyperionVersion = ref.watch(minimalHyperionVersionProvider); final isLoggedIn = ref.watch(isLoggedInProvider); final check = versionVerifier.whenData( (value) => value.minimalTitanVersion <= titanVersion, ); + final isHyperionVersionCompatible = versionVerifier.whenData( + (value) => isVersionCompatible(value.version, minimalHyperionVersion), + ); return check.maybeWhen( data: (value) { if (!value) { return child; } - if (!isLoggedIn) { - return child; - } - return NavigationTemplate(child: child); + return isHyperionVersionCompatible.maybeWhen( + data: (value) { + if (!value) { + return child; + } + if (!isLoggedIn) { + return child; + } + return NavigationTemplate(child: child); + }, + orElse: () => child, + ); }, orElse: () => child, ); diff --git a/lib/tools/ui/layouts/bottom_modal_template.dart b/lib/tools/ui/layouts/bottom_modal_template.dart new file mode 100644 index 0000000000..38c0725b37 --- /dev/null +++ b/lib/tools/ui/layouts/bottom_modal_template.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:titan/tools/constants.dart'; + +enum BottomModalType { main, danger } + +class BottomModalTemplate extends StatelessWidget { + final Widget child; + final String title; + final String? description; + final List? actions; + final BottomModalType type; + final String? animationKey; + + const BottomModalTemplate({ + super.key, + required this.child, + this.type = BottomModalType.main, + this.animationKey, + required this.title, + this.description, + this.actions, + }); + + const BottomModalTemplate.danger({ + super.key, + required this.child, + this.animationKey, + required this.title, + this.description, + this.actions, + }) : type = BottomModalType.danger; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Center( + child: Container( + margin: const EdgeInsets.only(bottom: 12), + width: 120, + height: 4, + decoration: BoxDecoration( + color: ColorConstants.onTertiary, + borderRadius: BorderRadius.circular(2), + boxShadow: [ + BoxShadow( + color: ColorConstants.onTertiary.withAlpha(50), + blurRadius: 4, + spreadRadius: 1, + ), + ], + ), + ), + ), + Hero( + tag: animationKey ?? 'bottom_modal', + child: Container( + decoration: BoxDecoration( + color: type == BottomModalType.main + ? ColorConstants.background + : ColorConstants.main, + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), + padding: EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + title, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w900, + color: type == BottomModalType.main + ? ColorConstants.tertiary + : ColorConstants.background, + ), + ), + SizedBox(height: 20), + if (description != null) + Text( + description!, + style: TextStyle( + fontSize: 15, + color: type == BottomModalType.main + ? ColorConstants.tertiary + : ColorConstants.background, + ), + ), + child, + if (actions != null && actions!.isNotEmpty) + Column(children: actions!), + SizedBox(height: 20), + ], + ), + ), + ), + ], + ); + } +} + +Future showCustomBottomModal({ + required BuildContext context, + required Widget modal, + Function? onCloseCallback, +}) async { + await showModalBottomSheet( + elevation: 3, + backgroundColor: Colors.transparent, + isScrollControlled: true, + useRootNavigator: true, + context: context, + builder: (_) => modal, + ); +} diff --git a/lib/tools/ui/layouts/button.dart b/lib/tools/ui/layouts/button.dart new file mode 100644 index 0000000000..cdd4c08d9b --- /dev/null +++ b/lib/tools/ui/layouts/button.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:titan/tools/constants.dart'; + +enum ButtonType { main, danger, onDanger, secondary } + +class Button extends StatelessWidget { + final ButtonType type; + final String text; + final bool? disabled; + final double? fontSize; + final Function() onPressed; + + const Button({ + super.key, + this.type = ButtonType.main, + required this.text, + required this.onPressed, + this.disabled = false, + this.fontSize, + }); + + const Button.danger({ + super.key, + required this.text, + required this.onPressed, + this.disabled = false, + this.fontSize, + }) : type = ButtonType.danger; + + const Button.onDanger({ + super.key, + required this.text, + required this.onPressed, + this.disabled = false, + this.fontSize, + }) : type = ButtonType.onDanger; + + const Button.secondary({ + super.key, + required this.text, + required this.onPressed, + this.disabled = false, + this.fontSize, + }) : type = ButtonType.secondary; + + Color get backgroundColor { + switch (type) { + case ButtonType.main: + return ColorConstants.tertiary; + case ButtonType.danger: + return ColorConstants.main; + case ButtonType.onDanger: + return ColorConstants.onMain; + case ButtonType.secondary: + return ColorConstants.background; + } + } + + Color get borderColor { + switch (type) { + case ButtonType.main: + return ColorConstants.onTertiary; + case ButtonType.danger: + return ColorConstants.mainBorder; + case ButtonType.onDanger: + return ColorConstants.mainBorder; + case ButtonType.secondary: + return ColorConstants.onBackground; + } + } + + Color get textColor { + Color color; + switch (type) { + case ButtonType.main: + color = ColorConstants.background; + case ButtonType.onDanger: + color = ColorConstants.background; + case ButtonType.danger: + color = ColorConstants.background; + case ButtonType.secondary: + color = ColorConstants.tertiary; + } + if (disabled == true) { + return color.withAlpha(150); + } + return color; + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: disabled == true ? null : onPressed, + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: borderColor), + ), + child: Center( + child: Text( + text, + textAlign: TextAlign.center, + style: TextStyle( + color: textColor, + fontSize: fontSize ?? 18, + fontWeight: FontWeight.w900, + ), + ), + ), + ), + ); + } +} diff --git a/lib/tools/ui/layouts/item_chip.dart b/lib/tools/ui/layouts/item_chip.dart index 7b3838e3f7..3d8f079777 100644 --- a/lib/tools/ui/layouts/item_chip.dart +++ b/lib/tools/ui/layouts/item_chip.dart @@ -3,11 +3,15 @@ import 'package:flutter/material.dart'; class ItemChip extends StatelessWidget { final bool selected; final Function()? onTap; + final Function()? onLongPress; final Widget child; + final bool vertical; const ItemChip({ super.key, this.selected = false, this.onTap, + this.onLongPress, + this.vertical = false, required this.child, }); @@ -15,14 +19,19 @@ class ItemChip extends StatelessWidget { Widget build(BuildContext context) { return GestureDetector( onTap: onTap, + onLongPress: onLongPress, child: Container( - margin: const EdgeInsets.symmetric(horizontal: 10.0), + width: vertical ? double.infinity : null, + margin: EdgeInsets.symmetric( + horizontal: vertical ? 0.0 : 10.0, + vertical: vertical ? 5.0 : 0.0, + ), padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), decoration: BoxDecoration( borderRadius: BorderRadius.circular(30.0), color: selected ? Colors.black : Colors.grey.shade200, ), - child: child, + child: Center(child: child), ), ); } diff --git a/lib/user/providers/user_provider.dart b/lib/user/providers/user_provider.dart index 2eb81d26db..110ed14bae 100644 --- a/lib/user/providers/user_provider.dart +++ b/lib/user/providers/user_provider.dart @@ -31,18 +31,6 @@ class UserNotifier extends SingleNotifier { return await update(userRepository.updateMe, user); } - Future changePassword( - String oldPassword, - String newPassword, - User user, - ) async { - return await userRepository.changePassword( - oldPassword, - newPassword, - user.email, - ); - } - Future deletePersonal() async { return await userRepository.deletePersonalData(); } diff --git a/lib/user/repositories/user_repository.dart b/lib/user/repositories/user_repository.dart index f883b33e45..f8c412e5cd 100644 --- a/lib/user/repositories/user_repository.dart +++ b/lib/user/repositories/user_repository.dart @@ -42,26 +42,6 @@ class UserRepository extends Repository { return await update(nullTrimmedBody, "me"); } - Future createUser(User user) async { - return User.fromJson(await create(user)); - } - - Future changePassword( - String oldPassword, - String newPassword, - String mail, - ) async { - try { - return (await create({ - "old_password": oldPassword, - "new_password": newPassword, - "email": mail, - }, suffix: "change-password"))["success"]; - } catch (e) { - return false; - } - } - Future deletePersonalData() async { try { return await create({}, suffix: "me/ask-deletion"); diff --git a/lib/version/providers/minimal_hyperion_version_provider.dart b/lib/version/providers/minimal_hyperion_version_provider.dart new file mode 100644 index 0000000000..299205b2a1 --- /dev/null +++ b/lib/version/providers/minimal_hyperion_version_provider.dart @@ -0,0 +1,20 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:titan/tools/functions.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +class MinimalHyperionVersionNotifier extends StateNotifier { + late PackageInfo packageInfo; + MinimalHyperionVersionNotifier() : super(""); + + Future loadVersionFromStorage() async { + state = await getMinimalHyperionVersion(); + return state; + } +} + +final minimalHyperionVersionProvider = + StateNotifierProvider((ref) { + final notifier = MinimalHyperionVersionNotifier(); + notifier.loadVersionFromStorage(); + return notifier; + }); diff --git a/lib/vote/providers/can_vote_provider.dart b/lib/vote/providers/can_vote_provider.dart deleted file mode 100644 index 2236137947..0000000000 --- a/lib/vote/providers/can_vote_provider.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; -import 'package:titan/vote/providers/voter_list_provider.dart'; - -final canVoteProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - final votingGroupList = ref.watch(voterListProvider); - final myGroupIds = me.groups.map((e) => e.id).toList(); - return votingGroupList.maybeWhen( - data: (voters) => voters.any((e) => myGroupIds.contains(e.groupId)), - orElse: () => false, - ); -}); diff --git a/lib/vote/providers/is_vote_admin_provider.dart b/lib/vote/providers/is_vote_admin_provider.dart index 9f18dc731a..8b70a6d4fb 100644 --- a/lib/vote/providers/is_vote_admin_provider.dart +++ b/lib/vote/providers/is_vote_admin_provider.dart @@ -1,9 +1,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:titan/user/providers/user_provider.dart'; +import 'package:titan/tools/functions.dart'; +import 'package:titan/vote/tools/constants.dart'; -final isVoteAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups - .map((e) => e.id) - .contains("2ca57402-605b-4389-a471-f2fea7b27db5"); // admin_vote +final isVoteAdminProvider = Provider((ref) { + return hasUserPermission(ref, VotePermissionConstants.manageVotes); +}); + +final canVoteProvider = Provider((ref) { + return hasUserPermission(ref, VotePermissionConstants.vote); }); diff --git a/lib/vote/tools/constants.dart b/lib/vote/tools/constants.dart new file mode 100644 index 0000000000..2a8e7cbd94 --- /dev/null +++ b/lib/vote/tools/constants.dart @@ -0,0 +1,96 @@ +class VoteTextConstants { + static const String add = 'Ajouter'; + static const String addMember = 'Ajouter un membre'; + static const String addedPretendance = 'Liste ajoutée'; + static const String addedSection = 'Section ajoutée'; + static const String addingError = 'Erreur lors de l\'ajout'; + static const String addPretendance = 'Ajouter une liste'; + static const String addSection = 'Ajouter une section'; + static const String all = "Tous"; + static const String alreadyAddedMember = 'Membre déjà ajouté'; + static const String alreadyVoted = "Vote enregistré"; + static const String chooseList = 'Choisir une liste'; + static const String clear = 'Réinitialiser'; + static const String clearVotes = "Réinitialiser les votes"; + static const String closedVote = 'Votes clos'; + static const String closeVote = 'Fermer les votes'; + static const String confirmVote = 'Confirmer le vote'; + static const String countVote = 'Dépouiller les votes'; + static const String deletedAll = "Tout supprimé"; + static const String deletedPipo = "Listes pipos supprimées"; + static const String deletedSection = 'Section supprimée'; + static const String deleteAll = "Supprimer tout"; + static const String deleteAllDescription = + "Voulez-vous vraiment supprimer tout ?"; + static const String deletePipo = "Supprimer les listes pipos"; + static const String deletePipoDescription = + "Voulez-vous vraiment supprimer les listes pipos ?"; + static const String deletePretendance = 'Supprimer la liste'; + static const String deletePretendanceDesc = + 'Voulez-vous vraiment supprimer cette liste ?'; + static const String deleteSection = 'Supprimer la section'; + static const String deleteSectionDescription = + 'Voulez-vous vraiment supprimer cette section ?'; + static const String deletingError = 'Erreur lors de la suppression'; + static const String description = 'Description'; + static const String edit = 'Modifier'; + static const String editedPretendance = 'Liste modifiée'; + static const String editedSection = 'Section modifiée'; + static const String editingError = 'Erreur lors de la modification'; + static const String errorClosingVotes = + 'Erreur lors de la fermeture des votes'; + static const String errorCountingVotes = + 'Erreur lors du dépouillement des votes'; + static const String errorResetingVotes = + 'Erreur lors de la réinitialisation des votes'; + static const String errorOpeningVotes = + 'Erreur lors de l\'ouverture des votes'; + static const String incorrectOrMissingFields = + 'Champs incorrects ou manquants'; + static const String members = 'Membres'; + static const String name = 'Nom'; + static const String noPretendanceList = 'Aucune liste de prétendance'; + static const String noSection = 'Aucune section'; + static const String canNotVote = 'Vous ne pouvez pas voter'; + static const String noSectionList = 'Aucune section'; + static const String notOpenedVote = 'Vote non ouvert'; + static const String onGoingCount = 'Dépouillement en cours'; + static const String openVote = 'Ouvrir les votes'; + static const String pipo = "Pipo"; + static const String pretendance = 'Listes'; + static const String pretendanceDeleted = 'Prétendance supprimée'; + static const String pretendanceNotDeleted = 'Erreur lors de la suppression'; + static const String program = 'Programme'; + static const String publish = 'Publier'; + static const String publishVoteDescription = + 'Voulez-vous vraiment publier les votes ?'; + static const String resetedVotes = 'Votes réinitialisés'; + static const String resetVote = 'Réinitialiser les votes'; + static const String resetVoteDescription = "Que voulez-vous faire ?"; + static const String role = 'Rôle'; + static const String sectionDescription = 'Description de la section'; + static const String section = 'Section'; + static const String sectionName = 'Nom de la section'; + static const String seeMore = 'Voir plus'; + static const String selected = 'Sélectionné'; + static const String showVotes = 'Voir les votes'; + static const String vote = 'Vote'; + static const String voteError = 'Erreur lors de l\'enregistrement du vote'; + static const String voteFor = 'Voter pour '; + static const String voteNotStarted = 'Vote non ouvert'; + static const String voters = 'Groupes votants'; + static const String voteSuccess = 'Vote enregistré'; + static const String votes = 'Voix'; + static const String votesClosed = 'Votes clos'; + static const String votesCounted = 'Votes dépouillés'; + static const String votesOpened = 'Votes ouverts'; + static const String warning = "Attention"; + static const String warningMessage = + "La sélection ne sera pas sauvegardée.\nVoulez-vous continuer ?"; +} + +class VotePermissionConstants { + static const String accessVotes = "access_campaign"; + static const String manageVotes = "manage_campaign"; + static const String vote = "vote"; +} diff --git a/lib/vote/ui/pages/main_page/main_page.dart b/lib/vote/ui/pages/main_page/main_page.dart index 8ac787b965..0f52061497 100644 --- a/lib/vote/ui/pages/main_page/main_page.dart +++ b/lib/vote/ui/pages/main_page/main_page.dart @@ -8,7 +8,6 @@ import 'package:titan/tools/ui/widgets/admin_button.dart'; import 'package:titan/tools/ui/builders/async_child.dart'; import 'package:titan/tools/ui/layouts/refresher.dart'; import 'package:titan/vote/class/contender.dart'; -import 'package:titan/vote/providers/can_vote_provider.dart'; import 'package:titan/vote/providers/is_vote_admin_provider.dart'; import 'package:titan/vote/providers/contender_list_provider.dart'; import 'package:titan/vote/providers/contender_logo_provider.dart'; diff --git a/nginx.conf b/nginx.conf index c6154f0fab..a3330e786a 100644 --- a/nginx.conf +++ b/nginx.conf @@ -13,6 +13,27 @@ http { server_tokens off; keepalive_timeout 65; + gzip on; + gzip_disable "msie6"; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 9; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_min_length 512; + gzip_types + application/javascript + text/javascript + text/css + text/plain + font/woff2 + application/wasm + application/json + font/ttf + image/svg+xml; + gzip_static on; + gunzip on; + server { listen 80; @@ -40,6 +61,7 @@ http { location / { add_header Cache-Control 'no-store'; add_header Cache-Control 'no-cache'; + add_header Cache-Control 'must-revalidate'; expires 0; try_files $uri $uri/ /index.html; } diff --git a/pubspec.lock b/pubspec.lock index ddea27696e..ef341c0750 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -953,10 +953,10 @@ packages: dependency: "direct main" description: name: mobile_scanner - sha256: "023a71afb4d7cfb5529d0f2636aa8b43db66257905b9486d702085989769c5f2" + sha256: c6184bf2913dd66be244108c9c27ca04b01caf726321c44b0e7a7a1e32d41044 url: "https://pub.dev" source: hosted - version: "7.1.3" + version: "7.1.4" mocktail: dependency: "direct dev" description: @@ -1659,21 +1659,13 @@ packages: source: hosted version: "6.5.0" yaml: - dependency: transitive + dependency: "direct main" description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce url: "https://pub.dev" source: hosted version: "3.1.3" - zxcvbn: - dependency: "direct main" - description: - name: zxcvbn - sha256: "5d860ab87c0e7f295902697afd364aa722d89d4e5839e8800ad1b0faf3d63b08" - url: "https://pub.dev" - source: hosted - version: "1.0.0" sdks: - dart: ">=3.9.2 <4.0.0" - flutter: "3.38.9" + dart: ">=3.10.0 <4.0.0" + flutter: ">=3.38.6 <4.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 7073df148e..a13db3148d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,11 +2,13 @@ name: titan description: Titan est le frontend d'une application de gestion de la vie associative publish_to: "none" -version: 2.3.2+196 +version: 3.0.0+197 + +minimal_hyperion_version: 6.0.0 environment: - sdk: ^3.9.2 - flutter: 3.38.9 + sdk: ^3.10.0 + flutter: ^3.38.6 dependencies: app_links: ^6.4.0 @@ -72,7 +74,7 @@ dependencies: url_launcher: ^6.2.5 uuid: ^4.5.1 webview_flutter: ^4.10.0 - zxcvbn: ^1.0.0 + yaml: ^3.1.3 dev_dependencies: dependency_validator: ^5.0.2 @@ -84,6 +86,7 @@ dev_dependencies: flutter: assets: + - pubspec.yaml - assets/images/logo_prod.png - assets/images/logo_alpha.png - assets/images/logo_dev.png diff --git a/test/amap/amap_test.dart b/test/amap/amap_test.dart index ea484d8dd8..d3c89ea0f2 100644 --- a/test/amap/amap_test.dart +++ b/test/amap/amap_test.dart @@ -50,19 +50,23 @@ void main() { expect(newCash.balance, 1); newCash = cash.copyWith(user: SimpleUser.empty().copyWith(name: 'Name')); expect(newCash.user.name, 'Name'); + newCash = cash.copyWith(lastOrderDate: DateTime.parse('2025-01-01')); + expect(newCash.lastOrderDate, DateTime.parse("2025-01-01")); }); test('Should print properly', () async { - final cash = Cash.empty(); + final cash = Cash.empty().copyWith( + lastOrderDate: DateTime.parse('2025-01-01'), + ); expect( cash.toString(), - 'Cash{balance: 0.0, user: SimpleUser {name: Nom, firstname: Prénom, nickname: null, id: , accountType: external}}', + 'Cash{balance: 0, user: SimpleUser {name: Nom, firstname: Prénom, nickname: null, id: , accountType: external}, lastOrderDate: 2025-01-01 00:00:00.000}', ); }); test('Should parse a Cash from json', () async { final cash = Cash.fromJson({ - "balance": 0.0, + "balance": 0, "user": { "name": "Name", "firstname": "Firstname", @@ -77,16 +81,18 @@ void main() { "phone": "phone", "promo": null, }, + "last_order_date": "2025-01-01 00:00:00.000", }); expect(cash, isA()); expect(cash.balance, 0); + expect(cash.lastOrderDate, DateTime.parse('2025-01-01')); expect(cash.user.name, 'Name'); expect(cash.user.nickname, null); }); test('Should return correct json', () async { final cash = Cash.fromJson({ - "balance": 0.0, + "balance": 0, "user": { "name": "Name", "firstname": "Firstname", @@ -94,8 +100,12 @@ void main() { "id": "id", "account_type": "external", }, + "last_order_date": "2025-01-01T00:00:00.000Z", + }); + expect(cash.toJson(), { + "balance": 0, + "last_order_date": "2025-01-01T00:00:00.000Z", }); - expect(cash.toJson(), {"balance": 0.0}); }); }); @@ -107,12 +117,13 @@ void main() { test('Should parse an Delivery from json', () async { final delivery = Delivery.fromJson({ + "name": "Livraison", "delivery_date": "2021-01-01", "products": [ { "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", "quantity": 0, }, @@ -138,29 +149,33 @@ void main() { expect(newDelivery.status, DeliveryStatus.delivered); newDelivery = delivery.copyWith(expanded: true); expect(newDelivery.expanded, true); + newDelivery = delivery.copyWith(name: "Livraison"); + expect(newDelivery.name, "Livraison"); }); test('Should print properly', () async { final delivery = Delivery.empty().copyWith( deliveryDate: DateTime.parse('2021-01-01'), + name: "Livraison", products: [Product.empty().copyWith(name: 'Name')], id: 'id', status: DeliveryStatus.creation, ); expect( delivery.toString(), - 'Delivery{deliveryDate: 2021-01-01 00:00:00.000, products: [Product{id: , name: Name, price: 0.0, quantity: 0, category: }], id: id, status: DeliveryStatus.creation, expanded: false}', + 'Delivery{name: Livraison, deliveryDate: 2021-01-01 00:00:00.000, products: [Product{id: , name: Name, price: 0, quantity: 0, category: }], id: id, status: DeliveryStatus.creation, expanded: false}', ); }); test('Should return correct json', () async { final delivery = Delivery.fromJson({ + "name": "Livraison", "delivery_date": "2021-01-01", "products": [ { "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", "quantity": 0, }, @@ -169,6 +184,7 @@ void main() { "status": "creation", }); expect(delivery.toJson(), { + "name": "Livraison", "delivery_date": "2021-01-01", "products_ids": ["id"], "id": "id", @@ -206,11 +222,14 @@ void main() { expect(newOrder.orderingDate, DateTime.parse('2021-01-01')); newOrder = order.copyWith(deliveryDate: DateTime.parse('2021-01-01')); expect(newOrder.deliveryDate, DateTime.parse('2021-01-01')); + newOrder = order.copyWith(deliveryName: "Livraison"); + expect(newOrder.deliveryName, "Livraison"); }); test('Should print properly', () async { final order = Order.empty().copyWith( id: 'id', + deliveryName: "Livraison", deliveryId: 'delivery_id', amount: 0, products: [ @@ -228,7 +247,7 @@ void main() { ); expect( order.toString(), - 'Order{id: id, orderingDate: 2021-01-01 00:00:00.000, deliveryDate: 2021-01-01 00:00:00.000, productsDetail: [id], productsQuantity: [0], deliveryId: delivery_id, products: [Product{id: id, name: name, price: 0.0, quantity: 0, category: }], amount: 0.0, lastAmount: 0.0, collectionSlot: CollectionSlot.midDay, user: SimpleUser {name: Name, firstname: Prénom, nickname: null, id: , accountType: external}, expanded: false}', + 'Order{id: id, deliveryName: Livraison, orderingDate: 2021-01-01 00:00:00.000, deliveryDate: 2021-01-01 00:00:00.000, productsDetail: [id], productsQuantity: [0], deliveryId: delivery_id, products: [Product{id: id, name: name, price: 0, quantity: 0, category: }], amount: 0, lastAmount: 0, collectionSlot: CollectionSlot.midDay, user: SimpleUser {name: Name, firstname: Prénom, nickname: null, id: , accountType: external}, expanded: false}', ); }); @@ -236,12 +255,13 @@ void main() { final order = Order.fromJson({ "order_id": "id", "delivery_id": "delivery_id", - "amount": 0.0, + "delivery_name": "Livraison", + "amount": 0, "productsdetail": [ { "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", "quantity": 0, }, @@ -265,12 +285,13 @@ void main() { final order = Order.fromJson({ "order_id": "id", "delivery_id": "delivery_id", - "amount": 0.0, + "delivery_name": "Livraison", + "amount": 0, "productsdetail": [ { "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", "quantity": 0, }, @@ -289,7 +310,8 @@ void main() { expect(order.toJson(), { "order_id": "id", "delivery_id": "delivery_id", - "amount": 0.0, + "delivery_name": "Livraison", + "amount": 0, "products_ids": ["id"], "products_quantity": [0], "collection_slot": "midi", @@ -361,7 +383,7 @@ void main() { final product = Product.fromJson({ "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", }); expect(product, isA()); @@ -373,7 +395,7 @@ void main() { "product": { "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", }, }); @@ -386,7 +408,7 @@ void main() { expect(newProduct.id, "id"); newProduct = product.copyWith(name: "name"); expect(newProduct.name, "name"); - newProduct = product.copyWith(price: 0.0); + newProduct = product.copyWith(price: 0); expect(newProduct.price, 0.0); newProduct = product.copyWith(category: "category"); expect(newProduct.category, "category"); @@ -398,13 +420,13 @@ void main() { final product = Product.empty().copyWith( id: "id", name: "name", - price: 0.0, + price: 0, category: "category", quantity: 0, ); expect( product.toString(), - 'Product{id: id, name: name, price: 0.0, quantity: 0, category: category}', + 'Product{id: id, name: name, price: 0, quantity: 0, category: category}', ); }); @@ -412,14 +434,14 @@ void main() { final product = Product.fromJson({ "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", "quantity": 0, }); expect(product.toJson(), { "id": "id", "name": "name", - "price": 0.0, + "price": 0, "category": "category", "quantity": 0, }); diff --git a/test/amap/is_amap_admin_provider_test.dart b/test/amap/is_amap_admin_provider_test.dart index 8ff091f076..f39854eb15 100644 --- a/test/amap/is_amap_admin_provider_test.dart +++ b/test/amap/is_amap_admin_provider_test.dart @@ -1,7 +1,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:titan/super_admin/class/permissions.dart'; import 'package:titan/admin/class/simple_group.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; import 'package:titan/amap/providers/is_amap_admin_provider.dart'; +import 'package:titan/amap/tools/constants.dart'; import 'package:titan/user/class/user.dart'; import 'package:titan/user/providers/user_provider.dart'; @@ -21,6 +24,13 @@ void main() { ], ), ), + mappedPermissionsProvider.overrideWithValue({ + AMAPPermissionConstants.manageAMAP: CorePermission( + permissionName: AMAPPermissionConstants.manageAMAP, + authorizedGroupIds: ['70db65ee-d533-4f6b-9ffa-a4d70a17b7ef'], + authorizedAccountTypes: [], + ), + }), ], ); @@ -39,6 +49,13 @@ void main() { ], ), ), + mappedPermissionsProvider.overrideWithValue({ + AMAPPermissionConstants.manageAMAP: CorePermission( + permissionName: AMAPPermissionConstants.manageAMAP, + authorizedGroupIds: ['70db65ee-d533-4f6b-9ffa-a4d70a17b7ef'], + authorizedAccountTypes: [], + ), + }), ], ); diff --git a/test/amap/product_provider_test.dart b/test/amap/product_provider_test.dart index 4c2541a459..4bd05b573d 100644 --- a/test/amap/product_provider_test.dart +++ b/test/amap/product_provider_test.dart @@ -17,10 +17,7 @@ void main() { }); test('setProduct updates state', () { - final product = Product.empty().copyWith( - name: 'Test Product', - price: 10.0, - ); + final product = Product.empty().copyWith(name: 'Test Product', price: 10); productNotifier.setProduct(product); expect(productNotifier.state, product); }); @@ -42,10 +39,7 @@ void main() { test('setProduct updates product', () { final container = ProviderContainer(); - final product = Product.empty().copyWith( - name: 'Test Product', - price: 10.0, - ); + final product = Product.empty().copyWith(name: 'Test Product', price: 10); container.read(productProvider.notifier).setProduct(product); expect(container.read(productProvider), product); }); diff --git a/test/amap/user_amount_provider_test.dart b/test/amap/user_amount_provider_test.dart index bab5707229..49df6a8bae 100644 --- a/test/amap/user_amount_provider_test.dart +++ b/test/amap/user_amount_provider_test.dart @@ -20,7 +20,11 @@ void main() { group('loadCashByUser', () { test('returns cash for valid user id', () async { final user = SimpleUser.empty().copyWith(id: '123'); - final cash = Cash(balance: 100.0, user: user); + final cash = Cash( + balance: 100, + user: user, + lastOrderDate: DateTime(2025), + ); when( () => mockRepository.getCashByUser('123'), ).thenAnswer((_) async => cash); @@ -51,10 +55,14 @@ void main() { group('updateCash', () { test('updates cash balance', () async { - final cash = Cash(balance: 100.0, user: SimpleUser.empty()); + final cash = Cash( + balance: 100, + user: SimpleUser.empty(), + lastOrderDate: DateTime(2025), + ); notifier.state = AsyncValue.data(cash); - await notifier.updateCash(50.0); + await notifier.updateCash(50); expect( notifier.state.when( @@ -62,14 +70,14 @@ void main() { loading: () => 0.0, error: (error, stackTrace) => 0.0, ), - equals(150.0), + equals(150), ); }); test('returns error when loading', () async { notifier.state = const AsyncValue.loading(); - await notifier.updateCash(50.0); + await notifier.updateCash(50); expect( notifier.state, @@ -84,7 +92,7 @@ void main() { const error = 'User not found'; notifier.state = const AsyncValue.error(error, StackTrace.empty); - await notifier.updateCash(50.0); + await notifier.updateCash(50); expect(notifier.state.error, equals(error)); }); diff --git a/test/booking/is_booking_admin_provider_test.dart b/test/booking/is_booking_admin_provider_test.dart deleted file mode 100644 index 90906b759f..0000000000 --- a/test/booking/is_booking_admin_provider_test.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:titan/admin/class/simple_group.dart'; -import 'package:titan/booking/providers/is_admin_provider.dart'; -import 'package:titan/user/class/user.dart'; -import 'package:titan/user/providers/user_provider.dart'; - -void main() { - group('isBookingAdminProvider', () { - test('should return true if user is a booking admin', () { - final container = ProviderContainer( - overrides: [ - userProvider.overrideWithValue( - User.empty().copyWith( - groups: [ - SimpleGroup.empty().copyWith( - id: '0a25cb76-4b63-4fd3-b939-da6d9feabf28', - name: 'Booking Admin', - ), - SimpleGroup.empty().copyWith(id: '123', name: 'Other Group'), - ], - ), - ), - ], - ); - - final result = container.read(isAdminProvider); - - expect(result, true); - }); - - test('should return false if user is not a booking admin', () { - final container = ProviderContainer( - overrides: [ - userProvider.overrideWithValue( - User.empty().copyWith( - groups: [ - SimpleGroup.empty().copyWith(id: '123', name: 'Other Group'), - ], - ), - ), - ], - ); - - final result = container.read(isAdminProvider); - - expect(result, false); - }); - }); -} diff --git a/test/cinema/is_cinema_admin_test.dart b/test/cinema/is_cinema_admin_test.dart index dc728268c0..8cebd3e3b3 100644 --- a/test/cinema/is_cinema_admin_test.dart +++ b/test/cinema/is_cinema_admin_test.dart @@ -1,7 +1,10 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/super_admin/class/permissions.dart'; import 'package:titan/admin/class/simple_group.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; import 'package:titan/cinema/providers/is_cinema_admin.dart'; +import 'package:titan/cinema/tools/constants.dart'; import 'package:titan/user/class/user.dart'; import 'package:titan/user/providers/user_provider.dart'; @@ -20,6 +23,13 @@ void main() { ], ), ), + mappedPermissionsProvider.overrideWithValue({ + CinemaPermissionConstants.manageSessions: CorePermission( + permissionName: CinemaPermissionConstants.manageSessions, + authorizedGroupIds: ['ce5f36e6-5377-489f-9696-de70e2477300'], + authorizedAccountTypes: [], + ), + }), ], ); @@ -39,6 +49,13 @@ void main() { ], ), ), + mappedPermissionsProvider.overrideWithValue({ + CinemaPermissionConstants.manageSessions: CorePermission( + permissionName: CinemaPermissionConstants.manageSessions, + authorizedGroupIds: ['ce5f36e6-5377-489f-9696-de70e2477300'], + authorizedAccountTypes: [], + ), + }), ], ); diff --git a/test/event/is_admin_provider_test.dart b/test/event/is_admin_provider_test.dart index d0dfa85d8d..5d12249bea 100644 --- a/test/event/is_admin_provider_test.dart +++ b/test/event/is_admin_provider_test.dart @@ -1,7 +1,10 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:titan/super_admin/class/permissions.dart'; import 'package:titan/admin/class/simple_group.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; import 'package:titan/event/providers/is_admin_provider.dart'; +import 'package:titan/event/tools/constants.dart'; import 'package:titan/user/class/user.dart'; import 'package:titan/user/providers/user_provider.dart'; @@ -21,6 +24,13 @@ void main() { ], ), ), + mappedPermissionsProvider.overrideWithValue({ + EventPermissionConstants.manageEvents: CorePermission( + permissionName: EventPermissionConstants.manageEvents, + authorizedGroupIds: ['b0357687-2211-410a-9e2a-144519eeaafa'], + authorizedAccountTypes: [], + ), + }), ], ); @@ -37,6 +47,13 @@ void main() { groups: [SimpleGroup.empty().copyWith(id: '123', name: 'User')], ), ), + mappedPermissionsProvider.overrideWithValue({ + EventPermissionConstants.manageEvents: CorePermission( + permissionName: EventPermissionConstants.manageEvents, + authorizedGroupIds: ['70db65ee-d533-4f6b-9ffa-a4d70a17b7ef'], + authorizedAccountTypes: [], + ), + }), ], ); diff --git a/test/user/user_provider_test.dart b/test/user/user_provider_test.dart index cf08570043..96c7ca17c4 100644 --- a/test/user/user_provider_test.dart +++ b/test/user/user_provider_test.dart @@ -69,17 +69,6 @@ void main() { }); }); - group('changePassword', () { - test('should return true when password is changed successfully', () async { - final user = User.empty(); - when( - () => mockUserRepository.changePassword('old', 'new', user.email), - ).thenAnswer((_) async => true); - final result = await userNotifier.changePassword('old', 'new', user); - expect(result, true); - }); - }); - group('deletePersonal', () { test( 'should return true when personal data is deleted successfully', diff --git a/test/user/user_test.dart b/test/user/user_test.dart index bb17818ced..09f3985ac2 100644 --- a/test/user/user_test.dart +++ b/test/user/user_test.dart @@ -398,30 +398,4 @@ void main() { expect(await userNotifier.updateMe(newUser), false); }); }); - - group('Testing changePassword', () { - test('Should change password', () async { - final mockUser = MockUserRepository(); - final User user = User.empty(); - when(() => mockUser.getMe()).thenAnswer((_) async => User.empty()); - when( - () => mockUser.changePassword('old', 'new', user.email), - ).thenAnswer((_) async => true); - final UserNotifier userNotifier = UserNotifier(userRepository: mockUser); - await userNotifier.loadMe(); - expect(await userNotifier.changePassword('old', 'new', user), true); - }); - - test('Should catch error when changePassword fail', () async { - final mockUser = MockUserRepository(); - final User user = User.empty(); - when(() => mockUser.getMe()).thenAnswer((_) async => User.empty()); - when( - () => mockUser.changePassword('old', 'new', user.email), - ).thenAnswer((_) async => false); - final UserNotifier userNotifier = UserNotifier(userRepository: mockUser); - await userNotifier.loadMe(); - expect(await userNotifier.changePassword('old', 'new', user), false); - }); - }); } diff --git a/test/vote/is_vote_admin_provider_test.dart b/test/vote/is_vote_admin_provider_test.dart index 7977cafc2b..b49d78d8b8 100644 --- a/test/vote/is_vote_admin_provider_test.dart +++ b/test/vote/is_vote_admin_provider_test.dart @@ -1,9 +1,12 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:titan/super_admin/class/permissions.dart'; import 'package:titan/admin/class/simple_group.dart'; +import 'package:titan/super_admin/providers/permissions_list_provider.dart'; import 'package:titan/user/class/user.dart'; import 'package:titan/user/providers/user_provider.dart'; import 'package:titan/vote/providers/is_vote_admin_provider.dart'; +import 'package:titan/vote/tools/constants.dart'; void main() { group('isVoteAdmin', () { @@ -19,6 +22,13 @@ void main() { ], ), ), + mappedPermissionsProvider.overrideWithValue({ + VotePermissionConstants.manageVotes: CorePermission( + permissionName: VotePermissionConstants.manageVotes, + authorizedGroupIds: ['2ca57402-605b-4389-a471-f2fea7b27db5'], + authorizedAccountTypes: [], + ), + }), ], ); @@ -39,6 +49,13 @@ void main() { ], ), ), + mappedPermissionsProvider.overrideWithValue({ + VotePermissionConstants.manageVotes: CorePermission( + permissionName: VotePermissionConstants.manageVotes, + authorizedGroupIds: ['6c6d7e88-fdb8-4e42-b2b5-3d3cfd12e7d6'], + authorizedAccountTypes: [], + ), + }), ], ); diff --git a/web/index.html b/web/index.html index 12cc217d7f..7c286d2d2f 100644 --- a/web/index.html +++ b/web/index.html @@ -1,4 +1,4 @@ - + @@ -125,14 +125,17 @@ - @@ -160,7 +163,7 @@ application. For more information, see: https://developers.google.com/web/fundamentals/primers/service-workers -->