import { _ as __nuxt_component_0 } from './nuxt-link-1NBbHb-h.mjs'; import { u as useCategories, _ as _sfc_main$1 } from './useCategories-CDBFMe6d.mjs'; import { defineComponent, ref, computed, watch, createVNode, resolveDynamicComponent, unref, withCtx, openBlock, createBlock, createTextVNode, toDisplayString, useSSRContext } from 'vue'; import { ssrRenderAttrs, ssrInterpolate, ssrRenderClass, ssrRenderList, ssrRenderVNode, ssrRenderStyle, ssrRenderAttr, ssrRenderComponent, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderTeleport } from 'vue/server-renderer'; import { useRoute, useRouter } from 'vue-router'; import { a as useI18n, d as useCookie } from './server.mjs'; import { _ as _export_sfc } from './_plugin-vue_export-helper-1tPrXgE0.mjs'; import '../nitro/nitro.mjs'; import 'node:http'; import 'node:https'; import 'node:events'; import 'node:buffer'; import 'node:fs'; import 'node:path'; import 'node:crypto'; import 'node:url'; import 'pinia'; import '../routes/renderer.mjs'; import 'vue-bundle-renderer/runtime'; import 'unhead/server'; import 'devalue'; import 'unhead/utils'; import 'unhead/plugins'; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "index", __ssrInlineRender: true, setup(__props) { const { t } = useI18n(); const route = useRoute(); useRouter(); const { getCategoryName } = useCategories(); const loading = ref(true); const error = ref(false); const provider = ref(null); const actionLoading = ref(false); const isRawDataDrawerOpen = ref(false); const drawerWidth = ref(512); ref(false); ref(null); const showRejectModal = ref(false); const rejectReason = ref(""); const showFlagModal = ref(false); const flagReason = ref(""); const activeTab = ref("data"); const validations = ref([]); const validationsLoading = ref(false); const history = ref([]); const historyLoading = ref(false); const statusForm = ref({ status: "pending", validation_score: 0, reason: "" }); const statusLoading = ref(false); const tabs = [ { key: "data", label: "providers.detail_tab_data", icon: "svg" }, { key: "status", label: "providers.detail_tab_status", icon: "svg" }, { key: "validations", label: "providers.detail_tab_validations", icon: "svg" }, { key: "crawler", label: "providers.detail_tab_crawler", icon: "svg" }, { key: "history", label: "providers.detail_tab_history", icon: "svg" } ]; const statusBannerClass = computed(() => { var _a; switch ((_a = provider.value) == null ? void 0 : _a.status) { case "approved": return "bg-emerald-500/10 border-emerald-500/30"; case "pending": return "bg-amber-500/10 border-amber-500/30"; case "research_in_progress": return "bg-blue-500/10 border-blue-500/30"; default: return "bg-rose-500/10 border-rose-500/30"; } }); const statusIconClass = computed(() => { var _a; switch ((_a = provider.value) == null ? void 0 : _a.status) { case "approved": return "bg-emerald-500/20 text-emerald-400"; case "pending": return "bg-amber-500/20 text-amber-400"; case "research_in_progress": return "bg-blue-500/20 text-blue-400"; default: return "bg-rose-500/20 text-rose-400"; } }); const statusTextClass = computed(() => { var _a; switch ((_a = provider.value) == null ? void 0 : _a.status) { case "approved": return "text-emerald-400"; case "pending": return "text-amber-400"; case "research_in_progress": return "text-blue-400"; default: return "text-rose-400"; } }); const statusSubtextClass = computed(() => { var _a; switch ((_a = provider.value) == null ? void 0 : _a.status) { case "approved": return "text-emerald-400/60"; case "pending": return "text-amber-400/60"; case "research_in_progress": return "text-blue-400/60"; default: return "text-rose-400/60"; } }); const hasOpeningHours = computed(() => { var _a; const hours = (_a = provider.value) == null ? void 0 : _a.opening_hours; if (!hours || typeof hours !== "object") return false; return DAYS.some((day) => { const slot = hours[day.key]; return slot && typeof slot === "object" && slot.open && slot.close; }); }); const hasSpecializations = computed(() => { var _a; const spec = (_a = provider.value) == null ? void 0 : _a.specializations; if (!spec || typeof spec !== "object") return false; return Array.isArray(spec.brands) && spec.brands.length > 0 || Array.isArray(spec.propulsion) && spec.propulsion.length > 0; }); const trustScoreBadgeClass = computed(() => { var _a; const score = (_a = provider.value) == null ? void 0 : _a.trust_score; if (score === null || score === void 0) return "bg-slate-700 text-slate-400"; if (score > 80) return "bg-emerald-500/20 text-emerald-400 border border-emerald-500/30"; if (score > 50) return "bg-amber-500/20 text-amber-400 border border-amber-500/30"; return "bg-rose-500/20 text-rose-400 border border-rose-500/30"; }); const DAYS = [ { key: "monday", label: "providers.detail_day_monday" }, { key: "tuesday", label: "providers.detail_day_tuesday" }, { key: "wednesday", label: "providers.detail_day_wednesday" }, { key: "thursday", label: "providers.detail_day_thursday" }, { key: "friday", label: "providers.detail_day_friday" }, { key: "saturday", label: "providers.detail_day_saturday" }, { key: "sunday", label: "providers.detail_day_sunday" } ]; function getDayHours(dayKey) { var _a; const hours = (_a = provider.value) == null ? void 0 : _a.opening_hours; if (!hours || typeof hours !== "object") return null; const slot = hours[dayKey]; if (slot && typeof slot === "object" && slot.open && slot.close) { return { open: slot.open, close: slot.close }; } return null; } function statusLabel(status) { switch (status) { case "approved": return "providers.detail_status_approved"; case "pending": return "providers.detail_status_pending"; case "research_in_progress": return "providers.detail_status_research"; case "rejected": return "providers.detail_status_rejected"; default: return "providers.detail_status_unknown"; } } function statusDescription(status) { switch (status) { case "approved": return "providers.detail_status_desc_approved"; case "pending": return "providers.detail_status_desc_pending"; case "research_in_progress": return "providers.detail_status_desc_research"; case "rejected": return "providers.detail_status_desc_rejected"; default: return ""; } } function vehicleClassLabel(key) { const labels = { car: "providers.detail_vehicle_class_car", motorcycle: "providers.detail_vehicle_class_motorcycle", truck: "providers.detail_vehicle_class_truck", hgv: "providers.detail_vehicle_class_hgv", light_commercial: "providers.detail_vehicle_class_light_commercial", personal: "providers.detail_vehicle_class_personal", boat: "providers.detail_vehicle_class_boat", other: "providers.detail_vehicle_class_other" }; return labels[key] || key; } function validationTypeLabel(type) { const labels = { phone_verified: "providers.detail_validation_type_phone_verified", email_verified: "providers.detail_validation_type_email_verified", address_verified: "providers.detail_validation_type_address_verified", website_verified: "providers.detail_validation_type_website_verified", manual_review: "providers.detail_validation_type_manual_review", community_vouch: "providers.detail_validation_type_community_vouch", business_hours: "providers.detail_validation_type_business_hours", photo_evidence: "providers.detail_validation_type_photo_evidence" }; return labels[type] || type; } function validationTypeClass(type) { const classes = { phone_verified: "bg-emerald-500/20 text-emerald-400", email_verified: "bg-blue-500/20 text-blue-400", address_verified: "bg-amber-500/20 text-amber-400", website_verified: "bg-purple-500/20 text-purple-400", manual_review: "bg-indigo-500/20 text-indigo-400", community_vouch: "bg-pink-500/20 text-pink-400", business_hours: "bg-cyan-500/20 text-cyan-400", photo_evidence: "bg-orange-500/20 text-orange-400" }; return classes[type] || "bg-slate-500/20 text-slate-400"; } function historyActionLabel(action) { const labels = { approve: "providers.detail_history_action_approve", reject: "providers.detail_history_action_reject", restore: "providers.detail_history_action_restore", flag: "providers.detail_history_action_flag", update: "providers.detail_history_action_update", delete: "providers.detail_history_action_delete", create: "providers.detail_history_action_create" }; return labels[action] || action; } function historyActionClass(action) { const classes = { approve: "bg-emerald-500/20 text-emerald-400", reject: "bg-rose-500/20 text-rose-400", restore: "bg-blue-500/20 text-blue-400", flag: "bg-purple-500/20 text-purple-400", update: "bg-amber-500/20 text-amber-400", delete: "bg-red-500/20 text-red-400", create: "bg-green-500/20 text-green-400" }; return classes[action] || "bg-slate-500/20 text-slate-400"; } function historyDotClass(action) { const classes = { approve: "border-emerald-500 bg-emerald-500/30", reject: "border-rose-500 bg-rose-500/30", restore: "border-blue-500 bg-blue-500/30", flag: "border-purple-500 bg-purple-500/30", update: "border-amber-500 bg-amber-500/30", delete: "border-red-500 bg-red-500/30", create: "border-green-500 bg-green-500/30" }; return classes[action] || "border-slate-500 bg-slate-500/30"; } function formatDate(dateStr) { if (!dateStr) return "\u2014"; try { const d = new Date(dateStr); return d.toLocaleDateString("hu-HU", { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" }); } catch { return dateStr; } } function getHeaders() { const token = useCookie("access_token").value; const headers = { "Content-Type": "application/json" }; if (token) headers["Authorization"] = `Bearer ${token}`; return headers; } async function fetchValidations() { validationsLoading.value = true; try { const res = await $fetch(`/api/v1/admin/providers/${route.params.id}/validations`, { headers: getHeaders() }); validations.value = res || []; } catch (err) { console.error("Failed to fetch validations:", err); validations.value = []; } finally { validationsLoading.value = false; } } async function fetchHistory() { historyLoading.value = true; try { const res = await $fetch(`/api/v1/admin/providers/${route.params.id}/history`, { headers: getHeaders() }); history.value = res || []; } catch (err) { console.error("Failed to fetch history:", err); history.value = []; } finally { historyLoading.value = false; } } function onTabChange(tab) { if (tab === "validations" && validations.value.length === 0) { fetchValidations(); } if (tab === "history" && history.value.length === 0) { fetchHistory(); } } watch(activeTab, onTabChange); return (_ctx, _push, _parent, _attrs) => { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m; const _component_NuxtLink = __nuxt_component_0; const _component_RawDataViewer = _sfc_main$1; _push(`
${ssrInterpolate(((_a = provider.value) == null ? void 0 : _a.name) || _ctx.$t("providers.detail_provider_number", { id: _ctx.$route.params.id }))}
${ssrInterpolate(_ctx.$t("providers.error"))}
${ssrInterpolate(_ctx.$t("providers.detail_not_found"))}
${ssrInterpolate(_ctx.$t(statusLabel(provider.value.status)))}
${ssrInterpolate(_ctx.$t(statusDescription(provider.value.status)))}
${ssrInterpolate(provider.value.source)}${ssrInterpolate(_ctx.$t("providers.detail_no_categories"))}
`); } _push(`${ssrInterpolate(_ctx.$t("providers.detail_no_vehicle_classes"))}
`); } _push(`${ssrInterpolate(_ctx.$t("providers.detail_no_specializations"))}
`); } _push(`| ${ssrInterpolate(_ctx.$t("providers.detail_day_label"))} | ${ssrInterpolate(_ctx.$t("providers.detail_hours_label"))} |
|---|---|
| ${ssrInterpolate(_ctx.$t(day.label))} | `); if (getDayHours(day.key)) { _push(`${ssrInterpolate((_a2 = getDayHours(day.key)) == null ? void 0 : _a2.open)}\u2013${ssrInterpolate((_b2 = getDayHours(day.key)) == null ? void 0 : _b2.close)}`); } else { _push(`${ssrInterpolate(_ctx.$t("providers.detail_closed"))}`); } _push(` |
${ssrInterpolate(_ctx.$t("providers.detail_no_opening_hours"))}
${ssrInterpolate(_ctx.$t("providers.detail_status_rejected_or_flagged", { action: provider.value.status === "rejected" ? _ctx.$t("providers.detail_status_rejected_text") : _ctx.$t("providers.detail_status_flagged_text") }))}
`); _push(ssrRenderComponent(_component_NuxtLink, { to: `/providers/${provider.value.id}/edit`, 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" }, { default: withCtx((_, _push2, _parent2, _scopeId) => { if (_push2) { _push2(` ${ssrInterpolate(_ctx.$t("providers.detail_edit"))}`); } else { return [ (openBlock(), createBlock("svg", { class: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, [ createVNode("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" }) ])), createTextVNode(" " + toDisplayString(_ctx.$t("providers.detail_edit")), 1) ]; } }), _: 1 }, _parent)); if (provider.value.status === "rejected") { _push(``); } else { _push(``); } _push(`${ssrInterpolate(_ctx.$t("providers.detail_status_form_desc"))}
${ssrInterpolate(_ctx.$t("providers.detail_validation_score_desc"))}
${ssrInterpolate(_ctx.$t("providers.detail_validation_list_desc"))}
`); if (validationsLoading.value) { _push(``); } else if (validations.value.length === 0) { _push(`${ssrInterpolate(_ctx.$t("providers.detail_validation_no_entries"))}
${ssrInterpolate(_ctx.$t("providers.detail_validation_voter"))}: ${ssrInterpolate(v.voter_name || `User #${v.voter_user_id}`)}
`); if ((_a2 = v.validation_metadata) == null ? void 0 : _a2.reason) { _push(`${ssrInterpolate(_ctx.$t("providers.detail_validation_reason"))}: ${ssrInterpolate(v.validation_metadata.reason)}
`); } else { _push(``); } _push(`${ssrInterpolate(_ctx.$t("providers.detail_crawler_desc"))}
${ssrInterpolate(provider.value.source || "\u2014")}${ssrInterpolate(_ctx.$t("providers.detail_crawler_rejection_reason_title"))}
${ssrInterpolate(provider.value.rejection_reason)}
${ssrInterpolate(_ctx.$t("providers.detail_history_desc"))}
`); if (historyLoading.value) { _push(``); } else if (history.value.length === 0) { _push(`${ssrInterpolate(_ctx.$t("providers.detail_history_no_entries"))}
${ssrInterpolate(_ctx.$t("providers.reject_modal_body", { name: (_l = provider.value) == null ? void 0 : _l.name }))}
${ssrInterpolate(_ctx.$t("providers.detail_flag_modal_body", { name: (_m = provider.value) == null ? void 0 : _m.name }))}
${ssrInterpolate(((_a2 = provider.value) == null ? void 0 : _a2.source) || "\u2014")}${ssrInterpolate(_ctx.$t("providers.detail_crawler_rejection_reason_title"))}
${ssrInterpolate(provider.value.rejection_reason)}