@activeit/frontend.core
v3.0.12
Published
Libreria de frontend escrita en TypeScript para construir interfaces modulares sobre navegador, con foco en integraciones Siebel/ActiveIT. El paquete expone vistas base, layouts, controles de formulario, modales, tablas, paginacion, iconografia y un clien
Readme
@activeit/frontend.core
Libreria de frontend escrita en TypeScript para construir interfaces modulares sobre navegador, con foco en integraciones Siebel/ActiveIT. El paquete expone vistas base, layouts, controles de formulario, modales, tablas, paginacion, iconografia y un cliente HTTP con cifrado opcional.
El contenido de este README fue reconstruido a partir del codigo fuente del repositorio.
Que hace este repositorio
Este repositorio genera un paquete reutilizable distribuido en dist/:
dist/ait-core.js: bundle UMD principal.dist/ait-core.css: estilos compilados.dist/index.d.ts: tipos TypeScript.dist/assets/: iconos SVG publicados por webpack.
La libreria no es una aplicacion standalone. Su objetivo es servir como capa base para construir vistas y componentes UI reutilizables dentro de otro frontend.
Capacidades principales
Base UI
View: clase base para vistas HTML con ciclo de vida (viewDidLoad,viewDidAppear,viewDidDisappear).NavigationView: contenedor de navegacion tipo stack conpush()ypop().TabView: contenedor de pestanas para varias vistas.HostContainer: wrapper simple para montar una vista raiz.ModalPresentation: gestor global de modales, alertas, confirmaciones y visualizacion de archivos/PDF.Viewer: vista para mostrar contenido embebido eniframe.ListView: lista scrollable condatasourceydelegate.
Layouts
HStackyVStack: composicion horizontal/vertical de elementos.Form: wrapper de formulario sin submit nativo.Table: tabla renderizada a partir de definicion de columnas y dataset.Paginator: paginador para tablas.Expand: contenedor expandible/colapsable.Space: separadores de layout.ProgressBar: barra de progreso.
Elementos
InputElement: input con placeholder, prefijo, formato numerico y binding pormodel.SelectElement: selector/autocomplete con datasource local.AITCalendar: selector de fecha sobre la base de select.CheckBoxElement: checkbox con callback de cambio.TextElement: texto alineable.ButtonElement: boton base con estado disabled y callback.ButtonPrimary,ButtonBack,CloseButton: variantes de boton.GenericIcon: render de iconos SVG empaquetados.SearchField: campo de busqueda con delegate.AITSegmentedBar: selector segmentado.
Custom tags
AitXIcon(<ait-x-icon-core>): custom element nativo que descarga y pinta un SVG porfetch.- extiende
HTMLElementdirectamente; ya no depende dex-tag. - atributos observados:
name,path,type(solidpor defecto, ademas deregularybrands). - cada atributo tiene su accessor equivalente (
icon.name = 'user'refleja el atributo). - resuelve la URI como
${BASE_ASSETS}/svgs/${type}/${name}.svgsalvo que se indiquepath. - si la descarga falla, pinta el fallback
(?)y loguea el error.
- extiende
Utilidades
backend: instanciaaxioscon interceptores para cifrado/descifrado opcional.once: helper para memoizar la primera ejecucion.AITView: decorador para registrar custom elements. Si el tag ya existe enCustomElementRegistry, emite unconsole.warny reutiliza el constructor registrado en lugar de fallar.- Tipos compartidos como
InvokeParamsyTextAlignment.
Supuestos de entorno
La libreria depende de un runtime de navegador y de varios globales que no define por si sola:
customElements,HTMLElement,window,document,fetch.SiebelAppySiebelJS.window.Modalen los flujos que invocan modales desde componentes internos.process.envconBASE_ASSETS,INGR1eINGR2(ver seccion de configuracion).
Del codigo fuente se desprenden estas dependencias operativas:
- El logging y parte del ciclo de vida usan
SiebelJS.DebugySiebelJS.LogLevel. - El cifrado del cliente HTTP consulta
SiebelApp.AITS_App.GetSystemPreferenceSync('AIT_ENCRYPTION_SP'). - El keep-alive del modal invoca
SiebelApp.S_App.GetProfileAttr(...). SBLSetFieldsinvoca el servicio SiebelDAV_AIT_Utilities.CloseButtony otros flujos interactuan directamente con APIs Siebel del contenedor.
Si el consumidor no corre en un contexto compatible con Siebel, algunas partes del paquete no funcionaran sin adaptacion.
Instalacion
npm install @activeit/frontend.corePeer dependencies declaradas por el paquete:
axiosnode-joserxjs
Requisito de entorno: node >= 18 (campo engines de package.json).
Desarrollo y build
Scripts disponibles en package.json:
npm run build # bundle de produccion con webpack
npm run typecheck # tsc --noEmit, valida tipos sin generar salidaEl build usa webpack en modo production y toma como entrada src/index.ts.
Notas relevantes:
- la configuracion de build vive en un unico
webpack.config.jsen formato ESM ("type": "module"enpackage.json). Ya no existewebpack.prod.js. tsconfig.jsoncompila todo./src/**/*y genera declaraciones TypeScript endist/.- webpack publica SVG/PNG en
dist/assets/. - tambien se genera
dist/ait-core.css(compilado consass;node-sassfue removido). webpack.DefinePlugininyecta__PKG_VERSION__leyendo laversiondepackage.json. La declaracion del global vive ensrc/custom.d.ts.CleanWebpackPluginlimpiadist/antes de cada build, por lo que los artefactos versionados se regeneran completos.
Variables y configuracion
El codigo referencia estas variables:
BASE_ASSETS: base publica para assets (src/utils/config.ts).INGR1: llave publica codificada en base64 (src/utils/publicKey.ts).INGR2: llave privada codificada en base64 (src/utils/publicKey.ts).
Importante: al eliminar webpack.prod.js se elimino tambien dotenv-webpack, asi que la configuracion actual no reemplaza estas variables en tiempo de build. En el bundle publicado quedan como accesos literales a process.env.*, por lo que el host debe exponer un process.env en el navegador con esos valores.
INGR1/INGR2se leen dentro de untry/catch: si no existen, el cifrado simplemente queda deshabilitado.BASE_ASSETSse evalua al cargar el modulo, sin proteccion. Si el contenedor no defineprocess, la carga del bundle falla.
Si se requiere volver a resolver estas variables en build, hay que reintroducir un plugin de entorno (DefinePlugin / EnvironmentPlugin / dotenv-webpack) en webpack.config.js.
Uso basico
1. Importar la libreria
import {
AITView,
View,
HostContainer,
ModalPresentation,
VStack,
Form,
InputElement,
ButtonElement,
TextElement
} from '@activeit/frontend.core';2. Crear una vista
@AITView({ tag: 'customer-form-view' })
class CustomerFormView extends View {
constructor() {
super();
const name = new InputElement({
tag: 'customer-name',
title: 'Nombre',
placeholder: 'Ingrese el nombre',
model: 'customer.name'
});
const save = new ButtonElement(
new TextElement('Guardar'),
{
target: () => {
console.log(this.model);
}
}
);
this.appendChild(
Form(
VStack([name, save])
)
);
}
}3. Montar una vista raiz
const root = new CustomerFormView();
document.body.appendChild(new HostContainer(root));4. Inicializar modales
Los componentes internos usan window.Modal. Una integracion razonable, inferida del codigo fuente, es montar una instancia global:
const modal = document.body.appendChild(new ModalPresentation());
window.Modal = modal;Modelo de datos en vistas
View implementa binding simple basado en el atributo model:
- al asignar
view.model = { customer: { name: 'Ana' } }, los controles conmodel="customer.name"reciben el valor. - al leer
view.model, la vista reconstruye el objeto a partir del valor actual de los controles hijos.
Esto aplica a componentes que heredan de AITElement, por ejemplo InputElement, SelectElement y CheckBoxElement.
Cliente HTTP con cifrado opcional
backend es una instancia de axios ya configurada con:
- headers JSON por defecto.
- interceptor de request que cifra
config.datacuando:- existe preferencia Siebel
AIT_ENCRYPTION_SP = Y - existen
publicKeyyprivateKey
- existe preferencia Siebel
- interceptor de response que intenta descifrar
response.data.payload.
Si el cifrado no esta habilitado o faltan llaves, la peticion sigue sin transformacion.
Ejemplo:
import { backend } from '@activeit/frontend.core';
const response = await backend.post('/api/example', {
id: '123'
});Estructura del codigo fuente
src/
Base/ vistas, navegacion, modales, host y contenedores
Elements/ controles de UI reutilizables
Layout/ stacks, tablas, formularios y composicion
Style/ estilos compartidos
token/ iconos y tokens visuales
utils/ backend, llaves, logger y helpers
decorator/ decoradores como AITView
interface/ contratos y enums
ait-x-tags/ wrappers de custom tags para iconosExport publico
El entrypoint src/index.ts expone:
oncebackend- todo
Base - todo
Layout - todo
Elements ait-x-tagsdecoratorinterfaceHELLO_CORE
HELLO_CORE ya no se escribe a mano: se arma con la version inyectada por webpack.
const HELLO_CORE = `****** AIT CORE MODULE LOADED V ${__PKG_VERSION__} *******`Con la version actual (3.0.12) el valor en el bundle es:
****** AIT CORE MODULE LOADED V 3.0.12 *******Basta con subir la version de package.json y reconstruir; no hay que tocar src/index.ts.
Cambios recientes
HELLO_COREtoma la version desdepackage.jsonviaDefinePlugin(__PKG_VERSION__).- Se agrego el script
typecheck(tsc --noEmit). - Se elimino
webpack.prod.js; queda un solowebpack.config.jsen ESM. AitXIconmigro deXTagElementaHTMLElement; se removio la dependenciax-tag.node-sassfue reemplazado porsass.- El decorador
AITViewy varios componentes ahora evitan redefinir custom elements ya registrados. - Se agrego el campo
enginesconnode >= 18.
Observaciones del repositorio
- El paquete no tiene suite de pruebas automatizadas. El script
testactual falla de forma intencional.npm run typecheckes hoy la unica verificacion automatizable. - Hay codigo de compatibilidad y algunos bloques deprecados/comentados, lo que sugiere evolucion incremental sobre una base existente.
dist/esta versionado en el repositorio, por lo que el paquete parece publicarse con artefactos compilados incluidos.
Recomendaciones para mantener este README
- actualizar ejemplos cuando cambie la API publica de
src/index.ts - documentar nuevas variables de entorno en la seccion de configuracion
- agregar un ejemplo real de integracion con Siebel si el equipo tiene un bootstrap estandar
- documentar flujo de publicacion si el paquete se libera por npm interno o registro privado
