WfsJsRequestPanel.php.updateResponseView.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. var DBG = 0;
  2. var NODE_ID_TREE_VIEW_FROM_TEXT = NODE_ID_TREE_VIEW_FROM_TEXT || null // 'NODE_ID_TREE_VIEW_FROM_TEXT' => "wfsResponseTreeView",
  3. var NODE_ID_TREE_VIEW_FROM_JSON = NODE_ID_TREE_VIEW_FROM_JSON || null // 'NODE_ID_TREE_VIEW_FROM_JSON' => "jsonResponseTreeView",
  4. // 'NODE_ID_WFS_RESPONSE' => "wfsResponse",
  5. // 'JS_FUNCTION_UPDATE_RESPONSE' => "updateWfsResponse"
  6. // 'JS_FUNCTION_GET_SELECTED_FORMAT' => "getWfsResponseFormat"
  7. // Object.prototype.toString.call([]) // "[object Array]"
  8. // Object.prototype.toString.call('') // "[object String]"
  9. // Object.prototype.toString.call({}) // "[object Object]"
  10. // Object.prototype.toString.call(null) // "[object Null]"
  11. // Object.prototype.toString.call() // "[object Undefined]"
  12. function p5Utils_isString(arg) { return '[object String]' === Object.prototype.toString.call(arg); }
  13. function p5Utils_isArray(arg) { return '[object Array]' === Object.prototype.toString.call(arg); }
  14. function p5Utils_isObject(arg) { return '[object Object]' === Object.prototype.toString.call(arg); }
  15. // private var - global for this file
  16. var _RESPONSE_DATA = null
  17. function updateResponse(values) {
  18. if ('undefined' !== typeof values) _RESPONSE_DATA = values
  19. var responseFormat = global[JS_FUNCTION_GET_SELECTED_FORMAT]() // json, text
  20. console.warn('format: '+responseFormat+', _RESPONSE_DATA: '+_RESPONSE_DATA)
  21. document.getElementById(NODE_ID_WFS_RESPONSE).innerHTML = (p5Utils_isString(_RESPONSE_DATA)) ? _RESPONSE_DATA : JSON.stringify(_RESPONSE_DATA, null, 2)
  22. if (NODE_ID_TREE_VIEW_FROM_JSON) {
  23. var treeViewNode = document.getElementById(NODE_ID_TREE_VIEW_FROM_JSON)
  24. if (treeViewNode) treeViewNode.parentNode.removeChild(treeViewNode)
  25. }
  26. if (NODE_ID_TREE_VIEW_FROM_JSON) {
  27. var treeViewNode = document.getElementById(NODE_ID_TREE_VIEW_FROM_JSON)
  28. if (treeViewNode) treeViewNode.parentNode.removeChild(treeViewNode)
  29. }
  30. if (NODE_ID_TREE_VIEW_FROM_JSON) {
  31. if ('json' === responseFormat) {
  32. document.getElementById(NODE_ID_WFS_RESPONSE).style.display = 'none'
  33. if (!document.getElementById(NODE_ID_TREE_VIEW_FROM_JSON)) {
  34. var respTxtNode = document.getElementById(NODE_ID_WFS_RESPONSE)
  35. var treeViewNode = document.createElement('div')
  36. treeViewNode.id = NODE_ID_TREE_VIEW_FROM_JSON
  37. treeViewNode.style.margin = '0'
  38. treeViewNode.style.padding = '9.5px'
  39. treeViewNode.style.border = '1px solid #ccc'
  40. treeViewNode.style.color = '#333'
  41. treeViewNode.style.backgroundColor = '#f5f5f5'
  42. treeViewNode.style.fontFamily = 'monospace'
  43. treeViewNode.style.fontSize = 'x-small'
  44. treeViewNode.style.lineHeight = '1.42857143'
  45. treeViewNode.style.wordBreak = 'break-all'
  46. treeViewNode.style.wordWrap = 'break-word'
  47. respTxtNode.parentNode.insertBefore(treeViewNode, respTxtNode.nextSibling);
  48. // var jsonResponse = document.getElementById(NODE_ID_WFS_RESPONSE).data_jsonResponse
  49. // if (jsonResponse) {
  50. // parseJsonToTreeViewRec(jsonResponse, treeViewNode)
  51. // }
  52. parseJsonToTreeViewRec( _RESPONSE_DATA ? _RESPONSE_DATA : 'TODO:xxx' , treeViewNode)
  53. }
  54. document.getElementById(NODE_ID_TREE_VIEW_FROM_JSON).style.display = 'block'
  55. } else { // 'text' === responseFormat
  56. var treeViewNode = document.getElementById(NODE_ID_TREE_VIEW_FROM_JSON)
  57. if (treeViewNode) treeViewNode.parentNode.removeChild(treeViewNode)
  58. document.getElementById(NODE_ID_WFS_RESPONSE).style.display = 'block'
  59. }
  60. }
  61. if (NODE_ID_TREE_VIEW_FROM_TEXT) {
  62. if ('json' === responseFormat) {
  63. document.getElementById(NODE_ID_WFS_RESPONSE).style.display = 'none'
  64. if (!document.getElementById(NODE_ID_TREE_VIEW_FROM_TEXT)) {
  65. var respTxtNode = document.getElementById(NODE_ID_WFS_RESPONSE)
  66. var treeViewNode = document.createElement('div')
  67. treeViewNode.id = NODE_ID_TREE_VIEW_FROM_TEXT
  68. treeViewNode.style.margin = '0'
  69. treeViewNode.style.padding = '9.5px'
  70. treeViewNode.style.border = '1px solid #ccc'
  71. treeViewNode.style.color = '#333'
  72. treeViewNode.style.backgroundColor = '#f5f5f5'
  73. treeViewNode.style.fontFamily = 'monospace'
  74. treeViewNode.style.fontSize = 'x-small'
  75. treeViewNode.style.lineHeight = '1.42857143'
  76. treeViewNode.style.wordBreak = 'break-all'
  77. treeViewNode.style.wordWrap = 'break-word'
  78. treeViewNode.innerHTML = parseJsonTextToTreeView(respTxtNode.innerHTML)
  79. respTxtNode.parentNode.insertBefore(treeViewNode, respTxtNode.nextSibling);
  80. }
  81. document.getElementById(NODE_ID_TREE_VIEW_FROM_TEXT).style.display = 'block'
  82. } else { // 'text' === responseFormat
  83. var treeViewNode = document.getElementById(NODE_ID_TREE_VIEW_FROM_TEXT)
  84. if (treeViewNode) treeViewNode.parentNode.removeChild(treeViewNode)
  85. document.getElementById(NODE_ID_WFS_RESPONSE).style.display = 'block'
  86. }
  87. }
  88. }
  89. function shortValue(str, limit) {
  90. var limit = limit || 100;
  91. return (str.length > limit) ? str.substr(0, limit)+'...' : str;
  92. }
  93. function parseJsonToTreeViewRec(json, node, xpath, name) {
  94. var name = name || '';
  95. var xpath = xpath || '/root';
  96. if(DBG)console.warn('DBG::parseJsonToTreeViewRec(json, node, "'+xpath+'", "'+name+'")', { isString: p5Utils_isString(json), 'isArray': p5Utils_isArray(json), 'isObject': p5Utils_isObject(json), json: json, node: node });
  97. if (p5Utils_isArray(json)) {
  98. var details = document.createElement('details')
  99. details.setAttribute('title', 'xpath: '+xpath)
  100. if ('/root' === xpath) details.setAttribute('open', 'open')
  101. node.appendChild(details)
  102. var summary = document.createElement('summary');
  103. details.appendChild(summary)
  104. summary.style.outline = 'none'
  105. summary.style.cursor = 'pointer'
  106. summary.appendChild(document.createTextNode( ( name ? '"'+name+'": ' : '' ) + '['))
  107. var div = document.createElement('div')
  108. div.style.paddingLeft = '20px'
  109. details.appendChild(div)
  110. json.forEach(function (subJson, idx) {
  111. parseJsonToTreeViewRec(subJson, div, xpath+'['+idx+']')
  112. })
  113. } else if (p5Utils_isObject(json)) {
  114. var details = document.createElement('details')
  115. details.setAttribute('title', 'xpath: '+xpath)
  116. if ('/root' === xpath) details.setAttribute('open', 'open')
  117. node.appendChild(details)
  118. var summary = document.createElement('summary');
  119. details.appendChild(summary)
  120. summary.style.outline = 'none'
  121. summary.style.cursor = 'pointer'
  122. summary.appendChild(document.createTextNode( ( name ? '"'+name+'": ' : '' ) + '{'))
  123. var div = document.createElement('div')
  124. div.style.paddingLeft = '20px'
  125. details.appendChild(div)
  126. Object.keys(json).forEach(function (fieldName) {
  127. parseJsonToTreeViewRec(json[fieldName], div, xpath+'/'+fieldName, fieldName)
  128. })
  129. } else if (p5Utils_isString(json)) {
  130. var div = document.createElement('div')
  131. div.style.paddingLeft = '11px'
  132. div.setAttribute('title', 'xpath: '+xpath+( name ? '/'+name : '' ))
  133. node.appendChild(div)
  134. div.appendChild(document.createTextNode( name ? '"'+name+'": "'+shortValue(json, 100)+'",' : '"'+json+'",' ));
  135. } else {
  136. if(DBG)console.warn('TODO: Not implemented - parseJsonToTreeViewRec(json, node)', { isString: p5Utils_isString(json), 'isArray': p5Utils_isArray(json), 'isObject': p5Utils_isObject(json), json: json });
  137. }
  138. }
  139. function p5WFS_ParseXlink(name) {
  140. if (!name || !name.length) return false;
  141. var splitName = name.split('#')
  142. if (2 !== splitName.length) return false;
  143. var splitFeatureID = splitName[1].split('.')
  144. if (2 !== splitFeatureID.length) return false;
  145. return {
  146. namespace: splitName[0],
  147. featureID: splitName[1],
  148. featureName: splitFeatureID[0],
  149. primaryKey: splitFeatureID[1],
  150. }
  151. }
  152. function parseJsonTextToTreeView(txtJson) {
  153. var out = ''
  154. var jsonLines = txtJson.split('\n').map(function (line) {
  155. var whiteSpacePrefix = line.match(/^\s*/)[0].length
  156. return [ whiteSpacePrefix, line.substr(whiteSpacePrefix) ]
  157. })
  158. if(DBG)console.table(jsonLines)
  159. jsonLines = jsonLines.map(function (jsonLine) {
  160. if (jsonLine[1].length > 100) return [ jsonLine[0], jsonLine[1].substr(0, 100) + '..."' ]
  161. return jsonLine
  162. })
  163. return generateTreeView(jsonLines)
  164. }
  165. function generateTreeView(jsonLines) {
  166. if (!jsonLines || !jsonLines.length) return ''
  167. out = ''
  168. if(DBG)console.log('----------------- group Childrens jsonLines:', jsonLines)
  169. groupedChildrens = jsonLines.reduce(function (grouped, cur, idx) {
  170. var last = grouped.pop()
  171. if (!last) {
  172. grouped.push({ deep: cur[0], label: cur[1], childrens: [] })
  173. if(DBG)console.log('groupedChildrens::(!last)', ' cur:[ '+cur[0]+', "'+cur[1]+'" ]')
  174. } else if (cur[0] > last.deep) {
  175. last.childrens.push([ cur[0] - 2, cur[1] ])
  176. grouped.push(last)
  177. if(DBG)console.log('groupedChildrens::(deep > cur[0])', ' cur:[ '+cur[0]+', "'+cur[1]+'" ]')
  178. } else if (cur[0] === last.deep) {
  179. var isEndOfObject = ([ ']', '],', '}', '},' ].indexOf(cur[1]) > -1)
  180. if (isEndOfObject && !last.childrens.length) last.label += ' ' + cur[1];
  181. grouped.push(last)
  182. if (!isEndOfObject) grouped.push({ deep: cur[0], label: cur[1], childrens: [] })
  183. // if (!isEndOfObject) console.log('groupedChildrens::(deep === cur[0] && !isEndOfObject)', ' cur:[ '+cur[0]+', "'+cur[1]+'" ]')
  184. if(DBG)console.log('groupedChildrens::(deep === cur[0])', ' cur:[ '+cur[0]+', "'+cur[1]+'" ]')
  185. }
  186. return grouped
  187. }, [])
  188. if(DBG)console.log('groupedChildrens', groupedChildrens)
  189. return groupedChildrens.map(function (group) {
  190. return (group.childrens.length > 0)
  191. ? '<details><summary style="outline:none; cursor:pointer">' + group.label + '</summary><div style="padding:0 0 0 20px">' + generateTreeView(group.childrens) + '</div></details>'
  192. : '<div style="padding:0 0 0 11px">' + group.label + '</div>'
  193. }).join('\n')
  194. }
  195. global[JS_FUNCTION_UPDATE_RESPONSE] = updateResponse