Merge branch 'master' into yhm/issue-731

This commit is contained in:
Roland Geider
2025-03-28 16:15:52 +01:00
committed by GitHub
30 changed files with 639 additions and 313 deletions

View File

@@ -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
<!-- Please include as many steps to reproduce so that we can replicate the problem. -->
1. ... <!-- describe how to reproduce the problem -->
2. ...
3. ...
**Expected results:** <!-- what did you expect to see? -->
**Actual results:** <!-- what did you see? -->
<details>
<summary>Logs</summary>
<!--
Any logs you think would be useful (if you have a local instance)
-->
```
```
</details>

53
.github/ISSUE_TEMPLATE/1_bug.yml vendored Normal file
View File

@@ -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://<server>/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

View File

@@ -1,26 +0,0 @@
---
name: Feature request
about: Suggest a new idea for wger.
title: ''
labels: ''
assignees: ''
---
## Use case
<!--
Please tell us the problem you are running into that led to you wanting
a new feature.
Is your feature request related to a problem? Please give a clear and
concise description of what the problem is.
-->
## Proposal
<!--
Briefly but precisely describe what you would like wger to be able to do.
Consider attaching images showing what you are imagining.
-->

View File

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

View File

@@ -1,25 +1,17 @@
## Description (Proposed Changes)
(Please try to mention in bullet points.)
# Proposed Changes
-
-
## Link to the issue :
## Related Issue(s)
(Add link of the issue you have proposed changes to)
If applicable, please link to any related issues (`Closes #123`,
`Closes wger-project/other-repo#123`, `See also #123`, etc.)
- Link :
## Please check that the PR fulfills these requirements
## Tests
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.
- [ ] Set a 100 character limit in your editor/IDE to avoid white space diffs in the PR
- [ ] Tests for the changes have been added (for bug fixes / features)
- [ ] Added yourself to AUTHORS.md
- [ ] Set a 100 character limit in your editor/IDE to avoid white space diffs in the PR
(run `dart format --line-length=100 .`)
- [ ] Updated/added relevant documentation (doc comments with `///`).
- [ ] Added relevant reviewers.

View File

@@ -35,6 +35,6 @@ jobs:
run: flutter test --coverage
- name: Coveralls
uses: coverallsapp/github-action@master
uses: coverallsapp/github-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,85 +1,350 @@
# Authors
# Contributors and translators to this repository
## Developers
Thank you all for contributing to the project, you are true heroes! 🫶
- 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>
- Arun Muralidharan - <https://github.com/arun-muralidharan>
- Khushbu Bora - <https://github.com/KhushbuBora>
- Patrick Witter - <https://github.com/patrickwitter>
- Tomer Ben-Rachel - <https://github.com/tomerpacific>
- Thilina Herath - <https://github.com/ThilinaTCH>
- Marko Milosevic - <https://github.com/TaarnStar>
- Karthik Reddy (Axel) - <https://github.com/AxelBlaz3>
- Ogundoyin Toluwani - <https://github.com/Tolu007>
- Nenza Nurfirmansyah - <https://github.com/nenzan>
- Florian Schmitz - <https://github.com/floodoo>
- Adam Bujdoš - <https://github.com/bujdy>
- 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>
- Abhishek Saini - <https://github.com/Abhisheksainii>
- Hanaa Allohibi - <https://github.com/hn-n>
- Shey Alnasrawi - <https://github.com/Milksheyke>
- Costas Korai - <https://github.com/watcher6280>
- Bassam Mutairi - <https://github.com/mutairibassam>
- Dieter Plaetinck - <https://github.com/Dieterbe>
- Dennis van Peer - <https://github.com/Denpeer>
- sizzlesloth - <https://github.com/sizzlesloth>
- Arya Singh - <https://github.com/ARYPROGRAMMER>
- Xianglin Zeng - <https://github.com/FutureYL3>
- Sangharsh Sulke - <https://github.com/Sangharshdeveloper>
- Yashas H Majmudar - <https://github.com/yashas-hm>
## Contributors
- thisisyoussef - [https://github.com/thisisyoussef](https://github.com/thisisyoussef)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- Yashas H Majmudar - [https://github.com/yashas-hm](https://github.com/yashas-hm)
- Github-actions - [https://github.com/invalid-email-address](https://github.com/invalid-email-address)
- Christijan - [https://github.com/ChrispyM](https://github.com/ChrispyM)
- Jackpkn - [https://github.com/Jackpkn](https://github.com/Jackpkn)
- sangharshdeveloper - [https://github.com/Sangharshdeveloper](https://github.com/Sangharshdeveloper)
- ImgBotApp - [https://github.com/ImgBotApp](https://github.com/ImgBotApp)
- தமிழ்நேரம் - [https://github.com/TamilNeram](https://github.com/TamilNeram)
- Xianglin Zeng - [https://github.com/FutureYL3](https://github.com/FutureYL3)
- Arya Pratap Singh - [https://github.com/ARYPROGRAMMER](https://github.com/ARYPROGRAMMER)
- ARYPROGRAMMER - [https://github.com/ARYPROGRAMMER](https://github.com/ARYPROGRAMMER)
- Dieter Plaetinck - [https://github.com/Dieterbe](https://github.com/Dieterbe)
- szalas - [https://github.com/szalas](https://github.com/szalas)
- dan - [https://github.com/sizzlesloth](https://github.com/sizzlesloth)
- DVPeer - [https://github.com/Denpeer](https://github.com/Denpeer)
- Marco Rimoldi - [https://github.com/marcor](https://github.com/marcor)
- Licaon_Kter - [https://github.com/licaon-kter](https://github.com/licaon-kter)
- Bassam A - [https://github.com/mutairibassam](https://github.com/mutairibassam)
- Costas Korai
- null - [https://github.com/hn-n](https://github.com/hn-n)
- Miroslav Mazel
- Milksheyke - [https://github.com/sheyaln](https://github.com/sheyaln)
- Abhishek Saini - [https://github.com/Abhisheksainii](https://github.com/Abhisheksainii)
- dimii27 - [https://github.com/dimii27](https://github.com/dimii27)
- Antonis-geo - [https://github.com/Antonis-geo](https://github.com/Antonis-geo)
- artchiee - [https://github.com/artchiee](https://github.com/artchiee)
- artchiee - [https://github.com/artchiee](https://github.com/artchiee)
- Jigar Prajapati - [https://github.com/Jiggy9](https://github.com/Jiggy9)
- Dalton Scavassa
- Jigar - [https://github.com/Jiggy9](https://github.com/Jiggy9)
- Deepanshu - [https://github.com/Deepanshu-Sharma-18](https://github.com/Deepanshu-Sharma-18)
- tejasbirsingh - [https://github.com/tejasbirsingh](https://github.com/tejasbirsingh)
- Freddy Cunningham - [https://github.com/freddy-c](https://github.com/freddy-c)
- Freddy Cunningham - [https://github.com/freddy-c](https://github.com/freddy-c)
- Malay Pandit - [https://github.com/DeveloperMalay](https://github.com/DeveloperMalay)
- Mirek Mazel - [https://github.com/12people](https://github.com/12people)
- Miroslav Mazel
- Roman Kalivoda - [https://github.com/RKCZ](https://github.com/RKCZ)
- Tiisetso Dinoko - [https://github.com/Dinokojt7](https://github.com/Dinokojt7)
- Harshit - [https://github.com/Harshit933](https://github.com/Harshit933)
- Harshit - [https://github.com/Harshit933](https://github.com/Harshit933)
- Raman Tank - [https://github.com/raman04-byte](https://github.com/raman04-byte)
- Mohammad Rafigh - [https://github.com/mohammadrafigh](https://github.com/mohammadrafigh)
- Edmundo Meyer - [https://github.com/e-meyer](https://github.com/e-meyer)
- Bujdy - [https://github.com/bujdy](https://github.com/bujdy)
- amannegi - [https://github.com/AmanNegi](https://github.com/AmanNegi)
- Aman Negi - [https://github.com/AmanNegi](https://github.com/AmanNegi)
- Aaliya Ali - [https://github.com/Aaliya-Ali](https://github.com/Aaliya-Ali)
- Aaliya Ali - [https://github.com/Aaliya-Ali](https://github.com/Aaliya-Ali)
- Sandi Milohanic
- Hissabat Manager - [https://github.com/Chinguetti-Quizz](https://github.com/Chinguetti-Quizz)
- Nenza Nurfirmansyah - [https://github.com/nenzan](https://github.com/nenzan)
- Vinod - [https://github.com/skdotv](https://github.com/skdotv)
- Aditya - [https://github.com/adeeteya](https://github.com/adeeteya)
- JustinBenito - [https://github.com/JustinBenito](https://github.com/JustinBenito)
- Florian Schmitz - [https://github.com/floodoo](https://github.com/floodoo)
- avinash - [https://github.com/HeyAvi](https://github.com/HeyAvi)
- Tolu ogundoyin - [https://github.com/Tolu007](https://github.com/Tolu007)
- Daniil Kovalev - [https://github.com/kovdan01](https://github.com/kovdan01)
- Saint Gabriel - [https://github.com/saintgabriel0](https://github.com/saintgabriel0)
- Artem - [https://github.com/defaultpage](https://github.com/defaultpage)
- WMs784 - [https://github.com/WMs784](https://github.com/WMs784)
- KenXRan - [https://github.com/kenxran](https://github.com/kenxran)
- João Goulart - [https://github.com/usehalter](https://github.com/usehalter)
- yaseenagwan - [https://github.com/agwanyaseen](https://github.com/agwanyaseen)
- G. Buendía - [https://github.com/gbuendia](https://github.com/gbuendia)
- Sylvia van Os - [https://github.com/TheLastProject](https://github.com/TheLastProject)
- Debayan Sutradhar - [https://github.com/rnayabed](https://github.com/rnayabed)
- Poussinou - [https://github.com/Poussinou](https://github.com/Poussinou)
- Nikita Epifanov
- Ady - [https://github.com/adyhnat](https://github.com/adyhnat)
- Adrian Halko
- Tomáš Konkoľ - [https://github.com/TomasKonkol](https://github.com/TomasKonkol)
- Marko Milosevic - [https://github.com/TaarnStar](https://github.com/TaarnStar)
- Sandi Milohanić - [https://github.com/sandimilohanic](https://github.com/sandimilohanic)
- AxelBlaz3 - [https://github.com/AxelBlaz3](https://github.com/AxelBlaz3)
- Marvin M - [https://github.com/M123-dev](https://github.com/M123-dev)
- himikat89 - [https://github.com/himikat89](https://github.com/himikat89)
- infiniteoverflow - [https://github.com/infiniteoverflow](https://github.com/infiniteoverflow)
- Tomer Ben Rachel - [https://github.com/TomerPacific](https://github.com/TomerPacific)
- Thilina TCH - [https://github.com/ThilinaTCH](https://github.com/ThilinaTCH)
- Thilina Herath - [https://github.com/thilinatnt](https://github.com/thilinatnt)
- ToldYouThat
- Yair Chen - [https://github.com/chenyair](https://github.com/chenyair)
- henok3878 - [https://github.com/henok3878](https://github.com/henok3878)
- Patrick Witter - [https://github.com/patrickwitter](https://github.com/patrickwitter)
- ton-An - [https://github.com/ton-An](https://github.com/ton-An)
- Prakash Shekhar - [https://github.com/prakash-shekhar](https://github.com/prakash-shekhar)
- Khushbu Bora - [https://github.com/KhushbuBora](https://github.com/KhushbuBora)
- Arun Muralidharan - [https://github.com/arun-muralidharan](https://github.com/arun-muralidharan)
- yiter
- Henio Szewczyk - [https://github.com/hszewczyk](https://github.com/hszewczyk)
- Jannik Norden
- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
- Stefano Rossi - [https://github.com/stefanorossiti](https://github.com/stefanorossiti)
- Dylan Aird - [https://github.com/Dolaned](https://github.com/Dolaned)
## Translators
- Saudi Arabian
- Hanaa Allohibi <Gmail: programmerHanaa>
- German
### Chinese (Traditional Han script)
- mondstern <mondstern@snopyta.org> (2)
- J. Lavoie <j.lavoie@net-c.ca> (19)
- Roland Geider <roland@geider.net> (142)
- Peter Dave Hello - [https://github.com/PeterDaveHello](https://github.com/PeterDaveHello)
- English
### Polish
- Roland Geider <roland@geider.net> (3)
- Allan Nordhøy <epost@anotheragency.no> (8)
- Karol Solecki - [https://github.com/karolsol](https://github.com/karolsol)
- Piotr Strebski - [https://github.com/strebski](https://github.com/strebski)
- Dawid Panyło
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Marcin Schoenknecht
- Patryk - [https://github.com/byakurau](https://github.com/byakurau)
- Michał Homza - [https://github.com/HagiaHaya](https://github.com/HagiaHaya)
- Jacob - [https://github.com/devzom](https://github.com/devzom)
- Italian
### Serbian
- mondstern <mondstern@snopyta.org> (2)
- DT <semperpeppe@tracciabi.li> (4)
- J. Lavoie <j.lavoie@net-c.ca> (24)
- Stefano Rossi <stefanorossi.ti@gmail.com> (120)
- Mladen Trišić - [https://github.com/mtrisic](https://github.com/mtrisic)
- Spanish
### Dutch
- Roland Geider <roland@geider.net> (1)
- martingetzel <martingetzel@gmail.com> (119)
- Joey Haalboom - [https://github.com/JoeyHaalboom](https://github.com/JoeyHaalboom)
- French
### Russian
- J. Lavoie <j.lavoie@net-c.ca> (92)
- Stefano Rossi <stefanorossi.ti@gmail.com> (94)
- Алексей Курышко - [https://github.com/alexkuryshko](https://github.com/alexkuryshko)
- lightningcpu - [https://github.com/lightningcpu](https://github.com/lightningcpu)
- Кирилл Александрович Злобин - [https://github.com/gungstarbeiter](https://github.com/gungstarbeiter)
- Ivan Katkov - [https://github.com/Porphyrion](https://github.com/Porphyrion)
- Nikita Epifanov
- Norwegian Bokmål
### Croatian
- Allan Nordhøy <epost@anotheragency.no> (98)
- Milo Ivir - [https://github.com/milotype](https://github.com/milotype)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- SMilohanic - [https://github.com/sandimilohanic](https://github.com/sandimilohanic)
- Japanese
### Portuguese
- Kosei TANAKA <wms784.app@gmail.com> (97)
- Edson Wolf - [https://github.com/edsonblwolf](https://github.com/edsonblwolf)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Wilton Rodrigues
- Guilherme Salomão - [https://github.com/salomaoparkour](https://github.com/salomaoparkour)
- Bruno de Moura - [https://github.com/bruunomooura](https://github.com/bruunomooura)
- Dalton Scavassa
- Stefan Taiguara - [https://github.com/Teitei011](https://github.com/Teitei011)
- Eduardo Menges Mattje - [https://github.com/EduMenges](https://github.com/EduMenges)
- Edu Cavalheiro - [https://github.com/EduCavalheiro](https://github.com/EduCavalheiro)
- João Goulart - [https://github.com/usehalter](https://github.com/usehalter)
- Bahasa Indonesia
### Italian
- Nenza Nurfirmansyah <nnurfirmansyah@gmail.com> (73)
- Antenore Gatta - [https://github.com/antenore](https://github.com/antenore)
- Gab Gat
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Federico Pierantoni - [https://github.com/F3FFO](https://github.com/F3FFO)
- oarion - [https://github.com/oarion](https://github.com/oarion)
- Alessandro Faucci - [https://github.com/Dhy19971](https://github.com/Dhy19971)
- Sfizio Purea
- Mirko Ferrati - [https://github.com/MirkoFerrati](https://github.com/MirkoFerrati)
- Stefano Camillo - [https://github.com/djste](https://github.com/djste)
- MARCO ACORTE - [https://github.com/marco-acorte](https://github.com/marco-acorte)
- J. Lavoie
- DT
- mondstern
- Stefano Rossi - [https://github.com/stefanorossiti](https://github.com/stefanorossiti)
- Croatian
### French
- Sandi Milohaic <sandi.milohanic@gmail.com>
- William - [https://github.com/WilliamR312](https://github.com/WilliamR312)
- florent4014 - [https://github.com/florent4014](https://github.com/florent4014)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Xav Basco
- David Olewski - [https://github.com/Arigowin](https://github.com/Arigowin)
- yoyomax80400 - [https://github.com/yoyomax80400](https://github.com/yoyomax80400)
- loued - [https://github.com/Loued](https://github.com/Loued)
- Célian
- MrSniikyz - [https://github.com/BabyGeek](https://github.com/BabyGeek)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- J. Lavoie
- Antoine Vibien - [https://github.com/r1llettes](https://github.com/r1llettes)
- Stefano Rossi - [https://github.com/stefanorossiti](https://github.com/stefanorossiti)
### Ukrainian
- Максим Горпиніч - [https://github.com/Maksim2005UA](https://github.com/Maksim2005UA)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- Максим Горпиніч
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Dan - [https://github.com/Kefir2105](https://github.com/Kefir2105)
- Dan
- Tymofii Lytvynenko
- Artem - [https://github.com/defaultpage](https://github.com/defaultpage)
### Portuguese (Brazil)
- Ricardo Lima - [https://github.com/rhrlima](https://github.com/rhrlima)
- Clerton Araujo - [https://github.com/clertonraf](https://github.com/clertonraf)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Wilton Rodrigues
- Nao interessa
- Lucas Mezêncio - [https://github.com/lucasmezencio](https://github.com/lucasmezencio)
- Felipe Antônio Rodrigues Cardoso
- Luigi Henrick Feitoza Silva - [https://github.com/luigihenrick](https://github.com/luigihenrick)
- João Hortêncio Moraes - [https://github.com/joaohortencio](https://github.com/joaohortencio)
### Tamil
- தமிழ்நேரம் - [https://github.com/TamilNeram](https://github.com/TamilNeram)
### Chinese (Simplified Han script)
- Herb Huang
### Hindi
- pavan arun bagwe - [https://github.com/pavanb0](https://github.com/pavanb0)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Debayan Sutradhar - [https://github.com/rnayabed](https://github.com/rnayabed)
### Turkish
- Oğuz Ersen - [https://github.com/oersen](https://github.com/oersen)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- Cem Avcı - [https://github.com/cem256](https://github.com/cem256)
- Oğuz Ersen
- Cenk Cidecio - [https://github.com/ccidecio](https://github.com/ccidecio)
- ToldYouThat
### German
- kvnrmnn - [https://github.com/rmnn92](https://github.com/rmnn92)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- Victor Jouhoff - [https://github.com/jouhoffv](https://github.com/jouhoffv)
- m4skedbyte
- Axel Steinbrecher
- Christoph Suesser - [https://github.com/TheFitzZZ](https://github.com/TheFitzZZ)
- Luis Lüscher - [https://github.com/lslschr](https://github.com/lslschr)
- mondstern
- J. Lavoie
- Marvin M - [https://github.com/M123-dev](https://github.com/M123-dev)
- Lydia
- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
### Indonesian
- aryakdaniswara - [https://github.com/aryakdaniswara](https://github.com/aryakdaniswara)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Debi Maulana Ahsan Halla
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
### Catalan
- Zixu Sun - [https://github.com/ziixu](https://github.com/ziixu)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- guillem - [https://github.com/gbuendia](https://github.com/gbuendia)
### Chinese (Simplified)
- 纪颖志 - [https://github.com/jiyingzhi](https://github.com/jiyingzhi)
- Yi-Han Hsiung - [https://github.com/AaronHsiung](https://github.com/AaronHsiung)
- Tsz Hong CHAN - [https://github.com/tomyan112](https://github.com/tomyan112)
- Eddie Tang - [https://github.com/EDED2314](https://github.com/EDED2314)
- Jing - [https://github.com/jingcheng16](https://github.com/jingcheng16)
- sr-c - [https://github.com/sr-c](https://github.com/sr-c)
- tony - [https://github.com/tonyxxliu](https://github.com/tonyxxliu)
- yiter
### Greek
- Dimitrys Meliates
- Antonis-geo - [https://github.com/Antonis-geo](https://github.com/Antonis-geo)
### Czech
- Fjuro - [https://github.com/Fjuro](https://github.com/Fjuro)
- Fjuro
- CaptainDolphy - [https://github.com/CaptainDolphy](https://github.com/CaptainDolphy)
- Roman Kalivoda - [https://github.com/RKCZ](https://github.com/RKCZ)
### Arabic
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Hanaa - [https://github.com/hn-n](https://github.com/hn-n)
- Ahmed zein - [https://github.com/Ahmed-Zein](https://github.com/Ahmed-Zein)
### Hebrew
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- n,rdo
- Tomer Ben Rachel - [https://github.com/TomerPacific](https://github.com/TomerPacific)
### Japanese
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Tsz Hong CHAN - [https://github.com/tomyan112](https://github.com/tomyan112)
- sasukeiscool - [https://github.com/sasukeiscool](https://github.com/sasukeiscool)
- yiter
### Spanish
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
- Roberto Iglesias - [https://github.com/iglesiasroberto14](https://github.com/iglesiasroberto14)
- c06c3abb8f
- Javier - [https://github.com/dysk0zero](https://github.com/dysk0zero)
- facu-d - [https://github.com/facu-d](https://github.com/facu-d)
- Biologia Libros - [https://github.com/bio201922](https://github.com/bio201922)
- guillem - [https://github.com/gbuendia](https://github.com/gbuendia)
- Chris Klempau - [https://github.com/yoinkers1337](https://github.com/yoinkers1337)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- martingetzel - [https://github.com/martingetzel](https://github.com/martingetzel)
### Chinese (Traditional)
- hugoalh
- Tsz Hong CHAN - [https://github.com/tomyan112](https://github.com/tomyan112)
- Chung-Wei Chung - [https://github.com/webb790709](https://github.com/webb790709)
- HY Cheng
### Portuguese (Portugal)
- Anonymous - [https://github.com/weblate](https://github.com/weblate)
### Romanian
- Bogdan Bujor - [https://github.com/qSharpy](https://github.com/qSharpy)
- dimii27 - [https://github.com/dimii27](https://github.com/dimii27)
### English
- guillem - [https://github.com/gbuendia](https://github.com/gbuendia)
- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
### Norwegian Bokmål
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)
### Amharic
- henok3878 - [https://github.com/henok3878](https://github.com/henok3878)

View File

@@ -24,20 +24,33 @@ height="80">](https://play.google.com/store/apps/details?id=de.wger.flutter)
alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/de.wger.flutter/)
## Development
## Developing and contributing
This is a regular flutter application, so you basically just run `flutter run` in
the root directory of the project, and optionally use the test server to login
(the db is reset daily):
Our goal is to build an awesome and flexible fitness and nutrition manager,
along with a comprehensive list of exercises and ingredients, all released
under a free license.
For this, wed love your help! Whether its code, translations, exercises or
reporting issues and ideas, check out our
[contribution guide](https://wger.readthedocs.io/en/latest/contributing.html)
to get started.
A huge thank you to everyone who has contributed so far! ❤️ See the full list
in [AUTHORS.md](AUTHORS.md).
**TLDR**
```bash
flutter run
```
This is a regular flutter application, so there's no magic. You will need a backend
for this, so feel free to use the test server for this (the db is reset daily):
* URL: `https://wger-master.rge.uber.space`
* username: `user`
* password: `flutteruser`
For more information consult the development documentation:
<https://wger.readthedocs.io/en/latest/development/mobile_app.html>
## Translation
Translate the app to your language on [Weblate](https://hosted.weblate.org/engage/wger/).

View File

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

View File

@@ -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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
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 = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
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 = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
/* 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 = "<group>";
@@ -87,7 +87,7 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
BB0286322FD60C00014F981C /* Pods */,
631B4307BD65C9D08E514EBB /* Frameworks */,
23E168F95D2790D29E207E68 /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -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 = "<group>";
@@ -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;

View File

@@ -50,6 +50,7 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">

1
ios/build/.last_build_id Normal file
View File

@@ -0,0 +1 @@
ce49e7d90cd902197f9a9cbc84219d23

View File

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

View File

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

View File

@@ -34,8 +34,8 @@ Log _$LogFromJson(Map<String, dynamic> 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,

View File

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

View File

@@ -50,9 +50,9 @@ SetConfigData _$SetConfigDataFromJson(Map<String, dynamic> 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? ?? '',

View File

@@ -160,7 +160,10 @@ class AuthProvider with ChangeNotifier {
await initVersions(serverUrl);
// If update is required don't log in user
if (await applicationUpdateRequired()) {
if (await applicationUpdateRequired(
applicationVersion!.version,
{MANIFEST_KEY_CHECK_UPDATE: 'true'},
)) {
return {'action': LoginActions.update};
}

View File

@@ -193,7 +193,10 @@ class ExerciseDetail extends StatelessWidget {
// TODO: add carousel for the other images
final List<Widget> 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));
}
@@ -346,7 +349,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',
)),
],

View File

@@ -48,7 +48,7 @@ class _ExerciseFilterModalBodyState extends State<ExerciseFilterModalBody> {
dividerColor: Colors.transparent,
expansionCallback: (panelIndex, isExpanded) {
setState(() {
filters.filterCategories[panelIndex].isExpanded = !isExpanded;
filters.filterCategories[panelIndex].isExpanded = isExpanded;
});
},
elevation: 0,

View File

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

View File

@@ -1,3 +1,5 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:wger/helpers/misc.dart';
import 'package:wger/l10n/generated/app_localizations.dart';
@@ -10,13 +12,62 @@ Widget ingredientImage(String url, BuildContext context) {
final height = MediaQuery.sizeOf(context).height;
final width = MediaQuery.sizeOf(context).width;
final smallest = height < width ? height : width;
if (smallest < 400) {
radius = smallest / 4;
if (smallest > 400) {
radius = smallest / 2.5;
}
final imageProvider = NetworkImage(url);
return Padding(
padding: const EdgeInsets.only(bottom: 12),
child: CircleAvatar(backgroundImage: NetworkImage(url), radius: radius),
child: ClipRRect(
borderRadius: BorderRadius.circular(15),
child: Container(
height: radius,
width: width,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
),
child: Stack(
children: [
Image(
image: imageProvider,
height: radius,
width: width,
fit: BoxFit.cover,
),
BackdropFilter(
filter: ImageFilter.blur(
sigmaY: 5,
sigmaX: 5,
),
child: Container(
height: radius,
width: width,
color: Colors.transparent,
),
),
Center(
child: Padding(
padding: const EdgeInsets.all(10),
child: Container(
clipBehavior: Clip.hardEdge,
decoration: const BoxDecoration(shape: BoxShape.circle),
child: Image(
image: imageProvider,
height: radius,
width: width,
fit: BoxFit.contain,
),
),
),
)
],
),
),
),
);
// CircleAvatar(backgroundImage: NetworkImage(url), radius: radius)
}
class IngredientDetails extends StatelessWidget {

View File

@@ -16,21 +16,19 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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<Exercise, int> _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),

View File

@@ -274,7 +274,7 @@ class _LogPageState extends State<LogPage> {
),
if (_detailed)
RiRInputWidget(
widget._log.rir == null ? null : num.parse(widget._log.rir!),
widget._log.rir,
onChanged: (v) => {},
),
SwitchListTile(

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 175 KiB

View File

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

View File

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

View File

@@ -50,7 +50,7 @@ Routine getTestRoutine({List<Exercise>? 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<Exercise>? 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<Exercise>? 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<Exercise>? 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<Exercise>? 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<Exercise>? 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<Exercise>? exercises}) {
weight: 10,
weightUnit: testWeightUnit1,
restTime: null,
rir: '',
rpe: '',
rir: null,
rpe: null,
textRepr: '12x10kg',
),
SetConfigData(
@@ -311,8 +311,8 @@ Routine getTestRoutine({List<Exercise>? exercises}) {
weight: 10,
weightUnit: testWeightUnit1,
restTime: null,
rir: '',
rpe: '',
rir: null,
rpe: null,
textRepr: '12x10kg',
),
SetConfigData(
@@ -325,8 +325,8 @@ Routine getTestRoutine({List<Exercise>? exercises}) {
weight: 10,
weightUnit: testWeightUnit1,
restTime: null,
rir: '',
rpe: '',
rir: null,
rpe: null,
textRepr: '12x10kg',
),
],
@@ -354,8 +354,8 @@ Routine getTestRoutine({List<Exercise>? 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<Exercise>? 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<Exercise>? 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<Exercise>? 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<Exercise>? exercises}) {
weight: 10,
weightUnit: testWeightUnit1,
restTime: 60,
rir: '',
rpe: '',
rir: null,
rpe: null,
textRepr: '4 sets 12x10kg',
),
],
@@ -464,8 +464,8 @@ Routine getTestRoutine({List<Exercise>? exercises}) {
weight: 100,
weightUnit: testWeightUnit1,
restTime: 120,
rir: '1.5',
rpe: '8',
rir: 1.5,
rpe: 8,
textRepr: '4 sets 3x100kg',
),
],