Parcourir la source

Fix onDeviceIdentified bug and other minor changes

DSR! il y a 3 ans
Parent
commit
af197f11e2

+ 9 - 0
src/pineapple/js/helpers.js

@@ -50,6 +50,15 @@ function selectElement(elem) {
     selection.addRange(selectRange);
 }
 
+function loadActiveTabData() {
+    $('.tab-pane.active .controller').each(function(index) {
+        var controller = angular.element( $(this)[0] ).scope();
+        if (typeof controller.reloadData === "function") { 
+            controller.reloadData();
+        }
+    });
+}
+
 $('html').click(function(e){
     var elem = e.toElement;
     if (elem !== undefined && elem.classList.contains('autoselect')) {

+ 2 - 0
src/pineapple/js/services.js

@@ -119,6 +119,7 @@
                 for (var i = this.deviceCallbacks.length-1; i >=0; --i) {
                     this.deviceCallbacks[i].callback(this.device, this.deviceCallbacks[i].scope);
                 }
+                this.deviceCallbacks = [];
             }
         };
 
@@ -218,6 +219,7 @@
                 var callbackObj = scope.deviceCallbacks[i];
                 callbackObj.callback(scope.device, callbackObj.scope);
             }
+            scope.deviceCallbacks = [];
         }, this);
 
         this.checkAuth();

+ 0 - 9
src/pineapple/modules/Advanced/module.html

@@ -259,15 +259,6 @@
 </div>
 
 <script type="text/javascript">
-    function loadActiveTabData() {
-        $('.tab-pane.active .controller').each(function(index) {
-            var controller = angular.element( $(this)[0] ).scope();
-            if (typeof controller.reloadData === "function") { 
-                controller.reloadData();
-            }
-        });
-    }
-
     $(function() {
         $('.tabs-block a').click(function(event) {
             event.preventDefault();

+ 40 - 55
src/pineapple/modules/Networking/js/module.js

@@ -105,7 +105,7 @@ registerController('NetworkingAccessPointsController', ['$api', '$scope', '$time
     //$scope.reloadData();
 }]);
 
-registerController('NetworkingClientModeController', ['$api', '$scope', '$timeout', function($api, $scope, $timeout) {
+registerController('NetworkingModeController', ['$api', '$scope', '$timeout', function($api, $scope, $timeout) {
     $scope.interfaces = [];
     $scope.selectedInterface = "";
     $scope.accessPoints = [];
@@ -118,11 +118,14 @@ registerController('NetworkingClientModeController', ['$api', '$scope', '$timeou
     $scope.loading = false;
 
     $scope.getInterfaces = (function() {
+        $scope.interfaces = [];
+        $scope.actions = 'loading';
         $api.request({
             module: 'Networking',
             action: 'getClientInterfaces'
         }, function(response) {
             if (response.error === undefined) {
+                $scope.actions = '';
                 $scope.interfaces = response;
                 $scope.selectedInterface = $scope.interfaces[0];
             }
@@ -203,6 +206,42 @@ registerController('NetworkingClientModeController', ['$api', '$scope', '$timeou
         });
     });
 
+    // from NetworkingInfoController
+    $scope.info = '';
+    $scope.actions = '';
+
+    $scope.interfaceActions = (function(type, wlan) {
+        $scope.actions = 'loading';
+        $api.request({
+            module: 'Networking',
+            action: 'interfaceActions',
+            type: type,
+            interface: wlan
+        }, function(response) {
+            if (response.error === undefined) {
+                $scope.actions = response;
+
+                // reload interfaces in monitor command cases
+                if (type === 3 || type === 4) {
+                    $scope.getInterfaces();
+                }
+            }
+        });
+    });
+
+    $scope.getInfoData = (function(type) {
+        $scope.info = 'loading';
+        $api.request({
+            module: 'Networking',
+            action: 'getInfoData',
+            type: type
+        }, function(response) {
+            if (response.error === undefined) {
+                $scope.info = response;
+            }
+        });
+    });
+
     $scope.reloadData();
 }]);
 
@@ -433,57 +472,3 @@ registerController("OUILookupController", ['$api', '$scope', '$timeout', '$http'
         }));
     };
 }]);
-
-registerController('NetworkingInfoController', ['$api', '$scope', '$timeout', function($api, $scope, $timeout) {
-    $scope.interfaces = [];
-    $scope.info = '';
-    $scope.actions = '';
-
-    $scope.getInterfaces = (function() {
-        $scope.interfaces = [];
-        $scope.actions = 'loading';
-        $api.request({
-            module: 'Networking',
-            action: 'getClientInterfaces'
-        }, function(response) {
-            if (response.error === undefined) {
-                $scope.actions = '';
-                $scope.interfaces = response;
-            }
-        });
-    });
-
-    $scope.interfaceActions = (function(type, wlan) {
-        $scope.actions = 'loading';
-        $api.request({
-            module: 'Networking',
-            action: 'interfaceActions',
-            type: type,
-            interface: wlan
-        }, function(response) {
-            if (response.error === undefined) {
-                $scope.actions = response;
-
-                // reload interfaces in monitor command cases
-                if (type === 3 || type === 4) {
-                    $scope.getInterfaces();
-                }
-            }
-        });
-    });
-
-    $scope.getInfoData = (function(type) {
-        $scope.info = 'loading';
-        $api.request({
-            module: 'Networking',
-            action: 'getInfoData',
-            type: type
-        }, function(response) {
-            if (response.error === undefined) {
-                $scope.info = response;
-            }
-        });
-    });
-
-    $scope.getInterfaces();
-}]);

+ 179 - 197
src/pineapple/modules/Networking/module.html

@@ -14,65 +14,11 @@
 
     <div class="tab-pane fade active in" id="networking-main">
         <div class="row">
-            <div class="col-md-6">
-                <div class="controller" ng-controller="OUILookupController">
-                    <div class="panel panel-default">
-                        <div class="panel-heading">
-                            <h3 class="panel-title">OUI Lookup
-                                <span class="dropdown">
-                                <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="OUIDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                    <span class="caret"></span>
-                                </button>
-                                <ul class="dropdown-menu" aria-labelledby="OUIDropdown">
-                                    <li ng-click="removeOUIDatabase()"><a>Remove OUI Database</a></li>
-                                </ul>
-                            </span>
-                            </h3>
-                        </div>
-                        <div class="panel-body">
-                            <div ng-if="isOUIPresent()">
-                                <form class="form-inline" role="form" novalidate>
-                                    <div class="form-group">
-                                        <div class="input-group">
-                                            <span class="input-group-addon">MAC Address</span>
-                                            <input name="macAddress" placeholder="00:11:22:33:44:55" type="text" class="form-control" id="macAddress" ng-model="$parent.macAddress">
-                                        </div>
-                                        <br/>
-                                    </div>
-                                    <div class="btn-group" role="group">
-                                        <button ng-click="lookupMACAddress();" ng-disabled="ouiLoading" class="btn btn-default">
-                                            <span ng-hide="ouiLoading">Lookup</span>
-                                            <img class="image-small-18 center-block" ng-show="ouiLoading" src="img/throbber.gif" />
-                                        </button>
-                                    </div>
-                                    <br/>
-                                </form>
-                                <br/>
-                                <span ng-show="vendor">{{ vendor }}</span>
-                            </div>
-                            <div ng-if="!isOUIPresent()">
-                                <button ng-click="downloadOUIDatabase()" ng-disabled="gettingOUI" class="btn btn-default">
-                                    <span ng-hide="gettingOUI">Download OUI Database</span>
-                                    <img class="image-small-18 center-block" ng-show="gettingOUI" src="img/throbber.gif" />
-                                </button>
-                                <br/>
-                                <span class="text-muted">Note: The OUI Database is downloaded from GitHub.com</span>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-
-                <div class="panel panel-default controller" ng-controller="NetworkingMACAddressesController">
+            <div class="col-md-6" ng-controller="NetworkingModeController">
+                <div class="panel panel-default">
                     <div class="panel-heading">
-                        <h3 class="panel-title">MAC Addresses
-                            <span class="dropdown">
-                                <button ng-disabled="modifyingMAC" class="btn btn-xs btn-default dropdown-toggle" type="button" id="NetworkingAccessPointsDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                    <span class="caret"></span>
-                                </button>
-                                <ul class="dropdown-menu" aria-labelledby="NetworkingAccessPointsDropdown">
-                                    <li ng-disabled="waiting" ng-click="resetMac()"><a>Restore Default MAC Address</a></li>
-                                </ul>
-                            </span>
+                        <h3 class="panel-title">
+                            WiFi Client Mode
                             <span class="pull-right">
                                 <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="reloadData();">
                                     Refresh
@@ -81,164 +27,107 @@
                         </h3>
                     </div>
                     <div class="panel-body">
-                        <div class="col-md-12">
+                        <div class="col-md-12" ng-show="connected">
                             <div class="row">
                                 <div class="input-group">
                                     <span class="input-group-addon">Interface</span>
-                                    <select ng-disabled="modifyingMAC" class="form-control" ng-model="selectedInterface">
-                                        <option ng-repeat="(interface, mac) in interfaces">{{ interface }}</option>
-                                    </select>
+                                    <input type="text" class="form-control" ng-model="connectedInterface" disabled>
                                 </div>
                                 <br/>
                                 <div class="input-group">
-                                    <span class="fixed-addon-width-3 input-group-addon">Current MAC</span>
-                                    <input type="text" class="form-control autoselect" ng-model="interfaces[selectedInterface]" disabled>
+                                    <span class="fixed-addon-width input-group-addon">SSID</span>
+                                    <input type="text" class="form-control" ng-model="connectedSSID" disabled>
                                 </div>
                                 <br/>
                                 <div class="input-group">
-                                    <span class="fixed-addon-width-3 input-group-addon">New MAC</span>
-                                    <input ng-disabled="modifyingMAC" type="text" class="form-control" ng-model="newMac">
+                                    <span class="fixed-addon-width input-group-addon">IP</span>
+                                    <input type="text" class="form-control" ng-model="connectedIP" disabled>
                                 </div>
+                                <br/>
+                                <button class="btn btn-default" ng-click="checkConnection()" ng-hide="disconnecting">Refresh</button>
+                                <button class="btn btn-default" ng-click="disconnect()" ng-hide="disconnecting">Disconnect</button>
+                                <img src="img/throbber.gif" ng-show="disconnecting">
+                            </div>
+                        </div>
+                        <div class="col-md-12" ng-hide="connected">
+                            <div class="row">
                                 <div class="input-group">
-                                    <div class="checkbox">
-                                        <label><input type="checkbox" value="" ng-model="forceReload">
-                                            Reload Wifi after change
-                                        </label>
-                                    </div>
+                                    <span class="input-group-addon">Interface</span>
+                                    <select class="form-control" ng-model="selectedInterface" ng-disabled="scanning">
+                                        <option ng-repeat="interface in interfaces">{{ interface }}</option>
+                                    </select>
+                                    <span class="input-group-btn">
+                                        <button ng-disabled="scanning" class="btn btn-default" type="button" ng-click="scanForNetworks()">
+                                            <span ng-hide="scanning">Scan</span>
+                                            <img class="image-small-18" src="img/throbber.gif" ng-show="scanning">
+                                        </button>
+                                    </span>
+                                </div>
+                                <small class="text-muted" ng-hide="accessPoints.length !== 0" ng-show="selectedInterface === 'wlan1' || selectedInterface === 'wlan1mon'"> Note: Choosing wlan1 will interfere with PineAP.</small>
+                                <div class="alert well-sm alert-warning" role="alert" ng-show="noNetworkFound">
+                                    <span>No networks were found.</span>
                                 </div>
                                 <br/>
-                                <button ng-disabled="modifyingMAC" class="btn btn-default" ng-click="setMac()">Set New MAC</button>
-                                <button ng-disabled="modifyingMAC" class="btn btn-default" ng-click="setRandomMac()">Set Random MAC</button>
-                                <img ng-show="modifyingMAC" src="img/throbber.gif"/>
-                                <br/>
-                                <small class="text-muted">Note: Changing MAC addresses will restart the WiFi.</small>
                             </div>
-                        </div>
-                    </div>
-                </div>
-            
-                <div class="controller" ng-controller="NetworkingClientModeController">
-                    <div class="panel panel-default">
-                        <div class="panel-heading">
-                            <h3 class="panel-title">
-                                WiFi Client Mode
-                                <span class="pull-right">
-                                    <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="reloadData();">
-                                        Refresh
-                                    </button>
-                                </span>
-                            </h3>
-                        </div>
-                        <div class="panel-body">
-                            <div class="col-md-12" ng-show="connected">
-                                <div class="row">
-                                    <div class="input-group">
-                                        <span class="input-group-addon">Interface</span>
-                                        <input type="text" class="form-control" ng-model="connectedInterface" disabled>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width input-group-addon">SSID</span>
-                                        <input type="text" class="form-control" ng-model="connectedSSID" disabled>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width input-group-addon">IP</span>
-                                        <input type="text" class="form-control" ng-model="connectedIP" disabled>
-                                    </div>
-                                    <br/>
-                                    <button class="btn btn-default" ng-click="checkConnection()" ng-hide="disconnecting">Refresh</button>
-                                    <button class="btn btn-default" ng-click="disconnect()" ng-hide="disconnecting">Disconnect</button>
-                                    <img src="img/throbber.gif" ng-show="disconnecting">
+                            <div class="row" ng-show="accessPoints.length">
+                                <div class="input-group">
+                                    <span class="input-group-addon">Access Point</span>
+                                    <select class="form-control" ng-options="ap.ssid for ap in accessPoints track by ap.mac" ng-model="selectedAP"></select>
                                 </div>
+                                <br/>
+                                <div class="input-group" ng-show="(selectedAP['security'] !== 'Open')">
+                                    <span class="input-group-addon">Password</span>
+                                    <input type="password" class="form-control" ng-model="key">
+                                </div>
+                                <br/>
                             </div>
-                            <div class="col-md-12" ng-hide="connected">
-                                <div class="row">
-                                    <div class="input-group">
-                                        <span class="input-group-addon">Interface</span>
-                                        <select class="form-control" ng-model="selectedInterface" ng-disabled="scanning">
-                                            <option ng-repeat="interface in interfaces">{{ interface }}</option>
-                                        </select>
-                                        <span class="input-group-btn">
-                                            <button ng-disabled="scanning" class="btn btn-default" type="button" ng-click="scanForNetworks()">
-                                                <span ng-hide="scanning">Scan</span>
-                                                <img class="image-small-18" src="img/throbber.gif" ng-show="scanning">
-                                            </button>
-                                        </span>
-                                    </div>
-                                    <small class="text-muted" ng-hide="accessPoints.length !== 0" ng-show="selectedInterface === 'wlan1' || selectedInterface === 'wlan1mon'"> Note: Choosing wlan1 will interfere with PineAP.</small>
-                                    <div class="alert well-sm alert-warning" role="alert" ng-show="noNetworkFound">
-                                        <span>No networks were found.</span>
-                                    </div>
-                                    <br/>
+                            <br/><br/>
+                            <div class="row" ng-show="accessPoints.length">
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-2 input-group-addon">BSSID</span>
+                                    <input type="text" class="form-control" ng-model="selectedAP['mac']" disabled>
                                 </div>
-                                <div class="row" ng-show="accessPoints.length">
-                                    <div class="input-group">
-                                        <span class="input-group-addon">Access Point</span>
-                                        <select class="form-control" ng-options="ap.ssid for ap in accessPoints track by ap.mac" ng-model="selectedAP"></select>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group" ng-show="(selectedAP['security'] !== 'Open')">
-                                        <span class="input-group-addon">Password</span>
-                                        <input type="password" class="form-control" ng-model="key">
-                                    </div>
-                                    <br/>
+                                <br/>
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-2 input-group-addon">SSID</span>
+                                    <input type="text" class="form-control" ng-model="selectedAP['ssid']" disabled>
                                 </div>
-                                <br/><br/>
-                                <div class="row" ng-show="accessPoints.length">
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width-2 input-group-addon">BSSID</span>
-                                        <input type="text" class="form-control" ng-model="selectedAP['mac']" disabled>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width-2 input-group-addon">SSID</span>
-                                        <input type="text" class="form-control" ng-model="selectedAP['ssid']" disabled>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width-2 input-group-addon">Channel</span>
-                                        <input type="text" class="form-control" ng-model="selectedAP['channel']" disabled>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width-2 input-group-addon">Signal</span>
-                                        <input type="text" class="form-control" ng-model="selectedAP['signal']" disabled>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width-2 input-group-addon">Quality</span>
-                                        <input type="text" class="form-control" ng-model="selectedAP['quality']" disabled>
-                                    </div>
-                                    <br/>
-                                    <div class="input-group">
-                                        <span class="fixed-addon-width-2 input-group-addon">Security</span>
-                                        <input type="text" class="form-control" ng-model="selectedAP['security']" disabled>
-                                    </div>
-                                    <br/>
+                                <br/>
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-2 input-group-addon">Channel</span>
+                                    <input type="text" class="form-control" ng-model="selectedAP['channel']" disabled>
                                 </div>
-                                <div class="row">
-                                    <button class="btn btn-default" ng-click="connectToAP()" ng-show="accessPoints.length" ng-disabled="connecting">
-                                        <span ng-hide="connecting">Connect</span>
-                                        <img class="image-small-18" src="img/throbber.gif" ng-show="connecting">
-                                    </button>
+                                <br/>
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-2 input-group-addon">Signal</span>
+                                    <input type="text" class="form-control" ng-model="selectedAP['signal']" disabled>
                                 </div>
+                                <br/>
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-2 input-group-addon">Quality</span>
+                                    <input type="text" class="form-control" ng-model="selectedAP['quality']" disabled>
+                                </div>
+                                <br/>
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-2 input-group-addon">Security</span>
+                                    <input type="text" class="form-control" ng-model="selectedAP['security']" disabled>
+                                </div>
+                                <br/>
+                            </div>
+                            <div class="row">
+                                <button class="btn btn-default" ng-click="connectToAP()" ng-show="accessPoints.length" ng-disabled="connecting">
+                                    <span ng-hide="connecting">Connect</span>
+                                    <img class="image-small-18" src="img/throbber.gif" ng-show="connecting">
+                                </button>
                             </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            <div class="col-md-6 controller" ng-controller="NetworkingInfoController">
                 <div class="panel panel-default">
                     <div class="panel-heading">
                         <h3 class="panel-title">
                             Interface actions
-                            <span class="pull-right">
-                                <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="getInterfaces();">
-                                    Refresh
-                                </button>
-                            </span>
                         </h3>
                     </div>
                     <div class="panel-body">
@@ -264,6 +153,7 @@
                         </div>
                     </div>
                 </div>
+
                 <div class="panel panel-default">
                     <div class="panel-heading">
                         <h3 class="panel-title">Info</h3>
@@ -284,8 +174,109 @@
                     </div>
                 </div>
             </div>
-        </div>
 
+            <div class="col-md-6">
+                <div class="panel panel-default" ng-controller="OUILookupController">
+                    <div class="panel-heading">
+                        <h3 class="panel-title">OUI Lookup
+                            <span class="dropdown">
+                            <button class="btn btn-xs btn-default dropdown-toggle" type="button" id="OUIDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                                <span class="caret"></span>
+                            </button>
+                            <ul class="dropdown-menu" aria-labelledby="OUIDropdown">
+                                <li ng-click="removeOUIDatabase()"><a>Remove OUI Database</a></li>
+                            </ul>
+                        </span>
+                        </h3>
+                    </div>
+                    <div class="panel-body">
+                        <div ng-if="isOUIPresent()">
+                            <form class="form-inline" role="form" novalidate>
+                                <div class="form-group">
+                                    <div class="input-group">
+                                        <span class="input-group-addon">MAC Address</span>
+                                        <input name="macAddress" placeholder="00:11:22:33:44:55" type="text" class="form-control" id="macAddress" ng-model="$parent.macAddress">
+                                    </div>
+                                    <br/>
+                                </div>
+                                <div class="btn-group" role="group">
+                                    <button ng-click="lookupMACAddress();" ng-disabled="ouiLoading" class="btn btn-default">
+                                        <span ng-hide="ouiLoading">Lookup</span>
+                                        <img class="image-small-18 center-block" ng-show="ouiLoading" src="img/throbber.gif" />
+                                    </button>
+                                </div>
+                                <br/>
+                            </form>
+                            <br/>
+                            <span ng-show="vendor">{{ vendor }}</span>
+                        </div>
+                        <div ng-if="!isOUIPresent()">
+                            <button ng-click="downloadOUIDatabase()" ng-disabled="gettingOUI" class="btn btn-default">
+                                <span ng-hide="gettingOUI">Download OUI Database</span>
+                                <img class="image-small-18 center-block" ng-show="gettingOUI" src="img/throbber.gif" />
+                            </button>
+                            <br/>
+                            <span class="text-muted">Note: The OUI Database is downloaded from GitHub.com</span>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="panel panel-default controller" ng-controller="NetworkingMACAddressesController">
+                    <div class="panel-heading">
+                        <h3 class="panel-title">MAC Addresses
+                            <span class="dropdown">
+                                <button ng-disabled="modifyingMAC" class="btn btn-xs btn-default dropdown-toggle" type="button" id="NetworkingAccessPointsDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                                    <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu" aria-labelledby="NetworkingAccessPointsDropdown">
+                                    <li ng-disabled="waiting" ng-click="resetMac()"><a>Restore Default MAC Address</a></li>
+                                </ul>
+                            </span>
+                            <span class="pull-right">
+                                <button class="btn btn-default btn-xs btn-fixed-length" ng-disabled="loading" ng-click="reloadData();">
+                                    Refresh
+                                </button>
+                            </span>
+                        </h3>
+                    </div>
+                    <div class="panel-body">
+                        <div class="col-md-12">
+                            <div class="row">
+                                <div class="input-group">
+                                    <span class="input-group-addon">Interface</span>
+                                    <select ng-disabled="modifyingMAC" class="form-control" ng-model="selectedInterface">
+                                        <option ng-repeat="(interface, mac) in interfaces">{{ interface }}</option>
+                                    </select>
+                                </div>
+                                <br/>
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-3 input-group-addon">Current MAC</span>
+                                    <input type="text" class="form-control autoselect" ng-model="interfaces[selectedInterface]" disabled>
+                                </div>
+                                <br/>
+                                <div class="input-group">
+                                    <span class="fixed-addon-width-3 input-group-addon">New MAC</span>
+                                    <input ng-disabled="modifyingMAC" type="text" class="form-control" ng-model="newMac">
+                                </div>
+                                <div class="input-group">
+                                    <div class="checkbox">
+                                        <label><input type="checkbox" value="" ng-model="forceReload">
+                                            Reload Wifi after change
+                                        </label>
+                                    </div>
+                                </div>
+                                <br/>
+                                <button ng-disabled="modifyingMAC" class="btn btn-default" ng-click="setMac()">Set New MAC</button>
+                                <button ng-disabled="modifyingMAC" class="btn btn-default" ng-click="setRandomMac()">Set Random MAC</button>
+                                <img ng-show="modifyingMAC" src="img/throbber.gif"/>
+                                <br/>
+                                <small class="text-muted">Note: Changing MAC addresses will restart the WiFi.</small>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
     </div>
     
     <div class="tab-pane fade" id="networking-config">
@@ -501,15 +492,6 @@
 </div>
 
 <script type="text/javascript">
-    function loadActiveTabData() {
-        $('.tab-pane.active .controller').each(function(index) {
-            var controller = angular.element( $(this)[0] ).scope();
-            if (typeof controller.reloadData === "function") { 
-                controller.reloadData();
-            }
-        });
-    }
-
     $(function() {
         $('.tabs-block a').click(function(event) {
             event.preventDefault();

+ 2 - 1
src/pineapple/modules/Recon/js/module.js

@@ -327,7 +327,8 @@ registerController('ReconController', ['$api', '$scope', '$rootScope', '$interva
         $scope.loadingScan = true;
         $api.request({
             module: 'Recon',
-            action: 'getScans'
+            action: 'getScans',
+            from: 'displayScan'
         }, function(response) {
             if(response.error === undefined) {
                 $scope.scans = response.scans;