Merge branch 'master' into feature/flatpak-build

This commit is contained in:
Roland Geider
2023-06-26 18:34:18 +02:00
47 changed files with 1916 additions and 741 deletions

View File

@@ -1,4 +1,4 @@
{
"dart.lineLength": 100,
"diffEditor.ignoreTrimWhitespace": true,
}
"dart.lineLength": 100,
"diffEditor.ignoreTrimWhitespace": true,
}

View File

@@ -2,6 +2,7 @@
## Developers
- Jigar Prajapati - <https://github.com/Jiggy9>
- Roland Geider <https://github.com/rolandgeider>
- Dylan Aird - <https://github.com/Dolaned>
- Jannik Norden - <https://github.com/Jannik-dev>
@@ -19,6 +20,8 @@
- Aman Negi - <https://github.com/AmanNegi>
- Sandi Milohanic - <https://github.com/sandimilohanic>
- Miroslav Mazel - <https://gitlab.com/12people>
- artchiee - <https://github.com/artchiee>
- Tejas Bir Singh - <https://github.com/tejasbirsingh>
## Translators

View File

@@ -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.

View File

@@ -1,63 +1,128 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>de.wger.flutter</id>
<name>wger</name>
<summary>Fitness/workout, nutrition and weight tracker</summary>
<id>de.wger.flutter</id>
<name>wger</name>
<summary>Fitness/workout, nutrition and weight tracker</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>AGPL-3.0-or-later</project_license>
<recommends>
<control>touch</control>
<control>pointing</control>
<control>keyboard</control>
</recommends>
<developer_name>wger</developer_name>
<url type="homepage">https://wger.de/</url>
<url type="bugtracker">https://github.com/wger-project/flutter/issues</url>
<metadata_license>CC0-1.0</metadata_license>
<project_license>AGPL-3.0-or-later</project_license>
<recommends>
<control>touch</control>
<control>pointing</control>
<control>keyboard</control>
</recommends>
<developer_name>wger</developer_name>
<url type="homepage">https://wger.de/</url>
<url type="bugtracker">https://github.com/wger-project/flutter/issues</url>
<custom>
<value key="Purism::form_factor">workstation</value>
<value key="Purism::form_factor">mobile</value>
</custom>
<custom>
<value key="Purism::form_factor">workstation</value>
<value key="Purism::form_factor">mobile</value>
</custom>
<description>
<p>From fitness lovers to fitness lovers get your health organized with WGER, your Workout Manager!</p>
<p>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 &lt;3</p>
<p>So we dont judge you for still managing your fitness journey with your handy little workout log book but welcome to 2021!</p>
<p>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!</p>
<p>wger is an Open Source project and all about:</p>
<ul>
<li><strong>Your body:</strong> 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.</li>
<li><strong>Your workouts:</strong> 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.</li>
<li><strong>Your progress:</strong> Never lose sight of your goals. Track your weight and keep your statistics.</li>
<li><strong>Your data:</strong> wger is your personalized fitness diary but you own your data. Use the REST API to access and do amazing things with it.</li>
</ul>
<p>Please note: This free app is not based on additional fundings and we dont ask you to donate money. More than that it is a community project which is growing constantly. So be prepared for new features anytime!</p>
<p><strong>OpenSource what does that mean?</strong> Open Source means that the whole source code for this app and the server it talks to is free and available to anybody:</p>
<ul>
<description>
<p>
From fitness lovers to fitness lovers get your health organized with WGER,
your Workout Manager!
</p>
<p>
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 &lt;3
</p>
<p>
So we dont judge you for still managing your fitness journey with your handy little
workout log book but welcome to 2021!
</p>
<p>
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!
</p>
<p>wger is an Open Source project and all about:</p>
<ul>
<li>
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.
</li>
<li>
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.
</li>
<li>
Your progress:
Never lose sight of your goals. Track your weight and keep your statistics.
</li>
<li>
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.
</li>
</ul>
<p>Please note: This free app is not based on additional fundings and we dont ask you to
donate money. More than that it is a community project which is growing constantly. So
be prepared for new features anytime!
</p>
<p>
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:
</p>
<ul>
<li>Do you want to run wger on your own server for you or your local gym? Go ahead!</li>
<li>Do you miss a feature and want to implement it? Start now!</li>
<li>Do you want to check that nothing is being sent anywhere? You can!</li>
</ul>
<p>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!</p>
<ul>
<li>find the source code on <a href="https://github.com/wger-project">https://github.com/wger-project</a></li>
<li>ask your questions or just say hello on our discord Server <a href="https://discord.gg/rPWFv6W">https://discord.gg/rPWFv6W</a></li>
</ul>
</description>
</ul>
<p>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!
</p>
<ul>
<li>find the source code on https://github.com/wger-project
</li>
<li>
ask your questions or just say hello on our discord Server
https://discord.gg/rPWFv6W
</li>
</ul>
</description>
<screenshots>
<screenshot type="default">
<caption>wger's dashboard</caption>
<image type="source">https://github.com/wger-project/flutter/raw/master/fastlane/metadata/android/en-US/images/phoneScreenshots/01%20-%20dashboard.png</image>
</screenshot>
</screenshots>
<screenshots>
<screenshot type="default">
<caption>wger's dashboard</caption>
<image type="source">
https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/01%20-%20dashboard.png
</image>
</screenshot>
<screenshot>
<caption>Workout detail</caption>
<image type="source">
https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/02%20-%20workout%20detail.png
</image>
</screenshot>
<screenshot>
<caption>Measurements</caption>
<image type="source">
https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/04%20-%20measurements.png
</image>
</screenshot>
<screenshot>
<caption>Nutritional plan</caption>
<image type="source">
https://raw.githubusercontent.com/wger-project/flutter/master/fastlane/metadata/android/en-US/images/phoneScreenshots/05%20-%20nutritional%20plan.png
</image>
</screenshot>
</screenshots>
<releases>
<release version="1.5.3" date="2023-03-16" />
</releases>
<releases>
<release version="1.5.3" date="2023-03-16" />
</releases>
<content_rating type="oars-1.1" />
<content_rating type="oars-1.1" />
<launchable type="desktop-id">de.wger.flutter.desktop</launchable>
<launchable type="desktop-id">de.wger.flutter.desktop</launchable>
</component>

View File

@@ -23,6 +23,7 @@
"--share=network",
"--socket=fallback-x11",
"--socket=wayland",
"--socket=pulseaudio",
"--device=dri"
]
}

View File

@@ -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"

View File

@@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>9.0</string>
<string>11.0</string>
</dict>
</plist>

View File

@@ -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'

View File

@@ -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

View File

@@ -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;

View File

@@ -43,5 +43,7 @@
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

View File

@@ -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 ]

View File

@@ -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;

View File

@@ -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_;

View File

@@ -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);
}
}

View File

@@ -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"
}
}

View File

@@ -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": {}
}

View File

@@ -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": {}
}

View File

@@ -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": {}
}

View File

@@ -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": {}
}

1
lib/l10n/app_pt_BR.arb Normal file
View File

@@ -0,0 +1 @@
{}

View File

@@ -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"
}
}

View File

@@ -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"
}
}

View File

@@ -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"
}
}

View File

@@ -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"
}
}

View File

@@ -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');
},
),
),
);

View File

@@ -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

View File

@@ -47,7 +47,7 @@ Map<String, dynamic> _$IngredientToJson(Ingredient instance) => <String, dynamic
'id': instance.id,
'code': instance.code,
'name': instance.name,
'creation_date': toDate(instance.creationDate),
'creation_date': instance.creationDate.toIso8601String(),
'energy': instance.energy,
'carbohydrates': numToString(instance.carbohydrates),
'carbohydrates_sugar': numToString(instance.carbohydratesSugar),

View File

@@ -85,7 +85,7 @@ class WorkoutPlansProvider with ChangeNotifier {
/// Return the default weight unit (reps)
RepetitionUnit get defaultRepetitionUnit {
return _repetitionUnit.firstWhere((element) => element.id == DEFAULT_REPETITION_UNIT);
return _repetitionUnit.firstWhere((element) => element.id == REP_UNIT_REPETITIONS);
}
List<WorkoutPlan> getPlans() {

View File

@@ -246,12 +246,13 @@ class _AuthCardState extends State<AuthCard> {
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'))],

View File

@@ -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(

View File

@@ -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),
),
],
),
);
}
}

View File

@@ -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<GalleryProvider>(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<GalleryProvider>(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,
);
},
),
);
},
),
),
);
}

View File

@@ -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<NutritionData, String>(
id: 'Planned',
domainFn: (nutritionEntry, index) => nutritionEntry.name,
measureFn: (nutritionEntry, index) => nutritionEntry.value,
data: [
NutritionData(AppLocalizations.of(context).energy,
_nutritionalPlan.nutritionalValues.energy),
],
),
charts.Series<NutritionData, String>(
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<NutritionData, String>(
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<NutritionData, String>(
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<NutritionData, String>(
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<NutritionData, String>(
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<NutritionData, String>(
@@ -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<NutritionData, String>(
@@ -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),
),
);
}
}

View File

@@ -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,

View File

@@ -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),
),
),
),
);
},
),
);
}
}

View File

@@ -16,11 +16,15 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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<String> 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<IngredientTypeahead> {
var _searchEnglish = true;
Future<String> 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<IngredientTypeahead> {
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<IngredientTypeahead> {
}
} 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'),

View File

@@ -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<UserProvider>().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<UserProvider>().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),
),
],
),

View File

@@ -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<WorkoutPlansProvider>(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<WorkoutPlansProvider>(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),
),
),
),
);
},
),
);
},
),
);
}
}

View File

@@ -6,9 +6,13 @@
#include "generated_plugin_registrant.h"
#include <file_selector_linux/file_selector_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
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);

View File

@@ -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)

View File

@@ -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"))
}

View File

@@ -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"

View File

@@ -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.

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",