Skip to content

Commit 4a563e0

Browse files
committed
Basic grid support and Textarea max length
1 parent 20983f2 commit 4a563e0

File tree

5 files changed

+70
-49
lines changed

5 files changed

+70
-49
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"moment": "~2.10.6"
3131
},
3232
"resolutions": {
33-
"angular": "1.4.4"
33+
"angular": "^1.4.8",
34+
"angular-material": "~1.0.1"
3435
}
3536
}

examples/data/grid.json

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,19 @@
5252
},
5353
{
5454
"type": "section",
55-
"grid": {
56-
"layout": "column"
57-
},
55+
"grid": { "layout": "column" },
5856
"items": [
5957
{
6058
"type": "section",
61-
"grid": {
62-
"layout": "row"
63-
},
59+
"grid": { "layout": "row" },
6460
"items": [
6561
{
6662
"key": "firstname",
67-
"grid": { "flex": 50, "layout": "column" }
63+
"grid": { "flex": 50 }
6864
},
6965
{
7066
"key": "lastname",
71-
"grid": { "flex": 50, "layout": "column" }
67+
"grid": { "flex": "" }
7268
}
7369
]
7470
},
@@ -82,30 +78,26 @@
8278
},
8379
{
8480
"type": "section",
85-
"grid": {
86-
"layout": "row"
87-
},
81+
"grid": { "layout": "row" },
8882
"items": [
8983
{
9084
"key": "city",
91-
"grid": { "flex": 50, "layout": "column" }
85+
"grid": { "flex": 33, "layout": "column" }
9286
},
9387
{
9488
"key": "state",
9589
"type":"select",
96-
"grid": { "state": 25, "layout": "column" }
90+
"grid": { "flex": 33, "layout": "column" }
9791
},
9892
{
9993
"key": "postcode",
100-
"grid": { "postcode": 25, "layout": "column" }
94+
"grid": { "flex": 33, "layout": "column" }
10195
}
10296
]
10397
},
10498
{
10599
"type": "section",
106-
"grid": {
107-
"layout": "row"
108-
},
100+
"grid": { "layout": "row" },
109101
"items": ["email"]
110102
}
111103
]

material-decorator.js

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)