"use client"; /** * TEE OFF ADMIN DASHBOARD v4.0 - KONTROLLPANEL */ import { useEffect, useMemo, useRef, useState } from 'react'; import { API_URL } from "@/config/constants"; import { adminFetch } from "@/config/adminFetch"; import ScrapeMethodSelect from "@/components/ScrapeMethodSelect"; import Link from 'next/link'; type AdminTab = 'banestatus' | 'medlemskap' | 'greenfee' | 'vtg'; type ScrapeJobStatus = 'pending' | 'running' | 'completed' | 'failed'; type ScrapeJob = { id: number; job_type: AdminTab; status: ScrapeJobStatus; facility_ids: number[]; total_facilities: number; error_message?: string | null; result_summary?: Record; created_at?: string | null; started_at?: string | null; finished_at?: string | null; }; type TwoFactorSetupResponse = { issuer: string; account_name: string; otp_secret: string; provisioning_uri: string; qr_svg: string; }; const JOB_LABELS: Record = { banestatus: 'Banestatus', medlemskap: 'Medlemskap', greenfee: 'Greenfee', vtg: 'VTG', }; const JOB_STATUS_LABELS: Record = { pending: 'I kø', running: 'Kjører', completed: 'Fullført', failed: 'Feilet', }; const InlineEdit = ({ facilityId, field, initialValue, onSave }: { facilityId: number, field: string, initialValue: string, onSave: (id: number, field: string, val: string) => void }) => { const [isEditing, setIsEditing] = useState(false); const [value, setValue] = useState(initialValue || ''); const handleSave = () => { setIsEditing(false); if (value !== initialValue) { onSave(facilityId, field, value); } }; if (isEditing) { return (