closes #3112
[arvados.git] / apps / workbench / app / assets / javascripts / event_log.js
index 243f733619525840fa2772e161b7cc87e1ca6e24..8bfa1b067252086defb578adefa129c9a31998d0 100644 (file)
@@ -1,87 +1,54 @@
 /*
- * This file establishes a websockets connection with the API Server.
- *
- * The subscribe method takes a window element id and object id. Any log
- * events for that particular object id are added to that window element.
+ * This js establishes a websockets connection with the API Server.
  */
 
-var event_log_disp;
-
-function subscribeToEventLog (url, uuid, elementId) {
-  // if websockets are not supported by browser, do not attempt to subscribe for events
+/* Subscribe to websockets event log.  Do nothing if already connected. */
+function subscribeToEventLog () {
+  // if websockets are not supported by browser, do not subscribe for events
   websocketsSupported = ('WebSocket' in window);
   if (websocketsSupported == false) {
-    return;  
+    return;
   }
 
-  // grab websocket connection from window, if one exists
+  // check if websocket connection is already stored on the window
   event_log_disp = $(window).data("arv-websocket");
   if (event_log_disp == null) {
-    // create the event log dispatcher
-    event_log_disp = new WebSocket(url);
+    // need to create new websocket and event log dispatcher
+    websocket_url = $('meta[name=arv-websocket-url]').attr("content");
+    if (websocket_url == null)
+      return;
+
+    event_log_disp = new WebSocket(websocket_url);
 
-    event_log_disp.onopen = function(event) { onEventLogDispatcherOpen(event) };
-    event_log_disp.onmessage = function(event) { onEventLogDispatcherMessage(event) };
+    event_log_disp.onopen = onEventLogDispatcherOpen;
+    event_log_disp.onmessage = onEventLogDispatcherMessage;
 
     // store websocket in window to allow reuse when multiple divs subscribe for events
     $(window).data("arv-websocket", event_log_disp);
-
-    // detach elementId when user leaves this window
-    window.onbeforeunload = function (event) {detachElement(event, elementId);}
   }
-
-  // Add the elementId to listener map
-  event_log_listener_map = JSON.parse(sessionStorage.getItem("event_log_listener_map"));
-  if (event_log_listener_map == null)
-    event_log_listener_map = {};
-  delete event_log_listener_map[elementId];
-  event_log_listener_map[elementId] = uuid;
-
-  sessionStorage.removeItem("event_log_listener_map");
-  sessionStorage.setItem("event_log_listener_map", JSON.stringify(event_log_listener_map));
 }
 
+/* Send subscribe message to the websockets server.  Without any filters
+   arguments, this subscribes to all events */
 function onEventLogDispatcherOpen(event) {
-  event_log_disp.send('{"method":"subscribe"}');
+  this.send('{"method":"subscribe"}');
 }
 
-// Check each of the entries in the listener map. If any are waiting for
-// an event of this event's object, append to their registered element
+/* Trigger event for all applicable elements waiting for this event */
 function onEventLogDispatcherMessage(event) {
-  event_log_listener_map = JSON.parse(sessionStorage.getItem("event_log_listener_map"));
-
-  for (var key in event_log_listener_map) {
-    value = event_log_listener_map[key];
+  parsedData = JSON.parse(event.data);
+  object_uuid = parsedData.object_uuid;
 
-    new_properties = "";
-    eventData = JSON.parse(event.data);
-    if (value === eventData.object_uuid) {
-      properties = eventData.properties;
-      if (properties !== null) {
-        new_attributes = properties.new_attributes;
-        if (new_attributes !== null) {
-          new_properties = JSON.stringify(properties.new_attributes);
-        }
-      }
-
-      // append to the registered element
-      $('#'+key).append(eventData.summary + " " + new_properties + "
");
-    }
-  }
+  // if there are any listeners for this object uuid or "all", trigger the event
+  matches = ".arv-log-event-listener[data-object-uuid=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuids~=\"" + object_uuid + "\"],.arv-log-event-listener[data-object-uuid=\"all\"],.arv-log-event-listener[data-object-kind=\"" + parsedData.object_kind + "\"]";
+  $(matches).trigger('arv-log-event', event.data);
 }
 
-/**
- * When leaving this window, remove elementId from map
- */
-function detachElement(event, elementId) {
-  event_log_listener_map = JSON.parse(sessionStorage.getItem("event_log_listener_map"));
-  if (event_log_listener_map !== null) {
-    delete event_log_listener_map[elementId];
-  }
-
-  // According to documenation, browser will close the connection when page is left.
-  // However, there are suggestions of inconsistency; so to be safe, close explicitly.
-  if (event_log_disp !== null) {
-    event_log_disp.close();
+/* Automatically connect if there are any elements on the page that want to
+   received event log events. */
+$(document).on('ajax:complete ready', function() {
+  var a = $('.arv-log-event-listener');
+  if (a.length > 0) {
+    subscribeToEventLog();
   }
-}
+});