UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

603 lines (595 loc) 22.7 kB
import { EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, Input, Output, Optional, ViewChildren, NgModule } from '@angular/core'; import { __decorate, __metadata } from 'tslib'; import { Directionality, BidiModule } from '@angular/cdk/bidi'; import { toArray, InputBoolean } from 'ng-zorro-antd/core/util'; import { NzI18nService, NzI18nModule } from 'ng-zorro-antd/i18n'; import { Subject, of } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { NzCheckboxModule } from 'ng-zorro-antd/checkbox'; import { NzEmptyModule } from 'ng-zorro-antd/empty'; import { NzIconModule } from 'ng-zorro-antd/icon'; import { NzInputModule } from 'ng-zorro-antd/input'; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ class NzTransferListComponent { // #endregion constructor(cdr, elementRef) { this.cdr = cdr; this.elementRef = elementRef; // #region fields this.direction = 'left'; this.titleText = ''; this.showSelectAll = true; this.dataSource = []; this.itemUnit = ''; this.itemsUnit = ''; this.filter = ''; this.disabled = false; this.renderList = null; this.render = null; this.footer = null; // events this.handleSelectAll = new EventEmitter(); this.handleSelect = new EventEmitter(); this.filterChange = new EventEmitter(); this.stat = { checkAll: false, checkHalf: false, checkCount: 0, shownCount: 0 }; this.onItemSelect = (item) => { if (this.disabled || item.disabled) { return; } item.checked = !item.checked; this.updateCheckStatus(); this.handleSelect.emit(item); }; this.onItemSelectAll = (status) => { this.dataSource.forEach(item => { if (!item.disabled && !item.hide) { item.checked = status; } }); this.updateCheckStatus(); this.handleSelectAll.emit(status); }; // TODO: move to host after View Engine deprecation this.elementRef.nativeElement.classList.add('ant-transfer-list'); } get validData() { return this.dataSource.filter(w => !w.hide); } updateCheckStatus() { const validCount = this.dataSource.filter(w => !w.disabled).length; this.stat.checkCount = this.dataSource.filter(w => w.checked && !w.disabled).length; this.stat.shownCount = this.validData.length; this.stat.checkAll = validCount > 0 && validCount === this.stat.checkCount; this.stat.checkHalf = this.stat.checkCount > 0 && !this.stat.checkAll; } // #endregion // #region search handleFilter(value) { this.filter = value; this.dataSource.forEach(item => { item.hide = value.length > 0 && !this.matchFilter(value, item); }); this.stat.shownCount = this.validData.length; this.filterChange.emit({ direction: this.direction, value }); } handleClear() { this.handleFilter(''); } matchFilter(text, item) { if (this.filterOption) { return this.filterOption(text, item); } return item.title.includes(text); } markForCheck() { this.updateCheckStatus(); this.cdr.markForCheck(); } } NzTransferListComponent.decorators = [ { type: Component, args: [{ selector: 'nz-transfer-list', exportAs: 'nzTransferList', preserveWhitespaces: false, template: ` <ng-template #defaultRenderList> <ul *ngIf="stat.shownCount > 0" class="ant-transfer-list-content"> <li *ngFor="let item of validData" (click)="onItemSelect(item)" class="ant-transfer-list-content-item" [ngClass]="{ 'ant-transfer-list-content-item-disabled': disabled || item.disabled }" > <label nz-checkbox [nzChecked]="item.checked" (nzCheckedChange)="onItemSelect(item)" (click)="$event.stopPropagation()" [nzDisabled]="disabled || item.disabled" > <ng-container *ngIf="!render; else renderContainer">{{ item.title }}</ng-container> <ng-template #renderContainer [ngTemplateOutlet]="render" [ngTemplateOutletContext]="{ $implicit: item }"></ng-template> </label> </li> </ul> <div *ngIf="stat.shownCount === 0" class="ant-transfer-list-body-not-found"> <nz-embed-empty [nzComponentName]="'transfer'" [specificContent]="notFoundContent"></nz-embed-empty> </div> </ng-template> <div class="ant-transfer-list-header"> <label *ngIf="showSelectAll" nz-checkbox [nzChecked]="stat.checkAll" (nzCheckedChange)="onItemSelectAll($event)" [nzIndeterminate]="stat.checkHalf" [nzDisabled]="stat.shownCount == 0 || disabled" ></label> <span class="ant-transfer-list-header-selected"> <span> {{ (stat.checkCount > 0 ? stat.checkCount + '/' : '') + stat.shownCount }} {{ validData.length > 1 ? itemsUnit : itemUnit }} </span> <span *ngIf="titleText" class="ant-transfer-list-header-title">{{ titleText }}</span> </span> </div> <div class="{{ showSearch ? 'ant-transfer-list-body ant-transfer-list-body-with-search' : 'ant-transfer-list-body' }}" [ngClass]="{ 'ant-transfer__nodata': stat.shownCount === 0 }" > <div *ngIf="showSearch" class="ant-transfer-list-body-search-wrapper"> <div nz-transfer-search (valueChanged)="handleFilter($event)" (valueClear)="handleClear()" [placeholder]="searchPlaceholder" [disabled]="disabled" [value]="filter" ></div> </div> <ng-container *ngIf="renderList; else defaultRenderList"> <div class="ant-transfer-list-body-customize-wrapper"> <ng-container *ngTemplateOutlet=" renderList; context: { $implicit: validData, direction: direction, disabled: disabled, onItemSelectAll: onItemSelectAll, onItemSelect: onItemSelect, stat: stat } " ></ng-container> </div> </ng-container> </div> <div *ngIf="footer" class="ant-transfer-list-footer"> <ng-template [ngTemplateOutlet]="footer" [ngTemplateOutletContext]="{ $implicit: direction }"></ng-template> </div> `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class.ant-transfer-list-with-footer]': '!!footer' } },] } ]; NzTransferListComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: ElementRef } ]; NzTransferListComponent.propDecorators = { direction: [{ type: Input }], titleText: [{ type: Input }], showSelectAll: [{ type: Input }], dataSource: [{ type: Input }], itemUnit: [{ type: Input }], itemsUnit: [{ type: Input }], filter: [{ type: Input }], disabled: [{ type: Input }], showSearch: [{ type: Input }], searchPlaceholder: [{ type: Input }], notFoundContent: [{ type: Input }], filterOption: [{ type: Input }], renderList: [{ type: Input }], render: [{ type: Input }], footer: [{ type: Input }], handleSelectAll: [{ type: Output }], handleSelect: [{ type: Output }], filterChange: [{ type: Output }] }; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ class NzTransferSearchComponent { // endregion constructor(cdr) { this.cdr = cdr; this.disabled = false; this.valueChanged = new EventEmitter(); this.valueClear = new EventEmitter(); } _handle() { this.valueChanged.emit(this.value); } _clear() { if (this.disabled) { return; } this.value = ''; this.valueClear.emit(); } ngOnChanges() { this.cdr.detectChanges(); } } NzTransferSearchComponent.decorators = [ { type: Component, args: [{ selector: '[nz-transfer-search]', exportAs: 'nzTransferSearch', preserveWhitespaces: false, template: ` <input [(ngModel)]="value" (ngModelChange)="_handle()" [disabled]="disabled" [placeholder]="placeholder" class="ant-input ant-transfer-list-search" [ngClass]="{ 'ant-input-disabled': disabled }" /> <a *ngIf="value && value.length > 0; else def" class="ant-transfer-list-search-action" (click)="_clear()"> <i nz-icon nzType="close-circle"></i> </a> <ng-template #def> <span class="ant-transfer-list-search-action"><i nz-icon nzType="search"></i></span> </ng-template> `, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush },] } ]; NzTransferSearchComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; NzTransferSearchComponent.propDecorators = { placeholder: [{ type: Input }], value: [{ type: Input }], disabled: [{ type: Input }], valueChanged: [{ type: Output }], valueClear: [{ type: Output }] }; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ class NzTransferComponent { // #endregion constructor(cdr, i18n, elementRef, directionality) { this.cdr = cdr; this.i18n = i18n; this.elementRef = elementRef; this.directionality = directionality; this.unsubscribe$ = new Subject(); this.leftFilter = ''; this.rightFilter = ''; this.dir = 'ltr'; // #region fields this.nzDisabled = false; this.nzDataSource = []; this.nzTitles = ['', '']; this.nzOperations = []; this.nzListStyle = {}; this.nzShowSelectAll = true; this.nzCanMove = (arg) => of(arg.list); this.nzRenderList = null; this.nzRender = null; this.nzFooter = null; this.nzShowSearch = false; this.nzTargetKeys = []; this.nzSelectedKeys = []; // events this.nzChange = new EventEmitter(); this.nzSearchChange = new EventEmitter(); this.nzSelectChange = new EventEmitter(); // #endregion // #region process data // left this.leftDataSource = []; // right this.rightDataSource = []; this.handleLeftSelectAll = (checked) => this.handleSelect('left', checked); this.handleRightSelectAll = (checked) => this.handleSelect('right', checked); this.handleLeftSelect = (item) => this.handleSelect('left', !!item.checked, item); this.handleRightSelect = (item) => this.handleSelect('right', !!item.checked, item); // #endregion // #region operation this.leftActive = false; this.rightActive = false; this.moveToLeft = () => this.moveTo('left'); this.moveToRight = () => this.moveTo('right'); // TODO: move to host after View Engine deprecation this.elementRef.nativeElement.classList.add('ant-transfer'); } splitDataSource() { this.leftDataSource = []; this.rightDataSource = []; this.nzDataSource.forEach(record => { if (record.direction === 'right') { record.direction = 'right'; this.rightDataSource.push(record); } else { record.direction = 'left'; this.leftDataSource.push(record); } }); } getCheckedData(direction) { return this[direction === 'left' ? 'leftDataSource' : 'rightDataSource'].filter(w => w.checked); } handleSelect(direction, checked, item) { const list = this.getCheckedData(direction); this.updateOperationStatus(direction, list.length); this.nzSelectChange.emit({ direction, checked, list, item }); } handleFilterChange(ret) { this.nzSearchChange.emit(ret); } updateOperationStatus(direction, count) { this[direction === 'right' ? 'leftActive' : 'rightActive'] = (typeof count === 'undefined' ? this.getCheckedData(direction).filter(w => !w.disabled).length : count) > 0; } moveTo(direction) { const oppositeDirection = direction === 'left' ? 'right' : 'left'; this.updateOperationStatus(oppositeDirection, 0); const datasource = direction === 'left' ? this.rightDataSource : this.leftDataSource; const moveList = datasource.filter(item => item.checked === true && !item.disabled); this.nzCanMove({ direction, list: moveList }).subscribe(newMoveList => this.truthMoveTo(direction, newMoveList.filter(i => !!i)), () => moveList.forEach(i => (i.checked = false))); } truthMoveTo(direction, list) { const oppositeDirection = direction === 'left' ? 'right' : 'left'; const datasource = direction === 'left' ? this.rightDataSource : this.leftDataSource; const targetDatasource = direction === 'left' ? this.leftDataSource : this.rightDataSource; for (const item of list) { item.checked = false; item.hide = false; item.direction = direction; datasource.splice(datasource.indexOf(item), 1); } targetDatasource.splice(0, 0, ...list); this.updateOperationStatus(oppositeDirection); this.nzChange.emit({ from: oppositeDirection, to: direction, list }); this.markForCheckAllList(); } markForCheckAllList() { if (!this.lists) { return; } this.lists.forEach(i => i.markForCheck()); } handleNzTargetKeys() { const keys = toArray(this.nzTargetKeys); const hasOwnKey = (e) => e.hasOwnProperty('key'); this.leftDataSource.forEach(e => { if (hasOwnKey(e) && keys.indexOf(e.key) !== -1 && !e.disabled) { e.checked = true; } }); this.moveToRight(); } handleNzSelectedKeys() { const keys = toArray(this.nzSelectedKeys); this.nzDataSource.forEach(e => { if (keys.indexOf(e.key) !== -1) { e.checked = true; } }); const term = (ld) => ld.disabled === false && ld.checked === true; this.rightActive = this.leftDataSource.some(term); this.leftActive = this.rightDataSource.some(term); } ngOnInit() { var _a; this.i18n.localeChange.pipe(takeUntil(this.unsubscribe$)).subscribe(() => { this.locale = this.i18n.getLocaleData('Transfer'); this.markForCheckAllList(); }); this.dir = this.directionality.value; (_a = this.directionality.change) === null || _a === void 0 ? void 0 : _a.pipe(takeUntil(this.unsubscribe$)).subscribe((direction) => { this.dir = direction; this.cdr.detectChanges(); }); } ngOnChanges(changes) { if (changes.nzDataSource) { this.splitDataSource(); this.updateOperationStatus('left'); this.updateOperationStatus('right'); this.cdr.detectChanges(); this.markForCheckAllList(); } if (changes.nzTargetKeys) { this.handleNzTargetKeys(); } if (changes.nzSelectedKeys) { this.handleNzSelectedKeys(); } } ngOnDestroy() { this.unsubscribe$.next(); this.unsubscribe$.complete(); } } NzTransferComponent.decorators = [ { type: Component, args: [{ selector: 'nz-transfer', exportAs: 'nzTransfer', preserveWhitespaces: false, template: ` <nz-transfer-list class="ant-transfer-list" [ngStyle]="nzListStyle" data-direction="left" direction="left" [titleText]="nzTitles[0]" [showSelectAll]="nzShowSelectAll" [dataSource]="leftDataSource" [filter]="leftFilter" [filterOption]="nzFilterOption" (filterChange)="handleFilterChange($event)" [renderList]="nzRenderList && nzRenderList[0]" [render]="nzRender" [disabled]="nzDisabled" [showSearch]="nzShowSearch" [searchPlaceholder]="nzSearchPlaceholder || locale?.searchPlaceholder" [notFoundContent]="nzNotFoundContent" [itemUnit]="nzItemUnit || locale?.itemUnit" [itemsUnit]="nzItemsUnit || locale?.itemsUnit" [footer]="nzFooter" (handleSelect)="handleLeftSelect($event)" (handleSelectAll)="handleLeftSelectAll($event)" ></nz-transfer-list> <div *ngIf="dir !== 'rtl'" class="ant-transfer-operation"> <button nz-button (click)="moveToLeft()" [disabled]="nzDisabled || !leftActive" [nzType]="'primary'" [nzSize]="'small'"> <i nz-icon nzType="left"></i> <span *ngIf="nzOperations[1]">{{ nzOperations[1] }}</span> </button> <button nz-button (click)="moveToRight()" [disabled]="nzDisabled || !rightActive" [nzType]="'primary'" [nzSize]="'small'"> <i nz-icon nzType="right"></i> <span *ngIf="nzOperations[0]">{{ nzOperations[0] }}</span> </button> </div> <div *ngIf="dir === 'rtl'" class="ant-transfer-operation"> <button nz-button (click)="moveToRight()" [disabled]="nzDisabled || !rightActive" [nzType]="'primary'" [nzSize]="'small'"> <i nz-icon nzType="left"></i> <span *ngIf="nzOperations[0]">{{ nzOperations[0] }}</span> </button> <button nz-button (click)="moveToLeft()" [disabled]="nzDisabled || !leftActive" [nzType]="'primary'" [nzSize]="'small'"> <i nz-icon nzType="right"></i> <span *ngIf="nzOperations[1]">{{ nzOperations[1] }}</span> </button> </div> <nz-transfer-list class="ant-transfer-list" [ngStyle]="nzListStyle" data-direction="right" direction="right" [titleText]="nzTitles[1]" [showSelectAll]="nzShowSelectAll" [dataSource]="rightDataSource" [filter]="rightFilter" [filterOption]="nzFilterOption" (filterChange)="handleFilterChange($event)" [renderList]="nzRenderList && nzRenderList[1]" [render]="nzRender" [disabled]="nzDisabled" [showSearch]="nzShowSearch" [searchPlaceholder]="nzSearchPlaceholder || locale?.searchPlaceholder" [notFoundContent]="nzNotFoundContent" [itemUnit]="nzItemUnit || locale?.itemUnit" [itemsUnit]="nzItemsUnit || locale?.itemsUnit" [footer]="nzFooter" (handleSelect)="handleRightSelect($event)" (handleSelectAll)="handleRightSelectAll($event)" ></nz-transfer-list> `, host: { '[class.ant-transfer-rtl]': `dir === 'rtl'`, '[class.ant-transfer-disabled]': `nzDisabled`, '[class.ant-transfer-customize-list]': `nzRenderList` }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush },] } ]; NzTransferComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: NzI18nService }, { type: ElementRef }, { type: Directionality, decorators: [{ type: Optional }] } ]; NzTransferComponent.propDecorators = { lists: [{ type: ViewChildren, args: [NzTransferListComponent,] }], nzDisabled: [{ type: Input }], nzDataSource: [{ type: Input }], nzTitles: [{ type: Input }], nzOperations: [{ type: Input }], nzListStyle: [{ type: Input }], nzShowSelectAll: [{ type: Input }], nzItemUnit: [{ type: Input }], nzItemsUnit: [{ type: Input }], nzCanMove: [{ type: Input }], nzRenderList: [{ type: Input }], nzRender: [{ type: Input }], nzFooter: [{ type: Input }], nzShowSearch: [{ type: Input }], nzFilterOption: [{ type: Input }], nzSearchPlaceholder: [{ type: Input }], nzNotFoundContent: [{ type: Input }], nzTargetKeys: [{ type: Input }], nzSelectedKeys: [{ type: Input }], nzChange: [{ type: Output }], nzSearchChange: [{ type: Output }], nzSelectChange: [{ type: Output }] }; __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTransferComponent.prototype, "nzDisabled", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTransferComponent.prototype, "nzShowSelectAll", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzTransferComponent.prototype, "nzShowSearch", void 0); /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ class NzTransferModule { } NzTransferModule.decorators = [ { type: NgModule, args: [{ imports: [ BidiModule, CommonModule, FormsModule, NzCheckboxModule, NzButtonModule, NzInputModule, NzI18nModule, NzIconModule, NzEmptyModule ], declarations: [NzTransferComponent, NzTransferListComponent, NzTransferSearchComponent], exports: [NzTransferComponent] },] } ]; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ /** * Generated bundle index. Do not edit. */ export { NzTransferComponent, NzTransferListComponent, NzTransferModule, NzTransferSearchComponent }; //# sourceMappingURL=ng-zorro-antd-transfer.js.map