@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.
- package/README.md +7 -0
- package/fesm2022/elasticias-ui.mjs +4387 -0
- package/fesm2022/elasticias-ui.mjs.map +1 -0
- package/package.json +41 -0
- package/types/elasticias-ui.d.ts +1868 -0
|
@@ -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 };
|