Files
service-finder/frontend_admin/.nuxt/dist/server/_nuxt/index-DN4o4Z9u.js.map.json
2026-06-29 14:11:15 +00:00

1 line
64 KiB
JSON

{"file":"index-DN4o4Z9u.js","mappings":"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","names":["$t","_ssrRenderClass","_ssrInterpolate","_ssrRenderList","_push","_parent","_createTextVNode","_toDisplayString","_ssrRenderAttr","_ssrIncludeBooleanAttr","_ssrLooseContain"],"sources":["../../../../pages/persons/[id]/index.vue"],"sourcesContent":["<template>\n <div>\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"flex items-center justify-center py-20\">\n <div class=\"flex flex-col items-center gap-3\">\n <svg class=\"w-8 h-8 text-indigo-400 animate-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n <p class=\"text-slate-400 text-sm\">{{ $t('persons.details.loading') }}</p>\n </div>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"flex flex-col items-center justify-center py-20 text-center\">\n <svg class=\"w-12 h-12 text-red-500 mb-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\" />\n </svg>\n <p class=\"text-red-400 text-sm mb-2\">{{ error }}</p>\n <button @click=\"fetchPerson\" class=\"px-4 py-2 text-sm bg-indigo-600/20 text-indigo-300 hover:bg-indigo-600/30 rounded-lg transition\">\n {{ $t('persons.details.retry') }}\n </button>\n </div>\n\n <!-- Content -->\n <template v-else-if=\"person\">\n <!-- Header -->\n <div class=\"mb-8\">\n <button\n @click=\"goBack\"\n class=\"inline-flex items-center gap-1.5 text-sm text-slate-400 hover:text-white transition mb-4\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n {{ $t('persons.details.back') }}\n </button>\n\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-4\">\n <div\n class=\"w-12 h-12 rounded-xl flex items-center justify-center text-lg font-bold text-white\"\n :class=\"getInitialsColor(personDisplayName)\"\n >\n {{ getInitials(personDisplayName) }}\n </div>\n <div>\n <div class=\"flex items-center gap-3\">\n <h1 class=\"text-2xl font-bold text-white\">{{ personDisplayName }}</h1>\n <span\n class=\"inline-flex items-center px-3 py-1 rounded-full text-xs font-medium\"\n :class=\"person.is_active ? 'bg-emerald-500/10 text-emerald-400' : 'bg-amber-500/10 text-amber-400'\"\n >\n <span class=\"w-1.5 h-1.5 rounded-full mr-1.5\" :class=\"person.is_active ? 'bg-emerald-400' : 'bg-amber-400'\"></span>\n {{ person.is_active ? $t('persons.active') : $t('persons.inactive') }}\n </span>\n <span\n v-if=\"person.is_ghost\"\n class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-purple-500/20 text-purple-300\"\n >\n {{ $t('persons.ghost') }}\n </span>\n <span\n v-if=\"person.merged_into_id\"\n class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-red-500/20 text-red-300\"\n >\n {{ $t('persons.merged') }}\n </span>\n <span\n v-if=\"person.is_sales_agent\"\n class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-amber-500/20 text-amber-300\"\n >\n {{ $t('persons.details.sales_agent') }}\n </span>\n </div>\n <p class=\"text-sm text-slate-400 mt-0.5\">\n ID: {{ person.id }}\n <span v-if=\"person.phone\" class=\"ml-2 text-slate-500\">· {{ person.phone }}</span>\n </p>\n </div>\n </div>\n <div class=\"flex items-center gap-3\">\n <button\n v-if=\"hasEditPermission\"\n @click=\"openEditModal\"\n class=\"inline-flex items-center gap-1.5 px-4 py-2 text-sm font-medium bg-indigo-600/20 text-indigo-300 hover:bg-indigo-600/30 rounded-lg transition\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n {{ $t('persons.details.edit') }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"border-b border-slate-700 mb-6\">\n <nav class=\"flex gap-6\">\n <button\n v-for=\"tab in tabs\"\n :key=\"tab.key\"\n @click=\"activeTab = tab.key\"\n class=\"pb-3 text-sm font-medium transition border-b-2 -mb-px\"\n :class=\"activeTab === tab.key\n ? 'text-indigo-400 border-indigo-400'\n : 'text-slate-400 border-transparent hover:text-slate-300'\"\n >\n {{ $t(tab.label) }}\n </button>\n </nav>\n </div>\n\n <!-- ============================================================ -->\n <!-- Profile Tab -->\n <!-- ============================================================ -->\n <div v-if=\"activeTab === 'profile'\" class=\"space-y-6\">\n <!-- Personal Info Card -->\n <div class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-6\">\n <div class=\"flex items-center gap-3 mb-5\">\n <div class=\"p-2 rounded-lg bg-indigo-500/10 text-indigo-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.personal_info') }}</h3>\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.person_id') }}</label>\n <p class=\"text-sm text-white font-mono\">{{ person.id }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.uuid') }}</label>\n <p class=\"text-sm text-white font-mono text-xs\">{{ person.id_uuid }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.last_name') }}</label>\n <p class=\"text-sm text-white\">{{ person.last_name || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.first_name') }}</label>\n <p class=\"text-sm text-white\">{{ person.first_name || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.phone') }}</label>\n <p class=\"text-sm text-white\">{{ person.phone || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.birth_place') }}</label>\n <p class=\"text-sm text-white\">{{ person.birth_place || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.birth_date') }}</label>\n <p class=\"text-sm text-white\">{{ formatDate(person.birth_date) || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.mothers_name') }}</label>\n <p class=\"text-sm text-white\">{{ [person.mothers_last_name, person.mothers_first_name].filter(Boolean).join(' ') || '—' }}</p>\n </div>\n </div>\n </div>\n\n <!-- Address Card -->\n <div v-if=\"person.address\" class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-6\">\n <div class=\"flex items-center gap-3 mb-5\">\n <div class=\"p-2 rounded-lg bg-cyan-500/10 text-cyan-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.address') }}</h3>\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.zip') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.address_zip || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.city') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.address_city || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.street') }}</label>\n <p class=\"text-sm text-white\">{{ [person.address.address_street_type, person.address.address_street_name].filter(Boolean).join(' ') || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.house_number') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.address_house_number || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.stairwell') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.address_stairwell || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.floor') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.address_floor || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.door') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.address_door || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.parcel_id') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.address_hrsz || '—' }}</p>\n </div>\n <div v-if=\"person.address.full_address_text\" class=\"lg:col-span-3\">\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.full_address') }}</label>\n <p class=\"text-sm text-white\">{{ person.address.full_address_text }}</p>\n </div>\n </div>\n </div>\n\n <!-- System Info Card -->\n <div class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-6\">\n <div class=\"flex items-center gap-3 mb-5\">\n <div class=\"p-2 rounded-lg bg-slate-500/10 text-slate-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.system_info') }}</h3>\n </div>\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.is_sales_agent') }}</label>\n <p class=\"text-sm text-white\">{{ person.is_sales_agent ? $t('persons.details.yes') : $t('persons.details.no') }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.lifetime_xp') }}</label>\n <p class=\"text-sm text-white\">{{ person.lifetime_xp }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.penalty_points') }}</label>\n <p class=\"text-sm text-white\">{{ person.penalty_points }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.social_reputation') }}</label>\n <p class=\"text-sm text-white\">{{ person.social_reputation.toFixed(2) }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.created_at') }}</label>\n <p class=\"text-sm text-white\">{{ formatDate(person.created_at) || '—' }}</p>\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.updated_at') }}</label>\n <p class=\"text-sm text-white\">{{ formatDate(person.updated_at) || '—' }}</p>\n </div>\n <div v-if=\"person.deleted_at\">\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.deleted_at') }}</label>\n <p class=\"text-sm text-red-400\">{{ formatDate(person.deleted_at) }}</p>\n </div>\n </div>\n </div>\n\n <!-- Identity Docs Card -->\n <div v-if=\"hasIdentityDocs\" class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-6\">\n <div class=\"flex items-center gap-3 mb-5\">\n <div class=\"p-2 rounded-lg bg-amber-500/10 text-amber-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10 6H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V8a2 2 0 00-2-2h-5m-4 0V5a2 2 0 114 0v1m-4 0a2 2 0 104 0m-5 8a2 2 0 100-4 2 2 0 000 4zm0 0c1.306 0 2.417.835 2.83 2M9 14a3.001 3.001 0 00-2.83 2M15 11h3m-3 4h2\" />\n </svg>\n </div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.identity_docs') }}</h3>\n </div>\n <pre class=\"text-xs text-slate-300 bg-slate-900/50 rounded-lg p-4 overflow-x-auto\">{{ formatJson(person.identity_docs) }}</pre>\n </div>\n\n <!-- ICE Contact Card -->\n <div v-if=\"hasIceContact\" class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-6\">\n <div class=\"flex items-center gap-3 mb-5\">\n <div class=\"p-2 rounded-lg bg-red-500/10 text-red-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n </div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.ice_contact') }}</h3>\n </div>\n <pre class=\"text-xs text-slate-300 bg-slate-900/50 rounded-lg p-4 overflow-x-auto\">{{ formatJson(person.ice_contact) }}</pre>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- Users Tab -->\n <!-- ============================================================ -->\n <div v-if=\"activeTab === 'users'\" class=\"space-y-6\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <div class=\"p-2 rounded-lg bg-blue-500/10 text-blue-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197m13.5-9a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0z\" />\n </svg>\n </div>\n <div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.connected_users') }}</h3>\n <p class=\"text-xs text-slate-400 mt-0.5\">{{ $t('persons.details.users_count', { count: person.users.length }) }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"person.users.length === 0\" class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-12 text-center\">\n <svg class=\"w-10 h-10 text-slate-600 mx-auto mb-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <p class=\"text-sm text-slate-400\">{{ $t('persons.details.no_users') }}</p>\n </div>\n\n <div v-else class=\"bg-slate-800/50 border border-slate-700 rounded-xl overflow-hidden\">\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"border-b border-slate-700\">\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">ID</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.email') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.role') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.status') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.plan') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.language') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.registered_at') }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"u in person.users\" :key=\"u.id\" class=\"border-b border-slate-700/50 last:border-b-0 hover:bg-slate-700/30 transition\">\n <td class=\"px-4 py-3\">\n <NuxtLink\n :to=\"'/users/' + u.id\"\n class=\"text-sm font-mono text-indigo-400 hover:underline\"\n >\n {{ u.id }}\n </NuxtLink>\n </td>\n <td class=\"px-4 py-3\">\n <NuxtLink\n :to=\"'/users/' + u.id\"\n class=\"text-sm font-medium text-white hover:text-indigo-400 hover:underline transition-colors\"\n >\n {{ u.email }}\n </NuxtLink>\n </td>\n <td class=\"px-4 py-3\">\n <span class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium\" :class=\"roleBadgeClass(u.role)\">\n {{ u.role || '—' }}\n </span>\n </td>\n <td class=\"px-4 py-3\">\n <span\n class=\"inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium\"\n :class=\"u.is_active ? 'bg-emerald-500/10 text-emerald-400' : 'bg-red-500/10 text-red-400'\"\n >\n <span class=\"w-1.5 h-1.5 rounded-full\" :class=\"u.is_active ? 'bg-emerald-400' : 'bg-red-400'\"></span>\n {{ u.is_active ? $t('persons.active') : $t('persons.inactive') }}\n </span>\n </td>\n <td class=\"px-4 py-3\">\n <span class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium\" :class=\"planBadgeClass(u.subscription_plan)\">\n {{ u.subscription_plan }}\n </span>\n </td>\n <td class=\"px-4 py-3 text-slate-300 text-xs\">{{ u.preferred_language?.toUpperCase() || '—' }}</td>\n <td class=\"px-4 py-3 text-slate-300 text-xs\">{{ formatDate(u.created_at) || '—' }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- Memberships Tab -->\n <!-- ============================================================ -->\n <div v-if=\"activeTab === 'memberships'\" class=\"space-y-6\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <div class=\"p-2 rounded-lg bg-purple-500/10 text-purple-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16l3.5-2 3.5 2 3.5-2 3.5 2M10 8.5a.5.5 0 11-1 0 .5.5 0 011 0zm5 5a.5.5 0 11-1 0 .5.5 0 011 0z\" />\n </svg>\n </div>\n <div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.memberships') }}</h3>\n <p class=\"text-xs text-slate-400 mt-0.5\">{{ $t('persons.details.memberships_count', { count: person.memberships.length }) }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"person.memberships.length === 0\" class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-12 text-center\">\n <svg class=\"w-10 h-10 text-slate-600 mx-auto mb-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <p class=\"text-sm text-slate-400\">{{ $t('persons.details.no_memberships') }}</p>\n </div>\n\n <div v-else class=\"bg-slate-800/50 border border-slate-700 rounded-xl overflow-hidden\">\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"border-b border-slate-700\">\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.org_name') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.org_type') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.org_role') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.member_status') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.verified') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.joined_at') }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"m in person.memberships\" :key=\"m.id\" class=\"border-b border-slate-700/50 last:border-b-0 hover:bg-slate-700/30 transition\">\n <td class=\"px-4 py-3\">\n <NuxtLink\n :to=\"'/garages/' + m.organization_id\"\n class=\"text-sm font-medium text-white hover:text-indigo-400 hover:underline transition-colors\"\n >\n {{ m.organization_name }}\n </NuxtLink>\n </td>\n <td class=\"px-4 py-3\">\n <span class=\"text-xs text-slate-300\">{{ m.organization_type || '—' }}</span>\n </td>\n <td class=\"px-4 py-3\">\n <span class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium\" :class=\"orgRoleBadgeClass(m.role)\">\n {{ m.role }}\n </span>\n </td>\n <td class=\"px-4 py-3\">\n <span class=\"inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium\" :class=\"memberStatusBadgeClass(m.status)\">\n <span class=\"w-1.5 h-1.5 rounded-full\" :class=\"memberStatusDotClass(m.status)\"></span>\n {{ m.status }}\n </span>\n </td>\n <td class=\"px-4 py-3\">\n <span v-if=\"m.is_verified\" class=\"inline-flex items-center gap-1 text-xs text-emerald-400\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n {{ $t('persons.details.verified_yes') }}\n </span>\n <span v-else class=\"text-xs text-slate-500\">{{ $t('persons.details.verified_no') }}</span>\n </td>\n <td class=\"px-4 py-3 text-slate-300 text-xs\">{{ formatDate(m.created_at) || '—' }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- Owned Organizations Tab -->\n <!-- ============================================================ -->\n <div v-if=\"activeTab === 'owned_orgs'\" class=\"space-y-6\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <div class=\"p-2 rounded-lg bg-emerald-500/10 text-emerald-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16l3.5-2 3.5 2 3.5-2 3.5 2M10 8.5a.5.5 0 11-1 0 .5.5 0 011 0zm5 5a.5.5 0 11-1 0 .5.5 0 011 0z\" />\n </svg>\n </div>\n <div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.owned_orgs') }}</h3>\n <p class=\"text-xs text-slate-400 mt-0.5\">{{ $t('persons.details.owned_orgs_count', { count: person.owned_organizations.length }) }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"person.owned_organizations.length === 0\" class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-12 text-center\">\n <svg class=\"w-10 h-10 text-slate-600 mx-auto mb-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <p class=\"text-sm text-slate-400\">{{ $t('persons.details.no_owned_orgs') }}</p>\n </div>\n\n <div v-else class=\"bg-slate-800/50 border border-slate-700 rounded-xl overflow-hidden\">\n <div class=\"overflow-x-auto\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"border-b border-slate-700\">\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.org_name') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.org_type') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.status') }}</th>\n <th class=\"text-left px-4 py-3 text-xs font-medium text-slate-400 uppercase tracking-wider\">{{ $t('persons.details.created_at') }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"o in person.owned_organizations\" :key=\"o.id\" class=\"border-b border-slate-700/50 last:border-b-0 hover:bg-slate-700/30 transition\">\n <td class=\"px-4 py-3\">\n <NuxtLink\n :to=\"'/garages/' + o.id\"\n class=\"text-sm font-medium text-white hover:text-indigo-400 hover:underline transition-colors\"\n >\n {{ o.name }}\n </NuxtLink>\n </td>\n <td class=\"px-4 py-3\">\n <span class=\"text-xs text-slate-300\">{{ o.org_type || '—' }}</span>\n </td>\n <td class=\"px-4 py-3\">\n <span\n class=\"inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium\"\n :class=\"o.is_active ? 'bg-emerald-500/10 text-emerald-400' : 'bg-slate-500/10 text-slate-400'\"\n >\n <span class=\"w-1.5 h-1.5 rounded-full\" :class=\"o.is_active ? 'bg-emerald-400' : 'bg-slate-400'\"></span>\n {{ o.is_active ? $t('persons.active') : $t('persons.inactive') }}\n </span>\n </td>\n <td class=\"px-4 py-3 text-slate-300 text-xs\">{{ formatDate(o.created_at) || '—' }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- Merge History Tab -->\n <!-- ============================================================ -->\n <div v-if=\"activeTab === 'merge_history'\" class=\"space-y-6\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <div class=\"p-2 rounded-lg bg-red-500/10 text-red-400\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <div>\n <h3 class=\"text-base font-semibold text-white\">{{ $t('persons.details.merge_history') }}</h3>\n </div>\n </div>\n </div>\n\n <div v-if=\"!person.merge_history\" class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-12 text-center\">\n <svg class=\"w-10 h-10 text-slate-600 mx-auto mb-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <p class=\"text-sm text-slate-400\">{{ $t('persons.details.no_merge_history') }}</p>\n </div>\n\n <div v-else class=\"bg-slate-800/50 border border-slate-700 rounded-xl p-6\">\n <div class=\"flex items-center gap-4\">\n <div class=\"p-3 rounded-lg bg-red-500/10 text-red-400\">\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </div>\n <div>\n <p class=\"text-sm text-slate-300\">\n {{ $t('persons.details.merged_into') }}\n <NuxtLink\n :to=\"'/persons/' + person.merge_history.merged_into_id\"\n class=\"text-indigo-400 hover:underline font-medium\"\n >\n {{ person.merge_history.merged_into_name || '#' + person.merge_history.merged_into_id }}\n </NuxtLink>\n </p>\n <p class=\"text-xs text-slate-500 mt-1\">{{ $t('persons.details.merged_at') }}: {{ formatDate(person.merge_history.merged_at) }}</p>\n </div>\n </div>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- Edit Modal -->\n <!-- ============================================================ -->\n <Teleport to=\"body\">\n <div\n v-if=\"showEditModal\"\n class=\"fixed inset-0 z-50 flex items-center justify-center\"\n >\n <div class=\"fixed inset-0 bg-black/60 backdrop-blur-sm\" @click=\"closeEditModal\"></div>\n <div class=\"relative bg-slate-800 border border-slate-700 rounded-xl w-full max-w-2xl max-h-[90vh] overflow-y-auto shadow-2xl\">\n <div class=\"sticky top-0 bg-slate-800 border-b border-slate-700 px-6 py-4 flex items-center justify-between\">\n <h2 class=\"text-lg font-semibold text-white\">{{ $t('persons.details.edit_title') }}</h2>\n <button @click=\"closeEditModal\" class=\"text-slate-400 hover:text-white transition\">\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div class=\"p-6 space-y-5\">\n <!-- Personal Info Section -->\n <div>\n <h3 class=\"text-sm font-semibold text-slate-300 mb-3\">{{ $t('persons.details.personal_info') }}</h3>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.last_name') }}</label>\n <input\n v-model=\"editForm.last_name\"\n type=\"text\"\n class=\"w-full px-3 py-2 text-sm bg-slate-900/50 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition\"\n :placeholder=\"$t('persons.details.last_name')\"\n />\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.first_name') }}</label>\n <input\n v-model=\"editForm.first_name\"\n type=\"text\"\n class=\"w-full px-3 py-2 text-sm bg-slate-900/50 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition\"\n :placeholder=\"$t('persons.details.first_name')\"\n />\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.phone') }}</label>\n <input\n v-model=\"editForm.phone\"\n type=\"text\"\n class=\"w-full px-3 py-2 text-sm bg-slate-900/50 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition\"\n :placeholder=\"$t('persons.phone')\"\n />\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.birth_place') }}</label>\n <input\n v-model=\"editForm.birth_place\"\n type=\"text\"\n class=\"w-full px-3 py-2 text-sm bg-slate-900/50 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition\"\n :placeholder=\"$t('persons.details.birth_place')\"\n />\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.birth_date') }}</label>\n <input\n v-model=\"editForm.birth_date\"\n type=\"date\"\n class=\"w-full px-3 py-2 text-sm bg-slate-900/50 border border-slate-600 rounded-lg text-white focus:outline-none focus:border-indigo-500 transition\"\n />\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.mothers_last_name') }}</label>\n <input\n v-model=\"editForm.mothers_last_name\"\n type=\"text\"\n class=\"w-full px-3 py-2 text-sm bg-slate-900/50 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition\"\n :placeholder=\"$t('persons.details.mothers_last_name')\"\n />\n </div>\n <div>\n <label class=\"block text-xs text-slate-400 mb-1\">{{ $t('persons.details.mothers_first_name') }}</label>\n <input\n v-model=\"editForm.mothers_first_name\"\n type=\"text\"\n class=\"w-full px-3 py-2 text-sm bg-slate-900/50 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 transition\"\n :placeholder=\"$t('persons.details.mothers_first_name')\"\n />\n </div>\n </div>\n </div>\n\n <!-- Status Section -->\n <div class=\"border-t border-slate-700 pt-5\">\n <h3 class=\"text-sm font-semibold text-slate-300 mb-3\">{{ $t('persons.details.status_section') }}</h3>\n <div class=\"flex flex-wrap gap-6\">\n <label class=\"flex items-center gap-2 cursor-pointer\">\n <input\n v-model=\"editForm.is_active\"\n type=\"checkbox\"\n class=\"w-4 h-4 rounded border-slate-600 bg-slate-900/50 text-indigo-500 focus:ring-indigo-500\"\n />\n <span class=\"text-sm text-slate-300\">{{ $t('persons.details.is_active') }}</span>\n </label>\n <label class=\"flex items-center gap-2 cursor-pointer\">\n <input\n v-model=\"editForm.is_ghost\"\n type=\"checkbox\"\n class=\"w-4 h-4 rounded border-slate-600 bg-slate-900/50 text-purple-500 focus:ring-purple-500\"\n />\n <span class=\"text-sm text-slate-300\">{{ $t('persons.details.is_ghost') }}</span>\n </label>\n <label class=\"flex items-center gap-2 cursor-pointer\">\n <input\n v-model=\"editForm.is_sales_agent\"\n type=\"checkbox\"\n class=\"w-4 h-4 rounded border-slate-600 bg-slate-900/50 text-amber-500 focus:ring-amber-500\"\n />\n <span class=\"text-sm text-slate-300\">{{ $t('persons.details.is_sales_agent') }}</span>\n </label>\n </div>\n </div>\n </div>\n\n <!-- Modal Footer -->\n <div class=\"sticky bottom-0 bg-slate-800 border-t border-slate-700 px-6 py-4 flex items-center justify-end gap-3\">\n <button\n @click=\"closeEditModal\"\n class=\"px-4 py-2 text-sm text-slate-400 hover:text-white transition\"\n >\n {{ $t('persons.details.cancel') }}\n </button>\n <button\n @click=\"saveEdit\"\n :disabled=\"saving\"\n class=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium bg-indigo-600 text-white hover:bg-indigo-500 rounded-lg transition disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n <svg v-if=\"saving\" class=\"w-4 h-4 animate-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\" />\n </svg>\n {{ saving ? $t('persons.details.saving') : $t('persons.details.save') }}\n </button>\n </div>\n </div>\n </div>\n </Teleport>\n\n <!-- ============================================================ -->\n <!-- Notification Toast -->\n <!-- ============================================================ -->\n <Teleport to=\"body\">\n <div\n v-if=\"notification.show\"\n class=\"fixed bottom-6 right-6 z-50 flex items-center gap-3 px-5 py-3 rounded-lg shadow-xl transition-all duration-300\"\n :class=\"notification.type === 'success' ? 'bg-emerald-600 text-white' : 'bg-red-600 text-white'\"\n >\n <svg v-if=\"notification.type === 'success'\" class=\"w-5 h-5 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <svg v-else class=\"w-5 h-5 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span class=\"text-sm font-medium\">{{ notification.message }}</span>\n <button @click=\"notification.show = false\" class=\"ml-2 text-white/70 hover:text-white transition\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </Teleport>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useAuthStore } from '~/stores/auth'\n\nconst route = useRoute()\nconst router = useRouter()\nconst auth = useAuthStore()\n\nconst personId = route.params.id as string\n\n// State\nconst loading = ref(true)\nconst error = ref<string | null>(null)\nconst person = ref<any>(null)\nconst activeTab = ref('profile')\n\n// Edit Modal\nconst showEditModal = ref(false)\nconst saving = ref(false)\nconst editForm = ref({\n last_name: '',\n first_name: '',\n phone: '',\n mothers_last_name: '',\n mothers_first_name: '',\n birth_place: '',\n birth_date: '',\n is_active: true,\n is_ghost: false,\n is_sales_agent: false,\n})\n\n// Notification\nconst notification = ref({ show: false, type: 'success' as 'success' | 'error', message: '' })\n\n// Tab definitions\nconst tabs = [\n { key: 'profile', label: 'persons.details.profile_tab' },\n { key: 'users', label: 'persons.details.users_tab' },\n { key: 'memberships', label: 'persons.details.memberships_tab' },\n { key: 'owned_orgs', label: 'persons.details.owned_orgs_tab' },\n { key: 'merge_history', label: 'persons.details.merge_history_tab' },\n]\n\n// Computed\nconst personDisplayName = computed(() => {\n if (!person.value) return ''\n const p = person.value\n if (p.last_name || p.first_name) {\n return [p.last_name, p.first_name].filter(Boolean).join(' ')\n }\n return 'Person #' + p.id\n})\n\nconst hasEditPermission = computed(() => {\n if (auth.isAdmin) return true\n return !!auth.user?.system_capabilities?.['persons:edit']\n})\n\nconst hasIdentityDocs = computed(() => {\n if (!person.value?.identity_docs) return false\n const docs = person.value.identity_docs\n if (typeof docs === 'object' && Object.keys(docs).length > 0) return true\n return false\n})\n\nconst hasIceContact = computed(() => {\n if (!person.value?.ice_contact) return false\n const ice = person.value.ice_contact\n if (typeof ice === 'object' && Object.keys(ice).length > 0) return true\n return false\n})\n\n// API calls\nasync function fetchPerson() {\n loading.value = true\n error.value = null\n try {\n const tokenCookie = useCookie('access_token')\n const token = (tokenCookie.value || auth.token || '').trim()\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n }\n\n const res = await fetch(`/api/v1/admin/persons/${personId}`, { headers })\n if (!res.ok) {\n if (res.status === 404) throw new Error('Person not found')\n if (res.status === 403) throw new Error('Access denied')\n throw new Error(`Failed to fetch person: ${res.status}`)\n }\n\n const data = await res.json()\n person.value = data\n } catch (e: any) {\n error.value = e.message || 'Failed to load person details'\n } finally {\n loading.value = false\n }\n}\n\n// Edit Modal\nfunction openEditModal() {\n if (!person.value) return\n const p = person.value\n editForm.value = {\n last_name: p.last_name || '',\n first_name: p.first_name || '',\n phone: p.phone || '',\n mothers_last_name: p.mothers_last_name || '',\n mothers_first_name: p.mothers_first_name || '',\n birth_place: p.birth_place || '',\n birth_date: p.birth_date ? p.birth_date.slice(0, 10) : '',\n is_active: p.is_active,\n is_ghost: p.is_ghost,\n is_sales_agent: p.is_sales_agent,\n }\n showEditModal.value = true\n}\n\nfunction closeEditModal() {\n showEditModal.value = false\n}\n\nasync function saveEdit() {\n saving.value = true\n try {\n const tokenCookie = useCookie('access_token')\n const token = (tokenCookie.value || auth.token || '').trim()\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n }\n\n const payload: Record<string, any> = {\n last_name: editForm.value.last_name || undefined,\n first_name: editForm.value.first_name || undefined,\n phone: editForm.value.phone || undefined,\n mothers_last_name: editForm.value.mothers_last_name || undefined,\n mothers_first_name: editForm.value.mothers_first_name || undefined,\n birth_place: editForm.value.birth_place || undefined,\n birth_date: editForm.value.birth_date\n ? new Date(editForm.value.birth_date).toISOString()\n : undefined,\n is_active: editForm.value.is_active,\n is_ghost: editForm.value.is_ghost,\n is_sales_agent: editForm.value.is_sales_agent,\n }\n\n // Clean undefined values\n Object.keys(payload).forEach(key => {\n if (payload[key] === undefined) delete payload[key]\n })\n\n const res = await fetch(`/api/v1/admin/persons/${personId}`, {\n method: 'PATCH',\n headers,\n body: JSON.stringify(payload),\n })\n\n if (!res.ok) {\n const errData = await res.json().catch(() => ({}))\n throw new Error(errData.detail || `Save failed: ${res.status}`)\n }\n\n const result = await res.json()\n person.value = result\n closeEditModal()\n showNotification('success', 'Person updated successfully')\n } catch (e: any) {\n showNotification('error', e.message || 'Failed to save')\n } finally {\n saving.value = false\n }\n}\n\n// Notification helper\nfunction showNotification(type: 'success' | 'error', message: string) {\n notification.value = { show: true, type, message }\n setTimeout(() => {\n notification.value.show = false\n }, 4000)\n}\n\n// Navigation\nfunction goBack() {\n router.push('/persons')\n}\n\n// Helpers\nfunction getInitials(name: string): string {\n if (!name) return '?'\n return name.split(' ').map(w => w[0]).join('').toUpperCase().slice(0, 2)\n}\n\nfunction getInitialsColor(name: string): string {\n const colors = [\n 'bg-red-500', 'bg-yellow-500', 'bg-green-500', 'bg-blue-500',\n 'bg-indigo-500', 'bg-purple-500', 'bg-pink-500', 'bg-teal-500',\n ]\n let hash = 0\n for (let i = 0; i < (name || '').length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash)\n }\n return colors[Math.abs(hash) % colors.length]\n}\n\nfunction formatDate(date: string | null | undefined): string {\n if (!date) return ''\n try {\n return new Date(date).toLocaleDateString('en-GB', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })\n } catch {\n return String(date)\n }\n}\n\nfunction formatJson(data: any): string {\n if (!data) return ''\n try {\n return JSON.stringify(data, null, 2)\n } catch {\n return String(data)\n }\n}\n\nfunction roleBadgeClass(role: string): string {\n const map: Record<string, string> = {\n admin: 'bg-purple-500/10 text-purple-400',\n user: 'bg-blue-500/10 text-blue-400',\n staff: 'bg-cyan-500/10 text-cyan-400',\n superadmin: 'bg-amber-500/10 text-amber-400',\n }\n return map[role?.toLowerCase()] || 'bg-slate-500/10 text-slate-400'\n}\n\nfunction planBadgeClass(plan: string): string {\n const map: Record<string, string> = {\n FREE: 'bg-slate-500/10 text-slate-400',\n PREMIUM: 'bg-emerald-500/10 text-emerald-400',\n ENTERPRISE: 'bg-amber-500/10 text-amber-400',\n }\n return map[plan?.toUpperCase()] || 'bg-slate-500/10 text-slate-400'\n}\n\nfunction orgRoleBadgeClass(role: string): string {\n const map: Record<string, string> = {\n admin: 'bg-purple-500/10 text-purple-400',\n manager: 'bg-blue-500/10 text-blue-400',\n member: 'bg-slate-500/10 text-slate-400',\n owner: 'bg-amber-500/10 text-amber-400',\n }\n return map[role?.toLowerCase()] || 'bg-slate-500/10 text-slate-400'\n}\n\nfunction memberStatusBadgeClass(status: string): string {\n const map: Record<string, string> = {\n active: 'bg-emerald-500/10 text-emerald-400',\n invited: 'bg-blue-500/10 text-blue-400',\n suspended: 'bg-red-500/10 text-red-400',\n inactive: 'bg-slate-500/10 text-slate-400',\n }\n return map[status?.toLowerCase()] || 'bg-slate-500/10 text-slate-400'\n}\n\nfunction memberStatusDotClass(status: string): string {\n const map: Record<string, string> = {\n active: 'bg-emerald-400',\n invited: 'bg-blue-400',\n suspended: 'bg-red-400',\n inactive: 'bg-slate-400',\n }\n return map[status?.toLowerCase()] || 'bg-slate-400'\n}\n\n// Lifecycle\nonMounted(() => {\n fetchPerson()\n})\n</script>"],"version":3}