tweak limit warnings

This commit is contained in:
vabene1111
2025-01-13 17:56:56 +01:00
parent 1822a62e14
commit 3e55e04fbd
35 changed files with 104 additions and 15 deletions

View File

@@ -78,12 +78,18 @@
</v-menu>
</v-avatar>
</v-app-bar>
<v-app-bar color="warning" density="compact" v-if="useUserPreferenceStore().activeSpace.maxRecipes == 10 && useUserPreferenceStore().serverSettings.hosted">
<v-app-bar color="info" density="compact" v-if="useUserPreferenceStore().activeSpace.maxRecipes == 10 && useUserPreferenceStore().serverSettings.hosted">
<p class="text-center w-100">
{{ $t('HostedFreeVersion') }}
<v-btn color="success" variant="flat" href="https://tandoor.dev/manage">{{ $t('UpgradeNow') }}</v-btn>
</p>
</v-app-bar>
<v-app-bar color="warning" density="compact" v-if="isSpaceAboveLimit(useUserPreferenceStore().activeSpace)">
<p class="text-center w-100">
{{ $t('SpaceLimitExceeded') }}
<v-btn color="success" variant="flat" :to="{name: 'view_settings_space'}">{{ $t('SpaceSettings') }}</v-btn>
</p>
</v-app-bar>
<v-app-bar color="info" density="compact" v-if="useUserPreferenceStore().activeSpace.message != ''">
<p class="text-center w-100">
@@ -172,6 +178,7 @@ import {useDjangoUrls} from "@/composables/useDjangoUrls";
import {onMounted, ref} from "vue";
import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore";
import {ApiApi, Space} from "@/openapi";
import {isSpaceAboveLimit, isSpaceAtLimit} from "@/utils/logic_utils";
const {lgAndUp} = useDisplay()
const {getDjangoUrl} = useDjangoUrls()

View File

@@ -17,7 +17,7 @@
<v-tab value="settings">{{ $t('Settings') }}</v-tab>
</v-tabs>
<v-card-text>
<v-card-text v-if="!isSpaceAtRecipeLimit(useUserPreferenceStore().activeSpace)">
<v-tabs-window v-model="tab">
<v-tabs-window-item value="recipe">
@@ -26,7 +26,7 @@
<v-textarea :label="$t('Description')" v-model="editingObj.description" clearable counter="512" rows="2"></v-textarea>
<v-row>
<v-col cols="12" md="6" >
<v-col cols="12" md="6">
<v-file-upload v-model="file" @update:modelValue="updateUserFileName"
:title="(mobile) ? $t('Select_File') : $t('DragToUpload')"
:browse-text="$t('Select_File')"
@@ -37,7 +37,10 @@
</v-col>
<v-col cols="12" md="6" v-if="editingObj.image">
<v-img style="max-height: 180px" cover class="mb-2" :src="editingObj.image">
<v-btn color="delete" class="float-right mt-2 mr-2" prepend-icon="$delete" v-if="editingObj.image" @click="deleteImage()">{{ $t('Delete') }}</v-btn>
<v-btn color="delete" class="float-right mt-2 mr-2" prepend-icon="$delete" v-if="editingObj.image" @click="deleteImage()">{{
$t('Delete')
}}
</v-btn>
</v-img>
</v-col>
</v-row>
@@ -97,12 +100,18 @@
<v-text-field :label="$t('Imported_From')" v-model="editingObj.sourceUrl"></v-text-field>
<v-checkbox :label="$t('Private_Recipe')" :hint="$t('Private_Recipe_Help')" persistent-hint v-model="editingObj._private"></v-checkbox>
<model-select mode="tags" model="User" :label="$t('Private_Recipe')" :hint="$t('Private_Recipe_Help')" persistent-hint v-model="editingObj.shared"
append-to-body></model-select>
append-to-body></model-select>
</v-form>
</v-tabs-window-item>
</v-tabs-window>
</v-card-text>
<v-card-text v-if="isSpaceAtRecipeLimit(useUserPreferenceStore().activeSpace)">
<v-alert color="warning" icon="fa-solid fa-triangle-exclamation">
{{$t('SpaceLimitReached')}}
<v-btn color="success" variant="flat" :to="{name: 'view_settings_space'}">{{ $t('SpaceSettings') }}</v-btn>
</v-alert>
</v-card-text>
</model-editor-base>
<v-dialog max-width="600px" v-model="dialogStepManager">
@@ -139,6 +148,8 @@ import {useFileApi} from "@/composables/useFileApi";
import {VFileUpload} from 'vuetify/labs/VFileUpload'
import ClosableHelpAlert from "@/components/display/ClosableHelpAlert.vue";
import {useDisplay} from "vuetify";
import {isSpaceAtRecipeLimit} from "@/utils/logic_utils";
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
const props = defineProps({

View File

@@ -8,7 +8,7 @@
<v-card>
<v-card-title><i class="fa-solid fa-book"></i> {{ $t('Recipes') }}</v-card-title>
<v-card-text>{{ $n(space.recipeCount) }} / {{ space.maxRecipes == 0 ? '∞' : $n(space.maxRecipes) }}</v-card-text>
<v-progress-linear color="success" height="10" :model-value="(space.recipeCount / space.maxRecipes) * 100"></v-progress-linear>
<v-progress-linear :color="isSpaceAboveRecipeLimit(space) ? 'error' : 'success'" height="10" :model-value="(space.recipeCount / space.maxRecipes) * 100"></v-progress-linear>
</v-card>
</v-col>
<v-col cols="12" md="4">
@@ -16,7 +16,7 @@
<v-card-title><i class="fa-solid fa-users"></i> {{ $t('Users') }}</v-card-title>
<v-card-text>{{ $n(space.userCount) }} / {{ space.maxUsers == 0 ? '∞' : $n(space.maxUsers) }}</v-card-text>
<v-progress-linear color="success" height="10" :model-value="(space.userCount / space.maxUsers) * 100"></v-progress-linear>
<v-progress-linear :color="isSpaceAboveUserLimit(space) ? 'error' : 'success'" height="10" :model-value="(space.userCount / space.maxUsers) * 100"></v-progress-linear>
</v-card>
</v-col>
<v-col cols="12" md="4">
@@ -26,7 +26,7 @@
MB
</v-card-text>
<v-card-text v-if="space.maxFileStorageMb == -1">{{ $t('file_upload_disabled') }}</v-card-text>
<v-progress-linear v-if="space.maxFileStorageMb > -1" color="success" height="10"
<v-progress-linear v-if="space.maxFileStorageMb > -1" :color="isSpaceAboveStorageLimit(space) ? 'error' : 'success'" height="10"
:model-value="(space.fileSizeMb / space.maxFileStorageMb) * 100"></v-progress-linear>
</v-card>
</v-col>
@@ -108,6 +108,7 @@ import {ApiApi, Space} from "@/openapi";
import {ErrorMessageType, PreparedMessage, useMessageStore} from "@/stores/MessageStore";
import UserFileField from "@/components/inputs/UserFileField.vue";
import ModelSelect from "@/components/inputs/ModelSelect.vue";
import {isSpaceAboveRecipeLimit, isSpaceAboveStorageLimit, isSpaceAboveUserLimit} from "@/utils/logic_utils";
const space = ref({} as Space)

View File

@@ -306,6 +306,8 @@
"Size": "",
"Social_Authentication": "",
"Sort_by_new": "",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -299,6 +299,8 @@
"Size": "Размер",
"Social_Authentication": "",
"Sort_by_new": "Сортиране по ново",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -383,6 +383,8 @@
"Size": "",
"Social_Authentication": "",
"Sort_by_new": "Ordenar a partir del més nou",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -379,6 +379,8 @@
"Size": "Velikost",
"Social_Authentication": "Přihlašování pomocí účtů sociálních sítí",
"Sort_by_new": "Seřadit od nejnovějšího",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -358,6 +358,8 @@
"Size": "Størrelse",
"Social_Authentication": "Social authenticering",
"Sort_by_new": "Sorter efter nylige",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -386,6 +386,8 @@
"Size": "Größe",
"Social_Authentication": "Login über Drittanbieter",
"Sort_by_new": "Nach Neueste sortieren",
"SpaceLimitExceeded": "Dein Space hat ein Limit überschritten, manche Funktionen wurden eingeschränkt.",
"SpaceLimitReached": "Dieser Space hat ein Limit erreicht. Es können keine neuen Objekte von diesem Typ angelegt werden.",
"SpaceMemberHelp": "Füge Benutzer hinzu indem du Einladungen erstellst und Sie an die gewünschte Person sendest.",
"SpaceMembers": "Space Mitglieder",
"SpaceSettings": "Space Einstellungen",

View File

@@ -350,6 +350,8 @@
"Size": "Μέγεθος",
"Social_Authentication": "Ταυτοποίηση μέσω κοινωνικών δικτύων",
"Sort_by_new": "Ταξινόμηση κατά νέο",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -385,6 +385,8 @@
"Size": "Size",
"Social_Authentication": "Social Authentication",
"Sort_by_new": "Sort by new",
"SpaceLimitExceeded": "Your space has surpassed one of its limits, some functions might be restricted.",
"SpaceLimitReached": "This Space has reached a limit. No more objects of this type can be created.",
"SpaceMemberHelp": "Add users to your space by creating an Invite Link and sending it to the person you want to add.",
"SpaceMembers": "Space Members",
"SpaceSettings": "Space Settings",

View File

@@ -382,6 +382,8 @@
"Size": "Tamaño",
"Social_Authentication": "Autenticación Social",
"Sort_by_new": "Ordenar por novedades",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -228,6 +228,8 @@
"Size": "Koko",
"Social_Authentication": "",
"Sort_by_new": "Lajittele uusien mukaan",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -383,6 +383,8 @@
"Size": "Taille",
"Social_Authentication": "Authentification Sociale",
"Sort_by_new": "Trier par nouveautés",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -384,6 +384,8 @@
"Size": "גודל",
"Social_Authentication": "אימות חברתי",
"Sort_by_new": "סדר ע\"י חדש",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -352,6 +352,8 @@
"Size": "Méret",
"Social_Authentication": "",
"Sort_by_new": "Rendezés legújabbak szerint",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -169,6 +169,8 @@
"Size": "",
"Social_Authentication": "",
"Sort_by_new": "Տեսակավորել ըստ նորերի",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -328,6 +328,8 @@
"Size": "Ukuran",
"Social_Authentication": "",
"Sort_by_new": "Urutkan berdasarkan baru",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -382,6 +382,8 @@
"Size": "",
"Social_Authentication": "",
"Sort_by_new": "",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -336,6 +336,8 @@
"Size": "Dimensione",
"Social_Authentication": "Autenticazione social",
"Sort_by_new": "Prima i nuovi",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -356,6 +356,8 @@
"Size": "",
"Social_Authentication": "",
"Sort_by_new": "Rūšiuoti pagal naujumą",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -348,6 +348,8 @@
"Size": "Størrelse",
"Social_Authentication": "",
"Sort_by_new": "Sorter etter nyest",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -352,6 +352,8 @@
"Size": "Grootte",
"Social_Authentication": "Authenticeren met sociale media-account",
"Sort_by_new": "Sorteer op nieuw",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -385,6 +385,8 @@
"Size": "Rozmiar",
"Social_Authentication": "Uwierzytelnianie społecznościowe",
"Sort_by_new": "Sortuj według nowych",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -293,6 +293,8 @@
"Size": "Tamanho",
"Social_Authentication": "",
"Sort_by_new": "Ordenar por mais recente",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -370,6 +370,8 @@
"Size": "Tamanho",
"Social_Authentication": "",
"Sort_by_new": "Ordenar por novos",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -340,6 +340,8 @@
"Size": "Marime",
"Social_Authentication": "Autentificare socială",
"Sort_by_new": "Sortare după nou",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -278,6 +278,8 @@
"Size": "Размер",
"Social_Authentication": "",
"Sort_by_new": "Сортировка по новизне",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -268,6 +268,8 @@
"Size": "Velikost",
"Social_Authentication": "",
"Sort_by_new": "Razvrsti po novih",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -385,6 +385,8 @@
"Size": "Storlek",
"Social_Authentication": "Social autentisering",
"Sort_by_new": "Sortera efter ny",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -384,6 +384,8 @@
"Size": "Boyut",
"Social_Authentication": "Sosyal Kimlik Doğrulama",
"Sort_by_new": "Yeniye göre sırala",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -314,6 +314,8 @@
"Size": "Розмір",
"Social_Authentication": "",
"Sort_by_new": "",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -378,6 +378,8 @@
"Size": "大小",
"Social_Authentication": "社交认证",
"Sort_by_new": "按新旧排序",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -139,6 +139,8 @@
"Size": "",
"Social_Authentication": "",
"Sort_by_new": "按最新排序",
"SpaceLimitExceeded": "",
"SpaceLimitReached": "",
"SpaceMemberHelp": "",
"SpaceMembers": "",
"SpaceSettings": "",

View File

@@ -26,30 +26,38 @@ export function isShoppingListFoodDelayed(slf: IShoppingListFood) {
* checks if the given space is above any of the configured limits
* @param space space to check limit for
*/
export function isSpaceAtLimit(space: Space) {
return isSpaceAtUserLimit(space) || isSpaceAtRecipeLimit(space) || isSpaceAtStorageLimit(space)
export function isSpaceAboveLimit(space: Space) {
return isSpaceAboveUserLimit(space) || isSpaceAboveRecipeLimit(space) || isSpaceAboveStorageLimit(space)
}
/**
* checks if the given space is above the user limit
* @param space space to check limit for
*/
export function isSpaceAtUserLimit(space: Space) {
return space.maxUsers > space.userCount && space.maxUsers > 0
export function isSpaceAboveUserLimit(space: Space) {
return space.userCount > space.maxUsers && space.maxUsers > 0
}
/**
* checks if the given space is above the recipe limit
* @param space space to check limit for
*/
export function isSpaceAboveRecipeLimit(space: Space) {
return space.recipeCount > space.maxRecipes && space.maxRecipes > 0
}
/**
* checks if the given space is at the recipe limit
* @param space space to check limit for
*/
export function isSpaceAtRecipeLimit(space: Space) {
return space.maxRecipes > space.recipeCount && space.maxRecipes > 0
return space.recipeCount >= space.maxRecipes && space.maxRecipes > 0
}
/**
* checks if the given space is above the file storage limit
* @param space space to check limit for
*/
export function isSpaceAtStorageLimit(space: Space) {
return space.maxFileStorageMb > space.fileSizeMb && space.maxFileStorageMb > 0
export function isSpaceAboveStorageLimit(space: Space) {
return space.fileSizeMb > space.maxFileStorageMb && space.maxFileStorageMb > 0
}