@ncim/sdk 0.3.0 → 0.3.1

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.
@@ -1,2 +1,2 @@
1
- export { i as NcimCore, d as NcimFeatures, e as NcimState, f as NcimUI } from './ncim-sdk-ncim-sdk-Cxn6UL5k.mjs';
1
+ export { i as NcimCore, d as NcimFeatures, e as NcimState, f as NcimUI } from './ncim-sdk-ncim-sdk-DmQ2diWe.mjs';
2
2
  //# sourceMappingURL=ncim-sdk.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncim/sdk",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "ncim Compliance Dashboard — publishable SDK wrapping core, ui-components, shared-state, and features libraries",
5
5
  "keywords": [
6
6
  "angular",
@@ -792,7 +792,7 @@ declare class NewTicketDialog {
792
792
  private readonly translate;
793
793
  readonly visible: _angular_core.InputSignal<boolean>;
794
794
  readonly visibleChange: _angular_core.OutputEmitterRef<boolean>;
795
- readonly view: _angular_core.WritableSignal<"success" | "form">;
795
+ readonly view: _angular_core.WritableSignal<"form" | "success">;
796
796
  readonly attachedFiles: _angular_core.WritableSignal<File[]>;
797
797
  readonly ticketNumber: _angular_core.WritableSignal<string>;
798
798
  readonly submitted: _angular_core.WritableSignal<boolean>;
@@ -1,23 +1,15 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { ElementRef, AfterContentInit, AfterViewInit, OnDestroy, TemplateRef, DestroyRef } from '@angular/core';
2
+ import { AfterViewInit, DestroyRef, ElementRef, AfterContentInit, OnDestroy, TemplateRef } from '@angular/core';
3
3
  import { IconName, InputType, TrendDirection, MarkerStatus, MapLegendStatus } from './ncim-sdk-core';
4
- import { PopupModalBase as PopupModalBase$1 } from './ncim-sdk-ui';
5
4
  import { ControlValueAccessor, FormControl, FormGroup, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
6
- import { QuickFilterTag as QuickFilterTag$1 } from './ncim-sdk-ui';
7
- import { SelectOption as SelectOption$1 } from './ncim-sdk-ui';
8
- import { InputFilter as InputFilter$1 } from './ncim-sdk-ui';
9
5
  import * as _libs_core from './ncim-sdk-core';
10
6
  import { ExportPdfOptions } from './ncim-sdk-core';
11
7
  import { ViolationFine, ViolationBusiness, ViolationCorrectionPeriod } from './ncim-sdk-core';
12
8
  import { EChartsOption } from 'echarts';
13
- import { MapMarkerData as MapMarkerData$1 } from './ncim-sdk-ui';
14
9
  import { TranslateService } from '@ngx-translate/core';
15
10
  import { MenuItem } from 'primeng/api';
16
- import { BreadcrumbItem as BreadcrumbItem$1 } from './ncim-sdk-ui';
17
- import { AccordionItem as AccordionItem$1 } from './ncim-sdk-ui';
18
11
  import { ButtonSeverity } from 'primeng/button';
19
12
  import * as _angular_platform_browser from '@angular/platform-browser';
20
- import { Popup as Popup$1 } from './ncim-sdk-ui';
21
13
  import { LoadingService } from './ncim-sdk-core';
22
14
 
23
15
  interface NavItem {
@@ -73,7 +65,56 @@ declare class Sidebar {
73
65
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<Sidebar, "ncim-sidebar", never, { "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "sections": { "alias": "sections"; "required": false; "isSignal": true; }; "notificationCount": { "alias": "notificationCount"; "required": false; "isSignal": true; }; "userAvatar": { "alias": "userAvatar"; "required": false; "isSignal": true; }; "showCompleteTraining": { "alias": "showCompleteTraining"; "required": false; "isSignal": true; }; "showAppsMenu": { "alias": "showAppsMenu"; "required": false; "isSignal": true; }; "activeActionId": { "alias": "activeActionId"; "required": false; "isSignal": true; }; "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "panelOpen": { "alias": "panelOpen"; "required": false; "isSignal": true; }; }, { "isOpen": "isOpenChange"; "panelOpen": "panelOpenChange"; "footerActionClick": "footerActionClick"; "menuToggle": "menuToggle"; }, never, never, true, never>;
74
66
  }
75
67
 
76
- declare class LogoutModal extends PopupModalBase$1 {
68
+ declare class Popup {
69
+ readonly open: _angular_core.InputSignal<boolean>;
70
+ readonly title: _angular_core.InputSignal<string>;
71
+ readonly footerBorder: _angular_core.InputSignal<boolean>;
72
+ readonly footerStyle: _angular_core.InputSignal<boolean>;
73
+ readonly showCloseButton: _angular_core.InputSignal<boolean>;
74
+ readonly showBackButton: _angular_core.InputSignal<boolean>;
75
+ readonly largeHeader: _angular_core.InputSignal<boolean>;
76
+ readonly closeOnBackdropClick: _angular_core.InputSignal<boolean>;
77
+ readonly size: _angular_core.InputSignal<"small" | "medium" | "large" | "extra-large">;
78
+ readonly width: _angular_core.InputSignal<string>;
79
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
80
+ readonly backClicked: _angular_core.OutputEmitterRef<void>;
81
+ protected readonly titleId: string;
82
+ protected readonly dialogStyle: _angular_core.Signal<{
83
+ width: string;
84
+ maxWidth: string;
85
+ }>;
86
+ /**
87
+ * Guard against double-emission: when the close button is clicked,
88
+ * `close()` emits `dismissed` directly. PrimeNG then hides the dialog
89
+ * and fires `onHide` — we skip that second emission.
90
+ */
91
+ private _closedByButton;
92
+ /** Called by the × button in the header. */
93
+ close(): void;
94
+ /**
95
+ * Called by PrimeNG when the dialog hides — covers dismissableMask
96
+ * (backdrop click) and ESC key. The close-button path is guarded above.
97
+ */
98
+ onHide(): void;
99
+ back(): void;
100
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Popup, never>;
101
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Popup, "ncim-popup", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "footerBorder": { "alias": "footerBorder"; "required": false; "isSignal": true; }; "footerStyle": { "alias": "footerStyle"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "showBackButton": { "alias": "showBackButton"; "required": false; "isSignal": true; }; "largeHeader": { "alias": "largeHeader"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "backClicked": "backClicked"; }, never, ["[subTitle]", "*", "[popupFooter]"], true, never>;
102
+ }
103
+
104
+ declare abstract class PopupModalBase<T = unknown> implements AfterViewInit {
105
+ protected readonly destroyRef: DestroyRef;
106
+ readonly modalData: _angular_core.WritableSignal<T | null>;
107
+ readonly isOpen: _angular_core.WritableSignal<boolean>;
108
+ readonly popup: _angular_core.Signal<Popup>;
109
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
110
+ openModal(data?: T): void;
111
+ closeModal(): void;
112
+ ngAfterViewInit(): void;
113
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopupModalBase<any>, never>;
114
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopupModalBase<any>, "ng-component", never, {}, { "dismissed": "dismissed"; }, never, never, true, never>;
115
+ }
116
+
117
+ declare class LogoutModal extends PopupModalBase {
77
118
  readonly confirmed: _angular_core.OutputEmitterRef<void>;
78
119
  protected onConfirm(): void;
79
120
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LogoutModal, never>;
@@ -180,7 +221,7 @@ declare class OtpInput implements ControlValueAccessor {
180
221
  }
181
222
 
182
223
  declare class NcimButton {
183
- readonly variant: _angular_core.InputSignal<"primary" | "black" | "neutral" | "secondary" | "transparent" | "outline" | "link">;
224
+ readonly variant: _angular_core.InputSignal<"link" | "primary" | "black" | "neutral" | "secondary" | "transparent" | "outline">;
184
225
  readonly type: _angular_core.InputSignal<"button" | "submit">;
185
226
  readonly fullWidth: _angular_core.InputSignal<boolean>;
186
227
  readonly disabled: _angular_core.InputSignal<boolean>;
@@ -206,7 +247,7 @@ interface StepItem {
206
247
  }
207
248
  declare class Stepper {
208
249
  readonly steps: _angular_core.InputSignal<StepItem[]>;
209
- readonly variant: _angular_core.InputSignal<"progress" | "steps" | "pills">;
250
+ readonly variant: _angular_core.InputSignal<"steps" | "progress" | "pills">;
210
251
  readonly linear: _angular_core.InputSignal<boolean>;
211
252
  readonly width: _angular_core.InputSignal<number>;
212
253
  readonly stepChange: _angular_core.OutputEmitterRef<string>;
@@ -221,7 +262,7 @@ declare class RegisterLayout {
221
262
  readonly sidebarDescription: _angular_core.InputSignal<string>;
222
263
  readonly sidebarImage: _angular_core.InputSignal<string>;
223
264
  readonly steps: _angular_core.InputSignal<StepItem[]>;
224
- readonly stepperVariant: _angular_core.InputSignal<"progress" | "steps">;
265
+ readonly stepperVariant: _angular_core.InputSignal<"steps" | "progress">;
225
266
  readonly linear: _angular_core.InputSignal<boolean>;
226
267
  readonly stepChange: _angular_core.OutputEmitterRef<string>;
227
268
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RegisterLayout, never>;
@@ -379,7 +420,7 @@ interface TabItem {
379
420
  declare class Tabs {
380
421
  readonly items: _angular_core.InputSignal<TabItem[]>;
381
422
  readonly activeId: _angular_core.InputSignal<string>;
382
- readonly variant: _angular_core.InputSignal<"default" | "pills" | "underline">;
423
+ readonly variant: _angular_core.InputSignal<"pills" | "default" | "underline">;
383
424
  readonly size: _angular_core.InputSignal<"small" | "medium" | "large">;
384
425
  readonly justify: _angular_core.InputSignal<"start" | "end" | "center" | "between">;
385
426
  readonly tabChange: _angular_core.OutputEmitterRef<string>;
@@ -468,14 +509,14 @@ declare class FormInput implements ControlValueAccessor {
468
509
  readonly isDate: _angular_core.Signal<boolean>;
469
510
  readonly isDateTime: _angular_core.Signal<boolean>;
470
511
  readonly isDatePicker: _angular_core.Signal<boolean>;
471
- readonly datePickerAppendTo: _angular_core.Signal<"body" | HTMLElement | "self" | null | undefined>;
512
+ readonly datePickerAppendTo: _angular_core.Signal<HTMLElement | "body" | "self" | null | undefined>;
472
513
  readonly isTextarea: _angular_core.Signal<boolean>;
473
514
  readonly isCheckboxRadio: _angular_core.Signal<boolean>;
474
515
  readonly maxLength: _angular_core.Signal<10 | 255>;
475
516
  readonly inputType: _angular_core.Signal<InputType | "tel" | "datetime-local">;
476
517
  readonly inputMode: _angular_core.Signal<"numeric" | "tel" | null>;
477
518
  readonly autocomplete: _angular_core.Signal<"off" | "tel">;
478
- readonly inputFilter: _angular_core.Signal<"phone" | "numeric" | "noComma" | null>;
519
+ readonly inputFilter: _angular_core.Signal<"numeric" | "phone" | "noComma" | null>;
479
520
  private static readonly ERROR_MAP;
480
521
  readonly errorKey: _angular_core.Signal<string>;
481
522
  readonly showError: _angular_core.Signal<boolean>;
@@ -524,6 +565,20 @@ declare class FormMultiSelect {
524
565
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormMultiSelect, "ncim-form-multi-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "maxSelectedLabels": { "alias": "maxSelectedLabels"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "focusEvent": "focusEvent"; "blurEvent": "blurEvent"; }, never, never, true, never>;
525
566
  }
526
567
 
568
+ /** A single active filter tag (e.g. "الحالة (1): جسيمة") */
569
+ interface QuickFilterTag {
570
+ /** Filter label (e.g. "الحالة", "المدينة") */
571
+ label: string;
572
+ /** Number of selected items */
573
+ count: number;
574
+ /** Display value for single-value tags */
575
+ value: string;
576
+ /** Individual display values for multi-value tags — renders separate removable badges */
577
+ values?: string[];
578
+ /** Optional key for removal */
579
+ key?: string;
580
+ }
581
+
527
582
  type FilterFieldType = 'text' | 'select' | 'multiselect' | 'date' | 'datetime' | 'date-range' | 'number' | 'search' | 'checkbox' | 'radio' | 'checkbox-search' | 'divider';
528
583
  interface FilterFieldConfig {
529
584
  /** Unique key — maps directly to the signal model property */
@@ -541,7 +596,7 @@ interface FilterFieldConfig {
541
596
  /** Icon position — defaults to 'end' */
542
597
  iconPosition?: 'start' | 'end';
543
598
  /** Options list — required when type === 'select' | 'multiselect' | 'checkbox' | 'checkbox-search' | 'radio' */
544
- options?: SelectOption$1[];
599
+ options?: SelectOption[];
545
600
  /**
546
601
  * CSS track size for this field's column.
547
602
  * Used only in auto layout (when FilterFormConfig.columns is NOT set).
@@ -566,7 +621,7 @@ interface FilterFieldConfig {
566
621
  /** Name attribute for radio groups — auto-generated if omitted */
567
622
  radioName?: string;
568
623
  /** Optional input filter override (e.g. 'noComma' for search fields). */
569
- inputFilter?: InputFilter$1;
624
+ inputFilter?: InputFilter;
570
625
  }
571
626
  interface FilterFormConfig {
572
627
  /** All field definitions */
@@ -613,7 +668,7 @@ declare class FilterForm implements OnDestroy {
613
668
  readonly hasActiveFilters: _angular_core.Signal<boolean>;
614
669
  readonly fieldStringValues: _angular_core.Signal<Record<string, string>>;
615
670
  readonly fieldMultiValues: _angular_core.Signal<Record<string, string[]>>;
616
- readonly activeFilterTags: _angular_core.Signal<QuickFilterTag$1[]>;
671
+ readonly activeFilterTags: _angular_core.Signal<QuickFilterTag[]>;
617
672
  private _debounceTimer;
618
673
  constructor();
619
674
  ngOnDestroy(): void;
@@ -627,7 +682,7 @@ declare class FilterForm implements OnDestroy {
627
682
  onSubmit(): void;
628
683
  onReset(): void;
629
684
  onClearAll(): void;
630
- onFilterTagClick(tag: QuickFilterTag$1): void;
685
+ onFilterTagClick(tag: QuickFilterTag): void;
631
686
  private defaultFor;
632
687
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterForm, never>;
633
688
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterForm, "ncim-filter-form", never, { "config": { "alias": "config"; "required": true; "isSignal": true; }; "quickFilterTitle": { "alias": "quickFilterTitle"; "required": false; "isSignal": true; }; "quickFilterCounter": { "alias": "quickFilterCounter"; "required": false; "isSignal": true; }; }, { "filterChange": "filterChange"; "filterSubmit": "filterSubmit"; "filterReset": "filterReset"; "saveFilterClick": "saveFilterClick"; }, never, never, true, never>;
@@ -788,7 +843,7 @@ declare class StatsAnalyticsCard {
788
843
  readonly chartShowArea: _angular_core.InputSignal<boolean>;
789
844
  /** Sparkline ↔ text gap: `sm` 12px (first KPI card), `md` 16px (second). */
790
845
  readonly surfaceGap: _angular_core.InputSignal<"sm" | "md">;
791
- readonly trendIcon: _angular_core.Signal<"trend-down-arrow" | "trend-up-arrow">;
846
+ readonly trendIcon: _angular_core.Signal<"trend-up-arrow" | "trend-down-arrow">;
792
847
  readonly showChart: _angular_core.Signal<boolean>;
793
848
  /** Mutable series for `ncim-sparkline` — satisfies template assignability to `number[]`. */
794
849
  readonly sparklineData: _angular_core.Signal<number[]>;
@@ -1439,7 +1494,7 @@ declare class CategoryTile {
1439
1494
  readonly label: _angular_core.InputSignal<string>;
1440
1495
  readonly routerLink: _angular_core.InputSignal<string | undefined>;
1441
1496
  readonly description: _angular_core.InputSignal<string | null>;
1442
- readonly variant: _angular_core.InputSignal<"narrow" | "wide">;
1497
+ readonly variant: _angular_core.InputSignal<"wide" | "narrow">;
1443
1498
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CategoryTile, never>;
1444
1499
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CategoryTile, "ncim-category-tile", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "routerLink": { "alias": "routerLink"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1445
1500
  }
@@ -1786,7 +1841,7 @@ declare class StoreLocations {
1786
1841
  readonly zoom: _angular_core.InputSignal<number>;
1787
1842
  readonly centerLat: _angular_core.InputSignal<number>;
1788
1843
  readonly centerLng: _angular_core.InputSignal<number>;
1789
- readonly markers: _angular_core.InputSignal<MapMarkerData$1[]>;
1844
+ readonly markers: _angular_core.InputSignal<MapMarkerData[]>;
1790
1845
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StoreLocations, never>;
1791
1846
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StoreLocations, "ncim-store-locations", never, { "showHeader": { "alias": "showHeader"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "centerLat": { "alias": "centerLat"; "required": false; "isSignal": true; }; "centerLng": { "alias": "centerLng"; "required": false; "isSignal": true; }; "markers": { "alias": "markers"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1792
1847
  }
@@ -2047,7 +2102,7 @@ declare class Breadcrumb {
2047
2102
  declare class PageHeader {
2048
2103
  readonly titleKey: _angular_core.InputSignal<string>;
2049
2104
  readonly title: _angular_core.InputSignal<string>;
2050
- readonly breadcrumbItems: _angular_core.InputSignal<BreadcrumbItem$1[]>;
2105
+ readonly breadcrumbItems: _angular_core.InputSignal<BreadcrumbItem[]>;
2051
2106
  readonly showBreadcrumb: _angular_core.InputSignal<boolean>;
2052
2107
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageHeader, never>;
2053
2108
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageHeader, "ncim-page-header", never, { "titleKey": { "alias": "titleKey"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "breadcrumbItems": { "alias": "breadcrumbItems"; "required": false; "isSignal": true; }; "showBreadcrumb": { "alias": "showBreadcrumb"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -2129,7 +2184,7 @@ declare class ArticleDetail {
2129
2184
  readonly videoSrc: _angular_core.InputSignal<string>;
2130
2185
  readonly titleKey: _angular_core.InputSignal<string>;
2131
2186
  readonly contentKey: _angular_core.InputSignal<string>;
2132
- readonly accordionItems: _angular_core.InputSignal<AccordionItem$1[]>;
2187
+ readonly accordionItems: _angular_core.InputSignal<AccordionItem[]>;
2133
2188
  readonly accordionTitleKey: _angular_core.InputSignal<string>;
2134
2189
  readonly feedback: _angular_core.OutputEmitterRef<"yes" | "no">;
2135
2190
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ArticleDetail, never>;
@@ -2165,7 +2220,7 @@ declare class ArticleSidebar {
2165
2220
 
2166
2221
  declare class CardsListPage {
2167
2222
  readonly titleKey: _angular_core.InputSignal<string>;
2168
- readonly breadcrumbItems: _angular_core.InputSignal<BreadcrumbItem$1[]>;
2223
+ readonly breadcrumbItems: _angular_core.InputSignal<BreadcrumbItem[]>;
2169
2224
  readonly items: _angular_core.InputSignal<NavCardItem[]>;
2170
2225
  readonly getItemRoute: _angular_core.InputSignal<(slug: string) => string[]>;
2171
2226
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardsListPage, never>;
@@ -2174,10 +2229,10 @@ declare class CardsListPage {
2174
2229
 
2175
2230
  declare class ArticlePage {
2176
2231
  readonly titleKey: _angular_core.InputSignal<string>;
2177
- readonly breadcrumbItems: _angular_core.InputSignal<BreadcrumbItem$1[]>;
2232
+ readonly breadcrumbItems: _angular_core.InputSignal<BreadcrumbItem[]>;
2178
2233
  readonly videoSrc: _angular_core.InputSignal<string>;
2179
2234
  readonly contentKey: _angular_core.InputSignal<string>;
2180
- readonly accordionItems: _angular_core.InputSignal<AccordionItem$1[]>;
2235
+ readonly accordionItems: _angular_core.InputSignal<AccordionItem[]>;
2181
2236
  readonly accordionTitleKey: _angular_core.InputSignal<string>;
2182
2237
  readonly resources: _angular_core.InputSignal<ResourceItem[]>;
2183
2238
  readonly relatedItems: _angular_core.InputSignal<RelatedCardItem[]>;
@@ -2564,56 +2619,7 @@ declare class FeedbackSection {
2564
2619
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FeedbackSection, "ncim-feedback-section", never, { "questionKey": { "alias": "questionKey"; "required": false; "isSignal": true; }; "yesKey": { "alias": "yesKey"; "required": false; "isSignal": true; }; "noKey": { "alias": "noKey"; "required": false; "isSignal": true; }; }, { "feedback": "feedback"; }, never, never, true, never>;
2565
2620
  }
2566
2621
 
2567
- declare class Popup {
2568
- readonly open: _angular_core.InputSignal<boolean>;
2569
- readonly title: _angular_core.InputSignal<string>;
2570
- readonly footerBorder: _angular_core.InputSignal<boolean>;
2571
- readonly footerStyle: _angular_core.InputSignal<boolean>;
2572
- readonly showCloseButton: _angular_core.InputSignal<boolean>;
2573
- readonly showBackButton: _angular_core.InputSignal<boolean>;
2574
- readonly largeHeader: _angular_core.InputSignal<boolean>;
2575
- readonly closeOnBackdropClick: _angular_core.InputSignal<boolean>;
2576
- readonly size: _angular_core.InputSignal<"small" | "medium" | "large" | "extra-large">;
2577
- readonly width: _angular_core.InputSignal<string>;
2578
- readonly dismissed: _angular_core.OutputEmitterRef<void>;
2579
- readonly backClicked: _angular_core.OutputEmitterRef<void>;
2580
- protected readonly titleId: string;
2581
- protected readonly dialogStyle: _angular_core.Signal<{
2582
- width: string;
2583
- maxWidth: string;
2584
- }>;
2585
- /**
2586
- * Guard against double-emission: when the close button is clicked,
2587
- * `close()` emits `dismissed` directly. PrimeNG then hides the dialog
2588
- * and fires `onHide` — we skip that second emission.
2589
- */
2590
- private _closedByButton;
2591
- /** Called by the × button in the header. */
2592
- close(): void;
2593
- /**
2594
- * Called by PrimeNG when the dialog hides — covers dismissableMask
2595
- * (backdrop click) and ESC key. The close-button path is guarded above.
2596
- */
2597
- onHide(): void;
2598
- back(): void;
2599
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<Popup, never>;
2600
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Popup, "ncim-popup", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "footerBorder": { "alias": "footerBorder"; "required": false; "isSignal": true; }; "footerStyle": { "alias": "footerStyle"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "showBackButton": { "alias": "showBackButton"; "required": false; "isSignal": true; }; "largeHeader": { "alias": "largeHeader"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "backClicked": "backClicked"; }, never, ["[subTitle]", "*", "[popupFooter]"], true, never>;
2601
- }
2602
-
2603
- declare abstract class PopupModalBase<T = unknown> implements AfterViewInit {
2604
- protected readonly destroyRef: DestroyRef;
2605
- readonly modalData: _angular_core.WritableSignal<T | null>;
2606
- readonly isOpen: _angular_core.WritableSignal<boolean>;
2607
- readonly popup: _angular_core.Signal<Popup$1>;
2608
- readonly dismissed: _angular_core.OutputEmitterRef<void>;
2609
- openModal(data?: T): void;
2610
- closeModal(): void;
2611
- ngAfterViewInit(): void;
2612
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopupModalBase<any>, never>;
2613
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PopupModalBase<any>, "ng-component", never, {}, { "dismissed": "dismissed"; }, never, never, true, never>;
2614
- }
2615
-
2616
- declare class SaveFilterPopup extends PopupModalBase$1 {
2622
+ declare class SaveFilterPopup extends PopupModalBase {
2617
2623
  readonly mode: _angular_core.InputSignal<"edit" | "add">;
2618
2624
  readonly initialTitle: _angular_core.InputSignal<string>;
2619
2625
  readonly saveLoading: _angular_core.InputSignal<boolean>;
@@ -2636,20 +2642,6 @@ declare class SaveFilterPopup extends PopupModalBase$1 {
2636
2642
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SaveFilterPopup, "ncim-save-filter-popup", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "initialTitle": { "alias": "initialTitle"; "required": false; "isSignal": true; }; "saveLoading": { "alias": "saveLoading"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "deleted": "deleted"; }, never, never, true, never>;
2637
2643
  }
2638
2644
 
2639
- /** A single active filter tag (e.g. "الحالة (1): جسيمة") */
2640
- interface QuickFilterTag {
2641
- /** Filter label (e.g. "الحالة", "المدينة") */
2642
- label: string;
2643
- /** Number of selected items */
2644
- count: number;
2645
- /** Display value for single-value tags */
2646
- value: string;
2647
- /** Individual display values for multi-value tags — renders separate removable badges */
2648
- values?: string[];
2649
- /** Optional key for removal */
2650
- key?: string;
2651
- }
2652
-
2653
2645
  declare class QuickFilterBar {
2654
2646
  readonly activeFilters: _angular_core.InputSignal<QuickFilterTag[]>;
2655
2647
  readonly showSaveFilter: _angular_core.InputSignal<boolean>;