Files
service-finder/frontend_admin/.nuxt/dist/server/_nuxt/index-Dzq5Dk7S.js.map.json
2026-07-01 19:49:58 +00:00

1 line
62 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"file":"index-Dzq5Dk7S.js","mappings":"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","names":["$route","_ssrRenderList","_ssrRenderVNode","_createVNode","_resolveDynamicComponent","_ssrInterpolate","_ssrRenderClass","_ssrRenderStyle","_push","_parent","_createBlock","_ssrIncludeBooleanAttr","_ssrLooseContain","_ssrLooseEqual","_ssrRenderAttr","index"],"sources":["../../../../pages/providers/[id]/index.vue"],"sourcesContent":["<template>\n <div>\n <!-- Back Button & 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 Vissza a szolgáltatókhoz\n </button>\n <h1 class=\"text-2xl font-bold text-white\">Szolgáltató részletek</h1>\n <p class=\"text-slate-400 mt-1\">Szolgáltató #{{ $route.params.id }}</p>\n </div>\n\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"flex items-center justify-center py-20\">\n <div class=\"text-slate-400 flex items-center gap-3\">\n <svg class=\"w-5 h-5 animate-spin\" 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 <span>Szolgáltató betöltése...</span>\n </div>\n </div>\n\n <!-- Error State -->\n <div v-else-if=\"error\" class=\"bg-rose-500/10 border border-rose-500/30 rounded-xl p-6 mb-8\">\n <p class=\"text-rose-400\">Hiba történt a szolgáltató betöltése közben.</p>\n <button @click=\"fetchProvider\" class=\"mt-3 text-sm text-rose-300 hover:text-rose-200 underline\">Újrapróbálkozás</button>\n </div>\n\n <!-- Not Found -->\n <div v-else-if=\"!provider\" class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <p class=\"text-slate-400 text-center py-12\">A szolgáltató nem található.</p>\n </div>\n\n <template v-else>\n <!-- Status Banner -->\n <div\n class=\"rounded-xl border p-4 mb-6 flex items-center gap-3\"\n :class=\"statusBannerClass\"\n >\n <span class=\"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center\" :class=\"statusIconClass\">\n <svg v-if=\"provider.status === 'approved'\" 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=\"M5 13l4 4L19 7\" />\n </svg>\n <svg v-else-if=\"provider.status === 'pending'\" 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 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <svg v-else 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 </span>\n <div>\n <p class=\"text-sm font-medium\" :class=\"statusTextClass\">{{ statusLabel(provider.status) }}</p>\n <p class=\"text-xs mt-0.5\" :class=\"statusSubtextClass\">{{ statusDescription(provider.status) }}</p>\n </div>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"border-b border-slate-700 mb-6\">\n <nav class=\"flex gap-6 -mb-px\">\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 border-b-2 transition flex items-center gap-2\"\n :class=\"activeTab === tab.key ? 'text-indigo-400 border-indigo-400' : 'text-slate-400 border-transparent hover:text-slate-300'\"\n >\n <component :is=\"tab.icon\" class=\"w-4 h-4\" />\n {{ tab.label }}\n </button>\n </nav>\n </div>\n\n <!-- Tab: Data -->\n <div v-if=\"activeTab === 'data'\" class=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <!-- Left Column: Basic Info -->\n <div class=\"lg:col-span-2 space-y-6\">\n <!-- Basic Information -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Alapadatok</h2>\n <dl class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Név</dt>\n <dd class=\"text-sm text-white mt-1 font-medium\">{{ provider.name }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Kategória</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.category || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Forrás</dt>\n <dd class=\"mt-1\">\n <code class=\"text-sm font-mono text-amber-300 bg-amber-500/10 px-2 py-0.5 rounded\">{{ provider.source }}</code>\n </dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Validációs pontszám</dt>\n <dd class=\"mt-1\">\n <div class=\"flex items-center gap-2\">\n <div class=\"w-24 h-2 bg-slate-700 rounded-full overflow-hidden\">\n <div\n class=\"h-full rounded-full transition-all\"\n :class=\"provider.validation_score >= 50 ? 'bg-emerald-500' : provider.validation_score >= 20 ? 'bg-amber-500' : 'bg-slate-500'\"\n :style=\"{ width: Math.min(provider.validation_score, 100) + '%' }\"\n />\n </div>\n <span class=\"text-sm text-white font-medium\">{{ provider.validation_score }}</span>\n </div>\n </dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Létrehozva</dt>\n <dd class=\"text-sm text-white mt-1\">{{ formatDate(provider.created_at) }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Beküldő user ID</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.added_by_user_id || '—' }}</dd>\n </div>\n </dl>\n </div>\n\n <!-- Address Information -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Cím adatok</h2>\n <dl class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"md:col-span-2\">\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Teljes cím</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.address || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Város</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.city || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Irányítószám</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.address_zip || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Utca</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.address_street_name || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Házszám</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.address_house_number || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Plus Code</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.plus_code || '—' }}</dd>\n </div>\n </dl>\n </div>\n\n <!-- Contact Information -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Elérhetőség</h2>\n <dl class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Telefon</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.contact_phone || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Email</dt>\n <dd class=\"text-sm text-white mt-1\">{{ provider.contact_email || '—' }}</dd>\n </div>\n <div>\n <dt class=\"text-xs text-slate-500 uppercase tracking-wider\">Weboldal</dt>\n <dd class=\"text-sm text-white mt-1\">\n <a v-if=\"provider.website\" :href=\"provider.website\" target=\"_blank\" class=\"text-indigo-400 hover:text-indigo-300 underline\">\n {{ provider.website }}\n </a>\n <span v-else>—</span>\n </dd>\n </div>\n </dl>\n </div>\n\n <!-- Services (Categories) -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Szolgáltatások</h2>\n <div v-if=\"provider.category_ids && provider.category_ids.length > 0\" class=\"flex flex-wrap gap-2\">\n <span\n v-for=\"catId in provider.category_ids\"\n :key=\"catId\"\n class=\"inline-flex items-center gap-1 px-3 py-1.5 bg-indigo-500/10 text-indigo-300 rounded-full text-xs font-medium\"\n >\n #{{ catId }}\n </span>\n </div>\n <p v-else class=\"text-sm text-slate-500 italic\">Nincsenek kategóriák beállítva</p>\n </div>\n\n <!-- Vehicle Classes -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Járműosztályok</h2>\n <div v-if=\"provider.supported_vehicle_classes && provider.supported_vehicle_classes.length > 0\" class=\"flex flex-wrap gap-2\">\n <span\n v-for=\"vc in provider.supported_vehicle_classes\"\n :key=\"vc\"\n class=\"inline-flex items-center gap-1 px-3 py-1.5 bg-emerald-500/10 text-emerald-300 rounded-full text-xs font-medium\"\n >\n {{ vehicleClassLabel(vc) }}\n </span>\n </div>\n <p v-else class=\"text-sm text-slate-500 italic\">Nincsenek járműosztályok beállítva</p>\n </div>\n\n <!-- Specializations -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Specializációk</h2>\n <div v-if=\"hasSpecializations\" class=\"space-y-3\">\n <!-- Brands -->\n <div v-if=\"provider.specializations?.brands?.length\">\n <h3 class=\"text-xs text-slate-500 uppercase tracking-wider mb-2\">Márkák</h3>\n <div class=\"flex flex-wrap gap-2\">\n <span\n v-for=\"brand in provider.specializations.brands\"\n :key=\"brand\"\n class=\"inline-flex items-center gap-1 px-3 py-1.5 bg-amber-500/10 text-amber-300 rounded-full text-xs font-medium\"\n >\n {{ brand }}\n </span>\n </div>\n </div>\n <!-- Propulsion -->\n <div v-if=\"provider.specializations?.propulsion?.length\">\n <h3 class=\"text-xs text-slate-500 uppercase tracking-wider mb-2\">Hajtáslánc</h3>\n <div class=\"flex flex-wrap gap-2\">\n <span\n v-for=\"prop in provider.specializations.propulsion\"\n :key=\"prop\"\n class=\"inline-flex items-center gap-1 px-3 py-1.5 bg-cyan-500/10 text-cyan-300 rounded-full text-xs font-medium\"\n >\n {{ prop }}\n </span>\n </div>\n </div>\n </div>\n <p v-else class=\"text-sm text-slate-500 italic\">Nincsenek specializációk beállítva</p>\n </div>\n\n <!-- Opening Hours -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Nyitvatartás</h2>\n <div v-if=\"hasOpeningHours\" class=\"overflow-hidden\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"border-b border-slate-700\">\n <th class=\"text-left text-xs text-slate-500 uppercase tracking-wider pb-2 pr-4\">Nap</th>\n <th class=\"text-left text-xs text-slate-500 uppercase tracking-wider pb-2\">Nyitva</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"day in DAYS\" :key=\"day.key\" class=\"border-b border-slate-700/50 last:border-0\">\n <td class=\"py-2 pr-4 text-white font-medium\">{{ day.label }}</td>\n <td class=\"py-2\">\n <template v-if=\"getDayHours(day.key)\">\n <span class=\"text-white\">{{ getDayHours(day.key)?.open }}</span>\n <span class=\"text-slate-500 mx-1\"></span>\n <span class=\"text-white\">{{ getDayHours(day.key)?.close }}</span>\n </template>\n <span v-else class=\"text-slate-500 italic\">Zárva</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div v-else>\n <p class=\"text-sm text-slate-500 italic\">Nincs beállítva nyitvatartás</p>\n </div>\n </div>\n </div>\n\n <!-- Right Column: Actions -->\n <div class=\"space-y-4\">\n <!-- Moderation Actions -->\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Moderációs műveletek</h2>\n\n <!-- Pending Actions -->\n <div v-if=\"provider.status === 'pending'\" class=\"space-y-3\">\n <button\n @click=\"approveProvider\"\n :disabled=\"actionLoading\"\n class=\"w-full px-4 py-3 bg-emerald-600 hover:bg-emerald-500 disabled:bg-emerald-600/50 text-white rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\n >\n <svg v-if=\"actionLoading\" class=\"w-4 h-4 animate-spin\" 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 <svg v-else 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=\"M5 13l4 4L19 7\" />\n </svg>\n Jóváhagyás\n </button>\n <button\n @click=\"openRejectModal\"\n :disabled=\"actionLoading\"\n class=\"w-full px-4 py-3 bg-rose-600/20 hover:bg-rose-600/40 disabled:opacity-50 text-rose-400 rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\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=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n Elutasítás\n </button>\n </div>\n\n <!-- Approved Actions -->\n <div v-else-if=\"provider.status === 'approved'\" class=\"space-y-3\">\n <NuxtLink\n :to=\"`/providers/${provider.id}/edit`\"\n class=\"w-full px-4 py-3 bg-indigo-600 hover:bg-indigo-500 text-white rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\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 Szerkesztés\n </NuxtLink>\n <button\n @click=\"openFlagModal\"\n :disabled=\"actionLoading\"\n class=\"w-full px-4 py-3 bg-purple-600/20 hover:bg-purple-600/40 disabled:opacity-50 text-purple-400 rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\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=\"M3 21v-4m0 0V5a2 2 0 012-2h6.5l1 1H21l-3 6 3 6h-8.5l-1-1H5a2 2 0 00-2 2zm9-13.5V9\" />\n </svg>\n Megjelölés (Flag)\n </button>\n <button\n @click=\"deleteProvider\"\n :disabled=\"actionLoading\"\n class=\"w-full px-4 py-3 bg-rose-600/20 hover:bg-rose-600/40 disabled:opacity-50 text-rose-400 rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\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=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n Törlés (Soft Delete)\n </button>\n </div>\n\n <!-- Rejected / Flagged Actions -->\n <div v-else class=\"space-y-3\">\n <p class=\"text-sm text-slate-400 text-center py-2\">\n A szolgáltató {{ provider.status === 'rejected' ? 'elutasításra' : 'megjelölésre' }} került.\n </p>\n <NuxtLink\n :to=\"`/providers/${provider.id}/edit`\"\n class=\"w-full px-4 py-3 bg-indigo-600 hover:bg-indigo-500 text-white rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\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 Szerkesztés\n </NuxtLink>\n <button\n v-if=\"provider.status === 'rejected'\"\n @click=\"restoreProvider\"\n :disabled=\"actionLoading\"\n class=\"w-full px-4 py-3 bg-emerald-600 hover:bg-emerald-500 disabled:bg-emerald-600/50 text-white rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\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=\"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 Visszaállítás\n </button>\n <button\n @click=\"deleteProvider\"\n :disabled=\"actionLoading\"\n class=\"w-full px-4 py-3 bg-rose-600/20 hover:bg-rose-600/40 disabled:opacity-50 text-rose-400 rounded-lg text-sm font-medium transition flex items-center justify-center gap-2\"\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=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n Törlés\n </button>\n </div>\n </div>\n\n <!-- Evidence Image -->\n <div v-if=\"provider.evidence_image_path\" class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Bizonyíték kép</h2>\n <img\n :src=\"provider.evidence_image_path\"\n alt=\"Evidence\"\n class=\"w-full rounded-lg border border-slate-600\"\n />\n </div>\n </div>\n </div>\n\n <!-- Tab: Status -->\n <div v-if=\"activeTab === 'status'\" class=\"max-w-2xl\">\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Státusz kezelés</h2>\n <p class=\"text-sm text-slate-400 mb-6\">Módosítsd a szolgáltató státuszát és validációs pontszámát.</p>\n\n <form @submit.prevent=\"saveStatusEdit\">\n <div class=\"space-y-4 mb-6\">\n <!-- Status Select -->\n <div>\n <label class=\"block text-sm font-medium text-slate-300 mb-1\">Státusz</label>\n <select\n v-model=\"statusForm.status\"\n class=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-indigo-500/50 focus:border-indigo-500 text-sm\"\n >\n <option value=\"pending\">Függőben</option>\n <option value=\"approved\">Jóváhagyott</option>\n <option value=\"rejected\">Elutasított</option>\n </select>\n </div>\n\n <!-- Validation Score -->\n <div>\n <label class=\"block text-sm font-medium text-slate-300 mb-1\">\n Validációs pontszám (0-100)\n </label>\n <div class=\"flex items-center gap-3\">\n <input\n v-model.number=\"statusForm.validation_score\"\n type=\"range\"\n min=\"0\"\n max=\"100\"\n class=\"w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-indigo-500\"\n />\n <span class=\"text-sm text-white font-medium w-8 text-right\">{{ statusForm.validation_score }}</span>\n </div>\n </div>\n\n <!-- Reason -->\n <div>\n <label class=\"block text-sm font-medium text-slate-300 mb-1\">Indoklás (opcionális)</label>\n <textarea\n v-model=\"statusForm.reason\"\n rows=\"3\"\n placeholder=\"Add meg a státuszváltoztatás okát...\"\n class=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/50 focus:border-indigo-500 text-sm resize-none\"\n ></textarea>\n </div>\n </div>\n\n <div class=\"flex justify-end gap-3\">\n <button type=\"button\" @click=\"resetStatusForm\" class=\"px-4 py-2 text-sm text-slate-400 hover:text-white transition\">Mégsem</button>\n <button type=\"submit\" :disabled=\"statusLoading\" class=\"px-4 py-2 bg-indigo-600 hover:bg-indigo-500 disabled:bg-indigo-600/50 text-white rounded-lg text-sm font-medium transition flex items-center gap-2\">\n <svg v-if=\"statusLoading\" class=\"w-4 h-4 animate-spin\" 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 Státusz mentése\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Tab: Validations -->\n <div v-if=\"activeTab === 'validations'\">\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Gamification Validációk</h2>\n <p class=\"text-sm text-slate-400 mb-6\">A szolgáltatóhoz tartozó gamification validációs bejegyzések listája.</p>\n\n <!-- Loading -->\n <div v-if=\"validationsLoading\" class=\"flex items-center justify-center py-8\">\n <svg class=\"w-5 h-5 animate-spin text-slate-400\" 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\n <!-- Empty -->\n <div v-else-if=\"validations.length === 0\" class=\"text-center py-8\">\n <p class=\"text-slate-500\">Nincsenek validációs bejegyzések ehhez a szolgáltatóhoz.</p>\n </div>\n\n <!-- Validation List -->\n <div v-else class=\"space-y-3\">\n <div\n v-for=\"v in validations\"\n :key=\"v.id\"\n class=\"bg-slate-700/50 rounded-lg border border-slate-600 p-4\"\n >\n <div class=\"flex items-start justify-between gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex items-center gap-2 mb-1\">\n <span\n class=\"text-xs font-medium px-2 py-0.5 rounded-full\"\n :class=\"validationTypeClass(v.validation_type)\"\n >\n {{ validationTypeLabel(v.validation_type) }}\n </span>\n <span class=\"text-xs text-slate-500\">súly: {{ v.weight }}</span>\n </div>\n <p class=\"text-sm text-slate-300\">\n <span class=\"text-slate-400\">Szavazó:</span>\n {{ v.voter_name || `User #${v.voter_user_id}` }}\n </p>\n <p v-if=\"v.validation_metadata?.reason\" class=\"text-xs text-slate-500 mt-1\">\n Indoklás: {{ v.validation_metadata.reason }}\n </p>\n </div>\n <div class=\"text-xs text-slate-500 whitespace-nowrap\">\n {{ formatDate(v.created_at) }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Tab: History -->\n <div v-if=\"activeTab === 'history'\">\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6\">\n <h2 class=\"text-lg font-semibold text-white mb-4\">Állapotváltoztatások előzményei</h2>\n <p class=\"text-sm text-slate-400 mb-6\">Idővonal: ki, mikor és mit változtatott a szolgáltatóval kapcsolatban.</p>\n\n <!-- Loading -->\n <div v-if=\"historyLoading\" class=\"flex items-center justify-center py-8\">\n <svg class=\"w-5 h-5 animate-spin text-slate-400\" 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\n <!-- Empty -->\n <div v-else-if=\"history.length === 0\" class=\"text-center py-8\">\n <p class=\"text-slate-500\">Nincsenek előzmények ehhez a szolgáltatóhoz.</p>\n </div>\n\n <!-- Timeline -->\n <div v-else class=\"relative\">\n <!-- Timeline line -->\n <div class=\"absolute left-4 top-0 bottom-0 w-0.5 bg-slate-700\"></div>\n\n <div v-for=\"(entry, index) in history\" :key=\"entry.id\" class=\"relative pl-10 pb-6 last:pb-0\">\n <!-- Timeline dot -->\n <div\n class=\"absolute left-2.5 w-3 h-3 rounded-full border-2 mt-1.5\"\n :class=\"historyDotClass(entry.action)\"\n ></div>\n\n <div class=\"bg-slate-700/50 rounded-lg border border-slate-600 p-4\">\n <div class=\"flex items-start justify-between gap-4 mb-2\">\n <div>\n <span\n class=\"text-xs font-medium px-2 py-0.5 rounded-full\"\n :class=\"historyActionClass(entry.action)\"\n >\n {{ historyActionLabel(entry.action) }}\n </span>\n <span class=\"text-xs text-slate-500 ml-2\">\n User #{{ entry.user_id || '?' }}\n </span>\n </div>\n <div class=\"text-xs text-slate-500 whitespace-nowrap\">\n {{ formatDate(entry.timestamp) }}\n </div>\n </div>\n\n <!-- Status change details -->\n <div v-if=\"entry.new_data\" class=\"text-xs text-slate-400 space-y-1 mt-2\">\n <div v-if=\"entry.new_data.old_status || entry.new_data.new_status\" class=\"flex items-center gap-2\">\n <span class=\"text-slate-500\">Státusz:</span>\n <span class=\"text-rose-400\">{{ entry.new_data.old_status || '?' }}</span>\n <svg class=\"w-3 h-3 text-slate-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <span class=\"text-emerald-400\">{{ entry.new_data.new_status || '?' }}</span>\n </div>\n <div v-if=\"entry.new_data.reason && entry.new_data.reason !== 'Admin edit'\">\n <span class=\"text-slate-500\">Indoklás:</span> {{ entry.new_data.reason }}\n </div>\n <!-- Field changes from PATCH update -->\n <div v-if=\"entry.new_data.changes\" class=\"mt-2\">\n <details class=\"text-xs\">\n <summary class=\"text-slate-500 cursor-pointer hover:text-slate-400\">Részletes változások</summary>\n <div class=\"mt-2 space-y-1\">\n <div v-for=\"(value, key) in entry.new_data.changes\" :key=\"key\" class=\"flex gap-2\">\n <span class=\"text-slate-500 w-28 flex-shrink-0\">{{ key }}:</span>\n <span class=\"text-slate-300 truncate\">{{ value ?? '—' }}</span>\n </div>\n </div>\n </details>\n </div>\n </div>\n\n <!-- Old data diff -->\n <div v-if=\"entry.old_data\" class=\"mt-2\">\n <details class=\"text-xs\">\n <summary class=\"text-slate-500 cursor-pointer hover:text-slate-400\">Régi adatok</summary>\n <div class=\"mt-2 space-y-1\">\n <div v-for=\"(value, key) in entry.old_data\" :key=\"key\" class=\"flex gap-2\">\n <span class=\"text-slate-500 w-28 flex-shrink-0\">{{ key }}:</span>\n <span class=\"text-slate-300 truncate\">{{ value ?? '—' }}</span>\n </div>\n </div>\n </details>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <!-- Reject Modal -->\n <div v-if=\"showRejectModal\" class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\" @click.self=\"showRejectModal = false\">\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6 w-full max-w-lg mx-4 shadow-2xl\">\n <h2 class=\"text-lg font-semibold text-white mb-2\">Szolgáltató elutasítása</h2>\n <p class=\"text-sm text-slate-400 mb-6\">\n Biztosan elutasítod a(z) <strong class=\"text-white\">{{ provider?.name }}</strong> szolgáltatót?\n </p>\n <form @submit.prevent=\"rejectProvider\">\n <div class=\"mb-4\">\n <label class=\"block text-sm font-medium text-slate-300 mb-1\">Indoklás (opcionális)</label>\n <textarea\n v-model=\"rejectReason\"\n rows=\"3\"\n placeholder=\"Add meg az elutasítás okát...\"\n class=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-rose-500/50 focus:border-rose-500 text-sm resize-none\"\n ></textarea>\n </div>\n <div class=\"flex justify-end gap-3\">\n <button type=\"button\" @click=\"showRejectModal = false\" class=\"px-4 py-2 text-sm text-slate-400 hover:text-white transition\">Mégse</button>\n <button type=\"submit\" :disabled=\"actionLoading\" class=\"px-4 py-2 bg-rose-600 hover:bg-rose-500 disabled:bg-rose-600/50 text-white rounded-lg text-sm font-medium transition flex items-center gap-2\">\n <svg v-if=\"actionLoading\" class=\"w-4 h-4 animate-spin\" 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 Elutasítás\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Flag Modal -->\n <div v-if=\"showFlagModal\" class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm\" @click.self=\"showFlagModal = false\">\n <div class=\"bg-slate-800 rounded-xl border border-slate-700 p-6 w-full max-w-lg mx-4 shadow-2xl\">\n <h2 class=\"text-lg font-semibold text-white mb-2\">Szolgáltató megjelölése</h2>\n <p class=\"text-sm text-slate-400 mb-6\">\n Biztosan megjelölöd a(z) <strong class=\"text-white\">{{ provider?.name }}</strong> szolgáltatót?\n </p>\n <form @submit.prevent=\"flagProvider\">\n <div class=\"mb-4\">\n <label class=\"block text-sm font-medium text-slate-300 mb-1\">Indoklás (opcionális)</label>\n <textarea\n v-model=\"flagReason\"\n rows=\"3\"\n placeholder=\"Add meg a megjelölés okát...\"\n class=\"w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-purple-500/50 focus:border-purple-500 text-sm resize-none\"\n ></textarea>\n </div>\n <div class=\"flex justify-end gap-3\">\n <button type=\"button\" @click=\"showFlagModal = false\" class=\"px-4 py-2 text-sm text-slate-400 hover:text-white transition\">Mégse</button>\n <button type=\"submit\" :disabled=\"actionLoading\" class=\"px-4 py-2 bg-purple-600 hover:bg-purple-500 disabled:bg-purple-600/50 text-white rounded-lg text-sm font-medium transition flex items-center gap-2\">\n <svg v-if=\"actionLoading\" class=\"w-4 h-4 animate-spin\" 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 Megjelölés\n </button>\n </div>\n </form>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nconst route = useRoute()\nconst router = useRouter()\n\n// ── State ──────────────────────────────────────────────\nconst loading = ref(true)\nconst error = ref(false)\nconst provider = ref<any>(null)\nconst actionLoading = ref(false)\n\n// Toast\nconst toast = ref<{ message: string; type: 'success' | 'error' } | null>(null)\n\n// Reject modal\nconst showRejectModal = ref(false)\nconst rejectReason = ref('')\n\n// Flag modal\nconst showFlagModal = ref(false)\nconst flagReason = ref('')\n\n// Tabs\nconst activeTab = ref<'data' | 'status' | 'validations' | 'history'>('data')\n\n// Validations\nconst validations = ref<any[]>([])\nconst validationsLoading = ref(false)\n\n// History\nconst history = ref<any[]>([])\nconst historyLoading = ref(false)\n\n// Status form\nconst statusForm = ref({\n status: 'pending',\n validation_score: 0,\n reason: '',\n})\nconst statusLoading = ref(false)\n\n// ── Tab definitions ────────────────────────────────────\nconst tabs = [\n { key: 'data', label: 'Adatok', icon: 'svg' },\n { key: 'status', label: 'Státusz', icon: 'svg' },\n { key: 'validations', label: 'Validációk', icon: 'svg' },\n { key: 'history', label: 'Előzmények', icon: 'svg' },\n]\n\n// ── Computed ───────────────────────────────────────────\nconst statusBannerClass = computed(() => {\n switch (provider.value?.status) {\n case 'approved': return 'bg-emerald-500/10 border-emerald-500/30'\n case 'pending': return 'bg-amber-500/10 border-amber-500/30'\n default: return 'bg-rose-500/10 border-rose-500/30'\n }\n})\n\nconst statusIconClass = computed(() => {\n switch (provider.value?.status) {\n case 'approved': return 'bg-emerald-500/20 text-emerald-400'\n case 'pending': return 'bg-amber-500/20 text-amber-400'\n default: return 'bg-rose-500/20 text-rose-400'\n }\n})\n\nconst statusTextClass = computed(() => {\n switch (provider.value?.status) {\n case 'approved': return 'text-emerald-400'\n case 'pending': return 'text-amber-400'\n default: return 'text-rose-400'\n }\n})\n\nconst statusSubtextClass = computed(() => {\n switch (provider.value?.status) {\n case 'approved': return 'text-emerald-400/60'\n case 'pending': return 'text-amber-400/60'\n default: return 'text-rose-400/60'\n }\n})\n\n/**\n * Returns true if the provider has at least one day with opening hours set.\n */\nconst hasOpeningHours = computed(() => {\n const hours = provider.value?.opening_hours\n if (!hours || typeof hours !== 'object') return false\n return DAYS.some(day => {\n const slot = hours[day.key]\n return slot && typeof slot === 'object' && slot.open && slot.close\n })\n})\n\n/**\n * Returns true if the provider has any specializations (brands or propulsion).\n */\nconst hasSpecializations = computed(() => {\n const spec = provider.value?.specializations\n if (!spec || typeof spec !== 'object') return false\n return (Array.isArray(spec.brands) && spec.brands.length > 0) ||\n (Array.isArray(spec.propulsion) && spec.propulsion.length > 0)\n})\n\n// ── DAYS constant ──────────────────────────────────────\nconst DAYS = [\n { key: 'monday', label: 'Hétfő' },\n { key: 'tuesday', label: 'Kedd' },\n { key: 'wednesday', label: 'Szerda' },\n { key: 'thursday', label: 'Csütörtök' },\n { key: 'friday', label: 'Péntek' },\n { key: 'saturday', label: 'Szombat' },\n { key: 'sunday', label: 'Vasárnap' },\n]\n\n/**\n * Returns the opening hours slot for a given day key, or null if closed.\n */\nfunction getDayHours(dayKey: string): { open: string; close: string } | null {\n const hours = provider.value?.opening_hours\n if (!hours || typeof hours !== 'object') return null\n const slot = hours[dayKey]\n if (slot && typeof slot === 'object' && slot.open && slot.close) {\n return { open: slot.open, close: slot.close }\n }\n return null\n}\n\n// ── Helper functions ───────────────────────────────────\nfunction statusLabel(status: string): string {\n switch (status) {\n case 'approved': return 'Jóváhagyva'\n case 'pending': return 'Függőben'\n case 'rejected': return 'Elutasítva'\n default: return 'Ismeretlen'\n }\n}\n\nfunction statusDescription(status: string): string {\n switch (status) {\n case 'approved': return 'A szolgáltató aktív és látható a felhasználók számára.'\n case 'pending': return 'A szolgáltató még nem lett jóváhagyva, moderálásra vár.'\n case 'rejected': return 'A szolgáltató elutasításra került, nem látható a felhasználók számára.'\n default: return ''\n }\n}\n\n/**\n * Maps vehicle class keys to Hungarian labels.\n */\nfunction vehicleClassLabel(key: string): string {\n const labels: Record<string, string> = {\n car: 'Személyautó',\n motorcycle: 'Motorkerékpár',\n truck: 'Teherautó',\n hgv: 'Nehézgépjármű (HGV)',\n light_commercial: 'Kishaszonjármű',\n personal: 'Személyes',\n boat: 'Csónak/Vízi',\n other: 'Egyéb',\n }\n return labels[key] || key\n}\n\nfunction validationTypeLabel(type: string): string {\n const labels: Record<string, string> = {\n phone_verified: 'Telefon igazolt',\n email_verified: 'Email igazolt',\n address_verified: 'Cím igazolt',\n website_verified: 'Weboldal igazolt',\n manual_review: 'Kézi ellenőrzés',\n community_vouch: 'Közösségi ajánlás',\n business_hours: 'Nyitvatartás ellenőrzött',\n photo_evidence: 'Fénykép bizonyíték',\n }\n return labels[type] || type\n}\n\nfunction validationTypeClass(type: string): string {\n const classes: Record<string, string> = {\n phone_verified: 'bg-emerald-500/20 text-emerald-400',\n email_verified: 'bg-blue-500/20 text-blue-400',\n address_verified: 'bg-amber-500/20 text-amber-400',\n website_verified: 'bg-purple-500/20 text-purple-400',\n manual_review: 'bg-indigo-500/20 text-indigo-400',\n community_vouch: 'bg-pink-500/20 text-pink-400',\n business_hours: 'bg-cyan-500/20 text-cyan-400',\n photo_evidence: 'bg-orange-500/20 text-orange-400',\n }\n return classes[type] || 'bg-slate-500/20 text-slate-400'\n}\n\nfunction historyActionLabel(action: string): string {\n const labels: Record<string, string> = {\n approve: 'Jóváhagyás',\n reject: 'Elutasítás',\n restore: 'Visszaállítás',\n flag: 'Megjelölés',\n update: 'Módosítás',\n delete: 'Törlés',\n create: 'Létrehozás',\n }\n return labels[action] || action\n}\n\nfunction historyActionClass(action: string): string {\n const classes: Record<string, string> = {\n approve: 'bg-emerald-500/20 text-emerald-400',\n reject: 'bg-rose-500/20 text-rose-400',\n restore: 'bg-blue-500/20 text-blue-400',\n flag: 'bg-purple-500/20 text-purple-400',\n update: 'bg-amber-500/20 text-amber-400',\n delete: 'bg-red-500/20 text-red-400',\n create: 'bg-green-500/20 text-green-400',\n }\n return classes[action] || 'bg-slate-500/20 text-slate-400'\n}\n\nfunction historyDotClass(action: string): string {\n const classes: Record<string, string> = {\n approve: 'border-emerald-500 bg-emerald-500/30',\n reject: 'border-rose-500 bg-rose-500/30',\n restore: 'border-blue-500 bg-blue-500/30',\n flag: 'border-purple-500 bg-purple-500/30',\n update: 'border-amber-500 bg-amber-500/30',\n delete: 'border-red-500 bg-red-500/30',\n create: 'border-green-500 bg-green-500/30',\n }\n return classes[action] || 'border-slate-500 bg-slate-500/30'\n}\n\nfunction formatDate(dateStr: string | null | undefined): string {\n if (!dateStr) return '—'\n try {\n const d = new Date(dateStr)\n return d.toLocaleDateString('hu-HU', {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: '2-digit', minute: '2-digit',\n })\n } catch {\n return dateStr\n }\n}\n\n// ── Auth helpers ───────────────────────────────────────\nfunction getHeaders(): Record<string, string> {\n const token = useCookie('access_token').value\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (token) headers['Authorization'] = `Bearer ${token}`\n return headers\n}\n\n// ── API calls ──────────────────────────────────────────\nasync function fetchProvider() {\n loading.value = true\n error.value = false\n try {\n const res = await $fetch(`/api/v1/admin/providers/${route.params.id}`, {\n headers: getHeaders(),\n })\n provider.value = res as any\n // Initialize status form from provider data\n statusForm.value.status = (res as any).status || 'pending'\n statusForm.value.validation_score = (res as any).validation_score || 0\n } catch (err: any) {\n console.error('Failed to fetch provider:', err)\n error.value = true\n } finally {\n loading.value = false\n }\n}\n\nasync function fetchValidations() {\n validationsLoading.value = true\n try {\n const res = await $fetch(`/api/v1/admin/providers/${route.params.id}/validations`, {\n headers: getHeaders(),\n })\n validations.value = (res as any[]) || []\n } catch (err: any) {\n console.error('Failed to fetch validations:', err)\n validations.value = []\n } finally {\n validationsLoading.value = false\n }\n}\n\nasync function fetchHistory() {\n historyLoading.value = true\n try {\n const res = await $fetch(`/api/v1/admin/providers/${route.params.id}/history`, {\n headers: getHeaders(),\n })\n history.value = (res as any[]) || []\n } catch (err: any) {\n console.error('Failed to fetch history:', err)\n history.value = []\n } finally {\n historyLoading.value = false\n }\n}\n\n// ── Moderation actions ─────────────────────────────────\nasync function approveProvider() {\n actionLoading.value = true\n try {\n await $fetch(`/api/v1/admin/providers/${route.params.id}/approve`, {\n method: 'POST',\n headers: getHeaders(),\n })\n showToast('Szolgáltató jóváhagyva!', 'success')\n await fetchProvider()\n } catch (err: any) {\n showToast(err?.data?.detail || 'Hiba a jóváhagyás során', 'error')\n } finally {\n actionLoading.value = false\n }\n}\n\nasync function rejectProvider() {\n actionLoading.value = true\n try {\n await $fetch(`/api/v1/admin/providers/${route.params.id}/reject`, {\n method: 'POST',\n headers: getHeaders(),\n body: { reason: rejectReason.value || undefined },\n })\n showRejectModal.value = false\n rejectReason.value = ''\n showToast('Szolgáltató elutasítva!', 'success')\n await fetchProvider()\n } catch (err: any) {\n showToast(err?.data?.detail || 'Hiba az elutasítás során', 'error')\n } finally {\n actionLoading.value = false\n }\n}\n\nasync function restoreProvider() {\n actionLoading.value = true\n try {\n await $fetch(`/api/v1/admin/providers/${route.params.id}/restore`, {\n method: 'POST',\n headers: getHeaders(),\n body: {},\n })\n showToast('Szolgáltató visszaállítva!', 'success')\n await fetchProvider()\n } catch (err: any) {\n showToast(err?.data?.detail || 'Hiba a visszaállítás során', 'error')\n } finally {\n actionLoading.value = false\n }\n}\n\nasync function flagProvider() {\n actionLoading.value = true\n try {\n await $fetch(`/api/v1/admin/providers/${route.params.id}/flag`, {\n method: 'POST',\n headers: getHeaders(),\n body: { reason: flagReason.value || undefined },\n })\n showFlagModal.value = false\n flagReason.value = ''\n showToast('Szolgáltató megjelölve!', 'success')\n await fetchProvider()\n } catch (err: any) {\n showToast(err?.data?.detail || 'Hiba a megjelölés során', 'error')\n } finally {\n actionLoading.value = false\n }\n}\n\nasync function deleteProvider() {\n if (!confirm('Biztosan törlöd ezt a szolgáltatót? Ez a művelet nem visszavonható.')) return\n actionLoading.value = true\n try {\n await $fetch(`/api/v1/admin/providers/${route.params.id}`, {\n method: 'DELETE',\n headers: getHeaders(),\n })\n showToast('Szolgáltató törölve!', 'success')\n router.push('/providers')\n } catch (err: any) {\n showToast(err?.data?.detail || 'Hiba a törlés során', 'error')\n } finally {\n actionLoading.value = false\n }\n}\n\n// ── Status Edit (PATCH) ────────────────────────────────\nasync function saveStatusEdit() {\n statusLoading.value = true\n try {\n const body: Record<string, any> = {\n status: statusForm.value.status,\n validation_score: statusForm.value.validation_score,\n }\n if (statusForm.value.reason) {\n body.reason = statusForm.value.reason\n }\n await $fetch(`/api/v1/admin/providers/${route.params.id}`, {\n method: 'PATCH',\n headers: getHeaders(),\n body,\n })\n showToast('Státusz frissítve!', 'success')\n await fetchProvider()\n } catch (err: any) {\n showToast(err?.data?.detail || 'Hiba a státusz mentése során', 'error')\n } finally {\n statusLoading.value = false\n }\n}\n\n// ── UI helpers ─────────────────────────────────────────\nfunction openRejectModal() {\n rejectReason.value = ''\n showRejectModal.value = true\n}\n\nfunction openFlagModal() {\n flagReason.value = ''\n showFlagModal.value = true\n}\n\nfunction goBack() {\n router.push('/providers')\n}\n\nfunction showToast(message: string, type: 'success' | 'error') {\n toast.value = { message, type }\n setTimeout(() => { toast.value = null }, 4000)\n}\n\nfunction resetStatusForm() {\n if (provider.value) {\n statusForm.value.status = provider.value.status || 'pending'\n statusForm.value.validation_score = provider.value.validation_score || 0\n }\n statusForm.value.reason = ''\n}\n\n// ── Tab change watcher ─────────────────────────────────\nfunction onTabChange(tab: string) {\n if (tab === 'validations' && validations.value.length === 0) {\n fetchValidations()\n }\n if (tab === 'history' && history.value.length === 0) {\n fetchHistory()\n }\n}\n\nwatch(activeTab, onTabChange)\n\n// ── Lifecycle ──────────────────────────────────────────\nonMounted(() => {\n fetchProvider()\n})\n</script>\n\n<style scoped>\n/* Custom range slider styling */\ninput[type='range']::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #6366f1;\n cursor: pointer;\n border: 2px solid #1e293b;\n}\n\ninput[type='range']::-moz-range-thumb {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n background: #6366f1;\n cursor: pointer;\n border: 2px solid #1e293b;\n}\n\n/* Timeline animation */\n.timeline-enter-active {\n transition: all 0.3s ease-out;\n}\n\n.timeline-enter-from {\n opacity: 0;\n transform: translateX(-10px);\n}\n</style>"],"version":3}