@seniorsistemas/components-ai 1.2.0 → 1.3.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/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +45 -8
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-datetime.component.mjs +100 -0
- package/esm2022/lib/components/dynamic-form/fields/dynamic-field-lookup.component.mjs +31 -9
- package/esm2022/lib/components/dynamic-form/models/dynamic-form.models.mjs +1 -1
- package/esm2022/lib/components/loading/loading.component.mjs +279 -0
- package/esm2022/lib/directives/table-loading/table-loading.directive.mjs +166 -0
- package/esm2022/lib/services/entity.service.mjs +52 -22
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/seniorsistemas-components-ai.mjs +652 -39
- package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -1
- package/lib/components/dynamic-form/fields/dynamic-field-datetime.component.d.ts +20 -0
- package/lib/components/dynamic-form/fields/dynamic-field-lookup.component.d.ts +4 -2
- package/lib/components/dynamic-form/models/dynamic-form.models.d.ts +1 -1
- package/lib/components/loading/loading.component.d.ts +17 -0
- package/lib/directives/table-loading/table-loading.directive.d.ts +34 -0
- package/lib/services/entity.service.d.ts +12 -3
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { NgModule, Injectable, Optional, Inject, Pipe, EventEmitter, Component, Input, Output, Directive, HostListener, ViewEncapsulation, APP_INITIALIZER, Injector, makeEnvironmentProviders, inject } from '@angular/core';
|
|
2
|
+
import { NgModule, Injectable, Optional, Inject, Pipe, EventEmitter, Component, Input, Output, ChangeDetectionStrategy, Directive, HostListener, ViewEncapsulation, APP_INITIALIZER, Injector, makeEnvironmentProviders, inject } from '@angular/core';
|
|
3
3
|
import * as i2 from '@angular/common';
|
|
4
4
|
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
5
5
|
import * as i1 from '@angular/common/http';
|
|
6
6
|
import { HttpParams } from '@angular/common/http';
|
|
7
7
|
import { throwError, BehaviorSubject, of, from, concatMap, catchError as catchError$1 } from 'rxjs';
|
|
8
|
-
import {
|
|
8
|
+
import { map, catchError, filter } from 'rxjs/operators';
|
|
9
9
|
import * as i1$1 from 'primeng/config';
|
|
10
10
|
import { providePrimeNG } from 'primeng/config';
|
|
11
11
|
import * as i3 from '@angular/forms';
|
|
@@ -161,40 +161,70 @@ class EntityService {
|
|
|
161
161
|
list(listParams = {}) {
|
|
162
162
|
const params = this.getListQueryParams(listParams);
|
|
163
163
|
return this.http.get(this.entityUrl, { params })
|
|
164
|
-
.pipe(catchError(this.handleError));
|
|
164
|
+
.pipe(map(response => this.sanitizeEntity(response)), catchError(this.handleError));
|
|
165
165
|
}
|
|
166
166
|
/**
|
|
167
167
|
* Get entity by ID
|
|
168
168
|
*/
|
|
169
169
|
get(id) {
|
|
170
170
|
return this.http.get(`${this.entityUrl}/${id}`)
|
|
171
|
-
.pipe(catchError(this.handleError));
|
|
171
|
+
.pipe(map(response => this.sanitizeEntity(response)), catchError(this.handleError));
|
|
172
172
|
}
|
|
173
173
|
/**
|
|
174
|
-
* Sanitiza
|
|
175
|
-
*
|
|
176
|
-
*
|
|
174
|
+
* Sanitiza a entidade/resposta removendo propriedades $ref que vêm do
|
|
175
|
+
* backend (Jackson @JsonIdentityInfo), substituindo-as pelo objeto real
|
|
176
|
+
* referenciado no payload original.
|
|
177
177
|
*/
|
|
178
178
|
sanitizeEntity(entity) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
179
|
+
const cloned = JSON.parse(JSON.stringify(entity));
|
|
180
|
+
this.resolveRefs(cloned, cloned);
|
|
181
|
+
return cloned;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Percorre recursivamente o objeto e resolve qualquer { $ref: "..." }
|
|
185
|
+
* buscando o valor real no root do payload usando o path JSON.
|
|
186
|
+
*/
|
|
187
|
+
resolveRefs(obj, root) {
|
|
188
|
+
if (!obj || typeof obj !== 'object')
|
|
189
|
+
return;
|
|
190
|
+
const keys = Array.isArray(obj) ? obj.map((_, i) => i) : Object.keys(obj);
|
|
191
|
+
for (const key of keys) {
|
|
192
|
+
const value = obj[key];
|
|
193
|
+
if (value && typeof value === 'object') {
|
|
194
|
+
if (value['$ref'] && typeof value['$ref'] === 'string') {
|
|
195
|
+
const resolved = this.resolveJsonPath(root, value['$ref']);
|
|
196
|
+
if (resolved !== undefined) {
|
|
197
|
+
obj[key] = JSON.parse(JSON.stringify(resolved));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
this.resolveRefs(value, root);
|
|
202
|
+
}
|
|
189
203
|
}
|
|
190
|
-
|
|
191
|
-
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Resolve um path JSON no formato $["key"][index]["key"] ou $.key.key[index]
|
|
208
|
+
*/
|
|
209
|
+
resolveJsonPath(root, path) {
|
|
210
|
+
try {
|
|
211
|
+
const tokens = [];
|
|
212
|
+
const regex = /\["([^"]+)"\]|\[(\d+)\]|\.(\w+)/g;
|
|
213
|
+
let match;
|
|
214
|
+
while ((match = regex.exec(path)) !== null) {
|
|
215
|
+
tokens.push(match[1] ?? match[2] ?? match[3]);
|
|
192
216
|
}
|
|
193
|
-
|
|
194
|
-
|
|
217
|
+
let current = root;
|
|
218
|
+
for (const token of tokens) {
|
|
219
|
+
if (current == null)
|
|
220
|
+
return undefined;
|
|
221
|
+
current = current[token] ?? current[Number(token)];
|
|
195
222
|
}
|
|
223
|
+
return current;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return undefined;
|
|
196
227
|
}
|
|
197
|
-
return sanitized;
|
|
198
228
|
}
|
|
199
229
|
/**
|
|
200
230
|
* Create new entity
|
|
@@ -223,7 +253,7 @@ class EntityService {
|
|
|
223
253
|
listCustomFilter(listParams, action) {
|
|
224
254
|
const bodyParams = this.getBodyParams(listParams);
|
|
225
255
|
return this.http.post(`${this.actionsUrl}/${action}`, bodyParams)
|
|
226
|
-
.pipe(catchError(this.handleError));
|
|
256
|
+
.pipe(map(response => this.sanitizeEntity(response)), catchError(this.handleError));
|
|
227
257
|
}
|
|
228
258
|
/**
|
|
229
259
|
* Execute custom query
|
|
@@ -2496,6 +2526,281 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
2496
2526
|
type: Input
|
|
2497
2527
|
}] } });
|
|
2498
2528
|
|
|
2529
|
+
const COLOR_MAP = {
|
|
2530
|
+
primary: { base: 'var(--p-primary-500, #3b82f6)', light: 'var(--p-primary-300, #93c5fd)' },
|
|
2531
|
+
secondary: { base: 'var(--p-surface-500, #64748b)', light: 'var(--p-surface-300, #cbd5e1)' },
|
|
2532
|
+
success: { base: 'var(--p-green-500, #22c55e)', light: 'var(--p-green-300, #86efac)' },
|
|
2533
|
+
warn: { base: 'var(--p-yellow-500, #eab308)', light: 'var(--p-yellow-300, #fde047)' },
|
|
2534
|
+
danger: { base: 'var(--p-red-500, #ef4444)', light: 'var(--p-red-300, #fca5a5)' },
|
|
2535
|
+
info: { base: 'var(--p-blue-500, #3b82f6)', light: 'var(--p-blue-300, #93c5fd)' },
|
|
2536
|
+
senior: { base: '#0d9488', light: '#00c89a' },
|
|
2537
|
+
};
|
|
2538
|
+
const SENIOR_PATH_RIGHT = 'M174.719 518.932L258.161 439.782C264.546 433.762 269.614 426.603 273.072 418.719C276.53 410.834 278.31 402.378 278.31 393.838C278.31 385.298 276.53 376.843 273.072 368.958C269.614 361.073 264.546 353.915 258.161 347.895L174.719 269.199C168.45 263.304 163.474 256.289 160.077 248.56C156.681 240.83 154.933 232.539 154.933 224.165C154.933 215.792 156.681 207.501 160.077 199.771C163.474 192.042 168.45 185.027 174.719 179.132L303.718 301.496C329.517 326.089 344 359.371 344 394.066C344 428.76 329.517 462.043 303.718 486.635L174.719 609C168.45 603.105 163.474 596.09 160.077 588.36C156.681 580.631 154.933 572.34 154.933 563.966C154.933 555.592 156.681 547.301 160.077 539.572C163.474 531.842 168.45 524.828 174.719 518.932Z';
|
|
2539
|
+
const SENIOR_PATH_LEFT = 'M173.76 94.0677L90.3189 173.218C83.9334 179.238 78.8659 186.397 75.408 194.281C71.95 202.166 70.1698 210.622 70.1698 219.162C70.1698 227.702 71.95 236.157 75.408 244.042C78.8659 251.927 83.9334 259.085 90.3189 265.105L173.76 344.256C180.03 350.151 185.006 357.166 188.402 364.895C191.798 372.625 193.547 380.916 193.547 389.289C193.547 397.663 191.798 405.954 188.402 413.684C185.006 421.413 180.03 428.428 173.76 434.323L44.2823 311.504C18.4832 286.911 4 253.629 4 218.934C4 184.24 18.4832 150.957 44.2823 126.365L173.76 4C186.213 16.0129 193.192 32.1861 193.192 49.0338C193.192 65.8815 186.213 82.0547 173.76 94.0677Z';
|
|
2540
|
+
const SENIOR_PATH_FULL = SENIOR_PATH_RIGHT + ' ' + SENIOR_PATH_LEFT;
|
|
2541
|
+
class LoadingComponent {
|
|
2542
|
+
variant = 'senior-reveal';
|
|
2543
|
+
color = 'senior';
|
|
2544
|
+
size = 40;
|
|
2545
|
+
text = '';
|
|
2546
|
+
padding = '3rem 0';
|
|
2547
|
+
get colorBase() {
|
|
2548
|
+
return (COLOR_MAP[this.color] || COLOR_MAP['senior']).base;
|
|
2549
|
+
}
|
|
2550
|
+
get colorLight() {
|
|
2551
|
+
return (COLOR_MAP[this.color] || COLOR_MAP['senior']).light;
|
|
2552
|
+
}
|
|
2553
|
+
pathRight = SENIOR_PATH_RIGHT;
|
|
2554
|
+
pathLeft = SENIOR_PATH_LEFT;
|
|
2555
|
+
pathFull = SENIOR_PATH_FULL;
|
|
2556
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2557
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: LoadingComponent, isStandalone: true, selector: "sia-loading", inputs: { variant: "variant", color: "color", size: "size", text: "text", padding: "padding" }, ngImport: i0, template: `
|
|
2558
|
+
<div class="sia-loading" [style.padding]="padding"
|
|
2559
|
+
[class.sia-loading--skeleton]="variant === 'skeleton'"
|
|
2560
|
+
[style.--sia-c]="colorBase" [style.--sia-cl]="colorLight">
|
|
2561
|
+
|
|
2562
|
+
<div class="sia-dots" *ngIf="variant === 'dots'">
|
|
2563
|
+
<span class="dot" *ngFor="let d of [0,1,2]" [style.--i]="d"></span>
|
|
2564
|
+
</div>
|
|
2565
|
+
|
|
2566
|
+
<div class="sia-pulse" *ngIf="variant === 'pulse'" [style.--size]="size + 'px'">
|
|
2567
|
+
<span class="ring ring-1"></span>
|
|
2568
|
+
<span class="ring ring-2"></span>
|
|
2569
|
+
<span class="core"></span>
|
|
2570
|
+
</div>
|
|
2571
|
+
|
|
2572
|
+
<div class="sia-bars" *ngIf="variant === 'bars'" [style.--h]="size + 'px'">
|
|
2573
|
+
<span class="bar" *ngFor="let b of [0,1,2,3,4]" [style.--i]="b"></span>
|
|
2574
|
+
</div>
|
|
2575
|
+
|
|
2576
|
+
<div class="sia-orbit" *ngIf="variant === 'orbit'" [style.--size]="size + 'px'">
|
|
2577
|
+
<span class="orbit-track"></span>
|
|
2578
|
+
<span class="orbit-dot orbit-dot-1"></span>
|
|
2579
|
+
<span class="orbit-dot orbit-dot-2"></span>
|
|
2580
|
+
</div>
|
|
2581
|
+
|
|
2582
|
+
<div class="sia-morph" *ngIf="variant === 'morph'" [style.--size]="size + 'px'">
|
|
2583
|
+
<span class="morph-shape"></span>
|
|
2584
|
+
</div>
|
|
2585
|
+
|
|
2586
|
+
<div class="sia-wave" *ngIf="variant === 'wave'">
|
|
2587
|
+
<span class="wave-dot" *ngFor="let w of [0,1,2,3,4,5,6]" [style.--i]="w"></span>
|
|
2588
|
+
</div>
|
|
2589
|
+
|
|
2590
|
+
<div class="sia-skeleton" *ngIf="variant === 'skeleton'">
|
|
2591
|
+
<div class="skel-row skel-row--header">
|
|
2592
|
+
<div class="skel-circle"></div>
|
|
2593
|
+
<div class="skel-lines">
|
|
2594
|
+
<div class="skel-line skel-line--md"></div>
|
|
2595
|
+
<div class="skel-line skel-line--sm"></div>
|
|
2596
|
+
</div>
|
|
2597
|
+
</div>
|
|
2598
|
+
<div class="skel-line skel-line--full"></div>
|
|
2599
|
+
<div class="skel-line skel-line--lg"></div>
|
|
2600
|
+
<div class="skel-line skel-line--md"></div>
|
|
2601
|
+
</div>
|
|
2602
|
+
|
|
2603
|
+
<!-- ═══ SENIOR VARIANTS ═══ -->
|
|
2604
|
+
|
|
2605
|
+
<!-- senior-draw: stroke draw animation -->
|
|
2606
|
+
<div class="sia-senior-draw" *ngIf="variant === 'senior-draw'" [style.--size]="size + 'px'">
|
|
2607
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2608
|
+
<path class="sp sp-r" [attr.d]="pathRight"
|
|
2609
|
+
[attr.stroke]="colorBase" stroke-width="6" fill="none" stroke-linecap="round" stroke-linejoin="round" />
|
|
2610
|
+
<path class="sp sp-l" [attr.d]="pathLeft"
|
|
2611
|
+
[attr.stroke]="colorBase" stroke-width="6" fill="none" stroke-linecap="round" stroke-linejoin="round" />
|
|
2612
|
+
</svg>
|
|
2613
|
+
</div>
|
|
2614
|
+
|
|
2615
|
+
<!-- senior-pulse: circle with logo, pulse + scale -->
|
|
2616
|
+
<div class="sia-senior-pulse" *ngIf="variant === 'senior-pulse'" [style.--size]="size + 'px'">
|
|
2617
|
+
<div class="sp-circle">
|
|
2618
|
+
<svg [attr.width]="size * 0.5" [attr.height]="size * 0.88" viewBox="0 0 348 613" fill="none">
|
|
2619
|
+
<path [attr.d]="pathFull" fill="white" />
|
|
2620
|
+
</svg>
|
|
2621
|
+
</div>
|
|
2622
|
+
</div>
|
|
2623
|
+
|
|
2624
|
+
<!-- senior-glow: neon glow with breathing -->
|
|
2625
|
+
<div class="sia-senior-glow" *ngIf="variant === 'senior-glow'" [style.--size]="size + 'px'">
|
|
2626
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2627
|
+
<path class="glow-shadow" [attr.d]="pathFull" [attr.stroke]="colorLight" stroke-width="12" fill="none" />
|
|
2628
|
+
<path class="glow-main" [attr.d]="pathFull" [attr.stroke]="colorBase" stroke-width="4" fill="none" />
|
|
2629
|
+
</svg>
|
|
2630
|
+
</div>
|
|
2631
|
+
|
|
2632
|
+
<!-- senior-flip: 3D Y-axis flip -->
|
|
2633
|
+
<div class="sia-senior-flip" *ngIf="variant === 'senior-flip'" [style.--size]="size + 'px'">
|
|
2634
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2635
|
+
<path [attr.d]="pathFull" [attr.fill]="colorBase" />
|
|
2636
|
+
</svg>
|
|
2637
|
+
</div>
|
|
2638
|
+
|
|
2639
|
+
<!-- senior-bounce: alternating halves bounce -->
|
|
2640
|
+
<div class="sia-senior-bounce" *ngIf="variant === 'senior-bounce'" [style.--size]="size + 'px'">
|
|
2641
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2642
|
+
<path class="bounce-r" [attr.d]="pathRight" [attr.fill]="colorBase" />
|
|
2643
|
+
<path class="bounce-l" [attr.d]="pathLeft" [attr.fill]="colorLight" />
|
|
2644
|
+
</svg>
|
|
2645
|
+
</div>
|
|
2646
|
+
|
|
2647
|
+
<!-- senior-reveal: tennis ball bouncing with Senior logo inside -->
|
|
2648
|
+
<div class="sia-senior-reveal" *ngIf="variant === 'senior-reveal'" [style.--size]="size * 1.3 + 'px'">
|
|
2649
|
+
<!-- Tennis ball with Senior logo inside -->
|
|
2650
|
+
<svg class="sr-ball" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
|
2651
|
+
<defs>
|
|
2652
|
+
<clipPath id="sr-clip"><circle cx="50" cy="50" r="48" /></clipPath>
|
|
2653
|
+
</defs>
|
|
2654
|
+
<circle cx="50" cy="50" r="48" [attr.fill]="colorBase" />
|
|
2655
|
+
<g clip-path="url(#sr-clip)">
|
|
2656
|
+
<!-- top-right seam curve -->
|
|
2657
|
+
<path d="M38 -2 C58 18, 62 38, 102 48" stroke="white" stroke-width="9" fill="none" stroke-linecap="round" opacity="0.15" />
|
|
2658
|
+
<path d="M38 -2 C58 18, 62 38, 102 48" stroke="white" stroke-width="4" fill="none" stroke-linecap="round" opacity="0.8" />
|
|
2659
|
+
<!-- bottom-left seam curve -->
|
|
2660
|
+
<path d="M-2 52 C38 62, 42 82, 62 102" stroke="white" stroke-width="9" fill="none" stroke-linecap="round" opacity="0.15" />
|
|
2661
|
+
<path d="M-2 52 C38 62, 42 82, 62 102" stroke="white" stroke-width="4" fill="none" stroke-linecap="round" opacity="0.8" />
|
|
2662
|
+
<g transform="translate(32.6, 19.4) scale(0.10)">
|
|
2663
|
+
<path [attr.d]="pathFull" fill="white" opacity="0.8" />
|
|
2664
|
+
</g>
|
|
2665
|
+
</g>
|
|
2666
|
+
</svg>
|
|
2667
|
+
<div class="sr-shadow"></div>
|
|
2668
|
+
</div>
|
|
2669
|
+
|
|
2670
|
+
<span class="sia-loading-text" *ngIf="text && variant !== 'skeleton'">{{ text }}</span>
|
|
2671
|
+
</div>
|
|
2672
|
+
`, isInline: true, styles: [":host{display:block}.sia-loading{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:.75rem;padding:3rem 0}.sia-loading--skeleton{align-items:stretch}.sia-loading-text{color:var(--p-text-muted-color, #94a3b8);font-size:.8rem;letter-spacing:.02em}.sia-dots{display:flex;gap:6px;align-items:center}.sia-dots .dot{width:10px;height:10px;border-radius:50%;background:var(--sia-c);animation:sia-dot-bounce 1.2s calc(var(--i) * .15s) ease-in-out infinite}@keyframes sia-dot-bounce{0%,60%,to{transform:translateY(0) scale(1);opacity:.4}30%{transform:translateY(-12px) scale(1.15);opacity:1}}.sia-pulse{position:relative;width:var(--size, 40px);height:var(--size, 40px)}.sia-pulse .ring{position:absolute;inset:0;border-radius:50%;border:2px solid var(--sia-c);opacity:0}.sia-pulse .ring-1{animation:sia-ripple 1.8s 0s ease-out infinite}.sia-pulse .ring-2{animation:sia-ripple 1.8s .6s ease-out infinite}.sia-pulse .core{position:absolute;top:50%;left:50%;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;background:var(--sia-c);animation:sia-core-pulse 1.8s ease-in-out infinite}@keyframes sia-ripple{0%{transform:scale(.3);opacity:.8}to{transform:scale(1);opacity:0}}@keyframes sia-core-pulse{0%,to{transform:scale(1);opacity:.6}50%{transform:scale(1.3);opacity:1}}.sia-bars{display:flex;align-items:center;gap:3px;height:var(--h, 40px)}.sia-bars .bar{width:4px;height:40%;border-radius:2px;background:var(--sia-c);animation:sia-bar-wave 1s calc(var(--i) * .1s) ease-in-out infinite}@keyframes sia-bar-wave{0%,to{height:20%;opacity:.4}50%{height:100%;opacity:1}}.sia-orbit{position:relative;width:var(--size, 40px);height:var(--size, 40px)}.sia-orbit .orbit-track{position:absolute;inset:0;border-radius:50%;border:1.5px solid var(--p-surface-200, #e2e8f0)}.sia-orbit .orbit-dot{position:absolute;width:8px;height:8px;border-radius:50%;top:-4px;left:calc(50% - 4px)}.sia-orbit .orbit-dot-1{background:var(--sia-c);animation:sia-orbit-spin 1.4s linear infinite;transform-origin:50% calc(var(--size, 40px) / 2 + 4px)}.sia-orbit .orbit-dot-2{background:var(--sia-cl);animation:sia-orbit-spin 1.4s .7s linear infinite;transform-origin:50% calc(var(--size, 40px) / 2 + 4px)}@keyframes sia-orbit-spin{to{transform:rotate(360deg)}}.sia-morph{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-morph .morph-shape{width:70%;height:70%;background:var(--sia-c);animation:sia-morph 2.4s ease-in-out infinite}@keyframes sia-morph{0%{border-radius:50%;transform:rotate(0) scale(1)}25%{border-radius:30% 70% 50% 50%;transform:rotate(90deg) scale(.85)}50%{border-radius:50% 30% 70%;transform:rotate(180deg) scale(1)}75%{border-radius:70% 50% 30% 70%;transform:rotate(270deg) scale(.85)}to{border-radius:50%;transform:rotate(360deg) scale(1)}}.sia-wave{display:flex;align-items:center;gap:3px}.sia-wave .wave-dot{width:6px;height:6px;border-radius:50%;background:var(--sia-c);animation:sia-wave-flow 1.6s calc(var(--i) * .12s) ease-in-out infinite}@keyframes sia-wave-flow{0%,to{transform:translateY(0) scale(.6);opacity:.3}50%{transform:translateY(-10px) scale(1);opacity:1}}.sia-skeleton{display:flex;flex-direction:column;gap:.75rem;padding:0 1rem;width:100%}.skel-row{display:flex;align-items:center;gap:.75rem}.skel-row--header{margin-bottom:.25rem}.skel-circle{width:36px;height:36px;border-radius:50%;flex-shrink:0;background:var(--p-surface-200, #e2e8f0);animation:sia-shimmer 1.6s ease-in-out infinite}.skel-lines{flex:1;display:flex;flex-direction:column;gap:.4rem}.skel-line{height:10px;border-radius:4px;background:var(--p-surface-200, #e2e8f0);animation:sia-shimmer 1.6s ease-in-out infinite}.skel-line--full{width:100%;animation-delay:.1s}.skel-line--lg{width:75%;animation-delay:.2s}.skel-line--md{width:55%;animation-delay:.3s}.skel-line--sm{width:35%;animation-delay:.15s}@keyframes sia-shimmer{0%,to{opacity:.4}50%{opacity:1}}.sia-senior-draw{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-senior-draw .sp{stroke-dasharray:1200;stroke-dashoffset:1200}.sia-senior-draw .sp-r{animation:sia-sd-r 2s ease-in-out infinite}.sia-senior-draw .sp-l{animation:sia-sd-l 2s ease-in-out infinite}@keyframes sia-sd-r{0%{stroke-dashoffset:1200;opacity:.2}35%{stroke-dashoffset:0;opacity:1}60%{stroke-dashoffset:0;opacity:1}to{stroke-dashoffset:-1200;opacity:.2}}@keyframes sia-sd-l{0%{stroke-dashoffset:1200;opacity:.2}15%{stroke-dashoffset:1200;opacity:.2}50%{stroke-dashoffset:0;opacity:1}65%{stroke-dashoffset:0;opacity:1}to{stroke-dashoffset:-1200;opacity:.2}}.sia-senior-pulse{display:flex;align-items:center;justify-content:center}.sia-senior-pulse .sp-circle{width:var(--size, 64px);height:var(--size, 64px);border-radius:50%;background-color:var(--sia-c);display:flex;align-items:center;justify-content:center;position:relative;animation:sia-sp-pulse 1.4s ease-out infinite,sia-sp-scale 1.4s ease-in-out infinite}@keyframes sia-sp-pulse{0%{box-shadow:0 0 0 0 var(--sia-cl)}70%{box-shadow:0 0 0 20px transparent}to{box-shadow:0 0 0 0 transparent}}@keyframes sia-sp-scale{0%,to{transform:scale(1)}50%{transform:scale(1.12)}}.sia-senior-glow{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-senior-glow .glow-shadow{opacity:.3;filter:blur(4px);animation:sia-sg-breathe 2s ease-in-out infinite}.sia-senior-glow .glow-main{animation:sia-sg-breathe 2s ease-in-out infinite}@keyframes sia-sg-breathe{0%,to{opacity:.4;filter:drop-shadow(0 0 2px var(--sia-cl))}50%{opacity:1;filter:drop-shadow(0 0 10px var(--sia-cl)) drop-shadow(0 0 20px var(--sia-c))}}.sia-senior-flip{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center;perspective:300px}.sia-senior-flip svg{animation:sia-sf-flip 2s ease-in-out infinite;transform-style:preserve-3d}@keyframes sia-sf-flip{0%{transform:rotateY(0)}50%{transform:rotateY(180deg)}to{transform:rotateY(360deg)}}.sia-senior-bounce{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-senior-bounce .bounce-r{animation:sia-sb-r 1.2s ease-in-out infinite;transform-origin:center center}.sia-senior-bounce .bounce-l{animation:sia-sb-l 1.2s ease-in-out infinite;transform-origin:center center}@keyframes sia-sb-r{0%,to{transform:translateY(0) scale(1);opacity:.7}50%{transform:translateY(-8px) scale(1.05);opacity:1}}@keyframes sia-sb-l{0%,to{transform:translateY(-8px) scale(1.05);opacity:1}50%{transform:translateY(0) scale(1);opacity:.7}}.sia-senior-reveal{width:var(--size, 64px);height:calc(var(--size, 64px) * 1.4);position:relative;display:flex;align-items:center;justify-content:center}.sia-senior-reveal .sr-ball{position:absolute;width:var(--size, 64px);height:var(--size, 64px);border-radius:50%;overflow:hidden;animation:sia-sr-bounce 1.2s ease-in-out infinite}.sia-senior-reveal .sr-shadow{position:absolute;bottom:0;width:60%;height:6px;border-radius:50%;background:#0000001f;animation:sia-sr-shadow 1.2s ease-in-out infinite}@keyframes sia-sr-bounce{0%,to{transform:translateY(20%) scaleX(1.06) scaleY(.94)}50%{transform:translateY(-25%) scaleX(.96) scaleY(1.04)}}@keyframes sia-sr-shadow{0%,to{transform:scaleX(1);opacity:.12}50%{transform:scaleX(.6);opacity:.06}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2673
|
+
}
|
|
2674
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoadingComponent, decorators: [{
|
|
2675
|
+
type: Component,
|
|
2676
|
+
args: [{ selector: 'sia-loading', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule], template: `
|
|
2677
|
+
<div class="sia-loading" [style.padding]="padding"
|
|
2678
|
+
[class.sia-loading--skeleton]="variant === 'skeleton'"
|
|
2679
|
+
[style.--sia-c]="colorBase" [style.--sia-cl]="colorLight">
|
|
2680
|
+
|
|
2681
|
+
<div class="sia-dots" *ngIf="variant === 'dots'">
|
|
2682
|
+
<span class="dot" *ngFor="let d of [0,1,2]" [style.--i]="d"></span>
|
|
2683
|
+
</div>
|
|
2684
|
+
|
|
2685
|
+
<div class="sia-pulse" *ngIf="variant === 'pulse'" [style.--size]="size + 'px'">
|
|
2686
|
+
<span class="ring ring-1"></span>
|
|
2687
|
+
<span class="ring ring-2"></span>
|
|
2688
|
+
<span class="core"></span>
|
|
2689
|
+
</div>
|
|
2690
|
+
|
|
2691
|
+
<div class="sia-bars" *ngIf="variant === 'bars'" [style.--h]="size + 'px'">
|
|
2692
|
+
<span class="bar" *ngFor="let b of [0,1,2,3,4]" [style.--i]="b"></span>
|
|
2693
|
+
</div>
|
|
2694
|
+
|
|
2695
|
+
<div class="sia-orbit" *ngIf="variant === 'orbit'" [style.--size]="size + 'px'">
|
|
2696
|
+
<span class="orbit-track"></span>
|
|
2697
|
+
<span class="orbit-dot orbit-dot-1"></span>
|
|
2698
|
+
<span class="orbit-dot orbit-dot-2"></span>
|
|
2699
|
+
</div>
|
|
2700
|
+
|
|
2701
|
+
<div class="sia-morph" *ngIf="variant === 'morph'" [style.--size]="size + 'px'">
|
|
2702
|
+
<span class="morph-shape"></span>
|
|
2703
|
+
</div>
|
|
2704
|
+
|
|
2705
|
+
<div class="sia-wave" *ngIf="variant === 'wave'">
|
|
2706
|
+
<span class="wave-dot" *ngFor="let w of [0,1,2,3,4,5,6]" [style.--i]="w"></span>
|
|
2707
|
+
</div>
|
|
2708
|
+
|
|
2709
|
+
<div class="sia-skeleton" *ngIf="variant === 'skeleton'">
|
|
2710
|
+
<div class="skel-row skel-row--header">
|
|
2711
|
+
<div class="skel-circle"></div>
|
|
2712
|
+
<div class="skel-lines">
|
|
2713
|
+
<div class="skel-line skel-line--md"></div>
|
|
2714
|
+
<div class="skel-line skel-line--sm"></div>
|
|
2715
|
+
</div>
|
|
2716
|
+
</div>
|
|
2717
|
+
<div class="skel-line skel-line--full"></div>
|
|
2718
|
+
<div class="skel-line skel-line--lg"></div>
|
|
2719
|
+
<div class="skel-line skel-line--md"></div>
|
|
2720
|
+
</div>
|
|
2721
|
+
|
|
2722
|
+
<!-- ═══ SENIOR VARIANTS ═══ -->
|
|
2723
|
+
|
|
2724
|
+
<!-- senior-draw: stroke draw animation -->
|
|
2725
|
+
<div class="sia-senior-draw" *ngIf="variant === 'senior-draw'" [style.--size]="size + 'px'">
|
|
2726
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2727
|
+
<path class="sp sp-r" [attr.d]="pathRight"
|
|
2728
|
+
[attr.stroke]="colorBase" stroke-width="6" fill="none" stroke-linecap="round" stroke-linejoin="round" />
|
|
2729
|
+
<path class="sp sp-l" [attr.d]="pathLeft"
|
|
2730
|
+
[attr.stroke]="colorBase" stroke-width="6" fill="none" stroke-linecap="round" stroke-linejoin="round" />
|
|
2731
|
+
</svg>
|
|
2732
|
+
</div>
|
|
2733
|
+
|
|
2734
|
+
<!-- senior-pulse: circle with logo, pulse + scale -->
|
|
2735
|
+
<div class="sia-senior-pulse" *ngIf="variant === 'senior-pulse'" [style.--size]="size + 'px'">
|
|
2736
|
+
<div class="sp-circle">
|
|
2737
|
+
<svg [attr.width]="size * 0.5" [attr.height]="size * 0.88" viewBox="0 0 348 613" fill="none">
|
|
2738
|
+
<path [attr.d]="pathFull" fill="white" />
|
|
2739
|
+
</svg>
|
|
2740
|
+
</div>
|
|
2741
|
+
</div>
|
|
2742
|
+
|
|
2743
|
+
<!-- senior-glow: neon glow with breathing -->
|
|
2744
|
+
<div class="sia-senior-glow" *ngIf="variant === 'senior-glow'" [style.--size]="size + 'px'">
|
|
2745
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2746
|
+
<path class="glow-shadow" [attr.d]="pathFull" [attr.stroke]="colorLight" stroke-width="12" fill="none" />
|
|
2747
|
+
<path class="glow-main" [attr.d]="pathFull" [attr.stroke]="colorBase" stroke-width="4" fill="none" />
|
|
2748
|
+
</svg>
|
|
2749
|
+
</div>
|
|
2750
|
+
|
|
2751
|
+
<!-- senior-flip: 3D Y-axis flip -->
|
|
2752
|
+
<div class="sia-senior-flip" *ngIf="variant === 'senior-flip'" [style.--size]="size + 'px'">
|
|
2753
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2754
|
+
<path [attr.d]="pathFull" [attr.fill]="colorBase" />
|
|
2755
|
+
</svg>
|
|
2756
|
+
</div>
|
|
2757
|
+
|
|
2758
|
+
<!-- senior-bounce: alternating halves bounce -->
|
|
2759
|
+
<div class="sia-senior-bounce" *ngIf="variant === 'senior-bounce'" [style.--size]="size + 'px'">
|
|
2760
|
+
<svg [attr.width]="size" [attr.height]="size" viewBox="0 0 348 613" fill="none">
|
|
2761
|
+
<path class="bounce-r" [attr.d]="pathRight" [attr.fill]="colorBase" />
|
|
2762
|
+
<path class="bounce-l" [attr.d]="pathLeft" [attr.fill]="colorLight" />
|
|
2763
|
+
</svg>
|
|
2764
|
+
</div>
|
|
2765
|
+
|
|
2766
|
+
<!-- senior-reveal: tennis ball bouncing with Senior logo inside -->
|
|
2767
|
+
<div class="sia-senior-reveal" *ngIf="variant === 'senior-reveal'" [style.--size]="size * 1.3 + 'px'">
|
|
2768
|
+
<!-- Tennis ball with Senior logo inside -->
|
|
2769
|
+
<svg class="sr-ball" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
|
2770
|
+
<defs>
|
|
2771
|
+
<clipPath id="sr-clip"><circle cx="50" cy="50" r="48" /></clipPath>
|
|
2772
|
+
</defs>
|
|
2773
|
+
<circle cx="50" cy="50" r="48" [attr.fill]="colorBase" />
|
|
2774
|
+
<g clip-path="url(#sr-clip)">
|
|
2775
|
+
<!-- top-right seam curve -->
|
|
2776
|
+
<path d="M38 -2 C58 18, 62 38, 102 48" stroke="white" stroke-width="9" fill="none" stroke-linecap="round" opacity="0.15" />
|
|
2777
|
+
<path d="M38 -2 C58 18, 62 38, 102 48" stroke="white" stroke-width="4" fill="none" stroke-linecap="round" opacity="0.8" />
|
|
2778
|
+
<!-- bottom-left seam curve -->
|
|
2779
|
+
<path d="M-2 52 C38 62, 42 82, 62 102" stroke="white" stroke-width="9" fill="none" stroke-linecap="round" opacity="0.15" />
|
|
2780
|
+
<path d="M-2 52 C38 62, 42 82, 62 102" stroke="white" stroke-width="4" fill="none" stroke-linecap="round" opacity="0.8" />
|
|
2781
|
+
<g transform="translate(32.6, 19.4) scale(0.10)">
|
|
2782
|
+
<path [attr.d]="pathFull" fill="white" opacity="0.8" />
|
|
2783
|
+
</g>
|
|
2784
|
+
</g>
|
|
2785
|
+
</svg>
|
|
2786
|
+
<div class="sr-shadow"></div>
|
|
2787
|
+
</div>
|
|
2788
|
+
|
|
2789
|
+
<span class="sia-loading-text" *ngIf="text && variant !== 'skeleton'">{{ text }}</span>
|
|
2790
|
+
</div>
|
|
2791
|
+
`, styles: [":host{display:block}.sia-loading{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:.75rem;padding:3rem 0}.sia-loading--skeleton{align-items:stretch}.sia-loading-text{color:var(--p-text-muted-color, #94a3b8);font-size:.8rem;letter-spacing:.02em}.sia-dots{display:flex;gap:6px;align-items:center}.sia-dots .dot{width:10px;height:10px;border-radius:50%;background:var(--sia-c);animation:sia-dot-bounce 1.2s calc(var(--i) * .15s) ease-in-out infinite}@keyframes sia-dot-bounce{0%,60%,to{transform:translateY(0) scale(1);opacity:.4}30%{transform:translateY(-12px) scale(1.15);opacity:1}}.sia-pulse{position:relative;width:var(--size, 40px);height:var(--size, 40px)}.sia-pulse .ring{position:absolute;inset:0;border-radius:50%;border:2px solid var(--sia-c);opacity:0}.sia-pulse .ring-1{animation:sia-ripple 1.8s 0s ease-out infinite}.sia-pulse .ring-2{animation:sia-ripple 1.8s .6s ease-out infinite}.sia-pulse .core{position:absolute;top:50%;left:50%;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;background:var(--sia-c);animation:sia-core-pulse 1.8s ease-in-out infinite}@keyframes sia-ripple{0%{transform:scale(.3);opacity:.8}to{transform:scale(1);opacity:0}}@keyframes sia-core-pulse{0%,to{transform:scale(1);opacity:.6}50%{transform:scale(1.3);opacity:1}}.sia-bars{display:flex;align-items:center;gap:3px;height:var(--h, 40px)}.sia-bars .bar{width:4px;height:40%;border-radius:2px;background:var(--sia-c);animation:sia-bar-wave 1s calc(var(--i) * .1s) ease-in-out infinite}@keyframes sia-bar-wave{0%,to{height:20%;opacity:.4}50%{height:100%;opacity:1}}.sia-orbit{position:relative;width:var(--size, 40px);height:var(--size, 40px)}.sia-orbit .orbit-track{position:absolute;inset:0;border-radius:50%;border:1.5px solid var(--p-surface-200, #e2e8f0)}.sia-orbit .orbit-dot{position:absolute;width:8px;height:8px;border-radius:50%;top:-4px;left:calc(50% - 4px)}.sia-orbit .orbit-dot-1{background:var(--sia-c);animation:sia-orbit-spin 1.4s linear infinite;transform-origin:50% calc(var(--size, 40px) / 2 + 4px)}.sia-orbit .orbit-dot-2{background:var(--sia-cl);animation:sia-orbit-spin 1.4s .7s linear infinite;transform-origin:50% calc(var(--size, 40px) / 2 + 4px)}@keyframes sia-orbit-spin{to{transform:rotate(360deg)}}.sia-morph{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-morph .morph-shape{width:70%;height:70%;background:var(--sia-c);animation:sia-morph 2.4s ease-in-out infinite}@keyframes sia-morph{0%{border-radius:50%;transform:rotate(0) scale(1)}25%{border-radius:30% 70% 50% 50%;transform:rotate(90deg) scale(.85)}50%{border-radius:50% 30% 70%;transform:rotate(180deg) scale(1)}75%{border-radius:70% 50% 30% 70%;transform:rotate(270deg) scale(.85)}to{border-radius:50%;transform:rotate(360deg) scale(1)}}.sia-wave{display:flex;align-items:center;gap:3px}.sia-wave .wave-dot{width:6px;height:6px;border-radius:50%;background:var(--sia-c);animation:sia-wave-flow 1.6s calc(var(--i) * .12s) ease-in-out infinite}@keyframes sia-wave-flow{0%,to{transform:translateY(0) scale(.6);opacity:.3}50%{transform:translateY(-10px) scale(1);opacity:1}}.sia-skeleton{display:flex;flex-direction:column;gap:.75rem;padding:0 1rem;width:100%}.skel-row{display:flex;align-items:center;gap:.75rem}.skel-row--header{margin-bottom:.25rem}.skel-circle{width:36px;height:36px;border-radius:50%;flex-shrink:0;background:var(--p-surface-200, #e2e8f0);animation:sia-shimmer 1.6s ease-in-out infinite}.skel-lines{flex:1;display:flex;flex-direction:column;gap:.4rem}.skel-line{height:10px;border-radius:4px;background:var(--p-surface-200, #e2e8f0);animation:sia-shimmer 1.6s ease-in-out infinite}.skel-line--full{width:100%;animation-delay:.1s}.skel-line--lg{width:75%;animation-delay:.2s}.skel-line--md{width:55%;animation-delay:.3s}.skel-line--sm{width:35%;animation-delay:.15s}@keyframes sia-shimmer{0%,to{opacity:.4}50%{opacity:1}}.sia-senior-draw{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-senior-draw .sp{stroke-dasharray:1200;stroke-dashoffset:1200}.sia-senior-draw .sp-r{animation:sia-sd-r 2s ease-in-out infinite}.sia-senior-draw .sp-l{animation:sia-sd-l 2s ease-in-out infinite}@keyframes sia-sd-r{0%{stroke-dashoffset:1200;opacity:.2}35%{stroke-dashoffset:0;opacity:1}60%{stroke-dashoffset:0;opacity:1}to{stroke-dashoffset:-1200;opacity:.2}}@keyframes sia-sd-l{0%{stroke-dashoffset:1200;opacity:.2}15%{stroke-dashoffset:1200;opacity:.2}50%{stroke-dashoffset:0;opacity:1}65%{stroke-dashoffset:0;opacity:1}to{stroke-dashoffset:-1200;opacity:.2}}.sia-senior-pulse{display:flex;align-items:center;justify-content:center}.sia-senior-pulse .sp-circle{width:var(--size, 64px);height:var(--size, 64px);border-radius:50%;background-color:var(--sia-c);display:flex;align-items:center;justify-content:center;position:relative;animation:sia-sp-pulse 1.4s ease-out infinite,sia-sp-scale 1.4s ease-in-out infinite}@keyframes sia-sp-pulse{0%{box-shadow:0 0 0 0 var(--sia-cl)}70%{box-shadow:0 0 0 20px transparent}to{box-shadow:0 0 0 0 transparent}}@keyframes sia-sp-scale{0%,to{transform:scale(1)}50%{transform:scale(1.12)}}.sia-senior-glow{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-senior-glow .glow-shadow{opacity:.3;filter:blur(4px);animation:sia-sg-breathe 2s ease-in-out infinite}.sia-senior-glow .glow-main{animation:sia-sg-breathe 2s ease-in-out infinite}@keyframes sia-sg-breathe{0%,to{opacity:.4;filter:drop-shadow(0 0 2px var(--sia-cl))}50%{opacity:1;filter:drop-shadow(0 0 10px var(--sia-cl)) drop-shadow(0 0 20px var(--sia-c))}}.sia-senior-flip{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center;perspective:300px}.sia-senior-flip svg{animation:sia-sf-flip 2s ease-in-out infinite;transform-style:preserve-3d}@keyframes sia-sf-flip{0%{transform:rotateY(0)}50%{transform:rotateY(180deg)}to{transform:rotateY(360deg)}}.sia-senior-bounce{width:var(--size, 40px);height:var(--size, 40px);display:flex;align-items:center;justify-content:center}.sia-senior-bounce .bounce-r{animation:sia-sb-r 1.2s ease-in-out infinite;transform-origin:center center}.sia-senior-bounce .bounce-l{animation:sia-sb-l 1.2s ease-in-out infinite;transform-origin:center center}@keyframes sia-sb-r{0%,to{transform:translateY(0) scale(1);opacity:.7}50%{transform:translateY(-8px) scale(1.05);opacity:1}}@keyframes sia-sb-l{0%,to{transform:translateY(-8px) scale(1.05);opacity:1}50%{transform:translateY(0) scale(1);opacity:.7}}.sia-senior-reveal{width:var(--size, 64px);height:calc(var(--size, 64px) * 1.4);position:relative;display:flex;align-items:center;justify-content:center}.sia-senior-reveal .sr-ball{position:absolute;width:var(--size, 64px);height:var(--size, 64px);border-radius:50%;overflow:hidden;animation:sia-sr-bounce 1.2s ease-in-out infinite}.sia-senior-reveal .sr-shadow{position:absolute;bottom:0;width:60%;height:6px;border-radius:50%;background:#0000001f;animation:sia-sr-shadow 1.2s ease-in-out infinite}@keyframes sia-sr-bounce{0%,to{transform:translateY(20%) scaleX(1.06) scaleY(.94)}50%{transform:translateY(-25%) scaleX(.96) scaleY(1.04)}}@keyframes sia-sr-shadow{0%,to{transform:scaleX(1);opacity:.12}50%{transform:scaleX(.6);opacity:.06}}\n"] }]
|
|
2792
|
+
}], propDecorators: { variant: [{
|
|
2793
|
+
type: Input
|
|
2794
|
+
}], color: [{
|
|
2795
|
+
type: Input
|
|
2796
|
+
}], size: [{
|
|
2797
|
+
type: Input
|
|
2798
|
+
}], text: [{
|
|
2799
|
+
type: Input
|
|
2800
|
+
}], padding: [{
|
|
2801
|
+
type: Input
|
|
2802
|
+
}] } });
|
|
2803
|
+
|
|
2499
2804
|
/**
|
|
2500
2805
|
* Base class for entity list components
|
|
2501
2806
|
* Eliminates code duplication between feature list components
|
|
@@ -3417,6 +3722,94 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
3417
3722
|
`, styles: ["::ng-deep p-calendar{width:100%;.p-calendar,input{width:100%}}\n"] }]
|
|
3418
3723
|
}], ctorParameters: () => [{ type: TranslationService }, { type: LocaleService }, { type: i0.ChangeDetectorRef }] });
|
|
3419
3724
|
|
|
3725
|
+
class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
|
|
3726
|
+
localeService;
|
|
3727
|
+
cdr;
|
|
3728
|
+
currentDateFormat = 'dd/mm/yy';
|
|
3729
|
+
calendarVisible = true;
|
|
3730
|
+
langSub;
|
|
3731
|
+
constructor(translationService, localeService, cdr) {
|
|
3732
|
+
super(translationService);
|
|
3733
|
+
this.localeService = localeService;
|
|
3734
|
+
this.cdr = cdr;
|
|
3735
|
+
}
|
|
3736
|
+
ngOnInit() {
|
|
3737
|
+
this.updateDateFormat();
|
|
3738
|
+
this.langSub = this.translationService.currentLanguage$.subscribe(() => {
|
|
3739
|
+
this.refreshCalendar();
|
|
3740
|
+
});
|
|
3741
|
+
}
|
|
3742
|
+
ngOnDestroy() {
|
|
3743
|
+
this.langSub?.unsubscribe();
|
|
3744
|
+
}
|
|
3745
|
+
refreshCalendar() {
|
|
3746
|
+
this.calendarVisible = false;
|
|
3747
|
+
this.cdr.detectChanges();
|
|
3748
|
+
this.updateDateFormat();
|
|
3749
|
+
this.calendarVisible = true;
|
|
3750
|
+
this.cdr.detectChanges();
|
|
3751
|
+
}
|
|
3752
|
+
updateDateFormat() {
|
|
3753
|
+
this.currentDateFormat = this.field?.dateFormat || this.localeService.getPrimeNGDateFormat();
|
|
3754
|
+
}
|
|
3755
|
+
getPlaceholder() {
|
|
3756
|
+
return super.getPlaceholder(true);
|
|
3757
|
+
}
|
|
3758
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDatetimeComponent, deps: [{ token: TranslationService }, { token: LocaleService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
3759
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFieldDatetimeComponent, isStandalone: true, selector: "sia-dynamic-field-datetime", usesInheritance: true, ngImport: i0, template: `
|
|
3760
|
+
<sia-dynamic-field-wrapper [field]="field" [form]="form" [mode]="mode">
|
|
3761
|
+
<div [formGroup]="form">
|
|
3762
|
+
<p-calendar
|
|
3763
|
+
*ngIf="calendarVisible"
|
|
3764
|
+
[inputId]="field.field"
|
|
3765
|
+
[formControlName]="field.field"
|
|
3766
|
+
[placeholder]="getPlaceholder()"
|
|
3767
|
+
[dateFormat]="currentDateFormat"
|
|
3768
|
+
[showTime]="true"
|
|
3769
|
+
[showSeconds]="false"
|
|
3770
|
+
[hourFormat]="'24'"
|
|
3771
|
+
[showIcon]="true"
|
|
3772
|
+
[showButtonBar]="true"
|
|
3773
|
+
[class.ng-invalid]="isFieldInvalid()"
|
|
3774
|
+
[class.ng-dirty]="isFieldDirty()"
|
|
3775
|
+
[appendTo]="'body'"
|
|
3776
|
+
styleClass="w-full">
|
|
3777
|
+
</p-calendar>
|
|
3778
|
+
</div>
|
|
3779
|
+
</sia-dynamic-field-wrapper>
|
|
3780
|
+
`, isInline: true, styles: ["::ng-deep p-calendar{width:100%;.p-calendar,input{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i5$1.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
|
|
3781
|
+
}
|
|
3782
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDatetimeComponent, decorators: [{
|
|
3783
|
+
type: Component,
|
|
3784
|
+
args: [{ selector: 'sia-dynamic-field-datetime', standalone: true, imports: [
|
|
3785
|
+
CommonModule,
|
|
3786
|
+
ReactiveFormsModule,
|
|
3787
|
+
CalendarModule,
|
|
3788
|
+
DynamicFieldWrapperComponent
|
|
3789
|
+
], template: `
|
|
3790
|
+
<sia-dynamic-field-wrapper [field]="field" [form]="form" [mode]="mode">
|
|
3791
|
+
<div [formGroup]="form">
|
|
3792
|
+
<p-calendar
|
|
3793
|
+
*ngIf="calendarVisible"
|
|
3794
|
+
[inputId]="field.field"
|
|
3795
|
+
[formControlName]="field.field"
|
|
3796
|
+
[placeholder]="getPlaceholder()"
|
|
3797
|
+
[dateFormat]="currentDateFormat"
|
|
3798
|
+
[showTime]="true"
|
|
3799
|
+
[showSeconds]="false"
|
|
3800
|
+
[hourFormat]="'24'"
|
|
3801
|
+
[showIcon]="true"
|
|
3802
|
+
[showButtonBar]="true"
|
|
3803
|
+
[class.ng-invalid]="isFieldInvalid()"
|
|
3804
|
+
[class.ng-dirty]="isFieldDirty()"
|
|
3805
|
+
[appendTo]="'body'"
|
|
3806
|
+
styleClass="w-full">
|
|
3807
|
+
</p-calendar>
|
|
3808
|
+
</div>
|
|
3809
|
+
</sia-dynamic-field-wrapper>
|
|
3810
|
+
`, styles: ["::ng-deep p-calendar{width:100%;.p-calendar,input{width:100%}}\n"] }]
|
|
3811
|
+
}], ctorParameters: () => [{ type: TranslationService }, { type: LocaleService }, { type: i0.ChangeDetectorRef }] });
|
|
3812
|
+
|
|
3420
3813
|
class DynamicFieldDropdownComponent extends DynamicFieldBaseComponent {
|
|
3421
3814
|
constructor(translationService) {
|
|
3422
3815
|
super(translationService);
|
|
@@ -3497,6 +3890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
3497
3890
|
|
|
3498
3891
|
class DynamicFieldLookupComponent {
|
|
3499
3892
|
translationService;
|
|
3893
|
+
cdr;
|
|
3500
3894
|
field;
|
|
3501
3895
|
form;
|
|
3502
3896
|
formGroup;
|
|
@@ -3511,12 +3905,14 @@ class DynamicFieldLookupComponent {
|
|
|
3511
3905
|
currentPage = 0;
|
|
3512
3906
|
pageSize = 5;
|
|
3513
3907
|
selectedItem = null;
|
|
3908
|
+
skipNextLazyLoad = false;
|
|
3514
3909
|
columns = [];
|
|
3515
3910
|
displayField = 'name';
|
|
3516
3911
|
valueField = 'id';
|
|
3517
3912
|
searchFields = ['name'];
|
|
3518
|
-
constructor(translationService) {
|
|
3913
|
+
constructor(translationService, cdr) {
|
|
3519
3914
|
this.translationService = translationService;
|
|
3915
|
+
this.cdr = cdr;
|
|
3520
3916
|
}
|
|
3521
3917
|
ngOnInit() {
|
|
3522
3918
|
this.setupLookupConfig();
|
|
@@ -3618,7 +4014,9 @@ class DynamicFieldLookupComponent {
|
|
|
3618
4014
|
this.showLookupDialog = true;
|
|
3619
4015
|
this.currentPage = 0;
|
|
3620
4016
|
this.searchTerm = '';
|
|
3621
|
-
|
|
4017
|
+
// Delay loadData to next macrotask to avoid NG0100
|
|
4018
|
+
// (p-dialog triggers a CD cycle on open that conflicts with loading state change)
|
|
4019
|
+
setTimeout(() => this.loadData(), 0);
|
|
3622
4020
|
}
|
|
3623
4021
|
onDialogHide() {
|
|
3624
4022
|
this.searchTerm = '';
|
|
@@ -3628,6 +4026,12 @@ class DynamicFieldLookupComponent {
|
|
|
3628
4026
|
if (!this.showLookupDialog) {
|
|
3629
4027
|
return;
|
|
3630
4028
|
}
|
|
4029
|
+
// p-table fires onLazyLoad when it first renders — skip it since
|
|
4030
|
+
// openLookup already triggered loadData
|
|
4031
|
+
if (this.skipNextLazyLoad) {
|
|
4032
|
+
this.skipNextLazyLoad = false;
|
|
4033
|
+
return;
|
|
4034
|
+
}
|
|
3631
4035
|
this.currentPage = event.first / event.rows;
|
|
3632
4036
|
this.loadData();
|
|
3633
4037
|
}
|
|
@@ -3703,12 +4107,15 @@ class DynamicFieldLookupComponent {
|
|
|
3703
4107
|
}
|
|
3704
4108
|
}
|
|
3705
4109
|
this.loading = false;
|
|
4110
|
+
// The table will fire onLazyLoad when it first renders — skip it
|
|
4111
|
+
this.skipNextLazyLoad = true;
|
|
3706
4112
|
},
|
|
3707
4113
|
error: (_error) => {
|
|
3708
4114
|
this.data = [];
|
|
3709
4115
|
this.filteredData = [];
|
|
3710
4116
|
this.totalRecords = 0;
|
|
3711
4117
|
this.loading = false;
|
|
4118
|
+
this.skipNextLazyLoad = true;
|
|
3712
4119
|
}
|
|
3713
4120
|
});
|
|
3714
4121
|
}
|
|
@@ -3751,7 +4158,7 @@ class DynamicFieldLookupComponent {
|
|
|
3751
4158
|
getFieldValue(item, field) {
|
|
3752
4159
|
return field.split('.').reduce((obj, key) => obj?.[key], item) || '';
|
|
3753
4160
|
}
|
|
3754
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldLookupComponent, deps: [{ token: TranslationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
4161
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldLookupComponent, deps: [{ token: TranslationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
3755
4162
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFieldLookupComponent, isStandalone: true, selector: "sia-dynamic-field-lookup", inputs: { field: "field", form: "form", formGroup: "formGroup", mode: "mode" }, ngImport: i0, template: `
|
|
3756
4163
|
<sia-dynamic-field-wrapper [field]="field" [form]="form" [mode]="mode">
|
|
3757
4164
|
<div [formGroup]="form" class="lookup-field" [ngClass]="{'disabled': isFieldDisabled()}">
|
|
@@ -3844,10 +4251,13 @@ class DynamicFieldLookupComponent {
|
|
|
3844
4251
|
</div>
|
|
3845
4252
|
</div>
|
|
3846
4253
|
|
|
4254
|
+
<!-- Loading State -->
|
|
4255
|
+
<sia-loading *ngIf="loading" padding="2rem 0" [size]="48"></sia-loading>
|
|
4256
|
+
|
|
3847
4257
|
<!-- Data Table -->
|
|
3848
4258
|
<p-table
|
|
4259
|
+
*ngIf="!loading"
|
|
3849
4260
|
[value]="filteredData"
|
|
3850
|
-
[loading]="loading"
|
|
3851
4261
|
[paginator]="true"
|
|
3852
4262
|
[rows]="pageSize"
|
|
3853
4263
|
[totalRecords]="totalRecords"
|
|
@@ -3894,7 +4304,7 @@ class DynamicFieldLookupComponent {
|
|
|
3894
4304
|
</div>
|
|
3895
4305
|
</p-dialog>
|
|
3896
4306
|
</sia-dynamic-field-wrapper>
|
|
3897
|
-
`, isInline: true, styles: [".lookup-field{width:100%;position:relative}.lookup-input-group{position:relative;width:100%;.lookup-display{width:100%;cursor:pointer;height:2.857rem;padding:.75rem 4rem .75rem .75rem;font-size:1rem;line-height:1.5;box-sizing:border-box;display:flex;align-items:center;&:focus{outline:none}&:hover{background:transparent}}.lookup-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}.lookup-dialog-content{height:100%;display:flex;flex-direction:column;padding:0;.search-wrapper{position:relative;margin-bottom:16px;width:100%;.search-input-full{width:100%;padding-right:5.5rem}.search-buttons-inside{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;::ng-deep .p-button{width:2.5rem!important;height:2.5rem!important}}}.lookup-table{flex:1;.empty-state{text-align:center;padding:32px;color:var(--p-text-color-secondary);i{font-size:48px;margin-bottom:16px;display:block}p{margin:8px 0;font-size:16px}small{font-size:14px}}}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$2.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i8$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8$1.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
|
|
4307
|
+
`, isInline: true, styles: [".lookup-field{width:100%;position:relative}.lookup-input-group{position:relative;width:100%;.lookup-display{width:100%;cursor:pointer;height:2.857rem;padding:.75rem 4rem .75rem .75rem;font-size:1rem;line-height:1.5;box-sizing:border-box;display:flex;align-items:center;&:focus{outline:none}&:hover{background:transparent}}.lookup-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}.lookup-dialog-content{height:100%;display:flex;flex-direction:column;padding:0;.search-wrapper{position:relative;margin-bottom:16px;width:100%;.search-input-full{width:100%;padding-right:5.5rem}.search-buttons-inside{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;::ng-deep .p-button{width:2.5rem!important;height:2.5rem!important}}}.lookup-table{flex:1;.empty-state{text-align:center;padding:32px;color:var(--p-text-color-secondary);i{font-size:48px;margin-bottom:16px;display:block}p{margin:8px 0;font-size:16px}small{font-size:14px}}}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$2.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i8$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8$1.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }, { kind: "component", type: LoadingComponent, selector: "sia-loading", inputs: ["variant", "color", "size", "text", "padding"] }] });
|
|
3898
4308
|
}
|
|
3899
4309
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldLookupComponent, decorators: [{
|
|
3900
4310
|
type: Component,
|
|
@@ -3908,7 +4318,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
3908
4318
|
TableModule,
|
|
3909
4319
|
TooltipModule,
|
|
3910
4320
|
TranslatePipe,
|
|
3911
|
-
DynamicFieldWrapperComponent
|
|
4321
|
+
DynamicFieldWrapperComponent,
|
|
4322
|
+
LoadingComponent
|
|
3912
4323
|
], template: `
|
|
3913
4324
|
<sia-dynamic-field-wrapper [field]="field" [form]="form" [mode]="mode">
|
|
3914
4325
|
<div [formGroup]="form" class="lookup-field" [ngClass]="{'disabled': isFieldDisabled()}">
|
|
@@ -4001,10 +4412,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4001
4412
|
</div>
|
|
4002
4413
|
</div>
|
|
4003
4414
|
|
|
4415
|
+
<!-- Loading State -->
|
|
4416
|
+
<sia-loading *ngIf="loading" padding="2rem 0" [size]="48"></sia-loading>
|
|
4417
|
+
|
|
4004
4418
|
<!-- Data Table -->
|
|
4005
4419
|
<p-table
|
|
4420
|
+
*ngIf="!loading"
|
|
4006
4421
|
[value]="filteredData"
|
|
4007
|
-
[loading]="loading"
|
|
4008
4422
|
[paginator]="true"
|
|
4009
4423
|
[rows]="pageSize"
|
|
4010
4424
|
[totalRecords]="totalRecords"
|
|
@@ -4052,7 +4466,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4052
4466
|
</p-dialog>
|
|
4053
4467
|
</sia-dynamic-field-wrapper>
|
|
4054
4468
|
`, styles: [".lookup-field{width:100%;position:relative}.lookup-input-group{position:relative;width:100%;.lookup-display{width:100%;cursor:pointer;height:2.857rem;padding:.75rem 4rem .75rem .75rem;font-size:1rem;line-height:1.5;box-sizing:border-box;display:flex;align-items:center;&:focus{outline:none}&:hover{background:transparent}}.lookup-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}.lookup-dialog-content{height:100%;display:flex;flex-direction:column;padding:0;.search-wrapper{position:relative;margin-bottom:16px;width:100%;.search-input-full{width:100%;padding-right:5.5rem}.search-buttons-inside{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;::ng-deep .p-button{width:2.5rem!important;height:2.5rem!important}}}.lookup-table{flex:1;.empty-state{text-align:center;padding:32px;color:var(--p-text-color-secondary);i{font-size:48px;margin-bottom:16px;display:block}p{margin:8px 0;font-size:16px}small{font-size:14px}}}}\n"] }]
|
|
4055
|
-
}], ctorParameters: () => [{ type: TranslationService }], propDecorators: { field: [{
|
|
4469
|
+
}], ctorParameters: () => [{ type: TranslationService }, { type: i0.ChangeDetectorRef }], propDecorators: { field: [{
|
|
4056
4470
|
type: Input
|
|
4057
4471
|
}], form: [{
|
|
4058
4472
|
type: Input
|
|
@@ -4325,6 +4739,20 @@ class DynamicFormComponent {
|
|
|
4325
4739
|
processEntityData(entity) {
|
|
4326
4740
|
const processedData = { ...entity };
|
|
4327
4741
|
this.allFields.forEach(field => {
|
|
4742
|
+
if (field.type === 'date' && processedData[field.field]) {
|
|
4743
|
+
const dateValue = processedData[field.field];
|
|
4744
|
+
if (typeof dateValue === 'string') {
|
|
4745
|
+
// Convert date string (yyyy-MM-dd or ISO) to Date object for p-calendar
|
|
4746
|
+
// Use date-only constructor to avoid timezone/hour issues
|
|
4747
|
+
const parts = dateValue.substring(0, 10).split('-');
|
|
4748
|
+
if (parts.length === 3) {
|
|
4749
|
+
const date = new Date(+parts[0], +parts[1] - 1, +parts[2]);
|
|
4750
|
+
if (!isNaN(date.getTime())) {
|
|
4751
|
+
processedData[field.field] = date;
|
|
4752
|
+
}
|
|
4753
|
+
}
|
|
4754
|
+
}
|
|
4755
|
+
}
|
|
4328
4756
|
if (field.type === 'lookup' && processedData[field.field]) {
|
|
4329
4757
|
const lookupValue = processedData[field.field];
|
|
4330
4758
|
// Keep the full object if it has display data, otherwise extract ID
|
|
@@ -4398,7 +4826,11 @@ class DynamicFormComponent {
|
|
|
4398
4826
|
}
|
|
4399
4827
|
else if (field.type === 'date') {
|
|
4400
4828
|
if (fieldValue instanceof Date) {
|
|
4401
|
-
|
|
4829
|
+
// Serialize as yyyy-MM-dd using local date components (no UTC shift)
|
|
4830
|
+
const y = fieldValue.getFullYear();
|
|
4831
|
+
const m = String(fieldValue.getMonth() + 1).padStart(2, '0');
|
|
4832
|
+
const d = String(fieldValue.getDate()).padStart(2, '0');
|
|
4833
|
+
processedValue[field.field] = `${y}-${m}-${d}`;
|
|
4402
4834
|
}
|
|
4403
4835
|
else if (!fieldValue) {
|
|
4404
4836
|
processedValue[field.field] = null;
|
|
@@ -4453,9 +4885,6 @@ class DynamicFormComponent {
|
|
|
4453
4885
|
return classes.join(' ');
|
|
4454
4886
|
}
|
|
4455
4887
|
isFieldVisible(field) {
|
|
4456
|
-
if (this.mode === 'filter') {
|
|
4457
|
-
return true;
|
|
4458
|
-
}
|
|
4459
4888
|
if (!field.visibleWhen) {
|
|
4460
4889
|
return true;
|
|
4461
4890
|
}
|
|
@@ -4561,7 +4990,9 @@ class DynamicFormComponent {
|
|
|
4561
4990
|
this.form.markAllAsTouched();
|
|
4562
4991
|
return;
|
|
4563
4992
|
}
|
|
4564
|
-
this.
|
|
4993
|
+
if (this.mode !== 'filter') {
|
|
4994
|
+
this.loading = true;
|
|
4995
|
+
}
|
|
4565
4996
|
const formValue = this.mode === 'filter'
|
|
4566
4997
|
? this.processFilterValue(this.form.value)
|
|
4567
4998
|
: this.processFormValue(this.form.value);
|
|
@@ -4583,6 +5014,17 @@ class DynamicFormComponent {
|
|
|
4583
5014
|
// Keep the full object - the lookup component will use it
|
|
4584
5015
|
control.setValue(value);
|
|
4585
5016
|
}
|
|
5017
|
+
else if (field?.type === 'date' && value && typeof value === 'string') {
|
|
5018
|
+
// Convert date string to Date object for p-calendar (date-only, no time component)
|
|
5019
|
+
const parts = value.substring(0, 10).split('-');
|
|
5020
|
+
if (parts.length === 3) {
|
|
5021
|
+
const date = new Date(+parts[0], +parts[1] - 1, +parts[2]);
|
|
5022
|
+
control.setValue(!isNaN(date.getTime()) ? date : value);
|
|
5023
|
+
}
|
|
5024
|
+
else {
|
|
5025
|
+
control.setValue(value);
|
|
5026
|
+
}
|
|
5027
|
+
}
|
|
4586
5028
|
else {
|
|
4587
5029
|
control.setValue(value);
|
|
4588
5030
|
}
|
|
@@ -4609,6 +5051,13 @@ class DynamicFormComponent {
|
|
|
4609
5051
|
// If it's just an ID, wrap it in an object
|
|
4610
5052
|
fieldValue = { id: fieldValue };
|
|
4611
5053
|
}
|
|
5054
|
+
// For date fields, serialize as yyyy-MM-dd (no time component)
|
|
5055
|
+
if (field?.type === 'date' && fieldValue instanceof Date) {
|
|
5056
|
+
const y = fieldValue.getFullYear();
|
|
5057
|
+
const m = String(fieldValue.getMonth() + 1).padStart(2, '0');
|
|
5058
|
+
const d = String(fieldValue.getDate()).padStart(2, '0');
|
|
5059
|
+
fieldValue = `${y}-${m}-${d}`;
|
|
5060
|
+
}
|
|
4612
5061
|
this.fieldSave.emit({ field: fieldName, value: fieldValue });
|
|
4613
5062
|
}
|
|
4614
5063
|
cancelInlineEdit() {
|
|
@@ -4693,7 +5142,7 @@ class DynamicFormComponent {
|
|
|
4693
5142
|
return String(value);
|
|
4694
5143
|
}
|
|
4695
5144
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, deps: [{ token: i3.FormBuilder }, { token: TranslationService }, { token: MaskService }, { token: LocaleService }], target: i0.ɵɵFactoryTarget.Component });
|
|
4696
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { formFields: "formFields", formSections: "formSections", fixedFilters: "fixedFilters", filterSections: "filterSections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6$1.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9$1.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }] });
|
|
5145
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sia-dynamic-form", inputs: { formFields: "formFields", formSections: "formSections", fixedFilters: "fixedFilters", filterSections: "filterSections", entityData: "entityData", mode: "mode", displayMode: "displayMode", visible: "visible", dialogConfig: "dialogConfig", drawerConfig: "drawerConfig", showSubmitButton: "showSubmitButton", showCancelButton: "showCancelButton", submitButtonLabel: "submitButtonLabel", cancelButtonLabel: "cancelButtonLabel", submitButtonIcon: "submitButtonIcon", cancelButtonIcon: "cancelButtonIcon" }, outputs: { formReady: "formReady", formSubmit: "formSubmit", visibleChange: "visibleChange", onCancel: "onCancel", fieldSave: "fieldSave" }, usesOnChanges: true, ngImport: i0, template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6$1.Panel, selector: "p-panel", inputs: ["toggleable", "header", "collapsed", "style", "styleClass", "iconPos", "expandIcon", "collapseIcon", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i4.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9$1.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4$1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFieldTextComponent, selector: "sia-dynamic-field-text" }, { kind: "component", type: DynamicFieldNumberComponent, selector: "sia-dynamic-field-number" }, { kind: "component", type: DynamicFieldDateComponent, selector: "sia-dynamic-field-date" }, { kind: "component", type: DynamicFieldDatetimeComponent, selector: "sia-dynamic-field-datetime" }, { kind: "component", type: DynamicFieldDropdownComponent, selector: "sia-dynamic-field-dropdown" }, { kind: "component", type: DynamicFieldLookupComponent, selector: "sia-dynamic-field-lookup", inputs: ["field", "form", "formGroup", "mode"] }, { kind: "component", type: DynamicFieldTextareaComponent, selector: "sia-dynamic-field-textarea" }] });
|
|
4697
5146
|
}
|
|
4698
5147
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, decorators: [{
|
|
4699
5148
|
type: Component,
|
|
@@ -4708,10 +5157,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4708
5157
|
DynamicFieldTextComponent,
|
|
4709
5158
|
DynamicFieldNumberComponent,
|
|
4710
5159
|
DynamicFieldDateComponent,
|
|
5160
|
+
DynamicFieldDatetimeComponent,
|
|
4711
5161
|
DynamicFieldDropdownComponent,
|
|
4712
5162
|
DynamicFieldLookupComponent,
|
|
4713
5163
|
DynamicFieldTextareaComponent
|
|
4714
|
-
], template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"] }]
|
|
5164
|
+
], template: "<!-- Modo Inline (padr\u00E3o) -->\n<ng-container *ngIf=\"isInlineMode\">\n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n</ng-container>\n\n<!-- Modo Dialog -->\n<p-dialog\n *ngIf=\"isDialogMode\"\n [(visible)]=\"visible\"\n [header]=\"dialogHeader | translate\"\n [modal]=\"true\"\n [style]=\"{ width: dialogWidth }\"\n [draggable]=\"dialogDraggable\"\n [resizable]=\"dialogResizable\"\n [maximizable]=\"dialogMaximizable\"\n [closeOnEscape]=\"dialogCloseOnEscape\"\n [dismissableMask]=\"dialogDismissableMask\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"dialog-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-dialog>\n\n<!-- Modo Drawer -->\n<p-drawer\n *ngIf=\"isDrawerMode\"\n [(visible)]=\"visible\"\n [header]=\"drawerHeader | translate\"\n [position]=\"drawerPosition\"\n [style]=\"drawerStyle\"\n [showCloseIcon]=\"drawerShowCloseIcon\"\n [closeOnEscape]=\"drawerCloseOnEscape\"\n [modal]=\"drawerDismissable\"\n (onHide)=\"close()\">\n \n <ng-container *ngTemplateOutlet=\"formContent\"></ng-container>\n \n <ng-template pTemplate=\"footer\" *ngIf=\"showSubmitButton || showCancelButton\">\n <div class=\"drawer-footer\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n </ng-template>\n</p-drawer>\n\n<!-- Template do Formul\u00E1rio (reutiliz\u00E1vel) -->\n<ng-template #formContent>\n <form [formGroup]=\"form\" class=\"dynamic-form\">\n \n <!-- Filtros Fixos (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFixedFilters\" class=\"fixed-filters-section\">\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of fixedFilters\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Campos Diretos (sem se\u00E7\u00E3o) -->\n <div *ngIf=\"hasFields\">\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of formFields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Se\u00E7\u00F5es de Campos (modo form) -->\n <div *ngIf=\"hasSections\" class=\"sections-container\">\n <p-panel \n *ngFor=\"let section of formSections\"\n [toggleable]=\"section.toggleable !== false\"\n [collapsed]=\"section.collapsed || false\"\n [styleClass]=\"'section-panel'\">\n \n <ng-template pTemplate=\"header\">\n <div class=\"section-header\">\n <i *ngIf=\"section.icon\" [class]=\"section.icon + ' section-icon'\"></i>\n <span class=\"section-title\">{{ section.title }}</span>\n </div>\n </ng-template>\n\n <!-- Modo Inline Edit -->\n <div *ngIf=\"isInlineEditMode\" class=\"inline-edit-fields\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" class=\"inline-edit-field\">\n <ng-container *ngTemplateOutlet=\"inlineEditFieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n\n <!-- Modo Form Normal -->\n <div *ngIf=\"!isInlineEditMode\" class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Se\u00E7\u00F5es de Filtros (apenas no modo filter) -->\n <div *ngIf=\"mode === 'filter' && hasFilterSections\" class=\"filter-sections-container\">\n <p-panel \n *ngFor=\"let section of filterSections\"\n [header]=\"section.title\"\n [toggleable]=\"true\"\n [collapsed]=\"true\">\n\n <div class=\"grid\">\n <ng-container *ngFor=\"let field of section.fields\">\n <div *ngIf=\"isFieldVisible(field)\" [ngClass]=\"getFieldGridClass(field)\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n </ng-container>\n </div>\n </p-panel>\n </div>\n\n <!-- Bot\u00F5es inline (apenas para modo inline) -->\n <div *ngIf=\"isInlineMode && (showSubmitButton || showCancelButton)\" class=\"form-actions\">\n <p-button\n *ngIf=\"showCancelButton\"\n [label]=\"cancelLabel | translate\"\n [icon]=\"cancelButtonIcon\"\n severity=\"secondary\"\n (onClick)=\"handleCancel()\"\n [disabled]=\"loading\">\n </p-button>\n <p-button\n *ngIf=\"showSubmitButton\"\n [label]=\"submitLabel | translate\"\n [icon]=\"submitButtonIcon\"\n (onClick)=\"handleSubmit()\"\n [loading]=\"loading\"\n [disabled]=\"form.invalid\">\n </p-button>\n </div>\n\n </form>\n</ng-template>\n\n<!-- Template de Campo (reutiliz\u00E1vel) -->\n<ng-template #fieldTemplate let-field=\"field\">\n <!-- Text Field -->\n <sia-dynamic-field-text\n *ngIf=\"field.type === 'text'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-text>\n\n <!-- Textarea Field -->\n <sia-dynamic-field-textarea\n *ngIf=\"field.type === 'textarea'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-textarea>\n\n <!-- Number Field -->\n <sia-dynamic-field-number\n *ngIf=\"field.type === 'number'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-number>\n\n <!-- Date Field -->\n <sia-dynamic-field-date\n *ngIf=\"field.type === 'date'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-date>\n\n <!-- Datetime Field -->\n <sia-dynamic-field-datetime\n *ngIf=\"field.type === 'datetime'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-datetime>\n\n <!-- Dropdown/Enum Field -->\n <sia-dynamic-field-dropdown\n *ngIf=\"field.type === 'dropdown' || field.type === 'enum'\"\n [field]=\"field\"\n [form]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-dropdown>\n\n <!-- Lookup Field -->\n <sia-dynamic-field-lookup\n *ngIf=\"field.type === 'lookup'\"\n [field]=\"field\"\n [form]=\"form\"\n [formGroup]=\"form\"\n [mode]=\"fieldMode\">\n </sia-dynamic-field-lookup>\n</ng-template>\n\n\n<!-- Template de Campo Inline Edit -->\n<ng-template #inlineEditFieldTemplate let-field=\"field\">\n <div class=\"edit-inline-field\">\n <label class=\"field-label\">{{ field.label | translate }}</label>\n \n <!-- Display Mode -->\n <div class=\"field-display\" \n *ngIf=\"!isFieldEditing(field.field)\" \n (click)=\"startEditField(field.field)\"\n [class.disabled]=\"field.disabled\">\n <span class=\"display-value\" \n [attr.data-placeholder]=\"field.placeholder || ('crmx.business.not_informed' | translate)\">\n {{ getFieldDisplayValue(field.field) }}\n </span>\n <i class=\"pi pi-pencil edit-icon\" *ngIf=\"!field.disabled\"></i>\n </div>\n \n <!-- Edit Mode -->\n <div class=\"field-edit\" *ngIf=\"isFieldEditing(field.field)\">\n <div class=\"input-container\">\n <ng-container *ngTemplateOutlet=\"fieldTemplate; context: { field: field }\"></ng-container>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"edit-actions\">\n <p-button \n type=\"button\" \n icon=\"pi pi-check\" \n [rounded]=\"true\"\n severity=\"primary\"\n (onClick)=\"saveInlineField(field.field)\" \n [loading]=\"savingField\"\n [disabled]=\"form.get(field.field)?.invalid\">\n </p-button>\n <p-button \n type=\"button\" \n icon=\"pi pi-times\" \n [rounded]=\"true\"\n severity=\"secondary\"\n (onClick)=\"cancelInlineEdit()\"\n [disabled]=\"savingField\">\n </p-button>\n </div>\n \n <!-- Error Message -->\n <div class=\"field-error\" *ngIf=\"form.get(field.field)?.invalid && form.get(field.field)?.touched\">\n <small class=\"p-error\">\n {{ form.get(field.field)?.errors?.['required'] ? ('crmx.business.required_field' | translate) : '' }}\n </small>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dynamic-form{width:100%}.dynamic-form .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:1rem}.dynamic-form .grid>div.col-1{grid-column:span 1}.dynamic-form .grid>div.col-2{grid-column:span 2}.dynamic-form .grid>div.col-3{grid-column:span 3}.dynamic-form .grid>div.col-4{grid-column:span 4}.dynamic-form .grid>div.col-5{grid-column:span 5}.dynamic-form .grid>div.col-6{grid-column:span 6}.dynamic-form .grid>div.col-7{grid-column:span 7}.dynamic-form .grid>div.col-8{grid-column:span 8}.dynamic-form .grid>div.col-9{grid-column:span 9}.dynamic-form .grid>div.col-10{grid-column:span 10}.dynamic-form .grid>div.col-11{grid-column:span 11}.dynamic-form .grid>div.col-12{grid-column:span 12}@media (max-width: 575.98px){.dynamic-form .grid>div.col-xs-1{grid-column:span 1}.dynamic-form .grid>div.col-xs-2{grid-column:span 2}.dynamic-form .grid>div.col-xs-3{grid-column:span 3}.dynamic-form .grid>div.col-xs-4{grid-column:span 4}.dynamic-form .grid>div.col-xs-5{grid-column:span 5}.dynamic-form .grid>div.col-xs-6{grid-column:span 6}.dynamic-form .grid>div.col-xs-7{grid-column:span 7}.dynamic-form .grid>div.col-xs-8{grid-column:span 8}.dynamic-form .grid>div.col-xs-9{grid-column:span 9}.dynamic-form .grid>div.col-xs-10{grid-column:span 10}.dynamic-form .grid>div.col-xs-11{grid-column:span 11}.dynamic-form .grid>div.col-xs-12{grid-column:span 12}}@media (min-width: 576px){.dynamic-form .grid>div.col-sm-1{grid-column:span 1}.dynamic-form .grid>div.col-sm-2{grid-column:span 2}.dynamic-form .grid>div.col-sm-3{grid-column:span 3}.dynamic-form .grid>div.col-sm-4{grid-column:span 4}.dynamic-form .grid>div.col-sm-5{grid-column:span 5}.dynamic-form .grid>div.col-sm-6{grid-column:span 6}.dynamic-form .grid>div.col-sm-7{grid-column:span 7}.dynamic-form .grid>div.col-sm-8{grid-column:span 8}.dynamic-form .grid>div.col-sm-9{grid-column:span 9}.dynamic-form .grid>div.col-sm-10{grid-column:span 10}.dynamic-form .grid>div.col-sm-11{grid-column:span 11}.dynamic-form .grid>div.col-sm-12{grid-column:span 12}}@media (min-width: 768px){.dynamic-form .grid>div.col-md-1{grid-column:span 1}.dynamic-form .grid>div.col-md-2{grid-column:span 2}.dynamic-form .grid>div.col-md-3{grid-column:span 3}.dynamic-form .grid>div.col-md-4{grid-column:span 4}.dynamic-form .grid>div.col-md-5{grid-column:span 5}.dynamic-form .grid>div.col-md-6{grid-column:span 6}.dynamic-form .grid>div.col-md-7{grid-column:span 7}.dynamic-form .grid>div.col-md-8{grid-column:span 8}.dynamic-form .grid>div.col-md-9{grid-column:span 9}.dynamic-form .grid>div.col-md-10{grid-column:span 10}.dynamic-form .grid>div.col-md-11{grid-column:span 11}.dynamic-form .grid>div.col-md-12{grid-column:span 12}}@media (min-width: 992px){.dynamic-form .grid>div.col-lg-1{grid-column:span 1}.dynamic-form .grid>div.col-lg-2{grid-column:span 2}.dynamic-form .grid>div.col-lg-3{grid-column:span 3}.dynamic-form .grid>div.col-lg-4{grid-column:span 4}.dynamic-form .grid>div.col-lg-5{grid-column:span 5}.dynamic-form .grid>div.col-lg-6{grid-column:span 6}.dynamic-form .grid>div.col-lg-7{grid-column:span 7}.dynamic-form .grid>div.col-lg-8{grid-column:span 8}.dynamic-form .grid>div.col-lg-9{grid-column:span 9}.dynamic-form .grid>div.col-lg-10{grid-column:span 10}.dynamic-form .grid>div.col-lg-11{grid-column:span 11}.dynamic-form .grid>div.col-lg-12{grid-column:span 12}}@media (min-width: 1200px){.dynamic-form .grid>div.col-xl-1{grid-column:span 1}.dynamic-form .grid>div.col-xl-2{grid-column:span 2}.dynamic-form .grid>div.col-xl-3{grid-column:span 3}.dynamic-form .grid>div.col-xl-4{grid-column:span 4}.dynamic-form .grid>div.col-xl-5{grid-column:span 5}.dynamic-form .grid>div.col-xl-6{grid-column:span 6}.dynamic-form .grid>div.col-xl-7{grid-column:span 7}.dynamic-form .grid>div.col-xl-8{grid-column:span 8}.dynamic-form .grid>div.col-xl-9{grid-column:span 9}.dynamic-form .grid>div.col-xl-10{grid-column:span 10}.dynamic-form .grid>div.col-xl-11{grid-column:span 11}.dynamic-form .grid>div.col-xl-12{grid-column:span 12}}.dynamic-form .sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header{background-color:var(--surface-50);border-color:var(--surface-200)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header{display:flex;align-items:center;gap:.5rem;width:100%}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-icon{font-size:1.1rem;color:var(--primary-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-header .section-header .section-title{font-weight:600;color:var(--text-color)}.dynamic-form .sections-container ::ng-deep .section-panel .p-panel-content{padding:1.5rem}.dynamic-form .fixed-filters-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-200)}.dynamic-form .filter-sections-container{display:flex;flex-direction:column;gap:1rem;margin-top:1rem}.dynamic-form .form-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--surface-200)}.dialog-footer{display:flex;justify-content:flex-end;gap:.5rem}.drawer-footer{display:flex;justify-content:flex-end;gap:.5rem;padding:1rem;border-top:1px solid var(--surface-200)}.inline-edit-fields{display:flex;flex-direction:column;gap:1rem}.inline-edit-fields .inline-edit-field{display:flex;flex-direction:column;gap:.25rem}.inline-edit-fields .inline-edit-field .field-label{font-weight:500;font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.25rem}.inline-edit-fields .inline-edit-field .field-display{display:flex;align-items:center;justify-content:space-between;padding:.75rem;background-color:var(--surface-50);border:1px solid var(--surface-200);border-radius:var(--border-radius);cursor:pointer;transition:all .2s ease;min-height:42px}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled){background-color:var(--surface-100);border-color:var(--primary-color)}.inline-edit-fields .inline-edit-field .field-display:hover:not(.disabled) .edit-icon{opacity:1}.inline-edit-fields .inline-edit-field .field-display.disabled{cursor:not-allowed;opacity:.6}.inline-edit-fields .inline-edit-field .field-display .display-value{flex:1;color:var(--text-color)}.inline-edit-fields .inline-edit-field .field-display .display-value:empty:before{content:attr(data-placeholder);color:var(--text-color-secondary);font-style:italic}.inline-edit-fields .inline-edit-field .field-display .edit-icon{color:var(--primary-color);font-size:.875rem;opacity:.5;transition:opacity .2s ease}.inline-edit-fields .inline-edit-field .field-edit{display:flex;flex-direction:column;gap:.5rem}.inline-edit-fields .inline-edit-field .field-edit .input-container{flex:1}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field{gap:0}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field label{display:none}.inline-edit-fields .inline-edit-field .field-edit .input-container ::ng-deep .field small.p-error{display:none}.inline-edit-fields .inline-edit-field .field-edit .edit-actions{display:flex;gap:.5rem;justify-content:flex-end}.inline-edit-fields .inline-edit-field .field-edit .field-error small.p-error{color:var(--p-red-500);font-size:.875rem}\n"] }]
|
|
4715
5165
|
}], ctorParameters: () => [{ type: i3.FormBuilder }, { type: TranslationService }, { type: MaskService }, { type: LocaleService }], propDecorators: { formFields: [{
|
|
4716
5166
|
type: Input
|
|
4717
5167
|
}], formSections: [{
|
|
@@ -5071,6 +5521,169 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
5071
5521
|
args: ['blur', ['$event']]
|
|
5072
5522
|
}] } });
|
|
5073
5523
|
|
|
5524
|
+
/**
|
|
5525
|
+
* Directive that replaces PrimeNG p-table's default loading spinner
|
|
5526
|
+
* with the sia-loading component injected as a table row in the tbody.
|
|
5527
|
+
*
|
|
5528
|
+
* Usage:
|
|
5529
|
+
* <p-table [loading]="loading" siaTableLoading>
|
|
5530
|
+
*/
|
|
5531
|
+
class TableLoadingDirective {
|
|
5532
|
+
el;
|
|
5533
|
+
renderer;
|
|
5534
|
+
vcr;
|
|
5535
|
+
loading = false;
|
|
5536
|
+
siaLoadingVariant = 'senior-reveal';
|
|
5537
|
+
siaLoadingColor = 'senior';
|
|
5538
|
+
siaLoadingSize = 36;
|
|
5539
|
+
loadingRow = null;
|
|
5540
|
+
loadingRef = null;
|
|
5541
|
+
observer = null;
|
|
5542
|
+
styleEl = null;
|
|
5543
|
+
constructor(el, renderer, vcr) {
|
|
5544
|
+
this.el = el;
|
|
5545
|
+
this.renderer = renderer;
|
|
5546
|
+
this.vcr = vcr;
|
|
5547
|
+
}
|
|
5548
|
+
ngAfterViewInit() {
|
|
5549
|
+
this.injectHideStyles();
|
|
5550
|
+
this.setupObserver();
|
|
5551
|
+
if (this.loading) {
|
|
5552
|
+
this.showLoading();
|
|
5553
|
+
}
|
|
5554
|
+
}
|
|
5555
|
+
ngOnChanges(changes) {
|
|
5556
|
+
if (changes['loading'] && !changes['loading'].firstChange) {
|
|
5557
|
+
if (this.loading) {
|
|
5558
|
+
this.showLoading();
|
|
5559
|
+
}
|
|
5560
|
+
else {
|
|
5561
|
+
this.removeLoading();
|
|
5562
|
+
}
|
|
5563
|
+
}
|
|
5564
|
+
if (this.loadingRef) {
|
|
5565
|
+
if (changes['siaLoadingVariant'])
|
|
5566
|
+
this.loadingRef.instance.variant = this.siaLoadingVariant;
|
|
5567
|
+
if (changes['siaLoadingColor'])
|
|
5568
|
+
this.loadingRef.instance.color = this.siaLoadingColor;
|
|
5569
|
+
if (changes['siaLoadingSize'])
|
|
5570
|
+
this.loadingRef.instance.size = this.siaLoadingSize;
|
|
5571
|
+
}
|
|
5572
|
+
}
|
|
5573
|
+
ngOnDestroy() {
|
|
5574
|
+
this.removeLoading();
|
|
5575
|
+
this.observer?.disconnect();
|
|
5576
|
+
this.observer = null;
|
|
5577
|
+
this.styleEl?.remove();
|
|
5578
|
+
this.styleEl = null;
|
|
5579
|
+
}
|
|
5580
|
+
injectHideStyles() {
|
|
5581
|
+
const host = this.el.nativeElement;
|
|
5582
|
+
this.styleEl = this.renderer.createElement('style');
|
|
5583
|
+
this.styleEl.textContent = `
|
|
5584
|
+
.p-datatable-loading-overlay,
|
|
5585
|
+
.p-datatable-mask {
|
|
5586
|
+
display: none !important;
|
|
5587
|
+
}
|
|
5588
|
+
`;
|
|
5589
|
+
this.renderer.appendChild(host, this.styleEl);
|
|
5590
|
+
}
|
|
5591
|
+
setupObserver() {
|
|
5592
|
+
const host = this.el.nativeElement;
|
|
5593
|
+
this.observer = new MutationObserver((mutations) => {
|
|
5594
|
+
for (const m of mutations) {
|
|
5595
|
+
m.addedNodes.forEach((node) => {
|
|
5596
|
+
if (node instanceof HTMLElement) {
|
|
5597
|
+
if (node.classList.contains('p-datatable-loading-overlay') ||
|
|
5598
|
+
node.classList.contains('p-datatable-mask')) {
|
|
5599
|
+
node.style.display = 'none';
|
|
5600
|
+
}
|
|
5601
|
+
}
|
|
5602
|
+
});
|
|
5603
|
+
}
|
|
5604
|
+
});
|
|
5605
|
+
this.observer.observe(host, { childList: true, subtree: true });
|
|
5606
|
+
}
|
|
5607
|
+
showLoading() {
|
|
5608
|
+
if (this.loadingRow)
|
|
5609
|
+
return;
|
|
5610
|
+
const host = this.el.nativeElement;
|
|
5611
|
+
const tbody = host.querySelector('tbody');
|
|
5612
|
+
if (!tbody)
|
|
5613
|
+
return;
|
|
5614
|
+
// Hide existing data rows
|
|
5615
|
+
const existingRows = tbody.querySelectorAll('tr');
|
|
5616
|
+
existingRows.forEach((row) => {
|
|
5617
|
+
this.renderer.setStyle(row, 'display', 'none');
|
|
5618
|
+
});
|
|
5619
|
+
// Count columns from thead
|
|
5620
|
+
const colCount = this.getColumnCount(host);
|
|
5621
|
+
// Create <tr>
|
|
5622
|
+
this.loadingRow = this.renderer.createElement('tr');
|
|
5623
|
+
this.renderer.addClass(this.loadingRow, 'sia-table-loading-row');
|
|
5624
|
+
// Create <td colspan="N">
|
|
5625
|
+
const td = this.renderer.createElement('td');
|
|
5626
|
+
this.renderer.setAttribute(td, 'colspan', String(colCount || 99));
|
|
5627
|
+
this.renderer.setStyle(td, 'text-align', 'center');
|
|
5628
|
+
this.renderer.setStyle(td, 'padding', '2rem 0');
|
|
5629
|
+
this.renderer.setStyle(td, 'border', 'none');
|
|
5630
|
+
// Create LoadingComponent
|
|
5631
|
+
this.loadingRef = this.vcr.createComponent(LoadingComponent);
|
|
5632
|
+
this.loadingRef.instance.variant = this.siaLoadingVariant;
|
|
5633
|
+
this.loadingRef.instance.color = this.siaLoadingColor;
|
|
5634
|
+
this.loadingRef.instance.size = this.siaLoadingSize;
|
|
5635
|
+
this.loadingRef.instance.padding = '0';
|
|
5636
|
+
const loadingEl = this.loadingRef.location.nativeElement;
|
|
5637
|
+
this.renderer.appendChild(td, loadingEl);
|
|
5638
|
+
this.renderer.appendChild(this.loadingRow, td);
|
|
5639
|
+
this.renderer.appendChild(tbody, this.loadingRow);
|
|
5640
|
+
}
|
|
5641
|
+
removeLoading() {
|
|
5642
|
+
const host = this.el.nativeElement;
|
|
5643
|
+
const tbody = host.querySelector('tbody');
|
|
5644
|
+
// Remove loading row
|
|
5645
|
+
if (this.loadingRow?.parentNode) {
|
|
5646
|
+
this.renderer.removeChild(this.loadingRow.parentNode, this.loadingRow);
|
|
5647
|
+
}
|
|
5648
|
+
this.loadingRow = null;
|
|
5649
|
+
if (this.loadingRef) {
|
|
5650
|
+
this.loadingRef.destroy();
|
|
5651
|
+
this.loadingRef = null;
|
|
5652
|
+
}
|
|
5653
|
+
// Restore hidden data rows
|
|
5654
|
+
if (tbody) {
|
|
5655
|
+
const rows = tbody.querySelectorAll('tr');
|
|
5656
|
+
rows.forEach((row) => {
|
|
5657
|
+
this.renderer.removeStyle(row, 'display');
|
|
5658
|
+
});
|
|
5659
|
+
}
|
|
5660
|
+
}
|
|
5661
|
+
getColumnCount(host) {
|
|
5662
|
+
const headerRow = host.querySelector('thead tr');
|
|
5663
|
+
if (headerRow) {
|
|
5664
|
+
return headerRow.querySelectorAll('th').length;
|
|
5665
|
+
}
|
|
5666
|
+
return 99;
|
|
5667
|
+
}
|
|
5668
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableLoadingDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
5669
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: TableLoadingDirective, isStandalone: true, selector: "p-table[siaTableLoading]", inputs: { loading: "loading", siaLoadingVariant: "siaLoadingVariant", siaLoadingColor: "siaLoadingColor", siaLoadingSize: "siaLoadingSize" }, usesOnChanges: true, ngImport: i0 });
|
|
5670
|
+
}
|
|
5671
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableLoadingDirective, decorators: [{
|
|
5672
|
+
type: Directive,
|
|
5673
|
+
args: [{
|
|
5674
|
+
selector: 'p-table[siaTableLoading]',
|
|
5675
|
+
standalone: true,
|
|
5676
|
+
}]
|
|
5677
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }], propDecorators: { loading: [{
|
|
5678
|
+
type: Input
|
|
5679
|
+
}], siaLoadingVariant: [{
|
|
5680
|
+
type: Input
|
|
5681
|
+
}], siaLoadingColor: [{
|
|
5682
|
+
type: Input
|
|
5683
|
+
}], siaLoadingSize: [{
|
|
5684
|
+
type: Input
|
|
5685
|
+
}] } });
|
|
5686
|
+
|
|
5074
5687
|
class CpfPipe {
|
|
5075
5688
|
maskService;
|
|
5076
5689
|
constructor(maskService) {
|
|
@@ -5618,5 +6231,5 @@ const throttle = (func, limit) => {
|
|
|
5618
6231
|
* Generated bundle index. Do not edit.
|
|
5619
6232
|
*/
|
|
5620
6233
|
|
|
5621
|
-
export { AngularComponentsModule, AuthService, BreadcrumbComponent, BulkDeleteDialogComponent, CnpjPipe, CookieService, CpfPipe, DEFAULT_LANGUAGE, DateFormatPipe, DocumentMaskDirective, DocumentPipe, DynamicFieldDateComponent, DynamicFieldDropdownComponent, DynamicFieldLookupComponent, DynamicFieldNumberComponent, DynamicFieldTextComponent, DynamicFieldTextareaComponent, DynamicFieldWrapperComponent, DynamicFormComponent, EntityListBaseComponent, EntityService, ExportDialogComponent, FieldType, LocaleService, MaskService, MoneyMaskDirective, MoneyPipe, PermissionService, PhoneMaskDirective, PhonePipe, PostalCodeMaskDirective, PostalCodePipe, SUPPORTED_LANGUAGES, SeniorPreset, SeniorTokenService, TRANSLATION_CONFIG, ThemeService, TranslatePipe, TranslationHelper, TranslationService, apiInterceptor, createFilterString, createFilterTokens, debounce, deepClone, deepEqual, escapeFilterValue, getEnumQuery, getLabelValueRequest, getLanguageInfo, getProp, getSuggestionValue, getTypeInformation, isValidFilter, mapTokenLocaleToLanguage, mergeUnique, provideSeniorPrimeNG, resolveRefs, setProp, throttle };
|
|
6234
|
+
export { AngularComponentsModule, AuthService, BreadcrumbComponent, BulkDeleteDialogComponent, CnpjPipe, CookieService, CpfPipe, DEFAULT_LANGUAGE, DateFormatPipe, DocumentMaskDirective, DocumentPipe, DynamicFieldDateComponent, DynamicFieldDropdownComponent, DynamicFieldLookupComponent, DynamicFieldNumberComponent, DynamicFieldTextComponent, DynamicFieldTextareaComponent, DynamicFieldWrapperComponent, DynamicFormComponent, EntityListBaseComponent, EntityService, ExportDialogComponent, FieldType, LoadingComponent, LocaleService, MaskService, MoneyMaskDirective, MoneyPipe, PermissionService, PhoneMaskDirective, PhonePipe, PostalCodeMaskDirective, PostalCodePipe, SUPPORTED_LANGUAGES, SeniorPreset, SeniorTokenService, TRANSLATION_CONFIG, TableLoadingDirective, ThemeService, TranslatePipe, TranslationHelper, TranslationService, apiInterceptor, createFilterString, createFilterTokens, debounce, deepClone, deepEqual, escapeFilterValue, getEnumQuery, getLabelValueRequest, getLanguageInfo, getProp, getSuggestionValue, getTypeInformation, isValidFilter, mapTokenLocaleToLanguage, mergeUnique, provideSeniorPrimeNG, resolveRefs, setProp, throttle };
|
|
5622
6235
|
//# sourceMappingURL=seniorsistemas-components-ai.mjs.map
|