1 line
62 KiB
JSON
1 line
62 KiB
JSON
{"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} |