// ─── K&N Elite — Admin (unified light) ───
const { useState } = React;
const ADMIN_REQUESTS = [
{ id: "R-1042", date: "24 Apr · 14:22", name: "María Fernández", phone: "+34 612 345 678", address: "Calle Serrano 42, Madrid", type: "valuation", status: "new", mgr: "—", lang: "ES" },
{ id: "R-1041", date: "24 Apr · 13:58", name: "Ivan Petrov", phone: "+34 698 221 044", address: "Paseo de Gracia 89, Barcelona", type: "visit", status: "in_progress", mgr: "C. Tenorio", lang: "RU" },
{ id: "R-1040", date: "24 Apr · 12:30", name: "Laura Giménez", phone: "+34 600 147 852", address: "Av. del Puerto 118, Valencia", type: "valuation", status: "in_progress", mgr: "L. Ramos", lang: "ES" },
{ id: "R-1039", date: "24 Apr · 11:04", name: "Hans Müller", phone: "+49 170 444 888", address: "Calle Mayor 7, Alicante", type: "valuation", status: "done", mgr: "A. Vidal", lang: "EN" },
{ id: "R-1038", date: "23 Apr · 19:41", name: "Olga Sokolova", phone: "+34 611 909 012", address: "Calle Velázquez 80, Madrid", type: "valuation", status: "new", mgr: "—", lang: "RU" },
{ id: "R-1037", date: "23 Apr · 17:20", name: "Thomas Lefevre", phone: "+33 633 121 212", address: "Calle Alcalá 200, Madrid", type: "out", status: "new", mgr: "—", lang: "EN" },
{ id: "R-1036", date: "23 Apr · 15:55", name: "Elena García", phone: "+34 622 334 455", address: "Calle Gran Vía 34, Madrid", type: "visit", status: "done", mgr: "C. Tenorio", lang: "ES" },
];
function AdminShell({ onNav, tab, setTab, children }) {
const { t } = useI18n();
return (
ADMIN · INTERNAL
{[
{ k: "requests", l: t("adm_requests") },
{ k: "clients", l: t("adm_clients") },
{ k: "properties", l: t("adm_properties") },
{ k: "analytics", l: t("adm_analytics") },
{ k: "users", l: t("adm_users") },
].map(it => (
))}
{children}
);
}
function AdminRequests({ onOpen }) {
const { t } = useI18n();
const [filter, setFilter] = useState("all");
const [search, setSearch] = useState("");
const filtered = ADMIN_REQUESTS.filter(r => {
if (filter !== "all" && r.status !== filter) return false;
if (search && !(r.name.toLowerCase().includes(search.toLowerCase()) ||
r.address.toLowerCase().includes(search.toLowerCase()) ||
r.phone.includes(search))) return false;
return true;
});
const tone = { new: "var(--gold)", in_progress: "var(--warn)", done: "var(--ok)", error: "var(--err)" };
const lbl = { new: t("adm_st_new"), in_progress: t("adm_st_prog"), done: t("adm_st_done"), error: t("adm_st_err") };
const typeLbl = { valuation: t("adm_type_val"), visit: t("adm_type_visit"), out: t("adm_type_out") };
return (
{[{ k: "all", l: t("adm_all") }, { k: "new", l: t("adm_st_new") }, { k: "in_progress", l: t("adm_st_prog") }, { k: "done", l: t("adm_st_done") }].map(f => (
))}
{t("adm_date")}
{t("adm_client")}
{t("adm_phone")}
{t("adm_address")}
{t("adm_type")}
{t("adm_status")}
{t("adm_mgr")}
{t("adm_lang")}
{filtered.map(r => (
onOpen(r)}
style={{
display: "grid", gridTemplateColumns: "130px 1fr 1.1fr 1.5fr 100px 120px 120px 50px",
padding: "18px 24px", borderBottom: "1px solid var(--ink-10)",
fontSize: 13, cursor: "pointer", alignItems: "center", transition: "all .2s",
}}
onMouseEnter={e => e.currentTarget.style.background = "var(--gold-10)"}
onMouseLeave={e => e.currentTarget.style.background = "transparent"}>
{r.date}
{r.name}
{r.phone}
{r.address}
{typeLbl[r.type]}
{lbl[r.status]}
{r.mgr}
{r.lang}
))}
);
}
function AdminRequestModal({ req, onClose }) {
const { t } = useI18n();
if (!req) return null;
return (
e.stopPropagation()}
style={{
width: "min(880px, 94vw)", maxHeight: "90vh", overflow: "auto",
background: "var(--paper)", animation: "scale-in .35s", borderRadius: 2,
}}>
{t("adm_card_data")}
Phone: {req.phone}
Address: {req.address}
Language: {req.lang}
Area: 112 m² · 3 rooms · 2 baths
{t("adm_card_history")}
- 14:22 · Received from form
- 14:23 · Catastro matched
- 14:24 · Auto-valuation ready
{t("adm_card_auto")}
Market: 305 000 €
Target: 325 000 – 340 000 €
);
}
function AdminClients() {
return (
02
Клиенты
{[
{ n: "María Fernández", p: "+34 612 345 678", e: "maria@mail.es", l: "ES", v: 3, d: "12 Apr 2026" },
{ n: "Ivan Petrov", p: "+34 698 221 044", e: "i.petrov@mail.ru", l: "RU", v: 2, d: "14 Apr 2026" },
{ n: "Hans Müller", p: "+49 170 444 888", e: "h.muller@mail.de", l: "EN", v: 1, d: "18 Apr 2026" },
{ n: "Laura Giménez", p: "+34 600 147 852", e: "l.gimenez@mail.es", l: "ES", v: 1, d: "22 Apr 2026" },
].map((r, i) => (
{r.n}
{r.p}
{r.e}
{r.l}
{r.v}
{r.d}
))}
);
}
function AdminProperties() {
const items = [
{ a: "Calle Serrano 42, Madrid", p: "325–340k €", s: "3 valuations", ph: PHOTOS.apt1 },
{ a: "Paseo de Gracia 89, Barcelona", p: "830–880k €", s: "1 valuation", ph: PHOTOS.apt2 },
{ a: "Av. del Puerto 118, Valencia", p: "224–234k €", s: "1 valuation", ph: PHOTOS.apt3 },
{ a: "Calle Velázquez 80, Madrid", p: "280–295k €", s: "2 valuations", ph: PHOTOS.apt4 },
{ a: "Calle Mayor 7, Alicante", p: "165–178k €", s: "1 valuation", ph: PHOTOS.apt5 },
{ a: "Calle Goya 104, Madrid", p: "305–320k €", s: "2 valuations", ph: PHOTOS.apt6 },
];
return (
03
Объекты
{items.map((o, i) => (
))}
);
}
function AdminAnalytics() {
const { t } = useI18n();
const steps = [
{ l: t("adm_kpi_visitors"), v: 3842 },
{ l: t("adm_kpi_leads"), v: 1654 },
{ l: t("adm_kpi_reports"), v: 1421 },
{ l: t("adm_kpi_visits"), v: 388 },
{ l: t("adm_kpi_excl"), v: 142 },
];
const max = steps[0].v;
return (
04
Аналитика
{steps.map((k, i) => {
const v = useCountUp(k.v, 1600 + i * 200);
return (
{k.l}
{v}
{i > 0 && (
{Math.round(k.v / steps[i - 1].v * 100)}% {t("adm_conv")}
)}
);
})}
{t("adm_funnel")}
{steps.map((k, i) => (
))}
);
}
function AdminUsers() {
return (
05
Пользователи
{[
{ n: "Carlos Tenorio", e: "c.tenorio@kn-elite.es", r: "Administrator", a: "Now" },
{ n: "Laura Ramos", e: "l.ramos@kn-elite.es", r: "Manager", a: "2h ago" },
{ n: "Adrián Vidal", e: "a.vidal@kn-elite.es", r: "Manager", a: "1d ago" },
{ n: "Nicolás K.", e: "owner@kn-elite.es", r: "Observer", a: "3d ago" },
].map((u, i) => (
))}
);
}
Object.assign(window, { AdminShell, AdminRequests, AdminRequestModal, AdminClients, AdminProperties, AdminAnalytics, AdminUsers });