@elasticias/ui 0.0.10

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.
@@ -0,0 +1,1868 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { PipeTransform, OnInit, OnDestroy, OnChanges, TemplateRef, EventEmitter, SimpleChanges } from '@angular/core';
3
+ import { AppUtils } from '@elasticias/utils';
4
+ import { Menu } from 'primeng/menu';
5
+ import { ScreenContext } from '@elasticias/screens';
6
+ import { BlockableUI } from 'primeng/api';
7
+ import { ControlValueAccessor, NgControl } from '@angular/forms';
8
+ import { InputNumber, InputNumberInputEvent } from 'primeng/inputnumber';
9
+ import { Nullable } from 'primeng/ts-helpers';
10
+ import * as _elasticias_ui from '@elasticias/ui';
11
+ import { Table, TableLazyLoadEvent } from 'primeng/table';
12
+ import { PrimeNG } from 'primeng/config';
13
+ import { EfThemeConfigService } from '@elasticias/core';
14
+ import { EmailMetrics, EmailEventRecord, EmailEventKind } from '@elasticias/types';
15
+
16
+ /**
17
+ * Merged currency pipe from ERP (AppCurrencyPipe) and Store (CurrencyFormatPipe).
18
+ * Uses Intl.NumberFormat for formatting — no CurrencyPipe dependency needed.
19
+ * Default: MAD currency, fr-MA locale.
20
+ */
21
+ declare class EfCurrencyPipe implements PipeTransform {
22
+ transform(value: number | null | undefined, currency?: string, locale?: string): string;
23
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfCurrencyPipe, never>;
24
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<EfCurrencyPipe, "efCurrency", true>;
25
+ }
26
+
27
+ declare class TruncatePipe implements PipeTransform {
28
+ transform(value: string, maxLength?: number, suffix?: string): string;
29
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TruncatePipe, never>;
30
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<TruncatePipe, "truncate", true>;
31
+ }
32
+
33
+ declare class EfPriceDisplayComponent {
34
+ readonly amount: _angular_core.InputSignal<number>;
35
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfPriceDisplayComponent, never>;
36
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfPriceDisplayComponent, "ef-price-display", never, { "amount": { "alias": "amount"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
37
+ }
38
+
39
+ declare class EfQuantitySelectorComponent {
40
+ readonly quantity: _angular_core.InputSignal<number>;
41
+ readonly quantityChange: _angular_core.OutputEmitterRef<number>;
42
+ increment(): void;
43
+ decrement(): void;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfQuantitySelectorComponent, never>;
45
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfQuantitySelectorComponent, "ef-quantity-selector", never, { "quantity": { "alias": "quantity"; "required": false; "isSignal": true; }; }, { "quantityChange": "quantityChange"; }, never, never, true, never>;
46
+ }
47
+
48
+ /**
49
+ * Summary item for product count groups
50
+ */
51
+ interface OrderSummaryItem {
52
+ code: string;
53
+ label: string;
54
+ count: number;
55
+ column: number;
56
+ }
57
+ /**
58
+ * Order products summary grouped by countGroup
59
+ */
60
+ interface OrderProductsSummary {
61
+ items: OrderSummaryItem[];
62
+ totalCount: number;
63
+ }
64
+ /**
65
+ * Represents a line item in an order, invoice, or quote
66
+ */
67
+ interface OrderLineItem {
68
+ id?: string | number;
69
+ product?: Record<string, unknown>;
70
+ productId?: unknown;
71
+ variantId?: string | null;
72
+ countGroup?: string;
73
+ productDescription?: string;
74
+ productUnitPrice: number;
75
+ quantity: number;
76
+ discount: number;
77
+ grossAmount: number;
78
+ amount?: number;
79
+ taxeId?: number | null;
80
+ taxRate?: number;
81
+ taxAmount?: number;
82
+ position?: number;
83
+ isEditing?: boolean;
84
+ editingField?: string | null;
85
+ }
86
+ /**
87
+ * Standard order entity contract
88
+ */
89
+ interface OrderEntity {
90
+ id?: number;
91
+ documentNumber?: string;
92
+ documentType: 'order' | 'invoice' | 'quote';
93
+ status?: 'draft' | 'confirmed' | 'processing' | 'completed' | 'cancelled';
94
+ customerId?: string | null;
95
+ customerName?: string;
96
+ orderDate: Date;
97
+ deliveryDate?: Date | null;
98
+ dueDate?: Date | null;
99
+ orderLines: OrderLineItem[];
100
+ grossTotal: number;
101
+ discountTotal: number;
102
+ taxTotal: number;
103
+ finalTotal: number;
104
+ notes?: string;
105
+ internalNotes?: string;
106
+ paymentTerms?: string;
107
+ shippingAddress?: string;
108
+ billingAddress?: string;
109
+ productsSummary?: OrderProductsSummary;
110
+ }
111
+ /**
112
+ * Configuration for document types (order, invoice, quote)
113
+ */
114
+ interface DocumentConfig {
115
+ documentType: 'order' | 'invoice' | 'quote';
116
+ headerLabel: string;
117
+ dateLabel: string;
118
+ customerLabel: string;
119
+ enableTax?: boolean;
120
+ enableDiscount?: boolean;
121
+ showCatalogue?: boolean;
122
+ allowInlineEdit?: boolean;
123
+ enableQuickAdd?: boolean;
124
+ showNotes?: boolean;
125
+ showProductsSummary?: boolean;
126
+ currencyCode?: string;
127
+ locale?: string;
128
+ }
129
+ /**
130
+ * Change tracking metadata
131
+ */
132
+ interface OrderChangeInfo {
133
+ hasChanges: boolean;
134
+ lastModified: Date;
135
+ modifiedFields: Set<string>;
136
+ }
137
+ /**
138
+ * Validation result
139
+ */
140
+ interface ValidationResult {
141
+ isValid: boolean;
142
+ errors: {
143
+ [key: string]: string[];
144
+ };
145
+ warnings?: {
146
+ [key: string]: string[];
147
+ };
148
+ }
149
+ /**
150
+ * Helper functions for order line items
151
+ */
152
+ declare class OrderLineItemHelper {
153
+ /**
154
+ * Calculate subtotal for a line item (price * quantity - discount)
155
+ */
156
+ static calculateSubtotal(item: OrderLineItem): number;
157
+ /**
158
+ * Calculate tax amount for a line item
159
+ */
160
+ static calculateTaxAmount(item: OrderLineItem): number;
161
+ /**
162
+ * Calculate final amount including tax
163
+ */
164
+ static calculateFinalAmount(item: OrderLineItem): number;
165
+ /**
166
+ * Compose a line description from a product and (optionally) its variant.
167
+ * Variable product → "{displayName} ({variantTitle})"
168
+ * Simple product → displayName
169
+ * Mirrors the legacy PDF format `[PF] {ref} - {NAME} ({volume})` after
170
+ * the parent displayName has been cleaned of its baked-in volume suffix.
171
+ */
172
+ static composeDescription(product: Record<string, unknown> | null | undefined, variant?: Record<string, unknown>): string;
173
+ /**
174
+ * Create a new empty line item
175
+ */
176
+ static createEmptyItem(): OrderLineItem;
177
+ /**
178
+ * Create a line item from product selection
179
+ * @param keyField - Field name used to identify the product (default: 'id')
180
+ */
181
+ static createFromProduct(product: Record<string, unknown>, quantity?: number, keyField?: string, variantId?: string): OrderLineItem;
182
+ /**
183
+ * Update calculations for an existing line item
184
+ */
185
+ static updateCalculations(item: OrderLineItem): OrderLineItem;
186
+ /**
187
+ * Validate a line item
188
+ */
189
+ static validate(item: OrderLineItem): ValidationResult;
190
+ /**
191
+ * Compare two line items for equality
192
+ */
193
+ static areEqual(item1: OrderLineItem, item2: OrderLineItem): boolean;
194
+ }
195
+ /**
196
+ * Helper functions for order entity
197
+ */
198
+ declare class OrderEntityHelper {
199
+ /**
200
+ * Create a new empty order entity
201
+ */
202
+ static createEmpty(documentType?: 'order' | 'invoice' | 'quote'): OrderEntity;
203
+ /**
204
+ * Calculate all totals for an order
205
+ */
206
+ static calculateTotals(order: OrderEntity): OrderEntity;
207
+ /**
208
+ * Validate order entity
209
+ */
210
+ static validate(order: OrderEntity): ValidationResult;
211
+ /**
212
+ * Clone order entity for immutability
213
+ */
214
+ static clone(order: OrderEntity): OrderEntity;
215
+ /**
216
+ * Compare two orders for changes
217
+ */
218
+ static detectChanges(original: OrderEntity, current: OrderEntity): OrderChangeInfo;
219
+ }
220
+
221
+ /**
222
+ * Product count group entry for displaying grouped counts
223
+ */
224
+ interface ProductCountGroup {
225
+ code: string;
226
+ label: string;
227
+ count: number;
228
+ column: number;
229
+ }
230
+ /**
231
+ * Reference data item for product count group labels
232
+ */
233
+ interface ProductCountGroupLabel {
234
+ code: string;
235
+ label: string;
236
+ description?: string;
237
+ isActive?: boolean;
238
+ sortOrder?: number;
239
+ column?: number;
240
+ metadata?: Record<string, unknown>;
241
+ }
242
+ /**
243
+ * Product with countGroup field
244
+ */
245
+ interface ProductWithCountGroup {
246
+ countGroup?: string;
247
+ [key: string]: unknown;
248
+ }
249
+ /**
250
+ * Displays a summary of product quantities grouped by their countGroup field.
251
+ * Maps countGroup codes to labels from product_count_group_labels reference data.
252
+ *
253
+ * @example
254
+ * <ef-order-summary
255
+ * [orderLines]="orderLines()"
256
+ * [countGroupLabels]="countGroupLabels"
257
+ * />
258
+ */
259
+ declare class EfOrderSummaryComponent {
260
+ /**
261
+ * Order line items to summarize
262
+ */
263
+ orderLines: _angular_core.InputSignal<OrderLineItem[]>;
264
+ /**
265
+ * Product count group labels from reference data
266
+ */
267
+ countGroupLabels: _angular_core.InputSignal<ProductCountGroupLabel[]>;
268
+ /**
269
+ * Legend text for the fieldset
270
+ */
271
+ legend: _angular_core.InputSignal<string>;
272
+ /**
273
+ * Computed grouped counts by countGroup
274
+ */
275
+ groupedCounts: _angular_core.Signal<ProductCountGroup[]>;
276
+ /**
277
+ * Total quantity across all groups
278
+ */
279
+ totalCount: _angular_core.Signal<number>;
280
+ /**
281
+ * Split groups into columns based on column field from reference data
282
+ */
283
+ columnGroups: _angular_core.Signal<ProductCountGroup[][]>;
284
+ /**
285
+ * Check if there are any groups to display
286
+ */
287
+ hasGroups: _angular_core.Signal<boolean>;
288
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfOrderSummaryComponent, never>;
289
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfOrderSummaryComponent, "ef-order-summary", never, { "orderLines": { "alias": "orderLines"; "required": true; "isSignal": true; }; "countGroupLabels": { "alias": "countGroupLabels"; "required": false; "isSignal": true; }; "legend": { "alias": "legend"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
290
+ }
291
+
292
+ /**
293
+ * Reusable order builder component for orders, invoices, and quotes
294
+ * Manages complete order entity with automatic change tracking
295
+ *
296
+ * @example
297
+ * <ef-order-builder
298
+ * [(order)]="orderEntity"
299
+ * [config]="documentConfig"
300
+ * [products]="products"
301
+ * [customers]="customers"
302
+ * (openCatalogue)="handleCatalogueOpen()"
303
+ * (orderChanged)="handleOrderChange($event)"
304
+ * />
305
+ */
306
+ declare class EfOrderBuilderComponent implements OnInit, OnDestroy {
307
+ rowTrackBy: (_: number, item: OrderLineItem) => string | number;
308
+ protected readonly AppUtils: typeof AppUtils;
309
+ config: _angular_core.InputSignal<DocumentConfig>;
310
+ order: _angular_core.ModelSignal<OrderEntity>;
311
+ products: _angular_core.InputSignal<Record<string, unknown>[]>;
312
+ customers: _angular_core.InputSignal<Record<string, unknown>[]>;
313
+ readonly: _angular_core.InputSignal<boolean>;
314
+ countGroupLabels: _angular_core.InputSignal<ProductCountGroupLabel[]>;
315
+ /** Field name used to identify products (must match catalogue's trackByField) */
316
+ productKeyField: _angular_core.InputSignal<string>;
317
+ backendErrors: _angular_core.InputSignal<{
318
+ [key: string]: string[];
319
+ }>;
320
+ openCatalogue: _angular_core.OutputEmitterRef<void>;
321
+ orderChanged: _angular_core.OutputEmitterRef<OrderChangeInfo>;
322
+ orderValidated: _angular_core.OutputEmitterRef<ValidationResult>;
323
+ productsAdded: _angular_core.OutputEmitterRef<OrderLineItem[]>;
324
+ private originalOrder;
325
+ private updateTimeout;
326
+ private initialized;
327
+ quickAddProduct: _angular_core.WritableSignal<Record<string, unknown>>;
328
+ quickAddPrice: _angular_core.WritableSignal<number>;
329
+ quickAddQuantity: _angular_core.WritableSignal<number>;
330
+ quickAddDisabled: _angular_core.Signal<boolean>;
331
+ orderLines: _angular_core.Signal<OrderLineItem[]>;
332
+ /**
333
+ * Flatten products → one option per active variant for the inline ef-select.
334
+ * Simple products (no variants) get a single row with the product label.
335
+ * Each option exposes `_displayLabel` for `optionLabel` and carries the
336
+ * underlying product/variant references for `onProductSelect`.
337
+ */
338
+ flattenedProductOptions: _angular_core.Signal<Record<string, unknown>[]>;
339
+ grossTotal: _angular_core.Signal<number>;
340
+ discountTotal: _angular_core.Signal<number>;
341
+ tvaTotal: _angular_core.Signal<number>;
342
+ finalTotal: _angular_core.Signal<number>;
343
+ currency: _angular_core.Signal<string>;
344
+ locale: _angular_core.Signal<string>;
345
+ hasItems: _angular_core.Signal<boolean>;
346
+ productsSummary: _angular_core.Signal<OrderProductsSummary>;
347
+ hasEditingRow: _angular_core.Signal<boolean>;
348
+ validationResult: _angular_core.Signal<ValidationResult>;
349
+ combinedErrors: _angular_core.Signal<{
350
+ [x: string]: string[];
351
+ }>;
352
+ hasErrors: _angular_core.Signal<boolean>;
353
+ isValid: _angular_core.Signal<boolean>;
354
+ changeInfo: _angular_core.Signal<OrderChangeInfo>;
355
+ hasChanges: _angular_core.Signal<boolean>;
356
+ constructor();
357
+ ngOnInit(): void;
358
+ ngOnDestroy(): void;
359
+ addNewProductRow(): void;
360
+ removeOrderLine(id: number | undefined): void;
361
+ onProductSelect(item: OrderLineItem): void;
362
+ startEditField(item: OrderLineItem, fieldName: string): void;
363
+ stopEditField(item: OrderLineItem): void;
364
+ onFieldChange(item: OrderLineItem): void;
365
+ saveEditingRow(item: OrderLineItem): void;
366
+ calculateSubtotal(item: OrderLineItem): number;
367
+ handleOpenCatalogue(): void;
368
+ onQuickAddProductSelect(option: Record<string, unknown> | null): void;
369
+ addQuickProduct(): void;
370
+ addProductsFromCatalogue(selectedProducts: Array<{
371
+ product: Record<string, unknown>;
372
+ quantity: number;
373
+ variantId?: string;
374
+ }>): void;
375
+ updateCustomer(customerId: string | null): void;
376
+ updateOrderDate(date: Date): void;
377
+ updateDeliveryDate(date: Date | null): void;
378
+ updateNotes(notes: string): void;
379
+ resetChanges(): void;
380
+ markAsSaved(): void;
381
+ validate(): ValidationResult;
382
+ private updateOrderLines;
383
+ private getCustomerName;
384
+ private productKey;
385
+ getProduct(productId: unknown): Record<string, unknown> | undefined;
386
+ getCustomer(customerId: string): Record<string, unknown> | undefined;
387
+ initializeOrderLines(): void;
388
+ getTotals(): {
389
+ grossTotal: number;
390
+ discountTotal: number;
391
+ tvaTotal: number;
392
+ finalTotal: number;
393
+ };
394
+ exportOrder(): OrderEntity;
395
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfOrderBuilderComponent, never>;
396
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfOrderBuilderComponent, "ef-order-builder", never, { "config": { "alias": "config"; "required": false; "isSignal": true; }; "order": { "alias": "order"; "required": true; "isSignal": true; }; "products": { "alias": "products"; "required": true; "isSignal": true; }; "customers": { "alias": "customers"; "required": true; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "countGroupLabels": { "alias": "countGroupLabels"; "required": false; "isSignal": true; }; "productKeyField": { "alias": "productKeyField"; "required": false; "isSignal": true; }; "backendErrors": { "alias": "backendErrors"; "required": false; "isSignal": true; }; }, { "order": "orderChange"; "openCatalogue": "openCatalogue"; "orderChanged": "orderChanged"; "orderValidated": "orderValidated"; "productsAdded": "productsAdded"; }, never, never, true, never>;
397
+ }
398
+
399
+ interface CategoryItem {
400
+ code: string;
401
+ label: string;
402
+ description?: string | null;
403
+ isActive: boolean;
404
+ sortOrder: number;
405
+ metadata?: Record<string, unknown> | null;
406
+ children?: CategoryItem[];
407
+ }
408
+ interface CategoryGroup {
409
+ code: string;
410
+ label: string;
411
+ description?: string | null;
412
+ isActive: boolean;
413
+ sortOrder: number;
414
+ metadata?: Record<string, unknown> | null;
415
+ children?: CategoryItem[];
416
+ }
417
+ interface CategoryAssignment {
418
+ type: string;
419
+ code: string;
420
+ }
421
+ interface SelectedFilter {
422
+ type: string;
423
+ code: string;
424
+ label: string;
425
+ }
426
+ declare class EfProductCatalogueFilterComponent {
427
+ /** Category groups from reference_data (product_categories items with children) */
428
+ categoryGroups: _angular_core.InputSignal<CategoryGroup[]>;
429
+ /** Products to calculate counts */
430
+ products: _angular_core.InputSignal<{
431
+ categoryAssignments?: CategoryAssignment[];
432
+ }[]>;
433
+ /** Selected filters (two-way binding) */
434
+ selectedFilters: _angular_core.ModelSignal<SelectedFilter[]>;
435
+ /** Emitted when filters change */
436
+ filtersChanged: _angular_core.OutputEmitterRef<SelectedFilter[]>;
437
+ /** Search terms for each category group */
438
+ searchTerms: _angular_core.WritableSignal<Record<string, string>>;
439
+ /** Accordion panel values (expanded panels) */
440
+ expandedPanels: _angular_core.Signal<string[]>;
441
+ /** Get filtered children for a category group based on search */
442
+ getFilteredChildren(group: CategoryGroup): CategoryItem[];
443
+ /** Get product count for a specific category item */
444
+ getItemCount(groupCode: string, itemCode: string): number;
445
+ /** Check if a filter is selected */
446
+ isFilterSelected(groupCode: string, itemCode: string): boolean;
447
+ /** Toggle a filter selection */
448
+ toggleFilter(group: CategoryGroup, item: CategoryItem): void;
449
+ /** Remove a specific filter */
450
+ removeFilter(filter: SelectedFilter): void;
451
+ /** Clear all filters */
452
+ clearAllFilters(): void;
453
+ /** Update search term for a category group */
454
+ updateSearchTerm(groupCode: string, term: string): void;
455
+ /** Get color class from metadata if available */
456
+ getColorClass(item: CategoryItem): string | null;
457
+ /** Check if group should show search input (more than 5 items) */
458
+ shouldShowSearch(group: CategoryGroup): boolean;
459
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfProductCatalogueFilterComponent, never>;
460
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfProductCatalogueFilterComponent, "ef-product-catalogue-filter", never, { "categoryGroups": { "alias": "categoryGroups"; "required": true; "isSignal": true; }; "products": { "alias": "products"; "required": true; "isSignal": true; }; "selectedFilters": { "alias": "selectedFilters"; "required": false; "isSignal": true; }; }, { "selectedFilters": "selectedFiltersChange"; "filtersChanged": "filtersChanged"; }, never, never, true, never>;
461
+ }
462
+
463
+ interface CatalogueProductVariant {
464
+ variantId: string;
465
+ title: string;
466
+ sku?: string | null;
467
+ price: number;
468
+ compareAtPrice?: number | null;
469
+ optionValues?: Record<string, string>;
470
+ isActive?: boolean;
471
+ countGroup?: string | null;
472
+ [key: string]: unknown;
473
+ }
474
+ interface CatalogueProduct {
475
+ id: number;
476
+ productCode: string;
477
+ name: string;
478
+ displayName: string;
479
+ unitPrice?: number | null;
480
+ packagingVolume?: number | null;
481
+ categoryAssignments?: CategoryAssignment[];
482
+ productType?: string | null;
483
+ variants?: CatalogueProductVariant[];
484
+ defaultVariantId?: string | null;
485
+ [key: string]: unknown;
486
+ }
487
+ declare class EfProductCatalogueComponent implements OnChanges {
488
+ private readonly locale;
489
+ private readonly currencyPipe;
490
+ /** Products to display */
491
+ products: _angular_core.InputSignal<CatalogueProduct[]>;
492
+ /** Category groups for filtering */
493
+ categoryGroups: _angular_core.InputSignal<CategoryGroup[]>;
494
+ /** Initial selected items (for editing existing orders) */
495
+ initialSelectedItems: _angular_core.InputSignal<{
496
+ productId?: unknown;
497
+ quantity: number;
498
+ variantId?: string | null;
499
+ }[]>;
500
+ /** Default filters to apply on init */
501
+ defaultFilters: _angular_core.InputSignal<SelectedFilter[]>;
502
+ /** Property name used as unique key for tracking products in the list */
503
+ trackByField: _angular_core.InputSignal<string>;
504
+ /** Currency code for price formatting */
505
+ currencyCode: _angular_core.InputSignal<string>;
506
+ /** Locale used for number/currency formatting and the quantity stepper */
507
+ localeCode: _angular_core.InputSignal<string>;
508
+ /**
509
+ * Custom product thumbnail template.
510
+ * Context: { $implicit: CatalogueProduct }
511
+ *
512
+ * @example
513
+ * <ef-product-catalogue [products]="products()">
514
+ * <ng-template #productThumbnail let-product>
515
+ * <my-custom-thumbnail [product]="product" />
516
+ * </ng-template>
517
+ * </ef-product-catalogue>
518
+ */
519
+ productThumbnailTpl: _angular_core.Signal<TemplateRef<unknown>>;
520
+ sortMenu: Menu;
521
+ /** Emitted when products are validated */
522
+ productsValidated: _angular_core.OutputEmitterRef<{
523
+ product: CatalogueProduct;
524
+ quantity: number;
525
+ variantId?: string;
526
+ }[]>;
527
+ productSearch: _angular_core.WritableSignal<string>;
528
+ selectedFilters: _angular_core.WritableSignal<SelectedFilter[]>;
529
+ selectedSort: _angular_core.WritableSignal<string>;
530
+ selectedProducts: _angular_core.WritableSignal<{
531
+ product: CatalogueProduct;
532
+ quantity: number;
533
+ variantId?: string;
534
+ }[]>;
535
+ /** Tracks the currently selected variantId per product key */
536
+ selectedVariants: _angular_core.WritableSignal<Record<string, string>>;
537
+ filteredProducts: _angular_core.Signal<CatalogueProduct[]>;
538
+ sortOptions: {
539
+ label: string;
540
+ icon: string;
541
+ command: () => void;
542
+ }[];
543
+ onFiltersChanged(filters: SelectedFilter[]): void;
544
+ ngOnChanges(): void;
545
+ productKey(product: CatalogueProduct): unknown;
546
+ private initializeSelectedProducts;
547
+ private initializeDefaultFilters;
548
+ toggleSortMenu(event: Event): void;
549
+ /** Composite key for tracking product+variant selections */
550
+ private selectionKey;
551
+ /** Get the selected variantId for a product, or its defaultVariantId */
552
+ getSelectedVariantId(product: CatalogueProduct): string | undefined;
553
+ /** Set the selected variant for a product */
554
+ setSelectedVariant(product: CatalogueProduct, variantId: string): void;
555
+ /** Check if product is a VARIABLE product with variants */
556
+ isVariableProduct(product: CatalogueProduct): boolean;
557
+ /** Get active variants for a product */
558
+ getActiveVariants(product: CatalogueProduct): CatalogueProductVariant[];
559
+ /** Get total quantity for a product across all its variants */
560
+ getProductQuantity(product: CatalogueProduct): number;
561
+ /** Get quantity for a specific product+variant combination */
562
+ getVariantQuantity(product: CatalogueProduct, variantId: string): number;
563
+ addProduct(product: CatalogueProduct): void;
564
+ removeProduct(product: CatalogueProduct): void;
565
+ removeVariantSelection(product: CatalogueProduct, variantId: string): void;
566
+ updateProductQuantity(product: CatalogueProduct, quantity: number): void;
567
+ updateVariantQuantity(product: CatalogueProduct, variantId: string, quantity: number): void;
568
+ validateSelection(): void;
569
+ getPackagingLabel(product: CatalogueProduct): string;
570
+ getVariantTitle(product: CatalogueProduct, variantId: string): string;
571
+ trackKey(product: CatalogueProduct): unknown;
572
+ formatPrice(product: CatalogueProduct): string;
573
+ formatVariantPrice(variant: CatalogueProductVariant): string;
574
+ private formatCurrency;
575
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfProductCatalogueComponent, never>;
576
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfProductCatalogueComponent, "ef-product-catalogue", never, { "products": { "alias": "products"; "required": false; "isSignal": true; }; "categoryGroups": { "alias": "categoryGroups"; "required": false; "isSignal": true; }; "initialSelectedItems": { "alias": "initialSelectedItems"; "required": false; "isSignal": true; }; "defaultFilters": { "alias": "defaultFilters"; "required": false; "isSignal": true; }; "trackByField": { "alias": "trackByField"; "required": false; "isSignal": true; }; "currencyCode": { "alias": "currencyCode"; "required": false; "isSignal": true; }; "localeCode": { "alias": "localeCode"; "required": false; "isSignal": true; }; }, { "productsValidated": "productsValidated"; }, ["productThumbnailTpl"], never, true, never>;
577
+ }
578
+
579
+ declare class EfDialogComponent {
580
+ /** Direct header text (not translated) */
581
+ header?: string;
582
+ /** Translation key — takes priority over header */
583
+ headerKey?: string;
584
+ visible: boolean;
585
+ modal: boolean;
586
+ closable: boolean;
587
+ draggable: boolean;
588
+ resizable: boolean;
589
+ style?: {
590
+ [key: string]: string;
591
+ };
592
+ styleClass?: string;
593
+ position: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'topleft' | 'topright' | 'bottomleft' | 'bottomright';
594
+ appendTo?: string;
595
+ /**
596
+ * Render a standard cancel + save action footer. Caller wires (saveAction)
597
+ * and (cancelAction). When false (default), the footer falls back to the
598
+ * `[dialogFooter]` projection slot for fully custom footers.
599
+ */
600
+ defaultActions: boolean;
601
+ saveLabelKey: string;
602
+ cancelLabelKey: string;
603
+ saveLabel?: string;
604
+ cancelLabel?: string;
605
+ saveIcon: string;
606
+ saveDisabled: boolean;
607
+ saveStyleClass: string;
608
+ cancelStyleClass: string;
609
+ visibleChange: EventEmitter<boolean>;
610
+ showEvent: EventEmitter<void>;
611
+ hideEvent: EventEmitter<void>;
612
+ saveAction: EventEmitter<void>;
613
+ cancelAction: EventEmitter<void>;
614
+ defaultFooterTpl?: TemplateRef<void>;
615
+ handleVisibleChange(value: boolean): void;
616
+ handleShow(): void;
617
+ handleHide(): void;
618
+ /**
619
+ * Default cancel handler — emits and also closes the dialog. Callers can
620
+ * override behavior via (cancelAction) (close still happens).
621
+ */
622
+ onDefaultCancel(): void;
623
+ onDefaultSave(): void;
624
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDialogComponent, never>;
625
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDialogComponent, "ef-dialog", never, { "header": { "alias": "header"; "required": false; }; "headerKey": { "alias": "headerKey"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; "modal": { "alias": "modal"; "required": false; }; "closable": { "alias": "closable"; "required": false; }; "draggable": { "alias": "draggable"; "required": false; }; "resizable": { "alias": "resizable"; "required": false; }; "style": { "alias": "style"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "position": { "alias": "position"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "defaultActions": { "alias": "defaultActions"; "required": false; }; "saveLabelKey": { "alias": "saveLabelKey"; "required": false; }; "cancelLabelKey": { "alias": "cancelLabelKey"; "required": false; }; "saveLabel": { "alias": "saveLabel"; "required": false; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; }; "saveIcon": { "alias": "saveIcon"; "required": false; }; "saveDisabled": { "alias": "saveDisabled"; "required": false; }; "saveStyleClass": { "alias": "saveStyleClass"; "required": false; }; "cancelStyleClass": { "alias": "cancelStyleClass"; "required": false; }; }, { "visibleChange": "visibleChange"; "showEvent": "showEvent"; "hideEvent": "hideEvent"; "saveAction": "saveAction"; "cancelAction": "cancelAction"; }, never, ["*"], true, never>;
626
+ static ngAcceptInputType_visible: unknown;
627
+ static ngAcceptInputType_modal: unknown;
628
+ static ngAcceptInputType_closable: unknown;
629
+ static ngAcceptInputType_draggable: unknown;
630
+ static ngAcceptInputType_resizable: unknown;
631
+ static ngAcceptInputType_defaultActions: unknown;
632
+ static ngAcceptInputType_saveDisabled: unknown;
633
+ }
634
+
635
+ declare class EfFieldsetComponent {
636
+ /** Direct legend text (not translated) */
637
+ legend?: string;
638
+ /** Translation key — takes priority over legend */
639
+ legendKey?: string;
640
+ toggleable: boolean;
641
+ collapsed: boolean;
642
+ styleClass?: string;
643
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfFieldsetComponent, never>;
644
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfFieldsetComponent, "ef-fieldset", never, { "legend": { "alias": "legend"; "required": false; }; "legendKey": { "alias": "legendKey"; "required": false; }; "toggleable": { "alias": "toggleable"; "required": false; }; "collapsed": { "alias": "collapsed"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; }, {}, never, ["*"], true, never>;
645
+ static ngAcceptInputType_toggleable: unknown;
646
+ static ngAcceptInputType_collapsed: unknown;
647
+ }
648
+
649
+ declare class EfButtonComponent {
650
+ /** Direct label text (not translated) */
651
+ label?: string;
652
+ /** Translation key — takes priority over label */
653
+ labelKey?: string;
654
+ icon?: string;
655
+ severity: 'primary' | 'secondary' | 'success' | 'info' | 'warn' | 'danger' | 'help' | 'contrast';
656
+ size: 'small' | 'large';
657
+ disabled: boolean;
658
+ rounded: boolean;
659
+ outlined: boolean;
660
+ raised: boolean;
661
+ text: boolean;
662
+ loading: boolean;
663
+ styleClass?: string;
664
+ type: 'button' | 'submit';
665
+ badge?: string;
666
+ badgeSeverity?: 'success' | 'info' | 'warn' | 'danger' | 'help' | 'primary' | 'secondary' | 'contrast';
667
+ /** Direct tooltip text (not translated) */
668
+ tooltip?: string;
669
+ /** Translation key for tooltip — takes priority over tooltip */
670
+ tooltipKey?: string;
671
+ tooltipPosition: 'top' | 'bottom' | 'left' | 'right';
672
+ clickEvent: EventEmitter<Event>;
673
+ handleClick(event: Event): void;
674
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfButtonComponent, never>;
675
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfButtonComponent, "ef-button", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "severity": { "alias": "severity"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; "outlined": { "alias": "outlined"; "required": false; }; "raised": { "alias": "raised"; "required": false; }; "text": { "alias": "text"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "type": { "alias": "type"; "required": false; }; "badge": { "alias": "badge"; "required": false; }; "badgeSeverity": { "alias": "badgeSeverity"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "tooltipKey": { "alias": "tooltipKey"; "required": false; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; }; }, { "clickEvent": "clickEvent"; }, never, never, true, never>;
676
+ static ngAcceptInputType_disabled: unknown;
677
+ static ngAcceptInputType_rounded: unknown;
678
+ static ngAcceptInputType_outlined: unknown;
679
+ static ngAcceptInputType_raised: unknown;
680
+ static ngAcceptInputType_text: unknown;
681
+ static ngAcceptInputType_loading: unknown;
682
+ }
683
+
684
+ declare class EfLabelComponent {
685
+ /** Direct label text (not translated) */
686
+ label?: string;
687
+ /** Translation key — takes priority over label */
688
+ labelKey?: string;
689
+ /** The for attribute linking to an input id */
690
+ for?: string;
691
+ /** CSS classes for the label element */
692
+ styleClass: string;
693
+ /** Show required indicator */
694
+ required: boolean;
695
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfLabelComponent, never>;
696
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfLabelComponent, "ef-label", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "for": { "alias": "for"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "required": { "alias": "required"; "required": false; }; }, {}, never, never, true, never>;
697
+ static ngAcceptInputType_required: unknown;
698
+ }
699
+
700
+ /**
701
+ * Available Tailwind color names for badges
702
+ */
703
+ type EfBadgeColor = 'emerald' | 'green' | 'lime' | 'orange' | 'amber' | 'yellow' | 'teal' | 'cyan' | 'sky' | 'blue' | 'indigo' | 'violet' | 'purple' | 'fuchsia' | 'pink' | 'rose' | 'slate' | 'gray' | 'zinc' | 'neutral' | 'stone' | 'red';
704
+ /**
705
+ * Badge size variants
706
+ */
707
+ type EfBadgeSize = 'sm' | 'md' | 'lg';
708
+ /**
709
+ * Badge style variants
710
+ */
711
+ type EfBadgeVariant = 'filled' | 'outline' | 'dot' | 'pill';
712
+ /**
713
+ * Badge configuration interface
714
+ */
715
+ interface EfBadgeConfig {
716
+ /**
717
+ * Text label to display (optional for 'dot' variant)
718
+ */
719
+ label?: string;
720
+ /**
721
+ * Badge color (Tailwind color name)
722
+ * @default 'blue'
723
+ */
724
+ color?: EfBadgeColor;
725
+ /**
726
+ * Badge size
727
+ * @default 'md'
728
+ */
729
+ size?: EfBadgeSize;
730
+ /**
731
+ * Badge style variant
732
+ * @default 'filled'
733
+ */
734
+ variant?: EfBadgeVariant;
735
+ /**
736
+ * Custom CSS classes to apply
737
+ */
738
+ styleClass?: string;
739
+ /**
740
+ * Icon class (e.g., PrimeIcons) to display before label
741
+ */
742
+ icon?: string;
743
+ /**
744
+ * Whether to show the dot indicator
745
+ * @default true for 'dot' variant, false otherwise
746
+ */
747
+ showDot?: boolean;
748
+ }
749
+ /**
750
+ * Default badge configuration
751
+ */
752
+ declare const EF_BADGE_DEFAULTS: Required<Omit<EfBadgeConfig, 'label' | 'icon'>>;
753
+ /**
754
+ * Maps Tailwind colors to their background classes
755
+ */
756
+ declare const EF_BADGE_BG_COLORS: Record<EfBadgeColor, string>;
757
+ /**
758
+ * Maps Tailwind colors to their text classes
759
+ */
760
+ declare const EF_BADGE_TEXT_COLORS: Record<EfBadgeColor, string>;
761
+ /**
762
+ * Maps Tailwind colors to their border classes
763
+ */
764
+ declare const EF_BADGE_BORDER_COLORS: Record<EfBadgeColor, string>;
765
+ /**
766
+ * Maps Tailwind colors to their light background classes (for filled variant)
767
+ */
768
+ declare const EF_BADGE_BG_LIGHT_COLORS: Record<EfBadgeColor, string>;
769
+
770
+ /**
771
+ * ef-badge - Reusable status badge component
772
+ *
773
+ * Features:
774
+ * - Multiple color variants (Tailwind colors)
775
+ * - Multiple size options (sm, md, lg)
776
+ * - Multiple style variants (filled, outline, dot, pill)
777
+ * - Icon support
778
+ * - Fully customizable with styleClass
779
+ *
780
+ * @example
781
+ * ```html
782
+ * <!-- Simple filled badge -->
783
+ * <ef-badge label="Active" color="green" />
784
+ *
785
+ * <!-- Dot variant -->
786
+ * <ef-badge label="En attente" color="yellow" variant="dot" />
787
+ *
788
+ * <!-- With icon -->
789
+ * <ef-badge label="Error" color="red" icon="pi pi-exclamation-circle" />
790
+ *
791
+ * <!-- Outline variant -->
792
+ * <ef-badge label="Info" color="blue" variant="outline" />
793
+ *
794
+ * <!-- Pill variant -->
795
+ * <ef-badge label="New" color="purple" variant="pill" />
796
+ * ```
797
+ */
798
+ declare class EfBadgeComponent {
799
+ /**
800
+ * Badge label text
801
+ */
802
+ label: _angular_core.InputSignal<string>;
803
+ /**
804
+ * Badge color (Tailwind color name)
805
+ */
806
+ color: _angular_core.InputSignal<EfBadgeColor>;
807
+ /**
808
+ * Badge size
809
+ */
810
+ size: _angular_core.InputSignal<EfBadgeSize>;
811
+ /**
812
+ * Badge style variant
813
+ */
814
+ variant: _angular_core.InputSignal<EfBadgeVariant>;
815
+ /**
816
+ * Custom CSS classes
817
+ */
818
+ styleClass: _angular_core.InputSignal<string>;
819
+ /**
820
+ * Icon class (e.g., PrimeIcons)
821
+ */
822
+ icon: _angular_core.InputSignal<string>;
823
+ /**
824
+ * Whether to show the dot indicator
825
+ */
826
+ showDot: _angular_core.InputSignal<boolean>;
827
+ /**
828
+ * Computed badge configuration with defaults
829
+ */
830
+ config: _angular_core.Signal<Required<EfBadgeConfig>>;
831
+ /**
832
+ * Computed CSS classes for the badge
833
+ */
834
+ badgeClasses: _angular_core.Signal<string>;
835
+ /**
836
+ * Computed CSS classes for the dot indicator
837
+ */
838
+ dotClasses: _angular_core.Signal<string>;
839
+ /**
840
+ * Computed CSS classes for the icon
841
+ */
842
+ iconClasses: _angular_core.Signal<string>;
843
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfBadgeComponent, never>;
844
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfBadgeComponent, "ef-badge", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "styleClass": { "alias": "styleClass"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "showDot": { "alias": "showDot"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
845
+ }
846
+
847
+ declare class EfToolbarComponent {
848
+ context: ScreenContext;
849
+ state: string;
850
+ disabled: boolean;
851
+ back: EventEmitter<any>;
852
+ save: EventEmitter<any>;
853
+ delete: EventEmitter<any>;
854
+ duplicate: EventEmitter<any>;
855
+ print: EventEmitter<any>;
856
+ triggerCustoAction: EventEmitter<any>;
857
+ add: EventEmitter<any>;
858
+ search: EventEmitter<any>;
859
+ clear: EventEmitter<any>;
860
+ searchText: string;
861
+ backButton: boolean;
862
+ deleteButton: boolean;
863
+ duplicateButton: boolean;
864
+ saveButton: boolean;
865
+ exportButton: boolean;
866
+ printButton: boolean;
867
+ addButton: boolean;
868
+ clearButton: boolean;
869
+ searchButton: boolean;
870
+ showFreeSearchInput: boolean;
871
+ private router;
872
+ get isSearchState(): boolean;
873
+ get isDetailState(): boolean;
874
+ get hasReadPermission(): boolean;
875
+ get hasWritePermission(): boolean;
876
+ get hasEditPermission(): boolean;
877
+ get hasDeletePermission(): boolean;
878
+ get hasDuplicatePermission(): boolean;
879
+ get hasExportPermission(): boolean;
880
+ get isDuplicateMode(): boolean;
881
+ backAction(): void;
882
+ deleteAction(): void;
883
+ saveAction(): void;
884
+ duplicateAction(): void;
885
+ printAction(): void;
886
+ exportAction(): void;
887
+ addAction(): void;
888
+ searchAction(): void;
889
+ clearAction(): void;
890
+ navigateBack(): void;
891
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfToolbarComponent, never>;
892
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfToolbarComponent, "ef-toolbar", never, { "context": { "alias": "context"; "required": false; }; "state": { "alias": "state"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "backButton": { "alias": "backButton"; "required": false; }; "deleteButton": { "alias": "deleteButton"; "required": false; }; "duplicateButton": { "alias": "duplicateButton"; "required": false; }; "saveButton": { "alias": "saveButton"; "required": false; }; "exportButton": { "alias": "exportButton"; "required": false; }; "printButton": { "alias": "printButton"; "required": false; }; "addButton": { "alias": "addButton"; "required": false; }; "clearButton": { "alias": "clearButton"; "required": false; }; "searchButton": { "alias": "searchButton"; "required": false; }; "showFreeSearchInput": { "alias": "showFreeSearchInput"; "required": false; }; }, { "back": "back"; "save": "save"; "delete": "delete"; "duplicate": "duplicate"; "print": "print"; "triggerCustoAction": "triggerCustoAction"; "add": "add"; "search": "search"; "clear": "clear"; }, never, ["[toolbarStart]", "[toolbarEnd]"], true, never>;
893
+ }
894
+
895
+ declare class EfBlockUiComponent {
896
+ isLoading: boolean;
897
+ contentPanel: any;
898
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfBlockUiComponent, never>;
899
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfBlockUiComponent, "ef-block-ui", never, { "isLoading": { "alias": "isLoading"; "required": false; }; "contentPanel": { "alias": "contentPanel"; "required": false; }; }, {}, never, never, true, never>;
900
+ }
901
+
902
+ declare class EfBlockableDivComponent implements BlockableUI {
903
+ style: {
904
+ [key: string]: string;
905
+ };
906
+ cssClass: string;
907
+ private readonly el;
908
+ getBlockableElement(): HTMLElement;
909
+ get componentStyle(): {
910
+ [key: string]: string;
911
+ };
912
+ get componentClass(): string;
913
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfBlockableDivComponent, never>;
914
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfBlockableDivComponent, "ef-blockable-div", never, { "style": { "alias": "style"; "required": false; }; "cssClass": { "alias": "cssClass"; "required": false; }; }, {}, never, ["*"], true, never>;
915
+ }
916
+
917
+ declare class EfInputTextComponent implements ControlValueAccessor {
918
+ label?: string;
919
+ labelKey?: string;
920
+ inputId?: string;
921
+ name?: string;
922
+ placeholder?: string;
923
+ placeholderKey?: string;
924
+ size: 'small' | 'large';
925
+ type: string;
926
+ maxlength?: number;
927
+ readonly: boolean;
928
+ required: boolean;
929
+ fluid: boolean;
930
+ inline: boolean;
931
+ autocomplete?: string;
932
+ get isInline(): boolean;
933
+ valueChangeEvent: EventEmitter<string>;
934
+ value: string;
935
+ disabled: boolean;
936
+ private onChange;
937
+ private onTouched;
938
+ readonly ngControl: NgControl;
939
+ private readonly translateService;
940
+ constructor();
941
+ get effectivePlaceholder(): string;
942
+ get effectiveId(): string;
943
+ get showRequired(): boolean;
944
+ get serverErrors(): string[] | null;
945
+ get isInvalid(): boolean;
946
+ writeValue(value: string): void;
947
+ registerOnChange(fn: (value: string) => void): void;
948
+ registerOnTouched(fn: () => void): void;
949
+ setDisabledState(isDisabled: boolean): void;
950
+ handleInput(value: string): void;
951
+ handleBlur(): void;
952
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfInputTextComponent, never>;
953
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfInputTextComponent, "ef-input-text", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "size": { "alias": "size"; "required": false; }; "type": { "alias": "type"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "required": { "alias": "required"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; }, { "valueChangeEvent": "valueChangeEvent"; }, never, never, true, never>;
954
+ static ngAcceptInputType_readonly: unknown;
955
+ static ngAcceptInputType_required: unknown;
956
+ static ngAcceptInputType_fluid: unknown;
957
+ static ngAcceptInputType_inline: unknown;
958
+ }
959
+
960
+ declare class EfSelectComponent implements ControlValueAccessor, OnInit, OnChanges {
961
+ label?: string;
962
+ labelKey?: string;
963
+ inputId?: string;
964
+ name?: string;
965
+ options: any[];
966
+ optionLabel: string;
967
+ optionValue?: string;
968
+ placeholder: string;
969
+ placeholderKey?: string;
970
+ size: 'small' | 'large';
971
+ required: boolean;
972
+ fluid: boolean;
973
+ inline: boolean;
974
+ filter: boolean;
975
+ showClear: boolean;
976
+ disabled: boolean;
977
+ appendTo?: string;
978
+ /** Filter options by matching key-value pairs */
979
+ filterByKeys?: {
980
+ [key: string]: any;
981
+ };
982
+ get isInline(): boolean;
983
+ itemTemplate: TemplateRef<any> | null;
984
+ selectedItemTemplate: TemplateRef<any> | null;
985
+ selectionChangeEvent: EventEmitter<any>;
986
+ value: any;
987
+ filteredOptions: any[];
988
+ private onChange;
989
+ private onTouched;
990
+ /** Resolved lazily in ngOnInit to avoid circular DI with NG_VALUE_ACCESSOR */
991
+ ngControl: NgControl | null;
992
+ private readonly injector;
993
+ private readonly translateService;
994
+ ngOnInit(): void;
995
+ get effectivePlaceholder(): string;
996
+ get effectiveId(): string;
997
+ get showRequired(): boolean;
998
+ get serverErrors(): string[] | null;
999
+ get isInvalid(): boolean;
1000
+ ngOnChanges(changes: SimpleChanges): void;
1001
+ writeValue(value: any): void;
1002
+ registerOnChange(fn: (value: any) => void): void;
1003
+ registerOnTouched(fn: () => void): void;
1004
+ setDisabledState(isDisabled: boolean): void;
1005
+ handleSelectionChange(event: {
1006
+ originalEvent?: Event;
1007
+ value: any;
1008
+ }): void;
1009
+ handleClear(): void;
1010
+ private applyFilters;
1011
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfSelectComponent, never>;
1012
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfSelectComponent, "ef-select", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "options": { "alias": "options"; "required": false; }; "optionLabel": { "alias": "optionLabel"; "required": false; }; "optionValue": { "alias": "optionValue"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "size": { "alias": "size"; "required": false; }; "required": { "alias": "required"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "filterByKeys": { "alias": "filterByKeys"; "required": false; }; }, { "selectionChangeEvent": "selectionChangeEvent"; }, ["itemTemplate", "selectedItemTemplate"], never, true, never>;
1013
+ static ngAcceptInputType_required: unknown;
1014
+ static ngAcceptInputType_fluid: unknown;
1015
+ static ngAcceptInputType_inline: unknown;
1016
+ static ngAcceptInputType_filter: unknown;
1017
+ static ngAcceptInputType_showClear: unknown;
1018
+ static ngAcceptInputType_disabled: unknown;
1019
+ }
1020
+
1021
+ declare class EfCheckboxComponent implements ControlValueAccessor {
1022
+ /** Direct label text (not translated) */
1023
+ label?: string;
1024
+ /** Translation key — takes priority over label */
1025
+ labelKey?: string;
1026
+ inputId?: string;
1027
+ name?: string;
1028
+ value?: any;
1029
+ binary: boolean;
1030
+ required: boolean;
1031
+ disabled: boolean;
1032
+ checked: any;
1033
+ private onChange;
1034
+ private onTouched;
1035
+ readonly ngControl: NgControl;
1036
+ constructor();
1037
+ get effectiveId(): string;
1038
+ get effectiveLabel(): string | undefined;
1039
+ get showRequired(): boolean;
1040
+ get serverErrors(): string[] | null;
1041
+ writeValue(value: any): void;
1042
+ registerOnChange(fn: (value: any) => void): void;
1043
+ registerOnTouched(fn: () => void): void;
1044
+ setDisabledState(isDisabled: boolean): void;
1045
+ handleChange(event: any): void;
1046
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfCheckboxComponent, never>;
1047
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfCheckboxComponent, "ef-checkbox", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "value": { "alias": "value"; "required": false; }; "binary": { "alias": "binary"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, never>;
1048
+ static ngAcceptInputType_binary: unknown;
1049
+ static ngAcceptInputType_required: unknown;
1050
+ static ngAcceptInputType_disabled: unknown;
1051
+ }
1052
+
1053
+ declare class EfDatepickerComponent implements ControlValueAccessor {
1054
+ label?: string;
1055
+ labelKey?: string;
1056
+ inputId?: string;
1057
+ name?: string;
1058
+ placeholder?: string;
1059
+ placeholderKey?: string;
1060
+ size: 'small' | 'large';
1061
+ required: boolean;
1062
+ fluid: boolean;
1063
+ inline: boolean;
1064
+ disabled: boolean;
1065
+ showIcon: boolean;
1066
+ iconDisplay: 'input' | 'button';
1067
+ selectionMode: 'single' | 'multiple' | 'range';
1068
+ dateFormat?: string;
1069
+ appendTo?: string;
1070
+ showTime: boolean;
1071
+ showButtonBar: boolean;
1072
+ minDate?: Date;
1073
+ maxDate?: Date;
1074
+ get isInline(): boolean;
1075
+ dateSelectEvent: EventEmitter<any>;
1076
+ value: any;
1077
+ private onChange;
1078
+ private onTouched;
1079
+ readonly ngControl: NgControl;
1080
+ private readonly translateService;
1081
+ constructor();
1082
+ get effectivePlaceholder(): string;
1083
+ get effectiveId(): string;
1084
+ get showRequired(): boolean;
1085
+ get serverErrors(): string[] | null;
1086
+ get isInvalid(): boolean;
1087
+ writeValue(value: any): void;
1088
+ registerOnChange(fn: (value: any) => void): void;
1089
+ registerOnTouched(fn: () => void): void;
1090
+ setDisabledState(isDisabled: boolean): void;
1091
+ handleChange(value: any): void;
1092
+ handleBlur(): void;
1093
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDatepickerComponent, never>;
1094
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDatepickerComponent, "ef-datepicker", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "size": { "alias": "size"; "required": false; }; "required": { "alias": "required"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showIcon": { "alias": "showIcon"; "required": false; }; "iconDisplay": { "alias": "iconDisplay"; "required": false; }; "selectionMode": { "alias": "selectionMode"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "showButtonBar": { "alias": "showButtonBar"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; }, { "dateSelectEvent": "dateSelectEvent"; }, never, never, true, never>;
1095
+ static ngAcceptInputType_required: unknown;
1096
+ static ngAcceptInputType_fluid: unknown;
1097
+ static ngAcceptInputType_inline: unknown;
1098
+ static ngAcceptInputType_disabled: unknown;
1099
+ static ngAcceptInputType_showIcon: unknown;
1100
+ static ngAcceptInputType_showTime: unknown;
1101
+ static ngAcceptInputType_showButtonBar: unknown;
1102
+ }
1103
+
1104
+ declare class EfInputNumberComponent implements ControlValueAccessor {
1105
+ inputNumber?: InputNumber;
1106
+ label?: string;
1107
+ labelKey?: string;
1108
+ required: boolean;
1109
+ value?: Nullable<number>;
1110
+ invalid: boolean;
1111
+ disabled?: boolean;
1112
+ readonly: boolean;
1113
+ format: boolean;
1114
+ showButtons: boolean;
1115
+ buttonLayout: 'stacked' | 'horizontal' | 'vertical';
1116
+ incrementButtonClass?: string;
1117
+ decrementButtonClass?: string;
1118
+ incrementButtonIcon?: string;
1119
+ decrementButtonIcon?: string;
1120
+ prefix?: string;
1121
+ suffix?: string;
1122
+ currency?: string;
1123
+ currencyDisplay?: string;
1124
+ locale?: string;
1125
+ localeMatcher?: 'lookup' | 'best fit';
1126
+ mode: 'decimal' | 'currency';
1127
+ useGrouping: boolean;
1128
+ minFractionDigits?: number;
1129
+ maxFractionDigits?: number;
1130
+ min?: number;
1131
+ max?: number;
1132
+ step: number;
1133
+ allowEmpty: boolean;
1134
+ inputId?: string;
1135
+ name?: string;
1136
+ placeholder?: string;
1137
+ placeholderKey?: string;
1138
+ inputSize?: number;
1139
+ size?: 'small' | 'large';
1140
+ maxlength?: number;
1141
+ minlength?: number;
1142
+ pattern?: string;
1143
+ tabindex?: number;
1144
+ title?: string;
1145
+ ariaLabel?: string;
1146
+ ariaLabelledBy?: string;
1147
+ ariaDescribedBy?: string;
1148
+ ariaRequired?: boolean;
1149
+ inputStyle?: any;
1150
+ inputStyleClass?: string;
1151
+ style?: any;
1152
+ styleClass?: string;
1153
+ showClear: boolean;
1154
+ variant?: 'filled' | 'outlined';
1155
+ autofocus?: boolean;
1156
+ autocomplete?: string;
1157
+ fluid?: boolean;
1158
+ inline: boolean;
1159
+ get isInline(): boolean;
1160
+ pt?: any;
1161
+ ptOptions?: any;
1162
+ dt?: any;
1163
+ unstyled?: boolean;
1164
+ inputEvent: EventEmitter<InputNumberInputEvent>;
1165
+ focusEvent: EventEmitter<Event>;
1166
+ blurEvent: EventEmitter<Event>;
1167
+ keyDownEvent: EventEmitter<KeyboardEvent>;
1168
+ clearEvent: EventEmitter<void>;
1169
+ private onChange;
1170
+ private onTouched;
1171
+ readonly ngControl: NgControl;
1172
+ private readonly translateService;
1173
+ constructor();
1174
+ get effectivePlaceholder(): string;
1175
+ get effectiveId(): string;
1176
+ get showRequired(): boolean;
1177
+ get serverErrors(): string[] | null;
1178
+ get isInvalid(): boolean;
1179
+ writeValue(value: any): void;
1180
+ registerOnChange(fn: any): void;
1181
+ registerOnTouched(fn: any): void;
1182
+ setDisabledState(isDisabled: boolean): void;
1183
+ handleInput(event: InputNumberInputEvent): void;
1184
+ handleFocus(event: Event): void;
1185
+ handleBlur(event: Event): void;
1186
+ handleKeyDown(event: KeyboardEvent): void;
1187
+ handleClear(): void;
1188
+ focus(): void;
1189
+ clear(): void;
1190
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfInputNumberComponent, never>;
1191
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfInputNumberComponent, "ef-inputnumber", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "required": { "alias": "required"; "required": false; }; "value": { "alias": "value"; "required": false; }; "invalid": { "alias": "invalid"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "format": { "alias": "format"; "required": false; }; "showButtons": { "alias": "showButtons"; "required": false; }; "buttonLayout": { "alias": "buttonLayout"; "required": false; }; "incrementButtonClass": { "alias": "incrementButtonClass"; "required": false; }; "decrementButtonClass": { "alias": "decrementButtonClass"; "required": false; }; "incrementButtonIcon": { "alias": "incrementButtonIcon"; "required": false; }; "decrementButtonIcon": { "alias": "decrementButtonIcon"; "required": false; }; "prefix": { "alias": "prefix"; "required": false; }; "suffix": { "alias": "suffix"; "required": false; }; "currency": { "alias": "currency"; "required": false; }; "currencyDisplay": { "alias": "currencyDisplay"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "localeMatcher": { "alias": "localeMatcher"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "useGrouping": { "alias": "useGrouping"; "required": false; }; "minFractionDigits": { "alias": "minFractionDigits"; "required": false; }; "maxFractionDigits": { "alias": "maxFractionDigits"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "step": { "alias": "step"; "required": false; }; "allowEmpty": { "alias": "allowEmpty"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "inputSize": { "alias": "inputSize"; "required": false; }; "size": { "alias": "size"; "required": false; }; "maxlength": { "alias": "maxlength"; "required": false; }; "minlength": { "alias": "minlength"; "required": false; }; "pattern": { "alias": "pattern"; "required": false; }; "tabindex": { "alias": "tabindex"; "required": false; }; "title": { "alias": "title"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; }; "ariaRequired": { "alias": "ariaRequired"; "required": false; }; "inputStyle": { "alias": "inputStyle"; "required": false; }; "inputStyleClass": { "alias": "inputStyleClass"; "required": false; }; "style": { "alias": "style"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "pt": { "alias": "pt"; "required": false; }; "ptOptions": { "alias": "ptOptions"; "required": false; }; "dt": { "alias": "dt"; "required": false; }; "unstyled": { "alias": "unstyled"; "required": false; }; }, { "inputEvent": "inputEvent"; "focusEvent": "focusEvent"; "blurEvent": "blurEvent"; "keyDownEvent": "keyDownEvent"; "clearEvent": "clearEvent"; }, never, never, true, never>;
1192
+ static ngAcceptInputType_required: unknown;
1193
+ static ngAcceptInputType_inline: unknown;
1194
+ }
1195
+
1196
+ declare class EfPasswordComponent implements ControlValueAccessor {
1197
+ label?: string;
1198
+ labelKey?: string;
1199
+ inputId?: string;
1200
+ name?: string;
1201
+ placeholder?: string;
1202
+ placeholderKey?: string;
1203
+ size: 'small' | 'large';
1204
+ required: boolean;
1205
+ fluid: boolean;
1206
+ inline: boolean;
1207
+ toggleMask: boolean;
1208
+ feedback: boolean;
1209
+ autocomplete?: string;
1210
+ get isInline(): boolean;
1211
+ valueChangeEvent: EventEmitter<string>;
1212
+ value: string;
1213
+ disabled: boolean;
1214
+ private onChange;
1215
+ private onTouched;
1216
+ readonly ngControl: NgControl;
1217
+ private readonly translateService;
1218
+ constructor();
1219
+ get effectivePlaceholder(): string;
1220
+ get effectiveId(): string;
1221
+ get showRequired(): boolean;
1222
+ get serverErrors(): string[] | null;
1223
+ get isInvalid(): boolean;
1224
+ writeValue(value: string): void;
1225
+ registerOnChange(fn: (value: string) => void): void;
1226
+ registerOnTouched(fn: () => void): void;
1227
+ setDisabledState(isDisabled: boolean): void;
1228
+ handleChange(value: string): void;
1229
+ handleBlur(): void;
1230
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfPasswordComponent, never>;
1231
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfPasswordComponent, "ef-password", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "size": { "alias": "size"; "required": false; }; "required": { "alias": "required"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "toggleMask": { "alias": "toggleMask"; "required": false; }; "feedback": { "alias": "feedback"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; }, { "valueChangeEvent": "valueChangeEvent"; }, never, never, true, never>;
1232
+ static ngAcceptInputType_required: unknown;
1233
+ static ngAcceptInputType_fluid: unknown;
1234
+ static ngAcceptInputType_inline: unknown;
1235
+ static ngAcceptInputType_toggleMask: unknown;
1236
+ static ngAcceptInputType_feedback: unknown;
1237
+ }
1238
+
1239
+ declare class EfMultiSelectComponent implements ControlValueAccessor, OnChanges {
1240
+ changeEvent: EventEmitter<string[]>;
1241
+ label?: string;
1242
+ labelKey?: string;
1243
+ id: string;
1244
+ name: string;
1245
+ optionLabel: string;
1246
+ optionValue: string;
1247
+ options: any;
1248
+ filteredOptions: any;
1249
+ maxSelectedLabels: number;
1250
+ disabled: boolean;
1251
+ display: 'comma' | 'chip';
1252
+ size: 'large' | 'small';
1253
+ selectionLimit: any;
1254
+ filters: any;
1255
+ placeholder: string;
1256
+ placeholderKey?: string;
1257
+ showClear: boolean;
1258
+ required: boolean;
1259
+ inline: boolean;
1260
+ get isInline(): boolean;
1261
+ get isRequired(): boolean;
1262
+ selectedValues: any[];
1263
+ private propagateChange;
1264
+ private propagateTouched;
1265
+ readonly ngControl: NgControl;
1266
+ private readonly translateService;
1267
+ constructor();
1268
+ get effectivePlaceholder(): string;
1269
+ get showRequired(): boolean;
1270
+ get serverErrors(): string[] | null;
1271
+ writeValue(value: string[]): void;
1272
+ registerOnChange(fn: (value: any[]) => void): void;
1273
+ registerOnTouched(fn: () => void): void;
1274
+ setDisabledState(isDisabled: boolean): void;
1275
+ onInternalModelChange(val: any[]): void;
1276
+ handleClear(): void;
1277
+ ngOnChanges(): void;
1278
+ private applyFilters;
1279
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfMultiSelectComponent, never>;
1280
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfMultiSelectComponent, "ef-multi-select", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "id": { "alias": "id"; "required": false; }; "name": { "alias": "name"; "required": false; }; "optionLabel": { "alias": "optionLabel"; "required": false; }; "optionValue": { "alias": "optionValue"; "required": false; }; "options": { "alias": "options"; "required": false; }; "filteredOptions": { "alias": "filteredOptions"; "required": false; }; "maxSelectedLabels": { "alias": "maxSelectedLabels"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "display": { "alias": "display"; "required": false; }; "size": { "alias": "size"; "required": false; }; "selectionLimit": { "alias": "selectionLimit"; "required": false; }; "filters": { "alias": "filters"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "showClear": { "alias": "showClear"; "required": false; }; "required": { "alias": "required"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; }, { "changeEvent": "changeEvent"; }, never, never, true, never>;
1281
+ static ngAcceptInputType_showClear: unknown;
1282
+ static ngAcceptInputType_inline: unknown;
1283
+ }
1284
+
1285
+ declare class EfSelectButtonComponent implements ControlValueAccessor {
1286
+ /** Direct label text above the selectbutton (not translated) */
1287
+ label?: string;
1288
+ /** Translation key for label — takes priority over label */
1289
+ labelKey?: string;
1290
+ options: any[];
1291
+ optionLabel: string;
1292
+ optionValue: string;
1293
+ multiple: boolean;
1294
+ allowEmpty: boolean;
1295
+ disabled: boolean;
1296
+ size: 'small' | 'large';
1297
+ styleClass?: string;
1298
+ itemTemplate?: TemplateRef<any>;
1299
+ value: any;
1300
+ private onChange;
1301
+ private onTouched;
1302
+ readonly ngControl: NgControl;
1303
+ constructor();
1304
+ writeValue(value: any): void;
1305
+ registerOnChange(fn: (value: any) => void): void;
1306
+ registerOnTouched(fn: () => void): void;
1307
+ setDisabledState(isDisabled: boolean): void;
1308
+ handleChange(event: any): void;
1309
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfSelectButtonComponent, never>;
1310
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfSelectButtonComponent, "ef-selectbutton", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "options": { "alias": "options"; "required": false; }; "optionLabel": { "alias": "optionLabel"; "required": false; }; "optionValue": { "alias": "optionValue"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "allowEmpty": { "alias": "allowEmpty"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "size": { "alias": "size"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; }, {}, ["itemTemplate"], never, true, never>;
1311
+ static ngAcceptInputType_multiple: unknown;
1312
+ static ngAcceptInputType_allowEmpty: unknown;
1313
+ static ngAcceptInputType_disabled: unknown;
1314
+ }
1315
+
1316
+ /**
1317
+ * EfQuantityStepper is a specialized component for quantity selection with increment/decrement buttons.
1318
+ * Perfect for shopping carts, POS systems, and order forms where users need to adjust quantities.
1319
+ *
1320
+ * Features:
1321
+ * - Increment/decrement buttons with customizable styling
1322
+ * - Min/max value constraints
1323
+ * - Configurable step value
1324
+ * - Fully integrated with Angular Forms (ngModel, FormControl)
1325
+ * - Rounded button design optimized for touch interfaces
1326
+ *
1327
+ * @group Components
1328
+ */
1329
+ declare class EfQuantityStepperComponent implements ControlValueAccessor {
1330
+ /**
1331
+ * Current quantity value
1332
+ */
1333
+ value: Nullable<number>;
1334
+ /**
1335
+ * Minimum allowed value
1336
+ */
1337
+ min: number;
1338
+ /**
1339
+ * Maximum allowed value
1340
+ */
1341
+ max: number;
1342
+ /**
1343
+ * Step increment/decrement value
1344
+ */
1345
+ step: number;
1346
+ /**
1347
+ * Minimum fraction digits to display (forwarded to ef-inputnumber).
1348
+ */
1349
+ minFractionDigits?: number;
1350
+ /**
1351
+ * Maximum fraction digits to display (forwarded to ef-inputnumber).
1352
+ */
1353
+ maxFractionDigits?: number;
1354
+ /**
1355
+ * Locale used for number formatting (forwarded to ef-inputnumber).
1356
+ */
1357
+ locale?: string;
1358
+ /**
1359
+ * When present, it specifies that the component should be disabled
1360
+ */
1361
+ disabled: boolean;
1362
+ /**
1363
+ * Callback to invoke when the value changes
1364
+ */
1365
+ valueChange: EventEmitter<number>;
1366
+ /**
1367
+ * Pass Through configuration for custom styling
1368
+ */
1369
+ ptConfig: {
1370
+ root: {
1371
+ class: string;
1372
+ };
1373
+ pcInputText: {
1374
+ root: {
1375
+ class: string;
1376
+ };
1377
+ };
1378
+ decrementButton: {
1379
+ class: string;
1380
+ };
1381
+ incrementButton: {
1382
+ class: string;
1383
+ };
1384
+ decrementButtonIcon: {
1385
+ innerHTML: string;
1386
+ };
1387
+ incrementButtonIcon: {
1388
+ innerHTML: string;
1389
+ };
1390
+ };
1391
+ private onChange;
1392
+ private onTouched;
1393
+ writeValue(value: any): void;
1394
+ registerOnChange(fn: any): void;
1395
+ registerOnTouched(fn: any): void;
1396
+ setDisabledState(isDisabled: boolean): void;
1397
+ handleValueChange(value: number | null): void;
1398
+ handleBlur(): void;
1399
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfQuantityStepperComponent, never>;
1400
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfQuantityStepperComponent, "ef-quantity-stepper", never, { "value": { "alias": "value"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "step": { "alias": "step"; "required": false; }; "minFractionDigits": { "alias": "minFractionDigits"; "required": false; }; "maxFractionDigits": { "alias": "maxFractionDigits"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
1401
+ }
1402
+
1403
+ /**
1404
+ * Column alignment options for ef-datatable
1405
+ */
1406
+ type EfDatatableColumnAlign = 'start' | 'center' | 'end';
1407
+ /**
1408
+ * Column data types for automatic formatting
1409
+ */
1410
+ type EfDatatableColumnType = 'text' | 'number' | 'money' | 'date' | 'datetime' | 'boolean' | 'reference';
1411
+ /**
1412
+ * Column definition interface for ef-datatable
1413
+ */
1414
+ interface EfDatatableColumn {
1415
+ /** Property name in data object */
1416
+ field: string;
1417
+ /** Column header text */
1418
+ header: string;
1419
+ /** Data type for automatic formatting (default: 'text') */
1420
+ type?: EfDatatableColumnType;
1421
+ /** Text alignment (default: 'start' except money/number = 'end') */
1422
+ align?: EfDatatableColumnAlign;
1423
+ /** Enable sorting for this column (default: true) */
1424
+ sortable?: boolean;
1425
+ /** Enable resizing for this column (default: true) */
1426
+ resizable?: boolean;
1427
+ /** CSS width (e.g., '100px', 'w-[200px]') */
1428
+ width?: string;
1429
+ /** Custom Tailwind or CSS classes */
1430
+ styleClass?: string;
1431
+ /** Date format string for DatePipe (default: 'shortDate') */
1432
+ dateFormat?: string;
1433
+ /** Currency code for money type (default: 'EUR') */
1434
+ currencyCode?: string;
1435
+ /** Currency display format (default: 'symbol') */
1436
+ currencyDisplay?: 'symbol' | 'code' | 'name';
1437
+ /** Locale for number/date/currency formatting (default: 'fr-FR') */
1438
+ locale?: string;
1439
+ /** Minimum fraction digits for numbers (default: 2) */
1440
+ minFractionDigits?: number;
1441
+ /** Maximum fraction digits for numbers (default: 2) */
1442
+ maxFractionDigits?: number;
1443
+ /** Key for context.ref.get() to lookup reference data */
1444
+ referenceKey?: string;
1445
+ /** Field to match in reference data (default: 'code') */
1446
+ referenceValueField?: string;
1447
+ /** Field to display from reference data (default: 'name') */
1448
+ referenceLabelField?: string;
1449
+ /** Custom cell template (receives rowData and column) */
1450
+ template?: TemplateRef<unknown>;
1451
+ /** Custom header template (receives column) */
1452
+ headerTemplate?: TemplateRef<unknown>;
1453
+ }
1454
+ /**
1455
+ * Action column configuration for edit/delete/duplicate buttons
1456
+ */
1457
+ interface EfDatatableActions {
1458
+ /** Show action column (default: true if config provided) */
1459
+ show?: boolean;
1460
+ /** Action column width (default: 'w-20') */
1461
+ width?: string;
1462
+ /** Show edit button (default: true) */
1463
+ showEdit?: boolean;
1464
+ /** Show delete button (default: true) */
1465
+ showDelete?: boolean;
1466
+ /** Show duplicate button (default: false) */
1467
+ showDuplicate?: boolean;
1468
+ /** Position of action column (default: 'end') */
1469
+ position?: 'start' | 'end';
1470
+ }
1471
+ /**
1472
+ * Main table configuration options
1473
+ */
1474
+ interface EfDatatableConfig {
1475
+ /** Enable lazy loading (default: true) */
1476
+ lazy?: boolean;
1477
+ /** Unique identifier field name (default: 'id') */
1478
+ dataKey?: string;
1479
+ /** Enable pagination (default: true) */
1480
+ paginator?: boolean;
1481
+ /** Rows per page (default: 10) */
1482
+ rows?: number;
1483
+ /** Page size options (default: [5, 10, 25, 50]) */
1484
+ rowsPerPageOptions?: number[];
1485
+ /** Enable scrolling (default: true) */
1486
+ scrollable?: boolean;
1487
+ /** Scroll viewport height (default: '300px') */
1488
+ scrollHeight?: string;
1489
+ /** Enable column resizing (default: true) */
1490
+ resizableColumns?: boolean;
1491
+ /** Column resize behavior (default: 'expand') */
1492
+ columnResizeMode?: 'fit' | 'expand';
1493
+ /** State storage location (default: 'local') */
1494
+ stateStorage?: 'local' | 'session';
1495
+ /** State storage key (auto-generated if not provided) */
1496
+ stateKey?: string;
1497
+ /** Table size (default: 'small') */
1498
+ size?: 'small' | 'large';
1499
+ /** Custom CSS classes (default: 'text-sm') */
1500
+ styleClass?: string;
1501
+ /** Inline table styles */
1502
+ tableStyle?: Record<string, string>;
1503
+ /** Message when no data (default: 'Aucune entree trouvee') */
1504
+ emptyMessage?: string;
1505
+ /** Pagination report template */
1506
+ currentPageReportTemplate?: string;
1507
+ }
1508
+ /**
1509
+ * Default table configuration values
1510
+ */
1511
+ declare const EF_DATATABLE_DEFAULTS: Required<EfDatatableConfig>;
1512
+ /**
1513
+ * Default column configuration values
1514
+ */
1515
+ declare const EF_DATATABLE_COLUMN_DEFAULTS: Partial<EfDatatableColumn>;
1516
+ /**
1517
+ * Default action column configuration
1518
+ */
1519
+ declare const EF_DATATABLE_ACTIONS_DEFAULTS: Required<EfDatatableActions>;
1520
+ /**
1521
+ * Helper function to determine column alignment based on type
1522
+ * @param column - The column configuration
1523
+ * @returns The computed alignment
1524
+ */
1525
+ declare function getColumnAlignment(column: EfDatatableColumn): EfDatatableColumnAlign;
1526
+ /**
1527
+ * Helper function to merge column configuration with defaults
1528
+ * @param column - The column configuration
1529
+ * @returns Column with defaults applied
1530
+ */
1531
+ declare function mergeColumnDefaults(column: EfDatatableColumn): EfDatatableColumn;
1532
+
1533
+ /**
1534
+ * SearchEntity interface for datatable consumption.
1535
+ * Matches the shape expected from the consuming application's SearchEntity.
1536
+ */
1537
+ interface DatatableSearchEntity {
1538
+ items?: Record<string, unknown>[];
1539
+ totalCount?: number;
1540
+ pagination?: {
1541
+ pageNumber: number;
1542
+ pageSize: number;
1543
+ };
1544
+ sort?: Array<{
1545
+ field: string;
1546
+ sortDirection: string;
1547
+ }>;
1548
+ }
1549
+ /**
1550
+ * ef-datatable - Reusable table component wrapping PrimeNG Table
1551
+ *
1552
+ * Features:
1553
+ * - Typed columns with automatic formatting (text, number, money, date, datetime, boolean, reference)
1554
+ * - Built-in action column with edit/delete/duplicate buttons
1555
+ * - Support for custom templates
1556
+ * - PassThrough (PT) support for deep customization
1557
+ * - Lazy loading, pagination, sorting, column resizing
1558
+ * - State persistence (localStorage/sessionStorage)
1559
+ * - Reference data integration via ScreenContext
1560
+ *
1561
+ * @example
1562
+ * ```html
1563
+ * <ef-datatable
1564
+ * [columns]="tableColumns"
1565
+ * [searchEntity]="searchEntity"
1566
+ * [context]="context"
1567
+ * [screenStateKey]="screenStateKey"
1568
+ * [actions]="{ showDuplicate: true }"
1569
+ * (editRow)="edit($event)"
1570
+ * (deleteRow)="delete($event)"
1571
+ * (lazyLoad)="search($event)">
1572
+ * </ef-datatable>
1573
+ * ```
1574
+ */
1575
+ declare class EfDatatableComponent implements OnInit {
1576
+ /**
1577
+ * Reference to the underlying PrimeNG Table component
1578
+ */
1579
+ pTable?: Table;
1580
+ selectedItem: Record<string, unknown> | undefined;
1581
+ /**
1582
+ * Column definitions with type, alignment, and formatting options
1583
+ */
1584
+ columns: _angular_core.InputSignal<EfDatatableColumn[]>;
1585
+ /**
1586
+ * Table configuration (pagination, scrolling, sizing, etc.)
1587
+ */
1588
+ config: _angular_core.InputSignal<EfDatatableConfig>;
1589
+ /**
1590
+ * Action column configuration (edit/delete/duplicate buttons)
1591
+ */
1592
+ actions: _angular_core.InputSignal<EfDatatableActions>;
1593
+ /**
1594
+ * SearchEntity containing items, pagination, etc.
1595
+ */
1596
+ searchEntity: _angular_core.InputSignal<DatatableSearchEntity>;
1597
+ /**
1598
+ * ScreenContext for reference data access
1599
+ */
1600
+ context: _angular_core.InputSignal<ScreenContext>;
1601
+ /**
1602
+ * PassThrough options for deep DOM customization
1603
+ */
1604
+ pt: _angular_core.InputSignal<Record<string, unknown>>;
1605
+ /**
1606
+ * Screen state key for state persistence (auto-generates stateKey if not provided in config)
1607
+ */
1608
+ screenStateKey: _angular_core.InputSignal<string>;
1609
+ /**
1610
+ * Emitted when edit button is clicked (emits row ID)
1611
+ */
1612
+ editRow: _angular_core.OutputEmitterRef<unknown>;
1613
+ /**
1614
+ * Emitted when delete button is clicked (emits row ID)
1615
+ */
1616
+ deleteRow: _angular_core.OutputEmitterRef<unknown>;
1617
+ /**
1618
+ * Emitted when duplicate button is clicked (emits row ID)
1619
+ */
1620
+ duplicateRow: _angular_core.OutputEmitterRef<unknown>;
1621
+ /**
1622
+ * Emitted on lazy load events (pagination, sorting, filtering)
1623
+ */
1624
+ lazyLoad: _angular_core.OutputEmitterRef<TableLazyLoadEvent>;
1625
+ /**
1626
+ * Emitted when a row is selected
1627
+ */
1628
+ rowSelect: _angular_core.OutputEmitterRef<unknown>;
1629
+ /**
1630
+ * Loading indicator
1631
+ */
1632
+ loading: _angular_core.WritableSignal<boolean>;
1633
+ /**
1634
+ * Merged configuration with defaults
1635
+ */
1636
+ mergedConfig: Required<EfDatatableConfig>;
1637
+ /**
1638
+ * Merged action configuration with defaults
1639
+ */
1640
+ mergedActions: Required<EfDatatableActions>;
1641
+ /**
1642
+ * Processed columns with defaults and computed alignment
1643
+ * Reactive to changes in columns input
1644
+ */
1645
+ processedColumns: _angular_core.Signal<{
1646
+ align: EfDatatableColumnAlign;
1647
+ field: string;
1648
+ header: string;
1649
+ type?: _elasticias_ui.EfDatatableColumnType;
1650
+ sortable?: boolean;
1651
+ resizable?: boolean;
1652
+ width?: string;
1653
+ styleClass?: string;
1654
+ dateFormat?: string;
1655
+ currencyCode?: string;
1656
+ currencyDisplay?: "symbol" | "code" | "name";
1657
+ locale?: string;
1658
+ minFractionDigits?: number;
1659
+ maxFractionDigits?: number;
1660
+ referenceKey?: string;
1661
+ referenceValueField?: string;
1662
+ referenceLabelField?: string;
1663
+ template?: _angular_core.TemplateRef<unknown>;
1664
+ headerTemplate?: _angular_core.TemplateRef<unknown>;
1665
+ }[]>;
1666
+ /**
1667
+ * Computed sort field from searchEntity for restoring table state
1668
+ */
1669
+ sortField: _angular_core.Signal<string>;
1670
+ /**
1671
+ * Computed sort order from searchEntity for restoring table state
1672
+ * 1 = ascending, -1 = descending
1673
+ */
1674
+ sortOrder: _angular_core.Signal<1 | -1>;
1675
+ private readonly locale;
1676
+ private readonly datePipe;
1677
+ private readonly decimalPipe;
1678
+ private readonly currencyPipe;
1679
+ ngOnInit(): void;
1680
+ /**
1681
+ * Handle lazy loading events from PrimeNG Table
1682
+ * Prevents duplicate events caused by reactive sortField/sortOrder binding updates
1683
+ * @param event - Table lazy load event containing pagination, sorting, filtering info
1684
+ */
1685
+ handleLazyLoad(event: TableLazyLoadEvent): void;
1686
+ /**
1687
+ * Detects if the event is a reactive binding echo (matches current searchEntity state)
1688
+ */
1689
+ private isBindingEcho;
1690
+ /**
1691
+ * Handle edit button click
1692
+ * @param rowData - The row data object
1693
+ */
1694
+ handleEdit(rowData: Record<string, unknown>): void;
1695
+ handleDelete(rowData: Record<string, unknown>): void;
1696
+ handleDuplicate(rowData: Record<string, unknown>): void;
1697
+ /**
1698
+ * Format cell value based on column type
1699
+ * @param rowData - The row data object
1700
+ * @param column - The column configuration
1701
+ * @returns Formatted string value
1702
+ */
1703
+ formatCellValue(rowData: Record<string, unknown>, column: EfDatatableColumn): string | null;
1704
+ /**
1705
+ * Resolve reference data value to display label
1706
+ * @param rowData - The row data object
1707
+ * @param column - The column configuration
1708
+ * @returns Display label from reference data
1709
+ */
1710
+ private resolveReferenceValue;
1711
+ /**
1712
+ * Get CSS class for text alignment
1713
+ * @param align - Alignment option
1714
+ * @returns CSS class name
1715
+ */
1716
+ getAlignmentClass(align?: EfDatatableColumnAlign): string;
1717
+ /**
1718
+ * Reset table to first page and clear filters
1719
+ */
1720
+ reset(): void;
1721
+ /**
1722
+ * Export table data as CSV
1723
+ */
1724
+ exportCSV(): void;
1725
+ /**
1726
+ * Get the current filter state
1727
+ */
1728
+ getFilters(): Record<string, unknown> | undefined;
1729
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDatatableComponent, never>;
1730
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDatatableComponent, "ef-datatable", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "searchEntity": { "alias": "searchEntity"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; "pt": { "alias": "pt"; "required": false; "isSignal": true; }; "screenStateKey": { "alias": "screenStateKey"; "required": false; "isSignal": true; }; }, { "editRow": "editRow"; "deleteRow": "deleteRow"; "duplicateRow": "duplicateRow"; "lazyLoad": "lazyLoad"; "rowSelect": "rowSelect"; }, never, never, true, never>;
1731
+ }
1732
+
1733
+ declare class EfDatatableActionBarComponent {
1734
+ context?: ScreenContext;
1735
+ state?: string;
1736
+ duplicate: EventEmitter<any>;
1737
+ edit: EventEmitter<any>;
1738
+ delete: EventEmitter<any>;
1739
+ duplicateButton: boolean;
1740
+ editButton: boolean;
1741
+ deleteButton: boolean;
1742
+ get hasReadPermission(): boolean;
1743
+ get hasEditPermission(): boolean;
1744
+ get hasDeletePermission(): boolean;
1745
+ duplicateAction(): void;
1746
+ editAction(): void;
1747
+ deleteAction(): void;
1748
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDatatableActionBarComponent, never>;
1749
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDatatableActionBarComponent, "ef-datatable-actionbar", never, { "context": { "alias": "context"; "required": false; }; "state": { "alias": "state"; "required": false; }; "duplicateButton": { "alias": "duplicateButton"; "required": false; }; "editButton": { "alias": "editButton"; "required": false; }; "deleteButton": { "alias": "deleteButton"; "required": false; }; }, { "duplicate": "duplicate"; "edit": "edit"; "delete": "delete"; }, never, never, true, never>;
1750
+ }
1751
+
1752
+ /**
1753
+ * Theme configurator panel for switching PrimeNG presets, primary colors,
1754
+ * surface palettes, ripple effect, and RTL direction.
1755
+ *
1756
+ * All labels use translation keys (ngx-translate). Pass keys via inputs.
1757
+ *
1758
+ * Usage:
1759
+ * ```html
1760
+ * <ef-theme-configurator
1761
+ * primaryLabelKey="configurator.primary_color"
1762
+ * surfaceLabelKey="configurator.surface"
1763
+ * presetLabelKey="configurator.preset"
1764
+ * rippleLabelKey="configurator.ripple"
1765
+ * rtlLabelKey="configurator.rtl"
1766
+ * [presetsDisplayNameKeys]="{ Aura: 'configurator.preset_compact', Lara: 'configurator.preset_modern', Material: 'configurator.preset_google', Nora: 'configurator.preset_classic' }"
1767
+ * />
1768
+ * ```
1769
+ */
1770
+ declare class EfThemeConfiguratorComponent implements OnInit {
1771
+ primaryLabelKey: string;
1772
+ surfaceLabelKey: string;
1773
+ presetLabelKey: string;
1774
+ rippleLabelKey: string;
1775
+ rtlLabelKey: string;
1776
+ presetsDisplayNameKeys: Record<string, string>;
1777
+ get ripple(): boolean;
1778
+ set ripple(value: boolean);
1779
+ get isRTL(): boolean;
1780
+ config: PrimeNG;
1781
+ configService: EfThemeConfigService;
1782
+ platformId: Object;
1783
+ presetsOptions: string[];
1784
+ onRTLChange(value: boolean): void;
1785
+ ngOnInit(): void;
1786
+ surfaces: {
1787
+ name: string;
1788
+ palette: {
1789
+ 0: string;
1790
+ 50: string;
1791
+ 100: string;
1792
+ 200: string;
1793
+ 300: string;
1794
+ 400: string;
1795
+ 500: string;
1796
+ 600: string;
1797
+ 700: string;
1798
+ 800: string;
1799
+ 900: string;
1800
+ 950: string;
1801
+ };
1802
+ }[];
1803
+ selectedPrimaryColor: _angular_core.Signal<string>;
1804
+ selectedSurfaceColor: _angular_core.Signal<string>;
1805
+ selectedPreset: _angular_core.Signal<string>;
1806
+ primaryColors: _angular_core.Signal<{
1807
+ name: string;
1808
+ palette: Record<string, string>;
1809
+ }[]>;
1810
+ getPresetExt(): Record<string, unknown>;
1811
+ updateColors(event: Event, type: string, color: {
1812
+ name: string;
1813
+ palette: Record<string, string>;
1814
+ }): void;
1815
+ applyTheme(type: string, color: {
1816
+ name: string;
1817
+ palette: Record<string, string>;
1818
+ }): void;
1819
+ onPresetChange(event: string): void;
1820
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfThemeConfiguratorComponent, never>;
1821
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfThemeConfiguratorComponent, "ef-theme-configurator", never, { "primaryLabelKey": { "alias": "primaryLabelKey"; "required": false; }; "surfaceLabelKey": { "alias": "surfaceLabelKey"; "required": false; }; "presetLabelKey": { "alias": "presetLabelKey"; "required": false; }; "rippleLabelKey": { "alias": "rippleLabelKey"; "required": false; }; "rtlLabelKey": { "alias": "rtlLabelKey"; "required": false; }; "presetsDisplayNameKeys": { "alias": "presetsDisplayNameKeys"; "required": false; }; }, {}, never, never, true, never>;
1822
+ }
1823
+
1824
+ type RangeKey = '7d' | '30d' | '90d';
1825
+ /**
1826
+ * Manager dashboard widget: email engagement KPIs, category breakdown, recent events.
1827
+ * Keep this presentational — host app fetches metrics + supplies `rangeChange` callback.
1828
+ *
1829
+ * @example
1830
+ * <ef-email-metrics-card
1831
+ * [metrics]="metrics()"
1832
+ * [recentEvents]="events()"
1833
+ * [loading]="loading()"
1834
+ * (rangeChange)="reload($event)"
1835
+ * />
1836
+ */
1837
+ declare class EfEmailMetricsCardComponent {
1838
+ metrics: _angular_core.InputSignal<EmailMetrics>;
1839
+ recentEvents: _angular_core.InputSignal<EmailEventRecord[]>;
1840
+ loading: _angular_core.InputSignal<boolean>;
1841
+ title: _angular_core.InputSignal<string>;
1842
+ selectedRange: RangeKey;
1843
+ rangeOptions: {
1844
+ label: string;
1845
+ value: string;
1846
+ }[];
1847
+ hasData: _angular_core.Signal<boolean>;
1848
+ kpis: _angular_core.Signal<({
1849
+ label: string;
1850
+ value: number;
1851
+ tone: "neutral";
1852
+ rate?: undefined;
1853
+ } | {
1854
+ label: string;
1855
+ value: number;
1856
+ rate: boolean;
1857
+ tone: "warn" | "neutral" | "good";
1858
+ })[]>;
1859
+ onRangeChange(value: RangeKey): void;
1860
+ readonly rangeChange: _angular_core.OutputEmitterRef<RangeKey>;
1861
+ kindSeverity(kind: EmailEventKind): 'success' | 'info' | 'warn' | 'danger' | 'secondary';
1862
+ private rateTone;
1863
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfEmailMetricsCardComponent, never>;
1864
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfEmailMetricsCardComponent, "ef-email-metrics-card", never, { "metrics": { "alias": "metrics"; "required": false; "isSignal": true; }; "recentEvents": { "alias": "recentEvents"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; }, { "rangeChange": "rangeChange"; }, never, never, true, never>;
1865
+ }
1866
+
1867
+ export { EF_BADGE_BG_COLORS, EF_BADGE_BG_LIGHT_COLORS, EF_BADGE_BORDER_COLORS, EF_BADGE_DEFAULTS, EF_BADGE_TEXT_COLORS, EF_DATATABLE_ACTIONS_DEFAULTS, EF_DATATABLE_COLUMN_DEFAULTS, EF_DATATABLE_DEFAULTS, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfButtonComponent, EfCheckboxComponent, EfCurrencyPipe, EfDatatableActionBarComponent, EfDatatableComponent, EfDatepickerComponent, EfDialogComponent, EfEmailMetricsCardComponent, EfFieldsetComponent, EfInputNumberComponent, EfInputTextComponent, EfLabelComponent, EfMultiSelectComponent, EfOrderBuilderComponent, EfOrderSummaryComponent, EfPasswordComponent, EfPriceDisplayComponent, EfProductCatalogueComponent, EfProductCatalogueFilterComponent, EfQuantitySelectorComponent, EfQuantityStepperComponent, EfSelectButtonComponent, EfSelectComponent, EfThemeConfiguratorComponent, EfToolbarComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, getColumnAlignment, mergeColumnDefaults };
1868
+ export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfDatatableActions, EfDatatableColumn, EfDatatableColumnAlign, EfDatatableColumnType, EfDatatableConfig, OrderChangeInfo, OrderEntity, OrderLineItem, OrderProductsSummary, OrderSummaryItem, ProductCountGroup, ProductCountGroupLabel, ProductWithCountGroup, SelectedFilter, ValidationResult };