@@ -45,15 +45,17 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
4545 var condition = sfBuilderProvider . builders . condition ;
4646 var array = sfBuilderProvider . builders . array ;
4747
48+ var sfLayout = sfLayout ;
4849 var sfMessagesNode = sfMessagesNodeHandler ( ) ;
4950 var sfMessages = sfMessagesBuilder ;
5051 var sfOptions = sfOptionsBuilder ;
5152 var mdAutocomplete = mdAutocompleteBuilder ;
5253 var mdSwitch = mdSwitchBuilder ;
5354 var mdDatepicker = mdDatepickerBuilder ;
5455 var mdTabs = mdTabsBuilder ;
56+ var textarea = textareaBuilder ;
5557
56- var core = [ sfField , ngModel , ngModelOptions , condition ] ;
58+ var core = [ sfField , ngModel , ngModelOptions , condition , sfLayout ] ;
5759 var defaults = core . concat ( sfMessages ) ;
5860 var arrays = core . concat ( array ) ;
5961
@@ -76,15 +78,25 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
7678 radios : { template : base + 'radios.html' , builder : defaults } ,
7779 'radios-inline' : { template : base + 'radios-inline.html' , builder : defaults } ,
7880 radiobuttons : { template : base + 'radio-buttons.html' , builder : defaults } ,
79- section : { template : base + 'section.html' , builder : [ sfField , simpleTransclusion , condition ] } ,
81+ section : { template : base + 'section.html' , builder : [ sfField , simpleTransclusion , condition , sfLayout ] } ,
8082 select : { template : base + 'select.html' , builder : defaults . concat ( sfOptions ) } ,
8183 submit : { template : base + 'submit.html' , builder : defaults } ,
8284 tabs : { template : base + 'tabs.html' , builder : [ sfField , mdTabs , condition ] } ,
8385 tabarray : { template : base + 'tabarray.html' , builder : arrays } ,
84- textarea : { template : base + 'textarea.html' , builder : defaults } ,
86+ textarea : { template : base + 'textarea.html' , builder : defaults . concat ( textarea ) } ,
8587 switch : { template : base + 'switch.html' , builder : defaults . concat ( mdSwitch ) }
8688 } ) ;
8789
90+ function sfLayout ( args ) {
91+ var layoutDiv = args . fieldFrag . querySelector ( '[sf-layout]' ) ;
92+
93+ if ( args . form . grid ) {
94+ Object . getOwnPropertyNames ( args . form . grid ) . forEach ( function ( property , idx , array ) {
95+ layoutDiv . setAttribute ( property , args . form . grid [ property ] ) ;
96+ } ) ;
97+ } ;
98+ } ;
99+
88100 function sfMessagesNodeHandler ( ) {
89101 var html = '<div ng-if="ngModel.$invalid" ng-messages="ngModel.$error"><div sf-message ng-message></div></div>' ;
90102 var div = document . createElement ( 'div' ) ;
@@ -100,6 +112,14 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
100112 }
101113 } ;
102114
115+ function textareaBuilder ( args ) {
116+ var textareaFrag = args . fieldFrag . querySelector ( 'textarea' ) ;
117+ var maxLength = args . form . maxlength || false ;
118+ if ( textareaFrag && maxLength ) {
119+ textareaFrag . setAttribute ( 'md-maxlength' , maxLength ) ;
120+ } ;
121+ } ;
122+
103123 function mdAutocompleteBuilder ( args ) {
104124 var mdAutocompleteFrag = args . fieldFrag . querySelector ( 'md-autocomplete' ) ;
105125 var minLength = args . form . minLength || 1 ;
@@ -130,9 +150,6 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
130150 mdSwitchFrag . setAttribute ( 'ng-true-value' , args . form . schema . titleMap . true ) ;
131151 mdSwitchFrag . setAttribute ( 'ng-false-value' , args . form . schema . titleMap . false ) ;
132152 }
133- if ( args . form . schema . ink ) {
134- mdSwitchFrag . setIdAttribute ( 'md-no-ink' , args . form . schema . ink ) ;
135- }
136153 } ;
137154
138155 function sfOptionsBuilder ( args ) {
@@ -156,11 +173,6 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
156173 // TODO enable filter to allow processing results
157174 // args.form.optionSource = link.href.replace(related, '$1$1 model.$2 | _externalOptionUri $3$3');
158175 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- // };
164176 } ;
165177 } ;
166178
@@ -169,19 +181,6 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
169181 else {
170182 args . form . selectOptions = sfOptionsProcessor ( args . form ) ;
171183 } ;
172-
173- // TODO implement $watch for remote data loading after the page loads
174- function getOptionsHandler ( form , evalExpr ) {
175- if ( form . optionData ) {
176- return evalExpr ( form . optionData ) ;
177- } ;
178-
179- if ( form . selectOptions ) {
180- return form . selectOptions ;
181- } ;
182-
183- return [ ] ;
184- } ;
185184 } ;
186185
187186 function mdDatepickerBuilder ( args ) {
@@ -232,6 +231,18 @@ $templateCache.put("decorators/material/textarea.html","<md-input-container clas
232231 } ;
233232 } ;
234233
234+ function getOptionsHandler ( form , evalExpr ) {
235+ if ( form . optionData ) {
236+ return evalExpr ( form . optionData ) ;
237+ } ;
238+
239+ if ( form . selectOptions ) {
240+ return form . selectOptions ;
241+ } ;
242+
243+ return [ ] ;
244+ } ;
245+
235246 function sfOptionsProcessor ( data ) {
236247 var enumTitleMap = [ ] ;
237248
0 commit comments