// Angular // import { Component, OnInit, OnDestroy, Inject, Input } from '@angular/core'; // import { Location } from '@angular/common'; import { downgradeComponent } from '@angular/upgrade/static'; declare const angular: angular.IAngularStatic; // Services // import { TranslateService } from '@ngx-translate/core'; import { FbBroadcastService } from '@fb/broadcast'; // Other // import { Subscription } from 'rxjs/Subscription'; import * as _ from 'underscore'; import * as statics from '@fb/statics'; const styles: any[] = [require('./moejlighet-lista.component.less')]; /** * En routad komponent som visar möjlighetlistan. Beroende på list namnet som skickas in ([listName]{@link MoejlighetListaComponent#listName}) visas den valda listan. * * Just nu stödjs * fb.FasITDomain.MoejlighetListTypString.KAN * fb.FasITDomain.MoejlighetListTypString.BORDE * fb.FasITDomain.MoejlighetListTypString.MAASTE * * @example * * */ @Component({ selector: 'fb-moejlighet-lista', templateUrl: './moejlighet-lista.component.html', styles: styles }) export class MoejlighetListaComponent implements OnInit, OnDestroy { /** * Namnet på möjlighetslistan som ska visas. Gammalt namn - lista. */ @Input() listName: string; markerade: fb.Moejlighet_MoejlighetLO[] = []; invalidTextList: string[] = []; inloggadAnvaendare: fb.InloggadAnvaendare; moejlighetResult: fb.MoejlighetSoekWO = new fb.MoejlighetSoekWO({}); kontorArray: fb.List; moejlighetstypArray: any[]; aktivitetStatusDomain: any = fb.FasITDomain.AktivitetStatus; visaTypDomain: any = fb.FasITDomain.MoejlighetVisaTyp; listTypDomain: any = fb.FasITDomain.MoejlighetListTyp; searchParameters: fb.MoejlighetSO; visaTypArray: any[] = [ { value: fb.FasITDomain.MoejlighetVisaTyp.AKTUELLA, text: this.translate.instant('MOEJLIGHET.AKTUELLA') }, { value: fb.FasITDomain.MoejlighetVisaTyp.GAMLA, text: this.translate.instant('MOEJLIGHET.GAMLA') } ]; listTypArray: any[] = [ fb.FasITDomain.MoejlighetListTyp.MAASTE, fb.FasITDomain.MoejlighetListTyp.BORDE, fb.FasITDomain.MoejlighetListTyp.KAN ]; failSaveText: boolean = false; isSearching: boolean = false; varningAllaMarkerade: boolean; startupPromiseList: Promise; pageAlternatives: any; medarbetareArray: fb.List; medarbetareArrayFiltered: fb.Medarbetare[]; private latestSelect: any; private searchResult: fb.MoejlighetSoekWO; private subscriptionList: Subscription[] = []; constructor( private readonly translate: TranslateService, private readonly broadcaster: FbBroadcastService, @Inject('CommonService') private readonly commonService: fb.ICommonService, @Inject('InloggadAnvaendareService') private readonly inloggadAnvaendareService: fb.IInloggadAnvaendareService, @Inject('MoejlighetService') private readonly moejlighetService: fb.IMoejlighetService, @Inject('MoejlighetListaService') private readonly moejlighetListaService: fb.IMoejlighetListaService, @Inject('DomainService') private readonly domainService: fb.IDomainService, @Inject('MedarbetareService') private readonly medarbetareService: fb.IMedarbetareService, @Inject('NavigationService') private readonly navigationService: fb.INavigationService, @Inject('KontorService') private readonly kontorService: fb.IKontorService, @Inject('SideDrawerService') private readonly sideDrawerService: fb.ISideDrawerService, @Inject('StateService') private readonly stateService: fb.IStateService, @Inject('UiService') private readonly uiService: fb.IUIService ) { } ngOnInit(): void { this.setupSubscribers(); this.uiService.view(fb.FasITDomain.VyerNamn.Moejligheter); this.moejlighetResult.Results = []; this.queryInitData(); this.setupPageAlternatives(); this.setupState(); this.setupMoejlighetArray(); this.search(); } ngOnDestroy(): void { statics.destroySubscribers(this.subscriptionList); } private setupSubscribers(): void { const sub: Subscription = this.broadcaster.on(fb.FasITDomain.GlobalEvents.LADDA_OM_MOEJLIGHETSLISTA) .subscribe(() => { this.search(); }); this.subscriptionList.push(sub); } private queryInitData(): void { this.inloggadAnvaendare = this.inloggadAnvaendareService.getInloggadAnvaendare(); this.getSerachParameters(); this.medarbetareArray = this.medarbetareService.query(false); this.kontorArray = this.kontorService.kontorIKontorsamarbete(); this.onVisaTypChange(); this.startupPromiseList = Promise.all([ this.kontorArray.$promise, this.medarbetareArray.$promise, this.inloggadAnvaendare.promise ]); this.startupPromiseList.then(() => this.filterMedarbetareArray()) .catch(() => { console.error('Failed to get promises'); }); } private getSerachParameters(): void { this.searchParameters = this.moejlighetListaService.getLista(fb.FasITDomain.MoejlighetListTypStringToInt(this.listName)); if (statics.isUndefined(this.searchParameters)) { console.error( 'Searchparameters can not be undefined, but returned without value from moejlighetListaService.getLista'); } } private setupMoejlighetArray(): void { let moejlighetstypArray: any[] = this.domainService.toDomainArray(fb.FasITDomain.Moejlighetstyper, 'Moejlighetstyper'.toUpperCase()); if (this.inloggadAnvaendare.BostadsmarknadId === fb.FasITDomain.Bostadsmarknad.UTLAND) { // Använd en begränsad lista med möjligheter för utland moejlighetstypArray = this.domainService.toDomainArray(fb.FasITDomain.MoejlighetstyperUtland, 'Moejlighetstyper'.toUpperCase()); } this.moejlighetstypArray = _.filter(moejlighetstypArray, (moejlighetstyp: { Id: any; Namn: string }): boolean => { return (this.searchParameters.ListTyp === fb.FasITDomain.MoejlighetListTyp.MAASTE && fb.FasITDomain.MoejlighetstyperPerListTyp.MAASTE.indexOf(moejlighetstyp.Id) >= 0 || this.searchParameters.ListTyp === fb.FasITDomain.MoejlighetListTyp.BORDE && fb.FasITDomain.MoejlighetstyperPerListTyp.BORDE.indexOf(moejlighetstyp.Id) >= 0 || this.searchParameters.ListTyp === fb.FasITDomain.MoejlighetListTyp.KAN && fb.FasITDomain.MoejlighetstyperPerListTyp.KAN.indexOf(moejlighetstyp.Id) >= 0); }); } private setupState(): any { const obj: any = this.stateService.loadState('MoejlighetListaCtrl', this.listName); if (obj) { if (obj.drawer) { this.sideDrawerService.setSideDrawer(obj.drawer.drawerName, obj.drawer.params, obj.drawer.width); } if (obj.markerade) { this.markerade = obj.markerade; } } this.stateService.addState('MoejlighetListaCtrl', this.listName, () => { const drawer: { drawerName: string; params: any; width: number } = this.sideDrawerService.getStateObject(); this.sideDrawerService.clearDrawer(); return { drawer: drawer, markerade: this.markerade }; }); } search(triggeredBySearchButton: boolean = false, clearMarkerade: boolean = false): void { this.isSearching = true; if (clearMarkerade || triggeredBySearchButton) { this.markerade = []; } // Hantera fallet när inloggad användare inte redan har lagts till if (this.searchParameters.searchWithInloggadAnvaendare) { this.inloggadAnvaendare.promise.then(() => { if (this.searchParametersPersonHasInloggadAnvaendare()) { this.searchParameters.Personer.push(this.inloggadAnvaendare.PersonId); } this.searchParameters.searchWithInloggadAnvaendare = false; this.searchMoejlighet().$promise.then(() => { if (triggeredBySearchButton) { // Todo flytta till searchMoejlighet promise.then this.pageAlternatives.setPage(0); } }); }); } else { this.searchMoejlighet().$promise.then(() => { if (triggeredBySearchButton) { // Todo flytta till searchMoejlighet promise.then this.pageAlternatives.setPage(0); } }); } } private searchMoejlighet(): fb.MoejlighetSoekWO { this.searchResult = this.moejlighetService.soek(this.searchParameters); this.searchResult.$promise.then(() => { this.moejlighetResult = this.searchResult; this.isSearching = false; this.varningAllaMarkerade = false; }, () => { this.isSearching = false; }); return this.searchResult; } private setupPageAlternatives(): void { this.pageAlternatives = { // Todo move to class selectableItemsPerPage: [10, 20, 50, 100, 200], setItemsPerPage: (items: number) => { this.searchParameters.Take = items; this.searchParameters.Skip = 0; this.search(); }, setPage: (page) => { const newSkip: number = page * this.searchParameters.Take; if (this.searchParameters.Skip !== newSkip) { this.searchParameters.Skip = newSkip; this.search(); } }, gotoFirstPage: () => { this.pageAlternatives.setPage(0); }, prevPage: () => { if (this.searchParameters.Skip > 0) { this.searchParameters.Skip = this.searchParameters.Skip - this.searchParameters.Take; this.search(); } }, nextPage: () => { if (this.searchParameters.Skip + this.searchParameters.Take < this.moejlighetResult.TotalNumberOfResults.value) { this.searchParameters.Skip = this.searchParameters.Skip + this.searchParameters.Take; this.search(); } }, gotoLastPage: () => { this.pageAlternatives.setPage( Math.ceil(this.moejlighetResult.TotalNumberOfResults.value / this.searchParameters.Take) - 1); }, currentPage: () => { return this.searchParameters.Skip / this.searchParameters.Take; }, lastPage: () => { return Math.ceil(!this.moejlighetResult.TotalNumberOfResults ? 0 : this.moejlighetResult.TotalNumberOfResults.value / this.searchParameters.Take) - 1; }, getPageRange: () => { const currentPage: number = this.pageAlternatives.currentPage(); const totalNumberOfPages: number = this.pageAlternatives.lastPage() + 1; return this.commonService.getPageRange(totalNumberOfPages, currentPage, 3); }, }; } private filterMedarbetareArray(): void { this.medarbetareArrayFiltered = this.commonService.filterMedarbetareList(this.medarbetareArray, []); this.medarbetareArray = new fb.List(this.medarbetareArrayFiltered); } dismissInvalidText(): void { this.invalidTextList.length = 0; } tillbaka(): void { this.navigationService.goto(new fb.NavigationsObjekt({ ObjektTypId: fb.NavigationsObjektTypId.SAELJ, NavigeraTill: 'Saljdriv/' }), true); } setListTyp(listTyp): void { const urlSplit: string[] = location.hash.split('/'); const url: string = urlSplit[1] + '/' + urlSplit[2] + '/' + fb.FasITDomain.MoejlighetListTypIntToString(listTyp); this.navigationService.goto(new fb.NavigationsObjekt({ ObjektTypId: fb.NavigationsObjektTypId.SAELJ, NavigeraTill: url })); } markera(item: fb.Moejlighet_MoejlighetLO, $event: JQueryEventObject): void { if (this.latestSelect && $event.shiftKey) { this.markerade = []; const list: fb.Moejlighet_MoejlighetLO[] = this.moejlighetResult.Results; const index1: number = list.indexOf(item); const index2: number = list.indexOf(this.latestSelect); const minIndex: number = index1 < index2 ? index1 : index2; const maxIndex: number = index1 > index2 ? index1 : index2; for (let k: number = minIndex; k <= maxIndex; k++) { this.markerade.push(list[k]); } this.latestSelect = item; } else { // Vi håller en sida i taget under moejlighetResult och det är inte säkert att samma instans // finns i markerade. Därför används AktivitetId för sökning i listan. if (this.markerade.some(m => m.AktivitetId.value === item.AktivitetId.value)) { this.markerade = this.markerade.filter(m => m.AktivitetId.value !== item.AktivitetId.value); } else { this.markerade.push(item); this.latestSelect = item; } } } markeraAlla(): void { if (this.moejlighetResult.Results.length !== this.markerade.length) { this.markerade = []; _.each(this.moejlighetResult.Results, (item) => { this.markerade.push(item); }); if (this.markerade.length > 0) { this.varningAllaMarkerade = true; } } else { this.markerade = []; this.varningAllaMarkerade = false; } } isMarkerad(item: any): any { return this.markerade.some(m => m.AktivitetId.value === item.AktivitetId.value); } openSideDrawer(aktivitetId: number): void { const moejlighetArray: number[] = _.map(this.moejlighetResult.Results, (item: fb.Moejlighet_MoejlighetLO) => item.AktivitetId.value); this.sideDrawerService.setSideDrawer( 'Moejlighet', { aktivitetId: aktivitetId, openedFromMoejlighetLista: true, moejlighetArray: moejlighetArray, onCloseDrawer: () => { this.search(); this.moejlighetService.getAntalMoejligheter(); }, currentPage: this.pageAlternatives.currentPage, lastPage: this.pageAlternatives.lastPage, getNextOrPrevPage: (callback: any, getNext: boolean = true) => { if (getNext) { this.pageAlternatives.nextPage(); } else { this.pageAlternatives.prevPage(); } this.searchResult.$promise.then(() => { callback(_.map(this.moejlighetResult.Results, (item: fb.Moejlighet_MoejlighetLO) => item.AktivitetId.value)); }); } }); } onVisaTypChange(): void { // Gamla ska sorteras på AktivitetSlut if (this.searchParameters.VisaTyp.value === fb.FasITDomain.MoejlighetVisaTyp.GAMLA) { this.searchParameters.Sortering.value = fb.FasITDomain.MoejlighetSortering.AktivitetSlut; } else if (this.searchParameters.VisaTyp.value === fb.FasITDomain.MoejlighetVisaTyp.AKTUELLA) { this.searchParameters.Sortering.value = this.searchParameters.ListTyp === fb.FasITDomain.MoejlighetListTyp.KAN ? fb.FasITDomain.MoejlighetSortering.AktivitetStart : fb.FasITDomain.MoejlighetSortering.SkallUtfoerasSenast; } } onOpenMenusAlternativChange(newVal): void { if (newVal === false) { this.searchParameters.Skip = 0; this.search(false, true); } } searchParametersPersonHasInloggadAnvaendare(): boolean { return this.searchParameters.Personer .indexOf(this.inloggadAnvaendare.PersonId) === -1; } } // Angular downgrade //// angular.module('fasit').directive('fbMoejlighetLista', downgradeComponent({ component: MoejlighetListaComponent, inputs: [], outputs: [] }) as angular.IDirectiveFactory);