forked from ZwiiCMS-Team/ZwiiCampus
1.9 Désincription en masse de la plateforme
This commit is contained in:
parent
b0b3b34bde
commit
b595120227
@ -51,7 +51,7 @@ class common
|
|||||||
const ACCESS_TIMER = 1800;
|
const ACCESS_TIMER = 1800;
|
||||||
|
|
||||||
// Numéro de version
|
// Numéro de version
|
||||||
const ZWII_VERSION = '1.8.01';
|
const ZWII_VERSION = '1.9.00';
|
||||||
|
|
||||||
// URL autoupdate
|
// URL autoupdate
|
||||||
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';
|
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';
|
||||||
|
@ -48,7 +48,6 @@
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php if ($this->getUser('permission', 'course', 'edit') === true): ?>
|
<?php if ($this->getUser('permission', 'course', 'edit') === true): ?>
|
||||||
<div class="col2">
|
<div class="col2">
|
||||||
|
|
||||||
<?php echo template::button('courseManageEdit' . $this->getUrl(2), [
|
<?php echo template::button('courseManageEdit' . $this->getUrl(2), [
|
||||||
'href' => helper::baseUrl() . 'course/edit/' . $this->getUrl(2),
|
'href' => helper::baseUrl() . 'course/edit/' . $this->getUrl(2),
|
||||||
'value' => 'Éditer',
|
'value' => 'Éditer',
|
||||||
@ -58,13 +57,11 @@
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php if ($this->getUser('permission', 'course', 'users') === true): ?>
|
<?php if ($this->getUser('permission', 'course', 'users') === true): ?>
|
||||||
<div class="col2">
|
<div class="col2">
|
||||||
|
|
||||||
<?php echo template::button('categoryUser' . $this->getUrl(2), [
|
<?php echo template::button('categoryUser' . $this->getUrl(2), [
|
||||||
'href' => helper::baseUrl() . 'course/users/' . $this->getUrl(2),
|
'href' => helper::baseUrl() . 'course/users/' . $this->getUrl(2),
|
||||||
'value' => 'Participants',
|
'value' => 'Participants',
|
||||||
'ico' => 'users'
|
'ico' => 'users'
|
||||||
]); ?>
|
]); ?>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
@ -19,6 +19,7 @@ class user extends common
|
|||||||
public static $actions = [
|
public static $actions = [
|
||||||
'add' => self::GROUP_ADMIN,
|
'add' => self::GROUP_ADMIN,
|
||||||
'delete' => self::GROUP_ADMIN,
|
'delete' => self::GROUP_ADMIN,
|
||||||
|
'usersDelete' => self::GROUP_ADMIN,
|
||||||
'import' => self::GROUP_ADMIN,
|
'import' => self::GROUP_ADMIN,
|
||||||
'index' => self::GROUP_ADMIN,
|
'index' => self::GROUP_ADMIN,
|
||||||
'template' => self::GROUP_ADMIN,
|
'template' => self::GROUP_ADMIN,
|
||||||
@ -229,6 +230,145 @@ class user extends common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Désinscription de tous les utilisateurs
|
||||||
|
* Les désinscriptions ne suppriment pas les historiques
|
||||||
|
*/
|
||||||
|
public function usersDelete()
|
||||||
|
{
|
||||||
|
|
||||||
|
// Contenu sélectionné
|
||||||
|
$courseId = $this->getUrl(2);
|
||||||
|
|
||||||
|
// Accès limité aux admins, à l'auteur ou éditeurs inscrits
|
||||||
|
if (
|
||||||
|
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true
|
||||||
|
) {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'access' => false
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inscription des utilisateurs cochés
|
||||||
|
if (
|
||||||
|
isset($_POST['usersDeleteSubmit'])
|
||||||
|
) {
|
||||||
|
foreach ($_POST as $keyPost => $valuePost) {
|
||||||
|
// Exclure les variables post qui ne sont pas des userId et ne traiter que les non inscrits
|
||||||
|
if (
|
||||||
|
$this->getData(['user', $keyPost]) !== null
|
||||||
|
&& $this->getData(['user', $keyPost]) !== null
|
||||||
|
) {
|
||||||
|
$this->deleteData(['user', $keyPost]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liste des groupes et des profils
|
||||||
|
$usersGroups = $this->getData(['profil']);
|
||||||
|
|
||||||
|
foreach ($usersGroups as $groupId => $groupValue) {
|
||||||
|
switch ($groupId) {
|
||||||
|
case "-1":
|
||||||
|
case "0":
|
||||||
|
break;
|
||||||
|
case "3":
|
||||||
|
self::$usersGroups['30'] = 'Administrateur';
|
||||||
|
$profils['30'] = 0;
|
||||||
|
break;
|
||||||
|
case "1":
|
||||||
|
case "2":
|
||||||
|
foreach ($groupValue as $profilId => $profilValue) {
|
||||||
|
if ($profilId) {
|
||||||
|
self::$usersGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']);
|
||||||
|
$profils[$groupId . $profilId] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Liste alphabétique
|
||||||
|
self::$alphabet = range('A', 'Z');
|
||||||
|
$alphabet = range('A', 'Z');
|
||||||
|
self::$alphabet = array_combine($alphabet, self::$alphabet);
|
||||||
|
self::$alphabet = array_merge(['all' => 'Tout'], self::$alphabet);
|
||||||
|
|
||||||
|
// Liste des inscrits dans le contenu sélectionné.
|
||||||
|
$users = $this->getData(['user']);
|
||||||
|
if (is_array($users)) {
|
||||||
|
// Tri du tableau par défaut par $userId
|
||||||
|
ksort($users);
|
||||||
|
foreach ($users as $userId => $userValue) {
|
||||||
|
|
||||||
|
// Compte les rôles
|
||||||
|
if (isset($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) {
|
||||||
|
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filtres
|
||||||
|
if (
|
||||||
|
isset($_POST['usersFilterGroup'])
|
||||||
|
|| isset($_POST['usersFilterFirstName'])
|
||||||
|
|| isset($_POST['usersFilterLastName'])
|
||||||
|
) {
|
||||||
|
|
||||||
|
// Groupe et profils
|
||||||
|
$group = (string) $this->getData(['user', $userId, 'group']);
|
||||||
|
$profil = (string) $this->getData(['user', $userId, 'profil']);
|
||||||
|
$firstName = $this->getData(['user', $userId, 'firstname']);
|
||||||
|
$lastName = $this->getData(['user', $userId, 'lastname']);
|
||||||
|
if (
|
||||||
|
$this->getInput('usersFilterGroup', helper::FILTER_INT) > 0
|
||||||
|
&& $this->getInput('usersFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil
|
||||||
|
)
|
||||||
|
continue;
|
||||||
|
// Première lettre du prénom
|
||||||
|
if (
|
||||||
|
$this->getInput('usersFilterFirstName', helper::FILTER_STRING_SHORT) !== 'all'
|
||||||
|
&& $this->getInput('usersFilterFirstName', helper::FILTER_STRING_SHORT) !== strtoupper(substr($firstName, 0, 1))
|
||||||
|
)
|
||||||
|
continue;
|
||||||
|
// Première lettre du nom
|
||||||
|
if (
|
||||||
|
$this->getInput('usersFilterLastName', helper::FILTER_STRING_SHORT) !== 'all'
|
||||||
|
&& $this->getInput('usersFilterLastName', helper::FILTER_STRING_SHORT) !== strtoupper(substr($lastName, 0, 1))
|
||||||
|
)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construction du tableau
|
||||||
|
self::$users[] = [
|
||||||
|
template::checkbox($userId, true, '', ['class' => 'checkboxSelect']),
|
||||||
|
$userId,
|
||||||
|
$this->getData(['user', $userId, 'firstname']),
|
||||||
|
$this->getData(['user', $userId, 'lastname']),
|
||||||
|
$this->getData(['user', $userId, 'tags']),
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ajoute les effectifs aux profils du sélecteur
|
||||||
|
foreach (self::$usersGroups as $groupId => $groupValue) {
|
||||||
|
if ($groupId === 'all') {
|
||||||
|
self::$usersGroups['all'] = self::$usersGroups['all'] . ' (' . array_sum($profils) . ')';
|
||||||
|
} else {
|
||||||
|
self::$usersGroups[$groupId] = self::$usersGroups[$groupId] . ' (' . $profils[$groupId] . ')';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'title' => helper::translate('Désincription en masse'),
|
||||||
|
'view' => 'usersDelete',
|
||||||
|
'vendor' => [
|
||||||
|
'datatables'
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Édition
|
* Édition
|
||||||
*/
|
*/
|
||||||
|
@ -13,15 +13,23 @@
|
|||||||
'value' => template::ico('help'),
|
'value' => template::ico('help'),
|
||||||
'class' => 'buttonHelp',
|
'class' => 'buttonHelp',
|
||||||
'help' => 'Consulter l\'aide en ligne'
|
'help' => 'Consulter l\'aide en ligne'
|
||||||
]);*/?>
|
]);*/ ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col1 offset7">
|
<div class="col1 offset6">
|
||||||
<?php echo template::button('userImport', [
|
<?php echo template::button('userImport', [
|
||||||
'href' => helper::baseUrl() . 'user/import',
|
'href' => helper::baseUrl() . 'user/import',
|
||||||
'value' => template::ico('upload'),
|
'value' => template::ico('users'),
|
||||||
'help' => 'Importer des utilisateurs en masse'
|
'help' => 'Importer des utilisateurs en masse'
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col1">
|
||||||
|
<?php echo template::button('userDeleteAll', [
|
||||||
|
'class' => 'userDeleteAll buttonRed',
|
||||||
|
'href' => helper::baseUrl() . 'user/usersDelete/' . $this->getUrl(2),
|
||||||
|
'value' => template::ico('users'),
|
||||||
|
'help' => 'Désinscrire en masse',
|
||||||
|
]) ?>
|
||||||
|
</div>
|
||||||
<div class="col1">
|
<div class="col1">
|
||||||
<?php echo template::button('userGroup', [
|
<?php echo template::button('userGroup', [
|
||||||
'href' => helper::baseUrl() . 'user/profil',
|
'href' => helper::baseUrl() . 'user/profil',
|
||||||
@ -60,4 +68,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php echo template::formClose(); ?>
|
<?php echo template::formClose(); ?>
|
||||||
<?php echo template::table([3, 2, 2, 2, 2, 1, 1], $module::$users, [ 'Nom', 'Groupe', 'Profil', 'Étiquettes', 'Date dernière vue', '', ''], ['id' => 'dataTables']); ?>
|
<?php echo template::table([3, 2, 2, 2, 2, 1, 1], $module::$users, ['Nom', 'Groupe', 'Profil', 'Étiquettes', 'Date dernière vue', '', ''], ['id' => 'dataTables']); ?>
|
26
core/module/user/view/usersDelete/usersDelete.css
Normal file
26
core/module/user/view/usersDelete/usersDelete.css
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* This file is part of Zwii.
|
||||||
|
*
|
||||||
|
* For full copyright and license information, please see the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*
|
||||||
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
|
* @link http://zwiicms.fr/
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** NE PAS EFFACER
|
||||||
|
* admin.css
|
||||||
|
*/
|
||||||
|
|
||||||
|
#usersDeleteSubmit {
|
||||||
|
background-color: rgba(217, 95, 78, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
tr {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
100
core/module/user/view/usersDelete/usersDelete.js.php
Normal file
100
core/module/user/view/usersDelete/usersDelete.js.php
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/**
|
||||||
|
* This file is part of Zwii.
|
||||||
|
* For full copyright and license information, please see the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*
|
||||||
|
* @author Rémi Jean <remi.jean@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||||
|
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||||
|
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||||
|
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||||
|
* @link http://zwiicms.fr/
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(document).ready((function () {
|
||||||
|
|
||||||
|
$('tr').click(function () {
|
||||||
|
// Cochez ou décochez la case à cocher dans cette ligne
|
||||||
|
$(this).find('input[type="checkbox"]').prop('checked', function (i, val) {
|
||||||
|
return !val; // Inverse l'état actuel de la case à cocher
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#usersDeleteSelectAll').on('click', function () {
|
||||||
|
$('.checkboxSelect').prop('checked', true);
|
||||||
|
saveCheckboxState();
|
||||||
|
});
|
||||||
|
$('#usersDeleteSelectNone').on('click', function () {
|
||||||
|
$('.checkboxSelect').prop('checked', false);
|
||||||
|
saveCheckboxState();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#usersFilterGroup, #usersFilterFirstName, #usersFilterLastName").change(function () {
|
||||||
|
saveCheckboxState();
|
||||||
|
$("#usersDeleteForm").submit();
|
||||||
|
});
|
||||||
|
|
||||||
|
var table = $('#dataTables').DataTable({
|
||||||
|
language: {
|
||||||
|
url: "core/vendor/datatables/french.json"
|
||||||
|
},
|
||||||
|
locale: 'fr',
|
||||||
|
"columnDefs": [
|
||||||
|
{
|
||||||
|
target: 0,
|
||||||
|
orderable: false,
|
||||||
|
searchable: false,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle checkbox change event
|
||||||
|
$('.checkboxSelect').on('change', function () {
|
||||||
|
// Save checkbox state to cookies or local storage
|
||||||
|
saveCheckboxState();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle checkbox state on DataTables draw event
|
||||||
|
table.on('draw', function () {
|
||||||
|
// Restore checkbox state from cookies or local storage
|
||||||
|
restoreCheckboxState();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Empty local storage after submit
|
||||||
|
$("#usersDeleteSubmit").on("click", function () {
|
||||||
|
localStorage.setItem('checkboxState', JSON.stringify({}));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Restore checkbox state on page load
|
||||||
|
restoreCheckboxState();
|
||||||
|
|
||||||
|
function saveCheckboxState() {
|
||||||
|
|
||||||
|
// Récupérer d'abord les données existantes dans le localStorage
|
||||||
|
var existingData = JSON.parse(localStorage.getItem('checkboxState')) || {};
|
||||||
|
|
||||||
|
// Ajouter ou mettre à jour les données actuelles
|
||||||
|
$('.checkboxSelect').each(function () {
|
||||||
|
var checkboxId = $(this).attr('id');
|
||||||
|
var checked = $(this).prop('checked');
|
||||||
|
existingData[checkboxId] = checked;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sauvegarder les données mises à jour dans le localStorage
|
||||||
|
localStorage.setItem('checkboxState', JSON.stringify(existingData));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to restore checkbox state
|
||||||
|
function restoreCheckboxState() {
|
||||||
|
var checkboxState = JSON.parse(localStorage.getItem('checkboxState')) || {};
|
||||||
|
// console.log(checkboxState);
|
||||||
|
for (var checkboxId in checkboxState) {
|
||||||
|
if (checkboxState.hasOwnProperty(checkboxId)) {
|
||||||
|
var checked = checkboxState[checkboxId];
|
||||||
|
// Update checkbox state based on stored information
|
||||||
|
$('#' + checkboxId).prop('checked', checked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}));
|
55
core/module/user/view/usersDelete/usersDelete.php
Normal file
55
core/module/user/view/usersDelete/usersDelete.php
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?php echo template::formOpen('usersDeleteForm'); ?>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col1">
|
||||||
|
<?php echo template::button('userDeleteBack', [
|
||||||
|
'class' => 'buttonGrey',
|
||||||
|
'href' => helper::baseUrl() . 'user/' . $this->getUrl(2),
|
||||||
|
'value' => template::ico('left')
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col1 offset8">
|
||||||
|
<?php echo template::button('usersDeleteSelectAll', [
|
||||||
|
'value' => template::ico('square-check'),
|
||||||
|
'help' => 'Tout sélectionner'
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col1">
|
||||||
|
<?php echo template::button('usersDeleteSelectNone', [
|
||||||
|
'value' => template::ico('square-check-empty'),
|
||||||
|
'help' => 'Tout désélectionner'
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col1">
|
||||||
|
<?php echo template::submit('usersDeleteSubmit', [
|
||||||
|
'class' => 'buttonRed',
|
||||||
|
'ico' => '',
|
||||||
|
'value' => template::ico('minus'),
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row" id="Bfrtip">
|
||||||
|
<div class="col3">
|
||||||
|
<?php echo template::select('usersFilterGroup', $module::$usersGroups, [
|
||||||
|
'label' => 'Groupes / Profils',
|
||||||
|
'selected' => isset($_POST['usersFilterGroup']) ? $_POST['usersFilterGroup'] : 'all',
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col3">
|
||||||
|
<?php echo template::select('usersFilterFirstName', $module::$alphabet, [
|
||||||
|
'label' => 'Prénom commence par',
|
||||||
|
'selected' => isset($_POST['usersFilterFirstName']) ? $_POST['usersFilterFirstName'] : 'all',
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
<div class="col3">
|
||||||
|
<?php echo template::select('usersFilterLastName', $module::$alphabet, [
|
||||||
|
'label' => 'Nom commence par',
|
||||||
|
'selected' => isset($_POST['usersFilterLastName']) ? $_POST['usersFilterLastName'] : 'all',
|
||||||
|
]); ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php if ($module::$users): ?>
|
||||||
|
<?php echo template::table([1, 2, 3, 3, 3], $module::$users, ['', 'Id', 'Prénom', 'Nom', 'Étiquettes'], ['id' => 'dataTables']); ?>
|
||||||
|
<?php else: ?>
|
||||||
|
<?php echo template::speech('Aucun inscrit'); ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php echo template::formClose(); ?>
|
Loading…
Reference in New Issue
Block a user