PageSourceSearch

https://www.iglta.org/includes/public/managed/v_a2e6ae52_e071b31d/…/common/virtuals/js/custom_ui_watcher.js

js iglta.org collected 2026-10-01 11:26:59 UTC 4,640 bytes, 139 lines download raw bytes

1var watcherGlobal;
2
3define(["jquery"], function($) {
4	/*	Example usage 
5		//-- jquery example
6		watcher.add("jquery", "some-jquery-event");
7		setTimeout(function(){
8			$("body").trigger("some-jquery-event", {action: "Jquery event hing"});
9		}, 2000);
10	
11		//-- javascript example
12		watcher.add("js", "something-vanilla-js");
13		setTimeout(function(){
14			var someEvent = new CustomEvent('something-vanilla-js', {detail: {action: "Vanilla JS thing"}});
15			document.querySelector('body').dispatchEvent(someEvent);
16		}, 4000);
17
18		//-- vue example
19		watcher.add("vue", "change-page");
20		$emit('change-page', {action: 'Page Changed', totalPages: pager.totalPages});
21	*/
22	function UIWatcher(vueInstance, jqueryInstance, documentInstance, uiEvent){
23		// singleton watcherGlobal
24		var _watcherGlobal = function() {
25			if (!watcherGlobal) {
26				watcherGlobal = {};
27			}
28			return watcherGlobal;
29		};
30		// instantiate
31		_watcherGlobal();
32		
33		var watcher = watcherGlobal;
34		watcher.vue = vueInstance;
35		watcher.$ =  jqueryInstance || {};
36		watcher.doc = documentInstance || {};
37		watcher.uiEvent = uiEvent || {};
38		watcher.context = {};
39		watcher.handlers = (watcher.handlers) ? watcher.handlers : {};
40		watcher.registers = (watcher.registers) ? watcher.registers : [];
41		watcher.widgetContext = (watcher.widgetContext) ? watcher.widgetContext : {};
42		watcher.eventContext = (watcher.eventContext) ? watcher.eventContext : {};
43		var debug = (window.location.href.match(/ui_debug/) !== null);
44
45		watcher.on = function (eventName, handler) {
46			if (watcher.handlers[eventName] == undefined) watcher.handlers[eventName] = [];
47			watcher.handlers[eventName].push(handler);
48		}
49
50		watcher.add = function(type, eventName, widgetGuid, context) {
51			var widgetGuid = widgetGuid;
52			var reg = eventName+"_"+type;
53
54			setWidgetContext(eventName, widgetGuid, context);
55			if (watcher.registers.indexOf(reg) > -1) {
56				warn("already registered "+reg);
57				return;
58			}
59			watcher.registers.push(reg);
60
61			// setup global listeners based on type
62			if (type == "vue") {
63				watcher.vue.$on(eventName, function(payload){
64					trigger(eventName, widgetGuid, {event: eventName, eventContext: payload});
65				});
66			}
67			else if (type == "js") {
68				watcher.doc.addEventListener(eventName, function (event, payload) {
69				  trigger(eventName, widgetGuid, {event: eventName, eventContext: event.detail});
70				}, false);
71			}
72			else if (type == "jquery") {
73				watcher.$.on(eventName, function (event, payload) {
74					trigger(eventName, widgetGuid, {event: eventName, eventContext: payload});
75				});
76			}
77			else if (type == "ui") {
78				var eSel = "[data-ui-events-click*='eventName\": \""+eventName+"\"']";
79				$(watcher.uiEvent).off("click", eSel).on("click", eSel, function(){
80					var attrs = JSON.parse($(this).attr("data-ui-events-click"));
81					var eventName = attrs.eventName;
82					var data = attrs.data;
83					trigger(eventName, widgetGuid, {event: eventName, eventContext: data});
84				});
85			}
86		}
87		
88		/*
89		 * Function
90		 */
91		function trigger(eventName, guid, payload) {
92			var payload = payload;
93			payload.guid = guid;
94			if (watcher.handlers[eventName] == undefined) {
95				warn("No handler registered for UI event", eventName);
96				return;
97			}
98			var ctx = getWidgetContext(eventName, payload.guid);
99			var ctxPayload = {
100				widgetContext: ctx,
101				eventContext: payload.eventContext,
102				eventName: eventName
103			};
104			for (var i=0; i<watcher.handlers[eventName].length; i++){
105				watcher.handlers[eventName][i](ctxPayload);
106			}
107		}
108
109		function getWidgetContext(eventName, widgetGuid) {
110			if (!watcher.widgetContext[widgetGuid] || !watcher.widgetContext[widgetGuid][eventName]){
111				warn("No context registered for guid:"+widgetGuid + "  eventName:" +eventName);
112				return false;
113			}
114			return watcher.widgetContext[widgetGuid][eventName];
115		}
116
117		function setWidgetContext(eventName, widgetGuid, context) {
118			if (!widgetGuid) return;
119			if (watcher.widgetContext[widgetGuid] === undefined)
120				watcher.widgetContext[widgetGuid] = {};
121			if (watcher.widgetContext[widgetGuid][eventName] === undefined) {
122				watcher.widgetContext[widgetGuid][eventName] = context;
123				warn("Registered context for guid:"+widgetGuid + "  eventName:" +eventName);
124			} else {
125				warn("Already registered context for guid:"+widgetGuid + "  eventName:" +eventName);
126			}
127		}
128
129		function warn(msg, data) {
130			var data = (data) ? data : "";
131			if (debug)
132				console.warn(msg, data);
133		}
134
135		return watcher;
136	};
137
138	return UIWatcher;
139});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.