qms-angular 1.1.24 → 1.1.25

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.
@@ -13,4 +13,5 @@ export declare class QMSFlatNodeTree {
13
13
  itemMatIcon?: string;
14
14
  isGroup?: boolean;
15
15
  groupId?: string;
16
+ isLoading?: boolean;
16
17
  }
@@ -14,6 +14,7 @@ export interface QMSTreeNode {
14
14
  tooltip?: string;
15
15
  isGroup?: boolean;
16
16
  groupId?: string;
17
+ expandable?: boolean;
17
18
  }
18
19
  export declare class QMSTreeModel implements QMSTreeNode {
19
20
  id: string;
@@ -19,8 +19,12 @@ export declare class SelectDepartmentComponent implements OnInit, OnDestroy, Aft
19
19
  popupData: SelectDepartmentPopupData;
20
20
  resultSelected: QMSTreeNode[];
21
21
  onSearchEvent: EventEmitter<string>;
22
+ onCheckNodeEvent: EventEmitter<QMSFlatNodeTree>;
23
+ onExpandNodeEvent: EventEmitter<QMSFlatNodeTree>;
24
+ onLoadMoreEvent: EventEmitter<void>;
22
25
  resultSearch: QMSFlatNodeTree[];
23
26
  isActiveViewSearch: boolean;
27
+ get isIncludeChild(): boolean;
24
28
  constructor(cdRef: ChangeDetectorRef, dialogRef: MatDialogRef<SelectDepartmentComponent>, data: SelectDepartmentPopupData, trans: TranslateLibraryService);
25
29
  ngAfterViewInit(): void;
26
30
  onCloseDialog(): void;
@@ -34,4 +38,19 @@ export declare class SelectDepartmentComponent implements OnInit, OnDestroy, Aft
34
38
  generateTootip(node: QMSTreeNode): string;
35
39
  updateResultSearch(data: QMSDepartmentPagingModel<QMSFlatNodeTree>): void;
36
40
  private formatString;
41
+ /**
42
+ * This function use for lazy load children of node
43
+ * @param node node update. if node is null data auto insert as roots
44
+ * @param data list children to update node.
45
+ * @param mode default is update that replace current list children by new list children , if mode = 'insert' will insert new value to list children existed before.
46
+ */
47
+ updateChildOfNode(node: QMSFlatNodeTree, data: QMSTreeNode[], mode?: 'insert' | 'update'): void;
48
+ addRootTree(data?: QMSTreeNode[]): void;
49
+ /**
50
+ * This function handle check node of tree
51
+ * @param node node of tree
52
+ * @param callback do something before handle check node
53
+ * @returns
54
+ */
55
+ handleCheckNode(node: QMSFlatNodeTree, callback?: (node: QMSFlatNodeTree) => Promise<void>): void;
37
56
  }
@@ -19,5 +19,7 @@ export declare class QMSSelectDepartmentTreeConfig {
19
19
  };
20
20
  activeSelectAllNode: boolean;
21
21
  modeView: ModeDepartmentTreeeViewEnum;
22
+ isMobile: boolean;
23
+ lazy: boolean;
22
24
  constructor();
23
25
  }
@@ -1,7 +1,8 @@
1
1
  import { SelectionModel } from '@angular/cdk/collections';
2
+ import { Overlay } from '@angular/cdk/overlay';
2
3
  import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
3
4
  import { FlatTreeControl } from '@angular/cdk/tree';
4
- import { AfterContentInit, AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, OnInit } from '@angular/core';
5
+ import { AfterContentInit, AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, OnInit, ViewContainerRef } from '@angular/core';
5
6
  import { FormControl } from '@angular/forms';
6
7
  import { MatIconRegistry } from '@angular/material/icon';
7
8
  import { PageEvent } from '@angular/material/paginator';
@@ -28,7 +29,10 @@ export declare class SelectDepartmentTreeComponent implements OnInit, AfterViewI
28
29
  private eleRef;
29
30
  trans: TranslateLibraryService;
30
31
  private treeDepartmentGlobalService;
32
+ overlay: Overlay;
33
+ viewContainerRef: ViewContainerRef;
31
34
  LANG: any;
35
+ spinnerArr: any[];
32
36
  arrSkeleton: any[];
33
37
  set rowsSkeleton(value: number);
34
38
  height: string;
@@ -39,17 +43,22 @@ export declare class SelectDepartmentTreeComponent implements OnInit, AfterViewI
39
43
  get isIndeterminateCheckboxAllTree(): boolean;
40
44
  onSearchEvent: EventEmitter<string>;
41
45
  onPagingSearchEvent: EventEmitter<PageEvent>;
46
+ onValueChangeEvent: EventEmitter<QMSTreeNode[]>;
47
+ selectionNodeChangeEvent: EventEmitter<ISelectionNodeChange<QMSTreeNode>>;
48
+ onCheckNodeEvent: EventEmitter<QMSFlatNodeTree>;
49
+ onExpandNodeEvent: EventEmitter<QMSFlatNodeTree>;
50
+ onLoadMoreEvent: EventEmitter<void>;
51
+ cdkVirtualScrollViewport: CdkVirtualScrollViewport;
52
+ paginatorSearch: QMSPaginatorComponent;
42
53
  MODE_VIEW_ENUM: typeof ModeDepartmentTreeeViewEnum;
54
+ ITEM_SIZE: number;
43
55
  ngUnsubscribe: Subject<void>;
44
56
  resultSearchSelected: QMSTreeNode[];
45
57
  resultSelected: QMSTreeNode[];
46
- get currentTreeData(): QMSTreeNode[];
47
58
  getDataTree$: BehaviorSubject<QMSTreeNode[]>;
48
- onValueChangeEvent: EventEmitter<QMSTreeNode[]>;
49
- selectionNodeChangeEvent: EventEmitter<ISelectionNodeChange<QMSTreeNode>>;
50
59
  searchDepartment$: BehaviorSubject<QMSDepartmentPagingModel<QMSFlatNodeTree>>;
51
- paginatorSearch: QMSPaginatorComponent;
52
60
  resultSearch: DepartmentSearchResultModel[];
61
+ get currentTreeData(): QMSTreeNode[];
53
62
  get isSelectAllResultSearch(): boolean;
54
63
  get indeterminateSearchResult(): boolean;
55
64
  indexView: number;
@@ -68,6 +77,8 @@ export declare class SelectDepartmentTreeComponent implements OnInit, AfterViewI
68
77
  dataSourceTreeSearch: MatTreeFlatDataSource<QMSTreeNode, QMSFlatNodeTree>;
69
78
  formSearchControl: FormControl;
70
79
  getLoading$: BehaviorSubject<boolean>;
80
+ getLoadingMore$: BehaviorSubject<boolean>;
81
+ afterOnCheckNode: Subject<QMSFlatNodeTree>;
71
82
  textResultSearch: string;
72
83
  itemIconType: typeof ItemIconType;
73
84
  _transformer: (node: QMSTreeNode, level: number) => QMSFlatNodeTree;
@@ -75,15 +86,13 @@ export declare class SelectDepartmentTreeComponent implements OnInit, AfterViewI
75
86
  private _getChild;
76
87
  private isExpandable;
77
88
  hasChild: (_: number, node: QMSFlatNodeTree) => boolean;
78
- originalDataSource: QMSTreeNode[];
79
- cdkVirtualScrollViewport: CdkVirtualScrollViewport;
80
- constructor(cdRef: ChangeDetectorRef, domSanitizer: DomSanitizer, appIconService: QMSIconRegistryService, iconRegistry: MatIconRegistry, eleRef: ElementRef, trans: TranslateLibraryService, treeDepartmentGlobalService: QMSSelectDepartmentTreeGlobalService);
89
+ constructor(cdRef: ChangeDetectorRef, domSanitizer: DomSanitizer, appIconService: QMSIconRegistryService, iconRegistry: MatIconRegistry, eleRef: ElementRef, trans: TranslateLibraryService, treeDepartmentGlobalService: QMSSelectDepartmentTreeGlobalService, overlay: Overlay, viewContainerRef: ViewContainerRef);
81
90
  ngAfterContentInit(): void;
82
91
  ngAfterViewInit(): void;
83
92
  ngOnInit(): void;
84
93
  ngOnDestroy(): void;
85
94
  private _initTreeData;
86
- private _convertToTreeData;
95
+ _convertToTreeData(data: QMSTreeNode[]): QMSTreeNode[];
87
96
  private _initCheckListSelected;
88
97
  private _handleItemSelectionChanged;
89
98
  private _onSelectionNodeChangeEvent;
@@ -99,7 +108,13 @@ export declare class SelectDepartmentTreeComponent implements OnInit, AfterViewI
99
108
  onRemoveNode(nodeId: string): void;
100
109
  isIndeterminate(node: QMSFlatNodeTree): boolean;
101
110
  isCheckAll(node: QMSFlatNodeTree): boolean;
102
- private _handleCheckNode;
111
+ /**
112
+ * This function handle check node of tree
113
+ * @param node node of tree
114
+ * @param callback do something before handle check node
115
+ * @returns
116
+ */
117
+ handleCheckNode(node: QMSFlatNodeTree, callback?: (node: QMSFlatNodeTree) => Promise<void>): Promise<void>;
103
118
  private resetNode;
104
119
  isSelectedNode(node: QMSFlatNodeTree): boolean;
105
120
  getChildrenSelected(node: QMSFlatNodeTree): QMSFlatNodeTree[];
@@ -129,4 +144,12 @@ export declare class SelectDepartmentTreeComponent implements OnInit, AfterViewI
129
144
  private getSelectedNodeStorage;
130
145
  private setSelectedNodeStorage;
131
146
  trackBy(index: number, item: QMSFlatNodeTree): QMSFlatNodeTree;
147
+ /**
148
+ * This function use for lazy load children of node
149
+ * @param node node update. if node is null data auto insert as roots
150
+ * @param data list children to update node.
151
+ * @param mode default is update that replace current list children by new list children , if mode = 'insert' will insert new value to list children existed before.
152
+ */
153
+ updateChildOfNode(node: QMSFlatNodeTree, data?: QMSTreeNode[], mode?: 'insert' | 'update'): void;
154
+ addRootTree(data?: QMSTreeNode[]): void;
132
155
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qms-angular",
3
- "version": "1.1.24",
3
+ "version": "1.1.25",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },
@@ -208,3 +208,16 @@
208
208
  color: unset !important;
209
209
  }
210
210
  }
211
+
212
+ @media screen and (max-width: 600px) {
213
+ ::ng-deep .cdk-global-overlay-wrapper{
214
+ justify-content: center !important;
215
+ width: 100vw;
216
+ }
217
+ .header-title{
218
+ font-size: 14px;
219
+ }
220
+ .related__item__content_name{
221
+ font-size: 12px !important;
222
+ }
223
+ }
@@ -3,7 +3,6 @@
3
3
  @import "../../../themes/theme/mixins";
4
4
  @import "../../../themes/qms-icon-font";
5
5
 
6
-
7
6
  .qms-select-department-tree-container {
8
7
  .mr10 {
9
8
  margin-right: 10px;
@@ -85,6 +84,8 @@
85
84
  font-weight: 500;
86
85
  color: theme-apply($ws-text-primary);
87
86
  font-size: 16px;
87
+ display: flex;
88
+ align-items: center;
88
89
  .header-view{
89
90
  padding: 4px 0;
90
91
  }
@@ -160,6 +161,59 @@
160
161
  }
161
162
  }
162
163
  }
164
+
165
+ .mask-overlay{
166
+ z-index: 1000;
167
+ background-color: rgba(0,0,0,0.1);
168
+ position: absolute;
169
+ top: 0;
170
+ left: 0;
171
+ width: 100%;
172
+ height: 100%;
173
+ border-radius: 4px;
174
+ overflow: hidden;
175
+ display: grid;
176
+ place-items: center;
177
+ &> .qms-load-more-row {
178
+ // height: 0;
179
+ line-height: 35px;
180
+ text-align: center;
181
+ display: flex;
182
+ justify-content: center;
183
+ align-items: center;
184
+ gap: 4px;
185
+ transform: translateY(-15px);
186
+ span {
187
+ display: inline-block;
188
+ width: 10px;
189
+ height: 10px;
190
+ background: theme-apply($primary-light-12-opacity);
191
+ border-radius: 50px;
192
+ animation: up-down-animate 0.5s ease-in-out infinite alternate;
193
+ &:nth-child(2) {
194
+ background: theme-apply($primary-light-24-opacity);
195
+ animation-delay: 0.16s;
196
+ }
197
+ &:nth-child(3) {
198
+ background: theme-apply($primary-light-32-opacity);
199
+ animation-delay: 0.32s;
200
+ }
201
+ &:nth-child(4) {
202
+ background: theme-apply($primary-light-38-opacity);
203
+ animation-delay: 0.48s;
204
+ }
205
+ }
206
+ @keyframes up-down-animate {
207
+ 0% {
208
+ transform: translateY(-8px);
209
+ }
210
+
211
+ 100% {
212
+ transform: translateY(8px);
213
+ }
214
+ }
215
+ }
216
+ }
163
217
  //Custom tree
164
218
  .select-department-tree{
165
219
  & > .cdk-virtual-scroll-orientation-vertical .cdk-virtual-scroll-content-wrapper{
@@ -175,12 +229,16 @@
175
229
  &> .node-expand-area{
176
230
  width: 48px;
177
231
  height: 48px;
232
+ position: relative;
178
233
  }
179
234
  &.active-external-view{
180
235
  .mat-checkbox.qms-group-options{
181
- width: calc(100% - 250px) !important;
236
+ width: calc(100% - 250px) ;
182
237
  }
183
238
  }
239
+ &.node-loading{
240
+ background: theme-apply($primary-light-6-opacity);
241
+ }
184
242
  &> .external-view-node{
185
243
  flex-basis: 200px;
186
244
  overflow: hidden;
@@ -465,4 +523,160 @@
465
523
  }
466
524
  }
467
525
  }
526
+
527
+ .qms-spinner {
528
+ font-size: 20px;
529
+ position: relative;
530
+ display: inline-block;
531
+ width: 1em;
532
+ height: 1em;
533
+ &.center {
534
+ position: absolute;
535
+ left: 0;
536
+ right: 0;
537
+ top: 0;
538
+ bottom: 0;
539
+ margin: auto;
540
+ }
541
+ &> .qms-spinner-blade {
542
+ position: absolute;
543
+ left: 0.4629em;
544
+ bottom: 0;
545
+ width: 0.074em;
546
+ height: 0.2777em;
547
+ border-radius: 0.0555em;
548
+ background-color: transparent;
549
+ -webkit-transform-origin: center -0.2222em;
550
+ -ms-transform-origin: center -0.2222em;
551
+ transform-origin: center -0.2222em;
552
+ animation: spinner-animation 1s infinite linear;
553
+ &:nth-child(1) {
554
+ -webkit-animation-delay: 0s;
555
+ animation-delay: 0s;
556
+ -webkit-transform: rotate(0deg);
557
+ -ms-transform: rotate(0deg);
558
+ transform: rotate(0deg);
559
+ }
560
+ &:nth-child(2) {
561
+ -webkit-animation-delay: 0.083s;
562
+ animation-delay: 0.083s;
563
+ -webkit-transform: rotate(30deg);
564
+ -ms-transform: rotate(30deg);
565
+ transform: rotate(30deg);
566
+ }
567
+ &:nth-child(3) {
568
+ -webkit-animation-delay: 0.166s;
569
+ animation-delay: 0.166s;
570
+ -webkit-transform: rotate(60deg);
571
+ -ms-transform: rotate(60deg);
572
+ transform: rotate(60deg);
573
+ }
574
+ &:nth-child(4) {
575
+ -webkit-animation-delay: 0.249s;
576
+ animation-delay: 0.249s;
577
+ -webkit-transform: rotate(90deg);
578
+ -ms-transform: rotate(90deg);
579
+ transform: rotate(90deg);
580
+ }
581
+ &:nth-child(5) {
582
+ -webkit-animation-delay: 0.332s;
583
+ animation-delay: 0.332s;
584
+ -webkit-transform: rotate(120deg);
585
+ -ms-transform: rotate(120deg);
586
+ transform: rotate(120deg);
587
+ }
588
+ &:nth-child(6) {
589
+ -webkit-animation-delay: 0.415s;
590
+ animation-delay: 0.415s;
591
+ -webkit-transform: rotate(150deg);
592
+ -ms-transform: rotate(150deg);
593
+ transform: rotate(150deg);
594
+ }
595
+ &:nth-child(7) {
596
+ -webkit-animation-delay: 0.498s;
597
+ animation-delay: 0.498s;
598
+ -webkit-transform: rotate(180deg);
599
+ -ms-transform: rotate(180deg);
600
+ transform: rotate(180deg);
601
+ }
602
+ &:nth-child(8) {
603
+ -webkit-animation-delay: 0.581s;
604
+ animation-delay: 0.581s;
605
+ -webkit-transform: rotate(210deg);
606
+ -ms-transform: rotate(210deg);
607
+ transform: rotate(210deg);
608
+ }
609
+ &:nth-child(9) {
610
+ -webkit-animation-delay: 0.664s;
611
+ animation-delay: 0.664s;
612
+ -webkit-transform: rotate(240deg);
613
+ -ms-transform: rotate(240deg);
614
+ transform: rotate(240deg);
615
+ }
616
+ &:nth-child(10) {
617
+ -webkit-animation-delay: 0.747s;
618
+ animation-delay: 0.747s;
619
+ -webkit-transform: rotate(270deg);
620
+ -ms-transform: rotate(270deg);
621
+ transform: rotate(270deg);
622
+ }
623
+ &:nth-child(11) {
624
+ -webkit-animation-delay: 0.83s;
625
+ animation-delay: 0.83s;
626
+ -webkit-transform: rotate(300deg);
627
+ -ms-transform: rotate(300deg);
628
+ transform: rotate(300deg);
629
+ }
630
+ &:nth-child(12) {
631
+ -webkit-animation-delay: 0.913s;
632
+ animation-delay: 0.913s;
633
+ -webkit-transform: rotate(330deg);
634
+ -ms-transform: rotate(330deg);
635
+ transform: rotate(330deg);
636
+ }
637
+ @keyframes spinner-animation {
638
+ 0% {
639
+ background-color: theme-apply($primary-light-32-opacity);
640
+ }
641
+
642
+ 100% {
643
+ background-color: transparent;
644
+ }
645
+ }
646
+ }
647
+ }
648
+ // Responsive
649
+ @media screen and (max-width: 600px) {
650
+ .external-view-node {
651
+ flex-basis: 65px !important;
652
+ }
653
+
654
+ .qms-tree-node.active-external-view .mat-checkbox.qms-group-options {
655
+ width: calc(100% - 110px)!important ;
656
+ }
657
+
658
+ .header-view-tree {
659
+ grid-template-columns: 1fr 80px !important;
660
+ }
661
+
662
+ ::ng-deep .cdk-virtual-scroll-content-wrapper{
663
+ right: 0 !important;
664
+ }
665
+ .header-title{
666
+ font-size: 14px !important;
667
+ }
668
+ .text-name, .node-external, .text-label, .text-label+span{
669
+ font-size: 12px;
670
+ }
671
+ .node-expand-area{
672
+ width: 30px !important;
673
+ height: 30px !important;
674
+ .qms-btn-icon{
675
+ width: 30px;
676
+ height: 30px;
677
+ line-height: 30px;
678
+ }
679
+ }
680
+ }
468
681
  }
682
+