@rangertechnologies/ngnxt 2.1.352 → 2.1.353

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.
@@ -6,6 +6,43 @@ import { ChangeService } from '../../services/change/change.service';
6
6
  import { StorageService } from '../../services/storage/storage.service';
7
7
  import { CountryService } from '../../services/country/country.service';
8
8
  import * as i0 from "@angular/core";
9
+ /** Configuration for a single advanced-filter control. */
10
+ export interface AdvancedFilterConfig {
11
+ /** Data field path (supports dot-notation, e.g. 'employee.name'). */
12
+ field: string;
13
+ /** Human-readable label shown above the control. */
14
+ label: string;
15
+ /** Control type determines which reusable control is rendered. */
16
+ type: 'text' | 'date' | 'dropdown' | 'list';
17
+ /** Options list for 'dropdown' and 'searchDropdown' types.
18
+ * Each option should have the shape: { id, name, value, label, ... }
19
+ * Use `labelField` to pick the display property and `valueField` for the match value. */
20
+ options?: any[];
21
+ /** Placeholder text shown inside the control. */
22
+ placeholder?: string;
23
+ /** Property on an option object used as display label (default: 'label'). */
24
+ labelField?: string;
25
+ /** Property on an option object used as the filter/match value (default: 'value').
26
+ * For searchDropdown, the emitted object `{ id, name, value }` is read with this key. */
27
+ valueField?: string;
28
+ /** CSS width for the control, e.g. '180px'. Defaults to 160px for text, 190px for dropdowns. */
29
+ width?: string;
30
+ /** Evaluation priority. Lower number runs first. Default: index order. */
31
+ priority?: number;
32
+ /** Pre-populate this filter with a default value on init. */
33
+ defaultValue?: any;
34
+ /** If true, the control is rendered in read-only/disabled state. */
35
+ disabled?: boolean;
36
+ /** If true, the filter item is not rendered in the bar. */
37
+ hidden?: boolean;
38
+ }
39
+ /** SKS1JUL26 Represents a date-range filter value for type:'date' fields. */
40
+ export interface AdvancedDateRange {
41
+ startDate: string;
42
+ endDate: string;
43
+ }
44
+ /** SKS1JUL26 Map of field -> current filter value (scalar or date-range). */
45
+ export type AdvancedFilterValues = Record<string, string | AdvancedDateRange | null>;
9
46
  export declare class NxtDatatable {
10
47
  private countryService;
11
48
  private storageService;
@@ -68,6 +105,8 @@ export declare class NxtDatatable {
68
105
  onlyView: boolean;
69
106
  tableHeight: any;
70
107
  serialNumberColumn: boolean;
108
+ /** SKS1JUL26 SKS1JUL26: Configuration array for the advanced filter bar. Each entry produces one filter control. */
109
+ advancedFilters: AdvancedFilterConfig[];
71
110
  tableRowClick: EventEmitter<any>;
72
111
  onEditData: EventEmitter<any>;
73
112
  onSaveData: EventEmitter<any>;
@@ -164,6 +203,15 @@ export declare class NxtDatatable {
164
203
  selectedIsEmpty: boolean;
165
204
  private destroy$;
166
205
  private timers;
206
+ /** Current values for every advanced filter control. */
207
+ advancedFilterValues: AdvancedFilterValues;
208
+ /**
209
+ * SKS1JUL26: Emits a JSON-serialised snapshot of advancedFilterValues
210
+ * so that debounceTime(300) + distinctUntilChanged() both work correctly.
211
+ * Subject<void> makes distinctUntilChanged useless because every emission
212
+ * looks the same. Subject<string> compares serialised state.
213
+ */
214
+ private advancedFilter$;
167
215
  constructor(countryService: CountryService, storageService: StorageService, cdRef: ChangeDetectorRef, translationService: TranslationService, renderer: Renderer2, dataService: DataService, changeService: ChangeService);
168
216
  ngOnChanges(changes: SimpleChanges): void;
169
217
  ngOnInit(): void;
@@ -239,6 +287,86 @@ export declare class NxtDatatable {
239
287
  groupFilterEmit(event: any, from?: any): void;
240
288
  groupFilterRetain(filterkey: any, from?: any): void;
241
289
  changeAnnounce(event: any): void;
290
+ /**
291
+ * THE SINGLE UNIFIED FILTER PIPELINE (client-side mode).
292
+ *
293
+ * Pipeline order matches the documented priority:
294
+ * originalData
295
+ * 1. List View → sFilterData (managed by listViewEmit / ngOnChanges)
296
+ * 2. Advanced Filter → applyAdvancedFilters(sFilterData)
297
+ * 3. Global Search → searchBoxValue contains match
298
+ * 4. Column Filter → filterDataArray exact match
299
+ * 5. Sort → currentSortColumn / currentSortDirection
300
+ * 6. Pagination → pageIndex / pageSize → dataSource.data
301
+ *
302
+ * For server-side (pagination=true), we skip client filtering and just emit
303
+ * the full params object (including advancedFilterData) to the parent.
304
+ *
305
+ * All event handlers (onAdvancedFilterChange, applyFilter, filterRetain,
306
+ * checkedData, closefilter, pageParams) ultimately call this method so
307
+ * there is exactly ONE place where filtering logic lives.
308
+ */
309
+ refreshTableData(from?: string): void;
310
+ /**
311
+ * Builds the `advancedFilterValues` map from the current `advancedFilters` config.
312
+ * Existing values are preserved if their field still exists in the new config.
313
+ * Respects `defaultValue` from the config for initial population.
314
+ */
315
+ initializeAdvancedFilters(): void;
316
+ /**
317
+ * Called from the template whenever any advanced filter control changes.
318
+ *
319
+ * @param field - The data field this filter maps to
320
+ * @param value - New value:
321
+ * - text/dropdown: plain string
322
+ * - searchDropdown: scalar extracted via config.valueField from
323
+ * the emitted object shape `{ id, name, value, label, ... }`
324
+ * - date: ISO 8601 string from app-nxt-datepicker
325
+ * @param subKey - For date filters only: 'startDate' | 'endDate'
326
+ */
327
+ onAdvancedFilterChange(field: string, value: any, subKey?: 'startDate' | 'endDate'): void;
328
+ /**
329
+ * Applies current advancedFilterValues against a data array.
330
+ * Returns a new filtered array — never mutates the input.
331
+ *
332
+ * Reuses existing helpers:
333
+ * - getObjValue() for field access
334
+ * - formatDateForSearch() for display-safe date formatting (NxtDatePipe)
335
+ *
336
+ * Date comparison uses formatDateForSearch() on both cell and filter values
337
+ * so timezone handling is consistent with the rest of the table.
338
+ *
339
+ * Filter logic per type:
340
+ * text → case-insensitive contains
341
+ * dropdown → strict string equality
342
+ * searchDropdown → strict string equality on extracted valueField
343
+ * date → >= startDate and/or <= endDate (normalised via NxtDatePipe)
344
+ */
345
+ applyAdvancedFilters(baseData: any[]): any[];
346
+ /**
347
+ * Resets all advanced filter values and re-runs the unified pipeline.
348
+ * pageIndex is reset to 1 so users don't get confused on high page numbers.
349
+ */
350
+ clearAdvancedFilters(): void;
351
+ /**
352
+ * Returns true if at least one visible advanced filter field has a non-empty value.
353
+ * Used in the template to decide whether to show the clear-all button.
354
+ */
355
+ hasAdvancedFilter(): boolean;
356
+ /**
357
+ * Returns a clean snapshot of the ACTIVE advanced filter values.
358
+ * Included in NxtTableParamsEmit so server-side implementations receive
359
+ * the filter state under the `advancedFilterData` key:
360
+ *
361
+ * tableParams = {
362
+ * pagination: { pageSize, pageIndex },
363
+ * tableSearch: { fields, value },
364
+ * searchFilterData: { [column]: [values] },
365
+ * advancedFilterData: { [field]: string | AdvancedDateRange }, ← NEW
366
+ * sort: { column, direction, listView },
367
+ * }
368
+ */
369
+ buildAdvancedFilterObject(): AdvancedFilterValues;
242
370
  static ɵfac: i0.ɵɵFactoryDeclaration<NxtDatatable, never>;
243
- static ɵcmp: i0.ɵɵComponentDeclaration<NxtDatatable, "nxt-datatable", never, { "data": { "alias": "data"; "required": false; }; "summaryValues": { "alias": "summaryValues"; "required": false; }; "tableFilterData": { "alias": "tableFilterData"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "withCheckBox": { "alias": "withCheckBox"; "required": false; }; "searchBar": { "alias": "searchBar"; "required": false; }; "tableSaveButton": { "alias": "tableSaveButton"; "required": false; }; "hideSaveButton": { "alias": "hideSaveButton"; "required": false; }; "stickyColumn": { "alias": "stickyColumn"; "required": false; }; "tableWidth": { "alias": "tableWidth"; "required": false; }; "actionColumHeader": { "alias": "actionColumHeader"; "required": false; }; "actionButton": { "alias": "actionButton"; "required": false; }; "title": { "alias": "title"; "required": false; }; "isButtons": { "alias": "isButtons"; "required": false; }; "buttonArray": { "alias": "buttonArray"; "required": false; }; "tableId": { "alias": "tableId"; "required": false; }; "isEditRow": { "alias": "isEditRow"; "required": false; }; "isDeleteRow": { "alias": "isDeleteRow"; "required": false; }; "addInlineRecord": { "alias": "addInlineRecord"; "required": false; }; "searchConfigs": { "alias": "searchConfigs"; "required": false; }; "direction": { "alias": "direction"; "required": false; }; "pagination": { "alias": "pagination"; "required": false; }; "actionButtonArray": { "alias": "actionButtonArray"; "required": false; }; "multipleFilter": { "alias": "multipleFilter"; "required": false; }; "isPagination": { "alias": "isPagination"; "required": false; }; "isListViews": { "alias": "isListViews"; "required": false; }; "id": { "alias": "id"; "required": false; }; "isNosIndicator": { "alias": "isNosIndicator"; "required": false; }; "isEditable": { "alias": "isEditable"; "required": false; }; "from": { "alias": "from"; "required": false; }; "question": { "alias": "question"; "required": false; }; "rowTextSize": { "alias": "rowTextSize"; "required": false; }; "rowTextColor": { "alias": "rowTextColor"; "required": false; }; "apiMeta": { "alias": "apiMeta"; "required": false; }; "summaryRows": { "alias": "summaryRows"; "required": false; }; "summaryColumns": { "alias": "summaryColumns"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "tableConfig": { "alias": "tableConfig"; "required": false; }; "tableParams": { "alias": "tableParams"; "required": false; }; "listViews": { "alias": "listViews"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "languageCode": { "alias": "languageCode"; "required": false; }; "selectedColumn": { "alias": "selectedColumn"; "required": false; }; "allIcons": { "alias": "allIcons"; "required": false; }; "isButtonLoading": { "alias": "isButtonLoading"; "required": false; }; "isPreview": { "alias": "isPreview"; "required": false; }; "groupFilter": { "alias": "groupFilter"; "required": false; }; "groupFilterConfig": { "alias": "groupFilterConfig"; "required": false; }; "groupFilterColumn": { "alias": "groupFilterColumn"; "required": false; }; "onlyView": { "alias": "onlyView"; "required": false; }; "tableHeight": { "alias": "tableHeight"; "required": false; }; "serialNumberColumn": { "alias": "serialNumberColumn"; "required": false; }; }, { "tableRowClick": "tableRowClick"; "onEditData": "onEditData"; "onSaveData": "onSaveData"; "saveButtonData": "saveButtonData"; "onDeleteData": "onDeleteData"; "buttonEmit": "buttonEmit"; "hyperLinkEmit": "hyperLinkEmit"; "sideNavEmit": "sideNavEmit"; "actionButtonEmit": "actionButtonEmit"; "columnSelected": "columnSelected"; "removeColumn": "removeColumn"; "valueChange": "valueChange"; "selectedValues": "selectedValues"; "fileEmit": "fileEmit"; "NxtTableFilterEmit": "NxtTableFilterEmit"; "hadleDropDownDependent": "hadleDropDownDependent"; "NxtTableParamsEmit": "NxtTableParamsEmit"; }, never, never, true, never>;
371
+ static ɵcmp: i0.ɵɵComponentDeclaration<NxtDatatable, "nxt-datatable", never, { "data": { "alias": "data"; "required": false; }; "summaryValues": { "alias": "summaryValues"; "required": false; }; "tableFilterData": { "alias": "tableFilterData"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "withCheckBox": { "alias": "withCheckBox"; "required": false; }; "searchBar": { "alias": "searchBar"; "required": false; }; "tableSaveButton": { "alias": "tableSaveButton"; "required": false; }; "hideSaveButton": { "alias": "hideSaveButton"; "required": false; }; "stickyColumn": { "alias": "stickyColumn"; "required": false; }; "tableWidth": { "alias": "tableWidth"; "required": false; }; "actionColumHeader": { "alias": "actionColumHeader"; "required": false; }; "actionButton": { "alias": "actionButton"; "required": false; }; "title": { "alias": "title"; "required": false; }; "isButtons": { "alias": "isButtons"; "required": false; }; "buttonArray": { "alias": "buttonArray"; "required": false; }; "tableId": { "alias": "tableId"; "required": false; }; "isEditRow": { "alias": "isEditRow"; "required": false; }; "isDeleteRow": { "alias": "isDeleteRow"; "required": false; }; "addInlineRecord": { "alias": "addInlineRecord"; "required": false; }; "searchConfigs": { "alias": "searchConfigs"; "required": false; }; "direction": { "alias": "direction"; "required": false; }; "pagination": { "alias": "pagination"; "required": false; }; "actionButtonArray": { "alias": "actionButtonArray"; "required": false; }; "multipleFilter": { "alias": "multipleFilter"; "required": false; }; "isPagination": { "alias": "isPagination"; "required": false; }; "isListViews": { "alias": "isListViews"; "required": false; }; "id": { "alias": "id"; "required": false; }; "isNosIndicator": { "alias": "isNosIndicator"; "required": false; }; "isEditable": { "alias": "isEditable"; "required": false; }; "from": { "alias": "from"; "required": false; }; "question": { "alias": "question"; "required": false; }; "rowTextSize": { "alias": "rowTextSize"; "required": false; }; "rowTextColor": { "alias": "rowTextColor"; "required": false; }; "apiMeta": { "alias": "apiMeta"; "required": false; }; "summaryRows": { "alias": "summaryRows"; "required": false; }; "summaryColumns": { "alias": "summaryColumns"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "tableConfig": { "alias": "tableConfig"; "required": false; }; "tableParams": { "alias": "tableParams"; "required": false; }; "listViews": { "alias": "listViews"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "languageCode": { "alias": "languageCode"; "required": false; }; "selectedColumn": { "alias": "selectedColumn"; "required": false; }; "allIcons": { "alias": "allIcons"; "required": false; }; "isButtonLoading": { "alias": "isButtonLoading"; "required": false; }; "isPreview": { "alias": "isPreview"; "required": false; }; "groupFilter": { "alias": "groupFilter"; "required": false; }; "groupFilterConfig": { "alias": "groupFilterConfig"; "required": false; }; "groupFilterColumn": { "alias": "groupFilterColumn"; "required": false; }; "onlyView": { "alias": "onlyView"; "required": false; }; "tableHeight": { "alias": "tableHeight"; "required": false; }; "serialNumberColumn": { "alias": "serialNumberColumn"; "required": false; }; "advancedFilters": { "alias": "advancedFilters"; "required": false; }; }, { "tableRowClick": "tableRowClick"; "onEditData": "onEditData"; "onSaveData": "onSaveData"; "saveButtonData": "saveButtonData"; "onDeleteData": "onDeleteData"; "buttonEmit": "buttonEmit"; "hyperLinkEmit": "hyperLinkEmit"; "sideNavEmit": "sideNavEmit"; "actionButtonEmit": "actionButtonEmit"; "columnSelected": "columnSelected"; "removeColumn": "removeColumn"; "valueChange": "valueChange"; "selectedValues": "selectedValues"; "fileEmit": "fileEmit"; "NxtTableFilterEmit": "NxtTableFilterEmit"; "hadleDropDownDependent": "hadleDropDownDependent"; "NxtTableParamsEmit": "NxtTableParamsEmit"; }, never, never, true, never>;
244
372
  }
@@ -57,6 +57,7 @@ export declare class nxtDropdown implements OnInit {
57
57
  clearSelection(): void;
58
58
  inputValue(event: any, ques: any): void;
59
59
  filterOptions(searchValue: any): void;
60
+ arrayFilter(array?: any[]): any[];
60
61
  static ɵfac: i0.ɵɵFactoryDeclaration<nxtDropdown, never>;
61
62
  static ɵcmp: i0.ɵɵComponentDeclaration<nxtDropdown, "nxt-dropdown", never, { "options": { "alias": "options"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "apiMeta": { "alias": "apiMeta"; "required": false; }; "selectedValue": { "alias": "selectedValue"; "required": false; }; "progressBar": { "alias": "progressBar"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "error": { "alias": "error"; "required": false; }; "fromShengel": { "alias": "fromShengel"; "required": false; }; "question": { "alias": "question"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "from": { "alias": "from"; "required": false; }; "padding": { "alias": "padding"; "required": false; }; "onlyView": { "alias": "onlyView"; "required": false; }; "labelFont": { "alias": "labelFont"; "required": false; }; "label": { "alias": "label"; "required": false; }; "labelColor": { "alias": "labelColor"; "required": false; }; "inputTextColor": { "alias": "inputTextColor"; "required": false; }; "labelSize": { "alias": "labelSize"; "required": false; }; "inputValueSize": { "alias": "inputValueSize"; "required": false; }; "labelWeight": { "alias": "labelWeight"; "required": false; }; "inputWeight": { "alias": "inputWeight"; "required": false; }; "showLabel": { "alias": "showLabel"; "required": false; }; "inputBorder": { "alias": "inputBorder"; "required": false; }; "inputBgColor": { "alias": "inputBgColor"; "required": false; }; "inputIconLeftSrc": { "alias": "inputIconLeftSrc"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
62
63
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rangertechnologies/ngnxt",
3
- "version": "2.1.352",
3
+ "version": "2.1.353",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.14",
6
6
  "@angular/core": "^19.2.14"