[FE] Certificate: Sort by date. Improve course search field.

master
Araozu 2023-07-04 21:52:45 -05:00
parent 7007b00e4c
commit e144178c27
6 changed files with 37 additions and 9 deletions

View File

@ -9,6 +9,7 @@ export function template(ssr: string): string {
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="/static/styles.css?t=${Date.now()}" /> <link rel="stylesheet" href="/static/styles.css?t=${Date.now()}" />
<link rel="icon" type="image/png" href="/static/favicon.png">
<!-- Phosphor icons --> <!-- Phosphor icons -->
<link <link
rel="stylesheet" rel="stylesheet"

View File

@ -8,6 +8,7 @@ export function template(ssr: string): string {
<title>Registrar certificados - EEGSAC</title> <title>Registrar certificados - EEGSAC</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/png" href="/static/favicon.png">
<link rel="stylesheet" href="/static/styles.css?t=${Date.now()}" /> <link rel="stylesheet" href="/static/styles.css?t=${Date.now()}" />
<!-- Phosphor icons --> <!-- Phosphor icons -->
<link <link

View File

@ -1,10 +1,13 @@
import { createSignal } from "solid-js"; import { createSignal, onMount } from "solid-js";
import { DniTable } from "./AulaVirtual/DniTable"; import { DniTable } from "./AulaVirtual/DniTable";
import { Dnis } from "./AulaVirtual/Dnis"; import { Dnis } from "./AulaVirtual/Dnis";
import { ensureColors } from "./components/colors";
export function CertsBatch() { export function CertsBatch() {
const [dniGroups, setDniGroups] = createSignal<Array<string>>([]); const [dniGroups, setDniGroups] = createSignal<Array<string>>([]);
onMount(ensureColors);
return ( return (
<div> <div>
<h1 class="px-4 py-2 text-2xl font-bold"> <h1 class="px-4 py-2 text-2xl font-bold">

View File

@ -15,7 +15,14 @@ export function SearchableSelect(props: {
const inputEl = ev.target as HTMLInputElement; const inputEl = ev.target as HTMLInputElement;
// Clear current selection // Clear current selection
setSelected(null); setSelected(null);
setFilter(inputEl.value.toLowerCase());
let filter: string = inputEl.value.toLowerCase();
filter = filter.replace("á", "a");
filter = filter.replace("é", "e");
filter = filter.replace("í", "i");
filter = filter.replace("ó", "o");
filter = filter.replace("ú", "u");
setFilter(filter);
}; };
createEffect(() => { createEffect(() => {
@ -58,6 +65,21 @@ export function SearchableSelect(props: {
}); });
} }
const filteredOptions = () => {
const filterText = filter();
return props.subjects.filter((subject) => {
let subjectText = subject.nombre.toLowerCase();
subjectText = subjectText.replace("á", "a");
subjectText = subjectText.replace("é", "e");
subjectText = subjectText.replace("í", "i");
subjectText = subjectText.replace("ó", "o");
subjectText = subjectText.replace("ú", "u");
return selected() === null && subjectText.indexOf(filterText) !== -1;
});
};
return ( return (
<> <>
{inputElement} {inputElement}
@ -65,15 +87,14 @@ export function SearchableSelect(props: {
<div <div
class="border-c-outline border-2 rounded overflow-y-scroll h-[18rem]" class="border-c-outline border-2 rounded overflow-y-scroll h-[18rem]"
> >
<For each={props.subjects}> <For each={filteredOptions()}>
{(s) => ( {(s) => (
<button <button
class={`w-full text-left py-1 px-2 class="w-full text-left py-1 px-2
hover:bg-c-primary-container hover:text-c-on-primary-container hover:bg-c-primary-container hover:text-c-on-primary-container"
${s.nombre.toLowerCase().indexOf(filter()) !== -1 && selected() === null ? "block" : "hidden"}`}
onclick={(ev) => { onclick={(ev) => {
ev.preventDefault(); ev.preventDefault();
console.log("Click! :D");
setSelected(s.id); setSelected(s.id);
setInputValue(s.nombre); setInputValue(s.nombre);
}} }}

View File

@ -1,4 +1,4 @@
import { Show, createEffect, createSignal, For, JSX } from "solid-js"; import { Show, createEffect, createSignal, For, JSX, createMemo } from "solid-js";
import { Person } from "../../types/Person"; import { Person } from "../../types/Person";
import { RegisterReturn } from "../../types/RegisterReturn"; import { RegisterReturn } from "../../types/RegisterReturn";
@ -33,6 +33,8 @@ export function Registers(props: { person: Person | null, lastUpdate: number })
setLoading(false); setLoading(false);
}; };
const sortedRegisters = createMemo(() => registers().sort((r1, r2) => ((r1.fecha_inscripcion < r2.fecha_inscripcion) ? 1 : -1)));
return ( return (
<div class="p-4"> <div class="p-4">
<h2 class="mb-4 font-bold text-xl">2. Revisar registros actuales</h2> <h2 class="mb-4 font-bold text-xl">2. Revisar registros actuales</h2>
@ -105,7 +107,7 @@ export function Registers(props: { person: Person | null, lastUpdate: number })
</thead> </thead>
<tbody> <tbody>
<For each={registers().sort((r1, r2) => ((r1.fecha_actual < r2.fecha_actual) ? 1 : -1))}> <For each={sortedRegisters()}>
{(register) => <Register cert={register} onUpdate={loadCertificates} />} {(register) => <Register cert={register} onUpdate={loadCertificates} />}
</For> </For>
</tbody> </tbody>

BIN
static/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB