ms-data-grid 0.0.40 → 0.0.42

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,20 +1,23 @@
1
- import { OnChanges, SimpleChanges, ElementRef, AfterViewInit, ChangeDetectorRef, EventEmitter, NgZone } from '@angular/core';
1
+ import { OnInit, OnChanges, SimpleChanges, ElementRef, AfterViewInit, ChangeDetectorRef, EventEmitter, NgZone, Renderer2, AfterViewChecked, TemplateRef } from '@angular/core';
2
2
  import { SplitColumnsService } from '../services/split-columns.service';
3
3
  import { CommonService } from '../services/common.service';
4
- import { SwapColumnsService } from '../services/swap-columns.service';
5
4
  import { CdkDrag, CdkDragDrop, CdkDragEnter, CdkDragExit, CdkDragMove, CdkDragSortEvent } from '@angular/cdk/drag-drop';
6
5
  import { CdkDropList } from '@angular/cdk/drag-drop';
7
6
  import { CopyServiceService } from '../services/copy-service.service';
7
+ import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
8
+ import { ExportService } from '../services/export.service';
8
9
  import * as i0 from "@angular/core";
9
10
  export declare const sortingAnimation: import("@angular/animations").AnimationTriggerMetadata;
10
- export declare class DataGridComponent implements OnChanges, AfterViewInit {
11
+ export declare class DataGridComponent implements OnChanges, AfterViewInit, OnInit, AfterViewChecked {
11
12
  private columnService;
12
13
  cdr: ChangeDetectorRef;
13
14
  commonSevice: CommonService;
14
- private swapColumnService;
15
15
  private elementRef;
16
16
  private ngZone;
17
17
  private copyService;
18
+ private renderer;
19
+ private sanitizer;
20
+ private exportService;
18
21
  paginationConfig: any;
19
22
  dataSet: any[];
20
23
  columns: any[];
@@ -33,12 +36,14 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
33
36
  sidemenuBackgroundColor: string | undefined;
34
37
  bodyTextColor: string | undefined;
35
38
  headerTextColor: string | undefined;
39
+ checkboxesColor: string | undefined;
36
40
  headerTextFontsSize: number | undefined;
37
41
  bodyTextFontsSize: number | undefined;
38
42
  headerFontWeight: number | undefined;
39
43
  bodyFontWeight: number | undefined;
40
44
  checkedRowBackgroundColor: string | undefined;
41
45
  dropdownsBackgroundColor: string | undefined;
46
+ footerRowBackgroundColor: string | undefined;
42
47
  footerRowHeight: number;
43
48
  topGroupedBadgesBackgroundColor: string | undefined;
44
49
  showRowsGrouping: boolean | undefined;
@@ -87,12 +92,24 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
87
92
  leftPinnedBoxshadow: string;
88
93
  rightPinnedBoxshadow: string;
89
94
  selectedRowsBackgroundColor: string;
90
- nestedTableHeaderBAckgroundColor: string;
95
+ nestedTableHeaderBackgroundColor: string;
96
+ nestedTableRowBackgroundColor: string;
91
97
  tableView: any[];
98
+ buttons: {
99
+ name: string;
100
+ is_showIcon: boolean;
101
+ icon: string;
102
+ }[];
92
103
  keepMultipleExpandedDetails: boolean;
93
104
  showTotalAmountRow: boolean;
105
+ enableGlobalSearch: boolean;
94
106
  tableType: string;
95
- widgets: any[];
107
+ enableExport: boolean;
108
+ enableCut: boolean;
109
+ tabs: string[];
110
+ resetAllFilters: {
111
+ resetAll: boolean;
112
+ };
96
113
  columnThreedotsMunuConfig: {
97
114
  showPinleft: boolean;
98
115
  showPinright: boolean;
@@ -111,6 +128,7 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
111
128
  tablePresetConfig: EventEmitter<any>;
112
129
  sortingOrderOptions: EventEmitter<any>;
113
130
  createUpdateConfigListing: EventEmitter<any>;
131
+ activeTab: string | null;
114
132
  groupedColumns: any[];
115
133
  activeCol: any;
116
134
  activeFilterCell: any;
@@ -126,22 +144,29 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
126
144
  filterColumnsList: any[];
127
145
  groupBoxPadding: number;
128
146
  presetName: string;
129
- presetFilter: any;
147
+ presetFilter: boolean;
130
148
  searchTextPresetTable: string;
131
149
  addFilterColumnInput: string;
132
150
  searchInDropdown: string;
133
151
  addFilterDropdownSearch: string;
134
152
  topShowHideColumns: string;
135
153
  choseColumnsSearch: string;
154
+ sideNestedFilterSearch: string;
136
155
  editinDropdownSearch: string;
137
156
  isThreeDotsFilterOpen: boolean;
138
157
  confirmDelete: boolean;
139
158
  fontFamilies: string[];
140
159
  fontSizes: string[];
141
- constructor(columnService: SplitColumnsService, cdr: ChangeDetectorRef, commonSevice: CommonService, swapColumnService: SwapColumnsService, elementRef: ElementRef, ngZone: NgZone, copyService: CopyServiceService);
160
+ hasScroll: boolean;
161
+ constructor(columnService: SplitColumnsService, cdr: ChangeDetectorRef, commonSevice: CommonService, elementRef: ElementRef, ngZone: NgZone, copyService: CopyServiceService, renderer: Renderer2, sanitizer: DomSanitizer, exportService: ExportService);
142
162
  cellText: ElementRef;
143
- ngAfterViewInit(): Promise<void>;
163
+ nestedHeader: ElementRef;
164
+ ngAfterViewInit(): void;
165
+ ngAfterViewChecked(): void;
166
+ ngOnInit(): void;
144
167
  ngOnChanges(changes: SimpleChanges): Promise<void>;
168
+ applyRowsSelectionState(): void;
169
+ clearSelectionState(tableType: string): void;
145
170
  applyFilteroptionList(): Promise<void>;
146
171
  leftPinnedColumns: any[];
147
172
  centerColumns: any[];
@@ -150,6 +175,8 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
150
175
  previewCenterColumns: any[];
151
176
  previewRightPinnedColumns: any[];
152
177
  dataGridContainer: ElementRef<HTMLDivElement>;
178
+ taskManagementContainer: ElementRef<HTMLDivElement>;
179
+ nestedTableContainer: ElementRef<HTMLDivElement>;
153
180
  leftPinnedBody: ElementRef<HTMLDivElement>;
154
181
  centerPinnedBody: ElementRef<HTMLDivElement>;
155
182
  rightPinnedBody: ElementRef<HTMLDivElement>;
@@ -162,16 +189,15 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
162
189
  refreshPreviewColumns(columns?: any): Promise<void>;
163
190
  SetColumnsDefaultWidth(): Promise<void>;
164
191
  setSectionsWidth(): void;
165
- onLeftBodyScroll(): void;
166
- onRightBodyScroll(): void;
167
192
  fakeScrollbarScrollLeft: number;
168
- onFakeScroll(event: Event): void;
169
193
  getNestedValue(obj: any, field: string): any;
170
194
  isNestedValueArray(obj: any, field: string): boolean;
171
195
  onResizeGroup(event: MouseEvent, col: any, isRightPinned?: boolean): void;
172
196
  private updateColumnWidthInSourceByField;
197
+ cleanColumns(columns: any[]): any[];
173
198
  onResizeColumn(event: MouseEvent, col: any): void;
174
199
  onResizeGroupBox(event: MouseEvent): void;
200
+ onPasteInFilterRowSearch(event: ClipboardEvent, col: any): void;
175
201
  onFilterChange(col: any): void;
176
202
  get bodyWrapperHeight(): string;
177
203
  hoveredRowId: string | number | null;
@@ -182,11 +208,11 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
182
208
  closeFilterDropdowns(event: MouseEvent): void;
183
209
  private hasParentWithClass;
184
210
  isMenueHidden: boolean;
185
- openThreeDotsMenu(event: MouseEvent, child: any): void;
211
+ openThreeDotsMenu(event: MouseEvent, child: any, keepOriginalPosition?: boolean): void;
186
212
  sortAsc(col: any): void;
187
213
  sortDesc(col: any): void;
188
214
  resetSort(col: any): void;
189
- updateColumnPinInSourceByField(column: any, pinned: 'left' | 'right' | null): Promise<void>;
215
+ updateColumnPinInSourceByField(column: any, pinned: 'left' | 'right' | null, isNestedTable?: any, columns?: any): Promise<void>;
190
216
  autosizeColumn(cols: any | any[]): void;
191
217
  getGroupWidth(group: any): number;
192
218
  autosizeAllColumns(): void;
@@ -256,10 +282,10 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
256
282
  private fakeScrollRaf;
257
283
  translateY: number;
258
284
  lastScrollTop: number;
285
+ pendingAnimationFrame: number | null;
259
286
  onMainScroll(event: Event): void;
260
287
  get isScrollbarVisible(): boolean;
261
288
  toggleExpand(row: any): void;
262
- onMainFakeScroll(event: Event): void;
263
289
  viewportRows: number;
264
290
  firstIndex: number;
265
291
  renderStart: number;
@@ -268,19 +294,17 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
268
294
  mainScroll: ElementRef<HTMLDivElement>;
269
295
  fakeScroll: ElementRef<HTMLDivElement>;
270
296
  horizintalFakeScroll: ElementRef<HTMLDivElement>;
271
- centerScrollableBody: ElementRef<any>;
297
+ centerScrollableBody: ElementRef<HTMLDivElement>;
272
298
  private overscan;
273
299
  computeViewportRows(): void;
274
- onHorizintalFakeScroll(event: Event): void;
300
+ onHorizontalFakeScroll(event: Event): void;
275
301
  onCenterBodyScroll(event: Event): void;
276
302
  onCenterHeaderScroll(event: Event): void;
277
303
  draggingColumn: any;
278
304
  dragStartIndex: any;
279
305
  canEnterToRowsGrouping: (drag: CdkDrag<any>, drop: CdkDropList<any>) => any;
280
- onDragMoved(event: CdkDragMove<any>): void;
281
306
  enterToTopRowGrouping(dropList: CdkDragEnter<any>): void;
282
307
  onDropListEnter(dropList: CdkDragEnter<any>, section: 'left' | 'center' | 'right'): void;
283
- enterToTopGroupingRow(dropList: CdkDragEnter<any>): void;
284
308
  exitedFromTheTopRow(dropList: CdkDragExit<any>): void;
285
309
  shouldDisableDroplistSorting: boolean;
286
310
  isDisableColumnGrouping: boolean;
@@ -290,11 +314,9 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
290
314
  onSortGroup: (event: CdkDragSortEvent<any>, section: string) => Promise<void>;
291
315
  onDropGroup(): void;
292
316
  onDropTopGroup(event: CdkDragDrop<any>): Promise<void>;
317
+ onGroupReorder(event: CdkDragDrop<any[]>): Promise<void>;
293
318
  ungroupColumn(column: any): Promise<void>;
294
319
  shouldTheGroupHeaderShow(group: any): any;
295
- onChildDragStart(): void;
296
- dropListIds: string[];
297
- generateDropListIds(): void;
298
320
  onChildDroplistSorted: (event: CdkDragSortEvent<any>, section: string) => Promise<void>;
299
321
  onChildDroplistDroped(cdkDragDropevent: CdkDragDrop<any>): void;
300
322
  groupData(data: any[], groupFields: string[]): any[];
@@ -320,11 +342,12 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
320
342
  isFilterOpen: boolean;
321
343
  selectedColumnForFilter: any;
322
344
  showFilters: boolean;
345
+ openFilterFromDisabledSearchedInput(col: any): void;
323
346
  openFilter(col: any): void;
324
347
  firstValue: any;
325
348
  firstCondition: string;
326
349
  secondValue: any;
327
- secondCondition: string;
350
+ secondCondition: null;
328
351
  condition: string;
329
352
  resetTextFilterChanges(): void;
330
353
  toggleAllValusSelectionInDropdownFilter(column: any): void;
@@ -339,7 +362,9 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
339
362
  onOptionToggle(col: any, option: any): void;
340
363
  resetSideFilter(col: any): void;
341
364
  clearAllFilters(): void;
342
- applySideFilter(): void;
365
+ applySideFilter(column: any): void;
366
+ removeSideFilter(column: any): void;
367
+ collapseAllExpandedCells(): void;
343
368
  trackByField(index: number, col: any): string;
344
369
  get activeFilteredColumns(): any[];
345
370
  toggleOpenFilter(): void;
@@ -347,6 +372,7 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
347
372
  activeCell: string | null;
348
373
  setActiveCell(row: any, column: any): void;
349
374
  isActiveCell(row: any, col: any): boolean;
375
+ textAreadInput: ElementRef<HTMLTextAreaElement>;
350
376
  enableEdit(row: any, column: any, clickedFromDetailsBox?: boolean, cellContainer?: HTMLElement): void;
351
377
  disableEdit(row: any, column: any, control?: any): void;
352
378
  emailRegex: RegExp;
@@ -358,9 +384,14 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
358
384
  goToPage(page: any): void;
359
385
  onPageSizeChange(): void;
360
386
  actionPreset(data: any, type: any): void;
361
- selectFilter(data: any): void;
387
+ currentIdForUpdatePreset: string;
388
+ curretaTablePresetForUpdate: any;
389
+ temp_state: {
390
+ id: string;
391
+ is_temp: boolean;
392
+ };
393
+ selectFilter(data: any): Promise<void>;
362
394
  savePreset(control?: any): void;
363
- getFilterHeaders(filters: any[], columns: any[]): string;
364
395
  toggleRowShading(): void;
365
396
  trackByTable(index: number): number;
366
397
  activeRow: any;
@@ -368,10 +399,9 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
368
399
  getCellKey(row: any, col: any): string;
369
400
  expandedCells: Map<string, number>;
370
401
  private zCounter;
371
- toggleExpandOfLongCellText(row: any, col: any, columns: any[], expandWholeRow?: boolean): void;
372
402
  showDetailsBox: boolean;
403
+ toggleExpandOfLongCellText(row: any, col: any, columns: any[], expandWholeRow?: boolean): void;
373
404
  isOpenToTop(row: any, col: any): boolean;
374
- collapseAllExpandedCells(): void;
375
405
  isExpanded(row: any, col: any): boolean;
376
406
  getZIndex(row: any, col: any): number;
377
407
  isOverflowing(element: HTMLElement | null): boolean;
@@ -391,10 +421,11 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
391
421
  getCellClasses(column: any, value: any): string;
392
422
  removeColumnFilterFromColumn(column: any): void;
393
423
  onSideMenuColumnsVisibilityChange(): void;
394
- downloadCsv(): void;
424
+ cleanFilterdColumns(): any[];
425
+ downloadCsv(type: 'csv' | 'xlsx'): void;
395
426
  onFontChange(): void;
396
427
  onGlobalSearch(): void;
397
- onInputChange(event: any): void;
428
+ onSearchInput(event: Event): void;
398
429
  checkFilterChangesEffect(): any;
399
430
  selectedCells: any[];
400
431
  selectedKeys: Set<string>;
@@ -449,6 +480,7 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
449
480
  performCut(selectedData: any[][]): void;
450
481
  getSelectedDataForCopy(): any[][];
451
482
  onKeyDown(event: KeyboardEvent): void;
483
+ selectAllCells(): void;
452
484
  undo(): void;
453
485
  redo(): void;
454
486
  onPaste: (event: ClipboardEvent) => Promise<void>;
@@ -461,16 +493,45 @@ export declare class DataGridComponent implements OnChanges, AfterViewInit {
461
493
  toggleMenu(i: number, event?: MouseEvent): void;
462
494
  nestedTable: ElementRef<HTMLDivElement>;
463
495
  get hasVerticalScroll(): boolean;
496
+ get hasHorizontalScroll(): boolean;
464
497
  getTotalAmount(column: any): string | undefined;
465
498
  dropColumn(event: CdkDragDrop<any[]>, row: any): void;
466
499
  currentSubSortColumn: string | null;
467
500
  currentSortDirection: 'asc' | 'desc';
468
- sortNestedCol(col: any, dataSet?: any[]): void;
501
+ sortNestedCol(col: any, row: any): void;
469
502
  getColumnWidthPx(row: any, col: any): string;
470
503
  fullscreenImage: string | null;
471
- openFullScreenImage(src: string): void;
472
- getVisibleColumnCount(columns: any[]): number;
473
- clearSelection(): void;
504
+ pinUnpinColum(col: any, value: 'left' | 'right' | null, columns: any[]): void;
505
+ getLeftPinnedCount(columns: any[]): number;
506
+ getRightPinnedCount(columns: any[]): number;
507
+ getStickyLeft(columns: any[], index: number): string;
508
+ previewNestedCols: any[];
509
+ onNestedColSort(event: CdkDragSortEvent<any[]>, columns: any[]): void;
510
+ saveSelection(selectedIds: string[], tableType: string): void;
511
+ restoreSelection(tableType: string): Set<string>;
512
+ isOutsideContainer: boolean;
513
+ private containerRect;
514
+ onDragStarted(col: any): void;
515
+ onDragMoved(event: CdkDragMove): void;
516
+ onDragEnded(): void;
517
+ getStartIndex(): number;
518
+ hasAnyDefaultView(): boolean;
519
+ get isTablePresetNotChanged(): any;
520
+ onActionButtonClick(button: string): void;
521
+ setActiveTab(tab: string): void;
522
+ getBackgroundColor(row: any, isEven: boolean, section: 'left' | 'center' | 'right'): string | undefined;
523
+ hasHorizontalScrollbar(): boolean;
524
+ getSafeComment(description: string): SafeHtml;
525
+ cleanEditorContent(content: string): SafeHtml;
526
+ getExtention(url: string | string[] | null | undefined): string | undefined;
527
+ downloadAttchment(url: any, file?: any): void;
528
+ fullImageSrc: string | null;
529
+ openFullImage(event: Event): void;
530
+ addStylesToImages(): void;
531
+ onImageClick(src: string): void;
532
+ fullscreenImageTemplate: TemplateRef<any>;
533
+ private fullscreenViewRef;
534
+ iconMap: Record<string, (row: any, col: any) => string>;
474
535
  static ɵfac: i0.ɵɵFactoryDeclaration<DataGridComponent, never>;
475
- static ɵcmp: i0.ɵɵComponentDeclaration<DataGridComponent, "data-grid", never, { "paginationConfig": { "alias": "paginationConfig"; "required": false; }; "dataSet": { "alias": "dataSet"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "rowHeight": { "alias": "rowHeight"; "required": false; }; "headerRowHeight": { "alias": "headerRowHeight"; "required": false; }; "showVerticalBorder": { "alias": "showVerticalBorder"; "required": false; }; "evenRowsBackgroundColor": { "alias": "evenRowsBackgroundColor"; "required": false; }; "oddRowsBackgroundColor": { "alias": "oddRowsBackgroundColor"; "required": false; }; "headerBackgroundColor": { "alias": "headerBackgroundColor"; "required": false; }; "checkboxesBackgroundColor": { "alias": "checkboxesBackgroundColor"; "required": false; }; "showColumnsGrouping": { "alias": "showColumnsGrouping"; "required": false; }; "rowHoverColor": { "alias": "rowHoverColor"; "required": false; }; "leftPinnedBackgroundColor": { "alias": "leftPinnedBackgroundColor"; "required": false; }; "bodyBackgroundColor": { "alias": "bodyBackgroundColor"; "required": false; }; "rightPinnedBackgroundColor": { "alias": "rightPinnedBackgroundColor"; "required": false; }; "sidemenuBackgroundColor": { "alias": "sidemenuBackgroundColor"; "required": false; }; "bodyTextColor": { "alias": "bodyTextColor"; "required": false; }; "headerTextColor": { "alias": "headerTextColor"; "required": false; }; "headerTextFontsSize": { "alias": "headerTextFontsSize"; "required": false; }; "bodyTextFontsSize": { "alias": "bodyTextFontsSize"; "required": false; }; "headerFontWeight": { "alias": "headerFontWeight"; "required": false; }; "bodyFontWeight": { "alias": "bodyFontWeight"; "required": false; }; "checkedRowBackgroundColor": { "alias": "checkedRowBackgroundColor"; "required": false; }; "dropdownsBackgroundColor": { "alias": "dropdownsBackgroundColor"; "required": false; }; "footerRowHeight": { "alias": "footerRowHeight"; "required": false; }; "topGroupedBadgesBackgroundColor": { "alias": "topGroupedBadgesBackgroundColor"; "required": false; }; "showRowsGrouping": { "alias": "showRowsGrouping"; "required": false; }; "showFilterRow": { "alias": "showFilterRow"; "required": false; }; "fontFaimly": { "alias": "fontFaimly"; "required": false; }; "showSideMenu": { "alias": "showSideMenu"; "required": false; }; "footerPadding": { "alias": "footerPadding"; "required": false; }; "topFilterRowHeight": { "alias": "topFilterRowHeight"; "required": false; }; "rowShadingEnabled": { "alias": "rowShadingEnabled"; "required": false; }; "showSerialNumber": { "alias": "showSerialNumber"; "required": false; }; "singleSpaAssetsPath": { "alias": "singleSpaAssetsPath"; "required": false; }; "filtersConfig": { "alias": "filtersConfig"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "verticalScrollbarWidth": { "alias": "verticalScrollbarWidth"; "required": false; }; "horizintalScrollbarWidth": { "alias": "horizintalScrollbarWidth"; "required": false; }; "showCellDetailsBox": { "alias": "showCellDetailsBox"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; "tableSearch": { "alias": "tableSearch"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "config": { "alias": "config"; "required": false; }; "showTaskbar": { "alias": "showTaskbar"; "required": false; }; "tableName": { "alias": "tableName"; "required": false; }; "listingType": { "alias": "listingType"; "required": false; }; "checkboxState": { "alias": "checkboxState"; "required": false; }; "taskbarActions": { "alias": "taskbarActions"; "required": false; }; "sortingConfig": { "alias": "sortingConfig"; "required": false; }; "tableFilterViewId": { "alias": "tableFilterViewId"; "required": false; }; "selectedTableLayout": { "alias": "selectedTableLayout"; "required": false; }; "closeDropdown": { "alias": "closeDropdown"; "required": false; }; "globalSearchText": { "alias": "globalSearchText"; "required": false; }; "nestedTablerowFontsize": { "alias": "nestedTablerowFontsize"; "required": false; }; "nestedTableHeaderRowHeight": { "alias": "nestedTableHeaderRowHeight"; "required": false; }; "nestedTablerowHeight": { "alias": "nestedTablerowHeight"; "required": false; }; "gridType": { "alias": "gridType"; "required": false; }; "currencySymbol": { "alias": "currencySymbol"; "required": false; }; "leftPinnedBoxshadow": { "alias": "leftPinnedBoxshadow"; "required": false; }; "rightPinnedBoxshadow": { "alias": "rightPinnedBoxshadow"; "required": false; }; "selectedRowsBackgroundColor": { "alias": "selectedRowsBackgroundColor"; "required": false; }; "nestedTableHeaderBAckgroundColor": { "alias": "nestedTableHeaderBAckgroundColor"; "required": false; }; "tableView": { "alias": "tableView"; "required": false; }; "keepMultipleExpandedDetails": { "alias": "keepMultipleExpandedDetails"; "required": false; }; "showTotalAmountRow": { "alias": "showTotalAmountRow"; "required": false; }; "tableType": { "alias": "tableType"; "required": false; }; "widgets": { "alias": "widgets"; "required": false; }; "columnThreedotsMunuConfig": { "alias": "columnThreedotsMunuConfig"; "required": false; }; }, { "changeLayout": "changeLayout"; "filterOptions": "filterOptions"; "genericEvent": "genericEvent"; "tablePresetConfig": "tablePresetConfig"; "sortingOrderOptions": "sortingOrderOptions"; "createUpdateConfigListing": "createUpdateConfigListing"; }, never, never, false, never>;
536
+ static ɵcmp: i0.ɵɵComponentDeclaration<DataGridComponent, "data-grid", never, { "paginationConfig": { "alias": "paginationConfig"; "required": false; }; "dataSet": { "alias": "dataSet"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "rowHeight": { "alias": "rowHeight"; "required": false; }; "headerRowHeight": { "alias": "headerRowHeight"; "required": false; }; "showVerticalBorder": { "alias": "showVerticalBorder"; "required": false; }; "evenRowsBackgroundColor": { "alias": "evenRowsBackgroundColor"; "required": false; }; "oddRowsBackgroundColor": { "alias": "oddRowsBackgroundColor"; "required": false; }; "headerBackgroundColor": { "alias": "headerBackgroundColor"; "required": false; }; "checkboxesBackgroundColor": { "alias": "checkboxesBackgroundColor"; "required": false; }; "showColumnsGrouping": { "alias": "showColumnsGrouping"; "required": false; }; "rowHoverColor": { "alias": "rowHoverColor"; "required": false; }; "leftPinnedBackgroundColor": { "alias": "leftPinnedBackgroundColor"; "required": false; }; "bodyBackgroundColor": { "alias": "bodyBackgroundColor"; "required": false; }; "rightPinnedBackgroundColor": { "alias": "rightPinnedBackgroundColor"; "required": false; }; "sidemenuBackgroundColor": { "alias": "sidemenuBackgroundColor"; "required": false; }; "bodyTextColor": { "alias": "bodyTextColor"; "required": false; }; "headerTextColor": { "alias": "headerTextColor"; "required": false; }; "checkboxesColor": { "alias": "checkboxesColor"; "required": false; }; "headerTextFontsSize": { "alias": "headerTextFontsSize"; "required": false; }; "bodyTextFontsSize": { "alias": "bodyTextFontsSize"; "required": false; }; "headerFontWeight": { "alias": "headerFontWeight"; "required": false; }; "bodyFontWeight": { "alias": "bodyFontWeight"; "required": false; }; "checkedRowBackgroundColor": { "alias": "checkedRowBackgroundColor"; "required": false; }; "dropdownsBackgroundColor": { "alias": "dropdownsBackgroundColor"; "required": false; }; "footerRowBackgroundColor": { "alias": "footerRowBackgroundColor"; "required": false; }; "footerRowHeight": { "alias": "footerRowHeight"; "required": false; }; "topGroupedBadgesBackgroundColor": { "alias": "topGroupedBadgesBackgroundColor"; "required": false; }; "showRowsGrouping": { "alias": "showRowsGrouping"; "required": false; }; "showFilterRow": { "alias": "showFilterRow"; "required": false; }; "fontFaimly": { "alias": "fontFaimly"; "required": false; }; "showSideMenu": { "alias": "showSideMenu"; "required": false; }; "footerPadding": { "alias": "footerPadding"; "required": false; }; "topFilterRowHeight": { "alias": "topFilterRowHeight"; "required": false; }; "rowShadingEnabled": { "alias": "rowShadingEnabled"; "required": false; }; "showSerialNumber": { "alias": "showSerialNumber"; "required": false; }; "singleSpaAssetsPath": { "alias": "singleSpaAssetsPath"; "required": false; }; "filtersConfig": { "alias": "filtersConfig"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "verticalScrollbarWidth": { "alias": "verticalScrollbarWidth"; "required": false; }; "horizintalScrollbarWidth": { "alias": "horizintalScrollbarWidth"; "required": false; }; "showCellDetailsBox": { "alias": "showCellDetailsBox"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; "tableSearch": { "alias": "tableSearch"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "config": { "alias": "config"; "required": false; }; "showTaskbar": { "alias": "showTaskbar"; "required": false; }; "tableName": { "alias": "tableName"; "required": false; }; "listingType": { "alias": "listingType"; "required": false; }; "checkboxState": { "alias": "checkboxState"; "required": false; }; "taskbarActions": { "alias": "taskbarActions"; "required": false; }; "sortingConfig": { "alias": "sortingConfig"; "required": false; }; "tableFilterViewId": { "alias": "tableFilterViewId"; "required": false; }; "selectedTableLayout": { "alias": "selectedTableLayout"; "required": false; }; "closeDropdown": { "alias": "closeDropdown"; "required": false; }; "globalSearchText": { "alias": "globalSearchText"; "required": false; }; "nestedTablerowFontsize": { "alias": "nestedTablerowFontsize"; "required": false; }; "nestedTableHeaderRowHeight": { "alias": "nestedTableHeaderRowHeight"; "required": false; }; "nestedTablerowHeight": { "alias": "nestedTablerowHeight"; "required": false; }; "gridType": { "alias": "gridType"; "required": false; }; "currencySymbol": { "alias": "currencySymbol"; "required": false; }; "leftPinnedBoxshadow": { "alias": "leftPinnedBoxshadow"; "required": false; }; "rightPinnedBoxshadow": { "alias": "rightPinnedBoxshadow"; "required": false; }; "selectedRowsBackgroundColor": { "alias": "selectedRowsBackgroundColor"; "required": false; }; "nestedTableHeaderBackgroundColor": { "alias": "nestedTableHeaderBackgroundColor"; "required": false; }; "nestedTableRowBackgroundColor": { "alias": "nestedTableRowBackgroundColor"; "required": false; }; "tableView": { "alias": "tableView"; "required": false; }; "buttons": { "alias": "buttons"; "required": false; }; "keepMultipleExpandedDetails": { "alias": "keepMultipleExpandedDetails"; "required": false; }; "showTotalAmountRow": { "alias": "showTotalAmountRow"; "required": false; }; "enableGlobalSearch": { "alias": "enableGlobalSearch"; "required": false; }; "tableType": { "alias": "tableType"; "required": false; }; "enableExport": { "alias": "enableExport"; "required": false; }; "enableCut": { "alias": "enableCut"; "required": false; }; "tabs": { "alias": "tabs"; "required": false; }; "resetAllFilters": { "alias": "resetAllFilters"; "required": false; }; "columnThreedotsMunuConfig": { "alias": "columnThreedotsMunuConfig"; "required": false; }; }, { "changeLayout": "changeLayout"; "filterOptions": "filterOptions"; "genericEvent": "genericEvent"; "tablePresetConfig": "tablePresetConfig"; "sortingOrderOptions": "sortingOrderOptions"; "createUpdateConfigListing": "createUpdateConfigListing"; }, never, never, false, never>;
476
537
  }
@@ -1,14 +1,13 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import * as i1 from "./data-grid/data-grid.component";
3
3
  import * as i2 from "./pipes/filter.pipe";
4
- import * as i3 from "./directives/draggable-header.directive";
5
- import * as i4 from "@angular/common";
6
- import * as i5 from "@angular/forms";
7
- import * as i6 from "@angular/cdk/drag-drop";
8
- import * as i7 from "ng-inline-svg";
9
- import * as i8 from "@angular/cdk/scrolling";
4
+ import * as i3 from "@angular/common";
5
+ import * as i4 from "@angular/forms";
6
+ import * as i5 from "@angular/cdk/drag-drop";
7
+ import * as i6 from "ng-inline-svg";
8
+ import * as i7 from "@angular/cdk/scrolling";
10
9
  export declare class DataGridModule {
11
10
  static ɵfac: i0.ɵɵFactoryDeclaration<DataGridModule, never>;
12
- static ɵmod: i0.ɵɵNgModuleDeclaration<DataGridModule, [typeof i1.DataGridComponent, typeof i2.FilterPipe, typeof i3.DraggableHeaderDirective], [typeof i4.CommonModule, typeof i5.FormsModule, typeof i6.DragDropModule, typeof i7.InlineSVGModule, typeof i8.ScrollingModule], [typeof i1.DataGridComponent, typeof i3.DraggableHeaderDirective, typeof i7.InlineSVGModule]>;
11
+ static ɵmod: i0.ɵɵNgModuleDeclaration<DataGridModule, [typeof i1.DataGridComponent, typeof i2.FilterPipe], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i5.DragDropModule, typeof i6.InlineSVGModule, typeof i7.ScrollingModule], [typeof i1.DataGridComponent]>;
13
12
  static ɵinj: i0.ɵɵInjectorDeclaration<DataGridModule>;
14
13
  }
@@ -0,0 +1,24 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class ExportService {
3
+ constructor();
4
+ /**
5
+ * Exports data to CSV or Excel.
6
+ * @param columns List of column definitions (each having name/key/is_visible)
7
+ * @param data The array of data objects
8
+ * @param fileName Name of the exported file (without extension)
9
+ * @param format 'csv' | 'xlsx'
10
+ */
11
+ exportData(columns: any[], data: any[], fileName: string, format?: 'csv' | 'xlsx', rowSelectedIndexes?: Set<number> | null, styleConfig?: {
12
+ headerBgColor?: string;
13
+ headerTextColor?: string;
14
+ bodyTextColor?: string;
15
+ fontFamily?: string;
16
+ fontWeight?: 'normal' | 'bold';
17
+ zoomScale?: number;
18
+ headerRowHeight?: number;
19
+ selectedRowBgColor?: string;
20
+ }): void;
21
+ private getNestedValue;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<ExportService, never>;
23
+ static ɵprov: i0.ɵɵInjectableDeclaration<ExportService>;
24
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ms-data-grid",
3
- "version": "0.0.40",
3
+ "version": "0.0.42",
4
4
  "description": "A powerful, customizable Angular data grid component with advanced features like sorting, filtering, pagination, column pinning, and taskbar actions. Perfect for enterprise applications.",
5
5
  "keywords": [
6
6
  "angular",
@@ -26,7 +26,13 @@
26
26
  "@angular/core": "^16.2.0"
27
27
  },
28
28
  "dependencies": {
29
- "tslib": "^2.3.0"
29
+ "xlsx-js-style": "^1.2.0",
30
+ "ng-inline-svg": "^13.1.1",
31
+ "ngx-bootstrap": "^20.0.0",
32
+ "bootstrap": "^5.3.7",
33
+ "tslib": "^2.3.0",
34
+ "file-saver": "^2.0.5",
35
+ "zone.js": "~0.13.0"
30
36
  },
31
37
  "sideEffects": false,
32
38
  "module": "fesm2022/ms-data-grid.mjs",
package/public-api.d.ts CHANGED
@@ -1,4 +1,2 @@
1
- export * from './lib/data-grid.service';
2
1
  export * from './lib/data-grid.module';
3
2
  export * from './lib/data-grid/data-grid.component';
4
- export * from './lib/directives/draggable-header.directive';
@@ -1,14 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DataGridService {
4
- constructor() { }
5
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataGridService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataGridService, providedIn: 'root' }); }
7
- }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DataGridService, decorators: [{
9
- type: Injectable,
10
- args: [{
11
- providedIn: 'root'
12
- }]
13
- }], ctorParameters: function () { return []; } });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLWdyaWQvc3JjL2xpYi9kYXRhLWdyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sZUFBZTtJQUUxQixnQkFBZ0IsQ0FBQzsrR0FGTixlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFHcmlkU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcbn1cclxuIl19
@@ -1,145 +0,0 @@
1
- import { Directive, EventEmitter, HostListener, Input, Output, } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class DraggableHeaderDirective {
4
- constructor(el, renderer) {
5
- this.el = el;
6
- this.renderer = renderer;
7
- this.headerName = '';
8
- this.dragStart = new EventEmitter();
9
- this.dragMove = new EventEmitter();
10
- this.dragEnd = new EventEmitter();
11
- this.isDragging = false;
12
- this.placeholderEl = null;
13
- this.previewEl = null;
14
- this.startX = 0;
15
- this.startY = 0;
16
- this.onMouseMove = (event) => {
17
- debugger;
18
- const moveX = Math.abs(event.clientX - this.startX - 10);
19
- const moveY = Math.abs(event.clientY - this.startY - 10);
20
- if (!this.isDragging && (moveX > 1 || moveY > 1)) {
21
- this.startDragging(event);
22
- }
23
- if (this.isDragging && this.previewEl) {
24
- this.renderer.setStyle(this.previewEl, 'top', `${event.pageY + 10}px`);
25
- this.renderer.setStyle(this.previewEl, 'left', `${event.pageX + 10}px`);
26
- // Find the element under cursor (hovered element)
27
- const hoveredElement = document.elementFromPoint(event.clientX, event.clientY);
28
- this.dragMove.emit({
29
- event,
30
- column: this.column,
31
- hoveredElement,
32
- });
33
- }
34
- };
35
- this.onMouseUp = (event) => {
36
- if (!this.isDragging)
37
- return;
38
- this.isDragging = false;
39
- this.dragEnd.emit({ column: this.column, event });
40
- if (this.previewEl) {
41
- this.renderer.removeChild(document.body, this.previewEl);
42
- this.previewEl = null;
43
- }
44
- if (this.placeholderEl) {
45
- const parent = this.placeholderEl.parentNode;
46
- if (parent) {
47
- parent.replaceChild(this.el.nativeElement, this.placeholderEl);
48
- }
49
- this.placeholderEl = null;
50
- }
51
- // Reset the cursor
52
- this.resetCursor();
53
- document.removeEventListener('mousemove', this.onMouseMove);
54
- document.removeEventListener('mouseup', this.onMouseUp);
55
- };
56
- this.originalCursor = null;
57
- }
58
- onMouseDown(event) {
59
- if (event.button !== 0)
60
- return;
61
- let target = event.target;
62
- const classes = target.classList;
63
- debugger;
64
- if (event.target.classList.contains('three-dots'))
65
- return;
66
- this.startX = event.clientX;
67
- this.startY = event.clientY;
68
- this.isDragging = false;
69
- document.addEventListener('mousemove', this.onMouseMove);
70
- document.addEventListener('mouseup', this.onMouseUp);
71
- }
72
- setCursor(cursorStyle) {
73
- this.renderer.setStyle(document.body, 'cursor', cursorStyle);
74
- }
75
- resetCursor() {
76
- this.renderer.setStyle(document.body, 'cursor', this.originalCursor || '');
77
- }
78
- startDragging(event) {
79
- this.isDragging = true;
80
- // Store original cursor (optional fallback)
81
- this.originalCursor = getComputedStyle(document.body).cursor;
82
- // Set cursor to grabbing
83
- this.setCursor('move');
84
- // --- Clone the element as a placeholder ---
85
- this.placeholderEl = this.el.nativeElement.cloneNode(true);
86
- this.renderer.setStyle(this.placeholderEl, 'opacity', '0.5');
87
- this.renderer.setStyle(this.placeholderEl, 'pointer-events', 'none');
88
- this.renderer.addClass(this.placeholderEl, 'drag-placeholder');
89
- const parent = this.el.nativeElement.parentNode;
90
- parent.replaceChild(this.placeholderEl, this.el.nativeElement);
91
- // --- Create floating preview ---
92
- this.previewEl = this.renderer.createElement('div');
93
- this.renderer.setStyle(this.previewEl, 'position', 'absolute');
94
- this.renderer.setStyle(this.previewEl, 'top', `${event.pageY + 10}px`);
95
- this.renderer.setStyle(this.previewEl, 'left', `${event.pageX + 10}px`);
96
- this.renderer.setStyle(this.previewEl, 'pointer-events', 'none');
97
- this.renderer.setStyle(this.previewEl, 'z-index', '1000');
98
- this.renderer.setStyle(this.previewEl, 'max-width', '200px');
99
- this.renderer.setStyle(this.previewEl, 'padding', '8px');
100
- this.renderer.setStyle(this.previewEl, 'border', '1px solid #ccc');
101
- this.renderer.setStyle(this.previewEl, 'background-color', '#fff');
102
- this.renderer.setStyle(this.previewEl, 'box-shadow', '0 2px 6px rgba(0,0,0,0.2)');
103
- this.renderer.setStyle(this.previewEl, 'border-radius', '4px');
104
- this.renderer.setStyle(this.previewEl, 'display', 'flex');
105
- this.renderer.setStyle(this.previewEl, 'align-items', 'center');
106
- this.renderer.setStyle(this.previewEl, 'gap', '8px');
107
- this.renderer.setStyle(this.previewEl, 'font-weight', '500');
108
- this.renderer.setStyle(this.previewEl, 'white-space', 'nowrap');
109
- const icon = this.renderer.createElement('span');
110
- this.renderer.setStyle(icon, 'font-size', '16px');
111
- this.renderer.setStyle(icon, 'user-select', 'none');
112
- this.renderer.setProperty(icon, 'innerText', '≡');
113
- const text = this.renderer.createElement('span');
114
- this.renderer.setProperty(text, 'innerText', this.headerName || 'Dragging');
115
- this.renderer.appendChild(this.previewEl, icon);
116
- this.renderer.appendChild(this.previewEl, text);
117
- this.renderer.appendChild(document.body, this.previewEl);
118
- this.dragStart.emit({ column: this.column, event });
119
- }
120
- overrideCursor(style) {
121
- this.setCursor(style);
122
- }
123
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DraggableHeaderDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
124
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: DraggableHeaderDirective, selector: "[appDraggableHeader]", inputs: { column: "column", headerName: "headerName" }, outputs: { dragStart: "dragStart", dragMove: "dragMove", dragEnd: "dragEnd" }, host: { listeners: { "mousedown": "onMouseDown($event)" } }, ngImport: i0 }); }
125
- }
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DraggableHeaderDirective, decorators: [{
127
- type: Directive,
128
- args: [{
129
- selector: '[appDraggableHeader]',
130
- }]
131
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { column: [{
132
- type: Input
133
- }], headerName: [{
134
- type: Input
135
- }], dragStart: [{
136
- type: Output
137
- }], dragMove: [{
138
- type: Output
139
- }], dragEnd: [{
140
- type: Output
141
- }], onMouseDown: [{
142
- type: HostListener,
143
- args: ['mousedown', ['$event']]
144
- }] } });
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWhlYWRlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLWdyaWQvc3JjL2xpYi9kaXJlY3RpdmVzL2RyYWdnYWJsZS1oZWFkZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDOztBQVV2QixNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQW9CLEVBQWMsRUFBVSxRQUFtQjtRQUEzQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQVZ0RCxlQUFVLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3BDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ25DLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXBDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsa0JBQWEsR0FBdUIsSUFBSSxDQUFDO1FBQ3pDLGNBQVMsR0FBdUIsSUFBSSxDQUFDO1FBSTdDLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBaUJYLGdCQUFXLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDbEMsUUFBUSxDQUFBO1lBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDekQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLElB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b250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgUmVuZGVyZXIyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEcmFnTW92ZUV2ZW50IHtcclxuICBldmVudDogTW91c2VFdmVudDtcclxuICBkYXRhOiBhbnk7XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FwcERyYWdnYWJsZUhlYWRlcl0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlSGVhZGVyRGlyZWN0aXZlIHtcclxuICBASW5wdXQoKSBjb2x1bW46IGFueTtcclxuICBASW5wdXQoKSBoZWFkZXJOYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgQE91dHB1dCgpIGRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBkcmFnTW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBkcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcGxhY2Vob2xkZXJFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHByZXZpZXdFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxyXG5cclxuICBzdGFydFggPSAwO1xyXG4gIHN0YXJ0WSA9IDA7XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHJldHVybjtcclxuICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gdGFyZ2V0LmNsYXNzTGlzdDtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCd0aHJlZS1kb3RzJykpIHJldHVybjtcclxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xyXG4gICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xyXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBjb25zdCBtb3ZlWCA9IE1hdGguYWJzKGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WCAtIDEwKTtcclxuICAgIGNvbnN0IG1vdmVZID0gTWF0aC5hYnMoZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhcnRZIC0gMTApO1xyXG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcgJiYgKG1vdmVYID4gMSB8fCBtb3ZlWSA+IDEpKSB7XHJcbiAgICAgIHRoaXMuc3RhcnREcmFnZ2luZyhldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZyAmJiB0aGlzLnByZXZpZXdFbCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0VsLCAndG9wJywgYCR7ZXZlbnQucGFnZVkgKyAxMH1weGApO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0VsLCAnbGVmdCcsIGAke2V2ZW50LnBhZ2VYICsgMTB9cHhgKTtcclxuXHJcbiAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgdW5kZXIgY3Vyc29yIChob3ZlcmVkIGVsZW1lbnQpXHJcbiAgICAgIGNvbnN0IGhvdmVyZWRFbGVtZW50ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChcclxuICAgICAgICBldmVudC5jbGllbnRYLFxyXG4gICAgICAgIGV2ZW50LmNsaWVudFlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuZHJhZ01vdmUuZW1pdCh7XHJcbiAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgICBob3ZlcmVkRWxlbWVudCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgb25Nb3VzZVVwID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykgcmV0dXJuO1xyXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5kcmFnRW5kLmVtaXQoeyBjb2x1bW46IHRoaXMuY29sdW1uLCBldmVudCB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5wcmV2aWV3RWwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLnByZXZpZXdFbCk7XHJcbiAgICAgIHRoaXMucHJldmlld0VsID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wbGFjZWhvbGRlckVsKSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGxhY2Vob2xkZXJFbC5wYXJlbnROb2RlO1xyXG4gICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgcGFyZW50LnJlcGxhY2VDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGxhY2Vob2xkZXJFbCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wbGFjZWhvbGRlckVsID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXNldCB0aGUgY3Vyc29yXHJcbiAgICB0aGlzLnJlc2V0Q3Vyc29yKCk7XHJcblxyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgb3JpZ2luYWxDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIHNldEN1cnNvcihjdXJzb3JTdHlsZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmJvZHksICdjdXJzb3InLCBjdXJzb3JTdHlsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Q3Vyc29yKCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnY3Vyc29yJywgdGhpcy5vcmlnaW5hbEN1cnNvciB8fCAnJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0RHJhZ2dpbmcoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcblxyXG4gICAgLy8gU3RvcmUgb3JpZ2luYWwgY3Vyc29yIChvcHRpb25hbCBmYWxsYmFjaylcclxuICAgIHRoaXMub3JpZ2luYWxDdXJzb3IgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmN1cnNvcjtcclxuXHJcbiAgICAvLyBTZXQgY3Vyc29yIHRvIGdyYWJiaW5nXHJcbiAgICB0aGlzLnNldEN1cnNvcignbW92ZScpO1xyXG5cclxuICAgIC8vIC0tLSBDbG9uZSB0aGUgZWxlbWVudCBhcyBhIHBsYWNlaG9sZGVyIC0tLVxyXG4gICAgdGhpcy5wbGFjZWhvbGRlckVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wbGFjZWhvbGRlckVsLCAnb3BhY2l0eScsICcwLjUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wbGFjZWhvbGRlckVsLCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnBsYWNlaG9sZGVyRWwsICdkcmFnLXBsYWNlaG9sZGVyJyk7XHJcblxyXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJFbCwgdGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuXHJcbiAgICAvLyAtLS0gQ3JlYXRlIGZsb2F0aW5nIHByZXZpZXcgLS0tXHJcbiAgICB0aGlzLnByZXZpZXdFbCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0VsLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3RWwsICd0b3AnLCBgJHtldmVudC5wYWdlWSArIDEwfXB4YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0VsLCAnbGVmdCcsIGAke2V2ZW50LnBhZ2VYICsgMTB9cHhgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3RWwsICdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0VsLCAnei1pbmRleCcsICcxMDAwJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0VsLCAnbWF4LXdpZHRoJywgJzIwMHB4Jyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHJldmlld0VsLCAncGFkZGluZycsICc4cHgnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3RWwsICdib3JkZXInLCAnMXB4IHNvbGlkICNjY2MnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3RWwsICdiYWNrZ3JvdW5kLWNvbG9yJywgJyNmZmYnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgIHRoaXMucHJldmlld0VsLFxyXG4gICAgICAnYm94LXNoYWRvdycsXHJcbiAgICAgICcwIDJweCA2cHggcmdiYSgwLDAsMCwwLjIpJ1xyXG4gICAgKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3RWwsICdib3JkZXItcmFkaXVzJywgJzRweCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdFbCwgJ2Rpc3BsYXknLCAnZmxleCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdFbCwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnByZXZpZXdFbCwgJ2dhcCcsICc4cHgnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3RWwsICdmb250LXdlaWdodCcsICc1MDAnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2aWV3RWwsICd3aGl0ZS1zcGFjZScsICdub3dyYXAnKTtcclxuXHJcbiAgICBjb25zdCBpY29uID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGljb24sICdmb250LXNpemUnLCAnMTZweCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpY29uLCAndXNlci1zZWxlY3QnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpY29uLCAnaW5uZXJUZXh0JywgJ+KJoScpO1xyXG5cclxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGV4dCwgJ2lubmVyVGV4dCcsIHRoaXMuaGVhZGVyTmFtZSB8fCAnRHJhZ2dpbmcnKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucHJldmlld0VsLCBpY29uKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5wcmV2aWV3RWwsIHRleHQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLnByZXZpZXdFbCk7XHJcblxyXG4gICAgdGhpcy5kcmFnU3RhcnQuZW1pdCh7IGNvbHVtbjogdGhpcy5jb2x1bW4sIGV2ZW50IH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG92ZXJyaWRlQ3Vyc29yKHN0eWxlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0Q3Vyc29yKHN0eWxlKTtcclxuICB9XHJcbn1cclxuIl19