// 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);