@seniorsistemas/angular-components 19.6.2 → 19.7.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/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.d.ts +1 -1
- package/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.d.ts +1 -1
- package/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.d.ts +1 -1
- package/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.d.ts +1 -2
- package/esm2022/alert/lib/alert/alert.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +16 -17
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +20 -23
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +9 -10
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +9 -15
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +4 -4
- package/esm2022/inline-edit/lib/inline-edit/fields/inline-edit-number-field.mjs +1 -1
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +4 -5
- package/esm2022/input-mask/lib/input-mask/input-mask.directive.mjs +460 -0
- package/esm2022/input-mask/lib/input-mask/input-mask.module.mjs +16 -0
- package/esm2022/input-mask/public-api.mjs +3 -0
- package/esm2022/input-mask/seniorsistemas-angular-components-input-mask.mjs +5 -0
- package/fesm2022/seniorsistemas-angular-components-alert.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +53 -62
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +6 -7
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-input-mask.mjs +480 -0
- package/fesm2022/seniorsistemas-angular-components-input-mask.mjs.map +1 -0
- package/inline-edit/lib/inline-edit/fields/inline-edit-number-field.d.ts +2 -2
- package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +2 -2
- package/input-mask/README.md +183 -0
- package/input-mask/index.d.ts +5 -0
- package/input-mask/lib/input-mask/input-mask.directive.d.ts +103 -0
- package/input-mask/lib/input-mask/input-mask.module.d.ts +7 -0
- package/input-mask/public-api.d.ts +2 -0
- package/package.json +43 -37
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, inject, ElementRef, Renderer2, forwardRef, Directive, NgModule } from '@angular/core';
|
|
3
|
+
import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @description Diretiva de máscara de entrada para campos de texto.
|
|
7
|
+
*
|
|
8
|
+
* Aplique `[sInputMask]` em qualquer `<input>` para aplicar uma máscara de formatação,
|
|
9
|
+
* guiando a entrada do usuário com um padrão definido. Implementa ControlValueAccessor
|
|
10
|
+
* e Validator para integração nativa com Angular Forms.
|
|
11
|
+
*
|
|
12
|
+
* **Slots de máscara:**
|
|
13
|
+
* - `9` — dígito (0-9)
|
|
14
|
+
* - `a` — letra (conforme `characterPattern`, padrão `[A-Za-z]`)
|
|
15
|
+
* - `*` — alfanumérico (letra ou dígito)
|
|
16
|
+
* - Outros caracteres são tratados como literais (ex: `.`, `-`, `/`, `(`, `)`)
|
|
17
|
+
* - `?` — tudo após esse ponto na máscara é opcional
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```html
|
|
21
|
+
* <!-- CPF -->
|
|
22
|
+
* <input type="text" [sInputMask]="'999.999.999-99'" [(ngModel)]="cpf" />
|
|
23
|
+
*
|
|
24
|
+
* <!-- Telefone com unmask -->
|
|
25
|
+
* <input type="text" [sInputMask]="'(99) 99999-9999'" [unmask]="true" [(ngModel)]="telefone" />
|
|
26
|
+
* ```
|
|
27
|
+
* @category Input
|
|
28
|
+
*/
|
|
29
|
+
class InputMaskDirective {
|
|
30
|
+
/**
|
|
31
|
+
* Padrão da máscara. Slots: `9` (dígito), `a` (letra), `*` (alfanumérico).
|
|
32
|
+
* Demais caracteres são literais. `?` torna o restante da máscara opcional.
|
|
33
|
+
*/
|
|
34
|
+
mask = input(undefined, { alias: 'sInputMask' });
|
|
35
|
+
/**
|
|
36
|
+
* Caractere exibido nas posições ainda não preenchidas.
|
|
37
|
+
* @default '_'
|
|
38
|
+
*/
|
|
39
|
+
slotChar = input('_');
|
|
40
|
+
/**
|
|
41
|
+
* Quando `true`, o modelo recebe apenas os caracteres digitados pelo usuário,
|
|
42
|
+
* sem os literais da máscara. Quando `false`, o modelo recebe o valor completo
|
|
43
|
+
* incluindo literais.
|
|
44
|
+
* @default false
|
|
45
|
+
*/
|
|
46
|
+
unmask = input(false);
|
|
47
|
+
/**
|
|
48
|
+
* Expressão regular usada para validar o slot `a` (letra).
|
|
49
|
+
* @default '[A-Za-z]'
|
|
50
|
+
*/
|
|
51
|
+
characterPattern = input('[A-Za-z]');
|
|
52
|
+
/**
|
|
53
|
+
* Quando `true`, limpa o campo ao perder o foco se a máscara estiver incompleta.
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
autoClear = input(true);
|
|
57
|
+
/**
|
|
58
|
+
* Emitido quando todos os slots obrigatórios da máscara estão preenchidos.
|
|
59
|
+
* Emite o valor atual (mascarado ou não, conforme `unmask`).
|
|
60
|
+
*/
|
|
61
|
+
maskComplete = output();
|
|
62
|
+
el = inject((ElementRef));
|
|
63
|
+
renderer = inject(Renderer2);
|
|
64
|
+
tokens = [];
|
|
65
|
+
buffer = [];
|
|
66
|
+
wasComplete = false;
|
|
67
|
+
lastValue = null;
|
|
68
|
+
onChange = () => { };
|
|
69
|
+
onTouched = () => { };
|
|
70
|
+
ngOnInit() {
|
|
71
|
+
this.buildMask();
|
|
72
|
+
}
|
|
73
|
+
ngOnChanges(changes) {
|
|
74
|
+
if (changes['mask'] || changes['slotChar'] || changes['characterPattern']) {
|
|
75
|
+
this.buildMask();
|
|
76
|
+
if (this.mask()) {
|
|
77
|
+
this.writeValue(this.lastValue);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
buildMask() {
|
|
82
|
+
const maskStr = this.mask();
|
|
83
|
+
if (!maskStr) {
|
|
84
|
+
this.tokens = [];
|
|
85
|
+
this.buffer = [];
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.tokens = this.parseMask(maskStr);
|
|
89
|
+
this.resetBuffer();
|
|
90
|
+
}
|
|
91
|
+
parseMask(mask) {
|
|
92
|
+
const tokens = [];
|
|
93
|
+
let optional = false;
|
|
94
|
+
for (let i = 0; i < mask.length; i++) {
|
|
95
|
+
const ch = mask[i];
|
|
96
|
+
if (ch === '?') {
|
|
97
|
+
optional = true;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
switch (ch) {
|
|
101
|
+
case '9':
|
|
102
|
+
tokens.push({ type: 'digit', optional });
|
|
103
|
+
break;
|
|
104
|
+
case 'a':
|
|
105
|
+
tokens.push({ type: 'alpha', optional });
|
|
106
|
+
break;
|
|
107
|
+
case '*':
|
|
108
|
+
tokens.push({ type: 'alphanumeric', optional });
|
|
109
|
+
break;
|
|
110
|
+
default:
|
|
111
|
+
tokens.push({ type: 'literal', char: ch, optional: false });
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return tokens;
|
|
116
|
+
}
|
|
117
|
+
resetBuffer() {
|
|
118
|
+
this.buffer = this.tokens.map((t) => (t.type === 'literal' ? t.char : this.slotChar()));
|
|
119
|
+
}
|
|
120
|
+
isValidChar(char, token) {
|
|
121
|
+
switch (token.type) {
|
|
122
|
+
case 'digit':
|
|
123
|
+
return /[0-9]/.test(char);
|
|
124
|
+
case 'alpha':
|
|
125
|
+
return new RegExp(this.characterPattern()).test(char);
|
|
126
|
+
case 'alphanumeric':
|
|
127
|
+
return /[A-Za-z0-9]/.test(char);
|
|
128
|
+
default:
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
isEditable(token) {
|
|
133
|
+
return token.type !== 'literal';
|
|
134
|
+
}
|
|
135
|
+
nextEditablePos(from) {
|
|
136
|
+
for (let i = from; i < this.tokens.length; i++) {
|
|
137
|
+
if (this.isEditable(this.tokens[i])) {
|
|
138
|
+
return i;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return this.tokens.length;
|
|
142
|
+
}
|
|
143
|
+
prevEditablePos(from) {
|
|
144
|
+
for (let i = from; i >= 0; i--) {
|
|
145
|
+
if (this.tokens[i] && this.isEditable(this.tokens[i])) {
|
|
146
|
+
return i;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return -1;
|
|
150
|
+
}
|
|
151
|
+
setCursor(pos) {
|
|
152
|
+
const safePos = Math.min(pos, this.tokens.length);
|
|
153
|
+
this.el.nativeElement.setSelectionRange(safePos, safePos);
|
|
154
|
+
}
|
|
155
|
+
setInputValue(value) {
|
|
156
|
+
this.renderer.setProperty(this.el.nativeElement, 'value', value);
|
|
157
|
+
}
|
|
158
|
+
getDisplayValue() {
|
|
159
|
+
return this.buffer.join('');
|
|
160
|
+
}
|
|
161
|
+
getBlurDisplayValue() {
|
|
162
|
+
let lastFilledIndex = -1;
|
|
163
|
+
for (let i = 0; i < this.buffer.length; i++) {
|
|
164
|
+
if (this.tokens[i] && this.tokens[i].type !== 'literal' && this.buffer[i] !== this.slotChar()) {
|
|
165
|
+
lastFilledIndex = i;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (lastFilledIndex === -1)
|
|
169
|
+
return '';
|
|
170
|
+
return this.buffer.slice(0, lastFilledIndex + 1).join('');
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Returns the value that should be set on the model.
|
|
174
|
+
* Returns null when the user has not typed anything.
|
|
175
|
+
*/
|
|
176
|
+
getModelValue() {
|
|
177
|
+
const hasInput = this.buffer.some((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar());
|
|
178
|
+
if (!hasInput) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
if (this.unmask()) {
|
|
182
|
+
return (this.buffer
|
|
183
|
+
.filter((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar())
|
|
184
|
+
.join('') || null);
|
|
185
|
+
}
|
|
186
|
+
return this.buffer.join('');
|
|
187
|
+
}
|
|
188
|
+
clearRange(startPos, endPos) {
|
|
189
|
+
for (let i = startPos; i < endPos; i++) {
|
|
190
|
+
if (this.tokens[i] && this.tokens[i].type !== 'literal') {
|
|
191
|
+
this.buffer[i] = this.slotChar();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
this.setInputValue(this.getDisplayValue());
|
|
195
|
+
}
|
|
196
|
+
isMaskComplete() {
|
|
197
|
+
return this.tokens.every((token, i) => {
|
|
198
|
+
if (token.type === 'literal' || token.optional) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
return this.buffer[i] !== this.slotChar();
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
checkAndEmitComplete() {
|
|
205
|
+
const complete = this.isMaskComplete();
|
|
206
|
+
if (complete && !this.wasComplete) {
|
|
207
|
+
this.wasComplete = true;
|
|
208
|
+
this.maskComplete.emit(this.getModelValue() ?? '');
|
|
209
|
+
}
|
|
210
|
+
else if (!complete) {
|
|
211
|
+
this.wasComplete = false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
dispatchInputEvent() {
|
|
215
|
+
this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true }));
|
|
216
|
+
}
|
|
217
|
+
onKeyDown(event) {
|
|
218
|
+
if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const key = event.key;
|
|
222
|
+
// Let the browser handle shortcuts (Ctrl/Cmd), Tab, and function keys
|
|
223
|
+
if (event.ctrlKey || event.metaKey || key === 'Tab' || key.startsWith('F')) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
// Let the browser handle arrow navigation and Home/End natively
|
|
227
|
+
if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const input = this.el.nativeElement;
|
|
231
|
+
const startPos = input.selectionStart ?? 0;
|
|
232
|
+
const endPos = input.selectionEnd ?? 0;
|
|
233
|
+
if (key === 'Backspace') {
|
|
234
|
+
event.preventDefault();
|
|
235
|
+
if (startPos !== endPos) {
|
|
236
|
+
this.clearRange(startPos, endPos);
|
|
237
|
+
const nextPos = this.nextEditablePos(startPos);
|
|
238
|
+
this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
|
|
239
|
+
}
|
|
240
|
+
else if (startPos > 0) {
|
|
241
|
+
const pos = this.prevEditablePos(startPos - 1);
|
|
242
|
+
if (pos >= 0) {
|
|
243
|
+
this.buffer[pos] = this.slotChar();
|
|
244
|
+
this.setInputValue(this.getDisplayValue());
|
|
245
|
+
this.setCursor(pos);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
this.onChange(this.getModelValue());
|
|
249
|
+
this.checkAndEmitComplete();
|
|
250
|
+
this.dispatchInputEvent();
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (key === 'Delete') {
|
|
254
|
+
event.preventDefault();
|
|
255
|
+
if (startPos !== endPos) {
|
|
256
|
+
this.clearRange(startPos, endPos);
|
|
257
|
+
const nextPos = this.nextEditablePos(startPos);
|
|
258
|
+
this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
const pos = this.nextEditablePos(startPos);
|
|
262
|
+
if (pos < this.tokens.length) {
|
|
263
|
+
this.buffer[pos] = this.slotChar();
|
|
264
|
+
this.setInputValue(this.getDisplayValue());
|
|
265
|
+
this.setCursor(pos);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
this.onChange(this.getModelValue());
|
|
269
|
+
this.checkAndEmitComplete();
|
|
270
|
+
this.dispatchInputEvent();
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// Single printable character
|
|
274
|
+
if (key.length === 1) {
|
|
275
|
+
event.preventDefault();
|
|
276
|
+
let insertPos = startPos;
|
|
277
|
+
// Clear selection range if any
|
|
278
|
+
if (startPos !== endPos) {
|
|
279
|
+
this.clearRange(startPos, endPos);
|
|
280
|
+
insertPos = startPos;
|
|
281
|
+
}
|
|
282
|
+
const pos = this.nextEditablePos(insertPos);
|
|
283
|
+
if (pos >= this.tokens.length) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
const token = this.tokens[pos];
|
|
287
|
+
if (!this.isValidChar(key, token)) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
this.buffer[pos] = key;
|
|
291
|
+
this.setInputValue(this.getDisplayValue());
|
|
292
|
+
const next = this.nextEditablePos(pos + 1);
|
|
293
|
+
this.setCursor(next <= this.tokens.length ? next : this.tokens.length);
|
|
294
|
+
this.onChange(this.getModelValue());
|
|
295
|
+
this.checkAndEmitComplete();
|
|
296
|
+
this.dispatchInputEvent();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
onFocus(_event) {
|
|
300
|
+
if (!this.mask()) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
// Always restore full mask display on focus (slot chars become visible)
|
|
304
|
+
this.setInputValue(this.getDisplayValue());
|
|
305
|
+
// Move cursor to the first empty editable slot
|
|
306
|
+
const firstEmpty = this.buffer.findIndex((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch === this.slotChar());
|
|
307
|
+
this.setCursor(firstEmpty >= 0 ? firstEmpty : this.nextEditablePos(0));
|
|
308
|
+
}
|
|
309
|
+
onBlur(_event) {
|
|
310
|
+
if (!this.mask()) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
this.onTouched();
|
|
314
|
+
if (!this.isMaskComplete()) {
|
|
315
|
+
if (this.autoClear()) {
|
|
316
|
+
this.resetBuffer();
|
|
317
|
+
this.onChange(null);
|
|
318
|
+
}
|
|
319
|
+
this.setInputValue(this.getBlurDisplayValue());
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
onPaste(event) {
|
|
323
|
+
if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
event.preventDefault();
|
|
327
|
+
const pastedText = event.clipboardData?.getData('text') ?? '';
|
|
328
|
+
const input = this.el.nativeElement;
|
|
329
|
+
const startPos = input.selectionStart ?? 0;
|
|
330
|
+
const endPos = input.selectionEnd ?? 0;
|
|
331
|
+
if (startPos !== endPos) {
|
|
332
|
+
this.clearRange(startPos, endPos);
|
|
333
|
+
}
|
|
334
|
+
let pos = this.nextEditablePos(startPos);
|
|
335
|
+
for (const ch of pastedText) {
|
|
336
|
+
if (pos >= this.tokens.length) {
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
const token = this.tokens[pos];
|
|
340
|
+
if (token.type === 'literal') {
|
|
341
|
+
// Skip matching literal in pasted text; skip the literal slot regardless
|
|
342
|
+
if (ch === token.char) {
|
|
343
|
+
pos++;
|
|
344
|
+
}
|
|
345
|
+
pos = this.nextEditablePos(pos);
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (this.isValidChar(ch, token)) {
|
|
349
|
+
this.buffer[pos] = ch;
|
|
350
|
+
pos = this.nextEditablePos(pos + 1);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
this.setInputValue(this.getDisplayValue());
|
|
354
|
+
this.setCursor(pos <= this.tokens.length ? pos : this.tokens.length);
|
|
355
|
+
this.onChange(this.getModelValue());
|
|
356
|
+
this.checkAndEmitComplete();
|
|
357
|
+
this.dispatchInputEvent();
|
|
358
|
+
}
|
|
359
|
+
onClick() {
|
|
360
|
+
if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const input = this.el.nativeElement;
|
|
364
|
+
const pos = input.selectionStart ?? 0;
|
|
365
|
+
// If cursor landed on a literal, nudge it to the nearest editable slot
|
|
366
|
+
if (this.tokens[pos] && this.tokens[pos].type === 'literal') {
|
|
367
|
+
this.setCursor(this.nextEditablePos(pos));
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
writeValue(value) {
|
|
371
|
+
this.lastValue = value;
|
|
372
|
+
if (!this.mask()) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
this.resetBuffer();
|
|
376
|
+
if (!value) {
|
|
377
|
+
this.setInputValue('');
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
let bufferIdx = 0;
|
|
381
|
+
let valueIdx = 0;
|
|
382
|
+
while (valueIdx < value.length && bufferIdx < this.tokens.length) {
|
|
383
|
+
const token = this.tokens[bufferIdx];
|
|
384
|
+
const char = value[valueIdx];
|
|
385
|
+
if (token.type === 'literal') {
|
|
386
|
+
// Consume the literal character from value if it matches; always advance buffer
|
|
387
|
+
if (char === token.char)
|
|
388
|
+
valueIdx++;
|
|
389
|
+
bufferIdx++;
|
|
390
|
+
}
|
|
391
|
+
else if (this.isValidChar(char, token)) {
|
|
392
|
+
this.buffer[bufferIdx] = char;
|
|
393
|
+
bufferIdx++;
|
|
394
|
+
valueIdx++;
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
// Skip characters from value that do not match the current slot
|
|
398
|
+
valueIdx++;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
this.setInputValue(this.getDisplayValue());
|
|
402
|
+
}
|
|
403
|
+
registerOnChange(onChange) {
|
|
404
|
+
this.onChange = onChange;
|
|
405
|
+
}
|
|
406
|
+
registerOnTouched(onTouched) {
|
|
407
|
+
this.onTouched = onTouched;
|
|
408
|
+
}
|
|
409
|
+
setDisabledState(isDisabled) {
|
|
410
|
+
this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);
|
|
411
|
+
}
|
|
412
|
+
validate(control) {
|
|
413
|
+
if (!this.mask() || !control.value) {
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
416
|
+
if (!this.isMaskComplete()) {
|
|
417
|
+
return { incompleteMask: { mask: this.mask() } };
|
|
418
|
+
}
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
422
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: InputMaskDirective, isStandalone: true, selector: "input[sInputMask]", inputs: { mask: { classPropertyName: "mask", publicName: "sInputMask", isSignal: true, isRequired: false, transformFunction: null }, slotChar: { classPropertyName: "slotChar", publicName: "slotChar", isSignal: true, isRequired: false, transformFunction: null }, unmask: { classPropertyName: "unmask", publicName: "unmask", isSignal: true, isRequired: false, transformFunction: null }, characterPattern: { classPropertyName: "characterPattern", publicName: "characterPattern", isSignal: true, isRequired: false, transformFunction: null }, autoClear: { classPropertyName: "autoClear", publicName: "autoClear", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { maskComplete: "maskComplete" }, host: { listeners: { "keydown": "onKeyDown($event)", "focus": "onFocus($event)", "blur": "onBlur($event)", "paste": "onPaste($event)", "click": "onClick()" } }, providers: [
|
|
423
|
+
{
|
|
424
|
+
provide: NG_VALUE_ACCESSOR,
|
|
425
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
426
|
+
multi: true,
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
provide: NG_VALIDATORS,
|
|
430
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
431
|
+
multi: true,
|
|
432
|
+
},
|
|
433
|
+
], usesOnChanges: true, ngImport: i0 });
|
|
434
|
+
}
|
|
435
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskDirective, decorators: [{
|
|
436
|
+
type: Directive,
|
|
437
|
+
args: [{
|
|
438
|
+
selector: 'input[sInputMask]',
|
|
439
|
+
standalone: true,
|
|
440
|
+
host: {
|
|
441
|
+
'(keydown)': 'onKeyDown($event)',
|
|
442
|
+
'(focus)': 'onFocus($event)',
|
|
443
|
+
'(blur)': 'onBlur($event)',
|
|
444
|
+
'(paste)': 'onPaste($event)',
|
|
445
|
+
'(click)': 'onClick()',
|
|
446
|
+
},
|
|
447
|
+
providers: [
|
|
448
|
+
{
|
|
449
|
+
provide: NG_VALUE_ACCESSOR,
|
|
450
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
451
|
+
multi: true,
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
provide: NG_VALIDATORS,
|
|
455
|
+
useExisting: forwardRef(() => InputMaskDirective),
|
|
456
|
+
multi: true,
|
|
457
|
+
},
|
|
458
|
+
],
|
|
459
|
+
}]
|
|
460
|
+
}] });
|
|
461
|
+
|
|
462
|
+
class InputMaskModule {
|
|
463
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
464
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: InputMaskModule, imports: [InputMaskDirective], exports: [InputMaskDirective] });
|
|
465
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskModule });
|
|
466
|
+
}
|
|
467
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InputMaskModule, decorators: [{
|
|
468
|
+
type: NgModule,
|
|
469
|
+
args: [{
|
|
470
|
+
imports: [InputMaskDirective],
|
|
471
|
+
exports: [InputMaskDirective],
|
|
472
|
+
}]
|
|
473
|
+
}] });
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Generated bundle index. Do not edit.
|
|
477
|
+
*/
|
|
478
|
+
|
|
479
|
+
export { InputMaskDirective, InputMaskModule };
|
|
480
|
+
//# sourceMappingURL=seniorsistemas-angular-components-input-mask.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-input-mask.mjs","sources":["../../projects/angular-components/input-mask/src/lib/input-mask/input-mask.directive.ts","../../projects/angular-components/input-mask/src/lib/input-mask/input-mask.module.ts","../../projects/angular-components/input-mask/src/seniorsistemas-angular-components-input-mask.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n OnChanges,\n OnInit,\n output,\n Renderer2,\n SimpleChanges,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\ninterface MaskToken {\n type: 'literal' | 'digit' | 'alpha' | 'alphanumeric';\n char?: string;\n optional: boolean;\n}\n\n/**\n * @description Diretiva de máscara de entrada para campos de texto.\n *\n * Aplique `[sInputMask]` em qualquer `<input>` para aplicar uma máscara de formatação,\n * guiando a entrada do usuário com um padrão definido. Implementa ControlValueAccessor\n * e Validator para integração nativa com Angular Forms.\n *\n * **Slots de máscara:**\n * - `9` — dígito (0-9)\n * - `a` — letra (conforme `characterPattern`, padrão `[A-Za-z]`)\n * - `*` — alfanumérico (letra ou dígito)\n * - Outros caracteres são tratados como literais (ex: `.`, `-`, `/`, `(`, `)`)\n * - `?` — tudo após esse ponto na máscara é opcional\n *\n * @example\n * ```html\n * <!-- CPF -->\n * <input type=\"text\" [sInputMask]=\"'999.999.999-99'\" [(ngModel)]=\"cpf\" />\n *\n * <!-- Telefone com unmask -->\n * <input type=\"text\" [sInputMask]=\"'(99) 99999-9999'\" [unmask]=\"true\" [(ngModel)]=\"telefone\" />\n * ```\n * @category Input\n */\n@Directive({\n selector: 'input[sInputMask]',\n standalone: true,\n host: {\n '(keydown)': 'onKeyDown($event)',\n '(focus)': 'onFocus($event)',\n '(blur)': 'onBlur($event)',\n '(paste)': 'onPaste($event)',\n '(click)': 'onClick()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputMaskDirective),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => InputMaskDirective),\n multi: true,\n },\n ],\n})\nexport class InputMaskDirective implements OnInit, OnChanges, ControlValueAccessor, Validator {\n /**\n * Padrão da máscara. Slots: `9` (dígito), `a` (letra), `*` (alfanumérico).\n * Demais caracteres são literais. `?` torna o restante da máscara opcional.\n */\n public mask = input<string | undefined>(undefined, { alias: 'sInputMask' });\n\n /**\n * Caractere exibido nas posições ainda não preenchidas.\n * @default '_'\n */\n public slotChar = input<string>('_');\n\n /**\n * Quando `true`, o modelo recebe apenas os caracteres digitados pelo usuário,\n * sem os literais da máscara. Quando `false`, o modelo recebe o valor completo\n * incluindo literais.\n * @default false\n */\n public unmask = input<boolean>(false);\n\n /**\n * Expressão regular usada para validar o slot `a` (letra).\n * @default '[A-Za-z]'\n */\n public characterPattern = input<string>('[A-Za-z]');\n\n /**\n * Quando `true`, limpa o campo ao perder o foco se a máscara estiver incompleta.\n * @default true\n */\n public autoClear = input<boolean>(true);\n\n /**\n * Emitido quando todos os slots obrigatórios da máscara estão preenchidos.\n * Emite o valor atual (mascarado ou não, conforme `unmask`).\n */\n public maskComplete = output<string>();\n\n private readonly el = inject(ElementRef<HTMLInputElement>);\n private readonly renderer = inject(Renderer2);\n\n private tokens: MaskToken[] = [];\n private buffer: string[] = [];\n private wasComplete = false;\n private lastValue: string | null = null;\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n public ngOnInit(): void {\n this.buildMask();\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['mask'] || changes['slotChar'] || changes['characterPattern']) {\n this.buildMask();\n if (this.mask()) {\n this.writeValue(this.lastValue);\n }\n }\n }\n\n private buildMask(): void {\n const maskStr = this.mask();\n if (!maskStr) {\n this.tokens = [];\n this.buffer = [];\n return;\n }\n this.tokens = this.parseMask(maskStr);\n this.resetBuffer();\n }\n\n private parseMask(mask: string): MaskToken[] {\n const tokens: MaskToken[] = [];\n let optional = false;\n\n for (let i = 0; i < mask.length; i++) {\n const ch = mask[i];\n\n if (ch === '?') {\n optional = true;\n continue;\n }\n\n switch (ch) {\n case '9':\n tokens.push({ type: 'digit', optional });\n break;\n case 'a':\n tokens.push({ type: 'alpha', optional });\n break;\n case '*':\n tokens.push({ type: 'alphanumeric', optional });\n break;\n default:\n tokens.push({ type: 'literal', char: ch, optional: false });\n break;\n }\n }\n\n return tokens;\n }\n\n private resetBuffer(): void {\n this.buffer = this.tokens.map((t) => (t.type === 'literal' ? t.char! : this.slotChar()));\n }\n\n private isValidChar(char: string, token: MaskToken): boolean {\n switch (token.type) {\n case 'digit':\n return /[0-9]/.test(char);\n case 'alpha':\n return new RegExp(this.characterPattern()).test(char);\n case 'alphanumeric':\n return /[A-Za-z0-9]/.test(char);\n default:\n return false;\n }\n }\n\n private isEditable(token: MaskToken): boolean {\n return token.type !== 'literal';\n }\n\n private nextEditablePos(from: number): number {\n for (let i = from; i < this.tokens.length; i++) {\n if (this.isEditable(this.tokens[i])) {\n return i;\n }\n }\n return this.tokens.length;\n }\n\n private prevEditablePos(from: number): number {\n for (let i = from; i >= 0; i--) {\n if (this.tokens[i] && this.isEditable(this.tokens[i])) {\n return i;\n }\n }\n return -1;\n }\n\n private setCursor(pos: number): void {\n const safePos = Math.min(pos, this.tokens.length);\n this.el.nativeElement.setSelectionRange(safePos, safePos);\n }\n\n private setInputValue(value: string): void {\n this.renderer.setProperty(this.el.nativeElement, 'value', value);\n }\n\n private getDisplayValue(): string {\n return this.buffer.join('');\n }\n\n private getBlurDisplayValue(): string {\n let lastFilledIndex = -1;\n for (let i = 0; i < this.buffer.length; i++) {\n if (this.tokens[i] && this.tokens[i].type !== 'literal' && this.buffer[i] !== this.slotChar()) {\n lastFilledIndex = i;\n }\n }\n if (lastFilledIndex === -1) return '';\n return this.buffer.slice(0, lastFilledIndex + 1).join('');\n }\n\n /**\n * Returns the value that should be set on the model.\n * Returns null when the user has not typed anything.\n */\n private getModelValue(): string | null {\n const hasInput = this.buffer.some(\n (ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar(),\n );\n\n if (!hasInput) {\n return null;\n }\n\n if (this.unmask()) {\n return (\n this.buffer\n .filter((ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch !== this.slotChar())\n .join('') || null\n );\n }\n\n return this.buffer.join('');\n }\n\n private clearRange(startPos: number, endPos: number): void {\n for (let i = startPos; i < endPos; i++) {\n if (this.tokens[i] && this.tokens[i].type !== 'literal') {\n this.buffer[i] = this.slotChar();\n }\n }\n this.setInputValue(this.getDisplayValue());\n }\n\n private isMaskComplete(): boolean {\n return this.tokens.every((token, i) => {\n if (token.type === 'literal' || token.optional) {\n return true;\n }\n\n return this.buffer[i] !== this.slotChar();\n });\n }\n\n private checkAndEmitComplete(): void {\n const complete = this.isMaskComplete();\n if (complete && !this.wasComplete) {\n this.wasComplete = true;\n this.maskComplete.emit(this.getModelValue() ?? '');\n } else if (!complete) {\n this.wasComplete = false;\n }\n }\n\n private dispatchInputEvent(): void {\n this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n public onKeyDown(event: KeyboardEvent): void {\n if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {\n return;\n }\n\n const key = event.key;\n\n // Let the browser handle shortcuts (Ctrl/Cmd), Tab, and function keys\n if (event.ctrlKey || event.metaKey || key === 'Tab' || key.startsWith('F')) {\n return;\n }\n\n // Let the browser handle arrow navigation and Home/End natively\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(key)) {\n return;\n }\n\n const input = this.el.nativeElement;\n const startPos = input.selectionStart ?? 0;\n const endPos = input.selectionEnd ?? 0;\n\n if (key === 'Backspace') {\n event.preventDefault();\n if (startPos !== endPos) {\n this.clearRange(startPos, endPos);\n const nextPos = this.nextEditablePos(startPos);\n this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);\n } else if (startPos > 0) {\n const pos = this.prevEditablePos(startPos - 1);\n if (pos >= 0) {\n this.buffer[pos] = this.slotChar();\n this.setInputValue(this.getDisplayValue());\n this.setCursor(pos);\n }\n }\n this.onChange(this.getModelValue());\n this.checkAndEmitComplete();\n this.dispatchInputEvent();\n return;\n }\n\n if (key === 'Delete') {\n event.preventDefault();\n if (startPos !== endPos) {\n this.clearRange(startPos, endPos);\n const nextPos = this.nextEditablePos(startPos);\n this.setCursor(nextPos < this.tokens.length ? nextPos : startPos);\n } else {\n const pos = this.nextEditablePos(startPos);\n if (pos < this.tokens.length) {\n this.buffer[pos] = this.slotChar();\n this.setInputValue(this.getDisplayValue());\n this.setCursor(pos);\n }\n }\n this.onChange(this.getModelValue());\n this.checkAndEmitComplete();\n this.dispatchInputEvent();\n return;\n }\n\n // Single printable character\n if (key.length === 1) {\n event.preventDefault();\n\n let insertPos = startPos;\n\n // Clear selection range if any\n if (startPos !== endPos) {\n this.clearRange(startPos, endPos);\n insertPos = startPos;\n }\n\n const pos = this.nextEditablePos(insertPos);\n if (pos >= this.tokens.length) {\n return;\n }\n\n const token = this.tokens[pos];\n\n if (!this.isValidChar(key, token)) {\n return;\n }\n\n this.buffer[pos] = key;\n this.setInputValue(this.getDisplayValue());\n\n const next = this.nextEditablePos(pos + 1);\n this.setCursor(next <= this.tokens.length ? next : this.tokens.length);\n\n this.onChange(this.getModelValue());\n this.checkAndEmitComplete();\n this.dispatchInputEvent();\n }\n }\n\n public onFocus(_event: FocusEvent): void {\n if (!this.mask()) {\n return;\n }\n\n // Always restore full mask display on focus (slot chars become visible)\n this.setInputValue(this.getDisplayValue());\n\n // Move cursor to the first empty editable slot\n const firstEmpty = this.buffer.findIndex(\n (ch, i) => this.tokens[i] && this.tokens[i].type !== 'literal' && ch === this.slotChar(),\n );\n\n this.setCursor(firstEmpty >= 0 ? firstEmpty : this.nextEditablePos(0));\n }\n\n public onBlur(_event: Event): void {\n if (!this.mask()) {\n return;\n }\n\n this.onTouched();\n\n if (!this.isMaskComplete()) {\n if (this.autoClear()) {\n this.resetBuffer();\n this.onChange(null);\n }\n this.setInputValue(this.getBlurDisplayValue());\n }\n }\n\n public onPaste(event: ClipboardEvent): void {\n if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {\n return;\n }\n\n event.preventDefault();\n\n const pastedText = event.clipboardData?.getData('text') ?? '';\n const input = this.el.nativeElement;\n const startPos = input.selectionStart ?? 0;\n const endPos = input.selectionEnd ?? 0;\n\n if (startPos !== endPos) {\n this.clearRange(startPos, endPos);\n }\n\n let pos = this.nextEditablePos(startPos);\n\n for (const ch of pastedText) {\n if (pos >= this.tokens.length) {\n break;\n }\n\n const token = this.tokens[pos];\n\n if (token.type === 'literal') {\n // Skip matching literal in pasted text; skip the literal slot regardless\n if (ch === token.char) {\n pos++;\n }\n pos = this.nextEditablePos(pos);\n continue;\n }\n\n if (this.isValidChar(ch, token)) {\n this.buffer[pos] = ch;\n pos = this.nextEditablePos(pos + 1);\n }\n }\n\n this.setInputValue(this.getDisplayValue());\n this.setCursor(pos <= this.tokens.length ? pos : this.tokens.length);\n this.onChange(this.getModelValue());\n this.checkAndEmitComplete();\n this.dispatchInputEvent();\n }\n\n public onClick(): void {\n if (!this.mask() || this.el.nativeElement.readOnly || this.el.nativeElement.disabled) {\n return;\n }\n\n const input = this.el.nativeElement;\n const pos = input.selectionStart ?? 0;\n\n // If cursor landed on a literal, nudge it to the nearest editable slot\n if (this.tokens[pos] && this.tokens[pos].type === 'literal') {\n this.setCursor(this.nextEditablePos(pos));\n }\n }\n\n public writeValue(value: string | null): void {\n this.lastValue = value;\n\n if (!this.mask()) {\n return;\n }\n\n this.resetBuffer();\n\n if (!value) {\n this.setInputValue('');\n return;\n }\n\n let bufferIdx = 0;\n let valueIdx = 0;\n\n while (valueIdx < value.length && bufferIdx < this.tokens.length) {\n const token = this.tokens[bufferIdx];\n const char = value[valueIdx];\n\n if (token.type === 'literal') {\n // Consume the literal character from value if it matches; always advance buffer\n if (char === token.char) valueIdx++;\n bufferIdx++;\n } else if (this.isValidChar(char, token)) {\n this.buffer[bufferIdx] = char;\n bufferIdx++;\n valueIdx++;\n } else {\n // Skip characters from value that do not match the current slot\n valueIdx++;\n }\n }\n\n this.setInputValue(this.getDisplayValue());\n }\n\n public registerOnChange(onChange: (value: string | null) => void): void {\n this.onChange = onChange;\n }\n\n public registerOnTouched(onTouched: () => void): void {\n this.onTouched = onTouched;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n if (!this.mask() || !control.value) {\n return null;\n }\n\n if (!this.isMaskComplete()) {\n return { incompleteMask: { mask: this.mask() } };\n }\n\n return null;\n }\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { InputMaskDirective } from './input-mask.directive';\n\n@NgModule({\n imports: [InputMaskDirective],\n exports: [InputMaskDirective],\n})\nexport class InputMaskModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ export interface InlineEditNumberFieldOptions extends InlineEditFieldOptions {
|
|
|
15
15
|
autoClear?: boolean;
|
|
16
16
|
onBlur?: (event: Event) => void;
|
|
17
17
|
onFocus?: (event: Event) => void;
|
|
18
|
-
onComplete?: (event:
|
|
18
|
+
onComplete?: (event: any) => void;
|
|
19
19
|
onInput?: (event: Event) => void;
|
|
20
20
|
}
|
|
21
21
|
export declare class InlineEditNumberField extends InlineEditField {
|
|
@@ -32,7 +32,7 @@ export declare class InlineEditNumberField extends InlineEditField {
|
|
|
32
32
|
autoClear?: boolean;
|
|
33
33
|
onBlur?: (event: Event) => void;
|
|
34
34
|
onFocus?: (event: Event) => void;
|
|
35
|
-
onComplete?: (event:
|
|
35
|
+
onComplete?: (event: any) => void;
|
|
36
36
|
onInput?: (event: Event) => void;
|
|
37
37
|
constructor(options: InlineEditNumberFieldOptions);
|
|
38
38
|
}
|
|
@@ -17,13 +17,13 @@ import * as i15 from "@seniorsistemas/angular-components/info-sign";
|
|
|
17
17
|
import * as i16 from "@seniorsistemas/angular-components/content-generator";
|
|
18
18
|
import * as i17 from "@seniorsistemas/angular-components/tooltip";
|
|
19
19
|
import * as i18 from "@seniorsistemas/angular-components/datepicker";
|
|
20
|
-
import * as i19 from "
|
|
20
|
+
import * as i19 from "@seniorsistemas/angular-components/input-mask";
|
|
21
21
|
import * as i20 from "primeng/inputtext";
|
|
22
22
|
import * as i21 from "primeng/textarea";
|
|
23
23
|
import * as i22 from "primeng/keyfilter";
|
|
24
24
|
import * as i23 from "@seniorsistemas/angular-components/dynamic-form";
|
|
25
25
|
export declare class InlineEditModule {
|
|
26
26
|
static ɵfac: i0.ɵɵFactoryDeclaration<InlineEditModule, never>;
|
|
27
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<InlineEditModule, [typeof i1.InlineEditComponent, typeof i2.InlineEditItemComponent, typeof i3.InlineEditCalendarComponent, typeof i4.InlineEditLookupComponent, typeof i5.InlineEditNumberComponent, typeof i6.InlineEditTextComponent, typeof i7.InlineEditTextAreaComponent, typeof i8.InlineEditContentGeneratorComponent], [typeof i9.CommonModule, typeof i10.FormsModule, typeof i10.ReactiveFormsModule, typeof i11.TranslateModule, typeof i12.BignumberInputModule, typeof i13.ButtonModule, typeof i14.ControlErrorsModule, typeof i15.InfoSignModule, typeof i16.ContentGeneratorModule, typeof i17.TooltipModule, typeof i18.DatepickerComponent, typeof i19.
|
|
27
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<InlineEditModule, [typeof i1.InlineEditComponent, typeof i2.InlineEditItemComponent, typeof i3.InlineEditCalendarComponent, typeof i4.InlineEditLookupComponent, typeof i5.InlineEditNumberComponent, typeof i6.InlineEditTextComponent, typeof i7.InlineEditTextAreaComponent, typeof i8.InlineEditContentGeneratorComponent], [typeof i9.CommonModule, typeof i10.FormsModule, typeof i10.ReactiveFormsModule, typeof i11.TranslateModule, typeof i12.BignumberInputModule, typeof i13.ButtonModule, typeof i14.ControlErrorsModule, typeof i15.InfoSignModule, typeof i16.ContentGeneratorModule, typeof i17.TooltipModule, typeof i18.DatepickerComponent, typeof i19.InputMaskDirective, typeof i20.InputTextModule, typeof i21.TextareaModule, typeof i22.KeyFilterModule, typeof i23.DynamicFormModule], [typeof i1.InlineEditComponent]>;
|
|
28
28
|
static ɵinj: i0.ɵɵInjectorDeclaration<InlineEditModule>;
|
|
29
29
|
}
|