Browse Source

[Administration] En ligne : clients en ligne et actualisation automatique

feature/souke
Guillaume Bourgeois 10 months ago
parent
commit
9180d3a716
16 changed files with 330 additions and 121 deletions
  1. +79
    -0
      backend/controllers/OnlineAdminController.php
  2. +0
    -9
      backend/controllers/ProducerAdminController.php
  3. +1
    -1
      backend/controllers/UserController.php
  4. +29
    -7
      backend/views/layouts/left.php
  5. +3
    -0
      backend/views/layouts/main.php
  6. +132
    -0
      backend/views/online-admin/index.php
  7. +0
    -85
      backend/views/producer-admin/online.php
  8. +16
    -4
      backend/web/css/screen.css
  9. +24
    -0
      backend/web/sass/online-admin/_index.scss
  10. +0
    -12
      backend/web/sass/producer-admin/_online.scss
  11. +1
    -1
      backend/web/sass/screen.scss
  12. +6
    -0
      common/components/View.php
  13. +12
    -0
      common/logic/Ticket/Ticket/Repository/TicketRepository.php
  14. +7
    -0
      common/logic/Ticket/Ticket/Repository/TicketRepositoryQuery.php
  15. +15
    -2
      common/logic/User/User/Repository/UserRepository.php
  16. +5
    -0
      common/logic/User/User/Repository/UserRepositoryQuery.php

+ 79
- 0
backend/controllers/OnlineAdminController.php View File

@@ -0,0 +1,79 @@
<?php

/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

namespace backend\controllers;

use yii\filters\VerbFilter;
use yii\filters\AccessControl;

class OnlineAdminController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::class,
],
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return $this->getUserModule()
->getAuthorizationChecker()
->isGrantedAsAdministrator($this->getUserCurrent());
}
]
],
],
];
}

public function actionIndex()
{
$usersWithStatusProducerOnlineArray = $this->getUserModule()->getRepository()->findUsersWithStatusProducerAndOnline();
$usersWithStatusUserOnlineArray = $this->getUserModule()->getRepository()->findUsersWithStatusUserAndOnline();

return $this->render('index', [
'usersWithStatusProducerOnlineArray' => $usersWithStatusProducerOnlineArray,
'usersWithStatusUserOnlineArray' => $usersWithStatusUserOnlineArray,
]);
}
}

+ 0
- 9
backend/controllers/ProducerAdminController.php View File

@@ -78,15 +78,6 @@ class ProducerAdminController extends BackendController
];
}

public function actionOnline()
{
$usersWithStatusProducerOnlineArray = $this->getUserModule()->getRepository()->findUsersStatusProducerOnline();

return $this->render('@backend/views/producer-admin/online', [
'usersWithStatusProducerOnlineArray' => $usersWithStatusProducerOnlineArray,
]);
}

/**
* Liste les producteurs.
*

+ 1
- 1
backend/controllers/UserController.php View File

@@ -581,7 +581,7 @@ class UserController extends BackendController
$duration = 0;
Yii::$app->user->switchIdentity($user, $duration);
Yii::$app->session->set('user.idbeforeswitch', $initialId);
return $this->redirect(['index']);
return $this->redirect($this->getUrlManagerFrontend()->createUrl(['site/index']));
}
} else {
throw new NotFoundHttpException('Page introuvable');

+ 29
- 7
backend/views/layouts/left.php View File

@@ -76,10 +76,14 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran
$developerOnlineLabel = '<small class="label pull-right bg-green"><i class="fa fa-phone"></i></small>';
}

$countTicketsAdminUnreadLabel = '';
$countTicketsAdminUnread = $ticketModule->countTicketsAdminUnreadByUser($this->getUserCurrent());
$countTicketsLabel = '';
$countTicketsAdminUnread = $ticketModule->getRepository()->countTicketsAdminUnreadByUser($this->getUserCurrent());
if($countTicketsAdminUnread && $isUserCurrentGrantedAsAdministrator) {
$countTicketsAdminUnreadLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.$countTicketsAdminUnread.'</small></span>';
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-green">'.$countTicketsAdminUnread.'</small></span>';
}
else {
$countTicketsAdminOpen = $ticketModule->getRepository()->countTicketsAdminStatusOpen();
$countTicketsLabel = '<span class="pull-right-container"><small class="label pull-right bg-blue">'.$countTicketsAdminOpen.'</small></span>';
}

$sumUserProducerCredits = $userProducerModule->sumUserProducerCredits();
@@ -89,7 +93,25 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran
$countUsersWithStatusProducerOnline = $userModule->getRepository()->countUsersStatusProducerOnline();
$countUsersWithStatusProducerOnlineLabel = '';
if($countUsersWithStatusProducerOnline) {
$countUsersWithStatusProducerOnlineLabel = '<span class="pull-right-container"><small class="label pull-right bg-blue">'.$countUsersWithStatusProducerOnline.'</small></span>';
$countUsersWithStatusProducerOnlineLabel = '<small class="label pull-right bg-red">'.$countUsersWithStatusProducerOnline.'</small>';
}

$countUsersWithStatusUserOnline = $userModule->getRepository()->countUsersStatusUserOnline();
$countUsersWithStatusUserOnlineLabel = '';
if($countUsersWithStatusUserOnline) {
$countUsersWithStatusUserOnlineLabel = '<small class="label pull-right bg-blue">'.$countUsersWithStatusUserOnline.'</small>';
}

$countUsersOnlineLabel = '';
if($countUsersWithStatusProducerOnline || $countUsersWithStatusUserOnline) {
$countUsersOnlineLabel = '<span class="pull-right-container">';
if($countUsersWithStatusUserOnline) {
$countUsersOnlineLabel .= $countUsersWithStatusUserOnlineLabel;
}
if($countUsersWithStatusProducerOnline) {
$countUsersOnlineLabel .= $countUsersWithStatusProducerOnlineLabel;
}
$countUsersOnlineLabel .= '</span>';
}

?>
@@ -184,16 +206,16 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran
[
'label' => 'En ligne',
'icon' => 'wifi',
'url' => ['producer-admin/online'],
'url' => ['online-admin/index'],
'visible' => $isUserCurrentGrantedAsAdministrator,
'template' => '<a href="{url}">{icon} {label}' . $countUsersWithStatusProducerOnlineLabel . '</a>'
'template' => '<a href="{url}">{icon} {label}' . $countUsersOnlineLabel . '</a>'
],
[
'label' => 'Support',
'icon' => 'comments',
'url' => ['support-admin/index'],
'visible' => $isUserCurrentGrantedAsAdministrator,
'template' => '<a href="{url}">{icon} {label}' . $countTicketsAdminUnreadLabel . '</a>'
'template' => '<a href="{url}">{icon} {label}' . $countTicketsLabel . '</a>'
],
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => $isUserCurrentGrantedAsAdministrator],
[

+ 3
- 0
backend/views/layouts/main.php View File

@@ -68,6 +68,9 @@ if (Yii::$app->controller->action->id === 'login') {
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="baseurl" content="<?= Yii::$app->urlManagerBackend->baseUrl ; ?>">
<meta name="baseurl-absolute" content="<?= Yii::$app->urlManagerBackend->getHostInfo().Yii::$app->urlManagerBackend->baseUrl; ?>">
<?php if($this->metaRefresh): ?>
<meta http-equiv="refresh" content="60">
<?php endif; ?>
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->page_title) ?> | Opendistrib</title>
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/favicon-distrib.png" />

+ 132
- 0
backend/views/online-admin/index.php View File

@@ -0,0 +1,132 @@
<?php

/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

use common\helpers\Image;
use yii\helpers\Html;
use yii\grid\GridView;
use common\logic\User\User\Model\User;
use common\logic\Producer\Producer\Model\Producer;
use common\helpers\Price;

$producerModule = $this->getProducerModule();
$userModule = $this->getUserModule();
$this->setTitle('En ligne');
$this->addBreadcrumb($this->getTitle());
$this->setMetaRefresh(true);

?>
<div class="online-index">

<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<div class="glyphicon glyphicon-grain"></div>
Producteurs (<?= count($usersWithStatusProducerOnlineArray); ?>)
</h3>
</div>
<div class="panel-body">
<?php if($usersWithStatusProducerOnlineArray && count($usersWithStatusProducerOnlineArray) > 0): ?>
<?php foreach ($usersWithStatusProducerOnlineArray as $userWithStatusProducerOnline): ?>
<?php $producer = $userWithStatusProducerOnline->producer; ?>
<?php if($producer): ?>
<div class="col-md-3">
<div class="box box-primary box-producer">
<div class="box-body box-profile">
<?php if ($producer->logo && Image::isPhotoExist($producer->logo)): ?>
<img class="profile-user-img img-responsive img-circle"
src="<?= Yii::$app->urlManagerProducer->getHostInfo() . '/' . Yii::$app->urlManagerProducer->baseUrl; ?>/uploads/<?= $producer->logo; ?>"
alt="Logo <?= Html::encode($producer->name) ?>">
<?php endif; ?>

<h3 class="profile-username text-center">
<a title="Aller sur le compte de ce producteur" href="<?= $this->getUrlManagerBackend()->createUrl(['site/switch-producer', 'id' => $producer->id]); ?>">
<?= $producer->name; ?>
</a>
</h3>
<p class="text-muted text-center">
<?= $userModule->getSolver()->getUsername($userWithStatusProducerOnline); ?><br/>
</p>
</div>
</div>
</div>
<?php endif; ?>
<?php endforeach; ?>
<div class="clr"></div>
<?php else: ?>
<div class="alert alert-info">Aucun producteur en ligne actuellement.</div>
<?php endif; ?>
</div>
</div>

<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-user"></span>
Utilisateurs (<?= count($usersWithStatusUserOnlineArray); ?>)
</h3>
</div>
<div class="panel-body">
<?php if($usersWithStatusUserOnlineArray && count($usersWithStatusUserOnlineArray) > 0): ?>
<?php foreach ($usersWithStatusUserOnlineArray as $userWithStatusUserOnline): ?>
<div class="col-md-3">
<div class="box box-primary box-user">
<div class="box-body box-profile">
<h3 class="profile-username text-center">
<a title="Prendre la main" href="<?= $this->getUrlManagerBackend()->createUrl(['user/switch-identity', 'id' => $userWithStatusUserOnline->id]); ?>">
<?= $userModule->getSolver()->getUsername($userWithStatusUserOnline); ?>
</a>
</h3>
<p class="text-muted text-center">
<?php $userProducerArray = $userWithStatusUserOnline->userProducer; ?>
<?php foreach($userProducerArray as $userProducer): ?>
<?php if($userProducer->active && $userProducer->bookmark): ?>
<span class="label label-default"><?= $userProducer->producer->name; ?></span>
<?php endif; ?>
<?php endforeach; ?>
</p>
</div>
</div>
</div>
<?php endforeach; ?>
<div class="clr"></div>
<?php else: ?>
<div class="alert alert-info">Aucun utilisateur en ligne actuellement.</div>
<?php endif; ?>
</div>
</div>
</div>

+ 0
- 85
backend/views/producer-admin/online.php View File

@@ -1,85 +0,0 @@
<?php

/**
* Copyright distrib (2018)
*
* contact@opendistrib.net
*
* Ce logiciel est un programme informatique servant à aider les producteurs
* à distribuer leur production en circuits courts.
*
* Ce logiciel est régi par la licence CeCILL soumise au droit français et
* respectant les principes de diffusion des logiciels libres. Vous pouvez
* utiliser, modifier et/ou redistribuer ce programme sous les conditions
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
* sur le site "http://www.cecill.info".
*
* En contrepartie de l'accessibilité au code source et des droits de copie,
* de modification et de redistribution accordés par cette licence, il n'est
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
* seule une responsabilité restreinte pèse sur l'auteur du programme, le
* titulaire des droits patrimoniaux et les concédants successifs.
*
* A cet égard l'attention de l'utilisateur est attirée sur les risques
* associés au chargement, à l'utilisation, à la modification et/ou au
* développement et à la reproduction du logiciel par l'utilisateur étant
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à
* manipuler et qui le réserve donc à des développeurs et des professionnels
* avertis possédant des connaissances informatiques approfondies. Les
* utilisateurs sont donc invités à charger et tester l'adéquation du
* logiciel à leurs besoins dans des conditions permettant d'assurer la
* sécurité de leurs systèmes et ou de leurs données et, plus généralement,
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
*
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
* pris connaissance de la licence CeCILL, et que vous en avez accepté les
* termes.
*/

use common\helpers\Image;
use yii\helpers\Html;
use yii\grid\GridView;
use common\logic\User\User\Model\User;
use common\logic\Producer\Producer\Model\Producer;
use common\helpers\Price;

$producerModule = $this->getProducerModule();
$userModule = $this->getUserModule();
$this->setTitle('Producteurs en ligne');
$this->addBreadcrumb($this->getTitle());

?>
<div class="producer-admin-online">
<?php if($usersWithStatusProducerOnlineArray && count($usersWithStatusProducerOnlineArray) > 0): ?>
<?php foreach ($usersWithStatusProducerOnlineArray as $userWithStatusProducerOnline): ?>
<?php $producer = $userWithStatusProducerOnline->producer; ?>
<div class="col-md-3">
<div class="box box-primary">
<div class="box-body box-profile">
<?php if ($producer->logo && Image::isPhotoExist($producer->logo)): ?>
<img class="profile-user-img img-responsive img-circle"
src="<?= Yii::$app->urlManagerProducer->getHostInfo() . '/' . Yii::$app->urlManagerProducer->baseUrl; ?>/uploads/<?= $producer->logo; ?>"
alt="Logo <?= Html::encode($producer->name) ?>">
<?php endif; ?>

<h3 class="profile-username text-center">
<?= $producer->name; ?>
</h3>
<p class="text-muted text-center">
<?= $userModule->getSolver()->getUsername($userWithStatusProducerOnline); ?><br/>
</p>
<!--<ul class="list-group list-group-unbordered">
<li class="list-group-item">
<b>Téléphone</b> <a class="pull-right">06 00 00 00 00</a>
</li>
</ul>
<a href="#" class="btn btn-primary btn-block"><b>Bouton</b></a>-->
</div>
</div>
</div>
<?php endforeach; ?>
<div class="clr"></div>
<?php else: ?>
<div class="alert alert-info">Aucun producteur en ligne actuellement.</div>
<?php endif; ?>
</div>

+ 16
- 4
backend/web/css/screen.css View File

@@ -2980,16 +2980,28 @@ termes.
margin-top: 5px;
}

/* line 3, ../sass/producer-admin/_online.scss */
.producer-admin-online .box {
/* line 3, ../sass/online-admin/_index.scss */
.online-index .box {
overflow: hidden;
}
/* line 6, ../sass/online-admin/_index.scss */
.online-index .box.box-user {
height: 150px;
}
/* line 10, ../sass/online-admin/_index.scss */
.online-index .box.box-producer {
height: 250px;
}
/* line 6, ../sass/producer-admin/_online.scss */
.producer-admin-online .box .profile-username {
/* line 14, ../sass/online-admin/_index.scss */
.online-index .box .profile-username {
font-family: 'Source Sans Pro',sans-serif;
font-weight: normal;
font-size: 18px;
}
/* line 19, ../sass/online-admin/_index.scss */
.online-index .box .profile-username a {
color: #333;
}

/* line 4, ../sass/feature-admin/_index.scss */
.feature-admin-index table th.only-for-selected-producers,

+ 24
- 0
backend/web/sass/online-admin/_index.scss View File

@@ -0,0 +1,24 @@

.online-index {
.box {
overflow: hidden;

&.box-user {
height: 150px;
}

&.box-producer {
height: 250px;
}

.profile-username {
font-family: 'Source Sans Pro',sans-serif;
font-weight: normal;
font-size: 18px;

a {
color: #333;
}
}
}
}

+ 0
- 12
backend/web/sass/producer-admin/_online.scss View File

@@ -1,12 +0,0 @@

.producer-admin-online {
.box {
height: 250px;

.profile-username {
font-family: 'Source Sans Pro',sans-serif;
font-weight: normal;
font-size: 18px;
}
}
}

+ 1
- 1
backend/web/sass/screen.scss View File

@@ -1530,7 +1530,7 @@ a.btn, button.btn {
@import "support/_index.scss";
@import "support/_view.scss";
@import "producer-admin/_index.scss";
@import "producer-admin/_online.scss";
@import "online-admin/_index.scss";
@import "feature-admin/_index.scss";
@import "setting/_form.scss";
@import "_responsive.scss" ;

+ 6
- 0
common/components/View.php View File

@@ -48,6 +48,7 @@ class View extends \yii\web\View
var $icon;
var $page_title ;
var $buttons ;
var $metaRefresh = false;

public function getLogic()
{
@@ -113,6 +114,11 @@ class View extends \yii\web\View
]);
}

public function setMetaRefresh(bool $active)
{
$this->metaRefresh = $active;
}

public function getUrlManagerFrontend()
{
return \Yii::$app->urlManagerFrontend;

+ 12
- 0
common/logic/Ticket/Ticket/Repository/TicketRepository.php View File

@@ -46,4 +46,16 @@ class TicketRepository extends AbstractRepository
$ticketsArray = $this->createQuery()->find();
return $this->ticketSolver->countTicketsUnreadByUserFromArray($ticketsArray, $user);
}

public function findTicketsAdminStatusOpen()
{
return $this->createQuery()
->filterByStatusOpen()
->find();
}

public function countTicketsAdminStatusOpen()
{
return count($this->findTicketsAdminStatusOpen());
}
}

+ 7
- 0
common/logic/Ticket/Ticket/Repository/TicketRepositoryQuery.php View File

@@ -3,6 +3,7 @@
namespace common\logic\Ticket\Ticket\Repository;

use common\logic\AbstractRepositoryQuery;
use common\logic\Ticket\Ticket\Model\Ticket;
use common\logic\Ticket\Ticket\Service\TicketDefinition;

class TicketRepositoryQuery extends AbstractRepositoryQuery
@@ -13,4 +14,10 @@ class TicketRepositoryQuery extends AbstractRepositoryQuery
{
$this->loadDefinition(TicketDefinition::class);
}

public function filterByStatusOpen(): self
{
$this->andWhere(['ticket.status' => Ticket::STATUS_OPEN]);
return $this;
}
}

+ 15
- 2
common/logic/User/User/Repository/UserRepository.php View File

@@ -268,7 +268,7 @@ class UserRepository extends AbstractRepository
return $userProducer ? $userProducer->active : false;
}

public function findUsersStatusProducerOnline(): array
public function findUsersWithStatusProducerAndOnline(): array
{
return $this->createDefaultQuery()
->isStatusProducer()
@@ -278,6 +278,19 @@ class UserRepository extends AbstractRepository

public function countUsersStatusProducerOnline(): int
{
return count($this->findUsersStatusProducerOnline());
return count($this->findUsersWithStatusProducerAndOnline());
}

public function findUsersWithStatusUserAndOnline(): array
{
return $this->createDefaultQuery()
->isStatusUser()
->filterByDateLastConnectionLessThanFewMinutes()
->find();
}

public function countUsersStatusUserOnline(): int
{
return count($this->findUsersWithStatusUserAndOnline());
}
}

+ 5
- 0
common/logic/User/User/Repository/UserRepositoryQuery.php View File

@@ -51,6 +51,11 @@ class UserRepositoryQuery extends AbstractRepositoryQuery
return $this->filterByStatus(User::STATUS_PRODUCER);
}

public function isStatusUser(): self
{
return $this->filterByStatus(User::STATUS_ACTIVE);
}

public function filterByDateLastConnectionLessThanFewMinutes(): self
{
$date = new \DateTime('-5 minutes');

Loading…
Cancel
Save