WIP - record sharing

This commit is contained in:
Francisco Gaona
2025-12-28 21:31:02 +01:00
parent 358a216015
commit c21274c86f
5 changed files with 647 additions and 133 deletions

View File

@@ -3,14 +3,18 @@ import { ref, computed, onMounted, watch, nextTick } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useApi } from '@/composables/useApi'
import { useFields, useViewState } from '@/composables/useFieldViews'
import { useAuth } from '@/composables/useAuth'
import ListView from '@/components/views/ListView.vue'
import DetailView from '@/components/views/DetailViewEnhanced.vue'
import EditView from '@/components/views/EditViewEnhanced.vue'
import RecordShareManager from '@/components/RecordShareManager.vue'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
const route = useRoute()
const router = useRouter()
const { api } = useApi()
const { buildListViewConfig, buildDetailViewConfig, buildEditViewConfig } = useFields()
const { getUser } = useAuth()
// Use breadcrumbs composable
const { setBreadcrumbs } = useBreadcrumbs()
@@ -131,6 +135,38 @@ const canCreate = computed(() => {
return result
})
// Check if user can share the record
const canShareRecord = computed(() => {
if (!currentRecord.value) return false
const user = getUser()
if (!user) return false
// User can share if they own the record
return currentRecord.value.ownerId === user.id
})
// Get current user's permissions for the record
const currentUserPermissions = computed(() => {
if (!objectDefinition.value || !currentRecord.value) {
return { canRead: false, canUpdate: false, canDelete: false }
}
const user = getUser()
const isOwner = user ? currentRecord.value.ownerId === user.id : false
const accessModel = objectDefinition.value.access_model || objectDefinition.value.accessModel
const publicRead = objectAccess.value?.publicRead === true || objectAccess.value?.publicRead === 1
const publicUpdate = objectAccess.value?.publicUpdate === true || objectAccess.value?.publicUpdate === 1
const publicDelete = objectAccess.value?.publicDelete === true || objectAccess.value?.publicDelete === 1
return {
canRead: isOwner || publicRead || accessModel === 'public',
canUpdate: isOwner || publicUpdate,
canDelete: isOwner || publicDelete
}
})
// Active tab for detail view with sharing
const activeTab = ref('details')
// Fetch object definition
const fetchObjectDefinition = async () => {
try {
@@ -293,18 +329,37 @@ onMounted(async () => {
@delete="handleDelete"
/>
<!-- Detail View -->
<DetailView
v-else-if="view === 'detail' && detailConfig && currentRecord"
:config="detailConfig"
:data="currentRecord"
:loading="dataLoading"
:object-id="objectDefinition?.id"
:base-url="`/runtime/objects`"
@edit="handleEdit"
@delete="() => handleDelete([currentRecord])"
@back="handleBack"
/>
<!-- Detail View with Tabs -->
<div v-else-if="view === 'detail' && detailConfig && currentRecord">
<Tabs v-model="activeTab" class="w-full">
<TabsList class="grid w-full mb-6" :class="canShareRecord ? 'grid-cols-2' : 'grid-cols-1'">
<TabsTrigger value="details">Details</TabsTrigger>
<TabsTrigger v-if="canShareRecord" value="sharing">Sharing</TabsTrigger>
</TabsList>
<TabsContent value="details">
<DetailView
:config="detailConfig"
:data="currentRecord"
:loading="dataLoading"
:object-id="objectDefinition?.id"
:base-url="`/runtime/objects`"
@edit="handleEdit"
@delete="() => handleDelete([currentRecord])"
@back="handleBack"
/>
</TabsContent>
<TabsContent v-if="canShareRecord" value="sharing">
<RecordShareManager
:object-api-name="objectApiName"
:record-id="recordId!"
:current-user-permissions="currentUserPermissions"
:fields="objectDefinition?.fields || []"
/>
</TabsContent>
</Tabs>
</div>
<!-- Edit View -->
<div v-else-if="(view === 'edit' || recordId === 'new') && editConfig">