@@ -4,9 +4,19 @@ import { Subject } from 'rxjs';
44import { concatMap , debounceTime , map , takeUntil , tap } from 'rxjs/operators' ;
55import { NGQP_ROUTER_ADAPTER , NGQP_ROUTER_OPTIONS , RouterAdapter , RouterAdapterOptions } from './router-adapter/router-adapter.interface' ;
66import { QueryParamNameDirective } from './query-param-name.directive' ;
7- import { QueryParamControl , QueryParamGroup , QueryParamGroupValue } from './model' ;
7+ import { QueryParamControl , QueryParamGroup , QueryParamGroupValue , Unpack } from './model' ;
88import { isMissing } from './util' ;
99
10+ /** TODO Documentation */
11+ function isMultiControl < T > ( control : QueryParamControl < T | T [ ] > ) : control is QueryParamControl < T [ ] > {
12+ return control . multi ;
13+ }
14+
15+ /** TODO Documentation */
16+ function hasArrayModel < T > ( control : QueryParamControl < T | T [ ] > , model : T | T [ ] ) : model is T [ ] {
17+ return isMultiControl ( control ) ;
18+ }
19+
1020/**
1121 * TODO Documentation
1222 */
@@ -62,9 +72,7 @@ export class QueryParamGroupDirective implements OnInit, OnDestroy {
6272 this . routerAdapter . queryParamMap . subscribe ( queryParamMap => {
6373 Object . keys ( this . queryParamGroup . controls ) . forEach ( controlName => {
6474 const control : QueryParamControl < any > = this . queryParamGroup . get ( controlName ) ;
65- const newModel = control . multi
66- ? queryParamMap . getAll ( control . name ) . map ( control . deserialize )
67- : control . deserialize ( queryParamMap . get ( control . name ) ) ;
75+ const newModel = this . deserialize ( control , queryParamMap . getAll ( control . name ) ) ;
6876
6977 // Get the directive, if it has been initialized yet.
7078 const directive = this . directives . find ( dir => dir . name === controlName ) ;
@@ -131,10 +139,8 @@ export class QueryParamGroupDirective implements OnInit, OnDestroy {
131139 this . queue$ . next ( params ) ;
132140 }
133141
134- private getParamsForModel ( control : QueryParamControl < any > , model : any ) : Params {
135- const newValue = control . multi
136- ? ( model || < any [ ] > [ ] ) . map ( control . serialize )
137- : control . serialize ( model ) ;
142+ private getParamsForModel < T = any > ( control : QueryParamControl < T | T [ ] > , model : T ) : Params {
143+ const newValue = this . serialize ( control , model ) ;
138144
139145 const combinedParams : Params = isMissing ( control . combineWith )
140146 ? { } : control . combineWith ( control . value , model ) ;
@@ -145,6 +151,17 @@ export class QueryParamGroupDirective implements OnInit, OnDestroy {
145151 } ;
146152 }
147153
154+ private serialize < T = any > ( control : QueryParamControl < T | T [ ] > , model : T ) : string [ ] {
155+ return hasArrayModel ( control , model )
156+ ? ( model || < T [ ] > [ ] ) . map ( control . serialize )
157+ : [ control . serialize ( model ) ] ;
158+ }
159+
160+ private deserialize < T = any > ( control : QueryParamControl < T > , values : string [ ] ) : Unpack < T > | Unpack < T > [ ] {
161+ const deserialized : Unpack < T > [ ] = values . map ( control . deserialize ) ;
162+ return isMultiControl ( control ) ? deserialized : deserialized [ 0 ] ;
163+ }
164+
148165 private get routerOptions ( ) : RouterAdapterOptions {
149166 const groupOptions = this . queryParamGroup ? this . queryParamGroup . routerOptions : { } ;
150167
0 commit comments