[pricelist] add permissions
This commit is contained in:
parent
cee6eda585
commit
8b21ccf978
|
@ -19,7 +19,7 @@
|
|||
</q-menu>
|
||||
</q-btn>
|
||||
<q-btn
|
||||
v-if="!public && !nodetails && editable"
|
||||
v-if="!public && !nodetails && editable && hasPermission(PERMISSIONS.CREATE)"
|
||||
color="primary"
|
||||
round
|
||||
icon="mdi-plus"
|
||||
|
@ -155,6 +155,8 @@ import { filter, Search } from '../utils/filter';
|
|||
import { Notify } from 'quasar';
|
||||
import { sort } from '../utils/sort';
|
||||
import { DeleteObjects } from 'src/plugins/pricelist/utils/utils';
|
||||
import { hasPermission } from 'src/utils/permission';
|
||||
import { PERMISSIONS } from 'src/plugins/pricelist/permissions';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'CalculationTable',
|
||||
|
@ -185,7 +187,6 @@ export default defineComponent({
|
|||
void store.getDrinks();
|
||||
});
|
||||
|
||||
|
||||
const columns = [
|
||||
{
|
||||
name: 'picture',
|
||||
|
@ -498,6 +499,8 @@ export default defineComponent({
|
|||
notLoading,
|
||||
getImageLoading,
|
||||
newDrink,
|
||||
hasPermission,
|
||||
PERMISSIONS,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
|
|
@ -32,7 +32,7 @@ export default defineComponent({
|
|||
props: {
|
||||
steps: {
|
||||
type: Array as PropType<Array<string>>,
|
||||
default: undefined
|
||||
default: undefined,
|
||||
},
|
||||
editable: {
|
||||
type: Boolean,
|
||||
|
|
|
@ -26,7 +26,10 @@
|
|||
step="0.001"
|
||||
@update:model-value="updateVolume(volume)"
|
||||
/>
|
||||
<div v-if="deleteable && editable" class="q-pa-sm col-2 text-right">
|
||||
<div
|
||||
v-if="deleteable && editable && hasPermission(PERMISSIONS.DELETE_VOLUME)"
|
||||
class="q-pa-sm col-2 text-right"
|
||||
>
|
||||
<q-btn round icon="mdi-delete" size="sm" color="negative" @click="deleteVolume">
|
||||
<q-tooltip> Abgabe entfernen </q-tooltip>
|
||||
</q-btn>
|
||||
|
@ -41,7 +44,12 @@
|
|||
<div class="q-pa-sm">
|
||||
<div v-for="(price, index) in volume.prices" :key="price.id">
|
||||
<div class="fit row justify-around q-py-sm">
|
||||
<div v-if="!editable" class="text-body1 col-3">{{ price.price.toFixed(2) }}€</div>
|
||||
<div
|
||||
v-if="!editable || !hasPermission(PERMISSIONS.EDIT_PRICE)"
|
||||
class="text-body1 col-3"
|
||||
>
|
||||
{{ price.price.toFixed(2) }}€
|
||||
</div>
|
||||
<q-input
|
||||
v-else
|
||||
v-model.number="price.price"
|
||||
|
@ -58,13 +66,16 @@
|
|||
<div class="text-body1 col-2">
|
||||
<q-toggle
|
||||
v-model="price.public"
|
||||
:disable="!editable"
|
||||
:disable="!editable || !hasPermission(PERMISSIONS.EDIT_PRICE)"
|
||||
checked-icon="mdi-earth"
|
||||
unchecked-icon="mdi-earth-off"
|
||||
@update:model-value="change"
|
||||
/>
|
||||
</div>
|
||||
<div v-if="!editable" class="text-body1 col-5">
|
||||
<div
|
||||
v-if="!editable || !hasPermission(PERMISSIONS.EDIT_PRICE)"
|
||||
class="text-body1 col-5"
|
||||
>
|
||||
{{ price.description }}
|
||||
</div>
|
||||
<q-input
|
||||
|
@ -76,7 +87,7 @@
|
|||
label="Beschreibung"
|
||||
@update:model-value="change"
|
||||
/>
|
||||
<div v-if="editable" class="col-1">
|
||||
<div v-if="editable && hasPermission(PERMISSIONS.DELETE_PRICE)" class="col-1">
|
||||
<q-btn round icon="mdi-delete" color="negative" size="xs" @click="deletePrice(price)">
|
||||
<q-tooltip> Preis entfernen </q-tooltip>
|
||||
</q-btn>
|
||||
|
@ -90,7 +101,10 @@
|
|||
>
|
||||
Einer der Preise ist unterhalb des niedrigsten minimal Preises.
|
||||
</div>
|
||||
<div v-if="editable" class="full-width row justify-end text-right">
|
||||
<div
|
||||
v-if="editable && hasPermission(PERMISSIONS.EDIT_PRICE)"
|
||||
class="full-width row justify-end text-right"
|
||||
>
|
||||
<q-btn round icon="mdi-plus" size="sm" color="primary">
|
||||
<q-tooltip> Preis hinzufügen </q-tooltip>
|
||||
<q-menu anchor="center middle" self="center middle">
|
||||
|
@ -103,7 +117,7 @@
|
|||
<ingredients
|
||||
v-if="!public && !costPerVolume"
|
||||
v-model="volume.ingredients"
|
||||
:editable="editable"
|
||||
:editable="editable && hasPermission(PERMISSIONS.EDIT_INGREDIENTS_DRINK)"
|
||||
@update="updateVolume(volume)"
|
||||
@delete-ingredient="deleteIngredient"
|
||||
/>
|
||||
|
@ -128,6 +142,9 @@ import { DrinkPriceVolume } from 'src/plugins/pricelist/store';
|
|||
import Ingredients from 'src/plugins/pricelist/components/CalculationTable/Ingredients.vue';
|
||||
import NewPrice from 'src/plugins/pricelist/components/CalculationTable/NewPrice.vue';
|
||||
import { calc_volume, clone } from '../../utils/utils';
|
||||
import { hasPermission } from 'src/utils/permission';
|
||||
import { PERMISSIONS } from '../../permissions';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'DrinkPriceVolume',
|
||||
components: { Ingredients, NewPrice },
|
||||
|
@ -138,7 +155,7 @@ export default defineComponent({
|
|||
},
|
||||
costPerVolume: {
|
||||
type: undefined,
|
||||
default: undefined
|
||||
default: undefined,
|
||||
},
|
||||
editable: {
|
||||
type: Boolean,
|
||||
|
@ -308,6 +325,8 @@ export default defineComponent({
|
|||
deleteIngredient,
|
||||
change,
|
||||
isUnderMinPrice,
|
||||
hasPermission,
|
||||
PERMISSIONS,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
|
|
@ -126,7 +126,7 @@
|
|||
<drink-price-volumes
|
||||
v-model="edit_volumes"
|
||||
:cost-per-volume="cost_per_volume"
|
||||
editable
|
||||
:editable="hasPermission(PERMISSIONS.EDIT_VOLUME)"
|
||||
@update="updateVolume"
|
||||
@delete-volume="deleteVolume"
|
||||
@delete-price="deletePrice"
|
||||
|
@ -150,6 +150,9 @@ import DrinkPriceVolumes from './CalculationTable/DrinkPriceVolumes.vue';
|
|||
import { clone, calc_min_prices, DeleteObjects, calc_cost_per_volume } from '../utils/utils';
|
||||
import BuildManual from 'src/plugins/pricelist/components/CalculationTable/BuildManual.vue';
|
||||
import config from 'src/config';
|
||||
import { hasPermission } from 'src/utils/permission';
|
||||
import { PERMISSIONS } from 'src/plugins/pricelist/permissions';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'DrinkModify',
|
||||
components: { BuildManual, DrinkPriceVolumes },
|
||||
|
@ -343,6 +346,8 @@ export default defineComponent({
|
|||
edit_volumes,
|
||||
key,
|
||||
hasIngredients,
|
||||
hasPermission,
|
||||
PERMISSIONS,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
|
|
@ -56,6 +56,7 @@ import CalculationTable from 'src/plugins/pricelist/components/CalculationTable.
|
|||
import ExtraIngredients from 'src/plugins/pricelist/components/ExtraIngredients.vue';
|
||||
import Tags from '../components/Tags.vue';
|
||||
import { usePricelistStore } from 'src/plugins/pricelist/store';
|
||||
import { hasPermissions } from 'src/utils/permission';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'Settings',
|
||||
|
@ -64,6 +65,7 @@ export default defineComponent({
|
|||
interface Tab {
|
||||
name: string;
|
||||
label: string;
|
||||
permissions: Array<string>;
|
||||
}
|
||||
const store = usePricelistStore();
|
||||
onBeforeMount(() => {
|
||||
|
@ -90,13 +92,36 @@ export default defineComponent({
|
|||
},
|
||||
});
|
||||
|
||||
const tabs: Tab[] = [
|
||||
{ name: 'pricelist', label: 'Getränke' },
|
||||
{ name: 'extra_ingredients', label: 'Zutaten' },
|
||||
{ name: 'drink_types', label: 'Getränketypen' },
|
||||
{ name: 'tags', label: 'Tags' },
|
||||
const _tabs: Tab[] = [
|
||||
{ name: 'pricelist', label: 'Getränke', permissions: ['drink_edit'] },
|
||||
{ name: 'extra_ingredients', label: 'Zutaten', permissions: [] },
|
||||
{
|
||||
name: 'drink_types',
|
||||
label: 'Getränketypen',
|
||||
permissions: ['drink_type_edit', 'drink_type_delete'],
|
||||
},
|
||||
{
|
||||
name: 'tags',
|
||||
label: 'Tags',
|
||||
permissions: ['drink_tag_edit', 'drink_tag_create', 'drink_tag_delete'],
|
||||
},
|
||||
];
|
||||
|
||||
const tabs = computed(() => {
|
||||
const retVal: Tab[] = [];
|
||||
_tabs.forEach((tab) => {
|
||||
if (tab.permissions.length > 0) {
|
||||
if (hasPermissions(tab.permissions)) {
|
||||
retVal.push(tab);
|
||||
}
|
||||
}
|
||||
if (tab.permissions.length === 0) {
|
||||
retVal.push(tab);
|
||||
}
|
||||
});
|
||||
return retVal;
|
||||
});
|
||||
|
||||
const tab = ref<string>('pricelist');
|
||||
|
||||
return { tabs, tab, showDrawer };
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
export const PERMISSIONS = {
|
||||
CREATE: 'drink_create',
|
||||
|
||||
EDIT: 'drink_edit',
|
||||
|
||||
DELETE: 'drink_delete',
|
||||
|
||||
CREATE_TAG: 'drink_tag_create',
|
||||
|
||||
EDIT_PRICE: 'edit_price',
|
||||
DELETE_PRICE: 'delete_price',
|
||||
|
||||
EDIT_VOLUME: 'edit_volume',
|
||||
DELETE_VOLUME: 'delete_volume',
|
||||
|
||||
EDIT_INGREDIENTS_DRINK: 'edit_ingredients_drink',
|
||||
DELETE_INGREDIENTS_DRINK: 'delete_ingredients_drink',
|
||||
|
||||
EDIT_INGREDIENTS: 'edit_ingredients',
|
||||
DELETE_INGREDIENTS: 'delete_ingredients',
|
||||
|
||||
EDIT_TAG: 'drink_tag_edit',
|
||||
|
||||
DELETE_TAG: 'drink_tag_delete',
|
||||
|
||||
CREATE_TYPE: 'drink_type_create',
|
||||
|
||||
EDIT_TYPE: 'drink_type_edit',
|
||||
|
||||
DELETE_TYPE: 'drink_type_delete',
|
||||
|
||||
EDIT_MIN_PRICES: 'edit_min_prices',
|
||||
};
|
|
@ -48,7 +48,7 @@ export const innerRoutes: FG_Plugin.MenuRoute[] = [
|
|||
title: 'Einstellungen',
|
||||
icon: 'mdi-coffee-to-go',
|
||||
shortcut: false,
|
||||
permissions: ['user'],
|
||||
permissions: ['drink_edit', 'drink_tag_edit'],
|
||||
route: {
|
||||
path: 'settings',
|
||||
name: 'drinks-settings',
|
||||
|
|
Loading…
Reference in New Issue