diff --git a/index.php b/index.php index b352815..daa12a7 100644 --- a/index.php +++ b/index.php @@ -33,6 +33,7 @@ require_once plugin_dir_path(__FILE__) . 'src/admin/views/type/view-type-list.php'; require_once plugin_dir_path(__FILE__) . 'src/admin/views/type/view-type-edit.php'; require_once plugin_dir_path(__FILE__) . 'src/admin/views/race/view-race-list.php'; + require_once plugin_dir_path(__FILE__) . 'src/admin/views/member/view-member-list.php'; require_once plugin_dir_path(__FILE__) . 'src/admin/views/race/view-race-edit.php'; require_once plugin_dir_path(__FILE__) . 'src/admin/views/race_user/view-race-user-list.php'; require_once plugin_dir_path(__FILE__) . 'src/admin/views/race_user/view-race-user-edit.php'; @@ -52,6 +53,8 @@ require_once plugin_dir_path(__FILE__) . 'src/class/race/Race_User.php'; require_once plugin_dir_path(__FILE__) . 'src/class/race/Race_Material.php'; require_once plugin_dir_path(__FILE__) . 'src/class/race/Race.php'; + + require_once plugin_dir_path(__FILE__) . 'src/class/member/Member.php'; require_once plugin_dir_path(__FILE__) . 'src/class/season/Season.php'; require_once plugin_dir_path(__FILE__) . 'src/library/functions.php'; require_once plugin_dir_path(__FILE__) . 'src/frontend/cass-shortcode-calendar-global.php'; diff --git a/src/admin/dashboard-menu.php b/src/admin/dashboard-menu.php index 41b75b5..314dce4 100644 --- a/src/admin/dashboard-menu.php +++ b/src/admin/dashboard-menu.php @@ -11,6 +11,7 @@ class CASS_Dashboard_Menu { //Options global $cass_admin_race_list; + global $cass_admin_member_list; global $cass_admin_race_user_list; global $cass_admin_race_user_all_courses_list; global $cass_admin_group_list; @@ -52,6 +53,15 @@ class CASS_Dashboard_Menu 'cass_admin_dashboard' ); + $cass_admin_member_list = add_submenu_page( + 'cass-settings', + __('Liste des membres', 'cass-admin-member-list'), + 'Liste des membres', + 'cass_rl', + 'cass-admin-member-list', + 'view_member_list_initialisation' + ); + $cass_admin_race_list = add_submenu_page( 'cass-settings', __('Liste des courses', 'cass-admin-race-list'), @@ -227,6 +237,7 @@ class CASS_Dashboard_Menu add_action("load-$cass_admin_material_list", "cass_admin_material_list"); add_action("load-$cass_admin_season_list", "cass_admin_season_list"); add_action("load-$cass_admin_type_list", "cass_admin_type_list"); + } diff --git a/src/admin/user-profile-extension.php b/src/admin/user-profile-extension.php index cad4aff..e2f6678 100644 --- a/src/admin/user-profile-extension.php +++ b/src/admin/user-profile-extension.php @@ -22,10 +22,18 @@ class CASS_User_Profile_Extention $cassAddress =get_user_meta($user->ID, 'cassAddress', true); $cassNPA = get_user_meta($user->ID, 'cassNPA', true); $cassLocality = get_user_meta($user->ID, 'cassLocality', true); + $cassMemberOfSion = get_user_meta($user->ID, 'cassMemberOfSion', true); ?>
| + | + /> + |
|---|---|
|
@@ -205,6 +213,7 @@ class CASS_User_Profile_Extention
update_user_meta($user_id, 'cassAddress', SantizeGlobal($_POST['cassAddress']));
update_user_meta($user_id, 'cassNPA', SantizeGlobal($_POST['cassNPA']));
update_user_meta($user_id, 'cassLocality', SantizeGlobal($_POST['cassLocality']));
+ update_user_meta($user_id, 'cassMemberOfSion', $_POST['cassMemberOfSion']);
}
//No de membre
@@ -333,6 +342,28 @@ class CASS_User_Profile_Extention
return $columns;
}
+ //MemberOfSion
+ add_filter('manage_users_columns', 'add_cassMemberOfSion');
+ function add_cassMemberOfSion($columns)
+ {
+ $columns['cassMemberOfSion'] = 'Membre de Sion';
+ return $columns;
+ }
+
+ add_action('manage_users_custom_column', 'add_cassMemberOfSion_column_content', 10, 3);
+ function add_cassMemberOfSion_column_content($value, $column_name, $user_id)
+ {
+ $user = get_userdata($user_id);
+ if ('cassMemberOfSion' == $column_name) {
+ if (get_user_meta(intval($user->ID), 'cassMemberOfSion', true) == 1) {
+ return "Oui";
+ } else {
+ return "Non";
+ }
+ }
+ return $value;
+ }
+
add_action('manage_users_custom_column', 'add_cassLocality_column_content', 10, 3);
function add_cassLocality_column_content($value, $column_name, $user_id)
diff --git a/src/admin/views/member/view-member-list.php b/src/admin/views/member/view-member-list.php
new file mode 100644
index 0000000..6b40934
--- /dev/null
+++ b/src/admin/views/member/view-member-list.php
@@ -0,0 +1,267 @@
+
+ document.addEventListener('DOMContentLoaded', function() {
+ document.getElementById('bulk-action-selector-top').disabled = true;
+ document.getElementById('doaction').disabled = true;
+ document.getElementById('bulk-action-selector-bottom').disabled = true;
+ document.getElementById('doaction2').disabled = true;
+ });
+
+ ";
+
+ $table = new CASS_View_Member_List();
+ ?>
+
+
+ __('Rôle','role-content'),
+ 'lastname' => __('Nom', 'cass-race-lastname-content'),
+ 'firstname' => __('Prénom', 'cass-race-firstname-content'),
+ 'cassMemberNo' => __('Numéro de membre', 'cass-race-member-no-content'),
+ 'cassLevel' => __('Niveau', 'cass-race-level-content'),
+ 'cassLevelTechSki' => __('Niveau ski', 'cass-race-level-tech-ski-content'),
+ 'cassLevelClimbing' => __('Niveau escalade','cass-race-level-climbing-content'),
+ 'cassLevelMountaineering' => __('Niveau alpinitme', 'cass-race-level-mountaineering-content'),
+ 'cassGroup' => __('Groupe', 'cass-race-group-content'),
+ 'cassTelephone' => __('Téléphone', 'cass-race-telephone-content'),
+ 'cassAddress' => __('Adresse', 'cass-race-address-content'),
+ 'cassNPA' => __('Code postal', 'cass-race-npa-content'),
+ 'cassLocality' => __('Localité', 'cass-race-locality-content'),
+ 'email' => __('Email', 'cass-race-email-content'),
+ );
+ return $columns;
+ }
+
+ public function prepare_items($search = '')
+{
+
+ $search = isset($_POST['s']) ? sanitize_text_field($_POST['s']) : '';
+
+ $this->table_data = $this->get_table_data($search);
+
+ $columns = $this->get_columns();
+ $hidden = array();
+ $sortable = $this->get_sortable_columns();
+ $this->_column_headers = array(
+ $this->get_columns(),
+ array(), // Colonnes masquées
+ $this->get_sortable_columns()
+ );
+
+ usort($this->table_data, array(&$this, 'usort_reorder'));
+
+ $per_page = 20;
+ $current_page = $this->get_pagenum();
+ $total_items = count($this->table_data);
+
+ // Découper les données pour la pagination
+ $this->table_data = array_slice($this->table_data, (($current_page - 1) * $per_page), $per_page);
+
+ $this->set_pagination_args(
+ array(
+ 'total_items' => $total_items,
+ 'per_page' => $per_page,
+ 'total_pages' => ceil($total_items / $per_page),
+ )
+ );
+
+ $this->items = $this->table_data;
+}
+
+
+
+private function get_table_data($search = '')
+{
+ // Récupérer les données des membres
+ $members = Member::sqlWPTable();
+
+ // Initialiser un tableau pour stocker les données filtrées
+ $filtered_data = array();
+
+ // Parcourir les membres et appliquer le filtre
+ foreach ($members as $member) {
+ if (empty($search) || stripos($member->getLastname(), $search) !== false) {
+ $filtered_data[] = $member;
+ }
+ }
+
+ // Retourner les données filtrées
+ return $filtered_data;
+}
+
+ function column_default($item, $column_name)
+ {
+ switch ($column_name) {
+ case 'role':
+ return $item->getRole();
+ case 'lastname':
+ return $item->getLastname();
+ case 'firstname':
+ return $item->getFirstname();
+ case 'cassMemberNo':
+ return $item->getCassMemberNo();
+ case 'cassLevel':
+ return $item->getCassLevel();
+ case 'cassLevelTechSki':
+ return $item->getCassLevelTechSki();
+ case 'cassLevelClimbing':
+ return $item->getCassLevelClimbing();
+ case 'cassLevelMountaineering':
+ return $item->getCassLevelMountaineering();
+ case 'cassGroup':
+ return $item->getCassGroup();
+ case 'cassTelephone':
+ return $item->getCassTelephone();
+ case 'cassAddress':
+ return $item->getCassAddress();
+ case 'cassNPA':
+ return $item->getCassNPA();
+ case 'cassLocality':
+ return $item->getCassLocality();
+ case 'email':
+ return $item->getEmail();
+ default:
+ return ''; // Valeur par défaut pour les colonnes non définies
+ }
+ }
+
+ public function get_sortable_columns()
+ {
+ $sortable_columns = array(
+ 'role' => array('role', false),
+ 'lastname' => array('lastname', true),
+ 'firstname' => array('firstname', false),
+ 'cassMemberNo' => array('cassMemberNo', false),
+ 'cassLevel' => array('cassLevel', false),
+ 'cassLevelTechSki' => array('cassLevelTechSki', false),
+ 'cassLevelClimbing' => array('cassLevelClimbing', false),
+ 'cassLevelMountaineering' => array('cassLevelMountaineering', false),
+ 'cassGroup' => array('cassGroup', false),
+ 'cassTelephone' => array('cassTelephone', false),
+ 'email' => array('email', false),
+ );
+ return $sortable_columns;
+ }
+
+ function usort_reorder($a, $b)
+{
+ // Vérifie si une colonne de tri a été spécifiée dans l'URL, sinon utilise 'lastname' par défaut
+ $orderby = !empty($_GET['orderby']) ? $_GET['orderby'] : 'lastname';
+
+ // Vérifie si un ordre a été spécifié dans l'URL, sinon utilise 'asc' par défaut
+ $order = !empty($_GET['order']) ? $_GET['order'] : 'asc';
+
+ // Compare les valeurs des colonnes en fonction de 'orderby'
+ switch ($orderby) {
+ case 'lastname':
+ $result = strcmp($a->getLastname(), $b->getLastname());
+ break;
+ case 'firstname':
+ $result = strcmp($a->getFirstname(), $b->getFirstname());
+ break;
+ case 'role':
+ $result = strcmp($a->getRole(), $b->getRole());
+ break;
+ case 'cassMemberNo':
+ $result = strcmp($a->getCassMemberNo(), $b->getCassMemberNo());
+ break;
+ case 'cassLevel':
+ $result = strcmp($a->getCassLevel(), $b->getCassLevel());
+ break;
+ case 'cassLevelTechSki':
+ $result = strcmp($a->getCassLevelTechSki(), $b->getCassLevelTechSki());
+ break;
+ case 'cassLevelClimbing':
+ $result = strcmp($a->getCassLevelClimbing(), $b->getCassLevelClimbing());
+ break;
+ case 'cassLevelMountaineering':
+ $result = strcmp($a->getCassLevelMountaineering(), $b->getCassLevelMountaineering());
+ break;
+ case 'cassGroup':
+ $result = strcmp($a->getCassGroup(), $b->getCassGroup());
+ break;
+ case 'cassTelephone':
+ $result = strcmp($a->getCassTelephone(), $b->getCassTelephone());
+ break;
+ case 'cassAddress':
+ $result = strcmp($a->getCassAddress(), $b->getCassAddress());
+ break;
+ case 'cassNPA':
+ $result = strcmp($a->getCassNPA(), $b->getCassNPA());
+ break;
+ case 'cassLocality':
+ $result = strcmp($a->getCassLocality(), $b->getCassLocality());
+ break;
+ case 'email':
+ $result = strcmp($a->getEmail(), $b->getEmail());
+ break;
+ default:
+ $result = 0; // Aucun tri si la colonne n'est pas reconnue
+ break;
+ }
+
+ // Retourne le résultat en fonction de l'ordre spécifié
+ return ($order === 'asc') ? $result : -$result;
+}
+
+
+
+ function column_lastname($item)
+ {
+ $ID_WPUser = $item->getID();
+ $actions = array(
+ 'allCourses' => sprintf('Liste de ses courses', $_REQUEST['page'], 'allCourses', $ID_WPUser),
+ );
+
+ return sprintf('%1$s %2$s', ReadGlobal($item->getLastname()), $this->row_actions($actions));
+
+ }
+
+ function column_firstname($item)
+ {
+ return $item->getFirstname();
+ }
+
+ function search_box($text, $input_id)
+ {
+
+
+ $input_id = $input_id . '-search-input';
+
+ echo '';
+ }
+}
diff --git a/src/admin/views/race/view-race-list.php b/src/admin/views/race/view-race-list.php
index 1fd1f64..c53e24d 100644
--- a/src/admin/views/race/view-race-list.php
+++ b/src/admin/views/race/view-race-list.php
@@ -65,6 +65,10 @@ function view_race_list_initialisation()
";
+
+ $table->search_box('Rechercher par Adjoint', 'IDWPUser_Deputy');
+ $table->search_box('Rechercher par CdC', 'IDWPUser_RL');
+
}
?>
@@ -80,7 +84,7 @@ function view_race_list_initialisation()
getCurrentSeason();
@@ -127,7 +131,7 @@ class CASS_View_Race_List extends WP_List_Table
'IDWPUser_Deputy' => __('Adjoint', 'cass-race-deputy-content'),
'start' => __('Début', 'cass-race-start-content'),
'end' => __('Fin', 'cass-race-end-content'),
- 'subscriptionEnable' => __('Ins. activée','cass-race-subscription-enable-content'),
+ 'subscriptionEnable' => __('Ins. activée', 'cass-race-subscription-enable-content'),
'subscriptionStart' => __('Ins. début', 'cass-race-start-content'),
'subscriptionEnd' => __('Ins. fin', 'cass-race-end-content'),
'subscriptionCount' => __('Nbre inscrit', 'cass-race-count-subscribed-content'),
@@ -147,7 +151,7 @@ class CASS_View_Race_List extends WP_List_Table
return array(
'delete' => __('Supprimer', 'your-textdomain'),
'open' => __('Ouvrir', 'your-textdomain'),
-
+
);
} else {
return null;
@@ -161,6 +165,9 @@ class CASS_View_Race_List extends WP_List_Table
//Result of bulk action
$action = $this->current_action();
+ $search_CdC = isset($_POST['IDWPUser_RL-search-input']) ? $_POST['IDWPUser_RL-search-input'] : '';
+ $search_Deputy = isset($_POST['IDWPUser_Deputy-search-input']) ? $_POST['IDWPUser_Deputy-search-input'] : '';
+
$selected_ids = isset($_POST[$this->_args['singular']]) ? $_POST[$this->_args['singular']] : array();
@@ -180,7 +187,7 @@ class CASS_View_Race_List extends WP_List_Table
break;
}
- $this->table_data = $this->get_table_data();
+ $this->table_data = $this->get_table_data($search_CdC, $search_Deputy);
$columns = $this->get_columns();
$hidden = array('ID');
@@ -210,7 +217,7 @@ class CASS_View_Race_List extends WP_List_Table
}
// Get table data
- private function get_table_data()
+ private function get_table_data($search_CdC, $search_Deputy)
{
global $wpdb;
@@ -220,9 +227,11 @@ class CASS_View_Race_List extends WP_List_Table
// Obtenez l'ID de la saison en cours
$currentSeasonID = intval($season->getCurrentSeason());
+ $results = null;
+
if (isset($_POST["IDSeason"]) && $_POST["IDSeason"] == "all") {
// Sélectionner toutes les courses
- return $wpdb->get_results(
+ $results = $wpdb->get_results(
"SELECT * from {$table}",
ARRAY_A
@@ -234,18 +243,57 @@ class CASS_View_Race_List extends WP_List_Table
$wpdb->prepare("SELECT * FROM {$table} WHERE IDSeason = %d", $IDSeason),
ARRAY_A
);
-
- return $results;
-
} else {
// Utilisez l'ID de la saison en cours pour filtrer les résultats
- $results = $wpdb->get_results(
- $wpdb->prepare("SELECT * FROM {$table} WHERE IDSeason = %d", $currentSeasonID),
- ARRAY_A
- );
-
- return $results;
+ $results = $wpdb->get_results("SELECT * FROM {$table}", ARRAY_A);
}
+
+
+
+ //Filter on CdC or Deputy
+ $filtered_data = array();
+
+ // Charger tous les utilisateurs avec le rôle 'CASS_MEMBER'
+ $args = array(
+ 'role' => 'CASS_MEMBER',
+ 'orderby' => 'user_nicename',
+ 'order' => 'ASC'
+ );
+ $users = get_users($args);
+
+ for ($i = 0; $i < count($results); $i++) {
+ $result = $results[$i];
+
+ $ItemCdCName = "";
+ $ItemDeputyName = "";
+
+ foreach ($users as $user) {
+ if ($result['IDWPUser_RL'] == $user->id) {
+ $ItemCdCName = $user->last_name . " " . $user->first_name;
+ }
+ if ($result['IDWPUser_Deputy'] == $user->id) {
+ $ItemDeputyName = $user->last_name . " " . $user->first_name;
+ }
+ }
+
+ if($search_CdC != "" && $search_Deputy != ""){
+ if (strpos($ItemCdCName, $search_CdC) !== false && strpos($ItemDeputyName, $search_Deputy) !== false) {
+ $filtered_data[] = $result;
+ }
+ } else if($search_CdC != ""){
+ if (strpos($ItemCdCName, $search_CdC) !== false) {
+ $filtered_data[] = $result;
+ }
+ } else if($search_Deputy != ""){
+ if (strpos($ItemDeputyName, $search_Deputy) !== false) {
+ $filtered_data[] = $result;
+ }
+ } else {
+ $filtered_data[] = $result;
+ }
+ }
+
+ return $filtered_data;
}
function column_default($item, $column_name)
@@ -280,7 +328,7 @@ class CASS_View_Race_List extends WP_List_Table
$retuned = "";
foreach ($users as $user) {
if ($item[$column_name] == $user->id) {
- $retuned = $user->display_name;
+ $retuned = $user->last_name . " " . $user->first_name;
}
}
return $retuned;
@@ -294,7 +342,7 @@ class CASS_View_Race_List extends WP_List_Table
$retuned = "";
foreach ($users as $user) {
if ($item[$column_name] == $user->id) {
- $retuned = $user->display_name;
+ $retuned = $user->last_name . " " . $user->first_name;
}
}
return $retuned;
@@ -424,6 +472,19 @@ class CASS_View_Race_List extends WP_List_Table
return sprintf('%1$s %2$s', ReadGlobal($item['name']), $this->row_actions($actions));
}
+ function search_box($text, $input_id)
+ {
+ $input_id = $input_id . '-search-input';
+
+ echo '';
+ }
+
}
diff --git a/src/admin/views/race_user/view-race-user-list.php b/src/admin/views/race_user/view-race-user-list.php
index c8984fd..b8bc4ff 100644
--- a/src/admin/views/race_user/view-race-user-list.php
+++ b/src/admin/views/race_user/view-race-user-list.php
@@ -80,6 +80,92 @@ function view_race_user_list_initialisation()
exportParticipantListOfRace(intval($_GET["IDRace"]));
}
+ //Download model
+ if (isset($_POST["downloadParticipantMailCSV"]) && intval($_POST["downloadParticipantMailCSV"]) == 1) {
+ $mails = exportParticipantListOfRaceMailOnly(intval($_GET["IDRace"]));
+
+ // Convert emails to a string separated by semicolons
+ $mails = implode(";", $mails);
+
+ // Create the 'cass' folder inside the uploads directory
+ $directoryCass = 'cass';
+ $upload_dir = wp_upload_dir();
+ $upload_path = $upload_dir['basedir'];
+ $subdirectory_path = $upload_path . '/' . $directoryCass;
+ if (!file_exists($subdirectory_path)) {
+ wp_mkdir_p($subdirectory_path);
+ }
+
+ // Path for the CSV file
+ $modelCSVExportFile = $subdirectory_path . "/" . "participants.csv";
+
+ // Create and write the emails into the CSV file
+ file_put_contents($modelCSVExportFile, $mails);
+
+ // Generate the full URL for the file
+ $url_complet = home_url() . '/wp-content/uploads/' . $directoryCass . '/participants.csv';
+
+ // Open the file in a new browser tab
+ echo "";
+ }
+
+
+ if (isset($_POST["copyParticipantMail"]) && intval($_POST["copyParticipantMail"]) == 1) {
+ $mails = exportParticipantListOfRaceMailOnly(intval($_GET["IDRace"]));
+
+ // Convertir les mails en une chaîne séparée par des ";"
+ $mails = implode(";", $mails);
+
+ // Générer le script JavaScript pour afficher une modale
+ echo "";
+ }
+
+
+
+
$table = new CASS_View_Race_User_List();
?>
@@ -94,19 +180,40 @@ function view_race_user_list_initialisation()
name); ?>
-
- Liste des membres+ search_box('Rechercher par nom', 'lastname'); + ?> + prepare_items(); + echo ""; + ?> + +- + search_box('Rechercher par nom', 'lastname'); + ?> + + +
+
+
+
+
+
+
+
+
+
+
|