diff --git a/.dockerignore b/.dockerignore
index 6316f30fa..cc5da2130 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,2 +1,3 @@
*/node_modules
-*/dist
\ No newline at end of file
+*/dist
+##
\ No newline at end of file
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
new file mode 100644
index 000000000..3a7a0116e
--- /dev/null
+++ b/.github/workflows/build-docs.yml
@@ -0,0 +1,20 @@
+name: Publish docs via GitHub Pages
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ build:
+ name: Deploy docs
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout main
+ uses: actions/checkout@v1
+
+ - name: Deploy docs
+ uses: mhausenblas/mkdocs-deploy-gh-pages@master
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ CONFIG_FILE: docs/mkdocs.yml
+ EXTRA_PACKAGES: build-base
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 486f3fec7..4ec39805f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,27 +3,34 @@
__pycache__/
*.py[cod]
*$py.class
-frontend/.env.development
+# frontend/.env.development
docs/site/
+mealie/temp/*
+mealie/temp/api.html
+
mealie/data/backups/*
mealie/data/debug/*
mealie/data/img/*
+mealie/data/migration/*
+!mealie/dist/*
#Exception to keep folders
+!mealie/dist/.gitkeep
!mealie/data/backups/.gitkeep
!mealie/data/backups/dev_sample_data*
!mealie/data/debug/.gitkeep
+!mealie/data/migration/.gitkeep
!mealie/data/img/.gitkeep
.DS_Store
node_modules
-/dist
+
# local env files
.env.local
.env.*.local
-.env.development
+
# Log files
npm-debug.log*
@@ -48,7 +55,7 @@ pnpm-debug.log*
env/
build/
develop-eggs/
-dist/
+
downloads/
eggs/
.eggs/
@@ -143,5 +150,3 @@ ENV/
# Node Modules
node_modules/
-
-/*.env.development*
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 94282cdd5..0445b096a 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -8,9 +8,13 @@
"python.testing.unittestEnabled": false,
"python.testing.nosetestsEnabled": false,
- "python.testing.pytestEnabled": false,
- "python.testing.promptToConfigure": false,
+ "python.discoverTest": true,
+ "python.testing.pytestEnabled": true,
"cSpell.enableFiletypes": [
+ "!javascript",
"!python"
+ ],
+ "python.testing.pytestArgs": [
+ "mealie"
]
}
diff --git a/Dockerfile b/Dockerfile
index b19242d2e..3edd658ef 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:alpine as build-stage
+FROM node:lts-alpine as build-stage
WORKDIR /app
COPY ./frontend/package*.json ./
RUN npm install
@@ -18,7 +18,12 @@ WORKDIR /app
RUN pip install -r requirements.txt
COPY ./mealie /app
-COPY ./mealie/data/templates/recipes.md /app/data/templates/
+COPY ./mealie/data/templates/recipes.md /app/data/templates/recipes.md
COPY --from=build-stage /app/dist /app/dist
+RUN rm -rf /app/test /app/temp
+
+ENV ENV prod
+
+VOLUME [ "/app/data" ]
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "80"]
\ No newline at end of file
diff --git a/Dockerfile.dev b/Dockerfile.dev
index 7e55d6008..de37b9cc1 100644
--- a/Dockerfile.dev
+++ b/Dockerfile.dev
@@ -3,18 +3,17 @@ FROM python:3
RUN apt-get update -y && \
apt-get install -y python-pip python-dev
-# We copy just the requirements.txt first to leverage Docker cache
COPY ./requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
+RUN pip install pytest
-# COPY ./mealie /app
+COPY ./mealie /app
ENTRYPOINT [ "python" ]
-# TODO Reconfigure Command to start a Gunicorn Server that managed the Uvicorn Server. Also Learn how to do that :-/
-CMD [ "app.py" ]
\ No newline at end of file
+CMD [ "app.py" ]
\ No newline at end of file
diff --git a/README.md b/README.md
index eb4cf0d58..ddf6db3d2 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,6 @@
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![MIT License][license-shield]][license-url]
-[![LinkedIn][linkedin-shield]][linkedin-url]
[![Docker Pulls][docker-pull]][docker-pull]
@@ -21,14 +20,21 @@
A Place for All Your Recipes
Explore the docs »
-
+
+
View Demo
·
- Report Bug
+ Report Bug
·
- Request Feature
-
diff --git a/dev/dev-notes.md b/dev/dev-notes.md
index 86d47ce21..a1b0d7108 100644
--- a/dev/dev-notes.md
+++ b/dev/dev-notes.md
@@ -17,13 +17,13 @@ Don't forget to [join the Discord](https://discord.gg/R6QDyJgbD2)!
# Todo's
Frontend
-- [ ] .Vue file reorganized into something that makes sense
+- [x] .Vue file reorganized into something that makes sense
- [ ] Recipe Print Page
- [x] Catch 400 / bad response on create from URL
- [ ] Recipe Editor Data Validation Client Side
- [x] Favicon
- [x] Rename Window
-- [ ] Add version indicator and notification for new version available
+- [x] Add version indicator and notification for new version available
- [ ] Enhanced Search Functionality
- [ ] Organize Home Page my Category, ideally user selectable.
@@ -41,15 +41,21 @@ Backend
# Draft Changelog
## v0.0.2
-General
+Bug Fixes
- Fixed opacity issues with marked steps - [mtoohey31](https://github.com/mtoohey31)
-- Updated Favicon
-- Renamed Frontend Window
-- Added Debug folder to dump scraper data prior to processing.
-- Improved documentation
-- Added version tag / relevant links, and new version notifier
+- Fixed hot-reloading development environment - [grssmnn](https://github.com/grssmnn)
+- Fixed recipe not saving without image
+- Fixed parsing error on image property null
-Recipes
-- Added user feedback on bad URL.
-- Better backend data validation for updating recipes, avoid small syntax errors corrupting database entry. [Issue #8](https://github.com/hay-kot/mealie/issues/8)
-- Fixed spacing issue while editing new recipes in JSON
+General Improvements
+- Added Confirmation component to deleting recipes - [zackbcom](https://github.com/zackbcom)
+- Updated Theme backend - [zackbcom](https://github.com/zackbcom)
+- Added Persistent storage to vuex - [zackbcom](https://github.com/zackbcom)
+- General Color/Theme Improvements
+ - More consistent UI
+ - More minimalist coloring
+- Added API Key Extras to Recipe Data
+ - Users can now add custom json key/value pairs to all recipes via the editor for access in 3rd part applications. For example users can add a "message" field in the extras that can be accessed on API calls to play a message over google home.
+- Improved image rendering (nearly x2 speed)
+- Improved documentation + API Documentation
+- Improved recipe parsing
diff --git a/dev/non-working-links.txt b/dev/non-working-links.txt
new file mode 100644
index 000000000..7de14cfcb
--- /dev/null
+++ b/dev/non-working-links.txt
@@ -0,0 +1 @@
+http://www.cookingforkeeps.com/2013/02/05/blue-cheese-stuffed-turkey-meatballs-with-raspberry-balsamic-glaze-2/
\ No newline at end of file
diff --git a/dev/scripts/docker-compose.dev.sh b/dev/scripts/docker-compose.dev.sh
index 3a4741345..485e52f66 100755
--- a/dev/scripts/docker-compose.dev.sh
+++ b/dev/scripts/docker-compose.dev.sh
@@ -1 +1 @@
-docker-compose -f docker-compose.dev.yml build && docker-compose -f docker-compose.dev.yml -p dev-mealie up -d
\ No newline at end of file
+docker-compose -f docker-compose.dev.yml -p dev-mealie up --build
\ No newline at end of file
diff --git a/dev/scripts/docker-compose.sh b/dev/scripts/docker-compose.sh
index 3336c7bc5..e2fd9edcd 100755
--- a/dev/scripts/docker-compose.sh
+++ b/dev/scripts/docker-compose.sh
@@ -1 +1 @@
-docker-compose build && docker-compose -p mealie up -d
\ No newline at end of file
+docker-compose -p mealie up --build
\ No newline at end of file
diff --git a/dev/scripts/scrape_recipe.py b/dev/scripts/scrape_recipe.py
new file mode 100644
index 000000000..de18e64b2
--- /dev/null
+++ b/dev/scripts/scrape_recipe.py
@@ -0,0 +1,18 @@
+"""
+Helper script to download raw recipe data from a URL and dump it to disk.
+The resulting files can be used as test input data.
+"""
+
+import sys, json
+from scrape_schema_recipe import scrape_url
+
+for url in sys.argv[1:]:
+ try:
+ data = scrape_url(url)[0]
+ slug = list(filter(None, url.split("/")))[-1]
+ filename = f"{slug}.json"
+ with open(filename, "w") as f:
+ json.dump(data, f, indent=4, default=str)
+ print(f"Saved {filename}")
+ except Exception as e:
+ print(f"Error for {url}: {e}")
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
index d9b9d4879..72b5f9a84 100644
--- a/docker-compose.dev.yml
+++ b/docker-compose.dev.yml
@@ -2,23 +2,26 @@
version: "3.1"
services:
# Vue Frontend
- mealie:
+ mealie-frontend:
+ image: mealie-frontend:dev
build:
context: ./frontend
dockerfile: frontend.Dockerfile
- container_name: mealie_frontend
restart: always
ports:
- 9920:8080
+ environment:
+ VUE_APP_API_BASE_URL: "http://mealie-api:9000"
volumes:
- - ./frontend:/app
+ - ./frontend/:/app
+ - /app/node_modules
# Fast API
mealie-api:
+ image: mealie-api:dev
build:
context: ./
dockerfile: Dockerfile.dev
- container_name: mealie-api
restart: always
ports:
- 9921:9000
diff --git a/docker-compose.yml b/docker-compose.yml
index 98a799037..6b4650da8 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -16,8 +16,7 @@ services:
db_host: mongo
db_port: 27017
volumes:
- - ./mealie/data/img:/app/data/img
- - ./mealie/data/backups:/app/data/backups
+ - ./mealie/data/:/app/data
mongo:
image: mongo
restart: always
diff --git a/docs/docs/1.9 - release-notes.md b/docs/docs/1.9 - release-notes.md
deleted file mode 100644
index 9e19854fb..000000000
--- a/docs/docs/1.9 - release-notes.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Release Notes
-
-## v0.0.1 - Pre-release Patch
-General
-- Updated Favicon
-- Renamed Frontend Window
-- Added Debug folder to dump scraper data prior to processing.
-
-Recipes
-- Added user feedback on bad URL
-- Better backend data validation for updating recipes, avoid small syntax errors corrupting database entry. [Issue #8](https://github.com/hay-kot/mealie/issues/8)
-- Fixed spacing issue while editing new recipes in JSON
-
-## v0.0.0 - Initial Pre-release
-The initial pre-release. It should be semi-functional but does not include a lot of user feedback You may notice errors that have no user feedback and have no idea what went wrong.
-
-### Recipes
- - Automatic web scrapping for common recipe platforms
- - Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/) and [Swagger](https://petstore.swagger.io/)
- - UI Recipe Editor
- - JSON Recipe Editor in browser
- - Custom tags and categories
- - Rate recipes
- - Add notes to recipes
- - Migration From Other Platforms
- - Chowdown
-### Meal Planner
- - Random Meal plan generation based off categories
- - Expose notes in the API to allow external applications to access relevant information for meal plans
-
-### Database Import / Export
- - Easily Import / Export your recipes from the UI
- - Export recipes in markdown format for universal access
- - Use the default or a custom jinja2 template
\ No newline at end of file
diff --git a/docs/docs/api/api-usage.md b/docs/docs/api/api-usage.md
new file mode 100644
index 000000000..95f288f97
--- /dev/null
+++ b/docs/docs/api/api-usage.md
@@ -0,0 +1,14 @@
+# Usage
+
+## Key Components
+### 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.
+
+For example you could add `{"message": "Remember to thaw the chicken"}` to a recipe and use the webhooks built into mealie to send that message payload to a destination to be processed.
+
+
+
+
+## Examples
+
+Have Ideas? Submit a PR!
\ No newline at end of file
diff --git a/docs/docs/api/docs/index.html b/docs/docs/api/docs/index.html
new file mode 100644
index 000000000..0f19965fb
--- /dev/null
+++ b/docs/docs/api/docs/index.html
@@ -0,0 +1,26 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/docs/1.3 - admin-panel.md b/docs/docs/getting-started/backups-and-exports.md
similarity index 66%
rename from docs/docs/1.3 - admin-panel.md
rename to docs/docs/getting-started/backups-and-exports.md
index fde088e51..f20e0c32d 100644
--- a/docs/docs/1.3 - admin-panel.md
+++ b/docs/docs/getting-started/backups-and-exports.md
@@ -1,19 +1,5 @@
-# Site Settings Panel
-!!! 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)
-
-
-## Theme Settings
-Color themes can be created and set from the UI in the settings page. You can select an existing color theme or create a new one. On creation of a new color theme random colors will first be generated, then you can select and save as you'd like. By default the "default" theme will be loaded for all new users visiting the site. All created color themes are available to all users of the site. Separate color themes can be set for both Light and Dark modes.
-
-
-
-!!! note
- Theme data is stored in cookies in the browser. Calling "Save Theme" will refresh the cookie with the selected theme as well save the theme to the database.
-
-
-## Backup and Export
-
+# Backup and Export
+
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.
@@ -21,10 +7,10 @@ To create an export simple add the tag and the markdown template and click Backu
To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as an source to restore from. Selected the desired backup and import the backup file.
-### Custom Templating
+## Custom 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.
-#### Input
+### Input
```jinja2

@@ -52,7 +38,7 @@ Categories: {{ recipe.categories }}
Original URL: {{ recipe.orgURL }}
```
-#### Output
+### Output
```markdown

@@ -90,14 +76,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.
-
-
-## Meal Planner Webhooks
-Meal planner webhooks are post requests sent from Mealie to an external endpoint. The body of the message is the Recipe JSON of the scheduled meal. If no meal is schedule, no request is sent. The webhook functionality can be enabled or disabled as well as scheduled. Note that you must "Save Webhooks" prior to any changes taking affect server side.
-
-## Migration
-
-### Chowdown
-
-In the Admin page on the in the Migration section you can provide a URL for a repo hosting a Chowdown site and Mealie will pull the images and recipes from the instance and automatically import them into the database. Due to the nature of the yaml format you may have mixed results but you should get an error report of the recipes that had errors and will need to be manually added. Note that you can only import the repo as a whole. You cannot import individual recipes.
+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
diff --git a/docs/docs/1.0 - getting-started.md b/docs/docs/getting-started/install.md
similarity index 94%
rename from docs/docs/1.0 - getting-started.md
rename to docs/docs/getting-started/install.md
index 0c4346239..b5196d2b3 100644
--- a/docs/docs/1.0 - getting-started.md
+++ b/docs/docs/getting-started/install.md
@@ -1,4 +1,4 @@
-# Getting Started
+# Installation
To deploy docker 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. Currently the only supported database is Mongo. Mealie is looking for contributors to support additional databases.
@@ -16,6 +16,7 @@ To deploy docker on your local network it is highly recommended to use docker to
| db_password | example | The Mongodb password you specified in your mongo container |
| db_host | mongo | The host address of MongoDB if you're in docker and using the same network you can use mongo as the host name |
| db_port | 27017 | the port to access MongoDB 27017 is the default for mongo |
+| api_docs | True | Turns on/off access to the API documentation locally. |
| TZ | | You should set your time zone accordingly so the date/time features work correctly |
@@ -38,12 +39,13 @@ services:
db_port: 27017 # The Default port for Mongo DB
TZ: America/Anchorage
volumes:
- - ./data/img:/app/data/img
- - ./data/backups:/app/data/backups
+ - ./mealie/data/:/app/data/
mongo:
image: mongo
restart: always
+ volumes:
+ - ./mongo:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: root # Change!
MONGO_INITDB_ROOT_PASSWORD: example # Change!
@@ -56,6 +58,7 @@ services:
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: example
+
```
## Ansible Tasks Template
diff --git a/docs/docs/1.2 - meal-planner.md b/docs/docs/getting-started/meal-planner.md
similarity index 96%
rename from docs/docs/1.2 - meal-planner.md
rename to docs/docs/getting-started/meal-planner.md
index fbc388801..3e71a549e 100644
--- a/docs/docs/1.2 - meal-planner.md
+++ b/docs/docs/getting-started/meal-planner.md
@@ -8,4 +8,4 @@ To edit the meal in a meal plan simply select the edit button on the card in the
!!! warning
In coming a future release recipes for meals will be restricted to specific categories.
-
+
diff --git a/docs/docs/getting-started/migration-imports.md b/docs/docs/getting-started/migration-imports.md
new file mode 100644
index 000000000..1326b5d00
--- /dev/null
+++ b/docs/docs/getting-started/migration-imports.md
@@ -0,0 +1,12 @@
+# Migration
+
+### Chowdown
+
+In the Admin page on the in the Migration section you can provide a URL for a repo hosting a [Chowdown](https://github.com/clarklab/chowdown) repository and Mealie will pull the images and recipes from the instance and automatically import them into the database. Due to the nature of the yaml format you may have mixed results but you should get an error report of the recipes that had errors and will need to be manually added. Note that you can only import the repo as a whole. You cannot import individual recipes.
+
+We'd like to support additional migration paths. [See open issues.](https://github.com/hay-kot/mealie/issues)
+
+**Currently Proposed Are:**
+
+- NextCloud Recipes
+- Open Eats
\ No newline at end of file
diff --git a/docs/docs/1.1 - recipes.md b/docs/docs/getting-started/recipes.md
similarity index 98%
rename from docs/docs/1.1 - recipes.md
rename to docs/docs/getting-started/recipes.md
index a4cf6e412..7dab655b9 100644
--- a/docs/docs/1.1 - recipes.md
+++ b/docs/docs/getting-started/recipes.md
@@ -4,7 +4,7 @@
Adding a recipe can be as easy as copying the recipe URL into mealie and letting the web scrapper try to pull down the information. Currently this scraper is implemented with [scrape-schema-recipe package](https://pypi.org/project/scrape-schema-recipe/). 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.
-
+
## Recipe Editor
@@ -12,12 +12,12 @@ Recipes can be edited and created via the UI. This is done with both a form base
You can also add a custom recipe with the UI editor built into the web view. After logging in as a user you'll have access to the editor to make changes to all the content in the recipe.
-
+
## Bulk Import
Mealie also supports bulk import of recipe instructions and ingredients. Select "Bulk Add" in the editor and paste in your plain text data to be parsed. Each line is treated as one entry and will be appended to the existing ingredients or instructions if they exist. Empty lines will be stripped from the text.
-
+
## 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) as a general guide with some additional properties specific to Mealie.
diff --git a/docs/docs/getting-started/site-settings.md b/docs/docs/getting-started/site-settings.md
new file mode 100644
index 000000000..7dc6266cd
--- /dev/null
+++ b/docs/docs/getting-started/site-settings.md
@@ -0,0 +1,21 @@
+# Site Settings Panel
+!!! 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)
+
+
+## Theme Settings
+Color themes can be created and set from the UI in the settings page. You can select an existing color theme or create a new one. On creation of a new color theme, the default colors will be used, then you can select and save as you'd like. By default the "default" theme will be loaded for all new users visiting the site. All created color themes are available to all users of the site. Theme Colors will be set for both light and dark modes.
+
+
+
+!!! note
+ Theme data is stored in localstorage in the browser. Calling "Save colors and apply theme will refresh the localstorage with the selected theme as well save the theme to the database.
+
+
+
+
+
+## Meal Planner Webhooks
+Meal planner webhooks are post requests sent from Mealie to an external endpoint. The body of the message is the Recipe JSON of the scheduled meal. If no meal is schedule, no request is sent. The webhook functionality can be enabled or disabled as well as scheduled. Note that you must "Save Webhooks" prior to any changes taking affect server side.
+
+
diff --git a/docs/docs/gifs/api-extras.gif b/docs/docs/gifs/api-extras.gif
new file mode 100644
index 000000000..d86f165c3
Binary files /dev/null and b/docs/docs/gifs/api-extras.gif differ
diff --git a/docs/docs/html/api.html b/docs/docs/html/api.html
new file mode 100644
index 000000000..7a1046cc7
--- /dev/null
+++ b/docs/docs/html/api.html
@@ -0,0 +1,26 @@
+
+
+
+
+
- Report Bug
+ A Place for All Your Recipes
+
+ View Demo
·
- Request Feature
+ Report Bug
+ ·
+ API
+ ·
+
+ Request Feature
+
+ ·
+ Docker Hub
+
diff --git a/docs/docs/2.0 - roadmap.md b/docs/docs/roadmap.md
similarity index 97%
rename from docs/docs/2.0 - roadmap.md
rename to docs/docs/roadmap.md
index 788a242f1..f459a8126 100644
--- a/docs/docs/2.0 - roadmap.md
+++ b/docs/docs/roadmap.md
@@ -28,7 +28,6 @@ Feature placement is not set in stone. This is much more of a guideline than any
* [ ] Basic Form Validation
- [ ] Recipe Viewer
* [ ] Print Page View - Like King Arthur Website
- * [ ] Notes Hidden/Not Hidden
* [ ] Total Time Indicator
* [ ] Bake Time
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
index 99008e637..d7f9170ab 100644
--- a/docs/mkdocs.yml
+++ b/docs/mkdocs.yml
@@ -1,19 +1,46 @@
site_name: Mealie Docs
+
theme:
+ features:
+ - navigation.expand
favicon: img/favicon.png
name: material
icon:
logo: material/silverware-variant
- features:
- - navigation.instant
+
markdown_extensions:
+ - pymdownx.emoji:
+ emoji_index: !!python/name:materialx.emoji.twemoji
+ emoji_generator: !!python/name:materialx.emoji.to_svg
- def_list
- pymdownx.highlight
- pymdownx.superfences
- pymdownx.tasklist:
custom_checkbox: true
- admonition
+
extra_css:
- stylesheets/custom.css
repo_url: https://github.com/hay-kot/mealie
repo_name: hay-kot/mealie
+
+nav:
+ - About The Project: "index.md"
+ - Getting Started:
+ - Installation: "getting-started/install.md"
+ - Working With Recipes: "getting-started/recipes.md"
+ - Planning Meals: "getting-started/meal-planner.md"
+ - Site Settings: "getting-started/site-settings.md"
+ - Backups and Exports: "getting-started/backups-and-exports.md"
+ - Recipe Migration: "getting-started/migration-imports.md"
+ - API Reference:
+ - API Usage: "api/api-usage.md"
+ - API Documentation: "api/docs/index.html"
+ - Contributors Guide:
+ - Non-Code: "contributors/non-coders.md"
+ - Developers Guide:
+ - Code Contributions: "contributors/developers-guide/code-contributions.md"
+ - Dev Getting Started: "contributors/developers-guide/starting-dev-server.md"
+ - Guidelines: "contributors/developers-guide/general-guidelines.md"
+ - Development Road Map: "roadmap.md"
+ - Change Log: "changelog.md"
diff --git a/frontend/.env.development b/frontend/.env.development
new file mode 100644
index 000000000..bd3a290a5
--- /dev/null
+++ b/frontend/.env.development
@@ -0,0 +1 @@
+VUE_APP_API_BASE_URL=http://10.10.10.12:9921
\ No newline at end of file
diff --git a/frontend/.vscode/settings.json b/frontend/.vscode/settings.json
new file mode 100644
index 000000000..b0b5a72c6
--- /dev/null
+++ b/frontend/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "cSpell.enableFiletypes": [
+ "!javascript"
+ ]
+}
\ No newline at end of file
diff --git a/frontend/frontend.Dockerfile b/frontend/frontend.Dockerfile
index 2cdab5876..92f6eed1b 100644
--- a/frontend/frontend.Dockerfile
+++ b/frontend/frontend.Dockerfile
@@ -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 b18d4febd..6aa5bbd0c 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1738,6 +1738,16 @@
"integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
"dev": true
},
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
"cacache": {
"version": "13.0.1",
"resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594428402513&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz",
@@ -1764,6 +1774,34 @@
"unique-filename": "^1.1.1"
}
},
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "optional": true
+ },
"find-cache-dir": {
"version": "3.3.1",
"resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz?cache=0&sync_timestamp=1583735626956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-cache-dir%2Fdownload%2Ffind-cache-dir-3.3.1.tgz",
@@ -1785,6 +1823,25 @@
"path-exists": "^4.0.0"
}
},
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "optional": true
+ },
+ "loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz?cache=0&sync_timestamp=1597081764621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flocate-path%2Fdownload%2Flocate-path-5.0.0.tgz",
@@ -1849,6 +1906,16 @@
"minipass": "^3.1.1"
}
},
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
"terser-webpack-plugin": {
"version": "2.3.8",
"resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1603882075288&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz",
@@ -1865,6 +1932,18 @@
"terser": "^4.6.12",
"webpack-sources": "^1.4.3"
}
+ },
+ "vue-loader-v16": {
+ "version": "npm:vue-loader@16.1.2",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz",
+ "integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "hash-sum": "^2.0.0",
+ "loader-utils": "^2.0.0"
+ }
}
}
},
@@ -2481,9 +2560,9 @@
"dev": true
},
"axios": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz",
- "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==",
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
+ "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
"requires": {
"follow-redirects": "^1.10.0"
}
@@ -3740,9 +3819,9 @@
}
},
"core-js": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.1.tgz",
- "integrity": "sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg=="
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz",
+ "integrity": "sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A=="
},
"core-js-compat": {
"version": "3.7.0",
@@ -9448,9 +9527,9 @@
"dev": true
},
"sass": {
- "version": "1.30.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.30.0.tgz",
- "integrity": "sha512-26EUhOXRLaUY7+mWuRFqGeGGNmhB1vblpTENO1Z7mAzzIZeVxZr9EZoaY1kyGLFWdSOZxRMAufiN2mkbO6dAlw==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.0.tgz",
+ "integrity": "sha512-fhyqEbMIycQA4blrz/C0pYhv2o4x2y6FYYAH0CshBw3DXh5D5wyERgxw0ptdau1orc/GhNrhF7DFN2etyOCEng==",
"dev": true,
"requires": {
"chokidar": ">=2.0.0 <4.0.0"
@@ -9736,6 +9815,11 @@
"rechoir": "^0.6.2"
}
},
+ "shvl": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/shvl/-/shvl-2.0.1.tgz",
+ "integrity": "sha512-VU7R5Uxp38LKHooGuZe0TcX2EPK95nn8DvclAvTPyD9/qHmXvt3dR2pJ4JLZ8uLjxQNQ3zNLFJCreteIj3cvpw=="
+ },
"signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz?cache=0&sync_timestamp=1585253323149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.3.tgz",
@@ -11029,9 +11113,9 @@
"integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM="
},
"vue-cli-plugin-vuetify": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.0.8.tgz",
- "integrity": "sha512-BHn9wwj/+B9v25mhZq2dV8NafM2LbogymjluPP+CjDnIdcwR3hW38r3nyKsZNPB1jXfWXsvVszipS3b8FqOBCg==",
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.0.9.tgz",
+ "integrity": "sha512-J4fzpz27OmCCAA3CI56ulYsUrZ859dQAh58Z9XZilY03kd/M+svLlPkK45cBIrGGfjSqQ40oyWezA3NiPBEG8g==",
"dev": true,
"requires": {
"null-loader": "^3.0.0",
@@ -11065,11 +11149,6 @@
}
}
},
- "vue-cookies": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/vue-cookies/-/vue-cookies-1.7.4.tgz",
- "integrity": "sha512-mOS5Btr8V9zvAtkmQ7/TfqJIropOx7etDAgBywPCmHjvfJl2gFbH2XgoMghleLoyyMTi5eaJss0mPN7arMoslA=="
- },
"vue-eslint-parser": {
"version": "7.1.1",
"resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-7.1.1.tgz",
@@ -11102,11 +11181,6 @@
"integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
"dev": true
},
- "vue-html-to-paper": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/vue-html-to-paper/-/vue-html-to-paper-1.3.1.tgz",
- "integrity": "sha512-5IdAPUgStfpVHfcG6nXD0FbUB1onWpvwVD+OZ00jJpy3qaRPkaGD7fFIvYgBB9YPkr0VK065LayEvmGmkkfhaQ=="
- },
"vue-loader": {
"version": "15.9.5",
"resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.5.tgz?cache=0&sync_timestamp=1605670886675&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.5.tgz",
@@ -11128,87 +11202,6 @@
}
}
},
- "vue-loader-v16": {
- "version": "npm:vue-loader@16.1.2",
- "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz",
- "integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==",
- "dev": true,
- "optional": true,
- "requires": {
- "chalk": "^4.1.0",
- "hash-sum": "^2.0.0",
- "loader-utils": "^2.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "optional": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "optional": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "optional": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "optional": true
- },
- "loader-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
- "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "optional": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
"vue-router": {
"version": "3.4.9",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz",
@@ -11249,9 +11242,9 @@
"dev": true
},
"vuetify": {
- "version": "2.3.21",
- "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.3.21.tgz",
- "integrity": "sha512-c9FOjkpVPDoIim88wbfqSIuCsH3jtgQQBC1iMW+ZFxf/Bj+d73HySL2LhEnZwAQT7XTAUGfad4aLPfcNZzK5YQ=="
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.4.2.tgz",
+ "integrity": "sha512-8W1928Fv6GKwLiOThutYf2wtD5C9+vcCavlI8NT0YxNOVvluoL8xrep8mGGwDsCkay+4LzaAX92owKeNi3kpWg=="
},
"vuetify-loader": {
"version": "1.6.0",
@@ -11268,6 +11261,22 @@
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.0.tgz",
"integrity": "sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ=="
},
+ "vuex-persistedstate": {
+ "version": "4.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.0.0-beta.2.tgz",
+ "integrity": "sha512-JeiweafcU+9d4+/nRvQwK2PyHS9xCRcGIlL2cn0ny/afTw2RP+5M6SdsjkcYoGNICTGPi5i+K3J46ioWEyVgvg==",
+ "requires": {
+ "deepmerge": "^4.2.2",
+ "shvl": "^2.0.0"
+ },
+ "dependencies": {
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+ }
+ }
+ },
"watchpack": {
"version": "1.7.5",
"resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.5.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 9e33391e2..7baea6b04 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -8,16 +8,15 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
- "axios": "^0.21.0",
- "core-js": "^3.8.1",
+ "axios": "^0.21.1",
+ "core-js": "^3.8.2",
"qs": "^6.9.4",
"v-jsoneditor": "^1.4.2",
"vue": "^2.6.11",
- "vue-cookies": "^1.7.4",
- "vue-html-to-paper": "^1.3.1",
"vue-router": "^3.4.9",
- "vuetify": "^2.3.21",
- "vuex": "^3.6.0"
+ "vuetify": "^2.4.2",
+ "vuex": "^3.6.0",
+ "vuex-persistedstate": "^4.0.0-beta.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
@@ -26,9 +25,9 @@
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
- "sass": "^1.30.0",
+ "sass": "^1.32.0",
"sass-loader": "^8.0.0",
- "vue-cli-plugin-vuetify": "^2.0.8",
+ "vue-cli-plugin-vuetify": "^2.0.9",
"vue-template-compiler": "^2.6.11",
"vuetify-loader": "^1.3.0"
},
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index a5c69bd11..0e33a66d5 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -2,7 +2,7 @@
- Currently Chowdown via public Repo URL is the only supported type of - migration -
-- Select a theme from the dropdown or create a new theme. Note that the - default theme will be served to all users who have not set a theme - preference. -
-
@@ -57,15 +56,28 @@
+
+ You can import recipes from either a zip file or a directory located in + the /app/data/migraiton/ folder. Please review the documentation to ensure + your directory structure matches what is expected +
++ Choose how Mealie looks to you. Set your theme preference to follow your + system settings, or choose to use the light or dark theme. +
++ Select a theme from the dropdown or create a new theme. Note that the + default theme will be served to all users who have not set a theme + preference. +
+ +