From b565cf24dfa145d1b36b7df1049da47b6fb5d6c4 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 25 Jul 2021 13:15:37 -0800 Subject: [PATCH] V0.5.2 (#635) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix docker dev db persistence (#264) * Fix docker dev db persistence * Make run.sh the only startup script for prod + dev Credits to @hay-kot for run.sh script logic * Restore dev backend initialization in non-docker setup * Make run.sh POSIX-friendly * Allow dev backend to auto-reload in Docker * Frontend Refactor + Bug Fixes * merge category and tag selector * unifiy category selector * add hint * spacing * fix nextcloud migration * simplify email validator #261 * formatting * cleanup * auto-gen * format * update run script * unified category/tag selector * rename component * Add advanced search link * remove old code * convert keywords to tags * add proper behavior on rename * proper image name association on rename * fix test cleanup * changelog * set docker comppand * minify on migration Co-authored-by: hay-kot * bug-fixes/category-tag-creator (#266) * fix category labels * set loader for migration * v0.4.1 Co-authored-by: hay-kot * Hot Fix (#269) * fix category labels * set loader for migration * v0.4.1 * reorganize API docs Co-authored-by: hay-kot * Fix some pytests (#265) * Fix encoding issue in cleaner unit test * Add VS Code task to run pytests * Fix FileExistsError when running Windows * Add Portuguese Translation (#232) * Add Portuguese Translation * add portuguese translation option * formatting * add missing } * specify absolute path * Feature/migration-rewrite (#278) * start * migration rewrite * update name * convert chowdown to new methods * refactor/remove duplicate code * refactor to unify logger + log to file * remove toolbox * Display report on UI Co-authored-by: hay-kot * refactor/image-minification (#285) * refactor image minification calls * remove nusiance logs Co-authored-by: hay-kot * feature/debug-info (#286) * rename 'ENV' to 'PRODUCTION' and default to true * set env PRODUCTION * refactor file download process * add last_recipe.json and log downloads * changelog + version bump * set env on workflows * bump version Co-authored-by: hay-kot * Basic nutrition editor (#288) * Basic nutrition editor * fix no image on scrape * nutrition display * add recipe images * update by url * new upload options Co-authored-by: hay-kot * Sanitize recipe backup filenames (#287) Fixes #275 * fix page creation fixes #290 * Display categories in sidebar if no pages set (#292) Fixes #291 * Enrich page title with context (#296) - Static pages have their own titles - The name of the recipe is displayed when viewing it * fix: translates phrase for locale de (#298) Co-authored-by: Jonas Schubert * Fix ingredient checkbox click (#305) Fixes #304 v-list-item already flips the checkbox * Localize custom pages and search page (#299) * Localize custom pages and search page * Fix FR translation for step * fixes #306 * fixes #297 * Update changelog * generate docs * fix broken upload button on migrations * docs update * bump version * fix discord link * add TOKEN_TIME and DEFAULT_EMAIL * docs * fixes #312 * fixes #314 * fixes #315 * fix language hydration * v0.4.3 docs * Crowdin integration (#319) * Fix portuguese localization files * Use 4-letter code for locales ID * Update Crowdin configuration file * Make vuetify locales match with new VueI18n standard * Fix old locale ID default setting * Hide project hierarchy from Crowdin * add dateTimeFormats to Crowdin * New Crowdin updates (#322) - Initial Merge * New translations en-US.json (French) * New translations en-US.json (French) * New translations en-US.json (Danish) * New translations en-US.json (Danish) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Portuguese) * New translations en-US.json (Swedish) * New translations en-US.json (Swedish) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Chinese Traditional) * New Crowdin updates (#323) * New translations en-US.json (French) * New translations en-US.json (French) * New translations en-US.json (Danish) * New translations en-US.json (Danish) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Portuguese) * New translations en-US.json (Swedish) * New translations en-US.json (Swedish) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Romanian) * New translations en-US.json (Korean) * New translations en-US.json (Vietnamese) * New translations en-US.json (English) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Japanese) * New translations en-US.json (Italian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (German) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) (#324) * update lock * ENV -> PRODUCTION * New Crowdin updates (#327) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Simplified) * Make first day of week in calendar view customizable (#263) * Make first day of the week customizable New settings section 'Locale settings' New setting 'First day of week' New date picker reusable UI that uses the new setting Meal planner now uses this new date picker * Clean up unused code in settings page * Fix First day of week mapping * Replace missing v-date-picker with custom card DatePicker * Mention first day of the week feature in change log * Fix date picker not properly localized (#330) * Fix language in date picker Vuetify allows custom-named locales, but the date-picker really only works with BCP 47 language tag * Save lang at proper time + Update Vuetify lang on the fly * Add tip to fix rpi host running docker container (#335) Per issue #249, tip gives guidance for running Mealie in a docker linux/arm/v7 container. * New Crowdin updates (#328) * New translations en-US.json (German) * New translations en-US.json (Korean) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * es-ES.json (#334) * es-ES.json Spanish translation * Update es-ES.json * feature/editor-improvements (#289) * pin editor buttons on scroll * scaler scratch * fix langauge assignment 1st pass * set lang on navigate * refactor/breakup router * unify style for language selectro * refactor/code-cleanup * refactor/page specific components to page folder * Fix time card layout issue * fix timecard display * update mobile cards / fix overflow errors Co-authored-by: hay-kot * New Crowdin updates (#340) * New translations en-US.json (French) * New translations en-US.json (French) * New translations en-US.json (French) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * Document new translation process with Crowdin (#342) * Localize more dates and texts (#341) * Localize more dates and texts * Adapt source language to 4-letter code for VS code * Make page titles more reactive to language change * Translate missing text + fix missed refactoring * Fix missed page titles refactoring * Translate nutrition view * Translate Image upload vue * Fix default text being defined twice in upload btn * Get Recipes Route Rewrite (#339) * deprecate old route * auto-gen * recipe card infinite scroll * fix datatable * set hard-limit option * add loader * set scroll on navigation * add auto-import * fix slow initial load * remove console.logs Co-authored-by: hay-kot * Fix ingredients not refreshed upon recipe change (#343) * New Crowdin updates (#344) * New translations en-US.json (Romanian) * New translations en-US.json (French) * New translations en-US.json (Romanian) * New translations en-US.json (Spanish) * New translations en-US.json (French) * New translations en-US.json (Ukrainian) * New translations en-US.json (Hebrew) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Vietnamese) * New translations en-US.json (Afrikaans) * New translations en-US.json (Arabic) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Hungarian) * New translations en-US.json (Turkish) * New translations en-US.json (Italian) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Korean) * New translations en-US.json (Dutch) * New translations en-US.json (Norwegian) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Russian) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Swedish) * New translations en-US.json (Japanese) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Vietnamese) * New translations en-US.json (Italian) * New translations en-US.json (Spanish) * New translations en-US.json (Afrikaans) * New translations en-US.json (Arabic) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Hebrew) * New translations en-US.json (Hungarian) * New translations en-US.json (Japanese) * New translations en-US.json (English) * New translations en-US.json (Korean) * New translations en-US.json (Dutch) * New translations en-US.json (Norwegian) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Russian) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Swedish) * New translations en-US.json (Turkish) * New translations en-US.json (Ukrainian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Portuguese, Brazilian) * New Crowdin updates (#345) * New translations en-US.json (French) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (German) * New translations en-US.json (German) * Fix infinite loop in meal planner randomizer (#346) Infinite loop would happen if there were more days than recipes * More localization (#348) * Translate about page * Sort messages by keys * Remove unused strings * Localize date in meal planner * Fix quick week not starting on Monday for UTC+x * New Crowdin updates (#349) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * New Crowdin updates (#351) * New translations en-US.json (German) * New translations en-US.json (Korean) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (Dutch) * App Bar Rewrite (#347) * Dummy Commit * consolidate sidebar and app bar * fix image error * consolidate sidebar * new icon for user menu * fixes #329 * fix double click on mobile * swap to computed properties * fix open/close bug * rewrite search for mobile * fix ingredient checkbox * cleanup console.logs * set default lang + bump version * draft changelog * reword * update env variables Co-authored-by: hay-kot * New Crowdin updates (#355) * New translations en-US.json (German) * New translations en-US.json (Korean) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (French) * feature/category-tag-crud (#354) * update tag route * search.and * offset for mobile * relative imports * get settings * new page * category/tag CRUD * bulk assign frontend * Bulk assign * debounce search * remove dev data * recipe store refactor * fix mobile view * fix failing tests * commit test data Co-authored-by: hay-kot * New Crowdin updates (#359) * New translations en-US.json (German) * New translations en-US.json (Korean) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * toolbox reference * New Crowdin updates (#361) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * New translations en-US.json (German) * Remove dead code (#362) * Remove BackupCard.vue Unused - moved to NewBackupCard.vue * Remove unused method * New Crowdin updates (#363) * New translations en-US.json (French) * New translations en-US.json (Polish) * feature/new-recipe-features (#360) * unify button styles * fix drag on mobile * recipe instructions section * add carbs * refactor component location * asset start * consolidate view/edit components * asset api * base dialog event * Remove 'content' * remove console.log * add slug prop * remove console.log * recipe assets first pass * add recipeSettings model * fix hide/show when no tags/categories * fix typo Co-authored-by: hay-kot * New Crowdin updates (#365) * New translations en-US.json (German) * New translations en-US.json (Korean) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * refactor/recipe-to-snake-case (#364) * formatting * snake case all recipes entries * set foreign key to int * run scheduler at startup and not import * set SQLite file path before imports Co-authored-by: hay-kot * fix missed commits * More localization (#358) * Translate missing items on About page * Localize import summary dialog * Make site menu translation reactive * Localize import options * Include semi colon in string * Move API texts to frontend + better status codes * Provide feedback to user when no meal is planned * Fix API tests after latest rework * Add warning for API changes in changelog * Refactor API texts handling * Refactor API texts handling #2 * Better API feedback * Rearrange strings hierarchy * Add messages upon recipe updated * Fix 'recipe effected' typo * Remove snackbar usage in backend * Translate toolbox * Provide feedback for tags CRUD * Fix messed up merge * Translate sign-up form * Better feedback for sign-up CRUD * Refactor log-in API texts handling * No error message when user is not authenticated * Remove unimportant console log * New Crowdin updates (#366) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (Polish) * New translations en-US.json (Dutch) * Hide user ID + Reset password when creating a user (#367) * refactor/docker-updates (#369) * convert all images to webp * consolidate docker files * serve images wiith caddy * consolidate docker files * new slim-buster image * set image url * add image path * remove print * set image path correctly * cleanup * caddy proxy path * docs Co-authored-by: hay-kot * New Crowdin updates (#368) * New translations en-US.json (German) * New translations en-US.json (Korean) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * add python3-dev * add all cryptography deps 🤞 * remove 32bit arm support * Refactor/recipe routes (#370) * format with black * black format * flake8 * remove bar exceptions * remove test for depreciated route * recipe settings editr * add sqlite Co-authored-by: hay-kot * Api refactoring fixes (#372) * Fix JS error when logging in with bad credentials * Remove duplicate error message if bad credentials Error is already nicely displayed in LoginForm * More localization (#373) * Translate missing string * Display language in original language + English * Translate assets * Translate recipe settings * New Crowdin updates (#374) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (German) * Shopping list fixes (#376) * Refactor recipe to snake case * Initialize raw ingredients Fixes #356 * New Crowdin updates (#377) * New translations en-US.json (German) * New translations en-US.json (Italian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (French) * New translations en-US.json (Japanese) * New translations en-US.json (Hungarian) * New translations en-US.json (Arabic) * New translations en-US.json (Romanian) * New translations en-US.json (Spanish) * New translations en-US.json (Hebrew) * New translations en-US.json (Afrikaans) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Ukrainian) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Vietnamese) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Dutch) (#378) * New translations en-US.json (French) (#379) * New Crowdin updates (#380) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * Remove former profile image upon new upload (#381) * Remove former profile image upon new upload * Fix test * feature/additional-db (#371) * add support for setting db_url * fix tests * add db_username/password env variables * init db if super user doesn't exist * fix tests * fix tests * set SQLite default DB_URL * don't run tests on draft PRs * add lint/black tests * add test-all * spell check settings * black/flake8 * check format fail * new badges * rename workflow * fix formatting * remove white-space * test connection arguments for pg * format * add new values to template * format * remove old script * monkeypatch test db * working docker-compose for postgres * update docs * test pg workflow * format * add driver * install w/ poetry * setup container * change image * set database to localhost * update tests * set url * fix url path * disable cache * database init * bust cache * get by name Co-authored-by: hay-kot * feature/recipe-patch-improvements (#382) * automated docs update * recipe rating component * recipe partial updates - closes #25 * use Vue.delete to update store * format * arrow functions * fix tests * format * initial context menu * localize * add confirmation dialog * context menu * fix bare exception * update line length * format all file with prettier * update changelog * download as json * update python dependencies * update javascript dependencies Co-authored-by: hay-kot * New Crowdin updates (#383) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New Crowdin updates (#385) * New translations en-US.json (Spanish) * New translations en-US.json (Spanish) * New translations en-US.json (French) * feature/finish-recipe-assets (#384) * add features to readme * Copy markdown reference * prop as whole recipe * parameter as url instead of query * add card styling to editor * move images to /recipes/{slug}/images * add image to breaking changes * fix delete and import errors * fix debug/about response * logger updates * dashboard ui * add server side events * unorganized routes * default slot * add backup viewer to dashboard * format * add dialog to backup imports * initial event support * delete assets when removed Co-authored-by: hay-kot * New Crowdin updates (#386) * New translations en-US.json (Romanian) * New translations en-US.json (Italian) * New translations en-US.json (Romanian) * New translations en-US.json (Spanish) * New translations en-US.json (Afrikaans) * New translations en-US.json (Arabic) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Hebrew) * New translations en-US.json (Hungarian) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Korean) * New translations en-US.json (Dutch) * New translations en-US.json (Norwegian) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Russian) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Swedish) * New translations en-US.json (Turkish) * New translations en-US.json (Ukrainian) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Afrikaans) * New translations en-US.json (Arabic) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Hebrew) * New translations en-US.json (Hungarian) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Korean) * New translations en-US.json (Dutch) * New translations en-US.json (Norwegian) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Russian) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Swedish) * New translations en-US.json (Turkish) * New translations en-US.json (Ukrainian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Portuguese, Brazilian) * dashboard notes * fix image display * New Crowdin updates (#387) * New translations en-US.json (Italian) * New translations en-US.json (Italian) * New translations en-US.json (Italian) * Refactor/backend routers (#388) * update router * update caddy file * setup depends in docker-fole * make changes for serving on subpath * set dev config * fix router signups * consolidate links * backup-functionality to dashboard * new user card * consolidate theme into profile * fix theme tests * fix pg tests * fix pg tests * remove unused import * mobile margin Co-authored-by: hay-kot * feature/new-feature-cleanup (#389) * add json editor to theme editor * add toolbars tools to recipe sections * fix recipe yield * add updated_date to recipe schema * update time cards * fix mobile buttons * fix asset URL * fix PG errors CRUD * remove -d from docker-pro * fix theme tests * remvoe old typing * abstract count function Co-authored-by: hay-kot * New Crowdin updates (#390) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (German) * New translations en-US.json (French) * feature/profile-cards (#391) * unify format * pass variables * remove namespace * rename * group-card init * shuffle + icons * remove console.logs * token CRUD * update changelog * add profile link * consolidate mealplan to profile dashboard * update docs * add query parameter to search page * update test routes * update python depts * basic token tests Co-authored-by: hay-kot * New Crowdin updates (#392) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * More localization (#393) * Translate sidebar * Do not force 12-hour format worldwide Vue-i18n knows which locales prefer 12-hour format over 24-hour format * Translate new tiles in profile page * Translate new tiles in dashboard * backend-events + code-cleanup (#395) * additional server events * sort 'recent recipes' by updated * remove duplicate code * fixes #396 * set color * consolidate tag/category pages * set colors * list unorganized recipes * cleanup old code * remove flash message, switch to global snackbar * cancel to close * cleanup Co-authored-by: hay-kot * New Crowdin updates (#394) * New translations en-US.json (Romanian) * New translations en-US.json (Italian) * New translations en-US.json (Romanian) * New translations en-US.json (Spanish) * New translations en-US.json (Afrikaans) * New translations en-US.json (Arabic) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Hebrew) * New translations en-US.json (Hungarian) * New translations en-US.json (Japanese) * New translations en-US.json (French) * New translations en-US.json (Korean) * New translations en-US.json (Dutch) * New translations en-US.json (Norwegian) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Russian) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Swedish) * New translations en-US.json (Turkish) * New translations en-US.json (Ukrainian) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Spanish) * New translations en-US.json (Afrikaans) * New translations en-US.json (Arabic) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Hebrew) * New translations en-US.json (Hungarian) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Korean) * New translations en-US.json (Dutch) * New translations en-US.json (Norwegian) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Russian) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Swedish) * New translations en-US.json (Turkish) * New translations en-US.json (Ukrainian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * Feature/event notifications (#399) * additional server events * sort 'recent recipes' by updated * remove duplicate code * fixes #396 * set color * consolidate tag/category pages * set colors * list unorganized recipes * cleanup old code * remove flash message, switch to global snackbar * cancel to close * cleanup * notifications first pass * test notification * complete notification feature * use background tasks * add url param * update documentation Co-authored-by: hay-kot * New Crowdin updates (#398) * New translations en-US.json (Dutch) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * Bug/misc bug fixes (#400) * potentiall fix #329 * typo * auto purge events * image error * update import dialog * fix scheduler interval time * adjust icon position * check for property Co-authored-by: hay-kot * New Crowdin updates (#401) * New translations en-US.json (Spanish) * New translations en-US.json (Spanish) * New translations en-US.json (French) * New Crowdin updates (#402) * New translations en-US.json (French) * New translations en-US.json (French) * New translations en-US.json (Dutch) * More localization (#403) * Translate toolbox tab headers * Use plural form in recipe organizer header * Feature/copy icon (#406) * add copy tooltip * transparent scrollbar * add version to header * localize Co-authored-by: hay-kot * set proper demo link * New Crowdin updates (#404) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * add print-view component (#407) Co-authored-by: hay-kot * New Crowdin updates (#408) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * notification import/export (#413) Co-authored-by: hay-kot * fallback to icon when no image (#414) Co-authored-by: hay-kot * image bug fix * Add some padding to search panel (#416) * New Crowdin updates (#410) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * New translations en-US.json (Spanish) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * feature/mealplanner-rewrite (#417) * multiple recipes per day * fix update * meal-planner rewrite * disable meal-tests * spacing Co-authored-by: hay-kot * Feature/style unification (#420) * set global icons * fixes #419 * button style docs * category/tag page updates * dynamic router imports Co-authored-by: hay-kot * bug/bug-fixes (#424) * fix image write/caching * Caddyfile Caching header * more aggressive caching Co-authored-by: hay-kot * Add web manifest (#422) This provides a more app-like experience for mobile users that use the "add to homescreen" functionality of their web browsers. * TheButton global component (#425) Co-authored-by: hay-kot * New Crowdin updates (#423) * New translations en-US.json (German) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Dutch) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Spanish) * New translations en-US.json (Chinese Simplified) * bug/mobile-fixes (#426) * search dialog rewrite * lazy-load shopping list * fit search bar * event table * set urls for static content Co-authored-by: hay-kot * feature/mobile-layout (#431) * lazy load cards * shopping list recipe search bug * admin layout fluid * site loader * username support * mobile tabs * set username at signup * update user tests * patch bug on shopping list * public mealplan links * support link (I'm a monster) * icon only on mobile * padding Co-authored-by: hay-kot * Changing docs with reverse proxy (#436) Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com> * New Crowdin updates (#432) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Swedish) * New translations en-US.json (Swedish) * New translations en-US.json (Swedish) * New translations en-US.json (Swedish) * Support PWA (#437) * add PWA * cleanup * add offline cache * Localize new strings (#445) * New translations en-US.json (French) (#444) * New Crowdin updates (#447) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * feature/favorite-recipes (#443) * add favorites options * bump dependencies * add badges to all cards * typo * remove console.log * fix site-loader viewport Co-authored-by: hay-kot * feature/recipe-comments (#448) * fix favorite color issue * db and models for comments * rename files * initial UI for comments * fix format * import / export * fixes #428 * format Co-authored-by: hay-kot * fix column type * Bug/general fixes (#450) * Fix asset link * remove unused var * fix no meal-plan returned * cleanup redundant code * Fix dates off in UI * quick set dark/light mode * user image fixes Co-authored-by: hay-kot * fix pwa not working behind an authenticated proxy (#452) * New Crowdin updates (#449) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * New translations en-US.json (Swedish) * New translations en-US.json (German) * New translations en-US.json (Spanish) * New translations en-US.json (Spanish) * New translations en-US.json (Catalan) * Add Dashboard documentation (#466) Add toolbox documentation in organizing-recipes.md Update Images for site settings Update site-settings.md * New Crowdin updates (#455) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Dutch) * Fixed backup, updated backup docu (#430) * Fixed backup, updated docu * reformatted * Bug Fixes (#467) * fixes #463 * fixes #465 * fixes #461 * fixes #458 key error * Fixes #459 * Fixes comments shown when printing * fix meal-image not return on API call * return better status * reorganize docs Co-authored-by: hay-kot * Add Web Share api to ContextMenu.vue (#462) * Add Web Share api to ContextMenu.vue. Copy to clipboard is the fallback * Add Web Share api to ContextMenu.vue. Copy to clipboard is the fallback * Add translation * New translations en-US.json (Spanish) (#468) * docs/update outline (#471) * docs update * reorganize * plausible analytics Co-authored-by: hay-kot * Add Dutch language (#473) * Add Dutch language * Sort language list alphabetically Except English which stays on top * Feature/improve error message on scrape (#476) * add better feedback on failed scrape * fix json download link * add better recipe parser * dump deps * fix force open on mobile * formatting * rewrite scraper to use new library * fix failing tests * bookmarklet support * bookmarklet instructions * recipes changelog Co-authored-by: hay-kot * fix clean_string error (#481) * add soft fail user dependency (#479) * add soft fail user dependency * filter private recipes on get_recipe_summary * code clean-up * restrict single recipe * cleanup dependencies * add auto_error oauth2 scheme * update make file * update make file * fix early return * bump python deps * restrict category/tags * format deps Co-authored-by: hay-kot * Rewrite Recipe Editor Buttons Bar (#482) * rewrite editor button row * add context menu items to recipe page Co-authored-by: hay-kot * fixes #485 (#494) Co-authored-by: hay-kot * use psycopg2 instead of psycopg2-binary on prod (#483) * New Crowdin updates (#470) * New translations en-US.json (German) * New translations en-US.json (Czech) * New translations en-US.json (French) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Russian) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Vietnamese) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Italian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Japanese) * New translations en-US.json (Hungarian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (Swedish) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Swedish) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Swedish) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * Documentation (#474) Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com> * Docs/v0.5.0 second pass (#496) * update docs * use auto-gen routes * dumb deps * remove whitespace * github action to build dev docs container * no cache Co-authored-by: hay-kot * fix build context * fix context * change registry * new flow * context * context * spelling * add tooltip to fab (#497) * New Crowdin updates (#498) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Dutch) * New translations en-US.json (Swedish) * fix unauthorized recipe (#499) * fix docs links (#500) * add translate on toggle theme mode (#501) * Images and demo custom pages (#502) * Add Database Layer for Recipe Scaling (#506) * move badge * fix add individual ingredient * fix redirect issue Co-authored-by: hay-kot * New Crowdin updates (#503) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * fix docs (#505) * fix docs * undo makefile alignment Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com> * Add Spanish language (#510) * New translations en-US.json (Spanish) * Add Spanish language Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com> * New Crowdin updates (#508) * New translations en-US.json (Spanish) * New translations en-US.json (Swedish) * Improve Test Coverage (#511) * add recipe scaling notes * test theme rename * fix coverage call to use poetry * remove print * remove async * consolidate test case data * fix mealplan tests * remove redundant else Co-authored-by: hay-kot * Bug/fix infinite loop (#512) * fix infinite loop with safe get method * fix ingredients Co-authored-by: hay-kot * Feature/add cofirmation dialogs (#513) * add category/tag confirmation dialog * add page delete confirmation Co-authored-by: hay-kot * remove old dependencies * move strip suffix * build no cache * Frontend Fixes + Adjust Caddyfile (#518) * token error handling * Add additional settings to recipes * fixes #515 * remove index.html Co-authored-by: hay-kot * add prefix * disable service worker * reenable sw * remove service work from webpack * undo disable sw * code splitting * Make string 'Refresh' and 'New update available' translatable (#524) * Make string 'Refresh' and 'New update available' translatable * Fix change password string * More localization (#525) * More localization * Localize search dialog * Fix "about" page title * Fix Users API Token API path (#526) * Fix Users API Token API path * Change CRLF to LF * Fix route generation when route contains /api * New Crowdin updates (#514) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (German) * New translations en-US.json (Dutch) * New translations en-US.json (Swedish) * New translations en-US.json (Spanish) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Swedish) * New translations en-US.json (Swedish) * New translations en-US.json (Dutch) * New translations en-US.json (Spanish) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New Crowdin updates (#528) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (Swedish) * New translations en-US.json (Spanish) * dev-feature/analyze-bundle (#529) * add bundle analyzer * use svg icons - closes #522 * fix recent recipes icon Co-authored-by: hay-kot * Docs/finale changelog (#530) * bump version * add data loss warning * request correct image Co-authored-by: hay-kot * New Crowdin updates (#531) * New translations en-US.json (Swedish) * New translations en-US.json (Dutch) * Reset disabled steps when switching recipe (#537) * Typos and switched dicemultiple for sort (#540) * Always display ingredients in edit mode (#543) * Always display ingredients in edit mode Fixes #538 * Remove unused code Was wrongfully commited * Bug fixes/v0.5.1 (#545) * dump deps * add job for new groups on interval * change sort icon * fix cart icon * bump version * changelog * early return if no comments * remove comment Co-authored-by: hay-kot * New Crowdin updates (#544) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * New translations en-US.json (Spanish) * feature/improve-bundle-performance (#555) * revert icon * chunk code for better performance / reduce request Co-authored-by: hay-kot * fixes #548 (#557) * move api calls to created event (#559) Co-authored-by: hay-kot * fix broken badge (#565) * Fix about page (#563) * Fix error 500 in about page * Fix log details not showing * Lazy load translations (#561) * Lazy load translations * Lazy load dateTimeFormats * add confirmation dialogs (#564) * New Crowdin updates (#547) * New translations en-US.json (Dutch) * New translations en-US.json (Swedish) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Dutch) * New translations en-US.json (German) * New translations en-US.json (German) * New translations en-US.json (Spanish) * New translations en-US.json (French) * New translations en-US.json (Swedish) * Localization (#568) * Translate 404 pages * Remove unused strings * New Crowdin updates (#569) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New Crowdin updates (#570) * New translations en-US.json (German) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Romanian) * New translations en-US.json (Spanish) * New translations en-US.json (Afrikaans) * New translations en-US.json (Arabic) * New translations en-US.json (Catalan) * New translations en-US.json (Czech) * New translations en-US.json (Danish) * New translations en-US.json (Greek) * New translations en-US.json (Finnish) * New translations en-US.json (Hebrew) * New translations en-US.json (Hungarian) * New translations en-US.json (Japanese) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Korean) * New translations en-US.json (Dutch) * New translations en-US.json (Norwegian) * New translations en-US.json (Polish) * New translations en-US.json (Portuguese) * New translations en-US.json (Russian) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Swedish) * New translations en-US.json (Turkish) * New translations en-US.json (Ukrainian) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Vietnamese) * New translations en-US.json (German) * New translations en-US.json (Swedish) * New translations en-US.json (Dutch) * New translations en-US.json (Spanish) * Fix en-US language not being loaded (#574) VueI18n defaults to en-US when no language is specified, which prevented en-US messages from being loaded * Printview columns (#572) * Printview with multiple columns, depending on list length. * Printview with multiple columns, depending on list length. * Revert "Printview columns (#572)" (#577) This reverts commit eaf4565aa747a38e29f674f2b21f1acb26f66bb6. * fix typos and punctuation (#582) * New translations en-US.json (Dutch) (#580) * Feature/import export single recipe (#576) * remove duplicate keys * show context menu when not logged in * remove console.log * hide menu when printing * add response to event * add type definitions * show context menu always * add image name enums * upload/download single recipe * cleanup menu views+ localization Co-authored-by: hay-kot * API security hardening (#571) * Enhance security and safety around user update API - Prevent a regular user from promoting themself to admin - Prevent an admin from demoting themself - Refactor token fixture to admin + regular user tokens * Restrict user CRUD API to admins * Secure admin API routes * Refactor APIrouter into Admin/UserAPIRouter * Secure theme routes * Make 'all recipes' routes public * Secure favorite routes * Remove redundant checks * Fix public routes mistakenly flagged user routes * Make webhooks changeable only by admin * Allow users to create categories and tags * Address lint issues * Optimize Docker (#575) * reduce docker dev size * reduce docker prod size * fix lint * add gunicorn * fix bandit reported issues * add docs external link icon * add env vars to docs * add permission to docker * merge to one backend Dockerfile * fix codefactor issues * add docs for puid/pgid * add docker healthcheck * New Crowdin updates (#583) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Swedish) * New translations en-US.json (French) * New translations en-US.json (Dutch) * New translations en-US.json (German) * Added info on how the Sensor in HA is created (#584) * Remove unmaintained languages + minor localization tasks (#587) * Fix missing string * Localize "loading recipes" * Remove unmaintained languages Remove support for Danish, Portuguese and Chinese Traditional, since their current translation state is <20% * New Crowdin updates (#589) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Swedish) * New translations en-US.json (Dutch) * New translations en-US.json (French) * Add label to assets icons (#591) * Add label to assets icons * Add tooltip to asset icon * Handle untitled note (#592) * Leave recipe in edit mode in case of an API error * Initialize recipe note with empty title Fixes #586 * New Crowdin updates (#594) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (Dutch) * New translations en-US.json (Swedish) * New translations en-US.json (Polish) * New translations en-US.json (French) * New translations en-US.json (Italian) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Spanish) * Localization (#596) * Localize recipe import popup * Add Italian language * Use named formatting * Remove unused strings * Use dedicated strings for the sidebar This will allow for shorter texts, so the text is not truncated, without impacting other uses * New Crowdin updates (#600) * New translations en-US.json (German) * New translations en-US.json (Japanese) * New translations en-US.json (Vietnamese) * New translations en-US.json (Chinese Traditional) * New translations en-US.json (Ukrainian) * New translations en-US.json (Turkish) * New translations en-US.json (Swedish) * New translations en-US.json (Serbian (Cyrillic)) * New translations en-US.json (Russian) * New translations en-US.json (Portuguese) * New translations en-US.json (Polish) * New translations en-US.json (Norwegian) * New translations en-US.json (Dutch) * New translations en-US.json (Korean) * New translations en-US.json (Italian) * New translations en-US.json (French) * New translations en-US.json (Hungarian) * New translations en-US.json (Hebrew) * New translations en-US.json (Finnish) * New translations en-US.json (Greek) * New translations en-US.json (Danish) * New translations en-US.json (Czech) * New translations en-US.json (Catalan) * New translations en-US.json (Arabic) * New translations en-US.json (Afrikaans) * New translations en-US.json (Spanish) * New translations en-US.json (Romanian) * New translations en-US.json (Chinese Simplified) * New translations en-US.json (Portuguese, Brazilian) * New translations en-US.json (French) * New translations en-US.json (Swedish) * New translations en-US.json (Swedish) * New translations en-US.json (Dutch) * New translations en-US.json (Dutch) * fix db credentials show on logs/frontend (#602) * remove tmpfs (#603) * use class for conf (#607) Co-authored-by: hay-kot * Refactor/class based gunicorn conf (#608) * use class for conf * format caddy file Co-authored-by: hay-kot * collapse steps on check (#609) * collapse steps on check * add grad-and-drop reorder of steps * fix-title bar Co-authored-by: hay-kot * New Crowdin updates (#611) * New translations en-US.json (French) * New translations en-US.json (French) * New translations en-US.json (Polish) * New translations en-US.json (Polish) * New translations en-US.json (Danish) * New translations en-US.json (Danish) * New translations en-US.json (German) * New translations en-US.json (German) * Bug/misc fixes (#618) * Fixes #617 * set recipe settings default by env variables * add variables to docker-compse * update changelog * bump dependencies * add fallback name to scraper Co-authored-by: hay-kot * Feature/ingredient sections (#624) * add ingredient sections to UI * update changelog * move recipe favorite to action bar * fix button position on meal-planner Co-authored-by: hay-kot * Update ios.md (#621) putting this PR in Dev rather than master * Add support for en-GB (#629) * Add support for en-GB Allows for British date format (native in vue-i18n) + potential spelling adaptations * Rename default English locale to American English * New Crowdin updates (#626) * New translations en-US.json (Hungarian) * New translations en-US.json (Hungarian) * New translations en-US.json (Hungarian) * New translations en-US.json (Danish) * New translations en-US.json (Italian) * New translations en-US.json (English, United Kingdom) * New translations en-US.json (English, United Kingdom) * New translations en-US.json (English, United Kingdom) * New translations en-US.json (English, United Kingdom) * Bug/multiple events (#631) * add --preload * formatting * use sql database Co-authored-by: hay-kot * fixes #625 (#632) * fixes #625 * update dependencies * bump version * fix failing tests Co-authored-by: hay-kot * remove draft Co-authored-by: sephrat <34862846+sephrat@users.noreply.github.com> Co-authored-by: hay-kot Co-authored-by: Pedro Mata Rodrigues Co-authored-by: JonasSchubert Co-authored-by: Jonas Schubert Co-authored-by: Chris Klann Co-authored-by: CMBoii <66680498+CMBoii@users.noreply.github.com> Co-authored-by: Florian Gareis Co-authored-by: Carey Metcalfe Co-authored-by: zierbeek <58994651+zierbeek@users.noreply.github.com> Co-authored-by: wengtad Co-authored-by: Kevin Grossmann Co-authored-by: Richard Boß Co-authored-by: Tom Matheussen Co-authored-by: rastacalavera --- .dockerignore | 24 + .github/workflows/dockerbuild.prod.yml | 2 +- .github/workflows/dockerbuild.release.yml | 2 +- .gitignore | 1 + Caddyfile | 53 +- Dockerfile | 149 +++- Dockerfile.dev | 33 - README.md | 4 +- dev/scripts/output/app_routes.py | 5 + docker-compose.dev.yml | 3 +- docker-compose.yml | 4 + docs/docs/assets/js/extra.js | 11 + docs/docs/assets/stylesheets/custom.css | 6 + docs/docs/assets/svg/open-in-new.svg | 3 + docs/docs/changelog/v0.5.0.md | 4 +- docs/docs/changelog/v0.5.1.md | 2 +- docs/docs/changelog/v0.5.2.md | 65 ++ .../developers-guide/code-contributions.md | 16 +- .../developers-guide/starting-dev-server.md | 2 +- docs/docs/contributors/non-coders.md | 2 +- docs/docs/contributors/translating.md | 10 +- .../admin/backups-and-exports.md | 8 +- .../documentation/admin/building-pages.md | 6 +- .../documentation/admin/migration-imports.md | 2 +- .../docs/documentation/admin/site-settings.md | 6 +- .../documentation/admin/user-management.md | 8 +- .../community-guide/home-assistant.md | 19 +- .../docs/documentation/community-guide/ios.md | 36 +- .../documentation/community-guide/swag.md | 8 +- .../getting-started/api-usage.md | 2 +- .../documentation/getting-started/install.md | 148 ++- .../getting-started/introduction.md | 20 +- .../documentation/getting-started/updating.md | 4 +- .../recipes/organizing-recipes.md | 2 +- docs/docs/documentation/recipes/recipes.md | 6 +- .../documentation/toolbox/notifications.md | 18 +- .../users-groups/meal-planner.md | 2 +- docs/docs/overrides/api.html | 2 +- docs/docs/roadmap.md | 4 +- docs/mkdocs.yml | 3 + frontend/frontend.Dockerfile | 4 +- frontend/package-lock.json | 313 +++++-- frontend/package.json | 7 +- frontend/public/index.html | 2 - frontend/src/App.vue | 38 +- frontend/src/api/apiRoutes.js | 3 + frontend/src/api/meta.js | 2 +- frontend/src/api/recipe.js | 9 + frontend/src/api/upload.js | 2 - .../src/components/Fallbacks/NoRecipe.vue | 2 +- frontend/src/components/Fallbacks/The404.vue | 20 +- .../FormHelpers/CategoryTagSelector.vue | 7 + .../FormHelpers/LanguageSelector.vue | 2 +- .../src/components/MealPlan/MealPlanCard.vue | 22 +- .../src/components/MealPlan/MealPlanNew.vue | 2 +- frontend/src/components/Recipe/CardImage.vue | 3 +- .../src/components/Recipe/ContextMenu.vue | 45 +- .../src/components/Recipe/FavoriteBadge.vue | 6 +- .../src/components/Recipe/Parts/Assets.vue | 66 +- .../Recipe/Parts/Helpers/ImageUploadBtn.vue | 7 +- .../Recipe/Parts/Helpers/SettingsMenu.vue | 2 +- .../components/Recipe/Parts/Ingredients.vue | 64 +- .../components/Recipe/Parts/Instructions.vue | 157 ++-- .../src/components/Recipe/Parts/Notes.vue | 2 +- .../components/Recipe/RecipeEditor/index.vue | 3 +- .../Recipe/RecipePageActionMenu.vue | 22 +- .../components/UI/Buttons/TheUploadBtn.vue | 6 +- frontend/src/components/UI/CardSection.vue | 2 +- .../components/UI/Dialogs/BackupDialog.vue | 2 +- .../src/components/UI/Dialogs/BaseDialog.vue | 13 +- frontend/src/components/UI/SiteLoader.vue | 7 +- frontend/src/components/UI/TheRecipeFab.vue | 78 +- frontend/src/components/UI/TheSidebar.vue | 34 +- frontend/src/i18n.js | 55 +- .../src/locales/dateTimeFormats/en-GB.json | 21 + frontend/src/locales/messages/af-ZA.json | 79 +- frontend/src/locales/messages/ar-SA.json | 79 +- frontend/src/locales/messages/ca-ES.json | 79 +- frontend/src/locales/messages/cs-CZ.json | 79 +- frontend/src/locales/messages/da-DK.json | 101 ++- frontend/src/locales/messages/de-DE.json | 117 +-- frontend/src/locales/messages/el-GR.json | 79 +- frontend/src/locales/messages/en-GB.json | 489 ++++++++++ frontend/src/locales/messages/en-US.json | 79 +- frontend/src/locales/messages/es-ES.json | 83 +- frontend/src/locales/messages/fi-FI.json | 79 +- frontend/src/locales/messages/fr-FR.json | 89 +- frontend/src/locales/messages/he-IL.json | 79 +- frontend/src/locales/messages/hu-HU.json | 841 +++++++++--------- frontend/src/locales/messages/it-IT.json | 247 ++--- frontend/src/locales/messages/ja-JP.json | 79 +- frontend/src/locales/messages/ko-KR.json | 79 +- frontend/src/locales/messages/nl-NL.json | 85 +- frontend/src/locales/messages/no-NO.json | 79 +- frontend/src/locales/messages/pl-PL.json | 347 ++++---- frontend/src/locales/messages/pt-BR.json | 79 +- frontend/src/locales/messages/pt-PT.json | 79 +- frontend/src/locales/messages/ro-RO.json | 79 +- frontend/src/locales/messages/ru-RU.json | 79 +- frontend/src/locales/messages/sr-SP.json | 79 +- frontend/src/locales/messages/sv-SE.json | 81 +- frontend/src/locales/messages/tr-TR.json | 79 +- frontend/src/locales/messages/uk-UA.json | 79 +- frontend/src/locales/messages/vi-VN.json | 79 +- frontend/src/locales/messages/zh-CN.json | 79 +- frontend/src/locales/messages/zh-TW.json | 79 +- frontend/src/main.js | 1 - frontend/src/pages/Admin/About/index.vue | 2 +- .../pages/Admin/Dashboard/BackupViewer.vue | 37 +- .../src/pages/Admin/Dashboard/EventViewer.vue | 23 +- frontend/src/pages/Admin/Dashboard/index.vue | 2 +- .../src/pages/Admin/ManageUsers/GroupCard.vue | 2 +- .../src/pages/Admin/ManageUsers/index.vue | 2 +- frontend/src/pages/Admin/Migration/index.vue | 2 +- .../src/pages/Admin/Profile/APITokenCard.vue | 2 +- .../pages/Admin/Profile/ProfileGroupCard.vue | 2 +- .../pages/Admin/Profile/ProfileThemeCard.vue | 10 +- frontend/src/pages/Admin/Profile/UserCard.vue | 4 +- .../Admin/Settings/CustomPageCreator.vue | 2 +- .../pages/Admin/Settings/HomePageSettings.vue | 2 +- .../ToolBox/CategoryTagEditor/BulkAssign.vue | 2 +- .../pages/Admin/ToolBox/EventNotification.vue | 2 +- .../pages/Admin/ToolBox/RecipeOrganizer.vue | 2 +- frontend/src/pages/HomePage.vue | 12 +- frontend/src/pages/MealPlan/Planner.vue | 2 +- frontend/src/pages/MealPlan/ThisWeek.vue | 2 +- frontend/src/pages/Recipe/NewRecipe.vue | 26 +- frontend/src/pages/Recipe/ScraperDebugger.vue | 7 +- frontend/src/pages/Recipe/ViewRecipe.vue | 16 +- frontend/src/pages/Recipes/AllRecipes.vue | 2 +- .../src/pages/Recipes/CategoryTagPage.vue | 2 +- frontend/src/pages/Recipes/CustomPage.vue | 2 +- frontend/src/pages/Recipes/Favorites.vue | 2 +- frontend/src/pages/SearchPage/index.vue | 2 +- frontend/src/plugins/vuetify.js | 7 +- frontend/src/routes/admin.js | 16 +- frontend/src/routes/index.js | 11 +- frontend/src/routes/recipes.js | 4 +- frontend/src/store/modules/language.js | 18 +- frontend/src/store/modules/siteSettings.js | 6 +- frontend/src/utils/globals.js | 2 + frontend/vue.config.js | 3 + gunicorn_conf.py | 75 ++ makefile | 1 + mealie/app.py | 23 +- mealie/core/config.py | 28 +- mealie/routes/about/__init__.py | 3 +- mealie/routes/about/defaults.py | 11 + mealie/routes/about/events.py | 35 +- mealie/routes/backup_routes.py | 6 +- mealie/routes/debug_routes.py | 29 +- mealie/routes/deps.py | 18 +- mealie/routes/groups/__init__.py | 3 +- mealie/routes/groups/crud.py | 19 +- mealie/routes/groups/groups.py | 3 +- mealie/routes/mealplans/__init__.py | 1 + mealie/routes/mealplans/crud.py | 17 +- mealie/routes/mealplans/helpers.py | 5 +- mealie/routes/migration_routes.py | 7 +- mealie/routes/recipe/__init__.py | 11 +- mealie/routes/recipe/all_recipe_routes.py | 14 +- mealie/routes/recipe/category_routes.py | 19 +- mealie/routes/recipe/comments.py | 9 +- mealie/routes/recipe/recipe_crud_routes.py | 97 +- mealie/routes/recipe/tag_routes.py | 21 +- mealie/routes/routers.py | 26 + mealie/routes/shopping_list.py | 9 +- mealie/routes/site_settings/__init__.py | 9 +- mealie/routes/site_settings/all_settings.py | 7 - mealie/routes/site_settings/custom_pages.py | 27 +- mealie/routes/site_settings/site_settings.py | 10 +- mealie/routes/theme_routes.py | 23 +- mealie/routes/unit_and_foods/food_routes.py | 5 +- mealie/routes/unit_and_foods/unit_routes.py | 5 +- mealie/routes/users/__init__.py | 10 +- mealie/routes/users/api_tokens.py | 7 +- mealie/routes/users/auth.py | 10 +- mealie/routes/users/crud.py | 92 +- mealie/routes/users/sign_up.py | 26 +- mealie/run.sh | 45 +- mealie/schema/recipe.py | 23 +- mealie/services/scheduler/global_scheduler.py | 5 +- mealie/services/scraper/cleaner.py | 7 + mealie/services/scraper/open_graph.py | 2 +- mealie/services/scraper/scraper.py | 18 +- poetry.lock | 602 +++++++------ pyproject.toml | 8 +- template.env | 15 +- tests/conftest.py | 33 +- .../recipe_tests/test_recipe_crud.py | 35 +- .../test_custom_page_routes.py | 12 +- tests/integration_tests/test_group_routes.py | 22 +- tests/integration_tests/test_import_routes.py | 4 +- .../test_long_live_tokens.py | 14 +- tests/integration_tests/test_meal_routes.py | 30 +- .../test_migration_routes.py | 28 +- .../integration_tests/test_settings_routes.py | 4 +- tests/integration_tests/test_signup_routes.py | 16 +- tests/integration_tests/test_theme_routes.py | 28 +- tests/integration_tests/test_user_routes.py | 86 +- tests/unit_tests/test_cleaner.py | 2 +- 201 files changed, 4850 insertions(+), 3025 deletions(-) delete mode 100644 Dockerfile.dev create mode 100644 docs/docs/assets/js/extra.js create mode 100644 docs/docs/assets/svg/open-in-new.svg create mode 100644 docs/docs/changelog/v0.5.2.md create mode 100644 frontend/src/locales/dateTimeFormats/en-GB.json create mode 100644 frontend/src/locales/messages/en-GB.json create mode 100644 gunicorn_conf.py create mode 100644 mealie/routes/about/defaults.py create mode 100644 mealie/routes/routers.py delete mode 100644 mealie/routes/site_settings/all_settings.py diff --git a/.dockerignore b/.dockerignore index e89ac3deb..e601eb503 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,27 @@ +.git +.github +.dockerignore +.gitignore + +.idea +.vscode + +__pycache__/ +*.py[cod] +*$py.class +*.so +htmlcov/ +.coverage +.coverage.* +.pytest_cache/ +.venv +venv + +.DS_Store +.AppleDouble +.LSOverride +._* + */node_modules */dist */data/db diff --git a/.github/workflows/dockerbuild.prod.yml b/.github/workflows/dockerbuild.prod.yml index cf025b3c2..b07908b7c 100644 --- a/.github/workflows/dockerbuild.prod.yml +++ b/.github/workflows/dockerbuild.prod.yml @@ -45,4 +45,4 @@ jobs: run: | docker build --push \ --tag hkotel/mealie:latest \ - --platform linux/amd64,linux/arm64 . + --platform linux/amd64,linux/arm/v7,linux/arm64 . diff --git a/.github/workflows/dockerbuild.release.yml b/.github/workflows/dockerbuild.release.yml index 723b22bf9..bb0bfdc6d 100644 --- a/.github/workflows/dockerbuild.release.yml +++ b/.github/workflows/dockerbuild.release.yml @@ -53,4 +53,4 @@ jobs: run: | docker build --push \ --tag hkotel/mealie:${{ steps.mealie_version.outputs.tag }} \ - --platform linux/amd64,linux/arm64 . + --platform linux/amd64,linux/arm/v7,linux/arm64 . diff --git a/.gitignore b/.gitignore index 7fc2d4d47..34ea61503 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ eggs/ lib/ lib64/ parts/ +!frontend/src/components/Recipe/Parts/ sdist/ var/ wheels/ diff --git a/Caddyfile b/Caddyfile index 35d776724..9e08f53c8 100644 --- a/Caddyfile +++ b/Caddyfile @@ -1,35 +1,34 @@ { auto_https off - admin off + admin off } :80 { - @proxied path /api/* /docs /openapi.json + @proxied path /api/* /docs /openapi.json - @static { - file - path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp - } - - encode gzip zstd - - - # Handles Recipe Images / Assets - handle_path /api/media/recipes/* { - header @static Cache-Control max-age=31536000 - root * /app/data/recipes/ - file_server - } + @static { + file + path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp + } - handle @proxied { - uri strip_suffix / - reverse_proxy http://127.0.0.1:9000 - } + encode gzip zstd - handle { - header @static Cache-Control max-age=31536000 - root * /app/dist - try_files {path}.html {path} / - file_server - } -} \ No newline at end of file + # Handles Recipe Images / Assets + handle_path /api/media/recipes/* { + header @static Cache-Control max-age=31536000 + root * /app/data/recipes/ + file_server + } + + handle @proxied { + uri strip_suffix / + reverse_proxy http://127.0.0.1:9000 + } + + handle { + header @static Cache-Control max-age=31536000 + root * /app/dist + try_files {path}.html {path} / + file_server + } +} diff --git a/Dockerfile b/Dockerfile index bdceaa1cd..7fe66a057 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,59 +1,140 @@ -# build -FROM node:lts-alpine as build-stage +############################################### +# Frontend Builder Image +############################################### +FROM node:lts-alpine as frontend-build WORKDIR /app COPY ./frontend/package*.json ./ RUN npm install COPY ./frontend/ . RUN npm run build +############################################### +# Base Image +############################################### +FROM python:3.9-slim as python-base -FROM python:3.9-slim-buster +ENV MEALIE_HOME="/app" -ENV PRODUCTION true -ENV POETRY_VERSION 1.1.6 +ENV PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 \ + PIP_NO_CACHE_DIR=off \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=100 \ + POETRY_HOME="/opt/poetry" \ + POETRY_VIRTUALENVS_IN_PROJECT=true \ + POETRY_NO_INTERACTION=1 \ + PYSETUP_PATH="/opt/pysetup" \ + VENV_PATH="/opt/pysetup/.venv" +# prepend poetry and venv to path +ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" -RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc g++ \ +# create user account +RUN useradd -u 911 -U -d $MEALIE_HOME -s /bin/bash abc \ + && usermod -G users abc \ + && mkdir $MEALIE_HOME + +############################################### +# Builder Image +############################################### +FROM python-base as builder-base +RUN apt-get update \ + && apt-get install --no-install-recommends -y \ curl \ - gnupg gnupg2 gnupg1 \ - apt-transport-https \ - debian-archive-keyring \ - debian-keyring \ + build-essential \ libpq-dev \ libwebp-dev \ + gnupg gnupg2 gnupg1 \ + debian-keyring \ + debian-archive-keyring \ + apt-transport-https \ && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \ - && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee -a /etc/apt/sources.list.d/caddy-stable.list \ - && apt-get update && apt-get install -y --no-install-recommends \ + && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list \ + && apt-get update \ + && apt-get install --no-install-recommends -y \ caddy \ - && apt autoremove \ - && rm -rf /var/lib/apt/lists/* \ - && apt-get remove -y curl apt-transport-https debian-keyring g++ gnupg gnupg2 gnupg1 + && pip install -U --no-cache-dir pip +# install poetry - respects $POETRY_VERSION & $POETRY_HOME +ENV POETRY_VERSION=1.1.6 +RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python - -RUN pip install --no-cache-dir "poetry==$POETRY_VERSION" +# copy project requirement files here to ensure they will be cached. +WORKDIR $PYSETUP_PATH +COPY ./poetry.lock ./pyproject.toml ./ -# project dependencies -WORKDIR /app -COPY pyproject.toml poetry.lock /app/ -RUN poetry config virtualenvs.create false -RUN poetry install -E pgsql --no-dev --no-interaction --no-ansi +# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally +RUN poetry install -E pgsql --no-dev -COPY ./mealie /app/mealie -RUN poetry config virtualenvs.create false \ - && poetry install -E pgsql --no-dev +############################################### +# Development Image +############################################### +FROM python-base as development +ENV PRODUCTION=false + +# copying poetry and venv into image +COPY --from=builder-base $POETRY_HOME $POETRY_HOME +COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH + +# copy backend +COPY ./mealie $MEALIE_HOME/mealie +COPY ./poetry.lock ./pyproject.toml $MEALIE_HOME/ #! Future -# COPY ./alembic /app -# COPY alembic.ini /app -COPY ./Caddyfile /app -COPY ./dev/data/templates /app/data/templates +# COPY ./alembic ./alembic.ini $MEALIE_HOME/ -# frontend build -COPY --from=build-stage /app/dist /app/dist +# venv already has runtime deps installed we get a quicker install +WORKDIR $MEALIE_HOME +RUN . $VENV_PATH/bin/activate && poetry install +WORKDIR / -VOLUME [ "/app/data/" ] +RUN chmod +x $MEALIE_HOME/mealie/run.sh +ENTRYPOINT $MEALIE_HOME/mealie/run.sh "reload" -EXPOSE 80 +############################################### +# Production Image +############################################### +FROM python-base as production +ENV PRODUCTION=true -CMD /app/mealie/run.sh +# curl for used by healthcheck +RUN apt-get update \ + && apt-get install --no-install-recommends -y \ + curl \ + && apt-get autoremove \ + && rm -rf /var/lib/apt/lists/* + +# copying poetry and venv into image +COPY --from=builder-base $POETRY_HOME $POETRY_HOME +COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH + +# copying caddy into image +COPY --from=builder-base /usr/bin/caddy /usr/bin/caddy + +# copy backend +COPY ./mealie $MEALIE_HOME/mealie +COPY ./poetry.lock ./pyproject.toml $MEALIE_HOME/ +COPY ./gunicorn_conf.py $MEALIE_HOME + +#! Future +# COPY ./alembic ./alembic.ini $MEALIE_HOME/ + +# venv already has runtime deps installed we get a quicker install +WORKDIR $MEALIE_HOME +RUN . $VENV_PATH/bin/activate && poetry install -E pgsql --no-dev +WORKDIR / + +# copy frontend +COPY --from=frontend-build /app/dist $MEALIE_HOME/dist +COPY ./dev/data/templates $MEALIE_HOME/data/templates +COPY ./Caddyfile $MEALIE_HOME + +VOLUME [ "$MEALIE_HOME/data/" ] +ENV APP_PORT=80 + +EXPOSE ${APP_PORT} + +HEALTHCHECK CMD curl -f http://localhost:${APP_PORT} || exit 1 + +RUN chmod +x $MEALIE_HOME/mealie/run.sh +ENTRYPOINT $MEALIE_HOME/mealie/run.sh diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 20e0b4817..000000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,33 +0,0 @@ -FROM python:3.9-slim-buster - - -ENV PRODUCTION false -ENV POETRY_VERSION 1.1.6 - -RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc g++ \ - curl \ - gnupg gnupg2 gnupg1 \ - apt-transport-https \ - debian-archive-keyring \ - debian-keyring \ - libwebp-dev \ - && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \ - && curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee -a /etc/apt/sources.list.d/caddy-stable.list \ - && apt-get update && apt-get install -y --no-install-recommends \ - && apt autoremove \ - && rm -rf /var/lib/apt/lists/* \ - && apt-get remove -y curl apt-transport-https debian-keyring g++ gnupg gnupg2 gnupg1 - -RUN pip install --no-cache-dir "poetry==$POETRY_VERSION" - -WORKDIR /app/ - -# Copy poetry.lock* in case it doesn't exist in the repo -COPY ./pyproject.toml /app/ -COPY ./mealie /app/mealie -RUN poetry config virtualenvs.create false \ - && poetry install - -RUN chmod +x /app/mealie/run.sh -CMD ["/app/mealie/run.sh", "reload"] diff --git a/README.md b/README.md index a73b05c68..34585313d 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ [![Docker Pulls][docker-pull]][docker-pull] [![CodeFactor](https://www.codefactor.io/repository/github/hay-kot/mealie/badge)](https://www.codefactor.io/repository/github/hay-kot/mealie) [![Docker Build Production](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml) -[![Project Tests Production](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml) +[![Project Tests Production](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml/badge.svg)](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml) [![Docker Build Dev](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml) -[![Project Tests Dev](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml) +[![Project Tests Dev](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml/badge.svg?branch=dev)](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
diff --git a/dev/scripts/output/app_routes.py b/dev/scripts/output/app_routes.py index 17e182212..5a53e863c 100644 --- a/dev/scripts/output/app_routes.py +++ b/dev/scripts/output/app_routes.py @@ -8,6 +8,7 @@ class AppRoutes: self.about_events = "/api/about/events" self.about_events_notifications = "/api/about/events/notifications" self.about_events_notifications_test = "/api/about/events/notifications/test" + self.about_recipes_defaults = "/api/about/recipes/defaults" self.auth_refresh = "/api/auth/refresh" self.auth_token = "/api/auth/token" self.auth_token_long = "/api/auth/token/long" @@ -31,6 +32,7 @@ class AppRoutes: self.migrations = "/api/migrations" self.recipes_category = "/api/recipes/category" self.recipes_create = "/api/recipes/create" + self.recipes_create_from_zip = "/api/recipes/create-from-zip" self.recipes_create_url = "/api/recipes/create-url" self.recipes_summary = "/api/recipes/summary" self.recipes_summary_uncategorized = "/api/recipes/summary/uncategorized" @@ -108,6 +110,9 @@ class AppRoutes: def recipes_recipe_slug_image(self, recipe_slug): return f"{self.prefix}/recipes/{recipe_slug}/image" + def recipes_recipe_slug_zip(self, recipe_slug): + return f"{self.prefix}/recipes/{recipe_slug}/zip" + def recipes_slug_comments(self, slug): return f"{self.prefix}/recipes/{slug}/comments" diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 4e2ebdfd3..682dd0d9c 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -23,7 +23,8 @@ services: image: mealie-api:dev build: context: ./ - dockerfile: Dockerfile.dev + target: development + dockerfile: Dockerfile restart: always ports: - 9921:9000 diff --git a/docker-compose.yml b/docker-compose.yml index 09452c92c..4d48fe068 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,7 @@ services: mealie: build: context: ./ + target: production dockerfile: Dockerfile container_name: mealie restart: always @@ -17,6 +18,9 @@ services: POSTGRES_SERVER: postgres POSTGRES_PORT: 5432 POSTGRES_DB: mealie + # WORKERS_PER_CORE: 0.5 + # MAX_WORKERS: 8 + WEB_CONCURRENCY: 2 postgres: container_name: postgres image: postgres diff --git a/docs/docs/assets/js/extra.js b/docs/docs/assets/js/extra.js new file mode 100644 index 000000000..20e0e43b5 --- /dev/null +++ b/docs/docs/assets/js/extra.js @@ -0,0 +1,11 @@ +/* Add target="_blank" to external links */ +/* Source: https://html.com/attributes/a-target/#:~:text=browser */ +function externalLinks() { + for (var c = document.getElementsByTagName("a"), a = 0; a < c.length; a++) { + var b = c[a]; + b.getAttribute("href") && + b.hostname !== location.hostname && + (b.target = "_blank"); + } +} +externalLinks(); diff --git a/docs/docs/assets/stylesheets/custom.css b/docs/docs/assets/stylesheets/custom.css index 8cad0f7ba..45dc642f4 100644 --- a/docs/docs/assets/stylesheets/custom.css +++ b/docs/docs/assets/stylesheets/custom.css @@ -33,6 +33,12 @@ a.md-button.md-button:hover { color: #ffffff; } +/* Add icon after external links */ +/* Ignore auto-generated material theme links */ +a[target="_blank"]:not([class*="md-"]):after { + content: " " url("../svg/open-in-new.svg"); +} + /* Site width etc.*/ .md-grid { max-width: 64rem !important; diff --git a/docs/docs/assets/svg/open-in-new.svg b/docs/docs/assets/svg/open-in-new.svg new file mode 100644 index 000000000..683740e5b --- /dev/null +++ b/docs/docs/assets/svg/open-in-new.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docs/docs/changelog/v0.5.0.md b/docs/docs/changelog/v0.5.0.md index 210b2ac26..8376233c4 100644 --- a/docs/docs/changelog/v0.5.0.md +++ b/docs/docs/changelog/v0.5.0.md @@ -18,7 +18,7 @@ If you have been using the API directly, many of the routes and status codes have changed. You may experience issues with directly consuming the API. #### Arm/v7 Support - Mealie will no longer build in CI/CD due to a issue with the rust compiler on 32 bit devices. You can reference [this issue on the matrix-org/synapse](https://github.com/matrix-org/synapse/issues/9403){:target="_blank"} Github page that are facing a similar issue. You may still be able to build the docker image you-self. + Mealie will no longer build in CI/CD due to a issue with the rust compiler on 32 bit devices. You can reference [this issue on the matrix-org/synapse](https://github.com/matrix-org/synapse/issues/9403) Github page that are facing a similar issue. You may still be able to build the docker image you-self. !!! warning "Potential Data Loss" With this release comes a major rework of how files are stored on disk and where things belong. Migration of files should be done automatically. We have tested extensively with many different backups and user bases and have found that no one experienced data-loss. HOWEVER, with all the major changes that have occurred, it is vital that to prevent any data-loss you must create a backup and store that backup outside of your mealie instance. If you do not do this, you may lose your data. @@ -44,7 +44,7 @@ ### Highlights - Recipe Parser - Recipes can now be imported with a bookmarklet! - - Significant improvement in supported sites with the new [Recipe Scraper Library](https://github.com/hhursev/recipe-scrapers){:target="_blank"} + - Significant improvement in supported sites with the new [Recipe Scraper Library](https://github.com/hhursev/recipe-scrapers) - UI Debugging now available at `/recipes/debugger` - Better error messages on failure - ⚠️ last_recipe.json is now depreciated diff --git a/docs/docs/changelog/v0.5.1.md b/docs/docs/changelog/v0.5.1.md index d75d21916..ad54dface 100644 --- a/docs/docs/changelog/v0.5.1.md +++ b/docs/docs/changelog/v0.5.1.md @@ -1,4 +1,4 @@ -# vx.x.x COOL TITLE GOES HERE +# v0.5.1 **App Version: v0.5.1** diff --git a/docs/docs/changelog/v0.5.2.md b/docs/docs/changelog/v0.5.2.md new file mode 100644 index 000000000..a11dfdbf7 --- /dev/null +++ b/docs/docs/changelog/v0.5.2.md @@ -0,0 +1,65 @@ +# v0.5.2 + +**App Version: v0.5.2** + +**Database Version: v0.5.0** + +## Bug Fixes +- Fixed #617 - Section behavior when adding a step +- Fixed #615 - Recipe Settings are not available when creating new recipe +- Fixed #625 - API of today's image returns strange characters +- Fixed [#590](https://github.com/hay-kot/mealie/issues/590) - Duplicate Events when using Gunicorn Workers + +## Features and Improvements + +### General +- Recipe Instructions now collapse when checked +- Default recipe settings can be set through ENV variables +- Recipe Ingredient lists can now container ingredient sections. +- You can now download and upload individual recipes + + +### Localization + +Huge thanks to [@sephrat](https://github.com/sephrat) for all his work on the project. He's very consistent in his contributions to the project and nearly every release has had some of his code in it! Here's some highlights from this release + + - Lazy Load Translations (Huge Performance Increase!) + - Tons of localization additions all around the site. + - All of the work that goes into managing and making Crowdin a great feature the application + +#### Here a list of contributors on Crowding who make Mealie possible in different locals + +| Name | Languages | Translated (Words) | Target Words | +| ---------------------------- | ------------------ | :----------------: | :----------: | +| retmas-gh | Polish | 550 | 625 | +| startos | Italian | 310 | 322 | +| CMBoii | Spanish | 256 | 291 | +| sephrat | French | 255 | 296 | +| Daniel Tildeman (tildeman) | Swedish | 233 | 228 | +| Rourke | Dutch | 216 | 214 | +| Andreas Waschinski (Wascha) | German | 207 | 202 | +| wengtad | Chinese Simplified | 176 | 343 | +| Matthias Borremans (MrBorri) | Dutch | 96 | 89 | +| Adam Syndoman (pypckompsite) | Polish | 68 | 65 | +| JonasSchubert | German | 22 | 23 | +| ThrawnJL | Danish | 7 | 7 | +| NicholasBrody | Dutch | 7 | 7 | +| Giel Janssens (gieljnssns) | Dutch | 4 | 4 | +| kentora | Danish | 3 | 2 | + + + +### Docker + +#### Huge thanks to [@wengtad](https://github.com/wengtad) for all his work on improving the deployment with docker. + + - Optimize Docker Dev Size (Frontend: from ~1.52GB to ~429MB | API: from ~657MB to ~380MB) + - Optimize Docker Prod Size (from ~542MB to ~373MB) + - Add Gunicorn + - Add Gunicorn and Webworkers to Dockerfile #550 + - Add Docs for Gunicorn + - Add PUID/PGID to Docker. Fixes Initialization scripts fail to run when not executing as root user inside container #350, + - Not able to run correctly in docker if user permissions are specified #429 + - Merge Dockerfile.dev into Dockerfile (dev shared same base together with prod) + - Add Docs for PUID/PGID + - Add Docker healthcheck (for this is not necessary, I could remove if you want) \ No newline at end of file diff --git a/docs/docs/contributors/developers-guide/code-contributions.md b/docs/docs/contributors/developers-guide/code-contributions.md index 8573fbc3f..4e17067a0 100644 --- a/docs/docs/contributors/developers-guide/code-contributions.md +++ b/docs/docs/contributors/developers-guide/code-contributions.md @@ -1,12 +1,12 @@ # Contributing to Mealie -[Please Join the Discord](https://discord.gg/QuStdQGSGK){:target="_blank"}. We are building a community of developers working on the project. +[Please Join the Discord](https://discord.gg/QuStdQGSGK). We are building a community of developers working on the project. ## We Develop with Github We use github to host code, to track issues and feature requests, as well as accept pull requests. -## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html){:target="_blank"}, So All Code Changes Happen Through Pull Requests -Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html){:target="_blank"}). We actively welcome your pull requests: +## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests +Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 1. Fork the repo and create your branch from `dev`. 2. Checkout the Discord, the PRs page, or the Projects page to get an idea of what's already being worked on. @@ -17,10 +17,10 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu 7. If you make changes to the dev branch reflect those changes in the active changelog to keep track of changes. Don't forget to add your name/handle/identifier! ## Any contributions you make will be under the MIT Software License -In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/){:target="_blank"} that covers the project. Feel free to contact the maintainers if that's a concern. +In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. -## Report bugs using Github's [issues](https://github.com/hay-kot/mealie/issues){:target="_blank"} -We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/hay-kot/mealie/issues/new){:target="_blank"}; it's that easy! +## Report bugs using Github's [issues](https://github.com/hay-kot/mealie/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/hay-kot/mealie/issues/new); it's that easy! ## Write bug reports with detail, background, and sample code **Great Bug Reports** tend to have: @@ -28,7 +28,7 @@ We use GitHub issues to track public bugs. Report a bug by [opening a new issue] - A quick summary and/or background - Steps to reproduce - Be specific! - - Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626){:target="_blank"} includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing + - Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing - What you expected would happen - What actually happens - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) @@ -40,4 +40,4 @@ People *love* thorough bug reports. I'm not even kidding. By contributing, you agree that your contributions will be licensed under its MIT License. ## References -This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md){:target="_blank"} +This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md) diff --git a/docs/docs/contributors/developers-guide/starting-dev-server.md b/docs/docs/contributors/developers-guide/starting-dev-server.md index d71ec7a35..21510750d 100644 --- a/docs/docs/contributors/developers-guide/starting-dev-server.md +++ b/docs/docs/contributors/developers-guide/starting-dev-server.md @@ -48,4 +48,4 @@ code-gen 🤖 Run Code-Gen Scripts Before you commit any changes on the backend/python side you'll want to run `make format` to format all the code with black. `make lint` to check with flake8, and `make test` to run pytests. You can also use `make test-all` to run both `lint` and `test`. -Run into another issue? [Ask for help on discord](https://discord.gg/QuStdQGSGK){:target="_blank"} \ No newline at end of file +Run into another issue? [Ask for help on discord](https://discord.gg/QuStdQGSGK) \ No newline at end of file diff --git a/docs/docs/contributors/non-coders.md b/docs/docs/contributors/non-coders.md index 2f79b5fa1..f5e8a8dea 100644 --- a/docs/docs/contributors/non-coders.md +++ b/docs/docs/contributors/non-coders.md @@ -9,7 +9,7 @@ We love your input! We want to make contributing to this project as easy and tra - Becoming a maintainer - Help translate to a new language or improve current translations -[Remember to join the Discord and stay in touch with other developers working on the project](https://discord.gg/QuStdQGSGK){:target="_blank"}! +[Remember to join the Discord and stay in touch with other developers working on the project](https://discord.gg/QuStdQGSGK)! Additionally, you can buy me a coffee and support the project. When I get financial support it helps me know that there's real interest in the project and that it's worth the time to keep developing. diff --git a/docs/docs/contributors/translating.md b/docs/docs/contributors/translating.md index a39862127..b4fa608f6 100644 --- a/docs/docs/contributors/translating.md +++ b/docs/docs/contributors/translating.md @@ -1,11 +1,11 @@ # Contributing with Translations Translations can be a great way **for non-coders** to contribute to project. -We use **[Crowdin](https://crowdin.com/project/mealie){:target="_blank"}** to allow several contributors to work on translating Mealie. +We use **[Crowdin](https://crowdin.com/project/mealie)** to allow several contributors to work on translating Mealie. You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language. Translations are regularly pulled from Crowdin and included in each new release. -Please use Crowdin as much as possible if you have any question/issue regarding a particular string. You can take a look at [Crowdin Knowledge base](https://support.crowdin.com/for-volunteer-translators/){:target="_blank"} if you want to know more about how to use this tool. +Please use Crowdin as much as possible if you have any question/issue regarding a particular string. You can take a look at [Crowdin Knowledge base](https://support.crowdin.com/for-volunteer-translators/) if you want to know more about how to use this tool. ## My language is missing in Mealie Once your language is translated on Crowdin, we need to manually add it in Mealie. If you believe your language is ready for use, please create an issue on GitHub. @@ -13,9 +13,9 @@ Once your language is translated on Crowdin, we need to manually add it in Meali ## I can't find a particular text in Crowdin There can be several reasons: - The text you're looking for is outdated: someone has already changed it or it will be removed/changed in the next release. -- It is possible some texts are not translatable (yet) for technical reasons. If you spot one, please reach out to us on [Discord](https://discord.gg/QuStdQGSGK){:target="_blank"} or raise an issue on GitHub. +- It is possible some texts are not translatable (yet) for technical reasons. If you spot one, please reach out to us on [Discord](https://discord.gg/QuStdQGSGK) or raise an issue on GitHub. ## Technical information -We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/src/locales/messages](https://github.com/hay-kot/mealie/tree/master/frontend/src/locales/messages){:target="_blank"}. +We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/src/locales/messages](https://github.com/hay-kot/mealie/tree/master/frontend/src/locales/messages). -[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally){:target="_blank"} is helpful for generating new strings to translate. It also has a nice feature, which shows translations in-place when editing code. \ No newline at end of file +[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) is helpful for generating new strings to translate. It also has a nice feature, which shows translations in-place when editing code. \ No newline at end of file diff --git a/docs/docs/documentation/admin/backups-and-exports.md b/docs/docs/documentation/admin/backups-and-exports.md index 859c561e4..099208e1b 100644 --- a/docs/docs/documentation/admin/backups-and-exports.md +++ b/docs/docs/documentation/admin/backups-and-exports.md @@ -3,7 +3,7 @@ All recipe data can be imported and exported as necessary from the UI. Under the admin page you'll find the section for using Backups and Exports. !!! danger - As this is still a **BETA** It is recommended that you backup your data often and store in more than one place. Ad-hear to backup best practices with the [3-2-1 Backup Rule](https://en.wikipedia.org/wiki/Backup){:target="_blank"}. Prior to upgrading you **should** perform a backup to limit any data loss. + As this is still a **BETA** it is recommended that you backup your data often and store in more than one place. Adhere to backup best practices with the [3-2-1 Backup Rule](https://en.wikipedia.org/wiki/Backup). Prior to upgrading you **should** perform a backup to limit any data loss. !!! tip "Mealie data that is saved on backups" - [x] Recipe Data @@ -15,7 +15,7 @@ All recipe data can be imported and exported as necessary from the UI. Under the To create an export simply add the tag and the markdown template and click "Create" and your backup will be created on the server. The backup is a standard zipfile containing all the images, json files, and rendered jinaj2 templates for each recipe. To view the available variables, open a recipe in the json editor. -To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as a source to restore from. Selected the desired backup and import the backup file. Backups can be uploaded from the UI as well as added on the file system +To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as a source to restore from. Selected the desired backup and import the backup file. Backups can be uploaded from the UI as well as added on the file system. ## Demo @@ -60,7 +60,7 @@ wget http://localhost:9000/api/utils/download?token={fileToken} ## Jinja2 Templating -On export you can select a template to use to render files using the jinja2 syntax. This can be done to export recipes in other formats besides regular .json.Look at this example for rendering a markdown recipe using the jinja2 syntax. +On export you can select a template to use to render files using the jinja2 syntax. This can be done to export recipes in other formats besides regular .json. Look at this example for rendering a markdown recipe using the jinja2 syntax. ### Input ```jinja2 @@ -128,4 +128,4 @@ Categories: [] Original URL: https://www.bonappetit.com/recipe/five-spice-popcorn-chicken#intcid=_bon-appetit-recipe-bottom-recirc_3cad5ce9-734a-46f8-b503-78c33d2e7279_similar2-3 ``` -If you decide you don't like mealie. This is a good way to export into a format that can be imported into another. \ No newline at end of file +If you decide you don't like mealie: This is a good way to export into a format that can be imported into another. diff --git a/docs/docs/documentation/admin/building-pages.md b/docs/docs/documentation/admin/building-pages.md index c6ce2dfc7..a3c14b3b8 100644 --- a/docs/docs/documentation/admin/building-pages.md +++ b/docs/docs/documentation/admin/building-pages.md @@ -1,13 +1,13 @@ # Building Pages !!! warning - The page building is still experimental and may change. You can provide feedback on any changes you'd like to see on [github](https://github.com/hay-kot/mealie/discussions/229){:target="_blank"} + The page building is still experimental and may change. You can provide feedback on any changes you'd like to see on [github](https://github.com/hay-kot/mealie/discussions/229) Custom pages can be created to organize multiple categories into a single page. Links to your custom pages are displayed on the home page sidebar and accessible by all users, however only Administrators can create or update pages. ![custom page](../../assets/img/custom-page.webp) -To create a new page. Navigate to the settings page at `/admin/settings` and scroll down to the custom pages section. Here you can create, view, and edit your custom pages. To reorder how they are displayed on the sidebar you can drag and drop the pages into the preferred order. +To create a new page navigate to the settings page at `/admin/settings` and scroll down to the custom pages section. Here you can create, view, and edit your custom pages. To reorder how they are displayed on the sidebar you can drag and drop the pages into the preferred order. ![create custom page](../../assets/gifs/create-custom-page-demo.gif) !!! tip - To save the order of pages you must click the save button displayed on the bottom of the Custom Page section. This is not necessary for updating individual page data. \ No newline at end of file + To save the order of pages you must click the save button displayed on the bottom of the Custom Page section. This is not necessary for updating individual page data. diff --git a/docs/docs/documentation/admin/migration-imports.md b/docs/docs/documentation/admin/migration-imports.md index b0296b902..e559ce553 100644 --- a/docs/docs/documentation/admin/migration-imports.md +++ b/docs/docs/documentation/admin/migration-imports.md @@ -8,7 +8,7 @@ To migrate recipes from a Chowdown 3. Select import on the newly available migration. ## Nextcloud Recipes -Nextcloud recipes can be imported from a zip file the contains the data stored in Nextcloud. The zip file can be uploaded from the frontend or placed in the data/migrations/nextcloud directory. See the example folder structure below to ensure your recipes are able to be imported. +Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. The zip file can be uploaded from the frontend or placed in the data/migrations/nextcloud directory. See the example folder structure below to ensure your recipes are able to be imported. ``` nextcloud_recipes.zip diff --git a/docs/docs/documentation/admin/site-settings.md b/docs/docs/documentation/admin/site-settings.md index 7f23bc966..5f6c39d71 100644 --- a/docs/docs/documentation/admin/site-settings.md +++ b/docs/docs/documentation/admin/site-settings.md @@ -1,5 +1,5 @@ # Site Settings -Your sites settings panel can only be accessed by administrators. This where you can customize your site for all users. +Your sites settings panel can only be accessed by administrators. This is where you can customize your site for all users. ## Home Page Settings | Option | Description | @@ -13,7 +13,3 @@ Your sites settings panel can only be accessed by administrators. This where you ![Site Settings Image](../../assets/img/site-settings.webp) - - - - diff --git a/docs/docs/documentation/admin/user-management.md b/docs/docs/documentation/admin/user-management.md index efecfc2fc..4dce96e66 100644 --- a/docs/docs/documentation/admin/user-management.md +++ b/docs/docs/documentation/admin/user-management.md @@ -1,4 +1,4 @@ -# User Managemenet +# User Management As of version v0.4.0 users have limited functionality, but they will offer more permissions and structure as time goes on. To understand the different systems, see each section below. Note, that by default all users will be assigned the default group. If you're only managing one household you won't need to do anything to set up a new group. @@ -47,7 +47,7 @@ As of version v0.4.0 users have limited functionality, but they will offer more On the first startup you'll need to login to Mealie using the default username and password `changeme@email.com` and `MyPassword` or the default set through the env variable. On first login you'll be required to reset your password. After resetting your password you should also change your email address as appropriate. This will be used for logins on all future requests. !!! tip - Your default password environmental variable will be the default password for all new users that are created. This is stored in plain text and should not be used **any where** else. + Your default password environment variable will be the default password for all new users that are created. This is stored in plain text and should not be used **anywhere** else. ## Creating and Editing Users @@ -80,7 +80,7 @@ You can easily create and manage groups via the frontend in the admin panel unde ![Group Management Panel](../../assets/img/group-manager.png) !!! tip - User Groups can only be deleted if no users are apart of the group. If you want to delete a group, you must assign the users to another group before removing. + User Groups can only be deleted if no users are a part of the group. If you want to delete a group, you must assign the users to another group before removing. ## Password Reset -If a user forgets their password an administrator is able to reset their password through the user management page. In the user table, select edit. In the popup windows click the "Reset Password" to reset a user's password to the default. This is either 'MyPassword' or set through an environment variable. See the [Installation Page](../getting-started/install.md) for more details on environmental variables +If a user forgets their password an administrator is able to reset their password through the user management page. In the user table, select edit. In the popup window click the "Reset Password" to reset a user's password to the default. This is either 'MyPassword' or set through an environment variable. See the [Installation Page](../getting-started/install.md) for more details on environment variables. diff --git a/docs/docs/documentation/community-guide/home-assistant.md b/docs/docs/documentation/community-guide/home-assistant.md index 09f7c736f..85b9213c5 100644 --- a/docs/docs/documentation/community-guide/home-assistant.md +++ b/docs/docs/documentation/community-guide/home-assistant.md @@ -2,10 +2,10 @@ This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed! -In a lot of ways, Home Assistant is why this project exists! Since it Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard. +In a lot of ways, Home Assistant is why this project exists! Since Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard. ### Get Todays Meal in Lovelace -Starting in v0.4.1 you are now able to use the uri `/api​/meal-plans​/today​/image?group_name=Home` to directly access the image to todays meal. This makes it incredible easy to include the image into your Home Assistant Dashboard using the picture entity. +Starting in v0.4.1 you are now able to use the uri `/api​/meal-plans​/today​/image?group_name=Home` to directly access the image to todays meal. This makes it incredibly easy to include the image into your Home Assistant Dashboard using the picture entity. Here's an example where `sensor.mealie_todays_meal` is pulling in the meal-plan name and I'm using the url to get the image. @@ -29,6 +29,19 @@ style: } ``` +The sensor that gets the name of the meal can be achieved using the following REST sensor in Home Assistant +```yaml +sensor: + - platform: rest + resource: 'http://localhost:9000/api/meal-plans/today' + method: GET + name: Mealie todays meal + headers: + Authorization: Bearer MySuperSecretBearerCode + value_template: "{{ value_json.name }}" +``` +The Bearer token can be created from the User Settings page (https://hay-kot.github.io/mealie/documentation/users-groups/user-settings/#api-key-generation) + !!! tip - Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This includes and [additional installation](https://github.com/thomasloven/lovelace-card-mod){:target="_blank"} from HACS. + Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This includes and [additional installation](https://github.com/thomasloven/lovelace-card-mod) from HACS. diff --git a/docs/docs/documentation/community-guide/ios.md b/docs/docs/documentation/community-guide/ios.md index b191acf3e..f5fc96ca8 100644 --- a/docs/docs/documentation/community-guide/ios.md +++ b/docs/docs/documentation/community-guide/ios.md @@ -1,40 +1,22 @@ # Using iOS Shortcuts with Mealie - -!!! info - This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed! +![Image from apple site](https://help.apple.com/assets/5E8CEA35094622DF10489984/5E8CEA42094622DF1048998D/en_US/ed1f9c157cdefc13e0161e0f70015455.png) -![](../../assets/img/iphone-image.png){: align=right style="height:400px;width:400px"} - - -User [brasilikum](https://github.com/brasilikum){:target="_blank"} opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/hay-kot/mealie/issues/103){:target="_blank"} for interested users. This is a useful utility for iOS users who browse for recipes in their web browser from their devices. +User [brasilikum](https://github.com/brasilikum) opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/hay-kot/mealie/issues/103) for interested users. This is a useful utility for iOS users who browse for recipes in their web browser from their devices. Recent updates to Mealie has made this original shortcut break. Reddit user [BooNooBooNooB](https://www.reddit.com/user/BooNooBooNooB/) has helped to create a new working version. Don't know what an iOS shortcut is? Neither did I! Experienced iOS users may already be familiar with this utility but for the uninitiated, here is the official Apple explanation: - > A shortcut is a quick way to get one or more tasks done with your apps. The Shortcuts app lets you create your own shortcuts with multiple steps. For example, build a “Surf Time” shortcut that grabs the surf report, gives an ETA to the beach, and launches your surf music playlist. +> +Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/4c40fcc6f39549f9a189995a449cd44f) but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device. -Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/6ae356d5fc644cfa8983a3c90f242fbb){:target="_blank"} but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device. In brasilikum's shortcut, you need to make changes for it to work. Recent updates to the project have changed some of the syntax and folder structure since its original creation. +You need to replace `username` and `password` with the login information for your mealie instance. +![screenshot](../img/iOS_username.jpg) -![screenshot](../../assets/img/ios-shortcut-image.jpg){: align=right style="height:500;width:400px"} +Then, you need to put in your mealie domain. The API port of `:9000` is not needed when putting your domain in the text field. +![screenshot](../img/iOS_host.jpg) - -!!! tip - You may need to change the url depending on which version you're using. Recipe is now plural and there is no trailing "/" at the end of the string. - - ``` - api/recipe/create-url/ - ``` - - to - - ``` - api/recipes/create-url - ``` - - - -Having made those changes, you should now be able to share a website to the shortcut and have mealie grab all the necessary information! \ No newline at end of file +You should now be able to share a website to the shortcut and have mealie grab all the necessary information! diff --git a/docs/docs/documentation/community-guide/swag.md b/docs/docs/documentation/community-guide/swag.md index 82443f632..3b3f8a0d4 100644 --- a/docs/docs/documentation/community-guide/swag.md +++ b/docs/docs/documentation/community-guide/swag.md @@ -5,16 +5,16 @@ -To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag){:target="_blank"} +To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag) SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention. ## Step 1: Get a domain -The first step is to grab a dynamic DNS if you don't have your own subdomain already. You can get this from for example [DuckDNS](https://www.duckdns.org){:target="_blank"}. +The first step is to grab a dynamic DNS if you don't have your own subdomain already. You can get this from for example [DuckDNS](https://www.duckdns.org). ## Step 2: Set-up SWAG -Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag){:target="_blank"}. +Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag). This is an example of how to set it up using duckdns and docker-compose. !!! example "docker-compose.yml" @@ -53,7 +53,7 @@ Don't forget to change the mydomain.duckns into your personal domai ## Step 3: Change the config files Navigate to the config folder of SWAG and head to proxy-confs. If you used the example above, you should navigate to: /etc/config/swag/nginx/proxy-confs/. -There are a lot of preconfigured files to use for different apps such as radarr,sonarr,overseerr,... +There are a lot of preconfigured files to use for different apps such as radarr, sonarr, overseerr, ... To use the bundled configuration file, simply rename mealie.subdomain.conf.sample in the proxy-confs folder to mealie.subdomain.conf. Alternatively, you can create a new file mealie.subdomain.conf in proxy-confs with the following configuration: diff --git a/docs/docs/documentation/getting-started/api-usage.md b/docs/docs/documentation/getting-started/api-usage.md index 837ee0b2a..3467252a4 100644 --- a/docs/docs/documentation/getting-started/api-usage.md +++ b/docs/docs/documentation/getting-started/api-usage.md @@ -8,7 +8,7 @@ Mealie supports long-live api tokens in the user frontend. See [user settings pa ## Key Components ### Exploring Your Local API -On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://mealie.yourdomain.com/docs` or see the example at the [Demo Site](https://mealie-demo.hay-kot.dev/docs){:target="_blank"} +On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://mealie.yourdomain.com/docs` or see the example at the [Demo Site](https://mealie-demo.hay-kot.dev/docs) ### Recipe Extras Recipes extras are a key feature of the Mealie API. They allow you to create custom json key/value pairs within a recipe to reference from 3rd part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device. diff --git a/docs/docs/documentation/getting-started/install.md b/docs/docs/documentation/getting-started/install.md index 6de93f6e8..390806802 100644 --- a/docs/docs/documentation/getting-started/install.md +++ b/docs/docs/documentation/getting-started/install.md @@ -1,17 +1,17 @@ # Installation -To deploy mealie on your local network it is highly recommended to use docker to deploy the image straight from dockerhub. Using the docker-compose below you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with mealies automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish. +To deploy mealie on your local network it is highly recommended to use docker to deploy the image straight from dockerhub. Using the docker-compose below you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with mealies automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish. -[Get Docker](https://docs.docker.com/get-docker/){:target="_blank"} +[Get Docker](https://docs.docker.com/get-docker/) -[Mealie on Dockerhub](https://hub.docker.com/r/hkotel/mealie){:target="_blank"} - - - linux/amd64 - - linux/arm64 +[Mealie on Dockerhub](https://hub.docker.com/r/hkotel/mealie) +- linux/amd64 +- linux/arm64 ## Quick Start - Docker CLI -Deployment with the Docker CLI can be done with `docker run` and specify the database type, in this case `sqlite`, setting the exposed port `9925`, mounting the current directory, and pull the latest image. After the image is up an running you can navigate to http://your.ip.addres:9925 and you'll should see mealie up and running! + +Deployment with the Docker CLI can be done with `docker run` and specify the database type, in this case `sqlite`, setting the exposed port `9925`, mounting the current directory, and pull the latest image. After the image is up and running you can navigate to http://your.ip.address:9925 and you'll should see mealie up and running! ```shell docker run \ @@ -22,12 +22,14 @@ docker run \ ``` !!! tip "Default Credentials" - **Username:** changeme@email.com + + **Username:** changeme@email.com **Password:** MyPassword ## Docker Compose with SQLite -Deployment with docker-compose is the recommended method for deployment. The example below will create an instance of mealie available on port `9925` with the data volume mounted from the local directory. To use, create a docker-compose.yml file, paste the contents below and save. In the terminal run `docker-compose up -d` to start the container. + +Deployment with docker-compose is the recommended method for deployment. The example below will create an instance of mealie available on port `9925` with the data volume mounted from the local directory. To use, create a docker-compose.yml file, paste the contents below and save. In the terminal run `docker-compose up -d` to start the container. ```yaml version: "3.1" @@ -39,14 +41,29 @@ services: ports: - 9925:80 environment: + PUID: 1000 + PGID: 1000 TZ: America/Anchorage + + # Default Recipe Settings + RECIPE_PUBLIC: true + RECIPE_SHOW_NUTRITION: true + RECIPE_SHOW_ASSETS: true + RECIPE_LANDSCAPE_VIEW: true + RECIPE_DISABLE_COMMENTS: false + RECIPE_DISABLE_AMOUNT: false + + # Gunicorn + WEB_CONCURRENCY: 2 + # WORKERS_PER_CORE: 0.5 + # MAX_WORKERS: 8 volumes: - ./mealie/data/:/app/data - ``` -## Docker Compose with Postgres *(BETA)* -Postgres support was introduced in v0.5.0. At this point it should be used with caution and frequent backups. +## Docker Compose with Postgres _(BETA)_ + +Postgres support was introduced in v0.5.0. At this point it should be used with caution and frequent backups. ```yaml version: "3.1" @@ -57,13 +74,35 @@ services: restart: always ports: - 9090:80 + depends_on: + - postgres environment: + PUID: 1000 + PGID: 1000 + TZ: America/Anchorage + + # Database Settings DB_ENGINE: postgres # Optional: 'sqlite', 'postgres' POSTGRES_USER: mealie POSTGRES_PASSWORD: mealie POSTGRES_SERVER: postgres POSTGRES_PORT: 5432 POSTGRES_DB: mealie + + # Default Recipe Settings + RECIPE_PUBLIC: true + RECIPE_SHOW_NUTRITION: true + RECIPE_SHOW_ASSETS: true + RECIPE_LANDSCAPE_VIEW: true + RECIPE_DISABLE_COMMENTS: false + RECIPE_DISABLE_AMOUNT: false + + # Gunicorn + WEB_CONCURRENCY: 2 + # WORKERS_PER_CORE: 0.5 + # MAX_WORKERS: 8 + volumes: + - ./mealie/data/:/app/data postgres: container_name: postgres image: postgres @@ -75,79 +114,93 @@ services: ## Env Variables -| Variables | Default | Description | -| ----------------- | --------------------- | ----------------------------------------------------------------------------------- | -| DEFAULT_GROUP | Home | The default group for users | -| DEFAULT_EMAIL | changeme@email.com | The default username for the superuser | -| BASE_URL | http://localhost:8080 | Used for Notifications | -| DB_ENGINE | sqlite | Optional: 'sqlite', 'postgres' | -| POSTGRES_USER | mealie | Postgres database user | -| POSTGRES_PASSWORD | mealie | Postgres database password | -| POSTGRES_SERVER | postgres | Postgres database server address | -| POSTGRES_PORT | 5432 | Postgres database port | -| POSTGRES_DB | mealie | Postgres database name | -| TOKEN_TIME | 2 | The time in hours that a login/auth token is valid | -| API_PORT | 9000 | The port exposed by backend API. **do not change this if you're running in docker** | -| API_DOCS | True | Turns on/off access to the API documentation locally. | -| TZ | UTC | Must be set to get correct date/time on the server | +| Variables | Default | Description | +| ----------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| PUID | 911 | UserID permissions between host OS and container | +| PGID | 911 | GroupID permissions between host OS and container | +| DEFAULT_GROUP | Home | The default group for users | +| DEFAULT_EMAIL | changeme@email.com | The default username for the superuser | +| BASE_URL | http://localhost:8080 | Used for Notifications | +| DB_ENGINE | sqlite | Optional: 'sqlite', 'postgres' | +| POSTGRES_USER | mealie | Postgres database user | +| POSTGRES_PASSWORD | mealie | Postgres database password | +| POSTGRES_SERVER | postgres | Postgres database server address | +| POSTGRES_PORT | 5432 | Postgres database port | +| POSTGRES_DB | mealie | Postgres database name | +| TOKEN_TIME | 2 | The time in hours that a login/auth token is valid | +| RECIPE_PUBLIC | True | Default Recipe Settings - Make Recipe Public | +| RECIPE_SHOW_NUTRITION | True | Default Recipe Settings - Show Recipe Nutrition | +| RECIPE_SHOW_ASSETS | True | Default Recipe Settings - Show Recipe Assets | +| RECIPE_LANDSCAPE_VIEW | True | Default Recipe Settings - Set Landscape View | +| RECIPE_DISABLE_COMMENTS | False | Default Recipe Settings - Disable Comments | +| RECIPE_DISABLE_AMOUNT | False | Default Recipe Settings - Disable Amount | +| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** | +| API_DOCS | True | Turns on/off access to the API documentation locally. | +| TZ | UTC | Must be set to get correct date/time on the server | +| WORKERS_PER_CORE | 1 | Set the number of workers to the number of CPU cores multiplied by this value (Value \* CPUs). More info [here][workers_per_core] | +| MAX_WORKERS | | Set the maximum number of workers to use. Default is not set meaning unlimited. More info [here][max_workers] | +| WEB_CONCURRENCY | 2 | Override the automatic definition of number of workers. More info [here][web_concurrency] | ## Raspberry Pi 4 !!! tip "Fatal Python error: init_interp_main: can't initialize time" + Some users experience an problem with running the linux/arm/v7 container on Raspberry Pi 4. This is not a problem with the Mealie container, but with a bug in the hosts Docker installation. - - Update the host RP4 using [instructions](https://github.com/linuxserver/docker-papermerge/issues/4#issuecomment-735236388){:target="_blank"}, summarized here: + + Update the host RP4 using [instructions](https://github.com/linuxserver/docker-papermerge/issues/4#issuecomment-735236388), summarized here: ```shell wget http://ftp.us.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.1-1_armhf.deb sudo dpkg -i libseccomp2_2.5.1-1_armhf.deb ``` +## Advanced - -## Advanced !!! warning "Not Required" - The items below are completely optional and are not required to manage or install your Mealie instance. + + The items below are completely optional and are not required to manage or install your Mealie instance. ### Custom Caddy File -The Docker image provided by Mealie contains both the API and the html bundle in one convenient image. This is done by using a proxy server to serve different parts of the application depending on the URL/URI. Requests sent to `/api/*` or `/docs` will be directed to the API, anything else will be served the static web files. Below is the default Caddyfile that is used to proxy requests. You can override this file by mounting an alternative Caddyfile to `/app/Caddyfile`. + +The Docker image provided by Mealie contains both the API and the html bundle in one convenient image. This is done by using a proxy server to serve different parts of the application depending on the URL/URI. Requests sent to `/api/*` or `/docs` will be directed to the API, anything else will be served the static web files. Below is the default Caddyfile that is used to proxy requests. You can override this file by mounting an alternative Caddyfile to `/app/Caddyfile`. ``` { - auto_https off + auto_https off admin off } :80 { @proxied path /api/* /docs /openapi.json - + root * /app/dist encode gzip uri strip_suffix / - + handle_path /api/recipes/image/* { root * /app/data/img/ file_server } handle @proxied { - reverse_proxy http://127.0.0.1:9000 + reverse_proxy http://127.0.0.1:9000 } handle { try_files {path}.html {path} / - file_server + file_server } - } ``` ## Deployed without Docker -!!! error "Unsupported Deployment" - If you are experiencing a problem with manual deployment, please do not submit a github issue unless it is related to an aspect of the application. For deployment help, the [discord server](https://discord.gg/QuStdQGSGK){:target="_blank"} is a better place to find support. -Alternatively, this project is built on Python and SQLite so you may run it as a python application on your server. This is not a supported options for deployment and is only here as a reference for those who would like to do this on their own. To get started you can clone this repository into a directory of your choice and use the instructions below as a reference for how to get started. +!!! error "Unsupported Deployment" + + If you are experiencing a problem with manual deployment, please do not submit a github issue unless it is related to an aspect of the application. For deployment help, the [discord server](https://discord.gg/QuStdQGSGK) is a better place to find support. + +Alternatively, this project is built on Python and SQLite so you may run it as a python application on your server. This is not a supported options for deployment and is only here as a reference for those who would like to do this on their own. To get started you can clone this repository into a directory of your choice and use the instructions below as a reference for how to get started. There are three parts to the Mealie application @@ -156,14 +209,19 @@ There are three parts to the Mealie application - Proxy Server ### Frontend/ Static Files + The frontend static files are generated with `npm run build`. This is done during the build process with docker. If you choose to deploy this as a system application you must do this process yourself. In the project directory run `cd frontend` to change directories into the frontend directory and run `npm install` and then `npm run build`. This will generate the static files in a `dist` folder in the frontend directory. ### Backend API + The backend API is build with Python, FastAPI, and SQLite and requires Python 3.9, and Poetry. Once the requirements are installed, in the project directory you can run the command `poetry install` to create a python virtual environment and install the python dependencies. -Once the dependencies are installed you should be ready to run the server. To initialize that database you need to first run `python mealie/db/init_db.py`. Then to start The web server, you run the command `uvicorn mealie.app:app --host 0.0.0.0 --port 9000` - +Once the dependencies are installed you should be ready to run the server. To initialize that database you need to first run `python mealie/db/init_db.py`. Then to start The web server, you run the command `uvicorn mealie.app:app --host 0.0.0.0 --port 9000` ### Proxy Server -You must use a proxy server to server up the static files created with `npm run build` and proxy requests to the API. In the docker build this is done with Caddy. You can use the CaddyFile in the section above as a reference. One important thing to keep in mind is that you should drop any trailing `/` in the url. Not doing this may result in failed API requests. +You must use a proxy server to server up the static files created with `npm run build` and proxy requests to the API. In the docker build this is done with Caddy. You can use the CaddyFile in the section above as a reference. One important thing to keep in mind is that you should drop any trailing `/` in the url. Not doing this may result in failed API requests. + +[workers_per_core]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#workers_per_core +[max_workers]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#max_workers +[web_concurrency]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#web_concurrency diff --git a/docs/docs/documentation/getting-started/introduction.md b/docs/docs/documentation/getting-started/introduction.md index 9a4946955..12c788f98 100644 --- a/docs/docs/documentation/getting-started/introduction.md +++ b/docs/docs/documentation/getting-started/introduction.md @@ -2,13 +2,13 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications. -[Remember to join the Discord](https://discord.gg/QuStdQGSGK){:target="_blank"}! +[Remember to join the Discord](https://discord.gg/QuStdQGSGK)! !!! note In some of the demo gifs the styling may be different than the finale application. demos were done during development prior to finale styling. !!! warning - This is a **BETA** release and that means things may break and or change down the line. I'll do my best to make sure that any API changes are thoughtful and necessary in order not to break things. Additionally, I'll do my best to provide a migration path if the database schema ever changes. Do not use programs like watchtower to auto update your container. You **WILL** run into issues if you do this, + This is a **BETA** release and that means things may break and or change down the line. I'll do my best to make sure that any API changes are thoughtful and necessary in order not to break things. Additionally, I'll do my best to provide a migration path if the database schema ever changes. Do not use programs like watchtower to auto update your container. You **WILL** run into issues if you do this! ## Key Features @@ -26,7 +26,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a - Flexible API - Custom key/value pairs for recipes - Webhook support - - Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/){:target="_blank"} and [Swagger](https://petstore.swagger.io/){:target="_blank"} + - Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/) and [Swagger](https://petstore.swagger.io/) - Raw JSON Recipe Editor - Migration from other platforms - Chowdown @@ -36,7 +36,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a ## FAQ ### Why An API? -An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/){:target="_blank"} that can act as notification engines to provide custom notifications based of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation. +An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/) that can act as notification engines to provide custom notifications based of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation. ### Why a Database? Some users of static-site generator applications like ChowDown have expressed concerns about their data being stuck in a database. Considering this is a new project it is a valid concern to be worried about your data. Mealie specifically addresses this concern by provided automatic daily backups that export your data in json, plain-text markdown files, and/or custom Jinja2 templates. **This puts you in controls of how your data is represented** when exported from Mealie, which means you can easily migrate to any other service provided Mealie doesn't work for you. @@ -48,10 +48,10 @@ As to why we need a database? ## Built With -* [Vue.js](https://vuejs.org/){:target="_blank"} -* [Vuetify](https://vuetifyjs.com/en/){:target="_blank"} -* [FastAPI](https://fastapi.tiangolo.com/){:target="_blank"} -* [Docker](https://www.docker.com/){:target="_blank"} +* [Vue.js](https://vuejs.org/) +* [Vuetify](https://vuetifyjs.com/en/) +* [FastAPI](https://fastapi.tiangolo.com/) +* [Docker](https://www.docker.com/) ## Road Map @@ -62,9 +62,9 @@ As to why we need a database? ## Contributing -Contributions are what make the open source community such an amazing place to be learn, develop, and create. Any contributions you make are **greatly appreciated**. See the [Contributors Guide](../../contributors/non-coders.md) for help getting started. +Contributions are what make the open source community such an amazing place to learn, develop, and create. Any contributions you make are **greatly appreciated**. See the [Contributors Guide](../../contributors/non-coders.md) for help getting started. -If you are not a coder, you can still contribute financially. financial contributions help me prioritize working on this project over others and helps me know that there is a real demand for project development. +If you are not a coder, you can still contribute financially. Financial contributions help me prioritize working on this project over others and help me to know that there is a real demand for project development. Buy Me A Coffee diff --git a/docs/docs/documentation/getting-started/updating.md b/docs/docs/documentation/getting-started/updating.md index 7848100c7..27391fb91 100644 --- a/docs/docs/documentation/getting-started/updating.md +++ b/docs/docs/documentation/getting-started/updating.md @@ -1,7 +1,7 @@ # Updating Mealie !!! warning "Read The Release Notes" - You MUST read the release notes prior to upgrading your container. Currently Mealie provides no database migrations as doing such would slow down development and hinder major changes that may need to happen prior to v1.0.0. Mealie has a robust backup and restore system for managing your data. + You MUST read the release notes prior to upgrading your container. Currently Mealie provides no database migrations as doing so would slow down development and hinder major changes that may need to happen prior to v1.0.0. Mealie has a robust backup and restore system for managing your data. ### Before Upgrading - Read The Release Notes @@ -14,7 +14,7 @@ [See Backups and Restore Section](../admin/backups-and-exports.md) for details on backing up your data ## Docker -For all setups using Docker the updating process look something like this +For all setups using Docker the updating process looks something like this - Stop the container using docker-compose down - Pull the latest image using docker-compose pull diff --git a/docs/docs/documentation/recipes/organizing-recipes.md b/docs/docs/documentation/recipes/organizing-recipes.md index c566908e6..3288d3112 100644 --- a/docs/docs/documentation/recipes/organizing-recipes.md +++ b/docs/docs/documentation/recipes/organizing-recipes.md @@ -9,7 +9,7 @@ Below are some general guidelines that were considered when creating the organiz > > My tags are for picking the exact type of meal I'm looking for, based on my mood or my guests' diet, like gluten-free, vegetarian, sweet-sour or casserole. They can also act as sub-categories, like "alcohol" for beverages or "hot meal" for a main course. > -> User: [sephrat](https://github.com/sephrat){:target="_blank"} +> User: [sephrat](https://github.com/sephrat) ## Structure diff --git a/docs/docs/documentation/recipes/recipes.md b/docs/docs/documentation/recipes/recipes.md index 7c0461ed9..bfd93e9b9 100644 --- a/docs/docs/documentation/recipes/recipes.md +++ b/docs/docs/documentation/recipes/recipes.md @@ -1,7 +1,7 @@ # Recipes ## URL Import -Adding a recipe can be as easy as clicking in the bottom-right corner, copying the recipe URL into Mealie and letting the web scrapper organize information. Currently this scraper is implemented with [recipe-scrapers](https://github.com/hhursev/recipe-scrapers){:target="_blank"}. You may have mixed results on some websites, especially with blogs or non-specific recipe websites. See the bulk import Option below for another a convenient way to add blog style recipes into Mealie. +Adding a recipe can be as easy as clicking in the bottom-right corner, copying the recipe URL into Mealie and letting the web scraper organize information. Currently this scraper is implemented with [recipe-scrapers](https://github.com/hhursev/recipe-scrapers). You may have mixed results on some websites, especially with blogs or non-specific recipe websites. See the bulk import Option below for another a convenient way to add blog style recipes into Mealie. !!! tip You can find a list of some of the supported sites in the recipe-scrapers repo. If you're site isn't supported, you can work with the recipe-scrapers team to implement it and we can down-stream those changes into Mealie. @@ -12,7 +12,7 @@ Adding a recipe can be as easy as clicking in the bottom-right corner, copying t You can use bookmarklets to generate a bookmark that will take your current location, and open a new tab that will try to import that URL into Mealie. -You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/){:target="_blank"} and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions. Note that there is no trailing `/`. +You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/) and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions. Note that there is no trailing `/`. ```js var url = document.URL ; @@ -54,7 +54,7 @@ Mealie also supports bulk import of recipe instructions and ingredients. Select ![](../../assets/gifs/bulk-add-demo.gif) ## Schema -Recipes are stored in the json-like format in mongoDB and then sent and edited in json format on the frontend. Each recipes uses [Recipe Schema](https://schema.org/Recipe){:target="_blank"} as a general guide with some additional properties specific to Mealie. +Recipes are stored in the json-like format in mongoDB and then sent and edited in json format on the frontend. Each recipes uses [Recipe Schema](https://schema.org/Recipe) as a general guide with some additional properties specific to Mealie. ### Example ```json diff --git a/docs/docs/documentation/toolbox/notifications.md b/docs/docs/documentation/toolbox/notifications.md index 6b51408c1..7e4f132cd 100644 --- a/docs/docs/documentation/toolbox/notifications.md +++ b/docs/docs/documentation/toolbox/notifications.md @@ -2,15 +2,15 @@ ## Apprise -Using the [Apprise](https://github.com/caronc/apprise/){:target="_blank"} library Mealie is able to provided notification services for nearly every popular service. Some of our favorites are... +Using the [Apprise](https://github.com/caronc/apprise/) library Mealie is able to provide notification services for nearly every popular service. Some of our favorites are... -- [Gotify](https://github.com/caronc/apprise/wiki/Notify_gotify){:target="_blank"} -- [Discord](https://github.com/caronc/apprise/wiki/Notify_discord){:target="_blank"} -- [Home Assistant](https://github.com/caronc/apprise/wiki/Notify_homeassistant){:target="_blank"} -- [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix){:target="_blank"} -- [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover){:target="_blank"} +- [Gotify](https://github.com/caronc/apprise/wiki/Notify_gotify) +- [Discord](https://github.com/caronc/apprise/wiki/Notify_discord) +- [Home Assistant](https://github.com/caronc/apprise/wiki/Notify_homeassistant) +- [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix) +- [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover) -But there are some many to choose from! Take a look at their wiki for information on how to create their URL formats and that you can use to create a notification integration in Mealie. +But there are many more to choose from! Take a look at their wiki for information on how to create their URL formats that you can use to create a notification integration in Mealie. ## Subscribe Events @@ -45,7 +45,7 @@ In most cases the events will also provide details on which user performed the a New events can be created and viewed in admin Toolbox `/admin/toolbox?tab=event-notifications`. Select the "+ Notification" button and you'll be provided with a dialog. Complete the form using the URL for the service you'd like to connect to. Before saving be sure to use the test feature. !!! tip - The feedback provided from the test feature is only an indicated of if the URL you provided is valid, not if the message was successfully sent. Be sure to check the notification feed for the test message. + The feedback provided from the test feature indicates only if the URL you provided is valid, not if the message was successfully sent. Be sure to check the notification feed for the test message. ![Add Notification Image](../../assets/img/add-notification.webp) @@ -56,4 +56,4 @@ New events can be created and viewed in admin Toolbox `/admin/toolbox?tab=event- ![Discord](../../assets/img/discord-notification-example.webp) #### Gotify -![Gotify](../../assets/img/gotify-notification-example.webp) \ No newline at end of file +![Gotify](../../assets/img/gotify-notification-example.webp) diff --git a/docs/docs/documentation/users-groups/meal-planner.md b/docs/docs/documentation/users-groups/meal-planner.md index 53fd26b51..44531397e 100644 --- a/docs/docs/documentation/users-groups/meal-planner.md +++ b/docs/docs/documentation/users-groups/meal-planner.md @@ -2,7 +2,7 @@ ## Working with Planner -In Mealie you can create a meal plan based off the calendar inputs on the meal planner page. There is no limit to how long or how short a meal plan is. You may also create duplicate meal plans for the same date range. After selecting your date range, click on the card for each day and search through recipes to find your choice. Add a side-dish if you prefer to. After selecting a recipe for all meals, save the plan. Selecting the 'No Recipe' button will allow you to add an entry without a recipe by providing a title and description +In Mealie you can create a meal plan based off the calendar inputs on the meal planner page. There is no limit to how long or how short a meal plan is. You may also create duplicate meal plans for the same date range. After selecting your date range, click on the card for each day and search through recipes to find your choice. Add a side-dish if you prefer to. After selecting a recipe for all meals, save the plan. Selecting the 'No Recipe' button will allow you to add an entry without a recipe by providing a title and description. You can also randomly generate meal plans with the dice-button at the bottom. diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index 1a3b0930b..94fd252df 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/docs/docs/roadmap.md b/docs/docs/roadmap.md index 5b7cdc97c..65ff7b086 100644 --- a/docs/docs/roadmap.md +++ b/docs/docs/roadmap.md @@ -1,7 +1,7 @@ # Development Road Map ## Feature Requests -See the [Github META issue for tracking feature requests](https://github.com/hay-kot/mealie/issues/122){:target="_blank"} +See the [Github META issue for tracking feature requests](https://github.com/hay-kot/mealie/issues/122) ## Progress -See the [Github Projects](https://github.com/hay-kot/mealie/projects){:target="_blank"} to see what is currently being worked on \ No newline at end of file +See the [Github Projects](https://github.com/hay-kot/mealie/projects) to see what is currently being worked on \ No newline at end of file diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 3071bc165..eefdd4fdc 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -45,6 +45,8 @@ markdown_extensions: extra_css: - assets/stylesheets/custom.css +extra_javascript: + - assets/js/extra.js repo_url: https://github.com/hay-kot/mealie repo_name: hay-kot/mealie @@ -92,6 +94,7 @@ nav: - Style Guide: "contributors/developers-guide/style-guide.md" - Development Road Map: "roadmap.md" - Change Log: + - v0.5.2 Misc Updates: "changelog/v0.5.2.md" - v0.5.1 Bug Fixes: "changelog/v0.5.1.md" - v0.5.0 General Upgrades: "changelog/v0.5.0.md" - v0.4.3 Hot Fix: "changelog/v0.4.3.md" diff --git a/frontend/frontend.Dockerfile b/frontend/frontend.Dockerfile index 16669fa8b..2cdab5876 100644 --- a/frontend/frontend.Dockerfile +++ b/frontend/frontend.Dockerfile @@ -1,4 +1,4 @@ -FROM node:latest +FROM node:lts-alpine # # install simple http server for serving static content # RUN npm install -g http-server @@ -13,7 +13,7 @@ COPY package*.json ./ RUN npm install # copy project files and folders to the current working directory (i.e. 'app' folder) -COPY . . +# COPY . . # build app for production with minification # RUN npm run build diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d9c9a94b2..4117868d3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -2315,6 +2315,12 @@ "@types/node": "*" } }, + "@types/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", + "dev": true + }, "@types/http-proxy": { "version": "1.17.6", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.6.tgz", @@ -2770,6 +2776,12 @@ "webpack-merge": "^4.2.2" }, "dependencies": { + "@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -2785,6 +2797,12 @@ "color-convert": "^2.0.1" } }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -2811,12 +2829,51 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -2837,6 +2894,16 @@ "ansi-regex": "^5.0.0" } }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -2934,9 +3001,9 @@ } }, "@vue/preload-webpack-plugin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", - "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-2.0.0.tgz", + "integrity": "sha512-RoorRB50WehYbsiWu497q8egZBYlrvOo9KBUG41uth4O023Cbs+7POLm9uw2CAiViBAIhvpw1Y4w4i+MZxOfXw==", "dev": true }, "@vue/web-component-wrapper": { @@ -4063,13 +4130,21 @@ "dev": true }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + } } }, "camelcase": { @@ -4549,9 +4624,9 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, "common-tags": { @@ -5598,6 +5673,24 @@ "domelementtype": "1" } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + } + } + }, "dot-object": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-1.9.0.tgz", @@ -7036,6 +7129,63 @@ "param-case": "2.1.x", "relateurl": "0.2.x", "uglify-js": "3.4.x" + }, + "dependencies": { + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + } + } + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" } }, "html-tags": { @@ -7045,59 +7195,23 @@ "dev": true }, "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-rZsVvPXUYFyME0cuGkyOHfx9hmkFa4pWfxY/mdY38PsBEaVNsRoA+Id+8z6DBDgyv3zaw6XQszdF8HLwfQvcdQ==", "dev": true, "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" + "@types/html-minifier-terser": "^5.0.0", + "html-minifier-terser": "^5.0.1", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^2.0.0" }, "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } } } }, @@ -8311,10 +8425,21 @@ "dev": true }, "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + } + } }, "lru-cache": { "version": "5.1.1", @@ -8789,12 +8914,21 @@ "dev": true }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + } } }, "node-forge": { @@ -9333,12 +9467,21 @@ } }, "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "no-case": "^2.2.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + } } }, "parent-module": { @@ -9410,6 +9553,24 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + } + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -10160,6 +10321,16 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, + "preload-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/preload-webpack-plugin/-/preload-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-TWpYf7QqmW9lxXIQcPAPkfO+G6Zf/WrSZtqx864IdUtqZ+QGESfOGbGSMlBBt96sYEE+cZLF2GLrxbmLyieX6g==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "object.values": "^1.0.4" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 5fe3fd570..ff54030ed 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,7 +14,6 @@ "core-js": "^3.14.0", "fuse.js": "^6.4.6", "register-service-worker": "^1.7.1", - "typeface-roboto": "^1.1.13", "v-jsoneditor": "^1.4.4", "vue": "^2.6.14", "vue-i18n": "^8.24.1", @@ -25,6 +24,7 @@ "vuex-persistedstate": "^4.0.0-beta.3" }, "devDependencies": { + "typeface-roboto": "^1.1.13", "@intlify/vue-i18n-loader": "^1.1.0", "@mdi/font": "^5.9.55", "@mdi/js": "^5.9.55", @@ -32,9 +32,12 @@ "@vue/cli-plugin-eslint": "^4.5.13", "@vue/cli-plugin-pwa": "~4.5.0", "@vue/cli-service": "^4.5.13", + "@vue/preload-webpack-plugin": "^2.0.0", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", "eslint-plugin-vue": "^6.2.2", + "html-webpack-plugin": "^5.3.1", + "preload-webpack-plugin": "^2.3.0", "sass": "^1.34.1", "sass-loader": "^8.0.2", "vue-cli-plugin-i18n": "~1.0.1", @@ -69,4 +72,4 @@ "last 2 versions", "not dead" ] -} +} \ No newline at end of file diff --git a/frontend/public/index.html b/frontend/public/index.html index 014c9fa49..fa926f2b9 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -8,8 +8,6 @@ Mealie - - diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 73f8f0f43..63d1c45e1 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -48,32 +48,16 @@ export default { }, }, - async mounted() { + async created() { + // Initial API Requests this.$store.dispatch("initTheme"); - this.$store.dispatch("requestRecentRecipes"); this.$store.dispatch("refreshToken"); - this.$store.dispatch("requestCurrentGroup"); this.$store.dispatch("requestUserData"); - this.$store.dispatch("requestCategories"); + this.$store.dispatch("requestCurrentGroup"); this.$store.dispatch("requestTags"); - this.darkModeSystemCheck(); - this.darkModeAddEventListener(); this.$store.dispatch("requestAppInfo"); - this.$store.dispatch("requestCustomPages"); this.$store.dispatch("requestSiteSettings"); - }, - data() { - return { - refreshing: false, - registration: null, - snackBtnText: "", - snackWithBtnText: "", - snackWithButtons: false, - }; - }, - - created() { // Listen for swUpdated event and display refresh snackbar as required. document.addEventListener("swUpdated", this.showRefreshUI, { once: true }); // Refresh all open app tabs when a new service worker is installed. @@ -86,6 +70,21 @@ export default { } }, + mounted() { + this.darkModeSystemCheck(); + this.darkModeAddEventListener(); + }, + + data() { + return { + refreshing: false, + registration: null, + snackBtnText: "", + snackWithBtnText: "", + snackWithButtons: false, + }; + }, + methods: { // For Later! @@ -136,3 +135,4 @@ export default { scrollbar-color: transparent transparent; } + diff --git a/frontend/src/api/apiRoutes.js b/frontend/src/api/apiRoutes.js index b03c788b7..5d7262677 100644 --- a/frontend/src/api/apiRoutes.js +++ b/frontend/src/api/apiRoutes.js @@ -4,6 +4,7 @@ export const API_ROUTES = { aboutEvents: `${prefix}/about/events`, aboutEventsNotifications: `${prefix}/about/events/notifications`, aboutEventsNotificationsTest: `${prefix}/about/events/notifications/test`, + aboutRecipesDefaults: `${prefix}/about/recipes/defaults`, authRefresh: `${prefix}/auth/refresh`, authToken: `${prefix}/auth/token`, authTokenLong: `${prefix}/auth/token/long`, @@ -27,6 +28,7 @@ export const API_ROUTES = { migrations: `${prefix}/migrations`, recipesCategory: `${prefix}/recipes/category`, recipesCreate: `${prefix}/recipes/create`, + recipesCreateFromZip: `${prefix}/recipes/create-from-zip`, recipesCreateUrl: `${prefix}/recipes/create-url`, recipesSummary: `${prefix}/recipes/summary`, recipesSummaryUncategorized: `${prefix}/recipes/summary/uncategorized`, @@ -70,6 +72,7 @@ export const API_ROUTES = { recipesRecipeSlug: recipe_slug => `${prefix}/recipes/${recipe_slug}`, recipesRecipeSlugAssets: recipe_slug => `${prefix}/recipes/${recipe_slug}/assets`, recipesRecipeSlugImage: recipe_slug => `${prefix}/recipes/${recipe_slug}/image`, + recipesRecipeSlugZip: recipe_slug => `${prefix}/recipes/${recipe_slug}/zip`, recipesSlugComments: slug => `${prefix}/recipes/${slug}/comments`, recipesSlugCommentsId: (slug, id) => `${prefix}/recipes/${slug}/comments/${id}`, shoppingListsId: id => `${prefix}/shopping-lists/${id}`, diff --git a/frontend/src/api/meta.js b/frontend/src/api/meta.js index 995fb2b81..b460c961c 100644 --- a/frontend/src/api/meta.js +++ b/frontend/src/api/meta.js @@ -13,7 +13,7 @@ export const metaAPI = { }, async getLogText(num) { - const response = await apiReq.get(API_ROUTES.debugLog(num)); + const response = await apiReq.get(API_ROUTES.debugLogNum(num)); return response.data; }, diff --git a/frontend/src/api/recipe.js b/frontend/src/api/recipe.js index 932ad669a..6a4445c7f 100644 --- a/frontend/src/api/recipe.js +++ b/frontend/src/api/recipe.js @@ -4,6 +4,15 @@ import { store } from "../store"; import i18n from "@/i18n.js"; export const recipeAPI = { + /** + * Returns the Default Recipe Settings for the Site + * @returns {AxoisResponse} Axois Response Object + */ + async getDefaultSettings() { + const response = await apiReq.get(API_ROUTES.aboutRecipesDefaults); + return response; + }, + /** * Create a Recipe by URL * @param {string} recipeURL diff --git a/frontend/src/api/upload.js b/frontend/src/api/upload.js index 3bd9a02be..efd9ada3e 100644 --- a/frontend/src/api/upload.js +++ b/frontend/src/api/upload.js @@ -4,8 +4,6 @@ import i18n from "@/i18n.js"; export const utilsAPI = { // import { api } from "@/api"; uploadFile(url, fileObject) { - console.log("API Called"); - return apiReq.post( url, fileObject, diff --git a/frontend/src/components/Fallbacks/NoRecipe.vue b/frontend/src/components/Fallbacks/NoRecipe.vue index d93b92401..d196b487c 100644 --- a/frontend/src/components/Fallbacks/NoRecipe.vue +++ b/frontend/src/components/Fallbacks/NoRecipe.vue @@ -1,7 +1,7 @@ diff --git a/frontend/src/components/Fallbacks/The404.vue b/frontend/src/components/Fallbacks/The404.vue index 885a722ed..60f8d5ba1 100644 --- a/frontend/src/components/Fallbacks/The404.vue +++ b/frontend/src/components/Fallbacks/The404.vue @@ -2,7 +2,7 @@
-

{{ $t("404.page-not-found") }}

+

{{ $t('page.404-page-not-found') }}

@@ -29,15 +29,15 @@ diff --git a/frontend/src/components/FormHelpers/CategoryTagSelector.vue b/frontend/src/components/FormHelpers/CategoryTagSelector.vue index 32b5eeba3..e02b988b4 100644 --- a/frontend/src/components/FormHelpers/CategoryTagSelector.vue +++ b/frontend/src/components/FormHelpers/CategoryTagSelector.vue @@ -72,6 +72,13 @@ export default { selected: [], }; }, + async created() { + if (this.tagSelector) { + this.$store.dispatch("requestTags"); + } else { + this.$store.dispatch("requestCategories"); + } + }, mounted() { this.$emit(MOUNTED_EVENT); this.setInit(this.value); diff --git a/frontend/src/components/FormHelpers/LanguageSelector.vue b/frontend/src/components/FormHelpers/LanguageSelector.vue index c1959003e..c480fad99 100644 --- a/frontend/src/components/FormHelpers/LanguageSelector.vue +++ b/frontend/src/components/FormHelpers/LanguageSelector.vue @@ -30,7 +30,7 @@ export default { ], }; }, - mounted() { + created() { this.selectedItem = this.$store.getters.getActiveLang; }, computed: { diff --git a/frontend/src/components/MealPlan/MealPlanCard.vue b/frontend/src/components/MealPlan/MealPlanCard.vue index ed18943e8..13862cdd0 100644 --- a/frontend/src/components/MealPlan/MealPlanCard.vue +++ b/frontend/src/components/MealPlan/MealPlanCard.vue @@ -18,14 +18,16 @@ - - - - {{ $globals.icons.edit }} - - {{ $t('reicpe.no-recipe') }} - - +
+ + + + {{ $globals.icons.edit }} + + {{ $t("reicpe.no-recipe") }} + + +
@@ -40,14 +42,14 @@ {{ $globals.icons.edit }} - {{ $t('reicpe.no-recipe') }} + {{ $t("reicpe.no-recipe") }} {{ $globals.icons.create }} - {{ $t('meal-plan.side') }} + {{ $t("meal-plan.side") }}
diff --git a/frontend/src/components/MealPlan/MealPlanNew.vue b/frontend/src/components/MealPlan/MealPlanNew.vue index 754502796..66eeb3968 100644 --- a/frontend/src/components/MealPlan/MealPlanNew.vue +++ b/frontend/src/components/MealPlan/MealPlanNew.vue @@ -122,7 +122,7 @@ export default { } }, }, - async mounted() { + async created() { await this.$store.dispatch("requestCurrentGroup"); await this.$store.dispatch("requestAllRecipes"); await this.buildMealStore(); diff --git a/frontend/src/components/Recipe/CardImage.vue b/frontend/src/components/Recipe/CardImage.vue index 95706c5e7..7da1ac42e 100644 --- a/frontend/src/components/Recipe/CardImage.vue +++ b/frontend/src/components/Recipe/CardImage.vue @@ -13,7 +13,7 @@ {{ $globals.icons.primary }} - +
@@ -85,6 +85,7 @@ export default { } .icon-slot > div { + top: 0; position: absolute; z-index: 1; } diff --git a/frontend/src/components/Recipe/ContextMenu.vue b/frontend/src/components/Recipe/ContextMenu.vue index 5f73d5cff..ccc6e53de 100644 --- a/frontend/src/components/Recipe/ContextMenu.vue +++ b/frontend/src/components/Recipe/ContextMenu.vue @@ -18,6 +18,7 @@ allow-overflow close-delay="125" open-on-hover + content-class="d-print-none" > - + @@ -53,6 +50,10 @@ export default { type: Boolean, default: true, }, + showPrint: { + type: Boolean, + default: false, + }, fab: { type: Boolean, default: false, @@ -88,20 +89,28 @@ export default { recipeURL() { return `${this.baseURL}/recipe/${this.slug}`; }, + printerMenu() { + return { + title: this.$t("general.print"), + icon: this.$globals.icons.printer, + color: "accent", + action: "print", + }; + }, defaultMenu() { return [ - { - title: this.$t("general.print"), - icon: this.$globals.icons.printer, - color: "accent", - action: "print", - }, { title: this.$t("general.share"), icon: this.$globals.icons.shareVariant, color: "accent", action: "share", }, + { + title: this.$t("general.download"), + icon: this.$globals.icons.download, + color: "accent", + action: "download", + }, ]; }, userMenu() { @@ -118,9 +127,18 @@ export default { color: "accent", action: "edit", }, - ...this.defaultMenu, ]; }, + displayedMenu() { + let menu = this.defaultMenu; + if (this.loggedIn && this.cardMenu) { + menu = [...this.userMenu, ...menu]; + } + if (this.showPrint) { + menu = [this.printerMenu, ...menu]; + } + return menu; + }, recipeText() { return this.$t("recipe.share-recipe-message", [this.name]); }, @@ -159,6 +177,9 @@ export default { case "print": this.$router.push(`/recipe/${this.slug}` + "?print=true"); break; + case "download": + window.open(`/api/recipes/${this.slug}/zip`); + break; default: break; } diff --git a/frontend/src/components/Recipe/FavoriteBadge.vue b/frontend/src/components/Recipe/FavoriteBadge.vue index 35c7b2d12..9b28715f3 100644 --- a/frontend/src/components/Recipe/FavoriteBadge.vue +++ b/frontend/src/components/Recipe/FavoriteBadge.vue @@ -1,17 +1,17 @@