"Add canEditBooking function to enhance permission checks in DepartmentDashboardOrderBooking.vue; update editable fields, actions, and UI elements to respect booking edit permissions."

This commit is contained in:
Jeppe Bundgaard
2025-11-11 10:06:18 +01:00
parent f68791d552
commit 723a3447d2
@@ -126,6 +126,13 @@ const total = computed(() => {
return (items.value || []).reduce((sum, it: any) => sum + (parseFloat(it.price || 0) * (parseInt(it.quantity || 1))), 0);
});
const canEditBooking = () => {
// Admins can always edit
if (SessionUser.canAccessAdmin() && SessionUser.hasPermission('edit_bookings')) return true;
if (!!booking.value.order_id) return false; // Linked to order, restrict edits for users
if (SessionUser.hasPermission('edit_own_bookings')) return true;
}
watch(() => router.currentRoute.value.params.bookingId, (val) => {
bookingId.value = val as any;
getBooking();
@@ -167,6 +174,7 @@ onMounted(async () => {
column="department"
:parse-function="(value) => value ? `${getDepartmentName(value) || value}` : 'Ingen afdeling valgt'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
<tr>
@@ -177,6 +185,7 @@ onMounted(async () => {
column="datetime"
:parse-function="(value) => value ? `${value}` : 'Ingen dato valgt'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
<tr>
@@ -187,6 +196,7 @@ onMounted(async () => {
column="reg_1"
:parse-function="(value) => value || 'Ingen registreret'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
<tr>
@@ -197,6 +207,7 @@ onMounted(async () => {
column="reg_2"
:parse-function="(value) => value || '-'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
<tr>
@@ -207,6 +218,7 @@ onMounted(async () => {
column="po"
:parse-function="(value) => value || '-'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
<tr>
@@ -217,6 +229,7 @@ onMounted(async () => {
column="reference"
:parse-function="(value) => value || '-'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
<tr>
@@ -228,6 +241,7 @@ onMounted(async () => {
column="note"
:parse-function="(value) => value || '-'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
<tr>
@@ -238,6 +252,7 @@ onMounted(async () => {
column="pickup"
:parse-function="(value) => value ? 'Ja' : 'Nej'"
:edit-function="SessionUser.objects.order_bookings.showEditObjectFieldForm"
:permission-check-function="() => canEditBooking()"
/>
</tr>
</tbody>
@@ -271,14 +286,14 @@ onMounted(async () => {
</td>
<td class="has-text-centered">
<div class="buttons are-small is-centered">
<button class="button" :disabled="saving" @click="onChangeQty(index, -1)"><i class="fas fa-minus"></i></button>
<button class="button" :disabled="saving || !canEditBooking()" @click="onChangeQty(index, -1)"><i class="fas fa-minus"></i></button>
<span class="button is-static">{{ item.quantity || 1 }}</span>
<button class="button" :disabled="saving" @click="onChangeQty(index, +1)"><i class="fas fa-plus"></i></button>
<button class="button" :disabled="saving || !canEditBooking()" @click="onChangeQty(index, +1)"><i class="fas fa-plus"></i></button>
</div>
</td>
<td class="has-text-right">{{ (parseFloat(item.price || 0) * (parseInt(item.quantity || 1))).toLocaleString('da-DK', { style: 'currency', currency: 'DKK' }) }}</td>
<td class="has-text-right">
<button class="button is-small is-danger" :disabled="saving" @click="onRemoveItem(index)">
<button class="button is-small is-danger" :disabled="saving || !canEditBooking()" @click="onRemoveItem(index)">
<span class="icon"><i class="fas fa-trash"></i></span>
</button>
</td>
@@ -293,17 +308,17 @@ onMounted(async () => {
<div class="field is-grouped">
<div class="control is-expanded">
<div class="select is-fullwidth">
<select v-model.number="selectedProductId">
<select v-model.number="selectedProductId" :disabled="saving || !canEditBooking()">
<option :value="null">Vælg produkt…</option>
<option v-for="p in products" :key="p.id" :value="p.id">{{ p.name }} — {{ p.price?.toLocaleString('da-DK', { style: 'currency', currency: 'DKK' }) }}</option>
</select>
</div>
</div>
<div class="control">
<input class="input" type="number" min="1" v-model.number="selectedQuantity" style="width:100px" />
<input class="input" type="number" min="1" v-model.number="selectedQuantity" style="width:100px" :disabled="saving || !canEditBooking()" />
</div>
<div class="control">
<button class="button is-primary" :class="{ 'is-loading': saving }" :disabled="!selectedProductId || selectedQuantity < 1" @click="onAddItem">
<button class="button is-primary" :class="{ 'is-loading': saving }" :disabled="(!selectedProductId || selectedQuantity < 1) || !canEditBooking()" @click="onAddItem">
Tilføj
</button>
</div>