jsegd-bpm 0.1.7 → 0.1.9
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/README.md +136 -70
- package/dist/jsegd-bpm.d.ts +81 -2
- package/dist/jsegd-bpm.js +1 -1
- package/dist/jsegd-bpm.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# jsEGD BPM
|
|
2
2
|
|
|
3
|
-
Biblioteca TypeScript de runtime para desenvolvimento de formulários e workflows
|
|
4
|
-
Fornece componentes de anexo, gerenciamento de workers para datasets, controle do ciclo de vida do
|
|
3
|
+
Biblioteca TypeScript de runtime para desenvolvimento de formulários e workflows em um ambiente BPM genérico.
|
|
4
|
+
Fornece componentes de anexo, gerenciamento de workers para datasets, controle do ciclo de vida do fluxo e utilitários de formulário integrados ao DOM.
|
|
5
5
|
|
|
6
6
|
> **Dependências par obrigatórias:** [`jsegd`](https://jsegd.netlify.app) ≥ 1.1.0 e [`alpinejs`](https://alpinejs.dev) ≥ 3.0.0
|
|
7
7
|
|
|
@@ -25,7 +25,7 @@ npm install jsegd-bpm jsegd alpinejs
|
|
|
25
25
|
|
|
26
26
|
## `WorkerManager` — Consultas de Dataset em Web Workers
|
|
27
27
|
|
|
28
|
-
Gerencia um pool de Web Workers para executar consultas à API de
|
|
28
|
+
Gerencia um pool de Web Workers para executar consultas à API de datasets fora da thread principal. Suporta deduplicação de requisições, cache em IndexedDB e cancelamento HTTP real via `AbortController`.
|
|
29
29
|
|
|
30
30
|
```typescript
|
|
31
31
|
import { WorkerManager, ConstraintsType } from 'jsegd-bpm'
|
|
@@ -37,8 +37,8 @@ cache.initialize({ storeName: 'datasets', cacheExpirationMs: 60 * 60 * 1000 })
|
|
|
37
37
|
|
|
38
38
|
const manager = new WorkerManager({ poolSize: 4, cache })
|
|
39
39
|
|
|
40
|
-
const { promise, cancel } = manager.query('https://
|
|
41
|
-
datasetId: '
|
|
40
|
+
const { promise, cancel } = manager.query('https://exemplo.local', {
|
|
41
|
+
datasetId: 'dsRegistros',
|
|
42
42
|
field: ['nome', 'email', 'matricula'],
|
|
43
43
|
constraintsField: ['ativo'],
|
|
44
44
|
constraintsInitialValue: ['true'],
|
|
@@ -87,13 +87,13 @@ Botão com dropdown para upload de arquivos vinculados ao processo.
|
|
|
87
87
|
|
|
88
88
|
```html
|
|
89
89
|
<!-- Tipo de anexo fixo -->
|
|
90
|
-
<attachment-button description="
|
|
90
|
+
<attachment-button description="DOCUMENTO"></attachment-button>
|
|
91
91
|
|
|
92
92
|
<!-- Prompt ao usuário para informar a descrição no upload -->
|
|
93
93
|
<attachment-button></attachment-button>
|
|
94
94
|
|
|
95
95
|
<!-- Somente leitura: oculta botão de adicionar -->
|
|
96
|
-
<attachment-button description="
|
|
96
|
+
<attachment-button description="DOCUMENTO" noaddbutton></attachment-button>
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
| Atributo | Tipo | Descrição |
|
|
@@ -117,7 +117,7 @@ Tabela que lista os anexos do processo com suporte a drag-and-drop para reordena
|
|
|
117
117
|
|
|
118
118
|
## `BeforeSendValidate` — Validação com feedback visual
|
|
119
119
|
|
|
120
|
-
Integra validação de campos com o sistema de erros visuais do tema
|
|
120
|
+
Integra validação de campos com o sistema de erros visuais do tema do formulário (`data-group` / `data-helper`).
|
|
121
121
|
|
|
122
122
|
```typescript
|
|
123
123
|
import { BeforeSendValidate } from 'jsegd-bpm'
|
|
@@ -126,9 +126,9 @@ import type { FieldError } from 'jsegd-bpm'
|
|
|
126
126
|
function validarFormulario() {
|
|
127
127
|
const erros: FieldError[] = []
|
|
128
128
|
|
|
129
|
-
const
|
|
130
|
-
if (!
|
|
131
|
-
erros.push({ field:
|
|
129
|
+
const campoTexto = document.querySelector<HTMLInputElement>('[name="nome"]')
|
|
130
|
+
if (!campoTexto?.value) {
|
|
131
|
+
erros.push({ field: campoTexto, errorMessage: 'Informe o nome' })
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
if (erros.length > 0) {
|
|
@@ -138,13 +138,79 @@ function validarFormulario() {
|
|
|
138
138
|
}
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
-
`throwValidationError` lança sempre — use dentro de `beforeSendValidate` do
|
|
141
|
+
`throwValidationError` lança sempre — use dentro de `beforeSendValidate` do formulário ou em hooks de `WorkflowViewPatcher`.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## `Validator` — Validação local e de submit
|
|
146
|
+
|
|
147
|
+
O `Validator` tem dois usos complementares:
|
|
148
|
+
- `Validator.add(...)` cria um validador isolado para cada instância de `Alpine.data(...)`
|
|
149
|
+
- `Validator.getInstance().register(code, rules)` agrupa várias regras de submit sob o mesmo código numérico
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { Validator } from 'jsegd-bpm'
|
|
153
|
+
|
|
154
|
+
function departamentoComponent() {
|
|
155
|
+
const regras: Record<string, () => boolean> = {
|
|
156
|
+
taxa: () => this.possuiTaxa === '1' && !this.taxa,
|
|
157
|
+
campoExtra: () => this.possuiTaxa === '1' && this.campoExtra === 'invalido',
|
|
158
|
+
campoIndependente: () => !this.campoIndependente,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const validadores = Validator.add(regras)
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
possuiTaxa: '0',
|
|
165
|
+
taxa: '',
|
|
166
|
+
campoExtra: '',
|
|
167
|
+
campoIndependente: '',
|
|
168
|
+
|
|
169
|
+
init() {
|
|
170
|
+
this.$watch('possuiTaxa', () => {
|
|
171
|
+
validadores.validate('taxa')
|
|
172
|
+
validadores.validate('campoExtra')
|
|
173
|
+
})
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
get hasError() {
|
|
177
|
+
return validadores.hasError()
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
onInput(field: string) {
|
|
181
|
+
validadores.validate(field)
|
|
182
|
+
},
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
`hasError()` reavalia o conjunto atual de regras do componente e `validate(field)` permite atualizar apenas o campo alterado no `@input`.
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
import { Validator } from 'jsegd-bpm'
|
|
191
|
+
|
|
192
|
+
const cancelarSubmit = Validator.getInstance().register(100, {
|
|
193
|
+
taxa: () => this.possuiTaxa === '1' && !this.taxa,
|
|
194
|
+
campoExtra: () => this.possuiTaxa === '1' && this.campoExtra === 'invalido',
|
|
195
|
+
campoIndependente: () => !this.campoIndependente,
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
Validator.getInstance().execute(100)
|
|
200
|
+
} catch (error) {
|
|
201
|
+
// impede o envio do formulário
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
cancelarSubmit()
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
`register(code, rules)` aceita tanto uma função única quanto um mapa de regras, e `unregister(code, rules)` remove o mesmo conjunto informado.
|
|
142
208
|
|
|
143
209
|
---
|
|
144
210
|
|
|
145
211
|
## `WorkflowViewPatcher` — Hooks no widget de processo
|
|
146
212
|
|
|
147
|
-
Substitui métodos do widget nativo `ECM_WKFView` para interceptar o ciclo de envio do
|
|
213
|
+
Substitui métodos do widget nativo `ECM_WKFView` para interceptar o ciclo de envio do fluxo sem modificar o formulário.
|
|
148
214
|
|
|
149
215
|
```typescript
|
|
150
216
|
import { WorkflowViewPatcher } from 'jsegd-bpm'
|
|
@@ -159,8 +225,8 @@ WorkflowViewPatcher.patchAll()
|
|
|
159
225
|
WorkflowViewPatcher.addBeforeValidate(async () => {
|
|
160
226
|
// Executado antes da validação do widget.
|
|
161
227
|
// Lançar exceção cancela o envio e reabilita os botões.
|
|
162
|
-
const valor = document.querySelector<HTMLInputElement>('[name="
|
|
163
|
-
if (!valor) throw new Error('Campo
|
|
228
|
+
const valor = document.querySelector<HTMLInputElement>('[name="campo_principal"]')?.value
|
|
229
|
+
if (!valor) throw new Error('Campo principal obrigatório')
|
|
164
230
|
})
|
|
165
231
|
|
|
166
232
|
WorkflowViewPatcher.addAfterValidate(async () => {
|
|
@@ -178,7 +244,7 @@ WorkflowViewPatcher.addOnMoveError(() => {
|
|
|
178
244
|
|
|
179
245
|
WorkflowViewPatcher.addOnCompletionLinkAdd((message) => {
|
|
180
246
|
// Adiciona links à tela de conclusão após a movimentação
|
|
181
|
-
message.links.push({ description: 'Abrir
|
|
247
|
+
message.links.push({ description: 'Abrir próxima etapa', href: '/proxima-etapa' })
|
|
182
248
|
})
|
|
183
249
|
|
|
184
250
|
// Ao desmontar o formulário (SPAs): restaura os métodos originais
|
|
@@ -217,12 +283,12 @@ onde `{domínio}` é o identificador do **agregado de negócio** ao qual o campo
|
|
|
217
283
|
|
|
218
284
|
| Campo no DOM | Domínio | Atributo no modelo |
|
|
219
285
|
| ------------------- | ----------- | ------------------ |
|
|
220
|
-
| `
|
|
221
|
-
| `
|
|
222
|
-
| `vigencia_prazo`
|
|
223
|
-
| `
|
|
286
|
+
| `departamento_indice` | `departamento` | `indice` |
|
|
287
|
+
| `area_cep` | `area` | `cep` |
|
|
288
|
+
| `vigencia_prazo` | `vigencia` | `prazo` |
|
|
289
|
+
| `cadastro_cep` | `cadastro` | `cep` |
|
|
224
290
|
|
|
225
|
-
> **Importante:** o `{domínio}` é o prefixo persistido no banco
|
|
291
|
+
> **Importante:** o `{domínio}` é o prefixo persistido no banco — é parte integrante do nome da coluna e **não deve ser omitido** no HTML. O `load` e o `save` gerenciam a conversão entre o nome DOM e o atributo do modelo de forma transparente.
|
|
226
292
|
|
|
227
293
|
O `moduleId` do workflow (quem exibe o campo na tela) e o `stage` (em que fase do processo estamos) são **independentes** do domínio do campo — um mesmo módulo pode exibir campos de múltiplos domínios.
|
|
228
294
|
|
|
@@ -236,13 +302,13 @@ Lê e escreve diretamente nos elementos `input`, `select` e `textarea` do formul
|
|
|
236
302
|
```typescript
|
|
237
303
|
import { BpmFormRepository } from 'jsegd-bpm'
|
|
238
304
|
|
|
239
|
-
interface
|
|
305
|
+
interface Departamento {
|
|
240
306
|
indice: string
|
|
241
307
|
primeiroPagamento: string
|
|
242
308
|
reajuste: string
|
|
243
309
|
}
|
|
244
310
|
|
|
245
|
-
interface
|
|
311
|
+
interface Area {
|
|
246
312
|
cep: string
|
|
247
313
|
logradouro: string
|
|
248
314
|
municipio: string
|
|
@@ -255,22 +321,22 @@ interface ItemTabela {
|
|
|
255
321
|
|
|
256
322
|
const repo = new BpmFormRepository()
|
|
257
323
|
|
|
258
|
-
// Ler domínio '
|
|
259
|
-
// DOM:
|
|
260
|
-
const
|
|
261
|
-
console.log(
|
|
262
|
-
console.log(
|
|
324
|
+
// Ler domínio 'departamento' — lê campos com name="departamento_*" do DOM
|
|
325
|
+
// DOM: departamento_indice, departamento_primeiro_pagamento, departamento_reajuste
|
|
326
|
+
const departamento = repo.load<Departamento>('departamento')
|
|
327
|
+
console.log(departamento.indice) // valor de input[name="departamento_indice"]
|
|
328
|
+
console.log(departamento.primeiroPagamento) // valor de input[name="departamento_primeiro_pagamento"]
|
|
263
329
|
|
|
264
|
-
// Ler domínio '
|
|
265
|
-
const
|
|
266
|
-
console.log(
|
|
330
|
+
// Ler domínio 'area' — desambigua de 'cadastro_cep', 'departamento_cep', etc.
|
|
331
|
+
const area = repo.load<Area>('area')
|
|
332
|
+
console.log(area.cep) // valor de input[name="area_cep"]
|
|
267
333
|
|
|
268
334
|
// Ler tabela filha
|
|
269
335
|
const itens = repo.loadTable<ItemTabela>('tabItens')
|
|
270
336
|
|
|
271
337
|
// Persistir no DOM — save converte camelCase → prefixo+snake_case
|
|
272
|
-
repo.save<
|
|
273
|
-
// escreve: input[name="
|
|
338
|
+
repo.save<Departamento>('departamento', { indice: 'IGPM', primeiroPagamento: '2026-02-01' })
|
|
339
|
+
// escreve: input[name="departamento_indice"] e input[name="departamento_primeiro_pagamento"]
|
|
274
340
|
|
|
275
341
|
// Substituir linhas da tabela filha
|
|
276
342
|
repo.saveTable<ItemTabela>('tabItens', [
|
|
@@ -314,18 +380,18 @@ Processos existentes cujos campos não seguem a convenção `{domínio}_{atribut
|
|
|
314
380
|
```typescript
|
|
315
381
|
import { loadFields } from 'jsegd-bpm'
|
|
316
382
|
|
|
317
|
-
interface
|
|
383
|
+
interface Requisitante {
|
|
318
384
|
nome: string
|
|
319
385
|
email: string
|
|
320
386
|
}
|
|
321
387
|
|
|
322
|
-
// Campo legado: sufixo em vez de prefixo —
|
|
323
|
-
const dados = loadFields<
|
|
324
|
-
nome: '
|
|
325
|
-
email: '
|
|
388
|
+
// Campo legado: sufixo em vez de prefixo — nome_requisitante, email_requisitante
|
|
389
|
+
const dados = loadFields<Requisitante>({
|
|
390
|
+
nome: 'nome_requisitante',
|
|
391
|
+
email: 'email_requisitante',
|
|
326
392
|
})
|
|
327
|
-
// dados.nome === valor de input[name="
|
|
328
|
-
// dados.email === valor de input[name="
|
|
393
|
+
// dados.nome === valor de input[name="nome_requisitante"]
|
|
394
|
+
// dados.email === valor de input[name="email_requisitante"]
|
|
329
395
|
```
|
|
330
396
|
|
|
331
397
|
> **Regra:** `loadFields` **não faz parte de `IFormRepository`** — é um utilitário de compatibilidade para processos legados. Novos processos devem usar `repository.load(section)` exclusivamente.
|
|
@@ -346,59 +412,59 @@ import { defineWorkflowConfig } from 'jsegd-bpm'
|
|
|
346
412
|
export const workflowConfig = defineWorkflowConfig({
|
|
347
413
|
modules: [
|
|
348
414
|
{
|
|
349
|
-
moduleId: '
|
|
415
|
+
moduleId: 'areaInicial',
|
|
350
416
|
label: 'Dados Iniciais',
|
|
351
417
|
icon: 'file-text',
|
|
352
418
|
order: 1,
|
|
353
419
|
showInNavigation: true,
|
|
354
420
|
renderContent: true,
|
|
355
|
-
contentIncludePath: '
|
|
421
|
+
contentIncludePath: 'area-inicial.html',
|
|
356
422
|
},
|
|
357
423
|
{
|
|
358
|
-
moduleId: '
|
|
359
|
-
label: '
|
|
424
|
+
moduleId: 'areaA',
|
|
425
|
+
label: 'Área A',
|
|
360
426
|
icon: 'gavel',
|
|
361
427
|
order: 2,
|
|
362
428
|
showInNavigation: true,
|
|
363
429
|
renderContent: true,
|
|
364
|
-
contentIncludePath: '
|
|
430
|
+
contentIncludePath: 'area-a.html',
|
|
365
431
|
},
|
|
366
432
|
{
|
|
367
|
-
moduleId: '
|
|
368
|
-
label: '
|
|
433
|
+
moduleId: 'areaB',
|
|
434
|
+
label: 'Área B',
|
|
369
435
|
icon: 'dollar-sign',
|
|
370
436
|
order: 3,
|
|
371
437
|
showInNavigation: true,
|
|
372
438
|
renderContent: true,
|
|
373
|
-
contentIncludePath: '
|
|
439
|
+
contentIncludePath: 'area-b.html',
|
|
374
440
|
},
|
|
375
441
|
],
|
|
376
442
|
activities: [
|
|
377
443
|
{
|
|
378
444
|
sequence: 9,
|
|
379
|
-
description: '
|
|
445
|
+
description: 'Etapa inicial',
|
|
380
446
|
kind: 'human',
|
|
381
|
-
stage: '
|
|
382
|
-
modules: { visible: ['
|
|
447
|
+
stage: 'inicio',
|
|
448
|
+
modules: { visible: ['areaInicial'], editable: ['areaInicial'], active: 'areaInicial' },
|
|
383
449
|
},
|
|
384
450
|
{
|
|
385
451
|
sequence: 53,
|
|
386
|
-
description: '
|
|
452
|
+
description: 'Análise da área A',
|
|
387
453
|
kind: 'human',
|
|
388
|
-
stage: '
|
|
389
|
-
modules: { visible: ['
|
|
454
|
+
stage: 'analiseA',
|
|
455
|
+
modules: { visible: ['areaInicial', 'areaA'], editable: ['areaA'], active: 'areaA' },
|
|
390
456
|
},
|
|
391
457
|
{
|
|
392
458
|
sequence: 61,
|
|
393
|
-
description: 'Análise
|
|
459
|
+
description: 'Análise da área B',
|
|
394
460
|
kind: 'human',
|
|
395
|
-
stage: '
|
|
396
|
-
modules: { visible: ['
|
|
461
|
+
stage: 'analiseB',
|
|
462
|
+
modules: { visible: ['areaInicial', 'areaA', 'areaB'], editable: ['areaB'] },
|
|
397
463
|
},
|
|
398
464
|
{ sequence: 88, description: 'Roteamento interno', kind: 'routing' },
|
|
399
465
|
],
|
|
400
466
|
} as const)
|
|
401
|
-
// Tipo de ModuleId inferido: '
|
|
467
|
+
// Tipo de ModuleId inferido: 'areaInicial' | 'areaA' | 'areaB'
|
|
402
468
|
```
|
|
403
469
|
|
|
404
470
|
**`ActivityKind`** — controla o comportamento na barra de progresso:
|
|
@@ -425,10 +491,10 @@ const currentSequence: number = parent.ECM.workflowView.processDefinition.cardIn
|
|
|
425
491
|
const historyType: string | null = parent.ECM.workflowView.processDefinition.historyType ?? null
|
|
426
492
|
|
|
427
493
|
const completedStages = extractCompletedStages(rawHistory, workflowConfig.activities)
|
|
428
|
-
// Ex: ['
|
|
494
|
+
// Ex: ['inicio', 'analiseA']
|
|
429
495
|
|
|
430
496
|
const currentStage = extractCurrentStage(currentSequence, historyType, workflowConfig.activities)
|
|
431
|
-
// Ex: { stage: '
|
|
497
|
+
// Ex: { stage: 'analiseB', status: 'current' }
|
|
432
498
|
|
|
433
499
|
const processHistory: ProcessHistory = { completedStages, currentStage }
|
|
434
500
|
```
|
|
@@ -445,9 +511,9 @@ import { resolveWorkflowScreen } from 'jsegd-bpm'
|
|
|
445
511
|
const screen = resolveWorkflowScreen(workflowConfig, currentSequence, processHistory)
|
|
446
512
|
|
|
447
513
|
// Visibilidade e editabilidade
|
|
448
|
-
screen.isVisible('
|
|
449
|
-
screen.isEditable('
|
|
450
|
-
screen.isActive('
|
|
514
|
+
screen.isVisible('areaA') // true
|
|
515
|
+
screen.isEditable('areaB') // false
|
|
516
|
+
screen.isActive('areaA') // true
|
|
451
517
|
|
|
452
518
|
// Estado da atividade
|
|
453
519
|
screen.isAwaitingSystem() // true quando kind === 'system' ou status === 'waiting'
|
|
@@ -456,9 +522,9 @@ screen.isInSupport() // true para kind === 'support'
|
|
|
456
522
|
// Barra de progresso
|
|
457
523
|
const stages = screen.getProgressBarStages()
|
|
458
524
|
// [
|
|
459
|
-
// { stage: '
|
|
460
|
-
// { stage: '
|
|
461
|
-
// { stage: '
|
|
525
|
+
// { stage: 'inicio', status: 'done' },
|
|
526
|
+
// { stage: 'analiseA', status: 'done' },
|
|
527
|
+
// { stage: 'analiseB', status: 'current' },
|
|
462
528
|
// ]
|
|
463
529
|
|
|
464
530
|
// Módulos
|
|
@@ -518,7 +584,7 @@ customElements.define('attachments-table', AttachmentsTable)
|
|
|
518
584
|
|
|
519
585
|
// Alpine stores
|
|
520
586
|
const stores = registerStores(Alpine, {
|
|
521
|
-
|
|
587
|
+
departamento: { nome: '', area: '' },
|
|
522
588
|
ui: { carregando: false },
|
|
523
589
|
})
|
|
524
590
|
|
|
@@ -539,8 +605,8 @@ await WorkflowViewPatcher.init()
|
|
|
539
605
|
WorkflowViewPatcher.patchAll()
|
|
540
606
|
WorkflowViewPatcher.addBeforeValidate(async () => {
|
|
541
607
|
const repo = new BpmFormRepository()
|
|
542
|
-
const dados = repo.load<{ nome: string }>('
|
|
543
|
-
if (!dados.nome) throw new Error('Informe o nome
|
|
608
|
+
const dados = repo.load<{ nome: string }>('departamento')
|
|
609
|
+
if (!dados.nome) throw new Error('Informe o nome')
|
|
544
610
|
})
|
|
545
611
|
|
|
546
612
|
Alpine.start()
|
|
@@ -550,4 +616,4 @@ Alpine.start()
|
|
|
550
616
|
|
|
551
617
|
## Licença
|
|
552
618
|
|
|
553
|
-
Proprietária —
|
|
619
|
+
Proprietária — uso restrito a projetos autorizados.
|
package/dist/jsegd-bpm.d.ts
CHANGED
|
@@ -1076,5 +1076,84 @@ type StoreProxy<T extends StoreMap> = {
|
|
|
1076
1076
|
*/
|
|
1077
1077
|
declare function registerStores<T extends StoreMap>(alpine: Pick<Alpine, 'store'>, storeMap: T): StoreProxy<T>;
|
|
1078
1078
|
|
|
1079
|
-
|
|
1080
|
-
|
|
1079
|
+
type ValidationFn = (...args: unknown[]) => boolean;
|
|
1080
|
+
type ValidationRules = Record<string, ValidationFn>;
|
|
1081
|
+
type ValidatorHandle = {
|
|
1082
|
+
validate(field?: string): boolean;
|
|
1083
|
+
hasError(): boolean;
|
|
1084
|
+
};
|
|
1085
|
+
/**
|
|
1086
|
+
* Validador tipado com padrão singleton.
|
|
1087
|
+
* Permite registrar, remover e executar funções de validação associadas a códigos numéricos.
|
|
1088
|
+
* @hideconstructor
|
|
1089
|
+
*/
|
|
1090
|
+
declare class Validator {
|
|
1091
|
+
private static instance;
|
|
1092
|
+
private rules;
|
|
1093
|
+
private constructor();
|
|
1094
|
+
/**
|
|
1095
|
+
* Retorna a instância singleton de Validator.
|
|
1096
|
+
* @example
|
|
1097
|
+
* ```typescript
|
|
1098
|
+
* const validator = Validator.getInstance()
|
|
1099
|
+
* validator.register(100, () => someField !== '')
|
|
1100
|
+
* validator.execute(100)
|
|
1101
|
+
* ```
|
|
1102
|
+
*/
|
|
1103
|
+
static getInstance(): Validator;
|
|
1104
|
+
/**
|
|
1105
|
+
* Cria um validador isolado para um conjunto de regras nomeadas.
|
|
1106
|
+
* Cada chamada retorna um handle independente, útil para instâncias locais de Alpine.data().
|
|
1107
|
+
* @example
|
|
1108
|
+
* const validadores = Validator.add({
|
|
1109
|
+
* taxa: () => this.possuiTaxa === '1' && !this.taxa,
|
|
1110
|
+
* campoExtra: () => this.possuiTaxa === '1' && this.campoExtra === 'invalido',
|
|
1111
|
+
* })
|
|
1112
|
+
*/
|
|
1113
|
+
static add(rules: ValidationRules): ValidatorHandle;
|
|
1114
|
+
private addRule;
|
|
1115
|
+
private removeRule;
|
|
1116
|
+
private normalizeRules;
|
|
1117
|
+
private unregisterAll;
|
|
1118
|
+
/**
|
|
1119
|
+
* Registra uma validação associada a um código numérico.
|
|
1120
|
+
* Aceita uma única função ou um lote de regras nomeadas.
|
|
1121
|
+
* Retorna uma função para cancelar o registro do mesmo conjunto informado.
|
|
1122
|
+
* @example Validator.getInstance().register(100, () => value > 0)
|
|
1123
|
+
* @example Validator.getInstance().register(100, {
|
|
1124
|
+
* fieldA: () => valueA > 0,
|
|
1125
|
+
* fieldB: () => valueB !== '',
|
|
1126
|
+
* })
|
|
1127
|
+
*/
|
|
1128
|
+
register(code: number, rules: ValidationFn): () => void;
|
|
1129
|
+
register(code: number, rules: ValidationRules): () => void;
|
|
1130
|
+
/**
|
|
1131
|
+
* Remove uma validação associada a um código numérico.
|
|
1132
|
+
* Aceita uma única função ou o mesmo lote de regras nomeadas usado no registro.
|
|
1133
|
+
* @example Validator.getInstance().unregister(100, myFn)
|
|
1134
|
+
* @example Validator.getInstance().unregister(100, {
|
|
1135
|
+
* fieldA: () => valueA > 0,
|
|
1136
|
+
* fieldB: () => valueB !== '',
|
|
1137
|
+
* })
|
|
1138
|
+
*/
|
|
1139
|
+
unregister(code: number, rules: ValidationFn): void;
|
|
1140
|
+
unregister(code: number, rules: ValidationRules): void;
|
|
1141
|
+
/**
|
|
1142
|
+
* Executa todas as funções de validação registradas para o código informado.
|
|
1143
|
+
* Lança um erro se qualquer função retornar `false`.
|
|
1144
|
+
* Se não houver validações registradas para o código, retorna silenciosamente.
|
|
1145
|
+
* @example Validator.getInstance().execute(100)
|
|
1146
|
+
* @throws {Error} Se alguma validação falhar.
|
|
1147
|
+
*/
|
|
1148
|
+
execute(code: number): void;
|
|
1149
|
+
/**
|
|
1150
|
+
* Remove todas as funções de validação de um código específico, ou limpa todos os registros se nenhum código for informado.
|
|
1151
|
+
* @example
|
|
1152
|
+
* Validator.getInstance().clear(100) // remove validações do código 100
|
|
1153
|
+
* Validator.getInstance().clear() // remove todos os registros
|
|
1154
|
+
*/
|
|
1155
|
+
clear(code?: number): void;
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
export { Attach, AttachButton, AttachmentsTable, BeforeSendValidate, BpmFormRepository, ConstraintsType, MockFormRepository, ScreenContext, Validator, WorkerManager, WorkflowViewPatcher, defineWorkflowConfig, extractCompletedStages, extractCurrentStage, loadFields, registerStores, resolveWorkflowScreen, sendRequestEvent };
|
|
1159
|
+
export type { ActivityKind, ActivityModulePolicy, AttachButtonRegistration, AttachmentRecord, AttachmentSource, AttachmentsTableMode, AttachmentsTableOptions, BpmHistoryEntry, BpmHistoryMap, CacheOptions, CancelablePromise, DatasetError, DatasetResponse, DatasetRow, DragDropEntry, FieldError, IFormRepository, IWorkflowViewHooks, ProcessCompletionLink, ProcessCompletionMessage, ProcessHistory, ResolvedModule, SearchParams, StoreMap, StoreProxy, ValidationFn, WorkerAbort, WorkerManagerOptions, WorkerRequest, WorkerResponse, WorkflowActivityDefinition, WorkflowConfig, WorkflowModuleDefinition };
|