2
2
3
3
class ArrayRenderer implements JSONForms . IRenderer {
4
4
5
+ private maxSize = 99 ;
6
+ priority = 2 ;
7
+
5
8
constructor ( private pathResolver : JSONForms . IPathResolver , private scope : ng . IScope ) {
6
9
7
10
}
8
11
9
- private defaultGridOptions ( services : JSONForms . Services , schema : SchemaElement ) : uiGrid . IGridOptions {
12
+ private static isExternalFilterAvailable ( dataProvider : JSONForms . IDataProvider ,
13
+ options : uiGrid . IGridOptions ) : boolean {
14
+ return dataProvider . filter !== undefined &&
15
+ options . hasOwnProperty ( 'useExternalFiltering' ) ;
16
+ }
17
+
18
+ private static isExternalPagingAvailable ( dataProvider : JSONForms . IDataProvider ,
19
+ options : uiGrid . IGridOptions ) {
20
+ return dataProvider . fetchPage !== undefined &&
21
+ options . hasOwnProperty ( 'useExternalPagination' ) ;
22
+ }
23
+
24
+ private defaultGridOptions ( existingOptions : uiGrid . IGridOptions ,
25
+ services : JSONForms . Services , schema : SchemaElement ) : uiGrid . IGridOptions {
10
26
11
- var paginationEnabled = false ;
12
- var defaultGridOptions :uiGrid . IGridOptions = { } ;
13
- defaultGridOptions . enableColumnResizing = true ;
14
- defaultGridOptions . enableHorizontalScrollbar = 0 ;
15
- defaultGridOptions . enableVerticalScrollbar = 0 ;
16
27
var dataProvider = services . get < JSONForms . IDataProvider > ( JSONForms . ServiceId . DataProvider ) ;
17
28
var validationService = services . get < JSONForms . IValidationService > ( JSONForms . ServiceId . Validation ) ;
18
29
19
- if ( dataProvider instanceof JSONForms . DefaultInternalDataProvider ) {
20
- defaultGridOptions . totalItems = dataProvider . getTotalItems ( ) ;
21
- } else {
30
+ let externalPaginationEnabled = ArrayRenderer . isExternalPagingAvailable ( dataProvider , existingOptions ) ;
31
+ let externalFilteringEnabled = ArrayRenderer . isExternalFilterAvailable ( dataProvider , existingOptions ) ;
22
32
23
- paginationEnabled = dataProvider . fetchPage !== undefined ;
24
-
25
- if ( paginationEnabled ) {
26
- // disable internal and enable external pagination
27
- defaultGridOptions . enablePagination = false ;
28
- defaultGridOptions . useExternalPagination = true ;
29
- defaultGridOptions . paginationPageSizes = [ 5 , 10 , 20 ] ;
30
- defaultGridOptions . paginationPageSize = 5 ;
31
- defaultGridOptions . paginationCurrentPage = 1 ;
32
- defaultGridOptions . enablePaginationControls = true ;
33
- }
33
+ var defaultGridOptions :uiGrid . IGridOptions = { } ;
34
+ defaultGridOptions . totalItems = dataProvider . getTotalItems ( ) ;
35
+ defaultGridOptions . enableColumnResizing = true ;
36
+ defaultGridOptions . enableHorizontalScrollbar = 0 ;
37
+ defaultGridOptions . enableVerticalScrollbar = 0 ;
38
+ defaultGridOptions . paginationPageSizes = [ 5 , 10 , 20 ] ;
39
+ defaultGridOptions . paginationPageSize = 5 ;
40
+ defaultGridOptions . paginationCurrentPage = 1 ;
41
+ defaultGridOptions . enablePaginationControls = true ;
34
42
35
- // TODO: implement filtering and pass grid options accordingly
36
- //if (filteringEnabled) {
37
- // defaultGridOptions.enableFiltering = false;
38
- // defaultGridOptions.useExternalPagination = true;
39
- //}
43
+ if ( externalPaginationEnabled ) {
44
+ defaultGridOptions . useExternalPagination = true ;
40
45
}
41
46
42
47
defaultGridOptions . onRegisterApi = ( gridApi ) => {
43
- if ( paginationEnabled ) {
48
+ if ( externalPaginationEnabled ) {
44
49
gridApi . pagination . on . paginationChanged ( this . scope , ( newPage , pageSize ) => {
45
50
defaultGridOptions . paginationCurrentPage = newPage ;
46
51
defaultGridOptions . paginationPageSize = pageSize ;
47
52
dataProvider . setPageSize ( pageSize ) ;
48
- dataProvider . fetchPage ( newPage , pageSize ) . then ( newData => {
49
- defaultGridOptions . data = newData ;
53
+ dataProvider . fetchPage ( newPage ) . then ( newData => {
54
+ existingOptions . data = newData ;
50
55
} ) ;
51
56
} ) ;
52
57
}
53
- gridApi . edit . on . afterCellEdit ( this . scope , ( rowEntity , colDef : uiGrid . IColumnDef , newValue , oldValue ) => {
54
- var value = newValue ;
55
-
56
- // TODO: newValue is a string?
57
- if ( colDef . type ) {
58
- if ( colDef . type == "number" || colDef . type == "integer" ) {
59
- value = Number ( newValue ) ;
60
- } else if ( colDef . type == "boolean" ) {
61
- value = Boolean ( newValue ) ;
62
- }
63
- }
64
-
65
- rowEntity [ colDef . field ] = value ;
58
+ if ( externalFilteringEnabled ) {
59
+ gridApi . core . on . filterChanged ( this . scope , ( ) => {
60
+ var columns = gridApi . grid . columns ;
61
+ var terms = columns . reduce ( ( acc , column ) => {
62
+ var value : any = column . filters [ 0 ] . term ;
63
+ acc [ column . field ] = ArrayRenderer . convertColumnValue ( column . colDef , value ) ;
64
+ return acc ;
65
+ } , { } ) ;
66
+ dataProvider . filter ( terms ) . then ( newData => {
67
+ existingOptions . data = newData ;
68
+ } )
69
+ } ) ;
70
+ }
71
+ gridApi . edit . on . afterCellEdit ( this . scope , ( rowEntity , colDef :uiGrid . IColumnDef , newValue , oldValue ) => {
72
+ rowEntity [ colDef . field ] = ArrayRenderer . convertColumnValue ( colDef , newValue ) ;
66
73
validationService . validate ( rowEntity , schema [ 'items' ] ) ;
67
74
// TODO: use constant
68
75
gridApi . core . notifyDataChange ( "column" ) ;
69
76
this . scope . $apply ( ) ;
70
77
} ) ;
71
-
72
78
} ;
73
79
74
- return defaultGridOptions ;
80
+ return this . mergeOptions ( existingOptions , defaultGridOptions ) ;
75
81
}
76
82
77
- private maxSize = 99 ;
78
- priority = 2 ;
83
+ private static convertColumnValue ( colDef : uiGrid . IColumnDef , value : string ) : any {
84
+ if ( colDef . type ) {
85
+ if ( colDef . type == "number" || colDef . type == "integer" ) {
86
+ return Number ( value ) ;
87
+ } else if ( colDef . type == "boolean" ) {
88
+ return Boolean ( value ) ;
89
+ }
90
+ }
91
+
92
+ return value ;
93
+ }
94
+
95
+ private mergeOptions ( optionsA : any , optionsB : any ) : any {
96
+ return Object . keys ( optionsB ) . reduce ( ( mergedOpts , optionName ) => {
97
+ if ( mergedOpts . hasOwnProperty ( optionName ) ) {
98
+ return mergedOpts
99
+ }
100
+ mergedOpts [ optionName ] = optionsB [ optionName ] ;
101
+ return mergedOpts ;
102
+ } , optionsA ) ;
103
+ }
79
104
80
105
isApplicable ( element : IUISchemaElement , subSchema : SchemaElement , schemaPath : string ) :boolean {
81
106
return element . type == 'Control' && subSchema !== undefined && subSchema . type == 'array' ;
@@ -102,7 +127,6 @@ class ArrayRenderer implements JSONForms.IRenderer {
102
127
} ;
103
128
}
104
129
105
-
106
130
private generateColumnDefs ( schema : SchemaElement , schemaPath : string ) : any {
107
131
var columnsDefs = [ ] ;
108
132
var subSchema = this . pathResolver . resolveSchema ( schema , schemaPath ) ;
@@ -125,10 +149,10 @@ class ArrayRenderer implements JSONForms.IRenderer {
125
149
return columnsDefs ;
126
150
}
127
151
128
- private createColumnDefs ( element : IArrayControlObject , schema : SchemaElement , services : JSONForms . Services ) : uiGrid . IColumnDef [ ] {
152
+ private createColumnDefs ( columns : IColumnControlObject [ ] , schema : SchemaElement , services : JSONForms . Services ) : uiGrid . IColumnDef [ ] {
129
153
var validationService :JSONForms . IValidationService = services . get < JSONForms . IValidationService > ( JSONForms . ServiceId . Validation ) ;
130
154
131
- return element . columns . map ( ( col ) => {
155
+ return columns . map ( ( col ) => {
132
156
var href = col [ 'href' ] ;
133
157
if ( href ) {
134
158
var hrefScope = href . scope ;
@@ -150,7 +174,7 @@ class ArrayRenderer implements JSONForms.IRenderer {
150
174
</div>` ;
151
175
}
152
176
153
- return {
177
+ return {
154
178
cellTemplate : cellTemplate ,
155
179
field : field ,
156
180
displayName : col . label ,
@@ -178,41 +202,16 @@ class ArrayRenderer implements JSONForms.IRenderer {
178
202
179
203
private createGridOptions ( element : IArrayControlObject , services : JSONForms . Services , schema : SchemaElement , schemaPath : string ) {
180
204
181
- var columnsDefs : uiGrid . IColumnDef [ ] ;
182
205
var subSchema = this . pathResolver . resolveSchema ( schema , schemaPath ) ;
183
206
184
- if ( element . columns ) {
185
- columnsDefs = this . createColumnDefs ( element , subSchema , services ) ;
186
- } else {
187
- columnsDefs = this . generateColumnDefs ( subSchema , schemaPath ) ;
188
- }
189
-
190
- var defaultGridOptions : uiGrid . IGridOptions = this . defaultGridOptions ( services , schema ) ;
191
- var gridOptions : uiGrid . IGridOptions = element . options || { } ;
192
- for ( var option in defaultGridOptions ) {
193
- if ( defaultGridOptions . hasOwnProperty ( option ) ) {
194
- gridOptions [ option ] = defaultGridOptions [ option ] ;
195
- }
196
- }
207
+ var columnsDefs : uiGrid . IColumnDef [ ] = element . columns ?
208
+ this . createColumnDefs ( element . columns , subSchema , services ) :
209
+ this . generateColumnDefs ( subSchema , schemaPath ) ;
197
210
211
+ var gridOptions : uiGrid . IGridOptions = this . defaultGridOptions ( element . options || { } , services , schema ) ;
198
212
gridOptions . columnDefs = columnsDefs ;
199
213
return gridOptions ;
200
214
}
201
-
202
- findSearchTerms ( grid ) {
203
- var searchTerms = [ ] ;
204
- for ( var i = 0 ; i < grid . columns . length ; i ++ ) {
205
- var searchTerm = grid . columns [ i ] . filters [ 0 ] . term ;
206
- if ( searchTerm !== undefined && searchTerm !== null ) {
207
- searchTerms . push ( {
208
- column : grid . columns [ i ] . getName ,
209
- term : searchTerm
210
- } ) ;
211
- }
212
- }
213
-
214
- return searchTerms ;
215
- }
216
215
}
217
216
218
217
angular . module ( 'jsonforms.renderers.controls.array' ) . run ( [ 'RenderService' , 'PathResolver' , '$rootScope' , function ( RenderService , PathResolver , $rootScope ) {
0 commit comments