From 5a8b93edc22e0cea035082627466ba8363261d97 Mon Sep 17 00:00:00 2001 From: Araozu Date: Sun, 11 Jun 2023 22:25:18 -0500 Subject: [PATCH] [FE] Begin interface for Aulavirtual --- .gitignore | 4 +- esbuild-prod.js | 21 +++++ esbuild.js | 25 ++++++ frontend-dev/src/index.tsx | 4 +- src/app.module.ts | 3 +- src/certs/MATPEL.ts | 32 ++----- .../aulavirtual/aulavirtual.controller.ts | 13 +++ .../aulavirtual/aulavirtual.template.ts | 28 ++++++ src/views/AulaVirtual.tsx | 64 +++++++++++++ src/views/Certs.tsx | 5 +- src/views/components/Registers.tsx | 90 ++++++++----------- src/views/components/Search.tsx | 12 +-- src/views/hydration/hydration_aulavirtual.ts | 11 +++ 13 files changed, 223 insertions(+), 89 deletions(-) create mode 100644 src/controller/aulavirtual/aulavirtual.controller.ts create mode 100644 src/controller/aulavirtual/aulavirtual.template.ts create mode 100644 src/views/AulaVirtual.tsx create mode 100644 src/views/hydration/hydration_aulavirtual.ts diff --git a/.gitignore b/.gitignore index a40dd01..01bf630 100644 --- a/.gitignore +++ b/.gitignore @@ -44,5 +44,5 @@ lerna-debug.log* # Tailwind output static/styles.css -# Auto generated Solid hydration script -static/hydration.js +# Auto generated Solid hydration scripts +static/*.js diff --git a/esbuild-prod.js b/esbuild-prod.js index be320a1..78934f6 100644 --- a/esbuild-prod.js +++ b/esbuild-prod.js @@ -46,3 +46,24 @@ build({ outdir: "static", format: "cjs", }); + +build({ + platform: "browser", + entryPoints: [ + "src/views/hydration/hydration_aulavirtual.ts", + ], + bundle: true, + minify: true, + sourcemap: false, + logLevel: "info", + plugins: [ + solidPlugin({ + solid: { + generate: "dom", + hydratable: true, + }, + }) + ], + outdir: "static", + format: "cjs", +}); diff --git a/esbuild.js b/esbuild.js index 9c19ef7..0b644c6 100644 --- a/esbuild.js +++ b/esbuild.js @@ -58,3 +58,28 @@ const { glob } = require("glob"); await ctx.watch(); console.log("Watching hydration script..."); })(); + +(async () => { + const ctx = await context({ + platform: "browser", + entryPoints: [ + "src/views/hydration/hydration_aulavirtual.ts", + ], + bundle: true, + minify: false, + logLevel: "info", + plugins: [ + solidPlugin({ + solid: { + generate: "dom", + hydratable: true, + }, + }) + ], + outdir: "static", + format: "cjs", + }); + + await ctx.watch(); + console.log("Watching hydration script..."); +})(); diff --git a/frontend-dev/src/index.tsx b/frontend-dev/src/index.tsx index 0382818..0e20057 100644 --- a/frontend-dev/src/index.tsx +++ b/frontend-dev/src/index.tsx @@ -1,6 +1,6 @@ /* @refresh reload */ import { render } from 'solid-js/web'; -import { Certs } from "../../src/views/Certs"; +import { AulaVirtual } from "../../src/views/AulaVirtual"; import "../../static/tailwind.css" -render(() => , document.getElementById("root")!); +render(() => , document.getElementById("root")!); diff --git a/src/app.module.ts b/src/app.module.ts index a2604f0..0f0b46a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,6 +10,7 @@ import { PersonService } from "./controller/person/person.service"; import { SubjectController } from "./controller/subject/subject.controller"; import { SubjectService } from "./controller/subject/subject.service"; import * as dotenv from "dotenv"; +import { AulaVirtualController } from "./controller/aulavirtual/aulavirtual.controller"; // Must be done before initializing DB. console.log(dotenv.config()); @@ -44,7 +45,7 @@ const db = process.env.MY_SQL_DB; synchronize: false, }), ], - controllers: [CertificateController, PersonController, SubjectController], + controllers: [CertificateController, PersonController, SubjectController, AulaVirtualController], providers: [CertificateService, PersonService, SubjectService], }) export class AppModule {} diff --git a/src/certs/MATPEL.ts b/src/certs/MATPEL.ts index 3f90357..f73efb2 100644 --- a/src/certs/MATPEL.ts +++ b/src/certs/MATPEL.ts @@ -1,12 +1,10 @@ import { - Document, Packer, Paragraph, PageOrientation, ImageRun, - HorizontalPositionRelativeFrom, VerticalPositionRelativeFrom, + Document, Packer, Paragraph, PageOrientation, FrameAnchorType, TextRun, AlignmentType, } from "docx"; -import * as QR from "qrcode"; -import { Matpel, cm, cmText, cmToEmu, getImage, getMatpelHours, getMatpelLabel } from "./utils"; +import { Matpel, cmText, getImage, getMatpelHours, getMatpelLabel, getQR } from "./utils"; import { CertData } from "./CertData"; @@ -309,25 +307,13 @@ export async function matpelCert(props: CertData): Promise { alignment: AlignmentType.LEFT, }); - const qr = await QR.toDataURL(`https://www.eegsac.com/alumnoscertificados.php?DNI=${props.personDni}`, {margin: 1}); - - const imgQR = new ImageRun({ - data: qr, - transformation: { - height: cm(2.47), - width: cm(2.47), - }, - floating: { - zIndex: 1, - horizontalPosition: { - relative: HorizontalPositionRelativeFrom.LEFT_MARGIN, - offset: cmToEmu(26.3), - }, - verticalPosition: { - relative: VerticalPositionRelativeFrom.TOP_MARGIN, - offset: cmToEmu(16.48), - }, - }, + const imgQR = await getQR({ + iid: props.certIId, + dni: props.personDni, + height: 2.47, + width: 2.47, + horizontalOffset: 26.3, + verticalOffset: 16.48, }); const doc = new Document({ diff --git a/src/controller/aulavirtual/aulavirtual.controller.ts b/src/controller/aulavirtual/aulavirtual.controller.ts new file mode 100644 index 0000000..7b22cf9 --- /dev/null +++ b/src/controller/aulavirtual/aulavirtual.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get } from "@nestjs/common"; +import { renderToString } from "solid-js/web"; +import { template } from "./aulavirtual.template"; +import { AulaVirtual } from "src/views/AulaVirtual"; + +@Controller("aulavirtual") +export class AulaVirtualController { + @Get() + entry(): string { + const html = renderToString(AulaVirtual); + return template(html); + } +} diff --git a/src/controller/aulavirtual/aulavirtual.template.ts b/src/controller/aulavirtual/aulavirtual.template.ts new file mode 100644 index 0000000..fb8aeb1 --- /dev/null +++ b/src/controller/aulavirtual/aulavirtual.template.ts @@ -0,0 +1,28 @@ +import { generateHydrationScript } from "solid-js/web"; + +export function template(ssr: string): string { + return ` + + + + Aula Virtual - EEGSAC + + + + + + ${generateHydrationScript()} + + +
+ ${ssr} +
+ + + +`; +} diff --git a/src/views/AulaVirtual.tsx b/src/views/AulaVirtual.tsx new file mode 100644 index 0000000..ec7878f --- /dev/null +++ b/src/views/AulaVirtual.tsx @@ -0,0 +1,64 @@ +import { Hydration } from "solid-js/web"; + +export function AulaVirtual() { + return ( +
+

+ Aula Virtual +

+

1. Obtener sesión de Chamillo

+
+
+ +
+ props.setDni(e.target.value)} */ + /* disabled={props.loading} */ + /> +
+ +
+ +
+ props.setDni(e.target.value)} */ + /* disabled={props.loading} */ + /> +
+ +
+ + +
+ + +

2. Buscar Persona

+

3. Inscribir en cursos

+

4. Generar mensaje de bienvenida

+
+ ); +} diff --git a/src/views/Certs.tsx b/src/views/Certs.tsx index d97e03c..ef4bdb8 100644 --- a/src/views/Certs.tsx +++ b/src/views/Certs.tsx @@ -16,10 +16,7 @@ export function Certs() { Registrar certificado -
+
-
-
- - Nombres y Apellidos - - - - Apellidos y Nombres - - -
- -
- - Nombres  - - - - Apellidos - - - - Paterno - - - - Materno - - -
+
+ + NOM AP + + + + AP NOM + + + + NOM + + + AP + + + Ap + + + Am +

- +
@@ -131,7 +122,6 @@ export function Registers(props: { person: Person | null, lastUpdate: number }) function Register(props: { cert: RegisterReturn, onUpdate: () => void }) { const [deleteConfirmation, setDeleteConfirmation] = createSignal(false); - const [deleteText, setDeleteText] = createSignal("Eliminar"); const [downloading, setDownloading] = createSignal(false); const deleteRegister = async() => { @@ -147,12 +137,10 @@ function Register(props: { cert: RegisterReturn, onUpdate: () => void }) { } else { // Show delete confirmation - setDeleteText("Estas seguro?"); setDeleteConfirmation(true); // Exit confirmation after 3 seconds setTimeout(() => { - setDeleteText("Eliminar"); setDeleteConfirmation(false); }, 3000); } @@ -205,8 +193,8 @@ function Register(props: { cert: RegisterReturn, onUpdate: () => void }) { return ( - - + - diff --git a/src/views/components/Search.tsx b/src/views/components/Search.tsx index 7d1d49d..201f632 100644 --- a/src/views/components/Search.tsx +++ b/src/views/components/Search.tsx @@ -125,7 +125,7 @@ function InputBox(props: { const copyToClipboard: HTMLButtonEvent = (ev) => { ev.preventDefault(); - if (props.dni.length == 8) { + if (props.dni.length === 8) { navigator.clipboard.writeText(props.dni); setSuccessAnimation(true); setTimeout(() => setSuccessAnimation(false), 1000); @@ -136,7 +136,7 @@ function InputBox(props: { ev.preventDefault(); props.setDni(""); - } + }; return (
@@ -156,16 +156,16 @@ function InputBox(props: { onChange={(e) => props.setDni(e.target.value)} disabled={props.loading} /> -
- ) + ); } diff --git a/src/views/hydration/hydration_aulavirtual.ts b/src/views/hydration/hydration_aulavirtual.ts new file mode 100644 index 0000000..e4cc2ce --- /dev/null +++ b/src/views/hydration/hydration_aulavirtual.ts @@ -0,0 +1,11 @@ +/** + * This file generates a hidration script, which must + * then be sent to the client. + */ + +import {hydrate} from "solid-js/web"; +import { AulaVirtual } from "../AulaVirtual"; + +const root = document.getElementById("root")!; + +hydrate(AulaVirtual, root);
CURSO
{props.cert.curso_nombre}{props.cert.fecha_inscripcion.toString()} + {props.cert.fecha_inscripcion.toString()} @@ -237,14 +225,14 @@ function Register(props: { cert: RegisterReturn, onUpdate: () => void }) { +