-
-
+
+
{{ displayTitleIcon }}
{{ title }}
@@ -12,9 +12,9 @@
{{ $vuetify.breakpoint.xsOnly ? null : $t("general.random") }}
-
-
-
+
+
+
{{ $globals.icons.sort }}
@@ -57,7 +57,7 @@
-
+
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/frontend/components/Layout/AppSidebar.vue b/frontend/components/Layout/AppSidebar.vue
index 53e9abb3c713..908b8628f455 100644
--- a/frontend/components/Layout/AppSidebar.vue
+++ b/frontend/components/Layout/AppSidebar.vue
@@ -1,16 +1,122 @@
-
+
+
+
+
+
+
+
+
+
+ {{ $auth.user.fullName }}
+ {{ $auth.user.admin ? $t("user.admin") : $t("user.user") }}
+
+
+
+
+
+
+
+
+
+
+ {{ nav.icon }}
+
+ {{ nav.title }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ nav.icon }}
+
+ {{ nav.title }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ nav.icon }}
+
+ {{ nav.title }}
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/frontend.old/src/components/UI/SiteLoader.vue b/frontend/components/global/AppLoader.vue
similarity index 100%
rename from frontend.old/src/components/UI/SiteLoader.vue
rename to frontend/components/global/AppLoader.vue
diff --git a/frontend/components/global/AutoForm.vue b/frontend/components/global/AutoForm.vue
new file mode 100644
index 000000000000..b5f193b86570
--- /dev/null
+++ b/frontend/components/global/AutoForm.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+ {{ inputField.section }}
+
+
+ {{ inputField.sectionDetails }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.text }}
+ {{ item.description }}
+
+
+
+
+
+
+
+
+
+ {{ inputField.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputField.label }} {{ idx + 1 }}
+
+
+
+
+
+
+
+
+
+ New
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend.old/src/components/UI/Dialogs/BaseDialog.vue b/frontend/components/global/BaseDialog.vue
similarity index 61%
rename from frontend.old/src/components/UI/Dialogs/BaseDialog.vue
rename to frontend/components/global/BaseDialog.vue
index 438c4f514199..383b334c7522 100644
--- a/frontend.old/src/components/UI/Dialogs/BaseDialog.vue
+++ b/frontend/components/global/BaseDialog.vue
@@ -1,23 +1,28 @@
-
+
-
+
- {{ displayTitleIcon }}
+ {{ icon }}
{{ title }}
-
+
-
+
+
+
+
+
@@ -26,17 +31,17 @@
-
- {{ $t("general.delete") }}
-
-
-
+
+
+ {{ $t("general.confirm") }}
+
+
{{ submitText }}
-
+
-
-
-
+
diff --git a/frontend/composables/use-api.ts b/frontend/composables/use-api.ts
new file mode 100644
index 000000000000..4bf7ab5464ec
--- /dev/null
+++ b/frontend/composables/use-api.ts
@@ -0,0 +1,64 @@
+import { AxiosResponse } from "axios";
+import { useContext } from "@nuxtjs/composition-api";
+import { NuxtAxiosInstance } from "@nuxtjs/axios";
+import { Api } from "~/api";
+import { ApiRequestInstance } from "~/types/api";
+
+interface RequestResponse {
+ response: AxiosResponse | null;
+ data: T | null;
+ error: any;
+}
+
+const request = {
+ async safe(funcCall: any, url: string, data: object = {}): Promise> {
+ const response = await funcCall(url, data).catch(function (error: object) {
+ console.log(error);
+ // Insert Generic Error Handling Here
+ return { response: null, error, data: null };
+ });
+ return { response, error: null, data: response.data };
+ },
+};
+
+function getRequests(axoisInstance: NuxtAxiosInstance): ApiRequestInstance {
+ const requests = {
+ async get(url: string, queryParams = {}): Promise> {
+ let error = null;
+ const response = await axoisInstance.get(url, { params: { queryParams } }).catch((e) => {
+ error = e;
+ });
+ if (response != null) {
+ return { response, error, data: response?.data };
+ }
+ return { response: null, error, data: null };
+ },
+
+ async post(url: string, data: object) {
+ return await request.safe(axoisInstance.post, url, data);
+ },
+
+ async put(url: string, data: object) {
+ return await request.safe(axoisInstance.put, url, data);
+ },
+
+ async patch(url: string, data: object) {
+ return await request.safe(axoisInstance.patch, url, data);
+ },
+
+ async delete(url: string) {
+ return await request.safe(axoisInstance.delete, url);
+ },
+ };
+ return requests;
+}
+
+
+
+
+export const useApi = function (): Api {
+ const { $axios } = useContext();
+ const requests = getRequests($axios);
+
+ return new Api(requests)
+};
diff --git a/frontend.old/src/locales/dateTimeFormats/af-ZA.json b/frontend/lang/dateTimeFormats/af-ZA.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/af-ZA.json
rename to frontend/lang/dateTimeFormats/af-ZA.json
diff --git a/frontend.old/src/locales/dateTimeFormats/ar-SA.json b/frontend/lang/dateTimeFormats/ar-SA.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/ar-SA.json
rename to frontend/lang/dateTimeFormats/ar-SA.json
diff --git a/frontend.old/src/locales/dateTimeFormats/ca-ES.json b/frontend/lang/dateTimeFormats/ca-ES.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/ca-ES.json
rename to frontend/lang/dateTimeFormats/ca-ES.json
diff --git a/frontend.old/src/locales/dateTimeFormats/cs-CZ.json b/frontend/lang/dateTimeFormats/cs-CZ.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/cs-CZ.json
rename to frontend/lang/dateTimeFormats/cs-CZ.json
diff --git a/frontend.old/src/locales/dateTimeFormats/da-DK.json b/frontend/lang/dateTimeFormats/da-DK.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/da-DK.json
rename to frontend/lang/dateTimeFormats/da-DK.json
diff --git a/frontend.old/src/locales/dateTimeFormats/de-DE.json b/frontend/lang/dateTimeFormats/de-DE.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/de-DE.json
rename to frontend/lang/dateTimeFormats/de-DE.json
diff --git a/frontend.old/src/locales/dateTimeFormats/el-GR.json b/frontend/lang/dateTimeFormats/el-GR.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/el-GR.json
rename to frontend/lang/dateTimeFormats/el-GR.json
diff --git a/frontend.old/src/locales/dateTimeFormats/en-GB.json b/frontend/lang/dateTimeFormats/en-GB.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/en-GB.json
rename to frontend/lang/dateTimeFormats/en-GB.json
diff --git a/frontend.old/src/locales/dateTimeFormats/en-US.json b/frontend/lang/dateTimeFormats/en-US.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/en-US.json
rename to frontend/lang/dateTimeFormats/en-US.json
diff --git a/frontend.old/src/locales/dateTimeFormats/es-ES.json b/frontend/lang/dateTimeFormats/es-ES.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/es-ES.json
rename to frontend/lang/dateTimeFormats/es-ES.json
diff --git a/frontend.old/src/locales/dateTimeFormats/fi-FI.json b/frontend/lang/dateTimeFormats/fi-FI.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/fi-FI.json
rename to frontend/lang/dateTimeFormats/fi-FI.json
diff --git a/frontend.old/src/locales/dateTimeFormats/fr-FR.json b/frontend/lang/dateTimeFormats/fr-FR.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/fr-FR.json
rename to frontend/lang/dateTimeFormats/fr-FR.json
diff --git a/frontend.old/src/locales/dateTimeFormats/he-IL.json b/frontend/lang/dateTimeFormats/he-IL.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/he-IL.json
rename to frontend/lang/dateTimeFormats/he-IL.json
diff --git a/frontend.old/src/locales/dateTimeFormats/hu-HU.json b/frontend/lang/dateTimeFormats/hu-HU.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/hu-HU.json
rename to frontend/lang/dateTimeFormats/hu-HU.json
diff --git a/frontend.old/src/locales/dateTimeFormats/it-IT.json b/frontend/lang/dateTimeFormats/it-IT.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/it-IT.json
rename to frontend/lang/dateTimeFormats/it-IT.json
diff --git a/frontend.old/src/locales/dateTimeFormats/ja-JP.json b/frontend/lang/dateTimeFormats/ja-JP.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/ja-JP.json
rename to frontend/lang/dateTimeFormats/ja-JP.json
diff --git a/frontend.old/src/locales/dateTimeFormats/ko-KR.json b/frontend/lang/dateTimeFormats/ko-KR.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/ko-KR.json
rename to frontend/lang/dateTimeFormats/ko-KR.json
diff --git a/frontend.old/src/locales/dateTimeFormats/nl-NL.json b/frontend/lang/dateTimeFormats/nl-NL.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/nl-NL.json
rename to frontend/lang/dateTimeFormats/nl-NL.json
diff --git a/frontend.old/src/locales/dateTimeFormats/no-NO.json b/frontend/lang/dateTimeFormats/no-NO.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/no-NO.json
rename to frontend/lang/dateTimeFormats/no-NO.json
diff --git a/frontend.old/src/locales/dateTimeFormats/pl-PL.json b/frontend/lang/dateTimeFormats/pl-PL.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/pl-PL.json
rename to frontend/lang/dateTimeFormats/pl-PL.json
diff --git a/frontend.old/src/locales/dateTimeFormats/pt-BR.json b/frontend/lang/dateTimeFormats/pt-BR.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/pt-BR.json
rename to frontend/lang/dateTimeFormats/pt-BR.json
diff --git a/frontend.old/src/locales/dateTimeFormats/pt-PT.json b/frontend/lang/dateTimeFormats/pt-PT.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/pt-PT.json
rename to frontend/lang/dateTimeFormats/pt-PT.json
diff --git a/frontend.old/src/locales/dateTimeFormats/ro-RO.json b/frontend/lang/dateTimeFormats/ro-RO.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/ro-RO.json
rename to frontend/lang/dateTimeFormats/ro-RO.json
diff --git a/frontend.old/src/locales/dateTimeFormats/ru-RU.json b/frontend/lang/dateTimeFormats/ru-RU.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/ru-RU.json
rename to frontend/lang/dateTimeFormats/ru-RU.json
diff --git a/frontend.old/src/locales/dateTimeFormats/sr-SP.json b/frontend/lang/dateTimeFormats/sr-SP.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/sr-SP.json
rename to frontend/lang/dateTimeFormats/sr-SP.json
diff --git a/frontend.old/src/locales/dateTimeFormats/sv-SE.json b/frontend/lang/dateTimeFormats/sv-SE.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/sv-SE.json
rename to frontend/lang/dateTimeFormats/sv-SE.json
diff --git a/frontend.old/src/locales/dateTimeFormats/tr-TR.json b/frontend/lang/dateTimeFormats/tr-TR.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/tr-TR.json
rename to frontend/lang/dateTimeFormats/tr-TR.json
diff --git a/frontend.old/src/locales/dateTimeFormats/uk-UA.json b/frontend/lang/dateTimeFormats/uk-UA.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/uk-UA.json
rename to frontend/lang/dateTimeFormats/uk-UA.json
diff --git a/frontend.old/src/locales/dateTimeFormats/vi-VN.json b/frontend/lang/dateTimeFormats/vi-VN.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/vi-VN.json
rename to frontend/lang/dateTimeFormats/vi-VN.json
diff --git a/frontend.old/src/locales/dateTimeFormats/zh-CN.json b/frontend/lang/dateTimeFormats/zh-CN.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/zh-CN.json
rename to frontend/lang/dateTimeFormats/zh-CN.json
diff --git a/frontend.old/src/locales/dateTimeFormats/zh-TW.json b/frontend/lang/dateTimeFormats/zh-TW.json
similarity index 100%
rename from frontend.old/src/locales/dateTimeFormats/zh-TW.json
rename to frontend/lang/dateTimeFormats/zh-TW.json
diff --git a/frontend.old/src/locales/messages/af-ZA.json b/frontend/lang/messages/af-ZA.json
similarity index 100%
rename from frontend.old/src/locales/messages/af-ZA.json
rename to frontend/lang/messages/af-ZA.json
diff --git a/frontend.old/src/locales/messages/ar-SA.json b/frontend/lang/messages/ar-SA.json
similarity index 100%
rename from frontend.old/src/locales/messages/ar-SA.json
rename to frontend/lang/messages/ar-SA.json
diff --git a/frontend.old/src/locales/messages/ca-ES.json b/frontend/lang/messages/ca-ES.json
similarity index 100%
rename from frontend.old/src/locales/messages/ca-ES.json
rename to frontend/lang/messages/ca-ES.json
diff --git a/frontend.old/src/locales/messages/cs-CZ.json b/frontend/lang/messages/cs-CZ.json
similarity index 100%
rename from frontend.old/src/locales/messages/cs-CZ.json
rename to frontend/lang/messages/cs-CZ.json
diff --git a/frontend.old/src/locales/messages/da-DK.json b/frontend/lang/messages/da-DK.json
similarity index 100%
rename from frontend.old/src/locales/messages/da-DK.json
rename to frontend/lang/messages/da-DK.json
diff --git a/frontend.old/src/locales/messages/de-DE.json b/frontend/lang/messages/de-DE.json
similarity index 100%
rename from frontend.old/src/locales/messages/de-DE.json
rename to frontend/lang/messages/de-DE.json
diff --git a/frontend.old/src/locales/messages/el-GR.json b/frontend/lang/messages/el-GR.json
similarity index 100%
rename from frontend.old/src/locales/messages/el-GR.json
rename to frontend/lang/messages/el-GR.json
diff --git a/frontend.old/src/locales/messages/en-GB.json b/frontend/lang/messages/en-GB.json
similarity index 100%
rename from frontend.old/src/locales/messages/en-GB.json
rename to frontend/lang/messages/en-GB.json
diff --git a/frontend/lang/messages/en-US.js b/frontend/lang/messages/en-US.js
new file mode 100644
index 000000000000..1af877c21336
--- /dev/null
+++ b/frontend/lang/messages/en-US.js
@@ -0,0 +1,497 @@
+export default {
+ about: {
+ about: "About",
+ "about-mealie": "About Mealie",
+ "api-docs": "API Docs",
+ "api-port": "API Port",
+ "application-mode": "Application Mode",
+ "database-type": "Database Type",
+ "database-url": "Database URL",
+ "default-group": "Default Group",
+ demo: "Demo",
+ "demo-status": "Demo Status",
+ development: "Development",
+ docs: "Docs",
+ "download-log": "Download Log",
+ "download-recipe-json": "Last Scraped JSON",
+ github: "Github",
+ "log-lines": "Log Lines",
+ "not-demo": "Not Demo",
+ portfolio: "Portfolio",
+ production: "Production",
+ support: "Support",
+ version: "Version",
+ },
+ asset: {
+ assets: "Assets",
+ code: "Code",
+ file: "File",
+ image: "Image",
+ "new-asset": "New Asset",
+ pdf: "PDF",
+ recipe: "Recipe",
+ "show-assets": "Show Assets",
+ },
+ category: {
+ "category-created": "Category created",
+ "category-creation-failed": "Category creation failed",
+ "category-deleted": "Category Deleted",
+ "category-deletion-failed": "Category deletion failed",
+ "category-filter": "Category Filter",
+ "category-update-failed": "Category update failed",
+ "category-updated": "Category updated",
+ "uncategorized-count": "Uncategorized {count}",
+ },
+ events: {
+ "apprise-url": "Apprise URL",
+ database: "Database",
+ "delete-event": "Delete Event",
+ "new-notification-form-description":
+ "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
+ "new-version": "New version available!",
+ notification: "Notification",
+ refresh: "Refresh",
+ scheduled: "Scheduled",
+ "something-went-wrong": "Something Went Wrong!",
+ "subscribed-events": "Subscribed Events",
+ "test-message-sent": "Test Message Sent",
+ },
+ general: {
+ cancel: "Cancel",
+ clear: "Clear",
+ close: "Close",
+ confirm: "Confirm",
+ "confirm-delete-generic": "Are you sure you want to delete this?",
+ copied: "Copied",
+ create: "Create",
+ created: "Created",
+ custom: "Custom",
+ dashboard: "Dashboard",
+ delete: "Delete",
+ disabled: "Disabled",
+ download: "Download",
+ edit: "Edit",
+ enabled: "Enabled",
+ exception: "Exception",
+ "failed-count": "Failed: {count}",
+ "failure-uploading-file": "Failure uploading file",
+ favorites: "Favorites",
+ "field-required": "Field Required",
+ "file-folder-not-found": "File/folder not found",
+ "file-uploaded": "File uploaded",
+ filter: "Filter",
+ friday: "Friday",
+ general: "General",
+ get: "Get",
+ home: "Home",
+ image: "Image",
+ "image-upload-failed": "Image upload failed",
+ import: "Import",
+ json: "JSON",
+ keyword: "Keyword",
+ "link-copied": "Link Copied",
+ "loading-recipes": "Loading Recipes",
+ monday: "Monday",
+ name: "Name",
+ new: "New",
+ no: "No",
+ "no-recipe-found": "No Recipe Found",
+ ok: "OK",
+ options: "Options:",
+ print: "Print",
+ random: "Random",
+ rating: "Rating",
+ recent: "Recent",
+ recipe: "Recipe",
+ recipes: "Recipes",
+ "rename-object": "Rename {0}",
+ reset: "Reset",
+ saturday: "Saturday",
+ save: "Save",
+ settings: "Settings",
+ share: "Share",
+ shuffle: "Shuffle",
+ sort: "Sort",
+ "sort-alphabetically": "Alphabetical",
+ status: "Status",
+ submit: "Submit",
+ "success-count": "Success: {count}",
+ sunday: "Sunday",
+ templates: "Templates:",
+ test: "Test",
+ themes: "Themes",
+ thursday: "Thursday",
+ token: "Token",
+ tuesday: "Tuesday",
+ type: "Type",
+ update: "Update",
+ updated: "Updated",
+ upload: "Upload",
+ url: "URL",
+ view: "View",
+ wednesday: "Wednesday",
+ yes: "Yes",
+ },
+ group: {
+ "are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete {groupName}?",
+ "cannot-delete-default-group": "Cannot delete default group",
+ "cannot-delete-group-with-users": "Cannot delete group with users",
+ "confirm-group-deletion": "Confirm Group Deletion",
+ "create-group": "Create Group",
+ "error-updating-group": "Error updating group",
+ group: "Group",
+ "group-deleted": "Group deleted",
+ "group-deletion-failed": "Group deletion failed",
+ "group-id-with-value": "Group ID: {groupID}",
+ "group-name": "Group Name",
+ "group-not-found": "Group not found",
+ "group-with-value": "Group: {groupID}",
+ groups: "Groups",
+ "manage-groups": "Manage Groups",
+ "user-group": "User Group",
+ "user-group-created": "User Group Created",
+ "user-group-creation-failed": "User Group Creation Failed",
+ },
+ "meal-plan": {
+ "create-a-new-meal-plan": "Create a New Meal Plan",
+ "dinner-this-week": "Dinner This Week",
+ "dinner-today": "Dinner Today",
+ "dinner-tonight": "DINNER TONIGHT",
+ "edit-meal-plan": "Edit Meal Plan",
+ "end-date": "End Date",
+ group: "Group (Beta)",
+ main: "Main",
+ "meal-planner": "Meal Planner",
+ "meal-plans": "Meal Plans",
+ "mealplan-categories": "MEALPLAN CATEGORIES",
+ "mealplan-created": "Mealplan created",
+ "mealplan-creation-failed": "Mealplan creation failed",
+ "mealplan-deleted": "Mealplan Deleted",
+ "mealplan-deletion-failed": "Mealplan deletion failed",
+ "mealplan-settings": "Mealplan Settings",
+ "mealplan-update-failed": "Mealplan update failed",
+ "mealplan-updated": "Mealplan Updated",
+ "no-meal-plan-defined-yet": "No meal plan defined yet",
+ "no-meal-planned-for-today": "No meal planned for today",
+ "only-recipes-with-these-categories-will-be-used-in-meal-plans":
+ "Only recipes with these categories will be used in Meal Plans",
+ planner: "Planner",
+ "quick-week": "Quick Week",
+ side: "Side",
+ sides: "Sides",
+ "start-date": "Start Date",
+ },
+ migration: {
+ chowdown: {
+ description: "Migrate data from Chowdown",
+ title: "Chowdown",
+ },
+ "migration-data-removed": "Migration data removed",
+ nextcloud: {
+ description: "Migrate data from a Nextcloud Cookbook instance",
+ title: "Nextcloud Cookbook",
+ },
+ "no-migration-data-available": "No Migration Data Available",
+ "recipe-migration": "Recipe Migration",
+ },
+ "new-recipe": {
+ "bulk-add": "Bulk Add",
+ "error-details":
+ "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
+ "error-title": "Looks Like We Couldn't Find Anything",
+ "from-url": "Import a Recipe",
+ "github-issues": "GitHub Issues",
+ "google-ld-json-info": "Google ld+json Info",
+ "must-be-a-valid-url": "Must be a Valid URL",
+ "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list":
+ "Paste in your recipe data. Each line will be treated as an item in a list",
+ "recipe-markup-specification": "Recipe Markup Specification",
+ "recipe-url": "Recipe URL",
+ "upload-a-recipe": "Upload a Recipe",
+ "upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
+ "url-form-hint": "Copy and paste a link from your favorite recipe website",
+ "view-scraped-data": "View Scraped Data",
+ },
+ page: {
+ "404-page-not-found": "404 Page not found",
+ "all-recipes": "All Recipes",
+ "new-page-created": "New page created",
+ page: "Page",
+ "page-creation-failed": "Page creation failed",
+ "page-deleted": "Page deleted",
+ "page-deletion-failed": "Page deletion failed",
+ "page-update-failed": "Page update failed",
+ "page-updated": "Page updated",
+ "pages-update-failed": "Pages update failed",
+ "pages-updated": "Pages updated",
+ },
+ recipe: {
+ "add-key": "Add Key",
+ "add-to-favorites": "Add to Favorites",
+ "api-extras": "API Extras",
+ calories: "Calories",
+ "calories-suffix": "calories",
+ "carbohydrate-content": "Carbohydrate",
+ categories: "Categories",
+ "comment-action": "Comment",
+ comments: "Comments",
+ "delete-confirmation": "Are you sure you want to delete this recipe?",
+ "delete-recipe": "Delete Recipe",
+ description: "Description",
+ "disable-amount": "Disable Ingredient Amounts",
+ "disable-comments": "Disable Comments",
+ "fat-content": "Fat",
+ "fiber-content": "Fiber",
+ grams: "grams",
+ ingredient: "Ingredient",
+ ingredients: "Ingredients",
+ "insert-section": "Insert Section",
+ instructions: "Instructions",
+ "key-name-required": "Key Name Required",
+ "landscape-view-coming-soon": "Landscape View (Coming Soon)",
+ milligrams: "milligrams",
+ "new-key-name": "New Key Name",
+ "no-white-space-allowed": "No White Space Allowed",
+ note: "Note",
+ nutrition: "Nutrition",
+ "object-key": "Object Key",
+ "object-value": "Object Value",
+ "original-url": "Original URL",
+ "perform-time": "Cook Time",
+ "prep-time": "Prep Time",
+ "protein-content": "Protein",
+ "public-recipe": "Public Recipe",
+ "recipe-created": "Recipe created",
+ "recipe-creation-failed": "Recipe creation failed",
+ "recipe-deleted": "Recipe deleted",
+ "recipe-image": "Recipe Image",
+ "recipe-image-updated": "Recipe image updated",
+ "recipe-name": "Recipe Name",
+ "recipe-settings": "Recipe Settings",
+ "recipe-update-failed": "Recipe update failed",
+ "recipe-updated": "Recipe updated",
+ "remove-from-favorites": "Remove from Favorites",
+ "remove-section": "Remove Section",
+ "save-recipe-before-use": "Save recipe before use",
+ "section-title": "Section Title",
+ servings: "Servings",
+ "share-recipe-message": "I wanted to share my {0} recipe with you.",
+ "show-nutrition-values": "Show Nutrition Values",
+ "sodium-content": "Sodium",
+ "step-index": "Step: {step}",
+ "sugar-content": "Sugar",
+ title: "Title",
+ "total-time": "Total Time",
+ "unable-to-delete-recipe": "Unable to Delete Recipe",
+ },
+ reicpe: {
+ "no-recipe": "No Recipe",
+ },
+ search: {
+ "advanced-search": "Advanced Search",
+ and: "and",
+ exclude: "Exclude",
+ include: "Include",
+ "max-results": "Max Results",
+ or: "Or",
+ results: "Results",
+ search: "Search",
+ "search-mealie": "Search Mealie (press /)",
+ "search-placeholder": "Search...",
+ "tag-filter": "Tag Filter",
+ },
+ settings: {
+ "add-a-new-theme": "Add a New Theme",
+ "admin-settings": "Admin Settings",
+ backup: {
+ "backup-created-at-response-export_path": "Backup Created at {path}",
+ "backup-deleted": "Backup deleted",
+ "backup-tag": "Backup Tag",
+ "create-heading": "Create a Backup",
+ "delete-backup": "Delete Backup",
+ "error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
+ "full-backup": "Full Backup",
+ "import-summary": "Import Summary",
+ "partial-backup": "Partial Backup",
+ "unable-to-delete-backup": "Unable to Delete Backup.",
+ },
+ "backup-and-exports": "Backups",
+ "change-password": "Change Password",
+ current: "Version:",
+ "custom-pages": "Custom Pages",
+ "edit-page": "Edit Page",
+ events: "Events",
+ "first-day-of-week": "First day of the week",
+ "group-settings-updated": "Group Settings Updated",
+ homepage: {
+ "all-categories": "All Categories",
+ "card-per-section": "Card Per Section",
+ "home-page": "Home Page",
+ "home-page-sections": "Home Page Sections",
+ "show-recent": "Show Recent",
+ },
+ language: "Language",
+ latest: "Latest",
+ "local-api": "Local API",
+ "locale-settings": "Locale settings",
+ migrations: "Migrations",
+ "new-page": "New Page",
+ notify: "Notify",
+ organize: "Organize",
+ "page-name": "Page Name",
+ pages: "Pages",
+ profile: "Profile",
+ "remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
+ "set-new-time": "Set New Time",
+ "settings-update-failed": "Settings update failed",
+ "settings-updated": "Settings updated",
+ "site-settings": "Site Settings",
+ theme: {
+ accent: "Accent",
+ dark: "Dark",
+ "default-to-system": "Default to system",
+ error: "Error",
+ "error-creating-theme-see-log-file": "Error creating theme. See log file.",
+ "error-deleting-theme": "Error deleting theme",
+ "error-updating-theme": "Error updating theme",
+ info: "Info",
+ light: "Light",
+ primary: "Primary",
+ secondary: "Secondary",
+ success: "Success",
+ "switch-to-dark-mode": "Switch to dark mode",
+ "switch-to-light-mode": "Switch to light mode",
+ "theme-deleted": "Theme deleted",
+ "theme-name": "Theme Name",
+ "theme-name-is-required": "Theme Name is required.",
+ "theme-saved": "Theme Saved",
+ "theme-updated": "Theme updated",
+ warning: "Warning",
+ },
+ token: {
+ "active-tokens": "ACTIVE TOKENS",
+ "api-token": "API Token",
+ "api-tokens": "API Tokens",
+ "copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again":
+ "Copy this token for use with an external application. This token will not be viewable again.",
+ "create-an-api-token": "Create an API Token",
+ "token-name": "Token Name",
+ },
+ toolbox: {
+ "assign-all": "Assign All",
+ "bulk-assign": "Bulk Assign",
+ "new-name": "New Name",
+ "no-unused-items": "No Unused Items",
+ "recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected",
+ "remove-unused": "Remove Unused",
+ "title-case-all": "Title Case All",
+ toolbox: "Toolbox",
+ unorganized: "Unorganized",
+ },
+ webhooks: {
+ "test-webhooks": "Test Webhooks",
+ "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at":
+ "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
+ "webhook-url": "Webhook URL",
+ "webhooks-caps": "WEBHOOKS",
+ },
+ },
+ "shopping-list": {
+ "all-lists": "All Lists",
+ "create-shopping-list": "Create Shopping List",
+ "from-recipe": "From Recipe",
+ "list-name": "List Name",
+ "new-list": "New List",
+ quantity: "Quantity: {0}",
+ "shopping-list": "Shopping List",
+ "shopping-lists": "Shopping Lists",
+ },
+ sidebar: {
+ "all-recipes": "All Recipes",
+ categories: "Categories",
+ dashboard: "Dashboard",
+ "home-page": "Home Page",
+ "manage-users": "Manage Users",
+ migrations: "Migrations",
+ profile: "Profile",
+ search: "Search",
+ "site-settings": "Site Settings",
+ tags: "Tags",
+ toolbox: "Toolbox",
+ },
+ signup: {
+ "error-signing-up": "Error Signing Up",
+ "sign-up": "Sign Up",
+ "sign-up-link-created": "Sign up link created",
+ "sign-up-link-creation-failed": "Sign up link creation failed",
+ "sign-up-links": "Sign Up Links",
+ "sign-up-token-deleted": "Sign Up Token Deleted",
+ "sign-up-token-deletion-failed": "Sign up token deletion failed",
+ "welcome-to-mealie":
+ "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator.",
+ },
+ tag: {
+ "tag-created": "Tag created",
+ "tag-creation-failed": "Tag creation failed",
+ "tag-deleted": "Tag deleted",
+ "tag-deletion-failed": "Tag deletion failed",
+ "tag-update-failed": "Tag update failed",
+ "tag-updated": "Tag updated",
+ tags: "Tags",
+ "untagged-count": "Untagged {count}",
+ },
+ user: {
+ admin: "Admin",
+ "are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link {link}?",
+ "are-you-sure-you-want-to-delete-the-user":
+ "Are you sure you want to delete the user {activeName} ID: {activeId}?",
+ "confirm-link-deletion": "Confirm Link Deletion",
+ "confirm-password": "Confirm Password",
+ "confirm-user-deletion": "Confirm User Deletion",
+ "could-not-validate-credentials": "Could Not Validate Credentials",
+ "create-link": "Create Link",
+ "create-user": "Create User",
+ "current-password": "Current Password",
+ "e-mail-must-be-valid": "E-mail must be valid",
+ "edit-user": "Edit User",
+ email: "Email",
+ "error-cannot-delete-super-user": "Error! Cannot Delete Super User",
+ "existing-password-does-not-match": "Existing password does not match",
+ "full-name": "Full Name",
+ "link-id": "Link ID",
+ "link-name": "Link Name",
+ login: "Login",
+ logout: "Logout",
+ "manage-users": "Manage Users",
+ "new-password": "New Password",
+ "new-user": "New User",
+ password: "Password",
+ "password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
+ "password-must-match": "Password must match",
+ "password-reset-failed": "Password reset failed",
+ "password-updated": "Password updated",
+ "reset-password": "Reset Password",
+ "sign-in": "Sign in",
+ "total-mealplans": "Total MealPlans",
+ "total-users": "Total Users",
+ "upload-photo": "Upload Photo",
+ "use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
+ user: "User",
+ "user-created": "User created",
+ "user-creation-failed": "User creation failed",
+ "user-deleted": "User deleted",
+ "user-id": "User ID",
+ "user-id-with-value": "User ID: {id}",
+ "user-password": "User Password",
+ "user-successfully-logged-in": "User Successfully Logged In",
+ "user-update-failed": "User update failed",
+ "user-updated": "User updated",
+ username: "Username",
+ users: "Users",
+ "users-header": "USERS",
+ "webhook-time": "Webhook Time",
+ "webhooks-enabled": "Webhooks Enabled",
+ "you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
+ "you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user",
+ },
+};
diff --git a/frontend.old/src/locales/messages/en-US.json b/frontend/lang/messages/en-US.json
similarity index 100%
rename from frontend.old/src/locales/messages/en-US.json
rename to frontend/lang/messages/en-US.json
diff --git a/frontend.old/src/locales/messages/es-ES.json b/frontend/lang/messages/es-ES.json
similarity index 100%
rename from frontend.old/src/locales/messages/es-ES.json
rename to frontend/lang/messages/es-ES.json
diff --git a/frontend.old/src/locales/messages/fi-FI.json b/frontend/lang/messages/fi-FI.json
similarity index 100%
rename from frontend.old/src/locales/messages/fi-FI.json
rename to frontend/lang/messages/fi-FI.json
diff --git a/frontend.old/src/locales/messages/fr-FR.json b/frontend/lang/messages/fr-FR.json
similarity index 100%
rename from frontend.old/src/locales/messages/fr-FR.json
rename to frontend/lang/messages/fr-FR.json
diff --git a/frontend.old/src/locales/messages/he-IL.json b/frontend/lang/messages/he-IL.json
similarity index 100%
rename from frontend.old/src/locales/messages/he-IL.json
rename to frontend/lang/messages/he-IL.json
diff --git a/frontend.old/src/locales/messages/hu-HU.json b/frontend/lang/messages/hu-HU.json
similarity index 100%
rename from frontend.old/src/locales/messages/hu-HU.json
rename to frontend/lang/messages/hu-HU.json
diff --git a/frontend.old/src/locales/messages/it-IT.json b/frontend/lang/messages/it-IT.json
similarity index 100%
rename from frontend.old/src/locales/messages/it-IT.json
rename to frontend/lang/messages/it-IT.json
diff --git a/frontend.old/src/locales/messages/ja-JP.json b/frontend/lang/messages/ja-JP.json
similarity index 100%
rename from frontend.old/src/locales/messages/ja-JP.json
rename to frontend/lang/messages/ja-JP.json
diff --git a/frontend.old/src/locales/messages/ko-KR.json b/frontend/lang/messages/ko-KR.json
similarity index 100%
rename from frontend.old/src/locales/messages/ko-KR.json
rename to frontend/lang/messages/ko-KR.json
diff --git a/frontend.old/src/locales/messages/nl-NL.json b/frontend/lang/messages/nl-NL.json
similarity index 100%
rename from frontend.old/src/locales/messages/nl-NL.json
rename to frontend/lang/messages/nl-NL.json
diff --git a/frontend.old/src/locales/messages/no-NO.json b/frontend/lang/messages/no-NO.json
similarity index 100%
rename from frontend.old/src/locales/messages/no-NO.json
rename to frontend/lang/messages/no-NO.json
diff --git a/frontend.old/src/locales/messages/pl-PL.json b/frontend/lang/messages/pl-PL.json
similarity index 100%
rename from frontend.old/src/locales/messages/pl-PL.json
rename to frontend/lang/messages/pl-PL.json
diff --git a/frontend.old/src/locales/messages/pt-BR.json b/frontend/lang/messages/pt-BR.json
similarity index 100%
rename from frontend.old/src/locales/messages/pt-BR.json
rename to frontend/lang/messages/pt-BR.json
diff --git a/frontend.old/src/locales/messages/pt-PT.json b/frontend/lang/messages/pt-PT.json
similarity index 100%
rename from frontend.old/src/locales/messages/pt-PT.json
rename to frontend/lang/messages/pt-PT.json
diff --git a/frontend.old/src/locales/messages/ro-RO.json b/frontend/lang/messages/ro-RO.json
similarity index 100%
rename from frontend.old/src/locales/messages/ro-RO.json
rename to frontend/lang/messages/ro-RO.json
diff --git a/frontend.old/src/locales/messages/ru-RU.json b/frontend/lang/messages/ru-RU.json
similarity index 100%
rename from frontend.old/src/locales/messages/ru-RU.json
rename to frontend/lang/messages/ru-RU.json
diff --git a/frontend.old/src/locales/messages/sr-SP.json b/frontend/lang/messages/sr-SP.json
similarity index 100%
rename from frontend.old/src/locales/messages/sr-SP.json
rename to frontend/lang/messages/sr-SP.json
diff --git a/frontend.old/src/locales/messages/sv-SE.json b/frontend/lang/messages/sv-SE.json
similarity index 100%
rename from frontend.old/src/locales/messages/sv-SE.json
rename to frontend/lang/messages/sv-SE.json
diff --git a/frontend.old/src/locales/messages/tr-TR.json b/frontend/lang/messages/tr-TR.json
similarity index 100%
rename from frontend.old/src/locales/messages/tr-TR.json
rename to frontend/lang/messages/tr-TR.json
diff --git a/frontend.old/src/locales/messages/uk-UA.json b/frontend/lang/messages/uk-UA.json
similarity index 100%
rename from frontend.old/src/locales/messages/uk-UA.json
rename to frontend/lang/messages/uk-UA.json
diff --git a/frontend.old/src/locales/messages/vi-VN.json b/frontend/lang/messages/vi-VN.json
similarity index 100%
rename from frontend.old/src/locales/messages/vi-VN.json
rename to frontend/lang/messages/vi-VN.json
diff --git a/frontend.old/src/locales/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json
similarity index 100%
rename from frontend.old/src/locales/messages/zh-CN.json
rename to frontend/lang/messages/zh-CN.json
diff --git a/frontend.old/src/locales/messages/zh-TW.json b/frontend/lang/messages/zh-TW.json
similarity index 100%
rename from frontend.old/src/locales/messages/zh-TW.json
rename to frontend/lang/messages/zh-TW.json
diff --git a/frontend/layouts/admin.vue b/frontend/layouts/admin.vue
index e2288e4ace08..7c7724d80782 100644
--- a/frontend/layouts/admin.vue
+++ b/frontend/layouts/admin.vue
@@ -1,17 +1,96 @@
-
+
+
+
+
+
+
+
+ {{ $globals.icons.menu }}
+
+
+
+
+
+
+
+
\ No newline at end of file
++
\ No newline at end of file
diff --git a/frontend/layouts/basic.vue b/frontend/layouts/basic.vue
new file mode 100644
index 000000000000..b8a1c407ec09
--- /dev/null
+++ b/frontend/layouts/basic.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
\ No newline at end of file
diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue
index 2e6308df6ee1..f0fb6cee2e09 100644
--- a/frontend/layouts/default.vue
+++ b/frontend/layouts/default.vue
@@ -1,117 +1,71 @@
-
-
-
-
- {{ item.icon }}
-
-
-
-
-
-
-
-
-
-
- mdi-{{ `chevron-${miniVariant ? 'right' : 'left'}` }}
+
+
+
+
+
+
+ {{ $globals.icons.menu }}
-
- mdi-application
-
-
- mdi-minus
-
-
-
-
- mdi-menu
-
-
+
-
+
-
+
-
-
-
-
-
- mdi-repeat
-
-
- Switch drawer (click me)
-
-
-
-
- © {{ new Date().getFullYear() }}
-
+
+
-
+
+ +
\ No newline at end of file
diff --git a/frontend/layouts/error.vue b/frontend/layouts/error.vue
index ae22f7cf04be..74027b77b73c 100644
--- a/frontend/layouts/error.vue
+++ b/frontend/layouts/error.vue
@@ -6,35 +6,32 @@
{{ otherError }}
-
- Home page
-
+ Home page
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/admin/manage-users.vue b/frontend/pages/admin/manage-users.vue
index f65b2c8a525b..a39f31c72bf6 100644
--- a/frontend/pages/admin/manage-users.vue
+++ b/frontend/pages/admin/manage-users.vue
@@ -1,16 +1,17 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/admin/migrations.vue b/frontend/pages/admin/migrations.vue
index f65b2c8a525b..a39f31c72bf6 100644
--- a/frontend/pages/admin/migrations.vue
+++ b/frontend/pages/admin/migrations.vue
@@ -1,16 +1,17 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/admin/site-settings.vue b/frontend/pages/admin/site-settings.vue
index f65b2c8a525b..a39f31c72bf6 100644
--- a/frontend/pages/admin/site-settings.vue
+++ b/frontend/pages/admin/site-settings.vue
@@ -1,16 +1,17 @@
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/admin/toolbox.vue b/frontend/pages/admin/toolbox.vue
index d0cd7424ba9b..a39f31c72bf6 100644
--- a/frontend/pages/admin/toolbox.vue
+++ b/frontend/pages/admin/toolbox.vue
@@ -1,16 +1,17 @@
-
-
-
-
\ No newline at end of file
diff --git a/frontend/pages/index.vue b/frontend/pages/index.vue
index 411c8fc22c68..3d3d96a42a34 100644
--- a/frontend/pages/index.vue
+++ b/frontend/pages/index.vue
@@ -1,16 +1,28 @@
-
+
+
+
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/frontend/pages/meal-plan/planner.vue b/frontend/pages/meal-plan/planner.vue
index f65b2c8a525b..bb6aebe3f129 100644
--- a/frontend/pages/meal-plan/planner.vue
+++ b/frontend/pages/meal-plan/planner.vue
@@ -3,7 +3,7 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/frontend/pages/user/register.vue b/frontend/pages/user/profile.vue
similarity index 92%
rename from frontend/pages/user/register.vue
rename to frontend/pages/user/profile.vue
index 7aa494406644..516e23df5228 100644
--- a/frontend/pages/user/register.vue
+++ b/frontend/pages/user/profile.vue
@@ -6,6 +6,7 @@
import { defineComponent } from "@nuxtjs/composition-api";
export default defineComponent({
+ layout: "admin",
setup() {
return {};
},
diff --git a/frontend/pages/user/sign-up.vue b/frontend/pages/user/sign-up.vue
new file mode 100644
index 000000000000..c234c6995a37
--- /dev/null
+++ b/frontend/pages/user/sign-up.vue
@@ -0,0 +1,116 @@
+
+
+
+
+ Request Secure Link
+
+
+
+
+
+ Submit
+
+
+
+ Login
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/plugins/globals.js b/frontend/plugins/globals.js
new file mode 100644
index 000000000000..f0fd42ee3217
--- /dev/null
+++ b/frontend/plugins/globals.js
@@ -0,0 +1,206 @@
+import {
+ mdiAccount,
+ mdiSilverwareVariant,
+ mdiPlus,
+ mdiPlusCircle,
+ mdiDelete,
+ mdiContentSave,
+ mdiContentSaveEdit,
+ mdiSquareEditOutline,
+ mdiClose,
+ mdiTagMultipleOutline,
+ mdiBookOutline,
+ mdiAccountCog,
+ mdiAccountGroup,
+ mdiHome,
+ mdiMagnify,
+ mdiTranslate,
+ mdiClockTimeFourOutline,
+ mdiImport,
+ mdiEmail,
+ mdiLock,
+ mdiEye,
+ mdiEyeOff,
+ mdiCalendarMinus,
+ mdiCalendar,
+ mdiDiceMultiple,
+ mdiAlertCircle,
+ mdiDotsVertical,
+ mdiPrinter,
+ mdiShareVariant,
+ mdiHeart,
+ mdiHeartOutline,
+ mdiDotsHorizontal,
+ mdiCheckboxBlankOutline,
+ mdiCommentTextMultipleOutline,
+ mdiDownload,
+ mdiFile,
+ mdiFilePdfBox,
+ mdiFileImage,
+ mdiCodeJson,
+ mdiArrowUpDown,
+ mdiCog,
+ mdiSort,
+ mdiOrderAlphabeticalAscending,
+ mdiStar,
+ mdiNewBox,
+ mdiShuffleVariant,
+ mdiAlert,
+ mdiCheckboxMarkedCircle,
+ mdiInformation,
+ mdiBellAlert,
+ mdiRefreshCircle,
+ mdiMenu,
+ mdiWeatherSunny,
+ mdiWeatherNight,
+ mdiLink,
+ mdiRobot,
+ mdiLinkVariant,
+ mdiViewModule,
+ mdiViewDashboard,
+ mdiTools,
+ mdiCalendarWeek,
+ mdiCalendarToday,
+ mdiCalendarMultiselect,
+ mdiFormatListChecks,
+ mdiLogout,
+ mdiContentCopy,
+ mdiClipboardCheck,
+ mdiCloudUpload,
+ mdiDatabase,
+ mdiGithub,
+ mdiFolderOutline,
+ mdiApi,
+ mdiTestTube,
+ mdiDevTo,
+ mdiBackupRestore,
+ mdiNotificationClearAll,
+ mdiFood,
+ mdiWebhook,
+ mdiFilter,
+ mdiAccountPlusOutline,
+ mdiDesktopTowerMonitor,
+ mdiFormatColorFill,
+ mdiFormSelect,
+ mdiPageLayoutBody,
+ mdiCalendarWeekBegin,
+ mdiOpenInNew,
+ mdiCheck,
+ mdiBroom,
+ mdiCartCheck,
+ mdiArrowLeftBold,
+ mdiMinus,
+ mdiWindowClose,
+ mdiFolderZipOutline,
+} from "@mdi/js";
+
+const icons = {
+ // Primary
+ primary: mdiSilverwareVariant,
+
+ // General
+ alert: mdiAlert,
+ alertCircle: mdiAlertCircle,
+ api: mdiApi,
+ arrowLeftBold: mdiArrowLeftBold,
+ arrowUpDown: mdiArrowUpDown,
+ backupRestore: mdiBackupRestore,
+ bellAlert: mdiBellAlert,
+ broom: mdiBroom,
+ calendar: mdiCalendar,
+ calendarMinus: mdiCalendarMinus,
+ calendarMultiselect: mdiCalendarMultiselect,
+ calendarToday: mdiCalendarToday,
+ calendarWeek: mdiCalendarWeek,
+ calendarWeekBegin: mdiCalendarWeekBegin,
+ cartCheck: mdiCartCheck,
+ check: mdiCheck,
+ checkboxBlankOutline: mdiCheckboxBlankOutline,
+ checkboxMarkedCircle: mdiCheckboxMarkedCircle,
+ clipboardCheck: mdiClipboardCheck,
+ clockOutline: mdiClockTimeFourOutline,
+ codeBraces: mdiCodeJson,
+ codeJson: mdiCodeJson,
+ cog: mdiCog,
+ commentTextMultipleOutline: mdiCommentTextMultipleOutline,
+ contentCopy: mdiContentCopy,
+ database: mdiDatabase,
+ desktopTowerMonitor: mdiDesktopTowerMonitor,
+ devTo: mdiDevTo,
+ diceMultiple: mdiDiceMultiple,
+ dotsHorizontal: mdiDotsHorizontal,
+ dotsVertical: mdiDotsVertical,
+ download: mdiDownload,
+ email: mdiEmail,
+ externalLink: mdiLinkVariant,
+ eye: mdiEye,
+ eyeOff: mdiEyeOff,
+ file: mdiFile,
+ fileImage: mdiFileImage,
+ filePDF: mdiFilePdfBox,
+ filter: mdiFilter,
+ folderOutline: mdiFolderOutline,
+ food: mdiFood,
+ formatColorFill: mdiFormatColorFill,
+ formatListCheck: mdiFormatListChecks,
+ formSelect: mdiFormSelect,
+ github: mdiGithub,
+ heart: mdiHeart,
+ heartOutline: mdiHeartOutline,
+ home: mdiHome,
+ import: mdiImport,
+ information: mdiInformation,
+ link: mdiLink,
+ lock: mdiLock,
+ logout: mdiLogout,
+ menu: mdiMenu,
+ newBox: mdiNewBox,
+ notificationClearAll: mdiNotificationClearAll,
+ openInNew: mdiOpenInNew,
+ orderAlphabeticalAscending: mdiOrderAlphabeticalAscending,
+ pageLayoutBody: mdiPageLayoutBody,
+ printer: mdiPrinter,
+ refreshCircle: mdiRefreshCircle,
+ robot: mdiRobot,
+ search: mdiMagnify,
+ shareVariant: mdiShareVariant,
+ shuffleVariant: mdiShuffleVariant,
+ sort: mdiSort,
+ star: mdiStar,
+ testTube: mdiTestTube,
+ tools: mdiTools,
+ translate: mdiTranslate,
+ upload: mdiCloudUpload,
+ viewDashboard: mdiViewDashboard,
+ viewModule: mdiViewModule,
+ weatherNight: mdiWeatherNight,
+ weatherSunny: mdiWeatherSunny,
+ webhook: mdiWebhook,
+ windowClose: mdiWindowClose,
+ zip: mdiFolderZipOutline,
+
+ // Crud
+ createAlt: mdiPlus,
+ create: mdiPlusCircle,
+ delete: mdiDelete,
+ save: mdiContentSave,
+ update: mdiContentSaveEdit,
+ edit: mdiSquareEditOutline,
+ close: mdiClose,
+ minus: mdiMinus,
+
+ // Organization
+ tags: mdiTagMultipleOutline,
+ pages: mdiBookOutline,
+
+ // Admin
+ user: mdiAccount,
+ admin: mdiAccountCog,
+ group: mdiAccountGroup,
+ accountPlusOutline: mdiAccountPlusOutline,
+};
+
+export default ({ app }, inject) => {
+ // Inject $hello(msg) in Vue, context and store.
+ inject("globals", { icons });
+};
diff --git a/frontend/static/account.png b/frontend/static/account.png
new file mode 100644
index 000000000000..28804298a32c
Binary files /dev/null and b/frontend/static/account.png differ
diff --git a/frontend/store/index.js b/frontend/store/index.js
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
index 896590d01fc6..77f9c2712a7d 100644
--- a/frontend/tsconfig.json
+++ b/frontend/tsconfig.json
@@ -10,12 +10,13 @@
"strict": true,
"noEmit": true,
"experimentalDecorators": true,
+ "strictPropertyInitialization": false,
"baseUrl": ".",
"paths": {
"~/*": ["./*"],
"@/*": ["./*"]
},
- "types": ["@nuxt/types", "@nuxtjs/axios", "@nuxt/content", "@types/node"]
+ "types": ["@nuxt/types", "@nuxtjs/axios", "@types/node", "nuxt-i18n", "@nuxtjs/auth-next"]
},
"exclude": ["node_modules", ".nuxt", "dist"]
}
diff --git a/frontend/types/api-types/admin.ts b/frontend/types/api-types/admin.ts
new file mode 100644
index 000000000000..2d86f73d1b39
--- /dev/null
+++ b/frontend/types/api-types/admin.ts
@@ -0,0 +1,253 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+/* This file was automatically generated from pydantic models by running pydantic2ts.
+/* Do not modify it by hand - just update the pydantic models and then re-run the script
+*/
+
+export interface AppInfo {
+ production: boolean;
+ version: string;
+ demoStatus: boolean;
+}
+export interface AppStatistics {
+ totalRecipes: number;
+ totalUsers: number;
+ totalGroups: number;
+ uncategorizedRecipes: number;
+ untaggedRecipes: number;
+}
+export interface BackupJob {
+ tag?: string;
+ options: BackupOptions;
+ templates?: string[];
+}
+export interface BackupOptions {
+ recipes?: boolean;
+ settings?: boolean;
+ pages?: boolean;
+ themes?: boolean;
+ groups?: boolean;
+ users?: boolean;
+ notifications?: boolean;
+}
+export interface CategoryBase {
+ name: string;
+ id: number;
+ slug: string;
+}
+export interface ChowdownURL {
+ url: string;
+}
+export interface Colors {
+ primary?: string;
+ accent?: string;
+ secondary?: string;
+ success?: string;
+ info?: string;
+ warning?: string;
+ error?: string;
+}
+export interface CustomPageBase {
+ name: string;
+ slug?: string;
+ position: number;
+ categories?: RecipeCategoryResponse[];
+}
+export interface RecipeCategoryResponse {
+ name: string;
+ id: number;
+ slug: string;
+ recipes?: Recipe[];
+}
+export interface Recipe {
+ id?: number;
+ name?: string;
+ slug?: string;
+ image?: unknown;
+ description?: string;
+ recipeCategory?: string[];
+ tags?: string[];
+ rating?: number;
+ dateAdded?: string;
+ dateUpdated?: string;
+ recipeYield?: string;
+ recipeIngredient?: RecipeIngredient[];
+ recipeInstructions?: RecipeStep[];
+ nutrition?: Nutrition;
+ tools?: string[];
+ totalTime?: string;
+ prepTime?: string;
+ performTime?: string;
+ settings?: RecipeSettings;
+ assets?: RecipeAsset[];
+ notes?: RecipeNote[];
+ orgURL?: string;
+ extras?: {
+ [k: string]: unknown;
+ };
+ comments?: CommentOut[];
+}
+export interface RecipeIngredient {
+ title?: string;
+ note?: string;
+ unit?: RecipeIngredientUnit;
+ food?: RecipeIngredientFood;
+ disableAmount?: boolean;
+ quantity?: number;
+}
+export interface RecipeIngredientUnit {
+ name?: string;
+ description?: string;
+}
+export interface RecipeIngredientFood {
+ name?: string;
+ description?: string;
+}
+export interface RecipeStep {
+ title?: string;
+ text: string;
+}
+export interface Nutrition {
+ calories?: string;
+ fatContent?: string;
+ proteinContent?: string;
+ carbohydrateContent?: string;
+ fiberContent?: string;
+ sodiumContent?: string;
+ sugarContent?: string;
+}
+export interface RecipeSettings {
+ public?: boolean;
+ showNutrition?: boolean;
+ showAssets?: boolean;
+ landscapeView?: boolean;
+ disableComments?: boolean;
+ disableAmount?: boolean;
+}
+export interface RecipeAsset {
+ name: string;
+ icon: string;
+ fileName?: string;
+}
+export interface RecipeNote {
+ title: string;
+ text: string;
+}
+export interface CommentOut {
+ text: string;
+ id: number;
+ uuid: string;
+ recipeSlug: string;
+ dateAdded: string;
+ user: UserBase;
+}
+export interface UserBase {
+ id: number;
+ username?: string;
+ admin: boolean;
+}
+export interface CustomPageImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+}
+export interface CustomPageOut {
+ name: string;
+ slug?: string;
+ position: number;
+ categories?: RecipeCategoryResponse[];
+ id: number;
+}
+export interface DebugInfo {
+ production: boolean;
+ version: string;
+ demoStatus: boolean;
+ apiPort: number;
+ apiDocs: boolean;
+ dbType: string;
+ dbUrl: string;
+ defaultGroup: string;
+}
+export interface GroupImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+}
+export interface ImportBase {
+ name: string;
+ status: boolean;
+ exception?: string;
+}
+export interface ImportJob {
+ recipes?: boolean;
+ settings?: boolean;
+ pages?: boolean;
+ themes?: boolean;
+ groups?: boolean;
+ users?: boolean;
+ notifications?: boolean;
+ name: string;
+ force?: boolean;
+ rebase?: boolean;
+}
+export interface Imports {
+ imports: LocalBackup[];
+ templates: string[];
+}
+export interface LocalBackup {
+ name: string;
+ date: string;
+}
+export interface MigrationFile {
+ name: string;
+ date: string;
+}
+export interface MigrationImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+ slug?: string;
+}
+export interface Migrations {
+ type: string;
+ files?: MigrationFile[];
+}
+export interface NotificationImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+}
+export interface RecipeImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+ slug?: string;
+}
+export interface SettingsImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+}
+export interface SiteSettings {
+ language?: string;
+ firstDayOfWeek?: number;
+ showRecent?: boolean;
+ cardsPerSection?: number;
+ categories?: CategoryBase[];
+}
+export interface SiteTheme {
+ id?: number;
+ name?: string;
+ colors?: Colors;
+}
+export interface ThemeImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+}
+export interface UserImport {
+ name: string;
+ status: boolean;
+ exception?: string;
+}
diff --git a/frontend/types/api-types/events.ts b/frontend/types/api-types/events.ts
new file mode 100644
index 000000000000..d5b45234f612
--- /dev/null
+++ b/frontend/types/api-types/events.ts
@@ -0,0 +1,60 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+/* This file was automatically generated from pydantic models by running pydantic2ts.
+/* Do not modify it by hand - just update the pydantic models and then re-run the script
+*/
+
+export type EventCategory = "general" | "recipe" | "backup" | "scheduled" | "migration" | "group" | "user";
+export type DeclaredTypes = "General" | "Discord" | "Gotify" | "Pushover" | "Home Assistant";
+export type GotifyPriority = "low" | "moderate" | "normal" | "high";
+
+export interface Discord {
+ webhookId: string;
+ webhookToken: string;
+}
+export interface Event {
+ id?: number;
+ title: string;
+ text: string;
+ timeStamp?: string;
+ category?: EventCategory & string;
+}
+export interface EventNotificationIn {
+ id?: number;
+ name?: string;
+ type?: DeclaredTypes & string;
+ general?: boolean;
+ recipe?: boolean;
+ backup?: boolean;
+ scheduled?: boolean;
+ migration?: boolean;
+ group?: boolean;
+ user?: boolean;
+ notificationUrl?: string;
+}
+export interface EventNotificationOut {
+ id?: number;
+ name?: string;
+ type?: DeclaredTypes & string;
+ general?: boolean;
+ recipe?: boolean;
+ backup?: boolean;
+ scheduled?: boolean;
+ migration?: boolean;
+ group?: boolean;
+ user?: boolean;
+}
+export interface EventsOut {
+ total: number;
+ events: Event[];
+}
+export interface Gotify {
+ hostname: string;
+ token: string;
+ priority?: GotifyPriority & string;
+}
+export interface TestEvent {
+ id?: number;
+ testUrl?: string;
+}
diff --git a/frontend/types/api-types/meal-plan.ts b/frontend/types/api-types/meal-plan.ts
new file mode 100644
index 000000000000..74c3870f9e89
--- /dev/null
+++ b/frontend/types/api-types/meal-plan.ts
@@ -0,0 +1,52 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+/* This file was automatically generated from pydantic models by running pydantic2ts.
+/* Do not modify it by hand - just update the pydantic models and then re-run the script
+*/
+
+export interface ListItem {
+ title?: string;
+ text?: string;
+ quantity?: number;
+ checked?: boolean;
+}
+export interface MealDayIn {
+ date?: string;
+ meals: MealIn[];
+}
+export interface MealIn {
+ slug?: string;
+ name?: string;
+ description?: string;
+}
+export interface MealDayOut {
+ date?: string;
+ meals: MealIn[];
+ id: number;
+}
+export interface MealPlanIn {
+ group: string;
+ startDate: string;
+ endDate: string;
+ planDays: MealDayIn[];
+}
+export interface MealPlanOut {
+ group: string;
+ startDate: string;
+ endDate: string;
+ planDays: MealDayIn[];
+ uid: number;
+ shoppingList?: number;
+}
+export interface ShoppingListIn {
+ name: string;
+ group?: string;
+ items: ListItem[];
+}
+export interface ShoppingListOut {
+ name: string;
+ group?: string;
+ items: ListItem[];
+ id: number;
+}
diff --git a/frontend/types/api-types/recipe.ts b/frontend/types/api-types/recipe.ts
new file mode 100644
index 000000000000..1cf74ba7ef8e
--- /dev/null
+++ b/frontend/types/api-types/recipe.ts
@@ -0,0 +1,141 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+/* This file was automatically generated from pydantic models by running pydantic2ts.
+/* Do not modify it by hand - just update the pydantic models and then re-run the script
+*/
+
+export interface AllRecipeRequest {
+ properties: string[];
+ limit?: number;
+}
+export interface CategoryBase {
+ name: string;
+ id: number;
+ slug: string;
+}
+export interface CategoryIn {
+ name: string;
+}
+export interface CommentIn {
+ text: string;
+}
+export interface CommentOut {
+ text: string;
+ id: number;
+ uuid: string;
+ recipeSlug: string;
+ dateAdded: string;
+ user: UserBase;
+}
+export interface UserBase {
+ id: number;
+ username?: string;
+ admin: boolean;
+}
+export interface CommentSaveToDB {
+ text: string;
+ recipeSlug: string;
+ user: number;
+}
+export interface Nutrition {
+ calories?: string;
+ fatContent?: string;
+ proteinContent?: string;
+ carbohydrateContent?: string;
+ fiberContent?: string;
+ sodiumContent?: string;
+ sugarContent?: string;
+}
+export interface Recipe {
+ id?: number;
+ name?: string;
+ slug?: string;
+ image?: unknown;
+ description?: string;
+ recipeCategory?: string[];
+ tags?: string[];
+ rating?: number;
+ dateAdded?: string;
+ dateUpdated?: string;
+ recipeYield?: string;
+ recipeIngredient?: RecipeIngredient[];
+ recipeInstructions?: RecipeStep[];
+ nutrition?: Nutrition;
+ tools?: string[];
+ totalTime?: string;
+ prepTime?: string;
+ performTime?: string;
+ settings?: RecipeSettings;
+ assets?: RecipeAsset[];
+ notes?: RecipeNote[];
+ orgURL?: string;
+ extras?: {
+ [k: string]: unknown;
+ };
+ comments?: CommentOut[];
+}
+export interface RecipeIngredient {
+ title?: string;
+ note?: string;
+ unit?: RecipeIngredientUnit;
+ food?: RecipeIngredientFood;
+ disableAmount?: boolean;
+ quantity?: number;
+}
+export interface RecipeIngredientUnit {
+ name?: string;
+ description?: string;
+}
+export interface RecipeIngredientFood {
+ name?: string;
+ description?: string;
+}
+export interface RecipeStep {
+ title?: string;
+ text: string;
+}
+export interface RecipeSettings {
+ public?: boolean;
+ showNutrition?: boolean;
+ showAssets?: boolean;
+ landscapeView?: boolean;
+ disableComments?: boolean;
+ disableAmount?: boolean;
+}
+export interface RecipeAsset {
+ name: string;
+ icon: string;
+ fileName?: string;
+}
+export interface RecipeNote {
+ title: string;
+ text: string;
+}
+export interface RecipeSlug {
+ slug: string;
+}
+export interface RecipeSummary {
+ id?: number;
+ name?: string;
+ slug?: string;
+ image?: unknown;
+ description?: string;
+ recipeCategory?: string[];
+ tags?: string[];
+ rating?: number;
+ dateAdded?: string;
+ dateUpdated?: string;
+}
+export interface RecipeURLIn {
+ url: string;
+}
+export interface SlugResponse {}
+export interface TagBase {
+ name: string;
+ id: number;
+ slug: string;
+}
+export interface TagIn {
+ name: string;
+}
diff --git a/frontend/types/api-types/user.ts b/frontend/types/api-types/user.ts
new file mode 100644
index 000000000000..3cc1689e65f3
--- /dev/null
+++ b/frontend/types/api-types/user.ts
@@ -0,0 +1,166 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+/* This file was automatically generated from pydantic models by running pydantic2ts.
+/* Do not modify it by hand - just update the pydantic models and then re-run the script
+*/
+
+export interface CategoryBase {
+ name: string;
+ id: number;
+ slug: string;
+}
+export interface ChangePassword {
+ currentPassword: string;
+ newPassword: string;
+}
+export interface CreateToken {
+ name: string;
+ parentId: number;
+ token: string;
+}
+export interface GroupBase {
+ name: string;
+}
+export interface GroupInDB {
+ name: string;
+ id: number;
+ categories?: CategoryBase[];
+ webhookUrls?: string[];
+ webhookTime?: string;
+ webhookEnable: boolean;
+ users?: UserOut[];
+ mealplans?: MealPlanOut[];
+ shoppingLists?: ShoppingListOut[];
+}
+export interface UserOut {
+ username?: string;
+ fullName?: string;
+ email: string;
+ admin: boolean;
+ group: string;
+ favoriteRecipes?: string[];
+ id: number;
+ tokens?: LongLiveTokenOut[];
+}
+export interface LongLiveTokenOut {
+ name: string;
+ id: number;
+}
+export interface MealPlanOut {
+ group: string;
+ startDate: string;
+ endDate: string;
+ planDays: MealDayIn[];
+ uid: number;
+ shoppingList?: number;
+}
+export interface MealDayIn {
+ date?: string;
+ meals: MealIn[];
+}
+export interface MealIn {
+ slug?: string;
+ name?: string;
+ description?: string;
+}
+export interface ShoppingListOut {
+ name: string;
+ group?: string;
+ items: ListItem[];
+ id: number;
+}
+export interface ListItem {
+ title?: string;
+ text?: string;
+ quantity?: number;
+ checked?: boolean;
+}
+export interface LoingLiveTokenIn {
+ name: string;
+}
+export interface LongLiveTokenInDB {
+ name: string;
+ parentId: number;
+ token: string;
+ id: number;
+ user: UserInDB;
+}
+export interface UserInDB {
+ username?: string;
+ fullName?: string;
+ email: string;
+ admin: boolean;
+ group: string;
+ favoriteRecipes?: string[];
+ id: number;
+ tokens?: LongLiveTokenOut[];
+ password: string;
+}
+export interface RecipeSummary {
+ id?: number;
+ name?: string;
+ slug?: string;
+ image?: unknown;
+ description?: string;
+ recipeCategory?: string[];
+ tags?: string[];
+ rating?: number;
+ dateAdded?: string;
+ dateUpdated?: string;
+}
+export interface SignUpIn {
+ name: string;
+ admin: boolean;
+}
+export interface SignUpOut {
+ name: string;
+ admin: boolean;
+ token: string;
+ id: number;
+}
+export interface SignUpToken {
+ name: string;
+ admin: boolean;
+ token: string;
+}
+export interface Token {
+ access_token: string;
+ token_type: string;
+}
+export interface TokenData {
+ username?: string;
+}
+export interface UpdateGroup {
+ name: string;
+ id: number;
+ categories?: CategoryBase[];
+ webhookUrls?: string[];
+ webhookTime?: string;
+ webhookEnable: boolean;
+}
+export interface UserBase {
+ username?: string;
+ fullName?: string;
+ email: string;
+ admin: boolean;
+ group?: string;
+ favoriteRecipes?: string[];
+}
+export interface UserFavorites {
+ username?: string;
+ fullName?: string;
+ email: string;
+ admin: boolean;
+ group?: string;
+ favoriteRecipes?: RecipeSummary[];
+}
+export interface UserIn {
+ username?: string;
+ fullName?: string;
+ email: string;
+ admin: boolean;
+ group?: string;
+ favoriteRecipes?: string[];
+ password: string;
+}
diff --git a/frontend/types/api.ts b/frontend/types/api.ts
new file mode 100644
index 000000000000..772d1e027f59
--- /dev/null
+++ b/frontend/types/api.ts
@@ -0,0 +1,16 @@
+import { AxiosResponse } from "axios";
+
+interface RequestResponse {
+ response: AxiosResponse | null;
+ data: T | null;
+ error: any;
+ }
+
+export interface ApiRequestInstance {
+ get(url: string, data?: object): Promise>;
+ post(url: string, data: object): Promise>;
+ put(url: string, data: object): Promise>;
+ patch(url: string, data: object): Promise>;
+ delete(url: string, data: object): Promise>;
+}
+
diff --git a/frontend/types/application-types.ts b/frontend/types/application-types.ts
new file mode 100644
index 000000000000..6a1d8ff96bfa
--- /dev/null
+++ b/frontend/types/application-types.ts
@@ -0,0 +1,9 @@
+import { TranslateResult } from "vue-i18n";
+
+export interface SideBarLink {
+ icon: string
+ to: string
+ title: TranslateResult
+}
+
+export type SidebarLinks = Array
\ No newline at end of file
diff --git a/frontend/types/vue.d.ts b/frontend/types/vue.d.ts
new file mode 100644
index 000000000000..291cda5b2acf
--- /dev/null
+++ b/frontend/types/vue.d.ts
@@ -0,0 +1,14 @@
+import Vue from "vue";
+
+declare module "vue/types/vue" {
+
+ interface Vue {
+ $globals: any;
+ }
+}
+
+declare module "vue/types/options" {
+ interface ComponentOptions {
+ $globals?: any;
+ }
+}
diff --git a/frontend.old/src/utils/globals.js b/frontend/utils/globals.js
similarity index 100%
rename from frontend.old/src/utils/globals.js
rename to frontend/utils/globals.js
diff --git a/frontend.old/src/utils/index.js b/frontend/utils/index.js
similarity index 100%
rename from frontend.old/src/utils/index.js
rename to frontend/utils/index.js
diff --git a/frontend.old/src/utils/recipe.js b/frontend/utils/recipe.js
similarity index 100%
rename from frontend.old/src/utils/recipe.js
rename to frontend/utils/recipe.js
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 46324b261a8b..75e9e06ac47e 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -2,6 +2,22 @@
# yarn lockfile v1
+"@adapttive/vue-markdown@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@adapttive/vue-markdown/-/vue-markdown-4.0.1.tgz#4912aa13482cb764bd7ef894f5e1f42e18a911c2"
+ integrity sha512-Qqs9zZ2PGaZQBycQnc1hfz4FyJxsmQNLXAYsGPkPipg+wnRIv7+m9cR6Maa4zJbHmGzZrwAMYFE5BMXEUDfh/g==
+ dependencies:
+ markdown-it "^12.0.3"
+ markdown-it-abbr "^1.0.4"
+ markdown-it-deflist "^2.1.0"
+ markdown-it-emoji "^2.0.0"
+ markdown-it-footnote "^3.0.2"
+ markdown-it-ins "^3.0.0"
+ markdown-it-mark "^3.0.0"
+ markdown-it-sub "^1.0.0"
+ markdown-it-sup "^1.0.0"
+ markdown-it-toc-and-anchor "^4.2.0"
+
"@babel/code-frame@7.12.11":
version "7.12.11"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
@@ -267,7 +283,7 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.8":
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.7", "@babel/parser@^7.14.8", "@babel/parser@^7.9.6":
version "7.14.8"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.8.tgz#66fd41666b2d7b840bd5ace7f7416d5ac60208d4"
integrity sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==
@@ -896,7 +912,7 @@
"@babel/parser" "^7.14.5"
"@babel/types" "^7.14.5"
-"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.14.8":
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.14.7", "@babel/traverse@^7.14.8":
version "7.14.8"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.8.tgz#c0253f02677c5de1a8ff9df6b0aacbec7da1a8ce"
integrity sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==
@@ -953,6 +969,32 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
+"@intlify/shared@^9.0.0":
+ version "9.1.7"
+ resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.1.7.tgz#e7d8bc90cb59dc17dd7b4c85a73db16fcb7891fc"
+ integrity sha512-zt0zlUdalumvT9AjQNxPXA36UgOndUyvBMplh8uRZU0fhWHAwhnJTcf0NaG9Qvr8I1n3HPSs96+kLb/YdwTavQ==
+
+"@intlify/vue-i18n-extensions@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@intlify/vue-i18n-extensions/-/vue-i18n-extensions-1.0.2.tgz#ab7f8507f7d423c368e44fa21d6dece700261fca"
+ integrity sha512-rnfA0ScyBXyp9xsSD4EAMGeOh1yv/AE7fhqdAdSOr5X8N39azz257umfRtzNT9sHXAKSSzpCVhIbMAkp5c/gjQ==
+ dependencies:
+ "@babel/parser" "^7.9.6"
+
+"@intlify/vue-i18n-loader@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@intlify/vue-i18n-loader/-/vue-i18n-loader-1.1.0.tgz#eecc6460823676f533784b3641665c5a609eccf0"
+ integrity sha512-9LXiztMtYKTE8t/hRwwGUp+ofrwU0sxLQLzFEOZ38zvn0DonUIQmZUj1cfz5p1Lu8BllxKbCrn6HnsRJ+LYA6g==
+ dependencies:
+ "@intlify/shared" "^9.0.0"
+ js-yaml "^3.13.1"
+ json5 "^2.1.1"
+
+"@mdi/js@^5.9.55":
+ version "5.9.55"
+ resolved "https://registry.yarnpkg.com/@mdi/js/-/js-5.9.55.tgz#8f5bc4d924c23f30dab20545ddc768e778bbc882"
+ integrity sha512-BbeHMgeK2/vjdJIRnx12wvQ6s8xAYfvMmEAVsUx9b+7GiQGQ9Za8jpwp17dMKr9CgKRvemlAM4S7S3QOtEbp4A==
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -1334,7 +1376,22 @@
webpack-node-externals "^3.0.0"
webpackbar "^4.0.0"
-"@nuxtjs/axios@^5.13.6":
+"@nuxtjs/auth-next@5.0.0-1624817847.21691f1":
+ version "5.0.0-1624817847.21691f1"
+ resolved "https://registry.yarnpkg.com/@nuxtjs/auth-next/-/auth-next-5.0.0-1624817847.21691f1.tgz#28b92625ac5817d8083f8b42dd184a88caefbe96"
+ integrity sha512-PsHhLtzglMnwM2o16mgM7zQ3KwTI7AIg2ja3IFYujbs9s1w8HvnRD3byMRj1WZo0vXEBRh3u3nHxKEBIbFe1Xg==
+ dependencies:
+ "@nuxtjs/axios" "^5.13.0"
+ axios "^0.21.1"
+ body-parser "^1.19.0"
+ consola "^2.15.3"
+ cookie "^0.4.1"
+ defu "^3.2.2"
+ hasha "^5.2.2"
+ jwt-decode "^3.1.2"
+ requrl "^3.0.2"
+
+"@nuxtjs/axios@^5.13.0", "@nuxtjs/axios@^5.13.6":
version "5.13.6"
resolved "https://registry.yarnpkg.com/@nuxtjs/axios/-/axios-5.13.6.tgz#6f4bbd98a3a7799a5d2c0726c6ad2a98aa111881"
integrity sha512-XS+pOE0xsDODs1zAIbo95A0LKlilvJi8YW0NoXYuq3/jjxGgWDxizZ6Yx0AIIjZOoGsXJOPc0/BcnSEUQ2mFBA==
@@ -2296,6 +2353,11 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -2517,6 +2579,22 @@ bn.js@^5.0.0, bn.js@^5.1.1:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
+body-parser@^1.19.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ bytes "3.1.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ on-finished "~2.3.0"
+ qs "6.7.0"
+ raw-body "2.4.0"
+ type-is "~1.6.17"
+
boolbase@^1.0.0, boolbase@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
@@ -2686,6 +2764,11 @@ bytes@3.0.0:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
cacache@^12.0.2:
version "12.0.4"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
@@ -2998,6 +3081,11 @@ clone-deep@^4.0.1:
kind-of "^6.0.2"
shallow-clone "^3.0.0"
+clone@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
coa@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
@@ -3152,6 +3240,11 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
convert-source-map@^1.7.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
@@ -3164,6 +3257,11 @@ cookie@^0.3.1:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
+cookie@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
copy-concurrently@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@@ -3844,6 +3942,11 @@ entities@^2.0.0:
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+entities@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
+ integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
+
errno@^0.1.3, errno@~0.1.7:
version "0.1.8"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
@@ -4000,6 +4103,13 @@ eslint-plugin-nuxt@^2.0.0:
semver "^7.3.2"
vue-eslint-parser "^7.1.1"
+eslint-plugin-prettier@^3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7"
+ integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==
+ dependencies:
+ prettier-linter-helpers "^1.0.0"
+
eslint-plugin-promise@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz#fb2188fb734e4557993733b41aa1a688f46c6f24"
@@ -4334,6 +4444,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+fast-diff@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
+ integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+
fast-glob@^3.1.1:
version "3.2.7"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
@@ -4968,6 +5083,17 @@ htmlparser2@^6.1.0:
domutils "^2.5.2"
entities "^2.0.0"
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
http-errors@~1.7.2:
version "1.7.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
@@ -5019,7 +5145,7 @@ husky@^6.0.0:
resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e"
integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==
-iconv-lite@^0.4.24:
+iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -5341,6 +5467,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
dependencies:
is-extglob "^2.1.1"
+is-https@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-https/-/is-https-4.0.0.tgz#9ee725a334fb517b988278d2674efc96e4f348ed"
+ integrity sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==
+
is-negative-zero@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
@@ -5493,6 +5624,11 @@ jiti@^1.9.2:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.11.0.tgz#64120a30d97b9bf37b8b032cf4564dfadc28984c"
integrity sha512-/2c7e61hxxTIN34UeHBB0LCJ5Tq64kgJDV7GR+++e8XRxCKRIKmB8tH6ww1W+Z6Kgd6By+C3RSCu1lXjbPT68A==
+js-cookie@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
+ integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -5548,7 +5684,7 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
-json5@^2.1.2, json5@^2.2.0:
+json5@^2.1.1, json5@^2.1.2, json5@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
@@ -5571,6 +5707,11 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
+jwt-decode@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59"
+ integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==
+
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -5636,6 +5777,13 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+linkify-it@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8"
+ integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==
+ dependencies:
+ uc.micro "^1.0.1"
+
lint-staged@^10.5.4:
version "10.5.4"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665"
@@ -5891,6 +6039,65 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
+markdown-it-abbr@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz#d66b5364521cbb3dd8aa59dadfba2fb6865c8fd8"
+ integrity sha1-1mtTZFIcuz3Yqlna37ovtoZcj9g=
+
+markdown-it-deflist@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz#50d7a56b9544cd81252f7623bd785e28a8dcef5c"
+ integrity sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==
+
+markdown-it-emoji@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz#3164ad4c009efd946e98274f7562ad611089a231"
+ integrity sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==
+
+markdown-it-footnote@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz#e0e4c0d67390a4c5f0c75f73be605c7c190ca4d8"
+ integrity sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==
+
+markdown-it-ins@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz#c09356b917cf1dbf73add0b275d67ab8c73d4b4d"
+ integrity sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==
+
+markdown-it-mark@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz#51257db58787d78aaf46dc13418d99a9f3f0ebd3"
+ integrity sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==
+
+markdown-it-sub@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz#375fd6026eae7ddcb012497f6411195ea1e3afe8"
+ integrity sha1-N1/WAm6ufdywEkl/ZBEZXqHjr+g=
+
+markdown-it-sup@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz#cb9c9ff91a5255ac08f3fd3d63286e15df0a1fc3"
+ integrity sha1-y5yf+RpSVawI8/09YyhuFd8KH8M=
+
+markdown-it-toc-and-anchor@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz#d1613327cc63c61f82cd66cbac5564f4db12c0e9"
+ integrity sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==
+ dependencies:
+ clone "^2.1.0"
+ uslug "^1.0.4"
+
+markdown-it@^12.0.3:
+ version "12.1.0"
+ resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.1.0.tgz#7ad572caddd336bd27a68d20e86bac1fafe8fb20"
+ integrity sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==
+ dependencies:
+ argparse "^2.0.1"
+ entities "~2.1.0"
+ linkify-it "^3.0.1"
+ mdurl "^1.0.1"
+ uc.micro "^1.0.5"
+
md5.js@^1.3.4:
version "1.3.5"
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
@@ -5910,6 +6117,16 @@ mdn-data@2.0.4:
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+mdurl@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
+ integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
mem@^8.1.1:
version "8.1.1"
resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122"
@@ -6359,6 +6576,24 @@ num2fraction@^1.2.2:
resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+nuxt-i18n@^6.28.0:
+ version "6.28.0"
+ resolved "https://registry.yarnpkg.com/nuxt-i18n/-/nuxt-i18n-6.28.0.tgz#05924b8cf4b12633041a547b39e43db2f1f852a8"
+ integrity sha512-8XT9UflwAlEDROMTZOwQKFrnM2+eqbHC8UJNlLCjODOCrmhMHGSfojxbFxs4W4+hKdDw4Gz30PHK6v6GIqIzMQ==
+ dependencies:
+ "@babel/parser" "^7.14.7"
+ "@babel/traverse" "^7.14.7"
+ "@intlify/vue-i18n-extensions" "^1.0.2"
+ "@intlify/vue-i18n-loader" "^1.1.0"
+ cookie "^0.4.1"
+ devalue "^2.0.1"
+ is-https "^4.0.0"
+ js-cookie "^2.2.1"
+ klona "^2.0.4"
+ lodash.merge "^4.6.2"
+ ufo "^0.7.7"
+ vue-i18n "^8.25.0"
+
nuxt@^2.15.7:
version "2.15.7"
resolved "https://registry.yarnpkg.com/nuxt/-/nuxt-2.15.7.tgz#45332e3b00ba5c1cf04688d42373c8ed7ef4dca7"
@@ -7472,6 +7707,13 @@ prepend-http@^1.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
+prettier-linter-helpers@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
+ integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+ dependencies:
+ fast-diff "^1.1.2"
+
prettier@^1.18.2:
version "1.19.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
@@ -7601,6 +7843,11 @@ q@^1.1.2:
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
qs@^6.9.4:
version "6.10.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
@@ -7666,6 +7913,16 @@ range-parser@^1.2.1, range-parser@~1.2.1:
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
rc9@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/rc9/-/rc9-1.2.0.tgz#ef098181fdde714efc4c426383d6e46c14b1254a"
@@ -7863,6 +8120,11 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+requrl@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/requrl/-/requrl-3.0.2.tgz#d376104193b02a2d874dde68454c2db2dfeb0fac"
+ integrity sha512-f3gjR6d8MhOpn46PP+DSJywbmxi95fxQm3coXBFwognjFLla9X6tr8BdNyaIKNOEkaRbRcm0/zYAqN19N1oyhg==
+
reserved-words@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
@@ -8314,6 +8576,11 @@ sort-keys@^2.0.0:
dependencies:
is-plain-obj "^1.0.0"
+sortablejs@1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290"
+ integrity sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==
+
source-list-map@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
@@ -8939,6 +9206,14 @@ type-fest@^0.8.0, type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+type-is@~1.6.17:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -8954,6 +9229,11 @@ ua-parser-js@^0.7.28:
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31"
integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==
+uc.micro@^1.0.1, uc.micro@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
+ integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+
ufo@^0.7.4, ufo@^0.7.7:
version "0.7.7"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-0.7.7.tgz#0062f9e5e790819b0fb23ca24d7c63a4011c036a"
@@ -9046,7 +9326,12 @@ universalify@^2.0.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-unpipe@~1.0.0:
+"unorm@>= 1.0.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af"
+ integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==
+
+unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
@@ -9113,6 +9398,13 @@ use@^3.1.0:
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+uslug@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/uslug/-/uslug-1.0.4.tgz#b9a22f0914e0a86140633dacc302e5f4fa450677"
+ integrity sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=
+ dependencies:
+ unorm ">= 1.0.0"
+
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -9216,6 +9508,11 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
+vue-i18n@^8.25.0:
+ version "8.25.0"
+ resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.25.0.tgz#1037d9295fa2845a230b771de473481edb2cfc4c"
+ integrity sha512-ynhcL+PmTxuuSE1T10htiSXzjBozxYIE3ffbM1RfgAkVbr/v1SP+9Mi/7/uv8ZVV1yGuKjFAYp9BXq+X7op6MQ==
+
vue-loader@^15.9.7:
version "15.9.7"
resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.7.tgz#15b05775c3e0c38407679393c2ce6df673b01044"
@@ -9284,6 +9581,13 @@ vue@^2.6.12:
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235"
integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==
+vuedraggable@^2.24.3:
+ version "2.24.3"
+ resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.24.3.tgz#43c93849b746a24ce503e123d5b259c701ba0d19"
+ integrity sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==
+ dependencies:
+ sortablejs "1.10.2"
+
vuetify-loader@^1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/vuetify-loader/-/vuetify-loader-1.7.2.tgz#5cdc45309496cf3a5fe431fd7611706ffa4aa8c8"
diff --git a/poetry.lock b/poetry.lock
index 2a8a7e3b771f..3d0670dcf72d 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -173,7 +173,7 @@ pycparser = "*"
[[package]]
name = "charset-normalizer"
-version = "2.0.3"
+version = "2.0.4"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
category = "main"
optional = false
@@ -413,7 +413,7 @@ python-versions = ">=3.5"
[[package]]
name = "importlib-metadata"
-version = "4.6.1"
+version = "4.6.3"
description = "Read metadata from Python packages"
category = "dev"
optional = false
@@ -448,7 +448,7 @@ six = "*"
[[package]]
name = "isort"
-version = "5.9.2"
+version = "5.9.3"
description = "A Python utility / library to sort Python imports."
category = "dev"
optional = false
@@ -577,7 +577,7 @@ i18n = ["babel (>=2.9.0)"]
[[package]]
name = "mkdocs-material"
-version = "7.2.0"
+version = "7.2.2"
description = "A Material Design theme for MkDocs"
category = "dev"
optional = false
@@ -740,6 +740,18 @@ typing-extensions = ">=3.7.4.3"
dotenv = ["python-dotenv (>=0.10.4)"]
email = ["email-validator (>=1.0.3)"]
+[[package]]
+name = "pydantic-to-typescript"
+version = "1.0.7"
+description = "Convert pydantic models to typescript interfaces"
+category = "dev"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+click = "*"
+pydantic = "*"
+
[[package]]
name = "pyflakes"
version = "2.3.1"
@@ -766,7 +778,7 @@ python-versions = "*"
[[package]]
name = "pylint"
-version = "2.9.5"
+version = "2.9.6"
description = "python code static checker"
category = "dev"
optional = false
@@ -1282,7 +1294,7 @@ pgsql = ["psycopg2-binary"]
[metadata]
lock-version = "1.1"
python-versions = "^3.9"
-content-hash = "a06d6cf8970f370f05958cc8190a97c731dd586405d51ed11b828de842fbe1d2"
+content-hash = "c5beb9d4a67cd02434b365bb0d6bec1a1d0688a2b2ff20acb991e103ee8ee8bf"
[metadata.files]
aiofiles = [
@@ -1386,8 +1398,8 @@ cffi = [
{file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"},
]
charset-normalizer = [
- {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"},
- {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"},
+ {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"},
+ {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"},
]
click = [
{file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
@@ -1580,8 +1592,8 @@ idna = [
{file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"},
]
importlib-metadata = [
- {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"},
- {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"},
+ {file = "importlib_metadata-4.6.3-py3-none-any.whl", hash = "sha256:51c6635429c77cf1ae634c997ff9e53ca3438b495f10a55ba28594dd69764a8b"},
+ {file = "importlib_metadata-4.6.3.tar.gz", hash = "sha256:0645585859e9a6689c523927a5032f2ba5919f1f7d0e84bd4533312320de1ff9"},
]
iniconfig = [
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
@@ -1592,8 +1604,8 @@ isodate = [
{file = "isodate-0.6.0.tar.gz", hash = "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"},
]
isort = [
- {file = "isort-5.9.2-py3-none-any.whl", hash = "sha256:eed17b53c3e7912425579853d078a0832820f023191561fcee9d7cae424e0813"},
- {file = "isort-5.9.2.tar.gz", hash = "sha256:f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e"},
+ {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"},
+ {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"},
]
jinja2 = [
{file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"},
@@ -1721,8 +1733,8 @@ mkdocs = [
{file = "mkdocs-1.2.2.tar.gz", hash = "sha256:a334f5bd98ec960638511366eb8c5abc9c99b9083a0ed2401d8791b112d6b078"},
]
mkdocs-material = [
- {file = "mkdocs-material-7.2.0.tar.gz", hash = "sha256:9f43c5874e119b312a6f369ef363815c11f182b5cdeff4a3426615ebc4664ace"},
- {file = "mkdocs_material-7.2.0-py2.py3-none-any.whl", hash = "sha256:8b3750857e168a9ca20be34890791817090b016248a39be45069fab5343f1dc0"},
+ {file = "mkdocs-material-7.2.2.tar.gz", hash = "sha256:4f501e139e2f8546653e7d8777c9b97ca639d03d8c86345a60609864cc5bbb03"},
+ {file = "mkdocs_material-7.2.2-py2.py3-none-any.whl", hash = "sha256:76de22213f0e0319b9bddf1bfa86530e93efb4a604e9ddf8f8419f0438572523"},
]
mkdocs-material-extensions = [
{file = "mkdocs-material-extensions-1.0.1.tar.gz", hash = "sha256:6947fb7f5e4291e3c61405bad3539d81e0b3cd62ae0d66ced018128af509c68f"},
@@ -1879,6 +1891,11 @@ pydantic = [
{file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"},
{file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"},
]
+pydantic-to-typescript = [
+ {file = "pydantic-to-typescript-1.0.7.tar.gz", hash = "sha256:dccf668e97626e616d20f2b1b99a568b5ac16344f3b2c850ebc463118b21a3d7"},
+ {file = "pydantic_to_typescript-1.0.7-py3-none-any.whl", hash = "sha256:b3d093cbd15fd938faa09d1128621f27a9a93bef275eea5eb0912987d5d9d843"},
+ {file = "pydantic_to_typescript-1.0.7-py3.8.egg", hash = "sha256:b4917453d74df1b401259b881117ae164bf1bac2cac849a88466badb43825e6d"},
+]
pyflakes = [
{file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"},
{file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"},
@@ -1892,8 +1909,8 @@ pyhumps = [
{file = "pyhumps-3.0.2.tar.gz", hash = "sha256:042b4b6eec6c1f862f8310c0eebbae19293e9edab8cafb030ff78c890ef1aa34"},
]
pylint = [
- {file = "pylint-2.9.5-py3-none-any.whl", hash = "sha256:748f81e5776d6273a6619506e08f1b48ff9bcb8198366a56821cf11aac14fc87"},
- {file = "pylint-2.9.5.tar.gz", hash = "sha256:1f333dc72ef7f5ea166b3230936ebcfb1f3b722e76c980cb9fe6b9f95e8d3172"},
+ {file = "pylint-2.9.6-py3-none-any.whl", hash = "sha256:2e1a0eb2e8ab41d6b5dbada87f066492bb1557b12b76c47c2ee8aa8a11186594"},
+ {file = "pylint-2.9.6.tar.gz", hash = "sha256:8b838c8983ee1904b2de66cce9d0b96649a91901350e956d78f289c3bc87b48e"},
]
pymdown-extensions = [
{file = "pymdown-extensions-8.2.tar.gz", hash = "sha256:b6daa94aad9e1310f9c64c8b1f01e4ce82937ab7eb53bfc92876a97aca02a6f4"},
diff --git a/pyproject.toml b/pyproject.toml
index 498735093a84..f672f7548e6b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -45,6 +45,7 @@ pytest-cov = "^2.11.0"
mkdocs-material = "^7.0.2"
flake8 = "^3.9.0"
coverage = "^5.5"
+pydantic-to-typescript = "^1.0.7"
[build-system]
requires = ["poetry-core>=1.0.0"]
diff --git a/vetur.config.js b/vetur.config.js
index a02a5672618b..e59ab1d60346 100644
--- a/vetur.config.js
+++ b/vetur.config.js
@@ -10,6 +10,7 @@ module.exports = {
{
root: "./frontend",
package: "package.json",
+ tsconfig: "tsconfig.json",
globalComponents: ["./src/components/**/*.vue"],
},
],