@dogiloki/artha-js
v4.1.0
Published
Mini libreria de Web Components, XHR y UI para interfaces reactivas
Maintainers
Readme
Artha JS
Mini libreria para construir interfaces HTML reactivas con Web Components, peticiones XHR, cola de tareas y mensajes visuales sin depender de frameworks.
Artha JS esta pensada para:
- enviar formularios por XHR
- renderizar listas y bloques desde respuestas JSON
- mostrar loaders y mensajes de estado
- buscar con debounce sobre contenedores remotos o locales
- coordinar eventos globales entre componentes
- integrarse facil con Laravel y Vite
Contenido
- Que incluye
- Instalacion
- Uso con Laravel
- Inicio rapido
- Exportaciones
- Componentes
- Core
- Flujo de respuesta esperado
- Eventos utiles
- Desarrollo
- Licencia
Que incluye
La libreria exporta:
DataHelperDOMHelperFormatHelperFormHelperNumberHelperStringHelperEventBusTaskQueueXHRSPAArthaMessageArthaLoaderArthaContainerArthaFormArthaFieldArthaSelectArthaCollapsibleInputSearch
Al importar el paquete principal se registran automaticamente estos custom elements:
artha-containerartha-formartha-messageartha-loaderinput-searchartha-fieldartha-selectartha-collapsible
Instalacion
Desde npm
npm install @dogiloki/artha-jsImportar el paquete
import "@dogiloki/artha-js";Importar estilos
Desde JavaScript:
import "@dogiloki/artha-js/style";Desde tu archivo CSS o SCSS:
@import "@dogiloki/artha-js/dist/artha.min.css";Tambien puedes importar modulos puntuales:
import { EventBus, XHR, ArthaSelect, ArthaCollapsible } from "@dogiloki/artha-js";Uso con Laravel
En resources/js/app.js:
import "@dogiloki/artha-js";
import "@dogiloki/artha-js/style";Si quieres personalizar la forma en que se interpreta la respuesta del backend:
import "@dogiloki/artha-js";
import "@dogiloki/artha-js/style";
import { EventBus, XHR } from "@dogiloki/artha-js";
EventBus.on("artha:before-register", () => {
XHR.defaults.transformResponse = (xhr) => ({
status: xhr.status >= 200 && xhr.status < 300 ? "success" : "error",
message: xhr.response?.message ?? null,
errors: xhr.response?.errors ?? null,
data: xhr.response?.data ?? xhr.response
});
});Y en tu Blade:
@vite(['resources/js/app.js'])Inicio rapido
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="csrf-token" content="TOKEN_OPCIONAL">
<link rel="stylesheet" href="./dist/artha.min.css">
</head>
<body>
<artha-collapsible>
<div class="item-header">
<span class="item-title">Mas informacion</span>
</div>
<div class="item-content">
<p>Contenido expandible</p>
</div>
</artha-collapsible>
<artha-container
action="/api/users"
template="user-template"
searcher
search-mode="server">
</artha-container>
<template id="user-template">
<article>
<h3 data-wire="name"></h3>
<p data-wire="email"></p>
<small data-wire="id"></small>
</article>
</template>
<script type="module">
import "./dist/artha.min.js";
</script>
</body>
</html>Exportaciones
import {
DataHelper,
DOMHelper,
FormatHelper,
FormHelper,
NumberHelper,
StringHelper,
EventBus,
TaskQueue,
XHR,
SPA,
ArthaMessage,
ArthaLoader,
ArthaContainer,
ArthaForm,
ArthaField,
ArthaSelect,
ArthaCollapsible,
InputSearch
} from "@dogiloki/artha-js";Al cargar el modulo tambien se emiten:
artha:before-registerartha:after-register
Componentes
artha-message
Componente para mostrar mensajes visuales.
Tipos soportados:
infosuccesswarningerror
API publica:
show(message, type)info(message)success(message)warning(message)error(message)hidden()
artha-loader
Loader visual para estados de carga.
Atributos:
type: tipo de loader. Defaultringtext: texto mostrado debajo del loader
Tipos disponibles:
ringdotsbarwave
artha-form
Formulario asincrono basado en XMLHttpRequest.
Comportamiento:
- intercepta
submit - valida con
checkValidity() - envia datos por XHR
- muestra mensajes con
artha-message - rellena campos automaticamente si la respuesta trae
data - soporta
select,artha-selecty elementos[selectable]
Atributos utiles:
actionmethodresponse-typedisable-submitmessage-targetid
API publica:
submit()reset(resetMessage = true)resetMessage()checkValidity()loadInputs(selector = "input,select,textarea,artha-select,[selectable]")loadInputsSelect(element, data = null)fillFromJson(json, reset = true)getValue(name)input(name)
Eventos emitidos:
loadresolvecomponent-ready
Selects dinamicos dentro de artha-form
Si un select tiene atributo action, Artha cargara sus opciones de forma remota:
<artha-form action="/users" method="POST">
<select name="organism_id" action="/api/organisms"></select>
</artha-form>Si ademas defines refresh-on, el select se recargara cuando ese evento global ocurra:
<select
name="organism_id"
action="/api/organisms"
refresh-on="organisms:reload">
</select>artha-container
Componente para cargar, renderizar y refrescar datos remotos o filtrar contenido local.
Casos de uso:
- listados
- tarjetas
- tablas simples
- contenedores anidados
- seleccion simple o multiple
- busqueda con
input-search - paginacion
- refresco via
EventBus
Atributos utiles:
actionaction_routermethodnamepagesearchsearch-moderesponse-typetemplatepaginationmessagemessage-targetsearcherselectablemultiplerefresh-onid
API publica:
hasAction()hasPagination()router(id)refresh(search = null)refreshWithData(data)render(results, refresh = false, refreshChildren = true)renderItem(data, refreshChildren = true, update = null)renderMessage(message, status = "info")nextPage()prevPage()goToPage(page)resetPagination(refresh = false)reset()selection()- propiedad
value
Eventos emitidos:
loadresolvedynamic-content-loadeditem-rendereditem-selecteditem-deselectedmessage-renderedcomponent-ready
Modos de busqueda
artha-container puede trabajar en dos modos:
server: usaactiony hace peticiones remotaslocal: filtra los items ya renderizados en memoria
Ejemplo remoto:
<artha-container
action="/api/users"
template="user-template"
searcher
search-mode="server">
</artha-container>Ejemplo local:
<artha-container
template="user-template"
searcher
search-mode="local">
</artha-container>data-wire
El renderizado se basa en atributos data-wire dentro de la plantilla.
Formatos soportados:
data-wire="ruta"
data-wire="ruta:atributo"
data-wire="ruta:atributo:append"
data-wire="ruta:boolean"
data-wire="ruta:boolean:chooser"Tambien puedes usar multiples wires separados por coma:
<span data-wire="email,name:title"></span>Ejemplos:
<span data-wire="name"></span>
<span data-wire="user.email"></span>
<span data-wire="price:textContent:append">$ </span>
<span data-wire="active:boolean"></span>Chooser:
<div data-wire="status:boolean:chooser">
<template data-chooser-value="approved">
<span>Aprobado</span>
</template>
<template data-chooser-value="rejected">
<span>Rechazado</span>
</template>
<template data-chooser-default>
<span>Pendiente</span>
</template>
</div>Arreglos simples:
<ul data-wire="tags[]">
<li>
<span fillable></span>
</li>
</ul>artha-select
Componente de seleccion custom con soporte de formularios nativos.
Caracteristicas:
- soporte
formAssociated - seleccion simple o multiple
required,readonlyydisabled- carga remota de opciones mediante
action - eventos
inputychange
Atributos utiles:
nameactionmethodmultiplerequiredreadonlydisabled
API publica:
- propiedad
value selection()isSelect(option)select(option, emit = true)deselect(option, emit = true)reset(emit = true)checkValidity()reportValidity()setCustomValidity(message)render(data = null)
Eventos emitidos:
selectdeselectresetinputchange
Ejemplo simple:
<artha-select name="role_id">
<option value="1">Admin</option>
<option value="2">Editor</option>
</artha-select>Ejemplo remoto:
<artha-select
name="organism_id"
action="/api/organisms"
multiple>
</artha-select>artha-field
Componente para edicion inline de un campo usando la logica de artha-form.
Permite:
- mostrar un valor visible
- alternar entre lectura y edicion
- guardar por XHR
- cancelar cambios locales
Ejemplo:
<artha-field action="/users/1" method="PUT">
<span field-value="name"></span>
<input type="text" name="name" class="hidden" value="Ana">
</artha-field>artha-collapsible
Componente para mostrar y ocultar contenido expandible.
Funcionamiento:
- toma el primer hijo como cabecera
- toma el segundo hijo como contenido
- agrega un indicador visual de apertura
- alterna entre abierto y cerrado al hacer click en la cabecera
API publica:
toggle(isOpen = null)
Ejemplo:
<artha-collapsible>
<div class="item-header">
<span class="item-title">Mas informacion</span>
</div>
<div class="item-content">
<p>Contenido expandible</p>
</div>
</artha-collapsible>input-search
Componente de busqueda con debounce pensado para integrarse con artha-container.
Atributos:
delay: default300text: placeholder del input
API publica:
search()refresh()searchMode(mode)
Eventos emitidos:
searchcancel-searchrefresh
Core
XHR
Wrapper de XMLHttpRequest con callbacks y opciones centralizadas.
Uso basico:
import { XHR } from "@dogiloki/artha-js";
XHR.request({
url: "/api/users",
method: "GET",
headers: {
Accept: "application/json"
},
onData: (xhr, data) => {
console.log(data);
}
});Opciones utiles:
methodurluriheadersdataqueryfilesresponse_typewith_credentialstimeoutretryretry_delaytransformResponse(xhr)onLoad(xhr)onData(xhr, transformed)onError(transformed)onTimeout(transformed)onProgress(event, loaded, total)onAbort(transformed)onAction(xhr)
Notas de comportamiento:
- acepta meta tags
csrf-token,csrf_tokeny_token - envia el token como header
X-CSRF-Token - para metodos distintos de
GET, enviaFormData - agrega
_tokenal cuerpo cuando existe - agrega
_methodsi no fue enviado manualmente
TaskQueue
Evita ejecutar dos tareas con el mismo id al mismo tiempo y centraliza estados.
Uso basico:
import { TaskQueue } from "@dogiloki/artha-js";
const queue = TaskQueue.singleton();Defaults:
TaskQueue.defaults = {
title: "Peticion en proceso...",
close: false,
message: null
};EventBus
Bus global basado en EventTarget.
Uso:
import { EventBus } from "@dogiloki/artha-js";
const unsubscribe = EventBus.on("users:reload", (data) => {
console.log(data);
});
EventBus.emit("users:reload", { source: "manual" });
unsubscribe();API publica:
EventBus.emit(name, data)EventBus.emitAsync(name, data)EventBus.on(name, callback)EventBus.once(name, callback)EventBus.onAny(callback)EventBus.off(name, callback)EventBus.clean(name)EventBus.clearAll()
SPA
Utilidad ligera para navegacion por secciones usando un menu y un contenedor.
Funcionamiento:
- busca elementos con atributo
keydentro del menu - busca contenidos con el mismo
key - oculta todos los contenidos
- activa el contenido correspondiente al hacer click
Ejemplo:
import { SPA } from "@dogiloki/artha-js";
new SPA({
menu: document.getElementById("menu"),
content: document.getElementById("content")
});Helpers
Helpers exportados:
DataHelperDOMHelperFormatHelperFormHelperNumberHelperStringHelper
Flujo de respuesta esperado
Artha funciona mejor cuando el backend responde con una estructura como esta:
{
"status": "success",
"message": "Operacion completada",
"data": []
}Para errores:
{
"status": "error",
"message": "No se pudo completar la operacion",
"errors": {
"email": ["El correo ya existe"]
}
}Si tu API responde distinto, puedes normalizarla con XHR.defaults.transformResponse.
Eventos utiles
Eventos de componentes:
component-readyloadresolvedynamic-content-loadeditem-rendereditem-selecteditem-deselectedmessage-renderedsearchcancel-searchrefreshselectdeselectchangeinput
Eventos globales:
artha:before-registerartha:after-register
Ejemplo de refresco:
import { EventBus } from "@dogiloki/artha-js";
EventBus.emit("users:updated", { id: 3, name: "Nuevo nombre" });
EventBus.emit("users:reload");<artha-container
action="/api/users"
template="user-template"
refresh-on="users:reload,users:updated">
</artha-container>Desarrollo
Instalar dependencias:
npm installModo desarrollo:
npm run devScripts disponibles:
npm run dev:cssnpm run dev:jsnpm run dev:servernpm run buildnpm run build:cssnpm run build:jsnpm run build:debugnpm run build:debug:cssnpm run build:debug:js
Build de produccion:
npm run buildEsto genera:
dist/artha.min.cssdist/artha.min.js
Build de depuracion:
npm run build:debugEsto genera:
dist/artha.cssdist/artha.css.mapdist/artha.jsdist/artha.js.map
Licencia
MIT. Consulta LICENSE.
