Compare commits

...

81 Commits
2.3.3 ... beta

Author SHA1 Message Date
vabene1111
d26faf14b1 Merge branch 'develop' into beta 2025-11-11 15:42:55 +01:00
vabene1111
d5d5c2c52b Merge pull request #4159 from erikbledsoe/patch-1
documentation typo
2025-11-11 15:42:05 +01:00
vabene1111
7ffabfe711 Merge pull request #4166 from EifX/docs/apache-reverse-proxy
feat: add apache reverse proxy documentation
2025-11-11 15:41:13 +01:00
vabene1111
49e0b5b962 improve handling of vuetify locale 2025-11-11 15:40:50 +01:00
vabene1111
a05f1ece24 updated recipe scrapers 2025-11-11 14:45:34 +01:00
vabene1111
748b91bb8a improve servings parsing and AI failure logging 2025-11-11 14:44:09 +01:00
vabene1111
bd2e9cc3d9 Merge branch 'develop' of https://github.com/vabene1111/recipes into develop 2025-11-11 14:16:37 +01:00
vabene1111
c40bb20a7a fixed copying meal plans did not add to shopping 2025-11-11 14:16:32 +01:00
vabene1111
b377d2cd35 Merge pull request #4192 from Daan5556/patch-1
Docs: Added trailing slash to `system` path
2025-11-11 14:12:17 +01:00
vabene1111
dc0e91d0f9 Merge pull request #4193 from ThomasLeister/patch-1
Update manual setup instructions: vue is now vue3
2025-11-11 14:11:26 +01:00
vabene1111
5f12907544 fixed edge case where no recipe is displayed in a mostly empty space 2025-11-11 14:09:02 +01:00
vabene1111
889ddac7dc remove debug button from message dialog and added button to open it 2025-11-11 13:41:14 +01:00
vabene1111
b369e2618a fixed decimals in share view 2025-11-11 13:06:56 +01:00
vabene1111
5a4e0204c9 fixed debug toolbar setup 2025-11-11 12:59:45 +01:00
vabene1111
bfc2e96b54 Merge pull request #4101 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vuetify-3.10.3
Bump vuetify from 3.9.7 to 3.10.3 in /vue3
2025-11-11 12:51:23 +01:00
vabene1111
f065ef80aa Merge pull request #4100 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vueuse/router-13.9.0
Bump @vueuse/router from 13.6.0 to 13.9.0 in /vue3
2025-11-11 12:51:11 +01:00
vabene1111
61c14b8b05 Merge pull request #4099 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vue/tsconfig-0.8.1
Bump @vue/tsconfig from 0.7.0 to 0.8.1 in /vue3
2025-11-11 12:51:03 +01:00
vabene1111
35d5d64809 Merge pull request #4096 from TandoorRecipes/dependabot/pip/lxml-6.0.2
Bump lxml from 5.3.1 to 6.0.2
2025-11-11 12:50:52 +01:00
vabene1111
63c711d18c Merge pull request #4094 from TandoorRecipes/dependabot/pip/pytest-8.4.2
Bump pytest from 8.4.1 to 8.4.2
2025-11-11 12:50:42 +01:00
vabene1111
59e3ea70d1 Merge pull request #4095 from TandoorRecipes/dependabot/pip/django-debug-toolbar-6.0.0
Bump django-debug-toolbar from 4.3.0 to 6.0.0
2025-11-11 12:50:19 +01:00
vabene1111
6771662a9f Merge pull request #4092 from TandoorRecipes/dependabot/pip/pyyaml-6.0.3
Bump pyyaml from 6.0.2 to 6.0.3
2025-11-11 12:49:29 +01:00
vabene1111
9b792a1393 Merge pull request #4093 from TandoorRecipes/dependabot/pip/drf-spectacular-0.28.0
Bump drf-spectacular from 0.27.1 to 0.28.0
2025-11-11 12:49:19 +01:00
vabene1111
862957c121 Merge pull request #4098 from TandoorRecipes/dependabot/github_actions/actions/setup-python-6
Bump actions/setup-python from 5 to 6
2025-11-11 12:48:50 +01:00
vabene1111
bdcbafd52f Merge pull request #4200 from TandoorRecipes/dependabot/github_actions/github/codeql-action-4
Bump github/codeql-action from 3 to 4
2025-11-11 12:48:26 +01:00
vabene1111
5e454a5212 Merge pull request #4201 from TandoorRecipes/dependabot/github_actions/actions/setup-node-6
Bump actions/setup-node from 4 to 6
2025-11-11 12:48:18 +01:00
vabene1111
20bea63997 Merge pull request #4202 from TandoorRecipes/dependabot/github_actions/awalsh128/cache-apt-pkgs-action-1.6.0
Bump awalsh128/cache-apt-pkgs-action from 1.5.3 to 1.6.0
2025-11-11 12:48:09 +01:00
vabene1111
8a265772c0 Merge pull request #4211 from TandoorRecipes/dependabot/pip/django-5.2.8
Bump django from 5.2.7 to 5.2.8
2025-11-11 12:47:16 +01:00
vabene1111
6febb4e3e8 Merge pull request #4174 from TandoorRecipes/dependabot/npm_and_yarn/vue3/vite-7.1.11
Bump vite from 7.1.5 to 7.1.11 in /vue3
2025-11-11 12:47:00 +01:00
vabene1111
04f9167fd8 Merge branch 'develop-weblate' into develop
# Conflicts:
#	cookbook/locale/nl/LC_MESSAGES/django.po
#	cookbook/locale/uk/LC_MESSAGES/django.po
#	vue3/src/locales/de.json
#	vue3/src/locales/en.json
#	vue3/src/locales/nl.json
#	vue3/src/locales/sl.json
#	vue3/src/locales/uk.json
2025-11-11 12:27:48 +01:00
dependabot[bot]
8f29e01daf Bump django from 5.2.7 to 5.2.8
Bumps [django](https://github.com/django/django) from 5.2.7 to 5.2.8.
- [Commits](https://github.com/django/django/compare/5.2.7...5.2.8)

---
updated-dependencies:
- dependency-name: django
  dependency-version: 5.2.8
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-05 20:17:31 +00:00
Erik Bledsoe
e810363b22 Merge branch 'develop' into patch-1 2025-11-01 07:05:19 -04:00
tan
b5a2120bdf Added translation using Weblate (Korean) 2025-11-01 10:09:09 +00:00
tan
643fcbad9b Added translation using Weblate (Korean) 2025-11-01 10:09:09 +00:00
dependabot[bot]
4a3b834463 Bump awalsh128/cache-apt-pkgs-action from 1.5.3 to 1.6.0
Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.5.3 to 1.6.0.
- [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases)
- [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.5.3...v1.6.0)

---
updated-dependencies:
- dependency-name: awalsh128/cache-apt-pkgs-action
  dependency-version: 1.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 00:02:12 +00:00
dependabot[bot]
003149133a Bump actions/setup-node from 4 to 6
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 00:02:10 +00:00
dependabot[bot]
a43de0ca4d Bump github/codeql-action from 3 to 4
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 00:02:06 +00:00
Thomas Leister
e05aaed75c Update manual setup instructions: vue is now vue3
The documentation has not been updated: "vue" directory is now "vue3".
2025-10-27 13:36:57 +01:00
Daan5556
4984e3e31b Added trailing slash to system path 2025-10-27 13:03:53 +01:00
dependabot[bot]
11dce4c6ad Bump vite from 7.1.5 to 7.1.11 in /vue3
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.5 to 7.1.11.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.11
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-20 22:56:53 +00:00
Alexander Eifler
8d0d338ea2 feat: add apache reverse proxy documentation 2025-10-15 20:56:39 +02:00
Erik Bledsoe
d7b26d1b29 documentation typo 2025-10-13 13:44:15 -04:00
dependabot[bot]
e292b72e34 Bump vuetify from 3.9.7 to 3.10.3 in /vue3
Bumps [vuetify](https://github.com/vuetifyjs/vuetify/tree/HEAD/packages/vuetify) from 3.9.7 to 3.10.3.
- [Release notes](https://github.com/vuetifyjs/vuetify/releases)
- [Commits](https://github.com/vuetifyjs/vuetify/commits/v3.10.3/packages/vuetify)

---
updated-dependencies:
- dependency-name: vuetify
  dependency-version: 3.10.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:34:43 +00:00
dependabot[bot]
4e795ecf55 Bump @vueuse/router from 13.6.0 to 13.9.0 in /vue3
Bumps [@vueuse/router](https://github.com/vueuse/vueuse/tree/HEAD/packages/router) from 13.6.0 to 13.9.0.
- [Release notes](https://github.com/vueuse/vueuse/releases)
- [Commits](https://github.com/vueuse/vueuse/commits/v13.9.0/packages/router)

---
updated-dependencies:
- dependency-name: "@vueuse/router"
  dependency-version: 13.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:34:23 +00:00
dependabot[bot]
e3c2a66723 Bump @vue/tsconfig from 0.7.0 to 0.8.1 in /vue3
Bumps [@vue/tsconfig](https://github.com/vuejs/tsconfig) from 0.7.0 to 0.8.1.
- [Release notes](https://github.com/vuejs/tsconfig/releases)
- [Commits](https://github.com/vuejs/tsconfig/compare/v0.7.0...v0.8.1)

---
updated-dependencies:
- dependency-name: "@vue/tsconfig"
  dependency-version: 0.8.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:33:58 +00:00
dependabot[bot]
eec3e97f97 Bump actions/setup-python from 5 to 6
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:04:39 +00:00
dependabot[bot]
3f481d6922 Bump lxml from 5.3.1 to 6.0.2
Bumps [lxml](https://github.com/lxml/lxml) from 5.3.1 to 6.0.2.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.3.1...lxml-6.0.2)

---
updated-dependencies:
- dependency-name: lxml
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:38 +00:00
dependabot[bot]
0810ab7210 Bump django-debug-toolbar from 4.3.0 to 6.0.0
Bumps [django-debug-toolbar](https://github.com/django-commons/django-debug-toolbar) from 4.3.0 to 6.0.0.
- [Release notes](https://github.com/django-commons/django-debug-toolbar/releases)
- [Changelog](https://github.com/django-commons/django-debug-toolbar/blob/main/docs/changes.rst)
- [Commits](https://github.com/django-commons/django-debug-toolbar/compare/4.3...6.0.0)

---
updated-dependencies:
- dependency-name: django-debug-toolbar
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:32 +00:00
dependabot[bot]
abd621145c Bump pytest from 8.4.1 to 8.4.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.4.1 to 8.4.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.4.1...8.4.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 8.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:29 +00:00
dependabot[bot]
7d218aa93d Bump drf-spectacular from 0.27.1 to 0.28.0
Bumps [drf-spectacular](https://github.com/tfranzel/drf-spectacular) from 0.27.1 to 0.28.0.
- [Release notes](https://github.com/tfranzel/drf-spectacular/releases)
- [Changelog](https://github.com/tfranzel/drf-spectacular/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tfranzel/drf-spectacular/compare/0.27.1...0.28.0)

---
updated-dependencies:
- dependency-name: drf-spectacular
  dependency-version: 0.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:24 +00:00
dependabot[bot]
1b41bd9115 Bump pyyaml from 6.0.2 to 6.0.3
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/6.0.3/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0.2...6.0.3)

---
updated-dependencies:
- dependency-name: pyyaml
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-01 00:01:21 +00:00
vabene1111
d456fcf0f2 Merge branch 'develop' into beta 2025-09-30 21:51:53 +02:00
S
d4f654554b Translated using Weblate (Ukrainian)
Currently translated at 43.9% (380 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/uk/
2025-09-23 19:45:37 +00:00
Matjaž T.
c8115545b8 Translated using Weblate (Slovenian)
Currently translated at 100.0% (864 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/sl/
2025-09-23 19:45:37 +00:00
Justin Straver
6dbf0871ec Translated using Weblate (Dutch)
Currently translated at 99.5% (860 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/nl/
2025-09-23 19:45:36 +00:00
Justin Straver
f1c5c8bc43 Translated using Weblate (German)
Currently translated at 99.1% (857 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/
2025-09-23 19:45:36 +00:00
S
22e0108992 Translated using Weblate (Ukrainian)
Currently translated at 18.6% (91 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/uk/
2025-09-23 19:45:36 +00:00
Justin Straver
e2e05c8d1d Translated using Weblate (Dutch)
Currently translated at 100.0% (488 of 488 strings)

Translation: Tandoor/Recipes Backend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/nl/
2025-09-23 19:45:36 +00:00
Justin Straver
b02b36812d Translated using Weblate (English)
Currently translated at 100.0% (864 of 864 strings)

Translation: Tandoor/Recipes Frontend
Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/en/
2025-09-23 19:45:36 +00:00
vabene1111
7f6025c99c Merge branch 'develop' into beta 2025-09-22 22:01:33 +02:00
vabene1111
b97e04ead8 Merge branch 'develop' into beta 2025-09-09 07:55:14 +02:00
vabene1111
fc236c97b4 Merge branch 'develop' into beta 2025-09-08 22:16:03 +02:00
vabene1111
5653aca056 Merge branch 'develop' into beta 2025-08-31 12:38:21 +02:00
vabene1111
fdb05c5a9e Merge branch 'develop' into beta 2025-08-22 16:58:40 +02:00
vabene1111
2dffde4091 Merge branch 'develop' into beta 2025-08-16 15:22:05 +02:00
vabene1111
cdd700d2e6 Merge branch 'develop' into beta 2025-07-29 17:37:48 +02:00
vabene1111
ad6fe5fa4d Merge branch 'develop' into beta 2025-07-18 15:48:02 +02:00
vabene1111
ac31c112f3 Merge branch 'develop' into beta 2025-07-11 21:59:18 +02:00
vabene1111
0104b600cc Merge branch 'develop' into beta 2025-07-07 18:28:50 +02:00
vabene1111
7baad85112 Merge branch 'develop' into beta 2025-06-22 10:35:01 +02:00
vabene1111
4b0bfa9a85 Merge branch 'master' into beta 2025-06-22 10:29:43 +02:00
vabene1111
5e7c75ef68 Merge branch 'develop' into beta 2025-01-18 09:24:08 +01:00
vabene1111
954a35bea2 Merge branch 'develop' into beta 2025-01-01 08:17:32 +01:00
vabene1111
88347d44c8 Merge branch 'beta' of https://github.com/TandoorRecipes/recipes into beta 2024-11-23 21:56:13 +01:00
vabene1111
2c13e76fbb Merge branch 'develop' into beta 2024-03-05 08:54:58 +01:00
vabene1111
362f634828 Merge branch 'develop' into beta 2024-03-02 07:41:28 +01:00
vabene1111
2fb968cfd3 Merge branch 'develop' into beta 2024-03-01 07:42:28 +01:00
vabene1111
4d3dab6edd Merge branch 'develop' into beta 2024-02-28 17:21:22 +01:00
vabene1111
8f1b593ad1 Merge branch 'develop' into beta 2024-02-28 17:19:15 +01:00
vabene1111
1002f0d61f Merge branch 'develop' into beta 2024-02-28 17:12:35 +01:00
vabene1111
20cb218688 Merge branch 'develop' into beta 2024-02-26 16:29:16 +01:00
vabene1111
bba44b0c1e Merge branch 'develop' into beta 2024-02-20 07:54:28 +01:00
29 changed files with 8110 additions and 4199 deletions

View File

@@ -35,7 +35,7 @@ jobs:
fi
# Build Vue 3 frontend
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version: '22'
cache: yarn

View File

@@ -13,14 +13,14 @@ jobs:
node-version: ["22"]
steps:
- uses: actions/checkout@v5
- uses: awalsh128/cache-apt-pkgs-action@v1.5.3
- uses: awalsh128/cache-apt-pkgs-action@v1.6.0
with:
packages: libsasl2-dev python3-dev libxml2-dev libxmlsec1-dev libxslt-dev libxmlsec1-openssl libxslt-dev libldap2-dev libssl-dev gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl
version: 1.0
# Setup python & dependencies
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
@@ -43,7 +43,7 @@ jobs:
# Build Vue frontend & Dependencies
- name: Set up Node ${{ matrix.node-version }}
if: steps.django_cache.outputs.cache-hit != 'true'
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: "yarn"

View File

@@ -25,7 +25,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
# Override language selection by uncommenting this and choosing your languages
with:
languages: python, javascript
@@ -47,6 +47,6 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4
with:
languages: javascript, python

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
- uses: actions/setup-python@v6
with:
python-version: 3.x
- run: pip install mkdocs-material mkdocs-include-markdown-plugin

View File

@@ -69,16 +69,8 @@ def get_from_scraper(scrape, request):
recipe_json['description'] = parse_description(description)
recipe_json['description'] = automation_engine.apply_regex_replace_automation(recipe_json['description'], Automation.DESCRIPTION_REPLACE)
# assign servings attributes
try:
# dont use scrape.yields() as this will always return "x servings" or "x items", should be improved in scrapers directly
# max(x,1) to prevent 0 servings which breaks scaling
servings = max(scrape.schema.data.get('recipeYield') or 1, 1)
except Exception:
servings = 1
recipe_json['servings'] = parse_servings(servings)
recipe_json['servings_text'] = parse_servings_text(servings)
recipe_json['servings'] = parse_servings(scrape.schema.data.get('recipeYield'))
recipe_json['servings_text'] = parse_servings_text(scrape.schema.data.get('recipeYield'))
# assign time attributes
try:
@@ -407,7 +399,7 @@ def parse_servings(servings):
def parse_servings_text(servings):
if isinstance(servings, str):
try:
servings = re.sub("\\d+", '', servings).strip()
servings = re.sub("\\d+", '', servings, 1).strip()
except Exception:
servings = ''
if isinstance(servings, list):

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -2562,6 +2562,13 @@ class AiImportView(APIView):
'msg': "Error parsing AI results. Response Text:\n\n" + response_text
}
return Response(RecipeFromSourceResponseSerializer(context={'request': request}).to_representation(response), status=status.HTTP_400_BAD_REQUEST)
except Exception:
traceback.print_exc()
response = {
'error': True,
'msg': "Error processing AI results. Response Text:\n\n" + response_text + "\n\n" + traceback.format_exc()
}
return Response(RecipeFromSourceResponseSerializer(context={'request': request}).to_representation(response), status=status.HTTP_400_BAD_REQUEST)
else:
response = {
'error': True,

View File

@@ -33,4 +33,4 @@ Convert pictures of recipes to a structure that can be imported to Tandoor with
Maintained by [smilerz](https://github.com/smilerz/tandoor-menu-generator)
Generate a mealplan tbased on complex criteria and optionally insert it into an SVG menu template.
Generate a meal plan based on complex criteria and optionally insert it into an SVG menu template.

View File

@@ -36,7 +36,7 @@ then make sure you have set [all required headers](install/docker.md#required-he
If that doesn't fix it, you can also refer to the appropriate sub section in the [reverse proxy documentation](install/docker.md#reverse-proxy) and verify your general webserver configuration.
### Required Headers
Navigate to `/system` and review the headers listed in the DEBUG section. At a minimum, if you are using a reverse proxy the headers must match the below conditions.
Navigate to `/system/` and review the headers listed in the DEBUG section. At a minimum, if you are using a reverse proxy the headers must match the below conditions.
| Header | Requirement |
| :--- | :---- |

View File

@@ -69,8 +69,6 @@ wget https://raw.githubusercontent.com/vabene1111/recipes/develop/docs/install/d
Most deployments will likely use a reverse proxy.
If your reverse proxy is not listed below, please refer to chapter [Others](#others).
#### **Traefik**
If you use Traefik, this configuration is the one for you.
@@ -115,6 +113,17 @@ wget https://raw.githubusercontent.com/vabene1111/recipes/develop/docs/install/d
{% include "./docker/nginx-proxy/docker-compose.yml" %}
~~~
#### **Apache proxy**
If you use Apache as a reverse proxy, this configuration is the one for you.
~~~yaml
{% include "./docker/apache-proxy/docker-compose.yml" %}
~~~
Keep in mind, that the port configured for the service `web_recipes` should be the same as in chapter [Required Headers: Apache](#apache).
## **DockSTARTer**
The main goal of [DockSTARTer](https://dockstarter.com/) is to make it quick and easy to get up and running with Docker.
@@ -139,7 +148,8 @@ if you manually change it/bind the folder as a volume.
Please be sure to supply all required headers in your nginx/Apache/Caddy/... configuration!
nginx:
#### **nginx**
```nginx
location / {
proxy_set_header Host $http_host; # try $host instead if this doesn't work
@@ -149,7 +159,8 @@ location / {
}
```
Apache:
#### **Apache**
```apache
RequestHeader set X-Forwarded-Proto "https"
Header always set Access-Control-Allow-Origin "*"

View File

@@ -0,0 +1,24 @@
services:
db_recipes:
restart: always
image: postgres:16-alpine
volumes:
- ./postgresql:/var/lib/postgresql/data
env_file:
- ./.env
web_recipes:
restart: always
image: vabene1111/recipes
ports:
- 127.0.0.1:8080:80 # replace port
env_file:
- ./.env
volumes:
- staticfiles:/opt/recipes/staticfiles
- ./mediafiles:/opt/recipes/mediafiles
depends_on:
- db_recipes
volumes:
staticfiles:

View File

@@ -77,10 +77,10 @@ Using binaries from the virtual env:
/var/www/recipes/bin/pip3 install -r requirements.txt
```
You will also need to install front end requirements and build them. For this navigate to the `./vue` folder and run
You will also need to install front end requirements and build them. For this navigate to the `./vue3` folder and run
```shell
cd ./vue
cd ./vue3
yarn install
yarn build
```
@@ -224,7 +224,7 @@ bin/python3 manage.py migrate
bin/python3 manage.py collectstatic --no-input
bin/python3 manage.py collectstatic_js_reverse
# change to frontend directory
cd vue
cd vue3
# install and build frontend
yarn install
yarn build

View File

@@ -34,7 +34,7 @@ urlpatterns = [
),
]
if settings.DEBUG:
if settings.DEBUG and settings.DEBUG_TOOLBAR:
urlpatterns += path('__debug__/', include('debug_toolbar.urls')),
if settings.ENABLE_METRICS:

View File

@@ -1,18 +1,18 @@
Django==5.2.7
Django==5.2.8
cryptography===45.0.5
django-annoying==0.10.6
django-cleanup==9.0.0
django-crispy-forms==2.4
crispy-bootstrap4==2025.6
djangorestframework==3.16.1
drf-spectacular==0.27.1
drf-spectacular==0.28.0
drf-spectacular-sidecar==2025.8.1
drf-writable-nested==0.7.2
django-oauth-toolkit==2.4.0
django-debug-toolbar==4.3.0
django-debug-toolbar==6.0.0
bleach==6.2.0
gunicorn==23.0.0
lxml==5.3.1
lxml==6.0.2
Markdown==3.7
Pillow==11.3.0
psycopg2-binary==2.9.10
@@ -22,14 +22,14 @@ six==1.17.0
webdavclient3==3.14.6
whitenoise==6.8.2
icalendar==6.3.1
pyyaml==6.0.2
pyyaml==6.0.3
uritemplate==4.1.1
beautifulsoup4==4.12.3
microdata==0.8.0
mock==5.2.0
Jinja2==3.1.6
django-allauth[mfa,socialaccount]==65.9.0
recipe-scrapers==15.8.0
recipe-scrapers==15.9.0
django-scopes==2.0.0
django-treebeard==4.7.1
django-cors-headers==4.6.0
@@ -53,7 +53,7 @@ django-vite==3.1.0
litellm==1.64.1
# Development
pytest==8.4.1
pytest==8.4.2
pytest-django==4.11.0
pytest-cov===6.2.1
pytest-factoryboy==2.8.1

View File

@@ -13,7 +13,7 @@
"@types/sortablejs": "^1.15.8",
"@vueform/multiselect": "^2.6.11",
"@vueuse/core": "^13.6.0",
"@vueuse/router": "^13.6.0",
"@vueuse/router": "^13.9.0",
"luxon": "^3.7.1",
"mavon-editor": "^3.0.1",
"pinia": "^3.0.2",
@@ -23,7 +23,7 @@
"vue-router": "^4.5.0",
"vue-simple-calendar": "7.1.0",
"vuedraggable": "^4.1.0",
"vuetify": "^3.9.7"
"vuetify": "^3.10.3"
},
"devDependencies": {
"@fortawesome/fontawesome-free": "^6.7.2",
@@ -31,11 +31,11 @@
"@types/jsdom": "^21.1.7",
"@types/node": "^24.0.8",
"@vitejs/plugin-vue": "^6.0.0",
"@vue/tsconfig": "^0.7.0",
"@vue/tsconfig": "^0.8.1",
"esbuild-register": "^3.6.0",
"jsdom": "^26.1.0",
"typescript": "^5.8.3",
"vite": "7.1.5",
"vite": "7.1.11",
"vite-plugin-pwa": "^1.0.3",
"vite-plugin-vuetify": "^2.1.1",
"vue-tsc": "^3.0.6",

View File

@@ -131,7 +131,7 @@
<script lang="ts" setup>
import GlobalSearchDialog from "@/components/inputs/GlobalSearchDialog.vue"
import {useDisplay} from "vuetify"
import {useDisplay, useLocale} from "vuetify"
import VSnackbarQueued from "@/components/display/VSnackbarQueued.vue";
import MessageListDialog from "@/components/dialogs/MessageListDialog.vue";
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
@@ -152,6 +152,7 @@ const {t} = useI18n()
const title = useTitle()
const router = useRouter()
const i18n = useI18n()
const isPrintMode = useMediaQuery('print')
@@ -161,13 +162,20 @@ onMounted(() => {
router.push({name: 'WelcomePage'})
}
})
const {current} = useLocale()
let locale = document.querySelector('html')!.getAttribute('lang')
if (locale != null) {
current.value = locale
}
})
/**
* global title update handler, might be overridden by page specific handlers
*/
router.afterEach((to, from) => {
if(to.name == 'StartPage' && useUserPreferenceStore().initCompleted && !useUserPreferenceStore().activeSpace.spaceSetupCompleted != undefined &&!useUserPreferenceStore().activeSpace.spaceSetupCompleted && useUserPreferenceStore().activeSpace.createdBy.id! == useUserPreferenceStore().userSettings.user.id!){
if (to.name == 'StartPage' && useUserPreferenceStore().initCompleted && !useUserPreferenceStore().activeSpace.spaceSetupCompleted != undefined && !useUserPreferenceStore().activeSpace.spaceSetupCompleted && useUserPreferenceStore().activeSpace.createdBy.id! == useUserPreferenceStore().userSettings.user.id!) {
router.push({name: 'WelcomePage'})
}
nextTick(() => {

View File

@@ -79,7 +79,7 @@
<v-card-actions>
<v-spacer></v-spacer>
<v-btn @click="useMessageStore().deleteAllMessages()" color="error">{{$t('Delete_All')}}</v-btn>
<v-btn @click="addTestMessage()" color="warning">{{$t('Add')}}</v-btn>
<!-- <v-btn @click="addTestMessage()" color="warning">{{$t('Add')}}</v-btn>-->
<v-btn @click="isActive.value = false">{{ $t('Close')}}</v-btn>
</v-card-actions>
</v-card>

View File

@@ -157,6 +157,7 @@ function dropCalendarItemOnDate(undefinedItem: IMealPlanNormalizedCalendarItem,
let new_entry = Object.assign({}, mealPlan)
new_entry.fromDate = targetDate
new_entry.toDate = DateTime.fromJSDate(targetDate).plus(fromToDiff).toJSDate()
new_entry.addshopping = mealPlan.shopping
useMealPlanStore().createObject(new_entry)
} else {
mealPlan.fromDate = targetDate

View File

@@ -29,7 +29,11 @@
<v-checkbox v-model="useUserPreferenceStore().deviceSettings.start_showMealPlan" :label="$t('ShowMealPlanOnStartPage')"></v-checkbox>
<v-btn @click="useUserPreferenceStore().resetDeviceSettings()" color="warning">{{ $t('Reset') }}</v-btn> <br/>
<v-btn @click="useUserPreferenceStore().deviceSettings.general_closedHelpAlerts = []" color="warning" class="mt-1">{{ $t('ResetHelp') }}</v-btn>
<v-btn @click="useUserPreferenceStore().deviceSettings.general_closedHelpAlerts = []" color="warning" class="mt-1">{{ $t('ResetHelp') }}</v-btn> <br/>
<v-btn color="info" class="mt-1">
<message-list-dialog></message-list-dialog>
{{ $t('Messages') }}
</v-btn>
</v-form>
</template>
@@ -43,6 +47,7 @@ import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/Messa
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import {useDjangoUrls} from "@/composables/useDjangoUrls";
import ThankYouNote from "@/components/display/ThankYouNote.vue";
import MessageListDialog from "@/components/dialogs/MessageListDialog.vue";
const {getDjangoUrl} = useDjangoUrls()

866
vue3/src/locales/ko.json Normal file
View File

@@ -0,0 +1,866 @@
{
"AI": "",
"AIImportSubtitle": "",
"AISettingsHostedHelp": "",
"API": "",
"APIKey": "",
"API_Browser": "",
"API_Documentation": "",
"AccessTokenHelp": "",
"Access_Token": "",
"Account": "",
"Actions": "",
"Active": "",
"Activity": "",
"Add": "",
"AddAll": "",
"AddChild": "",
"AddFilter": "",
"AddFoodToShopping": "",
"AddMany": "",
"AddToShopping": "",
"Add_Servings_to_Shopping": "",
"Add_Step": "",
"Add_nutrition_recipe": "",
"Add_to_Plan": "",
"Add_to_Shopping": "",
"Added_To_Shopping_List": "",
"Added_by": "",
"Added_on": "",
"Admin": "",
"Advanced": "",
"AiCreditsBalance": "",
"AiLog": "",
"AiLogHelp": "",
"AiModelHelp": "",
"AiProvider": "",
"AiProviderHelp": "",
"Alignment": "",
"AllRecipes": "",
"Amount": "",
"App": "",
"AppImportSubtitle": "",
"Apply": "",
"Are_You_Sure": "",
"Auto_Planner": "",
"Auto_Sort": "",
"Auto_Sort_Help": "",
"Automate": "",
"Automation": "",
"AutomationHelp": "",
"Available": "",
"AvailableCategories": "",
"Back": "",
"BaseUnit": "",
"BaseUnitHelp": "",
"Basics": "",
"BatchDeleteConfirm": "",
"BatchDeleteHelp": "",
"BatchEdit": "",
"BatchEditUpdatingItemsCount": "",
"Blocking": "",
"BlockingHelp": "",
"Book": "",
"Bookmarklet": "",
"BookmarkletHelp1": "",
"BookmarkletHelp2": "",
"BookmarkletHelp3": "",
"BookmarkletImportSubtitle": "",
"Books": "",
"CREATE_ERROR": "",
"Calculator": "",
"Calories": "",
"Cancel": "",
"Cannot_Add_Notes_To_Shopping": "",
"Carbohydrates": "",
"Cards": "",
"Cascading": "",
"CascadingHelp": "",
"Categories": "",
"Category": "",
"CategoryInstruction": "",
"CategoryName": "",
"Change_Password": "",
"Changing": "",
"ChildInheritFields": "",
"ChildInheritFields_help": "",
"Choose_Category": "",
"Clear": "",
"Click_To_Edit": "",
"Clone": "",
"Close": "",
"Color": "",
"Combine_All_Steps": "",
"Coming_Soon": "",
"Comment": "",
"Comments_setting": "",
"Completed": "",
"Confirm": "",
"ConnectorConfig": "",
"ConnectorConfigHelp": "",
"Continue": "",
"Conversion": "",
"ConversionsHelp": "",
"ConvertUsingAI": "",
"CookLog": "",
"CookLogHelp": "",
"Cooked": "",
"Copied": "",
"Copy": "",
"Copy Link": "",
"Copy Token": "",
"Copy_template_reference": "",
"Cosmetic": "",
"CountMore": "",
"Create": "",
"Create Food": "",
"Create Recipe": "",
"CreateFirstRecipe": "",
"CreateInvitation": "",
"Create_Meal_Plan_Entry": "",
"Create_New_Food": "",
"Create_New_Keyword": "",
"Create_New_Meal_Type": "",
"Create_New_Shopping Category": "",
"Create_New_Shopping_Category": "",
"Create_New_Unit": "",
"Created": "",
"CreatedBy": "",
"Credits": "",
"Ctrl+K": "",
"Current_Period": "",
"Custom Filter": "",
"CustomImageHelp": "",
"CustomLogoHelp": "",
"CustomLogos": "",
"CustomNavLogoHelp": "",
"CustomTheme": "",
"CustomThemeHelp": "",
"DELETE_ERROR": "",
"Data_Import_Info": "",
"Database": "",
"DatabaseHelp": "",
"Datatype": "",
"Date": "",
"Day": "",
"Days": "",
"Decimals": "",
"Default": "",
"DefaultPage": "",
"Default_Unit": "",
"DelayFor": "",
"DelayUntil": "",
"Delete": "",
"DeleteConfirmQuestion": "",
"DeleteShoppingConfirm": "",
"DeleteSomething": "",
"Delete_All": "",
"Delete_Food": "",
"Delete_Keyword": "",
"Deleted": "",
"Description": "",
"Description_Replace": "",
"DeviceSettings": "",
"DeviceSettingsHelp": "",
"Disable": "",
"Disable_Amount": "",
"Disabled": "",
"Documentation": "",
"DontChange": "",
"Down": "",
"Download": "",
"DragToUpload": "",
"Drag_Here_To_Delete": "",
"Duplicate": "",
"DuplicateFoundInfo": "",
"Edit": "",
"Edit_Food": "",
"Edit_Keyword": "",
"Edit_Meal_Plan_Entry": "",
"Edit_Recipe": "",
"Email": "",
"Empty": "",
"Enable": "",
"Enable_Amount": "",
"Enabled": "",
"EndDate": "",
"Energy": "",
"Entries": "",
"Error": "",
"ErrorUrlListImport": "",
"Events": "",
"Export": "",
"Export_As_ICal": "",
"Export_Not_Yet_Supported": "",
"Export_Supported": "",
"Export_To_ICal": "",
"External": "",
"ExternalRecipe": "",
"ExternalRecipeImport": "",
"ExternalRecipeImportHelp": "",
"ExternalStorage": "",
"External_Recipe_Image": "",
"FDC_ID": "",
"FDC_ID_help": "",
"FDC_Search": "",
"FETCH_ERROR": "",
"Failure": "",
"Fats": "",
"File": "",
"Files": "",
"FinishedAt": "",
"First": "",
"First_name": "",
"Food": "",
"FoodHelp": "",
"FoodInherit": "",
"FoodNotOnHand": "",
"FoodOnHand": "",
"Food_Alias": "",
"Food_Replace": "",
"Foods": "",
"Friday": "",
"FromBalance": "",
"Fulltext": "",
"FulltextHelp": "",
"Fuzzy": "",
"FuzzySearchHelp": "",
"GettingStarted": "",
"Global": "",
"GlobalHelp": "",
"Group": "",
"GroupBy": "",
"HeaderWarning": "",
"Headline": "",
"Help": "",
"Hide_External": "",
"Hide_Food": "",
"Hide_Keyword": "",
"Hide_Keywords": "",
"Hide_Recipes": "",
"Hide_as_header": "",
"Hierarchy": "",
"History": "",
"HostedFreeVersion": "",
"Hour": "",
"Hours": "",
"Icon": "",
"IgnoreAccents": "",
"IgnoreAccentsHelp": "",
"IgnoreThis": "",
"Ignore_Shopping": "",
"IgnoredFood": "",
"Image": "",
"Import": "",
"Import Recipe": "",
"ImportAll": "",
"ImportFirstRecipe": "",
"ImportIntoTandoor": "",
"ImportMealPlans": "",
"ImportShoppingList": "",
"Import_Error": "",
"Import_Not_Yet_Supported": "",
"Import_Result_Info": "",
"Import_Supported": "",
"Import_finished": "",
"Imported": "",
"Imported_From": "",
"Importer_Help": "",
"Information": "",
"Ingredient": "",
"Ingredient Editor": "",
"Ingredient Overview": "",
"IngredientEditorHelp": "",
"IngredientHelp": "",
"IngredientInShopping": "",
"Ingredients": "",
"Inherit": "",
"InheritFields": "",
"InheritFields_help": "",
"InheritWarning": "",
"Input": "",
"Instruction_Replace": "",
"Instructions": "",
"InstructionsEditHelp": "",
"Internal": "",
"InviteLinkHelp": "",
"Invite_Link": "",
"Invites": "",
"Key_Ctrl": "",
"Key_Shift": "",
"Keyword": "",
"KeywordHelp": "",
"Keyword_Alias": "",
"Keywords": "",
"Language": "",
"Last": "",
"Last_name": "",
"Learn_More": "",
"LeaveSpace": "",
"Link": "",
"Load": "",
"Load_More": "",
"LogCredits": "",
"LogCreditsHelp": "",
"Log_Cooking": "",
"Log_Recipe_Cooking": "",
"Logo": "",
"Logout": "",
"Make_Header": "",
"Make_Ingredient": "",
"ManageSubscription": "",
"Manage_Books": "",
"Manage_Emails": "",
"MealPlanHelp": "",
"MealPlanShoppingHelp": "",
"MealTypeHelp": "",
"Meal_Plan": "",
"Meal_Plan_Days": "",
"Meal_Type": "",
"Meal_Type_Required": "",
"Meal_Types": "",
"Merge": "",
"MergeAutomateHelp": "",
"MergeInsteadOfDelete": "",
"Merge_Keyword": "",
"Message": "",
"Messages": "",
"Miscellaneous": "",
"MissingConversion": "",
"MissingProperties": "",
"Model": "",
"ModelSelectResultsHelp": "",
"Monday": "",
"Month": "",
"MonthlyCredits": "",
"MonthlyCreditsUsed": "",
"More": "",
"Move": "",
"MoveCategory": "",
"MoveToStep": "",
"Move_Down": "",
"Move_Food": "",
"Move_Keyword": "",
"Move_Up": "",
"Multiple": "",
"Name": "",
"Name_Replace": "",
"Nav_Color": "",
"Nav_Color_Help": "",
"Nav_Text_Mode": "",
"Nav_Text_Mode_Help": "",
"Never_Unit": "",
"New": "",
"New_Cookbook": "",
"New_Entry": "",
"New_Food": "",
"New_Keyword": "",
"New_Meal_Type": "",
"New_Recipe": "",
"New_Supermarket": "",
"New_Supermarket_Category": "",
"New_Unit": "",
"Next": "",
"Next_Day": "",
"Next_Period": "",
"No": "",
"NoCategory": "",
"NoMoreUndo": "",
"NoUnit": "",
"No_ID": "",
"No_Results": "",
"NotFound": "",
"NotFoundHelp": "",
"NotInShopping": "",
"Note": "",
"NullingHelp": "",
"Number of Objects": "",
"Nutrition": "",
"NutritionsPerServing": "",
"NutritionsPerServingHelp": "",
"OfflineAlert": "",
"Ok": "",
"OnHand": "",
"OnHand_help": "",
"Open": "",
"Open_Data_Import": "",
"Open_Data_Slug": "",
"Options": "",
"Order": "",
"OrderInformation": "",
"Original_Text": "",
"Owner": "",
"Page": "",
"Parameter": "",
"Parent": "",
"PartialMatch": "",
"PartialMatchHelp": "",
"Password": "",
"Path": "",
"PerPage": "",
"Period": "",
"Periods": "",
"Pin": "",
"Pinned": "",
"PinnedConfirmation": "",
"Plan_Period_To_Show": "",
"Plan_Show_How_Many_Periods": "",
"Planned": "",
"Planner": "",
"Planner_Settings": "",
"Planning&Shopping": "",
"Plural": "",
"Postpone": "",
"PostponedUntil": "",
"PrecisionSearchHelp": "",
"Preferences": "",
"Preparation": "",
"Preview": "",
"Previous_Day": "",
"Previous_Period": "",
"Print": "",
"Private": "",
"Private_Recipe": "",
"Private_Recipe_Help": "",
"Profile": "",
"Properties": "",
"PropertiesFoodHelp": "",
"Properties_Food_Amount": "",
"Properties_Food_Unit": "",
"Property": "",
"PropertyHelp": "",
"PropertyType": "",
"PropertyTypeHelp": "",
"Property_Editor": "",
"Protected": "",
"Proteins": "",
"Quick actions": "",
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Ratings": "",
"Recently_Viewed": "",
"Recipe": "",
"RecipeBookEntryHelp": "",
"RecipeBookHelp": "",
"RecipeHelp": "",
"RecipeStepsHelp": "",
"Recipe_Book": "",
"Recipe_Image": "",
"Recipes": "",
"Recipes_In_Import": "",
"Recipes_per_page": "",
"Refresh": "",
"Remove": "",
"RemoveAllType": "",
"RemoveFoodFromShopping": "",
"RemoveParent": "",
"Remove_nutrition_recipe": "",
"Reset": "",
"ResetHelp": "",
"Reset_Search": "",
"Reusable": "",
"Role": "",
"Root": "",
"Saturday": "",
"Save": "",
"Save/Load": "",
"Save_and_View": "",
"SavedSearch": "",
"SavedSearchHelp": "",
"ScalableNumber": "",
"Search": "",
"Search Settings": "",
"SearchMethod": "",
"SearchSettingsOverview": "",
"SearchSettingsWarning": "",
"Second": "",
"Seconds": "",
"Select": "",
"SelectAll": "",
"SelectNone": "",
"Select_App_To_Import": "",
"Select_Book": "",
"Select_File": "",
"Selected": "",
"SelectedCategories": "",
"Serving": "",
"Servings": "",
"ServingsText": "",
"Settings": "",
"SettingsOnlySuperuser": "",
"Share": "",
"ShopLater": "",
"ShopNow": "",
"ShoppingBackgroundSyncWarning": "",
"ShoppingListEntry": "",
"ShoppingListEntryHelp": "",
"ShoppingListRecipe": "",
"Shopping_Categories": "",
"Shopping_Category": "",
"Shopping_List_Empty": "",
"Shopping_input_placeholder": "",
"Shopping_list": "",
"ShowDelayed": "",
"ShowIngredients": "",
"ShowMealPlanOnStartPage": "",
"ShowRecentlyCompleted": "",
"ShowUncategorizedFood": "",
"Show_Logo": "",
"Show_Logo_Help": "",
"Show_Week_Numbers": "",
"Show_as_header": "",
"Single": "",
"Size": "",
"Skip": "",
"Social_Authentication": "",
"Sort_by_new": "",
"Source": "",
"SourceImportHelp": "",
"SourceImportSubtitle": "",
"Space": "",
"SpaceHelp": "",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceMembersHelp": "",
"SpaceName": "",
"SpacePrivateObjectsHelp": "",
"SpaceSettings": "",
"Space_Cosmetic_Settings": "",
"Split": "",
"Split_All_Steps": "",
"StartDate": "",
"Starting_Day": "",
"StartsWith": "",
"StartsWithHelp": "",
"Step": "",
"StepHelp": "",
"Step_Name": "",
"Step_Type": "",
"Step_start_time": "",
"Steps": "",
"StepsOverview": "",
"Sticky_Nav": "",
"Sticky_Nav_Help": "",
"Storage": "",
"StorageHelp": "",
"StoragePasswordTokenHelp": "",
"Structured": "",
"SubstituteOnHand": "",
"Substitutes": "",
"Success": "",
"SuccessClipboard": "",
"Summary": "",
"Sunday": "",
"Supermarket": "",
"SupermarketCategoriesOnly": "",
"SupermarketCategoryHelp": "",
"SupermarketHelp": "",
"SupermarketName": "",
"Supermarkets": "",
"SupportsDescriptionField": "",
"SyncLog": "",
"SyncLogHelp": "",
"SyncedPath": "",
"SyncedPathHelp": "",
"System": "",
"Table": "",
"Table_of_Contents": "",
"Text": "",
"ThankYou": "",
"ThanksTextHosted": "",
"ThanksTextSelfhosted": "",
"Theme": "",
"Thursday": "",
"Time": "",
"Title": "",
"Title_or_Recipe_Required": "",
"Today": "",
"Toggle": "",
"Transpose_Words": "",
"TrigramThreshold": "",
"TrigramThresholdHelp": "",
"Tuesday": "",
"Type": "",
"UPDATE_ERROR": "",
"Unchanged": "",
"Undefined": "",
"Undo": "",
"Unit": "",
"UnitConversion": "",
"UnitConversionHelp": "",
"UnitHelp": "",
"Unit_Alias": "",
"Unit_Replace": "",
"Units": "",
"Unpin": "",
"UnpinnedConfirmation": "",
"Unrated": "",
"Up": "",
"Update": "",
"Update_Existing_Data": "",
"Updated": "",
"UpgradeNow": "",
"Url": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "",
"Use_Fractions": "",
"Use_Fractions_Help": "",
"Use_Kj": "",
"Use_Metric": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",
"Use_Plural_Unit_Always": "",
"Use_Plural_Unit_Simple": "",
"User": "",
"UserFileHelp": "",
"UserHelp": "",
"Username": "",
"Users": "",
"Valid Until": "",
"View": "",
"ViewLogHelp": "",
"View_Recipes": "",
"Viewed": "",
"Visibility": "",
"Waiting": "",
"WaitingTime": "",
"WarnPageLeave": "",
"Warning": "",
"WarningRecipeBookEntryDuplicate": "",
"Warning_Delete_Supermarket_Category": "",
"Website": "",
"Wednesday": "",
"Week": "",
"Week_Numbers": "",
"Welcome": "",
"WelcomeSettingsHelp": "",
"WelcometoTandoor": "",
"WorkingTime": "",
"Year": "",
"Yes": "",
"YourSpaces": "",
"active": "",
"add_keyword": "",
"additional_options": "",
"advanced": "",
"advanced_search_settings": "",
"after": "",
"all": "",
"all_fields_optional": "",
"and": "",
"and_down": "",
"and_up": "",
"any": "",
"asc": "",
"base_amount": "",
"base_unit": "",
"before": "",
"book_filter_help": "",
"click_image_import": "",
"confirm_delete": "",
"convert_internal": "",
"converted_amount": "",
"converted_unit": "",
"copy_markdown_table": "",
"copy_to_clipboard": "",
"copy_to_new": "",
"create_food_desc": "",
"create_rule": "",
"create_title": "",
"created_by": "",
"created_on": "",
"csv_delim_help": "",
"csv_delim_label": "",
"csv_prefix_help": "",
"csv_prefix_label": "",
"date_created": "",
"date_viewed": "",
"default_delay": "",
"default_delay_desc": "",
"del_confirmation_tree": "",
"delete_confirmation": "",
"delete_title": "",
"desc": "",
"download_csv": "",
"download_pdf": "",
"edit_title": "",
"empty_list": "",
"enable_expert": "",
"err_creating_resource": "",
"err_deleting_protected_resource": "",
"err_deleting_resource": "",
"err_fetching_resource": "",
"err_importing_recipe": "",
"err_merge_self": "",
"err_merging_resource": "",
"err_move_self": "",
"err_moving_resource": "",
"err_updating_resource": "",
"exact": "",
"exclude": "",
"expert_mode": "",
"explain": "",
"fields": "",
"file_upload_disabled": "",
"filter": "",
"filter_name": "",
"filter_to_supermarket": "",
"filter_to_supermarket_desc": "",
"fluid_ounce": "",
"food_inherit_info": "",
"food_recipe_help": "",
"g": "",
"gallon": "",
"hide_step_ingredients": "",
"hours": "",
"ignore_shopping_help": "",
"imperial_fluid_ounce": "",
"imperial_gallon": "",
"imperial_pint": "",
"imperial_quart": "",
"imperial_tbsp": "",
"imperial_tsp": "",
"import_duplicates": "",
"import_running": "",
"in_shopping": "",
"ingredient_list": "",
"kg": "",
"l": "",
"last_cooked": "",
"last_viewed": "",
"left_handed": "",
"left_handed_help": "",
"make_now": "",
"make_now_count": "",
"mark_complete": "",
"mealplan_autoadd_shopping": "",
"mealplan_autoadd_shopping_desc": "",
"mealplan_autoexclude_onhand": "",
"mealplan_autoexclude_onhand_desc": "",
"mealplan_autoinclude_related": "",
"mealplan_autoinclude_related_desc": "",
"merge_confirmation": "",
"merge_selection": "",
"merge_title": "",
"min": "",
"ml": "",
"move_confirmation": "",
"move_selection": "",
"move_title": "",
"no_more_images_found": "",
"no_pinned_recipes": "",
"not": "",
"nothing": "",
"nothing_planned_today": "",
"on": "",
"one_url_per_line": "",
"open_data_help_text": "",
"or": "",
"ounce": "",
"parameter_count": "",
"paste_ingredients": "",
"paste_ingredients_placeholder": "",
"paste_json": "",
"per_serving": "",
"pint": "",
"plan_share_desc": "",
"plural_short": "",
"plural_usage_info": "",
"pound": "",
"property_type_fdc_hint": "",
"quart": "",
"recipe_filter": "",
"recipe_name": "",
"recipe_property_info": "",
"related_recipes": "",
"remember_hours": "",
"remember_search": "",
"remove_selection": "",
"reset_children": "",
"reset_children_help": "",
"reset_food_inheritance": "",
"reset_food_inheritance_info": "",
"reusable_help_text": "",
"review_shopping": "",
"save_filter": "",
"searchFilterCreatedByHelp": "",
"searchFilterObjectsAndHelp": "",
"searchFilterObjectsAndNotHelp": "",
"searchFilterObjectsHelp": "",
"searchFilterObjectsOrNotHelp": "",
"search_create_help_text": "",
"search_import_help_text": "",
"search_no_recipes": "",
"search_rank": "",
"seconds": "",
"select_file": "",
"select_food": "",
"select_keyword": "",
"select_recipe": "",
"select_unit": "",
"shared_with": "",
"shopping_add_onhand": "",
"shopping_add_onhand_desc": "",
"shopping_auto_sync": "",
"shopping_auto_sync_desc": "",
"shopping_category_help": "",
"shopping_recent_days": "",
"shopping_recent_days_desc": "",
"shopping_share": "",
"shopping_share_desc": "",
"show_books": "",
"show_filters": "",
"show_foods": "",
"show_ingredient_overview": "",
"show_ingredients_table": "",
"show_keywords": "",
"show_only_internal": "",
"show_rating": "",
"show_sortby": "",
"show_split_screen": "",
"show_sql": "",
"show_step_ingredients": "",
"show_step_ingredients_setting": "",
"show_step_ingredients_setting_help": "",
"show_units": "",
"simple_mode": "",
"sort_by": "",
"sql_debug": "",
"step_time_minutes": "",
"substitute_children": "",
"substitute_children_help": "",
"substitute_help": "",
"substitute_siblings": "",
"substitute_siblings_help": "",
"success_creating_resource": "",
"success_deleting_resource": "",
"success_fetching_resource": "",
"success_merging_resource": "",
"success_moving_resource": "",
"success_updating_resource": "",
"tbsp": "",
"theUsernameCannotBeChanged": "",
"times_cooked": "",
"to_close": "",
"to_navigate": "",
"to_select": "",
"today_recipes": "",
"total": "",
"tree_root": "",
"tree_select": "",
"tsp": "",
"unsaved": "",
"updatedon": "",
"view_recipe": "",
"warning_duplicate_filter": "",
"warning_feature_beta": "",
"warning_space_delete": ""
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -34,10 +34,10 @@
</v-card-text>
</v-card>
<template v-if="totalRecipes > 0">
<horizontal-recipe-scroller :skeletons="4" mode="recent" v-if="totalRecipes > 0"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="recent" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="new" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="keyword" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="random" v-if="totalRecipes >= 5"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="random" v-if="totalRecipes > 0"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="created_by" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="2" mode="rating" v-if="totalRecipes > 10"></horizontal-recipe-scroller>
<horizontal-recipe-scroller :skeletons="4" mode="keyword" v-if="totalRecipes > 25"></horizontal-recipe-scroller>

View File

@@ -6,6 +6,9 @@ import {useUserPreferenceStore} from "@/stores/UserPreferenceStore.ts";
*/
export function roundDecimals(num: number) {
let decimals = useUserPreferenceStore().userSettings.ingredientDecimals
if (decimals === undefined) {
decimals = 2
}
return Number(num.toFixed(decimals))
}

View File

@@ -5,6 +5,7 @@ import {aliases, fa} from 'vuetify/iconsets/fa'
// Composables
import {createVuetify} from 'vuetify'
import {DateTime} from "luxon";
import {af, ar, az, bg, ca, ckb, cs, da, de, el, en, es, et, fi, fr, he, hr, hu, id, it, ja, km, ko, lt, lv, nl, no, pl, pt, ro, ru, sk, sl, srCyrl, srLatn, sv, th, tr, uk, vi, zhHans, zhHant} from "vuetify/locale";
// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides
export default createVuetify({
@@ -22,22 +23,24 @@ export default createVuetify({
maxWidth: '1400px'
},
// always localize the date display of DateInputs
VDateInput: {
displayFormat: (date: Date) => DateTime.fromJSDate(date).toLocaleString()
},
// VDateInput: {
// displayFormat: (date: Date) => DateTime.fromJSDate(date).toLocaleString()
// },
// always use color for switches to properly see if enabled or not
VSwitch: {
color: 'primary'
},
// globally set the correct decimal seperator
VNumberInput: {
decimalSeparator: 0.1.toLocaleString().replace(/\d/g, '')
}
// VNumberInput: {
// decimalSeparator: 0.1.toLocaleString().replace(/\d/g, '')
// }
},
locale: {
locale: 'en',
fallback: 'en',
messages: {af, ar, az, bg, ca, ckb, cs, da, de, el, en, es, et, fi, fr, he, hr, hu, id, it, ja, km, ko, lt, lv, nl, no, pl, pt, ro, ru, sk, sl, srCyrl, srLatn, sv, th, tr, uk, vi, zhHans, zhHant},
decimalSeparator: 0.1.toLocaleString().replace(/\d/g, '')
},
// locale: {
// locale: 'de',
// fallback: 'en',
// },
theme: {
defaultTheme: 'light',
themes: {

View File

@@ -1417,10 +1417,10 @@
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.17.tgz#e8b3a41f0be76499882a89e8ed40d86a70fa4b70"
integrity sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==
"@vue/tsconfig@^0.7.0":
version "0.7.0"
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz#67044c847b7a137b8cbfd6b23104c36dbaf80d1d"
integrity sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==
"@vue/tsconfig@^0.8.1":
version "0.8.1"
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.8.1.tgz#4732251fa58945024424385cf3be0b1708fad5fe"
integrity sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==
"@vueform/multiselect@^2.6.11":
version "2.6.11"
@@ -1448,18 +1448,23 @@
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-13.6.0.tgz#49196025c96c7daeb591c20a54b61cc336af99b6"
integrity sha512-rnIH7JvU7NjrpexTsl2Iwv0V0yAx9cw7+clymjKuLSXG0QMcLD0LDgdNmXic+qL0SGvgSVPEpM9IDO/wqo1vkQ==
"@vueuse/router@^13.6.0":
version "13.6.0"
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-13.6.0.tgz#29456dab42eb75a0dc5fe4c62f59dd3f7c21a6ab"
integrity sha512-iXRwR4K7nz4PReW0QudhnM9NtYGvN4KrskFgF9G7NouM43big3bpSNRRocJKFWK7iu97ww5y82B3QA2zz3S/vw==
"@vueuse/router@^13.9.0":
version "13.9.0"
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-13.9.0.tgz#44235e6732a30b53d1c8e2ef13ce783fdd189ca6"
integrity sha512-7AYay8Pv/0fC4D0eygbIyZuLyVs+9D7dsnO5D8aqat9qcOz91v/XFWR667WE1+p+OkU0ib+FjQUdnTVBNoIw8g==
dependencies:
"@vueuse/shared" "13.6.0"
"@vueuse/shared" "13.9.0"
"@vueuse/shared@13.6.0":
version "13.6.0"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-13.6.0.tgz#872fdbd725fb4e3a12bd5aab85af9a5db0b1e481"
integrity sha512-pDykCSoS2T3fsQrYqf9SyF0QXWHmcGPQ+qiOVjlYSzlWd9dgppB2bFSM1GgKKkt7uzn0BBMV3IbJsUfHG2+BCg==
"@vueuse/shared@13.9.0":
version "13.9.0"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-13.9.0.tgz#7168b4ed647e625b05eb4e7e80fe8aabd00e3923"
integrity sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==
acorn@^8.14.0:
version "8.15.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
@@ -3343,10 +3348,10 @@ vite-plugin-vuetify@^2.1.1:
debug "^4.3.3"
upath "^2.0.1"
vite@7.1.5:
version "7.1.5"
resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.5.tgz#4dbcb48c6313116689be540466fc80faa377be38"
integrity sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==
vite@7.1.11:
version "7.1.11"
resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.11.tgz#4d006746112fee056df64985191e846ebfb6007e"
integrity sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==
dependencies:
esbuild "^0.25.0"
fdir "^6.5.0"
@@ -3418,10 +3423,10 @@ vuedraggable@^4.1.0:
dependencies:
sortablejs "1.14.0"
vuetify@^3.9.7:
version "3.9.7"
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-3.9.7.tgz#aea996f35111f25dd7e31ab956fbb40911841c24"
integrity sha512-Ib8PB3ItcguCol8f0DXLpoGyy7FvoOYW23SEWqXX+in1CSItJZHxUXXGSus94m5JWqYqQrFiwCykbHm7UWPi4Q==
vuetify@^3.10.3:
version "3.10.3"
resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-3.10.3.tgz#f04e507bb5efee6b52f11b2fd60a20dced1a8831"
integrity sha512-psc7oZfjz3LwH96ZRzSm4iGcOKKoeoVZIyO5Q5xO4vcUfWYxobL7TvMQv53jv1PnNvaMIXWeVIrQmiyce5dpTg==
w3c-xmlserializer@^5.0.0:
version "5.0.0"