提交 22658c79 authored 作者: João Mesquita's avatar João Mesquita

FS-8013 #resolve Make use of bower to manage dependencies and use wiredep to…

FS-8013 #resolve Make use of bower to manage dependencies and use wiredep to inject them on the main index.html file.
上级 d262f07d
......@@ -26,12 +26,19 @@ module.exports = function (grunt) {
livereload: true
},
files: [
'index.html',
'partials/{,*/}*.html',
'js/{,*/}*.js',
'images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
]
}
},
wiredep: {
app: {
src: ['index.html'],
ignorePath: /\.\.\//
}
},
connect: {
options: {
port: 9001,
......@@ -56,5 +63,5 @@ module.exports = function (grunt) {
},
});
grunt.registerTask('serve', ['connect:livereload', 'watch']);
grunt.registerTask('serve', ['wiredep', 'connect:livereload', 'watch']);
};
{
"name": "verto_communicator",
"version": "0.0.1",
"authors": [
"Jonatas Oliveira <jonatas@evolux.net.br>",
"Ítalo Rossi <italo@evolux.net.br>",
"Stefan Yohansson <stefan@evolux.net.br>",
"João Mesquita <jmesquita@indicium.com.ar>"
],
"description": "Verto Communicator",
"main": "index.html",
"keywords": [
"freeswitch",
"verto",
"webrtc"
],
"license": "MPL",
"homepage": "www.freeswitch.org",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"angular-gravatar": "~0.4.1",
"bootstrap": "~3.3.5",
"angular-toastr": "~1.4.1",
"angular": "~1.3.15",
"angular-route": "~1.3.15",
"angular-prompt": "~1.1.1",
"angular-animate": "~1.3.15",
"angular-cookies": "~1.3.15",
"jquery": "~2.1.4",
"angular-fullscreen": "~1.0.1",
"ngstorage": "~0.3.9",
"angular-timer": "~1.3.3",
"angular-tooltips": "~0.1.21",
"jquery-cookie": "~1.4.1",
"jquery-json": "~2.5.1",
"datatables": "~1.10.8",
"angular-bootstrap": "~0.13.3",
"bootstrap-material-design": "~0.3.0"
},
"resolutions": {
"angular": "~1.3.15"
},
"overrides":{
"bootstrap" : {
"main": [
"less/bootstrap.less",
"dist/css/bootstrap.css",
"dist/js/bootstrap.js"
]
},
"jquery-json" : {
"main": [
"src/jquery.json.js"
]
}
}
}
[
"Jonatas Oliveira <jonatas@evolux.net.br>",
"Ítalo Rossi <italo@evolux.net.br>",
"Stefan Yohansson <stefan@evolux.net.br>"
"Stefan Yohansson <stefan@evolux.net.br>",
"João Mesquita <jmesquita@indicium.com.ar>"
]
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff was suppressed by a .gitattributes entry.
.nthChildTest > div:nth-child(odd) {
display: none;
}
.jsDataTable > thead > tr > th {
border-width:4px;
padding: 2px;
font-size:10pt;
text-align: left;
}
.jsDataTable > thead > tr > th.notSortable {
padding: 5px;
}
.jsDataTable > tbody > tr > td {
border-bottom: 1px solid #ccc;
padding: 2px;
vertical-align: middle;
height:25px;
font-size: 10px;
}
.jsDataTable {
font-family: verdana;
font-size:10pt;
}
.jsDataTable > tbody > tr:nth-child(odd),
.jsDataTable > tbody > tr.odd {
background-color: #ffffee;
}
.jsDataTable > tbody > tr:nth-child(even),
.jsDataTable > tbody > tr.even {
background-color: #ffffff;
}
.jsDataTable > thead th.sortAsc,
.jsDataTable > thead th.sortDesc {
color:ffffff;
background-color: #7777ff;
background-position: right center;
background-repeat: no-repeat;
}
.jsDataTable > thead th.sortAsc {
background-image: url(/images/table/asc.png);
}
.jsDataTable > thead th.sortDesc {
background-image: url(/images/table/desc.png);
}
.jsDataTable.clickable > tbody > tr,
.clickable > .jsDataTable > tbody > tr {
cursor: pointer;
}
.jsDataTable.clickable > tbody > tr.nonDataRow,
.clickable > .jsDataTable > tbody > tr.nonDataRow {
cursor: auto;
}
.withripple {
position: relative;
}
.ripple-wrapper {
position: absolute;
top: 0;
left: 0;
z-index: 1;
width: 100%;
height: 100%;
overflow: hidden;
border-radius: inherit;
pointer-events: none;
}
.ripple {
position: absolute;
width: 20px;
height: 20px;
margin-left: -10px;
margin-top: -10px;
border-radius: 100%;
background-color: rgba(0, 0, 0, 0.05);
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
-webkit-transform-origin: 50%;
-ms-transform-origin: 50%;
transform-origin: 50%;
opacity: 0;
pointer-events: none;
}
.ripple.ripple-on {
transition: opacity 0.15s ease-in 0s, -webkit-transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s;
transition: opacity 0.15s ease-in 0s, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s;
opacity: 0.1;
}
.ripple.ripple-out {
transition: opacity 0.1s linear 0s !important;
opacity: 0;
}
/*# sourceMappingURL=ripples.css.map */
\ No newline at end of file
@font-face {
font-family: 'RobotoDraft';
font-style: normal;
font-weight: 400;
src: local('RobotoDraft'), local('RobotoDraft-Regular'), local('Roboto-Regular'), url(../fonts/RobotoDraftRegular.woff2) format('woff2'), url(../fonts/RobotoDraftRegular.woff) format('woff');
}
@font-face {
font-family: 'RobotoDraft';
font-style: normal;
font-weight: 500;
src: local('RobotoDraft Medium'), local('RobotoDraft-Medium'), local('Roboto-Medium'), url(../fonts/RobotoDraftMedium.woff2) format('woff2'), url(../fonts/RobotoDraftMedium.woff) format('woff');
}
@font-face {
font-family: 'RobotoDraft';
font-style: normal;
font-weight: 700;
src: local('RobotoDraft Bold'), local('RobotoDraft-Bold'), local('Roboto-Bold'), url(../fonts/RobotoDraftBold.woff2) format('woff2'), url(../fonts/RobotoDraftBold.woff) format('woff');
}
@font-face {
font-family: 'RobotoDraft';
font-style: italic;
font-weight: 400;
src: local('RobotoDraft Italic'), local('RobotoDraft-Italic'), local('Roboto-Italic'), url(../fonts/RobotoDraftItalic.woff2) format('woff2'), url(../fonts/RobotoDraftItalic.woff) format('woff');
}
/*# sourceMappingURL=roboto.css.map */
\ No newline at end of file
......@@ -11,18 +11,19 @@
<title ng-bind="'[' + title + '] ' + 'FreeSWITCH Verto&trade; Video Transcoding'"></title>
<!-- bower:css -->
<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="bower_components/angular-toastr/dist/angular-toastr.css" />
<link rel="stylesheet" href="bower_components/angular-tooltips/dist/angular-tooltips.min.css" />
<link rel="stylesheet" href="bower_components/datatables/media/css/jquery.dataTables.css" />
<link rel="stylesheet" href="bower_components/bootstrap-material-design/dist/css/material.css" />
<link rel="stylesheet" href="bower_components/bootstrap-material-design/dist/css/ripples.css" />
<!-- endbower -->
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="css/bootstrap/bootstrap.min.css">
<!--<link rel="stylesheet" type="text/css" href="css/jquery.mobile.min.css">-->
<!--<link rel="stylesheet" type="text/css" href="css/jsontable.css">-->
<link rel="stylesheet" type="text/css" href="css/material-design/roboto.min.css">
<link rel="stylesheet" type="text/css" href="css/material-design/material.min.css">
<link rel="stylesheet" type="text/css" href="css/material-design/material-fullpalette.min.css">
<link rel="stylesheet" type="text/css" href="css/material-design/ripples.min.css">
<link rel="stylesheet" type="text/css" href="css/angular-toastr/angular-toastr.min.css">
<link rel="stylesheet" type="text/css" href="css/angular-tooltips.min.css">
<link rel="stylesheet" type="text/css" href="css/verto.css">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
......@@ -51,34 +52,38 @@
<video class="hide" id="webcam" autoplay="autoplay" style="width:100%; height:100%; object-fit:inherit;"></video>
<script type="text/javascript" src="js/3rd-party/getScreenId.js"></script>
<script type="text/javascript" src="js/jquery/jquery-2.1.1.min.js"></script>
<!--<script type="text/javascript" src="js/jquery/jquery.mobile.min.js"></script>-->
<script type="text/javascript" src="js/jquery/jquery.json-2.4.min.js"></script>
<script type="text/javascript" src="js/jquery/jquery.cookie.js"></script>
<script type="text/javascript" src="js/jquery/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="js/bootstrap/bootstrap.min.js"></script>
<script type="text/javascript" src="js/material-design/material.min.js"></script>
<script type="text/javascript" src="js/material-design/ripples.min.js"></script>
<script type="text/javascript" src="js/angularjs/angular.min.js"></script>
<script type="text/javascript" src="js/angularjs/angular-animate.min.js"></script>
<script type="text/javascript" src="js/angularjs/angular-route.min.js"></script>
<script type="text/javascript" src="js/angularjs/angular-cookies.min.js"></script>
<script type="text/javascript" src="js/angularui/ui-bootstrap-tpls-0.13.0.min.js"></script>
<script type="text/javascript" src="js/angularjs/angular-timer-all.min.js"></script>
<script type="text/javascript" src="js/angularjs/angular-storage.min.js"></script>
<script type="text/javascript" src="js/angularjs/angular-fullscreen.js"></script>
<script type="text/javascript" src="js/angularjs/angular-prompt.js"></script>
<script type="text/javascript" src="js/angularjs/angular-tooltips.min.js"></script>
<script type="text/javascript" src="js/angular-toastr/angular-toastr.tpls.min.js"></script>
<script type="text/javascript" src="js/angular-gravatar/angular-gravatar.js"></script>
<!-- bower:js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/angular/angular.js"></script>
<script src="bower_components/angular-gravatar/build/angular-gravatar.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
<script src="bower_components/angular-toastr/dist/angular-toastr.tpls.js"></script>
<script src="bower_components/angular-route/angular-route.js"></script>
<script src="bower_components/angular-bootstrap/ui-bootstrap-tpls.js"></script>
<script src="bower_components/angular-prompt/dist/angular-prompt.js"></script>
<script src="bower_components/angular-animate/angular-animate.js"></script>
<script src="bower_components/angular-cookies/angular-cookies.js"></script>
<script src="bower_components/angular-fullscreen/src/angular-fullscreen.js"></script>
<script src="bower_components/ngstorage/ngStorage.js"></script>
<script src="bower_components/momentjs/moment.js"></script>
<script src="bower_components/humanize-duration/humanize-duration.js"></script>
<script src="bower_components/angular-timer/dist/angular-timer.js"></script>
<script src="bower_components/angular-tooltips/dist/angular-tooltips.min.js"></script>
<script src="bower_components/jquery-cookie/jquery.cookie.js"></script>
<script src="bower_components/jquery-json/src/jquery.json.js"></script>
<script src="bower_components/datatables/media/js/jquery.dataTables.js"></script>
<script src="bower_components/bootstrap-material-design/dist/js/material.js"></script>
<script src="bower_components/bootstrap-material-design/dist/js/ripples.js"></script>
<!-- endbower -->
<script type="text/javascript" src="../js/src/jquery.jsonrpcclient.js"></script>
<script type="text/javascript" src="../js/src/jquery.FSRTC.js"></script>
<script type="text/javascript" src="../js/src/jquery.verto.js"></script>
<script type="text/javascript" src="js/3rd-party/getScreenId.js"></script>
<script type="text/javascript" src="js/3rd-party/md5.min.js"></script>
<script type="text/javascript" src="js/filters.js"></script>
<script type="text/javascript" src="js/verto-service.js"></script>
......
/**
* @license AngularJS v1.3.15
* (c) 2010-2014 Google, Inc. http://angularjs.org
* License: MIT
*/
(function(window, angular, undefined) {'use strict';
/**
* @ngdoc module
* @name ngCookies
* @description
*
* # ngCookies
*
* The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.
*
*
* <div doc-module-components="ngCookies"></div>
*
* See {@link ngCookies.$cookies `$cookies`} and
* {@link ngCookies.$cookieStore `$cookieStore`} for usage.
*/
angular.module('ngCookies', ['ng']).
/**
* @ngdoc service
* @name $cookies
*
* @description
* Provides read/write access to browser's cookies.
*
* Only a simple Object is exposed and by adding or removing properties to/from this object, new
* cookies are created/deleted at the end of current $eval.
* The object's properties can only be strings.
*
* Requires the {@link ngCookies `ngCookies`} module to be installed.
*
* @example
*
* ```js
* angular.module('cookiesExample', ['ngCookies'])
* .controller('ExampleController', ['$cookies', function($cookies) {
* // Retrieving a cookie
* var favoriteCookie = $cookies.myFavorite;
* // Setting a cookie
* $cookies.myFavorite = 'oatmeal';
* }]);
* ```
*/
factory('$cookies', ['$rootScope', '$browser', function($rootScope, $browser) {
var cookies = {},
lastCookies = {},
lastBrowserCookies,
runEval = false,
copy = angular.copy,
isUndefined = angular.isUndefined;
//creates a poller fn that copies all cookies from the $browser to service & inits the service
$browser.addPollFn(function() {
var currentCookies = $browser.cookies();
if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
lastBrowserCookies = currentCookies;
copy(currentCookies, lastCookies);
copy(currentCookies, cookies);
if (runEval) $rootScope.$apply();
}
})();
runEval = true;
//at the end of each eval, push cookies
//TODO: this should happen before the "delayed" watches fire, because if some cookies are not
// strings or browser refuses to store some cookies, we update the model in the push fn.
$rootScope.$watch(push);
return cookies;
/**
* Pushes all the cookies from the service to the browser and verifies if all cookies were
* stored.
*/
function push() {
var name,
value,
browserCookies,
updated;
//delete any cookies deleted in $cookies
for (name in lastCookies) {
if (isUndefined(cookies[name])) {
$browser.cookies(name, undefined);
}
}
//update all cookies updated in $cookies
for (name in cookies) {
value = cookies[name];
if (!angular.isString(value)) {
value = '' + value;
cookies[name] = value;
}
if (value !== lastCookies[name]) {
$browser.cookies(name, value);
updated = true;
}
}
//verify what was actually stored
if (updated) {
updated = false;
browserCookies = $browser.cookies();
for (name in cookies) {
if (cookies[name] !== browserCookies[name]) {
//delete or reset all cookies that the browser dropped from $cookies
if (isUndefined(browserCookies[name])) {
delete cookies[name];
} else {
cookies[name] = browserCookies[name];
}
updated = true;
}
}
}
}
}]).
/**
* @ngdoc service
* @name $cookieStore
* @requires $cookies
*
* @description
* Provides a key-value (string-object) storage, that is backed by session cookies.
* Objects put or retrieved from this storage are automatically serialized or
* deserialized by angular's toJson/fromJson.
*
* Requires the {@link ngCookies `ngCookies`} module to be installed.
*
* @example
*
* ```js
* angular.module('cookieStoreExample', ['ngCookies'])
* .controller('ExampleController', ['$cookieStore', function($cookieStore) {
* // Put cookie
* $cookieStore.put('myFavorite','oatmeal');
* // Get cookie
* var favoriteCookie = $cookieStore.get('myFavorite');
* // Removing a cookie
* $cookieStore.remove('myFavorite');
* }]);
* ```
*/
factory('$cookieStore', ['$cookies', function($cookies) {
return {
/**
* @ngdoc method
* @name $cookieStore#get
*
* @description
* Returns the value of given cookie key
*
* @param {string} key Id to use for lookup.
* @returns {Object} Deserialized cookie value.
*/
get: function(key) {
var value = $cookies[key];
return value ? angular.fromJson(value) : value;
},
/**
* @ngdoc method
* @name $cookieStore#put
*
* @description
* Sets a value for given cookie key
*
* @param {string} key Id for the `value`.
* @param {Object} value Value to be stored.
*/
put: function(key, value) {
$cookies[key] = angular.toJson(value);
},
/**
* @ngdoc method
* @name $cookieStore#remove
*
* @description
* Remove given cookie
*
* @param {string} key Id of the key-value pair to delete.
*/
remove: function(key) {
delete $cookies[key];
}
};
}]);
})(window, window.angular);
\ No newline at end of file
(function(window) {
var createModule = function(angular) {
var module = angular.module('FBAngular', []);
module.factory('Fullscreen', ['$document', '$rootScope', function ($document,$rootScope) {
var document = $document[0];
// ensure ALLOW_KEYBOARD_INPUT is available and enabled
var isKeyboardAvailbleOnFullScreen = (typeof Element !== 'undefined' && 'ALLOW_KEYBOARD_INPUT' in Element) && Element.ALLOW_KEYBOARD_INPUT;
var emitter = $rootScope.$new();
// listen event on document instead of element to avoid firefox limitation
// see https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode
$document.on('fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', function(){
emitter.$emit('FBFullscreen.change', serviceInstance.isEnabled());
});
var serviceInstance = {
$on: angular.bind(emitter, emitter.$on),
all: function() {
serviceInstance.enable( document.documentElement );
},
enable: function(element) {
if(element.requestFullScreen) {
element.requestFullScreen();
} else if(element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if(element.webkitRequestFullscreen) {
// Safari temporary fix
if (/Version\/[\d]{1,2}(\.[\d]{1,2}){1}(\.(\d){1,2}){0,1} Safari/.test(navigator.userAgent)) {
element.webkitRequestFullscreen();
} else {
element.webkitRequestFullscreen(isKeyboardAvailbleOnFullScreen);
}
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
}
},
cancel: function() {
if(document.cancelFullScreen) {
document.cancelFullScreen();
} else if(document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if(document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
},
isEnabled: function(){
var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
return fullscreenElement ? true : false;
},
toggleAll: function(){
serviceInstance.isEnabled() ? serviceInstance.cancel() : serviceInstance.all();
},
isSupported: function(){
var docElm = document.documentElement;
var requestFullscreen = docElm.requestFullScreen || docElm.mozRequestFullScreen || docElm.webkitRequestFullscreen || docElm.msRequestFullscreen;
return requestFullscreen ? true : false;
}
};
return serviceInstance;
}]);
module.directive('fullscreen', ['Fullscreen', function(Fullscreen) {
return {
link : function ($scope, $element, $attrs) {
// Watch for changes on scope if model is provided
if ($attrs.fullscreen) {
$scope.$watch($attrs.fullscreen, function(value) {
var isEnabled = Fullscreen.isEnabled();
if (value && !isEnabled) {
Fullscreen.enable($element[0]);
$element.addClass('isInFullScreen');
} else if (!value && isEnabled) {
Fullscreen.cancel();
$element.removeClass('isInFullScreen');
}
});
// Listen on the `FBFullscreen.change`
// the event will fire when anything changes the fullscreen mode
var removeFullscreenHandler = Fullscreen.$on('FBFullscreen.change', function(evt, isFullscreenEnabled){
if(!isFullscreenEnabled){
$scope.$evalAsync(function(){
$scope.$eval($attrs.fullscreen + '= false');
$element.removeClass('isInFullScreen');
});
}
});
$scope.$on('$destroy', function() {
removeFullscreenHandler();
});
} else {
if ($attrs.onlyWatchedProperty !== undefined) {
return;
}
$element.on('click', function (ev) {
Fullscreen.enable( $element[0] );
});
}
}
};
}]);
return module;
};
if (typeof define === "function" && define.amd) {
define("FBAngular", ['angular'], function (angular) { return createModule(angular); } );
} else {
createModule(window.angular);
}
})(window);
angular.module('cgPrompt',['ui.bootstrap']);
angular.module('cgPrompt').factory('prompt',['$modal','$q',function($modal,$q){
var prompt = function(options){
var defaults = {
title: '',
message: '',
input: false,
label: '',
value: '',
values: false,
buttons: [
{label:'Cancel',cancel:true},
{label:'OK',primary:true}
]
};
if (options === undefined){
options = {};
}
for (var key in defaults) {
if (options[key] === undefined) {
options[key] = defaults[key];
}
}
var defer = $q.defer();
$modal.open({
templateUrl:'partials/angular-prompt.html',
controller: 'cgPromptCtrl',
resolve: {
options:function(){
return options;
}
}
}).result.then(function(result){
if (options.input){
defer.resolve(result.input);
} else {
defer.resolve(result.button);
}
}, function(){
defer.reject();
});
return defer.promise;
};
return prompt;
}
]);
angular.module('cgPrompt').controller('cgPromptCtrl',['$scope','options','$timeout',function($scope,options,$timeout){
$scope.input = {name:options.value};
$scope.options = options;
$scope.buttonClicked = function(button){
if (button.cancel){
$scope.$dismiss();
return;
}
if (options.input && angular.element(document.querySelector('#cgPromptForm')).scope().cgPromptForm.$invalid){
$scope.changed = true;
return;
}
$scope.$close({button:button,input:$scope.input.name});
};
$scope.submit = function(){
var ok;
angular.forEach($scope.options.buttons,function(button){
if (button.primary){
ok = button;
}
});
if (ok){
$scope.buttonClicked(ok);
}
};
$timeout(function(){
var elem = document.querySelector('#cgPromptInput');
if (elem) {
if (elem.select) {
elem.select();
}
if (elem.focus) {
elem.focus();
}
}
},100);
}]);
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论