1/*! 2 * jquery.fancytree.logger.js 3 * 4 * Miscellaneous debug extensions. 5 * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/) 6 * 7 * Copyright (c) 2008-2023, Martin Wendt (https://wwWendt.de) 8 * 9 * Released under the MIT license 10 * https://github.com/mar10/fancytree/wiki/LicenseInfo 11 * 12 * @version 2.38.3 13 * @date 2023-02-01T20:52:50Z 14 */ 15 16(function (factory) { 17 if (typeof define === "function" && define.amd) { 18 // AMD. Register as an anonymous module. 19 define(["jquery", "./jquery.fancytree"], factory); 20 } else if (typeof module === "object" && module.exports) { 21 // Node/CommonJS 22 require("./jquery.fancytree"); 23 module.exports = factory(require("jquery")); 24 } else { 25 // Browser globals 26 factory(jQuery); 27 } 28})(function ($) { 29 "use strict"; 30 31 /****************************************************************************** 32 * Private functions and variables 33 */ 34 var i, 35 FT = $.ui.fancytree, 36 PREFIX = "ft-logger: ", 37 logLine = window.console.log, 38 // HOOK_NAMES = "nodeClick nodeCollapseSiblings".split(" "), 39 TREE_EVENT_NAMES = 40 "beforeRestore beforeUpdateViewport blurTree create init focusTree preInit restore updateViewport".split( 41 " " 42 ), 43 NODE_EVENT_NAMES = 44 "activate activateCell beforeActivate beforeExpand beforeSelect blur click collapse createNode dblclick deactivate defaultGridAction expand enhanceTitle focus keydown keypress lazyLoad loadChildren loadError modifyChild postProcess renderNode renderTitle select".split( 45 " " 46 ), 47 EVENT_NAMES = TREE_EVENT_NAMES.concat(NODE_EVENT_NAMES), 48 // HOOK_NAME_MAP = {}, 49 EVENT_NAME_MAP = {}; 50 51 /* 52 */ 53 // for (i = 0; i < HOOK_NAMES.length; i++) { 54 // HOOK_NAME_MAP[HOOK_NAMES[i]] = true; 55 // } 56 for (i = 0; i < EVENT_NAMES.length; i++) { 57 EVENT_NAME_MAP[EVENT_NAMES[i]] = true; 58 } 59 60 function getBrowserInfo() { 61 var n = navigator.appName, 62 ua = navigator.userAgent, 63 tem, 64 m = ua.match( 65 /(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i 66 ); 67 68 if (m && (tem = ua.match(/version\/([.\d]+)/i)) !== null) { 69 m[2] = tem[1]; 70 } 71 m = m ? [m[1], m[2]] : [n, navigator.appVersion, "-?"]; 72 return m.join(", "); 73 } 74 75 function logEvent(event, data) { 76 var res, 77 self = this, 78 // logName = PREFIX + "event." + event.type, 79 opts = data.options.logger, 80 tree = data.tree, 81 // widget = data.widget, 82 obj = data.node || tree, 83 logName = PREFIX + "event." + event.type + " (" + obj + ")"; 84 85 if ( 86 !opts.traceEvents || 87 (opts.traceEvents !== true && $.inArray(name, opts.traceEvents) < 0) 88 ) { 89 return self._super.apply(self, arguments); 90 } 91 if ( 92 (self._super && opts.timings === true) || 93 (opts.timings && $.inArray(name, opts.timings) >= 0) 94 ) { 95 // if( name === "nodeRender" ) { logName += obj; } // allow timing for recursive calls 96 // logName += " (" + obj + ")"; 97 window.console.time(logName); 98 res = self._super.apply(self, arguments); 99 window.console.timeEnd(logName); 100 } else { 101 // obj.info(logName, data); 102 logLine(logName, event, data); 103 res = self._super.apply(self, arguments); 104 } 105 return res; 106 } 107 108 function logHook(name, this_, args, extra) { 109 var res, 110 ctx = args[0], 111 opts = ctx.options.logger, 112 obj = ctx.node || ctx.tree, 113 logName = PREFIX + "hook." + name + " (" + obj + ")"; 114 115 if ( 116 !opts.traceHooks || 117 (opts.traceHooks !== true && $.inArray(name, opts.traceHooks) < 0) 118 ) { 119 return this_._superApply.call(this_, args); 120 } 121 if ( 122 opts.timings === true || 123 (opts.timings && $.inArray(name, opts.timings) >= 0) 124 ) { 125 // if( name === "nodeRender" ) { logName += obj; } // allow timing for recursive calls 126 // logName += " (" + obj + ")"; 127 window.console.time(logName); 128 res = this_._superApply.call(this_, args); 129 window.console.timeEnd(logName); 130 } else { 131 if (extra) { 132 // obj.info(logName, extra, ctx); 133 logLine(logName, extra, ctx); 134 } else { 135 // obj.info(logName, ctx); 136 logLine(logName, ctx); 137 } 138 res = this_._superApply.call(this_, args); 139 } 140 return res; 141 } 142 143 /****************************************************************************** 144 * Extension code 145 */ 146 $.ui.fancytree.registerExtension({ 147 name: "logger", 148 version: "2.38.3", 149 // Default options for this extension. 150 options: { 151 logTarget: null, // optional redirect logging to this <div> tag 152 traceEvents: true, // `true`or list of hook names 153 traceUnhandledEvents: false, 154 traceHooks: false, // `true`or list of event names 155 timings: false, // `true`or list of event names 156 }, 157 // Overide virtual methods for this extension. 158 // `this` : is this Fancytree object 159 // `this._super`: the virtual function that was overridden (member of prev. extension or Fancytree) 160 treeCreate: function (ctx) { 161 var tree = ctx.tree, 162 opts = ctx.options; 163 164 if ( 165 this.options.extensions[this.options.extensions.length - 1] !== 166 "logger" 167 ) { 168 throw Error( 169 "Fancytree 'logger' extension must be listed as last entry." 170 ); 171 } 172 tree.warn( 173 "Fancytree logger extension is enabled (this may be slow).", 174 opts.logger 175 ); 176 177 tree.debug( 178 "Fancytree v" + 179 $.ui.fancytree.version + 180 ", buildType='" + 181 $.ui.fancytree.buildType + 182 "'" 183 ); 184 tree.debug( 185 "jQuery UI " + 186 jQuery.ui.version + 187 " (uiBackCompat=" + 188 $.uiBackCompat + 189 ")" 190 ); 191 tree.debug("jQuery " + jQuery.fn.jquery); 192 tree.debug("Browser: " + getBrowserInfo()); 193 194 function _log(event, data) { 195 logLine( 196 PREFIX + "event." + event.type + " (unhandled)", 197 event, 198 data 199 ); 200 } 201 $.each(EVENT_NAMES, function (i, name) { 202 if (typeof opts[name] === "function") { 203 // tree.info(PREFIX + "override '" + name + "' event"); 204 $.ui.fancytree.overrideMethod( 205 opts, 206 name, 207 logEvent, 208 ctx.widget 209 ); 210 } else if (opts.logger.traceUnhandledEvents) { 211 opts[name] = _log; 212 } 213 }); 214 215 return logHook("treeCreate", this, arguments); 216 }, 217 nodeClick: function (ctx) { 218 return logHook( 219 "nodeClick", 220 this, 221 arguments, 222 FT.eventToString(ctx.originalEvent) 223 ); 224 }, 225 nodeCollapseSiblings: function (ctx) { 226 return logHook("nodeCollapseSiblings", this, arguments); 227 }, 228 nodeDblclick: function (ctx) { 229 return logHook("nodeDblclick", this, arguments); 230 }, 231 nodeKeydown: function (ctx) { 232 return logHook( 233 "nodeKeydown", 234 this, 235 arguments, 236 FT.eventToString(ctx.originalEvent) 237 ); 238 }, 239 nodeLoadChildren: function (ctx, source) { 240 return logHook("nodeLoadChildren", this, arguments); 241 }, 242 nodeRemoveChildMarkup: function (ctx) { 243 return logHook("nodeRemoveChildMarkup", this, arguments); 244 }, 245 nodeRemoveMarkup: function (ctx) { 246 return logHook("nodeRemoveMarkup", this, arguments); 247 }, 248 nodeRender: function (ctx, force, deep, collapsed, _recursive) { 249 return logHook("nodeRender", this, arguments); 250 }, 251 nodeRenderStatus: function (ctx) { 252 return logHook("nodeRenderStatus", this, arguments); 253 }, 254 nodeRenderTitle: function (ctx, title) { 255 return logHook("nodeRenderTitle", this, arguments); 256 }, 257 nodeSetActive: function (ctx, flag, callOpts) { 258 return logHook("nodeSetActive", this, arguments); 259 }, 260 nodeSetExpanded: function (ctx, flag, callOpts) { 261 return logHook("nodeSetExpanded", this, arguments); 262 }, 263 nodeSetFocus: function (ctx) { 264 return logHook("nodeSetFocus", this, arguments); 265 }, 266 nodeSetSelected: function (ctx, flag, callOpts) { 267 return logHook("nodeSetSelected", this, arguments); 268 }, 269 nodeSetStatus: function (ctx, status, message, details) { 270 return logHook("nodeSetStatus", this, arguments); 271 }, 272 nodeToggleExpanded: function (ctx) { 273 return logHook("nodeToggleExpanded", this, arguments); 274 }, 275 nodeToggleSelected: function (ctx) { 276 return logHook("nodeToggleSelected", this, arguments); 277 }, 278 treeClear: function (ctx) { 279 return logHook("treeClear", this, arguments); 280 }, 281 // treeCreate: function(ctx) { 282 // return logHook("treeCreate", this, arguments); 283 // }, 284 treeDestroy: function (ctx) { 285 return logHook("treeDestroy", this, arguments); 286 }, 287 treeInit: function (ctx) { 288 return logHook("treeInit", this, arguments); 289 }, 290 treeLoad: function (ctx, source) { 291 return logHook("treeLoad", this, arguments); 292 }, 293 treeRegisterNode: function (ctx, add, node) { 294 return logHook("treeRegisterNode", this, arguments); 295 }, 296 treeSetFocus: function (ctx, flag, callOpts) { 297 return logHook("treeSetFocus", this, arguments); 298 }, 299 treeSetOption: function (ctx, key, value) { 300 return logHook("treeSetOption", this, arguments); 301 }, 302 treeStructureChanged: function (ctx, type) { 303 return logHook("treeStructureChanged", this, arguments); 304 }, 305 }); 306 307 // Value returned by `require('jquery.fancytree..')` 308 return $.ui.fancytree; 309}); // End of closure 310