From 6b23f5853b304b4ee723e3fe9f11f514b48b2c7c Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Sun, 23 Mar 2025 22:22:14 +0100 Subject: [PATCH 01/12] Update bug report and feature request templates --- .github/ISSUE_TEMPLATE/1_bug.md | 34 ------------- .github/ISSUE_TEMPLATE/1_bug.yml | 53 ++++++++++++++++++++ .github/ISSUE_TEMPLATE/2_feature_request.md | 26 ---------- .github/ISSUE_TEMPLATE/2_feature_request.yml | 33 ++++++++++++ 4 files changed, 86 insertions(+), 60 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/1_bug.md create mode 100644 .github/ISSUE_TEMPLATE/1_bug.yml delete mode 100644 .github/ISSUE_TEMPLATE/2_feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/2_feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/1_bug.md b/.github/ISSUE_TEMPLATE/1_bug.md deleted file mode 100644 index e12f7506..00000000 --- a/.github/ISSUE_TEMPLATE/1_bug.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: I found a problem with wger -about: While using wger the application crashes or throws an exception, a - widget is buggy, or something looks wrong. -title: '' -labels: '' -assignees: '' - ---- - -## Steps to Reproduce - - - -1. ... -2. ... -3. ... - -**Expected results:** - -**Actual results:** - -
- Logs - - - -``` -``` - - -
diff --git a/.github/ISSUE_TEMPLATE/1_bug.yml b/.github/ISSUE_TEMPLATE/1_bug.yml new file mode 100644 index 00000000..385e5cc8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_bug.yml @@ -0,0 +1,53 @@ +# https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms +# https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema + +name: Bug report +description: Report an error or unexpected behavior +type: bug +body: + - type: dropdown + id: priority + attributes: + label: Priority/Impact + description: How severe is the issue? + options: + - Low (minor inconvenience) + - Medium (affects some functionality) + - High (critical issue, blocks workflow) + + - type: textarea + id: description + attributes: + label: Description + description: | + A clear and concise description of the bug. + placeholder: | + Please include any information you think is relevant to the issue you are experiencing. + This could include any steps to reproduce it (if it happens consistently), expected vs. + actual behavior, logs, screenshots, links to related issues, etc. + validations: + required: true + + - type: input + id: server-version + attributes: + label: Server version + description: | + What version of wger are you using and how did you install it (you use our server, + docker compose, manual installation, etc)? + placeholder: | + Check https:///software/about-us or the git sha1 of the last commit you pulled + validations: + required: false + + - type: input + id: app-version + attributes: + label: Mobile app version + description: | + What version of the mobile app are you using and how did you install it + (Play Store, App Store, Flathub, self compiled, etc.)? + placeholder: | + Check the "about wger" dialog + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.md b/.github/ISSUE_TEMPLATE/2_feature_request.md deleted file mode 100644 index 924b1e42..00000000 --- a/.github/ISSUE_TEMPLATE/2_feature_request.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: Feature request -about: Suggest a new idea for wger. -title: '' -labels: '' -assignees: '' - ---- - -## Use case - - - -## Proposal - - diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.yml b/.github/ISSUE_TEMPLATE/2_feature_request.yml new file mode 100644 index 00000000..5ea0dff8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_feature_request.yml @@ -0,0 +1,33 @@ +name: Feature request +description: Suggest a new idea for wger +type: enhancement +body: + - type: textarea + id: description + attributes: + label: Use case + description: | + A description of what new feature or behavior you would like to see. + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposal + description: | + Why is this feature needed? What problems does it solve? + validations: + required: false + + - type: textarea + id: additional-context + attributes: + label: Additional Context + description: | + Any extra details, related issues, or mockups + placeholder: | + Screenshots or mockups, links to similar features in other applications, or other relevant + information. + validations: + required: false From b2802e3a989c74b94d8220b9d437a2386be821c3 Mon Sep 17 00:00:00 2001 From: Yashas H Majmudar Date: Tue, 25 Mar 2025 23:10:05 -0400 Subject: [PATCH 02/12] fix: isExpanded variable bool flip --- lib/widgets/exercises/filter_modal.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/exercises/filter_modal.dart b/lib/widgets/exercises/filter_modal.dart index 9ac88ad0..eb6758c7 100644 --- a/lib/widgets/exercises/filter_modal.dart +++ b/lib/widgets/exercises/filter_modal.dart @@ -48,7 +48,7 @@ class _ExerciseFilterModalBodyState extends State { dividerColor: Colors.transparent, expansionCallback: (panelIndex, isExpanded) { setState(() { - filters.filterCategories[panelIndex].isExpanded = !isExpanded; + filters.filterCategories[panelIndex].isExpanded = isExpanded; }); }, elevation: 0, From e0e524d2b1eabd02919f24e0afd9477c710bea85 Mon Sep 17 00:00:00 2001 From: Yashas H Majmudar Date: Tue, 25 Mar 2025 23:10:46 -0400 Subject: [PATCH 03/12] update: podfile.lock and pubspec.lock --- ios/Podfile.lock | 29 ++++----- ios/Runner.xcodeproj/project.pbxproj | 64 +++++++++---------- .../xcshareddata/xcschemes/Runner.xcscheme | 1 + ios/build/.last_build_id | 1 + 4 files changed, 47 insertions(+), 48 deletions(-) create mode 100644 ios/build/.last_build_id diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 364cb767..065b1a2a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2,8 +2,6 @@ PODS: - camera_avfoundation (0.0.1): - Flutter - Flutter (1.0.0) - - flutter_barcode_scanner (2.0.0): - - Flutter - flutter_keyboard_visibility (0.0.1): - Flutter - flutter_zxing (0.0.1): @@ -24,23 +22,26 @@ PODS: - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS - - sqlite3 (3.48.0): - - sqlite3/common (= 3.48.0) - - sqlite3/common (3.48.0) - - sqlite3/dbstatvtab (3.48.0): + - sqlite3 (3.49.1): + - sqlite3/common (= 3.49.1) + - sqlite3/common (3.49.1) + - sqlite3/dbstatvtab (3.49.1): - sqlite3/common - - sqlite3/fts5 (3.48.0): + - sqlite3/fts5 (3.49.1): - sqlite3/common - - sqlite3/perf-threadsafe (3.48.0): + - sqlite3/math (3.49.1): - sqlite3/common - - sqlite3/rtree (3.48.0): + - sqlite3/perf-threadsafe (3.49.1): + - sqlite3/common + - sqlite3/rtree (3.49.1): - sqlite3/common - sqlite3_flutter_libs (0.0.1): - Flutter - FlutterMacOS - - sqlite3 (~> 3.48.0) + - sqlite3 (~> 3.49.1) - sqlite3/dbstatvtab - sqlite3/fts5 + - sqlite3/math - sqlite3/perf-threadsafe - sqlite3/rtree - url_launcher_ios (0.0.1): @@ -52,7 +53,6 @@ PODS: DEPENDENCIES: - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - Flutter (from `Flutter`) - - flutter_barcode_scanner (from `.symlinks/plugins/flutter_barcode_scanner/ios`) - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - flutter_zxing (from `.symlinks/plugins/flutter_zxing/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) @@ -75,8 +75,6 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/camera_avfoundation/ios" Flutter: :path: Flutter - flutter_barcode_scanner: - :path: ".symlinks/plugins/flutter_barcode_scanner/ios" flutter_keyboard_visibility: :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" flutter_zxing: @@ -105,7 +103,6 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: camera_avfoundation: 04b44aeb14070126c6529e5ab82cc7c9fca107cf Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_barcode_scanner: c5aa9f51c150a6242fa392386bd52b64bb27fcb5 flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619 flutter_zxing: e741c4f3335db8910e5c396c4291cdfb320859dc image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a @@ -115,8 +112,8 @@ SPEC CHECKSUMS: pointer_interceptor_ios: ec847ef8b0915778bed2b2cef636f4d177fa8eed rive_common: dd421daaf9ae69f0125aa761dd96abd278399952 shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 - sqlite3: 3da10a59910c809fb584a93aa46a3f05b785e12e - sqlite3_flutter_libs: c26d86af4ad88f1465dc4e07e6dc6931eef228e4 + sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983 + sqlite3_flutter_libs: f6acaa2172e6bb3e2e70c771661905080e8ebcf2 url_launcher_ios: 694010445543906933d732453a59da0a173ae33d video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 3209bb17..08cbbe00 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,9 +8,9 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3845DFE0762714C6680D5DFA /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFA44D9DB464FB85F130C5B5 /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 78C727F12E8C2C2BF5ED5703 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC1C25406C5CD78CE59E547 /* Pods_Runner.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -30,14 +30,14 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0661B42137D743038BB7032F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 0AA56188CB2769B47E250516 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 0ED96167FF623FAB319C6E99 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 89F44165E15E0A7B109A05EB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -45,8 +45,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C19FA8F529BB2B899AB0C23A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - DAC1C25406C5CD78CE59E547 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AFA44D9DB464FB85F130C5B5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C71BAD15819A771165D784B0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -54,17 +54,17 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 78C727F12E8C2C2BF5ED5703 /* Pods_Runner.framework in Frameworks */, + 3845DFE0762714C6680D5DFA /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 631B4307BD65C9D08E514EBB /* Frameworks */ = { + 23E168F95D2790D29E207E68 /* Frameworks */ = { isa = PBXGroup; children = ( - DAC1C25406C5CD78CE59E547 /* Pods_Runner.framework */, + AFA44D9DB464FB85F130C5B5 /* Pods_Runner.framework */, ); name = Frameworks; sourceTree = ""; @@ -87,7 +87,7 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, BB0286322FD60C00014F981C /* Pods */, - 631B4307BD65C9D08E514EBB /* Frameworks */, + 23E168F95D2790D29E207E68 /* Frameworks */, ); sourceTree = ""; }; @@ -117,9 +117,9 @@ BB0286322FD60C00014F981C /* Pods */ = { isa = PBXGroup; children = ( - 0661B42137D743038BB7032F /* Pods-Runner.debug.xcconfig */, - C19FA8F529BB2B899AB0C23A /* Pods-Runner.release.xcconfig */, - 0AA56188CB2769B47E250516 /* Pods-Runner.profile.xcconfig */, + C71BAD15819A771165D784B0 /* Pods-Runner.debug.xcconfig */, + 0ED96167FF623FAB319C6E99 /* Pods-Runner.release.xcconfig */, + 89F44165E15E0A7B109A05EB /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -131,14 +131,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 55A9F1D1670043D7444258F2 /* [CP] Check Pods Manifest.lock */, + 49A79EC3F389C902853B9186 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 8D4C3EABCD024FF4FF37C7E4 /* [CP] Embed Pods Frameworks */, + 0A9E38C31DF3DC192213822E /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -197,6 +197,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 0A9E38C31DF3DC192213822E /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -213,7 +230,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 55A9F1D1670043D7444258F2 /* [CP] Check Pods Manifest.lock */ = { + 49A79EC3F389C902853B9186 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -235,23 +252,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 8D4C3EABCD024FF4FF37C7E4 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e67b2808..4f746537 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -50,6 +50,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ios/build/.last_build_id b/ios/build/.last_build_id new file mode 100644 index 00000000..7769d20e --- /dev/null +++ b/ios/build/.last_build_id @@ -0,0 +1 @@ +ce49e7d90cd902197f9a9cbc84219d23 \ No newline at end of file From 0d147e609e43ca95f5c9071b5296c738de3ae48d Mon Sep 17 00:00:00 2001 From: Yashas H Majmudar Date: Tue, 25 Mar 2025 23:11:02 -0400 Subject: [PATCH 04/12] update: podfile.lock and pubspec.lock --- pubspec.lock | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 07910e32..0e19b69f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: archive - sha256: "0c64e928dcbefddecd234205422bcfc2b5e6d31be0b86fef0d0dd48d7b4c9742" + sha256: "7dcbd0f87fe5f61cb28da39a1a8b70dbc106e2fe0516f7836eb7bb2948481a12" url: "https://pub.dev" source: hosted - version: "4.0.4" + version: "4.0.5" args: dependency: transitive description: @@ -133,18 +133,18 @@ packages: dependency: transitive description: name: camera_avfoundation - sha256: "3057ada0b30402e3a9b6dffec365c9736a36edbf04abaecc67c4309eadc86b49" + sha256: ba48b65a3a97004276ede882e6b838d9667642ff462c95a8bb57ca8a82b6bd25 url: "https://pub.dev" source: hosted - version: "0.9.18+9" + version: "0.9.18+11" camera_platform_interface: dependency: transitive description: name: camera_platform_interface - sha256: "953e7baed3a7c8fae92f7200afeb2be503ff1a17c3b4e4ed7b76f008c2810a31" + sha256: "2f757024a48696ff4814a789b0bd90f5660c0fb25f393ab4564fb483327930e2" url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" camera_web: dependency: transitive description: @@ -317,10 +317,10 @@ packages: dependency: transitive description: name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" file: dependency: transitive description: @@ -381,10 +381,10 @@ packages: dependency: "direct main" description: name: flex_color_scheme - sha256: ae638050fceb35b6040a43cf67892f9b956022068e736284919d93322fdd4ba2 + sha256: "3344f8f6536c6ce0473b98e9f084ef80ca89024ad3b454f9c32cf840206f4387" url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.2.0" flex_seed_scheme: dependency: "direct main" description: @@ -402,10 +402,10 @@ packages: dependency: "direct main" description: name: flutter_calendar_carousel - sha256: "675a2331da6ecd7ba180ba7cd6551a18d41861187bb7537c11859a2df72d1646" + sha256: "2fd1b58cefbefe0504ca7d0080a9e63be96041acc93b0c7f340ef0a55b9808fe" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.5.3" flutter_driver: dependency: transitive description: flutter @@ -651,10 +651,10 @@ packages: dependency: transitive description: name: image - sha256: "13d3349ace88f12f4a0d175eb5c12dcdd39d35c4c109a8a13dfeb6d0bd9e31c3" + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" url: "https://pub.dev" source: hosted - version: "4.5.3" + version: "4.5.4" image_picker: dependency: "direct main" description: @@ -744,10 +744,10 @@ packages: dependency: transitive description: name: js - sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.7.2" json_annotation: dependency: "direct main" description: @@ -984,10 +984,10 @@ packages: dependency: transitive description: name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.1.0" platform: dependency: transitive description: @@ -1245,10 +1245,10 @@ packages: dependency: "direct main" description: name: sqlite3_flutter_libs - sha256: "7adb4cc96dc08648a5eb1d80a7619070796ca6db03901ff2b6dcb15ee30468f3" + sha256: "1a96b59227828d9eb1463191d684b37a27d66ee5ed7597fcf42eee6452c88a14" url: "https://pub.dev" source: hosted - version: "0.5.31" + version: "0.5.32" sqlparser: dependency: transitive description: @@ -1549,10 +1549,10 @@ packages: dependency: transitive description: name: win32 - sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e + sha256: dc6ecaa00a7c708e5b4d10ee7bec8c270e9276dfcab1783f57e9962d7884305f url: "https://pub.dev" source: hosted - version: "5.10.1" + version: "5.12.0" xdg_directories: dependency: transitive description: @@ -1578,5 +1578,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.0-0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.7.0 <4.0.0" + flutter: ">=3.29.0" From d4ee3ed8d44cf8b54825875c131d6e610a0156aa Mon Sep 17 00:00:00 2001 From: Yashas H Majmudar Date: Tue, 25 Mar 2025 23:19:08 -0400 Subject: [PATCH 05/12] add: name to Authors.md --- AUTHORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.md b/AUTHORS.md index d886c6d7..f4bf87d3 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -33,6 +33,7 @@ - Arya Singh - - Xianglin Zeng - - Sangharsh Sulke - +- Yashas H Majmudar - ## Translators From 74752505eba55e93a561e849d0b23df64ada2af9 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 26 Mar 2025 15:03:15 +0100 Subject: [PATCH 06/12] Change rir and rirTarget types from String to num This is more consistent with the other fields and is now the same as the backend --- lib/helpers/misc.dart | 2 +- lib/models/workouts/log.dart | 12 ++--- lib/models/workouts/log.g.dart | 4 +- lib/models/workouts/set_config_data.dart | 10 ++-- lib/models/workouts/set_config_data.g.dart | 6 +-- lib/widgets/routines/gym_mode/log_page.dart | 2 +- test/fixtures/routines/routine_logs.json | 2 +- test/workout/workout_log_model_test.dart | 4 +- test_data/routines.dart | 54 ++++++++++----------- 9 files changed, 46 insertions(+), 50 deletions(-) diff --git a/lib/helpers/misc.dart b/lib/helpers/misc.dart index 97027392..8db74a85 100644 --- a/lib/helpers/misc.dart +++ b/lib/helpers/misc.dart @@ -28,7 +28,7 @@ String repText( RepetitionUnit? repetitionUnitObj, num? weight, WeightUnit? weightUnitObj, - String? rir, + num? rir, ) { // TODO(x): how to (easily?) translate strings like the units or 'RiR' diff --git a/lib/models/workouts/log.dart b/lib/models/workouts/log.dart index 7744b280..c3082bf4 100644 --- a/lib/models/workouts/log.dart +++ b/lib/models/workouts/log.dart @@ -49,11 +49,11 @@ class Log { @JsonKey(required: true, name: 'slot_entry') int? slotEntryId; - @JsonKey(required: false) - String? rir; + @JsonKey(required: false, fromJson: stringToNum) + num? rir; - @JsonKey(required: false, name: 'rir_target') - String? rirTarget; + @JsonKey(required: false, fromJson: stringToNum, name: 'rir_target') + num? rirTarget; @JsonKey(required: true, fromJson: stringToNum, name: 'repetitions') num? repetitions; @@ -121,10 +121,6 @@ class Log { repetitionsUnitId = repetitionUnit?.id; } - void setRir(String rir) { - this.rir = rir; - } - /// Returns the text representation for a single setting, used in the gym mode String get singleLogRepTextNoNl { return repText(repetitions, repetitionsUnitObj, weight, weightUnitObj, rir) diff --git a/lib/models/workouts/log.g.dart b/lib/models/workouts/log.g.dart index d26477a0..397df1b5 100644 --- a/lib/models/workouts/log.g.dart +++ b/lib/models/workouts/log.g.dart @@ -34,8 +34,8 @@ Log _$LogFromJson(Map json) { repetitions: stringToNum(json['repetitions'] as String?), repetitionsTarget: stringToNum(json['repetitions_target'] as String?), repetitionsUnitId: (json['repetitions_unit'] as num?)?.toInt() ?? REP_UNIT_REPETITIONS_ID, - rir: json['rir'] as String?, - rirTarget: json['rir_target'] as String?, + rir: stringToNum(json['rir'] as String?), + rirTarget: stringToNum(json['rir_target'] as String?), weight: stringToNum(json['weight'] as String?), weightTarget: stringToNum(json['weight_target'] as String?), weightUnitId: (json['weight_unit'] as num?)?.toInt() ?? WEIGHT_UNIT_KG, diff --git a/lib/models/workouts/set_config_data.dart b/lib/models/workouts/set_config_data.dart index 97d2f711..3bc0f85a 100644 --- a/lib/models/workouts/set_config_data.dart +++ b/lib/models/workouts/set_config_data.dart @@ -78,14 +78,14 @@ class SetConfigData { @JsonKey(required: true, name: 'repetitions_rounding', fromJson: stringToNumNull) late num? repetitionsRounding; - @JsonKey(required: true) - late String? rir; + @JsonKey(required: true, fromJson: stringToNumNull) + late num? rir; - @JsonKey(required: true, name: 'max_rir') - late String? maxRir; + @JsonKey(required: true, name: 'max_rir', fromJson: stringToNumNull) + late num? maxRir; @JsonKey(required: true) - late String? rpe; + late num? rpe; @JsonKey(required: true, name: 'rest', fromJson: stringToNumNull) late num? restTime; diff --git a/lib/models/workouts/set_config_data.g.dart b/lib/models/workouts/set_config_data.g.dart index f1239905..561fd77b 100644 --- a/lib/models/workouts/set_config_data.g.dart +++ b/lib/models/workouts/set_config_data.g.dart @@ -50,9 +50,9 @@ SetConfigData _$SetConfigDataFromJson(Map json) { repetitionsRounding: json['repetitions_rounding'] == null ? 1 : stringToNumNull(json['repetitions_rounding'] as String?), - rir: json['rir'] as String?, - maxRir: json['max_rir'] as String?, - rpe: json['rpe'] as String?, + rir: stringToNumNull(json['rir'] as String?), + maxRir: stringToNumNull(json['max_rir'] as String?), + rpe: json['rpe'] as num?, restTime: stringToNumNull(json['rest'] as String?), maxRestTime: stringToNumNull(json['max_rest'] as String?), comment: json['comment'] as String? ?? '', diff --git a/lib/widgets/routines/gym_mode/log_page.dart b/lib/widgets/routines/gym_mode/log_page.dart index 0471eb90..1c9b966e 100644 --- a/lib/widgets/routines/gym_mode/log_page.dart +++ b/lib/widgets/routines/gym_mode/log_page.dart @@ -274,7 +274,7 @@ class _LogPageState extends State { ), if (_detailed) RiRInputWidget( - widget._log.rir == null ? null : num.parse(widget._log.rir!), + widget._log.rir, onChanged: (v) => {}, ), SwitchListTile( diff --git a/test/fixtures/routines/routine_logs.json b/test/fixtures/routines/routine_logs.json index cca04829..1835cc3d 100644 --- a/test/fixtures/routines/routine_logs.json +++ b/test/fixtures/routines/routine_logs.json @@ -161,7 +161,7 @@ "weight": "90.00", "weight_target": "80.00", "rir": "0.5", - "rir_target": null, + "rir_target": "0.5", "rest": 121, "rest_target": 120 }, diff --git a/test/workout/workout_log_model_test.dart b/test/workout/workout_log_model_test.dart index 9bfdfe93..1d993b2d 100644 --- a/test/workout/workout_log_model_test.dart +++ b/test/workout/workout_log_model_test.dart @@ -32,7 +32,7 @@ void main() { routineId: 100, exerciseId: 1, repetitions: 10, - rir: '1.5', + rir: 1.5, repetitionsUnitId: 1, weight: 20, weightUnitId: 1, @@ -45,7 +45,7 @@ void main() { routineId: 42, exerciseId: 1, repetitions: 10, - rir: '1.5', + rir: 1.5, repetitionsUnitId: 1, weight: 20, weightUnitId: 1, diff --git a/test_data/routines.dart b/test_data/routines.dart index 6885ce64..eb3efb75 100644 --- a/test_data/routines.dart +++ b/test_data/routines.dart @@ -50,7 +50,7 @@ Routine getTestRoutine({List? exercises}) { ..iteration = 2 ..slotEntryId = 3 ..weight = 10 - ..rir = '1.5' + ..rir = 1.5 ..date = DateTime(2021, 5, 1) ..repetitions = 10 ..routineId = 1; @@ -63,7 +63,7 @@ Routine getTestRoutine({List? exercises}) { ..iteration = 4 ..slotEntryId = 1 ..weight = 10 - ..rir = '2' + ..rir = 2 ..date = DateTime(2021, 5, 1) ..repetitions = 12 ..routineId = 1; @@ -76,7 +76,7 @@ Routine getTestRoutine({List? exercises}) { ..iteration = 5 ..slotEntryId = 1 ..weight = 50 - ..rir = '' + ..rir = null ..date = DateTime(2021, 5, 2) ..repetitions = 8 ..routineId = 1; @@ -248,8 +248,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '3x100kg', ), SetConfigData( @@ -262,8 +262,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '3x100kg', ), SetConfigData( @@ -276,8 +276,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '3x100kg', ), ], @@ -297,8 +297,8 @@ Routine getTestRoutine({List? exercises}) { weight: 10, weightUnit: testWeightUnit1, restTime: null, - rir: '', - rpe: '', + rir: null, + rpe: null, textRepr: '12x10kg', ), SetConfigData( @@ -311,8 +311,8 @@ Routine getTestRoutine({List? exercises}) { weight: 10, weightUnit: testWeightUnit1, restTime: null, - rir: '', - rpe: '', + rir: null, + rpe: null, textRepr: '12x10kg', ), SetConfigData( @@ -325,8 +325,8 @@ Routine getTestRoutine({List? exercises}) { weight: 10, weightUnit: testWeightUnit1, restTime: null, - rir: '', - rpe: '', + rir: null, + rpe: null, textRepr: '12x10kg', ), ], @@ -354,8 +354,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '3x100kg', ), SetConfigData( @@ -368,8 +368,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '3x100kg', ), SetConfigData( @@ -382,8 +382,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '3x100kg', ), ], @@ -414,8 +414,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '4 sets 3x100kg', ), ], @@ -435,8 +435,8 @@ Routine getTestRoutine({List? exercises}) { weight: 10, weightUnit: testWeightUnit1, restTime: 60, - rir: '', - rpe: '', + rir: null, + rpe: null, textRepr: '4 sets 12x10kg', ), ], @@ -464,8 +464,8 @@ Routine getTestRoutine({List? exercises}) { weight: 100, weightUnit: testWeightUnit1, restTime: 120, - rir: '1.5', - rpe: '8', + rir: 1.5, + rpe: 8, textRepr: '4 sets 3x100kg', ), ], From c8de1c3726c5dd8cc4fad0efd0eaceb7f5dab601 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 26 Mar 2025 15:50:24 +0100 Subject: [PATCH 07/12] Show command to format lines to 100 characters --- .github/pull_request_template.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 4cf8375a..75aef5cc 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,10 +1,11 @@ ## Description (Proposed Changes) + (Please try to mention in bullet points.) - - -## Link to the issue : +## Link to the issue : (Add link of the issue you have proposed changes to) @@ -16,9 +17,11 @@ Please make sure to add tests when implementing new features. ## Checklist -Please check that the PR fulfills all requirements listed below by checking the relevant checkboxes (`[x]`). This will ensure a smooth and quick review process. +Please check that the PR fulfills all requirements listed below by checking the relevant +checkboxes (`[x]`). This will ensure a smooth and quick review process. - [ ] Set a 100 character limit in your editor/IDE to avoid white space diffs in the PR + (run `dart format --line-length=100 .`) - [ ] Tests for the changes have been added (for bug fixes / features) - [ ] Added yourself to AUTHORS.md - [ ] Updated/added relevant documentation (doc comments with `///`). From 3ca0c1781fafa287e1fad7aaed1367a5bc5c28a6 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 26 Mar 2025 16:21:41 +0100 Subject: [PATCH 08/12] Add a maximum height for exercise images --- lib/widgets/exercises/exercises.dart | 5 ++++- lib/widgets/exercises/images.dart | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/widgets/exercises/exercises.dart b/lib/widgets/exercises/exercises.dart index f07d162a..74b6beed 100644 --- a/lib/widgets/exercises/exercises.dart +++ b/lib/widgets/exercises/exercises.dart @@ -193,7 +193,10 @@ class ExerciseDetail extends StatelessWidget { // TODO: add carousel for the other images final List out = []; if (_exercise.getMainImage != null) { - out.add(ExerciseImageWidget(image: _exercise.getMainImage)); + out.add(ExerciseImageWidget( + image: _exercise.getMainImage, + height: 250, + )); out.add(const SizedBox(height: PADDING)); } diff --git a/lib/widgets/exercises/images.dart b/lib/widgets/exercises/images.dart index eb7f3e0f..ff590814 100644 --- a/lib/widgets/exercises/images.dart +++ b/lib/widgets/exercises/images.dart @@ -20,9 +20,10 @@ import 'package:flutter/widgets.dart'; import 'package:wger/models/exercises/image.dart'; class ExerciseImageWidget extends StatelessWidget { - const ExerciseImageWidget({this.image}); + const ExerciseImageWidget({this.image, this.height}); final ExerciseImage? image; + final double? height; @override Widget build(BuildContext context) { @@ -32,6 +33,7 @@ class ExerciseImageWidget extends StatelessWidget { image: NetworkImage(image!.url), fit: BoxFit.cover, imageSemanticLabel: 'Exercise image', + height: height, ) : const Image( image: AssetImage('assets/images/placeholder.png'), From d2097bf319e1f02c918de66da7104e42fa38929f Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 26 Mar 2025 16:27:51 +0100 Subject: [PATCH 09/12] Show full exercise info in gym mode This makes the ExerciseOverview smaller and more consistent See #301 --- .../routines/gym_mode/exercise_overview.dart | 46 ++++--------------- test/workout/gym_mode_screen_test.dart | 4 ++ 2 files changed, 13 insertions(+), 37 deletions(-) diff --git a/lib/widgets/routines/gym_mode/exercise_overview.dart b/lib/widgets/routines/gym_mode/exercise_overview.dart index 1d71102f..c4c25615 100644 --- a/lib/widgets/routines/gym_mode/exercise_overview.dart +++ b/lib/widgets/routines/gym_mode/exercise_overview.dart @@ -16,21 +16,19 @@ * along with this program. If not, see . */ import 'package:flutter/material.dart'; -import 'package:flutter_html/flutter_html.dart'; -import 'package:wger/helpers/i18n.dart'; import 'package:wger/models/exercises/exercise.dart'; -import 'package:wger/widgets/exercises/images.dart'; +import 'package:wger/widgets/exercises/exercises.dart'; import 'package:wger/widgets/routines/gym_mode/navigation.dart'; class ExerciseOverview extends StatelessWidget { final PageController _controller; - final Exercise _exerciseBase; + final Exercise _exercise; final double _ratioCompleted; final Map _exercisePages; const ExerciseOverview( this._controller, - this._exerciseBase, + this._exercise, this._ratioCompleted, this._exercisePages, ); @@ -40,43 +38,17 @@ class ExerciseOverview extends StatelessWidget { return Column( children: [ NavigationHeader( - _exerciseBase.getTranslation(Localizations.localeOf(context).languageCode).name, + _exercise.getTranslation(Localizations.localeOf(context).languageCode).name, _controller, exercisePages: _exercisePages, ), const Divider(), Expanded( - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 15), - children: [ - Text( - getTranslation(_exerciseBase.category!.name, context), - semanticsLabel: getTranslation(_exerciseBase.category!.name, context), - style: Theme.of(context).textTheme.titleLarge, - textAlign: TextAlign.center, - ), - ..._exerciseBase.equipment.map((e) => Text( - getTranslation(e.name, context), - style: Theme.of(context).textTheme.titleLarge, - textAlign: TextAlign.center, - )), - if (_exerciseBase.images.isNotEmpty) - SizedBox( - width: double.infinity, - height: 200, - child: ListView( - scrollDirection: Axis.horizontal, - children: [ - ..._exerciseBase.images.map((e) => ExerciseImageWidget(image: e)), - ], - ), - ), - Html( - data: _exerciseBase - .getTranslation(Localizations.localeOf(context).languageCode) - .description, - ), - ], + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: ExerciseDetail(_exercise), + ), ), ), NavigationFooter(_controller, _ratioCompleted), diff --git a/test/workout/gym_mode_screen_test.dart b/test/workout/gym_mode_screen_test.dart index f20df62c..6c420890 100644 --- a/test/workout/gym_mode_screen_test.dart +++ b/test/workout/gym_mode_screen_test.dart @@ -86,6 +86,10 @@ void main() { testWidgets('Test the widgets on the gym mode screen', (WidgetTester tester) async { when(mockExerciseProvider.findExerciseById(1)).thenReturn(testExercises[0]); when(mockExerciseProvider.findExerciseById(6)).thenReturn(testExercises[5]); + when(mockExerciseProvider.findExercisesByVariationId( + null, + exerciseIdToExclude: anyNamed('exerciseIdToExclude'), + )).thenReturn([]); await tester.pumpWidget(renderGymMode()); await tester.tap(find.byType(TextButton)); From ae64c2377de6fa6d213c6785bba5eb09957c8991 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Wed, 26 Mar 2025 18:28:55 +0100 Subject: [PATCH 10/12] update goldens --- .../goldens/routine_logs_screen_detail.png | Bin 176768 -> 179200 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/workout/goldens/routine_logs_screen_detail.png b/test/workout/goldens/routine_logs_screen_detail.png index 0af52b65a969d777b0b30072bf1b7fa51888c57c..f98c391246fd51dd00e98737cc16caab4424781e 100644 GIT binary patch delta 33489 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Ǚ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 From 3312da1f61706b646fa72726cb289037ace21f4a Mon Sep 17 00:00:00 2001 From: thisisyoussef Date: Sat, 19 Aug 2023 06:02:46 +0300 Subject: [PATCH 11/12] Fix rendering of muscles in MuscleWidget Ensure that when a muscle is both main and secondary, only the main muscle background is drawn. This addresses potential overlaps and redundant rendering in the MuscleWidget. --- lib/widgets/exercises/exercises.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/widgets/exercises/exercises.dart b/lib/widgets/exercises/exercises.dart index 74b6beed..60af3b76 100644 --- a/lib/widgets/exercises/exercises.dart +++ b/lib/widgets/exercises/exercises.dart @@ -338,7 +338,8 @@ class MuscleWidget extends StatelessWidget { this.isFront = true, }) { this.muscles = muscles.where((m) => m.isFront == isFront).toList(); - this.musclesSecondary = musclesSecondary.where((m) => m.isFront == isFront).toList(); + this.musclesSecondary = + musclesSecondary.where((m) => m.isFront == isFront).toList(); } @override @@ -349,7 +350,7 @@ class MuscleWidget extends StatelessWidget { children: [ SvgPicture.asset('assets/images/muscles/$background.svg'), ...muscles.map((m) => SvgPicture.asset('assets/images/muscles/main/muscle-${m.id}.svg')), - ...musclesSecondary.map((m) => SvgPicture.asset( + ...musclesSecondary.where((m) => !muscles.contains(m)).map((m) => SvgPicture.asset( 'assets/images/muscles/secondary/muscle-${m.id}.svg', )), ], From b1328fa048b2d385f01fbe91323be661b0a537e7 Mon Sep 17 00:00:00 2001 From: thisisyoussef Date: Wed, 26 Mar 2025 20:57:17 +0100 Subject: [PATCH 12/12] Added to AUTHORS.md --- AUTHORS.md | 1 + lib/widgets/exercises/exercises.dart | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index f4bf87d3..ff5b442f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -22,6 +22,7 @@ - Miroslav Mazel - - artchiee - - Tejas Bir Singh - +- Youssef Ahmed - - Abhishek Saini - - Hanaa Allohibi - - Shey Alnasrawi - diff --git a/lib/widgets/exercises/exercises.dart b/lib/widgets/exercises/exercises.dart index 60af3b76..25e58bf2 100644 --- a/lib/widgets/exercises/exercises.dart +++ b/lib/widgets/exercises/exercises.dart @@ -338,8 +338,7 @@ class MuscleWidget extends StatelessWidget { this.isFront = true, }) { this.muscles = muscles.where((m) => m.isFront == isFront).toList(); - this.musclesSecondary = - musclesSecondary.where((m) => m.isFront == isFront).toList(); + this.musclesSecondary = musclesSecondary.where((m) => m.isFront == isFront).toList(); } @override