- Add usePermissions composable (isAdmin, canEdit, canView) - Password-protected profile login with modal on profiles page - Disable all form fields for ROLE_VIEWER across edit/create pages - Show navigation buttons (Modifier/Consulter) for all roles, hide delete for viewers - Add readonly prop to ModelTypeForm for category pages - Disable modal fields (sites, constructeurs) for viewers - Guard /admin routes in middleware Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
81 lines
1.8 KiB
TypeScript
81 lines
1.8 KiB
TypeScript
import { ref } from 'vue'
|
|
import { useApi } from './useApi'
|
|
|
|
export interface AdminProfile {
|
|
id: string
|
|
firstName: string
|
|
lastName: string
|
|
email: string | null
|
|
isActive: boolean
|
|
hasPassword: boolean
|
|
roles: string[]
|
|
createdAt: string
|
|
updatedAt: string
|
|
}
|
|
|
|
export function useAdminProfiles() {
|
|
const { get, post, put } = useApi()
|
|
const profiles = ref<AdminProfile[]>([])
|
|
const loading = ref(false)
|
|
|
|
const fetchAll = async () => {
|
|
loading.value = true
|
|
try {
|
|
const result = await get<AdminProfile[]>('/admin/profiles')
|
|
if (result.success && result.data) {
|
|
profiles.value = result.data
|
|
}
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
const createProfile = async (data: {
|
|
firstName: string
|
|
lastName: string
|
|
email?: string
|
|
password?: string
|
|
role?: string
|
|
}) => {
|
|
const result = await post<AdminProfile>('/admin/profiles', data)
|
|
if (result.success) {
|
|
await fetchAll()
|
|
}
|
|
return result
|
|
}
|
|
|
|
const updateRole = async (id: string, role: string) => {
|
|
const result = await put<AdminProfile>(`/admin/profiles/${id}/role`, { role })
|
|
if (result.success) {
|
|
await fetchAll()
|
|
}
|
|
return result
|
|
}
|
|
|
|
const setPassword = async (id: string, password: string) => {
|
|
const result = await put<AdminProfile>(`/admin/profiles/${id}/password`, { password })
|
|
if (result.success) {
|
|
await fetchAll()
|
|
}
|
|
return result
|
|
}
|
|
|
|
const deactivateProfile = async (id: string) => {
|
|
const result = await put<AdminProfile>(`/admin/profiles/${id}/deactivate`, {})
|
|
if (result.success) {
|
|
await fetchAll()
|
|
}
|
|
return result
|
|
}
|
|
|
|
return {
|
|
profiles,
|
|
loading,
|
|
fetchAll,
|
|
createProfile,
|
|
updateRole,
|
|
setPassword,
|
|
deactivateProfile,
|
|
}
|
|
}
|