@@ -23,17 +23,19 @@ $templateCache.put("decorators/material/switch.html","<md-input-container class=
23
23
$templateCache . put ( "decorators/material/tabarray.html" , "<div sf-array=\"form\" ng-init=\"selected = { tab: 0 }\" class=\"clearfix schema-form-tabarray schema-form-tabarray-{{form.tabType || \'left\'}} {{form.htmlClass}}\"><div ng-if=\"!form.tabType || form.tabType !== \'right\'\" ng-class=\"{\'col-xs-3\': !form.tabType || form.tabType === \'left\'}\"><ul class=\"nav nav-tabs\" ng-class=\"{ \'tabs-left\': !form.tabType || form.tabType === \'left\'}\"><li ng-repeat=\"item in modelArray track by $index\" ng-click=\"$event.preventDefault() || (selected.tab = $index)\" ng-class=\"{active: selected.tab === $index}\"><a href=\"#\">{{interp(form.title,{\'$index\':$index, value: item}) || $index}}</a></li><li ng-hide=\"form.readonly\" ng-click=\"$event.preventDefault() || (selected.tab = appendToArray().length - 1)\"><a href=\"#\"><i class=\"glyphicon glyphicon-plus\"></i> {{ form.add || \'Add\'}}</a></li></ul></div><div ng-class=\"{\'col-xs-9\': !form.tabType || form.tabType === \'left\' || form.tabType === \'right\'}\"><div class=\"tab-content {{form.fieldHtmlClass}}\"><div class=\"tab-pane clearfix\" ng-repeat=\"item in modelArray track by $index\" ng-show=\"selected.tab === $index\" ng-class=\"{active: selected.tab === $index}\"><sf-decorator ng-init=\"arrayIndex = $index\" form=\"copyWithIndex($index)\"></sf-decorator><button ng-hide=\"form.readonly\" ng-click=\"selected.tab = deleteFromArray($index).length - 1\" type=\"button\" class=\"btn {{ form.style.remove || \'btn-default\' }} pull-right\"><i class=\"glyphicon glyphicon-trash\"></i> {{ form.remove || \'Remove\'}}</button></div></div></div><div ng-if=\"form.tabType === \'right\'\" class=\"col-xs-3\"><ul class=\"nav nav-tabs tabs-right\"><li ng-repeat=\"item in modelArray track by $index\" ng-click=\"$event.preventDefault() || (selected.tab = $index)\" ng-class=\"{active: selected.tab === $index}\"><a href=\"#\">{{interp(form.title,{\'$index\':$index, value: item}) || $index}}</a></li><li ng-hide=\"form.readonly\" ng-click=\"$event.preventDefault() || appendToArray()\"><a href=\"#\"><i class=\"glyphicon glyphicon-plus\"></i> {{ form.add || \'Add\'}}</a></li></ul></div></div>" ) ;
24
24
$templateCache . put ( "decorators/material/tabs.html" , "<div sf-field-model=\"\" class=\"schema-form-tabs {{::form.htmlClass}}\"><md-tabs md-dynamic-height=\"\" md-selected=\"selected\" md-autoselect=\"\" ng-init=\"selected = 0\"></md-tabs></div>" ) ;
25
25
$templateCache . put ( "decorators/material/textarea.html" , "<md-input-container class=\"{{::form.htmlClass}} schema-form-textarea\" sf-messages=\"\"><label ng-show=\"showTitle()\" for=\"{{::form.key|sfCamelKey}}\">{{::form.title}}</label> <textarea ng-class=\"::form.fieldHtmlClass\" id=\"{{::form.key|sfCamelKey}}\" sf-changed=\"form\" ng-disabled=\"::form.readonly\" sf-field-model=\"\" schema-validate=\"form\" name=\"{{::form.key|sfCamelKey}}\"></textarea></md-input-container>" ) ; } ] ) ;
26
- ( function ( angular , undefined ) { 'use strict' ;
26
+ ( function ( angular , undefined ) { 'use strict' ;
27
27
angular
28
28
. module ( 'schemaForm' )
29
29
. config ( materialDecoratorConfig )
30
+ . directive ( 'sfmExternalOptions' , sfmExternalOptionsDirective )
30
31
. filter ( 'sfCamelKey' , sfCamelKeyFilter ) ;
31
32
32
33
materialDecoratorConfig . $inject = [
33
34
'schemaFormProvider' , 'schemaFormDecoratorsProvider' , 'sfBuilderProvider' , 'sfPathProvider' , '$injector'
34
35
] ;
35
36
36
- function materialDecoratorConfig ( schemaFormProvider , decoratorsProvider , sfBuilderProvider , sfPathProvider , $injector ) {
37
+ function materialDecoratorConfig (
38
+ schemaFormProvider , decoratorsProvider , sfBuilderProvider , sfPathProvider , $injector ) {
37
39
var base = 'decorators/material/' ;
38
40
39
41
var simpleTransclusion = sfBuilderProvider . builders . simpleTransclusion ;
@@ -134,31 +136,47 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
134
136
} ;
135
137
136
138
function sfOptionsBuilder ( args ) {
139
+ var mdSelectFrag = args . fieldFrag . querySelector ( 'md-select' ) ;
137
140
var enumTitleMap = [ ] ;
138
141
var i ;
139
142
var mdSelectFrag ;
140
143
144
+ args . form . selectOptions = [ ] ;
141
145
args . form . getOptions = getOptionsHandler ;
142
146
143
- if ( args . form . titleMap ) {
144
- args . form . selectOptions = args . form . titleMap ;
145
- }
146
- else if ( args . form . enum && args . form . enum . length ) {
147
- for ( i = 0 ; i < args . form . enum . length ; i ++ ) {
148
- if ( args . form . enum [ i ] && args . form . enum [ i ] . length ) {
149
- enumTitleMap . push ( { name :args . form . enum [ i ] , value :args . form . enum [ i ] } ) ;
147
+ if ( args . form . schema . links && ( typeof args . form . schema . links ) === 'object' ) {
148
+ var link ;
149
+ var related = / ( { ) ( [ ^ } ] * ) ( } ) / gm;
150
+ var source = / { { ( [ ^ } ] * ) } } / gm;
151
+ var matched ;
152
+
153
+ for ( i = 0 ; i < args . form . schema . links . length ; i ++ ) {
154
+ link = args . form . schema . links [ i ] ;
155
+ if ( link . rel === 'options' ) {
156
+ // TODO enable filter to allow processing results
157
+ // args.form.optionSource = link.href.replace(related, '$1$1 model.$2 | _externalOptionUri $3$3');
158
+ args . form . optionSource = link . href . replace ( related , '$1$1 model.$2 $3$3' ) ;
159
+ // args.form.watchList = [];
160
+ // matched = args.form.optionSource.match(source);
161
+ // while ((matched = source.exec(args.form.optionSource)) !== null) {
162
+ // args.form.watchList.push(matched);
163
+ // };
150
164
} ;
151
165
} ;
152
- args . form . selectOptions = enumTitleMap ;
166
+
167
+ mdSelectFrag . setAttribute ( 'sfm-external-options' , args . form . optionSource ) ;
168
+ }
169
+ else {
170
+ args . form . selectOptions = sfOptionsProcessor ( args . form ) ;
153
171
} ;
154
172
155
173
// TODO implement $watch for remote data loading after the page loads
156
- function getOptionsHandler ( form , evalExpr , $watch ) {
157
- if ( form . optionData ) {
174
+ function getOptionsHandler ( form , evalExpr ) {
175
+ if ( form . optionData ) {
158
176
return evalExpr ( form . optionData ) ;
159
177
} ;
160
178
161
- if ( form . selectOptions ) {
179
+ if ( form . selectOptions ) {
162
180
return form . selectOptions ;
163
181
} ;
164
182
@@ -214,17 +232,54 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
214
232
} ;
215
233
} ;
216
234
235
+ function sfOptionsProcessor ( data ) {
236
+ var enumTitleMap = [ ] ;
237
+
238
+ if ( data . titleMap ) {
239
+ return data . titleMap ;
240
+ }
241
+ else if ( data . enum && data . enum . length ) {
242
+ for ( i = 0 ; i < data . enum . length ; i ++ ) {
243
+ if ( data . enum [ i ] && data . enum [ i ] . length ) {
244
+ enumTitleMap . push ( { name : data . enum [ i ] , value : data . enum [ i ] } ) ;
245
+ } ;
246
+ } ;
247
+ } ;
248
+
249
+ return enumTitleMap ;
250
+ } ;
251
+
252
+ sfmExternalOptionsDirective . $inject = [ '$http' ] ;
253
+
254
+ function sfmExternalOptionsDirective ( $http ) {
255
+ var directive = {
256
+ link : link ,
257
+ restrict : 'A'
258
+ } ;
259
+
260
+ return directive ;
261
+
262
+ function link ( scope , element , attrs ) {
263
+ attrs . $observe ( 'sfmExternalOptions' , function ( dataURI ) {
264
+ $http . get ( dataURI )
265
+ . then ( function ( response ) {
266
+ scope . form . selectOptions = sfOptionsProcessor ( response . data ) ;
267
+ } ) ;
268
+ } ) ;
269
+ } ;
270
+ } ;
271
+
217
272
/**
218
273
* sfCamelKey Filter
219
274
*/
220
- function sfCamelKeyFilter ( ) {
221
- return function ( formKey ) {
222
- if ( ! formKey ) return '' ;
275
+ function sfCamelKeyFilter ( ) {
276
+ return function ( formKey ) {
277
+ if ( ! formKey ) { return '' ; } ;
223
278
var part , i , key ;
224
279
key = formKey . slice ( ) ;
225
- for ( i = 0 ; i < key . length ; i ++ ) {
280
+ for ( i = 0 ; i < key . length ; i ++ ) {
226
281
part = key [ i ] . toLowerCase ( ) . split ( '' ) ;
227
- if ( i && part . length ) part [ 0 ] = part [ 0 ] . toUpperCase ( ) ;
282
+ if ( i && part . length ) { part [ 0 ] = part [ 0 ] . toUpperCase ( ) ; } ;
228
283
key [ i ] = part . join ( '' ) ;
229
284
} ;
230
285
return key . join ( '' ) ;
0 commit comments