|
1 | 1 | // Generic renderer for arrays |
2 | 2 | // Requires "render.table" and "render.generator" plugins |
3 | 3 | Jsonary.render.register(Jsonary.plugins.Generator({ |
4 | | -name: "Adaptive table", |
5 | | -// Part of the generator plugin - this function returns a renderer based on the data/schema requirements |
6 | | -rendererForData: function (data) { |
7 | | -var FancyTableRenderer = Jsonary.plugins.FancyTableRenderer; |
| 4 | + name: "Adaptive table", |
| 5 | + // Part of the generator plugin - this function returns a renderer based on the data/schema requirements |
| 6 | + rendererForData: function (data) { |
| 7 | + var FancyTableRenderer = Jsonary.plugins.FancyTableRenderer; |
8 | 8 |
|
9 | | -var detectedPagingLinks = !!(data.getLink('next') || data.getLink('prev')); |
10 | | -var isShort = data.readOnly() && data.length() < 15; |
| 9 | + var detectedPagingLinks = !!(data.getLink('next') || data.getLink('prev')); |
| 10 | + var isShort = data.readOnly() && data.length() < (Jsonary && Jsonary.options && Jsonary.options.adaptive_table && Jsonary.options.adaptive_table.pagingRows ? Jsonary.options.adaptive_table.pagingRows : 15); |
11 | 11 |
|
12 | | -var renderer = new FancyTableRenderer({ |
13 | | -sort: {}, |
14 | | -rowsPerPage: (isShort || detectedPagingLinks) ? null : [15, 5, 30, 100] |
15 | | -}); |
16 | | -var columnsObj = {}; |
17 | | -
|
18 | | -function addColumnsFromSchemas(schemas, pathPrefix, depthRemaining) { |
19 | | -schemas = schemas.getFull(); |
| 12 | + var renderer = new FancyTableRenderer({ |
| 13 | + sort: {}, |
| 14 | + rowsPerPage: (isShort || detectedPagingLinks) ? null : [15, 5, 30, 100] |
| 15 | + }); |
| 16 | + var columnsObj = {}; |
| 17 | + |
| 18 | + function addColumnsFromSchemas(schemas, pathPrefix, depthRemaining) { |
| 19 | + schemas = schemas.getFull(); |
20 | 20 |
|
21 | | -pathPrefix = pathPrefix || ""; |
22 | | -var basicTypes = schemas.basicTypes(); |
| 21 | + pathPrefix = pathPrefix || ""; |
| 22 | + var basicTypes = schemas.basicTypes(); |
23 | 23 |
|
24 | | -// If the data might not be an object, add a column for it |
25 | | -if ((basicTypes.length != 1 || basicTypes[0] != "object" || depthRemaining <= 0) && !schemas.hidden()) { |
26 | | - var column = pathPrefix; |
27 | | -if (!columnsObj[column]) { |
28 | | -columnsObj[column] = true; |
29 | | -renderer.addColumn(column, schemas.title() || column, function (data, context) { |
30 | | -if (data.basicType() == "object" && depthRemaining < 0) { |
31 | | -return '<td class="jsonary-recursion-limit-reached">...</td>'; |
| 24 | + // If the data might not be an object, add a column for it |
| 25 | + if ((basicTypes.length != 1 || basicTypes[0] != "object" || depthRemaining <= 0) && !schemas.hidden()) { |
| 26 | + var column = pathPrefix; |
| 27 | + if (!columnsObj[column]) { |
| 28 | + columnsObj[column] = true; |
| 29 | + renderer.addColumn(column, schemas.title() || column, function (data, context) { |
| 30 | + if (data.basicType() == "object" && depthRemaining < 0) { |
| 31 | + return '<td class="jsonary-recursion-limit-reached">...</td>'; |
32 | 32 | } else { |
33 | | -return this.defaultCellRenderHtml(data, context, column); |
34 | | -} |
35 | | -}); |
36 | | -var isScalar = basicTypes.length == 1 && basicTypes[0] !== 'object' && basicTypes[0] !== 'array'; |
37 | | -if (!detectedPagingLinks && isScalar) { |
38 | | -// add sorting |
39 | | -renderer.config.sort[column] = true; |
40 | | -} |
41 | | -} |
42 | | -} |
| 33 | + return this.defaultCellRenderHtml(data, context, column); |
| 34 | + } |
| 35 | + }); |
| 36 | + var isScalar = basicTypes.length == 1 && basicTypes[0] !== 'object' && basicTypes[0] !== 'array'; |
| 37 | + if (!detectedPagingLinks && isScalar) { |
| 38 | + // add sorting |
| 39 | + renderer.config.sort[column] = true; |
| 40 | + } |
| 41 | + } |
| 42 | + } |
43 | 43 |
|
44 | | -// If the data might be an object, add columns for its links/properties |
45 | | -if (basicTypes.indexOf('object') != -1 && depthRemaining > 0) { |
46 | | -if (data.readOnly()) { |
47 | | -var links = schemas.links(); |
48 | | -for (var i = 0; i < links.length; i++) { |
49 | | -var link = links[i]; |
50 | | -addColumnsFromLink(link, i); |
51 | | -} |
52 | | -} |
53 | | -var knownProperties = schemas.knownProperties(); |
54 | | -var knownPropertyIndices = []; |
55 | | -// Sort object properties by displayOrder |
56 | | -var knownPropertyOrder = {}; |
57 | | -for (var i = 0; i < knownProperties.length; i++) { |
58 | | -knownPropertyIndices.push(i); |
59 | | -var key = knownProperties[i]; |
60 | | -knownPropertyOrder[key] = schemas.propertySchemas(key).displayOrder(); |
61 | | -} |
62 | | -knownPropertyIndices.sort(function (indexA, indexB) { |
63 | | -var keyA = knownProperties[indexA]; |
64 | | -var keyB = knownProperties[indexB]; |
65 | | -if (knownPropertyOrder[keyA] == null) { |
66 | | -if (knownPropertyOrder[keyB] == null) { |
67 | | -return indexA - indexB; |
68 | | -} |
69 | | -return 1; |
70 | | -} else if (knownPropertyOrder[keyB] == null) { |
71 | | -return -1; |
72 | | -} |
73 | | -return knownPropertyOrder[keyA] - knownPropertyOrder[keyB]; |
74 | | -}); |
75 | | -// Iterate over the potential properties |
76 | | -for (var i = 0; i < knownPropertyIndices.length; i++) { |
77 | | -var key = knownProperties[knownPropertyIndices[i]]; |
78 | | - if (!schemas.propertySchemas(key).hidden()){ |
| 44 | + // If the data might be an object, add columns for its links/properties |
| 45 | + if (basicTypes.indexOf('object') != -1 && depthRemaining > 0) { |
| 46 | + if (data.readOnly()) { |
| 47 | + var links = schemas.links(); |
| 48 | + for (var i = 0; i < links.length; i++) { |
| 49 | + var link = links[i]; |
| 50 | + addColumnsFromLink(link, i); |
| 51 | + } |
| 52 | + } |
| 53 | + var knownProperties = schemas.knownProperties(); |
| 54 | + var knownPropertyIndices = []; |
| 55 | + // Sort object properties by displayOrder |
| 56 | + var knownPropertyOrder = {}; |
| 57 | + for (var i = 0; i < knownProperties.length; i++) { |
| 58 | + knownPropertyIndices.push(i); |
| 59 | + var key = knownProperties[i]; |
| 60 | + knownPropertyOrder[key] = schemas.propertySchemas(key).displayOrder(); |
| 61 | + } |
| 62 | + knownPropertyIndices.sort(function (indexA, indexB) { |
| 63 | + var keyA = knownProperties[indexA]; |
| 64 | + var keyB = knownProperties[indexB]; |
| 65 | + if (knownPropertyOrder[keyA] == null) { |
| 66 | + if (knownPropertyOrder[keyB] == null) { |
| 67 | + return indexA - indexB; |
| 68 | + } |
| 69 | + return 1; |
| 70 | + } else if (knownPropertyOrder[keyB] == null) { |
| 71 | + return -1; |
| 72 | + } |
| 73 | + return knownPropertyOrder[keyA] - knownPropertyOrder[keyB]; |
| 74 | + }); |
| 75 | + // Iterate over the potential properties |
| 76 | + for (var i = 0; i < knownPropertyIndices.length; i++) { |
| 77 | + var key = knownProperties[knownPropertyIndices[i]]; |
| 78 | + if (!schemas.propertySchemas(key).hidden()) { |
79 | 79 | addColumnsFromSchemas(schemas.propertySchemas(key), pathPrefix + Jsonary.joinPointer([key]), depthRemaining - 1); |
80 | 80 | } |
81 | | -} |
82 | | -} |
83 | | -} |
| 81 | + } |
| 82 | + } |
| 83 | + } |
84 | 84 |
|
85 | | -function addColumnsFromLink(linkDefinition, index) { |
86 | | -var columnName = "link$" + index + "$" + linkDefinition.rel(); |
| 85 | + function addColumnsFromLink(linkDefinition, index) { |
| 86 | + var columnName = "link$" + index + "$" + linkDefinition.rel(); |
87 | 87 |
|
88 | | -var columnTitle = Jsonary.escapeHtml(linkDefinition.data.property("title").value()|| linkDefinition.rel()); |
89 | | -var linkText = columnTitle; |
90 | | -var activeText = null, isConfirm = true; |
91 | | -if (linkDefinition.rel() == 'edit') { |
92 | | -activeText = 'save'; |
93 | | -} |
| 88 | + var columnTitle = Jsonary.escapeHtml(linkDefinition.data.property("title").value() || linkDefinition.rel()); |
| 89 | + var linkText = columnTitle; |
| 90 | + var activeText = null, isConfirm = true; |
| 91 | + if (linkDefinition.rel() == 'edit') { |
| 92 | + activeText = 'save'; |
| 93 | + } |
94 | 94 |
|
95 | | -renderer.addLinkColumn(linkDefinition, linkDefinition.rel(), columnTitle, linkText, activeText, isConfirm); |
96 | | -} |
| 95 | + renderer.addLinkColumn(linkDefinition, linkDefinition.rel(), columnTitle, linkText, activeText, isConfirm); |
| 96 | + } |
97 | 97 |
|
98 | | -var itemSchemas = data.schemas().indexSchemas(0).getFull(); |
99 | | -var recursionLimit = (itemSchemas.knownProperties().length >= 8) ? 0 : 1; |
100 | | -if (data.schemas().displayAsTable()) { |
101 | | -recursionLimit = 2; |
102 | | -} |
103 | | -addColumnsFromSchemas(itemSchemas, '', recursionLimit); |
104 | | -return renderer; |
105 | | -}, |
106 | | -filter: function (data, schemas) { |
107 | | -if (data.basicType() == "array") { |
108 | | -if (schemas.displayAsTable()) { |
109 | | -return true; |
110 | | -} |
111 | | -// Array full of objects |
112 | | -if (!schemas.tupleTyping()) { |
113 | | -var indexSchemas = schemas.indexSchemas(0).getFull(); |
114 | | -var itemTypes = indexSchemas.basicTypes(); |
115 | | -if (itemTypes.length == 1 && itemTypes[0] == "object") { |
116 | | -if (indexSchemas.additionalPropertySchemas().length > 0) { |
117 | | -return false; |
118 | | -} |
119 | | -if (indexSchemas.knownProperties().length < 20) { |
120 | | -return true; |
121 | | -} |
122 | | -} |
123 | | -} |
124 | | -} |
125 | | -return false; |
126 | | -} |
| 98 | + var itemSchemas = data.schemas().indexSchemas(0).getFull(); |
| 99 | + var recursionLimit = (itemSchemas.knownProperties().length >= 8) ? 0 : 1; |
| 100 | + if (data.schemas().displayAsTable()) { |
| 101 | + recursionLimit = 2; |
| 102 | + } |
| 103 | + addColumnsFromSchemas(itemSchemas, '', recursionLimit); |
| 104 | + return renderer; |
| 105 | + }, |
| 106 | + filter: function (data, schemas) { |
| 107 | + if (data.basicType() == "array") { |
| 108 | + if (schemas.displayAsTable()) { |
| 109 | + return true; |
| 110 | + } |
| 111 | + // Array full of objects |
| 112 | + if (!schemas.tupleTyping()) { |
| 113 | + var indexSchemas = schemas.indexSchemas(0).getFull(); |
| 114 | + var itemTypes = indexSchemas.basicTypes(); |
| 115 | + if (itemTypes.length == 1 && itemTypes[0] == "object") { |
| 116 | + if (indexSchemas.additionalPropertySchemas().length > 0) { |
| 117 | + return false; |
| 118 | + } |
| 119 | + if (indexSchemas.knownProperties().length < 20) { |
| 120 | + return true; |
| 121 | + } |
| 122 | + } |
| 123 | + } |
| 124 | + } |
| 125 | + return false; |
| 126 | + } |
127 | 127 | })); |
128 | 128 |
|
129 | 129 | // Display-order extension (non-standard keyword) |
130 | 130 | Jsonary.extendSchema({ |
131 | | -displayOrder: function () { |
132 | | -return this.data.propertyValue("displayOrder"); |
133 | | -} |
| 131 | + displayOrder: function () { |
| 132 | + return this.data.propertyValue("displayOrder"); |
| 133 | + } |
134 | 134 | }); |
135 | 135 | Jsonary.extendSchemaList({ |
136 | | -displayOrder: function () { |
137 | | -var displayOrder = null; |
138 | | -this.each(function (index, schema) { |
139 | | -var value = schema.displayOrder(); |
140 | | -if (value != null && (displayOrder == null || value < displayOrder)) { |
141 | | -displayOrder = value; |
142 | | -} |
143 | | -}); |
144 | | -return displayOrder; |
145 | | -} |
| 136 | + displayOrder: function () { |
| 137 | + var displayOrder = null; |
| 138 | + this.each(function (index, schema) { |
| 139 | + var value = schema.displayOrder(); |
| 140 | + if (value != null && (displayOrder == null || value < displayOrder)) { |
| 141 | + displayOrder = value; |
| 142 | + } |
| 143 | + }); |
| 144 | + return displayOrder; |
| 145 | + } |
146 | 146 | }); |
147 | 147 |
|
148 | 148 | // displayAsTable extension (non-standard keyword, suggested by Ognian) |
149 | 149 | Jsonary.extendSchema({ |
150 | | -displayAsTable: function () { |
151 | | -return !!this.data.propertyValue("displayAsTable"); |
152 | | -} |
| 150 | + displayAsTable: function () { |
| 151 | + return !!this.data.propertyValue("displayAsTable"); |
| 152 | + } |
153 | 153 | }); |
154 | 154 | Jsonary.extendSchemaList({ |
155 | | -displayAsTable: function () { |
156 | | -var displayAsTable = false; |
157 | | -this.each(function (index, schema) { |
158 | | -displayAsTable = displayAsTable || schema.displayAsTable(); |
159 | | -}); |
160 | | -return displayAsTable; |
161 | | -} |
| 155 | + displayAsTable: function () { |
| 156 | + var displayAsTable = false; |
| 157 | + this.each(function (index, schema) { |
| 158 | + displayAsTable = displayAsTable || schema.displayAsTable(); |
| 159 | + }); |
| 160 | + return displayAsTable; |
| 161 | + } |
162 | 162 | }); |
163 | 163 |
|
164 | 164 | // hidden extension (non-standard keyword, suggested by Ognian) |
|
0 commit comments