<!DOCTYPE html>
<html lang="en">
<head>
<title>ByOnSite</title>
<meta charset="utf-8">
<link rel="icon" href="logo.ico" type="image/x-icon" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="author" content="Bouygues TP TPINST">
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/css/bootstrap-select.min.css">
<link rel="stylesheet" href="style.css">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/js/bootstrap-select.min.js"></script>
<script src="main.js"></script>
<script src="global.js"></script>
<script src="projects.js"></script>
<script src="users.js"></script>
<script src="screens.js"></script>
<script src="licenses.js"></script>
<script src="authInterceptor.js"></script>
</head>
<body style="height:auto;">
<div ng-app="App">
<div ng-controller="Ctrl">
<div class="container">
<div class="header">
<div class="row">
<div class="col-md-3">
</div>
<div class="col-md-6" style="text-align:center">
<img src="logo_header.png" style="margin-right:30px;margin-top:30px;"/>
</div>
<div class="col-md-3">
<img src="chev_r.PNG" height=100px style="margin-bottom:100px;float:right"/>
</div>
</div>
<br>
<div id="success" ng-show="$root.show_success_notification" class="alert alert-success" role="alert"></div>
<div id="fail" ng-show="$root.show_fail_notification" class="alert alert-danger" role="alert"></div>
<br>
<div ng-show="!project" class="alert alert-primary" role="alert" style="width:100%;text-align:center;">
Please choose a project
</div>
<div ng-show="!credentials && project" class="alert alert-primary" role="alert" style="width:100%;text-align:center;">
Use credentials provided by TPINST to display project details
</div>
</div>
<form class="form-inline">
<label for="inlineFormInputGroup">Choose a project</label>
<img ng-src="http://bouygues-tpinst.fr/ByOnSite/logos/{{$root.projects[project_id].logo}}" ng-show="project"/>
<select class="form-control" id="projects" ng-model="$root.project">
<option value="" disabled selected>Select your project</option>
<option ng-repeat="project in $root.projects" ng-value="{{project.name}}">
{{project.name}}
</option>
</select>
<label class="sr-only" for="inlineFormInputGroup">Username</label>
<div class="input-group mb-2 mr-sm-2 mb-sm-0" ng-show="project">
<div class="input-group-addon">Username</div>
<input type="text" class="form-control" ng-model ="username" id="inlineFormInputGroup" placeholder="Username">
</div>
<label class="sr-only" for="inlineFormInputGroup">Password</label>
<div class="input-group mb-2 mr-sm-2 mb-sm-0" ng-show="project">
<div class="input-group-addon">Password</div>
<input type="password" class="form-control" ng-model ="pwd" id="inlineFormInputGroup" placeholder="Password">
</div>
<button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="right" title="Connection" ng-click="Connect()" ng-show="project">
<i class="fa fa-check"></i>
</button>
<button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="right" title="Refresh page" ng-click="getProjectData()" ng-show="project">
<i class="fa fa-refresh"></i>
</button>
</form>
<br>
<div id="main" ng-show="credentials">
<ul class="nav nav-tabs nav-pills nav-justified" role="tablist">
<li class="nav-item">
<a class="nav-link active" data-toggle="tab" href="#user" role="tab">
<span> Users <span class="badge badge-primary">{{$root.users.length}}</span></span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#screen" role="tab">
<span> Screens <span class="badge badge-primary">{{$root.screens.length}}</span></span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#license" role="tab">
<span> Licenses <span class="badge badge-primary">{{$root.licenses.length}}</span></span>
</a>
</li>
<li ng-if="admin_connected" class="nav-item">
<a class="nav-link" data-toggle="tab" href="#project" role="tab">
<span> Projects <span class="badge badge-primary">{{$root.projects.length}}</span></span>
</a>
</li>
</ul>
<div class="tab-content">
<div id="user" class="tab-pane active show fade" role="tabpanel">
<div class="table-responsive">
<table class="table table-hover">
<thead class="thead-inverse">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Company</th>
<th>Connection code</th>
<th>App code</th>
<th>Language</th>
<th>Access</th>
<th colspan="3" class="add">
<button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Add new user" ng-click="showNewUser($event)">
<i class="fa fa-plus"></i>
</button>
</th>
</tr>
</thead>
<tbody id="table-content">
<tr ng-repeat="(index, user) in $root.users | orderBy:'first_name'" ng-class="{'bg-warning': user.changed}">
<td class="column-default column-label">
<input type="text" class="form-control" ng-model="user.first_name" ng-change="user.changed = true">
</td>
<td class="column-default column-label" >
<input type="text" class="form-control" ng-model="user.last_name" ng-change="user.changed = true">
</td>
<td class="column-default column-label">
<input type="text" class="form-control" ng-model="user.company" ng-change="user.changed = true">
</td>
<td class="column-default column-label">
<input type="text" class="form-control" ng-model="user.first_connection_code" disabled ng-change="user.changed = true">
</td>
<td class="column-default column-label">
<input type="text" class="form-control" ng-model="user.app_code" disabled ng-change="user.changed = true">
</td>
<td class="column-default column-radio">
<md-radio-group ng-model="user.lang" ng-change="user.changed = true">
<md-radio-button value="en" class="md-primary">English </md-radio-button>
<md-radio-button value="fr" class="md-primary">Français</md-radio-button>
</md-radio-group>
</td>
<td class="column-default column-radio">
<md-radio-group ng-model="user.private_access" ng-change="user.changed = true">
<md-radio-button value="0" class="md-primary">Public </md-radio-button>
<md-radio-button value="1" class="md-primary">Private</md-radio-button>
</md-radio-group>
</td>
<td class="column-default column-button">
<button type="button" class="btn btn-success" data-toggle="tooltip" data-placement="bottom" title="Update {{user.first_name}} {{user.last_name}}" ng-click="saveUser(index);">
<i class="fa fa-save"></i>
</button>
</td>
<td class="column-default column-button">
<button type="button" class="btn btn-danger" data-toggle="tooltip" data-placement="bottom" title="Delete {{user.first_name}} {{user.last_name}}" ng-click="deleteUser();$root.toDelete.user = user.id">
<i class="fa fa-trash-o"></i>
</button>
</td>
<td class="column-default column-button">
<button type="button" class="btn btn-warning" data-toggle="tooltip" data-placement="bottom" title="Reset {{user.first_name}} {{user.last_name}}'s license" ng-click="resetUser();$root.toReset.user = user.id">
<i class="fa fa-eraser"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="screen" class="tab-pane fade" role="tabpanel">
<div class="display:block">
<div class="col-md-12" style="background-color:black;height:64px;">
<br>
<div class="col-md-7" style="float:left;">
<div class="progress" >
<div class="progress-bar" role="progressbar" style="width:{{$root.screens.length/$root.projects[project_id].nb_screens*100}}%" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
<div class="col-md-2" style="float:left;">
<span style="color:white">{{$root.screens.length}} / {{$root.projects[project_id].nb_screens}} screens</span>
</div>
<div class="col-md-3" style="float:right;">
<button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Add new screen" ng-click="showNewScreen($event)" ng-disabled="$root.screens.length > $root.projects[project_id].nb_screens" style="float:right;margin-top:-12px;margin-bottom:12px;">
Add a new screen
</button>
<br> <br>
</div>
<br>
</div>
<div class="col-md-6 col-sm-12" ng-repeat="(index, screen) in $root.screens" style="float:left;">
<md-card md-theme="default" ng-class="{'bg-warning': screen.changed}">
<md-card-title>
<md-card-title-media>
<div class="md-media-lg card-media">
<a ng-click="zoomImage($root.project, screen.path, screen.label_en);" style="cursor:zoom-in">
<img ng-src="http://bouygues-tpinst.fr/ByOnSite/Projects/{{$root.project}}/{{screen.path}}" class="md-card-image" alt="No image with this path on our server" style="width:100%" title="Zoom IN">
</a>
</div>
</md-card-title-media>
<md-card-title-text>
<span class="md-headline">{{screen.label_en}}</span>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">Path</span>
<input type="text" class="form-control" ng-model="screen.path" ng-disabled="(screen.path.includes('Pyxis') || screen.path.includes('Mobydic')) && admin_connected == false" ng-change="screen.changed = true">
</div>
<br>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">Label EN</span>
<input type="text" class="form-control" ng-model="screen.label_en" ng-disabled="(screen.path.includes('Pyxis') || screen.path.includes('Mobydic')) && admin_connected == false" ng-change="screen.changed = true">
</div>
<br>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">Label FR</span>
<input type="text" class="form-control" ng-model="screen.label_fr" ng-disabled="(screen.path.includes('Pyxis') || screen.path.includes('Mobydic')) && admin_connected == false" ng-change="screen.changed = true">
</div>
</md-card-title-text>
</md-card-title>
<md-card-actions layout="row" layout-align="center">
<md-switch class="md-primary" md-no-ink aria-label="Switch No Ink" ng-model="screen.is_private" ng-true-value="'1'" ng-false-value="'0'" ng-change="screen.changed = true">
<span ng-if="screen.is_private == 1"> Private</span>
<span ng-if="screen.is_private == 0"> Public</span>
</md-switch>
<md-switch class="md-primary" md-no-ink aria-label="Switch No Ink" ng-model="screen.is_active" ng-true-value="'1'" ng-false-value="'0'" ng-change="screen.changed = true">
<span ng-if="screen.is_active == 1"> Visible</span>
<span ng-if="screen.is_active == 0"> Hidden</span>
</md-switch>
<span flex></span>
<span style="vertical-align:middle">
<button type="button" class="btn btn-success" data-toggle="tooltip" data-placement="bottom" title="Update {{screen.label_en}}" ng-click="saveScreen(index);" ng-disabled="(screen.path.includes('Pyxis') || screen.path.includes('Mobydic')) && admin_connected == false">
<i class="fa fa-save"></i> Save
</button>
</span>
<span>
<button type="button" class="btn btn-danger" data-toggle="tooltip" data-placement="bottom" title="Delete {{screen.label_en}}" ng-click="deleteScreen();$root.toDelete.screen = screen.id" ng-disabled="(screen.path.includes('Pyxis') || screen.path.includes('Mobydic')) && admin_connected == false">
<i class="fa fa-trash-o"></i> Delete
</button>
</span>
</md-card-actions>
</md-card>
</div>
</div>
</div>
<div id="license" class="tab-pane fade" role="tabpanel">
<div class="table-responsive">
<table class="table table-hover">
<thead class="thead-inverse">
<tr>
<th>ID</th>
<th>Installation code</th>
<th>Device code</th>
<th class="add">
<button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Add new license(s)" ng-click="showNewLicense($event)" ng-show="admin_connected">
<i class="fa fa-plus"></i>
</button>
</th>
</tr>
</thead>
<tbody id="table-content">
<tr ng-repeat="(index, license) in $root.licenses">
<td class="column-default column-label">
<input type="text" class="form-control" ng-model="license.id_full" disabled>
</td>
<td class="column-default column-label" >
<input type="text" class="form-control" ng-model="license.installation_code" disabled>
</td>
<td class="column-default column-label">
<input type="text" class="form-control" ng-model="license.license_code" ng-show="admin_connected" disabled>
<input type="password" class="form-control" ng-model="license.license_code" ng-show="!admin_connected" disabled>
</td>
<td class="column-default column-button">
<button type="button" class="btn btn-warning" data-toggle="tooltip" data-placement="bottom" title="Reset license {{license.id_full}}" ng-click="resLicense();$root.toReset.license = license.id">
<i class="fa fa-eraser"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="project" class="tab-pane fade" ng-if="admin_connected" role="tabpanel">
<div class="table-responsive">
<table class="table table-hover" ng-show="screens">
<thead class="thead-inverse">
<tr>
<th>Name</th>
<th>Logo</th>
<th>Active</th>
<th>Nb screens</th>
<th>Admin user</th>
<th>Admin pwd</th>
<th>Mode</th>
<th colspan="2" class="add">
<button type="button" class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Add new/Repair project" ng-click="showNewProject($event)">
<i class="fa fa-plus"></i> / <i class="fa fa-wrench"></i>
</button>
</th>
</tr>
</thead>
<tbody id="table-content">
<tr ng-repeat="(index,project) in $root.projects" ng-class="{'bg-warning': project.changed}">
<td class="column-default column-label">
<input type="text" class="form-control" ng-model="project.name" disabled>
</td>
<td class="column-default column-label">
<div class="input-group">
<img src="http://bouygues-tpinst.fr/ByOnSite/logos/{{project.logo}}"/>
<input type="text" class="form-control" ng-model="project.logo" ng-change="project.changed = true">
</div>
</td>
<td class="column-default column-radio">
<md-radio-group ng-model="project.is_active" ng-change="project.changed = true">
<md-radio-button value="1" class="md-primary">Yes</md-radio-button>
<md-radio-button value="0" class="md-primary">No</md-radio-button>
</md-radio-group>
</td>
<td class="column-cred column-label">
<input type="text" class="form-control" ng-model="project.nb_screens" ng-change="project.changed = true">
</td>
<td class="column-cred column-label">
<input type="text" class="form-control" ng-model="project.admin_user" ng-change="project.changed = true">
</td>
<td class="column-cred column-label">
<input type="text" class="form-control" ng-model="project.admin_pwd" ng-change="project.changed = true">
</td>
<td class="column-default column-radio">
<md-radio-group ng-model="project.is_public" ng-change="project.changed = true">
<md-radio-button value="1" class="md-primary">Demo</md-radio-button>
<md-radio-button value="0" class="md-primary">Prod</md-radio-button>
</md-radio-group>
</td>
<td class="column-default column-button">
<button type="button" class="btn btn-success" data-toggle="tooltip" data-placement="bottom" title="Update {{project.name}}" ng-click="saveProject(index)">
<i class="fa fa-save"></i>
</button>
</td>
<td class="column-default column-button">
<button type="button" class="btn btn-danger" data-toggle="tooltip" data-placement="bottom" title="Delete {{project.name}}" ng-click="delProject();$root.toDelete.project = project">
<i class="fa fa-trash-o"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="footer">
<br>
<br>
<div class="row">
<div class="col-md-3">
<img src="chev_l.PNG" height=100px style="margin-bottom:100px;float:left"/>
</div>
<div class="col-md-6" style="text-align:center;">
<img src="bytp.png" height=100 style="margin-right:30px;margin-top:30px;"/>
</div>
<div class="col-md-3">
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
// Code goes here
/* Styles go here */
app.factory('Global', ['$rootScope', '$http','$mdDialog','$timeout', function($rootScope, $http, $mdDialog, $timeout){
var Global = {};
var timeOut = 3000;
// dev mode
Global.dev = true;
if (Global.dev)
Global.ftp_folder ='test/';
else
Global.ftp_folder = 'Admin/';
// API
Global.base_url = '***************';
Global.key = '?' // localStorage.getItem("tokenAPI") != null ? "?key="+sessionStorage.getItem("tokenAPI")+"&" : "?"; //Condition ? true : false // '?key=S4xfGDDWXdU376e7xYUB&';
Global.url_api = Global.base_url + Global.ftp_folder + 'api.php' + Global.key;
Global.url_ftp = Global.base_url + Global.ftp_folder + 'ftp.php' + Global.key;
Global.url_ftp_logo = Global.base_url + Global.ftp_folder + 'ftp_logo.php' + Global.key;
Global.url_send_mail = Global.base_url + Global.ftp_folder + 'mail.php' + Global.key;
// Notifications
$rootScope.show_success_notification = false;
$rootScope.show_fail_notification = false;
Global.get = function(){
return $http.get(Global.url_api+'action=GET&table=Global');
}
// Sucess and fail notifications
Global.show_success = function(text){
$('#success').html(text);
$rootScope.show_success_notification = true;
$rootScope.getProjectData();
$timeout(Global.hide_success, timeOut);
}
Global.hide_success = function(){
$rootScope.show_success_notification = false;
}
Global.show_fail = function(text){
$('#fail').html(text);
$rootScope.show_fail_notification = true;
$timeout(Global.hide_fail, timeOut);
}
Global.hide_fail = function(){
$rootScope.show_fail_notification = false;
}
// Update notification
Global.updateNotif = function(response, name){
if(response.data = "ok")
Global.show_success(name + " was successfully updated.");
else
Global.show_fail(name + " wasn't updated.");
}
// Create Notification
Global.addNotif = function(response, type){
if(response.data = "ok")
Global.show_success(type + " was successfully added.");
else
Global.show_fail(type + " wasn't added.");
$mdDialog.hide();
}
// Delete notification
Global.deleteNotif = function(response, type){
if(response.data = "ok")
Global.show_success("The " + type + " was successfully deleted from DB");
else
Global.show_fail("The " + type + " wasn't deleted");
$mdDialog.hide();
}
// Reset notification
Global.resetNotif = function(response, type){
if(response.data = "ok")
Global.show_success(type + " reset performed successfully");
else
Global.show_fail(type + " reset failed.");
$mdDialog.hide();
}
// return Global variables and functions
return Global;
}]);
var app = angular.module('App', ['ngMaterial', 'ngMessages'])
app.controller('Ctrl', ['$rootScope', '$scope','$http','$timeout','$mdDialog','Global', 'projects', 'screens', 'users', 'licenses', function($rootScope, $scope, $http, $timeout, $mdDialog,Global, projects, screens, users, licenses) {
$scope.max_screens = 15;
$scope.admin_connected = false;
$scope.initialLoading = 0;
$rootScope.toDelete = { user:null, screen:null, project:null};
$rootScope.toReset = { user:null, license:null};
///////////////////////////
///////// GET ///////
//////////////////////////
//Project for select
$rootScope.getprojects= function(){
projects.getName().then((response)=>{ //projects.get().then(function(response){
$rootScope.projects = response.data;
$scope.initialLoading++;
})
}
/*Global.get().then(function(response) {
$scope.global=response.data[0];
$scope.initialLoading++;
});*/
$rootScope.getprojects();
$scope.getCredentials = function(){
if ($scope.initialLoading>2)
{
$scope.credentials = $rootScope.projects[$scope.project_id].admin_user == $scope.username && $rootScope.projects[$scope.project_id].admin_pwd == $scope.pwd;
$scope.admin_connected = $scope.global.admin_user == $scope.username && $scope.global.admin_pwd == $scope.pwd;
if($scope.admin_connected)
$scope.credentials = true;
}
}
//connection
$rootScope.Connect = () => { // === $rootScope.Connect = function() { ... }
//Set params to request
//let body = new URLSearchParams();
//body.set('username', $scope.username);
//body.set('password', $scope.pwd);
//body.set('project', $rootScope.project);
var request = Global.url_api+'action=Connection&username='+$scope.username+'&password='+$scope.pwd+'&project='+$rootScope.project;
//Request options
/*var req = {
method: 'POST',
url: Global.url_api+'action=Connection',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: body.toString()
}*/
//Ask to the server if credentials is correct
$http.get(request)
.then((response) => {
console.log(response.data);
if(response.status == 200){ //Status 200 : Everything OK
var jwt_token = response.data.jwt;
localStorage.setItem('tokenAPI',jwt_token); //Set the token sent by server in localStorage
$scope.credentials = true; //Set visible the tab
$rootScope.getProjectData(); //Get data from DB
} else { //Status 401 : Unauthorized
$scope.credentials = false;
}
})
}
// Get project users from DB
$scope.getProjectUsers = function() {
users.get($rootScope.project).then(function(response) {
$rootScope.users = response.data;
$(function () {
$('[data-toggle="tooltip"]').tooltip('dispose');
$('[data-toggle="tooltip"]').tooltip();
$('[data-toggle="tooltip"]').tooltip('update');
})
});
};
// Get project licenses from DB
$scope.getProjectLicenses = function() {
licenses.get($rootScope.project).then(function(response) {
$rootScope.licenses=response.data;
for(var i =0;i<$scope.licenses.length;i++)
$rootScope.licenses[i].id_full = $rootScope.project + "_" + $rootScope.licenses[i].id;
});
};
// Get project screens from DB
$scope.getProjectScreens = function() {
screens.get($rootScope.project).then(function(response) {
$rootScope.screens = response.data;
});
};
// GET USERS AND VIEWS FOR CURRENT PROJECT
$rootScope.getProjectData = function() {
if(localStorage.getItem('tokenAPI') != null){ //if($scope.credentials){
$scope.getProjectUsers();
$scope.getProjectScreens();
$scope.getProjectLicenses();
for(i = 0; i < $rootScope.projects.length; i++)
if($rootScope.projects[i].name == $rootScope.project)
$scope.project_id = i;
$scope.initialLoading++;
}
//$scope.getCredentials();
};
// new project service
$scope.zoomImage= function(project, path, label) {
$mdDialog.show({
controller: DialogControllerZI,
resolve: {
url: function () {return 'http://bouygues-tpinst.fr/ByOnSite/Projects/'+ project + '/'+path;},
label: function () {return label;}
},
templateUrl: 'zoom_image.html'
})
};
// new project controller
function DialogControllerZI($scope, $mdDialog, url, label) {
$scope.url = url;
$scope.label = label;
$scope.cancel = function(){$mdDialog.cancel();};
}
//////////////
// USERS //
/////////////
/////// SAVE //////
$scope.saveUser = function(index){ users.saveUser(index); };
// DELETE //
$scope.deleteUser= function() { users.deleteUser(); };
// RESET //
$scope.resetUser = function() { users.resetUser(); };
// CREATE //
$scope.showNewUser= function() { if($scope.credentials) users.showNewUser(); };
///////////////
// SCREENS //
///////////////
// CREATE //
$scope.saveScreen = function(index){ screens.saveScreen(index); };
// DELETE //
$scope.deleteScreen = function() { screens.deleteScreen(); };
// ADD //
$scope.showNewScreen = function() { if($scope.credentials) screens.showNewScreen(); };
///////////////
// LICENSES //
///////////////
// CREATE //
$scope.showNewLicense= function() { licenses.showNewLicense(); };
// RESET //
$scope.resLicense= function(){ licenses.resLicense(); };
////////////////
// PROJECTS //
////////////////
// CREATE //
$scope.showNewProject= function(){ if($scope.credentials) projects.showNewProject(); };
// SAVE //
$scope.saveProject = function(index){ projects.saveProject(index); };
// DELETE //
$scope.delProject = function (){ projects.delProject(); };
}]);
app.factory('projects', ['$rootScope', '$http', 'Global', '$mdDialog', 'licenses', '$timeout', function($rootScope, $http, Global, $mdDialog, licenses, $timeout){
var projects = {};
// GET PROJECTS NAME
projects.getName = () => { // === projects.getName = function() { ... }
return $http.get(Global.url_api+'action=GETINFO&table=Projects');
}
// CREATE PROJECT
// http request
var addProject = function(new_project){
if (new_project.is_new)
{
var request = Global.url_api+'action=Newproject&name='+new_project.name;
request += '&logo='+ new_project.logo;
request += '&nb_screens='+ new_project.nb_screens;
request += '&user='+ new_project.user;
request += '&pwd='+ new_project.pwd;
$r = $http.get(request).then(function (response) {
$rootScope.getprojects();
});
}
if (new_project.is_new || (!new_project.is_new && new_project.add_user_table))
{
var request = Global.url_api+'action=CreateTable&table='+new_project.name+'_users';
request += "&keys="+ "`first_name` varchar(255), `last_name` varchar(255), `first_connection_code` varchar(255), `app_code` varchar(255) DEFAULT '', `company` varchar(255), `lang` varchar(2), `private_access` boolean" ;
$r = $http.get(request).then(function(response) {});
}
if (new_project.is_new || (!new_project.is_new && new_project.add_license_table))
{
var request = Global.url_api+'action=CreateTable&table='+new_project.name+'_licenses';
request += '&keys='+ '`installation_code` varchar(255), `license_code` varchar(255)' ;
$r = $http.get(request).then(function(response) {
$timeout(licenses.add10licences, 200);
});
}
if (new_project.is_new || (!new_project.is_new && new_project.add_view_table))
{
var request = Global.url_api+'action=CreateTable&table='+new_project.name+'_views';
request += '&keys='+ '`path` varchar(1000), `is_active` boolean, `is_private` boolean, `label_fr` varchar(255), `label_en` varchar(255)' ;
$r = $http.get(request).then(function(response) {});
}
$rootScope.project = new_project.name;
$rootScope.getProjectData();
$mdDialog.hide();
}
// new project service
projects.showNewProject= function() {
$r = $http.get(Global.url_ftp_logo).then(function(response) {
var available_logos = response.data;
$mdDialog.show({
controller: DialogControllerNP,
resolve: {
projects: function () {return $rootScope.projects;},
logos: function() {return available_logos;}
},
templateUrl: 'new_project.html'
})
});
};
// new project controller
function DialogControllerNP($scope, $mdDialog, projects, logos) {
$scope.projects = projects;
$scope.available_logos = logos;
$scope.new_project = {is_new:true, nb_screens:'15', add_user_table:true, add_view_table:true, add_license_table:true };
$scope.cancel = function(){$mdDialog.cancel();};
$scope.addProject_ = function(new_project){addProject(new_project);};
}
// SAVE PROJECT
// http request
projects.saveProject = function (index) {
var request = Global.url_api + 'action=UpdateProject';
request += '&id=' + $rootScope.projects[index].id;
request += '&name=' + $rootScope.projects[index].name;
request += '&logo=' + $rootScope.projects[index].logo;
request += '&nb_screens=' + $rootScope.projects[index].nb_screens;
request += '&admin_user=' + $rootScope.projects[index].admin_user;
request += '&admin_pwd=' + $rootScope.projects[index].admin_pwd;
request += '&is_public=' + $rootScope.projects[index].is_public;
request += '&is_active=' + $rootScope.projects[index].is_active;
$r = $http.get(request).then(function (response) {
Global.updateNotif(response, "Project " + $rootScope.projects[index].name);
if (response.data = "ok")
$rootScope.getprojects();
});
}
// DELETE PROJECT
// http request
var deleteProject= function () {
var request = Global.url_api + 'action=DeleteProject';
request += '&id=' + $rootScope.toDelete.project.id;
request += '&name=' + $rootScope.toDelete.project.name;
$r = $http.get(request).then(function (response) {
Global.deleteNotif(response, "project");
if (response.data = "ok")
location.reload();
});
}
// delete project service
projects.delProject = function () {
$mdDialog.show({
controller: DialogControllerDP,
templateUrl: 'confirm_delete.html'
})
};
// delete project controller
function DialogControllerDP($scope, $mdDialog) {
$scope.title = "Delete project";
$scope.button = "Delete this project";
$scope.text = "You are going to delete project. Do you wish to continue?";
$scope.cancel = function () {$mdDialog.cancel(); };
$scope.delete= function () { deleteProject();};
}
return projects;
}]);
app
.factory('users', ['$http', 'Global', '$mdDialog', '$rootScope', function($http, Global, $mdDialog, $rootScope){
var users = {};
users.get = function(project){
return $http.get(Global.url_api+'action=GET&table='+project+'_users');
}
// CREATE USER
// http request
var addUser = function(new_user){
var request = Global.url_api+'action=AddUser&table='+$rootScope.project+'_users';
request += '&first_name='+new_user.first_name;
request += '&last_name='+new_user.last_name;
request += '&company='+new_user.company;
var first_connection_code = Math.random().toString(36).slice(2,10);
request += '&first_connection_code=' + first_connection_code
request += '&app_code=';
request += '&lang='+new_user.lang;
request += '&private_access='+new_user.private_access;
$r = $http.get(request).then(function(response) {
Global.addNotif(response, "User");
sendMail(new_user.email,first_connection_code, new_user.first_name,new_user.last_name, new_user.lang);
});
}
// create user service
users.showNewUser= function() {
$mdDialog.show({
controller: DialogControllerNU,
templateUrl: 'new_user.html',
})
};
// create user controller
function DialogControllerNU($scope, $mdDialog) {
$scope.new_user={ first_name:"", last_name:"", company:"", email:"", lang:"en", private_access:"0"};
$scope.cancel = function(){$mdDialog.cancel();};
$scope.addUser = function(new_user){addUser(new_user);};
}
//Send mail to the user
function sendMail(email,first_connection_code,first_name,last_name,lang){
console.log("Passed in mail function")
var request = Global.url_send_mail //Ajouter des paramètres
request += 'email='+email;
request += '&code='+first_connection_code
request += '&first_name='+first_name
request += '&last_name='+last_name
request += '&lang='+lang
request += '&project='+$rootScope.project
$r = $http.get(request).then(function(response) {
console.log(response)
})
}
// SAVE USER
// save user service
users.saveUser = function(index){
var request = Global.url_api+'action=UpdateUser&table='+$rootScope.project+'_users';
request += '&id='+$rootScope.users[index].id;
request += '&first_name='+$rootScope.users[index].first_name;
request += '&last_name='+$rootScope.users[index].last_name;
request += '&company='+$rootScope.users[index].company;
request += '&first_connection_code='+$rootScope.users[index].first_connection_code;
request += '&app_code='+$rootScope.users[index].app_code;
request += '&lang='+$rootScope.users[index].lang;
request += '&private_access='+$rootScope.users[index].private_access;
$r = $http.get(request).then(function(response) {
Global.updateNotif(response, $rootScope.users[index].first_name + " " + $rootScope.users[index].last_name);
});
}
// RESET USER
// http request
var resetUser = function(){
var request = Global.url_api+'action=ResetUser&table='+$rootScope.project+'_users';
request += '&id='+$rootScope.toReset.user;
$r = $http.get(request).then(function(response) {
Global.resetNotif(response, "Credentials");
});
}
// reset user service
users.resetUser= function() {
$mdDialog.show({
controller: DialogControllerRU,
templateUrl: 'confirm_reset.html',
})
};
// reset user controller
function DialogControllerRU($scope, $mdDialog) {
$scope.title = "Reset user";
$scope.text = "You are going to reset user's credentials. Do you wish to continue?";
$scope.button = "Reset this user";
$scope.cancel = function() { $mdDialog.cancel();};
$scope.reset = function(){resetUser();};
}
// DELETE USER
// http request
var deleteUser = function(){
var request = Global.url_api+'action=DeleteUser&table='+$rootScope.project+'_users';
request += '&id='+$rootScope.toDelete.user;
$r = $http.get(request).then(function(response) {
Global.deleteNotif(response, "user");
});
}
// delete user service
users.deleteUser= function() {
$mdDialog.show({
controller: DialogControllerDU,
templateUrl: 'confirm_delete.html'
})
};
// delete user controller
function DialogControllerDU($scope, $mdDialog) {
$scope.title = "Delete user";
$scope.text = "You are going to delete a user. Do you wish to continue?";
$scope.button = "Delete this user";
$scope.cancel = function(){$mdDialog.cancel();};
$scope.delete = function(){deleteUser();};
}
return users;
}]);
app.factory("authInterceptor", authInterceptor);
authInterceptor.$inject = ["$q"];
function authInterceptor($q) {
return {
// Add an interceptor for requests.
'request': function (config) {
// Default to an empty object if no headers are set.
config.headers = config.headers || {};
// Set the token
var token = localStorage.getItem('tokenAPI');
config.headers.Authorization = "Bearer " + token;
return config;
},
// Add an interceptor for any responses that error.
'responseError': function (response) {
// Check if the error is auth-related.
if (response.status === 401 || response.status === 403) {
console.log("Interceptor error");
}
return $q.reject(response);
}
};
}
app.config(["$httpProvider",
function ($httpProvider) {
//Registers the interceptor
$httpProvider.interceptors.push("authInterceptor");
}]);
<?php
require_once './jwt/BeforeValidException.php';
require_once './jwt/ExpiredException.php';
require_once './jwt/SignatureInvalidException.php';
require_once './jwt/JWT.php';
use \Firebase\JWT\JWT;
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, Authorization');
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$dev=true;
if ($dev)
{
$host = '*****';
$user_name = '*****';
$pwd = '******';
}
else {
$host = '*****';
$user_name = '*****';
$pwd = '*****';
}
$key = $_GET['key'];
$action = $_GET['action'];
$bdd = new PDO($host, $user_name, $pwd, $pdo_options);
//DON'T NEED TOKEN ======================
//Handle user connection
if($action == 'Connection'){
try{
$response->credentials = false;
$project = $_GET['project'];
$username = $_GET['username'];
$password = $_GET['password'];
//Looking in project table
$stmt = $bdd->prepare("SELECT * FROM Projects WHERE name = :name AND admin_user = :username AND admin_pwd = :password;");
$stmt->bindParam(":name", $project);
$stmt->bindParam(":username", $username);
$stmt->bindParam(":password", $password);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(count($result) != 0) {
$response->credentials = true;
}
//Looking in global table
$stmt2 = $bdd->prepare("SELECT * FROM Global WHERE admin_user = :username AND admin_pwd = :password;");
$stmt2->bindParam(":username", $username);
$stmt2->bindParam(":password", $password);
$stmt2->execute();
$result2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
if(count($result2) != 0) {
$response->credentials = true;
}
if($response->credentials == true){
//TOKEN Part
$tokenId = base64_encode(openssl_random_pseudo_bytes(32));
$issuedAt = time();
$notBefore = $issuedAt + 10; //Adding 10 seconds
$expire = $notBefore + 60; // Adding 60 seconds
$serverName = 'http://bouygues-tpinst.fr/';
$secret_key = "6F3BB4F0B824BC976F11AA2C547D";
$data = [
'iat' => $issuedAt, //Time when token was generate
'jti' => $tokenId,
'iss' => $serverName,
'exp' => $expire,
'data' => [
'test' => 'test'
]
];
$algorithme = 'HS512';
//Now create the TOKEN
$jwt = JWT::encode(
$data,
$secret_key,
$algorithme
);
$unencoded_array = ['jwt' => $jwt];
echo json_encode($unencoded_array);
//==========
}
else { //Credentials are not valid
header('HTTP/1.0 401 Unauthorized');
echo "Credentials not valid";
}
}catch(Exception $e){
die('Erreur : '.$e->getMessage());
}
}
//GET INFORMATION ABOUT PROJECTS (WITHOUT ADMIN ID)
else if($action == 'GETINFO'){
try{
$table = $_GET['table'];
$sql = 'SELECT name,logo, nb_screens FROM '.$table.';';
$response = $bdd->query($sql);
$output = $response->fetchAll(PDO::FETCH_ASSOC);
}catch(Exception $e){
die('Erreur : '.$e->getMessage());
}
echo(json_encode($output));
}
//====================================
else {
var_dump($_SERVER['HTTP_AUTHORIZATION']);
$Authorization = $_SERVER['HTTP_AUTHORIZATION'];
//Looking for authorization headers
if($Authorization){
//Extract le token from Bearer
list($jwt) = sscanf($Authorization->toString(), 'Authorization: Bearer %s');
if($jwt){
try{
$secret_key = '6F3BB4F0B824BC976F11AA2C547D2D5D6CE8D98D5A4683BBAF61689500688E4F';
$token = JWT::decode($jwt,$secret_key,'HS512');
echo ("TOKEN : ".$token.toString());
}catch(Exception $e){
header('HTTP/1.0 401 Unauthorized');
echo 'Unauthorized token';
}
} else {
header('HTTP/1.0 401 Unauthorized'); //Give error code 401 : Unauthorized
echo 'Can\'t extract token from bearer';
}
} else {
header('HTTP/1.0 401 Unauthorized'); //Give error code 401 : Unauthorized
echo 'Token not found in the header';
}
//To access this part of API, client must send to the server the token API generate on the connection
if($action == "GET")
{
try {
// connection to the database.
$table = $_GET['table'];
$sql = 'SELECT * FROM '.$table.';';
$response = $bdd->query($sql);
$output = $response->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
// Print JSON encode of the array.
echo(json_encode($output));
}
// RESET USER
else if($action == 'ResetUser')
{
try {
$table = $_GET['table'];
$id = $_GET['id'];
$query = "UPDATE `".$table."` SET `app_code`='".$app_code."' WHERE `id` = ".$id;
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
// UPDATE USER
else if($action == 'UpdateUser')
{
try {
$table = $_GET['table'];
$id = $_GET['id'];
$first_name = $_GET['first_name'];
$last_name = $_GET['last_name'];
$first_connection_code = $_GET['first_connection_code'];
$app_code = $_GET['app_code'];
$company = $_GET['company'];
$lang = $_GET['lang'];
$private_access = $_GET['private_access'];
$query = "UPDATE `".$table."` SET `first_name`='".$first_name."', `last_name`='".$last_name."', `first_connection_code`='".$first_connection_code."', `app_code`='".$app_code."', `company`='".$company."', `lang`='".$lang."', `private_access`='".$private_access."' WHERE `id` = ".$id;
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
// ADD NEW USER
else if($action == 'AddUser')
{
try {
$table = $_GET['table'];
$first_name = $_GET['first_name'];
$last_name = $_GET['last_name'];
$first_connection_code = $_GET['first_connection_code'];
$company = $_GET['company'];
$lang = $_GET['lang'];
$private_access = $_GET['private_access'];
$query = "INSERT INTO `".$table."`(`id`, `first_name`, `last_name`, `first_connection_code`, `company`, `lang`, `private_access`)
VALUES ('','".$first_name."','".$last_name."','".$first_connection_code."','".$company."','".$lang."','".$private_access."')";
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
// DELETE USER
else if($action == 'DeleteUser')
{
try {
$table = $_GET['table'];
$id = $_GET['id'];
$query = "DELETE FROM `".$table."` WHERE `id` = ".$id;
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
// UPDATE VIEW
else if($action == 'UpdateView')
{
try {
$table = $_GET['table'];
$id = $_GET['id'];
$path = $_GET['path'];
$label_fr = $_GET['label_fr'];
$label_en = $_GET['label_en'];
$is_private = $_GET['is_private'];
$is_active = $_GET['is_active'];
$private_access = $_GET['private_access'];
$query = "UPDATE `".$table."` SET `path`='".$path."', `label_fr`='".$label_fr."', `label_en`='".$label_en."', `is_private`='".$is_private."', `is_active`='".$is_active."' WHERE `id` = ".$id;
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
// ADD NEW VIEW
else if($action == 'AddView')
{
try {
$table = $_GET['table'];
$path = $_GET['path'];
$label_fr = $_GET['label_fr'];
$label_en = $_GET['label_en'];
$is_private = $_GET['is_private'];
$is_active = $_GET['is_active'];
$query = "INSERT INTO `".$table."`(`id`, `path`, `is_active`, `is_private`, `label_fr`, `label_en`)
VALUES ('','".$path."','".$is_active."','".$is_private."','".$label_fr."','".$label_en."')";
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
// DELETE VIEW
else if($action == 'DeleteView')
{
try {
$table = $_GET['table'];
$id = $_GET['id'];
$query = "DELETE FROM `".$table."` WHERE `id` = ".$id;
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
else if($action == 'AddLicense')
{
try {
$table = $_GET['table'];
$nb_license= $_GET['nb_license'];
$characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
for ($i=0; $i<$nb_license;$i++)
{
$installation_code = '';
$max = strlen($characters) - 1;
for ($j = 0; $j <8; $j++) {
$installation_code .= $characters[mt_rand(0, $max)];
}
$query = "INSERT INTO `".$table."`(`id`, `installation_code`, `license_code`)
VALUES ('','".$installation_code."','')";
$bdd->exec($query);
}
echo "ok";
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
else if($action == 'UpdateLicense')
{
try {
$table = $_GET['table'];
$license_code = $_GET['license_code'];
$id = $_GET['id'];
$query = "UPDATE `".$table."` SET `license_code`='".$license_code."' WHERE `id` = ".$id;
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
else if($action == 'CreateTable')
{
try {
$table = $_GET['table'];
$keys = $_GET['keys'];
$query = "CREATE TABLE IF NOT EXISTS `".$table."` ( `id` INT NOT NULL AUTO_INCREMENT, " . $keys .", PRIMARY KEY (`id`)) ENGINE = InnoDB;";
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
else if($action == 'Newproject')
{
try {
$table = "Projects";
$name = $_GET['name'];
$logo = $_GET['logo'];
$user = $_GET['user'];
$pwd = $_GET['pwd'];
$nb_screens = $_GET['nb_screens'];
$query = "INSERT INTO `".$table."`(`id`, `is_active`, `name`, `logo`, `nb_screens`, `admin_user`, `admin_pwd`, `is_public`)
VALUES ('','1','".$name."','".$logo."','".$nb_screens."','".$user."','".$pwd."','0')";
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
else if($action == 'UpdateProject')
{
try {
$table = "Projects";
$id = $_GET['id'];
$name = $_GET['name'];
$logo = $_GET['logo'];
$nb_screens = $_GET['nb_screens'];
$admin_user = $_GET['admin_user'];
$admin_pwd = $_GET['admin_pwd'];
$is_active = $_GET['is_active'];
$is_public = $_GET['is_public'];
$query = "UPDATE `".$table."` SET `name`='".$name."', `logo`='".$logo."', `nb_screens`='".$nb_screens."',`admin_user`='".$admin_user."', `admin_pwd`='".$admin_pwd."', `is_active`='".$is_active."' , `is_public`='".$is_public."'WHERE `id` = ".$id;
echo "ok";
$bdd->exec($query);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
else if($action == 'DeleteProject')
{
try {
$table = "Projects";
$id = $_GET['id'];
$name = $_GET['name'];
$query = "DELETE FROM `".$table."` WHERE `id` = ".$id;
$bdd->exec($query);
$query = "DROP TABLE `".$name."_users`";
$bdd->exec($query);
$query = "DROP TABLE `".$name."_views`";
$bdd->exec($query);
$query = "DROP TABLE `".$name."_licenses`";
$bdd->exec($query);
echo "ok";
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
}
}
?>