debug.js 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. // use this to isolate the scope
  2. (function () {
  3. if(!$axure.document.configuration.showConsole) { return; }
  4. $(document).ready(function () {
  5. var pluginInfo = {
  6. id: 'debugHost',
  7. context: 'inspect',
  8. title: 'Interaction Console',
  9. gid: 3
  10. };
  11. var pluginStarted = false;
  12. var showEmptyState = true;
  13. $axure.player.createPluginHost(pluginInfo);
  14. var prevElId = 'p';
  15. var currentElId = 'c';
  16. generateDebug();
  17. $('#variablesClearLink').click(clearvars_click);
  18. $('#traceClear').click(cleartrace_click);
  19. $('#traceToggle').click(stoptrace_click);
  20. $('#closeConsole').click(close);
  21. var currentStack= [];
  22. var finishedStack = [];
  23. $axure.messageCenter.addMessageListener(function (message, data) {
  24. if(message == 'axCompositeEventMessage') {
  25. for(var i = 0; i < data.length; i++) {
  26. processMessages(data[i].message, data[i].data);
  27. }
  28. } else processMessages(message, data);
  29. });
  30. var processMessages = function (message, data) {
  31. if(message == 'openPlugin') {
  32. if(data == pluginInfo.id && !pluginStarted) {
  33. starttrace();
  34. }
  35. } else if(message == 'globalVariableValues') {
  36. $('#variablesDiv').empty();
  37. for(var key in data) {
  38. var value = data[key] == '' ? '(blank)' : data[key];
  39. $('#variablesDiv').append('<div class="variableList"><div class="variableName">' + key + '</div><div class="variableValue">' + value + '</div></div>');
  40. }
  41. } else if(message == 'axEvent') {
  42. hideEmptyState();
  43. prevElId = currentElId;
  44. currentElId = data.elementId;
  45. var addToStack = "<div class='axEventBlock'>";
  46. addToStack += "<div class='axEventContainer'>";
  47. addToStack += " <div class='axTime'>" + new Date().toLocaleTimeString() + "</div>";
  48. addToStack += " <div class='axLabel'>" + data.label + " (" + data.type + ")</div>";
  49. addToStack += " <div class='axEvent'>" + data.event.description + "</div>";
  50. addToStack += "</div></div>";
  51. currentStack.push($(addToStack));
  52. } else if (message == 'axEventComplete') {
  53. handleNoCondition()
  54. if (tryAddGroupCounter()) {
  55. currentStack.pop();
  56. return;
  57. }
  58. finishedStack.push(currentStack.pop());
  59. if(currentStack.length == 0) {
  60. for(var i = finishedStack.length - 1; i >= 0; i--) {
  61. if($('#traceDiv').children().length > 99) $('#traceDiv').children().last().remove();
  62. $('#traceDiv').prepend(finishedStack[i]);
  63. }
  64. finishedStack = [];
  65. }
  66. } else if (message == 'axCase') {
  67. var addToStack = "<div class='axCaseContainer'>";
  68. addToStack += " <div class='axCaseItem'>" + data.item + "</div>";
  69. if (data.description) { addToStack += " <div class='axCaseDescription' title='" + data.description + "'>" + data.description + "</div>" };
  70. addToStack += "</div>";
  71. currentStack[currentStack.length - 1].append($(addToStack));
  72. } else if (message == 'axAction') {
  73. var addToStack = "<div class='axActionContainer'>";
  74. addToStack += " <div class='axActionItem'>" + data.name + "</div>";
  75. addToStack += "</div>";
  76. currentStack[currentStack.length - 1].append($(addToStack));
  77. } else if (message == 'axInfo') {
  78. var addToStack = "<div class='axInfoContainer'>";
  79. addToStack += " <div class='axInfoItem'>" + data.item + "</div>";
  80. if (data.description) { addToStack += " <div class='axInfoDescription' title='" + data.longDescription + "'>" + data.description + "</div>" };
  81. addToStack += "</div>";
  82. currentStack[currentStack.length - 1].append($(addToStack));
  83. }
  84. }
  85. // bind to the page load
  86. $axure.page.bind('load.debug', function () {
  87. var traceStr = $axure.player.getHashStringVar(TRACE_VAR_NAME);
  88. if (!traceStr) $axure.messageCenter.setState("isTracing", false);
  89. else if (traceStr == 1) starttrace();
  90. else if (traceStr == 0) stoptrace_click();
  91. $axure.messageCenter.postMessage('getGlobalVariables', '');
  92. return false;
  93. });
  94. function handleNoCondition() {
  95. var event = currentStack[currentStack.length - 1];
  96. var action = event.find('.axActionContainer');
  97. if (action.length == 0) {
  98. event.append($("<div class='axActionContainer'><span>No condition met</span></div></div>"));
  99. }
  100. }
  101. function compareEventBlocks(first, second) {
  102. if(currentElId !== prevElId) return false;
  103. var firstClone = first.clone();
  104. var secondClone = second.clone();
  105. firstClone.find('.axTime').remove();
  106. secondClone.find('.axTime').remove();
  107. firstClone.find('.axEventCounter').remove();
  108. secondClone.find('.axEventCounter').remove();
  109. return firstClone.html() === secondClone.html();
  110. }
  111. function tryAddGroupCounter() {
  112. var prevEvent;
  113. if(finishedStack.length == 0 && currentStack.length == 1) {
  114. prevEvent = $('#traceDiv').find('.axEventBlock').first();
  115. if(prevEvent.length == 0) return false;
  116. } else if(finishedStack.length > 0) {
  117. prevEvent = finishedStack[finishedStack.length - 1];
  118. } else {
  119. return false;
  120. }
  121. var currentEvent = currentStack[currentStack.length - 1];
  122. if(compareEventBlocks(prevEvent, currentEvent)) {
  123. var prevLabel = prevEvent.find('.axLabel');
  124. var counterBlock = prevLabel.find('.axEventCounter');
  125. prevEvent.find('.axTime').text(currentEvent.find('.axTime').text());
  126. if(counterBlock.length == 0) {
  127. var eventCounter = "<span class='axEventCounter'>2</span>";
  128. prevLabel.append($(eventCounter));
  129. return true;
  130. }
  131. var count = counterBlock.text();
  132. if(isNaN(count)) return true;
  133. if(count > 8) counterBlock.text('9+');
  134. else counterBlock.text(+count + 1);
  135. return true;
  136. }
  137. return false;
  138. }
  139. function clearvars_click(event) {
  140. $axure.messageCenter.postMessage('resetGlobalVariables', '');
  141. }
  142. function close() {
  143. $axure.player.pluginClose("debugHost");
  144. }
  145. function cleartrace_click(event) {
  146. $('#traceDiv').html('');
  147. clearLastEventState();
  148. }
  149. function clearLastEventState() {
  150. lastEventId = '';
  151. sameLastEvent = false;
  152. lastCaseName = '';
  153. }
  154. function starttrace() {
  155. $axure.messageCenter.setState("isTracing", true);
  156. console.log("starting trace");
  157. $axure.player.setVarInCurrentUrlHash(TRACE_VAR_NAME, 1);
  158. pluginStarted = true;
  159. if (!$axure.document.configuration.isAxshare) {
  160. $.get("consoleShown");
  161. }
  162. }
  163. function hideEmptyState() {
  164. if(showEmptyState) {
  165. $('#traceEmptyState').hide();
  166. showEmptyState = false;
  167. }
  168. }
  169. function restarttrace_click(event) {
  170. $('#traceToggle').text('Stop Trace');
  171. $('#traceToggle').off("click");
  172. $('#traceToggle').click(stoptrace_click);
  173. starttrace();
  174. clearLastEventState();
  175. }
  176. function stoptrace_click(event) {
  177. $axure.messageCenter.setState("isTracing", false);
  178. $('#traceDiv').prepend('<div class="tracePausedNotification">Trace Paused<div>');
  179. $('#traceToggle').text('Restart Trace');
  180. $('#traceToggle').off("click");
  181. $('#traceToggle').click(restarttrace_click);
  182. console.log("stopping trace");
  183. $axure.player.setVarInCurrentUrlHash(TRACE_VAR_NAME, 0);
  184. pluginStarted = true;
  185. }
  186. });
  187. function generateDebug() {
  188. var pageNotesUi = "<div id='debugHeader'>";
  189. pageNotesUi += "<div id='debugToolbar'>";
  190. pageNotesUi += "<div id='consoleTitle' class='pluginNameHeader'>Console</div>";
  191. pageNotesUi += "</div>";
  192. pageNotesUi += "</div>";
  193. pageNotesUi += "<div id='variablesContainer' style='max-height:300px; overflow-y:auto'>";
  194. pageNotesUi += "<div id='variablesTitle' class='sectionTitle'>Variables</div>";
  195. pageNotesUi += "<a id='variablesClearLink' class='traceOption'>Reset Variables</a>";
  196. pageNotesUi += "<div id='variablesDiv'></div></div>";
  197. pageNotesUi += "<div class='lineDivider'></div>";
  198. pageNotesUi += "<div id='traceContainer'>";
  199. pageNotesUi += "<div id='traceHeader'>";
  200. pageNotesUi += "<span class='sectionTitle'>Trace</span><a id='traceClear' class='traceOption'>Clear Trace</a><a id='traceToggle' class='traceOption'>Stop Trace</a>";
  201. pageNotesUi += "</div>";
  202. pageNotesUi += "</div>";
  203. pageNotesUi += "<div id='debugScrollContainer'>";
  204. pageNotesUi += "<div id='debugContainer'>";
  205. pageNotesUi += "<div id='traceEmptyState'>Interactions will be recorded here as you click through the prototype.</div>";
  206. pageNotesUi += "<div id='traceDiv'></div></div>";
  207. pageNotesUi += "</div></div>";
  208. $('#debugHost').append(pageNotesUi);
  209. }
  210. })();