Skip to content

Commit 7638927

Browse files
committed
Merge pull request #129 from Ognian/add_hidden2
Add custom hidden attribute to adaptive-table and x-display-order
2 parents 26978bd + 0df8638 commit 7638927

File tree

3 files changed

+78
-35
lines changed

3 files changed

+78
-35
lines changed

renderers/contributed/adaptive-table.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ Jsonary.render.register(Jsonary.plugins.Generator({
2222
var basicTypes = schemas.basicTypes();
2323

2424
// If the data might not be an object, add a column for it
25-
if (basicTypes.length != 1 || basicTypes[0] != "object" || depthRemaining <= 0) {
26-
var column = pathPrefix;
25+
if ((basicTypes.length != 1 || basicTypes[0] != "object" || depthRemaining <= 0) && !schemas.hidden()) {
26+
var column = pathPrefix;
2727
if (!columnsObj[column]) {
2828
columnsObj[column] = true;
2929
renderer.addColumn(column, schemas.title() || column, function (data, context) {
@@ -75,7 +75,9 @@ Jsonary.render.register(Jsonary.plugins.Generator({
7575
// Iterate over the potential properties
7676
for (var i = 0; i < knownPropertyIndices.length; i++) {
7777
var key = knownProperties[knownPropertyIndices[i]];
78-
addColumnsFromSchemas(schemas.propertySchemas(key), pathPrefix + Jsonary.joinPointer([key]), depthRemaining - 1);
78+
if (!schemas.propertySchemas(key).hidden()){
79+
addColumnsFromSchemas(schemas.propertySchemas(key), pathPrefix + Jsonary.joinPointer([key]), depthRemaining - 1);
80+
}
7981
}
8082
}
8183
}
@@ -157,4 +159,20 @@ Jsonary.extendSchemaList({
157159
});
158160
return displayAsTable;
159161
}
160-
});
162+
});
163+
164+
// hidden extension (non-standard keyword, suggested by Ognian)
165+
Jsonary.extendSchema({
166+
hidden: function () {
167+
return !!this.data.propertyValue("hidden");
168+
}
169+
});
170+
Jsonary.extendSchemaList({
171+
hidden: function () {
172+
var hidden = false;
173+
this.each(function (index, schema) {
174+
hidden = hidden || schema.hidden();
175+
});
176+
return hidden;
177+
}
178+
});
Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
// Uses (if exists) a "validation" property on the root object that matches the output of tv4 (https://github.com/geraintluff/tv4)
22
Jsonary.render.Components.add('VALIDATION');
33
Jsonary.render.register({
4-
component: Jsonary.render.Components.VALIDATION,
5-
renderHtml: function (data, context) {
6-
var result = "";
7-
var rootData = data.document.root;
8-
if (rootData.validation) {
9-
var errors = rootData.validation.errors;
10-
for (var i = 0; i < errors.length; i++) {
11-
if (errors[i].dataPath == data.pointerPath()) {
12-
result += "<span class='validation-error'>" + errors[i].message + "</span>";
13-
//mark i entry in errors as rendered, so that we can display not rendered errors somewhere else
14-
errors[i].rendered=true;
4+
component: Jsonary.render.Components.VALIDATION,
5+
renderHtml: function (data, context) {
6+
var result = "";
7+
var rootData = data.document.root;
8+
if (rootData.validation) {
9+
var errors = rootData.validation.errors;
10+
if (errors) {
11+
for (var i = 0; i < errors.length; i++) {
12+
if (errors[i].dataPath == data.pointerPath()) {
13+
result += "<span class='validation-error'>" + errors[i].message + "</span>";
14+
//mark i entry in errors as rendered, so that we can display not rendered errors somewhere else
15+
errors[i].rendered = true;
1516

16-
}
17-
}
18-
}
19-
return context.renderHtml(data) + result;
20-
}
17+
}
18+
}
19+
}
20+
}
21+
return context.renderHtml(data) + result;
22+
}
2123
});

renderers/contributed/x-display-order.js

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,22 @@ Jsonary.extendSchemaList({
1717
}
1818
});
1919

20+
// hidden extension (non-standard keyword, suggested by Ognian)
21+
Jsonary.extendSchema({
22+
hidden: function () {
23+
return !!this.data.propertyValue("hidden");
24+
}
25+
});
26+
Jsonary.extendSchemaList({
27+
hidden: function () {
28+
var hidden = false;
29+
this.each(function (index, schema) {
30+
hidden = hidden || schema.hidden();
31+
});
32+
return hidden;
33+
}
34+
});
35+
2036
// Display/edit objects, using displayOrder for ordering
2137
Jsonary.render.register({
2238
renderHtml: function (data, context) {
@@ -27,8 +43,10 @@ Jsonary.render.register({
2743
var keysDisplayOrder = {};
2844
var guaranteedKeys = data.readOnly() ? [] : schemas.definedProperties();
2945
data.properties(guaranteedKeys, function (key, subData) {
30-
keysList.push(key);
31-
keysDisplayOrder[key] = (subData.schemas().displayOrder() || schemas.propertySchemas(key).displayOrder());
46+
if(!(subData.schemas().hidden() || schemas.propertySchemas(key).hidden())){
47+
keysList.push(key);
48+
keysDisplayOrder[key] = (subData.schemas().displayOrder() || schemas.propertySchemas(key).displayOrder());
49+
}
3250
}, true);
3351
keysList.sort(function (keyA, keyB) {
3452
if (keysDisplayOrder[keyA] == null) {
@@ -50,19 +68,21 @@ Jsonary.render.register({
5068
}
5169
result += '<table class="json-object"><tbody>';
5270
var drawProperty = function (key, subData) {
53-
result += '<tr class="json-object-pair">';
54-
if (subData.defined()) {
55-
var title = subData.schemas().title();
56-
} else {
57-
var title = subData.parent().schemas().propertySchemas(subData.parentKey()).title();
58-
}
59-
if (title == "") {
60-
result +='<td class="json-object-key"><div class="json-object-key-title">' + escapeHtml(key) + '</div></td>';
61-
} else {
62-
result +='<td class="json-object-key"><div class="json-object-key-title">' + escapeHtml(key) + '</div><div class="json-object-key-text">' + escapeHtml(title) + '</div></td>';
63-
}
64-
result += '<td class="json-object-value">' + context.renderHtml(subData) + '</td>';
65-
result += '</tr>';
71+
if(!subData.schemas().hidden()){
72+
result += '<tr class="json-object-pair">';
73+
if (subData.defined()) {
74+
var title = subData.schemas().title();
75+
} else {
76+
var title = subData.parent().schemas().propertySchemas(subData.parentKey()).title();
77+
}
78+
if (title == "") {
79+
result +='<td class="json-object-key"><div class="json-object-key-title">' + escapeHtml(key) + '</div></td>';
80+
} else {
81+
result +='<td class="json-object-key"><div class="json-object-key-title">' + escapeHtml(key) + '</div><div class="json-object-key-text">' + escapeHtml(title) + '</div></td>';
82+
}
83+
result += '<td class="json-object-value">' + context.renderHtml(subData) + '</td>';
84+
result += '</tr>';
85+
}
6686
}
6787
if (!data.readOnly()) {
6888
var maxProperties = schemas.maxProperties();
@@ -72,6 +92,9 @@ Jsonary.render.register({
7292
drawProperty(key, subData);
7393
}
7494
}, drawProperty);
95+
// There are 2 callbacks the first one is called for the properties of the object defined in the schema or provided as the very first argumen
96+
// the second one is called for properties in the data NOT defined in the schema
97+
// so if we want to exclude a property only if it is defined as hidden in the schema we have to change the draw property function to try to see if this item is hidden and only if it is hidden to disable it otherwise it has to be displayed.
7598

7699
if (canAdd && schemas.allowedAdditionalProperties()) {
77100
result += '<tr class="json-object-pair"><td class="json-object-key"><div class="json-object-key-text">';

0 commit comments

Comments
 (0)