]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7800 [verto_communicator] - Added an option in user's hover buttons to open anothe...
authorJaon EarlWolf <jamonsterr@gmail.com>
Fri, 27 Nov 2015 18:11:16 +0000 (15:11 -0300)
committerJaon EarlWolf <jamonsterr@gmail.com>
Fri, 27 Nov 2015 18:21:50 +0000 (15:21 -0300)
html5/verto/verto_communicator/src/css/verto.css
html5/verto/verto_communicator/src/partials/incall.html
html5/verto/verto_communicator/src/partials/video_call.html
html5/verto/verto_communicator/src/vertoControllers/controllers/ChatController.js
html5/verto/verto_communicator/src/vertoControllers/controllers/DialPadController.js
html5/verto/verto_communicator/src/vertoControllers/controllers/InCallController.js
html5/verto/verto_communicator/src/vertoControllers/controllers/MainController.js
html5/verto/verto_communicator/src/vertoDirectives/directives/videoTag.js
html5/verto/verto_communicator/src/vertoService/services/vertoService.js

index 4e0175d583190c0df4e9570535b17fd4d7d68250..b8514ac0849000ff2e6325cc75def1d7c70a1356 100644 (file)
@@ -850,6 +850,10 @@ body .modal-body .btn-group .btn.active {
         padding-right: 360px;
     }
 
+    .watcher #wrapper {
+      padding-right: 0;
+    }
+
     #wrapper.toggled {
         padding-right: 0;
     }
@@ -1545,3 +1549,42 @@ body:-webkit-full-screen #incall .video-footer {
 #preview .refresh {
   margin: 15px 0px 0px 0px;
 }
+
+.watcher {
+  padding: 0;
+  background-color: #333333;
+}
+
+.watcher .navbar, .watcher #sidebar-wrapper, .watcher #dialpad {
+  display: none;
+}
+
+.watcher #wrapper.toggled {
+  padding-right: 0;
+}
+
+.watcher #incall .panel {
+  margin: 0;
+}
+
+.watcher #video-tag-wrapper {
+  background: linear-gradient(to bottom, #272627, #27252A);
+  background-color: #27252A;
+}
+
+.watcher #incall .video-call {
+  width: 100%;
+  height: 100%;
+  padding: 0;
+  max-width: none;
+  max-height: none;
+}
+
+.watcher #webcam {
+  max-width: 160.78vh;
+  margin: auto;
+}
+
+.watcher .spinner {
+  top: 20%;
+}
index 702c943994a4626a6ecdec4d19e210207ddac684..9f58c25456fd190fa9f8d94b7b6f2013db113105 100644 (file)
@@ -1,5 +1,5 @@
 <div class="centered-block-frame" id="incall">
-  <div class="col-md-12 centered-block" ng-class="{'video-call': storage.data.videoCall, 'phone-call': !storage.data.videoCall}">
+  <div class="col-md-12 centered-block" ng-class="storage.data.videoCall || watcher ? 'video-call' : 'phone-call'">
     <div class="slide-animate height100" ng-include="callTemplate"></div>
   </div>
 </div>
index 9633149c77f68d6c23988ada7783534e589c41f3..d6fb097b67348133cc04c4a80ea727556ab2e2de 100644 (file)
@@ -1,6 +1,6 @@
 <div class="panel panel-default shadow-z-0">
   <div class="video-wrapper">
-    <div class="video-hover-buttons" ng-show="verto.data.callState == 'active'">
+    <div class="video-hover-buttons" ng-show="verto.data.callState == 'active' && !watcher">
       <div id="moderator-tools" ng-show="verto.data.confRole == 'moderator'">
         <button tooltip-placement="bottom" tooltip-title="Play" uib-tooltip="Play"
                 class="btn btn-material-blue-900" ng-click="play()">
             </li>
           </ul>
         </div>
+        <div class="btn-group" ng-show="conf.canvasCount > 1">
+          <button tooltip-placement="bottom" tooltip-title="Popup" uib-tooltips="Popup" type="button" class="btn btn-material-blue-900 dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+            <i class="mdi-image-filter-none"></i>
+            <span class="caret"></span>
+          </button>
+          <ul class="dropdown-menu">
+            <li ng-repeat="canvas in canvases">
+              <a ng-click="confPopup(canvas.id)">{{ canvas.name }}</a>
+            </li>
+          </ul>
+        </div>
       </div>
     </div>
     <div class="video-tag-wrapper" id="video-tag-wrapper" ng-dblclick="goFullscreen()" show-controls>
       <div class="row">
         <div class="col-md-6 col-xs-6 text-left">
           <div class="video-timer">
-            <timer start-time="start_time" autostart="false" interval="1000">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>
+            <span ng-show="watcher" style="font-size: 18px">Room {{ extension }} - Canvas {{ canvasID }}</span>
+            <timer start-time="start_time" autostart="false" interval="1000" ng-if="!watcher">{{hhours}}:{{mminutes}}:{{sseconds}}</timer>
           </div>
         </div>
         <div class="col-md-6 col-xs-6 text-right">
           <button class="btn btn-danger" ng-click="hangup()">
             <i class="mdi-communication-call-end"></i>
-            End Call
+            {{ watcher ? 'Close' : 'End Call' }}
           </button>
         </div>
       </div>
index 3129db87c7d216f05832b1ec648e176bd5fb2c73..99c6359c965311e7364937f819893f122bd315f4 100644 (file)
       });
 
       $rootScope.$on('members.del', function(event, uuid) {
+        if ($rootScope.watcher && $rootScope.master === uuid) {
+          verto.hangup();
+          window.close();
+        }
+
         $scope.$apply(function() {
           var memberIdx = findMemberByUUID(uuid);
           if (memberIdx != -1) {
index 305befeea11b621c56fc2b9595b7951f9ea73418..305e4e60fbc7acf0dd98946301666081db912fb9 100644 (file)
 
         eventQueue.process();
 
+        if ($location.search().autocall) {
+            $rootScope.dialpadNumber = $location.search().autocall;
+            delete $location.search().autocall;
+            call($rootScope.dialpadNumber);
+            if($rootScope.watcher) {
+              return;
+            }
+        }
+
         $scope.call_history = CallHistory.all();
         $scope.history_control = CallHistory.all_control();
         $scope.has_history = Object.keys($scope.call_history).length;
         /**
          * fill dialpad via querystring [?autocall=\d+]
          */
-        if ($location.search().autocall) {
-            $rootScope.dialpadNumber = $location.search().autocall;
-           delete $location.search().autocall;
-            call($rootScope.dialpadNumber);
-        }
 
        /**
         * fill in dialpad via config.json
             return false;
           }
 
+          if (extension.indexOf('-canvas-') != -1) {
+            $rootScope.watcher = true;
+            verto.call($rootScope.dialpadNumber, null, { useCamera: false, useMic: false, caller_id_name: null, userVariables: {}, caller_id_number: null, mirrorInput: false });
+            $location.path('/incall');
+            return;
+          }
+
           storage.data.mutedVideo = false;
           storage.data.mutedMic = false;
 
index 93e510d5e33a8410ea6ae93e5dbc948226222de6..10887d3195598597427503d6306cb56b9a4bd8d1 100644 (file)
@@ -15,7 +15,6 @@
         $scope.dialpadTemplate = '';
         $scope.incall = true;
 
-
         if (storage.data.videoCall) {
           $scope.callTemplate = 'partials/video_call.html';
         }
@@ -25,6 +24,7 @@
             if($scope.chatStatus) {
               $scope.openChat();
             }
+            buildCanvasesData();
           });
         });
 
           $rootScope.$emit('changedSpeaker', speakerId);
         };
 
+        $scope.confPopup = function(canvas_id) {
+          var s = window.location.href;
+          var curCall = verto.data.call.callID;
+          var extension = verto.data.call.params.remote_caller_id_number;
+          var width = 465, height = 360;
+          var x = screen.width/2 - width/2
+          var y = screen.height/2 - height/2
+
+          s = s.replace(/\#.*/, '');
+          s += "#/?sessid=random&master=" + curCall + "&watcher=true&extension=" + extension+ "&canvas_id=" + canvas_id;
+
+          console.log("opening new window to " + s);
+          var popup = window.open(s, "canvas_window_" + canvas_id, "toolbar=0,location=0,menubar=0,directories=0,width=" + width + ",height=" + height, + ',left=' + x + ',top=' + y);
+          popup.moveTo(x, y);
+        };
+
         $scope.screenshare = function() {
           if(verto.data.shareCall) {
             verto.screenshareHangup();
           verto.screenshare(storage.data.called_number);
         };
 
+        function buildCanvasesData() {
+          $scope.conf = verto.data.conf.params.laData;
+          $scope.canvases = [{ id: 1, name: 'Super Canvas' }];
+          for (var i = 1; i < $scope.conf.canvasCount; i++) {
+            $scope.canvases.push({ id: i+1, name: 'Canvas ' + (i+1) });
+          }
+        }
+
         $scope.muteMic = verto.muteMic;
         $scope.muteVideo = verto.muteVideo;
 
index 3c245301a4a5b2aaed3817bc849f7c78ccb232fd..5f965a2a7464f31581ecf8ac49a08d6726ca7add 100644 (file)
@@ -8,6 +8,24 @@
 
       console.debug('Executing MainController.');
 
+      $rootScope.master = $location.search().master;
+      if ($location.search().watcher === 'true') {
+        $rootScope.watcher = true;
+        angular.element(document.body).addClass('watcher');
+        var dialpad;
+        var extension = dialpad = $location.search().extension;
+        var canvasID = $location.search().canvas_id;
+
+        if (dialpad) {
+          if (canvasID) {
+            dialpad += '-canvas-' + canvasID;
+          }
+          $rootScope.extension = extension;
+          $rootScope.canvasID = canvasID;
+          $location.search().autocall = dialpad;
+        }
+      }
+
       var myVideo = document.getElementById("webcam");
       $scope.verto = verto;
       $scope.storage = storage;
           return;
         }
 
+        if ($rootScope.watcher) {
+          window.close();
+          return;
+        }
+
         //var hangupCallback = function(v, hangup) {
         //  if (hangup) {
         //    $location.path('/dialpad');
index 38b50552f7e1a78684fd139ee41aa9cb528e7600..e40adc879aa0ea9160c63baedfccdc15cdb55c3d 100644 (file)
@@ -32,4 +32,4 @@
     }
   });
 
-})();
\ No newline at end of file
+})();
index 9bf54c3cbd6aa495448cb4c727259fb034dc3925..68ed52c4bc385ed4d92712201a104c42f059f15e 100644 (file)
@@ -584,6 +584,11 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
 
         var that = this;
         function ourBootstrap() {
+          var sessid = $location.search().sessid;
+          if (sessid === 'random') {
+            sessid = $.verto.genUUID();
+            $location.search().sessid = sessid;
+          }
           // Checking if we have a failed connection attempt before
           // connecting again.
           if (data.instance && !data.instance.rpcClient.socketReady()) {
@@ -604,6 +609,7 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
                 googNoiseSuppression: storage.data.googNoiseSuppression || true,
                 googHighpassFilter: storage.data.googHighpassFilter || true
             },
+            sessid: sessid,
             iceServers: storage.data.useSTUN
           }, callbacks);
 
@@ -614,6 +620,7 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
           jQuery.verto.unloadJobs.push(function() {
             that.reloaded = true;
           });
+
           data.instance.deviceParams({
             useCamera: storage.data.selectedVideo,
             useSpeak: storage.data.selectedSpeaker,
@@ -674,10 +681,10 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
        *
        * @param callback
        */
-      call: function(destination, callback) {
+      call: function(destination, callback, custom) {
         console.debug('Attempting to call destination ' + destination + '.');
 
-        var call = data.instance.newCall({
+        var call = data.instance.newCall(angular.extend({
           destination_number: destination,
           caller_id_name: data.name,
           caller_id_number: data.callerid ? data.callerid : data.email,
@@ -694,7 +701,7 @@ vertoService.service('verto', ['$rootScope', '$cookieStore', '$location', 'stora
             email : storage.data.email,
             avatar: "http://gravatar.com/avatar/" + md5(storage.data.email) + ".png?s=600"
           }
-        });
+        }, custom));
 
         data.call = call;