searchbar design, lukke resultat, hoyde med scroll og tomme inputen + plassering
[u/erikhf/frm.git] / src / components / search / livesearch.ts
1 import {CORE_DIRECTIVES, Directive, View, EventEmitter, ElementRef} from 'angular2/angular2';
2 import {Http} from 'angular2/http';
3
4 // RxJs
5 import * as Rx from '@reactivex/rxjs/dist/cjs/Rx';
6
7 import {SearchService} from "./SearchService";
8
9 declare var zone: Zone;
10
11 @Directive({
12     selector: 'input[type=text][mou-live-search]',
13     outputs: ['results', 'loading'],
14     providers: [CORE_DIRECTIVES, SearchService]
15 })
16 export class LiveSearch {
17     results:EventEmitter = new EventEmitter();
18     loading:EventEmitter = new EventEmitter();
19     
20
21     constructor(private el:ElementRef, public http:Http, public search:SearchService) {
22
23     }
24
25     onInit() {
26         console.log("starting");
27         (<any>Rx).Observable.fromEvent(this.el.nativeElement, 'keyup')
28             .map(e => e.target.value)
29             .filter(text => text.length > 2)
30             .debounceTime(250)
31             .distinctUntilChanged()
32             .do(zone.bind(() => this.loading.next(true)))
33             .flatMap(query => this.search.search(query))
34             .do(zone.bind(() => this.loading.next(false)))
35             .subscribe(
36                 zone.bind(orgunits => {
37                     //this.filterUnits(orgunits)
38                     this.results.next(orgunits/*this.filterUnits(orgunits)*/);
39                 }),
40                 zone.bind(err => {
41                     console.log(err);
42                     this.results.next(['ERROR, see console']);
43                 }),
44                 () => {
45                     console.log("complete");
46                 }
47             )
48     }
49
50     filterUnits(orgunits) {
51         var filteredOrgunits: Array<any> = [];
52         for (var i = 0; i < orgunits.length; i++) {
53             this.http.get(orgunits[i].href)
54                 .map(res => res.json())
55                 .subscribe(
56                     zone.bind(orgunits => {
57                         if (ownershipSelector.value == "" && typeSelector.value == "" && locationSelector.value == "") {
58                             filteredOrgunits.push(orgunits);
59                         }
60                         else {
61                             var os = false;
62                             var ls = false;
63                             var ts = false;
64                             for (var group in orgunits.organisationUnitGroups) {
65                                 if (ownershipSelector.value != "") {
66                                     if (orgunits.organisationUnitGroups[group].name == ownershipSelector.value) {
67                                         os = true;
68                                     }
69                                 }
70                                 if (ownershipSelector.value == "") {
71                                     os = true;
72                                 }
73                                 if (typeSelector.value != "") {
74                                     if (orgunits.organisationUnitGroups[group].name == typeSelector.value) {
75                                         ts = true;
76                                     }
77                                 }
78                                 if (typeSelector.value == "") {
79                                     ts = true;
80                                 }
81                                 if (locationSelector.value != "") {
82                                     if (orgunits.organisationUnitGroups[group].name == locationSelector.value) {
83                                         ls = true;
84                                     }
85                                 }
86                                 if (locationSelector.value == "") {
87                                     ls = true;
88                                 }
89                                 if (os == true && ts == true && ls == true) {
90                                     filteredOrgunits.push(orgunits);
91                                     os = false;
92                                     ts = false;
93                                     ls = false;
94                                 }
95                             }
96                         }
97                     })
98                 )
99         }
100         return filteredOrgunits;
101     }
102 }
103