@c10t/nice-component-library 0.0.27 → 0.0.28

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.
@@ -58,7 +58,7 @@ export declare class CvaSmartTableComponent implements ControlValueAccessor, OnC
58
58
  ngOnChanges(): void;
59
59
  ngOnInit(): void;
60
60
  ngAfterContentChecked(): void;
61
- onClick(action: string, result: any, index: number | null): void;
61
+ onClick(action: string, result: any, index: number | null, mouseEvent?: MouseEvent): void;
62
62
  onCellValueChange(result: any, column: ColumnModel, $event: any): void;
63
63
  toggleSelect(val: MatCheckboxChange | null, result?: any, column?: ColumnModel): void;
64
64
  onDisplayHeaderCell(column: ColumnModel): boolean;
@@ -47,7 +47,7 @@ export declare class CvaTableComponent implements OnInit, AfterViewChecked {
47
47
  set paging(value: TablePagingRequestModel);
48
48
  isExpandColumn(col: ColumnModel): boolean;
49
49
  getPage(pageable: any): void;
50
- onClick(action: string, result: any): void;
50
+ onClick(action: string, result: any, mouseEvent?: MouseEvent): void;
51
51
  ngOnInit(): void;
52
52
  onRowClick(result: any, index?: number): void;
53
53
  onDisplayHeaderCell(column: ColumnModel): boolean;
@@ -1,5 +1,5 @@
1
1
  import { FlatTreeControl } from '@angular/cdk/tree';
2
- import { AfterViewInit, ChangeDetectorRef, EventEmitter, Injector, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
+ import { ChangeDetectorRef, EventEmitter, Injector, OnChanges, OnInit, SimpleChanges } from '@angular/core';
3
3
  import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
4
4
  import { AbstractControl, ControlValueAccessor, NgControl } from '@angular/forms';
5
5
  import { TranslateService } from '@ngx-translate/core';
@@ -8,7 +8,7 @@ import { FlatTreeNodeModel } from '../../models/components/flat-tree-node.model'
8
8
  import { ValidatorService } from '../../services/validator.service';
9
9
  import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
10
10
  import * as i0 from "@angular/core";
11
- export declare class CvaFlatTreeComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {
11
+ export declare class CvaFlatTreeComponent implements ControlValueAccessor, OnInit, OnChanges {
12
12
  private translateService;
13
13
  private injector;
14
14
  private cdr;
@@ -32,9 +32,9 @@ export declare class CvaFlatTreeComponent implements ControlValueAccessor, OnIni
32
32
  treeConfig?: FlatTreeConfigModel;
33
33
  isSearchOutSide: boolean;
34
34
  searchTextOutSide: string;
35
- searchText: string;
36
35
  errorMessages: Map<string, (e?: any) => string>;
37
36
  fullDatasource: FlatTreeNodeModel[];
37
+ searchText: string;
38
38
  filterDatasource: FlatTreeNodeModel[];
39
39
  treeControl: FlatTreeControl<FlatTreeNodeModel>;
40
40
  treeFlattener: MatTreeFlattener<FlatTreeNodeModel, FlatTreeNodeModel>;
@@ -60,7 +60,6 @@ export declare class CvaFlatTreeComponent implements ControlValueAccessor, OnIni
60
60
  setSelectedNode(): void;
61
61
  setDataSourceOrigin(): void;
62
62
  ngOnInit(): void;
63
- ngAfterViewInit(): void;
64
63
  getDisplayInputFunc(node: FlatTreeNodeModel): boolean;
65
64
  getDisabledInputFunc(node: FlatTreeNodeModel): boolean;
66
65
  checkDisabledNode(node: FlatTreeNodeModel): boolean;
@@ -81,8 +80,6 @@ export declare class CvaFlatTreeComponent implements ControlValueAccessor, OnIni
81
80
  selectedTreeChange(node: FlatTreeNodeModel): void;
82
81
  checkLeafNode(checked: boolean, node: FlatTreeNodeModel, isSelectedChange?: boolean): void;
83
82
  getRootNode(node: FlatTreeNodeModel): FlatTreeNodeModel | null;
84
- deSelect(node: FlatTreeNodeModel): void;
85
- deSelectParent(node: FlatTreeNodeModel): void;
86
83
  toggleTreeControl(treeControl: FlatTreeControl<FlatTreeNodeModel>, node: FlatTreeNodeModel): void;
87
84
  toggleSelectedTree(node?: FlatTreeNodeModel): void;
88
85
  onChangeSearchText(): void;
@@ -92,6 +89,7 @@ export declare class CvaFlatTreeComponent implements ControlValueAccessor, OnIni
92
89
  onLeafNodeClick(node: FlatTreeNodeModel): void;
93
90
  onParentNodeClick(node: FlatTreeNodeModel): void;
94
91
  toggleNodeCheck(node: FlatTreeNodeModel, checked: boolean): void;
92
+ getTotalSelected(nodes: FlatTreeNodeModel[]): number;
95
93
  private _getLevel;
96
94
  private _isExpandable;
97
95
  private _getChildren;
@@ -9,6 +9,7 @@ export declare class CvaMultiUploadComponent implements ControlValueAccessor {
9
9
  maxSize: number | null;
10
10
  accept: string[] | null;
11
11
  label: string;
12
+ placeholder: string;
12
13
  required: string;
13
14
  disabled: boolean;
14
15
  percentOfLabelOutside: number;
@@ -26,5 +27,5 @@ export declare class CvaMultiUploadComponent implements ControlValueAccessor {
26
27
  onFileDroppedAction(fileList: FileList): void;
27
28
  validFile(fileList: FileList): boolean;
28
29
  static ɵfac: i0.ɵɵFactoryDeclaration<CvaMultiUploadComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<CvaMultiUploadComponent, "cva-multi-upload", never, { "files": { "alias": "files"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "maxSize": { "alias": "maxSize"; "required": false; }; "accept": { "alias": "accept"; "required": false; }; "label": { "alias": "label"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "percentOfLabelOutside": { "alias": "percentOfLabelOutside"; "required": false; }; }, { "onFileChange": "onFileChange"; }, never, never, false, never>;
30
+ static ɵcmp: i0.ɵɵComponentDeclaration<CvaMultiUploadComponent, "cva-multi-upload", never, { "files": { "alias": "files"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "maxSize": { "alias": "maxSize"; "required": false; }; "accept": { "alias": "accept"; "required": false; }; "label": { "alias": "label"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "percentOfLabelOutside": { "alias": "percentOfLabelOutside"; "required": false; }; }, { "onFileChange": "onFileChange"; }, never, never, false, never>;
30
31
  }
@@ -98,6 +98,7 @@ class ButtonClickEvent {
98
98
  action;
99
99
  object;
100
100
  index;
101
+ mouseEvent;
101
102
  constructor(action, object, index) {
102
103
  this.action = action;
103
104
  this.object = object;
@@ -547,7 +548,7 @@ class BaseTableComponent {
547
548
  onRowButtonClick(event) {
548
549
  const window = this;
549
550
  if (window[event.action]) {
550
- window[event.action](event.object, event.index);
551
+ window[event.action](event.object, event.index, event.mouseEvent);
551
552
  }
552
553
  }
553
554
  _collectParams(searchForm, map) {
@@ -2591,8 +2592,9 @@ class CvaTableComponent {
2591
2592
  this.toggleSelect(null, null);
2592
2593
  this.goToPageNumber = this.varPaging.pageNumber;
2593
2594
  }
2594
- onClick(action, result) {
2595
+ onClick(action, result, mouseEvent) {
2595
2596
  const buttonClickEvent = new ButtonClickEvent(action, result);
2597
+ buttonClickEvent.mouseEvent = mouseEvent;
2596
2598
  this.clickAction.emit(buttonClickEvent);
2597
2599
  }
2598
2600
  ngOnInit() {
@@ -2707,7 +2709,7 @@ class CvaTableComponent {
2707
2709
  fxLayout="row" [fxLayoutAlign]="TableService.alignCellContent(column)"
2708
2710
  (click)="$event.stopPropagation()">
2709
2711
  <button mat-icon-button color="{{column.button.color}}"
2710
- (click)="onClick(column.button.click, result)"
2712
+ (click)="onClick(column.button.click, result, $event)"
2711
2713
  disabled="{{column.button.disabled ? column.button.disabled(result) : false}}"
2712
2714
  matTooltip="{{(column.button.title ? column.button.title : '') | translate}}"
2713
2715
  class="{{column.button.className}}"
@@ -2917,7 +2919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
2917
2919
  fxLayout="row" [fxLayoutAlign]="TableService.alignCellContent(column)"
2918
2920
  (click)="$event.stopPropagation()">
2919
2921
  <button mat-icon-button color="{{column.button.color}}"
2920
- (click)="onClick(column.button.click, result)"
2922
+ (click)="onClick(column.button.click, result, $event)"
2921
2923
  disabled="{{column.button.disabled ? column.button.disabled(result) : false}}"
2922
2924
  matTooltip="{{(column.button.title ? column.button.title : '') | translate}}"
2923
2925
  class="{{column.button.className}}"
@@ -5173,8 +5175,9 @@ class CvaSmartTableComponent {
5173
5175
  /*
5174
5176
  Nếu sử dụng expandTableRow khi xử lý sự kiện bên ngoài component không sử dụng index bên trong base, set index lại bằng indexOf
5175
5177
  */
5176
- onClick(action, result, index) {
5178
+ onClick(action, result, index, mouseEvent) {
5177
5179
  const buttonClickEvent = new ButtonClickEvent(action, result, index);
5180
+ buttonClickEvent.mouseEvent = mouseEvent;
5178
5181
  this.clickAction.emit(buttonClickEvent);
5179
5182
  }
5180
5183
  onCellValueChange(result, column, $event) {
@@ -5351,7 +5354,7 @@ class CvaSmartTableComponent {
5351
5354
  <button mat-icon-button type="button"
5352
5355
  color="{{column.button.color}}"
5353
5356
  [ngClass]="column.button.className"
5354
- (click)="onClick(column.button.click, result, i)"
5357
+ (click)="onClick(column.button.click, result, i, $event)"
5355
5358
  disabled="{{column.button && column.button.disabled ? column.button.disabled(result) : false}}"
5356
5359
  matTooltip="{{(column.button.title ? column.button.title : '') | translate}}"
5357
5360
  [ngSwitch]="TableService.getIconType(column.button)">
@@ -5628,7 +5631,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
5628
5631
  <button mat-icon-button type="button"
5629
5632
  color="{{column.button.color}}"
5630
5633
  [ngClass]="column.button.className"
5631
- (click)="onClick(column.button.click, result, i)"
5634
+ (click)="onClick(column.button.click, result, i, $event)"
5632
5635
  disabled="{{column.button && column.button.disabled ? column.button.disabled(result) : false}}"
5633
5636
  matTooltip="{{(column.button.title ? column.button.title : '') | translate}}"
5634
5637
  [ngSwitch]="TableService.getIconType(column.button)">
@@ -6376,6 +6379,7 @@ class CvaMultiUploadComponent {
6376
6379
  maxSize = null;
6377
6380
  accept = null;
6378
6381
  label = '';
6382
+ placeholder = '';
6379
6383
  required = '';
6380
6384
  disabled = false;
6381
6385
  /* percent label outside css */
@@ -6466,7 +6470,7 @@ class CvaMultiUploadComponent {
6466
6470
  return true;
6467
6471
  }
6468
6472
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: CvaMultiUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6469
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.5", type: CvaMultiUploadComponent, isStandalone: false, selector: "cva-multi-upload", inputs: { files: "files", multiple: "multiple", maxSize: "maxSize", accept: "accept", label: "label", required: "required", disabled: "disabled", percentOfLabelOutside: "percentOfLabelOutside" }, outputs: { onFileChange: "onFileChange" }, providers: [
6473
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.5", type: CvaMultiUploadComponent, isStandalone: false, selector: "cva-multi-upload", inputs: { files: "files", multiple: "multiple", maxSize: "maxSize", accept: "accept", label: "label", placeholder: "placeholder", required: "required", disabled: "disabled", percentOfLabelOutside: "percentOfLabelOutside" }, outputs: { onFileChange: "onFileChange" }, providers: [
6470
6474
  {
6471
6475
  provide: NG_VALUE_ACCESSOR,
6472
6476
  useExisting: forwardRef(() => CvaMultiUploadComponent),
@@ -6490,7 +6494,7 @@ class CvaMultiUploadComponent {
6490
6494
  <mat-card-actions>
6491
6495
  <button mat-button class="upload-button" color="warn" (click)="onClick()">
6492
6496
  <mat-icon>add</mat-icon>
6493
- <span>{{ 'common.upload.file' | translate }}</span>
6497
+ <span>{{ !!placeholder ? placeholder : 'common.upload.file' | translate }}</span>
6494
6498
  </button>
6495
6499
  </mat-card-actions>
6496
6500
  <mat-card-content>
@@ -6527,7 +6531,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
6527
6531
  <mat-card-actions>
6528
6532
  <button mat-button class="upload-button" color="warn" (click)="onClick()">
6529
6533
  <mat-icon>add</mat-icon>
6530
- <span>{{ 'common.upload.file' | translate }}</span>
6534
+ <span>{{ !!placeholder ? placeholder : 'common.upload.file' | translate }}</span>
6531
6535
  </button>
6532
6536
  </mat-card-actions>
6533
6537
  <mat-card-content>
@@ -6561,6 +6565,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
6561
6565
  type: Input
6562
6566
  }], label: [{
6563
6567
  type: Input
6568
+ }], placeholder: [{
6569
+ type: Input
6564
6570
  }], required: [{
6565
6571
  type: Input
6566
6572
  }], disabled: [{
@@ -8089,9 +8095,9 @@ class CvaFlatTreeComponent {
8089
8095
  treeConfig;
8090
8096
  isSearchOutSide = false;
8091
8097
  searchTextOutSide = '';
8092
- searchText = '';
8093
8098
  errorMessages = new Map();
8094
8099
  fullDatasource = [];
8100
+ searchText = '';
8095
8101
  filterDatasource = [];
8096
8102
  treeControl;
8097
8103
  treeFlattener;
@@ -8153,9 +8159,6 @@ class CvaFlatTreeComponent {
8153
8159
  ngOnInit() {
8154
8160
  this.callValidator();
8155
8161
  }
8156
- ngAfterViewInit() {
8157
- // this.onChangeSearchText();
8158
- }
8159
8162
  getDisplayInputFunc(node) {
8160
8163
  return typeof (node._displayFuncInput) === 'function' ? node._displayFuncInput(node) : !!node._displayFuncInput;
8161
8164
  }
@@ -8278,13 +8281,8 @@ class CvaFlatTreeComponent {
8278
8281
  this.propagateChange(fn);
8279
8282
  }
8280
8283
  writeValue(obj) {
8281
- // if (this.multiple && !obj) {
8282
- // obj = [];
8283
- // }
8284
8284
  if (obj) {
8285
- // if (this.multiple) {
8286
8285
  this.value = obj;
8287
- // }
8288
8286
  this.mapIndexes = new Map();
8289
8287
  for (let i = 0; i < this.fullDataTreeControl.dataNodes.length; i++) {
8290
8288
  this.mapIndexes.set(this.fullDataTreeControl.dataNodes[i].value, i);
@@ -8463,12 +8461,6 @@ class CvaFlatTreeComponent {
8463
8461
  }
8464
8462
  return node;
8465
8463
  }
8466
- deSelect(node) {
8467
- this.checkLeafNode(false, node, true);
8468
- }
8469
- deSelectParent(node) {
8470
- this.checkParentNode(false, node, true);
8471
- }
8472
8464
  toggleTreeControl(treeControl, node) {
8473
8465
  treeControl.toggle(node);
8474
8466
  const orgNode = this.fullDataTreeControl.dataNodes.find(n => n.value === node.value);
@@ -8618,10 +8610,44 @@ class CvaFlatTreeComponent {
8618
8610
  this.value.splice(index, 1);
8619
8611
  }
8620
8612
  }
8613
+ if (isLeaf) {
8614
+ const parentNode = this.getRootNode(node);
8615
+ if (parentNode && FlatTreeService.hasChild(parentNode)) {
8616
+ const allChild = this.getAllChildNode(this.fullDataTreeControl, parentNode);
8617
+ // Kiểm tra còn node con nào trong value không
8618
+ const hasChildInValue = allChild.some(child => this.value.includes(child.value));
8619
+ if (!hasChildInValue) {
8620
+ const parentIndex = this.value.indexOf(parentNode.value);
8621
+ if (parentIndex >= 0) {
8622
+ this.value.splice(parentIndex, 1);
8623
+ }
8624
+ }
8625
+ }
8626
+ }
8621
8627
  // Gọi writeValue để cập nhật cho FormControl
8622
8628
  this.writeValue(this.value);
8623
8629
  this.cdr.detectChanges();
8624
8630
  }
8631
+ getTotalSelected(nodes) {
8632
+ let count = 0;
8633
+ for (const node of nodes) {
8634
+ const isLeaf = !FlatTreeService.hasChild(node);
8635
+ if (isLeaf) {
8636
+ if (this.value.includes(node.value)) {
8637
+ count += 1;
8638
+ }
8639
+ }
8640
+ else if (node.children && node.children.length > 0) {
8641
+ const childChecked = this.getTotalSelected(node.children);
8642
+ // Nếu tất cả các con được checked đồng nghĩa cha được checked thì mới cộng
8643
+ if (childChecked === node.children.length) {
8644
+ count += 1;
8645
+ }
8646
+ count += childChecked;
8647
+ }
8648
+ }
8649
+ return count;
8650
+ }
8625
8651
  _getLevel = (node) => node.level;
8626
8652
  _isExpandable = (node) => FlatTreeService.hasChild(node);
8627
8653
  _getChildren = (node) => of(node.children ? node.children : []);
@@ -8687,7 +8713,7 @@ class CvaFlatTreeComponent {
8687
8713
  *ngIf="!isDisplayChooseTreeOnly"
8688
8714
  fxLayout="column" fxFlex="1 1 {{checkIsView(isView) ? '100%' : '50%'}}" fxFlex.lt-sm="100%">
8689
8715
  <div class="header-area" *ngIf="!isView">
8690
- <label>{{ selectedLabelTitle | translate }}{{ '(' + (value ? value.length : 0) + ')' }}</label>
8716
+ <label>{{ selectedLabelTitle | translate }}{{ '(' + getTotalSelected(fullDataDataSource.data) + ')' }}</label>
8691
8717
  <div class="collapse-expand-all" (click)="toggleSelectedTree()">
8692
8718
  {{ (isCollapseSelected ? 'common.selected.tree.expandAll' : 'common.selected.tree.collapse') | translate }}
8693
8719
  <i class="fa {{isCollapseSelected ? 'fa-chevron-down' : 'fa-chevron-up'}}"></i>
@@ -8704,8 +8730,8 @@ class CvaFlatTreeComponent {
8704
8730
  [node]="node"
8705
8731
  [isView]="isView"
8706
8732
  (toggle)="toggleSelectedTree(node)"
8707
- (deSelectLeafNode)="deSelect(node)"
8708
- (deSelectParentNode)="deSelectParent(node)">
8733
+ (deSelectLeafNode)="toggleNodeCheck(node, false)"
8734
+ (deSelectParentNode)="toggleNodeCheck(node, false)">
8709
8735
  </cva-flat-tree-node-right>
8710
8736
  </ng-container>
8711
8737
  </cdk-virtual-scroll-viewport>
@@ -8784,7 +8810,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
8784
8810
  *ngIf="!isDisplayChooseTreeOnly"
8785
8811
  fxLayout="column" fxFlex="1 1 {{checkIsView(isView) ? '100%' : '50%'}}" fxFlex.lt-sm="100%">
8786
8812
  <div class="header-area" *ngIf="!isView">
8787
- <label>{{ selectedLabelTitle | translate }}{{ '(' + (value ? value.length : 0) + ')' }}</label>
8813
+ <label>{{ selectedLabelTitle | translate }}{{ '(' + getTotalSelected(fullDataDataSource.data) + ')' }}</label>
8788
8814
  <div class="collapse-expand-all" (click)="toggleSelectedTree()">
8789
8815
  {{ (isCollapseSelected ? 'common.selected.tree.expandAll' : 'common.selected.tree.collapse') | translate }}
8790
8816
  <i class="fa {{isCollapseSelected ? 'fa-chevron-down' : 'fa-chevron-up'}}"></i>
@@ -8801,8 +8827,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
8801
8827
  [node]="node"
8802
8828
  [isView]="isView"
8803
8829
  (toggle)="toggleSelectedTree(node)"
8804
- (deSelectLeafNode)="deSelect(node)"
8805
- (deSelectParentNode)="deSelectParent(node)">
8830
+ (deSelectLeafNode)="toggleNodeCheck(node, false)"
8831
+ (deSelectParentNode)="toggleNodeCheck(node, false)">
8806
8832
  </cva-flat-tree-node-right>
8807
8833
  </ng-container>
8808
8834
  </cdk-virtual-scroll-viewport>