mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2026-01-06 14:48:02 -05:00
various fixes and improvements
This commit is contained in:
@@ -173,12 +173,13 @@
|
||||
></v-snackbar-queued>
|
||||
|
||||
</v-app>
|
||||
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import GlobalSearchDialog from "@/components/inputs/GlobalSearchDialog.vue"
|
||||
|
||||
import {useDisplay} from "vuetify"
|
||||
import {useDisplay, useTheme} from "vuetify"
|
||||
import VSnackbarQueued from "@/components/display/VSnackbarQueued.vue";
|
||||
import MessageListDialog from "@/components/dialogs/MessageListDialog.vue";
|
||||
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
|
||||
@@ -186,9 +187,6 @@ import NavigationDrawerContextMenu from "@/components/display/NavigationDrawerCo
|
||||
import {useDjangoUrls} from "@/composables/useDjangoUrls";
|
||||
import {onMounted, ref} from "vue";
|
||||
import {isSpaceAboveLimit} from "@/utils/logic_utils";
|
||||
import SpaceSettings from "@/components/settings/SpaceSettings.vue";
|
||||
import SettingsPage from "@/pages/SettingsPage.vue";
|
||||
import MealPlanPage from "@/pages/MealPlanPage.vue";
|
||||
|
||||
const {lgAndUp} = useDisplay()
|
||||
const {getDjangoUrl} = useDjangoUrls()
|
||||
|
||||
40
vue3/src/assets/tandoor_dark.css
Normal file
40
vue3/src/assets/tandoor_dark.css
Normal file
@@ -0,0 +1,40 @@
|
||||
/* Meal-Plan */
|
||||
|
||||
.cv-header {
|
||||
background-color: #303030 !important;
|
||||
}
|
||||
|
||||
.cv-weeknumber, .cv-header-day {
|
||||
background-color: #303030 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.cv-day.past {
|
||||
background-color: #333333 !important;
|
||||
}
|
||||
|
||||
.cv-day.today {
|
||||
background-color: var(--primary) !important;
|
||||
}
|
||||
|
||||
.cv-day.outsideOfMonth {
|
||||
background-color: #0d0d0d !important;
|
||||
}
|
||||
|
||||
.cv-item {
|
||||
background-color: #4E4E4E !important;
|
||||
}
|
||||
|
||||
.d01 .cv-day-number {
|
||||
background-color: #b98766!important;
|
||||
}
|
||||
|
||||
/* vueform/multiselect */
|
||||
|
||||
.multiselect-dropdown {
|
||||
background: #212121!important;
|
||||
}
|
||||
|
||||
.multiselect-option.is-pointed {
|
||||
background: #b98766!important;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<v-card class="mt-1 h-100">
|
||||
<iframe width="100%" height="700px" :src="`${getDjangoUrl('/api/get_recipe_file/')}${props.recipe.id}/`" v-if="isPdf"></iframe>
|
||||
<iframe width="100%" height="700px" :src="`${getDjangoUrl('/static/pdfjs/web/viewer.html', false)}?file=${getDjangoUrl('/api/get_recipe_file/')}${props.recipe.id}/`" v-if="isPdf"></iframe>
|
||||
|
||||
<v-img :src="`${getDjangoUrl('/api/get_recipe_file/')}${props.recipe.id}/`" v-if="isImage"></v-img>
|
||||
</v-card>
|
||||
@@ -11,6 +11,7 @@ import {computed, PropType} from "vue";
|
||||
import {Recipe} from "@/openapi";
|
||||
import {useDjangoUrls} from "@/composables/useDjangoUrls";
|
||||
|
||||
|
||||
const props = defineProps({
|
||||
recipe: {type: {} as PropType<Recipe>, required: true}
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<v-img :cover="cover" :style="{'height': height, 'width': width,}" style="background-color: #ffffff" :src="image" :alt="$t('Recipe_Image')" :rounded="props.rounded">
|
||||
<v-img :cover="cover" :style="{'height': height, 'width': width,}" color="recipeImagePlaceholderBg" :src="image" :alt="$t('Recipe_Image')" :rounded="props.rounded">
|
||||
<slot name="overlay">
|
||||
|
||||
</slot>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
</v-card>
|
||||
</template>
|
||||
|
||||
<property-view v-model="recipe" :servings="servings"></property-view>
|
||||
<property-view v-model="recipe" :servings="servings" v-if="recipe.internal"></property-view>
|
||||
|
||||
<v-expansion-panels class="mt-2">
|
||||
|
||||
|
||||
@@ -8,11 +8,15 @@ export function useDjangoUrls() {
|
||||
/**
|
||||
* given a path return the full server url to that url respecting possible sub path setups
|
||||
* @param path
|
||||
* @param appendSlash automatically append a slash to the end of the url (default true)
|
||||
*/
|
||||
function getDjangoUrl(path: string){
|
||||
if(path.charAt(0) == '/'){
|
||||
function getDjangoUrl(path: string, appendSlash = true){
|
||||
if(path.startsWith('/')){
|
||||
path = path.substring(1)
|
||||
}
|
||||
if(!path.endsWith('/') && appendSlash){
|
||||
path = path + '/'
|
||||
}
|
||||
|
||||
return `${basePath}/${path}`
|
||||
}
|
||||
|
||||
@@ -518,6 +518,7 @@
|
||||
"reset_food_inheritance_info": "",
|
||||
"review_shopping": "",
|
||||
"save_filter": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -506,6 +506,7 @@
|
||||
"reset_children_help": "Презаписване на всички последователи със стойности от наследени полета. Наследените полета на последователите ще бъдат зададени на наследяване на полета, освен ако последователите наследяват полета не е зададено.",
|
||||
"review_shopping": "Прегледайте записите за пазаруване, преди да запазите",
|
||||
"save_filter": "Запазване на филтъра",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -642,6 +642,7 @@
|
||||
"reusable_help_text": "L'enllaç d'invitació es pot fer servir per més d'un usuari.",
|
||||
"review_shopping": "",
|
||||
"save_filter": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -635,6 +635,7 @@
|
||||
"reusable_help_text": "Má-li pozvánka platit pro více než jednoho uživatele.",
|
||||
"review_shopping": "Zkontrolovat nákupní položky před uložením",
|
||||
"save_filter": "Uložit filtr",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -613,6 +613,7 @@
|
||||
"reusable_help_text": "Om invitationslinket skal kunne bruges af mere end en bruger.",
|
||||
"review_shopping": "Tjek indkøbsvarer inden der gemmes",
|
||||
"save_filter": "Gem filter",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -647,6 +647,7 @@
|
||||
"reusable_help_text": "Soll der Einladungslink für mehr als eine Person nutzbar sein.",
|
||||
"review_shopping": "Überprüfe die Einkaufsliste vor dem Speichern",
|
||||
"save_filter": "Filter speichern",
|
||||
"searchFilterCreatedByHelp": "Rezepte die vom ausgewählten Nutzer erstellt wurden.",
|
||||
"searchFilterObjectsAndHelp": "Rezepte mit allen gewählten {type}",
|
||||
"searchFilterObjectsAndNotHelp": "Rezepte ausschließen die alle gewählten {type} haben.",
|
||||
"searchFilterObjectsHelp": "Rezepte mit einem beliebigen der ausgewählten {type}",
|
||||
|
||||
@@ -600,6 +600,7 @@
|
||||
"reusable_help_text": "Ο σύνδεσμος πρόσκλησης μπορεί να χρησιμοποιηθεί από πολλαπλούς χρήστες.",
|
||||
"review_shopping": "Ανασκόπηση εγγραφών στις αγορές πριν την αποθήκευση",
|
||||
"save_filter": "Αποθήκευση φίλτρου",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -644,6 +644,7 @@
|
||||
"reusable_help_text": "Should the invite link be usable for more than one user.",
|
||||
"review_shopping": "Review shopping entries before saving",
|
||||
"save_filter": "Save Filter",
|
||||
"searchFilterCreatedByHelp": "Recipes that were created by the selected user.",
|
||||
"searchFilterObjectsAndHelp": "Recipes with all of the selected {type}",
|
||||
"searchFilterObjectsAndNotHelp": "Exclude recipes with all of the selected {type}",
|
||||
"searchFilterObjectsHelp": "Recipes with any of the selected {type}",
|
||||
|
||||
@@ -642,6 +642,7 @@
|
||||
"reusable_help_text": "El enlace de invitación podrá ser usado por más de un usuario.",
|
||||
"review_shopping": "Revise entradas de compra antes de guardar",
|
||||
"save_filter": "Guardar Filtros",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -350,6 +350,7 @@
|
||||
"or": "tai",
|
||||
"plural_short": "",
|
||||
"plural_usage_info": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -631,6 +631,7 @@
|
||||
"reusable_help_text": "Le lien d’invitation doit-il être utilisable par plus d’un utilisateur.",
|
||||
"review_shopping": "Vérifier les éléments de la liste avant de sauvegarder",
|
||||
"save_filter": "Sauvegarder le filtre",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -643,6 +643,7 @@
|
||||
"reusable_help_text": "האם הכתובת השיתוף תהיה שמישה ליותר ממשתמש אחד.",
|
||||
"review_shopping": "עיין ברשימת הקניות לפני שמירה",
|
||||
"save_filter": "שמור סנן",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -602,6 +602,7 @@
|
||||
"reusable_help_text": "A meghívó linknek egynél több felhasználó számára is használhatónak kell lennie.",
|
||||
"review_shopping": "A bevásárlási bejegyzések áttekintése mentés előtt",
|
||||
"save_filter": "Szűrő mentése",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -264,6 +264,7 @@
|
||||
"or": "կամ",
|
||||
"plural_short": "",
|
||||
"plural_usage_info": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -543,6 +543,7 @@
|
||||
"reusable_help_text": "Haruskah tautan undangan dapat digunakan untuk lebih dari satu pengguna.",
|
||||
"review_shopping": "",
|
||||
"save_filter": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -641,6 +641,7 @@
|
||||
"reusable_help_text": "",
|
||||
"review_shopping": "",
|
||||
"save_filter": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -561,6 +561,7 @@
|
||||
"reusable_help_text": "Il link di invito dovrebbe essere usabile per più di un utente.",
|
||||
"review_shopping": "Rivedi le voci della spesa prima di salvare",
|
||||
"save_filter": "Salva filtro",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -611,6 +611,7 @@
|
||||
"reusable_help_text": "",
|
||||
"review_shopping": "",
|
||||
"save_filter": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -583,6 +583,7 @@
|
||||
"reusable_help_text": "Burde invitasjonslenken være brukbar for flere enn én bruker.",
|
||||
"review_shopping": "",
|
||||
"save_filter": "Lagre filtre",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -604,6 +604,7 @@
|
||||
"reusable_help_text": "Zou de uitnodigingslink voor meer dan een gebruiker bruikbaar zijn.",
|
||||
"review_shopping": "Beoordeel items op het boodschappenlijstje voor opslaan",
|
||||
"save_filter": "Bewaar filter",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -645,6 +645,7 @@
|
||||
"reusable_help_text": "Czy link z zaproszeniem może być używany przez więcej niż jednego użytkownika.",
|
||||
"review_shopping": "Przejrzyj wpisy zakupów przed zapisaniem",
|
||||
"save_filter": "Zapisz filtr",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -499,6 +499,7 @@
|
||||
"reusable_help_text": "O link de convite poderá ser usado por mais do que um utilizador.",
|
||||
"review_shopping": "",
|
||||
"save_filter": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -607,6 +607,7 @@
|
||||
"reusable_help_text": "O convite pode ser utilizado para mais de um usuário.",
|
||||
"review_shopping": "",
|
||||
"save_filter": "Salvar Filtro",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -564,6 +564,7 @@
|
||||
"reusable_help_text": "Ar trebui link-ul de invitație să poată fi utilizat de mai mulți utilizatori.",
|
||||
"review_shopping": "Examinați intrările de cumpărături înainte de a salva",
|
||||
"save_filter": "Salvare filtru",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -451,6 +451,7 @@
|
||||
"remove_selection": "Отменить выбор",
|
||||
"review_shopping": "Просмотрите записи о покупках перед сохранением",
|
||||
"save_filter": "Сохранить фильтр",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -434,6 +434,7 @@
|
||||
"remember_hours": "Ure, ki si jih zapomni",
|
||||
"remember_search": "Zapomni si iskanje",
|
||||
"reusable_help_text": "Ali lahko povezavo za povabilo uporabi več kot en uporabnik.",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -645,6 +645,7 @@
|
||||
"reusable_help_text": "Bör inbjudningslänken vara användbar för mer än en användare.",
|
||||
"review_shopping": "Granska inköpsposter innan du sparar",
|
||||
"save_filter": "Spara filter",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -643,6 +643,7 @@
|
||||
"reusable_help_text": "Davet bağlantısı birden fazla kullanıcı için kullanılabilir olsun mu.",
|
||||
"review_shopping": "Kaydetmeden önce alışveriş girişlerini inceleyin",
|
||||
"save_filter": "Filtreyi Kaydet",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -525,6 +525,7 @@
|
||||
"reusable_help_text": "Запрошувальне посилання має бути тільки для одного користувача.",
|
||||
"review_shopping": "",
|
||||
"save_filter": "",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -635,6 +635,7 @@
|
||||
"reusable_help_text": "邀请链接是否可用于多个用户。",
|
||||
"review_shopping": "保存前查看购物列表",
|
||||
"save_filter": "保存筛选器",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -238,6 +238,7 @@
|
||||
"plural_short": "",
|
||||
"plural_usage_info": "",
|
||||
"recipe_property_info": "您也可以為食材添加屬性,以便根據您的食譜自動計算它們!",
|
||||
"searchFilterCreatedByHelp": "",
|
||||
"searchFilterObjectsAndHelp": "",
|
||||
"searchFilterObjectsAndNotHelp": "",
|
||||
"searchFilterObjectsOrNotHelp": "",
|
||||
|
||||
@@ -7,6 +7,8 @@ models/AccessToken.ts
|
||||
models/AuthToken.ts
|
||||
models/AutoMealPlan.ts
|
||||
models/Automation.ts
|
||||
models/AutomationTypeEnum.ts
|
||||
models/BaseUnitEnum.ts
|
||||
models/BookmarkletImport.ts
|
||||
models/BookmarkletImportList.ts
|
||||
models/ConnectorConfigConfig.ts
|
||||
@@ -33,6 +35,16 @@ models/MealPlan.ts
|
||||
models/MealType.ts
|
||||
models/MethodEnum.ts
|
||||
models/NutritionInformation.ts
|
||||
models/OpenDataCategory.ts
|
||||
models/OpenDataConversion.ts
|
||||
models/OpenDataFood.ts
|
||||
models/OpenDataFoodProperty.ts
|
||||
models/OpenDataProperty.ts
|
||||
models/OpenDataStore.ts
|
||||
models/OpenDataStoreCategory.ts
|
||||
models/OpenDataUnit.ts
|
||||
models/OpenDataUnitTypeEnum.ts
|
||||
models/OpenDataVersion.ts
|
||||
models/PaginatedAutomationList.ts
|
||||
models/PaginatedBookmarkletImportListList.ts
|
||||
models/PaginatedCookLogList.ts
|
||||
@@ -79,6 +91,13 @@ models/PatchedInviteLink.ts
|
||||
models/PatchedKeyword.ts
|
||||
models/PatchedMealPlan.ts
|
||||
models/PatchedMealType.ts
|
||||
models/PatchedOpenDataCategory.ts
|
||||
models/PatchedOpenDataConversion.ts
|
||||
models/PatchedOpenDataFood.ts
|
||||
models/PatchedOpenDataProperty.ts
|
||||
models/PatchedOpenDataStore.ts
|
||||
models/PatchedOpenDataUnit.ts
|
||||
models/PatchedOpenDataVersion.ts
|
||||
models/PatchedProperty.ts
|
||||
models/PatchedPropertyType.ts
|
||||
models/PatchedRecipe.ts
|
||||
@@ -138,7 +157,6 @@ models/SupermarketCategoryRelation.ts
|
||||
models/Sync.ts
|
||||
models/SyncLog.ts
|
||||
models/ThemeEnum.ts
|
||||
models/TypeEnum.ts
|
||||
models/Unit.ts
|
||||
models/UnitConversion.ts
|
||||
models/User.ts
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -13,12 +13,12 @@
|
||||
*/
|
||||
|
||||
import { mapValues } from '../runtime';
|
||||
import type { TypeEnum } from './TypeEnum';
|
||||
import type { AutomationTypeEnum } from './AutomationTypeEnum';
|
||||
import {
|
||||
TypeEnumFromJSON,
|
||||
TypeEnumFromJSONTyped,
|
||||
TypeEnumToJSON,
|
||||
} from './TypeEnum';
|
||||
AutomationTypeEnumFromJSON,
|
||||
AutomationTypeEnumFromJSONTyped,
|
||||
AutomationTypeEnumToJSON,
|
||||
} from './AutomationTypeEnum';
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -34,10 +34,10 @@ export interface Automation {
|
||||
id?: number;
|
||||
/**
|
||||
*
|
||||
* @type {TypeEnum}
|
||||
* @type {AutomationTypeEnum}
|
||||
* @memberof Automation
|
||||
*/
|
||||
type: TypeEnum;
|
||||
type: AutomationTypeEnum;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@@ -108,7 +108,7 @@ export function AutomationFromJSONTyped(json: any, ignoreDiscriminator: boolean)
|
||||
return {
|
||||
|
||||
'id': json['id'] == null ? undefined : json['id'],
|
||||
'type': TypeEnumFromJSON(json['type']),
|
||||
'type': AutomationTypeEnumFromJSON(json['type']),
|
||||
'name': json['name'] == null ? undefined : json['name'],
|
||||
'description': json['description'] == null ? undefined : json['description'],
|
||||
'param1': json['param_1'] == null ? undefined : json['param_1'],
|
||||
@@ -127,7 +127,7 @@ export function AutomationToJSON(value?: Omit<Automation, 'createdBy'> | null):
|
||||
return {
|
||||
|
||||
'id': value['id'],
|
||||
'type': TypeEnumToJSON(value['type']),
|
||||
'type': AutomationTypeEnumToJSON(value['type']),
|
||||
'name': value['name'],
|
||||
'description': value['description'],
|
||||
'param_1': value['param1'],
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
*/
|
||||
|
||||
import { mapValues } from '../runtime';
|
||||
import type { TypeEnum } from './TypeEnum';
|
||||
import type { AutomationTypeEnum } from './AutomationTypeEnum';
|
||||
import {
|
||||
TypeEnumFromJSON,
|
||||
TypeEnumFromJSONTyped,
|
||||
TypeEnumToJSON,
|
||||
} from './TypeEnum';
|
||||
AutomationTypeEnumFromJSON,
|
||||
AutomationTypeEnumFromJSONTyped,
|
||||
AutomationTypeEnumToJSON,
|
||||
} from './AutomationTypeEnum';
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -34,10 +34,10 @@ export interface PatchedAutomation {
|
||||
id?: number;
|
||||
/**
|
||||
*
|
||||
* @type {TypeEnum}
|
||||
* @type {AutomationTypeEnum}
|
||||
* @memberof PatchedAutomation
|
||||
*/
|
||||
type?: TypeEnum;
|
||||
type?: AutomationTypeEnum;
|
||||
/**
|
||||
*
|
||||
* @type {string}
|
||||
@@ -106,7 +106,7 @@ export function PatchedAutomationFromJSONTyped(json: any, ignoreDiscriminator: b
|
||||
return {
|
||||
|
||||
'id': json['id'] == null ? undefined : json['id'],
|
||||
'type': json['type'] == null ? undefined : TypeEnumFromJSON(json['type']),
|
||||
'type': json['type'] == null ? undefined : AutomationTypeEnumFromJSON(json['type']),
|
||||
'name': json['name'] == null ? undefined : json['name'],
|
||||
'description': json['description'] == null ? undefined : json['description'],
|
||||
'param1': json['param_1'] == null ? undefined : json['param_1'],
|
||||
@@ -125,7 +125,7 @@ export function PatchedAutomationToJSON(value?: Omit<PatchedAutomation, 'created
|
||||
return {
|
||||
|
||||
'id': value['id'],
|
||||
'type': TypeEnumToJSON(value['type']),
|
||||
'type': AutomationTypeEnumToJSON(value['type']),
|
||||
'name': value['name'],
|
||||
'description': value['description'],
|
||||
'param_1': value['param1'],
|
||||
|
||||
@@ -4,6 +4,8 @@ export * from './AccessToken';
|
||||
export * from './AuthToken';
|
||||
export * from './AutoMealPlan';
|
||||
export * from './Automation';
|
||||
export * from './AutomationTypeEnum';
|
||||
export * from './BaseUnitEnum';
|
||||
export * from './BookmarkletImport';
|
||||
export * from './BookmarkletImportList';
|
||||
export * from './ConnectorConfigConfig';
|
||||
@@ -30,6 +32,16 @@ export * from './MealPlan';
|
||||
export * from './MealType';
|
||||
export * from './MethodEnum';
|
||||
export * from './NutritionInformation';
|
||||
export * from './OpenDataCategory';
|
||||
export * from './OpenDataConversion';
|
||||
export * from './OpenDataFood';
|
||||
export * from './OpenDataFoodProperty';
|
||||
export * from './OpenDataProperty';
|
||||
export * from './OpenDataStore';
|
||||
export * from './OpenDataStoreCategory';
|
||||
export * from './OpenDataUnit';
|
||||
export * from './OpenDataUnitTypeEnum';
|
||||
export * from './OpenDataVersion';
|
||||
export * from './PaginatedAutomationList';
|
||||
export * from './PaginatedBookmarkletImportListList';
|
||||
export * from './PaginatedCookLogList';
|
||||
@@ -76,6 +88,13 @@ export * from './PatchedInviteLink';
|
||||
export * from './PatchedKeyword';
|
||||
export * from './PatchedMealPlan';
|
||||
export * from './PatchedMealType';
|
||||
export * from './PatchedOpenDataCategory';
|
||||
export * from './PatchedOpenDataConversion';
|
||||
export * from './PatchedOpenDataFood';
|
||||
export * from './PatchedOpenDataProperty';
|
||||
export * from './PatchedOpenDataStore';
|
||||
export * from './PatchedOpenDataUnit';
|
||||
export * from './PatchedOpenDataVersion';
|
||||
export * from './PatchedProperty';
|
||||
export * from './PatchedPropertyType';
|
||||
export * from './PatchedRecipe';
|
||||
@@ -135,7 +154,6 @@ export * from './SupermarketCategoryRelation';
|
||||
export * from './Sync';
|
||||
export * from './SyncLog';
|
||||
export * from './ThemeEnum';
|
||||
export * from './TypeEnum';
|
||||
export * from './Unit';
|
||||
export * from './UnitConversion';
|
||||
export * from './User';
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
<v-expansion-panel-title>{{ $t('Table_of_Contents') }}</v-expansion-panel-title>
|
||||
<v-expansion-panel-text>
|
||||
<v-list>
|
||||
<v-list-item v-for="(entry, i) in entries" :key="entry.id" @click="page = i; toc = false">
|
||||
{{ entry.recipeContent.name }}
|
||||
<v-list-item v-for="(entry, i) in recipes" :key="entry.id" @click="page = i; toc = false">
|
||||
{{ entry.name }}
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-expansion-panel-text>
|
||||
@@ -48,16 +48,16 @@
|
||||
<v-btn icon="fa-solid fa-chevron-left" variant="plain" @click="page = page - (mdAndUp ? 2 : 1)"></v-btn>
|
||||
</template>
|
||||
|
||||
<v-window-item v-for="(entry, i) in entries" :key="entry.id">
|
||||
<v-window-item v-for="(entry, i) in recipes" :key="entry.id">
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<book-entry-card :recipe-overview="entries[i].recipeContent"></book-entry-card>
|
||||
<book-entry-card :recipe-overview="recipes[i]"></book-entry-card>
|
||||
<div class="text-center mt-1">
|
||||
<span class="text-disabled">{{ i + 1 }}</span>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="6" v-if="mdAndUp && entries.length > i + 1">
|
||||
<book-entry-card :recipe-overview="entries[i + 1].recipeContent"></book-entry-card>
|
||||
<v-col cols="6" v-if="mdAndUp && recipes.length > i + 1">
|
||||
<book-entry-card :recipe-overview="recipes[i + 1]"></book-entry-card>
|
||||
<div class="text-center mt-1">
|
||||
<span class="text-disabled">{{ i + 2 }}</span>
|
||||
</div>
|
||||
@@ -73,8 +73,8 @@
|
||||
<script setup lang="ts">
|
||||
|
||||
|
||||
import {onMounted, ref} from "vue";
|
||||
import {ApiApi, RecipeBook, RecipeBookEntry} from "@/openapi";
|
||||
import {computed, onMounted, ref} from "vue";
|
||||
import {ApiApi, RecipeBook, RecipeBookEntry, RecipeOverview} from "@/openapi";
|
||||
import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore";
|
||||
import {useRouter} from "vue-router";
|
||||
import RecipeImage from "@/components/display/RecipeImage.vue";
|
||||
@@ -89,22 +89,26 @@ const {mdAndUp} = useDisplay()
|
||||
const router = useRouter()
|
||||
|
||||
const loading = ref(false)
|
||||
const loadingEntries = ref(false)
|
||||
const toc = ref(false)
|
||||
const page = ref(0)
|
||||
const totalItems = ref(0)
|
||||
|
||||
const manualItems = ref(0)
|
||||
const filterItems = ref(0)
|
||||
const totalItems = computed(() => {
|
||||
return manualItems.value + filterItems.value
|
||||
})
|
||||
|
||||
const book = ref({} as RecipeBook)
|
||||
const entries = ref([] as RecipeBookEntry[])
|
||||
const recipes = ref([] as RecipeOverview[])
|
||||
|
||||
onMounted(() => {
|
||||
loadBook()
|
||||
|
||||
entries.value = []
|
||||
loadEntries(1)
|
||||
})
|
||||
|
||||
/**
|
||||
* load the given book
|
||||
* load the given book and trigger loading its entries
|
||||
*/
|
||||
function loadBook() {
|
||||
const api = new ApiApi()
|
||||
@@ -112,6 +116,9 @@ function loadBook() {
|
||||
|
||||
api.apiRecipeBookRetrieve({id: props.bookId}).then(r => {
|
||||
book.value = r
|
||||
|
||||
entries.value = []
|
||||
recLoadEntries(1)
|
||||
}).catch(err => {
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
}).finally(() => {
|
||||
@@ -119,17 +126,53 @@ function loadBook() {
|
||||
})
|
||||
}
|
||||
|
||||
function loadEntries(page: number) {
|
||||
/**
|
||||
* recursively load the book entries and trigger loading all entries from a saved custom filter
|
||||
* @param page
|
||||
*/
|
||||
function recLoadEntries(page: number) {
|
||||
const api = new ApiApi()
|
||||
loadingEntries.value = true
|
||||
|
||||
api.apiRecipeBookEntryList({book: props.bookId, page: page}).then(r => {
|
||||
entries.value = entries.value.concat(r.results)
|
||||
totalItems.value = r.count
|
||||
api.apiRecipeBookEntryList({book: props.bookId, page: page, pageSize: 50}).then(r => {
|
||||
r.results.forEach(rBE => {
|
||||
recipes.value.push(rBE.recipeContent)
|
||||
})
|
||||
manualItems.value = r.count
|
||||
if (r.next) {
|
||||
loadEntries(page + 1)
|
||||
recLoadEntries(page + 1)
|
||||
} else {
|
||||
if (book.value.filter) {
|
||||
recLoadFilter(book.value.filter.id, 1)
|
||||
} else {
|
||||
loadingEntries.value = false
|
||||
}
|
||||
}
|
||||
}).catch(err => {
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
loadingEntries.value = false
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* recursively load the recipes matched by the custom filter configured in the book
|
||||
* @param filterId filter id to look for
|
||||
* @param page page to load
|
||||
*/
|
||||
function recLoadFilter(filterId: number, page: number) {
|
||||
let api = new ApiApi()
|
||||
|
||||
api.apiRecipeList({filter: filterId, page: page, pageSize: 50}).then(r => {
|
||||
recipes.value = recipes.value.concat(r.results)
|
||||
manualItems.value = r.count
|
||||
if (r.next) {
|
||||
recLoadFilter(filterId, page + 1)
|
||||
} else {
|
||||
loadingEntries.value = false
|
||||
}
|
||||
}).catch(err => {
|
||||
useMessageStore().addError(ErrorMessageType.FETCH_ERROR, err)
|
||||
loadingEntries.value = false
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ const tableHeaders = computed(() => {
|
||||
const tableItemCount = ref(0)
|
||||
|
||||
const recipes = ref([] as RecipeOverview[])
|
||||
const selectedCustomFilter = ref<null|CustomFilter>(null)
|
||||
const selectedCustomFilter = ref<null | CustomFilter>(null)
|
||||
const newFilterName = ref('')
|
||||
|
||||
/**
|
||||
@@ -461,10 +461,45 @@ function transformTandoor1Filter(customFilterParams: any) {
|
||||
return customFilterParams
|
||||
}
|
||||
|
||||
/*
|
||||
[this.$t("search_rank"), "score", "1-9", "9-1"],
|
||||
[this.$t("Name"), "name", "A-z", "Z-a"],
|
||||
[this.$t("last_cooked"), "lastcooked", "↑", "↓"],
|
||||
[this.$t("Rating"), "rating", "1-5", "5-1"],
|
||||
[this.$t("times_cooked"), "favorite", "x-X", "X-x"],
|
||||
[this.$t("date_created"), "created_at", "↑", "↓"],
|
||||
[this.$t("date_viewed"), "lastviewed", "↑", "↓"],
|
||||
*/
|
||||
/**
|
||||
* all filters available to enable
|
||||
*/
|
||||
const filters = ref({
|
||||
sortOrder: {
|
||||
id: 'sortOrder',
|
||||
label: `${t('sort_by')}`,
|
||||
hint: '',
|
||||
enabled: false,
|
||||
default: "",
|
||||
is: VSelect,
|
||||
items: [
|
||||
{value: "random", title: `${t('RandomOrder')}`},
|
||||
{value: "score", title: `${t('search_rank')} (1-9)`},
|
||||
{value: "-score", title: `${t('search_rank')} (9-1)`},
|
||||
{value: "name", title: `${t('Name')} (A-z)`},
|
||||
{value: "-name", title: `${t('Name')} (Z-a)`},
|
||||
{value: "lastcooked", title: `${t('last_cooked')} (↑)`},
|
||||
{value: "-lastcooked", title: `${t('last_cooked')} (↓)`},
|
||||
{value: "rating", title: `${t('Rating')} (1-5)`},
|
||||
{value: "-rating", title: `${t('Rating')} (5-1)`},
|
||||
{value: "times_cooked", title: `${t('favorite')} (↑)`},
|
||||
{value: "-times_cooked", title: `${t('favorite')} (↓)`},
|
||||
{value: "created_at", title: `${t('date_created')} (↑)`},
|
||||
{value: "-created_at", title: `${t('date_created')} (↓)`},
|
||||
{value: "lastviewed", title: `${t('date_viewed')} (↑)`},
|
||||
{value: "-lastviewed", title: `${t('date_viewed')} (↓)`},
|
||||
],
|
||||
modelValue: useRouteQuery('sortOrder', "")
|
||||
},
|
||||
keywords: {
|
||||
id: 'keywords',
|
||||
label: `${t('Keywords')} (${t('any')})`,
|
||||
@@ -532,7 +567,7 @@ const filters = ref({
|
||||
},
|
||||
foodsAnd: {
|
||||
id: 'foodsAnd',
|
||||
label: `${t('Keywords')} (${t('all')})`,
|
||||
label: `${t('Foods')} (${t('all')})`,
|
||||
hint: t('searchFilterObjectsAndHelp', {type: t('Foods')}),
|
||||
enabled: false,
|
||||
default: [],
|
||||
|
||||
@@ -6,6 +6,7 @@ import {ShoppingGroupingOptions} from "@/types/Shopping";
|
||||
import {computed, ComputedRef, ref} from "vue";
|
||||
import {DeviceSettings} from "@/types/settings";
|
||||
import {useTheme} from "vuetify";
|
||||
import tandoorDarkCustomCss from '@/assets/tandoor_dark.css?inline'
|
||||
|
||||
const DEVICE_SETTINGS_KEY = 'TANDOOR_DEVICE_SETTINGS'
|
||||
const USER_PREFERENCE_KEY = 'TANDOOR_USER_PREFERENCE'
|
||||
@@ -205,10 +206,23 @@ export const useUserPreferenceStore = defineStore('user_preference_store', () =>
|
||||
* applies user settings regarding themes/styling
|
||||
*/
|
||||
function updateTheme() {
|
||||
let customStyleTag = document.getElementById('id_style_custom_css')
|
||||
|
||||
if (userSettings.value.theme == 'TANDOOR') {
|
||||
theme.global.name.value = 'light'
|
||||
|
||||
if (customStyleTag) {
|
||||
document.head.removeChild(customStyleTag)
|
||||
}
|
||||
} else if (userSettings.value.theme == 'TANDOOR_DARK') {
|
||||
theme.global.name.value = 'dark'
|
||||
|
||||
if (!customStyleTag) {
|
||||
const styleTag = document.createElement('style')
|
||||
styleTag.id = "id_style_custom_css"
|
||||
styleTag.innerHTML = tandoorDarkCustomCss
|
||||
document.head.appendChild(styleTag)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@ export default createVuetify({
|
||||
edit: '#385f84',
|
||||
delete: '#a7240e',
|
||||
cancel: '#eaaa21',
|
||||
|
||||
recipeImagePlaceholderBg: '#ffffff',
|
||||
},
|
||||
},
|
||||
dark: {
|
||||
@@ -57,6 +59,8 @@ export default createVuetify({
|
||||
edit: '#385f84',
|
||||
delete: '#a7240e',
|
||||
cancel: '#eaaa21',
|
||||
|
||||
recipeImagePlaceholderBg: '#212121',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user