{"id":64,"date":"2025-10-23T18:35:49","date_gmt":"2025-10-23T18:35:49","guid":{"rendered":"http:\/\/repuescar.ddns.net\/?page_id=64"},"modified":"2025-10-31T15:13:10","modified_gmt":"2025-10-31T15:13:10","slug":"repuestos-2","status":"publish","type":"page","link":"https:\/\/repuescar.ddns.net\/?page_id=64","title":{"rendered":"Repuestos"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"64\" class=\"elementor elementor-64\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ab0cde7 e-flex e-con-boxed e-con e-parent\" data-id=\"ab0cde7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c8fe23 elementor-widget elementor-widget-html\" data-id=\"0c8fe23\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Cat\u00e1logo de Repuestos<\/title>\r\n<style>\r\n  body {\r\n    font-family: 'Segoe UI', sans-serif;\r\n    margin: 0;\r\n    background: #f9f9f9;\r\n  }\r\n\r\n  h1 {\r\n    text-align: center;\r\n    color: #333;\r\n    margin-top: 25px;\r\n  }\r\n\r\n  \/* --- Bot\u00f3n admin --- *\/\r\n  #accederBtn {\r\n    position: fixed;\r\n    top: 12px;\r\n    right: 12px;\r\n    background: #060097;\r\n    color: #fff;\r\n    border: none;\r\n    padding: 6px 10px;\r\n    border-radius: 50px;\r\n    cursor: pointer;\r\n    font-size: 13px;\r\n    font-weight: bold;\r\n    transition: 0.3s;\r\n    z-index: 999;\r\n  }\r\n  #accederBtn:hover { background: #8204ff; }\r\n\r\n  \/* --- Buscador --- *\/\r\n  .search-bar {\r\n    width: 80%;\r\n    max-width: 600px;\r\n    margin: 15px auto 25px;\r\n    display: flex;\r\n    justify-content: center;\r\n  }\r\n  .search-bar input {\r\n    width: 100%;\r\n    padding: 12px 15px;\r\n    font-size: 16px;\r\n    border: 2px solid #ccc;\r\n    border-radius: 8px;\r\n    outline: none;\r\n    transition: 0.3s;\r\n  }\r\n  .search-bar input:focus {\r\n    border-color: #060097;\r\n    box-shadow: 0 0 5px rgba(6,0,151,0.3);\r\n  }\r\n\r\n  \/* --- Contenedor productos --- *\/\r\n  .container {\r\n    width: 95%;\r\n    margin: 0 auto 40px;\r\n    display: grid;\r\n    grid-template-columns: repeat(4, 1fr);\r\n    gap: 20px;\r\n  }\r\n\r\n  .item {\r\n    background: white;\r\n    border-radius: 12px;\r\n    box-shadow: 0 2px 6px rgba(0,0,0,0.1);\r\n    text-align: center;\r\n    padding: 15px;\r\n    transition: 0.2s;\r\n    position: relative;\r\n  }\r\n  .item:hover {\r\n    transform: translateY(-3px);\r\n    box-shadow: 0 4px 10px rgba(0,0,0,0.15);\r\n  }\r\n  .item img {\r\n    width: 100%;\r\n    height: 180px;\r\n    object-fit: contain;\r\n    border-radius: 8px;\r\n  }\r\n  .item h3 { font-size: 1rem; margin: 10px 0 5px; color: #222; }\r\n  .item p { color: #555; font-weight: bold; margin: 5px 0 15px; }\r\n\r\n  .whatsapp-btn {\r\n    display: inline-block;\r\n    background-color: #25d366;\r\n    color: white;\r\n    text-decoration: none;\r\n    padding: 10px 14px;\r\n    border-radius: 8px;\r\n    font-weight: 600;\r\n    transition: 0.2s;\r\n  }\r\n  .whatsapp-btn:hover { background-color: #1ebe57; }\r\n\r\n  \/* --- Panel admin --- *\/\r\n  #adminPanel {\r\n    display: none;\r\n    background: #fff;\r\n    width: 90%;\r\n    max-width: 800px;\r\n    margin: 25px auto;\r\n    padding: 20px;\r\n    border-radius: 12px;\r\n    box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n  }\r\n  #adminPanel h2 { color: #060097; margin-bottom: 10px; }\r\n  #adminPanel input, #adminPanel textarea {\r\n    width: 100%; padding: 10px; margin-bottom: 10px;\r\n    border: 1.5px solid #ccc; border-radius: 8px; font-size: 15px;\r\n  }\r\n  #adminPanel button {\r\n    background: #25d366; color: #fff; padding: 10px 18px;\r\n    border: none; border-radius: 8px; cursor: pointer;\r\n    font-weight: bold; font-size: 15px; transition: 0.3s;\r\n  }\r\n  #adminPanel button:hover { background: #1ebe57; }\r\n\r\n  @media (max-width: 1000px) { .container { grid-template-columns: repeat(2, 1fr); } }\r\n  @media (max-width: 600px) { .container { grid-template-columns: 1fr; } }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<h1>Cat\u00e1logo de Repuestos<\/h1>\r\n<button id=\"accederBtn\" onclick=\"mostrarLogin()\">Admin \ud83d\udd10<\/button>\r\n<button id=\"logoutBtn\" onclick=\"cerrarSesion()\" style=\"display:none; position:fixed; top:12px; right:90px; background:#e74c3c; color:white; border:none; padding:6px 10px; border-radius:50px; cursor:pointer; font-size:13px; font-weight:bold; transition:0.3s; z-index:999;\">\r\n  Cerrar \ud83d\udeaa\r\n<\/button>\r\n<div class=\"search-bar\">\r\n  <input type=\"text\" id=\"searchInput\" placeholder=\"Buscar por nombre o precio... \ud83d\udd0d\">\r\n<\/div>\r\n\r\n<div class=\"container\" id=\"productContainer\"><\/div>\r\n\r\n<div id=\"adminPanel\">\r\n  <h2>Agregar nuevo repuesto<\/h2>\r\n  <form id=\"formRepuesto\">\r\n    <input type=\"text\" name=\"nombre\" placeholder=\"Nombre del repuesto\" required>\r\n    <input type=\"text\" name=\"precio\" placeholder=\"Precio (ej: PYG 100.000)\" required>\r\n    <textarea name=\"descripcion\" placeholder=\"Descripci\u00f3n breve\"><\/textarea>\r\n    <input type=\"file\" name=\"imagen\" accept=\"image\/*\" required>\r\n    <button type=\"submit\">Agregar al cat\u00e1logo<\/button>\r\n  <\/form>\r\n<\/div>\r\n\r\n<script>\r\nconst ADMIN_PASSWORD = \"repuesadmin2025\";\r\nlet adminActivo = false;\r\nlet adminIndicator = null;\r\n\r\n\/\/ \ud83d\udd14 Alerta flotante\r\nfunction mostrarAlerta(mensaje, tipo = \"info\") {\r\n  const alerta = document.createElement(\"div\");\r\n  alerta.textContent = mensaje;\r\n  Object.assign(alerta.style, {\r\n    position: \"fixed\",\r\n    top: \"20px\",\r\n    left: \"50%\",\r\n    transform: \"translateX(-50%)\",\r\n    padding: \"10px 20px\",\r\n    borderRadius: \"8px\",\r\n    color: \"#fff\",\r\n    fontWeight: \"bold\",\r\n    zIndex: \"1000\",\r\n    background: tipo === \"ok\" ? \"#25d366\"\r\n              : tipo === \"error\" ? \"#e74c3c\"\r\n              : tipo === \"edit\" ? \"#f39c12\"\r\n              : \"#333\",\r\n    boxShadow: \"0 3px 10px rgba(0,0,0,0.3)\",\r\n    opacity: \"0\",\r\n    transition: \"opacity 0.5s\",\r\n  });\r\n  document.body.appendChild(alerta);\r\n  setTimeout(() => (alerta.style.opacity = \"1\"), 50);\r\n  setTimeout(() => {\r\n    alerta.style.opacity = \"0\";\r\n    setTimeout(() => alerta.remove(), 500);\r\n  }, 3000);\r\n}\r\n\r\n\/\/ \ud83d\udd11 Login admin\r\nfunction mostrarLogin() {\r\n  const pass = prompt(\"Ingrese la contrase\u00f1a de administrador:\");\r\n  if (pass === ADMIN_PASSWORD) {\r\n    adminActivo = true;\r\n    mostrarAlerta(\"\u2705 Acceso concedido\", \"ok\");\r\n    document.getElementById(\"adminPanel\").style.display = \"block\";\r\n    document.querySelectorAll(\".admin-controls\").forEach(c => (c.style.display = \"flex\"));\r\n    document.getElementById(\"logoutBtn\").style.display = \"block\";\r\n    mostrarIndicadorAdmin(true);\r\n  } else if (pass !== null) {\r\n    mostrarAlerta(\"\u274c Contrase\u00f1a incorrecta\", \"error\");\r\n  }\r\n}\r\n\r\n\/\/ \ud83d\udeaa Cerrar sesi\u00f3n\r\nfunction cerrarSesion() {\r\n  adminActivo = false;\r\n  document.getElementById(\"adminPanel\").style.display = \"none\";\r\n  document.getElementById(\"logoutBtn\").style.display = \"none\";\r\n  document.querySelectorAll(\".admin-controls\").forEach(c => (c.style.display = \"none\"));\r\n  mostrarIndicadorAdmin(false);\r\n  mostrarAlerta(\"Sesi\u00f3n cerrada\", \"info\");\r\n}\r\n\r\n\/\/ \ud83d\udfe2 Indicador de modo admin\r\nfunction mostrarIndicadorAdmin(activo) {\r\n  if (activo) {\r\n    adminIndicator = document.createElement(\"div\");\r\n    adminIndicator.textContent = \"\ud83d\udfe2 Modo Admin Activo\";\r\n    Object.assign(adminIndicator.style, {\r\n      position: \"fixed\",\r\n      bottom: \"20px\",\r\n      left: \"20px\",\r\n      background: \"#060097\",\r\n      color: \"white\",\r\n      padding: \"8px 15px\",\r\n      borderRadius: \"25px\",\r\n      fontWeight: \"bold\",\r\n      zIndex: \"1000\",\r\n      boxShadow: \"0 3px 10px rgba(0,0,0,0.3)\",\r\n      fontSize: \"14px\"\r\n    });\r\n    document.body.appendChild(adminIndicator);\r\n  } else if (adminIndicator) {\r\n    adminIndicator.remove();\r\n    adminIndicator = null;\r\n  }\r\n}\r\n\r\n\/\/ \ud83d\udd0d Buscar repuestos\r\ndocument.getElementById(\"searchInput\").addEventListener(\"input\", () => {\r\n  const query = document.getElementById(\"searchInput\").value.toLowerCase();\r\n  document.querySelectorAll(\".item\").forEach(item => {\r\n    const texto = item.textContent.toLowerCase();\r\n    item.style.display = texto.includes(query) ? \"block\" : \"none\";\r\n  });\r\n});\r\n\r\n\/\/ \ud83d\udce6 Cargar cat\u00e1logo desde JSON\r\nasync function cargarRepuestos() {\r\n  const cont = document.getElementById(\"productContainer\");\r\n  cont.innerHTML = \"\";\r\n\r\n  try {\r\n    const res = await fetch(\"\/wp-content\/uploads\/repuestos.json?cache=\" + Date.now());\r\n    const data = await res.json();\r\n    (data.length ? data : []).forEach(p => crearTarjeta(p, cont));\r\n  } catch {\r\n    mostrarAlerta(\"Error al cargar cat\u00e1logo\", \"error\");\r\n  }\r\n}\r\n\r\n\/\/ \ud83e\uddf1 Crear tarjeta\r\nfunction crearTarjeta(p, cont) {\r\n  const div = document.createElement(\"div\");\r\n  div.classList.add(\"item\");\r\n  div.innerHTML = `\r\n    <img decoding=\"async\" src=\"${p.imagen}\" alt=\"${p.nombre}\">\r\n    <div class=\"admin-controls\" style=\"display:${adminActivo ? 'flex' : 'none'}\">\r\n      <button onclick=\"editarRepuesto(this)\">\u270f\ufe0f<\/button>\r\n      <button onclick=\"eliminarRepuesto(this)\">\ud83d\uddd1\ufe0f<\/button>\r\n    <\/div>\r\n    <h3>${p.nombre}<\/h3>\r\n    <p>${p.descripcion || \"\"}<\/p>\r\n    <p><strong>${p.precio}<\/strong><\/p>\r\n    <a class=\"whatsapp-btn\" href=\"https:\/\/wa.me\/595984595427?text=Hola,%20quisiera%20consultar%20por%20${encodeURIComponent(p.nombre)}\" target=\"_blank\">Solicitar Presupuesto<\/a>\r\n  `;\r\n  cont.appendChild(div);\r\n}\r\n\r\n\/\/ \u2795 Agregar repuesto nuevo\r\ndocument.getElementById(\"formRepuesto\").addEventListener(\"submit\", async e => {\r\n  e.preventDefault();\r\n  const data = new FormData(e.target);\r\n  const res = await fetch(\"\/wp-content\/guardar_repuesto.php\", { method: \"POST\", body: data });\r\n  const json = await res.json();\r\n  if (json.mensaje) {\r\n    mostrarAlerta(\"Repuesto agregado \u2705\", \"ok\");\r\n    e.target.reset();\r\n    cargarRepuestos();\r\n  } else {\r\n    mostrarAlerta(\"Error al agregar \u274c\", \"error\");\r\n  }\r\n});\r\n\r\n\/\/ \u270f\ufe0f Editar repuesto completo\r\nasync function editarRepuesto(btn) {\r\n  const card = btn.closest(\".item\");\r\n  const nombre = card.querySelector(\"h3\").textContent;\r\n  const descripcion = card.querySelectorAll(\"p\")[0].textContent;\r\n  const precio = card.querySelectorAll(\"p strong\")[0].textContent;\r\n\r\n  const nuevoNombre = prompt(\"Nuevo nombre:\", nombre) || nombre;\r\n  const nuevaDescripcion = prompt(\"Nueva descripci\u00f3n:\", descripcion) || descripcion;\r\n  const nuevoPrecio = prompt(\"Nuevo precio:\", precio) || precio;\r\n\r\n  const cambiarImagen = confirm(\"\u00bfDeseas cambiar la imagen?\");\r\n  let nuevaImagen = null;\r\n\r\n  if (cambiarImagen) {\r\n    const input = document.createElement(\"input\");\r\n    input.type = \"file\";\r\n    input.accept = \"image\/*\";\r\n    input.onchange = async () => {\r\n      const file = input.files[0];\r\n      if (file) {\r\n        const formData = new FormData();\r\n        formData.append(\"accion\", \"editar\");\r\n        formData.append(\"nombreOriginal\", nombre);\r\n        formData.append(\"nombre\", nuevoNombre);\r\n        formData.append(\"descripcion\", nuevaDescripcion);\r\n        formData.append(\"precio\", nuevoPrecio);\r\n        formData.append(\"imagen\", file);\r\n\r\n        const res = await fetch(\"\/wp-content\/guardar_repuesto.php\", { method: \"POST\", body: formData });\r\n        const json = await res.json();\r\n        if (json.mensaje) {\r\n          mostrarAlerta(\"Repuesto editado \u270f\ufe0f\", \"edit\");\r\n          cargarRepuestos();\r\n        }\r\n      }\r\n    };\r\n    input.click();\r\n  } else {\r\n    const res = await fetch(\"\/wp-content\/guardar_repuesto.php\", {\r\n      method: \"POST\",\r\n      headers: { \"Content-Type\": \"application\/json\" },\r\n      body: JSON.stringify({\r\n        accion: \"editar\",\r\n        nombreOriginal: nombre,\r\n        nombre: nuevoNombre,\r\n        descripcion: nuevaDescripcion,\r\n        precio: nuevoPrecio\r\n      })\r\n    });\r\n    const json = await res.json();\r\n    if (json.mensaje) {\r\n      mostrarAlerta(\"Repuesto editado \u270f\ufe0f\", \"edit\");\r\n      cargarRepuestos();\r\n    }\r\n  }\r\n}\r\n\r\n\/\/ \ud83d\uddd1\ufe0f Eliminar repuesto\r\nasync function eliminarRepuesto(btn) {\r\n  const card = btn.closest(\".item\");\r\n  const nombre = card.querySelector(\"h3\").textContent;\r\n  if (!confirm(\"\u00bfEliminar \" + nombre + \"?\")) return;\r\n\r\n  const res = await fetch(\"\/wp-content\/guardar_repuesto.php\", {\r\n    method: \"POST\",\r\n    headers: { \"Content-Type\": \"application\/json\" },\r\n    body: JSON.stringify({ accion: \"eliminar\", nombre })\r\n  });\r\n  const json = await res.json();\r\n  if (json.mensaje) {\r\n    mostrarAlerta(\"Repuesto eliminado \u274c\", \"error\");\r\n    cargarRepuestos();\r\n  }\r\n}\r\n\r\ncargarRepuestos();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Cat\u00e1logo de Repuestos Cat\u00e1logo de Repuestos Admin \ud83d\udd10 Cerrar \ud83d\udeaa Agregar nuevo repuesto Agregar al cat\u00e1logo<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-64","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=\/wp\/v2\/pages\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=64"}],"version-history":[{"count":53,"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=\/wp\/v2\/pages\/64\/revisions"}],"predecessor-version":[{"id":211,"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=\/wp\/v2\/pages\/64\/revisions\/211"}],"wp:attachment":[{"href":"https:\/\/repuescar.ddns.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}