Jenkinsfile
This commit is contained in:
parent
b458eeedd2
commit
1693df0195
56
Jenkinsfile.groovy
Normal file
56
Jenkinsfile.groovy
Normal file
@ -0,0 +1,56 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
stages {
|
||||
stage('Build backend') {
|
||||
steps {
|
||||
sh "cd ${env.WORKSPACE}/backend"
|
||||
sh "cargo build --release"
|
||||
}
|
||||
}
|
||||
stage('Build frontend') {
|
||||
steps {
|
||||
sh "cd ${env.WORKSPACE}/frontend"
|
||||
sh "pnpm i"
|
||||
sh "pnpm build"
|
||||
}
|
||||
}
|
||||
stage("Create ENV file") {
|
||||
steps {
|
||||
sh "cd ${env.WORKSPACE}"
|
||||
sh "touch .env"
|
||||
sh "echo DATABASE_URL=mysql://educa7ls_user:123456789a*@md-89.webhostbox.net:3306/educa7ls_plataforma >> .env"
|
||||
sh "echo RENIEC_API=apis-token-1.aTSI1U7KEuT-6bbbCguH-4Y8TI6KS73N >> .env"
|
||||
}
|
||||
}
|
||||
stage("Stop old PM2 processes") {
|
||||
steps {
|
||||
sh "pm2 stop ${env.JOB_BASE_NAME} || true"
|
||||
sh "pm2 delete ${env.JOB_BASE_NAME} || true"
|
||||
}
|
||||
}
|
||||
stage("Clean deploy folder") {
|
||||
steps {
|
||||
sh "rm -rf /var/deploys/${env.JOB_BASE_NAME}/* || true"
|
||||
}
|
||||
}
|
||||
stage("Copy deploy files") {
|
||||
steps {
|
||||
sh "mkdir -p /var/deploys/${env.JOB_BASE_NAME}/${env.BUILD_TAG}/static"
|
||||
// Copy backend binary
|
||||
sh "cp ${env.WORKSPACE}/backend/target/release/backend /var/deploys/${env.JOB_BASE_NAME}/${env.BUILD_TAG}/"
|
||||
// Copy frontend static files
|
||||
sh "cp -r ${env.WORKSPACE}/frontend/dist/* /var/deploys/${env.JOB_BASE_NAME}/${env.BUILD_TAG}/static/"
|
||||
// Copy ENV file
|
||||
sh "cp ${env.WORKSPACE}/.env /var/deploys/${env.JOB_BASE_NAME}/${env.BUILD_TAG}/"
|
||||
}
|
||||
}
|
||||
stage('Start app with PM2') {
|
||||
steps {
|
||||
sh "cd /var/deploys/${env.JOB_BASE_NAME}/${env.BUILD_TAG}/"
|
||||
// ROCKET_PORT=3333
|
||||
sh "pm2 start backend --name ${env.JOB_BASE_NAME}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# EEGSAC
|
||||
|
||||
Internal system for EEGSAC's internal processes.
|
||||
|
||||
|
155
backend/sql/course.migration.sql
Normal file
155
backend/sql/course.migration.sql
Normal file
@ -0,0 +1,155 @@
|
||||
CREATE TABLE course (
|
||||
course_id INTEGER PRIMARY KEY AUTO_INCREMENT,
|
||||
course_name VARCHAR(50) NOT NULL,
|
||||
course_display_name VARCHAR(100) NOT NULL,
|
||||
course_days_amount INTEGER NOT NULL,
|
||||
course_has_custom_label BOOLEAN NOT NULL
|
||||
);
|
||||
|
||||
|
||||
INSERT INTO `course` (`course_id`, `course_name`, `course_display_name`, `course_days_amount`, `course_has_custom_label`) VALUES
|
||||
--
|
||||
-- Comunes
|
||||
--
|
||||
(1, 'Manejo Defensivo', 'Manejo Defensivo', 1, 0),
|
||||
(2, 'Mecanica Basica', 'Mecanica Basica', 1, 0),
|
||||
(3, '4x4', 'Manejo en 4x4 Road Danger', 1, 0),
|
||||
--
|
||||
(10, 'Matpel 1', 'Matpel I - Advertencia', 1, 0),
|
||||
(11, 'Matpel 2', 'Matpel II - Operaciones', 1, 0),
|
||||
(12, 'Matpel 3', 'Matpel III - Técnico', 3, 0),
|
||||
(13, 'Matpel 4', 'Matpel IV', 3, 0),
|
||||
(14, 'Sup. Escolta', 'Supervisor Escolta Matpel', 7, 0),
|
||||
--
|
||||
(16, 'Primeros Auxilios', 'Primeros Auxilios', 1, 0),
|
||||
(17, 'Lucha contra Incendios', 'Lucha contra Incendios', 1, 0),
|
||||
(22, 'IPERC', 'IDENTIFICACIÓN DE PELIGROS, EVALUACIÓN DE RIESGOS Y CONTROLES (IPERC)', 1, 0),
|
||||
|
||||
|
||||
--
|
||||
-- Maquinarias
|
||||
--
|
||||
(4, 'Cargador Frontal', 'Operador profesional de Cargador Frontal', 5, 1),
|
||||
(5, 'Excavadora', 'Operador profesional de Excavadora', 5, 1),
|
||||
(6, 'Retroexcavadora', 'Operador profesional de Retroexcavadora', 5, 1),
|
||||
(7, 'Volquete', 'Operador profesional de Volquete', 5, 1),
|
||||
(8, 'Minicargador', 'Operador profesional de Minicargador', 5, 1),
|
||||
(9, 'Montacargas', 'Operador profesional de Montacarga', 5, 1),
|
||||
(24, 'Rodillo', 'Operador profesional de Rodillo', 5, 1),
|
||||
(38, 'Telehandler', 'Operador profesional de Telehandler', 5, 1),
|
||||
(39, 'Camion grua', 'Operador Profesional de Grua', 1, 0),
|
||||
(54, 'Tractor Oruga', 'Operador profesional de Tractor Oruga', 5, 1),
|
||||
(55, 'Scooptrams', 'Operador profesional de SCOOPTRAMS', 8, 1),
|
||||
(59, 'Jumbo', 'Operador profesional de Jumbo', 60, 1),
|
||||
(65, 'Motoniveladora', 'Operador profesional de Motoniveladora', 5, 1),
|
||||
|
||||
|
||||
--
|
||||
-- Seguridad de maquinarias
|
||||
--
|
||||
(51, 'Seg. de Montacarga', 'Operación segura de Montacargas', 1, 0),
|
||||
(72, 'Seg. Op. Maquinaria Pesada', 'Seguridad en la Operacion de Maquinaria Pesada', 3, 0),
|
||||
(122, 'Seg. de Jumbo', 'SEGURIDAD EN LA OPERACIÓN DE JUMBO PERFORADOR', 30, 0),
|
||||
|
||||
|
||||
|
||||
(15, 'Herramientas de Gestion', 'Herramientas de Gestion', 1, 0),
|
||||
|
||||
(18, 'Seguridad Minera', 'Seguridad Minera', 1, 0),
|
||||
(19, 'SBComportamiento', 'Seguridad Basada en el Comportamiento', 1, 0),
|
||||
(20, 'Primer Respondedor', 'Primer Respondedor', 1, 0),
|
||||
(21, 'Operador Multiple', 'Operador Multiple', 1, 0),
|
||||
|
||||
(23, 'RITRA', 'RITRA', 1, 0),
|
||||
|
||||
(25, 'Fatiga y Somnolencia', 'Fatiga y Somnolencia', 1, 0),
|
||||
(26, 'Bioseguridad y la Salud Ocupacional', 'Bioseguridad y la Salud Ocupacional', 1, 0),
|
||||
(27, 'Seguridad y Salud en Mineria', 'Seguridad y Salud en Mineria', 1, 0),
|
||||
(28, 'Espacios Confinados', 'Espacios Confinados', 1, 0),
|
||||
(29, 'Manipulación de productos químicos', 'Manipulación de productos químicos', 1, 0),
|
||||
(30, 'Interpretación del Reglamento Interno de Transito', 'Interpretación del Reglamento Interno de Transito', 1, 0),
|
||||
(31, 'DERRAMES DE HIDROCARBUROS', 'DERRAMES DE HIDROCARBUROS', 1, 0),
|
||||
(32, 'PREVENCIÓN Y CONTROL DE COVID-19', 'PREVENCIÓN Y CONTROL DE COVID-19', 1, 0),
|
||||
(33, 'BIOSEGURIDAD EN EL TRABAJO', 'BIOSEGURIDAD EN EL TRABAJO', 1, 0),
|
||||
(34, 'Seguridad en la Operación', 'Seguridad en la Operación', 1, 0),
|
||||
(35, 'IMPLEMENTACIÓN DE PLAN DE VIGILANCIA ', 'IMPLEMENTACIÓN DE PLAN DE VIGILANCIA ', 1, 0),
|
||||
(36, 'ESPECIALIZACION PERFORACION Y VOLADURA', 'ESPECIALIZACION PERFORACION Y VOLADURA', 1, 0),
|
||||
(37, 'SEGURIDAD Y SALUD EN EL TRABAJO frente al COVID-19', 'SEGURIDAD Y SALUD EN EL TRABAJO frente al COVID-19', 1, 0),
|
||||
|
||||
|
||||
(40, 'Supervisor de trabajos en alto riesgo', 'Supervisor de trabajos en alto riesgo', 1, 0),
|
||||
(41, 'Técnicas preventivas en la operación de maquinaria', 'Técnicas preventivas en la operación de maquinaria', 1, 0),
|
||||
(42, 'Prevención y protección contra incendios', 'Prevención y protección contra incendios', 1, 0),
|
||||
(44, 'Salud ocupacional y primeros auxilios', 'Salud ocupacional y primeros auxilios', 1, 0),
|
||||
(43, 'Manejo defensivo y transporte personal', 'Manejo defensivo y transporte personal', 1, 0),
|
||||
(45, 'Seguridad con materiales peligrosos', 'Seguridad con materiales peligrosos', 1, 0),
|
||||
(46, 'Operador CAT', 'Operador CAT', 1, 0),
|
||||
(47, 'Brigada de emergencia', 'Brigada de emergencia', 1, 0),
|
||||
(48, 'Seguridad en trabajos de alto riesgo', 'Seguridad en trabajos de alto riesgo', 1, 0),
|
||||
(49, 'Supervisor de seguridad minera e industrial', 'Supervisor de seguridad minera e industrial', 1, 0),
|
||||
(50, 'Logística, transporte, almacenaje y manutención', 'Logística, transporte, almacenaje y manutención', 1, 0),
|
||||
|
||||
(52, 'PRIMEROS AUXILIOS (BIOSEGURIDAD) frente al COVID -', 'PRIMEROS AUXILIOS (BIOSEGURIDAD) frente al COVID -', 1, 0),
|
||||
(53, 'SEGURIDAD Y SALUD EN EL TRABAJO, bajo normativas a', 'SEGURIDAD Y SALUD EN EL TRABAJO, bajo normativas a', 1, 0),
|
||||
|
||||
|
||||
(56, 'Especialización operador de puente grúa', 'Especialización operador de puente grúa', 1, 0),
|
||||
(57, 'Caja Fuller', 'Caja Fuller', 1, 0),
|
||||
(58, 'Especialización Cargador Frontal', 'Especialización Cargador Frontal', 1, 0),
|
||||
|
||||
(60, 'Rescatista Industrial', 'Rescatista Industrial', 1, 0),
|
||||
(66, 'Camión Minero 797F CAT', 'Camión Minero 797F CAT', 1, 0),
|
||||
(61, 'Investigación de accidentes e incidentes', 'Investigación de accidentes e incidentes', 1, 0),
|
||||
(62, 'Uso y Manejo de Extintores', 'Uso y Manejo de Extintores', 1, 0),
|
||||
|
||||
(67, 'Sistema de Comando de Incidentes SCI', 'Sistema de Comando de Incidentes SCI', 1, 0),
|
||||
(68, 'Seguridad en la Operación de Camión Minero de Alto', 'Seguridad en la Operación de Camión Minero de Alto', 1, 0),
|
||||
(69, 'Seguridad Minera frente al Covid-19', 'Seguridad Minera frente al Covid-19', 1, 0),
|
||||
(70, 'Operador de Camión Lubricador', 'Operador de Camión Lubricador', 1, 0),
|
||||
(71, 'RIGGER O Auxiliar de Operador Grua', 'RIGGER O Auxiliar de Operador Grua', 1, 0),
|
||||
|
||||
(73, 'Operador de Elevador de Tijera', 'Operador de Elevador de Tijera', 1, 0),
|
||||
(74, 'Trabajos en Caliente', 'Trabajos en Caliente', 1, 0),
|
||||
(75, 'Operador Grua Articulada ANSI/ASME', 'Operador Grua Articulada ANSI/ASME', 1, 0),
|
||||
(76, 'Operador Calificado KOMATSU', 'Operador Calificado KOMATSU', 1, 0),
|
||||
(77, 'Cuidado del Medio AMbiente', 'Cuidado del Medio AMbiente', 1, 0),
|
||||
(78, 'Campaña \"No al exceso de velocidad\"', 'Campaña \"No al exceso de velocidad\"', 1, 0),
|
||||
(79, 'INCENDIO EN VEHÍCULOS', 'INCENDIO EN VEHÍCULOS', 1, 0),
|
||||
(80, 'Sensibilización Primeros Auxilios', 'Sensibilización Primeros Auxilios', 1, 0),
|
||||
(81, 'Inspecciones de Seguridad', 'Inspecciones de Seguridad', 1, 0),
|
||||
(82, 'Transporte de Personal Industrial', 'Transporte de Personal Industrial', 1, 0),
|
||||
(83, 'BIOSEGURIDAD EN INDUSTRIA Y MINERIA EN COVID-19', 'BIOSEGURIDAD EN INDUSTRIA Y MINERIA EN COVID-19', 1, 0),
|
||||
(84, 'CAMPAÑA DE NO ALCOHOL', 'CAMPAÑA DE NO ALCOHOL', 1, 0),
|
||||
(102, 'OPERACIÓN, LOGÍSTICA Y ALMACENES', 'OPERACIÓN, LOGÍSTICA Y ALMACENES', 1, 0),
|
||||
(87, 'Trabajos en Altura ', 'Trabajos en Altura ', 1, 0),
|
||||
(88, 'PERFORACIÓN Y VOLADURA', 'PERFORACIÓN Y VOLADURA', 1, 0),
|
||||
(90, 'SEGURIDAD Y SALUD EN EL TRABAJO', 'SEGURIDAD Y SALUD EN EL TRABAJO', 1, 0),
|
||||
(92, 'PREVENCIÓN DE RIESGOS LABORALES', 'PREVENCIÓN DE RIESGOS LABORALES', 1, 0),
|
||||
(94, 'MANEJO DEFENSIVO 4X4', 'MANEJO DEFENSIVO 4X4', 1, 0),
|
||||
(95, 'MANEJO DEFENSIVO Y TRANSPORTE PERSONAL', 'MANEJO DEFENSIVO Y TRANSPORTE PERSONAL', 1, 0),
|
||||
(96, 'CONDUCCIÓN SEGURA', 'CONDUCCIÓN SEGURA', 1, 0),
|
||||
(97, 'MANEJO Y MANTENIMIENTO OPERADOR DE SEMITRAILER', 'MANEJO Y MANTENIMIENTO OPERADOR DE SEMITRAILER', 1, 0),
|
||||
(98, 'OPERADOR CAMION CISTERNA', 'OPERADOR CAMION CISTERNA', 1, 0),
|
||||
(99, 'SEMITRAILER INTERNATIONAL', 'SEMITRAILER INTERNATIONAL', 1, 0),
|
||||
(100, 'Procedimientos de carga y descarga de combustibles', 'Procedimientos de carga y descarga de combustibles', 1, 0),
|
||||
(101, 'Transporte seguro de materiales y residuos peligro', 'Transporte seguro de materiales y residuos peligro', 1, 0),
|
||||
(103, 'GESTIÓN DE ALMACENES EN GENERAL', 'GESTIÓN DE ALMACENES EN GENERAL', 1, 0),
|
||||
(104, 'Operación Segura para Transporte de Hidrocarburos ', 'Operación Segura para Transporte de Hidrocarburos ', 1, 0),
|
||||
(105, 'COMO EVITAR ACTOS SUBESTANDAR DURANTE LA OPERACIÓN', 'COMO EVITAR ACTOS SUBESTANDAR DURANTE LA OPERACIÓN', 1, 0),
|
||||
(106, 'MANIOBRAS TEMERARIAS', 'MANIOBRAS TEMERARIAS', 1, 0),
|
||||
(107, 'MANIOBRAS EN PARQUEOS Y ZONAS CERCA A PERSONAL QUE', 'MANIOBRAS EN PARQUEOS Y ZONAS CERCA A PERSONAL QUE', 1, 0),
|
||||
(108, 'LÍMITES DE VELOCIDAD', 'LÍMITES DE VELOCIDAD', 1, 0),
|
||||
(109, 'Cargador Frontal 950M CAT', 'Cargador Frontal 950M CAT', 1, 0),
|
||||
(110, 'CAMPAÑA DE NO ALCOHOL Y DROGAS', 'CAMPAÑA DE NO ALCOHOL Y DROGAS', 1, 0),
|
||||
(112, 'GESTIÓN DE RESIDUOS SOLIDOS', 'GESTIÓN DE RESIDUOS SOLIDOS', 1, 0),
|
||||
(113, 'Tractor de Ruedas', 'Tractor de Ruedas', 1, 0),
|
||||
(114, 'Manlift', 'Manlift', 1, 0),
|
||||
(115, 'ASPECTOS E IMPACTO AMBIENTAL', 'ASPECTOS E IMPACTO AMBIENTAL', 1, 0),
|
||||
(116, 'INVESTIGACIÓN DE ACCIDENTES', 'INVESTIGACIÓN DE ACCIDENTES', 1, 0),
|
||||
(117, 'MANEJO DE RESIDUOS', 'MANEJO DE RESIDUOS', 1, 0),
|
||||
(119, 'OPERADOR DE SCOOPTRANS R1600H', 'OPERADOR DE SCOOPTRANS R1600H', 1, 0),
|
||||
(120, 'ELECTRICIDAD Y MANTENIMIENTO DE VOLQUETE', 'ELECTRICIDAD Y MANTENIMIENTO DE VOLQUETE', 1, 0),
|
||||
(121, 'CARGAS Y MERCANCÍAS', 'CARGAS Y MERCANCÍAS', 1, 0)
|
||||
;
|
||||
|
||||
|
4298
backend/sql/person.migration.sql
Normal file
4298
backend/sql/person.migration.sql
Normal file
File diff suppressed because it is too large
Load Diff
11700
backend/sql/register.migration.sql
Normal file
11700
backend/sql/register.migration.sql
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,5 @@
|
||||
use rocket::{
|
||||
form::validate::Contains,
|
||||
serde::{Deserialize, Serialize},
|
||||
};
|
||||
use rocket::form::validate::Contains;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::db;
|
||||
|
||||
@ -19,7 +17,6 @@ pub struct RegisterCreate {
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone)]
|
||||
#[serde(crate = "rocket::serde")]
|
||||
pub struct Register {
|
||||
pub register_id: i32,
|
||||
/// Display code, shown on the certificate.
|
||||
@ -114,22 +111,25 @@ impl Register {
|
||||
pub async fn get_by_dni(dni: i32) -> Result<Vec<Register>, sqlx::Error> {
|
||||
let db = db();
|
||||
|
||||
let res = sqlx::query!("SELECT * FROM register
|
||||
WHERE register_person_id = (SELECT person_id FROM person WHERE person_dni = ?)", dni)
|
||||
.fetch_all(db)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|r| Register {
|
||||
register_id: r.register_id,
|
||||
register_code: r.register_code,
|
||||
register_creation_date: r.register_creation_date.format("%Y-%m-%d").to_string(),
|
||||
register_display_date: r.register_display_date.format("%Y-%m-%d").to_string(),
|
||||
register_custom_label: r.register_custom_label,
|
||||
register_is_preview: r.register_is_preview == 1,
|
||||
register_person_id: r.register_person_id,
|
||||
register_course_id: r.register_course_id,
|
||||
})
|
||||
.collect();
|
||||
let res = sqlx::query!(
|
||||
"SELECT * FROM register
|
||||
WHERE register_person_id = (SELECT person_id FROM person WHERE person_dni = ?)",
|
||||
dni
|
||||
)
|
||||
.fetch_all(db)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|r| Register {
|
||||
register_id: r.register_id,
|
||||
register_code: r.register_code,
|
||||
register_creation_date: r.register_creation_date.format("%Y-%m-%d").to_string(),
|
||||
register_display_date: r.register_display_date.format("%Y-%m-%d").to_string(),
|
||||
register_custom_label: r.register_custom_label,
|
||||
register_is_preview: r.register_is_preview == 1,
|
||||
register_person_id: r.register_person_id,
|
||||
register_course_id: r.register_course_id,
|
||||
})
|
||||
.collect();
|
||||
|
||||
Ok(res)
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ type CertGenObj = {
|
||||
}
|
||||
|
||||
export const certGenerator: CertGenObj = Object.freeze({
|
||||
matpel1: (filename: string, options: CertData<null>) => {
|
||||
"Matpel 1": (filename: string, options: CertData<null>) => {
|
||||
const options_f: CertData<Matpel> = {
|
||||
...options,
|
||||
matpel: Matpel._1,
|
||||
@ -44,7 +44,7 @@ export const certGenerator: CertGenObj = Object.freeze({
|
||||
download(doc, filename);
|
||||
});
|
||||
},
|
||||
matpel2: (filename: string, options: CertData<null>) => {
|
||||
"Matpel 2": (filename: string, options: CertData<null>) => {
|
||||
const options_f: CertData<Matpel> = {
|
||||
...options,
|
||||
matpel: Matpel._2,
|
||||
@ -54,7 +54,7 @@ export const certGenerator: CertGenObj = Object.freeze({
|
||||
download(doc, filename);
|
||||
});
|
||||
},
|
||||
matpel3: (filename: string, options: CertData<null>) => {
|
||||
"Matpel 3": (filename: string, options: CertData<null>) => {
|
||||
const options_f: CertData<Matpel> = {
|
||||
...options,
|
||||
matpel: Matpel._3,
|
||||
@ -64,11 +64,11 @@ export const certGenerator: CertGenObj = Object.freeze({
|
||||
download(doc, filename);
|
||||
});
|
||||
},
|
||||
manejoDefensivo: certGeneratorGenerator(manejoDefensivoCert),
|
||||
"Mec. Basica": certGeneratorGenerator(mecanicaBasicaCert),
|
||||
"Manejo Defensivo": certGeneratorGenerator(manejoDefensivoCert),
|
||||
"Mecanica Basica": certGeneratorGenerator(mecanicaBasicaCert),
|
||||
"4x4": certGeneratorGenerator(_4X4Cert),
|
||||
segOpMaqPes: certGeneratorGenerator(segOpMaqPesCert),
|
||||
supervisorEscolta: certGeneratorGenerator(supervisorEscolta),
|
||||
iperc: certGeneratorGenerator(ipercCert),
|
||||
"Seg. Op. Maquinaria Pesada": certGeneratorGenerator(segOpMaqPesCert),
|
||||
"Sup. Escolta": certGeneratorGenerator(supervisorEscolta),
|
||||
"IPERC": certGeneratorGenerator(ipercCert),
|
||||
});
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { For, createEffect, createSignal } from "solid-js";
|
||||
import { For, Show, createEffect, createSignal } from "solid-js";
|
||||
import { DownloadIcon } from "../../icons/DownloadIcon";
|
||||
import { Person } from "../../types/Person";
|
||||
import { Register } from "../../types/Register";
|
||||
@ -85,16 +85,28 @@ function RegisterEl(props: {register: Register, person: Person}) {
|
||||
});
|
||||
};
|
||||
|
||||
const generateable = () => {
|
||||
const courseN = courseName();
|
||||
return certGenerator[courseN] !== undefined;
|
||||
};
|
||||
|
||||
return (
|
||||
<div class="inline-block w-[12rem] p-1 border border-c-outline rounded-md">
|
||||
<button
|
||||
onclick={genCert}
|
||||
class="rounded-full bg-c-primary-container hover:bg-c-primary transition-colors h-12 w-12"
|
||||
>
|
||||
<DownloadIcon fill="var(--c-on-primary-container)" />
|
||||
</button>
|
||||
<div class="inline-block h-12 w-32 pl-2 align-middle">
|
||||
<p class="font-bold">
|
||||
<div class="grid grid-cols-[3rem_10rem] w-[14rem] p-1 border border-c-outline rounded-md">
|
||||
<div class="h-12 w-12 inline-block">
|
||||
<Show when={generateable()}>
|
||||
<button
|
||||
onclick={genCert}
|
||||
class="rounded-full bg-c-primary-container hover:bg-c-primary transition-colors h-full w-full"
|
||||
>
|
||||
<DownloadIcon fill="var(--c-on-primary-container)" />
|
||||
</button>
|
||||
</Show>
|
||||
</div>
|
||||
<div class="h-12 pl-2 align-middle">
|
||||
<p
|
||||
class="font-bold overflow-hidden whitespace-nowrap"
|
||||
title={courseName()}
|
||||
>
|
||||
{courseName()}
|
||||
</p>
|
||||
<p class="font-mono text-sm">
|
||||
|
Loading…
Reference in New Issue
Block a user