Add more permissions

This commit is contained in:
Simon Pocrnjič
2025-10-31 10:16:38 +01:00
parent 7d4d18143d
commit ed4f67effb
18 changed files with 404 additions and 193 deletions
@@ -319,7 +319,7 @@ watch(
:auto-position="true"
:teleport-target="'body'"
:inline="false"
:auto-apply="false"
:auto-apply="true"
:fixed="false"
:close-on-auto-apply="true"
:close-on-scroll="true"
@@ -14,6 +14,7 @@ library.add(faTrash, faEllipsisVertical, faCopy);
const props = defineProps({
client_case: Object,
activities: Object,
edit: Boolean,
});
const fmtDate = (d) => {
@@ -91,11 +92,11 @@ const copyToClipboard = async (text) => {
// You could add a toast notification here if available
} catch (err) {
// Fallback for older browsers
const textArea = document.createElement('textarea');
const textArea = document.createElement("textarea");
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
document.execCommand('copy');
document.execCommand("copy");
document.body.removeChild(textArea);
}
};
@@ -115,7 +116,7 @@ const copyToClipboard = async (text) => {
<th>Opomba</th>
<th>Obljuba</th>
<th>Dodal</th>
<th class="w-8"></th>
<th class="w-8" v-if="edit"></th>
</tr>
</thead>
<tbody>
@@ -174,7 +175,9 @@ const copyToClipboard = async (text) => {
</template>
<template #content>
<div class="relative" @click.stop>
<div class="flex items-center justify-between p-1 border-b border-gray-200">
<div
class="flex items-center justify-between p-1 border-b border-gray-200"
>
<span class="text-xs font-medium text-gray-600">Opomba</span>
<button
@click="copyToClipboard(row.note)"
@@ -226,7 +229,7 @@ const copyToClipboard = async (text) => {
>
</div>
</td>
<td class="py-2 pl-2 pr-2 align-middle text-right">
<td class="py-2 pl-2 pr-2 align-middle text-right" v-if="edit">
<Dropdown align="right" width="30">
<template #trigger>
<button
@@ -35,6 +35,7 @@ const props = defineProps({
segments: { type: Array, default: () => [] },
all_segments: { type: Array, default: () => [] },
templates: { type: Array, default: () => [] }, // active document templates (latest per slug)
edit: { type: Boolean, default: () => false },
});
// Debug: log incoming contract balances (remove after fix)
@@ -484,7 +485,7 @@ const closePaymentsDialog = () => {
>
Opis</FwbTableHeadCell
>
<FwbTableHeadCell class="w-px" />
<FwbTableHeadCell class="w-px" v-if="edit" />
</FwbTableHead>
<FwbTableBody>
<template v-for="(c, i) in contracts" :key="c.uuid || i">
@@ -497,7 +498,7 @@ const closePaymentsDialog = () => {
<span class="text-gray-700">{{
contractActiveSegment(c)?.name || "-"
}}</span>
<Dropdown align="left">
<Dropdown align="left" v-if="edit">
<template #trigger>
<button
type="button"
@@ -701,7 +702,7 @@ const closePaymentsDialog = () => {
</Dropdown>
</div>
</FwbTableCell>
<FwbTableCell class="text-right whitespace-nowrap">
<FwbTableCell class="text-right whitespace-nowrap" v-if="edit">
<Dropdown align="right" width="56">
<template #trigger>
<button
+31 -14
View File
@@ -13,11 +13,12 @@ import DocumentEditDialog from "@/Components/DocumentEditDialog.vue";
import DocumentUploadDialog from "@/Components/DocumentUploadDialog.vue";
import DocumentViewerDialog from "@/Components/DocumentViewerDialog.vue";
import { classifyDocument } from "@/Services/documents";
import { router, useForm } from "@inertiajs/vue3";
import { router, useForm, usePage } from "@inertiajs/vue3";
import { AngleDownIcon, AngleUpIcon } from "@/Utilities/Icons";
import Pagination from "@/Components/Pagination.vue";
import ConfirmDialog from "@/Components/ConfirmDialog.vue";
import DialogModal from "@/Components/DialogModal.vue";
import { hasPermission } from "@/Services/permissions";
const props = defineProps({
client: Object,
@@ -35,6 +36,7 @@ const props = defineProps({
contract_doc_templates: { type: Array, default: () => [] },
});
const page = usePage();
const showUpload = ref(false);
const openUpload = () => {
showUpload.value = true;
@@ -47,20 +49,25 @@ const onUploaded = () => {
router.reload({ only: ["documents"] });
};
// Expose as a callable computed: use in templates as hasPerm('permission-slug')
const hasPerm = computed(() => (permission) =>
hasPermission(page.props.auth?.user, permission)
);
// Document edit dialog state
const showDocEdit = ref(false)
const editingDoc = ref(null)
const showDocEdit = ref(false);
const editingDoc = ref(null);
const openDocEdit = (doc) => {
editingDoc.value = doc
showDocEdit.value = true
}
editingDoc.value = doc;
showDocEdit.value = true;
};
const closeDocEdit = () => {
showDocEdit.value = false
editingDoc.value = null
}
showDocEdit.value = false;
editingDoc.value = null;
};
const onDocSaved = () => {
router.reload({ only: ['documents'] })
}
router.reload({ only: ["documents"] });
};
const viewer = ref({ open: false, src: "", title: "" });
const openViewer = (doc) => {
@@ -236,7 +243,11 @@ const submitAttachSegment = () => {
class="bg-white overflow-hidden shadow-xl sm:rounded-lg border-l-4 border-blue-400"
>
<div class="mx-auto max-w-4x1 p-3">
<PersonInfoGrid :types="types" :person="client.person" />
<PersonInfoGrid
:types="types"
:person="client.person"
:edit="hasPerm('client-edit')"
/>
</div>
</div>
</div>
@@ -274,6 +285,7 @@ const submitAttachSegment = () => {
:types="types"
tab-color="red-600"
:person="client_case.person"
:person-edit="hasPerm('person-edit')"
:enable-sms="true"
:client-case-uuid="client_case.uuid"
/>
@@ -289,7 +301,7 @@ const submitAttachSegment = () => {
<SectionTitle>
<template #title> Pogodbe </template>
</SectionTitle>
<div class="flex items-center gap-2">
<div class="flex items-center gap-2" v-if="hasPerm('contract-edit')">
<FwbButton @click="openDrawerCreateContract">Nova</FwbButton>
<FwbButton
color="light"
@@ -311,6 +323,7 @@ const submitAttachSegment = () => {
:contract_types="contract_types"
:segments="segments"
:templates="contract_doc_templates"
:edit="hasPerm('contract-edit')"
@edit="openDrawerEditContract"
@delete="requestDeleteContract"
@add-activity="openDrawerAddActivity"
@@ -330,7 +343,11 @@ const submitAttachSegment = () => {
</SectionTitle>
<FwbButton @click="openDrawerAddActivity">Nova</FwbButton>
</div>
<ActivityTable :client_case="client_case" :activities="activities" />
<ActivityTable
:client_case="client_case"
:activities="activities"
:edit="hasPerm('activity-edit')"
/>
<Pagination
:links="activities.links"
:from="activities.from"