This commit is contained in:
naielv
2025-09-09 16:16:31 +02:00
parent 673d64e720
commit ac68228e26
2 changed files with 219 additions and 261 deletions

View File

@@ -768,15 +768,13 @@ function TS_IndexElement(
return false;
}
function render() {
// --- Optimized render function ---
let lastSearchValue = "";
let lastFilteredSorted = [];
function sorter(a, b) {
// If both items have Fecha field, sort by date first
if (a.Fecha && b.Fecha) {
// Primary sort by date
if (a.Fecha < b.Fecha) return -1;
if (a.Fecha > b.Fecha) return 1;
// Secondary sort by Nombre if dates are equal and both have names
if (a.Nombre && b.Nombre) {
const nameA = a.Nombre.toLowerCase();
const nameB = b.Nombre.toLowerCase();
@@ -785,9 +783,7 @@ function TS_IndexElement(
}
return 0;
}
// If persona field exists, sort by Region, then by Nombre
if (a.Persona && b.Persona) {
console.log(a.Persona, SC_Personas[a.Persona])
const personaA = SC_Personas[a.Persona] || { Nombre: "", Region: "" };
const personaB = SC_Personas[b.Persona] || { Nombre: "", Region: "" };
if (personaA.Region < personaB.Region) return -1;
@@ -796,7 +792,6 @@ function TS_IndexElement(
if (personaA.Nombre > personaB.Nombre) return 1;
return 0;
}
// If no Fecha field exists, sort only by Nombre
if (a.Nombre && b.Nombre) {
const nameA = a.Nombre.toLowerCase();
const nameB = b.Nombre.toLowerCase();
@@ -804,42 +799,49 @@ function TS_IndexElement(
if (nameA > nameB) return 1;
return 0;
}
return 0;
}
const searchValue = searchKeyEl.value.toLowerCase().trim();
tablebody_EL.innerHTML = "";
Object.entries(rows)
function getFilteredSortedRows(searchValue) {
// Only use cache if searchValue is not empty and cache is valid
if (searchValue && searchValue === lastSearchValue && lastFilteredSorted.length > 0) {
return lastFilteredSorted;
}
const filtered = Object.entries(rows)
.filter(([_, data]) => searchInData(data, searchValue, config))
.map(([_, data]) => data)
.sort(sorter)
.forEach((data) => {
var new_tr = document.createElement("tr");
.sort(sorter);
lastSearchValue = searchValue;
lastFilteredSorted = filtered;
return filtered;
}
if (canAddCallback != undefined) {
if (canAddCallback(data) == true) {
return;
function render() {
const searchValue = searchKeyEl.value.toLowerCase().trim();
// Use document fragment for batch DOM update
const fragment = document.createDocumentFragment();
const filteredSorted = getFilteredSortedRows(searchValue);
for (let i = 0; i < filteredSorted.length; i++) {
const data = filteredSorted[i];
if (canAddCallback != undefined && canAddCallback(data) === true) {
continue;
}
}
tablebody_EL.append(new_tr);
const new_tr = document.createElement("tr");
if (rowCallback != undefined) {
rowCallback(data, new_tr);
}
config.forEach((key) => {
switch (key.type) {
case "raw":
case "text":
case "text": {
const tdRaw = document.createElement("td");
const rawContent = (String(data[key.key]) || key.default || "").replace(
/\n/g,
"<br>"
);
const rawContent = (String(data[key.key]) || key.default || "").replace(/\n/g, "<br>");
tdRaw.innerHTML = rawContent;
new_tr.appendChild(tdRaw);
break;
}
case "fecha":
case "fecha-iso":
case "fecha-iso": {
const tdFechaISO = document.createElement("td");
if (data[key.key]) {
const fechaArray = data[key.key].split("-");
@@ -847,29 +849,27 @@ function TS_IndexElement(
}
new_tr.appendChild(tdFechaISO);
break;
case "template":
}
case "template": {
const tdCustomTemplate = document.createElement("td");
new_tr.appendChild(tdCustomTemplate);
key.template(data, tdCustomTemplate);
break;
case "comanda":
}
case "comanda": {
const tdComanda = document.createElement("td");
tdComanda.style.verticalAlign = "top";
const parsedComanda = JSON.parse(data.Comanda);
const precio = SC_priceCalc(parsedComanda)[0];
// Create a temporary div to parse the HTML from setLayeredImages
const tempDiv = document.createElement("div");
tempDiv.innerHTML = setLayeredImages(parsedComanda, data._key);
tdComanda.appendChild(tempDiv.firstChild);
const pre = document.createElement("pre");
pre.style.fontSize = "15px";
pre.style.display = "inline-block";
pre.style.margin = "0";
pre.style.verticalAlign = "top";
pre.style.padding = "5px";
//looking like a post-it
pre.style.background = "rgba(255, 255, 0, 0.5)";
pre.style.border = "1px solid rgba(0, 0, 0, 0.2)";
pre.style.borderRadius = "5px";
@@ -877,20 +877,16 @@ function TS_IndexElement(
pre.style.height = "100%";
const spanPrecio = document.createElement("span");
spanPrecio.style.fontSize = "20px";
spanPrecio.innerHTML =
SC_Personas[data.Persona].Puntos >= 10 ?
`Total: Gratis!(${precio}c)` :
`Total: ${precio}c`;
spanPrecio.innerHTML = SC_Personas[data.Persona].Puntos >= 10 ? `Total: Gratis!(${precio}c)` : `Total: ${precio}c`;
pre.innerHTML = "<b>Ticket de compra</b> ";
pre.appendChild(document.createTextNode("\n"));
pre.innerHTML +=
SC_parse_short(parsedComanda) + "<hr>" + data.Notas + "<hr>";
pre.innerHTML += SC_parse_short(parsedComanda) + "<hr>" + data.Notas + "<hr>";
pre.appendChild(spanPrecio);
tdComanda.appendChild(pre);
new_tr.appendChild(tdComanda);
break;
case "comanda-status":
}
case "comanda-status": {
var sc_nobtn = "";
if (urlParams.get("sc_nobtn") == "yes") {
sc_nobtn = "pointer-events: none; opacity: 0.5";
@@ -901,8 +897,6 @@ function TS_IndexElement(
td.style.pointerEvents = "none";
td.style.opacity = "0.5";
}
// Create buttons
const createButton = (text, state) => {
const button = document.createElement("button");
button.textContent = text;
@@ -913,7 +907,7 @@ function TS_IndexElement(
event.preventDefault();
event.stopPropagation();
data.Estado = state;
var enc = TS_encrypt(data, SECRET, (encrypted) => {
TS_encrypt(data, SECRET, (encrypted) => {
betterGunPut(ref.get(data._key), encrypted);
toastr.success("Guardado!");
});
@@ -921,8 +915,6 @@ function TS_IndexElement(
};
return button;
};
// Create all buttons
const buttons = [
createButton("Pedido", "Pedido"),
createButton("En preparación", "En preparación"),
@@ -930,18 +922,12 @@ function TS_IndexElement(
createButton("Entregado", "Entregado"),
createButton("Deuda", "Deuda"),
];
// Create paid button separately due to different behavior
const paidButton = document.createElement("button");
paidButton.textContent = "Pagado";
paidButton.onclick = (event) => {
event.preventDefault();
event.stopPropagation();
if (
!confirm(
"¿Quieres marcar como pagado? - Se borrara la comanda y se actualizarán los puntos."
)
) {
if (!confirm("¿Quieres marcar como pagado? - Se borrara la comanda y se actualizarán los puntos.")) {
return false;
}
data.Estado = "Pagado";
@@ -949,64 +935,39 @@ function TS_IndexElement(
toastr.success("Guardado!");
if (SC_Personas[data.Persona].Puntos >= 10 && confirm("¿Pagar con Puntos? - Cancela para pagar con Efectivo.")) {
SC_Personas[data.Persona].Puntos = parseInt(SC_Personas[data.Persona].Puntos) - 10;
toastr.success(
"¡Comada gratis para " +
SC_Personas[data.Persona].Nombre +
"!"
);
toastr.success(
"¡Comada gratis para " +
SC_Personas[data.Persona].Nombre +
"!"
);
toastr.success("¡Comada gratis para " + SC_Personas[data.Persona].Nombre + "!");
toastr.success("¡Comada gratis para " + SC_Personas[data.Persona].Nombre + "!");
} else {
SC_Personas[data.Persona].Puntos = parseInt(SC_Personas[data.Persona].Puntos) + 1;
toastr.success("¡Comada DE PAGO!");
}
TS_encrypt(SC_Personas[data.Persona], SECRET, (encrypted) => {
betterGunPut(
gun.get(TABLE).get("personas").get(data.Persona),
encrypted
);
betterGunPut(gun.get(TABLE).get("personas").get(data.Persona), encrypted);
});
return false;
};
// Add all buttons to td with line breaks between
buttons.forEach((button) => {
td.appendChild(button);
td.appendChild(document.createElement("br"));
});
td.appendChild(paidButton);
new_tr.appendChild(td);
// Event handlers are now attached during button creation
break;
case "persona":
if (key.self == true) {
var persona = data
} else {
var persona = SC_Personas[data[key.key]] || {};
}
const regco = stringToColour(
(persona.Region || "?").toLowerCase()
);
case "persona": {
let persona = key.self === true ? data : SC_Personas[data[key.key]] || {};
const regco = stringToColour((persona.Region || "?").toLowerCase());
const tdPersona = document.createElement("td");
tdPersona.style.textAlign = "center";
tdPersona.style.fontSize = "20px";
tdPersona.style.backgroundColor = regco;
tdPersona.style.color = colorIsDarkAdvanced(regco);
const regionSpan = document.createElement("span");
regionSpan.style.fontSize = "40px";
regionSpan.style.textTransform = "capitalize";
regionSpan.textContent = (persona.Region || "?").toLowerCase();
tdPersona.appendChild(regionSpan);
tdPersona.appendChild(document.createElement("br"));
const infoSpan = document.createElement("span");
infoSpan.style.backgroundColor = "white";
infoSpan.style.border = "2px solid black";
@@ -1014,27 +975,21 @@ function TS_IndexElement(
infoSpan.style.display = "inline-block";
infoSpan.style.padding = "5px";
infoSpan.style.color = "black";
const img = document.createElement("img");
img.src = persona.Foto || "static/ico/user_generic.png";
img.height = 70;
infoSpan.appendChild(img);
infoSpan.appendChild(document.createElement("br"));
infoSpan.appendChild(
document.createTextNode(persona.Nombre || "")
);
infoSpan.appendChild(document.createTextNode(persona.Nombre || ""));
infoSpan.appendChild(document.createElement("br"));
const pointsSpan = document.createElement("span");
pointsSpan.style.fontSize = "17px";
pointsSpan.textContent = (persona.Puntos || "0") + " puntos.";
infoSpan.appendChild(pointsSpan);
tdPersona.appendChild(infoSpan);
new_tr.appendChild(tdPersona);
break;
}
default:
break;
}
@@ -1042,7 +997,11 @@ function TS_IndexElement(
new_tr.onclick = (event) => {
setUrlHash(pageco + "," + data._key);
};
});
fragment.appendChild(new_tr);
}
// Replace tbody in one operation
tablebody_EL.innerHTML = "";
tablebody_EL.appendChild(fragment);
}
ref.map().on((data, key, _msg, _ev) => {
EventListeners.GunJS.push(_ev);

View File

@@ -175,12 +175,11 @@ PAGES.materiales = {
gun.get(TABLE).get("materiales"),
document.getElementById("tableContainer"),
undefined,
undefined,
//function(data) {
// if (data.Ubicacion == filtroUbicacion) {return false}
// if (filtroUbicacion == "") {return false}
// return true
//}
function(data) {
if (data.Ubicacion == filtroUbicacion) {return false}
if (filtroUbicacion == "") {return false}
return true
}
);
}