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