WfsJsRequestPanel.php.updateResponseView.js 9.2 KB

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