From 9c379dfb8324daf78dbc009c3a487fd81604c29d Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Wed, 7 Apr 2021 17:22:25 -0800 Subject: [PATCH] v0.4.1 - Frontend/UI Improvements (#267) * fix links * actually fix #238 * Feature/mkdocs version bump (#240) * fix links (#239) Co-authored-by: hay-kot * fix #238 * bump mkdocs version * light/dark toggle * light/dark mode css * API_DOCS defaults to True * disable build on push for master Co-authored-by: hay-kot * Feature/recipe viewer (#244) * fix dialog placement * markdown support in ingredients * fix line render issue * fix tag rendering bug * change ingredients to text area * no slug error * add tag pages * remove console.logs Co-authored-by: hay-kot * changelog v0.4.1 * bug/backup-download (#245) * fix blocked download * + download blocked Co-authored-by: hay-kot * Feature/meal planner (#246) * fixes duplicate recipes in meal-plan #221 * add quick week option * scope css * add mealplanner info Co-authored-by: hay-kot * Nextcloud Import Bugs - #248 (#250) * parses datetime properly + clean category - #248 * add default credentials to docs Co-authored-by: hay-kot * Add bulk import examples to docs. (#252) * Add bulk import examples to docs. * Update api-usage.md * Add Python example for bulk import. * Change IP address in API example. * Refactor/app settings (#251) * fix env setup bugs * remove unused import * fix layout issues * changelog Co-authored-by: hay-kot * env setup fixes * Feature/about api (#253) * fix settings * app info cleanup Co-authored-by: hay-kot * Feature/image minify (#256) * fix settings * app info cleanup * bottom-bar experiment * remove dup key * type hints * add dependency * updated image with query parameters * read image options * add image minification * add image minification step * alt image routes * add image minification * set mobile bar to top Co-authored-by: hay-kot * Feature/additional endpoints (#257) * new recipe summary route * add categories to cards * add pillow * show tags instead of categories * additional debug info * add todays meal image url * about page * fix reactive tag * changelog + docs * bump version Co-authored-by: hay-kot * add pillow dependencies (#258) Co-authored-by: hay-kot * Feature/search page (#259) * add pillow dependencies * advanced search page * advanced search apge * remove extra dependencies * add pre-run script Co-authored-by: hay-kot * no image assignment * advanced search * fix docker dev build * Do not force theme settings on login form (#260) * 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 Co-authored-by: hay-kot Co-authored-by: Nat Co-authored-by: sephrat <34862846+sephrat@users.noreply.github.com> --- Dockerfile | 17 +- Dockerfile.dev | 9 +- dev/data/templates/recipes.md | 2 +- docker-compose.dev.yml | 4 +- docs/docs/changelog/v0.4.1.md | 35 ++++ docs/docs/getting-started/api-usage.md | 91 ++++++++- docs/docs/getting-started/install.md | 5 + docs/docs/overrides/api.html | 2 +- docs/mkdocs.yml | 1 + frontend/src/App.vue | 69 +------ frontend/src/api/category.js | 19 +- frontend/src/api/meta.js | 10 +- frontend/src/api/recipe.js | 20 +- .../src/components/Admin/AdminSidebar.vue | 15 +- .../components/Admin/Backup/ImportDialog.vue | 26 ++- .../Admin/General/CreatePageDialog.vue | 7 +- .../Admin/General/HomePageSettings.vue | 6 +- .../Admin/ManageUsers/TheUserTable.vue | 1 - .../Admin/MealPlanner/TimePickerDialog.vue | 3 + .../Admin/Migration/MigrationCard.vue | 12 +- .../FormHelpers/CategorySelector.vue | 50 ----- .../FormHelpers/CategoryTagSelector.vue | 129 ++++++++++++ frontend/src/components/Login/LoginForm.vue | 4 - .../src/components/MealPlan/MealPlanCard.vue | 4 +- .../src/components/MealPlan/MealPlanNew.vue | 62 ++++-- .../components/Recipe/MobileRecipeCard.vue | 13 +- frontend/src/components/Recipe/RecipeCard.vue | 49 +++-- .../components/Recipe/RecipeEditor/index.vue | 87 ++------ .../src/components/Recipe/RecipePrint.vue | 3 +- .../Recipe/RecipeViewer/Ingredients.vue | 40 +++- .../Recipe/RecipeViewer/RecipeChips.vue | 41 +++- .../components/Recipe/RecipeViewer/index.vue | 6 +- frontend/src/components/UI/CardSection.vue | 7 +- .../src/components/UI/CategorySidebar.vue | 5 + .../Dialogs/NewCategoryTagDialog.vue} | 48 +++-- .../src/components/UI/Search/SearchBar.vue | 23 ++- .../src/components/UI/Search/SearchDialog.vue | 53 ++++- frontend/src/components/UI/TheAppBar.vue | 114 +++++++++++ frontend/src/mixins/utilMixins.js | 7 + frontend/src/mixins/validators.js | 2 +- frontend/src/pages/Admin/About/index.vue | 91 +++++++++ .../src/pages/Admin/MealPlanner/index.vue | 83 +++----- frontend/src/pages/HomePage.vue | 2 - frontend/src/pages/MealPlan/Planner.vue | 2 +- frontend/src/pages/MealPlan/ThisWeek.vue | 3 +- frontend/src/pages/Recipe/ViewRecipe.vue | 5 +- frontend/src/pages/Recipes/TagPage.vue | 60 ++++++ frontend/src/pages/SearchPage.vue | 58 ------ .../src/pages/SearchPage/FilterSelector.vue | 69 +++++++ frontend/src/pages/SearchPage/index.vue | 178 +++++++++++++++++ frontend/src/routes/admin.js | 5 + frontend/src/routes/index.js | 4 +- frontend/src/store/index.js | 31 ++- frontend/src/store/modules/userSettings.js | 2 +- frontend/src/utils/index.js | 2 +- makefile | 1 + mealie/app.py | 2 +- mealie/core/config.py | 118 ++++++----- mealie/db/database.py | 3 +- mealie/db/db_base.py | 13 +- mealie/db/init_db.py | 7 +- mealie/db/models/recipe/recipe.py | 8 +- mealie/db/models/recipe/tag.py | 4 +- mealie/routes/debug_routes.py | 31 ++- mealie/routes/mealplans/crud.py | 23 ++- mealie/routes/recipe/all_recipe_routes.py | 13 +- mealie/routes/recipe/recipe_crud_routes.py | 27 ++- mealie/routes/recipe/tag_routes.py | 11 +- mealie/routes/users/crud.py | 2 +- mealie/run.sh | 33 ++- mealie/schema/category.py | 6 +- mealie/schema/debug.py | 15 ++ mealie/schema/recipe.py | 27 ++- mealie/services/backups/exports.py | 3 +- mealie/services/backups/imports.py | 9 +- .../services/image/__init__.py | 0 mealie/services/image/image.py | 112 +++++++++++ mealie/services/image/minify.py | 113 +++++++++++ mealie/services/image_services.py | 63 ------ mealie/services/meal_services.py | 2 +- mealie/services/migrations/chowdown.py | 2 + mealie/services/migrations/nextcloud.py | 31 +-- mealie/services/scraper/cleaner.py | 99 ++++++++- mealie/services/scraper/scraper.py | 2 +- poetry.lock | 189 +++++++++++------- pyproject.toml | 2 + tests/unit_tests/test_cleaner.py | 8 + tests/unit_tests/test_config.py | 33 ++- tests/unit_tests/test_nextcloud.py | 3 +- 89 files changed, 2001 insertions(+), 710 deletions(-) create mode 100644 docs/docs/changelog/v0.4.1.md delete mode 100644 frontend/src/components/FormHelpers/CategorySelector.vue create mode 100644 frontend/src/components/FormHelpers/CategoryTagSelector.vue rename frontend/src/components/{Admin/General/NewCategoryDialog.vue => UI/Dialogs/NewCategoryTagDialog.vue} (57%) create mode 100644 frontend/src/components/UI/TheAppBar.vue create mode 100644 frontend/src/mixins/utilMixins.js create mode 100644 frontend/src/pages/Admin/About/index.vue create mode 100644 frontend/src/pages/Recipes/TagPage.vue delete mode 100644 frontend/src/pages/SearchPage.vue create mode 100644 frontend/src/pages/SearchPage/FilterSelector.vue create mode 100644 frontend/src/pages/SearchPage/index.vue create mode 100644 mealie/schema/debug.py rename dev/data/img/.gitkeep => mealie/services/image/__init__.py (100%) create mode 100644 mealie/services/image/image.py create mode 100644 mealie/services/image/minify.py delete mode 100644 mealie/services/image_services.py diff --git a/Dockerfile b/Dockerfile index 4b6df2a0c121..2528d200ba7e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,14 +7,25 @@ RUN npm run build FROM python:3.9-alpine -RUN apk add --no-cache libxml2-dev libxslt-dev libxml2 caddy libffi-dev -ENV ENV prod + +RUN apk add --no-cache libxml2-dev \ + libxslt-dev \ + libxml2 caddy \ + libffi-dev \ + python3 \ + python3-dev \ + jpeg-dev \ + lcms2-dev \ + openjpeg-dev \ + zlib-dev + + +ENV ENV True EXPOSE 80 WORKDIR /app/ COPY ./pyproject.toml /app/ - RUN apk add --update --no-cache --virtual .build-deps \ curl \ g++ \ diff --git a/Dockerfile.dev b/Dockerfile.dev index 8f3d38ffa919..bce6c5ea0cfc 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -12,10 +12,11 @@ RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get- poetry config virtualenvs.create false # Copy poetry.lock* in case it doesn't exist in the repo -COPY ./pyproject.toml ./poetry.lock* /app/ - -RUN poetry install +COPY ./pyproject.toml /app/ COPY ./mealie /app/mealie -CMD ["uvicorn", "mealie.app:app", "--host", "0.0.0.0", "--port", "9000", "--reload"] \ No newline at end of file +RUN poetry install + +RUN chmod +x /app/mealie/run.sh +CMD ["/app/mealie/run.sh", "reload"] diff --git a/dev/data/templates/recipes.md b/dev/data/templates/recipes.md index 84a404798444..6ee2d4bb6972 100644 --- a/dev/data/templates/recipes.md +++ b/dev/data/templates/recipes.md @@ -1,6 +1,6 @@ -![Recipe Image](../../images/{{ recipe.image }}) +![Recipe Image](../../images/{{ recipe.slug }}/original.jpg) # {{ recipe.name }} {{ recipe.description }} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index eb1b33251ff1..6e1aac0a9a11 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -29,8 +29,8 @@ services: db_type: sqlite TZ: America/Anchorage # Specify Correct Timezone for Date/Time to line up correctly. volumes: - - ./app_data:/app_data - - ./mealie:/app + - ./dev/data:/app/dev/data + - ./mealie:/app/mealie # Mkdocs mealie-docs: diff --git a/docs/docs/changelog/v0.4.1.md b/docs/docs/changelog/v0.4.1.md new file mode 100644 index 000000000000..9ab671f6afc7 --- /dev/null +++ b/docs/docs/changelog/v0.4.1.md @@ -0,0 +1,35 @@ +# v0.4.1 + +**App Version: v0.4.1** + +**Database Version: v0.4.0** + +!!! error "Breaking Changes" + + #### Recipe Images + While it *shouldn't* be a breaking change, I feel it is important to note that you may experience issues with the new image migration. Recipe images are now minified, this is done on start-up, import, migration, and when a new recipe is created. The initial boot or load may be a bit slow if you have lots of recipes but you likely won't notice. What you may notice is that if your recipe slug and the image name do not match, you will encounter issues with your images showing up. This can be resolved by finding the image directory and rename it to the appropriate slug. I did fix multiple edge cases, but it is likely more exists. As always make a backup before you update! + + On the plus side, this comes with a huge performance increase! 🎉 + +- Add markdown support for ingredients - Resolves #32 +- Ingredients editor improvements +- Fix Tags/Categories render problems on recipes +- Tags redirect to new tag pages +- Categories redirect to category pages +- Fix Backup download blocked by authentication +- Random meal-planner will no longer duplicate recipes unless no other options +- New Quick Week button to generate next 5 day week of recipe slots. +- Minor UI tweaks +- Recipe Cards now display 2 recipe tags +- Recipe images are now minified. This comes with a serious performance improvement. On initial startup you may experience some delays. Images are migrated to the new structure on startup, depending on the size of your database this can take some time. + - Note that original images are still kept for large displays like on the individual recipe pages. + - A smaller image is used for recipe cards + - A 'tiny' image is used for search images. +- Advanced Search Page. You can now use the search page to filter recipes to include/exclude tags and categories as well as select And/Or matching criteria. +- Added link to advanced search on quick search +- Better support for NextCloud imports + - Translate keywords to tags + - Fix rollback on failure +- Recipe Tag/Category Input components have been unified and now share a single way to interact. To add a new category in the recipe editor you need to click to '+' icon next to the input and fill out the form. This is the same for adding a Tag. + + diff --git a/docs/docs/getting-started/api-usage.md b/docs/docs/getting-started/api-usage.md index 4964ae6edbbe..b58fc485fa90 100644 --- a/docs/docs/getting-started/api-usage.md +++ b/docs/docs/getting-started/api-usage.md @@ -10,5 +10,94 @@ For example you could add `{"message": "Remember to thaw the chicken"}` to a rec ## Examples +### Bulk import +Recipes can be imported in bulk from a file containing a list of URLs. This can be done using the following bash or python scripts with the `list` file containing one URL per line. -Have Ideas? Submit a PR! \ No newline at end of file +#### Bash +```bash +#!/bin/bash + +function authentification () { + auth=$(curl -X 'POST' \ + "$3/api/auth/token" \ + -H 'accept: application/json' \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'grant_type=&username='$1'&password='$2'&scope=&client_id=&client_secret=') + + echo $auth | sed -e 's/.*token":"\(.*\)",.*/\1/' +} + +function import_from_file () { + while IFS= read -r line + do + echo $line + curl -X 'POST' \ + "$3/api/recipes/create-url" \ + -H "Authorization: Bearer $2" \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{"url": "'$line'" }' + echo + done < "$1" +} + +input="list" +mail="changeme@email.com" +password="MyPassword" +mealie_url=http://localhost:9000 + + +token=$(authentification $mail $password $mealie_url) +import_from_file $input $token $mealie_url + +``` + +#### Python +```python +import requests +import re + +def authentification(mail, password, mealie_url): + headers = { + 'accept': 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded', + } + data = { + 'grant_type': '', + 'username': mail, + 'password': password, + 'scope': '', + 'client_id': '', + 'client_secret': '' + } + auth = requests.post(mealie_url + "/api/auth/token", headers=headers, data=data) + token = re.sub(r'.*token":"(.*)",.*', r'\1', auth.text) + return token + +def import_from_file(input_file, token, mealie_url): + with open(input_file) as fp: + for l in fp: + line = re.sub(r'(.*)\n', r'\1', l) + print(line) + headers = { + 'Authorization': "Bearer " + token, + 'accept': 'application/json', + 'Content-Type': 'application/json' + } + data = { + 'url': line + } + response = requests.post(mealie_url + "/api/recipes/create-url", headers=headers, json=data) + print(response.text) + +input_file="list" +mail="changeme@email.com" +password="MyPassword" +mealie_url="http://localhost:9000" + + +token = authentification(mail, password, mealie_url) +import_from_file(input_file, token, mealie_url) +``` + +Have Ideas? Submit a PR! diff --git a/docs/docs/getting-started/install.md b/docs/docs/getting-started/install.md index 3f2aaf113fe3..737d20e48228 100644 --- a/docs/docs/getting-started/install.md +++ b/docs/docs/getting-started/install.md @@ -23,6 +23,11 @@ docker run \ ``` +!!! tip "Default Credentials" + **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. diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index 5249b0d34e31..f679a924c9b4 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 080c3ca3d54c..7d675172a133 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -74,6 +74,7 @@ nav: - Guidelines: "contributors/developers-guide/general-guidelines.md" - Development Road Map: "roadmap.md" - Change Log: + - v0.4.1 Frontend/UI: "changelog/v0.4.1.md" - v0.4.0 Authentication: "changelog/v0.4.0.md" - v0.3.0 Improvements: "changelog/v0.3.0.md" - v0.2.0 Now With Tests!: "changelog/v0.2.0.md" diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 69b2e3c0f3c1..bb545577b9a9 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,35 +1,6 @@ @@ -160,6 +113,7 @@ export default { .notify-base { color: white !important; + /* min-height: 50px; */ margin-right: 60px; margin-bottom: -5px; opacity: 0.9 !important; @@ -176,11 +130,4 @@ export default { *::-webkit-scrollbar-thumb { background: grey; } - -.notify-base { - color: white !important; - margin-right: 60px; - margin-bottom: -5px; - opacity: 0.9 !important; -} diff --git a/frontend/src/api/category.js b/frontend/src/api/category.js index ef582c580478..f60739c8dc61 100644 --- a/frontend/src/api/category.js +++ b/frontend/src/api/category.js @@ -5,27 +5,27 @@ import { store } from "@/store"; const prefix = baseURL + "categories"; const categoryURLs = { - get_all: `${prefix}`, - get_category: category => `${prefix}/${category}`, - delete_category: category => `${prefix}/${category}`, + getAll: `${prefix}`, + getCategory: category => `${prefix}/${category}`, + deleteCategory: category => `${prefix}/${category}`, }; export const categoryAPI = { async getAll() { - let response = await apiReq.get(categoryURLs.get_all); + let response = await apiReq.get(categoryURLs.getAll); return response.data; }, async create(name) { - let response = await apiReq.post(categoryURLs.get_all, { name: name }); + let response = await apiReq.post(categoryURLs.getAll, { name: name }); store.dispatch("requestCategories"); return response.data; }, async getRecipesInCategory(category) { - let response = await apiReq.get(categoryURLs.get_category(category)); + let response = await apiReq.get(categoryURLs.getCategory(category)); return response.data; }, async delete(category) { - let response = await apiReq.delete(categoryURLs.delete_category(category)); + let response = await apiReq.delete(categoryURLs.deleteCategory(category)); store.dispatch("requestCategories"); return response.data; }, @@ -44,6 +44,11 @@ export const tagAPI = { let response = await apiReq.get(tagURLs.getAll); return response.data; }, + async create(name) { + let response = await apiReq.post(tagURLs.getAll, { name: name }); + store.dispatch("requestTags"); + return response.data; + }, async getRecipesInTag(tag) { let response = await apiReq.get(tagURLs.getTag(tag)); return response.data; diff --git a/frontend/src/api/meta.js b/frontend/src/api/meta.js index bcf6470fcf99..59183c0c5ea1 100644 --- a/frontend/src/api/meta.js +++ b/frontend/src/api/meta.js @@ -5,15 +5,22 @@ const prefix = baseURL + "debug"; const debugURLs = { version: `${prefix}/version`, + debug: `${prefix}`, lastRecipe: `${prefix}/last-recipe-json`, demo: `${prefix}/is-demo`, }; export const metaAPI = { - async get_version() { + async getAppInfo() { let response = await apiReq.get(debugURLs.version); return response.data; }, + + async getDebugInfo() { + const response = await apiReq.get(debugURLs.debug); + return response.data; + }, + async getLastJson() { let response = await apiReq.get(debugURLs.lastRecipe); return response.data; @@ -21,7 +28,6 @@ export const metaAPI = { async getIsDemo() { let response = await apiReq.get(debugURLs.demo); - console.log(response); return response.data; }, }; diff --git a/frontend/src/api/recipe.js b/frontend/src/api/recipe.js index 97a4b08c4713..50e45e593365 100644 --- a/frontend/src/api/recipe.js +++ b/frontend/src/api/recipe.js @@ -8,6 +8,7 @@ const prefix = baseURL + "recipes/"; const recipeURLs = { allRecipes: baseURL + "recipes", + summary: baseURL + "recipes" + "/summary", allRecipesByCategory: prefix + "category", create: prefix + "create", createByURL: prefix + "create-url", @@ -56,9 +57,7 @@ export const recipeAPI = { const fd = new FormData(); fd.append("image", fileObject); fd.append("extension", fileObject.name.split(".").pop()); - let response = apiReq.put(recipeURLs.updateImage(recipeSlug), fd); - return response; }, @@ -87,4 +86,21 @@ export const recipeAPI = { return response.data; }, + + async allSummary() { + const response = await apiReq.get(recipeURLs.summary); + return response.data; + }, + + recipeImage(recipeSlug) { + return `/api/recipes/${recipeSlug}/image?image_type=original`; + }, + + recipeSmallImage(recipeSlug) { + return `/api/recipes/${recipeSlug}/image?image_type=small`; + }, + + recipeTinyImage(recipeSlug) { + return `/api/recipes/${recipeSlug}/image?image_type=tiny`; + }, }; diff --git a/frontend/src/components/Admin/AdminSidebar.vue b/frontend/src/components/Admin/AdminSidebar.vue index 5e719307b23d..f09070492e02 100644 --- a/frontend/src/components/Admin/AdminSidebar.vue +++ b/frontend/src/components/Admin/AdminSidebar.vue @@ -74,7 +74,7 @@ - + mdi-information @@ -83,10 +83,11 @@ {{ $t("settings.current") }} - {{ version }} + {{ appVersion }} - + {{ $t("general.download") }} @@ -61,6 +66,7 @@ diff --git a/frontend/src/components/Admin/General/CreatePageDialog.vue b/frontend/src/components/Admin/General/CreatePageDialog.vue index efedf8cf015b..57f6830ed2f3 100644 --- a/frontend/src/components/Admin/General/CreatePageDialog.vue +++ b/frontend/src/components/Admin/General/CreatePageDialog.vue @@ -19,10 +19,11 @@ v-model="page.name" label="Page Name" > - @@ -43,10 +44,10 @@ \ No newline at end of file diff --git a/frontend/src/components/Admin/Migration/MigrationCard.vue b/frontend/src/components/Admin/Migration/MigrationCard.vue index 7f3ef7ed4886..8dad1af08f5a 100644 --- a/frontend/src/components/Admin/Migration/MigrationCard.vue +++ b/frontend/src/components/Admin/Migration/MigrationCard.vue @@ -40,7 +40,13 @@ {{ $t("general.delete") }} - + {{ $t("general.import") }} @@ -82,10 +88,10 @@ export default { this.$emit("refresh"); }, async importMigration(file_name) { - this.loading == true; + this.loading = true; let response = await api.migrations.import(this.folder, file_name); this.$emit("imported", response.successful, response.failed); - this.loading == false; + this.loading = false; }, readableTime(timestamp) { let date = new Date(timestamp); diff --git a/frontend/src/components/FormHelpers/CategorySelector.vue b/frontend/src/components/FormHelpers/CategorySelector.vue deleted file mode 100644 index 390bd60d6043..000000000000 --- a/frontend/src/components/FormHelpers/CategorySelector.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/FormHelpers/CategoryTagSelector.vue b/frontend/src/components/FormHelpers/CategoryTagSelector.vue new file mode 100644 index 000000000000..4abdffe1f10c --- /dev/null +++ b/frontend/src/components/FormHelpers/CategoryTagSelector.vue @@ -0,0 +1,129 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/Login/LoginForm.vue b/frontend/src/components/Login/LoginForm.vue index b2cc18981dc7..1cb48b729e26 100644 --- a/frontend/src/components/Login/LoginForm.vue +++ b/frontend/src/components/Login/LoginForm.vue @@ -22,13 +22,11 @@ diff --git a/frontend/src/components/Recipe/MobileRecipeCard.vue b/frontend/src/components/Recipe/MobileRecipeCard.vue index 9b436c076022..c0df606bf5d4 100644 --- a/frontend/src/components/Recipe/MobileRecipeCard.vue +++ b/frontend/src/components/Recipe/MobileRecipeCard.vue @@ -1,8 +1,13 @@ - \ No newline at end of file diff --git a/frontend/src/components/Recipe/RecipeViewer/RecipeChips.vue b/frontend/src/components/Recipe/RecipeViewer/RecipeChips.vue index 825f2e8d9732..de8d9a4b4354 100644 --- a/frontend/src/components/Recipe/RecipeViewer/RecipeChips.vue +++ b/frontend/src/components/Recipe/RecipeViewer/RecipeChips.vue @@ -1,13 +1,14 @@