You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2017/01/20 21:19:44 UTC

[11/12] nifi git commit: [NIFI-3359] Modularize all of nifi-web-ui except canvas directory - Removing shell.jsp from summary.jsp. - This closes #1428

http://git-wip-us.apache.org/repos/asf/nifi/blob/dc934cbb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
index 006a41b..dacd8a0 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
@@ -15,34 +15,71 @@
  * limitations under the License.
  */
 
-/* global nf, Slick */
-
-/**
- * Create a property table. The options are specified in the following
- * format:
- *
- * {
- *   readOnly: true,
- *   dialogContainer: 'body',
- *   descriptorDeferred: function () {
- *      return $.Deferred(function (deferred) {
- *          deferred.resolve();
- *      }).promise;
- *   },
- *   goToServiceDeferred: function () {
- *      return $.Deferred(function (deferred) {
- *          deferred.resolve();
- *      }).promise;
- *   }
- * }
- */
+/* global define, module, require, exports */
+
+/* requires modal, combo, qtip, and nfeditor plugins to be loaded first*/
+
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['jquery',
+                'Slick',
+                'nf.Common',
+                'nf.UniversalCapture',
+                'nf.Dialog',
+                'nf.Client',
+                'nf.ErrorHandler',
+                'nf.ProcessGroupConfiguration',
+                'nf.Settings'],
+            function ($,
+                      Slick,
+                      common,
+                      universalCapture,
+                      dialog,
+                      client,
+                      errorHandler,
+                      processGroupConfiguration,
+                      settings) {
+                factory($,
+                    Slick,
+                    common,
+                    universalCapture,
+                    dialog,
+                    client,
+                    errorHandler,
+                    processGroupConfiguration,
+                    settings);
+            });
+    } else if (typeof exports === 'object' && typeof module === 'object') {
+        factory(require('jquery'),
+            require('Slick'),
+            require('nf.Common'),
+            require('nf.UniversalCapture'),
+            require('nf.Dialog'),
+            require('nf.Client'),
+            require('nf.ErrorHandler'),
+            require('nf.ProcessGroupConfiguration'),
+            require('nf.Settings'));
+    } else {
+        factory(root.$,
+            root.Slick,
+            root.nf.Common,
+            root.nf.UniversalCapture,
+            root.nf.Dialog,
+            root.nf.Client,
+            root.nf.ErrorHandler,
+            root.nf.ProcessGroupConfiguration,
+            root.nf.Settings);
+    }
+}(this, function ($,
+                  Slick,
+                  common,
+                  universalCapture,
+                  dialog,
+                  client,
+                  errorHandler,
+                  processGroupConfiguration,
+                  settings) {
 
-/**
- * jQuery plugin for a property table.
- *
- * @param {type} $
- */
-(function ($) {
     var languageId = 'nfel';
     var editorClass = languageId + '-editor';
     var groupId = null;
@@ -182,12 +219,12 @@
         this.loadValue = function (item) {
             // determine if this is a sensitive property
             var isEmptyChecked = false;
-            var sensitive = nf.Common.isSensitiveProperty(propertyDescriptor);
+            var sensitive = common.isSensitiveProperty(propertyDescriptor);
 
             // determine the value to use when populating the text field
-            if (nf.Common.isDefinedAndNotNull(item[args.column.field])) {
+            if (common.isDefinedAndNotNull(item[args.column.field])) {
                 if (sensitive) {
-                    initialValue = nf.Common.config.sensitiveText;
+                    initialValue = common.config.sensitiveText;
                 } else {
                     initialValue = item[args.column.field];
                     isEmptyChecked = initialValue === '';
@@ -204,7 +241,7 @@
                     var sensitiveInput = $(this);
                     if (sensitiveInput.hasClass('sensitive')) {
                         sensitiveInput.removeClass('sensitive');
-                        if (sensitiveInput.val() === nf.Common.config.sensitiveText) {
+                        if (sensitiveInput.val() === common.config.sensitiveText) {
                             sensitiveInput.val('');
                         }
                     }
@@ -223,8 +260,8 @@
                     return '';
                 } else {
                     // otherwise if the property is required
-                    if (nf.Common.isRequiredProperty(propertyDescriptor)) {
-                        if (nf.Common.isBlank(propertyDescriptor.defaultValue)) {
+                    if (common.isRequiredProperty(propertyDescriptor)) {
+                        if (common.isBlank(propertyDescriptor.defaultValue)) {
                             return previousValue;
                         } else {
                             return propertyDescriptor.defaultValue;
@@ -285,7 +322,7 @@
             propertyDescriptor = descriptors[args.item.property];
 
             // determine if this is a sensitive property
-            var sensitive = nf.Common.isSensitiveProperty(propertyDescriptor);
+            var sensitive = common.isSensitiveProperty(propertyDescriptor);
 
             // record the previous value
             previousValue = args.item[args.column.field];
@@ -402,12 +439,12 @@
         this.loadValue = function (item) {
             // determine if this is a sensitive property
             var isEmptyChecked = false;
-            var sensitive = nf.Common.isSensitiveProperty(propertyDescriptor);
+            var sensitive = common.isSensitiveProperty(propertyDescriptor);
 
             // determine the value to use when populating the text field
-            if (nf.Common.isDefinedAndNotNull(item[args.column.field])) {
+            if (common.isDefinedAndNotNull(item[args.column.field])) {
                 if (sensitive) {
-                    initialValue = nf.Common.config.sensitiveText;
+                    initialValue = common.config.sensitiveText;
                 } else {
                     initialValue = item[args.column.field];
                     isEmptyChecked = initialValue === '';
@@ -431,8 +468,8 @@
                     return '';
                 } else {
                     // otherwise if the property is required
-                    if (nf.Common.isRequiredProperty(propertyDescriptor)) {
-                        if (nf.Common.isBlank(propertyDescriptor.defaultValue)) {
+                    if (common.isRequiredProperty(propertyDescriptor)) {
+                        if (common.isBlank(propertyDescriptor.defaultValue)) {
                             return previousValue;
                         } else {
                             return propertyDescriptor.defaultValue;
@@ -516,7 +553,7 @@
             }).appendTo(container);
 
             // check for allowable values which will drive which editor to use
-            var allowableValues = nf.Common.getAllowableValues(propertyDescriptor);
+            var allowableValues = common.getAllowableValues(propertyDescriptor);
 
             // show the output port options
             var options = [];
@@ -534,7 +571,7 @@
                         text: allowableValue.displayName,
                         value: allowableValue.value,
                         disabled: allowableValueEntity.canRead === false && allowableValue.value !== args.item['previousValue'],
-                        description: nf.Common.escapeHtml(allowableValue.description)
+                        description: common.escapeHtml(allowableValue.description)
                     });
                 });
             }
@@ -550,7 +587,7 @@
             }
 
             // if this descriptor identifies a controller service, provide a way to create one
-            if (nf.Common.isDefinedAndNotNull(propertyDescriptor.identifiesControllerService)) {
+            if (common.isDefinedAndNotNull(propertyDescriptor.identifiesControllerService)) {
                 options.push({
                     text: 'Create new service...',
                     value: undefined,
@@ -579,7 +616,8 @@
             }).css({
                 'margin-top': '10px',
                 'margin-bottom': '10px',
-                'width': ((position.width - 16) < 212) ? 212 : (position.width - 16) + 'px'}).appendTo(wrapper);
+                'width': ((position.width - 16) < 212) ? 212 : (position.width - 16) + 'px'
+            }).appendTo(wrapper);
 
             // add buttons for handling user input
             var cancel = $('<div class="secondary-button">Cancel</div>').css({
@@ -647,13 +685,13 @@
 
         this.loadValue = function (item) {
             // select as appropriate
-            if (!nf.Common.isUndefined(item.value)) {
+            if (!common.isUndefined(item.value)) {
                 initialValue = item.value;
 
                 combo.combo('setSelectedOption', {
                     value: item.value
                 });
-            } else if (nf.Common.isDefinedAndNotNull(propertyDescriptor.defaultValue)) {
+            } else if (common.isDefinedAndNotNull(propertyDescriptor.defaultValue)) {
                 initialValue = propertyDescriptor.defaultValue;
 
                 combo.combo('setSelectedOption', {
@@ -697,20 +735,20 @@
      */
     var showPropertyValue = function (propertyGrid, descriptors, row, cell) {
         // remove any currently open detail dialogs
-        nf.UniversalCapture.removeAllPropertyDetailDialogs();
+        universalCapture.removeAllPropertyDetailDialogs();
 
         // get the property in question
         var propertyData = propertyGrid.getData();
         var property = propertyData.getItem(row);
 
         // ensure there is a value
-        if (nf.Common.isDefinedAndNotNull(property.value)) {
+        if (common.isDefinedAndNotNull(property.value)) {
 
             // get the descriptor to insert the description tooltip
             var propertyDescriptor = descriptors[property.property];
 
             // ensure we're not dealing with a sensitive property
-            if (!nf.Common.isSensitiveProperty(propertyDescriptor)) {
+            if (!common.isSensitiveProperty(propertyDescriptor)) {
 
                 // get details about the location of the cell
                 var cellNode = $(propertyGrid.getCellNode(row, cell));
@@ -731,7 +769,7 @@
                     'left': offset.left - 20
                 }).appendTo('body');
 
-                var allowableValues = nf.Common.getAllowableValues(propertyDescriptor);
+                var allowableValues = common.getAllowableValues(propertyDescriptor);
                 if ($.isArray(allowableValues)) {
                     // prevent dragging over the combo
                     wrapper.draggable({
@@ -746,7 +784,7 @@
                         options.push({
                             text: allowableValue.displayName,
                             value: allowableValue.value,
-                            description: nf.Common.escapeHtml(allowableValue.description),
+                            description: common.escapeHtml(allowableValue.description),
                             disabled: true
                         });
                     });
@@ -795,7 +833,7 @@
                     var editor = null;
 
                     // so the nfel editor is appropriate
-                    if (nf.Common.supportsEl(propertyDescriptor)) {
+                    if (common.supportsEl(propertyDescriptor)) {
                         var languageId = 'nfel';
                         var editorClass = languageId + '-editor';
 
@@ -919,41 +957,41 @@
             var options = [];
             $.each(response.controllerServiceTypes, function (i, controllerServiceType) {
                 options.push({
-                    text: nf.Common.substringAfterLast(controllerServiceType.type, '.'),
+                    text: common.substringAfterLast(controllerServiceType.type, '.'),
                     value: controllerServiceType.type,
-                    description: nf.Common.escapeHtml(controllerServiceType.description)
+                    description: common.escapeHtml(controllerServiceType.description)
                 });
             });
 
             // ensure there are some applicable controller services
             if (options.length === 0) {
-                nf.Dialog.showOkDialog({
+                dialog.showOkDialog({
                     headerText: 'Controller Service',
                     dialogContent: 'No controller service types found that are applicable for this property.'
                 });
             } else {
                 var newControllerServiceDialogMarkup =
                     '<div id="new-inline-controller-service-dialog" class="hidden dialog medium-dialog cancellable">' +
-                        '<div class="dialog-content">' +
-                            '<div>' +
-                                '<div class="setting-name">Controller Service</div>' +
-                                '<div class="setting-field">' +
-                                    '<div class="new-inline-controller-service-combo"></div>' +
-                                '</div>' +
-                            '</div>' +
-                            '<div>' +
-                                '<div class="setting-name">Tags</div>' +
-                                '<div class="setting-field">' +
-                                    '<div class="new-inline-controller-service-tags"></div>' +
-                                '</div>' +
-                            '</div>' +
-                            '<div>' +
-                                '<div class="setting-name">Description</div>' +
-                                '<div class="setting-field">' +
-                                    '<div class="new-inline-controller-service-description"></div>' +
-                                '</div>' +
-                            '</div>' +
-                        '</div>' +
+                    '<div class="dialog-content">' +
+                    '<div>' +
+                    '<div class="setting-name">Controller Service</div>' +
+                    '<div class="setting-field">' +
+                    '<div class="new-inline-controller-service-combo"></div>' +
+                    '</div>' +
+                    '</div>' +
+                    '<div>' +
+                    '<div class="setting-name">Tags</div>' +
+                    '<div class="setting-field">' +
+                    '<div class="new-inline-controller-service-tags"></div>' +
+                    '</div>' +
+                    '</div>' +
+                    '<div>' +
+                    '<div class="setting-name">Description</div>' +
+                    '<div class="setting-field">' +
+                    '<div class="new-inline-controller-service-description"></div>' +
+                    '</div>' +
+                    '</div>' +
+                    '</div>' +
                     '</div>';
 
                 var newControllerServiceDialog = $(newControllerServiceDialogMarkup).appendTo(configurationOptions.dialogContainer);
@@ -1015,7 +1053,7 @@
 
                     // build the controller service entity
                     var controllerServiceEntity = {
-                        'revision': nf.Client.getRevision({
+                        'revision': client.getRevision({
                             'revision': {
                                 'version': 0,
                             }
@@ -1027,7 +1065,7 @@
 
                     // determine the appropriate uri for creating the controller service
                     var uri = '../nifi-api/controller/controller-services';
-                    if (nf.Common.isDefinedAndNotNull(groupId)) {
+                    if (common.isDefinedAndNotNull(groupId)) {
                         uri = '../nifi-api/process-groups/' + encodeURIComponent(groupId) + '/controller-services';
                     }
 
@@ -1045,7 +1083,7 @@
 
                             // store the descriptor for use later
                             var descriptors = gridContainer.data('descriptors');
-                            if (!nf.Common.isUndefined(descriptors)) {
+                            if (!common.isUndefined(descriptors)) {
                                 descriptors[descriptor.name] = descriptor;
                             }
 
@@ -1054,7 +1092,7 @@
                             data.updateItem(item.id, $.extend(item, {
                                 value: response.component.id
                             }));
-                            
+
                             // close the dialog
                             newControllerServiceDialog.modal('hide');
                         });
@@ -1063,7 +1101,7 @@
                         if (typeof configurationOptions.controllerServiceCreatedDeferred === 'function') {
                             configurationOptions.controllerServiceCreatedDeferred(response);
                         }
-                    }).fail(nf.Common.handleAjaxError);
+                    }).fail(errorHandler.handleAjaxError);
                 };
 
                 var cancel = function () {
@@ -1072,7 +1110,7 @@
 
                 newControllerServiceDialog.modal('show');
             }
-        }).fail(nf.Common.handleAjaxError);
+        }).fail(errorHandler.handleAjaxError);
     };
 
     var initPropertiesTable = function (table, options) {
@@ -1092,8 +1130,8 @@
             var propertyDescriptor = descriptors[dataContext.property];
 
             // show the property description if applicable
-            if (nf.Common.isDefinedAndNotNull(propertyDescriptor)) {
-                if (!nf.Common.isBlank(propertyDescriptor.description) || !nf.Common.isBlank(propertyDescriptor.defaultValue) || !nf.Common.isBlank(propertyDescriptor.supportsEl)) {
+            if (common.isDefinedAndNotNull(propertyDescriptor)) {
+                if (!common.isBlank(propertyDescriptor.description) || !common.isBlank(propertyDescriptor.defaultValue) || !common.isBlank(propertyDescriptor.supportsEl)) {
                     $('<div class="fa fa-question-circle" alt="Info" style="float: right; margin-right: 6px; margin-top: 4px;"></div>').appendTo(cellContent);
                     $('<span class="hidden property-descriptor-name"></span>').text(dataContext.property).appendTo(cellContent);
                     nameWidthOffset = 46; // 10 + icon width (10) + icon margin (6) + padding (20)
@@ -1110,17 +1148,17 @@
         // function for formatting the property value
         var valueFormatter = function (row, cell, value, columnDef, dataContext) {
             var valueMarkup;
-            if (nf.Common.isDefinedAndNotNull(value)) {
+            if (common.isDefinedAndNotNull(value)) {
                 // get the property descriptor
                 var descriptors = table.data('descriptors');
                 var propertyDescriptor = descriptors[dataContext.property];
 
                 // determine if the property is sensitive
-                if (nf.Common.isSensitiveProperty(propertyDescriptor)) {
+                if (common.isSensitiveProperty(propertyDescriptor)) {
                     valueMarkup = '<span class="table-cell sensitive">Sensitive value set</span>';
                 } else {
                     // if there are allowable values, attempt to swap out for the display name
-                    var allowableValues = nf.Common.getAllowableValues(propertyDescriptor);
+                    var allowableValues = common.getAllowableValues(propertyDescriptor);
                     if ($.isArray(allowableValues)) {
                         $.each(allowableValues, function (_, allowableValueEntity) {
                             var allowableValue = allowableValueEntity.allowableValue;
@@ -1134,7 +1172,7 @@
                     if (value === '') {
                         valueMarkup = '<span class="table-cell blank">Empty string set</span>';
                     } else {
-                        valueMarkup = '<div class="table-cell value"><pre class="ellipsis">' + nf.Common.escapeHtml(value) + '</pre></div>';
+                        valueMarkup = '<div class="table-cell value"><pre class="ellipsis">' + common.escapeHtml(value) + '</pre></div>';
                     }
                 }
             } else {
@@ -1182,12 +1220,11 @@
             var descriptors = table.data('descriptors');
             var propertyDescriptor = descriptors[dataContext.property];
 
-            var identifiesControllerService = nf.Common.isDefinedAndNotNull(propertyDescriptor.identifiesControllerService);
-            var isConfigured = nf.Common.isDefinedAndNotNull(dataContext.value);
-            var isOnCanvas = nf.Common.isDefinedAndNotNull(nf.Canvas);
+            var identifiesControllerService = common.isDefinedAndNotNull(propertyDescriptor.identifiesControllerService);
+            var isConfigured = common.isDefinedAndNotNull(dataContext.value);
 
             // check to see if we should provide a button for going to a controller service
-            if (identifiesControllerService && isConfigured && isOnCanvas) {
+            if (identifiesControllerService && isConfigured && (options.supportsGoTo === true)) {
                 // ensure the configured value is referencing a valid service
                 $.each(propertyDescriptor.allowableValues, function (_, allowableValueEntity) {
                     var allowableValue = allowableValueEntity.allowableValue;
@@ -1236,7 +1273,7 @@
             var propertyDescriptor = descriptors[item.property];
 
             // support el if specified or unsure yet (likely a dynamic property)
-            if (nf.Common.isUndefinedOrNull(propertyDescriptor) || nf.Common.supportsEl(propertyDescriptor)) {
+            if (common.isUndefinedOrNull(propertyDescriptor) || common.supportsEl(propertyDescriptor)) {
                 return {
                     columns: {
                         value: {
@@ -1246,7 +1283,7 @@
                 };
             } else {
                 // check for allowable values which will drive which editor to use
-                var allowableValues = nf.Common.getAllowableValues(propertyDescriptor);
+                var allowableValues = common.getAllowableValues(propertyDescriptor);
                 if ($.isArray(allowableValues)) {
                     return {
                         columns: {
@@ -1283,37 +1320,37 @@
 
                 var controllerService = controllerServiceEntity.component;
                 $.Deferred(function (deferred) {
-                    if (nf.Common.isDefinedAndNotNull(controllerService.parentGroupId)) {
+                    if (common.isDefinedAndNotNull(controllerService.parentGroupId)) {
                         if ($('#process-group-configuration').is(':visible')) {
-                            nf.ProcessGroupConfiguration.loadConfiguration(controllerService.parentGroupId).done(function () {
+                            processGroupConfiguration.loadConfiguration(controllerService.parentGroupId).done(function () {
                                 deferred.resolve();
                             });
                         } else {
-                            nf.ProcessGroupConfiguration.showConfiguration(controllerService.parentGroupId).done(function () {
+                            processGroupConfiguration.showConfiguration(controllerService.parentGroupId).done(function () {
                                 deferred.resolve();
                             });
                         }
                     } else {
                         if ($('#settings').is(':visible')) {
                             // reload the settings
-                            nf.Settings.loadSettings().done(function () {
+                            settings.loadSettings().done(function () {
                                 deferred.resolve();
                             });
                         } else {
                             // reload the settings and show
-                            nf.Settings.showSettings().done(function () {
+                            settings.showSettings().done(function () {
                                 deferred.resolve();
                             });
                         }
                     }
                 }).done(function () {
-                    if (nf.Common.isDefinedAndNotNull(controllerService.parentGroupId)) {
-                        nf.ProcessGroupConfiguration.selectControllerService(property.value);
+                    if (common.isDefinedAndNotNull(controllerService.parentGroupId)) {
+                        processGroupConfiguration.selectControllerService(property.value);
                     } else {
-                        nf.Settings.selectControllerService(property.value);
+                        settings.selectControllerService(property.value);
                     }
                 });
-            }).fail(nf.Common.handleAjaxError);
+            }).fail(errorHandler.handleAjaxError);
         };
 
         // initialize the grid
@@ -1396,11 +1433,11 @@
                 var propertyHistory = history[property];
 
                 // format the tooltip
-                var tooltip = nf.Common.formatPropertyTooltip(propertyDescriptor, propertyHistory);
+                var tooltip = common.formatPropertyTooltip(propertyDescriptor, propertyHistory);
 
-                if (nf.Common.isDefinedAndNotNull(tooltip)) {
+                if (common.isDefinedAndNotNull(tooltip)) {
                     infoIcon.qtip($.extend({},
-                        nf.Common.config.tooltipConfig,
+                        common.config.tooltipConfig,
                         {
                             content: tooltip
                         }));
@@ -1412,7 +1449,7 @@
     var saveRow = function (table) {
         // get the property grid to commit the current edit
         var propertyGrid = table.data('gridInstance');
-        if (nf.Common.isDefinedAndNotNull(propertyGrid)) {
+        if (common.isDefinedAndNotNull(propertyGrid)) {
             var editController = propertyGrid.getEditController();
             editController.commitCurrentEdit();
         }
@@ -1449,7 +1486,7 @@
         var propertyData = propertyGrid.getData();
 
         // generate the properties
-        if (nf.Common.isDefinedAndNotNull(properties)) {
+        if (common.isDefinedAndNotNull(properties)) {
             propertyData.beginUpdate();
 
             var i = 0;
@@ -1460,10 +1497,10 @@
                 // determine the property type
                 var type = 'userDefined';
                 var displayName = name;
-                if (nf.Common.isDefinedAndNotNull(descriptor)) {
-                    if (nf.Common.isRequiredProperty(descriptor)) {
+                if (common.isDefinedAndNotNull(descriptor)) {
+                    if (common.isRequiredProperty(descriptor)) {
                         type = 'required';
-                    } else if (nf.Common.isDynamicProperty(descriptor)) {
+                    } else if (common.isDynamicProperty(descriptor)) {
                         type = 'userDefined';
                     } else {
                         type = 'optional';
@@ -1473,7 +1510,7 @@
                     displayName = descriptor.displayName;
 
                     // determine the value
-                    if (nf.Common.isNull(value) && nf.Common.isDefinedAndNotNull(descriptor.defaultValue)) {
+                    if (common.isNull(value) && common.isDefinedAndNotNull(descriptor.defaultValue)) {
                         value = descriptor.defaultValue;
                     }
                 }
@@ -1502,10 +1539,10 @@
     var clear = function (propertyTableContainer) {
         var options = propertyTableContainer.data('options');
         if (options.readOnly === true) {
-            nf.UniversalCapture.removeAllPropertyDetailDialogs();
+            universalCapture.removeAllPropertyDetailDialogs();
         } else {
             // clear any existing new property dialogs
-            if (nf.Common.isDefinedAndNotNull(options.dialogContainer)) {
+            if (common.isDefinedAndNotNull(options.dialogContainer)) {
                 $('#new-property-dialog').modal("hide");
             }
         }
@@ -1515,7 +1552,7 @@
         table.removeData('descriptors history');
 
         // clean up any tooltips that may have been generated
-        nf.Common.cleanUpTooltips(table, 'div.fa-question-circle');
+        common.cleanUpTooltips(table, 'div.fa-question-circle');
 
         // clear the data in the grid
         var propertyGrid = table.data('gridInstance');
@@ -1525,14 +1562,31 @@
 
     var methods = {
         /**
-         * Initializes the tag cloud.
+         * Create a property table. The options are specified in the following
+         * format:
+         *
+         * {
+         *   readOnly: true,
+         *   dialogContainer: 'body',
+         *   descriptorDeferred: function () {
+         *      return $.Deferred(function (deferred) {
+         *          deferred.resolve();
+         *      }).promise;
+         *   },
+         *   supportsGoTo: true,
+         *   goToServiceDeferred: function () {
+         *      return $.Deferred(function (deferred) {
+         *          deferred.resolve();
+         *      }).promise;
+         *   }
+         * }
          *
          * @argument {object} options The options for the tag cloud
          */
         init: function (options) {
             return this.each(function () {
                 // ensure the options have been properly specified
-                if (nf.Common.isDefinedAndNotNull(options)) {
+                if (common.isDefinedAndNotNull(options)) {
                     // get the tag cloud
                     var propertyTableContainer = $(this);
 
@@ -1547,18 +1601,18 @@
                     var table = $('<div class="property-table"></div>').appendTo(propertyTableContainer);
 
                     // optionally add a add new property button
-                    if (options.readOnly !== true && nf.Common.isDefinedAndNotNull(options.dialogContainer)) {
+                    if (options.readOnly !== true && common.isDefinedAndNotNull(options.dialogContainer)) {
                         // build the new property dialog
                         var newPropertyDialogMarkup =
                             '<div id="new-property-dialog" class="dialog cancellable small-dialog hidden">' +
-                                '<div class="dialog-content">' +
-                                    '<div>' +
-                                        '<div class="setting-name">Property name</div>' +
-                                        '<div class="setting-field new-property-name-container">' +
-                                            '<input class="new-property-name" type="text"/>' +
-                                        '</div>' +
-                                    '</div>' +
-                                '</div>' +
+                            '<div class="dialog-content">' +
+                            '<div>' +
+                            '<div class="setting-name">Property name</div>' +
+                            '<div class="setting-field new-property-name-container">' +
+                            '<input class="new-property-name" type="text"/>' +
+                            '</div>' +
+                            '</div>' +
+                            '</div>' +
                             '</div>';
 
                         var newPropertyDialog = $(newPropertyDialogMarkup).appendTo(options.dialogContainer);
@@ -1619,7 +1673,7 @@
 
                                         // store the descriptor for use later
                                         var descriptors = table.data('descriptors');
-                                        if (!nf.Common.isUndefined(descriptors)) {
+                                        if (!common.isUndefined(descriptors)) {
                                             descriptors[descriptor.name] = descriptor;
                                         }
 
@@ -1654,7 +1708,7 @@
                                         propertyGrid.setActiveCell(row, propertyGrid.getColumnIndex('value'));
                                         propertyGrid.editActiveCell();
                                     } else {
-                                        nf.Dialog.showOkDialog({
+                                        dialog.showOkDialog({
                                             headerText: 'Property Exists',
                                             dialogContent: 'A property with this name already exists.'
                                         });
@@ -1666,7 +1720,7 @@
                                     }
                                 }
                             } else {
-                                nf.Dialog.showOkDialog({
+                                dialog.showOkDialog({
                                     headerText: 'Property Name',
                                     dialogContent: 'Property name must be specified.'
                                 });
@@ -1749,7 +1803,7 @@
             return this.each(function () {
                 var table = $(this).find('div.property-table');
                 var propertyGrid = table.data('gridInstance');
-                if (nf.Common.isDefinedAndNotNull(propertyGrid)) {
+                if (common.isDefinedAndNotNull(propertyGrid)) {
                     propertyGrid.resizeCanvas();
                 }
             });
@@ -1762,7 +1816,7 @@
             return this.each(function () {
                 var table = $(this).find('div.property-table');
                 var propertyGrid = table.data('gridInstance');
-                if (nf.Common.isDefinedAndNotNull(propertyGrid)) {
+                if (common.isDefinedAndNotNull(propertyGrid)) {
                     var editController = propertyGrid.getEditController();
                     editController.cancelCurrentEdit();
                 }
@@ -1777,12 +1831,12 @@
                 var propertyTableContainer = $(this);
                 var options = propertyTableContainer.data('options');
 
-                if (nf.Common.isDefinedAndNotNull(options)) {
+                if (common.isDefinedAndNotNull(options)) {
                     // clear the property table container
                     clear(propertyTableContainer);
 
                     // clear any existing new property dialogs
-                    if (nf.Common.isDefinedAndNotNull(options.dialogContainer)) {
+                    if (common.isDefinedAndNotNull(options.dialogContainer)) {
                         $('#new-property-dialog').modal("hide");
                         $(options.dialogContainer).children('div.new-inline-controller-service-dialog').remove();
                     }
@@ -1870,4 +1924,4 @@
             return methods.init.apply(this, arguments);
         }
     };
-})(jQuery);
+}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi/blob/dc934cbb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/tagcloud/jquery.tagcloud.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/tagcloud/jquery.tagcloud.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/tagcloud/jquery.tagcloud.js
index 2eb551c..526a64c 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/tagcloud/jquery.tagcloud.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/tagcloud/jquery.tagcloud.js
@@ -127,7 +127,7 @@
                     $.each(options.tags, function (i, tag) {
                         var normalizedTagName = tag.toLowerCase();
 
-                        if (nf.Common.isDefinedAndNotNull(tagCloud[normalizedTagName])) {
+                        if (isDefinedAndNotNull(tagCloud[normalizedTagName])) {
                             tagCloud[normalizedTagName].count = tagCloud[normalizedTagName].count + 1;
                         } else {
                             var tagCloudEntry = {

http://git-wip-us.apache.org/repos/asf/nifi/blob/dc934cbb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/bulletin-board/nf-bulletin-board.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/bulletin-board/nf-bulletin-board.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/bulletin-board/nf-bulletin-board.js
index 58d8f79..c36296b 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/bulletin-board/nf-bulletin-board.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/bulletin-board/nf-bulletin-board.js
@@ -15,421 +15,480 @@
  * limitations under the License.
  */
 
-/* global nf, top */
-
-$(document).ready(function () {
+/* global nf, define, module, require, exports */
+
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['jquery',
+                'angular',
+                'nf.Common',
+                'nf.ng.AppConfig',
+                'nf.ng.AppCtrl',
+                'nf.ng.ServiceProvider',
+                'nf.ng.Bridge',
+                'nf.ErrorHandler',
+                'nf.Storage'],
+            function ($,
+                      angular,
+                      common,
+                      appConfig,
+                      appCtrl,
+                      serviceProvider,
+                      angularBridge,
+                      errorHandler,
+                      storage) {
+                return (nf.ng.BulletinBoardCtrl =
+                    factory($,
+                        angular,
+                        common,
+                        appConfig,
+                        appCtrl,
+                        serviceProvider,
+                        angularBridge,
+                        errorHandler,
+                        storage));
+            });
+    } else if (typeof exports === 'object' && typeof module === 'object') {
+        module.exports = (nf.ng.BulletinBoardCtrl =
+            factory(require('jquery'),
+                require('angular'),
+                require('nf.Common'),
+                require('nf.ng.AppConfig'),
+                require('nf.ng.AppCtrl'),
+                require('nf.ng.ServiceProvider'),
+                require('nf.ng.Bridge'),
+                require('nf.ErrorHandler'),
+                require('nf.Storage')));
+    } else {
+        nf.ng.BulletinBoardCtrl = factory(root.$,
+            root.angular,
+            root.nf.Common,
+            root.nf.ng.AppConfig,
+            root.nf.ng.AppCtrl,
+            root.nf.ng.ServiceProvider,
+            root.nf.ng.Bridge,
+            root.nf.ErrorHandler,
+            root.nf.Storage);
+    }
+}(this, function ($, angular, common, appConfig, appCtrl, serviceProvider, angularBridge, errorHandler, storage) {
+    'use strict';
 
-    //Create Angular App
-    var app = angular.module('ngBulletinBoardApp', ['ngResource', 'ngRoute', 'ngMaterial', 'ngMessages']);
+    $(document).ready(function () {
 
-    //Define Dependency Injection Annotations
-    nf.ng.AppConfig.$inject = ['$mdThemingProvider', '$compileProvider'];
-    nf.ng.AppCtrl.$inject = ['$scope', 'serviceProvider', 'bulletinBoardCtrl'];
-    nf.ng.BulletinBoardCtrl.$inject = ['serviceProvider'];
-    nf.ng.ServiceProvider.$inject = [];
+        //Create Angular App
+        var app = angular.module('ngBulletinBoardApp', ['ngResource', 'ngRoute', 'ngMaterial', 'ngMessages']);
 
-    //Configure Angular App
-    app.config(nf.ng.AppConfig);
+        //Define Dependency Injection Annotations
+        appConfig.$inject = ['$mdThemingProvider', '$compileProvider'];
+        appCtrl.$inject = ['$scope', 'serviceProvider', 'bulletinBoardCtrl'];
+        nfBulletinBoard.$inject = ['serviceProvider'];
+        serviceProvider.$inject = [];
 
-    //Define Angular App Controllers
-    app.controller('ngBulletinBoardAppCtrl', nf.ng.AppCtrl);
+        //Configure Angular App
+        app.config(appConfig);
 
-    //Define Angular App Services
-    app.service('serviceProvider', nf.ng.ServiceProvider);
-    app.service('bulletinBoardCtrl', nf.ng.BulletinBoardCtrl);
+        //Define Angular App Controllers
+        app.controller('ngBulletinBoardAppCtrl', appCtrl);
 
-    //Manually Boostrap Angular App
-    nf.ng.Bridge.injector = angular.bootstrap($('body'), ['ngBulletinBoardApp'], { strictDi: true });
+        //Define Angular App Services
+        app.service('serviceProvider', serviceProvider);
+        app.service('bulletinBoardCtrl', nfBulletinBoard);
 
-    // initialize the bulletin board
-    nf.ng.Bridge.injector.get('bulletinBoardCtrl').init();
-});
+        //Manually Boostrap Angular App
+        angularBridge.injector = angular.bootstrap($('body'), ['ngBulletinBoardApp'], {strictDi: true});
 
-nf.ng.BulletinBoardCtrl = function (serviceProvider) {
-    'use strict';
+        // initialize the bulletin board
+        angularBridge.injector.get('bulletinBoardCtrl').init();
+    });
 
-    /**
-     * Configuration object used to hold a number of configuration items.
-     */
-    var config = {
-        pollInterval: 3,
-        maxBulletins: 1000,
-        urls: {
-            banners: '../nifi-api/flow/banners',
-            about: '../nifi-api/flow/about',
-            bulletinBoard: '../nifi-api/flow/bulletin-board'
-        }
-    };
+    var nfBulletinBoard = function (serviceProvider) {
 
-    var lastBulletin = null;
-    var filterText = null;
-    var filterType = null;
-
-    /**
-     * Initializes the bulletin board.
-     */
-    var initializePage = function () {
-        // add hover effect and click handler for clearing the bulletins
-        $('#clear-bulletins-button').click(function () {
-            $('#bulletin-board-container').empty();
-        });
-
-        // filter type
-        $('#bulletin-board-filter-type').combo({
-            options: [{
-                text: 'by message',
-                value: 'message'
-            }, {
-                text: 'by name',
-                value: 'sourceName'
-            }, {
-                text: 'by id',
-                value: 'sourceId'
-            }, {
-                text: 'by group id',
-                value: 'groupId'
-            }]
-        });
-
-        // get the about details
-        var getTitle = $.ajax({
-            type: 'GET',
-            url: config.urls.about,
-            dataType: 'json'
-        }).done(function (response) {
-            var aboutDetails = response.about;
-            var bulletinBoardTitle = aboutDetails.title + ' Bulletin Board';
-
-            // set the document title and the about title
-            document.title = bulletinBoardTitle;
-            $('#bulletin-board-header-text').text(bulletinBoardTitle);
-        }).fail(nf.Common.handleAjaxError);
-
-        // get the banners if we're not in the shell
-        var loadBanners = $.Deferred(function (deferred) {
-            if (top === window) {
-                $.ajax({
-                    type: 'GET',
-                    url: config.urls.banners,
-                    dataType: 'json'
-                }).done(function (response) {
-                    // ensure the banners response is specified
-                    if (nf.Common.isDefinedAndNotNull(response.banners)) {
-                        if (nf.Common.isDefinedAndNotNull(response.banners.headerText) && response.banners.headerText !== '') {
-                            // update the header text
-                            var bannerHeader = $('#banner-header').text(response.banners.headerText).show();
-
-                            // show the banner
-                            var updateTop = function (elementId) {
-                                var element = $('#' + elementId);
-                                element.css('top', (parseInt(bannerHeader.css('height'), 10) + parseInt(element.css('top'), 10)) + 'px');
-                            };
-
-                            // update the position of elements affected by top banners
-                            updateTop('bulletin-board');
-                        }
-
-                        if (nf.Common.isDefinedAndNotNull(response.banners.footerText) && response.banners.footerText !== '') {
-                            // update the footer text and show it
-                            var bannerFooter = $('#banner-footer').text(response.banners.footerText).show();
-
-                            var updateBottom = function (elementId) {
-                                var element = $('#' + elementId);
-                                element.css('bottom', parseInt(bannerFooter.css('height'), 10) + 'px');
-                            };
-
-                            // update the position of elements affected by bottom banners
-                            updateBottom('bulletin-board');
-                        }
-                    }
-
-                    deferred.resolve();
-                }).fail(function (xhr, status, error) {
-                    nf.Common.handleAjaxError(xhr, status, error);
-                    deferred.reject();
-                });
-            } else {
-                deferred.resolve();
+        /**
+         * Configuration object used to hold a number of configuration items.
+         */
+        var config = {
+            pollInterval: 3,
+            maxBulletins: 1000,
+            urls: {
+                banners: '../nifi-api/flow/banners',
+                about: '../nifi-api/flow/about',
+                bulletinBoard: '../nifi-api/flow/bulletin-board'
             }
-        });
-
-        return $.Deferred(function (deferred) {
-            $.when(getTitle, loadBanners).done(function () {
-                deferred.resolve();
-            }).fail(function () {
-                deferred.reject();
-            });
-        }).promise();
-    };
+        };
 
-    /**
-     * Starts polling for new bulletins.
-     */
-    var start = function () {
-        var refreshButton = $('#refresh-button');
-        var bulletinContainer = $('#bulletin-board-container');
+        var lastBulletin = null;
+        var filterText = null;
+        var filterType = null;
 
-        appendAndScroll(bulletinContainer, '<div class="bulletin-action">Auto refresh started</div>');
+        /**
+         * Initializes the bulletin board.
+         */
+        var initializePage = function () {
+            // add hover effect and click handler for clearing the bulletins
+            $('#clear-bulletins-button').click(function () {
+                $('#bulletin-board-container').empty();
+            });
 
-        // clear any error messages
-        $('#bulletin-error-message').text('').hide();
-        poll();
-    };
+            // filter type
+            $('#bulletin-board-filter-type').combo({
+                options: [{
+                    text: 'by message',
+                    value: 'message'
+                }, {
+                    text: 'by name',
+                    value: 'sourceName'
+                }, {
+                    text: 'by id',
+                    value: 'sourceId'
+                }, {
+                    text: 'by group id',
+                    value: 'groupId'
+                }]
+            });
 
-    /**
-     * Stops polling for new bulletins.
-     */
-    var stop = function () {
-        var refreshButton = $('#refresh-button');
-        var bulletinContainer = $('#bulletin-board-container');
+            // get the about details
+            var getTitle = $.ajax({
+                type: 'GET',
+                url: config.urls.about,
+                dataType: 'json'
+            }).done(function (response) {
+                var aboutDetails = response.about;
+                var bulletinBoardTitle = aboutDetails.title + ' Bulletin Board';
+
+                // set the document title and the about title
+                document.title = bulletinBoardTitle;
+                $('#bulletin-board-header-text').text(bulletinBoardTitle);
+            }).fail(errorHandler.handleAjaxError);
+
+            // get the banners if we're not in the shell
+            var loadBanners = $.Deferred(function (deferred) {
+                if (top === window) {
+                    $.ajax({
+                        type: 'GET',
+                        url: config.urls.banners,
+                        dataType: 'json'
+                    }).done(function (response) {
+                        // ensure the banners response is specified
+                        if (common.isDefinedAndNotNull(response.banners)) {
+                            if (common.isDefinedAndNotNull(response.banners.headerText) && response.banners.headerText !== '') {
+                                // update the header text
+                                var bannerHeader = $('#banner-header').text(response.banners.headerText).show();
+
+                                // show the banner
+                                var updateTop = function (elementId) {
+                                    var element = $('#' + elementId);
+                                    element.css('top', (parseInt(bannerHeader.css('height'), 10) + parseInt(element.css('top'), 10)) + 'px');
+                                };
+
+                                // update the position of elements affected by top banners
+                                updateTop('bulletin-board');
+                            }
 
-        appendAndScroll(bulletinContainer, '<div class="bulletin-action">Auto refresh stopped</div>');
+                            if (common.isDefinedAndNotNull(response.banners.footerText) && response.banners.footerText !== '') {
+                                // update the footer text and show it
+                                var bannerFooter = $('#banner-footer').text(response.banners.footerText).show();
 
-        // reset state
-        lastBulletin = null;
-        filterText = null;
-        filterType = null;
-    };
+                                var updateBottom = function (elementId) {
+                                    var element = $('#' + elementId);
+                                    element.css('bottom', parseInt(bannerFooter.css('height'), 10) + 'px');
+                                };
 
-    /**
-     * Polls for new bulletins
-     */
-    var poll = function () {
-        // if the page is no longer open, stop polling
-        var isOpen = $('#bulletin-board').is(':visible');
-        if (!isOpen) {
-            bulletinBoardCtrl.polling = false;
-        }
+                                // update the position of elements affected by bottom banners
+                                updateBottom('bulletin-board');
+                            }
+                        }
 
-        // if polling, reload the bulletins
-        if (bulletinBoardCtrl.polling) {
-            bulletinBoardCtrl.loadBulletins().done(function () {
-                if (bulletinBoardCtrl.polling) {
-                    setTimeout(poll, config.pollInterval * 1000);
+                        deferred.resolve();
+                    }).fail(function (xhr, status, error) {
+                        errorHandler.handleAjaxError(xhr, status, error);
+                        deferred.reject();
+                    });
+                } else {
+                    deferred.resolve();
                 }
             });
-        }
-    };
-
-    /**
-     * Appends the specified string to the specified container and scrolls to the bottom.
-     *
-     * @argument {jQuery} bulletinContainer     The container for the bulletins
-     * @argument {string} content               The content to added to the bulletin container
-     */
-    var appendAndScroll = function (bulletinContainer, content) {
-        bulletinContainer.append(content).animate({scrollTop: bulletinContainer[0].scrollHeight}, 'slow');
-    };
 
-    /**
-     * Goes to the specified source on the graph.
-     *
-     * @argument {string} groupId   The id of the group
-     * @argument {string} sourceId  The id of the source component
-     */
-    var goToSource = function (groupId, sourceId) {
-        // only attempt this if we're within a frame
-        if (top !== window) {
-            // and our parent has canvas utils and shell defined
-            if (nf.Common.isDefinedAndNotNull(parent.nf) && nf.Common.isDefinedAndNotNull(parent.nf.CanvasUtils) && nf.Common.isDefinedAndNotNull(parent.nf.Shell)) {
-                parent.nf.CanvasUtils.showComponent(groupId, sourceId);
-                parent.$('#shell-close-button').click();
-            }
-        }
-    };
+            return $.Deferred(function (deferred) {
+                $.when(getTitle, loadBanners).done(function () {
+                    deferred.resolve();
+                }).fail(function () {
+                    deferred.reject();
+                });
+            }).promise();
+        };
 
-    function BulletinBoardCtrl() {
         /**
-         * Toggle state
+         * Starts polling for new bulletins.
          */
-        this.polling = true;
-    }
-    BulletinBoardCtrl.prototype = {
-        constructor: BulletinBoardCtrl,
+        var start = function () {
+            var refreshButton = $('#refresh-button');
+            var bulletinContainer = $('#bulletin-board-container');
+
+            appendAndScroll(bulletinContainer, '<div class="bulletin-action">Auto refresh started</div>');
+
+            // clear any error messages
+            $('#bulletin-error-message').text('').hide();
+            poll();
+        };
 
         /**
-         *  Register the bulletin board controller.
+         * Stops polling for new bulletins.
          */
-        register: function() {
-            if (serviceProvider.bulletinBoardCtrl === undefined) {
-                serviceProvider.register('bulletinBoardCtrl', bulletinBoardCtrl);
-            }
-        },
+        var stop = function () {
+            var refreshButton = $('#refresh-button');
+            var bulletinContainer = $('#bulletin-board-container');
+
+            appendAndScroll(bulletinContainer, '<div class="bulletin-action">Auto refresh stopped</div>');
+
+            // reset state
+            lastBulletin = null;
+            filterText = null;
+            filterType = null;
+        };
 
         /**
-         * Initializes the bulletin board page.
+         * Polls for new bulletins
          */
-        init: function () {
-            //alter styles if we're not in the shell
-            if (top === window) {
-                $('#bulletin-board').css({
-                    "position": "absolute",
-                    "bottom": "40px",
-                    "left": "40px",
-                    "right": "40px",
-                    "top": "40px"
-                });
-                $('#bulletin-board-refresh-container').css({
-                    "position": "absolute",
-                    "bottom": "40px",
-                    "left": "40px",
-                    "right": "40px"
+        var poll = function () {
+            // if the page is no longer open, stop polling
+            var isOpen = $('#bulletin-board').is(':visible');
+            if (!isOpen) {
+                bulletinBoardCtrl.polling = false;
+            }
+
+            // if polling, reload the bulletins
+            if (bulletinBoardCtrl.polling) {
+                bulletinBoardCtrl.loadBulletins().done(function () {
+                    if (bulletinBoardCtrl.polling) {
+                        setTimeout(poll, config.pollInterval * 1000);
+                    }
                 });
             }
-            
-            nf.Storage.init();
+        };
 
-            initializePage().done(function () {
-                start();
-            });
-        },
+        /**
+         * Appends the specified string to the specified container and scrolls to the bottom.
+         *
+         * @argument {jQuery} bulletinContainer     The container for the bulletins
+         * @argument {string} content               The content to added to the bulletin container
+         */
+        var appendAndScroll = function (bulletinContainer, content) {
+            bulletinContainer.append(content).animate({scrollTop: bulletinContainer[0].scrollHeight}, 'slow');
+        };
 
         /**
-         * Loads the bulletins since the last refresh.
+         * Goes to the specified source on the graph.
+         *
+         * @argument {string} groupId   The id of the group
+         * @argument {string} sourceId  The id of the source component
          */
-        loadBulletins: function () {
-            var data = {};
-
-            // include the timestamp if appropriate
-            if (nf.Common.isDefinedAndNotNull(lastBulletin)) {
-                data['after'] = lastBulletin;
-            } else {
-                data['limit'] = 10;
+        var goToSource = function (groupId, sourceId) {
+            // only attempt this if we're within a frame
+            if (top !== window) {
+                // and our parent has canvas utils and shell defined
+                if (common.isDefinedAndNotNull(parent.nf) && common.isDefinedAndNotNull(parent.nf.CanvasUtils) && common.isDefinedAndNotNull(parent.nf.Shell)) {
+                    parent.nf.CanvasUtils.showComponent(groupId, sourceId);
+                    parent.$('#shell-close-button').click();
+                }
             }
+        };
 
-            var bulletinContainer = $('#bulletin-board-container');
+        function BulletinBoardCtrl() {
+            /**
+             * Toggle state
+             */
+            this.polling = true;
+        }
+
+        BulletinBoardCtrl.prototype = {
+            constructor: BulletinBoardCtrl,
 
-            // get the filter text
-            var filter = $('#bulletin-board-filter').val();
-            if (filter !== '') {
-                // determine which field to filter on
-                var filterOption = $('#bulletin-board-filter-type').combo('getSelectedOption');
-                data[filterOption.value] = filter;
-
-                // append filtering message if necessary
-                if (filterText !== filter || filterType !== filterOption.text) {
-                    var filterContent = $('<div class="bulletin-action"></div>').text('Filter ' + filterOption.text + ' matching \'' + filter + '\'');
-                    appendAndScroll(bulletinContainer, filterContent.get(0));
-                    filterText = filter;
-                    filterType = filterOption.text;
+            /**
+             *  Register the bulletin board controller.
+             */
+            register: function () {
+                if (serviceProvider.bulletinBoardCtrl === undefined) {
+                    serviceProvider.register('bulletinBoardCtrl', bulletinBoardCtrl);
+                }
+            },
+
+            /**
+             * Initializes the bulletin board page.
+             */
+            init: function () {
+                //alter styles if we're not in the shell
+                if (top === window) {
+                    $('#bulletin-board').css({
+                        "position": "absolute",
+                        "bottom": "40px",
+                        "left": "40px",
+                        "right": "40px",
+                        "top": "40px"
+                    });
+                    $('#bulletin-board-refresh-container').css({
+                        "position": "absolute",
+                        "bottom": "40px",
+                        "left": "40px",
+                        "right": "40px"
+                    });
                 }
-            } else if (filterText !== null) {
-                appendAndScroll(bulletinContainer, '<div class="bulletin-action">Filter removed</div>');
-                filterText = null;
-                filterType = null;
-            }
 
-            return $.ajax({
-                type: 'GET',
-                url: config.urls.bulletinBoard,
-                data: data,
-                dataType: 'json'
-            }).done(function (response) {
-                // ensure the bulletin board was specified
-                if (nf.Common.isDefinedAndNotNull(response.bulletinBoard)) {
-                    var bulletinBoard = response.bulletinBoard;
-
-                    // update the stats last refreshed timestamp
-                    $('#bulletin-board-last-refreshed').text(bulletinBoard.generated);
-
-                    // process the bulletins
-                    var bulletinEntities = response.bulletinBoard.bulletins;
-                    var content = [];
-
-                    // append each bulletin
-                    $.each(bulletinEntities, function (i, bulletinEntity) {
-                        if (bulletinEntity.canRead === true) {
-                            var bulletin = bulletinEntity.bulletin;
-
-                            // format the severity
-                            var severityStyle = 'bulletin-normal';
-                            if (bulletin.level === 'ERROR') {
-                                severityStyle = 'bulletin-error';
-                            } else if (bulletin.level === 'WARN' || bulletin.level === 'WARNING') {
-                                severityStyle = 'bulletin-warn';
-                            }
+                storage.init();
 
-                            // format the source id
-                            var source;
-                            if (nf.Common.isDefinedAndNotNull(bulletin.sourceId) && nf.Common.isDefinedAndNotNull(bulletin.groupId) && top !== window) {
-                                source = $('<div class="bulletin-source bulletin-link"></div>').text(bulletin.sourceId).on('click', function () {
-                                    goToSource(bulletin.groupId, bulletin.sourceId);
-                                });
-                            } else {
-                                var sourceId = bulletin.sourceId;
-                                if (nf.Common.isUndefined(sourceId) || nf.Common.isNull(sourceId)) {
-                                    sourceId = '';
+                initializePage().done(function () {
+                    start();
+                });
+            },
+
+            /**
+             * Loads the bulletins since the last refresh.
+             */
+            loadBulletins: function () {
+                var data = {};
+
+                // include the timestamp if appropriate
+                if (common.isDefinedAndNotNull(lastBulletin)) {
+                    data['after'] = lastBulletin;
+                } else {
+                    data['limit'] = 10;
+                }
+
+                var bulletinContainer = $('#bulletin-board-container');
+
+                // get the filter text
+                var filter = $('#bulletin-board-filter').val();
+                if (filter !== '') {
+                    // determine which field to filter on
+                    var filterOption = $('#bulletin-board-filter-type').combo('getSelectedOption');
+                    data[filterOption.value] = filter;
+
+                    // append filtering message if necessary
+                    if (filterText !== filter || filterType !== filterOption.text) {
+                        var filterContent = $('<div class="bulletin-action"></div>').text('Filter ' + filterOption.text + ' matching \'' + filter + '\'');
+                        appendAndScroll(bulletinContainer, filterContent.get(0));
+                        filterText = filter;
+                        filterType = filterOption.text;
+                    }
+                } else if (filterText !== null) {
+                    appendAndScroll(bulletinContainer, '<div class="bulletin-action">Filter removed</div>');
+                    filterText = null;
+                    filterType = null;
+                }
+
+                return $.ajax({
+                    type: 'GET',
+                    url: config.urls.bulletinBoard,
+                    data: data,
+                    dataType: 'json'
+                }).done(function (response) {
+                    // ensure the bulletin board was specified
+                    if (common.isDefinedAndNotNull(response.bulletinBoard)) {
+                        var bulletinBoard = response.bulletinBoard;
+
+                        // update the stats last refreshed timestamp
+                        $('#bulletin-board-last-refreshed').text(bulletinBoard.generated);
+
+                        // process the bulletins
+                        var bulletinEntities = response.bulletinBoard.bulletins;
+                        var content = [];
+
+                        // append each bulletin
+                        $.each(bulletinEntities, function (i, bulletinEntity) {
+                            if (bulletinEntity.canRead === true) {
+                                var bulletin = bulletinEntity.bulletin;
+
+                                // format the severity
+                                var severityStyle = 'bulletin-normal';
+                                if (bulletin.level === 'ERROR') {
+                                    severityStyle = 'bulletin-error';
+                                } else if (bulletin.level === 'WARN' || bulletin.level === 'WARNING') {
+                                    severityStyle = 'bulletin-warn';
+                                }
+
+                                // format the source id
+                                var source;
+                                if (common.isDefinedAndNotNull(bulletin.sourceId) && common.isDefinedAndNotNull(bulletin.groupId) && top !== window) {
+                                    source = $('<div class="bulletin-source bulletin-link"></div>').text(bulletin.sourceId).on('click', function () {
+                                        goToSource(bulletin.groupId, bulletin.sourceId);
+                                    });
+                                } else {
+                                    var sourceId = bulletin.sourceId;
+                                    if (common.isUndefined(sourceId) || common.isNull(sourceId)) {
+                                        sourceId = '';
+                                    }
+                                    source = $('<div class="bulletin-source"></div>').text(sourceId);
                                 }
-                                source = $('<div class="bulletin-source"></div>').text(sourceId);
-                            }
 
-                            // build the markup for this bulletin
-                            var bulletinMarkup = $('<div class="bulletin"></div>');
+                                // build the markup for this bulletin
+                                var bulletinMarkup = $('<div class="bulletin"></div>');
 
-                            // build the markup for this bulletins info
-                            var bulletinInfoMarkup = $('<div class="bulletin-info"></div>').appendTo(bulletinMarkup);
-                            $('<div class="bulletin-timestamp"></div>').text(bulletin.timestamp).appendTo(bulletinInfoMarkup);
-                            $('<div class="bulletin-severity"></div>').addClass(severityStyle).text(bulletin.level).appendTo(bulletinInfoMarkup);
-                            source.appendTo(bulletinInfoMarkup);
-                            $('<div class="clear"></div>').appendTo(bulletinInfoMarkup);
+                                // build the markup for this bulletins info
+                                var bulletinInfoMarkup = $('<div class="bulletin-info"></div>').appendTo(bulletinMarkup);
+                                $('<div class="bulletin-timestamp"></div>').text(bulletin.timestamp).appendTo(bulletinInfoMarkup);
+                                $('<div class="bulletin-severity"></div>').addClass(severityStyle).text(bulletin.level).appendTo(bulletinInfoMarkup);
+                                source.appendTo(bulletinInfoMarkup);
+                                $('<div class="clear"></div>').appendTo(bulletinInfoMarkup);
 
-                            // format the node address if applicable
-                            if (nf.Common.isDefinedAndNotNull(bulletin.nodeAddress)) {
-                                $('<div class="bulletin-node"></div>').text(bulletin.nodeAddress).appendTo(bulletinMarkup);
-                            }
+                                // format the node address if applicable
+                                if (common.isDefinedAndNotNull(bulletin.nodeAddress)) {
+                                    $('<div class="bulletin-node"></div>').text(bulletin.nodeAddress).appendTo(bulletinMarkup);
+                                }
 
-                            // add the bulletin message (treat as text)
-                            $('<pre class="bulletin-message"></pre>').text(bulletin.message).appendTo(bulletinMarkup);
-                            $('<div class="clear"></div>').appendTo(bulletinMarkup);
+                                // add the bulletin message (treat as text)
+                                $('<pre class="bulletin-message"></pre>').text(bulletin.message).appendTo(bulletinMarkup);
+                                $('<div class="clear"></div>').appendTo(bulletinMarkup);
 
-                            // append the content
-                            content.push(bulletinMarkup.get(0));
-                        }
+                                // append the content
+                                content.push(bulletinMarkup.get(0));
+                            }
 
-                        // record the id of the last bulletin in this request
-                        if (i + 1 === bulletinEntities.length) {
-                            lastBulletin = bulletinEntity.id;
-                        }
-                    });
+                            // record the id of the last bulletin in this request
+                            if (i + 1 === bulletinEntities.length) {
+                                lastBulletin = bulletinEntity.id;
+                            }
+                        });
 
-                    // add the content to the scroll pane
-                    appendAndScroll(bulletinContainer, content);
+                        // add the content to the scroll pane
+                        appendAndScroll(bulletinContainer, content);
 
-                    // trim the container as necessary
-                    var contents = bulletinContainer.contents();
-                    var length = contents.length;
-                    if (length > config.maxBulletins) {
-                        contents.slice(0, length - config.maxBulletins).remove();
-                        bulletinContainer.prepend('<div class="bulletin-action">&#8230;</div>');
+                        // trim the container as necessary
+                        var contents = bulletinContainer.contents();
+                        var length = contents.length;
+                        if (length > config.maxBulletins) {
+                            contents.slice(0, length - config.maxBulletins).remove();
+                            bulletinContainer.prepend('<div class="bulletin-action">&#8230;</div>');
+                        }
                     }
-                }
-            }).fail(function (xhr, status, error) {
-                // likely caused by a invalid regex
-                if (xhr.status === 404) {
-                    $('#bulletin-error-message').text(xhr.responseText).show();
-
-                    // stop future polling
-                    togglePolling();
+                }).fail(function (xhr, status, error) {
+                    // likely caused by a invalid regex
+                    if (xhr.status === 404) {
+                        $('#bulletin-error-message').text(xhr.responseText).show();
+
+                        // stop future polling
+                        bulletinBoardCtrl.togglePolling();
+                    } else {
+                        errorHandler.handleAjaxError(xhr, status, error);
+                    }
+                });
+            },
+
+            /**
+             * Toggles whether the page is actively polling for new bulletins.
+             */
+            togglePolling: function () {
+                // conditionally start or stop
+                if (bulletinBoardCtrl.polling === true) {
+                    start();
                 } else {
-                    nf.Common.handleAjaxError(xhr, status, error);
+                    stop();
                 }
-            });
-        },
-
-        /**
-         * Toggles whether the page is actively polling for new bulletins.
-         */
-        togglePolling: function () {
-            // conditionally start or stop
-            if (bulletinBoardCtrl.polling === true) {
-                start();
-            } else {
-                stop();
             }
         }
-    }
 
-    var bulletinBoardCtrl = new BulletinBoardCtrl();
-    bulletinBoardCtrl.register();
-    return bulletinBoardCtrl;
-};
\ No newline at end of file
+        var bulletinBoardCtrl = new BulletinBoardCtrl();
+        bulletinBoardCtrl.register();
+        return bulletinBoardCtrl;
+    };
+
+    return nfBulletinBoard;
+}));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi/blob/dc934cbb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-flow-status-controller.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-flow-status-controller.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-flow-status-controller.js
index 0db667c..95b6ac0 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-flow-status-controller.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-flow-status-controller.js
@@ -71,7 +71,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
              */
             init: function () {
 
-                var self = this;
+                var searchCtrl = this;
 
                 // Create new jQuery UI widget
                 $.widget('nf.searchAutocomplete', $.ui.autocomplete, {
@@ -92,7 +92,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         return items;
                     },
                     _renderMenu: function (ul, items) {
-                        var self = this;
+                        var nfSearchAutocomplete = this;
 
                         // the object that holds the search results is normalized into a single element array
                         var searchResults = items[0];
@@ -101,7 +101,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         if (!nf.Common.isEmpty(searchResults.processorResults)) {
                             ul.append('<li class="search-header"><div class="search-result-icon icon icon-processor"></div>Processors</li>');
                             $.each(searchResults.processorResults, function (i, processorMatch) {
-                                self._renderItem(ul, processorMatch);
+                                nfSearchAutocomplete._renderItem(ul, processorMatch);
                             });
                         }
 
@@ -109,7 +109,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         if (!nf.Common.isEmpty(searchResults.processGroupResults)) {
                             ul.append('<li class="search-header"><div class="search-result-icon icon icon-group"></div>Process Groups</li>');
                             $.each(searchResults.processGroupResults, function (i, processGroupMatch) {
-                                self._renderItem(ul, processGroupMatch);
+                                nfSearchAutocomplete._renderItem(ul, processGroupMatch);
                             });
                         }
 
@@ -117,7 +117,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         if (!nf.Common.isEmpty(searchResults.remoteProcessGroupResults)) {
                             ul.append('<li class="search-header"><div class="search-result-icon icon icon-group-remote"></div>Remote Process Groups</li>');
                             $.each(searchResults.remoteProcessGroupResults, function (i, remoteProcessGroupMatch) {
-                                self._renderItem(ul, remoteProcessGroupMatch);
+                                nfSearchAutocomplete._renderItem(ul, remoteProcessGroupMatch);
                             });
                         }
 
@@ -125,7 +125,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         if (!nf.Common.isEmpty(searchResults.connectionResults)) {
                             ul.append('<li class="search-header"><div class="search-result-icon icon icon-connect"></div>Connections</li>');
                             $.each(searchResults.connectionResults, function (i, connectionMatch) {
-                                self._renderItem(ul, connectionMatch);
+                                nfSearchAutocomplete._renderItem(ul, connectionMatch);
                             });
                         }
 
@@ -133,7 +133,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         if (!nf.Common.isEmpty(searchResults.inputPortResults)) {
                             ul.append('<li class="search-header"><div class="search-result-icon icon icon-port-in"></div>Input Ports</li>');
                             $.each(searchResults.inputPortResults, function (i, inputPortMatch) {
-                                self._renderItem(ul, inputPortMatch);
+                                nfSearchAutocomplete._renderItem(ul, inputPortMatch);
                             });
                         }
 
@@ -141,7 +141,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         if (!nf.Common.isEmpty(searchResults.outputPortResults)) {
                             ul.append('<li class="search-header"><div class="search-result-icon icon icon-port-out"></div>Output Ports</li>');
                             $.each(searchResults.outputPortResults, function (i, outputPortMatch) {
-                                self._renderItem(ul, outputPortMatch);
+                                nfSearchAutocomplete._renderItem(ul, outputPortMatch);
                             });
                         }
 
@@ -149,7 +149,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         if (!nf.Common.isEmpty(searchResults.funnelResults)) {
                             ul.append('<li class="search-header"><div class="search-result-icon icon icon-funnel"></div>Funnels</li>');
                             $.each(searchResults.funnelResults, function (i, funnelMatch) {
-                                self._renderItem(ul, funnelMatch);
+                                nfSearchAutocomplete._renderItem(ul, funnelMatch);
                             });
                         }
 
@@ -194,7 +194,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                         // show the selected component
                         nf.CanvasUtils.showComponent(item.groupId, item.id);
 
-                        self.getInputElement().val('').blur();
+                        searchCtrl.getInputElement().val('').blur();
 
                         // stop event propagation
                         return false;
@@ -208,7 +208,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                     close: function (event, ui) {
                         // set the input text to '' and reset the cached term
                         $(this).searchAutocomplete('reset');
-                        self.getInputElement().val('');
+                        searchCtrl.getInputElement().val('');
 
                         // remove the glass pane
                         $('div.search-glass-pane').remove();
@@ -216,38 +216,38 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
                 });
 
                 // hide the search input
-                self.toggleSearchField();
+                searchCtrl.toggleSearchField();
             },
 
             /**
              * Toggle/Slide the search field open/closed.
              */
             toggleSearchField: function () {
-                var self = this;
+                var searchCtrl = this;
 
                 // hide the context menu if necessary
                 nf.ContextMenu.hide();
 
-                var isVisible = self.getInputElement().is(':visible');
+                var isVisible = searchCtrl.getInputElement().is(':visible');
                 var display = 'none';
                 var class1 = 'search-container-opened';
                 var class2 = 'search-container-closed';
                 if (!isVisible) {
-                    self.getButtonElement().css('background-color', '#FFFFFF');
+                    searchCtrl.getButtonElement().css('background-color', '#FFFFFF');
                     display = 'inline-block';
                     class1 = 'search-container-closed';
                     class2 = 'search-container-opened';
                 } else {
-                    self.getInputElement().css('display', display);
+                    searchCtrl.getInputElement().css('display', display);
                 }
 
                 this.getSearchContainerElement().switchClass(class1, class2, 500, function () {
-                    self.getInputElement().css('display', display);
+                    searchCtrl.getInputElement().css('display', display);
                     if (!isVisible) {
-                        self.getButtonElement().css('background-color', '#FFFFFF');
-                        self.getInputElement().focus();
+                        searchCtrl.getButtonElement().css('background-color', '#FFFFFF');
+                        searchCtrl.getInputElement().focus();
                     } else {
-                        self.getButtonElement().css('background-color', '#E3E8EB');
+                        searchCtrl.getButtonElement().css('background-color', '#E3E8EB');
                     }
                 });
             }
@@ -327,7 +327,7 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
          * Reloads the current status of the flow.
          */
         reloadFlowStatus: function () {
-            var self = this;
+            var flowStatusCtrl = this;
 
             return $.ajax({
                 type: 'GET',
@@ -336,9 +336,9 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
             }).done(function (response) {
                 // report the updated status
                 if (nf.Common.isDefinedAndNotNull(response.controllerStatus)) {
-                    self.update(response.controllerStatus);
+                    flowStatusCtrl.update(response.controllerStatus);
                 }
-            }).fail(nf.Common.handleAjaxError);
+            }).fail(nf.ErrorHandler.handleAjaxError);
         },
 
         /**
@@ -348,11 +348,11 @@ nf.ng.Canvas.FlowStatusCtrl = function (serviceProvider) {
          */
         updateClusterSummary: function (clusterSummary) {
             // see if this node has been (dis)connected
-            if (nf.Canvas.isConnectedToCluster() !== clusterSummary.connectedToCluster) {
+            if (nf.ClusterSummary.isConnectedToCluster() !== clusterSummary.connectedToCluster) {
                 if (clusterSummary.connectedToCluster) {
-                    nf.Canvas.showConnectedToClusterMessage();
+                    nf.Dialog.showConnectedToClusterMessage();
                 } else {
-                    nf.Canvas.showDisconnectedFromClusterMessage();
+                    nf.Dialog.showDisconnectedFromClusterMessage();
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/dc934cbb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-global-menu-controller.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-global-menu-controller.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-global-menu-controller.js
index 9981a32..6d0a304 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-global-menu-controller.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/controllers/nf-ng-canvas-global-menu-controller.js
@@ -139,7 +139,7 @@ nf.ng.Canvas.GlobalMenuCtrl = function (serviceProvider) {
              * @returns {*|boolean}
              */
             visible: function () {
-                return nf.Canvas.isConnectedToCluster();
+                return nf.ClusterSummary.isConnectedToCluster();
             },
 
             /**
@@ -304,7 +304,7 @@ nf.ng.Canvas.GlobalMenuCtrl = function (serviceProvider) {
                         $('#nifi-content-viewer-url').text(aboutDetails.contentViewerUrl);
                         nf.QueueListing.initFlowFileDetailsDialog();
                     }
-                }).fail(nf.Common.handleAjaxError);
+                }).fail(nf.ErrorHandler.handleAjaxError);
 
                 this.modal.init();
             },
@@ -327,7 +327,7 @@ nf.ng.Canvas.GlobalMenuCtrl = function (serviceProvider) {
                  * Initialize the modal.
                  */
                 init: function () {
-                    var self = this;
+                    var aboutModal = this;
 
                     var resizeAbout = function(){
                         var dialog = $(this);
@@ -350,7 +350,7 @@ nf.ng.Canvas.GlobalMenuCtrl = function (serviceProvider) {
                             },
                             handler: {
                                 click: function () {
-                                    self.hide();
+                                    aboutModal.hide();
                                 }
                             }
                         }]