From 741220aefe80dab04e4c6382b59fbad5da2af0e2 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 14 Feb 2025 16:43:12 +0100 Subject: [PATCH] model editors default prop --- .../model_editors/AccessTokenEditor.vue | 4 +- .../model_editors/AutomationEditor.vue | 5 +- .../model_editors/CustomFilterEditor.vue | 3 +- .../components/model_editors/FoodEditor.vue | 10 ++-- .../model_editors/InviteLinkEditor.vue | 4 +- .../model_editors/KeywordEditor.vue | 7 +-- .../model_editors/MealTypeEditor.vue | 3 +- .../model_editors/PropertyEditor.vue | 3 +- .../model_editors/PropertyTypeEditor.vue | 3 +- .../model_editors/RecipeBookEditor.vue | 46 ++++++++++++++----- .../components/model_editors/RecipeEditor.vue | 5 +- .../model_editors/ShoppingListEntryEditor.vue | 4 +- .../SupermarketCategoryEditor.vue | 5 +- .../model_editors/SupermarketEditor.vue | 4 +- .../model_editors/UnitConversionEditor.vue | 3 +- .../components/model_editors/UnitEditor.vue | 3 +- .../model_editors/UserFileEditor.vue | 5 +- .../model_editors/UserSpaceEditor.vue | 3 +- 18 files changed, 78 insertions(+), 42 deletions(-) diff --git a/vue3/src/components/model_editors/AccessTokenEditor.vue b/vue3/src/components/model_editors/AccessTokenEditor.vue index 68606b15a..d15bbc520 100644 --- a/vue3/src/components/model_editors/AccessTokenEditor.vue +++ b/vue3/src/components/model_editors/AccessTokenEditor.vue @@ -42,6 +42,7 @@ import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as AccessToken}, dialog: {type: Boolean, default: false} }) @@ -54,7 +55,8 @@ onMounted(() => { newItemFunction: () => { editingObj.value.expires = DateTime.now().plus({year: 1}).toJSDate() editingObj.value.scope = 'read write' - } + }, + itemDefaults: props.itemDefaults }) }) diff --git a/vue3/src/components/model_editors/AutomationEditor.vue b/vue3/src/components/model_editors/AutomationEditor.vue index a961be3a9..507df629d 100644 --- a/vue3/src/components/model_editors/AutomationEditor.vue +++ b/vue3/src/components/model_editors/AutomationEditor.vue @@ -37,13 +37,13 @@ import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions"; import {useI18n} from "vue-i18n"; import {VNumberInput} from "vuetify/labs/VNumberInput"; -import {DateTime} from "luxon"; const {t} = useI18n() const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as Automation}, dialog: {type: Boolean, default: false} }) @@ -69,7 +69,8 @@ onMounted(() => { setupState(props.item, props.itemId, { newItemFunction: () => { editingObj.value.order = 0 - } + }, + itemDefaults: props.itemDefaults }) }) diff --git a/vue3/src/components/model_editors/CustomFilterEditor.vue b/vue3/src/components/model_editors/CustomFilterEditor.vue index a408b7426..95a00b92b 100644 --- a/vue3/src/components/model_editors/CustomFilterEditor.vue +++ b/vue3/src/components/model_editors/CustomFilterEditor.vue @@ -28,6 +28,7 @@ import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as CustomFilter}, dialog: {type: Boolean, default: false} }) @@ -36,7 +37,7 @@ const {setupState, deleteObject, saveObject, isUpdate, editingObjName, loading, onMounted(() => { - setupState(props.item, props.itemId, {}) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/FoodEditor.vue b/vue3/src/components/model_editors/FoodEditor.vue index 7fa8f72f8..06d20cc35 100644 --- a/vue3/src/components/model_editors/FoodEditor.vue +++ b/vue3/src/components/model_editors/FoodEditor.vue @@ -116,8 +116,7 @@ diff --git a/vue3/src/components/model_editors/MealTypeEditor.vue b/vue3/src/components/model_editors/MealTypeEditor.vue index 67718dd0d..4fea2fb52 100644 --- a/vue3/src/components/model_editors/MealTypeEditor.vue +++ b/vue3/src/components/model_editors/MealTypeEditor.vue @@ -52,6 +52,7 @@ import {DateTime} from "luxon"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as MealType}, dialog: {type: Boolean, default: false} }) @@ -63,7 +64,7 @@ const timePickerMenu = ref(false) onMounted(() => { - setupState(props.item, props.itemId) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/PropertyEditor.vue b/vue3/src/components/model_editors/PropertyEditor.vue index 665b7c5ea..15c015575 100644 --- a/vue3/src/components/model_editors/PropertyEditor.vue +++ b/vue3/src/components/model_editors/PropertyEditor.vue @@ -38,6 +38,7 @@ import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as Property}, dialog: {type: Boolean, default: false} }) @@ -46,7 +47,7 @@ const {setupState, deleteObject, saveObject, isUpdate, editingObjName, loading, onMounted(() => { - setupState(props.item, props.itemId) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/PropertyTypeEditor.vue b/vue3/src/components/model_editors/PropertyTypeEditor.vue index eb2f61d21..b3e9cbcc0 100644 --- a/vue3/src/components/model_editors/PropertyTypeEditor.vue +++ b/vue3/src/components/model_editors/PropertyTypeEditor.vue @@ -36,6 +36,7 @@ import {VNumberInput} from "vuetify/labs/VNumberInput"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as PropertyType}, dialog: {type: Boolean, default: false} }) @@ -45,7 +46,7 @@ const {setupState, deleteObject, saveObject, isUpdate, editingObjName, loading, // object specific data (for selects/display) onMounted(() => { - setupState(props.item, props.itemId) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/RecipeBookEditor.vue b/vue3/src/components/model_editors/RecipeBookEditor.vue index fa975a3a2..c6bdc0a2b 100644 --- a/vue3/src/components/model_editors/RecipeBookEditor.vue +++ b/vue3/src/components/model_editors/RecipeBookEditor.vue @@ -32,7 +32,7 @@ @@ -43,12 +43,13 @@ :headers="tableHeaders" :items-length="itemCount" > + - - @@ -63,13 +64,14 @@ import {VDataTableUpdateOptions} from "@/vuetify"; import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions"; import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; import ModelSelect from "@/components/inputs/ModelSelect.vue"; -import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore"; +import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/MessageStore"; import {useUserPreferenceStore} from "@/stores/UserPreferenceStore"; import {useI18n} from "vue-i18n"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as RecipeBook}, dialog: {type: Boolean, default: false} }) @@ -86,7 +88,7 @@ const tablePage = ref(1) const itemCount = ref(0) const tableHeaders = [ - {title: t('Name'), key: 'recipeContent.name', }, + {title: t('Name'), key: 'recipeContent.name',}, {key: 'action', width: '1%', noBreak: true, align: 'end'}, ] @@ -98,19 +100,39 @@ onMounted(() => { }, existingItemFunction: () => { recipeBookEntries.value = [] - } + }, + itemDefaults: props.itemDefaults }) }) +/** + * add selected recipe into the book and client list + */ function addRecipeToBook() { let api = new ApiApi() - // TODO check both for null, handle errors - api.apiRecipeBookEntryCreate({recipeBookEntry: {book: editingObj.value.id!, recipe: selectedRecipe.value.id!}}).then(r => { - recipeBookEntries.value.push(r) // TODO or reload ? - selectedRecipe.value = {} as Recipe + if (Object.keys(selectedRecipe.value).length > 0) { + api.apiRecipeBookEntryCreate({recipeBookEntry: {book: editingObj.value.id!, recipe: selectedRecipe.value.id!}}).then(r => { + recipeBookEntries.value.push(r) + selectedRecipe.value = {} as Recipe + }).catch(err => { + useMessageStore().addError(ErrorMessageType.CREATE_ERROR, err) + }) + } +} + +/** + * remove the given entry from the book both in the database and on the frontend + * @param recipeBookEntry + */ +function removeRecipeFromBook(recipeBookEntry: RecipeBookEntry) { + let api = new ApiApi() + + api.apiRecipeBookEntryDestroy({id: recipeBookEntry.id!}).then((r) => { + recipeBookEntries.value.splice(recipeBookEntries.value.findIndex(rBE => rBE.id! == recipeBookEntry.id!), 1) + useMessageStore().addPreparedMessage(PreparedMessage.DELETE_SUCCESS) }).catch(err => { - useMessageStore().addError(ErrorMessageType.CREATE_ERROR, err) + useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err) }) } @@ -132,7 +154,7 @@ function loadRecipeBookEntries(options: VDataTableUpdateOptions) { useUserPreferenceStore().deviceSettings.general_tableItemsPerPage = options.itemsPerPage - api.apiRecipeBookEntryList({page: options.page, pageSize: options.itemsPerPage,}).then((r: any) => { + api.apiRecipeBookEntryList({page: options.page, pageSize: options.itemsPerPage, book: editingObj.value.id}).then((r: any) => { recipeBookEntries.value = r.results itemCount.value = r.count }).catch((err: any) => { diff --git a/vue3/src/components/model_editors/RecipeEditor.vue b/vue3/src/components/model_editors/RecipeEditor.vue index 094f770cd..047751fdb 100644 --- a/vue3/src/components/model_editors/RecipeEditor.vue +++ b/vue3/src/components/model_editors/RecipeEditor.vue @@ -139,7 +139,6 @@ import {onMounted, PropType, ref, shallowRef} from "vue"; import {Ingredient, Recipe, Step} from "@/openapi"; import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions"; -import {useI18n} from "vue-i18n"; import ModelSelect from "@/components/inputs/ModelSelect.vue"; import StepEditor from "@/components/inputs/StepEditor.vue"; import {VueDraggable} from "vue-draggable-plus"; @@ -155,6 +154,7 @@ import {useUserPreferenceStore} from "@/stores/UserPreferenceStore"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as Recipe}, dialog: {type: Boolean, default: false} }) @@ -175,7 +175,8 @@ onMounted(() => { newItemFunction: () => { editingObj.value.steps = [] as Step[] editingObj.value.internal = true //TODO make database default after v2 - } + }, + itemDefaults: props.itemDefaults, }) }) diff --git a/vue3/src/components/model_editors/ShoppingListEntryEditor.vue b/vue3/src/components/model_editors/ShoppingListEntryEditor.vue index 2ed9b5f54..b1191f6ec 100644 --- a/vue3/src/components/model_editors/ShoppingListEntryEditor.vue +++ b/vue3/src/components/model_editors/ShoppingListEntryEditor.vue @@ -37,13 +37,13 @@ import {onMounted, PropType} from "vue"; import {ShoppingListEntry} from "@/openapi"; import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions"; -import {useI18n} from "vue-i18n"; import {VNumberInput} from "vuetify/labs/VNumberInput"; import ModelSelect from "@/components/inputs/ModelSelect.vue"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as ShoppingListEntry}, dialog: {type: Boolean, default: false} }) @@ -53,7 +53,7 @@ const {setupState, deleteObject, saveObject, isUpdate, editingObjName, loading, // object specific data (for selects/display) onMounted(() => { - setupState(props.item, props.itemId) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/SupermarketCategoryEditor.vue b/vue3/src/components/model_editors/SupermarketCategoryEditor.vue index d02ccaae4..78d38fa8e 100644 --- a/vue3/src/components/model_editors/SupermarketCategoryEditor.vue +++ b/vue3/src/components/model_editors/SupermarketCategoryEditor.vue @@ -29,11 +29,10 @@ import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; import {useModelEditorFunctions} from "@/composables/useModelEditorFunctions"; import {useI18n} from "vue-i18n"; -const {t} = useI18n() - const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as SupermarketCategory}, dialog: {type: Boolean, default: false} }) @@ -43,7 +42,7 @@ const {setupState, deleteObject, saveObject, isUpdate, editingObjName, loading, // object specific data (for selects/display) onMounted(() => { - setupState(props.item, props.itemId) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/SupermarketEditor.vue b/vue3/src/components/model_editors/SupermarketEditor.vue index ddb9903df..c6ea9d504 100644 --- a/vue3/src/components/model_editors/SupermarketEditor.vue +++ b/vue3/src/components/model_editors/SupermarketEditor.vue @@ -112,6 +112,7 @@ import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as Supermarket}, dialog: {type: Boolean, default: false} }) @@ -154,7 +155,8 @@ onMounted(() => { existingItemFunction: () => { // initialize list of supermarket category relations editingObjectSupermarketCategoriesRelations.value = editingObj.value.categoryToSupermarket - } + }, + itemDefaults: props.itemDefaults, }) }) }) diff --git a/vue3/src/components/model_editors/UnitConversionEditor.vue b/vue3/src/components/model_editors/UnitConversionEditor.vue index 2b7811f88..66eba26cb 100644 --- a/vue3/src/components/model_editors/UnitConversionEditor.vue +++ b/vue3/src/components/model_editors/UnitConversionEditor.vue @@ -58,6 +58,7 @@ import ModelEditorBase from "@/components/model_editors/ModelEditorBase.vue"; const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as UnitConversion}, dialog: {type: Boolean, default: false} }) @@ -66,7 +67,7 @@ const {setupState, deleteObject, saveObject, isUpdate, editingObjName, loading, onMounted(() => { - setupState(props.item, props.itemId) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/UnitEditor.vue b/vue3/src/components/model_editors/UnitEditor.vue index b7c5fdd40..74d2e3980 100644 --- a/vue3/src/components/model_editors/UnitEditor.vue +++ b/vue3/src/components/model_editors/UnitEditor.vue @@ -35,6 +35,7 @@ const {t} = useI18n() const props = defineProps({ item: {type: {} as PropType, required: false, default: null}, itemId: {type: [Number, String], required: false, default: undefined}, + itemDefaults: {type: {} as PropType, required: false, default: {} as Unit}, dialog: {type: Boolean, default: false} }) @@ -66,7 +67,7 @@ const BASE_UNITS = [ ] onMounted(() => { - setupState(props.item, props.itemId) + setupState(props.item, props.itemId, {itemDefaults: props.itemDefaults}) }) diff --git a/vue3/src/components/model_editors/UserFileEditor.vue b/vue3/src/components/model_editors/UserFileEditor.vue index ae876b56b..6fde297bc 100644 --- a/vue3/src/components/model_editors/UserFileEditor.vue +++ b/vue3/src/components/model_editors/UserFileEditor.vue @@ -48,7 +48,7 @@