import { Observable, of, BehaviorSubject } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { FavoriteAction } from '../lookup-displaytype'; import { LookupGridComponent } from '../lookup-grid.component'; export interface SelectionState { selecteditems: any[]; favoriteItems: any[]; quickItems: any[]; } export class LookupSelectionService { private state: SelectionState = { selecteditems: [], favoriteItems: [], quickItems: [] }; state$: BehaviorSubject = new BehaviorSubject(this.state); selected$: Observable = this.state$.pipe( switchMap(n => of(n.selecteditems)) ); favoriteItems$: BehaviorSubject = new BehaviorSubject({items: this.state.favoriteItems, action: null }); quickItems$: Observable = this.state$.pipe( switchMap(n => of(n.quickItems)) ); private get idField() { return this.ins.idField; } constructor(private ins: LookupGridComponent) { } initFavoriteItems(items: any[]) { this.state.favoriteItems = items || []; } //#region 收藏数据 updateFavoriteData(data: any, action: FavoriteAction) { if (this.ins.savingFaoriteData) { // console.log('%c太调皮了吧!', 'color: white'); return; } if (action === FavoriteAction.add) { this.state.favoriteItems = this.state.favoriteItems.concat([data]); } else { this.state.favoriteItems = this.state.favoriteItems.filter(n => n[this.idField] !== data[this.idField]); } this.favoriteItems$.next({ items: this.state.favoriteItems, action }); } //#endregion //#region 多选数据 loadSelections( data: []) { this.state.selecteditems = [...data]; this.state$.next(this.state); } getSelections() { return [...this.state.selecteditems]; } select(item: any) { if (item) { this.state.selecteditems = [...this.state.selecteditems, item]; this.state$.next(this.state); } } unselectByPathcode(pathcode: string) { const { dataField, pathField } = this.ins.treeInfo; this.state.selecteditems = this.state.selecteditems.filter(n => { return n[dataField][pathField] && n[dataField][pathField].indexOf(pathcode) !== 0; }); } updateSelections(data: any, checked = true) { if (!Array.isArray(data)) { data = [data]; } const items = [ ...data ]; const idField = this.idField; if (checked) { if (this.state.selecteditems && !this.state.selecteditems.length) { this.state.selecteditems = items; } else { const ids = items.map(n => n[idField]); ids.forEach((n, i) => { if (!this.state.selecteditems.find(r => r[idField] == n)) { this.state.selecteditems.push(items[i]); } }); } } else { if (data) { const ids2 = data.map(n => n[idField]); this.state.selecteditems = this.state.selecteditems.filter(n => { return ids2.indexOf(n[idField]) === -1; }); } } this.state$.next(this.state); } unSelect(id: any) { if (id) { if (Array.isArray(id)) { this.state.selecteditems = this.state.selecteditems.filter(n => { return id.indexOf(n[this.idField]) === -1; }); } else { this.state.selecteditems = this.state.selecteditems.filter(n => n[this.idField] != id); } this.state$.next(this.state); } } clearSelections() { this.state.selecteditems = []; this.state$.next(this.state); } //#endregion }