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 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 4cf8375a..073681dc 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -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. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8eb14605..57d410b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 }} diff --git a/AUTHORS.md b/AUTHORS.md index f4bf87d3..f39c304f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -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 - -- Roland Geider – -- Dylan Aird - -- Jannik Norden - -- Arun Muralidharan - -- Khushbu Bora - -- Patrick Witter - -- Tomer Ben-Rachel - -- Thilina Herath - -- Marko Milosevic - -- Karthik Reddy (Axel) - -- Ogundoyin Toluwani - -- Nenza Nurfirmansyah - -- Florian Schmitz - -- Adam Bujdoš - -- Aman Negi - -- Sandi Milohanic - -- Miroslav Mazel - -- artchiee - -- Tejas Bir Singh - -- Abhishek Saini - -- Hanaa Allohibi - -- Shey Alnasrawi - -- Costas Korai - -- Bassam Mutairi - -- Dieter Plaetinck - -- Dennis van Peer - -- sizzlesloth - -- Arya Singh - -- Xianglin Zeng - -- Sangharsh Sulke - -- Yashas H Majmudar - +## 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 -- German +### Chinese (Traditional Han script) - - mondstern (2) - - J. Lavoie (19) - - Roland Geider (142) +- Peter Dave Hello - [https://github.com/PeterDaveHello](https://github.com/PeterDaveHello) -- English +### Polish - - Roland Geider (3) - - Allan Nordhøy (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 (2) - - DT (4) - - J. Lavoie (24) - - Stefano Rossi (120) +- Mladen Trišić - [https://github.com/mtrisic](https://github.com/mtrisic) -- Spanish +### Dutch - - Roland Geider (1) - - martingetzel (119) +- Joey Haalboom - [https://github.com/JoeyHaalboom](https://github.com/JoeyHaalboom) -- French +### Russian - - J. Lavoie (92) - - Stefano Rossi (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 (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 (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 (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 +- 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) diff --git a/README.md b/README.md index 2e0d16b9..cb728a73 100644 --- a/README.md +++ b/README.md @@ -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, we’d love your help! Whether it’s 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: - - - ## Translation Translate the app to your language on [Weblate](https://hosted.weblate.org/engage/wger/). 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 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/providers/auth.dart b/lib/providers/auth.dart index 2316f571..467489a0 100644 --- a/lib/providers/auth.dart +++ b/lib/providers/auth.dart @@ -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}; } diff --git a/lib/widgets/exercises/exercises.dart b/lib/widgets/exercises/exercises.dart index f07d162a..25e58bf2 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)); } @@ -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', )), ], 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, 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'), diff --git a/lib/widgets/nutrition/ingredient_dialogs.dart b/lib/widgets/nutrition/ingredient_dialogs.dart index ca48d4df..faf0f245 100644 --- a/lib/widgets/nutrition/ingredient_dialogs.dart +++ b/lib/widgets/nutrition/ingredient_dialogs.dart @@ -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 { 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/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/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" 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/goldens/routine_logs_screen_detail.png b/test/workout/goldens/routine_logs_screen_detail.png index 0af52b65..d4d99068 100644 Binary files a/test/workout/goldens/routine_logs_screen_detail.png and b/test/workout/goldens/routine_logs_screen_detail.png differ 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)); 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', ), ],