"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:
+21
-6
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user