@ruc-lib/dual-list-selector 2.0.0
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/README.md +8 -0
- package/esm2020/index.mjs +3 -0
- package/esm2020/interfaces/PendingSelectionItems.mjs +2 -0
- package/esm2020/lib/dual-list-selector/dual-list-selector.component.mjs +222 -0
- package/esm2020/lib/ruclib-dual-list-selector.module.mjs +57 -0
- package/esm2020/pipes/filter.pipe.mjs +28 -0
- package/esm2020/ruc-lib-dual-list-selector.mjs +5 -0
- package/fesm2015/ruc-lib-dual-list-selector.mjs +305 -0
- package/fesm2015/ruc-lib-dual-list-selector.mjs.map +1 -0
- package/fesm2020/ruc-lib-dual-list-selector.mjs +305 -0
- package/fesm2020/ruc-lib-dual-list-selector.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/interfaces/PendingSelectionItems.d.ts +3 -0
- package/lib/dual-list-selector/dual-list-selector.component.d.ts +102 -0
- package/lib/ruclib-dual-list-selector.module.d.ts +18 -0
- package/package.json +39 -0
- package/pipes/filter.pipe.d.ts +7 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Pipe, EventEmitter, Component, Input, Output, NgModule } from '@angular/core';
|
|
3
|
+
import * as i2 from '@angular/common';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { ENTER, COMMA } from '@angular/cdk/keycodes';
|
|
6
|
+
import * as i5 from '@angular/cdk/drag-drop';
|
|
7
|
+
import { moveItemInArray, transferArrayItem, DragDropModule } from '@angular/cdk/drag-drop';
|
|
8
|
+
import * as i3 from '@angular/forms';
|
|
9
|
+
import { FormsModule } from '@angular/forms';
|
|
10
|
+
import * as i4 from '@angular/material/list';
|
|
11
|
+
import { MatListModule } from '@angular/material/list';
|
|
12
|
+
import * as i6 from '@angular/material/form-field';
|
|
13
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
14
|
+
import * as i7 from '@angular/material/input';
|
|
15
|
+
import { MatInputModule } from '@angular/material/input';
|
|
16
|
+
import * as i8 from '@angular/material/icon';
|
|
17
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
18
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
19
|
+
import { MatSortModule } from '@angular/material/sort';
|
|
20
|
+
import { MatTableModule } from '@angular/material/table';
|
|
21
|
+
|
|
22
|
+
class FilterPipe {
|
|
23
|
+
transform(items, searchText, key) {
|
|
24
|
+
if (items?.length == 0)
|
|
25
|
+
return [];
|
|
26
|
+
if (!searchText)
|
|
27
|
+
return items;
|
|
28
|
+
searchText = searchText.toLowerCase();
|
|
29
|
+
return items.filter(it => {
|
|
30
|
+
if (!key) {
|
|
31
|
+
return it.toLowerCase().includes(searchText);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return it[key].toLowerCase().includes(searchText);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
FilterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
40
|
+
FilterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: FilterPipe, name: "filter" });
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterPipe, decorators: [{
|
|
42
|
+
type: Pipe,
|
|
43
|
+
args: [{
|
|
44
|
+
name: 'filter'
|
|
45
|
+
}]
|
|
46
|
+
}] });
|
|
47
|
+
|
|
48
|
+
class DualListSelectorComponent {
|
|
49
|
+
;
|
|
50
|
+
constructor(filterPipe) {
|
|
51
|
+
this.filterPipe = filterPipe;
|
|
52
|
+
this.dataSource = [];
|
|
53
|
+
this.rucEvent = new EventEmitter();
|
|
54
|
+
this.selectedItems = [];
|
|
55
|
+
this.selectedItemsBeforeSearch = [];
|
|
56
|
+
this.separatorKeysCodes = [ENTER, COMMA];
|
|
57
|
+
this.direction_unselected = false;
|
|
58
|
+
this.direction_selected = false;
|
|
59
|
+
}
|
|
60
|
+
ngOnInit() {
|
|
61
|
+
this.height = this.rucInputData.height;
|
|
62
|
+
this.width = this.rucInputData.width;
|
|
63
|
+
this.persistOnRefresh = this.rucInputData.persistOnRefresh;
|
|
64
|
+
const storedUnselectedItems = sessionStorage.getItem('unselectedItems');
|
|
65
|
+
const storedSelectedItems = sessionStorage.getItem('selectedItems');
|
|
66
|
+
if (storedUnselectedItems && storedUnselectedItems !== 'undefined' && storedSelectedItems && storedSelectedItems !== 'undefined') {
|
|
67
|
+
this.unselectedItems = JSON.parse(sessionStorage.getItem('unselectedItems'));
|
|
68
|
+
this.selectedItems = JSON.parse(sessionStorage.getItem('selectedItems'));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.unselectedItems = this.dataSource.slice().sort(this.sortItemOperator);
|
|
72
|
+
this.selectedItems = [];
|
|
73
|
+
}
|
|
74
|
+
this.unselectedItemsBeforeSearch = this.unselectedItems;
|
|
75
|
+
this.selectedItemsBeforeSearch = this.selectedItems;
|
|
76
|
+
this.pendingSelection = Object.create(null);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* save lists to storage
|
|
80
|
+
* @param selected and unselected list
|
|
81
|
+
* @return none
|
|
82
|
+
*/
|
|
83
|
+
saveToStorage(selected, unselected) {
|
|
84
|
+
if (this.persistOnRefresh) {
|
|
85
|
+
sessionStorage.setItem('selectedItems', JSON.stringify(selected));
|
|
86
|
+
sessionStorage.setItem('unselectedItems', JSON.stringify(unselected));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* add the selected item or dataSource to the selected dataSource collection
|
|
91
|
+
* @param item to be added
|
|
92
|
+
* @return none
|
|
93
|
+
*/
|
|
94
|
+
addToSelectedItems(item) {
|
|
95
|
+
console.log("item=", item);
|
|
96
|
+
const changeItems = (item)
|
|
97
|
+
? [item]
|
|
98
|
+
: this.getPendingSelectionFromCollection(this.unselectedItems);
|
|
99
|
+
this.pendingSelection = Object.create(null);
|
|
100
|
+
this.unselectedItems = this.removeItemsFromCollection(this.unselectedItems, changeItems);
|
|
101
|
+
this.selectedItems = changeItems.concat(this.selectedItems);
|
|
102
|
+
this.selectedItemsBeforeSearch = this.selectedItems;
|
|
103
|
+
this.unselectedItemsBeforeSearch = this.unselectedItems;
|
|
104
|
+
this.saveToStorage(this.selectedItemsBeforeSearch, this.unselectedItemsBeforeSearch);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Add all items to selected list
|
|
108
|
+
* @param none
|
|
109
|
+
* @return none
|
|
110
|
+
*/
|
|
111
|
+
addAllToSelectedItems() {
|
|
112
|
+
this.selectedItems = this.dataSource;
|
|
113
|
+
this.unselectedItems = [];
|
|
114
|
+
this.saveToStorage(this.selectedItems, this.unselectedItems);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* remove all items from selected list
|
|
118
|
+
* @param none
|
|
119
|
+
* @return none
|
|
120
|
+
*/
|
|
121
|
+
removeAllFromSelectedItems() {
|
|
122
|
+
this.unselectedItems = this.dataSource;
|
|
123
|
+
this.selectedItems = [];
|
|
124
|
+
this.saveToStorage(this.selectedItems, this.unselectedItems);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* when drag and drop event occurs
|
|
128
|
+
* @param event
|
|
129
|
+
* @return none
|
|
130
|
+
*/
|
|
131
|
+
drop(event) {
|
|
132
|
+
if (event.previousContainer === event.container) {
|
|
133
|
+
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Sort on click of sorting icon
|
|
141
|
+
* @param type whether it's increasing or decreasing
|
|
142
|
+
* @return none
|
|
143
|
+
*/
|
|
144
|
+
sortOnClick(type) {
|
|
145
|
+
if (this.direction_unselected && type == "unselected") {
|
|
146
|
+
this.unselectedItems = this.unselectedItems.sort((a, b) => b.name.toLowerCase().localeCompare(a.name.toLowerCase()));
|
|
147
|
+
this.direction_unselected = !this.direction_unselected;
|
|
148
|
+
}
|
|
149
|
+
else if (!this.direction_unselected && type == "unselected") {
|
|
150
|
+
this.unselectedItems = this.unselectedItems.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
|
|
151
|
+
this.direction_unselected = !this.direction_unselected;
|
|
152
|
+
}
|
|
153
|
+
if (this.direction_selected && type == "selected") {
|
|
154
|
+
this.selectedItems = this.selectedItems.sort((a, b) => b.name.toLowerCase().localeCompare(a.name.toLowerCase()));
|
|
155
|
+
this.direction_selected = !this.direction_selected;
|
|
156
|
+
}
|
|
157
|
+
else if (!this.direction_selected && type == "selected") {
|
|
158
|
+
this.selectedItems = this.selectedItems.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
|
|
159
|
+
this.direction_selected = !this.direction_selected;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* remove the selected item or dataSource from the selected dataSource collection
|
|
164
|
+
* @param item to be removed
|
|
165
|
+
* @return
|
|
166
|
+
*/
|
|
167
|
+
removeFromSelectedItems(item) {
|
|
168
|
+
const changeItems = (item)
|
|
169
|
+
? [item]
|
|
170
|
+
: this.getPendingSelectionFromCollection(this.selectedItems);
|
|
171
|
+
this.pendingSelection = Object.create(null);
|
|
172
|
+
this.selectedItems = this.removeItemsFromCollection(this.selectedItems, changeItems);
|
|
173
|
+
const changedData = changeItems
|
|
174
|
+
.concat(this.unselectedItems)
|
|
175
|
+
.sort(this.sortItemOperator);
|
|
176
|
+
this.unselectedItems = changedData;
|
|
177
|
+
this.unselectedItemsBeforeSearch = changedData;
|
|
178
|
+
this.selectedItemsBeforeSearch = this.selectedItemsBeforeSearch;
|
|
179
|
+
this.saveToStorage(this.selectedItems, this.unselectedItems);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* toggle the pending selection for the given item
|
|
183
|
+
* @param item to toggle
|
|
184
|
+
* @return none
|
|
185
|
+
*/
|
|
186
|
+
togglePendingSelection(item) {
|
|
187
|
+
this.pendingSelection[item.id] = !this.pendingSelection[item.id];
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Filter the data based on the provided input
|
|
191
|
+
* @param searchvalue input label provided in search box
|
|
192
|
+
* @return none
|
|
193
|
+
*/
|
|
194
|
+
filterData(searchvalue, type) {
|
|
195
|
+
if (type === 'unselected') {
|
|
196
|
+
if (searchvalue === "") {
|
|
197
|
+
this.unselectedItems = this.unselectedItemsBeforeSearch;
|
|
198
|
+
}
|
|
199
|
+
this.unselectedItems = this.filterPipe.transform(this.unselectedItemsBeforeSearch, searchvalue, 'name');
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
if (searchvalue === "") {
|
|
203
|
+
this.selectedItems = this.selectedItemsBeforeSearch;
|
|
204
|
+
}
|
|
205
|
+
this.selectedItems = this.filterPipe.transform(this.selectedItemsBeforeSearch, searchvalue, 'name');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* gather the dataSource in the given collection that are part of the current pending selection
|
|
210
|
+
* @param collection input label provided in search box
|
|
211
|
+
* @return selected items
|
|
212
|
+
*/
|
|
213
|
+
getPendingSelectionFromCollection(collection) {
|
|
214
|
+
const selectionFromCollection = collection.filter((item) => {
|
|
215
|
+
return (item.id in this.pendingSelection);
|
|
216
|
+
});
|
|
217
|
+
return (selectionFromCollection);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* remove the given dataSource from the given collection
|
|
221
|
+
* @param collection and ItemsToRemove
|
|
222
|
+
* @return a new collection
|
|
223
|
+
*/
|
|
224
|
+
removeItemsFromCollection(collection, ItemsToRemove) {
|
|
225
|
+
const collectionWithoutItems = collection.filter((item) => {
|
|
226
|
+
return (!ItemsToRemove.includes(item));
|
|
227
|
+
});
|
|
228
|
+
return (collectionWithoutItems);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* provide the sort operator for the dataSource collection
|
|
232
|
+
* @param two values to compare
|
|
233
|
+
* @return a value based on the sorting
|
|
234
|
+
*/
|
|
235
|
+
sortItemOperator(a, b) {
|
|
236
|
+
return (a.name.localeCompare(b.name));
|
|
237
|
+
}
|
|
238
|
+
selectedOutputItems() {
|
|
239
|
+
this.rucEvent.emit(this.selectedItems);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
DualListSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DualListSelectorComponent, deps: [{ token: FilterPipe }], target: i0.ɵɵFactoryTarget.Component });
|
|
243
|
+
DualListSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DualListSelectorComponent, selector: "uxp-dual-list-selector", inputs: { dataSource: "dataSource", rucInputData: "rucInputData", customTheme: "customTheme" }, outputs: { rucEvent: "rucEvent" }, providers: [FilterPipe], ngImport: i0, template: "<div class=\"{{customTheme}}\">\r\n <div class=\"dual-list-container\">\r\n <div class=\"dual-select\">\r\n <div class=\"leftContainer\">\r\n <mat-form-field class=\"example-full-width search_Box\" appearance=\"fill\" *ngIf=\"rucInputData.enableSearch\">\r\n <mat-label>Search</mat-label>\r\n <input matInput (keyup)=\"filterData(searchText, 'unselected')\" [(ngModel)]=\"searchText\">\r\n </mat-form-field>\r\n <span class=\"flex\" *ngIf=\"rucInputData.sorting\"><mat-icon (click)=\"sortOnClick('unselected')\">{{ !direction_unselected ? 'arrow_drop_down' :\r\n 'arrow_drop_up' }}</mat-icon> </span>\r\n <div class=\"dual-select__left\" [ngStyle]=\"{'max-height.px': height, 'width.px': width}\">\r\n <mat-list role=\"list\" class=\"list_container\">\r\n\r\n <div cdkDropList #todoList=\"cdkDropList\" [cdkDropListData]=\"unselectedItems\"\r\n [cdkDropListConnectedTo]=\"[doneList]\" class=\"example-list\" (cdkDropListDropped)=\"drop($event)\">\r\n\r\n\r\n\r\n <mat-list-item role=\"listitem\" *ngFor=\"let item of unselectedItems\" cdkDrag [disabled]=\"!item.disable\"\r\n (click)=\"togglePendingSelection( item )\" (dblclick)=\"addToSelectedItems( item )\"\r\n class=\"dual-select__item\" [class.dual-select__item--selected]=\"pendingSelection[ item.id ]\">\r\n <span>{{ item.name }}</span>\r\n </mat-list-item>\r\n </div>\r\n </mat-list>\r\n\r\n </div>\r\n </div>\r\n <div class=\"dual-select__controls\">\r\n <button (click)=\"addToSelectedItems()\" class=\"dual-select__control\">\r\n ⟼\r\n </button>\r\n <button (click)=\"removeFromSelectedItems()\" class=\"dual-select__control\">\r\n ⟻\r\n </button>\r\n <button (click)=\"addAllToSelectedItems()\" class=\"dual-select__control\">\r\n ⤇\r\n </button>\r\n <button (click)=\"removeAllFromSelectedItems()\" class=\"dual-select__control\">\r\n ⤆\r\n </button>\r\n </div>\r\n <div class=\"rightContainer\">\r\n <mat-form-field class=\"example-full-width search_Box\" appearance=\"fill\" *ngIf=\"rucInputData.enableSearch\">\r\n <mat-label>Search</mat-label>\r\n <input matInput (keyup)=\"filterData(searchTextSelected, 'selected')\" [(ngModel)]=\"searchTextSelected\">\r\n </mat-form-field>\r\n <span class=\"flex\" *ngIf=\"rucInputData.sorting\"><mat-icon (click)=\"sortOnClick('selected')\">{{ !direction_selected ? 'arrow_drop_down' :\r\n 'arrow_drop_up' }}</mat-icon> </span>\r\n\r\n <div class=\"dual-select__right\" [ngStyle]=\"{'max-height.px': height, 'width.px': width}\">\r\n\r\n\r\n\r\n <mat-list role=\"list\" class=\"list_container\">\r\n <div cdkDropList #doneList=\"cdkDropList\" [cdkDropListData]=\"selectedItems\"\r\n [cdkDropListConnectedTo]=\"[todoList]\" class=\"example-list\" (cdkDropListDropped)=\"drop($event)\">\r\n\r\n <mat-list-item cdkDrag *ngFor=\"let item of selectedItems\" (click)=\"togglePendingSelection( item )\"\r\n (dblclick)=\"removeFromSelectedItems( item )\" class=\"dual-select__item dual-select__item--new\"\r\n [class.dual-select__item--selected]=\"pendingSelection[ item.id ]\">\r\n <span>{{ item.name }}</span>\r\n </mat-list-item>\r\n </div>\r\n </mat-list>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"text-align-center\">\r\n <button (click)=\"selectedOutputItems()\" class=\"dual-list-btn\">\r\n Submit\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: [".dual-list-container{display:flex;flex-direction:column}.list{border:1px solid #ccc;padding:10px;width:45%}:host{display:block;font-size:18px}.dual-select{display:flex;justify-content:center}.leftContainer,.rightContainer{flex:0 0 auto;margin:2%}.dual-select__left,.dual-select__right{border:1px solid lightgrey;height:400px;overflow-y:auto}.dual-select__controls{justify-content:center;display:flex;flex:0 0 auto;flex-direction:column;padding:0 10px}.dual-select__control{font-size:20px;height:37px;margin:10px 0}.dual-select__items{border:1px solid #cccccc;height:100%;list-style-type:none;margin:0;overflow:auto;overscroll-behavior:contain;padding:0}.dual-select__item{border-bottom:1px solid #cccccc;cursor:pointer;margin:0;padding:0 0 0 1em;user-select:none;-moz-user-select:none;-webkit-user-select:none}.dual-select__item:last-child{border-bottom-width:0px}.dual-select__item--selected{background-color:#bfd5ff}.dual-select__item--new{animation-duration:2s;animation-name:dual-select-item-new-fade-in;animation-timing-function:ease-out}@keyframes dual-select-item-new-fade-in{0%{background-color:#fff}25%{background-color:#bfd5ff}to{background-color:#fff}}.contact{font-family:monospace,sans-serif;padding:8px 10px}.contact__name{font-size:18px;font-weight:700;line-height:22px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.contact__email{font-size:15px;line-height:19px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.note{font-family:monospace,sans-serif;font-size:16px}.search_Box{width:90%;height:67px}.list_container{padding:0}.btn_container{position:relative;top:30px;right:8%}.submit_Btn{position:absolute;bottom:0}@media screen and (max-width: 900px){.dual-select{display:inline-flex;height:400px;margin:6% 1% 1%}}.text-align-center{text-align:center}.dual-list-btn{font-size:14px;padding:.4em 1em}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i4.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
244
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DualListSelectorComponent, decorators: [{
|
|
245
|
+
type: Component,
|
|
246
|
+
args: [{ selector: 'uxp-dual-list-selector', providers: [FilterPipe], template: "<div class=\"{{customTheme}}\">\r\n <div class=\"dual-list-container\">\r\n <div class=\"dual-select\">\r\n <div class=\"leftContainer\">\r\n <mat-form-field class=\"example-full-width search_Box\" appearance=\"fill\" *ngIf=\"rucInputData.enableSearch\">\r\n <mat-label>Search</mat-label>\r\n <input matInput (keyup)=\"filterData(searchText, 'unselected')\" [(ngModel)]=\"searchText\">\r\n </mat-form-field>\r\n <span class=\"flex\" *ngIf=\"rucInputData.sorting\"><mat-icon (click)=\"sortOnClick('unselected')\">{{ !direction_unselected ? 'arrow_drop_down' :\r\n 'arrow_drop_up' }}</mat-icon> </span>\r\n <div class=\"dual-select__left\" [ngStyle]=\"{'max-height.px': height, 'width.px': width}\">\r\n <mat-list role=\"list\" class=\"list_container\">\r\n\r\n <div cdkDropList #todoList=\"cdkDropList\" [cdkDropListData]=\"unselectedItems\"\r\n [cdkDropListConnectedTo]=\"[doneList]\" class=\"example-list\" (cdkDropListDropped)=\"drop($event)\">\r\n\r\n\r\n\r\n <mat-list-item role=\"listitem\" *ngFor=\"let item of unselectedItems\" cdkDrag [disabled]=\"!item.disable\"\r\n (click)=\"togglePendingSelection( item )\" (dblclick)=\"addToSelectedItems( item )\"\r\n class=\"dual-select__item\" [class.dual-select__item--selected]=\"pendingSelection[ item.id ]\">\r\n <span>{{ item.name }}</span>\r\n </mat-list-item>\r\n </div>\r\n </mat-list>\r\n\r\n </div>\r\n </div>\r\n <div class=\"dual-select__controls\">\r\n <button (click)=\"addToSelectedItems()\" class=\"dual-select__control\">\r\n ⟼\r\n </button>\r\n <button (click)=\"removeFromSelectedItems()\" class=\"dual-select__control\">\r\n ⟻\r\n </button>\r\n <button (click)=\"addAllToSelectedItems()\" class=\"dual-select__control\">\r\n ⤇\r\n </button>\r\n <button (click)=\"removeAllFromSelectedItems()\" class=\"dual-select__control\">\r\n ⤆\r\n </button>\r\n </div>\r\n <div class=\"rightContainer\">\r\n <mat-form-field class=\"example-full-width search_Box\" appearance=\"fill\" *ngIf=\"rucInputData.enableSearch\">\r\n <mat-label>Search</mat-label>\r\n <input matInput (keyup)=\"filterData(searchTextSelected, 'selected')\" [(ngModel)]=\"searchTextSelected\">\r\n </mat-form-field>\r\n <span class=\"flex\" *ngIf=\"rucInputData.sorting\"><mat-icon (click)=\"sortOnClick('selected')\">{{ !direction_selected ? 'arrow_drop_down' :\r\n 'arrow_drop_up' }}</mat-icon> </span>\r\n\r\n <div class=\"dual-select__right\" [ngStyle]=\"{'max-height.px': height, 'width.px': width}\">\r\n\r\n\r\n\r\n <mat-list role=\"list\" class=\"list_container\">\r\n <div cdkDropList #doneList=\"cdkDropList\" [cdkDropListData]=\"selectedItems\"\r\n [cdkDropListConnectedTo]=\"[todoList]\" class=\"example-list\" (cdkDropListDropped)=\"drop($event)\">\r\n\r\n <mat-list-item cdkDrag *ngFor=\"let item of selectedItems\" (click)=\"togglePendingSelection( item )\"\r\n (dblclick)=\"removeFromSelectedItems( item )\" class=\"dual-select__item dual-select__item--new\"\r\n [class.dual-select__item--selected]=\"pendingSelection[ item.id ]\">\r\n <span>{{ item.name }}</span>\r\n </mat-list-item>\r\n </div>\r\n </mat-list>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"text-align-center\">\r\n <button (click)=\"selectedOutputItems()\" class=\"dual-list-btn\">\r\n Submit\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: [".dual-list-container{display:flex;flex-direction:column}.list{border:1px solid #ccc;padding:10px;width:45%}:host{display:block;font-size:18px}.dual-select{display:flex;justify-content:center}.leftContainer,.rightContainer{flex:0 0 auto;margin:2%}.dual-select__left,.dual-select__right{border:1px solid lightgrey;height:400px;overflow-y:auto}.dual-select__controls{justify-content:center;display:flex;flex:0 0 auto;flex-direction:column;padding:0 10px}.dual-select__control{font-size:20px;height:37px;margin:10px 0}.dual-select__items{border:1px solid #cccccc;height:100%;list-style-type:none;margin:0;overflow:auto;overscroll-behavior:contain;padding:0}.dual-select__item{border-bottom:1px solid #cccccc;cursor:pointer;margin:0;padding:0 0 0 1em;user-select:none;-moz-user-select:none;-webkit-user-select:none}.dual-select__item:last-child{border-bottom-width:0px}.dual-select__item--selected{background-color:#bfd5ff}.dual-select__item--new{animation-duration:2s;animation-name:dual-select-item-new-fade-in;animation-timing-function:ease-out}@keyframes dual-select-item-new-fade-in{0%{background-color:#fff}25%{background-color:#bfd5ff}to{background-color:#fff}}.contact{font-family:monospace,sans-serif;padding:8px 10px}.contact__name{font-size:18px;font-weight:700;line-height:22px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.contact__email{font-size:15px;line-height:19px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.note{font-family:monospace,sans-serif;font-size:16px}.search_Box{width:90%;height:67px}.list_container{padding:0}.btn_container{position:relative;top:30px;right:8%}.submit_Btn{position:absolute;bottom:0}@media screen and (max-width: 900px){.dual-select{display:inline-flex;height:400px;margin:6% 1% 1%}}.text-align-center{text-align:center}.dual-list-btn{font-size:14px;padding:.4em 1em}\n"] }]
|
|
247
|
+
}], ctorParameters: function () { return [{ type: FilterPipe }]; }, propDecorators: { dataSource: [{
|
|
248
|
+
type: Input
|
|
249
|
+
}], rucInputData: [{
|
|
250
|
+
type: Input
|
|
251
|
+
}], rucEvent: [{
|
|
252
|
+
type: Output
|
|
253
|
+
}], customTheme: [{
|
|
254
|
+
type: Input
|
|
255
|
+
}] } });
|
|
256
|
+
|
|
257
|
+
class RuclibDualListSelectorModule {
|
|
258
|
+
}
|
|
259
|
+
RuclibDualListSelectorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibDualListSelectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
260
|
+
RuclibDualListSelectorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibDualListSelectorModule, declarations: [DualListSelectorComponent, FilterPipe], imports: [CommonModule,
|
|
261
|
+
FormsModule,
|
|
262
|
+
MatListModule,
|
|
263
|
+
DragDropModule,
|
|
264
|
+
MatChipsModule,
|
|
265
|
+
MatFormFieldModule,
|
|
266
|
+
MatInputModule,
|
|
267
|
+
MatIconModule,
|
|
268
|
+
MatSortModule,
|
|
269
|
+
MatTableModule], exports: [DualListSelectorComponent] });
|
|
270
|
+
RuclibDualListSelectorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibDualListSelectorModule, imports: [CommonModule,
|
|
271
|
+
FormsModule,
|
|
272
|
+
MatListModule,
|
|
273
|
+
DragDropModule,
|
|
274
|
+
MatChipsModule,
|
|
275
|
+
MatFormFieldModule,
|
|
276
|
+
MatInputModule,
|
|
277
|
+
MatIconModule,
|
|
278
|
+
MatSortModule,
|
|
279
|
+
MatTableModule] });
|
|
280
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibDualListSelectorModule, decorators: [{
|
|
281
|
+
type: NgModule,
|
|
282
|
+
args: [{
|
|
283
|
+
imports: [CommonModule,
|
|
284
|
+
FormsModule,
|
|
285
|
+
MatListModule,
|
|
286
|
+
DragDropModule,
|
|
287
|
+
MatChipsModule,
|
|
288
|
+
MatFormFieldModule,
|
|
289
|
+
MatInputModule,
|
|
290
|
+
MatIconModule,
|
|
291
|
+
MatSortModule,
|
|
292
|
+
MatTableModule
|
|
293
|
+
],
|
|
294
|
+
declarations: [DualListSelectorComponent, FilterPipe],
|
|
295
|
+
exports: [DualListSelectorComponent],
|
|
296
|
+
entryComponents: [DualListSelectorComponent],
|
|
297
|
+
}]
|
|
298
|
+
}] });
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Generated bundle index. Do not edit.
|
|
302
|
+
*/
|
|
303
|
+
|
|
304
|
+
export { DualListSelectorComponent, RuclibDualListSelectorModule };
|
|
305
|
+
//# sourceMappingURL=ruc-lib-dual-list-selector.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruc-lib-dual-list-selector.mjs","sources":["../../../../../libs/ruclib/dual-list-selector/src/pipes/filter.pipe.ts","../../../../../libs/ruclib/dual-list-selector/src/lib/dual-list-selector/dual-list-selector.component.ts","../../../../../libs/ruclib/dual-list-selector/src/lib/dual-list-selector/dual-list-selector.component.html","../../../../../libs/ruclib/dual-list-selector/src/lib/ruclib-dual-list-selector.module.ts","../../../../../libs/ruclib/dual-list-selector/src/ruc-lib-dual-list-selector.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n@Pipe({\r\n name: 'filter'\r\n})\r\nexport class FilterPipe implements PipeTransform {\r\n transform(items: any[], searchText: string, key?:string): any[] {\r\n if (items?.length==0) return [];\r\n if (!searchText) return items;\r\n searchText = searchText.toLowerCase();\r\n return items.filter(it => {\r\n if(!key){\r\n return it.toLowerCase().includes(searchText);\r\n } else {\r\n return it[key].toLowerCase().includes(searchText);\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewEncapsulation } from '@angular/core';\r\nimport { PendingSelection } from '../../interfaces/PendingSelectionItems';\r\nimport { COMMA, ENTER } from '@angular/cdk/keycodes';\r\nimport { FilterPipe } from '../../pipes/filter.pipe';\r\nimport { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\r\n\r\n@Component({\r\n selector: 'uxp-dual-list-selector',\r\n templateUrl: './dual-list-selector.component.html',\r\n styleUrls: ['./dual-list-selector.component.scss'],\r\n providers: [FilterPipe],\r\n})\r\nexport class DualListSelectorComponent implements OnInit{\r\n @Input() dataSource: any[] = [];\r\n\t@Input() rucInputData: any;\r\n\t@Output() rucEvent = new EventEmitter();\r\n\t@Input() customTheme: string | undefined;\r\n\r\n\tpublic height: any;\r\n\tpublic width: any;\r\n\tpublic persistOnRefresh: boolean | undefined;\r\n\r\n\tpublic pendingSelection!: PendingSelection;\r\n\tpublic selectedItems: any[] = [];\r\n\tpublic unselectedItems!: any[];\r\n\r\n\tpublic selectedItemsBeforeSearch: any[] = [];\r\n\tpublic unselectedItemsBeforeSearch!: any[];;\r\n\r\n\treadonly separatorKeysCodes = [ENTER, COMMA] as const;\r\n\tpublic searchText!: string;\r\n\tpublic searchTextSelected!: string;\r\n\tdirection_unselected = false;\r\n\tdirection_selected = false;\r\n\r\n\tconstructor(public filterPipe: FilterPipe) {\r\n\r\n\r\n\t}\r\n\r\n\tngOnInit(): void {\r\n\t\tthis.height = this.rucInputData.height;\r\n\t\tthis.width = this.rucInputData.width;\r\n\t\tthis.persistOnRefresh = this.rucInputData.persistOnRefresh;\r\n\r\n\t\tconst storedUnselectedItems = sessionStorage.getItem('unselectedItems');\r\n\t\tconst storedSelectedItems = sessionStorage.getItem('selectedItems');\r\n\t\tif(storedUnselectedItems && storedUnselectedItems !== 'undefined' && storedSelectedItems && storedSelectedItems !== 'undefined'){\r\n\t\t\tthis.unselectedItems = JSON.parse(sessionStorage.getItem('unselectedItems') as any);\r\n\t\t\tthis.selectedItems = JSON.parse(sessionStorage.getItem('selectedItems') as any);\r\n\t\t}else{\r\n\t\t\tthis.unselectedItems = this.dataSource.slice().sort( this.sortItemOperator );\r\n\t\t\tthis.selectedItems = [];\r\n\t\t}\r\n\t\t\r\n\t\tthis.unselectedItemsBeforeSearch = this.unselectedItems;\r\n\t\tthis.selectedItemsBeforeSearch = this.selectedItems;\r\n\t\tthis.pendingSelection = Object.create( null );\r\n\t}\r\n\r\n \t/**\r\n\t * save lists to storage\r\n\t * @param selected and unselected list\r\n\t * @return none\r\n\t */\r\n\tpublic saveToStorage(selected: any[], unselected: any[]){\r\n\t\tif(this.persistOnRefresh){\r\n\t\t\tsessionStorage.setItem('selectedItems', JSON.stringify(selected));\r\n\t\t\tsessionStorage.setItem('unselectedItems', JSON.stringify(unselected));\r\n\t\t}\r\n\t}\r\n\r\n \t/**\r\n\t * add the selected item or dataSource to the selected dataSource collection\r\n\t * @param item to be added\r\n\t * @return none\r\n\t */\r\n\tpublic addToSelectedItems( item?: any ) : void {\r\nconsole.log(\"item=\",item);\r\n\t\tconst changeItems = ( item )\r\n\t\t\t? [ item ]\r\n\t\t\t: this.getPendingSelectionFromCollection( this.unselectedItems );\r\n\r\n\t\tthis.pendingSelection = Object.create( null );\r\n\t\tthis.unselectedItems = this.removeItemsFromCollection( this.unselectedItems, changeItems );\r\n\t\tthis.selectedItems = changeItems.concat( this.selectedItems );\r\n\t\tthis.selectedItemsBeforeSearch = this.selectedItems; \r\n\t\tthis.unselectedItemsBeforeSearch = this.unselectedItems;\r\n\t\tthis.saveToStorage(this.selectedItemsBeforeSearch, this.unselectedItemsBeforeSearch);\r\n\t}\r\n\r\n\t/**\r\n\t * Add all items to selected list\r\n\t * @param none\r\n\t * @return none\r\n\t */\r\n\tpublic addAllToSelectedItems() : void {\r\n\t\tthis.selectedItems = this.dataSource;\r\n\t\tthis.unselectedItems = [];\r\n\t\tthis.saveToStorage(this.selectedItems, this.unselectedItems);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * remove all items from selected list\r\n\t * @param none\r\n\t * @return none\r\n\t */\r\n\tpublic removeAllFromSelectedItems() : void {\r\n \tthis.unselectedItems = this.dataSource;\r\n\t\tthis.selectedItems = [];\r\n\t\tthis.saveToStorage(this.selectedItems, this.unselectedItems);\r\n \t}\r\n\r\n \t/**\r\n\t * when drag and drop event occurs\r\n\t * @param event\r\n\t * @return none\r\n\t */\r\n drop(event: CdkDragDrop<string[]>) {\r\n if (event.previousContainer === event.container) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n } else {\r\n transferArrayItem(\r\n event.previousContainer.data,\r\n event.container.data,\r\n event.previousIndex,\r\n event.currentIndex,\r\n );\r\n }\r\n }\r\n\r\n\r\n\t/**\r\n\t * Sort on click of sorting icon\r\n\t * @param type whether it's increasing or decreasing\r\n\t * @return none\r\n\t */\r\n sortOnClick(type:string) {\r\n\r\n\t\tif(this.direction_unselected && type== \"unselected\"){\r\n\t\t\tthis.unselectedItems = this.unselectedItems.sort((a, b) => b.name.toLowerCase().localeCompare(a.name.toLowerCase()));\r\n\t\t\tthis.direction_unselected = !this.direction_unselected;\r\n\t\t}else if(!this.direction_unselected && type== \"unselected\") {\r\n\t\t\tthis.unselectedItems = this.unselectedItems.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()))\r\n\t\t\tthis.direction_unselected = !this.direction_unselected;\r\n\t\t}\r\n\t\tif(this.direction_selected && type== \"selected\"){\r\n\t\t\tthis.selectedItems = this.selectedItems.sort((a, b) => b.name.toLowerCase().localeCompare(a.name.toLowerCase()));\r\n\t\t\tthis.direction_selected = !this.direction_selected;\r\n\t\t}else if(!this.direction_selected && type== \"selected\") {\r\n\t\t\tthis.selectedItems = this.selectedItems.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()))\r\n\t\t\tthis.direction_selected = !this.direction_selected;\r\n\t\t}\r\n\t\r\n }\r\n\r\n \t/**\r\n\t * remove the selected item or dataSource from the selected dataSource collection\r\n\t * @param item to be removed\r\n\t * @return \r\n\t */\r\n\tpublic removeFromSelectedItems( item?: any ) : void {\r\n\r\n\t\tconst changeItems = ( item )\r\n\t\t\t? [ item ]\r\n\t\t\t: this.getPendingSelectionFromCollection( this.selectedItems );\r\n\r\n\t\tthis.pendingSelection = Object.create( null );\r\n\t\tthis.selectedItems = this.removeItemsFromCollection( this.selectedItems, changeItems );\r\n\t\tconst changedData= changeItems\r\n\t\t\t.concat( this.unselectedItems )\r\n\t\t\t.sort( this.sortItemOperator );\r\n\t\tthis.unselectedItems = changedData;\r\n\t\tthis.unselectedItemsBeforeSearch = changedData;\r\n\t\tthis.selectedItemsBeforeSearch = this.selectedItemsBeforeSearch;\r\n\t\tthis.saveToStorage(this.selectedItems, this.unselectedItems);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * toggle the pending selection for the given item\r\n\t * @param item to toggle\r\n\t * @return none\r\n\t */\r\n\tpublic togglePendingSelection( item:any ) : void {\r\n\t\tthis.pendingSelection[ item.id ] = ! this.pendingSelection[ item.id ];\r\n\t}\r\n\r\n\t/**\r\n\t * Filter the data based on the provided input\r\n\t * @param searchvalue input label provided in search box\r\n\t * @return none\r\n\t */\r\n\tfilterData(searchvalue: any, type: string): any {\r\n\t\tif(type === 'unselected'){\r\n\t\t\tif(searchvalue === \"\"){\r\n\t\t\t\tthis.unselectedItems= this.unselectedItemsBeforeSearch;\r\n\t\t\t}\r\n\t\t\tthis.unselectedItems = this.filterPipe.transform(this.unselectedItemsBeforeSearch, searchvalue, 'name');\r\n\t\t}\r\n\t\telse{\r\n\t\t\tif(searchvalue === \"\"){\r\n\t\t\t\tthis.selectedItems= this.selectedItemsBeforeSearch;\r\n\t\t\t}\r\n\t\t\tthis.selectedItems = this.filterPipe.transform(this.selectedItemsBeforeSearch, searchvalue, 'name');\r\n\t\t}\r\n\t}\r\n\t\r\n\t/**\r\n\t * gather the dataSource in the given collection that are part of the current pending selection\r\n\t * @param collection input label provided in search box\r\n\t * @return selected items\r\n\t */\r\n\r\n\tpublic getPendingSelectionFromCollection( collection: any[] ) : any[] {\r\n\r\n\t\tconst selectionFromCollection = collection.filter(\r\n\t\t\t( item ) => {\r\n\t\t\t\treturn( item.id in this.pendingSelection );\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t\treturn( selectionFromCollection );\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * remove the given dataSource from the given collection\r\n\t * @param collection and ItemsToRemove\r\n\t * @return a new collection\r\n\t */\r\n\tpublic removeItemsFromCollection(\r\n\t\tcollection: any[],\r\n\t\tItemsToRemove: any[]\r\n\t\t) : any[] {\r\n\r\n\t\tconst collectionWithoutItems = collection.filter(\r\n\t\t\t( item ) => {\r\n\t\t\t\treturn( ! ItemsToRemove.includes( item ) );\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t\treturn( collectionWithoutItems );\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * provide the sort operator for the dataSource collection\r\n\t * @param two values to compare\r\n\t * @return a value based on the sorting\r\n\t */\r\n\tpublic sortItemOperator( a: any, b: any ) : number {\r\n\t\treturn( a.name.localeCompare( b.name ) );\r\n\t}\r\n\r\n\tselectedOutputItems() {\r\n\t\tthis.rucEvent.emit(this.selectedItems);\r\n\t}\r\n}\r\n ","<div class=\"{{customTheme}}\">\r\n <div class=\"dual-list-container\">\r\n <div class=\"dual-select\">\r\n <div class=\"leftContainer\">\r\n <mat-form-field class=\"example-full-width search_Box\" appearance=\"fill\" *ngIf=\"rucInputData.enableSearch\">\r\n <mat-label>Search</mat-label>\r\n <input matInput (keyup)=\"filterData(searchText, 'unselected')\" [(ngModel)]=\"searchText\">\r\n </mat-form-field>\r\n <span class=\"flex\" *ngIf=\"rucInputData.sorting\"><mat-icon (click)=\"sortOnClick('unselected')\">{{ !direction_unselected ? 'arrow_drop_down' :\r\n 'arrow_drop_up' }}</mat-icon> </span>\r\n <div class=\"dual-select__left\" [ngStyle]=\"{'max-height.px': height, 'width.px': width}\">\r\n <mat-list role=\"list\" class=\"list_container\">\r\n\r\n <div cdkDropList #todoList=\"cdkDropList\" [cdkDropListData]=\"unselectedItems\"\r\n [cdkDropListConnectedTo]=\"[doneList]\" class=\"example-list\" (cdkDropListDropped)=\"drop($event)\">\r\n\r\n\r\n\r\n <mat-list-item role=\"listitem\" *ngFor=\"let item of unselectedItems\" cdkDrag [disabled]=\"!item.disable\"\r\n (click)=\"togglePendingSelection( item )\" (dblclick)=\"addToSelectedItems( item )\"\r\n class=\"dual-select__item\" [class.dual-select__item--selected]=\"pendingSelection[ item.id ]\">\r\n <span>{{ item.name }}</span>\r\n </mat-list-item>\r\n </div>\r\n </mat-list>\r\n\r\n </div>\r\n </div>\r\n <div class=\"dual-select__controls\">\r\n <button (click)=\"addToSelectedItems()\" class=\"dual-select__control\">\r\n ⟼\r\n </button>\r\n <button (click)=\"removeFromSelectedItems()\" class=\"dual-select__control\">\r\n ⟻\r\n </button>\r\n <button (click)=\"addAllToSelectedItems()\" class=\"dual-select__control\">\r\n ⤇\r\n </button>\r\n <button (click)=\"removeAllFromSelectedItems()\" class=\"dual-select__control\">\r\n ⤆\r\n </button>\r\n </div>\r\n <div class=\"rightContainer\">\r\n <mat-form-field class=\"example-full-width search_Box\" appearance=\"fill\" *ngIf=\"rucInputData.enableSearch\">\r\n <mat-label>Search</mat-label>\r\n <input matInput (keyup)=\"filterData(searchTextSelected, 'selected')\" [(ngModel)]=\"searchTextSelected\">\r\n </mat-form-field>\r\n <span class=\"flex\" *ngIf=\"rucInputData.sorting\"><mat-icon (click)=\"sortOnClick('selected')\">{{ !direction_selected ? 'arrow_drop_down' :\r\n 'arrow_drop_up' }}</mat-icon> </span>\r\n\r\n <div class=\"dual-select__right\" [ngStyle]=\"{'max-height.px': height, 'width.px': width}\">\r\n\r\n\r\n\r\n <mat-list role=\"list\" class=\"list_container\">\r\n <div cdkDropList #doneList=\"cdkDropList\" [cdkDropListData]=\"selectedItems\"\r\n [cdkDropListConnectedTo]=\"[todoList]\" class=\"example-list\" (cdkDropListDropped)=\"drop($event)\">\r\n\r\n <mat-list-item cdkDrag *ngFor=\"let item of selectedItems\" (click)=\"togglePendingSelection( item )\"\r\n (dblclick)=\"removeFromSelectedItems( item )\" class=\"dual-select__item dual-select__item--new\"\r\n [class.dual-select__item--selected]=\"pendingSelection[ item.id ]\">\r\n <span>{{ item.name }}</span>\r\n </mat-list-item>\r\n </div>\r\n </mat-list>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"text-align-center\">\r\n <button (click)=\"selectedOutputItems()\" class=\"dual-list-btn\">\r\n Submit\r\n </button>\r\n </div>\r\n </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DualListSelectorComponent } from './dual-list-selector/dual-list-selector.component';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { FilterPipe } from '../pipes/filter.pipe';\r\nimport {MatChipsModule} from '@angular/material/chips';\r\n\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\n\r\n@NgModule({\r\n imports: [CommonModule,\r\n FormsModule,\r\n MatListModule,\r\n DragDropModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatSortModule,\r\n MatTableModule\r\n ],\r\n declarations: [DualListSelectorComponent,FilterPipe],\r\n exports: [DualListSelectorComponent],\r\n entryComponents: [DualListSelectorComponent],\r\n})\r\nexport class RuclibDualListSelectorModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.FilterPipe"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { PendingSelection } from '../../interfaces/PendingSelectionItems';
|
|
3
|
+
import { FilterPipe } from '../../pipes/filter.pipe';
|
|
4
|
+
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class DualListSelectorComponent implements OnInit {
|
|
7
|
+
filterPipe: FilterPipe;
|
|
8
|
+
dataSource: any[];
|
|
9
|
+
rucInputData: any;
|
|
10
|
+
rucEvent: EventEmitter<any>;
|
|
11
|
+
customTheme: string | undefined;
|
|
12
|
+
height: any;
|
|
13
|
+
width: any;
|
|
14
|
+
persistOnRefresh: boolean | undefined;
|
|
15
|
+
pendingSelection: PendingSelection;
|
|
16
|
+
selectedItems: any[];
|
|
17
|
+
unselectedItems: any[];
|
|
18
|
+
selectedItemsBeforeSearch: any[];
|
|
19
|
+
unselectedItemsBeforeSearch: any[];
|
|
20
|
+
readonly separatorKeysCodes: readonly [13, 188];
|
|
21
|
+
searchText: string;
|
|
22
|
+
searchTextSelected: string;
|
|
23
|
+
direction_unselected: boolean;
|
|
24
|
+
direction_selected: boolean;
|
|
25
|
+
constructor(filterPipe: FilterPipe);
|
|
26
|
+
ngOnInit(): void;
|
|
27
|
+
/**
|
|
28
|
+
* save lists to storage
|
|
29
|
+
* @param selected and unselected list
|
|
30
|
+
* @return none
|
|
31
|
+
*/
|
|
32
|
+
saveToStorage(selected: any[], unselected: any[]): void;
|
|
33
|
+
/**
|
|
34
|
+
* add the selected item or dataSource to the selected dataSource collection
|
|
35
|
+
* @param item to be added
|
|
36
|
+
* @return none
|
|
37
|
+
*/
|
|
38
|
+
addToSelectedItems(item?: any): void;
|
|
39
|
+
/**
|
|
40
|
+
* Add all items to selected list
|
|
41
|
+
* @param none
|
|
42
|
+
* @return none
|
|
43
|
+
*/
|
|
44
|
+
addAllToSelectedItems(): void;
|
|
45
|
+
/**
|
|
46
|
+
* remove all items from selected list
|
|
47
|
+
* @param none
|
|
48
|
+
* @return none
|
|
49
|
+
*/
|
|
50
|
+
removeAllFromSelectedItems(): void;
|
|
51
|
+
/**
|
|
52
|
+
* when drag and drop event occurs
|
|
53
|
+
* @param event
|
|
54
|
+
* @return none
|
|
55
|
+
*/
|
|
56
|
+
drop(event: CdkDragDrop<string[]>): void;
|
|
57
|
+
/**
|
|
58
|
+
* Sort on click of sorting icon
|
|
59
|
+
* @param type whether it's increasing or decreasing
|
|
60
|
+
* @return none
|
|
61
|
+
*/
|
|
62
|
+
sortOnClick(type: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* remove the selected item or dataSource from the selected dataSource collection
|
|
65
|
+
* @param item to be removed
|
|
66
|
+
* @return
|
|
67
|
+
*/
|
|
68
|
+
removeFromSelectedItems(item?: any): void;
|
|
69
|
+
/**
|
|
70
|
+
* toggle the pending selection for the given item
|
|
71
|
+
* @param item to toggle
|
|
72
|
+
* @return none
|
|
73
|
+
*/
|
|
74
|
+
togglePendingSelection(item: any): void;
|
|
75
|
+
/**
|
|
76
|
+
* Filter the data based on the provided input
|
|
77
|
+
* @param searchvalue input label provided in search box
|
|
78
|
+
* @return none
|
|
79
|
+
*/
|
|
80
|
+
filterData(searchvalue: any, type: string): any;
|
|
81
|
+
/**
|
|
82
|
+
* gather the dataSource in the given collection that are part of the current pending selection
|
|
83
|
+
* @param collection input label provided in search box
|
|
84
|
+
* @return selected items
|
|
85
|
+
*/
|
|
86
|
+
getPendingSelectionFromCollection(collection: any[]): any[];
|
|
87
|
+
/**
|
|
88
|
+
* remove the given dataSource from the given collection
|
|
89
|
+
* @param collection and ItemsToRemove
|
|
90
|
+
* @return a new collection
|
|
91
|
+
*/
|
|
92
|
+
removeItemsFromCollection(collection: any[], ItemsToRemove: any[]): any[];
|
|
93
|
+
/**
|
|
94
|
+
* provide the sort operator for the dataSource collection
|
|
95
|
+
* @param two values to compare
|
|
96
|
+
* @return a value based on the sorting
|
|
97
|
+
*/
|
|
98
|
+
sortItemOperator(a: any, b: any): number;
|
|
99
|
+
selectedOutputItems(): void;
|
|
100
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DualListSelectorComponent, never>;
|
|
101
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DualListSelectorComponent, "uxp-dual-list-selector", never, { "dataSource": "dataSource"; "rucInputData": "rucInputData"; "customTheme": "customTheme"; }, { "rucEvent": "rucEvent"; }, never, never, false, never>;
|
|
102
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./dual-list-selector/dual-list-selector.component";
|
|
3
|
+
import * as i2 from "../pipes/filter.pipe";
|
|
4
|
+
import * as i3 from "@angular/common";
|
|
5
|
+
import * as i4 from "@angular/forms";
|
|
6
|
+
import * as i5 from "@angular/material/list";
|
|
7
|
+
import * as i6 from "@angular/cdk/drag-drop";
|
|
8
|
+
import * as i7 from "@angular/material/chips";
|
|
9
|
+
import * as i8 from "@angular/material/form-field";
|
|
10
|
+
import * as i9 from "@angular/material/input";
|
|
11
|
+
import * as i10 from "@angular/material/icon";
|
|
12
|
+
import * as i11 from "@angular/material/sort";
|
|
13
|
+
import * as i12 from "@angular/material/table";
|
|
14
|
+
export declare class RuclibDualListSelectorModule {
|
|
15
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RuclibDualListSelectorModule, never>;
|
|
16
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<RuclibDualListSelectorModule, [typeof i1.DualListSelectorComponent, typeof i2.FilterPipe], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i5.MatListModule, typeof i6.DragDropModule, typeof i7.MatChipsModule, typeof i8.MatFormFieldModule, typeof i9.MatInputModule, typeof i10.MatIconModule, typeof i11.MatSortModule, typeof i12.MatTableModule], [typeof i1.DualListSelectorComponent]>;
|
|
17
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<RuclibDualListSelectorModule>;
|
|
18
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ruc-lib/dual-list-selector",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"peerDependencies": {
|
|
6
|
+
"@angular/common": "^17.0.0 || ^16.0.0 || ^15.0.0",
|
|
7
|
+
"@angular/core": "^17.0.0 || ^16.0.0 || ^15.0.0",
|
|
8
|
+
"@angular/material": "^15.2.9 || ^14.0.0 || ^13.0.0",
|
|
9
|
+
"@angular/cdk": "15.2.9",
|
|
10
|
+
"@angular/platform-browser": "15.2.10",
|
|
11
|
+
"@angular/forms": "15.2.10"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"tslib": "^2.3.0"
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"module": "fesm2015/ruc-lib-dual-list-selector.mjs",
|
|
21
|
+
"es2020": "fesm2020/ruc-lib-dual-list-selector.mjs",
|
|
22
|
+
"esm2020": "esm2020/ruc-lib-dual-list-selector.mjs",
|
|
23
|
+
"fesm2020": "fesm2020/ruc-lib-dual-list-selector.mjs",
|
|
24
|
+
"fesm2015": "fesm2015/ruc-lib-dual-list-selector.mjs",
|
|
25
|
+
"typings": "index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
"./package.json": {
|
|
28
|
+
"default": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./index.d.ts",
|
|
32
|
+
"esm2020": "./esm2020/ruc-lib-dual-list-selector.mjs",
|
|
33
|
+
"es2020": "./fesm2020/ruc-lib-dual-list-selector.mjs",
|
|
34
|
+
"es2015": "./fesm2015/ruc-lib-dual-list-selector.mjs",
|
|
35
|
+
"node": "./fesm2015/ruc-lib-dual-list-selector.mjs",
|
|
36
|
+
"default": "./fesm2020/ruc-lib-dual-list-selector.mjs"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class FilterPipe implements PipeTransform {
|
|
4
|
+
transform(items: any[], searchText: string, key?: string): any[];
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FilterPipe, never>;
|
|
6
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<FilterPipe, "filter", false>;
|
|
7
|
+
}
|