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); ?>

Club Alpin Suisse de Sion

+ + +
+ /> +
@@ -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(); + ?> +
+

Liste des membres

+ search_box('Rechercher par nom', 'lastname'); + ?> + prepare_items(); + echo "
"; + $table->display(); + echo "
"; + ?> + +
+ __('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 '
'; + echo ''; + 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 '
'; + echo ''; + 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); ?> -
- - - - Retour aux - courses -
-
-
- - -
+ search_box('Rechercher par nom', 'lastname'); + ?> + + +
+
+ + + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+