Skip to content

Plataforma técnica · Sevastopol

Islands — Componentes Interactivos

Sevastopol Islands SolidJS

Las islands son componentes SolidJS que inyectan interactividad en el HTML estático generado por Astro. Se usan para lógica de cliente compleja: formularios dinámicos, tablas de datos, navegación SPA, dashboards en tiempo real.

Sevastopol organiza sus islands en dos familias: ViewIslands (lógica CRUD por módulo de negocio) e Islands de Administración (gestión central del sistema).


Toda island usa IslandBase como envoltorio para consistencia visual y manejo de errores.

imports comunes
import { createSignal, onMount, Show, createMemo, createEffect } from "solid-js";
import {
ToastProvider,
useToast,
Input,
DataTable,
Select,
Checkbox,
Button,
Modal,
TableAction,
ActionIcons
} from "@/components/atoms";
import { IslandBase } from "@/components/templates/IslandBase";
import { StatCard } from "@/components/molecules";
import { authenticatedFetch } from "@/lib/authFetch";
import { useTenants } from "@/lib/hooks/useTenants";
IslandBase wrapper
export default function EjemploIsla() {
const { tenants } = useTenants();
return (
<IslandBase title="Gestión de Recursos">
<div class="p-4">
{/* Lógica de UI */}
</div>
</IslandBase>
);
}

El ViewRouter intercepta clics en enlaces internos y carga contenido dinámicamente sin recargar la página. Es el corazón de la navegación tipo SPA de Sevastopol.


Los ViewIslands manejan lógica de visualización y edición de datos. Cada uno se conecta con un endpoint del Orchestrator API.

ViewIsland.tsx
// Ejemplo: EmployeesViewIsland.tsx
import { createSignal, createResource, For } from 'solid-js';
import { fetchData, postData } from '@/lib/api';
interface Employee {
id: string;
rut: string;
name: string;
}
export default function EmployeesViewIsland() {
const [employees] = createResource(() => fetchData('/api/query/employees'));
const [selected, setSelected] = createSignal<Employee | null>(null);
return (
<div class="view-container">
<header class="view-header">
<h2>Empleados</h2>
<button onClick={handleCreate}>Nuevo</button>
</header>
<table class="data-table">
<For each={employees()}>
{(emp) => <EmployeeRow data={emp} onSelect={setSelected} />}
</For>
</table>
{selected() && <EmployeeModal data={selected()} />}
</div>
);
}

IslandArchivoPropósito
EmployeesViewIslandpayroll/EmployeesViewIsland.tsxCRUD de empleados
ContractsViewIslandpayroll/ContractsViewIsland.tsxContratos laborales
PayrollViewIslandpayroll/PayrollViewIsland.tsxNóminas mensuales
APVContractsViewIslandpayroll/APVContractsViewIsland.tsxContratos APV
AttendanceViewIslandpayroll/AttendanceViewIsland.tsxControl de asistencia
CargosViewIslandpayroll/CargosViewIsland.tsxCargos y posiciones
DepartmentsViewIslandpayroll/DepartmentsViewIsland.tsxDepartamentos/áreas
FiniquitosViewIslandpayroll/FiniquitosViewIsland.tsxFiniquitos laborales
HonorariosViewIslandpayroll/HonorariosViewIsland.tsxPagos por honorarios
IsapreContractsViewIslandpayroll/IsapreContractsViewIsland.tsxContratos ISAPRE
PrevisionsViewIslandpayroll/PrevisionsViewIsland.tsxPrevisiones AFP/salud
VacationsViewIslandpayroll/VacationsViewIsland.tsxVacaciones y feriados
WorkingDayViewIslandpayroll/WorkingDayViewIsland.tsxJornadas laborales
PermissionsViewIslandpayroll/PermissionsViewIsland.tsxPermisos laborales

Endpoints representativos:

IslandEndpointMétodoDescripción
EmployeesViewIsland/api/query/employeesGETListar empleados
EmployeesViewIsland/api/command/employeesPOSTCrear empleado
ContractsViewIsland/api/query/contractsGETListar contratos
PayrollViewIsland/api/command/payroll/calculatePOSTCalcular nómina
PayrollViewIsland/api/command/payroll/closePOSTCerrar período
FiniquitosViewIsland/api/command/finiquitos/calculatePOSTCalcular finiquito
PrevisionsViewIsland/api/command/previsions/generatePOSTGenerar previsiones

Archivo: src/components/islands/declaraciones/DeclaracionesViewIsland.tsx

Propósito: Gestión de declaraciones juradas (F29, DJ1879, etc.).

EndpointMétodoDescripción
/api/query/declaracionesGETListar declaraciones
/api/query/declaraciones/f29GETObtener F29
/api/command/declaraciones/generatePOSTGenerar declaración

Archivo: src/components/islands/accounting/OperationsViewIsland.tsx

Propósito: Operaciones contables (compras, ventas).

EndpointMétodoDescripción
/api/query/operationsGETListar operaciones
/api/command/operationsPOSTRegistrar operación

Archivo: src/components/islands/registry/RegistryViewIsland.tsx

Propósito: Registro de eventos del sistema en tiempo real.

EndpointMétodoDescripción
/api/query/registryGETListar eventos

El módulo Admin contiene islands para la gestión central del sistema: empresa, capital, plan contable, representantes legales y monitoreo. Solo accesibles para roles ADMIN / SUPER_ADMIN.

  • Directorysevastopol/src/components/islands/admin/
    • BootstrapCierreIsland.tsx
    • CapitalViewIsland.tsx
    • ChartOfAccountsViewIsland.tsx
    • CommonDataExplorerIsland.tsx
    • CompanyViewIsland.tsx
    • ConfigContableViewIsland.tsx
    • EtlViewIsland.tsx
    • LegalRepresentativesViewIsland.tsx
    • MonitoringViewIsland.tsx
    • SessionsViewIsland.tsx
    • SystemConfigViewIsland.tsx
    • TenantsViewIsland.tsx
XxxViewIsland — patrón admin
export default function XxxViewIsland() {
return (
<ToastProvider>
<XxxView />
</ToastProvider>
);
}
function XxxView() {
const toast = useToast();
const [isLoading, setLoading] = createSignal(true);
const [data, setData] = createSignal([]);
const [tenants, setTenants] = createSignal<Tenant[]>([]);
const [selectedTenantId, setSelectedTenantId] = createSignal("");
async function fetchData() {
const url = selectedTenantId()
? `${API_BASE}?tenant_id=${selectedTenantId()}`
: API_BASE;
const r = await authenticatedFetch(url);
// ...
}
onMount(() => {
fetchTenants();
fetchData();
});
return (
<IslandBase
module="ADMIN"
title="Título"
tenants={tenants()}
selectedTenantId={selectedTenantId()}
onTenantChange={setSelectedTenantId}
stats={<StatCard ... />}
filters={<Select ... />}
>
<DataTable items={data()} headers={HEADERS} />
</IslandBase>
);
}
IslandPropósitoAcceso
CapitalViewIslandMovimientos de capital socialADMIN
ChartOfAccountsViewIslandPlan de cuentas contable jerárquicoADMIN
CompanyViewIslandDatos corporativos del tenantADMIN
LegalRepresentativesViewIslandRepresentantes legales y apoderadosADMIN
MonitoringViewIslandDashboard de métricas de saludADMIN
SystemConfigViewIslandConfiguraciones dinámicas del sistemaADMIN
TenantsViewIslandGestión multi-empresa (tenants)SUPER_ADMIN
SessionsViewIslandSesiones activas de usuariosADMIN
CommonDataExplorerIslandParámetros y catálogos globalesADMIN
ConfigContableViewIslandConfiguración contable del tenantADMIN
BootstrapCierreIslandApertura/cierre del ejercicioADMIN
EtlViewIslandProcesos ETL desde administraciónADMIN
IslandEndpointServicio
CapitalViewIsland/api/admin/capitalCapitalService
ChartOfAccountsViewIsland/api/admin/chart-of-accountsChartOfAccountsService
CompanyViewIsland/api/admin/companyCompanyService
LegalRepresentativesViewIsland/api/admin/representativesLegalRepService
MonitoringViewIsland/api/admin/metrics, /api/admin/health
SystemConfigViewIsland/api/admin/system-configSystemConfigService
TenantsViewIsland/api/admin/tenantsTenantService
SessionsViewIsland/api/admin/sessions
CommonDataExplorerIsland/api/parameters
ConfigContableViewIsland/api/admin/config-contable
BootstrapCierreIsland/api/reportes/bootstrap-cierre
EtlViewIsland/api/etl/trigger, /api/etl/status/:pidETL Controller

CapitalViewIsland — CRUD de movimientos con filtros por estado y tipo. Tipos: APORTE_INICIAL, AUMENTO_CAPITAL, REDUCCION_CAPITAL, CAPITALIZACION_UTILIDADES, REVALORIZACION.

ChartOfAccountsViewIsland — Vista en árbol jerárquico con badges de tipo (ACTIVO/PASIVO/etc.) e imputabilidad. Soporte IFRS con código alternativo.

MonitoringViewIsland — Métricas: disk_usage_pct, cpu_load_pct, memory_usage_pct, active_connections, failed_jobs_last_24h, api_errors_last_24h. Colores: verde < 50%, naranja 50–80%, rojo > 80%.

TenantsViewIsland — Lista tenants, crea nuevos, activa/desactiva. Solo SUPER_ADMIN.

CommonDataExplorerIsland — Catálogos: vida_util_activos (SII), correccion_monetaria, indicadores (UF, rentas mínimas, etc.).

BootstrapCierreIsland — Operación crítica de apertura del ejercicio. Requiere confirmación explícita.


WidgetArchivoPropósito
DocumentationWidgetislands/DocumentationWidget.tsxLinks rápidos a documentación
SystemStatusWidgetislands/SystemStatusWidget.tsxEstado del sistema (health, versión)

SystemStatusWidget consume /api/health (GET).