@yakuzaa/jade-runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apis/audit_service.d.ts +43 -0
- package/dist/apis/audit_service.d.ts.map +1 -0
- package/dist/apis/audit_service.js +73 -0
- package/dist/apis/audit_service.js.map +1 -0
- package/dist/apis/auth_service.d.ts +51 -0
- package/dist/apis/auth_service.d.ts.map +1 -0
- package/dist/apis/auth_service.js +120 -0
- package/dist/apis/auth_service.js.map +1 -0
- package/dist/apis/console_api.d.ts +34 -0
- package/dist/apis/console_api.d.ts.map +1 -0
- package/dist/apis/console_api.js +90 -0
- package/dist/apis/console_api.js.map +1 -0
- package/dist/apis/datetime_api.d.ts +13 -0
- package/dist/apis/datetime_api.d.ts.map +1 -0
- package/dist/apis/datetime_api.js +89 -0
- package/dist/apis/datetime_api.js.map +1 -0
- package/dist/apis/http_client.d.ts +32 -0
- package/dist/apis/http_client.d.ts.map +1 -0
- package/dist/apis/http_client.js +83 -0
- package/dist/apis/http_client.js.map +1 -0
- package/dist/apis/permission_service.d.ts +18 -0
- package/dist/apis/permission_service.d.ts.map +1 -0
- package/dist/apis/permission_service.js +56 -0
- package/dist/apis/permission_service.js.map +1 -0
- package/dist/core/event_loop.d.ts +14 -0
- package/dist/core/event_loop.d.ts.map +1 -0
- package/dist/core/event_loop.js +60 -0
- package/dist/core/event_loop.js.map +1 -0
- package/dist/core/memory_manager.d.ts +43 -0
- package/dist/core/memory_manager.d.ts.map +1 -0
- package/dist/core/memory_manager.js +218 -0
- package/dist/core/memory_manager.js.map +1 -0
- package/dist/core/runtime.d.ts +18 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +116 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/persistence/local_datastore.d.ts +34 -0
- package/dist/persistence/local_datastore.d.ts.map +1 -0
- package/dist/persistence/local_datastore.js +112 -0
- package/dist/persistence/local_datastore.js.map +1 -0
- package/dist/persistence/sync_manager.d.ts +49 -0
- package/dist/persistence/sync_manager.d.ts.map +1 -0
- package/dist/persistence/sync_manager.js +187 -0
- package/dist/persistence/sync_manager.js.map +1 -0
- package/dist/pwa/pwa_generator.d.ts +16 -0
- package/dist/pwa/pwa_generator.d.ts.map +1 -0
- package/dist/pwa/pwa_generator.js +107 -0
- package/dist/pwa/pwa_generator.js.map +1 -0
- package/dist/stdlib/matematica.d.ts +121 -0
- package/dist/stdlib/matematica.d.ts.map +1 -0
- package/dist/stdlib/matematica.js +250 -0
- package/dist/stdlib/matematica.js.map +1 -0
- package/dist/stdlib/moeda.d.ts +129 -0
- package/dist/stdlib/moeda.d.ts.map +1 -0
- package/dist/stdlib/moeda.js +212 -0
- package/dist/stdlib/moeda.js.map +1 -0
- package/dist/stdlib/texto.d.ts +101 -0
- package/dist/stdlib/texto.d.ts.map +1 -0
- package/dist/stdlib/texto.js +205 -0
- package/dist/stdlib/texto.js.map +1 -0
- package/dist/stdlib/xml.d.ts +77 -0
- package/dist/stdlib/xml.d.ts.map +1 -0
- package/dist/stdlib/xml.js +212 -0
- package/dist/stdlib/xml.js.map +1 -0
- package/dist/ui/binding.d.ts +22 -0
- package/dist/ui/binding.d.ts.map +1 -0
- package/dist/ui/binding.js +62 -0
- package/dist/ui/binding.js.map +1 -0
- package/dist/ui/components/botao.d.ts +4 -0
- package/dist/ui/components/botao.d.ts.map +1 -0
- package/dist/ui/components/botao.js +4 -0
- package/dist/ui/components/botao.js.map +1 -0
- package/dist/ui/components/campo.d.ts +8 -0
- package/dist/ui/components/campo.d.ts.map +1 -0
- package/dist/ui/components/campo.js +9 -0
- package/dist/ui/components/campo.js.map +1 -0
- package/dist/ui/components/card.d.ts +4 -0
- package/dist/ui/components/card.d.ts.map +1 -0
- package/dist/ui/components/card.js +4 -0
- package/dist/ui/components/card.js.map +1 -0
- package/dist/ui/components/formulario.d.ts +4 -0
- package/dist/ui/components/formulario.d.ts.map +1 -0
- package/dist/ui/components/formulario.js +4 -0
- package/dist/ui/components/formulario.js.map +1 -0
- package/dist/ui/components/tabela.d.ts +3 -0
- package/dist/ui/components/tabela.d.ts.map +1 -0
- package/dist/ui/components/tabela.js +4 -0
- package/dist/ui/components/tabela.js.map +1 -0
- package/dist/ui/reactive.d.ts +61 -0
- package/dist/ui/reactive.d.ts.map +1 -0
- package/dist/ui/reactive.js +149 -0
- package/dist/ui/reactive.js.map +1 -0
- package/dist/ui/refs.d.ts +13 -0
- package/dist/ui/refs.d.ts.map +1 -0
- package/dist/ui/refs.js +32 -0
- package/dist/ui/refs.js.map +1 -0
- package/dist/ui/router.d.ts +39 -0
- package/dist/ui/router.d.ts.map +1 -0
- package/dist/ui/router.js +74 -0
- package/dist/ui/router.js.map +1 -0
- package/dist/ui/theme.d.ts +19 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +183 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/ui_engine.d.ts +89 -0
- package/dist/ui/ui_engine.d.ts.map +1 -0
- package/dist/ui/ui_engine.js +406 -0
- package/dist/ui/ui_engine.js.map +1 -0
- package/dist/ui/virtual_list.d.ts +29 -0
- package/dist/ui/virtual_list.d.ts.map +1 -0
- package/dist/ui/virtual_list.js +88 -0
- package/dist/ui/virtual_list.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { Store, Signal, disposeOwner, setEffectOwner } from './reactive.js';
|
|
2
|
+
import { bind, bindInput } from './binding.js';
|
|
3
|
+
import { RefManager } from './refs.js';
|
|
4
|
+
import { VirtualList } from './virtual_list.js';
|
|
5
|
+
import { aplicarTema } from './theme.js';
|
|
6
|
+
import { Router } from './router.js';
|
|
7
|
+
// ── UIEngine ─────────────────────────────────────────────────────────────────
|
|
8
|
+
export class UIEngine {
|
|
9
|
+
store;
|
|
10
|
+
refs;
|
|
11
|
+
memory;
|
|
12
|
+
router;
|
|
13
|
+
telaAtiva = null;
|
|
14
|
+
toastContainer = null;
|
|
15
|
+
constructor(memory, tema) {
|
|
16
|
+
this.memory = memory;
|
|
17
|
+
this.store = new Store();
|
|
18
|
+
this.refs = new RefManager();
|
|
19
|
+
this.router = new Router(this.store, memory);
|
|
20
|
+
if (typeof document !== 'undefined') {
|
|
21
|
+
aplicarTema(tema);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// ── Gestão de telas ───────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Monta uma nova tela no container.
|
|
27
|
+
* CORREÇÃO: ao trocar de tela, os efeitos reativos e dados da tela anterior
|
|
28
|
+
* são descartados para evitar vazamento de memória e atualizações fantasma.
|
|
29
|
+
*/
|
|
30
|
+
montarTela(config, container) {
|
|
31
|
+
// Limpar tela anterior
|
|
32
|
+
if (this.telaAtiva) {
|
|
33
|
+
disposeOwner(this.telaAtiva);
|
|
34
|
+
this.memory.freeOwner(this.telaAtiva);
|
|
35
|
+
// CORREÇÃO: limpar apenas o namespace da tela que saiu, não o store inteiro
|
|
36
|
+
this.store.clearNamespace(this.telaAtiva + '.');
|
|
37
|
+
this.refs.limpar();
|
|
38
|
+
}
|
|
39
|
+
this.telaAtiva = config.nome;
|
|
40
|
+
container.innerHTML = '';
|
|
41
|
+
container.dataset.tela = config.nome;
|
|
42
|
+
const div = document.createElement('div');
|
|
43
|
+
div.className = 'jade-tela';
|
|
44
|
+
if (config.titulo) {
|
|
45
|
+
const h1 = document.createElement('h1');
|
|
46
|
+
h1.className = 'jade-tela-titulo';
|
|
47
|
+
h1.textContent = config.titulo;
|
|
48
|
+
div.appendChild(h1);
|
|
49
|
+
}
|
|
50
|
+
container.appendChild(div);
|
|
51
|
+
return div;
|
|
52
|
+
}
|
|
53
|
+
// ── Tabela ────────────────────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Cria uma tabela com dados reativos.
|
|
56
|
+
* Suporta: filtro por texto, ordenação por coluna, paginação, VirtualList.
|
|
57
|
+
*/
|
|
58
|
+
criarTabela(config, container, dados) {
|
|
59
|
+
setEffectOwner(this.telaAtiva);
|
|
60
|
+
const linhasPorPagina = config.paginacao === true
|
|
61
|
+
? 20
|
|
62
|
+
: typeof config.paginacao === 'number'
|
|
63
|
+
? config.paginacao
|
|
64
|
+
: 0;
|
|
65
|
+
// Estado reativo da tabela
|
|
66
|
+
const termoBusca = new Signal('');
|
|
67
|
+
const campOrdem = new Signal(null);
|
|
68
|
+
const direcaoOrdem = new Signal('asc');
|
|
69
|
+
const paginaAtual = new Signal(0);
|
|
70
|
+
const wrapper = document.createElement('div');
|
|
71
|
+
wrapper.className = 'jade-tabela-wrapper';
|
|
72
|
+
// ── Barra de controles (busca) ──────────────────────────────────────────
|
|
73
|
+
if (config.filtravel) {
|
|
74
|
+
const controles = document.createElement('div');
|
|
75
|
+
controles.className = 'jade-tabela-controles';
|
|
76
|
+
const busca = document.createElement('input');
|
|
77
|
+
busca.type = 'text';
|
|
78
|
+
busca.placeholder = 'Buscar...';
|
|
79
|
+
busca.className = 'jade-tabela-busca';
|
|
80
|
+
busca.addEventListener('input', () => {
|
|
81
|
+
termoBusca.set(busca.value.toLowerCase());
|
|
82
|
+
paginaAtual.set(0); // voltar para primeira página ao filtrar
|
|
83
|
+
});
|
|
84
|
+
controles.appendChild(busca);
|
|
85
|
+
wrapper.appendChild(controles);
|
|
86
|
+
}
|
|
87
|
+
// ── Tabela HTML ─────────────────────────────────────────────────────────
|
|
88
|
+
const tabelaDiv = document.createElement('div');
|
|
89
|
+
tabelaDiv.className = 'jade-tabela';
|
|
90
|
+
const table = document.createElement('table');
|
|
91
|
+
const thead = document.createElement('thead');
|
|
92
|
+
const headerRow = document.createElement('tr');
|
|
93
|
+
config.colunas.forEach(col => {
|
|
94
|
+
const th = document.createElement('th');
|
|
95
|
+
th.textContent = col.titulo;
|
|
96
|
+
if (config.ordenavel !== false && col.ordenavel !== false) {
|
|
97
|
+
th.className = 'ordenavel';
|
|
98
|
+
const icon = document.createElement('span');
|
|
99
|
+
icon.className = 'jade-sort-icon';
|
|
100
|
+
icon.textContent = '↕';
|
|
101
|
+
th.appendChild(icon);
|
|
102
|
+
th.addEventListener('click', () => {
|
|
103
|
+
if (campOrdem.peek() === col.campo) {
|
|
104
|
+
direcaoOrdem.set(direcaoOrdem.peek() === 'asc' ? 'desc' : 'asc');
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
campOrdem.set(col.campo);
|
|
108
|
+
direcaoOrdem.set('asc');
|
|
109
|
+
}
|
|
110
|
+
paginaAtual.set(0);
|
|
111
|
+
// Atualizar classes dos cabeçalhos
|
|
112
|
+
headerRow.querySelectorAll('th').forEach(t => {
|
|
113
|
+
t.classList.remove('sort-asc', 'sort-desc');
|
|
114
|
+
});
|
|
115
|
+
th.classList.add(direcaoOrdem.peek() === 'asc' ? 'sort-asc' : 'sort-desc');
|
|
116
|
+
icon.textContent = direcaoOrdem.peek() === 'asc' ? '↑' : '↓';
|
|
117
|
+
atualizarTabela();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
headerRow.appendChild(th);
|
|
121
|
+
});
|
|
122
|
+
thead.appendChild(headerRow);
|
|
123
|
+
table.appendChild(thead);
|
|
124
|
+
// ── Corpo da tabela ─────────────────────────────────────────────────────
|
|
125
|
+
const tbody = document.createElement('tbody');
|
|
126
|
+
table.appendChild(tbody);
|
|
127
|
+
tabelaDiv.appendChild(table);
|
|
128
|
+
// ── Rodapé de paginação ─────────────────────────────────────────────────
|
|
129
|
+
let paginacaoDiv = null;
|
|
130
|
+
if (linhasPorPagina > 0) {
|
|
131
|
+
paginacaoDiv = document.createElement('div');
|
|
132
|
+
paginacaoDiv.className = 'jade-tabela-paginacao';
|
|
133
|
+
tabelaDiv.appendChild(paginacaoDiv);
|
|
134
|
+
}
|
|
135
|
+
wrapper.appendChild(tabelaDiv);
|
|
136
|
+
container.appendChild(wrapper);
|
|
137
|
+
// ── Função que re-renderiza o corpo com dados filtrados/ordenados/paginados
|
|
138
|
+
const atualizarTabela = () => {
|
|
139
|
+
let linhas = [...dados];
|
|
140
|
+
// Filtro por texto
|
|
141
|
+
const termo = termoBusca.peek();
|
|
142
|
+
if (termo) {
|
|
143
|
+
linhas = linhas.filter(item => config.colunas.some(col => String(item[col.campo] ?? '').toLowerCase().includes(termo)));
|
|
144
|
+
}
|
|
145
|
+
// Ordenação
|
|
146
|
+
const campo = campOrdem.peek();
|
|
147
|
+
if (campo) {
|
|
148
|
+
const dir = direcaoOrdem.peek() === 'asc' ? 1 : -1;
|
|
149
|
+
linhas.sort((a, b) => {
|
|
150
|
+
const va = a[campo] ?? '';
|
|
151
|
+
const vb = b[campo] ?? '';
|
|
152
|
+
if (va < vb)
|
|
153
|
+
return -1 * dir;
|
|
154
|
+
if (va > vb)
|
|
155
|
+
return 1 * dir;
|
|
156
|
+
return 0;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// Paginação
|
|
160
|
+
const pagina = paginaAtual.peek();
|
|
161
|
+
if (linhasPorPagina > 0 && paginacaoDiv) {
|
|
162
|
+
const totalPaginas = Math.max(1, Math.ceil(linhas.length / linhasPorPagina));
|
|
163
|
+
const paginaCorreta = Math.min(pagina, totalPaginas - 1);
|
|
164
|
+
if (paginaCorreta !== pagina)
|
|
165
|
+
paginaAtual.set(paginaCorreta);
|
|
166
|
+
linhas = linhas.slice(paginaCorreta * linhasPorPagina, (paginaCorreta + 1) * linhasPorPagina);
|
|
167
|
+
// Re-renderizar controles de paginação
|
|
168
|
+
paginacaoDiv.innerHTML = '';
|
|
169
|
+
const info = document.createElement('span');
|
|
170
|
+
info.textContent = `Página ${paginaCorreta + 1} de ${totalPaginas}`;
|
|
171
|
+
paginacaoDiv.appendChild(info);
|
|
172
|
+
const btnAnterior = document.createElement('button');
|
|
173
|
+
btnAnterior.textContent = '←';
|
|
174
|
+
btnAnterior.className = 'jade-pag-btn';
|
|
175
|
+
btnAnterior.disabled = paginaCorreta === 0;
|
|
176
|
+
btnAnterior.addEventListener('click', () => {
|
|
177
|
+
paginaAtual.set(paginaCorreta - 1);
|
|
178
|
+
atualizarTabela();
|
|
179
|
+
});
|
|
180
|
+
paginacaoDiv.appendChild(btnAnterior);
|
|
181
|
+
// Botões de página (máximo 5 visíveis)
|
|
182
|
+
const inicio = Math.max(0, paginaCorreta - 2);
|
|
183
|
+
const fim = Math.min(totalPaginas, inicio + 5);
|
|
184
|
+
for (let p = inicio; p < fim; p++) {
|
|
185
|
+
const btn = document.createElement('button');
|
|
186
|
+
btn.textContent = String(p + 1);
|
|
187
|
+
btn.className = `jade-pag-btn${p === paginaCorreta ? ' ativo' : ''}`;
|
|
188
|
+
btn.addEventListener('click', () => { paginaAtual.set(p); atualizarTabela(); });
|
|
189
|
+
paginacaoDiv.appendChild(btn);
|
|
190
|
+
}
|
|
191
|
+
const btnProximo = document.createElement('button');
|
|
192
|
+
btnProximo.textContent = '→';
|
|
193
|
+
btnProximo.className = 'jade-pag-btn';
|
|
194
|
+
btnProximo.disabled = paginaCorreta >= totalPaginas - 1;
|
|
195
|
+
btnProximo.addEventListener('click', () => {
|
|
196
|
+
paginaAtual.set(paginaCorreta + 1);
|
|
197
|
+
atualizarTabela();
|
|
198
|
+
});
|
|
199
|
+
paginacaoDiv.appendChild(btnProximo);
|
|
200
|
+
}
|
|
201
|
+
// Renderizar linhas
|
|
202
|
+
tbody.innerHTML = '';
|
|
203
|
+
if (linhas.length === 0) {
|
|
204
|
+
const tr = document.createElement('tr');
|
|
205
|
+
const td = document.createElement('td');
|
|
206
|
+
td.colSpan = config.colunas.length;
|
|
207
|
+
td.className = 'jade-tabela-vazio';
|
|
208
|
+
td.textContent = 'Nenhum registro encontrado.';
|
|
209
|
+
tr.appendChild(td);
|
|
210
|
+
tbody.appendChild(tr);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
linhas.forEach((item, index) => {
|
|
214
|
+
const tr = document.createElement('tr');
|
|
215
|
+
config.colunas.forEach(col => {
|
|
216
|
+
const td = document.createElement('td');
|
|
217
|
+
const signal = this.store.get(`${config.entidade}.${index}.${col.campo}`, item[col.campo]);
|
|
218
|
+
bind(signal, td, 'textContent');
|
|
219
|
+
tr.appendChild(td);
|
|
220
|
+
});
|
|
221
|
+
tbody.appendChild(tr);
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
// VirtualList só é usado quando não há filtro/paginação interativa
|
|
225
|
+
// (VirtualList e tabela paginada são mutuamente exclusivos)
|
|
226
|
+
if (config.virtualList && dados.length > 100 && linhasPorPagina === 0 && !config.filtravel) {
|
|
227
|
+
const listContainer = document.createElement('div');
|
|
228
|
+
listContainer.style.height = config.altura ?? '400px';
|
|
229
|
+
wrapper.appendChild(listContainer);
|
|
230
|
+
new VirtualList({
|
|
231
|
+
container: listContainer,
|
|
232
|
+
items: dados,
|
|
233
|
+
rowHeight: config.rowHeight ?? 41,
|
|
234
|
+
renderRow: (item, index) => {
|
|
235
|
+
const row = document.createElement('div');
|
|
236
|
+
row.style.cssText = 'display:flex;border-bottom:1px solid var(--jade-borda);';
|
|
237
|
+
config.colunas.forEach(col => {
|
|
238
|
+
const cell = document.createElement('div');
|
|
239
|
+
cell.style.cssText = 'flex:1;padding:10px 14px;font-size:14px;';
|
|
240
|
+
const signal = this.store.get(`${config.entidade}.${index}.${col.campo}`, item[col.campo]);
|
|
241
|
+
bind(signal, cell, 'textContent');
|
|
242
|
+
row.appendChild(cell);
|
|
243
|
+
});
|
|
244
|
+
return row;
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
atualizarTabela();
|
|
250
|
+
}
|
|
251
|
+
setEffectOwner(null);
|
|
252
|
+
}
|
|
253
|
+
// ── Formulário ────────────────────────────────────────────────────────────
|
|
254
|
+
criarFormulario(config, container) {
|
|
255
|
+
setEffectOwner(this.telaAtiva);
|
|
256
|
+
const form = document.createElement('form');
|
|
257
|
+
form.className = 'jade-formulario';
|
|
258
|
+
form.onsubmit = e => e.preventDefault();
|
|
259
|
+
const signals = {};
|
|
260
|
+
config.campos.forEach(campo => {
|
|
261
|
+
const wrapper = document.createElement('div');
|
|
262
|
+
wrapper.className = 'jade-campo';
|
|
263
|
+
const label = document.createElement('label');
|
|
264
|
+
label.textContent = campo.titulo + (campo.obrigatorio ? ' *' : '');
|
|
265
|
+
wrapper.appendChild(label);
|
|
266
|
+
let input;
|
|
267
|
+
if (campo.tipo === 'select' && campo.opcoes) {
|
|
268
|
+
input = document.createElement('select');
|
|
269
|
+
campo.opcoes.forEach(op => {
|
|
270
|
+
const option = document.createElement('option');
|
|
271
|
+
option.value = op.valor;
|
|
272
|
+
option.textContent = op.label;
|
|
273
|
+
input.appendChild(option);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
const inp = document.createElement('input');
|
|
278
|
+
inp.type = campo.tipo === 'numero' || campo.tipo === 'decimal' ? 'number'
|
|
279
|
+
: campo.tipo === 'booleano' ? 'checkbox'
|
|
280
|
+
: campo.tipo === 'data' ? 'date'
|
|
281
|
+
: campo.tipo === 'hora' ? 'time'
|
|
282
|
+
: 'text';
|
|
283
|
+
if (campo.placeholder)
|
|
284
|
+
inp.placeholder = campo.placeholder;
|
|
285
|
+
inp.required = campo.obrigatorio ?? false;
|
|
286
|
+
input = inp;
|
|
287
|
+
}
|
|
288
|
+
const signal = new Signal('');
|
|
289
|
+
signals[campo.nome] = signal;
|
|
290
|
+
bindInput(input, signal);
|
|
291
|
+
if (campo.ref)
|
|
292
|
+
this.refs.registrar(campo.ref, input);
|
|
293
|
+
wrapper.appendChild(input);
|
|
294
|
+
// Espaço para mensagem de erro de validação
|
|
295
|
+
const msgErro = document.createElement('span');
|
|
296
|
+
msgErro.className = 'jade-campo-msg-erro';
|
|
297
|
+
wrapper.appendChild(msgErro);
|
|
298
|
+
form.appendChild(wrapper);
|
|
299
|
+
});
|
|
300
|
+
container.appendChild(form);
|
|
301
|
+
setEffectOwner(null);
|
|
302
|
+
return signals;
|
|
303
|
+
}
|
|
304
|
+
// ── Botão ─────────────────────────────────────────────────────────────────
|
|
305
|
+
criarBotao(texto, handler, container, opcoes) {
|
|
306
|
+
setEffectOwner(this.telaAtiva);
|
|
307
|
+
const btn = document.createElement('button');
|
|
308
|
+
btn.className = `jade-botao jade-botao-${opcoes?.tipo ?? 'primario'}`;
|
|
309
|
+
if (opcoes?.icone) {
|
|
310
|
+
const icon = document.createElement('span');
|
|
311
|
+
icon.textContent = opcoes.icone;
|
|
312
|
+
btn.appendChild(icon);
|
|
313
|
+
}
|
|
314
|
+
const label = document.createTextNode(texto);
|
|
315
|
+
btn.appendChild(label);
|
|
316
|
+
btn.addEventListener('click', handler);
|
|
317
|
+
if (opcoes?.desabilitado) {
|
|
318
|
+
bind(opcoes.desabilitado, btn, 'disabled');
|
|
319
|
+
}
|
|
320
|
+
container.appendChild(btn);
|
|
321
|
+
setEffectOwner(null);
|
|
322
|
+
return btn;
|
|
323
|
+
}
|
|
324
|
+
// ── Card de métrica ────────────────────────────────────────────────────────
|
|
325
|
+
criarCard(titulo, valorSignal, container) {
|
|
326
|
+
setEffectOwner(this.telaAtiva);
|
|
327
|
+
const card = document.createElement('div');
|
|
328
|
+
card.className = 'jade-card';
|
|
329
|
+
const t = document.createElement('div');
|
|
330
|
+
t.className = 'jade-card-titulo';
|
|
331
|
+
t.textContent = titulo;
|
|
332
|
+
const v = document.createElement('div');
|
|
333
|
+
v.className = 'jade-card-valor';
|
|
334
|
+
bind(valorSignal, v, 'textContent');
|
|
335
|
+
card.appendChild(t);
|
|
336
|
+
card.appendChild(v);
|
|
337
|
+
container.appendChild(card);
|
|
338
|
+
setEffectOwner(null);
|
|
339
|
+
}
|
|
340
|
+
// ── Atualização cirúrgica ─────────────────────────────────────────────────
|
|
341
|
+
/** Atualiza um único campo de uma entidade: só o nó DOM daquele campo é re-renderizado. */
|
|
342
|
+
atualizarCampo(entidade, index, campo, valor) {
|
|
343
|
+
this.store.set(`${entidade}.${index}.${campo}`, valor);
|
|
344
|
+
}
|
|
345
|
+
// ── Skeleton / Loading ────────────────────────────────────────────────────
|
|
346
|
+
/**
|
|
347
|
+
* Exibe um skeleton animado enquanto os dados carregam.
|
|
348
|
+
* Retorna o elemento para que `ocultarCarregando` possa removê-lo.
|
|
349
|
+
*/
|
|
350
|
+
mostrarCarregando(container, linhas = 5) {
|
|
351
|
+
const skeleton = document.createElement('div');
|
|
352
|
+
skeleton.className = 'jade-carregando';
|
|
353
|
+
skeleton.setAttribute('aria-label', 'Carregando...');
|
|
354
|
+
const titulo = document.createElement('div');
|
|
355
|
+
titulo.className = 'jade-skeleton jade-skeleton-titulo';
|
|
356
|
+
skeleton.appendChild(titulo);
|
|
357
|
+
for (let i = 0; i < linhas; i++) {
|
|
358
|
+
const linha = document.createElement('div');
|
|
359
|
+
linha.className = `jade-skeleton jade-skeleton-${i === 0 ? 'tabela' : ''}linha`;
|
|
360
|
+
skeleton.appendChild(linha);
|
|
361
|
+
}
|
|
362
|
+
container.appendChild(skeleton);
|
|
363
|
+
return skeleton;
|
|
364
|
+
}
|
|
365
|
+
ocultarCarregando(skeleton) {
|
|
366
|
+
skeleton.remove();
|
|
367
|
+
}
|
|
368
|
+
// ── Toast / Notificações ──────────────────────────────────────────────────
|
|
369
|
+
/**
|
|
370
|
+
* Exibe uma notificação temporária no canto da tela.
|
|
371
|
+
* Desaparece automaticamente após `duracao` ms (padrão 3s).
|
|
372
|
+
*/
|
|
373
|
+
mostrarNotificacao(mensagem, tipo = 'info', duracao = 3000) {
|
|
374
|
+
if (!this.toastContainer) {
|
|
375
|
+
this.toastContainer = document.createElement('div');
|
|
376
|
+
this.toastContainer.id = 'jade-toasts';
|
|
377
|
+
document.body.appendChild(this.toastContainer);
|
|
378
|
+
}
|
|
379
|
+
const icones = {
|
|
380
|
+
sucesso: '✓',
|
|
381
|
+
erro: '✕',
|
|
382
|
+
aviso: '⚠',
|
|
383
|
+
info: 'ℹ',
|
|
384
|
+
};
|
|
385
|
+
const toast = document.createElement('div');
|
|
386
|
+
toast.className = `jade-toast jade-toast-${tipo}`;
|
|
387
|
+
toast.setAttribute('role', 'alert');
|
|
388
|
+
const icon = document.createElement('span');
|
|
389
|
+
icon.textContent = icones[tipo];
|
|
390
|
+
toast.appendChild(icon);
|
|
391
|
+
const msg = document.createTextNode(mensagem);
|
|
392
|
+
toast.appendChild(msg);
|
|
393
|
+
this.toastContainer.appendChild(toast);
|
|
394
|
+
const remover = () => {
|
|
395
|
+
toast.classList.add('jade-toast-saindo');
|
|
396
|
+
toast.addEventListener('animationend', () => toast.remove(), { once: true });
|
|
397
|
+
};
|
|
398
|
+
setTimeout(remover, duracao);
|
|
399
|
+
}
|
|
400
|
+
// ── Acessores ─────────────────────────────────────────────────────────────
|
|
401
|
+
focar(nomeRef) { this.refs.focar(nomeRef); }
|
|
402
|
+
getStore() { return this.store; }
|
|
403
|
+
getRefs() { return this.refs; }
|
|
404
|
+
getRouter() { return this.router; }
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=ui_engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui_engine.js","sourceRoot":"","sources":["../../ui/ui_engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VirtualList — renderiza apenas as linhas visíveis de listas longas.
|
|
3
|
+
* Essencial para tabelas com centenas/milhares de registros: sem isso
|
|
4
|
+
* o browser tentaria criar um elemento DOM por linha e travaria.
|
|
5
|
+
*/
|
|
6
|
+
export interface VirtualListConfig<T> {
|
|
7
|
+
container: HTMLElement;
|
|
8
|
+
items: T[];
|
|
9
|
+
rowHeight: number;
|
|
10
|
+
renderRow: (item: T, index: number) => HTMLElement;
|
|
11
|
+
overscan?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class VirtualList<T> {
|
|
14
|
+
private config;
|
|
15
|
+
private scroller;
|
|
16
|
+
private viewport;
|
|
17
|
+
private renderedRows;
|
|
18
|
+
private lastStart;
|
|
19
|
+
private lastEnd;
|
|
20
|
+
private resizeObserver;
|
|
21
|
+
constructor(config: VirtualListConfig<T>);
|
|
22
|
+
private setup;
|
|
23
|
+
private render;
|
|
24
|
+
/** Atualiza a lista com novos dados, re-renderizando do início. */
|
|
25
|
+
updateItems(newItems: T[]): void;
|
|
26
|
+
/** Libera o ResizeObserver quando o componente for destruído. */
|
|
27
|
+
destruir(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=virtual_list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual_list.d.ts","sourceRoot":"","sources":["../../ui/virtual_list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,SAAS,EAAE,WAAW,CAAC;IACvB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,cAAc,CAA+B;gBAEzC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAKxC,OAAO,CAAC,KAAK;IAiCb,OAAO,CAAC,MAAM;IAmCd,mEAAmE;IACnE,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,IAAI;IAUhC,iEAAiE;IACjE,QAAQ,IAAI,IAAI;CAKjB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VirtualList — renderiza apenas as linhas visíveis de listas longas.
|
|
3
|
+
* Essencial para tabelas com centenas/milhares de registros: sem isso
|
|
4
|
+
* o browser tentaria criar um elemento DOM por linha e travaria.
|
|
5
|
+
*/
|
|
6
|
+
export class VirtualList {
|
|
7
|
+
config;
|
|
8
|
+
scroller;
|
|
9
|
+
viewport;
|
|
10
|
+
renderedRows = new Map();
|
|
11
|
+
lastStart = -1;
|
|
12
|
+
lastEnd = -1;
|
|
13
|
+
resizeObserver = null;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.config = { overscan: 3, ...config };
|
|
16
|
+
this.setup();
|
|
17
|
+
}
|
|
18
|
+
setup() {
|
|
19
|
+
const { container, items, rowHeight } = this.config;
|
|
20
|
+
container.style.cssText += ';position:relative;overflow-y:auto;';
|
|
21
|
+
this.scroller = document.createElement('div');
|
|
22
|
+
this.scroller.style.height = `${items.length * rowHeight}px`;
|
|
23
|
+
this.scroller.style.position = 'relative';
|
|
24
|
+
this.viewport = document.createElement('div');
|
|
25
|
+
this.viewport.style.cssText = 'position:absolute;width:100%;top:0;';
|
|
26
|
+
this.scroller.appendChild(this.viewport);
|
|
27
|
+
container.appendChild(this.scroller);
|
|
28
|
+
container.addEventListener('scroll', () => this.render(container.scrollTop));
|
|
29
|
+
// Render inicial com fallback — pode ser recalculado pelo ResizeObserver
|
|
30
|
+
this.render(0);
|
|
31
|
+
// CORREÇÃO: usa ResizeObserver para detectar quando o container recebe
|
|
32
|
+
// dimensões reais (após ser anexado ao DOM e pintado pelo browser).
|
|
33
|
+
// Sem isso, clientHeight = 0 na primeira renderização.
|
|
34
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
35
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
36
|
+
this.lastStart = -1; // forçar re-render mesmo sem scroll
|
|
37
|
+
this.lastEnd = -1;
|
|
38
|
+
this.render(container.scrollTop);
|
|
39
|
+
});
|
|
40
|
+
this.resizeObserver.observe(container);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
render(scrollTop) {
|
|
44
|
+
const { items, rowHeight, overscan, renderRow } = this.config;
|
|
45
|
+
// CORREÇÃO: usa a altura real se disponível, senão um fallback razoável
|
|
46
|
+
const containerHeight = this.config.container.clientHeight || 400;
|
|
47
|
+
const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);
|
|
48
|
+
const endIndex = Math.min(items.length, Math.ceil((scrollTop + containerHeight) / rowHeight) + overscan);
|
|
49
|
+
// Evitar re-render se a janela não mudou
|
|
50
|
+
if (startIndex === this.lastStart && endIndex === this.lastEnd)
|
|
51
|
+
return;
|
|
52
|
+
this.lastStart = startIndex;
|
|
53
|
+
this.lastEnd = endIndex;
|
|
54
|
+
// Remover linhas fora da janela visível
|
|
55
|
+
for (const [idx, row] of this.renderedRows) {
|
|
56
|
+
if (idx < startIndex || idx >= endIndex) {
|
|
57
|
+
row.remove();
|
|
58
|
+
this.renderedRows.delete(idx);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Adicionar linhas que entraram na janela
|
|
62
|
+
for (let i = startIndex; i < endIndex; i++) {
|
|
63
|
+
if (this.renderedRows.has(i))
|
|
64
|
+
continue;
|
|
65
|
+
const row = renderRow(items[i], i);
|
|
66
|
+
row.style.cssText += `;position:absolute;top:${i * rowHeight}px;width:100%;height:${rowHeight}px;`;
|
|
67
|
+
this.viewport.appendChild(row);
|
|
68
|
+
this.renderedRows.set(i, row);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Atualiza a lista com novos dados, re-renderizando do início. */
|
|
72
|
+
updateItems(newItems) {
|
|
73
|
+
this.config.items = newItems;
|
|
74
|
+
this.scroller.style.height = `${newItems.length * this.config.rowHeight}px`;
|
|
75
|
+
this.renderedRows.forEach(r => r.remove());
|
|
76
|
+
this.renderedRows.clear();
|
|
77
|
+
this.lastStart = -1;
|
|
78
|
+
this.lastEnd = -1;
|
|
79
|
+
this.render(this.config.container.scrollTop);
|
|
80
|
+
}
|
|
81
|
+
/** Libera o ResizeObserver quando o componente for destruído. */
|
|
82
|
+
destruir() {
|
|
83
|
+
this.resizeObserver?.disconnect();
|
|
84
|
+
this.renderedRows.forEach(r => r.remove());
|
|
85
|
+
this.renderedRows.clear();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=virtual_list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual_list.js","sourceRoot":"","sources":["../../ui/virtual_list.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yakuzaa/jade-runtime",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Runtime da linguagem JADE — event loop, gerenciamento de memória, UI engine e APIs empresariais",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./core/*": {
|
|
18
|
+
"import": "./dist/core/*.js",
|
|
19
|
+
"types": "./dist/core/*.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./apis/*": {
|
|
22
|
+
"import": "./dist/apis/*.js",
|
|
23
|
+
"types": "./dist/apis/*.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./stdlib/*": {
|
|
26
|
+
"import": "./dist/stdlib/*.js",
|
|
27
|
+
"types": "./dist/stdlib/*.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./ui/*": {
|
|
30
|
+
"import": "./dist/ui/*.js",
|
|
31
|
+
"types": "./dist/ui/*.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./pwa/*": {
|
|
34
|
+
"import": "./dist/pwa/*.js",
|
|
35
|
+
"types": "./dist/pwa/*.d.ts"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"dev": "tsc --watch",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:watch": "vitest"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^20.0.0",
|
|
47
|
+
"typescript": "^5.0.0",
|
|
48
|
+
"vitest": "^4.1.0"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"jade",
|
|
52
|
+
"runtime",
|
|
53
|
+
"webassembly",
|
|
54
|
+
"event-loop",
|
|
55
|
+
"ui-engine",
|
|
56
|
+
"enterprise",
|
|
57
|
+
"portuguese"
|
|
58
|
+
],
|
|
59
|
+
"author": "yakuzaa",
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"repository": {
|
|
62
|
+
"type": "git",
|
|
63
|
+
"url": "https://github.com/yakuzaa/jade.git",
|
|
64
|
+
"directory": "jade-runtime"
|
|
65
|
+
},
|
|
66
|
+
"homepage": "https://github.com/yakuzaa/jade",
|
|
67
|
+
"bugs": {
|
|
68
|
+
"url": "https://github.com/yakuzaa/jade/issues"
|
|
69
|
+
},
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=20.0.0"
|
|
72
|
+
},
|
|
73
|
+
"publishConfig": {
|
|
74
|
+
"access": "public"
|
|
75
|
+
}
|
|
76
|
+
}
|