diff --git a/.vscode/settings.json b/.vscode/settings.json index a6032c70..9619dd65 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { - "dart.lineLength": 100, - "diffEditor.ignoreTrimWhitespace": true, -} \ No newline at end of file + "dart.lineLength": 100, + "diffEditor.ignoreTrimWhitespace": true, +} diff --git a/AUTHORS.md b/AUTHORS.md index a1423876..4c2d018f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -2,6 +2,7 @@ ## Developers +- Jigar Prajapati - - Roland Geider – - Dylan Aird - - Jannik Norden - @@ -19,6 +20,8 @@ - Aman Negi - - Sandi Milohanic - - Miroslav Mazel - +- artchiee - +- Tejas Bir Singh - ## Translators diff --git a/fastlane/metadata/android/hr/full_description.txt b/fastlane/metadata/android/hr/full_description.txt index cb0a08c5..15c808db 100644 --- a/fastlane/metadata/android/hr/full_description.txt +++ b/fastlane/metadata/android/hr/full_description.txt @@ -16,7 +16,7 @@ Tvoje tijelo: Nema potrebe za guglanjem sastojaka omiljenih poslastica – odaberi dnevne obroke od više od 78.000 proizvoda i pogledaj prehrambene vrijednosti. Dodaj obroke u plan prehrane i čuvaj pregled svoje prehrane u kalendaru. Tvoji treninzi: -Znaš što je najbolje za tvoje tijelo. Izradi vlastite treninge iz više od 200 različitih vježbi. Zatim koristi modus teretane vođenje kroz trening dok jednim dodirom bilježiš utege. +Znaš što je najbolje za tvoje tijelo. Izradi vlastite treninge iz više od 200 različitih vježbi. Zatim koristi modus teretane za vođenje kroz trening dok jednim dodirom bilježiš svoje težine. Tvoj napredak: Nikada ne gubi iz vida svoje ciljeve. Prati svoju težinu i vodi statistiku. diff --git a/flatpak/de.wger.flutter.appdata.xml b/flatpak/de.wger.flutter.appdata.xml index 36f88cd2..8fe02967 100755 --- a/flatpak/de.wger.flutter.appdata.xml +++ b/flatpak/de.wger.flutter.appdata.xml @@ -1,63 +1,128 @@ - de.wger.flutter - wger - Fitness/workout, nutrition and weight tracker + de.wger.flutter + wger + Fitness/workout, nutrition and weight tracker - CC0-1.0 - AGPL-3.0-or-later - - touch - pointing - keyboard - - wger - https://wger.de/ - https://github.com/wger-project/flutter/issues + CC0-1.0 + AGPL-3.0-or-later + + touch + pointing + keyboard + + wger + https://wger.de/ + https://github.com/wger-project/flutter/issues - - workstation - mobile - + + workstation + mobile + - -

From fitness lovers to fitness lovers – get your health organized with WGER, your Workout Manager!

-

Have you already found your #1 fitness app and do you love to create your own sports routines? No matter what type of sporty beast you are – we all have something in common: We love to keep track of our health data <3

-

So we don’t judge you for still managing your fitness journey with your handy little workout log book but welcome to 2021!

-

We have developed a 100% free digital health and fitness tracker app for you, sized down to the most relevant features to make your life easier. Get started, keep training and celebrate your progress!

-

wger is an Open Source project and all about:

-
    -
  • Your body: No need to google for the ingredients of your favourite treats – choose your daily meals from more than 78000 products and see the nutritional values. Add meals to the nutritional plan and keep an overview of your diet in the calendar.
  • -
  • Your workouts: You know what is best for your body. Create your own workouts out of a growing variety from 200 different exercises. Then, use the Gym Mode to guide you through the training while you log your weights with one tap.
  • -
  • Your progress: Never lose sight of your goals. Track your weight and keep your statistics.
  • -
  • Your data: wger is your personalized fitness diary – but you own your data. Use the REST API to access and do amazing things with it.
  • -
-

Please note: This free app is not based on additional fundings and we don’t ask you to donate money. More than that it is a community project which is growing constantly. So be prepared for new features anytime!

-

OpenSource – what does that mean? Open Source means that the whole source code for this app and the server it talks to is free and available to anybody:

-
    + +

    + From fitness lovers to fitness lovers – get your health organized with WGER, + your Workout Manager! +

    +

    + Have you already found your #1 fitness app and do you love to create your own sports + routines? No matter what type of sporty beast you are – we all have something in common: + We love to keep track of our health data <3 +

    +

    + So we don’t judge you for still managing your fitness journey with your handy little + workout log book but welcome to 2021! +

    +

    + We have developed a 100% free digital health and fitness tracker app for you, sized down + to the most relevant features to make your life easier. Get started, keep training and + celebrate your progress! +

    +

    wger is an Open Source project and all about:

    +
      +
    • + Your body: + No need to google for the ingredients of your favourite treats – choose your daily + meals from more than 78000 products and see the nutritional values. Add meals to the + nutritional plan and keep an overview of your diet in the calendar. +
    • +
    • + Your workouts: + You know what is best for your body. Create your own workouts out of a growing + variety from 200 different exercises. Then, use the Gym Mode to guide you through + the training while you log your weights with one tap. +
    • +
    • + Your progress: + Never lose sight of your goals. Track your weight and keep your statistics. +
    • +
    • + Your data: + wger is your personalized fitness diary – but you own your data. Use the REST API to + access and do amazing things with it. +
    • +
    +

    Please note: This free app is not based on additional fundings and we don’t ask you to + donate money. More than that it is a community project which is growing constantly. So + be prepared for new features anytime! +

    +

    + OpenSource – what does that mean? + Open Source means that the whole source code for this app and the server it talks to is + free and available to anybody: +

    +
    • Do you want to run wger on your own server for you or your local gym? Go ahead!
    • Do you miss a feature and want to implement it? Start now!
    • Do you want to check that nothing is being sent anywhere? You can!
    • -
    -

    Join our community and become a part of sport enthusiasts and IT geeks from all over the world. We keep working on adjusting and optimizing the app customized to our needs. We love your input so feel free to jump in anytime and contribute your wishes and ideas!

    - -
    +
+

Join our community and become a part of sport enthusiasts and IT geeks from all over the + world. We keep working on adjusting and optimizing the app customized to our needs. We + love your input so feel free to jump in anytime and contribute your wishes and ideas! +

+
    +
  • find the source code on https://github.com/wger-project +
  • +
  • + ask your questions or just say hello on our discord Server + https://discord.gg/rPWFv6W +
  • +
+
- - - wger's dashboard - https://github.com/wger-project/flutter/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/01%20-%20dashboard.png - - + + + wger's dashboard + + https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/01%20-%20dashboard.png + + + + Workout detail + + https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/02%20-%20workout%20detail.png + + + + Measurements + + https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/04%20-%20measurements.png + + + + Nutritional plan + + https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/05%20-%20nutritional%20plan.png + + + - - - + + + - + - de.wger.flutter.desktop + de.wger.flutter.desktop
diff --git a/flatpak/flatpak_meta.json b/flatpak/flatpak_meta.json index be92a836..5d408ead 100644 --- a/flatpak/flatpak_meta.json +++ b/flatpak/flatpak_meta.json @@ -23,6 +23,7 @@ "--share=network", "--socket=fallback-x11", "--socket=wayland", + "--socket=pulseaudio", "--device=dri" ] } \ No newline at end of file diff --git a/flatpak/scripts/pubspec.lock b/flatpak/scripts/pubspec.lock index 4ab45d80..d3d4f846 100644 --- a/flatpak/scripts/pubspec.lock +++ b/flatpak/scripts/pubspec.lock @@ -82,4 +82,4 @@ packages: source: hosted version: "1.3.1" sdks: - dart: ">=2.18.5 <3.0.0" + dart: ">=2.18.5 <4.0.0" diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index f2872cf4..4f8d4d24 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 9.0 + 11.0 diff --git a/ios/Podfile b/ios/Podfile index 1e8c3c90..2c068c40 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '9.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b013bfe1..8169503c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,70 +1,71 @@ PODS: - - camera (0.0.1): - - Flutter - Flutter (1.0.0) + - flutter_barcode_scanner (2.0.0): + - Flutter - flutter_keyboard_visibility (0.0.1): - Flutter - - image_picker (0.0.1): + - image_picker_ios (0.0.1): - Flutter - - package_info (0.0.1): + - integration_test (0.0.1): - Flutter - - shared_preferences_ios (0.0.1): + - package_info_plus (0.4.5): - Flutter + - rive_common (0.0.1): + - Flutter + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS - url_launcher_ios (0.0.1): - Flutter - - video_player (0.0.1): - - Flutter - - wakelock (0.0.1): - - Flutter - - webview_flutter_wkwebview (0.0.1): + - video_player_avfoundation (0.0.1): - Flutter DEPENDENCIES: - - camera (from `.symlinks/plugins/camera/ios`) - Flutter (from `Flutter`) + - flutter_barcode_scanner (from `.symlinks/plugins/flutter_barcode_scanner/ios`) - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - - image_picker (from `.symlinks/plugins/image_picker/ios`) - - package_info (from `.symlinks/plugins/package_info/ios`) - - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - integration_test (from `.symlinks/plugins/integration_test/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - rive_common (from `.symlinks/plugins/rive_common/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - - video_player (from `.symlinks/plugins/video_player/ios`) - - wakelock (from `.symlinks/plugins/wakelock/ios`) - - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`) EXTERNAL SOURCES: - camera: - :path: ".symlinks/plugins/camera/ios" Flutter: :path: Flutter + flutter_barcode_scanner: + :path: ".symlinks/plugins/flutter_barcode_scanner/ios" flutter_keyboard_visibility: :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" - image_picker: - :path: ".symlinks/plugins/image_picker/ios" - package_info: - :path: ".symlinks/plugins/package_info/ios" - shared_preferences_ios: - :path: ".symlinks/plugins/shared_preferences_ios/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + integration_test: + :path: ".symlinks/plugins/integration_test/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + rive_common: + :path: ".symlinks/plugins/rive_common/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/ios" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" - video_player: - :path: ".symlinks/plugins/video_player/ios" - wakelock: - :path: ".symlinks/plugins/wakelock/ios" - webview_flutter_wkwebview: - :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" + video_player_avfoundation: + :path: ".symlinks/plugins/video_player_avfoundation/ios" SPEC CHECKSUMS: - camera: fe33292aff715a981eb34d7ce7b35b54337ff34c - Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_barcode_scanner: 7a1144744c28dc0c57a8de7218ffe5ec59a9e4bf flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 - image_picker: 9aa50e1d8cdacdbed739e925b7eea16d014367e6 - package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - shared_preferences_ios: aef470a42dc4675a1cdd50e3158b42e3d1232b32 - url_launcher_ios: 02f1989d4e14e998335b02b67a7590fa34f971af - video_player: ecd305f42e9044793efd34846e1ce64c31ea6fcb - wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f - webview_flutter_wkwebview: 005fbd90c888a42c5690919a1527ecc6649e1162 + image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 + integration_test: a1e7d09bd98eca2fc37aefd79d4f41ad37bdbbe5 + package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + rive_common: 60ae7896ab40f9513974f36f015de33f70d2c5c5 + shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472 + url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 + video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126 -PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c +PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 -COCOAPODS: 1.11.2 +COCOAPODS: 1.12.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index d44478a3..7bccdc01 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -199,6 +199,7 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -252,6 +253,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -339,7 +341,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -425,7 +427,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -474,7 +476,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index b8ebd6ec..9aa740a2 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -43,5 +43,7 @@ CADisableMinimumFrameDurationOnPhone + UIApplicationSupportsIndirectInputEvents + diff --git a/l10n.yaml b/l10n.yaml index b1cc1414..3c41bfca 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -2,3 +2,4 @@ arb-dir: lib/l10n template-arb-file: app_en.arb output-localization-file: app_localizations.dart nullable-getter: false +preferred-supported-locales: [ en ] \ No newline at end of file diff --git a/lib/helpers/consts.dart b/lib/helpers/consts.dart index 4dcfb723..84f148b3 100644 --- a/lib/helpers/consts.dart +++ b/lib/helpers/consts.dart @@ -36,8 +36,12 @@ const DEFAULT_WEIGHT_UNIT = 1; /// Default impression for a workout session (neutral) const DEFAULT_IMPRESSION = 2; -/// Default weight unit is "repetition" -const DEFAULT_REPETITION_UNIT = 1; +// Weight and repetition units for the workout logs +const REP_UNIT_REPETITIONS = 1; +const REP_UNIT_TILL_FAILURE = 2; + +const WEIGHT_UNIT_KG = 1; +const WEIGHT_UNIT_LB = 2; /// Time to locally cache values such as ingredients, etc const DAYS_TO_CACHE = 20; diff --git a/lib/helpers/i18n.dart b/lib/helpers/i18n.dart index 9820f740..fc19f5e9 100644 --- a/lib/helpers/i18n.dart +++ b/lib/helpers/i18n.dart @@ -28,6 +28,9 @@ String getTranslation(String value, BuildContext context) { case 'Biceps': return AppLocalizations.of(context).biceps; + case 'Body Weight': + return AppLocalizations.of(context).body_weight; + case 'Calves': return AppLocalizations.of(context).calves; @@ -58,21 +61,30 @@ String getTranslation(String value, BuildContext context) { case 'Kilometers': return AppLocalizations.of(context).kilometers; + case 'Kilometers Per Hour': + return AppLocalizations.of(context).kilometers_per_hour; + case 'Lats': return AppLocalizations.of(context).lats; case 'Legs': return AppLocalizations.of(context).legs; - case 'Lower back': - return AppLocalizations.of(context).lower_back; + case 'Max Reps': + return AppLocalizations.of(context).max_reps; case 'Miles': return AppLocalizations.of(context).miles; + case 'Miles Per Hour': + return AppLocalizations.of(context).miles_per_hour; + case 'Minutes': return AppLocalizations.of(context).minutes; + case 'Plates': + return AppLocalizations.of(context).plates; + case 'Pull-up bar': return AppLocalizations.of(context).pull_up_bar; @@ -100,6 +112,12 @@ String getTranslation(String value, BuildContext context) { case 'Until Failure': return AppLocalizations.of(context).until_failure; + case 'kg': + return AppLocalizations.of(context).kg; + + case 'lb': + return AppLocalizations.of(context).lb; + case 'none (bodyweight exercise)': return AppLocalizations.of(context).none__bodyweight_exercise_; diff --git a/lib/helpers/misc.dart b/lib/helpers/misc.dart index 805ec1ed..26c34cc2 100644 --- a/lib/helpers/misc.dart +++ b/lib/helpers/misc.dart @@ -42,7 +42,7 @@ String repText( // rather "8 repetitions". If there is weight we want to output "8 x 50kg", // since the repetitions are implied. If other units are used, we always // print them - if (repetitionUnitObj.id != DEFAULT_REPETITION_UNIT || weight == 0 || weight == null) { + if (repetitionUnitObj.id != REP_UNIT_REPETITIONS || weight == 0 || weight == null) { out.add(repetitionUnitObj.name); } } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index cdf70d3d..a5cc6fbf 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -241,6 +241,8 @@ }, "save": "Save", "@save": {}, + "verify": "Verify", + "@verify": {}, "addSet": "Add set", "@addSet": { "description": "Label for the button that adds a set (to a workout day)" @@ -635,35 +637,154 @@ } }, "cacheWarning": "Due to caching it might take some time till the changes are visible throughout the application.", + "textPromptTitle": "Ready to start?", + "textPromptSubheading": "Press the action button to begin", "abs": "Abs", + "@abs": { + "description": "Generated entry for translation for server strings" + }, "arms": "Arms", + "@arms": { + "description": "Generated entry for translation for server strings" + }, "back": "Back", + "@back": { + "description": "Generated entry for translation for server strings" + }, "barbell": "Barbell", + "@barbell": { + "description": "Generated entry for translation for server strings" + }, "bench": "Bench", + "@bench": { + "description": "Generated entry for translation for server strings" + }, "biceps": "Biceps", + "@biceps": { + "description": "Generated entry for translation for server strings" + }, + "body_weight": "Body Weight", + "@body_weight": { + "description": "Generated entry for translation for server strings" + }, "calves": "Calves", + "@calves": { + "description": "Generated entry for translation for server strings" + }, "cardio": "Cardio", + "@cardio": { + "description": "Generated entry for translation for server strings" + }, "chest": "Chest", + "@chest": { + "description": "Generated entry for translation for server strings" + }, "dumbbell": "Dumbbell", + "@dumbbell": { + "description": "Generated entry for translation for server strings" + }, "glutes": "Glutes", + "@glutes": { + "description": "Generated entry for translation for server strings" + }, "gym_mat": "Gym mat", + "@gym_mat": { + "description": "Generated entry for translation for server strings" + }, "hamstrings": "Hamstrings", + "@hamstrings": { + "description": "Generated entry for translation for server strings" + }, "incline_bench": "Incline bench", + "@incline_bench": { + "description": "Generated entry for translation for server strings" + }, "kettlebell": "Kettlebell", + "@kettlebell": { + "description": "Generated entry for translation for server strings" + }, "kilometers": "Kilometers", + "@kilometers": { + "description": "Generated entry for translation for server strings" + }, + "kilometers_per_hour": "Kilometers Per Hour", + "@kilometers_per_hour": { + "description": "Generated entry for translation for server strings" + }, "lats": "Lats", + "@lats": { + "description": "Generated entry for translation for server strings" + }, "legs": "Legs", - "lower_back": "Lower back", + "@legs": { + "description": "Generated entry for translation for server strings" + }, + "max_reps": "Max Reps", + "@max_reps": { + "description": "Generated entry for translation for server strings" + }, "miles": "Miles", + "@miles": { + "description": "Generated entry for translation for server strings" + }, + "miles_per_hour": "Miles Per Hour", + "@miles_per_hour": { + "description": "Generated entry for translation for server strings" + }, "minutes": "Minutes", + "@minutes": { + "description": "Generated entry for translation for server strings" + }, + "plates": "Plates", + "@plates": { + "description": "Generated entry for translation for server strings" + }, "pull_up_bar": "Pull-up bar", + "@pull_up_bar": { + "description": "Generated entry for translation for server strings" + }, "quads": "Quads", + "@quads": { + "description": "Generated entry for translation for server strings" + }, "repetitions": "Repetitions", + "@repetitions": { + "description": "Generated entry for translation for server strings" + }, "sz_bar": "SZ-Bar", + "@sz_bar": { + "description": "Generated entry for translation for server strings" + }, "seconds": "Seconds", + "@seconds": { + "description": "Generated entry for translation for server strings" + }, "shoulders": "Shoulders", + "@shoulders": { + "description": "Generated entry for translation for server strings" + }, "swiss_ball": "Swiss Ball", + "@swiss_ball": { + "description": "Generated entry for translation for server strings" + }, "triceps": "Triceps", + "@triceps": { + "description": "Generated entry for translation for server strings" + }, "until_failure": "Until Failure", - "none__bodyweight_exercise_": "none (bodyweight exercise)" + "@until_failure": { + "description": "Generated entry for translation for server strings" + }, + "kg": "kg", + "@kg": { + "description": "Generated entry for translation for server strings" + }, + "lb": "lb", + "@lb": { + "description": "Generated entry for translation for server strings" + }, + "none__bodyweight_exercise_": "none (bodyweight exercise)", + "@none__bodyweight_exercise_": { + "description": "Generated entry for translation for server strings" + } } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 431aa286..18e53ead 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -725,5 +725,35 @@ "seconds": "Secondes", "@seconds": {}, "until_failure": "Jusqu'à l'échec", - "@until_failure": {} + "@until_failure": {}, + "textPromptTitle": "Prêt à commencer ?", + "@textPromptTitle": {}, + "textPromptSubheading": "Cliquez sur le bouton pour commencer", + "@textPromptSubheading": {}, + "body_weight": "Poids corporel", + "@body_weight": { + "description": "Generated entry for translation for server strings" + }, + "kilometers_per_hour": "Kilomètres Par Heure", + "@kilometers_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "miles_per_hour": "Miles Par Heure", + "@miles_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "plates": "Disques de poids", + "@plates": { + "description": "Generated entry for translation for server strings" + }, + "kg": "kg", + "@kg": { + "description": "Generated entry for translation for server strings" + }, + "lb": "lb", + "@lb": { + "description": "Generated entry for translation for server strings" + }, + "searchNamesInEnglish": "Chercher également en termes anglais", + "@searchNamesInEnglish": {} } diff --git a/lib/l10n/app_hr.arb b/lib/l10n/app_hr.arb index 32bfd599..4f3d1956 100644 --- a/lib/l10n/app_hr.arb +++ b/lib/l10n/app_hr.arb @@ -43,17 +43,17 @@ "@invalidUsername": { "description": "Error message when the user enters an invalid username" }, - "customServerUrl": "URL instanca wger -a", + "customServerUrl": "URL wger instance", "@customServerUrl": { "description": "Label in the form where the users can enter their own wger instance" }, - "customServerHint": "Upiši adresu vlastitog poslužitelja, inače će se koristiti zadana", + "customServerHint": "Upiši adresu tvog poslužitelja, inače će se koristiti zadani", "@customServerHint": { "description": "Hint text for the form where the users can enter their own wger instance" }, - "registerInstead": "Umjesto toga se registriraj", + "registerInstead": "Nemaš račun? Registriraj se", "@registerInstead": {}, - "loginInstead": "Umjesto toga se prijavi", + "loginInstead": "Već imaš račun? Prijavi se", "@loginInstead": {}, "labelWorkoutPlans": "Planovi treninga", "@labelWorkoutPlans": { @@ -209,7 +209,7 @@ "@aboutContactUsTitle": { "description": "Title for contact us section in the about dialog" }, - "enterRepetitionsOrWeight": "Ispuni ponavljanja ili težinu za barem jedan od setova", + "enterRepetitionsOrWeight": "Upiši broj ponavljanja ili težinu za barem jedan od setova", "@enterRepetitionsOrWeight": { "description": "Error message when the user hasn't filled in the forms for exercise sets" }, @@ -221,7 +221,7 @@ "@selectExercise": { "description": "Error message when the user hasn't selected an exercise in the form" }, - "enterCharacters": "Upiši znakove između {min} i {max}", + "enterCharacters": "Upiši {min} do {max} znakova", "@enterCharacters": { "description": "Error message when the user hasn't entered the correct number of characters in a form", "type": "text", @@ -271,7 +271,7 @@ "@dataCopied": { "description": "Snackbar message to show on copying data to a new log entry" }, - "usernameValidChars": "Korisničko ime može sadržavati samo slova, brojeve i specijalne znakove @, +, ., -, and _", + "usernameValidChars": "Korisničko ime može sadržavati samo slova, brojeve i sljedeće znakove: @, +, ., -, _", "@usernameValidChars": { "description": "Error message when the user tries to register a username with forbidden characters" }, @@ -305,7 +305,7 @@ "@reset": { "description": "Button text allowing the user to reset the entered values to the default" }, - "jumpTo": "Skoči na", + "jumpTo": "Prijeđi na", "@jumpTo": { "description": "Imperative. Label used in popup allowing the user to jump to a specific exercise while in the gym mode" }, @@ -447,7 +447,7 @@ "@muscles": { "description": "(main) muscles trained by an exercise" }, - "dayDescriptionHelp": "Opis onoga što se radi na današnji dan (npr. 'Pull day') ili koji su dijelovi tijela trenirani (npr. 'Prsa i ramena')", + "dayDescriptionHelp": "Opis onoga što se radi na današnji dan (npr. „dan povlačenja”) ili koji su dijelovi tijela trenirani (npr. „prsa i ramena”)", "@dayDescriptionHelp": {}, "setNr": "Set {nr}", "@setNr": { @@ -483,15 +483,15 @@ }, "selectExercises": "Ako želiš izraditi skup setova, potraži nekoliko vježbi i one će se spojiti u jednu grupu", "@selectExercises": {}, - "gymMode": "Način rada u teretani", + "gymMode": "Modus teretane", "@gymMode": { "description": "Label when starting the gym mode" }, - "plateCalculator": "Ploče", + "plateCalculator": "Pločasti utezi", "@plateCalculator": { "description": "Label used for the plate calculator in the gym mode" }, - "plateCalculatorNotDivisible": "Nije moguće postići težinu s dostupnim pločama", + "plateCalculatorNotDivisible": "Nije moguće postići težinu s dostupnim pločastim utezima", "@plateCalculatorNotDivisible": { "description": "Error message when the current weight is not reachable with plates (e.g. 33.1 kg)" }, @@ -556,5 +556,256 @@ "close": "Zatvori", "@close": { "description": "Translation for close" - } + }, + "enterMinCharacters": "Upiši barem {min} znakova", + "@enterMinCharacters": { + "description": "Error message when the user hasn't entered the minimum amount characters in a form", + "type": "text", + "placeholders": { + "min": {} + } + }, + "add_exercise_image_license": "Slike moraju biti kompatibilne s licencom CC BY SA. Ako si u nedoumici, prenesi samo svoje vlastite fotografije.", + "@add_exercise_image_license": {}, + "whatVariationsExist": "Koje varijante ove vježbe postoje?", + "@whatVariationsExist": {}, + "images": "Slike", + "@images": {}, + "alternativeNames": "Alternativna imena", + "@alternativeNames": {}, + "previous": "Prethodno", + "@previous": {}, + "oneNamePerLine": "Jedno ime po retku", + "@oneNamePerLine": {}, + "translation": "Prijevod", + "@translation": {}, + "addExercise": "Dodaj vježbu", + "@addExercise": {}, + "translateExercise": "Prevedi ovu vježbu", + "@translateExercise": {}, + "baseData": "Osnovni podaci na engleskom jeziku", + "@baseData": { + "description": "The base data for an exercise such as category, trained muscles, etc." + }, + "arms": "Ruke", + "@arms": { + "description": "Generated entry for translation for server strings" + }, + "back": "Leđa", + "@back": { + "description": "Generated entry for translation for server strings" + }, + "chest": "Prsa", + "@chest": { + "description": "Generated entry for translation for server strings" + }, + "sz_bar": "Zaobljena šipka", + "@sz_bar": { + "description": "Generated entry for translation for server strings" + }, + "userProfile": "Tvoj profil", + "@userProfile": {}, + "exerciseList": "Popis vježbi", + "@exerciseList": {}, + "exercises": "Vježbe", + "@exercises": { + "description": "Multiple exercises for a workout" + }, + "exerciseName": "Ime vježbe", + "@exerciseName": { + "description": "Label for the name of a workout exercise" + }, + "selectEntry": "Odaberi unos", + "@selectEntry": {}, + "success": "Uspjeh", + "@success": { + "description": "Message when an action completed successfully, usually used as a heading" + }, + "noMeasurementEntries": "Nemaš unose mjerenja", + "@noMeasurementEntries": {}, + "moreMeasurementEntries": "Dodaj novo mjerenje", + "@moreMeasurementEntries": { + "description": "Message shown when the user wants to add new measurement" + }, + "variations": "Varijante", + "@variations": { + "description": "Variations of one exercise (e.g. benchpress and benchpress narrow)" + }, + "alsoKnownAs": "Poznato i kao: {aliases}", + "@alsoKnownAs": { + "placeholders": { + "aliases": {} + }, + "description": "List of alternative names for an exercise" + }, + "verifiedEmail": "Potvrđena e-mail adresa", + "@verifiedEmail": {}, + "unVerifiedEmail": "Nepotvrđena e-mail adresa", + "@unVerifiedEmail": {}, + "verifiedEmailInfo": "E-mail poruka za potvrdu je poslana na {email}", + "@verifiedEmailInfo": { + "placeholders": { + "email": {} + } + }, + "contributeExerciseWarning": "Vježbe možeš dodati samo ako je tvoj račun stariji od {days} dana i ako si potvrdio/la tvoju e-mail adresu", + "@contributeExerciseWarning": { + "description": "Number of days before which a person can add exercise", + "placeholders": { + "days": { + "type": "String", + "example": "14" + } + } + }, + "cacheWarning": "Zbog predmemoriranja, vidljivost promjena u aplikaciji može nešto potrajati.", + "@cacheWarning": {}, + "verifiedEmailReason": "Za dodavanje vježbi moraš potvrditi tvoju e-mail adresu", + "@verifiedEmailReason": {}, + "cardio": "Kardio", + "@cardio": { + "description": "Generated entry for translation for server strings" + }, + "quads": "Ekstenzije nogu", + "@quads": { + "description": "Generated entry for translation for server strings" + }, + "pull_up_bar": "Šipka za povlačenje", + "@pull_up_bar": { + "description": "Generated entry for translation for server strings" + }, + "shoulders": "Ramena", + "@shoulders": { + "description": "Generated entry for translation for server strings" + }, + "triceps": "Triceps", + "@triceps": { + "description": "Generated entry for translation for server strings" + }, + "swiss_ball": "Lopta za fitness", + "@swiss_ball": { + "description": "Generated entry for translation for server strings" + }, + "until_failure": "Do neuspjeha", + "@until_failure": { + "description": "Generated entry for translation for server strings" + }, + "none__bodyweight_exercise_": "ništa (vježba za tjelesnu težinu)", + "@none__bodyweight_exercise_": { + "description": "Generated entry for translation for server strings" + }, + "seconds": "Sekunde", + "@seconds": { + "description": "Generated entry for translation for server strings" + }, + "textPromptTitle": "Spreman?", + "@textPromptTitle": {}, + "barbell": "Šipka", + "@barbell": { + "description": "Generated entry for translation for server strings" + }, + "calves": "Lisni mišići", + "@calves": { + "description": "Generated entry for translation for server strings" + }, + "textPromptSubheading": "Počni pritiskom gumba radnje", + "@textPromptSubheading": {}, + "body_weight": "Tjelesna težina", + "@body_weight": { + "description": "Generated entry for translation for server strings" + }, + "kilometers": "Kilometri", + "@kilometers": { + "description": "Generated entry for translation for server strings" + }, + "kilometers_per_hour": "Kilometara na sat", + "@kilometers_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "lats": "Leđni mišići", + "@lats": { + "description": "Generated entry for translation for server strings" + }, + "miles_per_hour": "Milja na sat", + "@miles_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "minutes": "Minute", + "@minutes": { + "description": "Generated entry for translation for server strings" + }, + "plates": "Ploče", + "@plates": { + "description": "Generated entry for translation for server strings" + }, + "kg": "kg", + "@kg": { + "description": "Generated entry for translation for server strings" + }, + "lb": "lb", + "@lb": { + "description": "Generated entry for translation for server strings" + }, + "searchNamesInEnglish": "Također traži imena na engleskom jeziku", + "@searchNamesInEnglish": {}, + "language": "Jezik", + "@language": {}, + "aboutPageTitle": "Wger informacije", + "@aboutPageTitle": {}, + "abs": "Trbuh", + "@abs": { + "description": "Generated entry for translation for server strings" + }, + "gym_mat": "Podloga za treniranje", + "@gym_mat": { + "description": "Generated entry for translation for server strings" + }, + "incline_bench": "Nagnuta klupa", + "@incline_bench": { + "description": "Generated entry for translation for server strings" + }, + "baseNameEnglish": "Sve vježbe trebaju osnovno ime na engleskom jeziku", + "@baseNameEnglish": {}, + "next": "Sljedeće", + "@next": {}, + "contributeExercise": "Doprinesi vježbu", + "@contributeExercise": {}, + "bench": "Klupa", + "@bench": { + "description": "Generated entry for translation for server strings" + }, + "dumbbell": "Ručni uteg", + "@dumbbell": { + "description": "Generated entry for translation for server strings" + }, + "biceps": "Bicepsi", + "@biceps": { + "description": "Generated entry for translation for server strings" + }, + "glutes": "Stražnjica", + "@glutes": { + "description": "Generated entry for translation for server strings" + }, + "hamstrings": "Tetive koljena", + "@hamstrings": { + "description": "Generated entry for translation for server strings" + }, + "kettlebell": "Kuglasti uteg", + "@kettlebell": { + "description": "Generated entry for translation for server strings" + }, + "legs": "Noge", + "@legs": { + "description": "Generated entry for translation for server strings" + }, + "miles": "Milje", + "@miles": { + "description": "Generated entry for translation for server strings" + }, + "max_reps": "Maks. broj ponavljanja", + "@max_reps": { + "description": "Generated entry for translation for server strings" + }, + "verify": "Potvrdi", + "@verify": {} } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 961ceb40..445bf8cc 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -584,5 +584,25 @@ "previous": "Precedente", "@previous": {}, "next": "Successivo", - "@next": {} + "@next": {}, + "gym_mat": "Materassino da palestra", + "@gym_mat": { + "description": "Generated entry for translation for server strings" + }, + "verifiedEmailInfo": "Un'email di verifica è stata inviata a {email}", + "@verifiedEmailInfo": { + "placeholders": { + "email": {} + } + }, + "oneNamePerLine": "Un nome per linea", + "@oneNamePerLine": {}, + "textPromptTitle": "Pronto a iniziare?", + "@textPromptTitle": {}, + "moreMeasurementEntries": "Aggiungi una nuova misura", + "@moreMeasurementEntries": { + "description": "Message shown when the user wants to add new measurement" + }, + "searchNamesInEnglish": "Cerca anche nei nomi in inglese", + "@searchNamesInEnglish": {} } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 9281a56c..624e18af 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -29,7 +29,7 @@ "@invalidUsername": { "description": "Error message when the user enters an invalid username" }, - "customServerHint": "Digite o endereço do seu próprio servidor, caso contrário, o padrão será usado", + "customServerHint": "Digite o endereço do seu próprio servidor, ou então o padrão será usado", "@customServerHint": { "description": "Hint text for the form where the users can enter their own wger instance" }, @@ -715,5 +715,35 @@ } }, "cardio": "Cardio", - "@cardio": {} + "@cardio": {}, + "textPromptTitle": "Podemos começar?", + "@textPromptTitle": {}, + "textPromptSubheading": "Aperte o botão de ação para começar", + "@textPromptSubheading": {}, + "body_weight": "Peso Corporal", + "@body_weight": { + "description": "Generated entry for translation for server strings" + }, + "kilometers_per_hour": "Quilômetros Por Hora", + "@kilometers_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "miles_per_hour": "Milhas por Hora", + "@miles_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "plates": "Pratos", + "@plates": { + "description": "Generated entry for translation for server strings" + }, + "kg": "kg", + "@kg": { + "description": "Generated entry for translation for server strings" + }, + "lb": "lb", + "@lb": { + "description": "Generated entry for translation for server strings" + }, + "searchNamesInEnglish": "Também buscar nomes em inglês", + "@searchNamesInEnglish": {} } diff --git a/lib/l10n/app_pt_BR.arb b/lib/l10n/app_pt_BR.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/l10n/app_pt_BR.arb @@ -0,0 +1 @@ +{} diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index c08bdab3..a6b78338 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -9,9 +9,9 @@ "@labelWorkoutPlans": { "description": "Title for screen workout plans" }, - "registerInstead": "Зарегистроваться вместо этого", + "registerInstead": "У вас нет аккаунта? Зарегистрируйтесь сейчас", "@registerInstead": {}, - "loginInstead": "Войти вместо этого", + "loginInstead": "Уже есть аккаунт? Войти", "@loginInstead": {}, "labelDashboard": "Панель управления", "@labelDashboard": { @@ -564,5 +564,238 @@ "placeholders": { "min": {} } + }, + "noMeasurementEntries": "У вас нет записей измерений", + "@noMeasurementEntries": {}, + "moreMeasurementEntries": "Добавить новое измерение", + "@moreMeasurementEntries": { + "description": "Message shown when the user wants to add new measurement" + }, + "userProfile": "Ваш профиль", + "@userProfile": {}, + "exerciseList": "Список упражнений", + "@exerciseList": {}, + "baseNameEnglish": "Для всех упражнений необходимо базовое название на английском языке", + "@baseNameEnglish": {}, + "verifiedEmail": "Подтвержденный адрес электронной почты", + "@verifiedEmail": {}, + "swiss_ball": "Гимнастический мяч", + "@swiss_ball": { + "description": "Generated entry for translation for server strings" + }, + "chest": "Грудь", + "@chest": { + "description": "Generated entry for translation for server strings" + }, + "kettlebell": "Гиря", + "@kettlebell": { + "description": "Generated entry for translation for server strings" + }, + "calves": "Икры", + "@calves": { + "description": "Generated entry for translation for server strings" + }, + "success": "Успешно", + "@success": { + "description": "Message when an action completed successfully, usually used as a heading" + }, + "exerciseName": "Название упражнения", + "@exerciseName": { + "description": "Label for the name of a workout exercise" + }, + "textPromptTitle": "Готовы начать?", + "@textPromptTitle": {}, + "body_weight": "Вес тела", + "@body_weight": { + "description": "Generated entry for translation for server strings" + }, + "cardio": "Кардио", + "@cardio": { + "description": "Generated entry for translation for server strings" + }, + "dumbbell": "Гантели", + "@dumbbell": { + "description": "Generated entry for translation for server strings" + }, + "gym_mat": "Спортивный коврик", + "@gym_mat": { + "description": "Generated entry for translation for server strings" + }, + "incline_bench": "Наклонная скамья", + "@incline_bench": { + "description": "Generated entry for translation for server strings" + }, + "kilometers_per_hour": "км/ч", + "@kilometers_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "lats": "Широчайшие", + "@lats": { + "description": "Generated entry for translation for server strings" + }, + "miles": "Мили", + "@miles": { + "description": "Generated entry for translation for server strings" + }, + "miles_per_hour": "миль/ч", + "@miles_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "plates": "Блины", + "@plates": { + "description": "Generated entry for translation for server strings" + }, + "quads": "Четырехглавые", + "@quads": { + "description": "Generated entry for translation for server strings" + }, + "sz_bar": "SZ-гриф", + "@sz_bar": { + "description": "Generated entry for translation for server strings" + }, + "kg": "кг", + "@kg": { + "description": "Generated entry for translation for server strings" + }, + "lb": "фунт", + "@lb": { + "description": "Generated entry for translation for server strings" + }, + "images": "Изображения", + "@images": {}, + "language": "Язык", + "@language": {}, + "abs": "Пресс", + "@abs": { + "description": "Generated entry for translation for server strings" + }, + "arms": "Руки", + "@arms": { + "description": "Generated entry for translation for server strings" + }, + "back": "Спина", + "@back": { + "description": "Generated entry for translation for server strings" + }, + "biceps": "Бицепсы", + "@biceps": { + "description": "Generated entry for translation for server strings" + }, + "translation": "Перевод", + "@translation": {}, + "baseData": "Основы на английском", + "@baseData": { + "description": "The base data for an exercise such as category, trained muscles, etc." + }, + "glutes": "Ягодицы", + "@glutes": { + "description": "Generated entry for translation for server strings" + }, + "kilometers": "Километры", + "@kilometers": { + "description": "Generated entry for translation for server strings" + }, + "seconds": "Секунд", + "@seconds": { + "description": "Generated entry for translation for server strings" + }, + "until_failure": "До отказа", + "@until_failure": { + "description": "Generated entry for translation for server strings" + }, + "bench": "Скамья", + "@bench": { + "description": "Generated entry for translation for server strings" + }, + "barbell": "Штанга", + "@barbell": { + "description": "Generated entry for translation for server strings" + }, + "none__bodyweight_exercise_": "без (с собственным весом)", + "@none__bodyweight_exercise_": { + "description": "Generated entry for translation for server strings" + }, + "shoulders": "Плечи", + "@shoulders": { + "description": "Generated entry for translation for server strings" + }, + "next": "Следующее", + "@next": {}, + "pull_up_bar": "Турник", + "@pull_up_bar": { + "description": "Generated entry for translation for server strings" + }, + "exercises": "Упражнения", + "@exercises": { + "description": "Multiple exercises for a workout" + }, + "add_exercise_image_license": "Изображения должны быть совместимы с CC BY SA лицензией. Если вы сомневаетесь, загружайте только те фотографии, которые вы сделали сами", + "@add_exercise_image_license": {}, + "unVerifiedEmail": "Неподтвержденный адрес электронной почты", + "@unVerifiedEmail": {}, + "contributeExercise": "Добавить упражнение", + "@contributeExercise": {}, + "addExercise": "Добавить упражнение", + "@addExercise": {}, + "translateExercise": "Перевести это упражнение", + "@translateExercise": {}, + "contributeExerciseWarning": "Вы можете добавлять упражнения только в том случае, если ваша учетная запись старше {days} дней и вы подтвердили свою электронную почту", + "@contributeExerciseWarning": { + "description": "Number of days before which a person can add exercise", + "placeholders": { + "days": { + "type": "String", + "example": "14" + } + } + }, + "textPromptSubheading": "Нажмите кнопку действия, чтобы начать", + "@textPromptSubheading": {}, + "minutes": "Минут", + "@minutes": { + "description": "Generated entry for translation for server strings" + }, + "triceps": "Трицепс", + "@triceps": { + "description": "Generated entry for translation for server strings" + }, + "searchNamesInEnglish": "Также ищите названия на английском", + "@searchNamesInEnglish": {}, + "selectEntry": "Пожалуйста, выберите запись", + "@selectEntry": {}, + "variations": "Варианты", + "@variations": { + "description": "Variations of one exercise (e.g. benchpress and benchpress narrow)" + }, + "alsoKnownAs": "Также известно как: {aliases}", + "@alsoKnownAs": { + "placeholders": { + "aliases": {} + }, + "description": "List of alternative names for an exercise" + }, + "verifiedEmailReason": "Вам необходимо подтвердить свой адрес электронной почты, чтобы добавлять упражнения", + "@verifiedEmailReason": {}, + "verifiedEmailInfo": "Письмо с подтверждением отправлено на {email}", + "@verifiedEmailInfo": { + "placeholders": { + "email": {} + } + }, + "alternativeNames": "Альтернативные названия", + "@alternativeNames": {}, + "oneNamePerLine": "Одно название на строку", + "@oneNamePerLine": {}, + "whatVariationsExist": "Какие варианты этого упражнения существуют, если таковые имеются?", + "@whatVariationsExist": {}, + "previous": "Предыдущее", + "@previous": {}, + "aboutPageTitle": "О Wger", + "@aboutPageTitle": {}, + "cacheWarning": "Из-за кэширования может пройти некоторое время, прежде чем изменения станут видны во всем приложении.", + "@cacheWarning": {}, + "legs": "Ноги", + "@legs": { + "description": "Generated entry for translation for server strings" } } diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 8ce2d8fc..d9515a5c 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -717,5 +717,39 @@ "cacheWarning": "Önbelleğe alma nedeniyle değişikliklerin uygulama genelinde görünür olması biraz zaman alabilir.", "@cacheWarning": {}, "searchNamesInEnglish": "Ayrıca İngilizce adları da arayın", - "@searchNamesInEnglish": {} + "@searchNamesInEnglish": {}, + "textPromptTitle": "Başlamaya hazır mısınız?", + "@textPromptTitle": {}, + "textPromptSubheading": "Başlamak için eylem düğmesine basın", + "@textPromptSubheading": {}, + "verify": "Doğrula", + "@verify": {}, + "max_reps": "Azami Tekrar Sayısı", + "@max_reps": { + "description": "Generated entry for translation for server strings" + }, + "plates": "Plates", + "@plates": { + "description": "Generated entry for translation for server strings" + }, + "kilometers_per_hour": "Kilometre/Saat", + "@kilometers_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "miles_per_hour": "Mil/Saat", + "@miles_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "body_weight": "Vücut Ağırlığı", + "@body_weight": { + "description": "Generated entry for translation for server strings" + }, + "kg": "kg", + "@kg": { + "description": "Generated entry for translation for server strings" + }, + "lb": "lb", + "@lb": { + "description": "Generated entry for translation for server strings" + } } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index f9bfc442..bd787a4f 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -621,7 +621,7 @@ "@legs": {}, "back": "Спина", "@back": {}, - "quads": "Квадроцикли", + "quads": "Квадрицепс", "@quads": {}, "arms": "Руки", "@arms": {}, @@ -717,5 +717,39 @@ "cacheWarning": "Через кешування може знадобитися деякий час, перш ніж зміни стануть видимими у всьому застосунку.", "@cacheWarning": {}, "searchNamesInEnglish": "Також шукайте імена англійською мовою", - "@searchNamesInEnglish": {} + "@searchNamesInEnglish": {}, + "textPromptTitle": "Готові почати?", + "@textPromptTitle": {}, + "textPromptSubheading": "Натисніть кнопку дії, щоб почати", + "@textPromptSubheading": {}, + "body_weight": "Вага тіла", + "@body_weight": { + "description": "Generated entry for translation for server strings" + }, + "kg": "кг", + "@kg": { + "description": "Generated entry for translation for server strings" + }, + "kilometers_per_hour": "Кілометрів на годину", + "@kilometers_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "miles_per_hour": "Миль на годину", + "@miles_per_hour": { + "description": "Generated entry for translation for server strings" + }, + "lb": "фунт", + "@lb": { + "description": "Generated entry for translation for server strings" + }, + "plates": "Пластини", + "@plates": { + "description": "Generated entry for translation for server strings" + }, + "verify": "Підтвердити", + "@verify": {}, + "max_reps": "Максимальна кількість повторень", + "@max_reps": { + "description": "Generated entry for translation for server strings" + } } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 1c0f0e58..e7c4b276 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -159,7 +159,7 @@ }, "loginInstead": "登录", "@loginInstead": {}, - "registerInstead": "注册", + "registerInstead": "没有帐户?点击注册", "@registerInstead": {}, "reset": "重置", "@reset": { @@ -556,5 +556,11 @@ "logged": "已记录", "@logged": { "description": "Header for the column of 'logged' nutritional values, i.e. what was eaten" + }, + "userProfile": "账户", + "@userProfile": {}, + "exerciseName": "锻炼名", + "@exerciseName": { + "description": "Label for the name of a workout exercise" } } diff --git a/lib/main.dart b/lib/main.dart index 90dadd90..016c6310 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -50,8 +50,11 @@ import 'package:wger/theme/theme.dart'; import 'package:wger/widgets/core/about.dart'; import 'providers/auth.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_zxing/flutter_zxing.dart'; void main() { + zx.setLogEnabled(kDebugMode); // Needs to be called before runApp WidgetsFlutterBinding.ensureInitialized(); @@ -158,21 +161,6 @@ class MyApp extends StatelessWidget { }, localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, - - // Workaround for https://github.com/flutter/flutter/issues/100857 - localeResolutionCallback: (deviceLocale, supportedLocales) { - if (deviceLocale != null) { - for (final supportedLocale in supportedLocales) { - // Since we currently don't support any country specific locales - // such as de-DE and de-AT, it's sufficient to just check it like - // this. Otherwise we will need more logic with .countryCode - if (supportedLocale.languageCode == deviceLocale.languageCode) { - return supportedLocale; - } - } - } - return const Locale('en'); - }, ), ), ); diff --git a/lib/models/nutrition/ingredient.dart b/lib/models/nutrition/ingredient.dart index d4a3eaae..5fda5e26 100644 --- a/lib/models/nutrition/ingredient.dart +++ b/lib/models/nutrition/ingredient.dart @@ -34,7 +34,7 @@ class Ingredient { @JsonKey(required: true) final String name; - @JsonKey(required: true, name: 'creation_date', toJson: toDate) + @JsonKey(required: true, name: 'creation_date') final DateTime creationDate; /// Energy in kJ per 100g of product diff --git a/lib/models/nutrition/ingredient.g.dart b/lib/models/nutrition/ingredient.g.dart index bb7edb7c..afb9c324 100644 --- a/lib/models/nutrition/ingredient.g.dart +++ b/lib/models/nutrition/ingredient.g.dart @@ -47,7 +47,7 @@ Map _$IngredientToJson(Ingredient instance) => element.id == DEFAULT_REPETITION_UNIT); + return _repetitionUnit.firstWhere((element) => element.id == REP_UNIT_REPETITIONS); } List getPlans() { diff --git a/lib/screens/auth_screen.dart b/lib/screens/auth_screen.dart index 27c006de..98f08072 100644 --- a/lib/screens/auth_screen.dart +++ b/lib/screens/auth_screen.dart @@ -246,12 +246,13 @@ class _AuthCardState extends State { textInputAction: TextInputAction.next, keyboardType: TextInputType.emailAddress, validator: (value) { + if (value == null || value.isEmpty) { + return AppLocalizations.of(context).invalidUsername; + } if (!RegExp(r'^[\w.@+-]+$').hasMatch(value!)) { return AppLocalizations.of(context).usernameValidChars; } - if (value.isEmpty) { - return AppLocalizations.of(context).invalidUsername; - } + return null; }, inputFormatters: [FilteringTextInputFormatter.deny(RegExp(r'\s\b|\b\s'))], diff --git a/lib/theme/theme.dart b/lib/theme/theme.dart index 4a4b1786..89f98fb9 100644 --- a/lib/theme/theme.dart +++ b/lib/theme/theme.dart @@ -95,7 +95,9 @@ final ThemeData wgerTheme = ThemeData( */ textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( - primary: wgerPrimaryButtonColor, +// This primary is deprecated and should not be used +// primary: wgerPrimaryButtonColor, + foregroundColor: wgerPrimaryButtonColor, ), ), outlinedButtonTheme: OutlinedButtonThemeData( diff --git a/lib/widgets/core/text_prompt.dart b/lib/widgets/core/text_prompt.dart new file mode 100644 index 00000000..c2b14e77 --- /dev/null +++ b/lib/widgets/core/text_prompt.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class TextPrompt extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context).textPromptTitle, + style: Theme.of(context).textTheme.headlineMedium, + ), + Padding( + padding: EdgeInsets.only(top: 12), + child: Text(AppLocalizations.of(context).textPromptSubheading), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/gallery/overview.dart b/lib/widgets/gallery/overview.dart index e74d2a9d..e222ae0b 100644 --- a/lib/widgets/gallery/overview.dart +++ b/lib/widgets/gallery/overview.dart @@ -24,6 +24,7 @@ import 'package:provider/provider.dart'; import 'package:wger/helpers/platform.dart'; import 'package:wger/providers/gallery.dart'; import 'package:wger/screens/form_screen.dart'; +import 'package:wger/widgets/core/text_prompt.dart'; import 'forms.dart'; @@ -38,77 +39,79 @@ class Gallery extends StatelessWidget { padding: const EdgeInsets.all(5), child: RefreshIndicator( onRefresh: () => provider.fetchAndSetGallery(), - child: MasonryGridView.count( - crossAxisCount: 2, - mainAxisSpacing: 5, - crossAxisSpacing: 5, - itemCount: provider.images.length, - itemBuilder: (context, index) { - final currentImage = provider.images[index]; + child: provider.images.length == 0 + ? TextPrompt() + : MasonryGridView.count( + crossAxisCount: 2, + mainAxisSpacing: 5, + crossAxisSpacing: 5, + itemCount: provider.images.length, + itemBuilder: (context, index) { + final currentImage = provider.images[index]; - return GestureDetector( - onTap: () { - showModalBottomSheet( - builder: (context) => Container( - key: Key('image-${currentImage.id}-detail'), - padding: const EdgeInsets.all(10), - color: Colors.white, - child: Column( - children: [ - Text( - DateFormat.yMd(Localizations.localeOf(context).languageCode) - .format(currentImage.date), - style: Theme.of(context).textTheme.headline5, - ), - Expanded( - child: Image.network(currentImage.url!), - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8), - child: Text(currentImage.description), - ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - IconButton( - icon: const Icon(Icons.delete), - onPressed: () { - Provider.of(context, listen: false) - .deleteImage(currentImage); - Navigator.of(context).pop(); - }), - if (!isDesktop) - IconButton( - icon: const Icon(Icons.edit), - onPressed: () { - Navigator.pushNamed( - context, - FormScreen.routeName, - arguments: FormScreenArguments( - AppLocalizations.of(context).edit, - ImageForm(currentImage), - hasListView: true, - ), - ); - }, + return GestureDetector( + onTap: () { + showModalBottomSheet( + builder: (context) => Container( + key: Key('image-${currentImage.id}-detail'), + padding: const EdgeInsets.all(10), + color: Colors.white, + child: Column( + children: [ + Text( + DateFormat.yMd(Localizations.localeOf(context).languageCode) + .format(currentImage.date), + style: Theme.of(context).textTheme.headline5, ), - ], - ) - ], + Expanded( + child: Image.network(currentImage.url!), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Text(currentImage.description), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + icon: const Icon(Icons.delete), + onPressed: () { + Provider.of(context, listen: false) + .deleteImage(currentImage); + Navigator.of(context).pop(); + }), + if (!isDesktop) + IconButton( + icon: const Icon(Icons.edit), + onPressed: () { + Navigator.pushNamed( + context, + FormScreen.routeName, + arguments: FormScreenArguments( + AppLocalizations.of(context).edit, + ImageForm(currentImage), + hasListView: true, + ), + ); + }, + ), + ], + ) + ], + ), + ), + context: context, + ); + }, + child: FadeInImage( + key: Key('image-${currentImage.id}'), + placeholder: const AssetImage('assets/images/placeholder.png'), + image: NetworkImage(currentImage.url!), + fit: BoxFit.cover, ), - ), - context: context, - ); - }, - child: FadeInImage( - key: Key('image-${currentImage.id}'), - placeholder: const AssetImage('assets/images/placeholder.png'), - image: NetworkImage(currentImage.url!), - fit: BoxFit.cover, + ); + }, ), - ); - }, - ), ), ); } diff --git a/lib/widgets/nutrition/charts.dart b/lib/widgets/nutrition/charts.dart index 8ed4da42..00588d2c 100644 --- a/lib/widgets/nutrition/charts.dart +++ b/lib/widgets/nutrition/charts.dart @@ -175,6 +175,213 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget { return Container(); } + return Column( + children: [ + Container( + padding: const EdgeInsets.all(15), + height: 220, + child: charts.BarChart( + [ + charts.Series( + id: 'Planned', + domainFn: (nutritionEntry, index) => nutritionEntry.name, + measureFn: (nutritionEntry, index) => nutritionEntry.value, + data: [ + NutritionData(AppLocalizations.of(context).energy, + _nutritionalPlan.nutritionalValues.energy), + ], + ), + charts.Series( + id: 'Logged', + domainFn: (nutritionEntry, index) => nutritionEntry.name, + measureFn: (nutritionEntry, index) => nutritionEntry.value, + fillPatternFn: (nutritionEntry, index) => charts.FillPatternType.forwardHatch, + data: [ + NutritionData( + AppLocalizations.of(context).energy, loggedNutritionalValues.energy), + ], + ), + charts.Series( + id: 'Avg', + domainFn: (nutritionEntry, index) => nutritionEntry.name, + measureFn: (nutritionEntry, index) => nutritionEntry.value, + data: [ + NutritionData(AppLocalizations.of(context).energy, sevenDayAvg.energy), + ], + ), + ], + animate: true, + domainAxis: const charts.OrdinalAxisSpec( + ///labelRotation was added to rotate text of X Axis. Without that, + ///titles would overlap each other + renderSpec: charts.SmallTickRendererSpec(labelRotation: 60), + ), + barGroupingType: charts.BarGroupingType.grouped, + defaultRenderer: charts.BarRendererConfig( + groupingType: charts.BarGroupingType.grouped, strokeWidthPx: 0.0, maxBarWidthPx: 8), + primaryMeasureAxis: const charts.NumericAxisSpec( + tickProviderSpec: charts.BasicNumericTickProviderSpec(desiredTickCount: 5), + ), + ), + ), + Container( + padding: const EdgeInsets.all(15), + height: 300, + child: charts.BarChart( + [ + charts.Series( + id: 'Planned', + domainFn: (nutritionEntry, index) => nutritionEntry.name, + measureFn: (nutritionEntry, index) => nutritionEntry.value, + data: [ + // NutritionData( + // AppLocalizations.of(context).energy, + // _nutritionalPlan.nutritionalValues.energy, + // ), + NutritionData( + AppLocalizations.of(context).protein, + _nutritionalPlan.nutritionalValues.protein, + ), + NutritionData( + AppLocalizations.of(context).carbohydrates, + _nutritionalPlan.nutritionalValues.carbohydrates, + ), + NutritionData( + AppLocalizations.of(context).sugars, + _nutritionalPlan.nutritionalValues.carbohydratesSugar, + ), + NutritionData( + AppLocalizations.of(context).fat, + _nutritionalPlan.nutritionalValues.fat, + ), + NutritionData( + AppLocalizations.of(context).saturatedFat, + _nutritionalPlan.nutritionalValues.fatSaturated, + ), + NutritionData( + AppLocalizations.of(context).fibres, + _nutritionalPlan.nutritionalValues.fibres, + ), + NutritionData( + AppLocalizations.of(context).sodium, + _nutritionalPlan.nutritionalValues.sodium, + ), + ], + ), + charts.Series( + id: 'Logged', + domainFn: (nutritionEntry, index) => nutritionEntry.name, + measureFn: (nutritionEntry, index) => nutritionEntry.value, + fillPatternFn: (nutritionEntry, index) => charts.FillPatternType.forwardHatch, + data: [ + // NutritionData( + // AppLocalizations.of(context).energy, + // loggedNutritionalValues.energy + // ), + + NutritionData( + AppLocalizations.of(context).protein, loggedNutritionalValues.protein), + NutritionData(AppLocalizations.of(context).carbohydrates, + loggedNutritionalValues.carbohydrates), + NutritionData(AppLocalizations.of(context).sugars, + loggedNutritionalValues.carbohydratesSugar), + NutritionData(AppLocalizations.of(context).fat, loggedNutritionalValues.fat), + NutritionData(AppLocalizations.of(context).saturatedFat, + loggedNutritionalValues.fatSaturated), + NutritionData( + AppLocalizations.of(context).fibres, loggedNutritionalValues.fibres), + NutritionData( + AppLocalizations.of(context).sodium, loggedNutritionalValues.sodium), + ], + ), + charts.Series( + id: 'Avg', + domainFn: (nutritionEntry, index) => nutritionEntry.name, + measureFn: (nutritionEntry, index) => nutritionEntry.value, + data: [ + // NutritionData(AppLocalizations.of(context).energy, sevenDayAvg.energy), + NutritionData(AppLocalizations.of(context).protein, sevenDayAvg.protein), + NutritionData( + AppLocalizations.of(context).carbohydrates, sevenDayAvg.carbohydrates), + NutritionData( + AppLocalizations.of(context).sugars, sevenDayAvg.carbohydratesSugar), + NutritionData(AppLocalizations.of(context).fat, sevenDayAvg.fat), + NutritionData( + AppLocalizations.of(context).saturatedFat, sevenDayAvg.fatSaturated), + NutritionData(AppLocalizations.of(context).fibres, sevenDayAvg.fibres), + NutritionData(AppLocalizations.of(context).sodium, sevenDayAvg.sodium), + ], + ), + ], + animate: true, + domainAxis: const charts.OrdinalAxisSpec( + ///labelRotation was added to rotate text of X Axis. Without that, + ///titles would overlap each other + renderSpec: charts.SmallTickRendererSpec(labelRotation: 60), + ), + barGroupingType: charts.BarGroupingType.grouped, + primaryMeasureAxis: const charts.NumericAxisSpec( + tickProviderSpec: charts.BasicNumericTickProviderSpec( + desiredTickCount: 5, + ), + ), + ), + ), + ], + ); + } +} + +//creating a seperate chart for energy as the energy value and other nutrient's value is not compatable to show in one graph +class EnergyChart extends StatelessWidget { + const EnergyChart({Key? key, required this.nutritionalPlan}) : super(key: key); + final NutritionalPlan nutritionalPlan; + NutritionalValues nutritionalValuesFromPlanLogsSevenDayAvg() { + NutritionalValues sevenDaysAvg = NutritionalValues(); + int count = 0; + + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + + nutritionalPlan.logEntriesValues.forEach((key, value) { + if (key.difference(today).inDays >= -7) { + sevenDaysAvg += value; + count++; + } + }); + + if (count != 0) { + sevenDaysAvg.energy = sevenDaysAvg.energy / count; + sevenDaysAvg.protein = sevenDaysAvg.protein / count; + sevenDaysAvg.carbohydrates = sevenDaysAvg.carbohydrates / count; + sevenDaysAvg.carbohydratesSugar = sevenDaysAvg.carbohydratesSugar / count; + sevenDaysAvg.fat = sevenDaysAvg.fat / count; + sevenDaysAvg.fatSaturated = sevenDaysAvg.fatSaturated / count; + sevenDaysAvg.fibres = sevenDaysAvg.fibres / count; + sevenDaysAvg.sodium = sevenDaysAvg.sodium / count; + } + + return sevenDaysAvg; + } + + NutritionalValues nutritionalValuesFromPlanLogsToday() { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + + return nutritionalPlan.logEntriesValues[nutritionalPlan.logEntriesValues.keys + .firstWhereOrNull((d) => d.difference(today).inDays == 0)] ?? + NutritionalValues(); + } + + @override + Widget build(BuildContext context) { + final NutritionalValues loggedNutritionalValues = nutritionalValuesFromPlanLogsToday(); + final NutritionalValues sevenDayAvg = nutritionalValuesFromPlanLogsSevenDayAvg(); + + if (nutritionalPlan.nutritionalValues.energy == 0) { + return Container(); + } + return charts.BarChart( [ charts.Series( @@ -182,39 +389,9 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget { domainFn: (nutritionEntry, index) => nutritionEntry.name, measureFn: (nutritionEntry, index) => nutritionEntry.value, data: [ - /* NutritionData( AppLocalizations.of(context).energy, - _nutritionalPlan.nutritionalValues.energy, - ), - */ - NutritionData( - AppLocalizations.of(context).protein, - _nutritionalPlan.nutritionalValues.protein, - ), - NutritionData( - AppLocalizations.of(context).carbohydrates, - _nutritionalPlan.nutritionalValues.carbohydrates, - ), - NutritionData( - AppLocalizations.of(context).sugars, - _nutritionalPlan.nutritionalValues.carbohydratesSugar, - ), - NutritionData( - AppLocalizations.of(context).fat, - _nutritionalPlan.nutritionalValues.fat, - ), - NutritionData( - AppLocalizations.of(context).saturatedFat, - _nutritionalPlan.nutritionalValues.fatSaturated, - ), - NutritionData( - AppLocalizations.of(context).fibres, - _nutritionalPlan.nutritionalValues.fibres, - ), - NutritionData( - AppLocalizations.of(context).sodium, - _nutritionalPlan.nutritionalValues.sodium, + nutritionalPlan.nutritionalValues.energy, ), ], ), @@ -224,22 +401,7 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget { measureFn: (nutritionEntry, index) => nutritionEntry.value, fillPatternFn: (nutritionEntry, index) => charts.FillPatternType.forwardHatch, data: [ - /* - NutritionData( - AppLocalizations.of(context).energy, - loggedNutritionalValues.energy - ), - */ - NutritionData(AppLocalizations.of(context).protein, loggedNutritionalValues.protein), - NutritionData( - AppLocalizations.of(context).carbohydrates, loggedNutritionalValues.carbohydrates), - NutritionData( - AppLocalizations.of(context).sugars, loggedNutritionalValues.carbohydratesSugar), - NutritionData(AppLocalizations.of(context).fat, loggedNutritionalValues.fat), - NutritionData( - AppLocalizations.of(context).saturatedFat, loggedNutritionalValues.fatSaturated), - NutritionData(AppLocalizations.of(context).fibres, loggedNutritionalValues.fibres), - NutritionData(AppLocalizations.of(context).sodium, loggedNutritionalValues.sodium), + NutritionData(AppLocalizations.of(context).energy, loggedNutritionalValues.energy), ], ), charts.Series( @@ -247,19 +409,7 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget { domainFn: (nutritionEntry, index) => nutritionEntry.name, measureFn: (nutritionEntry, index) => nutritionEntry.value, data: [ - /* - NutritionData( - AppLocalizations.of(context).energy, - sevenDayAvg.energy - ), - */ - NutritionData(AppLocalizations.of(context).protein, sevenDayAvg.protein), - NutritionData(AppLocalizations.of(context).carbohydrates, sevenDayAvg.carbohydrates), - NutritionData(AppLocalizations.of(context).sugars, sevenDayAvg.carbohydratesSugar), - NutritionData(AppLocalizations.of(context).fat, sevenDayAvg.fat), - NutritionData(AppLocalizations.of(context).saturatedFat, sevenDayAvg.fatSaturated), - NutritionData(AppLocalizations.of(context).fibres, sevenDayAvg.fibres), - NutritionData(AppLocalizations.of(context).sodium, sevenDayAvg.sodium), + NutritionData(AppLocalizations.of(context).energy, sevenDayAvg.energy), ], ), ], @@ -270,6 +420,11 @@ class NutritionalPlanHatchBarChartWidget extends StatelessWidget { renderSpec: charts.SmallTickRendererSpec(labelRotation: 60), ), barGroupingType: charts.BarGroupingType.grouped, + defaultRenderer: charts.BarRendererConfig( + groupingType: charts.BarGroupingType.grouped, strokeWidthPx: 0.0, maxBarWidthPx: 8), + primaryMeasureAxis: const charts.NumericAxisSpec( + tickProviderSpec: charts.BasicNumericTickProviderSpec(desiredTickCount: 5), + ), ); } } diff --git a/lib/widgets/nutrition/nutritional_plan_detail.dart b/lib/widgets/nutrition/nutritional_plan_detail.dart index 58c46e87..671d0b4f 100644 --- a/lib/widgets/nutrition/nutritional_plan_detail.dart +++ b/lib/widgets/nutrition/nutritional_plan_detail.dart @@ -70,7 +70,7 @@ class NutritionalPlanDetailWidget extends StatelessWidget { Container( padding: const EdgeInsets.all(15), height: 220, - child: NutritionalPlanPieChartWidget(nutritionalValues), + child: NutritionalPlanPieChartWidget(nutritionalValues), // chart ), Padding( padding: const EdgeInsets.symmetric(horizontal: 10), @@ -210,11 +210,13 @@ class NutritionalPlanDetailWidget extends StatelessWidget { textAlign: TextAlign.center, style: Theme.of(context).textTheme.headline6, ), - Container( - padding: const EdgeInsets.all(15), - height: 300, - child: NutritionalPlanHatchBarChartWidget(_nutritionalPlan), - ), + + NutritionalPlanHatchBarChartWidget(_nutritionalPlan), + // Container( + // padding: const EdgeInsets.all(15), + // height: 300, + // child: NutritionalPlanHatchBarChartWidget(_nutritionalPlan), // chart + // ), const Padding(padding: EdgeInsets.all(8.0)), Text( AppLocalizations.of(context).nutritionalDiary, @@ -224,7 +226,7 @@ class NutritionalPlanDetailWidget extends StatelessWidget { Container( padding: const EdgeInsets.all(15), height: 220, - child: NutritionalDiaryChartWidget(nutritionalPlan: _nutritionalPlan), + child: NutritionalDiaryChartWidget(nutritionalPlan: _nutritionalPlan), // chart ), SizedBox( height: 200, diff --git a/lib/widgets/nutrition/nutritional_plans_list.dart b/lib/widgets/nutrition/nutritional_plans_list.dart index 673d5753..c2678c20 100644 --- a/lib/widgets/nutrition/nutritional_plans_list.dart +++ b/lib/widgets/nutrition/nutritional_plans_list.dart @@ -21,6 +21,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:intl/intl.dart'; import 'package:wger/providers/nutrition.dart'; import 'package:wger/screens/nutritional_plan_screen.dart'; +import 'package:wger/widgets/core/text_prompt.dart'; class NutritionalPlansList extends StatelessWidget { final NutritionPlansProvider _nutritionProvider; @@ -31,87 +32,89 @@ class NutritionalPlansList extends StatelessWidget { Widget build(BuildContext context) { return RefreshIndicator( onRefresh: () => _nutritionProvider.fetchAndSetAllPlansSparse(), - child: ListView.builder( - padding: const EdgeInsets.all(10.0), - itemCount: _nutritionProvider.items.length, - itemBuilder: (context, index) { - final currentPlan = _nutritionProvider.items[index]; - return Dismissible( - key: Key(currentPlan.id.toString()), - confirmDismiss: (direction) async { - // Delete workout from DB - final bool? res = await showDialog( - context: context, - builder: (BuildContext contextDialog) { - return AlertDialog( - content: Text( - AppLocalizations.of(context).confirmDelete(currentPlan.description), - ), - actions: [ - TextButton( - child: Text(MaterialLocalizations.of(context).cancelButtonLabel), - onPressed: () => Navigator.of(contextDialog).pop(), - ), - TextButton( - child: Text( - AppLocalizations.of(context).delete, - style: TextStyle(color: Theme.of(context).errorColor), - ), - onPressed: () { - // Confirmed, delete the workout - _nutritionProvider.deletePlan(currentPlan.id!); - - // Close the popup - Navigator.of(contextDialog).pop(); - - // and inform the user - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - AppLocalizations.of(context).successfullyDeleted, - textAlign: TextAlign.center, - ), + child: _nutritionProvider.items.length == 0 + ? TextPrompt() + : ListView.builder( + padding: const EdgeInsets.all(10.0), + itemCount: _nutritionProvider.items.length, + itemBuilder: (context, index) { + final currentPlan = _nutritionProvider.items[index]; + return Dismissible( + key: Key(currentPlan.id.toString()), + confirmDismiss: (direction) async { + // Delete workout from DB + final bool? res = await showDialog( + context: context, + builder: (BuildContext contextDialog) { + return AlertDialog( + content: Text( + AppLocalizations.of(context).confirmDelete(currentPlan.description), + ), + actions: [ + TextButton( + child: Text(MaterialLocalizations.of(context).cancelButtonLabel), + onPressed: () => Navigator.of(contextDialog).pop(), ), - ); - }, - ), - ], - ); - }); - return res; - }, - background: Container( - color: Theme.of(context).errorColor, - alignment: Alignment.centerRight, - padding: const EdgeInsets.only(right: 20), - margin: const EdgeInsets.symmetric( - horizontal: 4, - vertical: 4, - ), - child: const Icon( - Icons.delete, - color: Colors.white, - ), + TextButton( + child: Text( + AppLocalizations.of(context).delete, + style: TextStyle(color: Theme.of(context).errorColor), + ), + onPressed: () { + // Confirmed, delete the workout + _nutritionProvider.deletePlan(currentPlan.id!); + + // Close the popup + Navigator.of(contextDialog).pop(); + + // and inform the user + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context).successfullyDeleted, + textAlign: TextAlign.center, + ), + ), + ); + }, + ), + ], + ); + }); + return res; + }, + background: Container( + color: Theme.of(context).errorColor, + alignment: Alignment.centerRight, + padding: const EdgeInsets.only(right: 20), + margin: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 4, + ), + child: const Icon( + Icons.delete, + color: Colors.white, + ), + ), + direction: DismissDirection.endToStart, + child: Card( + child: ListTile( + onTap: () { + Navigator.of(context).pushNamed( + NutritionalPlanScreen.routeName, + arguments: currentPlan, + ); + }, + title: Text(currentPlan.getLabel(context)), + subtitle: Text( + DateFormat.yMd(Localizations.localeOf(context).languageCode) + .format(currentPlan.creationDate), + ), + ), + ), + ); + }, ), - direction: DismissDirection.endToStart, - child: Card( - child: ListTile( - onTap: () { - Navigator.of(context).pushNamed( - NutritionalPlanScreen.routeName, - arguments: currentPlan, - ); - }, - title: Text(currentPlan.getLabel(context)), - subtitle: Text( - DateFormat.yMd(Localizations.localeOf(context).languageCode) - .format(currentPlan.creationDate), - ), - ), - ), - ); - }, - ), ); } } diff --git a/lib/widgets/nutrition/widgets.dart b/lib/widgets/nutrition/widgets.dart index 7e285e6d..2137c28a 100644 --- a/lib/widgets/nutrition/widgets.dart +++ b/lib/widgets/nutrition/widgets.dart @@ -16,11 +16,15 @@ * along with this program. If not, see . */ +import 'dart:developer'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; +//import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; import 'package:wger/helpers/consts.dart'; import 'package:wger/helpers/platform.dart'; @@ -28,11 +32,29 @@ import 'package:wger/helpers/ui.dart'; import 'package:wger/providers/nutrition.dart'; import 'package:wger/widgets/core/core.dart'; +import 'package:flutter_zxing/flutter_zxing.dart'; + +class ScanReader extends StatelessWidget { + String? scannedr; + + @override + Widget build(BuildContext context) => Scaffold( + body: ReaderWidget( + onScan: (result) { + scannedr = result.text; + Navigator.pop(context, scannedr); + }, + ), + ); +} + class IngredientTypeahead extends StatefulWidget { final TextEditingController _ingredientController; final TextEditingController _ingredientIdController; String? barcode = ''; + //Code? result; + late final bool? test; final bool showScanner; @@ -48,29 +70,25 @@ class IngredientTypeahead extends StatefulWidget { _IngredientTypeaheadState createState() => _IngredientTypeaheadState(); } -Future scanBarcode(BuildContext context) async { - String barcode; - try { - barcode = await FlutterBarcodeScanner.scanBarcode( - '#ff6666', - AppLocalizations.of(context).close, - true, - ScanMode.BARCODE, - ); - - if (barcode.compareTo('-1') == 0) { - return ''; - } - } on PlatformException { - return ''; - } - - return barcode; -} - class _IngredientTypeaheadState extends State { var _searchEnglish = true; + Future readerscan(BuildContext context) async { + String scannedcode; + try { + scannedcode = + await Navigator.of(context).push(MaterialPageRoute(builder: (context) => ScanReader())); + + if (scannedcode.compareTo('-1') == 0) { + return ''; + } + } on PlatformException { + return ''; + } + + return scannedcode; + } + @override Widget build(BuildContext context) { return Column( @@ -136,7 +154,7 @@ class _IngredientTypeaheadState extends State { onPressed: () async { try { if (!widget.test!) { - widget.barcode = await scanBarcode(context); + widget.barcode = await readerscan(context); } if (widget.barcode!.isNotEmpty) { @@ -195,6 +213,9 @@ class _IngredientTypeaheadState extends State { } } catch (e) { showErrorDialog(e, context); + // Need to pop back since reader scan is a widget + // otherwise returns null when back button is pressed + return Navigator.pop(context); } }, icon: Image.asset('assets/images/barcode_scanner_icon.png'), diff --git a/lib/widgets/user/forms.dart b/lib/widgets/user/forms.dart index 39fb80a7..14e1f28b 100644 --- a/lib/widgets/user/forms.dart +++ b/lib/widgets/user/forms.dart @@ -22,6 +22,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:wger/models/user/profile.dart'; import 'package:wger/providers/user.dart'; +import 'package:wger/theme/theme.dart'; class UserProfileForm extends StatelessWidget { late final Profile _profile; @@ -40,39 +41,23 @@ class UserProfileForm extends StatelessWidget { child: Column( children: [ ListTile( + leading: const Icon(Icons.person, color: wgerPrimaryColor), title: Text(AppLocalizations.of(context).username), subtitle: Text(_profile.username), ), ListTile( - title: Text( - _profile.emailVerified - ? AppLocalizations.of(context).verifiedEmail - : AppLocalizations.of(context).unVerifiedEmail, - ), - subtitle: Text(AppLocalizations.of(context).verifiedEmailReason), - trailing: _profile.emailVerified - ? const Icon(Icons.mark_email_read, color: Colors.green) - : const Icon(Icons.forward_to_inbox), - onTap: () async { - // Email is already verified - if (_profile.emailVerified) { - return; - } - - // Verify - await context.read().verifyEmail(); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - AppLocalizations.of(context).verifiedEmailInfo(_profile.email), - ), - ), - ); - }, - ), - ListTile( + leading: const Icon(Icons.email_rounded, color: wgerPrimaryColor), title: TextFormField( - decoration: InputDecoration(labelText: AppLocalizations.of(context).email), + decoration: InputDecoration( + labelText: _profile.emailVerified + ? AppLocalizations.of(context).verifiedEmail + : AppLocalizations.of(context).unVerifiedEmail, + suffixIcon: _profile.emailVerified + ? const Icon( + Icons.check_circle, + color: Colors.green, + ) + : null), controller: emailController, keyboardType: TextInputType.emailAddress, onSaved: (newValue) { @@ -86,8 +71,30 @@ class UserProfileForm extends StatelessWidget { }, ), ), + if (!_profile.emailVerified) + OutlinedButton( + onPressed: () async { + // Email is already verified + if (_profile.emailVerified) { + return; + } + + // Verify + await context.read().verifyEmail(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context).verifiedEmailInfo(_profile.email), + ), + ), + ); + }, + child: Text(AppLocalizations.of(context).verify), + ), ElevatedButton( - child: Text(AppLocalizations.of(context).save), + style: ElevatedButton.styleFrom( + backgroundColor: wgerPrimaryButtonColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50))), onPressed: () async { // Validate and save the current values to the weightEntry final isValid = _form.currentState!.validate(); @@ -103,6 +110,7 @@ class UserProfileForm extends StatelessWidget { SnackBar(content: Text(AppLocalizations.of(context).successfullySaved)), ); }, + child: Text(AppLocalizations.of(context).save), ), ], ), diff --git a/lib/widgets/workouts/workout_plans_list.dart b/lib/widgets/workouts/workout_plans_list.dart index c0064da4..875bf5d7 100644 --- a/lib/widgets/workouts/workout_plans_list.dart +++ b/lib/widgets/workouts/workout_plans_list.dart @@ -22,6 +22,7 @@ import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:wger/providers/workout_plans.dart'; import 'package:wger/screens/workout_plan_screen.dart'; +import 'package:wger/widgets/core/text_prompt.dart'; class WorkoutPlansList extends StatelessWidget { final WorkoutPlansProvider _workoutProvider; @@ -32,88 +33,90 @@ class WorkoutPlansList extends StatelessWidget { Widget build(BuildContext context) { return RefreshIndicator( onRefresh: () => _workoutProvider.fetchAndSetAllPlansSparse(), - child: ListView.builder( - padding: const EdgeInsets.all(10.0), - itemCount: _workoutProvider.items.length, - itemBuilder: (context, index) { - final currentWorkout = _workoutProvider.items[index]; - return Dismissible( - key: Key(currentWorkout.id.toString()), - confirmDismiss: (direction) async { - // Delete workout from DB - final res = await showDialog( - context: context, - builder: (BuildContext contextDialog) { - return AlertDialog( - content: Text( - AppLocalizations.of(context).confirmDelete(currentWorkout.name), - ), - actions: [ - TextButton( - child: Text(MaterialLocalizations.of(context).cancelButtonLabel), - onPressed: () => Navigator.of(contextDialog).pop(), - ), - TextButton( - child: Text( - AppLocalizations.of(context).delete, - style: TextStyle(color: Theme.of(context).errorColor), - ), - onPressed: () { - // Confirmed, delete the workout - Provider.of(context, listen: false) - .deleteWorkout(currentWorkout.id!); - - // Close the popup - Navigator.of(contextDialog).pop(); - - // and inform the user - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - AppLocalizations.of(context).successfullyDeleted, - textAlign: TextAlign.center, - ), + child: _workoutProvider.items.length == 0 + ? TextPrompt() + : ListView.builder( + padding: const EdgeInsets.all(10.0), + itemCount: _workoutProvider.items.length, + itemBuilder: (context, index) { + final currentWorkout = _workoutProvider.items[index]; + return Dismissible( + key: Key(currentWorkout.id.toString()), + confirmDismiss: (direction) async { + // Delete workout from DB + final res = await showDialog( + context: context, + builder: (BuildContext contextDialog) { + return AlertDialog( + content: Text( + AppLocalizations.of(context).confirmDelete(currentWorkout.name), + ), + actions: [ + TextButton( + child: Text(MaterialLocalizations.of(context).cancelButtonLabel), + onPressed: () => Navigator.of(contextDialog).pop(), ), - ); - }, - ), - ], - ); - }); - return res; - }, - background: Container( - color: Theme.of(context).errorColor, - alignment: Alignment.centerRight, - padding: const EdgeInsets.only(right: 20), - margin: const EdgeInsets.symmetric( - horizontal: 4, - vertical: 4, - ), - child: const Icon( - Icons.delete, - color: Colors.white, - ), - ), - direction: DismissDirection.endToStart, - child: Card( - child: ListTile( - onTap: () { - _workoutProvider.setCurrentPlan(currentWorkout.id!); + TextButton( + child: Text( + AppLocalizations.of(context).delete, + style: TextStyle(color: Theme.of(context).errorColor), + ), + onPressed: () { + // Confirmed, delete the workout + Provider.of(context, listen: false) + .deleteWorkout(currentWorkout.id!); - Navigator.of(context) - .pushNamed(WorkoutPlanScreen.routeName, arguments: currentWorkout); - }, - title: Text(currentWorkout.name), - subtitle: Text( - DateFormat.yMd(Localizations.localeOf(context).languageCode) - .format(currentWorkout.creationDate), - ), - ), + // Close the popup + Navigator.of(contextDialog).pop(); + + // and inform the user + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context).successfullyDeleted, + textAlign: TextAlign.center, + ), + ), + ); + }, + ), + ], + ); + }); + return res; + }, + background: Container( + color: Theme.of(context).errorColor, + alignment: Alignment.centerRight, + padding: const EdgeInsets.only(right: 20), + margin: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 4, + ), + child: const Icon( + Icons.delete, + color: Colors.white, + ), + ), + direction: DismissDirection.endToStart, + child: Card( + child: ListTile( + onTap: () { + _workoutProvider.setCurrentPlan(currentWorkout.id!); + + Navigator.of(context) + .pushNamed(WorkoutPlanScreen.routeName, arguments: currentWorkout); + }, + title: Text(currentWorkout.name), + subtitle: Text( + DateFormat.yMd(Localizations.localeOf(context).languageCode) + .format(currentWorkout.creationDate), + ), + ), + ), + ); + }, ), - ); - }, - ), ); } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index f6f23bfe..7299b5cf 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,9 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index f16b4c34..7566c769 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,10 +3,12 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux url_launcher_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + flutter_zxing ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 44c695d3..fa46ecee 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,16 +5,16 @@ import FlutterMacOS import Foundation +import file_selector_macos import package_info_plus import rive_common import shared_preferences_foundation import url_launcher_macos -import wakelock_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) - WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 544908a7..98d97b9e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 + sha256: "8880b4cfe7b5b17d57c052a5a3a8cc1d4f546261c7cc8fbd717bd53f48db0568" url: "https://pub.dev" source: hosted - version: "58.0.0" + version: "59.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 + sha256: a89627f49b0e70e068130a36571409726b04dab12da7e5625941d2c8ec278b96 url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.11.1" android_metadata: dependency: "direct main" description: @@ -25,6 +25,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" + ansi_styles: + dependency: transitive + description: + name: ansi_styles + sha256: "9c656cc12b3c27b17dd982b2cc5c0cfdfbdabd7bc8f3ae5e8542d9867b47ce8a" + url: "https://pub.dev" + source: hosted + version: "0.3.2+1" archive: dependency: transitive description: @@ -37,10 +45,10 @@ packages: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" async: dependency: transitive description: @@ -117,10 +125,50 @@ packages: dependency: transitive description: name: built_value - sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" + sha256: "2f17434bd5d52a26762043d6b43bb53b3acd029b4d9071a329f46d67ef297e6d" url: "https://pub.dev" source: hosted - version: "8.4.4" + version: "8.5.0" + camera: + dependency: transitive + description: + name: camera + sha256: ebebead3d5ec3d148249331d751d462d7e8c98102b8830a9b45ec96a2bd4333f + url: "https://pub.dev" + source: hosted + version: "0.10.5+2" + camera_android: + dependency: transitive + description: + name: camera_android + sha256: f83e406d34f5faa80bf0f5c3beee4b4c11da94a94e9621c1bb8e312988621b4b + url: "https://pub.dev" + source: hosted + version: "0.10.8+2" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: "1a416e452b30955b392f4efbf23291d3f2ba3660a85e1628859eb62d2a2bab26" + url: "https://pub.dev" + source: hosted + version: "0.9.13+2" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: "60fa0bb62a4f3bf3a7c413e31e4cd01b69c779ccc8e4668904a24581b86c316b" + url: "https://pub.dev" + source: hosted + version: "2.5.1" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: bcbd775fb3a9d51cc3ece899d54ad66f6306410556bac5759f78e13f9228841f + url: "https://pub.dev" + source: hosted + version: "0.3.1+4" carousel_slider: dependency: "direct main" description: @@ -145,6 +193,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 + url: "https://pub.dev" + source: hosted + version: "1.3.1" charts_common: dependency: transitive description: @@ -165,42 +221,34 @@ packages: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.2" - chewie: - dependency: transitive - description: - name: chewie - sha256: e9da4898ee4859825404f507969f57113c04ca0060e152b95c9afd73934126ad - url: "https://pub.dev" - source: hosted - version: "1.4.0" - chewie_audio: - dependency: transitive - description: - name: chewie_audio - sha256: f92bb4364ced21318e1a7c0eddaf249a7554e5cf27f869d58c44d926abd292a7 - url: "https://pub.dev" - source: hosted - version: "1.3.0" + version: "2.0.3" cider: dependency: "direct dev" description: name: cider - sha256: "714a853bf92701b982496df0bd601c0cf2d882cfc1f2d41ae9aff2b20cee016a" + sha256: "74d96930575f97d83e0a3a5cd26d27d10c38961b1b41346eebe5baabf0f56940" url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.1.6" + cli_launcher: + dependency: transitive + description: + name: cli_launcher + sha256: "5e7e0282b79e8642edd6510ee468ae2976d847a0a29b3916e85f5fa1bfe24005" + url: "https://pub.dev" + source: hosted + version: "0.3.1" cli_util: dependency: transitive description: name: cli_util - sha256: "66f86e916d285c1a93d3b79587d94bd71984a66aac4ff74e524cfa7877f1395c" + sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7 url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.4.0" clock: dependency: transitive description: @@ -225,6 +273,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.0" + conventional_commit: + dependency: transitive + description: + name: conventional_commit + sha256: dec15ad1118f029c618651a4359eb9135d8b88f761aa24e4016d061cd45948f2 + url: "https://pub.dev" + source: hosted + version: "0.6.0+1" convert: dependency: transitive description: @@ -269,10 +325,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352" + sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.1" equatable: dependency: "direct main" description: @@ -305,6 +361,38 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.4" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: d17c5e450192cdc40b718804dfb4eaf79a71bed60ee9530703900879ba50baa3 + url: "https://pub.dev" + source: hosted + version: "0.9.1+3" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "6290eec24fc4cc62535fe609e0c6714d3c1306191dc8c3b0319eaecc09423a3a" + url: "https://pub.dev" + source: hosted + version: "0.9.2" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "2a7f4bbf7bd2f022ecea85bfb1754e87f7dd403a9abc17a84a4fa2ddfe2abc0a" + url: "https://pub.dev" + source: hosted + version: "2.5.1" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: ef246380b66d1fb9089fc65622c387bf3780bca79f533424c31d07f12c2c7fd8 + url: "https://pub.dev" + source: hosted + version: "0.9.2" fixnum: dependency: transitive description: @@ -343,18 +431,18 @@ packages: dependency: "direct main" description: name: flutter_html - sha256: ccb810fcabfce3a7ffaca46e458323915ac7e7fc59082c7357ff848972c02230 + sha256: "02ad69e813ecfc0728a455e4bf892b9379983e050722b1dce00192ee2e41d1ee" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "3.0.0-beta.2" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - sha256: "86b71bbaffa38e885f5c21b1182408b9be6951fd125432cf6652c636254cef2d" + sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.4.1" flutter_keyboard_visibility_linux: dependency: transitive description: @@ -399,18 +487,10 @@ packages: dependency: "direct dev" description: name: flutter_launcher_icons - sha256: ce0e501cfc258907842238e4ca605e74b7fd1cdf04b3b43e86c43f3e40a1592c + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" url: "https://pub.dev" source: hosted - version: "0.11.0" - flutter_layout_grid: - dependency: transitive - description: - name: flutter_layout_grid - sha256: "86c1b21520612edfbb93f189b3ec05058470570f3a5c08ce10c92cc76a6e814e" - url: "https://pub.dev" - source: hosted - version: "1.0.6" + version: "0.13.1" flutter_lints: dependency: "direct dev" description: @@ -424,22 +504,14 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_math_fork: - dependency: transitive - description: - name: flutter_math_fork - sha256: a34205227e1a1d040a56e74a5e2e56e9397ea930540a9373bd0b3e2e4f122017 - url: "https://pub.dev" - source: hosted - version: "0.5.0" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf + sha256: "96af49aa6b57c10a312106ad6f71deed5a754029c24789bbf620ba784f0bd0b0" url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.0.14" flutter_staggered_grid_view: dependency: "direct main" description: @@ -452,10 +524,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: cbf529d563dd910a249041bde2a0dfc3cf62280fcc459b85f3d614b2ab73abb3 + sha256: f991fdb1533c3caeee0cdc14b04f50f0c3916f0dbcbc05237ccbe4e3c6b93f3f url: "https://pub.dev" source: hosted - version: "0.23.0+1" + version: "2.0.5" flutter_test: dependency: "direct dev" description: flutter @@ -465,15 +537,23 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: edfc51579ca3756adaa32b6849cf44af03276b93e8a8a68d8247ee243598f1b2 + sha256: a3539f7a90246b152f569029dedcf0b842532d3f2a440701b520e0bf2acbcf42 url: "https://pub.dev" source: hosted - version: "4.3.7" + version: "4.6.2" flutter_web_plugins: dependency: transitive description: flutter source: sdk version: "0.0.0" + flutter_zxing: + dependency: "direct main" + description: + name: flutter_zxing + sha256: b25efe5ac91fe7a51aa8bfea7aca7435285b911b8758b7da38b7f037bad62c35 + url: "https://pub.dev" + source: hosted + version: "1.1.2" font_awesome_flutter: dependency: "direct main" description: @@ -515,18 +595,18 @@ packages: dependency: transitive description: name: html - sha256: "79d498e6d6761925a34ee5ea8fa6dfef38607781d2fa91e37523474282af55cb" + sha256: "58e3491f7bf0b6a4ea5110c0c688877460d1a6366731155c4a4580e7ded773e8" url: "https://pub.dev" source: hosted - version: "0.15.2" + version: "0.15.3" http: dependency: "direct main" description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" http_multi_server: dependency: transitive description: @@ -547,26 +627,26 @@ packages: dependency: transitive description: name: image - sha256: "02bafd3b4f399bfeb10034deba9753d93b55ce41cd0c4d3d8b355626f80e5b32" + sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "4.0.17" image_picker: dependency: "direct main" description: name: image_picker - sha256: f202f5d730eb8219e35e80c4461fb3a779940ad30ce8fde1586df756e3af25e6 + sha256: b6951e25b795d053a6ba03af5f710069c99349de9341af95155d52665cb4607c url: "https://pub.dev" source: hosted - version: "0.8.7+3" + version: "0.8.9" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "1ea6870350f56af8dab716459bd9d5dc76947e29e07a2ba1d0c172eaaf4f269c" + sha256: "271e0448e82268b3fa1cb2a48e4a911cbc2135587123d7df8e7ca703c5b10da2" url: "https://pub.dev" source: hosted - version: "0.8.6+7" + version: "0.8.6+11" image_picker_for_web: dependency: transitive description: @@ -583,14 +663,38 @@ packages: url: "https://pub.dev" source: hosted version: "0.8.7+3" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "1d8f9a97178d6b8a035f1d2765f17f8ca3d36a40d5594e742a481b1e002f20be" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: ff094b36d6c06200808f733144a033e45b4e17d59524e1cf7d2af7e4cb94e1ab + url: "https://pub.dev" + source: hosted + version: "0.2.0" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "1991219d9dbc42a99aff77e663af8ca51ced592cd6685c9485e3458302d3d4f8" + sha256: "7c7b96bb9413a9c28229e717e6fd1e3edd1cc5569c1778fcca060ecf729b65ee" url: "https://pub.dev" source: hosted - version: "2.6.3" + version: "2.8.0" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: bf77b819eb62c487e6af53b9eb213adc12bd060ef7e43f3b1dd69c53cc24a61d + url: "https://pub.dev" + source: hosted + version: "0.2.0" integration_test: dependency: "direct dev" description: flutter @@ -624,18 +728,18 @@ packages: dependency: "direct main" description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.8.1" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a + sha256: "43793352f90efa5d8b251893a63d767b2f7c833120e3cc02adad55eefec04dc7" url: "https://pub.dev" source: hosted - version: "6.6.1" + version: "6.6.2" klizma: dependency: transitive description: @@ -652,6 +756,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" + list_counter: + dependency: transitive + description: + name: list_counter + sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 + url: "https://pub.dev" + source: hosted + version: "1.0.2" logging: dependency: transitive description: @@ -664,10 +776,10 @@ packages: dependency: transitive description: name: markdown - sha256: d95a9d12954aafc97f984ca29baaa7690ed4d9ec4140a23ad40580bcdb6c87f5 + sha256: "8e332924094383133cee218b676871f42db2514f1f6ac617b6cf6152a7faab8e" url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "7.1.0" marker: dependency: transitive description: @@ -692,6 +804,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + melos: + dependency: transitive + description: + name: melos + sha256: ccbb6ecd8bb3f08ae8f9ce22920d816bff325a98940c845eda0257cd395503ac + url: "https://pub.dev" + source: hosted + version: "3.1.0" meta: dependency: transitive description: @@ -724,6 +844,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.3" + mustache_template: + dependency: transitive + description: + name: mustache_template + sha256: a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c + url: "https://pub.dev" + source: hosted + version: "2.0.0" nested: dependency: transitive description: @@ -740,14 +868,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" - numerus: - dependency: transitive - description: - name: numerus - sha256: "0087ef729d63b96cb347a9c44b9c592f21cecb3605b415bbd18710aef80ce5cb" - url: "https://pub.dev" - source: hosted - version: "1.1.1" package_config: dependency: transitive description: @@ -760,10 +880,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: cbff87676c352d97116af6dbea05aa28c4d65eb0f6d5677a520c11a69ca9a24d + sha256: ceb027f6bc6a60674a233b4a90a7658af1aebdea833da0b5b53c1e9821a78c7b url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.2" package_info_plus_platform_interface: dependency: transitive description: @@ -780,22 +900,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.2" - path_drawing: - dependency: transitive - description: - name: path_drawing - sha256: "3bdd251dae9ffaef944450b73f168610db7e968e7b20daf0c3907f8b4aafc8a2" - url: "https://pub.dev" - source: hosted - version: "0.5.1+1" path_parsing: dependency: transitive description: name: path_parsing - sha256: ee5c47c1058ad66b4a41746ec3996af9593d0858872807bcd64ac118f0700337 + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "1.0.1" path_provider_linux: dependency: transitive description: @@ -816,10 +928,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 + sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6 url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.1.6" petitparser: dependency: transitive description: @@ -844,6 +956,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + pointer_interceptor: + dependency: transitive + description: + name: pointer_interceptor + sha256: "6aa680b30d96dccef496933d00208ad25f07e047f644dc98ce03ec6141633a9a" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" pool: dependency: transitive description: @@ -860,6 +980,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.4" + prompts: + dependency: transitive + description: + name: prompts + sha256: "3773b845e85a849f01e793c4fc18a45d52d7783b4cb6c0569fad19f9d0a774a1" + url: "https://pub.dev" + source: hosted + version: "2.0.0" provider: dependency: "direct main" description: @@ -872,18 +1000,34 @@ packages: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" + pub_updater: + dependency: transitive + description: + name: pub_updater + sha256: "42890302ab2672adf567dc2b20e55b4ecc29d7e19c63b6b98143ab68dd717d3a" + url: "https://pub.dev" + source: hosted + version: "0.2.4" + pubspec: + dependency: transitive + description: + name: pubspec + sha256: f534a50a2b4d48dc3bc0ec147c8bd7c304280fff23b153f3f11803c4d49d927e + url: "https://pub.dev" + source: hosted + version: "2.3.0" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.3" quiver: dependency: transitive description: @@ -904,34 +1048,34 @@ packages: dependency: "direct main" description: name: rive - sha256: f7f365ee0e6cf0af99fb239bc3424370ca6ee2b9ad6fc879b1a79ba5e3b40770 + sha256: "55e1f8bf249444545a7c832830d2bbb9adae759193fb879294bc6018b9f0eedd" url: "https://pub.dev" source: hosted - version: "0.10.4" + version: "0.11.3" rive_common: dependency: transitive description: name: rive_common - sha256: "12ea4a1ca1aa2ddeb2ef212afa20517d6c140a5deb32149c713912a7e6b7e26e" + sha256: "7e17937b790bb2f631767b3d505da8c298309c0a6ab08cd317fa6fe081ed5b63" url: "https://pub.dev" source: hosted - version: "0.0.3" + version: "0.0.10" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" + sha256: "396f85b8afc6865182610c0a2fc470853d56499f75f7499e2a73a9f0539d23d0" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "7fa90471a6875d26ad78c7e4a675874b2043874586891128dc5899662c97db46" + sha256: "6478c6bbbecfe9aced34c483171e90d7c078f5883558b30ec3163cf18402c749" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" shared_preferences_foundation: dependency: transitive description: @@ -976,18 +1120,18 @@ packages: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" simple_gesture_detector: dependency: transitive description: @@ -1005,10 +1149,10 @@ packages: dependency: transitive description: name: source_gen - sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 + sha256: b20e191de6964e98032573cecb1d2b169d96ba63fdb586d24dcd1003ba7e94f6 url: "https://pub.dev" source: hosted - version: "1.2.7" + version: "1.3.0" source_helper: dependency: transitive description: @@ -1097,14 +1241,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - tuple: - dependency: transitive - description: - name: tuple - sha256: "0ea99cd2f9352b2586583ab2ce6489d1f95a5f6de6fb9492faaf97ae2060f0aa" - url: "https://pub.dev" - source: hosted - version: "2.0.1" typed_data: dependency: transitive description: @@ -1113,22 +1249,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + uri: + dependency: transitive + description: + name: uri + sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" + url: "https://pub.dev" + source: hosted + version: "1.0.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" + sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 url: "https://pub.dev" source: hosted - version: "6.1.10" + version: "6.1.11" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: a52628068d282d01a07cd86e6ba99e497aa45ce8c91159015b2416907d78e411 + sha256: "22f8db4a72be26e9e3a4aa3f194b1f7afbc76d20ec141f84be1d787db2155cbd" url: "https://pub.dev" source: hosted - version: "6.0.27" + version: "6.0.31" url_launcher_ios: dependency: transitive description: @@ -1141,10 +1285,10 @@ packages: dependency: transitive description: name: url_launcher_linux - sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" + sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "3.0.5" url_launcher_macos: dependency: transitive description: @@ -1173,10 +1317,34 @@ packages: dependency: transitive description: name: url_launcher_windows - sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd + sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: ea8d3fc7b2e0f35de38a7465063ecfcf03d8217f7962aa2a6717132cb5d43a79 + url: "https://pub.dev" + source: hosted + version: "1.1.5" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: a5eaa5d19e123ad4f61c3718ca1ed921c4e6254238d9145f82aa214955d9aced + url: "https://pub.dev" + source: hosted + version: "1.1.5" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "15edc42f7eaa478ce854eaf1fbb9062a899c0e4e56e775dd73b7f4709c97c4ca" + url: "https://pub.dev" + source: hosted + version: "1.1.5" vector_math: dependency: transitive description: @@ -1213,18 +1381,18 @@ packages: dependency: transitive description: name: video_player_android - sha256: a592048a711d5739d9cea2255d425779f138d41095b9149bda60ce4bc1af8871 + sha256: b608c320ab1a5fd373987c9c3c9ddbd6bda04d209f2a9f0bf197c5b02082201e url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.7" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: "75c6d68cd479a25f34d635149ba6887bc8f1b2b2921841121fd44ea0c5bc1927" + sha256: "824dad3e2986a13766fcccfd1c48c83eef9f896c220a53292e3019b9e98615bb" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" video_player_platform_interface: dependency: transitive description: @@ -1249,46 +1417,6 @@ packages: url: "https://pub.dev" source: hosted version: "9.4.0" - wakelock: - dependency: transitive - description: - name: wakelock - sha256: "769ecf42eb2d07128407b50cb93d7c10bd2ee48f0276ef0119db1d25cc2f87db" - url: "https://pub.dev" - source: hosted - version: "0.6.2" - wakelock_macos: - dependency: transitive - description: - name: wakelock_macos - sha256: "047c6be2f88cb6b76d02553bca5a3a3b95323b15d30867eca53a19a0a319d4cd" - url: "https://pub.dev" - source: hosted - version: "0.4.0" - wakelock_platform_interface: - dependency: transitive - description: - name: wakelock_platform_interface - sha256: "1f4aeb81fb592b863da83d2d0f7b8196067451e4df91046c26b54a403f9de621" - url: "https://pub.dev" - source: hosted - version: "0.3.0" - wakelock_web: - dependency: transitive - description: - name: wakelock_web - sha256: "1b256b811ee3f0834888efddfe03da8d18d0819317f20f6193e2922b41a501b5" - url: "https://pub.dev" - source: hosted - version: "0.4.0" - wakelock_windows: - dependency: transitive - description: - name: wakelock_windows - sha256: "857f77b3fe6ae82dd045455baa626bc4b93cb9bb6c86bf3f27c182167c3a5567" - url: "https://pub.dev" - source: hosted - version: "0.2.1" watcher: dependency: transitive description: @@ -1313,46 +1441,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" - webview_flutter: - dependency: transitive - description: - name: webview_flutter - sha256: "6886b3ceef1541109df5001054aade5ee3c36b5780302e41701c78357233721c" - url: "https://pub.dev" - source: hosted - version: "2.8.0" - webview_flutter_android: - dependency: transitive - description: - name: webview_flutter_android - sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd" - url: "https://pub.dev" - source: hosted - version: "2.10.4" - webview_flutter_platform_interface: - dependency: transitive - description: - name: webview_flutter_platform_interface - sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf" - url: "https://pub.dev" - source: hosted - version: "1.9.5" - webview_flutter_wkwebview: - dependency: transitive - description: - name: webview_flutter_wkwebview - sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0 - url: "https://pub.dev" - source: hosted - version: "2.9.5" win32: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 + sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "4.1.4" xdg_directories: dependency: transitive description: @@ -1365,18 +1461,26 @@ packages: dependency: transitive description: name: xml - sha256: "80d494c09849dc3f899d227a78c30c5b949b985ededf884cb3f3bcd39f4b447a" + sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" url: "https://pub.dev" source: hosted - version: "5.4.1" + version: "6.2.2" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" + yaml_edit: + dependency: transitive + description: + name: yaml_edit + sha256: "1579d4a0340a83cf9e4d580ea51a16329c916973bffd5bd4b45e911b25d46bfd" + url: "https://pub.dev" + source: hosted + version: "2.1.1" sdks: dart: ">=2.19.0 <3.0.0" - flutter: ">=3.3.0" + flutter: ">=3.7.0-0" diff --git a/pubspec.yaml b/pubspec.yaml index 6e3dbb53..ef5de03d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: Self hosted workout, nutrition and weight manager. # The following line prevents the package from being accidentally published to # pub.dev using `pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: "none" # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 @@ -24,7 +24,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.5.4+31 environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.17.0 <3.0.0' dependencies: flutter: @@ -34,30 +34,31 @@ dependencies: android_metadata: ^0.2.1 charts_flutter: ^0.12.0 - collection: ^1.15.0-nullsafety.4 + collection: ^1.17.0 cupertino_icons: ^1.0.5 equatable: ^2.0.5 flutter_calendar_carousel: ^2.4.1 - flutter_html: ^2.1.2 - flutter_typeahead: ^4.3.7 + flutter_html: ^3.0.0-beta.2 + flutter_typeahead: ^4.6.2 font_awesome_flutter: ^10.4.0 http: ^0.13.5 - image_picker: ^0.8.7 + image_picker: ^0.8.9 intl: ^0.17.0 - json_annotation: ^4.7.0 + json_annotation: ^4.8.1 version: ^3.0.2 - package_info_plus: ^3.0.3 + package_info_plus: ^4.0.2 provider: ^6.0.5 - rive: ^0.10.2 - shared_preferences: ^2.1.0 + rive: ^0.11.3 + shared_preferences: ^2.1.2 table_calendar: ^3.0.8 - url_launcher: ^6.1.10 + url_launcher: ^6.1.11 flutter_barcode_scanner: ^2.0.0 - video_player: ^2.6.0 + video_player: ^2.6.1 flutter_staggered_grid_view: ^0.6.2 carousel_slider: ^4.2.1 multi_select_flutter: ^4.1.3 - flutter_svg: ^0.23.0+1 + flutter_svg: ^2.0.5 + flutter_zxing: ^1.1.2 dev_dependencies: flutter_test: @@ -65,12 +66,12 @@ dev_dependencies: integration_test: sdk: flutter build_runner: ^2.3.3 - flutter_launcher_icons: ^0.11.0 - json_serializable: ^6.6.1 + flutter_launcher_icons: ^0.13.1 + json_serializable: ^6.6.2 mockito: ^5.4.0 network_image_mock: ^2.1.1 flutter_lints: ^2.0.1 - cider: ^0.1.5 + cider: ^0.1.6 flutter_icons: android: true @@ -82,13 +83,11 @@ flutter_icons: generate: true image_path: "assets/images/logo.png" - # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter. flutter: - # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. diff --git a/test/fixtures/nutrition/ingredient_10065_response.json b/test/fixtures/nutrition/ingredient_10065_response.json index 920fbfa2..bba54a2c 100644 --- a/test/fixtures/nutrition/ingredient_10065_response.json +++ b/test/fixtures/nutrition/ingredient_10065_response.json @@ -2,8 +2,8 @@ "id": 10065, "code": "0043647440020", "name": "'Old Times' Orange Fine Cut Marmalade", - "creation_date": "2020-12-20", - "update_date": "2022-08-09", + "creation_date": "2020-12-20T01:00:00+01:00", + "update_date": "2022-08-09T10:23:11+02:00", "energy": 269, "protein": "0.000", "carbohydrates": "67.000", diff --git a/test/fixtures/nutrition/ingredient_58300_response.json b/test/fixtures/nutrition/ingredient_58300_response.json index 1dbe5c8d..9e84a276 100644 --- a/test/fixtures/nutrition/ingredient_58300_response.json +++ b/test/fixtures/nutrition/ingredient_58300_response.json @@ -2,8 +2,8 @@ "id": 58300, "code": "4071800000992", "name": "1688 Mehrkorn", - "creation_date": "2020-12-20", - "update_date": "2022-08-09", + "creation_date": "2020-12-20T01:00:00+02:00", + "update_date": "2022-08-09T18:55:00+02:00", "energy": 229, "protein": "7.680", "carbohydrates": "35.700", diff --git a/test/fixtures/nutrition/ingredient_59887_response.json b/test/fixtures/nutrition/ingredient_59887_response.json index 3aa08b42..a20b0940 100644 --- a/test/fixtures/nutrition/ingredient_59887_response.json +++ b/test/fixtures/nutrition/ingredient_59887_response.json @@ -2,8 +2,8 @@ "id": 59887, "code": "4311501354155", "name": "Baked Beans", - "creation_date": "2020-12-20", - "update_date": "2022-08-09", + "creation_date": "2020-12-20T23:10:54+01:00", + "update_date": "2022-08-09T13:32:41+01:00", "energy": 86, "protein": "4.400", "carbohydrates": "11.000",