Skip to content

Commit e702834

Browse files
committed
Merge branch 'mike-marcacci-readonly' into development
2 parents e1a663a + 2d24b23 commit e702834

21 files changed

+210
-44
lines changed

dist/bootstrap-decorator.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/schema-form.js

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,6 @@ angular.module('schemaForm').provider('schemaForm',
586586
};
587587

588588
var fieldset = function(name, schema, options) {
589-
590589
if (schema.type === 'object') {
591590
var f = stdFormObj(name, schema, options);
592591
f.type = 'fieldset';
@@ -640,7 +639,8 @@ angular.module('schemaForm').provider('schemaForm',
640639
path: arrPath,
641640
required: required || false,
642641
lookup: options.lookup,
643-
ignore: options.ignore
642+
ignore: options.ignore,
643+
global: options.global
644644
})];
645645

646646
return f;
@@ -720,23 +720,27 @@ angular.module('schemaForm').provider('schemaForm',
720720

721721
var service = {};
722722

723-
service.merge = function(schema, form, ignore, options) {
723+
service.merge = function(schema, form, ignore, options, readonly) {
724724
form = form || ['*'];
725725
options = options || {};
726726

727+
// Get readonly from root object
728+
readonly = readonly || schema.readonly || schema.readOnly;
729+
727730
var stdForm = service.defaults(schema, ignore, options);
731+
728732
//simple case, we have a "*", just put the stdForm there
729733
var idx = form.indexOf('*');
730734
if (idx !== -1) {
731735
form = form.slice(0, idx)
732736
.concat(stdForm.form)
733737
.concat(form.slice(idx + 1));
734-
return form;
735738
}
736739

737740
//ok let's merge!
738741
//We look at the supplied form and extend it with schema standards
739742
var lookup = stdForm.lookup;
743+
740744
return postProcessFn(form.map(function(obj) {
741745

742746
//handle the shortcut with just a name
@@ -767,26 +771,32 @@ angular.module('schemaForm').provider('schemaForm',
767771
});
768772
}
769773

774+
//extend with std form from schema.
775+
776+
if (obj.key) {
777+
var strid = sfPathProvider.stringify(obj.key);
778+
if (lookup[strid]) {
779+
obj = angular.extend(lookup[strid], obj);
780+
}
781+
}
782+
783+
// Are we inheriting readonly?
784+
if (readonly === true) { // Inheriting false is not cool.
785+
obj.readonly = true;
786+
}
787+
770788
//if it's a type with items, merge 'em!
771789
if (obj.items) {
772-
obj.items = service.merge(schema, obj.items, ignore);
790+
obj.items = service.merge(schema, obj.items, ignore, options, obj.readonly);
773791
}
774792

775793
//if its has tabs, merge them also!
776794
if (obj.tabs) {
777795
angular.forEach(obj.tabs, function(tab) {
778-
tab.items = service.merge(schema, tab.items, ignore);
796+
tab.items = service.merge(schema, tab.items, ignore, options, obj.readonly);
779797
});
780798
}
781799

782-
//extend with std form from schema.
783-
if (obj.key) {
784-
var str = sfPathProvider.stringify(obj.key);
785-
if (lookup[str]) {
786-
obj = angular.extend(lookup[str], obj);
787-
}
788-
}
789-
790800
// Special case: checkbox
791801
// Since have to ternary state we need a default
792802
if (obj.type === 'checkbox' && angular.isUndefined(obj.schema['default'])) {
@@ -984,8 +994,16 @@ angular.module('schemaForm').directive('sfArray', ['sfSelect', 'schemaForm', 'sf
984994
// section. Unless there is just one.
985995
var subForm = form.items[0];
986996
if (form.items.length > 1) {
987-
subForm = {type: 'section', items: form.items};
997+
subForm = {
998+
type: 'section',
999+
items: form.items.map(function(item){
1000+
item.ngModelOptions = form.ngModelOptions;
1001+
item.readonly = form.readonly;
1002+
return item;
1003+
})
1004+
};
9881005
}
1006+
9891007
}
9901008

9911009
// We ceate copies of the form on demand, caching them for

dist/schema-form.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/index.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,9 @@ General options most field types can handle:
309309
onChange: "valueChanged(form.key,modelValue)", // onChange event handler, expression or function
310310
feedback: false, // Inline feedback icons
311311
placeholder: "Input...", // placeholder on inputs and textarea
312-
ngModelOptions: { ... } // Passed along to ng-model-options
312+
ngModelOptions: { ... }, // Passed along to ng-model-options
313+
readonly: true // Same effect as readOnly in schema. Put on a fieldset or array
314+
// and their items will inherit it.
313315
}
314316
```
315317

src/directives/array.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,16 @@ angular.module('schemaForm').directive('sfArray', ['sfSelect', 'schemaForm', 'sf
4646
// section. Unless there is just one.
4747
var subForm = form.items[0];
4848
if (form.items.length > 1) {
49-
subForm = {type: 'section', items: form.items};
49+
subForm = {
50+
type: 'section',
51+
items: form.items.map(function(item){
52+
item.ngModelOptions = form.ngModelOptions;
53+
item.readonly = form.readonly;
54+
return item;
55+
})
56+
};
5057
}
58+
5159
}
5260

5361
// We ceate copies of the form on demand, caching them for

src/directives/decorators/bootstrap/actions.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
ng-if="item.type === 'submit'">
77
<button ng-repeat-end class="btn {{ item.style || 'btn-default' }}"
88
type="button"
9+
ng-disabled="form.readonly"
910
ng-if="item.type !== 'submit'"
1011
ng-click="buttonClick($event,item)">{{item.title}}</button>
1112
</div>

src/directives/decorators/bootstrap/array.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
<h3 ng-show="form.title && form.notitle !== true">{{ form.title }}</h3>
33
<ol class="list-group" ng-model="modelArray" ui-sortable>
44
<li class="list-group-item" ng-repeat="item in modelArray track by $index">
5-
<button ng-click="deleteFromArray($index)"
5+
<button ng-hide="form.readonly"
6+
ng-click="deleteFromArray($index)"
67
style="position: relative; z-index: 20;"
78
type="button" class="close pull-right">
89
<span aria-hidden="true">&times;</span><span class="sr-only">Close</span>
@@ -11,7 +12,8 @@ <h3 ng-show="form.title && form.notitle !== true">{{ form.title }}</h3>
1112
</li>
1213
</ol>
1314
<div class="clearfix" style="padding: 15px;">
14-
<button ng-click="appendToArray()"
15+
<button ng-hide="form.readonly"
16+
ng-click="appendToArray()"
1517
type="button"
1618
class="btn {{ form.style.add || 'btn-default' }} pull-right">
1719
<i class="glyphicon glyphicon-plus"></i>

src/directives/decorators/bootstrap/bootstrap-decorator.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ angular.module('schemaForm').config(['schemaFormDecoratorsProvider', function(de
2323
help: base + 'help.html',
2424
'default': base + 'default.html'
2525
}, [
26-
function(form) {
27-
if (form.readonly && form.key && form.type !== 'fieldset') {
28-
return base + 'readonly.html';
29-
}
30-
}
26+
// function(form) {
27+
// if (form.readonly && form.key && form.type !== 'fieldset') {
28+
// return base + 'readonly.html';
29+
// }
30+
// }
3131
]);
3232

3333
//manual use directives

src/directives/decorators/bootstrap/checkbox.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<label>
33
<input type="checkbox"
44
sf-changed="form"
5+
ng-disabled="form.readonly"
56
ng-model="$$value$$"
67
ng-model-options="form.ngModelOptions"
78
schema-validate="form">

src/directives/decorators/bootstrap/checkboxes.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<div class="checkbox" ng-repeat="val in titleMapValues track by $index" >
44
<label>
55
<input type="checkbox"
6+
ng-disabled="form.readonly"
67
sf-changed="form"
78
ng-model="titleMapValues[$index]">
89
<span ng-bind-html="form.titleMap[$index].name"></span>

src/directives/decorators/bootstrap/default.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
class="form-control"
1010
ng-model-options="form.ngModelOptions"
1111
ng-model="$$value$$"
12+
ng-disabled="form.readonly"
1213
schema-validate="form">
1314
<span ng-if="form.feedback !== false"
1415
class="form-control-feedback"

src/directives/decorators/bootstrap/radio-buttons.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<input type="radio"
1010
sf-changed="form"
1111
style="display: none;"
12+
ng-disabled="form.readonly"
1213
ng-model="$$value$$"
1314
ng-model-options="form.ngModelOptions"
1415
ng-value="item.value">

src/directives/decorators/bootstrap/radios-inline.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<label class="radio-inline" ng-repeat="item in form.titleMap" >
55
<input type="radio"
66
sf-changed="form"
7+
ng-disabled="form.readonly"
78
ng-model="$$value$$"
89
ng-value="item.value">
910
<span ng-bind-html="item.name"></span>

src/directives/decorators/bootstrap/radios.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<label>
55
<input type="radio"
66
sf-changed="form"
7+
ng-disabled="form.readonly"
78
ng-model="$$value$$"
89
ng-model-options="form.ngModelOptions"
910
ng-value="item.value">

src/directives/decorators/bootstrap/select.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
</label>
55
<select ng-model="$$value$$"
66
ng-model-options="form.ngModelOptions"
7+
ng-disabled="form.readonly"
78
sf-changed="form"
89
class="form-control"
910
schema-validate="form"

src/directives/decorators/bootstrap/submit.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
<input type="submit"
33
class="btn {{ form.style || 'btn-primary' }}"
44
value="{{form.title}}"
5+
ng-disabled="form.readonly"
56
ng-if="form.type === 'submit'">
67
<button class="btn {{ form.style || 'btn-default' }}"
78
type="button"
89
ng-click="buttonClick($event,form)"
10+
ng-disabled="form.readonly"
911
ng-if="form.type !== 'submit'">{{form.title}}</button>
1012
</div>

src/directives/decorators/bootstrap/tabarray.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
ng-class="{active: selected.tab === $index}">
1111
<a href="#">{{evalExpr(form.title,{'$index':$index, value: item}) || $index}}</a>
1212
</li>
13-
<li ng-click="$event.preventDefault() || (selected.tab = appendToArray().length - 1)">
13+
<li ng-hide="form.readonly" ng-click="$event.preventDefault() || (selected.tab = appendToArray().length - 1)">
1414
<a href="#">
1515
<i class="glyphicon glyphicon-plus"></i>
1616
{{ form.add || 'Add'}}
@@ -28,7 +28,8 @@
2828
<sf-decorator form="copyWithIndex($index)"></sf-decorator>
2929

3030

31-
<button ng-click="selected.tab = deleteFromArray($index).length - 1"
31+
<button ng-hide="form.readonly"
32+
ng-click="selected.tab = deleteFromArray($index).length - 1"
3233
type="button"
3334
class="btn {{ form.style.remove || 'btn-default' }} pull-right">
3435
<i class="glyphicon glyphicon-trash"></i>
@@ -46,7 +47,7 @@
4647
ng-class="{active: selected.tab === $index}">
4748
<a href="#">{{evalExpr(form.title,{'$index':$index, value: item}) || $index}}</a>
4849
</li>
49-
<li ng-click="$event.preventDefault() || appendToArray()">
50+
<li ng-hide="form.readonly" ng-click="$event.preventDefault() || appendToArray()">
5051
<a href="#">
5152
<i class="glyphicon glyphicon-plus"></i>
5253
{{ form.add || 'Add'}}

src/directives/decorators/bootstrap/tabs.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<div ng-init="selected = { tab: 0 }">
22
<ul class="nav nav-tabs" style="margin-bottom: 15px">
33
<li ng-repeat="tab in form.tabs"
4+
ng-disabled="form.readonly"
45
ng-click="$event.preventDefault() || (selected.tab = $index)"
56
ng-class="{active: selected.tab === $index}">
67
<a href="#">{{ tab.title }}</a>
@@ -9,6 +10,7 @@
910

1011
<div class="tab-content">
1112
<div class="tab-pane"
13+
ng-disabled="form.readonly"
1214
ng-repeat="tab in form.tabs"
1315
ng-show="selected.tab === $index"
1416
ng-class="{active: selected.tab === $index}">

src/directives/decorators/bootstrap/textarea.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<textarea class="form-control"
44
sf-changed="form"
55
placeholder="{{form.placeholder}}"
6+
ng-disabled="form.readonly"
67
ng-model="$$value$$"
78
ng-model-options="form.ngModelOptions"
89
schema-validate="form"></textarea>

src/services/schema-form.js

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ angular.module('schemaForm').provider('schemaForm',
147147
};
148148

149149
var fieldset = function(name, schema, options) {
150-
151150
if (schema.type === 'object') {
152151
var f = stdFormObj(name, schema, options);
153152
f.type = 'fieldset';
@@ -201,7 +200,8 @@ angular.module('schemaForm').provider('schemaForm',
201200
path: arrPath,
202201
required: required || false,
203202
lookup: options.lookup,
204-
ignore: options.ignore
203+
ignore: options.ignore,
204+
global: options.global
205205
})];
206206

207207
return f;
@@ -281,23 +281,27 @@ angular.module('schemaForm').provider('schemaForm',
281281

282282
var service = {};
283283

284-
service.merge = function(schema, form, ignore, options) {
284+
service.merge = function(schema, form, ignore, options, readonly) {
285285
form = form || ['*'];
286286
options = options || {};
287287

288+
// Get readonly from root object
289+
readonly = readonly || schema.readonly || schema.readOnly;
290+
288291
var stdForm = service.defaults(schema, ignore, options);
292+
289293
//simple case, we have a "*", just put the stdForm there
290294
var idx = form.indexOf('*');
291295
if (idx !== -1) {
292296
form = form.slice(0, idx)
293297
.concat(stdForm.form)
294298
.concat(form.slice(idx + 1));
295-
return form;
296299
}
297300

298301
//ok let's merge!
299302
//We look at the supplied form and extend it with schema standards
300303
var lookup = stdForm.lookup;
304+
301305
return postProcessFn(form.map(function(obj) {
302306

303307
//handle the shortcut with just a name
@@ -328,26 +332,32 @@ angular.module('schemaForm').provider('schemaForm',
328332
});
329333
}
330334

335+
//extend with std form from schema.
336+
337+
if (obj.key) {
338+
var strid = sfPathProvider.stringify(obj.key);
339+
if (lookup[strid]) {
340+
obj = angular.extend(lookup[strid], obj);
341+
}
342+
}
343+
344+
// Are we inheriting readonly?
345+
if (readonly === true) { // Inheriting false is not cool.
346+
obj.readonly = true;
347+
}
348+
331349
//if it's a type with items, merge 'em!
332350
if (obj.items) {
333-
obj.items = service.merge(schema, obj.items, ignore);
351+
obj.items = service.merge(schema, obj.items, ignore, options, obj.readonly);
334352
}
335353

336354
//if its has tabs, merge them also!
337355
if (obj.tabs) {
338356
angular.forEach(obj.tabs, function(tab) {
339-
tab.items = service.merge(schema, tab.items, ignore);
357+
tab.items = service.merge(schema, tab.items, ignore, options, obj.readonly);
340358
});
341359
}
342360

343-
//extend with std form from schema.
344-
if (obj.key) {
345-
var str = sfPathProvider.stringify(obj.key);
346-
if (lookup[str]) {
347-
obj = angular.extend(lookup[str], obj);
348-
}
349-
}
350-
351361
// Special case: checkbox
352362
// Since have to ternary state we need a default
353363
if (obj.type === 'checkbox' && angular.isUndefined(obj.schema['default'])) {

0 commit comments

Comments
 (0)