|
|
|
@ -1,6 +1,5 @@
|
|
|
|
<template>
|
|
|
|
<template>
|
|
|
|
<a-spin :spinning="loading">
|
|
|
|
<a-spin :spinning="loading">
|
|
|
|
|
|
|
|
|
|
|
|
<div class="section-container">
|
|
|
|
<div class="section-container">
|
|
|
|
<div class="page">
|
|
|
|
<div class="page">
|
|
|
|
<!-- Topbar -->
|
|
|
|
<!-- Topbar -->
|
|
|
|
@ -9,14 +8,12 @@
|
|
|
|
<div class="hello">Bienvenido, {{ authStore.userName }}</div>
|
|
|
|
<div class="hello">Bienvenido, {{ authStore.userName }}</div>
|
|
|
|
<div class="sub">DNI: {{ authStore.userDni || "No registrado" }}</div>
|
|
|
|
<div class="sub">DNI: {{ authStore.userDni || "No registrado" }}</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<a-divider class="softDivider" />
|
|
|
|
<a-divider class="softDivider" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Test -->
|
|
|
|
<a-card :bordered="false" class="testBox">
|
|
|
|
<a-card :bordered="false" class="testBox">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="testHead">
|
|
|
|
<div class="testHead">
|
|
|
|
<div class="testHeadLeft">
|
|
|
|
<div class="testHeadLeft">
|
|
|
|
<div class="testTitle">Tu test diagnóstico</div>
|
|
|
|
<div class="testTitle">Tu test diagnóstico</div>
|
|
|
|
@ -42,7 +39,14 @@
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="testHeadRight">
|
|
|
|
<div class="testHeadRight">
|
|
|
|
<a-button type="primary" size="large" class="btnTest" :disabled="!canGoTest" @click="goToTest" block>
|
|
|
|
<a-button
|
|
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
|
|
size="large"
|
|
|
|
|
|
|
|
class="btnTest"
|
|
|
|
|
|
|
|
:disabled="!canGoTest"
|
|
|
|
|
|
|
|
@click="goToTest"
|
|
|
|
|
|
|
|
block
|
|
|
|
|
|
|
|
>
|
|
|
|
Ir al test
|
|
|
|
Ir al test
|
|
|
|
</a-button>
|
|
|
|
</a-button>
|
|
|
|
|
|
|
|
|
|
|
|
@ -53,7 +57,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
<a-divider class="softDivider" />
|
|
|
|
<a-divider class="softDivider" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Procesos -->
|
|
|
|
<div class="sectionHead">
|
|
|
|
<div class="sectionHead">
|
|
|
|
<div>
|
|
|
|
<div>
|
|
|
|
<div class="sectionTitle">Procesos activos</div>
|
|
|
|
<div class="sectionTitle">Procesos activos</div>
|
|
|
|
@ -76,40 +80,31 @@
|
|
|
|
class="modernTable"
|
|
|
|
class="modernTable"
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<template #bodyCell="{ column, record }">
|
|
|
|
<template #bodyCell="{ column, record }">
|
|
|
|
<template v-if="column.key === 'status'">
|
|
|
|
<template v-if="column.key === 'fecha_inicio_preinscripcion'">
|
|
|
|
<a-tag class="status-tag" :color="record.statusColor">{{ record.statusText }}</a-tag>
|
|
|
|
{{ formatDate(record.fecha_inicio_preinscripcion) }}
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<template v-else-if="column.key === 'eligibility'">
|
|
|
|
<template v-else-if="column.key === 'fecha_fin_preinscripcion'">
|
|
|
|
<a-badge
|
|
|
|
{{ formatDate(record.fecha_fin_preinscripcion) }}
|
|
|
|
:status="record.isEligible ? 'success' : 'error'"
|
|
|
|
|
|
|
|
:text="record.isEligible ? 'Apto' : 'No apto'"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<template v-else-if="column.key === 'actions'">
|
|
|
|
<template v-else-if="column.key === 'actions'">
|
|
|
|
<div class="actions">
|
|
|
|
<div class="actions">
|
|
|
|
<a-button size="small" block class="actionBtn" @click="onViewProcess(record)">Ver</a-button>
|
|
|
|
|
|
|
|
<a-button
|
|
|
|
<a-button
|
|
|
|
size="small"
|
|
|
|
size="small"
|
|
|
|
type="primary"
|
|
|
|
type="primary"
|
|
|
|
block
|
|
|
|
block
|
|
|
|
class="actionBtnPrimary"
|
|
|
|
class="actionBtnPrimary"
|
|
|
|
:disabled="!record.canApply"
|
|
|
|
:disabled="!record.link_preinscripcion"
|
|
|
|
@click="onApply(record)"
|
|
|
|
@click="onApply(record)"
|
|
|
|
>
|
|
|
|
>
|
|
|
|
Postular
|
|
|
|
Postular
|
|
|
|
</a-button>
|
|
|
|
</a-button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div v-if="record.canApply === false && record.blockReason" class="microHelp">
|
|
|
|
|
|
|
|
{{ record.blockReason }}
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</a-table>
|
|
|
|
</a-table>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a-empty
|
|
|
|
<a-empty
|
|
|
|
v-if="!loading && state.processes.length === 0"
|
|
|
|
v-if="!loading && state.processes.length === 0"
|
|
|
|
@ -117,6 +112,7 @@
|
|
|
|
description="No hay procesos activos por el momento."
|
|
|
|
description="No hay procesos activos por el momento."
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</a-spin>
|
|
|
|
</a-spin>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
@ -125,10 +121,7 @@ import { computed, onMounted, reactive, ref } from "vue";
|
|
|
|
import { Modal, message } from "ant-design-vue";
|
|
|
|
import { Modal, message } from "ant-design-vue";
|
|
|
|
import { useRouter } from "vue-router";
|
|
|
|
import { useRouter } from "vue-router";
|
|
|
|
import { useAuthStore } from "../../store/postulanteStore";
|
|
|
|
import { useAuthStore } from "../../store/postulanteStore";
|
|
|
|
|
|
|
|
import axios from "../../axiosPostulante";
|
|
|
|
|
|
|
|
|
|
|
|
const ROUTE_TEST_PANEL = { name: "PanelTest" };
|
|
|
|
|
|
|
|
const ROUTE_PROCESS_DETAIL = (id) => ({ name: "ProcesoDetalle", params: { id } });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const router = useRouter();
|
|
|
|
const router = useRouter();
|
|
|
|
const authStore = useAuthStore();
|
|
|
|
const authStore = useAuthStore();
|
|
|
|
@ -143,56 +136,35 @@ const state = reactive({
|
|
|
|
const canGoTest = computed(() => !!state.test.hasAssigned);
|
|
|
|
const canGoTest = computed(() => !!state.test.hasAssigned);
|
|
|
|
|
|
|
|
|
|
|
|
const processColumns = computed(() => [
|
|
|
|
const processColumns = computed(() => [
|
|
|
|
{ title: "Proceso", dataIndex: "name", key: "name", ellipsis: true },
|
|
|
|
{ title: "Título", dataIndex: "titulo", key: "titulo", ellipsis: true },
|
|
|
|
{ title: "Estado", key: "status", responsive: ["sm"] },
|
|
|
|
{ title: "Inicio preinscripción", dataIndex: "fecha_inicio_preinscripcion", key: "fecha_inicio_preinscripcion" },
|
|
|
|
{ title: "Aptitud", key: "eligibility", responsive: ["md"] },
|
|
|
|
{ title: "Fin preinscripción", dataIndex: "fecha_fin_preinscripcion", key: "fecha_fin_preinscripcion" },
|
|
|
|
{ title: "Acciones", key: "actions" },
|
|
|
|
{ title: "Acciones", key: "actions" },
|
|
|
|
]);
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function formatDate(val) {
|
|
|
|
|
|
|
|
if (!val) return "-";
|
|
|
|
|
|
|
|
if (typeof val === "string" && val.includes("T")) return val.split("T")[0];
|
|
|
|
|
|
|
|
const d = new Date(val);
|
|
|
|
|
|
|
|
if (isNaN(d.getTime())) return String(val);
|
|
|
|
|
|
|
|
return d.toLocaleDateString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const api = {
|
|
|
|
const api = {
|
|
|
|
async getDashboard() {
|
|
|
|
async getProcesosActivos() {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
const { data } = await axios.get("/procesos-disponibles-preinscripcion");
|
|
|
|
setTimeout(() => {
|
|
|
|
return data;
|
|
|
|
resolve({
|
|
|
|
|
|
|
|
test: { hasAssigned: true },
|
|
|
|
|
|
|
|
processes: [
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
id: 10,
|
|
|
|
|
|
|
|
name: "Admisión 2026-I",
|
|
|
|
|
|
|
|
statusText: "ABIERTO",
|
|
|
|
|
|
|
|
statusColor: "blue",
|
|
|
|
|
|
|
|
isEligible: true,
|
|
|
|
|
|
|
|
canApply: true,
|
|
|
|
|
|
|
|
blockReason: "",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
id: 11,
|
|
|
|
|
|
|
|
name: "Admisión Extraordinaria 2026",
|
|
|
|
|
|
|
|
statusText: "PRONTO",
|
|
|
|
|
|
|
|
statusColor: "gold",
|
|
|
|
|
|
|
|
isEligible: false,
|
|
|
|
|
|
|
|
canApply: false,
|
|
|
|
|
|
|
|
blockReason: "Este proceso aún no permite postular.",
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}, 250);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
async applyToProcess(processId) {
|
|
|
|
|
|
|
|
return new Promise((resolve) => setTimeout(resolve, 300));
|
|
|
|
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
async function fetchDashboard() {
|
|
|
|
async function fetchDashboard() {
|
|
|
|
loading.value = true;
|
|
|
|
loading.value = true;
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const data = await api.getDashboard();
|
|
|
|
const resp = await api.getProcesosActivos();
|
|
|
|
state.test = { ...state.test, ...data.test };
|
|
|
|
state.processes = Array.isArray(resp?.data) ? resp.data : [];
|
|
|
|
state.processes = Array.isArray(data.processes) ? data.processes : [];
|
|
|
|
} catch (e) {
|
|
|
|
} catch {
|
|
|
|
console.error(e);
|
|
|
|
message.error("No se pudo cargar el dashboard.");
|
|
|
|
state.processes = [];
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
loading.value = false;
|
|
|
|
loading.value = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -212,91 +184,33 @@ function goToTest() {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function onViewProcess(process) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
message.info(`Abrir detalle del proceso: ${process.name}`);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function onApply(process) {
|
|
|
|
function onApply(process) {
|
|
|
|
if (!process.canApply) return;
|
|
|
|
if (!process.link_preinscripcion) return;
|
|
|
|
|
|
|
|
window.open(process.link_preinscripcion, "_blank", "noopener,noreferrer");
|
|
|
|
Modal.confirm({
|
|
|
|
|
|
|
|
title: "Confirmar postulación",
|
|
|
|
|
|
|
|
content: `¿Deseas postular al proceso "${process.name}"?`,
|
|
|
|
|
|
|
|
okText: "Postular",
|
|
|
|
|
|
|
|
cancelText: "Cancelar",
|
|
|
|
|
|
|
|
async onOk() {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
await api.applyToProcess(process.id);
|
|
|
|
|
|
|
|
message.success("Postulación registrada.");
|
|
|
|
|
|
|
|
await fetchDashboard();
|
|
|
|
|
|
|
|
} catch {
|
|
|
|
|
|
|
|
message.error("No se pudo completar la postulación.");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
onMounted(fetchDashboard);
|
|
|
|
onMounted(fetchDashboard);
|
|
|
|
</script>
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
<style scoped>
|
|
|
|
|
|
|
|
/* ====== BASE ====== */
|
|
|
|
.dashboard-modern {
|
|
|
|
|
|
|
|
position: relative;
|
|
|
|
|
|
|
|
padding: 40px 0;
|
|
|
|
|
|
|
|
font-family: "Times New Roman", Times, serif;
|
|
|
|
|
|
|
|
background: #fbfcff;
|
|
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.dashboard-modern::before {
|
|
|
|
|
|
|
|
content: "";
|
|
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
|
|
inset: 0;
|
|
|
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
|
|
|
z-index: 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
background-image:
|
|
|
|
|
|
|
|
repeating-linear-gradient(
|
|
|
|
|
|
|
|
to right,
|
|
|
|
|
|
|
|
rgba(13, 27, 82, 0.06) 0,
|
|
|
|
|
|
|
|
rgba(13, 27, 82, 0.06) 1px,
|
|
|
|
|
|
|
|
transparent 1px,
|
|
|
|
|
|
|
|
transparent 24px
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
repeating-linear-gradient(
|
|
|
|
|
|
|
|
to bottom,
|
|
|
|
|
|
|
|
rgba(13, 27, 82, 0.06) 0,
|
|
|
|
|
|
|
|
rgba(13, 27, 82, 0.06) 1px,
|
|
|
|
|
|
|
|
transparent 1px,
|
|
|
|
|
|
|
|
transparent 24px
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
opacity: 0.55;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.section-container {
|
|
|
|
.section-container {
|
|
|
|
position: relative;
|
|
|
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
|
|
max-width: 1200px;
|
|
|
|
max-width: 1200px;
|
|
|
|
margin: 0 auto;
|
|
|
|
margin: 0 auto;
|
|
|
|
padding: 0 24px;
|
|
|
|
padding: 0 24px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.page {
|
|
|
|
.page {
|
|
|
|
width: 100%;
|
|
|
|
width: 100%;
|
|
|
|
max-width: 1120px;
|
|
|
|
max-width: 1120px;
|
|
|
|
margin: 0 auto;
|
|
|
|
margin: 0 auto;
|
|
|
|
padding: 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.mt12 { margin-top: 12px; }
|
|
|
|
.mt12 { margin-top: 12px; }
|
|
|
|
.microHelp { font-size: 0.95rem; color: #666; margin-top: 6px; }
|
|
|
|
.microHelp { font-size: 12px; color: #6b7280; margin-top: 8px; }
|
|
|
|
.softDivider { margin: 18px 0; }
|
|
|
|
.softDivider { margin: 16px 0; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ====== TOPBAR ====== */
|
|
|
|
.topbar {
|
|
|
|
.topbar {
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
justify-content: space-between;
|
|
|
|
@ -306,91 +220,62 @@ onMounted(fetchDashboard);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.hello {
|
|
|
|
.hello {
|
|
|
|
font-size: 2rem;
|
|
|
|
font-size: 28px;
|
|
|
|
font-weight: 700;
|
|
|
|
font-weight: 900;
|
|
|
|
color: #0d1b52;
|
|
|
|
color: #0f172a;
|
|
|
|
margin: 0;
|
|
|
|
margin: 0;
|
|
|
|
|
|
|
|
letter-spacing: 0.2px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.sub {
|
|
|
|
.sub {
|
|
|
|
margin-top: 6px;
|
|
|
|
margin-top: 6px;
|
|
|
|
font-size: 1rem;
|
|
|
|
font-size: 14px;
|
|
|
|
color: #666;
|
|
|
|
color: #64748b;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.topbarRight {
|
|
|
|
|
|
|
|
min-width: 260px;
|
|
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
justify-content: flex-end;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.btnTop {
|
|
|
|
|
|
|
|
min-width: 180px;
|
|
|
|
|
|
|
|
height: 46px;
|
|
|
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ====== TEST CARD ====== */
|
|
|
|
.testBox {
|
|
|
|
.testBox {
|
|
|
|
position: relative;
|
|
|
|
border: 1px solid rgba(15, 23, 42, 0.08);
|
|
|
|
border: none;
|
|
|
|
border-radius: 18px;
|
|
|
|
border-radius: 16px;
|
|
|
|
box-shadow: 0 10px 24px rgba(15, 23, 42, 0.06);
|
|
|
|
box-shadow: 0 10px 34px rgba(0, 0, 0, 0.08);
|
|
|
|
|
|
|
|
background: #fff;
|
|
|
|
background: #fff;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.testBox :deep(.ant-card-body) {
|
|
|
|
.testBox :deep(.ant-card-body) {
|
|
|
|
padding: 28px;
|
|
|
|
padding: 24px;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.cardBadge {
|
|
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
|
|
top: -12px;
|
|
|
|
|
|
|
|
left: 24px;
|
|
|
|
|
|
|
|
background: linear-gradient(45deg, #1890ff, #52c41a);
|
|
|
|
|
|
|
|
color: #fff;
|
|
|
|
|
|
|
|
padding: 6px 16px;
|
|
|
|
|
|
|
|
border-radius: 999px;
|
|
|
|
|
|
|
|
font-size: 0.75rem;
|
|
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.testHead {
|
|
|
|
.testHead {
|
|
|
|
display: flex;
|
|
|
|
display: grid;
|
|
|
|
justify-content: space-between;
|
|
|
|
grid-template-columns: 1fr 300px;
|
|
|
|
gap: 16px;
|
|
|
|
gap: 18px;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
align-items: start;
|
|
|
|
align-items: flex-start;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.testTitle {
|
|
|
|
.testTitle {
|
|
|
|
font-size: 1.55rem;
|
|
|
|
font-size: 20px;
|
|
|
|
font-weight: 700;
|
|
|
|
font-weight: 900;
|
|
|
|
color: #1a237e;
|
|
|
|
color: #0f172a;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.testSub {
|
|
|
|
.testSub {
|
|
|
|
margin-top: 8px;
|
|
|
|
margin-top: 8px;
|
|
|
|
font-size: 1rem;
|
|
|
|
font-size: 14px;
|
|
|
|
color: #666;
|
|
|
|
color: #475569;
|
|
|
|
line-height: 1.55;
|
|
|
|
line-height: 1.6;
|
|
|
|
max-width: 760px;
|
|
|
|
max-width: 760px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.testHeadRight {
|
|
|
|
.testHeadRight {
|
|
|
|
min-width: 260px;
|
|
|
|
display: grid;
|
|
|
|
display: flex;
|
|
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
gap: 8px;
|
|
|
|
gap: 8px;
|
|
|
|
align-items: flex-end;
|
|
|
|
align-content: start;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.btnTest {
|
|
|
|
.btnTest {
|
|
|
|
height: 52px;
|
|
|
|
height: 48px;
|
|
|
|
border-radius: 12px;
|
|
|
|
border-radius: 12px;
|
|
|
|
font-weight: 700;
|
|
|
|
font-weight: 900;
|
|
|
|
background: linear-gradient(135deg, #1a237e 0%, #283593 100%);
|
|
|
|
|
|
|
|
border: none;
|
|
|
|
border: none;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -399,21 +284,21 @@ onMounted(fetchDashboard);
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
gap: 10px;
|
|
|
|
gap: 10px;
|
|
|
|
align-items: flex-start;
|
|
|
|
align-items: flex-start;
|
|
|
|
font-size: 1rem;
|
|
|
|
font-size: 14px;
|
|
|
|
color: #666;
|
|
|
|
color: #475569;
|
|
|
|
line-height: 1.55;
|
|
|
|
line-height: 1.6;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.dot {
|
|
|
|
.dot {
|
|
|
|
width: 8px;
|
|
|
|
width: 8px;
|
|
|
|
height: 8px;
|
|
|
|
height: 8px;
|
|
|
|
border-radius: 999px;
|
|
|
|
border-radius: 999px;
|
|
|
|
background: #1a237e;
|
|
|
|
background: #1677ff;
|
|
|
|
margin-top: 9px;
|
|
|
|
margin-top: 9px;
|
|
|
|
flex: 0 0 auto;
|
|
|
|
flex: 0 0 auto;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ====== SECTION HEAD ====== */
|
|
|
|
.sectionHead {
|
|
|
|
.sectionHead {
|
|
|
|
display: flex;
|
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
justify-content: space-between;
|
|
|
|
@ -422,34 +307,33 @@ onMounted(fetchDashboard);
|
|
|
|
align-items: flex-start;
|
|
|
|
align-items: flex-start;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.sectionRight { margin-top: 4px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.sectionTitle {
|
|
|
|
.sectionTitle {
|
|
|
|
font-size: 1.55rem;
|
|
|
|
font-size: 20px;
|
|
|
|
font-weight: 700;
|
|
|
|
font-weight: 900;
|
|
|
|
color: #0d1b52;
|
|
|
|
color: #0f172a;
|
|
|
|
margin: 0;
|
|
|
|
margin: 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.sectionSub {
|
|
|
|
.sectionSub {
|
|
|
|
margin-top: 8px;
|
|
|
|
margin-top: 6px;
|
|
|
|
font-size: 1rem;
|
|
|
|
font-size: 14px;
|
|
|
|
color: #666;
|
|
|
|
color: #64748b;
|
|
|
|
line-height: 1.55;
|
|
|
|
line-height: 1.6;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Badge Nuevo (como convocatorias) */
|
|
|
|
|
|
|
|
.new-badge :deep(.ant-badge-count) {
|
|
|
|
.new-badge :deep(.ant-badge-count) {
|
|
|
|
background: linear-gradient(45deg, #ff6b6b, #ffd700);
|
|
|
|
background: linear-gradient(45deg, #ff6b6b, #ffd700);
|
|
|
|
box-shadow: 0 2px 8px rgba(255, 107, 107, 0.3);
|
|
|
|
box-shadow: 0 2px 8px rgba(255, 107, 107, 0.25);
|
|
|
|
border-radius: 999px;
|
|
|
|
border-radius: 999px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ====== TABLE WRAP ====== */
|
|
|
|
.tableWrap {
|
|
|
|
.tableWrap {
|
|
|
|
width: 100%;
|
|
|
|
width: 100%;
|
|
|
|
overflow-x: auto;
|
|
|
|
overflow-x: auto;
|
|
|
|
border-radius: 16px;
|
|
|
|
border-radius: 18px;
|
|
|
|
box-shadow: 0 10px 34px rgba(0, 0, 0, 0.08);
|
|
|
|
border: 1px solid rgba(15, 23, 42, 0.08);
|
|
|
|
|
|
|
|
box-shadow: 0 10px 24px rgba(15, 23, 42, 0.06);
|
|
|
|
background: #fff;
|
|
|
|
background: #fff;
|
|
|
|
padding: 8px;
|
|
|
|
padding: 8px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -460,86 +344,92 @@ onMounted(fetchDashboard);
|
|
|
|
|
|
|
|
|
|
|
|
:deep(.modernTable .ant-table-container) {
|
|
|
|
:deep(.modernTable .ant-table-container) {
|
|
|
|
overflow-x: auto;
|
|
|
|
overflow-x: auto;
|
|
|
|
border-radius: 12px;
|
|
|
|
border-radius: 14px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
:deep(.modernTable .ant-table-thead > tr > th) {
|
|
|
|
:deep(.modernTable .ant-table-thead > tr > th) {
|
|
|
|
background: rgba(13, 27, 82, 0.03);
|
|
|
|
background: rgba(15, 23, 42, 0.03);
|
|
|
|
color: #0d1b52;
|
|
|
|
color: #0f172a;
|
|
|
|
font-weight: 700;
|
|
|
|
font-weight: 900;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
:deep(.modernTable .ant-table-tbody > tr > td) {
|
|
|
|
:deep(.modernTable .ant-table-tbody > tr > td) {
|
|
|
|
color: #666;
|
|
|
|
color: #475569;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.status-tag {
|
|
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
|
|
padding: 4px 12px;
|
|
|
|
|
|
|
|
border-radius: 999px;
|
|
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.actions {
|
|
|
|
.actions {
|
|
|
|
display: grid;
|
|
|
|
display: grid;
|
|
|
|
grid-template-columns: 1fr 1fr;
|
|
|
|
grid-template-columns: 1fr;
|
|
|
|
gap: 8px;
|
|
|
|
gap: 8px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.actionBtn {
|
|
|
|
|
|
|
|
border-radius: 10px;
|
|
|
|
|
|
|
|
height: 38px;
|
|
|
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.actionBtnPrimary {
|
|
|
|
.actionBtnPrimary {
|
|
|
|
border-radius: 10px;
|
|
|
|
border-radius: 10px;
|
|
|
|
height: 38px;
|
|
|
|
height: 36px;
|
|
|
|
font-weight: 700;
|
|
|
|
font-weight: 900;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ====== RESPONSIVE ====== */
|
|
|
|
|
|
|
|
@media (max-width: 992px) {
|
|
|
|
|
|
|
|
.section-container {
|
|
|
|
|
|
|
|
padding: 0 16px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@media (max-width: 768px) {
|
|
|
|
.testHead {
|
|
|
|
.hide-mobile{
|
|
|
|
grid-template-columns: 1fr;
|
|
|
|
display: none !important;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.test-modern{
|
|
|
|
.testHeadRight {
|
|
|
|
padding-top: 0 !important;
|
|
|
|
justify-items: stretch;
|
|
|
|
padding-bottom: 24px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@media (max-width: 768px) {
|
|
|
|
.section-container {
|
|
|
|
.section-container {
|
|
|
|
max-width: none;
|
|
|
|
max-width: none;
|
|
|
|
padding: 0 !important;
|
|
|
|
padding: 0 !important;
|
|
|
|
margin: 0 !important;
|
|
|
|
margin: 0 !important;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.hero{
|
|
|
|
.page {
|
|
|
|
grid-template-columns: 1fr;
|
|
|
|
max-width: none;
|
|
|
|
width: 100%;
|
|
|
|
margin: 0;
|
|
|
|
margin: 0 !important;
|
|
|
|
padding: 0;
|
|
|
|
border-radius: 0 !important;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
padding: 14px 16px 18px !important;
|
|
|
|
.softDivider {
|
|
|
|
|
|
|
|
margin: 12px 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.heroKicker{ margin-top: 0 !important; }
|
|
|
|
.hello {
|
|
|
|
.heroTitle{ margin-top: 6px !important; }
|
|
|
|
font-size: 22px;
|
|
|
|
.heroText{ margin-top: 8px !important; }
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.section{
|
|
|
|
/* card full width en móvil (pro) */
|
|
|
|
padding: 0 16px;
|
|
|
|
.testBox,
|
|
|
|
|
|
|
|
.tableWrap {
|
|
|
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
|
|
|
border-left: 0;
|
|
|
|
|
|
|
|
border-right: 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.testBox :deep(.ant-card-body) {
|
|
|
|
|
|
|
|
padding: 14px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.heroFacts{
|
|
|
|
.tableWrap {
|
|
|
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
|
|
padding: 6px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@media (max-width: 576px){
|
|
|
|
@media (max-width: 480px) {
|
|
|
|
.heroFacts{
|
|
|
|
.hello {
|
|
|
|
grid-template-columns: 1fr;
|
|
|
|
font-size: 20px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
.testSub,
|
|
|
|
|
|
|
|
.bulletRow,
|
|
|
|
|
|
|
|
.sectionSub {
|
|
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</style>
|