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.
- package/bundles/qms-angular.umd.js +214 -74
- package/bundles/qms-angular.umd.js.map +1 -1
- package/esm2015/lib/common/models/qms-flat-node.model.js +1 -1
- package/esm2015/lib/common/models/qms-tree-node.model.js +1 -1
- package/esm2015/lib/components/select-department/select-department.component.js +37 -4
- package/esm2015/lib/components/select-department-tree/model/department-paging.model.js +2 -1
- package/esm2015/lib/components/select-department-tree/model/select-department-tree.config.js +3 -1
- package/esm2015/lib/components/select-department-tree/select-department-tree.component.js +128 -55
- package/fesm2015/qms-angular.js +163 -56
- package/fesm2015/qms-angular.js.map +1 -1
- package/lib/common/models/qms-flat-node.model.d.ts +1 -0
- package/lib/common/models/qms-tree-node.model.d.ts +1 -0
- package/lib/components/select-department/select-department.component.d.ts +19 -0
- package/lib/components/select-department-tree/model/select-department-tree.config.d.ts +2 -0
- package/lib/components/select-department-tree/select-department-tree.component.d.ts +33 -10
- package/package.json +1 -1
- package/src/lib/components/select-department/select-department.component.scss +13 -0
- package/src/lib/components/select-department-tree/select-department-tree.component.scss +216 -2
@@ -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
|
}
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
@@ -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)
|
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
|
+
|