// Angular imports // import {ElementRef, ViewChild, Component, Inject, Input, Output, EventEmitter, SimpleChanges, OnInit, OnChanges, SimpleChange} from '@angular/core'; import { downgradeComponent } from '@angular/upgrade/static'; declare const angular: angular.IAngularStatic; // Lib imports // import * as _ from 'underscore'; // Components // // Interfaces // // Services // import { TranslateService } from '@ngx-translate/core'; // Directives // // Todo importera styles enligt wiki /vile @Component({ selector: 'fb-anteckning', templateUrl: './anteckning.component.html' }) export class AnteckningComponent implements OnInit, OnChanges { // Inputs @Input() key: string; @Input() keyId: string; @Input() maxAnteckningarLimit: number; @Input() reloadAnteckningar: boolean; @Input() placeholder: string; // Outputs @Output() onAction: EventEmitter = new EventEmitter(); newText: fb.ChangeTrack = new fb.ChangeTrack(''); anteckningForViewList: fb.Anteckning[] = []; showingAll: boolean = false; moreThanThreeAnteckningar: boolean; // locals @ViewChild('newNote') newNoteElm: ElementRef; private anteckningList: fb.List = new fb.List([]); private medarbetare: fb.List = this.medarbetareService.query(true); private saveAnteckning: ((anteckning: fb.Anteckning) => void) = _.debounce((anteckning: fb.Anteckning): void => { if (!anteckning.KoppladTillId.value && this.keyId) { anteckning.KoppladTillId.setValue(this.keyId); } this.anteckningService.save(anteckning); this.onAction.emit({ action: 'updated', anteckning: anteckning }); }, 100); constructor( @Inject('AnteckningService') private anteckningService: fb.IAnteckningService, @Inject('MedarbetareService') private medarbetareService: fb.IMedarbetareService, @Inject('LogService') private logService: fb.ILogService, private readonly translate: TranslateService ) { } ngOnInit(): void { if (this.key === undefined || this.key === null) { this.logService.log('Missing required parameter key for anteckning'); return; } if (this.keyId === undefined || this.keyId === null) { this.logService.log('Missing required parameter keyId for anteckning'); return; } if (this.maxAnteckningarLimit === undefined || this.maxAnteckningarLimit === null) { this.maxAnteckningarLimit = 3; } if (this.placeholder === undefined || this.placeholder === null) { this.placeholder = this.translate.instant('ANTECKNING.NY_ANTECKNING'); } this.queryAnteckningar(); } ngOnChanges(changes: SimpleChanges): void { const keyIdChange: SimpleChange = changes.keyId; if (keyIdChange && keyIdChange.previousValue !== keyIdChange.currentValue && !isNaN(Number(this.keyId))) { this.queryAnteckningar(); } const reloadAnteckningarChange: SimpleChange = changes.reloadAnteckningar; if (reloadAnteckningarChange && reloadAnteckningarChange.currentValue && reloadAnteckningarChange.previousValue !== reloadAnteckningarChange.currentValue) { this.queryAnteckningar(); this.reloadAnteckningar = false; } } showAllAnteckningar(): void { this.showingAll = true; this.maxAnteckningarLimit = this.anteckningForViewList.length; } createAnteckning(): void { if (this.newText.value && this.newText.value !== '') { const newAnteckning: fb.Anteckning = new fb.Anteckning({ Typ: this.key, KoppladTillId: this.keyId, Anteckning: this.newText.value }); this.anteckningService.add(newAnteckning).$promise.then(data => this.afterCreateAnteckning(data)); this.newText = new fb.ChangeTrack(''); } } createAnteckningFromButton(note: string): void { const newAnteckning: fb.Anteckning = new fb.Anteckning({ Typ: this.key, KoppladTillId: this.keyId, Anteckning: new fb.ChangeTrack(this.translate.instant(note)) }); this.anteckningService.add(newAnteckning).$promise.then(data => this.afterCreateAnteckning(data)); } updateNewTextModel(event: string): void { this.newText.setValue(event); } updateAnteckningModel(event: string, anteckning: fb.Anteckning): void { anteckning.Anteckning.setValue(event); } blurExistingAnteckning(anteckning: fb.Anteckning): void { if (anteckning.Anteckning.dirty) { this.saveAnteckning(anteckning); } } keyDown(e: KeyboardEvent): boolean { if (e.which === 9 || e.keyCode === 9) { this.createAnteckning(); setTimeout(() => { this.newNoteElm.nativeElement.focus(); }, 100); } return true; } deleteAnteckning(anteckning: fb.Anteckning): void { this.anteckningService.remove(anteckning); for (let i: number = 0; i < this.anteckningList.length; i++) { if (this.anteckningList[i] === anteckning) { this.anteckningList.splice(i, 1); this.onAction.emit({ action: 'removed', anteckning: anteckning }); } } this.sortAnteckningar(); } getMedarbetarNamn(personId: number): string { const personArr: fb.Medarbetare[] = _.filter(this.medarbetare, (item: fb.Medarbetare) => item.PersonId.value === personId); if (personArr.length > 0) { let ret: string = personArr[0].Personnamn.value; const aktivPersonLength: number = _.filter(personArr, (item: fb.Medarbetare) => !item.HarSlutat.value).length; if (aktivPersonLength === 0) { ret += ' (slutat)'; } return ret + ','; } else { return this.translate.instant('ANTECKNING.OKAEND_PERSON'); } } private queryAnteckningar(): void { this.anteckningList = this.anteckningService.query(this.key, this.keyId); this.anteckningList.$promise.then(() => this.sortAnteckningar()); } private sortAnteckningar(): void { this.anteckningForViewList = _.sortBy(this.anteckningList, (anteckning: fb.Anteckning) => { let date: string; if (anteckning.SenastAendrad && anteckning.SenastAendrad.value) { date = anteckning.SenastAendrad.value; } return date; }).reverse(); this.moreThanThreeAnteckningar = this.anteckningForViewList.length > 3; if (this.showingAll) { this.showAllAnteckningar(); } } private afterCreateAnteckning(createdAnteckning: fb.Anteckning): void { const addedAnteckning: fb.Anteckning = new fb.Anteckning(createdAnteckning); this.anteckningList.push(addedAnteckning); this.sortAnteckningar(); this.onAction.emit({ action: 'added', anteckning: addedAnteckning }); } getBildURL(personId: number): string { return fb.Environment.mediaURL + '/Person/' + personId + '.jpg?bredd=40'; } } // Angular downgrade //// angular.module('fasit') .directive('fbAnteckning', downgradeComponent({ component: AnteckningComponent, inputs: ['key', 'keyId', 'maxAnteckningarLimit', 'reloadAnteckningar'], outputs: ['onAction'] }) as angular.IDirectiveFactory);