diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index 0bd03f4ac..38116c68d 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -35,6 +35,7 @@ module.exports = { "vue/singleline-html-element-content-newline": "off", "vue/multiline-html-element-content-newline": "off", "vue/no-mutating-props": "off", + "vue/no-v-text-v-html-on-component": "warn", "vue/no-v-for-template-key-on-child": "off", "vue/valid-v-slot": [ "error", diff --git a/frontend/components/Domain/Admin/AdminEventViewer.vue b/frontend/components/Domain/Admin/AdminEventViewer.vue index 4d60d0a78..5e1969d58 100644 --- a/frontend/components/Domain/Admin/AdminEventViewer.vue +++ b/frontend/components/Domain/Admin/AdminEventViewer.vue @@ -28,9 +28,13 @@ - + + {{ item.title }} + - + + {{ item.text }} + {{ $d(Date.parse(item.timeStamp), "long") }} @@ -103,5 +107,4 @@ export default defineComponent({ }); - \ No newline at end of file + diff --git a/frontend/components/Domain/Recipe/RecipeAssets.vue b/frontend/components/Domain/Recipe/RecipeAssets.vue index 7118d47b6..5dd7ff405 100644 --- a/frontend/components/Domain/Recipe/RecipeAssets.vue +++ b/frontend/components/Domain/Recipe/RecipeAssets.vue @@ -10,23 +10,27 @@ {{ getIconDefinition(item.icon).title }} - + + {{ item.name }} + - + {{ $globals.icons.download }}
{{ $globals.icons.delete }} - +
@@ -36,7 +40,7 @@ @@ -77,6 +81,7 @@ import { defineComponent, reactive, toRefs, useContext } from "@nuxtjs/composition-api"; import { useStaticRoutes, useUserApi } from "~/composables/api"; import { alert } from "~/composables/use-toast"; +import { RecipeAsset } from "~/types/api-types/recipe"; const BASE_URL = window.location.origin; @@ -91,7 +96,7 @@ export default defineComponent({ required: true, }, value: { - type: Array, + type: Array as () => RecipeAsset[], required: true, }, edit: { diff --git a/frontend/components/Domain/Recipe/RecipeCategoryTagToolContextMenu.vue b/frontend/components/Domain/Recipe/RecipeCategoryTagToolContextMenu.vue index 8d8dd40a5..6016e3fd5 100644 --- a/frontend/components/Domain/Recipe/RecipeCategoryTagToolContextMenu.vue +++ b/frontend/components/Domain/Recipe/RecipeCategoryTagToolContextMenu.vue @@ -29,7 +29,9 @@ - + + {{ item.icon }} + {{ item.title }} diff --git a/frontend/components/Domain/Recipe/RecipeContextMenu.vue b/frontend/components/Domain/Recipe/RecipeContextMenu.vue index ce29749a2..e3f10f221 100644 --- a/frontend/components/Domain/Recipe/RecipeContextMenu.vue +++ b/frontend/components/Domain/Recipe/RecipeContextMenu.vue @@ -81,7 +81,7 @@ - + {{ item.icon }} {{ item.title }} @@ -307,7 +307,7 @@ export default defineComponent({ } // Note: Print is handled as an event in the parent component - const eventHandlers: { [key: string]: () => void } = { + const eventHandlers: { [key: string]: () => void | Promise } = { delete: () => { state.recipeDeleteDialog = true; }, diff --git a/frontend/components/Domain/Recipe/RecipeDataTable.vue b/frontend/components/Domain/Recipe/RecipeDataTable.vue index 4bcd13499..93d76ed78 100644 --- a/frontend/components/Domain/Recipe/RecipeDataTable.vue +++ b/frontend/components/Domain/Recipe/RecipeDataTable.vue @@ -32,7 +32,9 @@ John - + + {{ getMember(item.userId) }} + @@ -95,31 +97,30 @@ export default defineComponent({ context.emit(INPUT_EVENT, value); } - const show = props.showHeaders; const headers = computed(() => { const hdrs = []; - if (show.id) { + if (props.showHeaders.id) { hdrs.push({ text: "Id", value: "id" }); } - if (show.owner) { + if (props.showHeaders.owner) { hdrs.push({ text: "Owner", value: "userId", align: "center" }); } hdrs.push({ text: "Name", value: "name" }); - if (show.categories) { + if (props.showHeaders.categories) { hdrs.push({ text: "Categories", value: "recipeCategory" }); } - if (show.tags) { + if (props.showHeaders.tags) { hdrs.push({ text: "Tags", value: "tags" }); } - if (show.tools) { + if (props.showHeaders.tools) { hdrs.push({ text: "Tools", value: "tools" }); } - if (show.recipeYield) { + if (props.showHeaders.recipeYield) { hdrs.push({ text: "Yield", value: "recipeYield" }); } - if (show.dateAdded) { + if (props.showHeaders.dateAdded) { hdrs.push({ text: "Date Added", value: "dateAdded" }); } diff --git a/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue b/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue index 2579cbe97..e052d0a3a 100644 --- a/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue +++ b/frontend/components/Domain/Recipe/RecipeIngredientEditor.vue @@ -134,8 +134,6 @@ export default defineComponent({ }, }, setup(props) { - const { value } = props; - // ================================================== // Foods const { foods, workingFoodData, actions: foodActions } = useFoods(); @@ -144,7 +142,7 @@ export default defineComponent({ async function createAssignFood() { workingFoodData.name = foodSearch.value; await foodActions.createOne(); - value.food = foods.value?.find((food) => food.name === foodSearch.value); + props.value.food = foods.value?.find((food) => food.name === foodSearch.value); } // ================================================== @@ -155,7 +153,7 @@ export default defineComponent({ async function createAssignUnit() { workingUnitData.name = unitSearch.value; await unitActions.createOne(); - value.unit = units.value?.find((unit) => unit.name === unitSearch.value); + props.value.unit = units.value?.find((unit) => unit.name === unitSearch.value); } const state = reactive({ @@ -165,7 +163,7 @@ export default defineComponent({ function toggleTitle() { if (state.showTitle) { - value.title = ""; + props.value.title = ""; } state.showTitle = !state.showTitle; } @@ -175,13 +173,21 @@ export default defineComponent({ } function handleUnitEnter() { - if (value.unit === undefined || value.unit === null || !value.unit.name.includes(unitSearch.value)) { + if ( + props.value.unit === undefined || + props.value.unit === null || + !props.value.unit.name.includes(unitSearch.value) + ) { createAssignUnit(); } } function handleFoodEnter() { - if (value.food === undefined || value.food === null || !value.food.name.includes(foodSearch.value)) { + if ( + props.value.food === undefined || + props.value.food === null || + !props.value.food.name.includes(foodSearch.value) + ) { createAssignFood(); } } @@ -202,7 +208,7 @@ export default defineComponent({ // }); // } - if (value.originalText) { + if (props.value.originalText) { options.push({ text: "See Original Text", event: "toggle-original", diff --git a/frontend/components/Domain/Recipe/RecipeInstructions.vue b/frontend/components/Domain/Recipe/RecipeInstructions.vue index 9292fc8c7..d66c6874c 100644 --- a/frontend/components/Domain/Recipe/RecipeInstructions.vue +++ b/frontend/components/Domain/Recipe/RecipeInstructions.vue @@ -92,7 +92,7 @@ @click="toggleCollapseSection(index)" > - + {{ step.title }} rulesByKey(props.globalRules)); + const defaultRules = computed(() => rulesByKey(props.globalRules as ValidatorKey[])); function removeByIndex(list: never[], index: number) { // Removes the item at the index diff --git a/frontend/components/global/BaseStatCard.vue b/frontend/components/global/BaseStatCard.vue index 1e2fdf181..7e3877e05 100644 --- a/frontend/components/global/BaseStatCard.vue +++ b/frontend/components/global/BaseStatCard.vue @@ -10,7 +10,7 @@ class="text-start v-card--material__heading mb-n6 mt-n10 pa-7" dark > - + {{ icon }}
diff --git a/frontend/components/global/LanguageDialog.vue b/frontend/components/global/LanguageDialog.vue index 79d6bc626..e0007b26f 100644 --- a/frontend/components/global/LanguageDialog.vue +++ b/frontend/components/global/LanguageDialog.vue @@ -2,18 +2,10 @@ {{ $t("language-dialog.select-description") }} - + diff --git a/frontend/composables/api/api-client.ts b/frontend/composables/api/api-client.ts index 16f185d69..d446f5ca2 100644 --- a/frontend/composables/api/api-client.ts +++ b/frontend/composables/api/api-client.ts @@ -1,6 +1,6 @@ import { AxiosResponse } from "axios"; import { useContext } from "@nuxtjs/composition-api"; -import { NuxtAxiosInstance } from "@nuxtjs/axios"; +import type { NuxtAxiosInstance } from "@nuxtjs/axios"; import { AdminAPI, Api } from "~/api"; import { ApiRequestInstance, RequestResponse } from "~/types/api"; import { PublicApi } from "~/api/public-api"; diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue index 9ce817f84..6141d5047 100644 --- a/frontend/layouts/default.vue +++ b/frontend/layouts/default.vue @@ -25,11 +25,17 @@ - + + {{ item.icon }} + - - + + {{ item.title }} + + + {{ item.subtitle }} + diff --git a/frontend/package.json b/frontend/package.json index 2ef7bfb21..193a25734 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -22,7 +22,7 @@ "@nuxtjs/proxy": "^2.1.0", "@nuxtjs/pwa": "^3.3.5", "@vue/composition-api": "^1.0.5", - "@vueuse/core": "^6.8.0", + "@vueuse/core": "^8.5.0", "core-js": "^3.15.1", "date-fns": "^2.23.0", "fuse.js": "^6.5.3", @@ -36,21 +36,22 @@ "@babel/eslint-parser": "^7.14.7", "@nuxt/types": "^2.15.7", "@nuxt/typescript-build": "^2.1.0", - "@nuxtjs/composition-api": "^0.31.0", - "@nuxtjs/eslint-config-typescript": "^6.0.1", + "@nuxtjs/composition-api": "^0.32.0", + "@nuxtjs/eslint-config-typescript": "^10.0.0", "@nuxtjs/eslint-module": "^3.0.2", "@nuxtjs/google-fonts": "^1.3.0", "@nuxtjs/vuetify": "^1.12.1", "@types/sortablejs": "^1.10.7", "@vue/runtime-dom": "^3.2.36", - "eslint": "^7.29.0", + "eslint": "^8.16.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-nuxt": "^3.2.0", - "eslint-plugin-prettier": "^3.4.0", - "eslint-plugin-vue": "^7.12.1", - "lint-staged": "^10.5.4", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^9.0.1", + "lint-staged": "^12.4.2", "nuxt-vite": "0.2.3", "prettier": "^2.3.2", + "typescript": "^4.7.2", "vue2-script-setup-transform": "^0.3.5" } } diff --git a/frontend/pages/group/data/foods.vue b/frontend/pages/group/data/foods.vue index fe6caed39..ab0e27043 100644 --- a/frontend/pages/group/data/foods.vue +++ b/frontend/pages/group/data/foods.vue @@ -40,7 +40,7 @@ >