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